UNPKG

@aliretail/vite-config-xixi

Version:

瓴羊客服vite配置脚手架

81 lines (80 loc) 3.48 kB
"use strict"; 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;