vite-plugin-commonjs-externals
Version:
Provides commonjs externals support for Vite.
106 lines (100 loc) • 4.7 kB
JavaScript
;
var acorn = require('acorn');
var esModuleLexer = require('es-module-lexer');
var MagicString = require('magic-string');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var acorn__namespace = /*#__PURE__*/_interopNamespaceDefault(acorn);
var esModuleLexer__namespace = /*#__PURE__*/_interopNamespaceDefault(esModuleLexer);
function transformEsm(imports, code, externals) {
const imports2 = imports
.map(i => (Object.assign(Object.assign({}, i), { importStatement: code.substring(i.ss, i.se) })))
.filter(({ n, d }) =>
// static import
d === -1 &&
n !== undefined &&
externals.some(external => typeof external === 'string'
? external === n
: external instanceof RegExp
? external.test(n)
: false));
if (imports2.length === 0) {
return;
}
const magicString = new MagicString(code);
imports2.forEach(({ importStatement, ss, se }) => {
const program = acorn__namespace.parse(importStatement, {
ecmaVersion: 'latest',
sourceType: 'module',
});
const node = program.body[0];
if ((node === null || node === void 0 ? void 0 : node.type) !== 'ImportDeclaration') {
return;
}
if (typeof node.source.value !== 'string') {
return;
}
if (node.specifiers.length === 0) {
magicString.overwrite(ss, se, `require('${node.source.value}')`);
return;
}
const importNamespaceSpecifierList = node.specifiers.filter(x => x.type === 'ImportNamespaceSpecifier');
const importDefaultSpecifierList = node.specifiers.filter(x => x.type === 'ImportDefaultSpecifier');
const importSpecifierList = node.specifiers.filter(x => x.type === 'ImportSpecifier');
if (importNamespaceSpecifierList.length > 1) {
throw new Error(`Illegal state of importNamespaceSpecifierList: it can only have zero or one namespace import. \`${importStatement}\``);
}
if (importDefaultSpecifierList.length > 1) {
throw new Error(`Illegal state of importDefaultSpecifierList: it can only have zero or one default import. \`${importStatement}\``);
}
const requireStatement = (identifiers) => `const ${identifiers}=(()=>{const mod = require("${node.source.value}");return mod && mod.__esModule ? mod : Object.assign(Object.create(null),mod,{default:mod,[Symbol.toStringTag]:"Module"})})();`;
const localNamesIdentifiers = [
...importSpecifierList.map(spec => `${spec.imported.name}: ${spec.local.name}`),
...importDefaultSpecifierList.map(spec => `default: ${spec.local.name}`),
].join(', ');
if (importNamespaceSpecifierList.length === 0) {
magicString.overwrite(ss, se, requireStatement(`{${localNamesIdentifiers}}`));
return;
}
const namespaceIdentifier = importNamespaceSpecifierList[0].local.name;
const namespaceRequireStatement = requireStatement(namespaceIdentifier);
if (localNamesIdentifiers === '') {
magicString.overwrite(ss, se, namespaceRequireStatement);
return;
}
magicString.overwrite(ss, se, namespaceRequireStatement +
`const {${localNamesIdentifiers}}=${namespaceIdentifier};`);
});
return {
code: magicString.toString(),
map: magicString.generateMap(),
};
}
const commonjsExternalsPlugin = ({ externals, exts = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'vue', 'svelte'], }) => ({
name: 'commonjs-externals',
async transform(code, id) {
if (!exts.some(ext => id.endsWith('.' + ext))) {
return;
}
await esModuleLexer__namespace.init;
const [imports] = esModuleLexer__namespace.parse(code);
return transformEsm(imports, code, externals);
},
});
module.exports = commonjsExternalsPlugin;
module.exports.default = module.exports;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlcyI6W10sInNvdXJjZXNDb250ZW50IjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7In0=