st-bundle
Version:
CLI for watching and bundling SpringType projects.
117 lines (116 loc) • 5.71 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const astring_1 = require("astring");
const meriyah = require("meriyah");
const sourceMapModule = require("source-map");
const ast_1 = require("../../utils/ast");
const transformUtils_1 = require("../transformUtils");
const exportDefaultDeclaration_1 = require("./exportDefaultDeclaration");
const importDeclaration_1 = require("./importDeclaration");
const namedDeclaration_1 = require("./namedDeclaration");
const TrasnformContext_1 = require("./TrasnformContext");
function parseAst(contents, options) {
let opts = Object.assign({ jsx: true, next: false, module: true }, (options || {}));
return meriyah.parse(contents, opts);
}
exports.parseAst = parseAst;
function fastTransform(opts) {
const ast = opts.ast ? opts.ast : parseAst(opts.input, { loc: opts.sourceMaps });
const ctx = TrasnformContext_1.createTransformContext(opts);
ast_1.fastWalk(ast, {
withScope: true,
visit: (node, props, context) => {
let { parent, prop, idx } = props;
switch (node.type) {
case 'ExportAllDeclaration':
const { type, expression } = transformUtils_1.createModuleExportsAssign(node.source.value);
node.type = type;
node.expression = expression;
delete node.source;
break;
case 'ExportDefaultDeclaration':
exportDefaultDeclaration_1.handleExportDefaultDeclaration(ctx, node, parent, prop, idx, context);
break;
case 'ExportNamedDeclaration':
namedDeclaration_1.exportNamedDeclaration(ctx, node, parent, prop, idx, context);
break;
case 'ImportDeclaration':
importDeclaration_1.onImportDeclaration(ctx, node, parent, prop, idx);
break;
default:
const reqStatement = transformUtils_1.isRequireStatement(node, parent);
if (reqStatement) {
node.arguments[0].value = ctx.interceptSource(node.arguments[0].value);
}
if (opts.webWorkers) {
const webWorkerStatement = transformUtils_1.isWorkerStatement(node);
if (webWorkerStatement) {
const item = opts.webWorkers.find(item => item.path === webWorkerStatement.value && item.type === webWorkerStatement.type);
if (item) {
node.arguments[0].value = item.bundlePath;
}
}
}
const shortHand = transformUtils_1.isShortHandIdentifier(node, parent);
if (shortHand) {
if (ctx.tracedImportSpecifiers[shortHand.node.name]) {
// if it belongs to a function "someFunc(foo){}"
if (ctx.tracedImportSpecifiers[shortHand.node.name].nodes) {
if (context && context.locals.indexOf(shortHand.node.name) > -1) {
return;
}
shortHand.parent.shorthand = false;
ctx.tracedImportSpecifiers[shortHand.node.name].nodes.push({
node: shortHand.node,
parent: shortHand.parent,
prop: 'value',
});
}
return;
}
}
if (transformUtils_1.isLocalIdentifier(node, parent)) {
if (ctx.tracedImportSpecifiers[node.name]) {
// if it belongs to a function "someFunc(foo){}"
if (ctx.tracedImportSpecifiers[node.name].nodes) {
if (context && context.locals.indexOf(node.name) > -1) {
return;
}
ctx.tracedImportSpecifiers[node.name].nodes.push({ node, parent, prop, idx });
}
}
else {
if (parent.type !== 'VariableDeclarator' && ctx.undefinedExports.indexOf(node.name) > -1) {
if (context && context.locals.indexOf(node.name) > -1) {
break;
}
if (parent && prop) {
ctx.toReplace(parent, prop, idx, transformUtils_1.createExportsExpression(node.name));
return;
}
}
}
}
break;
}
},
});
ctx.postWork(ast);
let map;
if (opts.sourceMaps) {
map = new sourceMapModule.SourceMapGenerator({
file: 'script.js',
});
}
const code = astring_1.generate(ast, { ecmaVersion: 7, sourceMap: map });
let jsonSourceMaps;
if (opts.sourceMaps) {
jsonSourceMaps = map.toJSON();
if (!jsonSourceMaps.sourcesContent) {
delete jsonSourceMaps.file;
jsonSourceMaps.sourcesContent = [opts.input];
}
}
return { code, sourceMap: jsonSourceMaps };
}
exports.fastTransform = fastTransform;