@wyw-in-js/transform 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/plugins/shaker.js +20 -8
- package/esm/plugins/shaker.js.map +1 -1
- package/esm/shaker.js +1 -1
- package/esm/shaker.js.map +1 -1
- package/esm/transform/generators/extract.js +4 -3
- package/esm/transform/generators/extract.js.map +1 -1
- package/esm/transform/generators/transform.js +1 -0
- package/esm/transform/generators/transform.js.map +1 -1
- package/esm/transform/helpers/loadWywOptions.js +1 -1
- package/esm/transform/helpers/loadWywOptions.js.map +1 -1
- package/esm/utils/collectExportsAndImports.js +14 -10
- package/esm/utils/collectExportsAndImports.js.map +1 -1
- package/esm/utils/scopeHelpers.js +13 -0
- package/esm/utils/scopeHelpers.js.map +1 -1
- package/lib/plugins/shaker.js +21 -9
- package/lib/plugins/shaker.js.map +1 -1
- package/lib/shaker.js +2 -1
- package/lib/shaker.js.map +1 -1
- package/lib/transform/generators/extract.js +3 -2
- package/lib/transform/generators/extract.js.map +1 -1
- package/lib/transform/generators/transform.js +1 -0
- package/lib/transform/generators/transform.js.map +1 -1
- package/lib/transform/helpers/loadWywOptions.js +3 -4
- package/lib/transform/helpers/loadWywOptions.js.map +1 -1
- package/lib/utils/collectExportsAndImports.js +14 -10
- package/lib/utils/collectExportsAndImports.js.map +1 -1
- package/lib/utils/scopeHelpers.js +13 -0
- package/lib/utils/scopeHelpers.js.map +1 -1
- package/package.json +7 -7
- package/types/plugins/shaker.js +23 -9
- package/types/shaker.d.ts +1 -1
- package/types/shaker.js +3 -1
- package/types/transform/generators/extract.js +2 -2
- package/types/transform/generators/transform.js +1 -0
- package/types/transform/helpers/loadWywOptions.js +3 -6
- package/types/utils/collectExportsAndImports.js +14 -10
- package/types/utils/scopeHelpers.js +13 -0
package/esm/plugins/shaker.js
CHANGED
|
@@ -58,23 +58,26 @@ function rearrangeExports({
|
|
|
58
58
|
// Define variable in the beginning
|
|
59
59
|
const [declaration] = root.unshiftContainer('body', [t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))])]);
|
|
60
60
|
rootScope.registerDeclaration(declaration);
|
|
61
|
-
|
|
61
|
+
const constantViolations = [];
|
|
62
62
|
// Replace every reference with defined variable
|
|
63
63
|
refs.forEach(ref => {
|
|
64
64
|
const [replaced] = ref.replaceWith(t.identifier(uid));
|
|
65
65
|
if (replaced.isBindingIdentifier()) {
|
|
66
|
-
|
|
67
|
-
if (replaced.parentPath?.parentPath?.isVariableDeclarator()) {
|
|
68
|
-
// This is `const foo = exports.foo = "value"` case
|
|
69
|
-
reference(replaced, replaced, true);
|
|
70
|
-
}
|
|
66
|
+
constantViolations.push(replaced);
|
|
71
67
|
} else {
|
|
72
68
|
reference(replaced);
|
|
73
69
|
}
|
|
74
70
|
});
|
|
71
|
+
constantViolations.forEach(id => {
|
|
72
|
+
rootScope.registerConstantViolation(id);
|
|
73
|
+
});
|
|
74
|
+
const assigmentToExport = t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('exports'), t.identifier(name)), t.identifier(uid)));
|
|
75
75
|
|
|
76
|
-
//
|
|
77
|
-
const
|
|
76
|
+
// export.foo = _foo will be inserted either after the last _foo assigment or in the end of the file
|
|
77
|
+
const body = root.get('body');
|
|
78
|
+
const lastViolation = constantViolations[constantViolations.length - 1] ?? body[body.length - 1];
|
|
79
|
+
const pathInRoot = root.get('body').find(n => lastViolation.isDescendant(n));
|
|
80
|
+
const [pushed] = pathInRoot.insertAfter(assigmentToExport);
|
|
78
81
|
const local = pushed.get('expression.right');
|
|
79
82
|
reference(local);
|
|
80
83
|
rearranged[name] = local;
|
|
@@ -247,6 +250,15 @@ export default function shakerPlugin(babel, {
|
|
|
247
250
|
}
|
|
248
251
|
});
|
|
249
252
|
dereferenced = [];
|
|
253
|
+
|
|
254
|
+
// Find and mark for deleting all unreferenced variables
|
|
255
|
+
const unreferenced = Object.values(file.scope.getAllBindings()).filter(i => !i.referenced);
|
|
256
|
+
for (const binding of unreferenced) {
|
|
257
|
+
if (binding.path.isVariableDeclarator() && !forDeleting.includes(binding.path.get('id'))) {
|
|
258
|
+
forDeleting.push(binding.path.get('id'));
|
|
259
|
+
changed = true;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
250
262
|
}
|
|
251
263
|
}
|
|
252
264
|
this.imports = withoutRemoved(collected.imports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shaker.js","names":["logger","collectExportsAndImports","sideEffectImport","getFileIdx","isRemoved","applyAction","dereference","findActionForNode","reference","removeWithRelated","invalidateTraversalCache","EXT_REGEX","ALLOWED_EXTENSIONS","shouldKeepSideEffect","importPath","ext","match","includes","getBindingForExport","exportPath","isIdentifier","scope","getBinding","node","name","variableDeclarator","findParent","p","isVariableDeclarator","id","get","isAssignmentExpression","left","isFunctionDeclaration","isClassDeclaration","undefined","withoutRemoved","items","filter","local","rearrangeExports","types","t","root","exportRefs","exports","rearranged","rootScope","forEach","refs","length","declarator","uid","generateUid","declaration","unshiftContainer","variableDeclaration","identifier","registerDeclaration","ref","replaced","replaceWith","isBindingIdentifier","registerConstantViolation","parentPath","pushed","pushContainer","expressionStatement","assignmentExpression","memberExpression","shakerPlugin","babel","keepSideEffects","ifUnknownExport","onlyExports","shakerLogger","extend","pre","file","filename","opts","log","join","onlyExportsSet","Set","collected","path","sideEffectImports","imports","Object","values","reexports","hasWywPreval","__wywPreval","hasDefault","default","has","delete","size","deadExports","keys","remove","importedAsSideEffect","isEsModule","add","aliveExports","importNames","map","imported","entries","exported","some","alive","exp","exportToPath","Map","set","notFoundExports","clear","isAllExportsFound","Error","forDeleting","i","source","push","deleted","dereferenced","changed","binding","action","parent","outerReferences","referencePaths","isAncestor","visitor","post","processedImports","addImport","metadata","wywEvaluator"],"sources":["../../src/plugins/shaker.ts"],"sourcesContent":["import type { BabelFile, PluginObj, NodePath } from '@babel/core';\nimport type { Binding } from '@babel/traverse';\nimport type {\n Identifier,\n MemberExpression,\n Program,\n VariableDeclarator,\n} from '@babel/types';\n\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { Core } from '../babel';\nimport type { IMetadata } from '../utils/ShakerMetadata';\nimport type { Exports, IState } from '../utils/collectExportsAndImports';\nimport {\n collectExportsAndImports,\n sideEffectImport,\n} from '../utils/collectExportsAndImports';\nimport { getFileIdx } from '../utils/getFileIdx';\nimport { isRemoved } from '../utils/isRemoved';\nimport {\n applyAction,\n dereference,\n findActionForNode,\n reference,\n removeWithRelated,\n} from '../utils/scopeHelpers';\nimport { invalidateTraversalCache } from '../utils/traversalCache';\n\nconst EXT_REGEX = /\\.[0-9a-z]+$/;\nconst ALLOWED_EXTENSIONS = ['.js', '.cjs', '.mjs'];\n\nfunction shouldKeepSideEffect(importPath: string) {\n const [ext] = importPath.match(EXT_REGEX) || [''];\n\n return ext === '' || ALLOWED_EXTENSIONS.includes(ext);\n}\n\nexport interface IShakerOptions {\n ifUnknownExport?: 'error' | 'ignore' | 'reexport-all' | 'skip-shaking';\n keepSideEffects?: boolean;\n onlyExports: string[];\n}\n\ninterface NodeWithName {\n name: string;\n}\n\nfunction getBindingForExport(exportPath: NodePath): Binding | undefined {\n if (exportPath.isIdentifier()) {\n return exportPath.scope.getBinding(exportPath.node.name);\n }\n\n const variableDeclarator = exportPath.findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n if (variableDeclarator) {\n const id = variableDeclarator.get('id');\n if (id.isIdentifier()) {\n return variableDeclarator.scope.getBinding(id.node.name);\n }\n }\n\n if (exportPath.isAssignmentExpression()) {\n const left = exportPath.get('left');\n if (left.isIdentifier()) {\n return exportPath.scope.getBinding(left.node.name);\n }\n }\n\n if (exportPath.isFunctionDeclaration() || exportPath.isClassDeclaration()) {\n return exportPath.scope.getBinding(exportPath.node.id!.name);\n }\n\n return undefined;\n}\n\nconst withoutRemoved = <T extends { local: NodePath }>(items: T[]): T[] =>\n items.filter(({ local }) => !isRemoved(local));\n\nfunction rearrangeExports(\n { types: t }: Core,\n root: NodePath<Program>,\n exportRefs: Map<string, NodePath<MemberExpression>[]>,\n exports: Exports\n): Exports {\n const rearranged = {\n ...exports,\n };\n\n const rootScope = root.scope;\n exportRefs.forEach((refs, name) => {\n if (refs.length <= 1) {\n if (refs.length === 1) {\n // Maybe exports is assigned to another variable?\n const declarator = refs[0].findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n\n if (!declarator) {\n return;\n }\n } else {\n return;\n }\n }\n\n const uid = rootScope.generateUid(name);\n // Define variable in the beginning\n const [declaration] = root.unshiftContainer('body', [\n t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))]),\n ]);\n\n rootScope.registerDeclaration(declaration);\n\n // Replace every reference with defined variable\n refs.forEach((ref) => {\n const [replaced] = ref.replaceWith(t.identifier(uid));\n if (replaced.isBindingIdentifier()) {\n rootScope.registerConstantViolation(replaced);\n if (replaced.parentPath?.parentPath?.isVariableDeclarator()) {\n // This is `const foo = exports.foo = \"value\"` case\n reference(replaced, replaced, true);\n }\n } else {\n reference(replaced);\n }\n });\n\n // Assign defined variable to the export\n const [pushed] = root.pushContainer('body', [\n t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.memberExpression(t.identifier('exports'), t.identifier(name)),\n t.identifier(uid)\n )\n ),\n ]);\n\n const local = pushed.get('expression.right') as NodePath<Identifier>;\n reference(local);\n\n rearranged[name] = local;\n });\n\n return rearranged;\n}\n\nexport default function shakerPlugin(\n babel: Core,\n {\n keepSideEffects = false,\n ifUnknownExport = 'skip-shaking',\n onlyExports,\n }: IShakerOptions\n): PluginObj<IState & { filename: string }> {\n const shakerLogger = logger.extend('shaker');\n\n return {\n name: '@wyw-in-js/transform/shaker',\n pre(file: BabelFile) {\n this.filename = file.opts.filename!;\n const log = shakerLogger.extend(getFileIdx(this.filename));\n\n log('start', `${this.filename}, onlyExports: ${onlyExports.join(',')}`);\n const onlyExportsSet = new Set(onlyExports);\n\n const collected = collectExportsAndImports(file.path);\n const sideEffectImports = collected.imports.filter(sideEffectImport);\n log(\n 'import-and-exports',\n [\n `imports: ${collected.imports.length} (side-effects: ${sideEffectImports.length})`,\n `exports: ${Object.values(collected.exports).length}`,\n `reexports: ${collected.reexports.length}`,\n ].join(', ')\n );\n\n // We cannot just throw out exports if they are referred in the code\n // Let's dome some replacements\n const exports = rearrangeExports(\n babel,\n file.path,\n collected.exportRefs,\n collected.exports\n );\n\n Object.values(exports).forEach((local) => {\n if (local.isAssignmentExpression()) {\n const left = local.get('left');\n if (left.isIdentifier()) {\n // For some reason babel does not mark id in AssignmentExpression as a reference\n // So we need to do it manually\n reference(left, left, true);\n }\n }\n });\n\n const hasWywPreval = exports.__wywPreval !== undefined;\n const hasDefault = exports.default !== undefined;\n\n // If __wywPreval is not exported, we can remove it from onlyExports\n if (onlyExportsSet.has('__wywPreval') && !hasWywPreval) {\n onlyExportsSet.delete('__wywPreval');\n }\n\n if (onlyExportsSet.size === 0) {\n // Fast-lane: if there are no exports to keep, we can just shake out the whole file\n this.imports = [];\n this.exports = {};\n this.reexports = [];\n this.deadExports = Object.keys(exports);\n\n file.path.get('body').forEach((p) => {\n p.remove();\n });\n\n return;\n }\n\n const importedAsSideEffect = onlyExportsSet.has('side-effect');\n onlyExportsSet.delete('side-effect');\n\n // Hackaround for packages which include a 'default' export without specifying __esModule; such packages cannot be\n // shaken as they will break interopRequireDefault babel helper\n // See example in shaker-plugin.test.ts\n // Real-world example was found in preact/compat npm package\n if (\n onlyExportsSet.has('default') &&\n hasDefault &&\n !collected.isEsModule\n ) {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n return;\n }\n\n if (!onlyExportsSet.has('*')) {\n // __esModule should be kept alive\n onlyExportsSet.add('__esModule');\n\n const aliveExports = new Set<NodePath>();\n const importNames = collected.imports.map(({ imported }) => imported);\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (onlyExportsSet.has(exported)) {\n aliveExports.add(local);\n } else if (\n importNames.includes((local.node as NodeWithName).name || '')\n ) {\n aliveExports.add(local);\n } else if ([...aliveExports].some((alive) => alive === local)) {\n // It's possible to export multiple values from a single variable initializer, e.g\n // export const { foo, bar } = baz();\n // We need to treat all of them as used if any of them are used, since otherwise\n // we'll attempt to delete the baz() call\n aliveExports.add(local);\n }\n });\n\n collected.reexports.forEach((exp) => {\n if (onlyExportsSet.has(exp.exported)) {\n aliveExports.add(exp.local);\n }\n });\n\n const exportToPath = new Map<string, NodePath>();\n Object.entries(exports).forEach(([exported, local]) => {\n exportToPath.set(exported, local);\n });\n\n collected.reexports.forEach((exp) => {\n exportToPath.set(exp.exported, exp.local);\n });\n\n const notFoundExports = [...onlyExportsSet].filter(\n (exp) =>\n exp !== '__esModule' && !aliveExports.has(exportToPath.get(exp)!)\n );\n exportToPath.clear();\n\n const isAllExportsFound = notFoundExports.length === 0;\n if (!isAllExportsFound && ifUnknownExport !== 'ignore') {\n if (ifUnknownExport === 'error') {\n throw new Error(\n `Unknown export(s) requested: ${onlyExports.join(',')}`\n );\n }\n\n if (ifUnknownExport === 'reexport-all') {\n // If there are unknown exports, we have keep alive all re-exports.\n if (exports['*'] !== undefined) {\n aliveExports.add(exports['*']);\n }\n\n collected.reexports.forEach((exp) => {\n if (exp.exported === '*') {\n aliveExports.add(exp.local);\n }\n });\n }\n\n if (ifUnknownExport === 'skip-shaking') {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n\n return;\n }\n }\n\n const forDeleting = [\n ...Object.values(exports),\n ...collected.reexports.map((i) => i.local),\n ].filter((exp) => !aliveExports.has(exp));\n\n if (!keepSideEffects && !importedAsSideEffect) {\n // Remove all imports that don't import something explicitly and should not be kept\n sideEffectImports.forEach((i) => {\n if (!shouldKeepSideEffect(i.source)) {\n forDeleting.push(i.local);\n }\n });\n }\n\n const deleted = new Set<NodePath>();\n\n let dereferenced: NodePath<Identifier>[] = [];\n let changed = true;\n while (changed && deleted.size < forDeleting.length) {\n changed = false;\n // eslint-disable-next-line no-restricted-syntax\n for (const path of forDeleting) {\n if (deleted.has(path)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const binding = getBindingForExport(path);\n const action = findActionForNode(path);\n const parent = action?.[1];\n const outerReferences = (binding?.referencePaths || []).filter(\n (ref) => ref !== parent && !parent?.isAncestor(ref)\n );\n if (outerReferences.length > 0 && path.isIdentifier()) {\n // Temporary deref it in order to simplify further checks.\n dereference(path);\n dereferenced.push(path);\n }\n\n if (\n !deleted.has(path) &&\n (!binding || outerReferences.length === 0)\n ) {\n if (action) {\n applyAction(action);\n } else {\n removeWithRelated([path]);\n }\n\n deleted.add(path);\n changed = true;\n }\n }\n\n dereferenced.forEach((path) => {\n // If path is still alive, we need to reference it back\n if (!isRemoved(path)) {\n reference(path);\n }\n });\n\n dereferenced = [];\n }\n }\n\n this.imports = withoutRemoved(collected.imports);\n this.exports = {};\n this.deadExports = [];\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (isRemoved(local)) {\n this.deadExports.push(exported);\n } else {\n this.exports[exported] = local;\n }\n });\n\n this.reexports = withoutRemoved(collected.reexports);\n },\n visitor: {},\n post(file: BabelFile) {\n const log = shakerLogger.extend(getFileIdx(file.opts.filename!));\n\n const processedImports = new Set<string>();\n const imports = new Map<string, string[]>();\n const addImport = ({\n imported,\n source,\n }: {\n imported: string;\n source: string;\n }) => {\n if (processedImports.has(`${source}:${imported}`)) {\n return;\n }\n\n if (!imports.has(source)) {\n imports.set(source, []);\n }\n\n if (imported) {\n imports.get(source)!.push(imported);\n }\n\n processedImports.add(`${source}:${imported}`);\n };\n\n this.imports.forEach(addImport);\n this.reexports.forEach(addImport);\n\n log('end', `remaining imports: %O`, imports);\n\n // eslint-disable-next-line no-param-reassign\n (file.metadata as IMetadata).wywEvaluator = {\n imports,\n };\n\n invalidateTraversalCache(file.path);\n },\n };\n}\n"],"mappings":"AASA,SAASA,MAAM,QAAQ,mBAAmB;AAK1C,SACEC,wBAAwB,EACxBC,gBAAgB,QACX,mCAAmC;AAC1C,SAASC,UAAU,QAAQ,qBAAqB;AAChD,SAASC,SAAS,QAAQ,oBAAoB;AAC9C,SACEC,WAAW,EACXC,WAAW,EACXC,iBAAiB,EACjBC,SAAS,EACTC,iBAAiB,QACZ,uBAAuB;AAC9B,SAASC,wBAAwB,QAAQ,yBAAyB;AAElE,MAAMC,SAAS,GAAG,cAAc;AAChC,MAAMC,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;AAElD,SAASC,oBAAoBA,CAACC,UAAkB,EAAE;EAChD,MAAM,CAACC,GAAG,CAAC,GAAGD,UAAU,CAACE,KAAK,CAACL,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;EAEjD,OAAOI,GAAG,KAAK,EAAE,IAAIH,kBAAkB,CAACK,QAAQ,CAACF,GAAG,CAAC;AACvD;AAYA,SAASG,mBAAmBA,CAACC,UAAoB,EAAuB;EACtE,IAAIA,UAAU,CAACC,YAAY,CAAC,CAAC,EAAE;IAC7B,OAAOD,UAAU,CAACE,KAAK,CAACC,UAAU,CAACH,UAAU,CAACI,IAAI,CAACC,IAAI,CAAC;EAC1D;EAEA,MAAMC,kBAAkB,GAAGN,UAAU,CAACO,UAAU,CAAEC,CAAC,IACjDA,CAAC,CAACC,oBAAoB,CAAC,CACzB,CAA6C;EAC7C,IAAIH,kBAAkB,EAAE;IACtB,MAAMI,EAAE,GAAGJ,kBAAkB,CAACK,GAAG,CAAC,IAAI,CAAC;IACvC,IAAID,EAAE,CAACT,YAAY,CAAC,CAAC,EAAE;MACrB,OAAOK,kBAAkB,CAACJ,KAAK,CAACC,UAAU,CAACO,EAAE,CAACN,IAAI,CAACC,IAAI,CAAC;IAC1D;EACF;EAEA,IAAIL,UAAU,CAACY,sBAAsB,CAAC,CAAC,EAAE;IACvC,MAAMC,IAAI,GAAGb,UAAU,CAACW,GAAG,CAAC,MAAM,CAAC;IACnC,IAAIE,IAAI,CAACZ,YAAY,CAAC,CAAC,EAAE;MACvB,OAAOD,UAAU,CAACE,KAAK,CAACC,UAAU,CAACU,IAAI,CAACT,IAAI,CAACC,IAAI,CAAC;IACpD;EACF;EAEA,IAAIL,UAAU,CAACc,qBAAqB,CAAC,CAAC,IAAId,UAAU,CAACe,kBAAkB,CAAC,CAAC,EAAE;IACzE,OAAOf,UAAU,CAACE,KAAK,CAACC,UAAU,CAACH,UAAU,CAACI,IAAI,CAACM,EAAE,CAAEL,IAAI,CAAC;EAC9D;EAEA,OAAOW,SAAS;AAClB;AAEA,MAAMC,cAAc,GAAmCC,KAAU,IAC/DA,KAAK,CAACC,MAAM,CAAC,CAAC;EAAEC;AAAM,CAAC,KAAK,CAACnC,SAAS,CAACmC,KAAK,CAAC,CAAC;AAEhD,SAASC,gBAAgBA,CACvB;EAAEC,KAAK,EAAEC;AAAQ,CAAC,EAClBC,IAAuB,EACvBC,UAAqD,EACrDC,OAAgB,EACP;EACT,MAAMC,UAAU,GAAG;IACjB,GAAGD;EACL,CAAC;EAED,MAAME,SAAS,GAAGJ,IAAI,CAACtB,KAAK;EAC5BuB,UAAU,CAACI,OAAO,CAAC,CAACC,IAAI,EAAEzB,IAAI,KAAK;IACjC,IAAIyB,IAAI,CAACC,MAAM,IAAI,CAAC,EAAE;MACpB,IAAID,IAAI,CAACC,MAAM,KAAK,CAAC,EAAE;QACrB;QACA,MAAMC,UAAU,GAAGF,IAAI,CAAC,CAAC,CAAC,CAACvB,UAAU,CAAEC,CAAC,IACtCA,CAAC,CAACC,oBAAoB,CAAC,CACzB,CAA6C;QAE7C,IAAI,CAACuB,UAAU,EAAE;UACf;QACF;MACF,CAAC,MAAM;QACL;MACF;IACF;IAEA,MAAMC,GAAG,GAAGL,SAAS,CAACM,WAAW,CAAC7B,IAAI,CAAC;IACvC;IACA,MAAM,CAAC8B,WAAW,CAAC,GAAGX,IAAI,CAACY,gBAAgB,CAAC,MAAM,EAAE,CAClDb,CAAC,CAACc,mBAAmB,CAAC,KAAK,EAAE,CAACd,CAAC,CAACjB,kBAAkB,CAACiB,CAAC,CAACe,UAAU,CAACL,GAAG,CAAC,CAAC,CAAC,CAAC,CACxE,CAAC;IAEFL,SAAS,CAACW,mBAAmB,CAACJ,WAAW,CAAC;;IAE1C;IACAL,IAAI,CAACD,OAAO,CAAEW,GAAG,IAAK;MACpB,MAAM,CAACC,QAAQ,CAAC,GAAGD,GAAG,CAACE,WAAW,CAACnB,CAAC,CAACe,UAAU,CAACL,GAAG,CAAC,CAAC;MACrD,IAAIQ,QAAQ,CAACE,mBAAmB,CAAC,CAAC,EAAE;QAClCf,SAAS,CAACgB,yBAAyB,CAACH,QAAQ,CAAC;QAC7C,IAAIA,QAAQ,CAACI,UAAU,EAAEA,UAAU,EAAEpC,oBAAoB,CAAC,CAAC,EAAE;UAC3D;UACApB,SAAS,CAACoD,QAAQ,EAAEA,QAAQ,EAAE,IAAI,CAAC;QACrC;MACF,CAAC,MAAM;QACLpD,SAAS,CAACoD,QAAQ,CAAC;MACrB;IACF,CAAC,CAAC;;IAEF;IACA,MAAM,CAACK,MAAM,CAAC,GAAGtB,IAAI,CAACuB,aAAa,CAAC,MAAM,EAAE,CAC1CxB,CAAC,CAACyB,mBAAmB,CACnBzB,CAAC,CAAC0B,oBAAoB,CACpB,GAAG,EACH1B,CAAC,CAAC2B,gBAAgB,CAAC3B,CAAC,CAACe,UAAU,CAAC,SAAS,CAAC,EAAEf,CAAC,CAACe,UAAU,CAACjC,IAAI,CAAC,CAAC,EAC/DkB,CAAC,CAACe,UAAU,CAACL,GAAG,CAClB,CACF,CAAC,CACF,CAAC;IAEF,MAAMb,KAAK,GAAG0B,MAAM,CAACnC,GAAG,CAAC,kBAAkB,CAAyB;IACpEtB,SAAS,CAAC+B,KAAK,CAAC;IAEhBO,UAAU,CAACtB,IAAI,CAAC,GAAGe,KAAK;EAC1B,CAAC,CAAC;EAEF,OAAOO,UAAU;AACnB;AAEA,eAAe,SAASwB,YAAYA,CAClCC,KAAW,EACX;EACEC,eAAe,GAAG,KAAK;EACvBC,eAAe,GAAG,cAAc;EAChCC;AACc,CAAC,EACyB;EAC1C,MAAMC,YAAY,GAAG3E,MAAM,CAAC4E,MAAM,CAAC,QAAQ,CAAC;EAE5C,OAAO;IACLpD,IAAI,EAAE,6BAA6B;IACnCqD,GAAGA,CAACC,IAAe,EAAE;MACnB,IAAI,CAACC,QAAQ,GAAGD,IAAI,CAACE,IAAI,CAACD,QAAS;MACnC,MAAME,GAAG,GAAGN,YAAY,CAACC,MAAM,CAACzE,UAAU,CAAC,IAAI,CAAC4E,QAAQ,CAAC,CAAC;MAE1DE,GAAG,CAAC,OAAO,EAAG,GAAE,IAAI,CAACF,QAAS,kBAAiBL,WAAW,CAACQ,IAAI,CAAC,GAAG,CAAE,EAAC,CAAC;MACvE,MAAMC,cAAc,GAAG,IAAIC,GAAG,CAACV,WAAW,CAAC;MAE3C,MAAMW,SAAS,GAAGpF,wBAAwB,CAAC6E,IAAI,CAACQ,IAAI,CAAC;MACrD,MAAMC,iBAAiB,GAAGF,SAAS,CAACG,OAAO,CAAClD,MAAM,CAACpC,gBAAgB,CAAC;MACpE+E,GAAG,CACD,oBAAoB,EACpB,CACG,YAAWI,SAAS,CAACG,OAAO,CAACtC,MAAO,mBAAkBqC,iBAAiB,CAACrC,MAAO,GAAE,EACjF,YAAWuC,MAAM,CAACC,MAAM,CAACL,SAAS,CAACxC,OAAO,CAAC,CAACK,MAAO,EAAC,EACpD,cAAamC,SAAS,CAACM,SAAS,CAACzC,MAAO,EAAC,CAC3C,CAACgC,IAAI,CAAC,IAAI,CACb,CAAC;;MAED;MACA;MACA,MAAMrC,OAAO,GAAGL,gBAAgB,CAC9B+B,KAAK,EACLO,IAAI,CAACQ,IAAI,EACTD,SAAS,CAACzC,UAAU,EACpByC,SAAS,CAACxC,OACZ,CAAC;MAED4C,MAAM,CAACC,MAAM,CAAC7C,OAAO,CAAC,CAACG,OAAO,CAAET,KAAK,IAAK;QACxC,IAAIA,KAAK,CAACR,sBAAsB,CAAC,CAAC,EAAE;UAClC,MAAMC,IAAI,GAAGO,KAAK,CAACT,GAAG,CAAC,MAAM,CAAC;UAC9B,IAAIE,IAAI,CAACZ,YAAY,CAAC,CAAC,EAAE;YACvB;YACA;YACAZ,SAAS,CAACwB,IAAI,EAAEA,IAAI,EAAE,IAAI,CAAC;UAC7B;QACF;MACF,CAAC,CAAC;MAEF,MAAM4D,YAAY,GAAG/C,OAAO,CAACgD,WAAW,KAAK1D,SAAS;MACtD,MAAM2D,UAAU,GAAGjD,OAAO,CAACkD,OAAO,KAAK5D,SAAS;;MAEhD;MACA,IAAIgD,cAAc,CAACa,GAAG,CAAC,aAAa,CAAC,IAAI,CAACJ,YAAY,EAAE;QACtDT,cAAc,CAACc,MAAM,CAAC,aAAa,CAAC;MACtC;MAEA,IAAId,cAAc,CAACe,IAAI,KAAK,CAAC,EAAE;QAC7B;QACA,IAAI,CAACV,OAAO,GAAG,EAAE;QACjB,IAAI,CAAC3C,OAAO,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC8C,SAAS,GAAG,EAAE;QACnB,IAAI,CAACQ,WAAW,GAAGV,MAAM,CAACW,IAAI,CAACvD,OAAO,CAAC;QAEvCiC,IAAI,CAACQ,IAAI,CAACxD,GAAG,CAAC,MAAM,CAAC,CAACkB,OAAO,CAAErB,CAAC,IAAK;UACnCA,CAAC,CAAC0E,MAAM,CAAC,CAAC;QACZ,CAAC,CAAC;QAEF;MACF;MAEA,MAAMC,oBAAoB,GAAGnB,cAAc,CAACa,GAAG,CAAC,aAAa,CAAC;MAC9Db,cAAc,CAACc,MAAM,CAAC,aAAa,CAAC;;MAEpC;MACA;MACA;MACA;MACA,IACEd,cAAc,CAACa,GAAG,CAAC,SAAS,CAAC,IAC7BF,UAAU,IACV,CAACT,SAAS,CAACkB,UAAU,EACrB;QACA,IAAI,CAACf,OAAO,GAAGH,SAAS,CAACG,OAAO;QAChC,IAAI,CAAC3C,OAAO,GAAGA,OAAO;QACtB,IAAI,CAAC8C,SAAS,GAAGN,SAAS,CAACM,SAAS;QACpC,IAAI,CAACQ,WAAW,GAAG,EAAE;QACrB;MACF;MAEA,IAAI,CAAChB,cAAc,CAACa,GAAG,CAAC,GAAG,CAAC,EAAE;QAC5B;QACAb,cAAc,CAACqB,GAAG,CAAC,YAAY,CAAC;QAEhC,MAAMC,YAAY,GAAG,IAAIrB,GAAG,CAAW,CAAC;QACxC,MAAMsB,WAAW,GAAGrB,SAAS,CAACG,OAAO,CAACmB,GAAG,CAAC,CAAC;UAAEC;QAAS,CAAC,KAAKA,QAAQ,CAAC;QAErEnB,MAAM,CAACoB,OAAO,CAAChE,OAAO,CAAC,CAACG,OAAO,CAAC,CAAC,CAAC8D,QAAQ,EAAEvE,KAAK,CAAC,KAAK;UACrD,IAAI4C,cAAc,CAACa,GAAG,CAACc,QAAQ,CAAC,EAAE;YAChCL,YAAY,CAACD,GAAG,CAACjE,KAAK,CAAC;UACzB,CAAC,MAAM,IACLmE,WAAW,CAACzF,QAAQ,CAAEsB,KAAK,CAAChB,IAAI,CAAkBC,IAAI,IAAI,EAAE,CAAC,EAC7D;YACAiF,YAAY,CAACD,GAAG,CAACjE,KAAK,CAAC;UACzB,CAAC,MAAM,IAAI,CAAC,GAAGkE,YAAY,CAAC,CAACM,IAAI,CAAEC,KAAK,IAAKA,KAAK,KAAKzE,KAAK,CAAC,EAAE;YAC7D;YACA;YACA;YACA;YACAkE,YAAY,CAACD,GAAG,CAACjE,KAAK,CAAC;UACzB;QACF,CAAC,CAAC;QAEF8C,SAAS,CAACM,SAAS,CAAC3C,OAAO,CAAEiE,GAAG,IAAK;UACnC,IAAI9B,cAAc,CAACa,GAAG,CAACiB,GAAG,CAACH,QAAQ,CAAC,EAAE;YACpCL,YAAY,CAACD,GAAG,CAACS,GAAG,CAAC1E,KAAK,CAAC;UAC7B;QACF,CAAC,CAAC;QAEF,MAAM2E,YAAY,GAAG,IAAIC,GAAG,CAAmB,CAAC;QAChD1B,MAAM,CAACoB,OAAO,CAAChE,OAAO,CAAC,CAACG,OAAO,CAAC,CAAC,CAAC8D,QAAQ,EAAEvE,KAAK,CAAC,KAAK;UACrD2E,YAAY,CAACE,GAAG,CAACN,QAAQ,EAAEvE,KAAK,CAAC;QACnC,CAAC,CAAC;QAEF8C,SAAS,CAACM,SAAS,CAAC3C,OAAO,CAAEiE,GAAG,IAAK;UACnCC,YAAY,CAACE,GAAG,CAACH,GAAG,CAACH,QAAQ,EAAEG,GAAG,CAAC1E,KAAK,CAAC;QAC3C,CAAC,CAAC;QAEF,MAAM8E,eAAe,GAAG,CAAC,GAAGlC,cAAc,CAAC,CAAC7C,MAAM,CAC/C2E,GAAG,IACFA,GAAG,KAAK,YAAY,IAAI,CAACR,YAAY,CAACT,GAAG,CAACkB,YAAY,CAACpF,GAAG,CAACmF,GAAG,CAAE,CACpE,CAAC;QACDC,YAAY,CAACI,KAAK,CAAC,CAAC;QAEpB,MAAMC,iBAAiB,GAAGF,eAAe,CAACnE,MAAM,KAAK,CAAC;QACtD,IAAI,CAACqE,iBAAiB,IAAI9C,eAAe,KAAK,QAAQ,EAAE;UACtD,IAAIA,eAAe,KAAK,OAAO,EAAE;YAC/B,MAAM,IAAI+C,KAAK,CACZ,gCAA+B9C,WAAW,CAACQ,IAAI,CAAC,GAAG,CAAE,EACxD,CAAC;UACH;UAEA,IAAIT,eAAe,KAAK,cAAc,EAAE;YACtC;YACA,IAAI5B,OAAO,CAAC,GAAG,CAAC,KAAKV,SAAS,EAAE;cAC9BsE,YAAY,CAACD,GAAG,CAAC3D,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC;YAEAwC,SAAS,CAACM,SAAS,CAAC3C,OAAO,CAAEiE,GAAG,IAAK;cACnC,IAAIA,GAAG,CAACH,QAAQ,KAAK,GAAG,EAAE;gBACxBL,YAAY,CAACD,GAAG,CAACS,GAAG,CAAC1E,KAAK,CAAC;cAC7B;YACF,CAAC,CAAC;UACJ;UAEA,IAAIkC,eAAe,KAAK,cAAc,EAAE;YACtC,IAAI,CAACe,OAAO,GAAGH,SAAS,CAACG,OAAO;YAChC,IAAI,CAAC3C,OAAO,GAAGA,OAAO;YACtB,IAAI,CAAC8C,SAAS,GAAGN,SAAS,CAACM,SAAS;YACpC,IAAI,CAACQ,WAAW,GAAG,EAAE;YAErB;UACF;QACF;QAEA,MAAMsB,WAAW,GAAG,CAClB,GAAGhC,MAAM,CAACC,MAAM,CAAC7C,OAAO,CAAC,EACzB,GAAGwC,SAAS,CAACM,SAAS,CAACgB,GAAG,CAAEe,CAAC,IAAKA,CAAC,CAACnF,KAAK,CAAC,CAC3C,CAACD,MAAM,CAAE2E,GAAG,IAAK,CAACR,YAAY,CAACT,GAAG,CAACiB,GAAG,CAAC,CAAC;QAEzC,IAAI,CAACzC,eAAe,IAAI,CAAC8B,oBAAoB,EAAE;UAC7C;UACAf,iBAAiB,CAACvC,OAAO,CAAE0E,CAAC,IAAK;YAC/B,IAAI,CAAC7G,oBAAoB,CAAC6G,CAAC,CAACC,MAAM,CAAC,EAAE;cACnCF,WAAW,CAACG,IAAI,CAACF,CAAC,CAACnF,KAAK,CAAC;YAC3B;UACF,CAAC,CAAC;QACJ;QAEA,MAAMsF,OAAO,GAAG,IAAIzC,GAAG,CAAW,CAAC;QAEnC,IAAI0C,YAAoC,GAAG,EAAE;QAC7C,IAAIC,OAAO,GAAG,IAAI;QAClB,OAAOA,OAAO,IAAIF,OAAO,CAAC3B,IAAI,GAAGuB,WAAW,CAACvE,MAAM,EAAE;UACnD6E,OAAO,GAAG,KAAK;UACf;UACA,KAAK,MAAMzC,IAAI,IAAImC,WAAW,EAAE;YAC9B,IAAII,OAAO,CAAC7B,GAAG,CAACV,IAAI,CAAC,EAAE;cACrB;cACA;YACF;YAEA,MAAM0C,OAAO,GAAG9G,mBAAmB,CAACoE,IAAI,CAAC;YACzC,MAAM2C,MAAM,GAAG1H,iBAAiB,CAAC+E,IAAI,CAAC;YACtC,MAAM4C,MAAM,GAAGD,MAAM,GAAG,CAAC,CAAC;YAC1B,MAAME,eAAe,GAAG,CAACH,OAAO,EAAEI,cAAc,IAAI,EAAE,EAAE9F,MAAM,CAC3DqB,GAAG,IAAKA,GAAG,KAAKuE,MAAM,IAAI,CAACA,MAAM,EAAEG,UAAU,CAAC1E,GAAG,CACpD,CAAC;YACD,IAAIwE,eAAe,CAACjF,MAAM,GAAG,CAAC,IAAIoC,IAAI,CAAClE,YAAY,CAAC,CAAC,EAAE;cACrD;cACAd,WAAW,CAACgF,IAAI,CAAC;cACjBwC,YAAY,CAACF,IAAI,CAACtC,IAAI,CAAC;YACzB;YAEA,IACE,CAACuC,OAAO,CAAC7B,GAAG,CAACV,IAAI,CAAC,KACjB,CAAC0C,OAAO,IAAIG,eAAe,CAACjF,MAAM,KAAK,CAAC,CAAC,EAC1C;cACA,IAAI+E,MAAM,EAAE;gBACV5H,WAAW,CAAC4H,MAAM,CAAC;cACrB,CAAC,MAAM;gBACLxH,iBAAiB,CAAC,CAAC6E,IAAI,CAAC,CAAC;cAC3B;cAEAuC,OAAO,CAACrB,GAAG,CAAClB,IAAI,CAAC;cACjByC,OAAO,GAAG,IAAI;YAChB;UACF;UAEAD,YAAY,CAAC9E,OAAO,CAAEsC,IAAI,IAAK;YAC7B;YACA,IAAI,CAAClF,SAAS,CAACkF,IAAI,CAAC,EAAE;cACpB9E,SAAS,CAAC8E,IAAI,CAAC;YACjB;UACF,CAAC,CAAC;UAEFwC,YAAY,GAAG,EAAE;QACnB;MACF;MAEA,IAAI,CAACtC,OAAO,GAAGpD,cAAc,CAACiD,SAAS,CAACG,OAAO,CAAC;MAChD,IAAI,CAAC3C,OAAO,GAAG,CAAC,CAAC;MACjB,IAAI,CAACsD,WAAW,GAAG,EAAE;MAErBV,MAAM,CAACoB,OAAO,CAAChE,OAAO,CAAC,CAACG,OAAO,CAAC,CAAC,CAAC8D,QAAQ,EAAEvE,KAAK,CAAC,KAAK;QACrD,IAAInC,SAAS,CAACmC,KAAK,CAAC,EAAE;UACpB,IAAI,CAAC4D,WAAW,CAACyB,IAAI,CAACd,QAAQ,CAAC;QACjC,CAAC,MAAM;UACL,IAAI,CAACjE,OAAO,CAACiE,QAAQ,CAAC,GAAGvE,KAAK;QAChC;MACF,CAAC,CAAC;MAEF,IAAI,CAACoD,SAAS,GAAGvD,cAAc,CAACiD,SAAS,CAACM,SAAS,CAAC;IACtD,CAAC;IACD2C,OAAO,EAAE,CAAC,CAAC;IACXC,IAAIA,CAACzD,IAAe,EAAE;MACpB,MAAMG,GAAG,GAAGN,YAAY,CAACC,MAAM,CAACzE,UAAU,CAAC2E,IAAI,CAACE,IAAI,CAACD,QAAS,CAAC,CAAC;MAEhE,MAAMyD,gBAAgB,GAAG,IAAIpD,GAAG,CAAS,CAAC;MAC1C,MAAMI,OAAO,GAAG,IAAI2B,GAAG,CAAmB,CAAC;MAC3C,MAAMsB,SAAS,GAAGA,CAAC;QACjB7B,QAAQ;QACRe;MAIF,CAAC,KAAK;QACJ,IAAIa,gBAAgB,CAACxC,GAAG,CAAE,GAAE2B,MAAO,IAAGf,QAAS,EAAC,CAAC,EAAE;UACjD;QACF;QAEA,IAAI,CAACpB,OAAO,CAACQ,GAAG,CAAC2B,MAAM,CAAC,EAAE;UACxBnC,OAAO,CAAC4B,GAAG,CAACO,MAAM,EAAE,EAAE,CAAC;QACzB;QAEA,IAAIf,QAAQ,EAAE;UACZpB,OAAO,CAAC1D,GAAG,CAAC6F,MAAM,CAAC,CAAEC,IAAI,CAAChB,QAAQ,CAAC;QACrC;QAEA4B,gBAAgB,CAAChC,GAAG,CAAE,GAAEmB,MAAO,IAAGf,QAAS,EAAC,CAAC;MAC/C,CAAC;MAED,IAAI,CAACpB,OAAO,CAACxC,OAAO,CAACyF,SAAS,CAAC;MAC/B,IAAI,CAAC9C,SAAS,CAAC3C,OAAO,CAACyF,SAAS,CAAC;MAEjCxD,GAAG,CAAC,KAAK,EAAG,uBAAsB,EAAEO,OAAO,CAAC;;MAE5C;MACCV,IAAI,CAAC4D,QAAQ,CAAeC,YAAY,GAAG;QAC1CnD;MACF,CAAC;MAED9E,wBAAwB,CAACoE,IAAI,CAACQ,IAAI,CAAC;IACrC;EACF,CAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"shaker.js","names":["logger","collectExportsAndImports","sideEffectImport","getFileIdx","isRemoved","applyAction","dereference","findActionForNode","reference","removeWithRelated","invalidateTraversalCache","EXT_REGEX","ALLOWED_EXTENSIONS","shouldKeepSideEffect","importPath","ext","match","includes","getBindingForExport","exportPath","isIdentifier","scope","getBinding","node","name","variableDeclarator","findParent","p","isVariableDeclarator","id","get","isAssignmentExpression","left","isFunctionDeclaration","isClassDeclaration","undefined","withoutRemoved","items","filter","local","rearrangeExports","types","t","root","exportRefs","exports","rearranged","rootScope","forEach","refs","length","declarator","uid","generateUid","declaration","unshiftContainer","variableDeclaration","identifier","registerDeclaration","constantViolations","ref","replaced","replaceWith","isBindingIdentifier","push","registerConstantViolation","assigmentToExport","expressionStatement","assignmentExpression","memberExpression","body","lastViolation","pathInRoot","find","n","isDescendant","pushed","insertAfter","shakerPlugin","babel","keepSideEffects","ifUnknownExport","onlyExports","shakerLogger","extend","pre","file","filename","opts","log","join","onlyExportsSet","Set","collected","path","sideEffectImports","imports","Object","values","reexports","hasWywPreval","__wywPreval","hasDefault","default","has","delete","size","deadExports","keys","remove","importedAsSideEffect","isEsModule","add","aliveExports","importNames","map","imported","entries","exported","some","alive","exp","exportToPath","Map","set","notFoundExports","clear","isAllExportsFound","Error","forDeleting","i","source","deleted","dereferenced","changed","binding","action","parent","outerReferences","referencePaths","isAncestor","unreferenced","getAllBindings","referenced","visitor","post","processedImports","addImport","metadata","wywEvaluator"],"sources":["../../src/plugins/shaker.ts"],"sourcesContent":["import type { BabelFile, PluginObj, NodePath } from '@babel/core';\nimport type { Binding } from '@babel/traverse';\nimport type {\n Identifier,\n MemberExpression,\n Program,\n VariableDeclarator,\n} from '@babel/types';\n\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { Core } from '../babel';\nimport type { IMetadata } from '../utils/ShakerMetadata';\nimport type { Exports, IState } from '../utils/collectExportsAndImports';\nimport {\n collectExportsAndImports,\n sideEffectImport,\n} from '../utils/collectExportsAndImports';\nimport { getFileIdx } from '../utils/getFileIdx';\nimport { isRemoved } from '../utils/isRemoved';\nimport {\n applyAction,\n dereference,\n findActionForNode,\n reference,\n removeWithRelated,\n} from '../utils/scopeHelpers';\nimport { invalidateTraversalCache } from '../utils/traversalCache';\n\nconst EXT_REGEX = /\\.[0-9a-z]+$/;\nconst ALLOWED_EXTENSIONS = ['.js', '.cjs', '.mjs'];\n\nfunction shouldKeepSideEffect(importPath: string) {\n const [ext] = importPath.match(EXT_REGEX) || [''];\n\n return ext === '' || ALLOWED_EXTENSIONS.includes(ext);\n}\n\nexport interface IShakerOptions {\n ifUnknownExport?: 'error' | 'ignore' | 'reexport-all' | 'skip-shaking';\n keepSideEffects?: boolean;\n onlyExports: string[];\n}\n\ninterface NodeWithName {\n name: string;\n}\n\nfunction getBindingForExport(exportPath: NodePath): Binding | undefined {\n if (exportPath.isIdentifier()) {\n return exportPath.scope.getBinding(exportPath.node.name);\n }\n\n const variableDeclarator = exportPath.findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n if (variableDeclarator) {\n const id = variableDeclarator.get('id');\n if (id.isIdentifier()) {\n return variableDeclarator.scope.getBinding(id.node.name);\n }\n }\n\n if (exportPath.isAssignmentExpression()) {\n const left = exportPath.get('left');\n if (left.isIdentifier()) {\n return exportPath.scope.getBinding(left.node.name);\n }\n }\n\n if (exportPath.isFunctionDeclaration() || exportPath.isClassDeclaration()) {\n return exportPath.scope.getBinding(exportPath.node.id!.name);\n }\n\n return undefined;\n}\n\nconst withoutRemoved = <T extends { local: NodePath }>(items: T[]): T[] =>\n items.filter(({ local }) => !isRemoved(local));\n\nfunction rearrangeExports(\n { types: t }: Core,\n root: NodePath<Program>,\n exportRefs: Map<string, NodePath<MemberExpression>[]>,\n exports: Exports\n): Exports {\n const rearranged = {\n ...exports,\n };\n\n const rootScope = root.scope;\n exportRefs.forEach((refs, name) => {\n if (refs.length <= 1) {\n if (refs.length === 1) {\n // Maybe exports is assigned to another variable?\n const declarator = refs[0].findParent((p) =>\n p.isVariableDeclarator()\n ) as NodePath<VariableDeclarator> | undefined;\n\n if (!declarator) {\n return;\n }\n } else {\n return;\n }\n }\n\n const uid = rootScope.generateUid(name);\n // Define variable in the beginning\n const [declaration] = root.unshiftContainer('body', [\n t.variableDeclaration('var', [t.variableDeclarator(t.identifier(uid))]),\n ]);\n\n rootScope.registerDeclaration(declaration);\n\n const constantViolations: NodePath<Identifier>[] = [];\n // Replace every reference with defined variable\n refs.forEach((ref) => {\n const [replaced] = ref.replaceWith(t.identifier(uid));\n if (replaced.isBindingIdentifier()) {\n constantViolations.push(replaced);\n } else {\n reference(replaced);\n }\n });\n\n constantViolations.forEach((id) => {\n rootScope.registerConstantViolation(id);\n });\n\n const assigmentToExport = t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.memberExpression(t.identifier('exports'), t.identifier(name)),\n t.identifier(uid)\n )\n );\n\n // export.foo = _foo will be inserted either after the last _foo assigment or in the end of the file\n const body = root.get('body');\n const lastViolation =\n constantViolations[constantViolations.length - 1] ??\n body[body.length - 1];\n const pathInRoot = root\n .get('body')\n .find((n) => lastViolation.isDescendant(n))!;\n\n const [pushed] = pathInRoot.insertAfter(assigmentToExport);\n\n const local = pushed.get('expression.right') as NodePath<Identifier>;\n reference(local);\n\n rearranged[name] = local;\n });\n\n return rearranged;\n}\n\nexport default function shakerPlugin(\n babel: Core,\n {\n keepSideEffects = false,\n ifUnknownExport = 'skip-shaking',\n onlyExports,\n }: IShakerOptions\n): PluginObj<IState & { filename: string }> {\n const shakerLogger = logger.extend('shaker');\n\n return {\n name: '@wyw-in-js/transform/shaker',\n pre(file: BabelFile) {\n this.filename = file.opts.filename!;\n const log = shakerLogger.extend(getFileIdx(this.filename));\n\n log('start', `${this.filename}, onlyExports: ${onlyExports.join(',')}`);\n const onlyExportsSet = new Set(onlyExports);\n\n const collected = collectExportsAndImports(file.path);\n const sideEffectImports = collected.imports.filter(sideEffectImport);\n log(\n 'import-and-exports',\n [\n `imports: ${collected.imports.length} (side-effects: ${sideEffectImports.length})`,\n `exports: ${Object.values(collected.exports).length}`,\n `reexports: ${collected.reexports.length}`,\n ].join(', ')\n );\n\n // We cannot just throw out exports if they are referred in the code\n // Let's dome some replacements\n const exports = rearrangeExports(\n babel,\n file.path,\n collected.exportRefs,\n collected.exports\n );\n\n Object.values(exports).forEach((local) => {\n if (local.isAssignmentExpression()) {\n const left = local.get('left');\n if (left.isIdentifier()) {\n // For some reason babel does not mark id in AssignmentExpression as a reference\n // So we need to do it manually\n reference(left, left, true);\n }\n }\n });\n\n const hasWywPreval = exports.__wywPreval !== undefined;\n const hasDefault = exports.default !== undefined;\n\n // If __wywPreval is not exported, we can remove it from onlyExports\n if (onlyExportsSet.has('__wywPreval') && !hasWywPreval) {\n onlyExportsSet.delete('__wywPreval');\n }\n\n if (onlyExportsSet.size === 0) {\n // Fast-lane: if there are no exports to keep, we can just shake out the whole file\n this.imports = [];\n this.exports = {};\n this.reexports = [];\n this.deadExports = Object.keys(exports);\n\n file.path.get('body').forEach((p) => {\n p.remove();\n });\n\n return;\n }\n\n const importedAsSideEffect = onlyExportsSet.has('side-effect');\n onlyExportsSet.delete('side-effect');\n\n // Hackaround for packages which include a 'default' export without specifying __esModule; such packages cannot be\n // shaken as they will break interopRequireDefault babel helper\n // See example in shaker-plugin.test.ts\n // Real-world example was found in preact/compat npm package\n if (\n onlyExportsSet.has('default') &&\n hasDefault &&\n !collected.isEsModule\n ) {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n return;\n }\n\n if (!onlyExportsSet.has('*')) {\n // __esModule should be kept alive\n onlyExportsSet.add('__esModule');\n\n const aliveExports = new Set<NodePath>();\n const importNames = collected.imports.map(({ imported }) => imported);\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (onlyExportsSet.has(exported)) {\n aliveExports.add(local);\n } else if (\n importNames.includes((local.node as NodeWithName).name || '')\n ) {\n aliveExports.add(local);\n } else if ([...aliveExports].some((alive) => alive === local)) {\n // It's possible to export multiple values from a single variable initializer, e.g\n // export const { foo, bar } = baz();\n // We need to treat all of them as used if any of them are used, since otherwise\n // we'll attempt to delete the baz() call\n aliveExports.add(local);\n }\n });\n\n collected.reexports.forEach((exp) => {\n if (onlyExportsSet.has(exp.exported)) {\n aliveExports.add(exp.local);\n }\n });\n\n const exportToPath = new Map<string, NodePath>();\n Object.entries(exports).forEach(([exported, local]) => {\n exportToPath.set(exported, local);\n });\n\n collected.reexports.forEach((exp) => {\n exportToPath.set(exp.exported, exp.local);\n });\n\n const notFoundExports = [...onlyExportsSet].filter(\n (exp) =>\n exp !== '__esModule' && !aliveExports.has(exportToPath.get(exp)!)\n );\n exportToPath.clear();\n\n const isAllExportsFound = notFoundExports.length === 0;\n if (!isAllExportsFound && ifUnknownExport !== 'ignore') {\n if (ifUnknownExport === 'error') {\n throw new Error(\n `Unknown export(s) requested: ${onlyExports.join(',')}`\n );\n }\n\n if (ifUnknownExport === 'reexport-all') {\n // If there are unknown exports, we have keep alive all re-exports.\n if (exports['*'] !== undefined) {\n aliveExports.add(exports['*']);\n }\n\n collected.reexports.forEach((exp) => {\n if (exp.exported === '*') {\n aliveExports.add(exp.local);\n }\n });\n }\n\n if (ifUnknownExport === 'skip-shaking') {\n this.imports = collected.imports;\n this.exports = exports;\n this.reexports = collected.reexports;\n this.deadExports = [];\n\n return;\n }\n }\n\n const forDeleting = [\n ...Object.values(exports),\n ...collected.reexports.map((i) => i.local),\n ].filter((exp) => !aliveExports.has(exp));\n\n if (!keepSideEffects && !importedAsSideEffect) {\n // Remove all imports that don't import something explicitly and should not be kept\n sideEffectImports.forEach((i) => {\n if (!shouldKeepSideEffect(i.source)) {\n forDeleting.push(i.local);\n }\n });\n }\n\n const deleted = new Set<NodePath>();\n\n let dereferenced: NodePath<Identifier>[] = [];\n let changed = true;\n while (changed && deleted.size < forDeleting.length) {\n changed = false;\n // eslint-disable-next-line no-restricted-syntax\n for (const path of forDeleting) {\n if (deleted.has(path)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const binding = getBindingForExport(path);\n const action = findActionForNode(path);\n const parent = action?.[1];\n const outerReferences = (binding?.referencePaths || []).filter(\n (ref) => ref !== parent && !parent?.isAncestor(ref)\n );\n if (outerReferences.length > 0 && path.isIdentifier()) {\n // Temporary deref it in order to simplify further checks.\n dereference(path);\n dereferenced.push(path);\n }\n\n if (\n !deleted.has(path) &&\n (!binding || outerReferences.length === 0)\n ) {\n if (action) {\n applyAction(action);\n } else {\n removeWithRelated([path]);\n }\n\n deleted.add(path);\n changed = true;\n }\n }\n\n dereferenced.forEach((path) => {\n // If path is still alive, we need to reference it back\n if (!isRemoved(path)) {\n reference(path);\n }\n });\n\n dereferenced = [];\n\n // Find and mark for deleting all unreferenced variables\n const unreferenced = Object.values(\n file.scope.getAllBindings()\n ).filter((i) => !i.referenced);\n\n for (const binding of unreferenced) {\n if (\n binding.path.isVariableDeclarator() &&\n !forDeleting.includes(binding.path.get('id'))\n ) {\n forDeleting.push(binding.path.get('id'));\n changed = true;\n }\n }\n }\n }\n\n this.imports = withoutRemoved(collected.imports);\n this.exports = {};\n this.deadExports = [];\n\n Object.entries(exports).forEach(([exported, local]) => {\n if (isRemoved(local)) {\n this.deadExports.push(exported);\n } else {\n this.exports[exported] = local;\n }\n });\n\n this.reexports = withoutRemoved(collected.reexports);\n },\n visitor: {},\n post(file: BabelFile) {\n const log = shakerLogger.extend(getFileIdx(file.opts.filename!));\n\n const processedImports = new Set<string>();\n const imports = new Map<string, string[]>();\n const addImport = ({\n imported,\n source,\n }: {\n imported: string;\n source: string;\n }) => {\n if (processedImports.has(`${source}:${imported}`)) {\n return;\n }\n\n if (!imports.has(source)) {\n imports.set(source, []);\n }\n\n if (imported) {\n imports.get(source)!.push(imported);\n }\n\n processedImports.add(`${source}:${imported}`);\n };\n\n this.imports.forEach(addImport);\n this.reexports.forEach(addImport);\n\n log('end', `remaining imports: %O`, imports);\n\n // eslint-disable-next-line no-param-reassign\n (file.metadata as IMetadata).wywEvaluator = {\n imports,\n };\n\n invalidateTraversalCache(file.path);\n },\n };\n}\n"],"mappings":"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"}
|
package/esm/shaker.js
CHANGED
package/esm/shaker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shaker.js","names":["hasShakerMetadata","getPluginKey","hasKeyInList","plugin","list","pluginKey","some","i","includes","safeResolve","id","paths","require","resolve","filter","shaker","evalConfig","ast","code","highPriorityPlugins","config","babel","preShakePlugins","plugins","hasCommonjsPlugin","push","filename","endsWith","hasTypescriptPlugin","preset","transformOptions","caller","name","transformed","transformFromAstSync","metadata","Error","wywEvaluator","imports"],"sources":["../src/shaker.ts"],"sourcesContent":["import type { TransformOptions, PluginItem } from '@babel/core';\n\nimport type { Evaluator } from '@wyw-in-js/shared';\n\nimport { hasShakerMetadata } from './utils/ShakerMetadata';\nimport { getPluginKey } from './utils/getPluginKey';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nconst safeResolve = (id: string, paths: (string | null)[]): string | null => {\n try {\n return require.resolve(id, {\n paths: paths.filter((i) => i !== null) as string[],\n });\n } catch {\n return null;\n }\n};\n\
|
|
1
|
+
{"version":3,"file":"shaker.js","names":["hasShakerMetadata","getPluginKey","hasKeyInList","plugin","list","pluginKey","some","i","includes","safeResolve","id","paths","require","resolve","filter","shaker","evalConfig","ast","code","highPriorityPlugins","config","babel","preShakePlugins","plugins","hasCommonjsPlugin","push","filename","endsWith","hasTypescriptPlugin","preset","transformOptions","caller","name","transformed","transformFromAstSync","metadata","Error","wywEvaluator","imports"],"sources":["../src/shaker.ts"],"sourcesContent":["import type { TransformOptions, PluginItem } from '@babel/core';\n\nimport type { Evaluator } from '@wyw-in-js/shared';\n\nimport { hasShakerMetadata } from './utils/ShakerMetadata';\nimport { getPluginKey } from './utils/getPluginKey';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nconst safeResolve = (id: string, paths: (string | null)[]): string | null => {\n try {\n return require.resolve(id, {\n paths: paths.filter((i) => i !== null) as string[],\n });\n } catch {\n return null;\n }\n};\n\nexport const shaker: Evaluator = (\n evalConfig,\n ast,\n code,\n { highPriorityPlugins, ...config },\n babel\n) => {\n const preShakePlugins =\n evalConfig.plugins?.filter((i) => hasKeyInList(i, highPriorityPlugins)) ??\n [];\n\n const plugins = [\n ...preShakePlugins,\n [require.resolve('./plugins/shaker'), config],\n ...(evalConfig.plugins ?? []).filter(\n (i) => !hasKeyInList(i, highPriorityPlugins)\n ),\n ];\n\n const hasCommonjsPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-modules-commonjs'\n );\n\n if (!hasCommonjsPlugin) {\n plugins.push(require.resolve('@babel/plugin-transform-modules-commonjs'));\n }\n\n if (\n evalConfig.filename?.endsWith('.ts') ||\n evalConfig.filename?.endsWith('.tsx')\n ) {\n const hasTypescriptPlugin = evalConfig.plugins?.some(\n (i) => getPluginKey(i) === 'transform-typescript'\n );\n\n if (!hasTypescriptPlugin) {\n const preset = safeResolve('@babel/preset-typescript', [\n evalConfig.filename,\n ]);\n const plugin = safeResolve('@babel/plugin-transform-typescript', [\n evalConfig.filename,\n preset,\n ]);\n\n if (plugin) {\n plugins.push(plugin);\n }\n }\n }\n\n const transformOptions: TransformOptions = {\n ...evalConfig,\n caller: {\n name: 'wyw-in-js',\n },\n plugins,\n };\n\n const transformed = babel.transformFromAstSync(ast, code, transformOptions);\n\n if (!transformed || !hasShakerMetadata(transformed.metadata)) {\n throw new Error(`${evalConfig.filename} has no shaker metadata`);\n }\n\n return [\n transformed.ast!,\n transformed.code ?? '',\n transformed.metadata.wywEvaluator.imports,\n ];\n};\n\nexport default shaker;\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
2
|
import { SourceMapGenerator } from 'source-map';
|
|
3
|
-
import { compile, serialize, stringify, middleware, prefixer
|
|
3
|
+
import { compile, serialize, stringify, middleware, prefixer } from 'stylis';
|
|
4
4
|
const posixSep = path.posix.sep;
|
|
5
5
|
export function transformUrl(url, outputFilename, sourceFilename, platformPath = path) {
|
|
6
6
|
// Replace asset path with new path relative to the output CSS
|
|
@@ -14,7 +14,8 @@ export function transformUrl(url, outputFilename, sourceFilename, platformPath =
|
|
|
14
14
|
}
|
|
15
15
|
function createStylisPreprocessor(options) {
|
|
16
16
|
function stylisPreprocess(selector, text) {
|
|
17
|
-
|
|
17
|
+
const compiled = compile(`${selector} {${text}}\n`);
|
|
18
|
+
return serialize(compiled, middleware([element => {
|
|
18
19
|
const {
|
|
19
20
|
outputFilename
|
|
20
21
|
} = options;
|
|
@@ -24,7 +25,7 @@ function createStylisPreprocessor(options) {
|
|
|
24
25
|
// eslint-disable-next-line no-param-reassign
|
|
25
26
|
element.return = element.value.replace(/\b(url\((["']?))(\.[^)]+?)(\2\))/g, (match, p1, p2, p3, p4) => p1 + transformUrl(p3, outputFilename, options.filename) + p4);
|
|
26
27
|
}
|
|
27
|
-
},
|
|
28
|
+
}, prefixer, stringify]));
|
|
28
29
|
}
|
|
29
30
|
return stylisPreprocess;
|
|
30
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":["path","SourceMapGenerator","compile","serialize","stringify","middleware","prefixer","
|
|
1
|
+
{"version":3,"file":"extract.js","names":["path","SourceMapGenerator","compile","serialize","stringify","middleware","prefixer","posixSep","posix","sep","transformUrl","url","outputFilename","sourceFilename","platformPath","relative","dirname","resolve","split","join","createStylisPreprocessor","options","stylisPreprocess","selector","text","compiled","element","type","return","value","replace","match","p1","p2","p3","p4","filename","extractCssFromAst","rules","originalCode","mappings","cssText","preprocessor","Object","keys","forEach","index","push","generated","line","column","original","start","name","source","atom","cssSourceMapText","length","generator","file","mapping","addMapping","setSourceContent","toString","extract","services","entrypoint","processors","data","loadedAndParsed","evaluator","Error","allRules","allReplacements","processor","artifacts","artifact","replacements","code"],"sources":["../../../src/transform/generators/extract.ts"],"sourcesContent":["import path from 'path';\n\nimport type { Mapping } from 'source-map';\nimport { SourceMapGenerator } from 'source-map';\nimport { compile, serialize, stringify, middleware, prefixer } from 'stylis';\n\nimport type { Replacements, Rules } from '@wyw-in-js/shared';\n\nimport type { Options, PreprocessorFn } from '../../types';\nimport type { IExtractAction, SyncScenarioForAction } from '../types';\n\nconst posixSep = path.posix.sep;\n\nexport function transformUrl(\n url: string,\n outputFilename: string,\n sourceFilename: string,\n platformPath: typeof path = path\n) {\n // Replace asset path with new path relative to the output CSS\n const relative = platformPath.relative(\n platformPath.dirname(outputFilename),\n // Get the absolute path to the asset from the path relative to the JS file\n platformPath.resolve(platformPath.dirname(sourceFilename), url)\n );\n\n if (platformPath.sep === posixSep) {\n return relative;\n }\n\n return relative.split(platformPath.sep).join(posixSep);\n}\n\nfunction createStylisPreprocessor(options: Options) {\n function stylisPreprocess(selector: string, text: string): string {\n const compiled = compile(`${selector} {${text}}\\n`);\n return serialize(\n compiled,\n middleware([\n (element: { return: string; type: string; value: string }) => {\n const { outputFilename } = options;\n if (element.type === 'decl' && outputFilename) {\n // When writing to a file, we need to adjust the relative paths inside url(..) expressions.\n // It'll allow css-loader to resolve an imported asset properly.\n // eslint-disable-next-line no-param-reassign\n element.return = element.value.replace(\n /\\b(url\\(([\"']?))(\\.[^)]+?)(\\2\\))/g,\n (match, p1, p2, p3, p4) =>\n p1 + transformUrl(p3, outputFilename, options.filename) + p4\n );\n }\n },\n prefixer,\n stringify,\n ])\n );\n }\n return stylisPreprocess;\n}\n\nfunction extractCssFromAst(\n rules: Rules,\n originalCode: string,\n options: Pick<Options, 'preprocessor' | 'filename' | 'outputFilename'>\n): { cssSourceMapText: string; cssText: string; rules: Rules } {\n const mappings: Mapping[] = [];\n\n let cssText = '';\n\n let preprocessor: PreprocessorFn;\n if (typeof options.preprocessor === 'function') {\n // eslint-disable-next-line prefer-destructuring\n preprocessor = options.preprocessor;\n } else {\n switch (options.preprocessor) {\n case 'none':\n preprocessor = (selector, text) => `${selector} {${text}}\\n`;\n break;\n case 'stylis':\n default:\n preprocessor = createStylisPreprocessor(options);\n }\n }\n\n Object.keys(rules).forEach((selector, index) => {\n mappings.push({\n generated: {\n line: index + 1,\n column: 0,\n },\n original: rules[selector].start!,\n name: selector,\n source: '',\n });\n\n if (rules[selector].atom) {\n // For atoms, we just directly insert cssText, to give the atomizer full control over the rules\n cssText += `${rules[selector].cssText}\\n`;\n } else {\n // Run each rule through stylis to support nesting\n cssText += `${preprocessor(selector, rules[selector].cssText)}\\n`;\n }\n });\n\n return {\n cssText,\n rules,\n\n get cssSourceMapText() {\n if (mappings?.length) {\n const generator = new SourceMapGenerator({\n file: options.filename.replace(/\\.js$/, '.css'),\n });\n\n mappings.forEach((mapping) =>\n generator.addMapping({ ...mapping, source: options.filename })\n );\n\n generator.setSourceContent(options.filename, originalCode);\n\n return generator.toString();\n }\n\n return '';\n },\n };\n}\n\n/**\n * Extract artifacts (e.g. CSS) from processors\n */\n// eslint-disable-next-line require-yield\nexport function* extract(\n this: IExtractAction\n): SyncScenarioForAction<IExtractAction> {\n const { options } = this.services;\n const { entrypoint } = this;\n const { processors } = this.data;\n const { loadedAndParsed } = entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n throw new Error('entrypoint was ignored');\n }\n\n let allRules: Rules = {};\n const allReplacements: Replacements = [];\n processors.forEach((processor) => {\n processor.artifacts.forEach((artifact) => {\n if (artifact[0] !== 'css') return;\n const [rules, replacements] = artifact[1] as [\n rules: Rules,\n sourceMapReplacements: Replacements,\n ];\n\n allRules = {\n ...allRules,\n ...rules,\n };\n\n allReplacements.push(...replacements);\n });\n });\n\n return {\n ...extractCssFromAst(allRules, loadedAndParsed.code, options),\n replacements: allReplacements,\n };\n}\n"],"mappings":"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"}
|
|
@@ -54,6 +54,7 @@ export const prepareCode = (services, item, originalAst) => {
|
|
|
54
54
|
}
|
|
55
55
|
log('[preeval] metadata %O', transformMetadata);
|
|
56
56
|
log('[evaluator:start] using %s', evaluator.name);
|
|
57
|
+
log.extend('source')('%s', preevalStageResult.code);
|
|
57
58
|
const evaluatorConfig = {
|
|
58
59
|
onlyExports: only,
|
|
59
60
|
highPriorityPlugins: pluginOptions.highPriorityPlugins,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","names":["buildOptions","getTransformMetadata","getPluginKey","EMPTY_FILE","hasKeyInList","plugin","list","pluginKey","some","i","includes","runPreevalStage","babel","evalConfig","pluginOptions","code","originalAst","eventEmitter","preShakePlugins","plugins","filter","highPriorityPlugins","require","resolve","transformConfig","envName","result","transformFromAstSync","ast","program","Error","prepareCode","services","item","log","only","loadedAndParsed","evaluator","options","preevalStageResult","perf","transformMetadata","metadata","length","name","evaluatorConfig","onlyExports","features","transformedCode","imports","internalTransform","prepareFn","entrypoint","preparedCode","extend","size","resolvedImports","getNext","resolved","transform","call"],"sources":["../../../src/transform/generators/transform.ts"],"sourcesContent":["import type {\n BabelFileResult,\n PluginItem,\n TransformOptions,\n} from '@babel/core';\nimport type { File } from '@babel/types';\n\nimport type { EvaluatorConfig, StrictOptions } from '@wyw-in-js/shared';\n\nimport type { Core } from '../../babel';\nimport { buildOptions } from '../../options/buildOptions';\nimport type { EventEmitter } from '../../utils/EventEmitter';\nimport type { WYWTransformMetadata } from '../../utils/TransformMetadata';\nimport { getTransformMetadata } from '../../utils/TransformMetadata';\nimport { getPluginKey } from '../../utils/getPluginKey';\nimport type { Entrypoint } from '../Entrypoint';\nimport type {\n ITransformAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\nconst EMPTY_FILE = '=== empty file ===';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nfunction runPreevalStage(\n babel: Core,\n evalConfig: TransformOptions,\n pluginOptions: StrictOptions,\n code: string,\n originalAst: File,\n eventEmitter: EventEmitter\n): BabelFileResult {\n const preShakePlugins =\n evalConfig.plugins?.filter((i) =>\n hasKeyInList(i, pluginOptions.highPriorityPlugins)\n ) ?? [];\n\n const plugins = [\n ...preShakePlugins,\n [\n require.resolve('../../plugins/preeval'),\n { ...pluginOptions, eventEmitter },\n ],\n [require.resolve('../../plugins/dynamic-import')],\n ...(evalConfig.plugins ?? []).filter(\n (i) => !hasKeyInList(i, pluginOptions.highPriorityPlugins)\n ),\n ];\n\n const transformConfig = buildOptions({\n ...evalConfig,\n envName: 'wyw-in-js',\n plugins,\n });\n\n const result = babel.transformFromAstSync(originalAst, code, transformConfig);\n\n if (!result || !result.ast?.program) {\n throw new Error('Babel transform failed');\n }\n\n return result;\n}\n\ntype PrepareCodeFn = (\n services: Services,\n item: Entrypoint,\n originalAst: File\n) => [\n code: string,\n imports: Map<string, string[]> | null,\n metadata: WYWTransformMetadata | null,\n];\n\nexport const prepareCode = (\n services: Services,\n item: Entrypoint,\n originalAst: File\n): ReturnType<PrepareCodeFn> => {\n const { log, only, loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const { code, evalConfig, evaluator } = loadedAndParsed;\n const { options, babel, eventEmitter } = services;\n const { pluginOptions } = options;\n\n const preevalStageResult = eventEmitter.perf('transform:preeval', () =>\n runPreevalStage(\n babel,\n evalConfig,\n pluginOptions,\n code,\n originalAst,\n eventEmitter\n )\n );\n\n const transformMetadata = getTransformMetadata(preevalStageResult.metadata);\n\n if (only.length === 1 && only[0] === '__wywPreval' && !transformMetadata) {\n log('[evaluator:end] no metadata');\n return [preevalStageResult.code!, null, null];\n }\n\n log('[preeval] metadata %O', transformMetadata);\n log('[evaluator:start] using %s', evaluator.name);\n\n const evaluatorConfig: EvaluatorConfig = {\n onlyExports: only,\n highPriorityPlugins: pluginOptions.highPriorityPlugins,\n features: pluginOptions.features,\n };\n\n const [, transformedCode, imports] = eventEmitter.perf(\n 'transform:evaluator',\n () =>\n evaluator(\n evalConfig,\n preevalStageResult.ast!,\n preevalStageResult.code!,\n evaluatorConfig,\n babel\n )\n );\n\n log('[evaluator:end]');\n\n return [transformedCode, imports, transformMetadata ?? null];\n};\n\nexport function* internalTransform(\n this: ITransformAction,\n prepareFn: PrepareCodeFn\n): SyncScenarioForAction<ITransformAction> {\n const { only, loadedAndParsed, log } = this.entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n log('>> (%o)', only);\n\n const [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n loadedAndParsed.ast\n );\n\n if (loadedAndParsed.code === preparedCode) {\n log('<< (%o)\\n === no changes ===', only);\n } else {\n log('<< (%o)', only);\n log.extend('source')('%s', preparedCode || EMPTY_FILE);\n }\n\n if (preparedCode === '') {\n log('is skipped');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n if (imports !== null && imports.size > 0) {\n const resolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports,\n }\n );\n\n if (resolvedImports.length !== 0) {\n yield [\n 'processImports',\n this.entrypoint,\n {\n resolved: resolvedImports,\n },\n ];\n }\n }\n\n return {\n code: preparedCode,\n metadata,\n };\n}\n\n/**\n * Prepares the code for evaluation. This includes removing dead and potentially unsafe code.\n * Emits resolveImports and processImports events.\n */\nexport function transform(this: ITransformAction) {\n return internalTransform.call(this, prepareCode);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transform.js","names":["buildOptions","getTransformMetadata","getPluginKey","EMPTY_FILE","hasKeyInList","plugin","list","pluginKey","some","i","includes","runPreevalStage","babel","evalConfig","pluginOptions","code","originalAst","eventEmitter","preShakePlugins","plugins","filter","highPriorityPlugins","require","resolve","transformConfig","envName","result","transformFromAstSync","ast","program","Error","prepareCode","services","item","log","only","loadedAndParsed","evaluator","options","preevalStageResult","perf","transformMetadata","metadata","length","name","extend","evaluatorConfig","onlyExports","features","transformedCode","imports","internalTransform","prepareFn","entrypoint","preparedCode","size","resolvedImports","getNext","resolved","transform","call"],"sources":["../../../src/transform/generators/transform.ts"],"sourcesContent":["import type {\n BabelFileResult,\n PluginItem,\n TransformOptions,\n} from '@babel/core';\nimport type { File } from '@babel/types';\n\nimport type { EvaluatorConfig, StrictOptions } from '@wyw-in-js/shared';\n\nimport type { Core } from '../../babel';\nimport { buildOptions } from '../../options/buildOptions';\nimport type { EventEmitter } from '../../utils/EventEmitter';\nimport type { WYWTransformMetadata } from '../../utils/TransformMetadata';\nimport { getTransformMetadata } from '../../utils/TransformMetadata';\nimport { getPluginKey } from '../../utils/getPluginKey';\nimport type { Entrypoint } from '../Entrypoint';\nimport type {\n ITransformAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\nconst EMPTY_FILE = '=== empty file ===';\n\nconst hasKeyInList = (plugin: PluginItem, list: string[]): boolean => {\n const pluginKey = getPluginKey(plugin);\n return pluginKey ? list.some((i) => pluginKey.includes(i)) : false;\n};\n\nfunction runPreevalStage(\n babel: Core,\n evalConfig: TransformOptions,\n pluginOptions: StrictOptions,\n code: string,\n originalAst: File,\n eventEmitter: EventEmitter\n): BabelFileResult {\n const preShakePlugins =\n evalConfig.plugins?.filter((i) =>\n hasKeyInList(i, pluginOptions.highPriorityPlugins)\n ) ?? [];\n\n const plugins = [\n ...preShakePlugins,\n [\n require.resolve('../../plugins/preeval'),\n { ...pluginOptions, eventEmitter },\n ],\n [require.resolve('../../plugins/dynamic-import')],\n ...(evalConfig.plugins ?? []).filter(\n (i) => !hasKeyInList(i, pluginOptions.highPriorityPlugins)\n ),\n ];\n\n const transformConfig = buildOptions({\n ...evalConfig,\n envName: 'wyw-in-js',\n plugins,\n });\n\n const result = babel.transformFromAstSync(originalAst, code, transformConfig);\n\n if (!result || !result.ast?.program) {\n throw new Error('Babel transform failed');\n }\n\n return result;\n}\n\ntype PrepareCodeFn = (\n services: Services,\n item: Entrypoint,\n originalAst: File\n) => [\n code: string,\n imports: Map<string, string[]> | null,\n metadata: WYWTransformMetadata | null,\n];\n\nexport const prepareCode = (\n services: Services,\n item: Entrypoint,\n originalAst: File\n): ReturnType<PrepareCodeFn> => {\n const { log, only, loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const { code, evalConfig, evaluator } = loadedAndParsed;\n const { options, babel, eventEmitter } = services;\n const { pluginOptions } = options;\n\n const preevalStageResult = eventEmitter.perf('transform:preeval', () =>\n runPreevalStage(\n babel,\n evalConfig,\n pluginOptions,\n code,\n originalAst,\n eventEmitter\n )\n );\n\n const transformMetadata = getTransformMetadata(preevalStageResult.metadata);\n\n if (only.length === 1 && only[0] === '__wywPreval' && !transformMetadata) {\n log('[evaluator:end] no metadata');\n return [preevalStageResult.code!, null, null];\n }\n\n log('[preeval] metadata %O', transformMetadata);\n log('[evaluator:start] using %s', evaluator.name);\n log.extend('source')('%s', preevalStageResult.code!);\n\n const evaluatorConfig: EvaluatorConfig = {\n onlyExports: only,\n highPriorityPlugins: pluginOptions.highPriorityPlugins,\n features: pluginOptions.features,\n };\n\n const [, transformedCode, imports] = eventEmitter.perf(\n 'transform:evaluator',\n () =>\n evaluator(\n evalConfig,\n preevalStageResult.ast!,\n preevalStageResult.code!,\n evaluatorConfig,\n babel\n )\n );\n\n log('[evaluator:end]');\n\n return [transformedCode, imports, transformMetadata ?? null];\n};\n\nexport function* internalTransform(\n this: ITransformAction,\n prepareFn: PrepareCodeFn\n): SyncScenarioForAction<ITransformAction> {\n const { only, loadedAndParsed, log } = this.entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n log('>> (%o)', only);\n\n const [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n loadedAndParsed.ast\n );\n\n if (loadedAndParsed.code === preparedCode) {\n log('<< (%o)\\n === no changes ===', only);\n } else {\n log('<< (%o)', only);\n log.extend('source')('%s', preparedCode || EMPTY_FILE);\n }\n\n if (preparedCode === '') {\n log('is skipped');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n if (imports !== null && imports.size > 0) {\n const resolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports,\n }\n );\n\n if (resolvedImports.length !== 0) {\n yield [\n 'processImports',\n this.entrypoint,\n {\n resolved: resolvedImports,\n },\n ];\n }\n }\n\n return {\n code: preparedCode,\n metadata,\n };\n}\n\n/**\n * Prepares the code for evaluation. This includes removing dead and potentially unsafe code.\n * Emits resolveImports and processImports events.\n */\nexport function transform(this: ITransformAction) {\n return internalTransform.call(this, prepareCode);\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cosmiconfigSync } from 'cosmiconfig';
|
|
2
|
-
import shaker from '../../shaker';
|
|
2
|
+
import { shaker } from '../../shaker';
|
|
3
3
|
const searchPlaces = [`.wyw-in-jsrc`, `.wyw-in-jsrc.json`, `.wyw-in-jsrc.yaml`, `.wyw-in-jsrc.yml`, `.wyw-in-jsrc.js`, `.wyw-in-jsrc.cjs`, `.config/wyw-in-jsrc`, `.config/wyw-in-jsrc.json`, `.config/wyw-in-jsrc.yaml`, `.config/wyw-in-jsrc.yml`, `.config/wyw-in-jsrc.js`, `.config/wyw-in-jsrc.cjs`, `wyw-in-js.config.js`, `wyw-in-js.config.cjs`];
|
|
4
4
|
const explorerSync = cosmiconfigSync('wyw-in-js', {
|
|
5
5
|
searchPlaces
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadWywOptions.js","names":["cosmiconfigSync","shaker","searchPlaces","explorerSync","cache","WeakMap","defaultOverrides","nodeModulesRegExp","loadWywOptions","overrides","has","get","configFile","ignore","rules","babelOptions","rest","result","undefined","load","search","defaultFeatures","dangerousCodeRemover","globalCache","happyDOM","softErrors","useBabelConfigs","options","displayName","evaluate","extensions","action","test","filename","code","highPriorityPlugins","config","features","set"],"sources":["../../../src/transform/helpers/loadWywOptions.ts"],"sourcesContent":["import { cosmiconfigSync } from 'cosmiconfig';\n\nimport type { FeatureFlags, StrictOptions } from '@wyw-in-js/shared';\n\nimport shaker from '../../shaker';\nimport type { PluginOptions } from '../../types';\n\nconst searchPlaces = [\n `.wyw-in-jsrc`,\n `.wyw-in-jsrc.json`,\n `.wyw-in-jsrc.yaml`,\n `.wyw-in-jsrc.yml`,\n `.wyw-in-jsrc.js`,\n `.wyw-in-jsrc.cjs`,\n `.config/wyw-in-jsrc`,\n `.config/wyw-in-jsrc.json`,\n `.config/wyw-in-jsrc.yaml`,\n `.config/wyw-in-jsrc.yml`,\n `.config/wyw-in-jsrc.js`,\n `.config/wyw-in-jsrc.cjs`,\n `wyw-in-js.config.js`,\n `wyw-in-js.config.cjs`,\n];\n\nconst explorerSync = cosmiconfigSync('wyw-in-js', { searchPlaces });\n\nexport type PartialOptions = Partial<Omit<PluginOptions, 'features'>> & {\n features?: Partial<FeatureFlags>;\n};\n\nconst cache = new WeakMap<Partial<PartialOptions>, StrictOptions>();\nconst defaultOverrides = {};\nconst nodeModulesRegExp = /[\\\\/]node_modules[\\\\/]/;\n\nexport function loadWywOptions(\n overrides: PartialOptions = defaultOverrides\n): StrictOptions {\n if (cache.has(overrides)) {\n return cache.get(overrides)!;\n }\n\n const { configFile, ignore, rules, babelOptions = {}, ...rest } = overrides;\n\n const result =\n // eslint-disable-next-line no-nested-ternary\n configFile === false\n ? undefined\n : configFile !== undefined\n ? explorerSync.load(configFile)\n : explorerSync.search();\n\n const defaultFeatures: FeatureFlags = {\n dangerousCodeRemover: true,\n globalCache: true,\n happyDOM: true,\n softErrors: false,\n useBabelConfigs: true,\n };\n\n const options: StrictOptions = {\n displayName: false,\n evaluate: true,\n extensions: ['.cjs', '.cts', '.js', '.jsx', '.mjs', '.mts', '.ts', '.tsx'],\n rules: rules ?? [\n {\n action: shaker,\n },\n {\n // The old `ignore` option is used as a default value for `ignore` rule.\n test: ignore ?? nodeModulesRegExp,\n action: 'ignore',\n },\n {\n // Do not ignore ES-modules\n test: (filename, code) => {\n if (!nodeModulesRegExp.test(filename)) {\n return false;\n }\n\n // If a file contains `export` or `import` keywords, we assume it's an ES-module\n return /(?:^|\\*\\/|;|})\\s*(?:export|import)[\\s{]/m.test(code);\n },\n action: shaker,\n },\n ],\n babelOptions,\n highPriorityPlugins: ['module-resolver'],\n ...(result ? result.config : {}),\n ...rest,\n features: {\n ...defaultFeatures,\n ...(result ? result.config.features : {}),\n ...rest.features,\n },\n };\n\n cache.set(overrides, options);\n\n return options;\n}\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,aAAa;AAI7C,
|
|
1
|
+
{"version":3,"file":"loadWywOptions.js","names":["cosmiconfigSync","shaker","searchPlaces","explorerSync","cache","WeakMap","defaultOverrides","nodeModulesRegExp","loadWywOptions","overrides","has","get","configFile","ignore","rules","babelOptions","rest","result","undefined","load","search","defaultFeatures","dangerousCodeRemover","globalCache","happyDOM","softErrors","useBabelConfigs","options","displayName","evaluate","extensions","action","test","filename","code","highPriorityPlugins","config","features","set"],"sources":["../../../src/transform/helpers/loadWywOptions.ts"],"sourcesContent":["import { cosmiconfigSync } from 'cosmiconfig';\n\nimport type { FeatureFlags, StrictOptions } from '@wyw-in-js/shared';\n\nimport { shaker } from '../../shaker';\nimport type { PluginOptions } from '../../types';\n\nconst searchPlaces = [\n `.wyw-in-jsrc`,\n `.wyw-in-jsrc.json`,\n `.wyw-in-jsrc.yaml`,\n `.wyw-in-jsrc.yml`,\n `.wyw-in-jsrc.js`,\n `.wyw-in-jsrc.cjs`,\n `.config/wyw-in-jsrc`,\n `.config/wyw-in-jsrc.json`,\n `.config/wyw-in-jsrc.yaml`,\n `.config/wyw-in-jsrc.yml`,\n `.config/wyw-in-jsrc.js`,\n `.config/wyw-in-jsrc.cjs`,\n `wyw-in-js.config.js`,\n `wyw-in-js.config.cjs`,\n];\n\nconst explorerSync = cosmiconfigSync('wyw-in-js', { searchPlaces });\n\nexport type PartialOptions = Partial<Omit<PluginOptions, 'features'>> & {\n features?: Partial<FeatureFlags>;\n};\n\nconst cache = new WeakMap<Partial<PartialOptions>, StrictOptions>();\nconst defaultOverrides = {};\nconst nodeModulesRegExp = /[\\\\/]node_modules[\\\\/]/;\n\nexport function loadWywOptions(\n overrides: PartialOptions = defaultOverrides\n): StrictOptions {\n if (cache.has(overrides)) {\n return cache.get(overrides)!;\n }\n\n const { configFile, ignore, rules, babelOptions = {}, ...rest } = overrides;\n\n const result =\n // eslint-disable-next-line no-nested-ternary\n configFile === false\n ? undefined\n : configFile !== undefined\n ? explorerSync.load(configFile)\n : explorerSync.search();\n\n const defaultFeatures: FeatureFlags = {\n dangerousCodeRemover: true,\n globalCache: true,\n happyDOM: true,\n softErrors: false,\n useBabelConfigs: true,\n };\n\n const options: StrictOptions = {\n displayName: false,\n evaluate: true,\n extensions: ['.cjs', '.cts', '.js', '.jsx', '.mjs', '.mts', '.ts', '.tsx'],\n rules: rules ?? [\n {\n action: shaker,\n },\n {\n // The old `ignore` option is used as a default value for `ignore` rule.\n test: ignore ?? nodeModulesRegExp,\n action: 'ignore',\n },\n {\n // Do not ignore ES-modules\n test: (filename, code) => {\n if (!nodeModulesRegExp.test(filename)) {\n return false;\n }\n\n // If a file contains `export` or `import` keywords, we assume it's an ES-module\n return /(?:^|\\*\\/|;|})\\s*(?:export|import)[\\s{]/m.test(code);\n },\n action: shaker,\n },\n ],\n babelOptions,\n highPriorityPlugins: ['module-resolver'],\n ...(result ? result.config : {}),\n ...rest,\n features: {\n ...defaultFeatures,\n ...(result ? result.config.features : {}),\n ...rest.features,\n },\n };\n\n cache.set(overrides, options);\n\n return options;\n}\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,aAAa;AAI7C,SAASC,MAAM,QAAQ,cAAc;AAGrC,MAAMC,YAAY,GAAG,CAClB,cAAa,EACb,mBAAkB,EAClB,mBAAkB,EAClB,kBAAiB,EACjB,iBAAgB,EAChB,kBAAiB,EACjB,qBAAoB,EACpB,0BAAyB,EACzB,0BAAyB,EACzB,yBAAwB,EACxB,wBAAuB,EACvB,yBAAwB,EACxB,qBAAoB,EACpB,sBAAqB,CACvB;AAED,MAAMC,YAAY,GAAGH,eAAe,CAAC,WAAW,EAAE;EAAEE;AAAa,CAAC,CAAC;AAMnE,MAAME,KAAK,GAAG,IAAIC,OAAO,CAAyC,CAAC;AACnE,MAAMC,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAMC,iBAAiB,GAAG,wBAAwB;AAElD,OAAO,SAASC,cAAcA,CAC5BC,SAAyB,GAAGH,gBAAgB,EAC7B;EACf,IAAIF,KAAK,CAACM,GAAG,CAACD,SAAS,CAAC,EAAE;IACxB,OAAOL,KAAK,CAACO,GAAG,CAACF,SAAS,CAAC;EAC7B;EAEA,MAAM;IAAEG,UAAU;IAAEC,MAAM;IAAEC,KAAK;IAAEC,YAAY,GAAG,CAAC,CAAC;IAAE,GAAGC;EAAK,CAAC,GAAGP,SAAS;EAE3E,MAAMQ,MAAM;EACV;EACAL,UAAU,KAAK,KAAK,GAChBM,SAAS,GACTN,UAAU,KAAKM,SAAS,GACxBf,YAAY,CAACgB,IAAI,CAACP,UAAU,CAAC,GAC7BT,YAAY,CAACiB,MAAM,CAAC,CAAC;EAE3B,MAAMC,eAA6B,GAAG;IACpCC,oBAAoB,EAAE,IAAI;IAC1BC,WAAW,EAAE,IAAI;IACjBC,QAAQ,EAAE,IAAI;IACdC,UAAU,EAAE,KAAK;IACjBC,eAAe,EAAE;EACnB,CAAC;EAED,MAAMC,OAAsB,GAAG;IAC7BC,WAAW,EAAE,KAAK;IAClBC,QAAQ,EAAE,IAAI;IACdC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;IAC1EhB,KAAK,EAAEA,KAAK,IAAI,CACd;MACEiB,MAAM,EAAE9B;IACV,CAAC,EACD;MACE;MACA+B,IAAI,EAAEnB,MAAM,IAAIN,iBAAiB;MACjCwB,MAAM,EAAE;IACV,CAAC,EACD;MACE;MACAC,IAAI,EAAEA,CAACC,QAAQ,EAAEC,IAAI,KAAK;QACxB,IAAI,CAAC3B,iBAAiB,CAACyB,IAAI,CAACC,QAAQ,CAAC,EAAE;UACrC,OAAO,KAAK;QACd;;QAEA;QACA,OAAO,0CAA0C,CAACD,IAAI,CAACE,IAAI,CAAC;MAC9D,CAAC;MACDH,MAAM,EAAE9B;IACV,CAAC,CACF;IACDc,YAAY;IACZoB,mBAAmB,EAAE,CAAC,iBAAiB,CAAC;IACxC,IAAIlB,MAAM,GAAGA,MAAM,CAACmB,MAAM,GAAG,CAAC,CAAC,CAAC;IAChC,GAAGpB,IAAI;IACPqB,QAAQ,EAAE;MACR,GAAGhB,eAAe;MAClB,IAAIJ,MAAM,GAAGA,MAAM,CAACmB,MAAM,CAACC,QAAQ,GAAG,CAAC,CAAC,CAAC;MACzC,GAAGrB,IAAI,CAACqB;IACV;EACF,CAAC;EAEDjC,KAAK,CAACkC,GAAG,CAAC7B,SAAS,EAAEkB,OAAO,CAAC;EAE7B,OAAOA,OAAO;AAChB"}
|
|
@@ -585,6 +585,13 @@ function addExport(path, exported, state) {
|
|
|
585
585
|
state.exports[exported] = path;
|
|
586
586
|
}
|
|
587
587
|
}
|
|
588
|
+
const saveRef = (state, exportName, memberExpression) => {
|
|
589
|
+
// Save all export.____ usages for later
|
|
590
|
+
if (!state.exportRefs.has(exportName)) {
|
|
591
|
+
state.exportRefs.set(exportName, []);
|
|
592
|
+
}
|
|
593
|
+
state.exportRefs.get(exportName).push(memberExpression);
|
|
594
|
+
};
|
|
588
595
|
function collectFromExports(path, state) {
|
|
589
596
|
if (!isExports(path)) return;
|
|
590
597
|
if (path.parentPath.isMemberExpression({
|
|
@@ -597,19 +604,12 @@ function collectFromExports(path, state) {
|
|
|
597
604
|
return;
|
|
598
605
|
}
|
|
599
606
|
const exportName = property.node.name;
|
|
600
|
-
const saveRef = () => {
|
|
601
|
-
// Save all export.____ usages for later
|
|
602
|
-
if (!state.exportRefs.has(exportName)) {
|
|
603
|
-
state.exportRefs.set(exportName, []);
|
|
604
|
-
}
|
|
605
|
-
state.exportRefs.get(exportName).push(memberExpression);
|
|
606
|
-
};
|
|
607
607
|
const assignmentExpression = memberExpression.parentPath;
|
|
608
608
|
if (!assignmentExpression.isAssignmentExpression({
|
|
609
609
|
left: memberExpression.node
|
|
610
610
|
})) {
|
|
611
611
|
// If it's not `exports.prop = …`. Just save it.
|
|
612
|
-
saveRef();
|
|
612
|
+
saveRef(state, exportName, memberExpression);
|
|
613
613
|
return;
|
|
614
614
|
}
|
|
615
615
|
const right = assignmentExpression.get('right');
|
|
@@ -622,7 +622,7 @@ function collectFromExports(path, state) {
|
|
|
622
622
|
state.isEsModule = true;
|
|
623
623
|
return;
|
|
624
624
|
}
|
|
625
|
-
saveRef();
|
|
625
|
+
saveRef(state, exportName, memberExpression);
|
|
626
626
|
// eslint-disable-next-line no-param-reassign
|
|
627
627
|
state.exports[property.node.name] = right;
|
|
628
628
|
return;
|
|
@@ -870,7 +870,8 @@ function collectFromAssignmentExpression(path, state) {
|
|
|
870
870
|
const left = path.get('left');
|
|
871
871
|
const right = path.get('right');
|
|
872
872
|
let exported;
|
|
873
|
-
|
|
873
|
+
const isExportRef = left.isMemberExpression() && isExports(left.get('object'));
|
|
874
|
+
if (isExportRef) {
|
|
874
875
|
const property = left.get('property');
|
|
875
876
|
if (!left.node.computed && property.isIdentifier()) {
|
|
876
877
|
exported = property.node.name;
|
|
@@ -900,6 +901,9 @@ function collectFromAssignmentExpression(path, state) {
|
|
|
900
901
|
// eslint-disable-next-line no-param-reassign
|
|
901
902
|
state.exports[exported] = right;
|
|
902
903
|
}
|
|
904
|
+
if (isExportRef) {
|
|
905
|
+
saveRef(state, exported, left);
|
|
906
|
+
}
|
|
903
907
|
path.skip();
|
|
904
908
|
return;
|
|
905
909
|
}
|