reboost
Version:
A super fast dev server for rapid web development
112 lines (111 loc) • 5.18 kB
JavaScript
;
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;