@aliretail/vite-config-xixi
Version:
瓴羊客服vite配置脚手架
81 lines (80 loc) • 3.48 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const acorn = require("acorn");
const esModuleLexer = require("es-module-lexer");
const magic_string_1 = require("magic-string");
function transformEsm(imports, code, externals) {
const imports2 = imports
.map(i => ({
...i,
importStatement: code.substring(i.ss, i.se),
}))
.filter(({ n, d }) =>
// static import
d === -1 &&
n !== undefined &&
externals[n]);
if (imports2.length === 0) {
return;
}
const magicString = new magic_string_1.default(code);
imports2.forEach(({ importStatement, ss, se }) => {
const program = acorn.parse(importStatement, {
ecmaVersion: 'latest',
sourceType: 'module',
});
const node = program.body[0];
if (node?.type !== 'ImportDeclaration') {
return;
}
if (typeof node.source.value !== 'string') {
return;
}
if (node.specifiers.length === 0) {
// magicString.remove(ss, se);
magicString.overwrite(ss, se, '');
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 assignStatement = (identifiers) => `const ${identifiers}=(()=>{const mod = window['${externals[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, assignStatement(`{${localNamesIdentifiers}}`));
return;
}
const namespaceIdentifier = importNamespaceSpecifierList[0].local.name;
const namespaceRequireStatement = assignStatement(namespaceIdentifier);
if (localNamesIdentifiers === '') {
magicString.overwrite(ss, se, namespaceRequireStatement);
return;
}
magicString.overwrite(ss, se, namespaceRequireStatement +
`const {${localNamesIdentifiers}}=${namespaceIdentifier};`);
});
return {
code: magicString.toString(),
map: magicString.generateMap(),
};
}
function varExternalsPlugin({ externals, }) {
return ({
name: 'var-externals',
async transform(code, id) {
await esModuleLexer.init;
const [imports] = esModuleLexer.parse(code);
return transformEsm(imports, code, externals);
},
});
}
exports.default = varExternalsPlugin;
;