UNPKG

reboost

Version:

A super fast dev server for rapid web development

112 lines (111 loc) 5.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createTransformer = void 0; const tslib_1 = require("tslib"); const escodegen_1 = (0, tslib_1.__importDefault)(require("escodegen")); const anymatch_1 = (0, tslib_1.__importDefault)(require("anymatch")); const chalk_1 = (0, tslib_1.__importDefault)(require("chalk")); const magic_string_1 = (0, tslib_1.__importDefault)(require("magic-string")); const fs_1 = (0, tslib_1.__importDefault)(require("fs")); const path_1 = (0, tslib_1.__importDefault)(require("path")); const utils_1 = require("../utils"); const resolver_1 = require("../core-plugins/resolver"); const processor_1 = require("./processor"); const import_resolver_1 = require("./import-resolver"); const getCompatibleSourceMap = (instance, map) => { const { config } = instance; map.sourceRoot = 'reboost:///'; map.sources = map.sources.map((sourcePath) => { if (path_1.default.isAbsolute(sourcePath)) return (0, utils_1.toPosix)(path_1.default.relative(config.rootDir, sourcePath)); return (0, utils_1.toPosix)(sourcePath); }); map.sourcesContent = []; map.sources.forEach((sourcePath) => { const absolutePath = path_1.default.join(config.rootDir, sourcePath); if (fs_1.default.existsSync(absolutePath)) { map.sourcesContent.push(fs_1.default.readFileSync(absolutePath, 'utf8')); } else { instance.log('info', chalk_1.default.red(`Unable to find file "${absolutePath}". Required for source map generation.`)); map.sourcesContent.push(`Unable to find file in "${absolutePath}".`); } }); map.file = undefined; return map; }; const getPluginContext = (instance, filePath, mergedDependencies) => ({ chalk: chalk_1.default, config: instance.config, meta: {}, emitWarning(message, color = true) { const line = '-'.repeat(process.stdout.columns); message = line + '\n' + message + '\n' + line; if (color) message = chalk_1.default.yellow(message); console.log(message); }, addDependency(dependency) { mergedDependencies.push(path_1.default.normalize(dependency)); }, getCompatibleSourceMap: (map) => getCompatibleSourceMap(instance, map), getSourceMapComment(map) { let comment = '/*# sourceMappingURL=data:application/json;charset=utf-8;base64,'; comment += Buffer.from(JSON.stringify(map)).toString('base64'); comment += ' */'; return comment; }, MagicString: magic_string_1.default, mergeSourceMaps: utils_1.mergeSourceMaps, resolve: (...args) => (0, resolver_1.resolve)(instance, ...args), rootRelative: (filePath) => path_1.default.relative(instance.config.rootDir, filePath) }); const getErrorObj = (msg, dependencies) => ({ code: `console.error('[reboost] ' + ${JSON.stringify(msg)})`, error: true, dependencies }); const createTransformer = (instance) => { const { debugMode } = instance.config; const baseGeneratorOptions = { format: debugMode ? { indent: { style: ' ' }, } : escodegen_1.default.FORMAT_MINIFY, comment: debugMode, }; const sourceMapsConfig = instance.config.sourceMaps; const processor = (0, processor_1.createProcessor)(instance); const transformFile = async (filePath) => { let errorOccurred = false; const dependencies = []; const pluginContext = getPluginContext(instance, filePath, dependencies); const processed = await processor.process(filePath, pluginContext); if (processed.error) return getErrorObj(processed.error, dependencies); const { programPath, sourceMap } = processed; errorOccurred = await (0, import_resolver_1.resolveImports)(instance, programPath, filePath); const sourceMapsEnabled = !(0, anymatch_1.default)(sourceMapsConfig.exclude, filePath) && (0, anymatch_1.default)(sourceMapsConfig.include, filePath); let generatedCode, map; if (sourceMap && sourceMapsEnabled) { const generated = escodegen_1.default.generate(programPath.node, Object.assign({}, baseGeneratorOptions, { sourceMap: (0, utils_1.toPosix)(path_1.default.relative(instance.config.rootDir, filePath)), sourceMapRoot: 'reboost:///', sourceMapWithCode: true, })); generatedCode = generated.code; const merged = await (0, utils_1.mergeSourceMaps)(sourceMap, generated.map.toString()); map = getCompatibleSourceMap(instance, merged); } else { generatedCode = escodegen_1.default.generate(programPath.node, baseGeneratorOptions); } return { code: generatedCode, map: map && JSON.stringify(map, null, instance.config.debugMode ? 2 : 0), dependencies, error: errorOccurred }; }; return { transformFile }; }; exports.createTransformer = createTransformer;