st-bundle
Version:
CLI for watching and bundling SpringType projects.
96 lines (95 loc) • 3.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const transformUtils_1 = require("../transformUtils");
const tracedVariable_1 = require("./tracedVariable");
function _sliceExports(ctx) {
for (const item of ctx.slicedExports) {
const index = item.body.indexOf(item.afterNode);
item.body.splice(index + 1, 0, transformUtils_1.createModuleExports(item.exported, typeof item.local === 'string'
? {
type: 'Identifier',
name: item.local,
}
: item.local));
}
}
function _removeNodes(ctx) {
ctx.toBeRemoved.forEach(item => {
const index = item.arr.indexOf(item.node);
if (index > -1)
item.arr.splice(index, 1);
});
}
function _addExports(ast, ctx) {
ctx.exported.forEach(item => {
ast.body.push(transformUtils_1.createModuleExports(item.exported, typeof item.local === 'string'
? {
type: 'Identifier',
name: item.local,
}
: item.local));
});
}
function _handleRequireStatements(ast, ctx) {
ctx.reqStatements.forEach(item => {
if (item.replaceNode) {
const tree = item.replaceNode.array;
const index = tree.indexOf(item.replaceNode.node);
if (index > -1) {
tree[index] = transformUtils_1.createRequireStatement(item.local, ctx.interceptSource(item.source));
}
}
else {
ast.body.unshift(transformUtils_1.createRequireStatement(item.local, ctx.interceptSource(item.source)));
}
});
}
function _replaceNodes(obj) {
for (const item of obj.toBeReplaced) {
const { parent, prop, idx, replacement } = item;
if (idx) {
parent[prop][idx] = replacement;
}
else {
parent[prop] = replacement;
}
}
}
function createTransformContext(props) {
let nameIndex = 0;
const obj = {
toBeReplaced: [],
toBeRemoved: [],
undefinedExports: [],
tracedImportSpecifiers: {},
exported: [],
slicedExports: [],
reqStatements: [],
toReplace: (parent, prop, idx, replacement) => {
obj.toBeReplaced.push({ parent, prop, idx, replacement });
},
interceptSource: source => {
if (!props.sourceInterceptor) {
return source;
}
return props.sourceInterceptor(source);
},
toRemove: (arr, node) => {
obj.toBeRemoved.push({ arr, node });
},
generateName: () => {
nameIndex++;
return `__req${nameIndex}__`;
},
postWork: ast => {
_handleRequireStatements(ast, obj);
tracedVariable_1.handleTracedImportSpecifiers(obj);
_sliceExports(obj);
_addExports(ast, obj);
_removeNodes(obj);
_replaceNodes(obj);
},
};
return obj;
}
exports.createTransformContext = createTransformContext;