@meteorjs/reify
Version:
Enable ECMAScript 2015 modules in Node today. No caveats. Full stop.
107 lines (79 loc) • 2.89 kB
JavaScript
;
const dynRequire = module.require ? module.require.bind(module) : __non_webpack_require__;
const getOption = require("./options.js").get;
const AV = require("./assignment-visitor.js");
const FastPath = require("./fast-path.js");
const IEV = require("./import-export-visitor.js");
const assignmentVisitor = new AV;
const importExportVisitor = new IEV;
const codeOfPound = "#".charCodeAt(0);
const shebangRegExp = /^#!.*/;
const utils = require("./utils.js");
exports.compile = function (code, options) {
options = Object.assign(Object.create(null), options);
if (code.charCodeAt(0) === codeOfPound) {
code = code.replace(shebangRegExp, "");
}
const result = {
code,
ast: null,
identical: false
};
let likelyIdentifiers = ['import', 'export'];
if (getOption(options, 'topLevelAwait')) {
likelyIdentifiers.push('await');
}
// Quickly scan the code to find all possible indexes of import or
// export keywords, tolerating some false positives.
options.possibleIndexes =
utils.findLikelyIndexes(code, likelyIdentifiers);
const mayHaveImportsOrExports = options.possibleIndexes.length > 0;
const parse = getOption(options, "parse");
if (getOption(options, "ast")) {
result.ast = parse(code);
}
options.moduleAlias = getOption(options, "moduleAlias");
options.topLevelAwait = getOption(options, 'topLevelAwait');
if (
! mayHaveImportsOrExports &&
options.moduleAlias === "module" &&
getOption(options, "sourceType") !== "module"
) {
// Let the caller know the result is no different from the input.
result.identical = true;
return result;
}
const rootPath = new FastPath(result.ast || parse(code));
importExportVisitor.visit(rootPath, code, options);
const magicString = importExportVisitor.magicString;
result.identical = ! importExportVisitor.madeChanges;
if (! result.identical) {
assignmentVisitor.visit(rootPath, {
exportedLocalNames: importExportVisitor.exportedLocalNames,
magicString: magicString,
modifyAST: importExportVisitor.modifyAST,
moduleAlias: importExportVisitor.moduleAlias
});
}
// Whether or not there were any changes, finalizeHoisting does some
// important cleanup work, and should not be computationally expensive
// when no changes need to be made.
importExportVisitor.finalizeHoisting();
result.code = magicString.toString();
return result;
};
exports.transform = function (ast, options) {
return dynRequire("./transform.js")(ast, options);
};
function makeUniqueId(prefix, source) {
const scanRegExp = new RegExp("\\b" + prefix + "(\\d*)\\b", "g");
let match, max = -1;
while ((match = scanRegExp.exec(source))) {
max = Math.max(max, +(match[1] || 0));
}
if (max >= 0) {
return prefix + (max + 1);
}
return prefix;
}
exports.makeUniqueId = makeUniqueId;