@wyw-in-js/transform 2.0.0-alpha.0 → 2.0.0-alpha.1
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/cache.js +7 -0
- package/esm/cache.js.map +1 -1
- package/esm/debug/fileReporter.js +35 -1
- package/esm/debug/fileReporter.js.map +1 -1
- package/esm/eval/broker.js +230 -89
- package/esm/eval/broker.js.map +1 -1
- package/esm/eval/protocol.js.map +1 -1
- package/esm/eval/runner.js +143 -24
- package/esm/eval/runner.js.map +1 -1
- package/esm/module.js +70 -43
- package/esm/module.js.map +1 -1
- package/esm/transform/Entrypoint.types.js.map +1 -1
- package/esm/transform/generators/processEntrypoint.js +35 -20
- package/esm/transform/generators/processEntrypoint.js.map +1 -1
- package/esm/transform/generators/resolveImports.js +48 -2
- package/esm/transform/generators/resolveImports.js.map +1 -1
- package/esm/transform/generators/resolveStaticOxcValues/cache.js +182 -0
- package/esm/transform/generators/resolveStaticOxcValues/cache.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/candidateResolver.js +146 -0
- package/esm/transform/generators/resolveStaticOxcValues/candidateResolver.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/dependencies.js +33 -0
- package/esm/transform/generators/resolveStaticOxcValues/dependencies.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/environment.js +29 -0
- package/esm/transform/generators/resolveStaticOxcValues/environment.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/exportResolver.js +351 -0
- package/esm/transform/generators/resolveStaticOxcValues/exportResolver.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/exportTargets.js +253 -0
- package/esm/transform/generators/resolveStaticOxcValues/exportTargets.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/objectAssign.js +310 -0
- package/esm/transform/generators/resolveStaticOxcValues/objectAssign.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.js +74 -0
- package/esm/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/opaqueRuntime.js +229 -0
- package/esm/transform/generators/resolveStaticOxcValues/opaqueRuntime.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorStaticExport.js +172 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorStaticExport.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorStaticModel.js +476 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorStaticModel.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorTarget.js +55 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorTarget.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/programAnalysis.js +123 -0
- package/esm/transform/generators/resolveStaticOxcValues/programAnalysis.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/prune.js +186 -0
- package/esm/transform/generators/resolveStaticOxcValues/prune.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js +183 -0
- package/esm/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/staticExpression.js +298 -0
- package/esm/transform/generators/resolveStaticOxcValues/staticExpression.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.js +298 -0
- package/esm/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/types.js +3 -0
- package/esm/transform/generators/resolveStaticOxcValues/types.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.js +59 -0
- package/esm/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues.js +1 -2910
- package/esm/transform/generators/resolveStaticOxcValues.js.map +1 -1
- package/esm/transform/generators/transform.js +57 -45
- package/esm/transform/generators/transform.js.map +1 -1
- package/esm/transform/helpers/loadWywOptions.js +33 -4
- package/esm/transform/helpers/loadWywOptions.js.map +1 -1
- package/esm/transform.js +3 -1
- package/esm/transform.js.map +1 -1
- package/esm/utils/EventEmitter.js +42 -9
- package/esm/utils/EventEmitter.js.map +1 -1
- package/esm/utils/applyOxcProcessors/applyOxcProcessors.js +160 -0
- package/esm/utils/applyOxcProcessors/applyOxcProcessors.js.map +1 -0
- package/esm/utils/applyOxcProcessors/cleanupBindings.js +157 -0
- package/esm/utils/applyOxcProcessors/cleanupBindings.js.map +1 -0
- package/esm/utils/applyOxcProcessors/cleanupRemovals.js +431 -0
- package/esm/utils/applyOxcProcessors/cleanupRemovals.js.map +1 -0
- package/esm/utils/applyOxcProcessors/displayName.js +93 -0
- package/esm/utils/applyOxcProcessors/displayName.js.map +1 -0
- package/esm/utils/applyOxcProcessors/expressionValues.js +152 -0
- package/esm/utils/applyOxcProcessors/expressionValues.js.map +1 -0
- package/esm/utils/applyOxcProcessors/processorFactory.js +62 -0
- package/esm/utils/applyOxcProcessors/processorFactory.js.map +1 -0
- package/esm/utils/applyOxcProcessors/processorUsages.js +143 -0
- package/esm/utils/applyOxcProcessors/processorUsages.js.map +1 -0
- package/esm/utils/applyOxcProcessors/sameFileStaticValues.js +207 -0
- package/esm/utils/applyOxcProcessors/sameFileStaticValues.js.map +1 -0
- package/esm/utils/applyOxcProcessors/shared.js +29 -0
- package/esm/utils/applyOxcProcessors/shared.js.map +1 -0
- package/esm/utils/applyOxcProcessors/types.js +2 -0
- package/esm/utils/applyOxcProcessors/types.js.map +1 -0
- package/esm/utils/applyOxcProcessors.js +1 -1216
- package/esm/utils/applyOxcProcessors.js.map +1 -1
- package/esm/utils/collectOxcRuntime/normalizeRuntimeCode.js +157 -0
- package/esm/utils/collectOxcRuntime/normalizeRuntimeCode.js.map +1 -0
- package/esm/utils/collectOxcRuntime/sourceMap.js +36 -0
- package/esm/utils/collectOxcRuntime/sourceMap.js.map +1 -0
- package/esm/utils/collectOxcRuntime/types.js +2 -0
- package/esm/utils/collectOxcRuntime/types.js.map +1 -0
- package/esm/utils/collectOxcRuntime.js +5 -193
- package/esm/utils/collectOxcRuntime.js.map +1 -1
- package/esm/utils/collectOxcTemplateDependencies/expressionExtraction.js +496 -0
- package/esm/utils/collectOxcTemplateDependencies/expressionExtraction.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/expressionReplacements.js +113 -0
- package/esm/utils/collectOxcTemplateDependencies/expressionReplacements.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/scopeAnalysis.js +387 -0
- package/esm/utils/collectOxcTemplateDependencies/scopeAnalysis.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/staticBindings.js +17 -0
- package/esm/utils/collectOxcTemplateDependencies/staticBindings.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/staticEvaluator.js +540 -0
- package/esm/utils/collectOxcTemplateDependencies/staticEvaluator.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/types.js +2 -0
- package/esm/utils/collectOxcTemplateDependencies/types.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies.js +3 -1397
- package/esm/utils/collectOxcTemplateDependencies.js.map +1 -1
- package/esm/utils/nativeResolver.js +93 -0
- package/esm/utils/nativeResolver.js.map +1 -0
- package/esm/utils/oxc/ast.js +28 -0
- package/esm/utils/oxc/ast.js.map +1 -0
- package/esm/utils/oxc/parse.js +3 -0
- package/esm/utils/oxc/parse.js.map +1 -0
- package/esm/utils/oxc/replacements.js +14 -0
- package/esm/utils/oxc/replacements.js.map +1 -0
- package/esm/utils/oxc/sourceLocations.js +59 -0
- package/esm/utils/oxc/sourceLocations.js.map +1 -0
- package/esm/utils/oxcPreevalStage/evalStrategy.js +3 -0
- package/esm/utils/oxcPreevalStage/evalStrategy.js.map +1 -0
- package/esm/utils/oxcPreevalStage/prepareCode.js +21 -0
- package/esm/utils/oxcPreevalStage/prepareCode.js.map +1 -0
- package/esm/utils/oxcPreevalStage/prevalExport.js +23 -0
- package/esm/utils/oxcPreevalStage/prevalExport.js.map +1 -0
- package/esm/utils/oxcPreevalStage/processors.js +17 -0
- package/esm/utils/oxcPreevalStage/processors.js.map +1 -0
- package/esm/utils/oxcPreevalStage/staticOverlay.js +18 -0
- package/esm/utils/oxcPreevalStage/staticOverlay.js.map +1 -0
- package/esm/utils/oxcPreevalStage/types.js +2 -0
- package/esm/utils/oxcPreevalStage/types.js.map +1 -0
- package/esm/utils/oxcPreevalStage.js +17 -73
- package/esm/utils/oxcPreevalStage.js.map +1 -1
- package/esm/utils/oxcPreevalTransforms.js +12 -1
- package/esm/utils/oxcPreevalTransforms.js.map +1 -1
- package/esm/utils/processorStaticSemantics.js +157 -0
- package/esm/utils/processorStaticSemantics.js.map +1 -0
- package/esm/utils/resolveWithConditions.js +3 -3
- package/esm/utils/resolveWithConditions.js.map +1 -1
- package/package.json +4 -3
- package/types/cache.js +8 -0
- package/types/debug/fileReporter.js +46 -1
- package/types/eval/broker.d.ts +6 -2
- package/types/eval/broker.js +244 -95
- package/types/eval/protocol.d.ts +15 -1
- package/types/module.d.ts +4 -1
- package/types/module.js +97 -48
- package/types/transform/Entrypoint.types.d.ts +3 -0
- package/types/transform/generators/resolveImports.d.ts +3 -1
- package/types/transform/generators/resolveImports.js +49 -2
- package/types/transform/generators/resolveStaticOxcValues/cache.d.ts +25 -0
- package/types/transform/generators/resolveStaticOxcValues/cache.js +182 -0
- package/types/transform/generators/resolveStaticOxcValues/candidateResolver.d.ts +5 -0
- package/types/transform/generators/resolveStaticOxcValues/candidateResolver.js +149 -0
- package/types/transform/generators/resolveStaticOxcValues/dependencies.d.ts +6 -0
- package/types/transform/generators/resolveStaticOxcValues/dependencies.js +37 -0
- package/types/transform/generators/resolveStaticOxcValues/environment.d.ts +12 -0
- package/types/transform/generators/resolveStaticOxcValues/environment.js +32 -0
- package/types/transform/generators/resolveStaticOxcValues/exportResolver.d.ts +4 -0
- package/types/transform/generators/resolveStaticOxcValues/exportResolver.js +358 -0
- package/types/transform/generators/resolveStaticOxcValues/exportTargets.d.ts +20 -0
- package/types/transform/generators/resolveStaticOxcValues/exportTargets.js +285 -0
- package/types/transform/generators/resolveStaticOxcValues/objectAssign.d.ts +41 -0
- package/types/transform/generators/resolveStaticOxcValues/objectAssign.js +352 -0
- package/types/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.d.ts +6 -0
- package/types/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.js +88 -0
- package/types/transform/generators/resolveStaticOxcValues/opaqueRuntime.d.ts +13 -0
- package/types/transform/generators/resolveStaticOxcValues/opaqueRuntime.js +263 -0
- package/types/transform/generators/resolveStaticOxcValues/processorStaticExport.d.ts +4 -0
- package/types/transform/generators/resolveStaticOxcValues/processorStaticExport.js +191 -0
- package/types/transform/generators/resolveStaticOxcValues/processorStaticModel.d.ts +40 -0
- package/types/transform/generators/resolveStaticOxcValues/processorStaticModel.js +516 -0
- package/types/transform/generators/resolveStaticOxcValues/processorTarget.d.ts +5 -0
- package/types/transform/generators/resolveStaticOxcValues/processorTarget.js +62 -0
- package/types/transform/generators/resolveStaticOxcValues/programAnalysis.d.ts +11 -0
- package/types/transform/generators/resolveStaticOxcValues/programAnalysis.js +133 -0
- package/types/transform/generators/resolveStaticOxcValues/prune.d.ts +15 -0
- package/types/transform/generators/resolveStaticOxcValues/prune.js +220 -0
- package/types/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.d.ts +2 -0
- package/types/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js +197 -0
- package/types/transform/generators/resolveStaticOxcValues/staticExpression.d.ts +25 -0
- package/types/transform/generators/resolveStaticOxcValues/staticExpression.js +391 -0
- package/types/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.d.ts +14 -0
- package/types/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.js +304 -0
- package/types/transform/generators/resolveStaticOxcValues/types.d.ts +99 -0
- package/types/transform/generators/resolveStaticOxcValues/types.js +2 -0
- package/types/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.d.ts +7 -0
- package/types/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.js +64 -0
- package/types/transform/generators/resolveStaticOxcValues.d.ts +1 -2
- package/types/transform/generators/resolveStaticOxcValues.js +1 -3235
- package/types/transform/generators/transform.js +63 -49
- package/types/transform/helpers/loadWywOptions.js +23 -3
- package/types/transform.js +3 -1
- package/types/utils/EventEmitter.d.ts +16 -1
- package/types/utils/EventEmitter.js +44 -9
- package/types/utils/applyOxcProcessors/applyOxcProcessors.d.ts +8 -0
- package/types/utils/applyOxcProcessors/applyOxcProcessors.js +167 -0
- package/types/utils/applyOxcProcessors/cleanupBindings.d.ts +12 -0
- package/types/utils/applyOxcProcessors/cleanupBindings.js +189 -0
- package/types/utils/applyOxcProcessors/cleanupRemovals.d.ts +16 -0
- package/types/utils/applyOxcProcessors/cleanupRemovals.js +482 -0
- package/types/utils/applyOxcProcessors/displayName.d.ts +9 -0
- package/types/utils/applyOxcProcessors/displayName.js +113 -0
- package/types/utils/applyOxcProcessors/expressionValues.d.ts +11 -0
- package/types/utils/applyOxcProcessors/expressionValues.js +170 -0
- package/types/utils/applyOxcProcessors/processorFactory.d.ts +7 -0
- package/types/utils/applyOxcProcessors/processorFactory.js +70 -0
- package/types/utils/applyOxcProcessors/processorUsages.d.ts +16 -0
- package/types/utils/applyOxcProcessors/processorUsages.js +163 -0
- package/types/utils/applyOxcProcessors/sameFileStaticValues.d.ts +23 -0
- package/types/utils/applyOxcProcessors/sameFileStaticValues.js +211 -0
- package/types/utils/applyOxcProcessors/shared.d.ts +10 -0
- package/types/utils/applyOxcProcessors/shared.js +37 -0
- package/types/utils/applyOxcProcessors/types.d.ts +88 -0
- package/types/utils/applyOxcProcessors/types.js +1 -0
- package/types/utils/applyOxcProcessors.d.ts +1 -16
- package/types/utils/applyOxcProcessors.js +1 -1391
- package/types/utils/collectOxcRuntime/normalizeRuntimeCode.d.ts +1 -0
- package/types/utils/collectOxcRuntime/normalizeRuntimeCode.js +185 -0
- package/types/utils/collectOxcRuntime/sourceMap.d.ts +2 -0
- package/types/utils/collectOxcRuntime/sourceMap.js +37 -0
- package/types/utils/collectOxcRuntime/types.d.ts +16 -0
- package/types/utils/collectOxcRuntime/types.js +1 -0
- package/types/utils/collectOxcRuntime.d.ts +2 -12
- package/types/utils/collectOxcRuntime.js +5 -224
- package/types/utils/collectOxcTemplateDependencies/expressionExtraction.d.ts +6 -0
- package/types/utils/collectOxcTemplateDependencies/expressionExtraction.js +550 -0
- package/types/utils/collectOxcTemplateDependencies/expressionReplacements.d.ts +11 -0
- package/types/utils/collectOxcTemplateDependencies/expressionReplacements.js +131 -0
- package/types/utils/collectOxcTemplateDependencies/scopeAnalysis.d.ts +20 -0
- package/types/utils/collectOxcTemplateDependencies/scopeAnalysis.js +434 -0
- package/types/utils/collectOxcTemplateDependencies/staticBindings.d.ts +7 -0
- package/types/utils/collectOxcTemplateDependencies/staticBindings.js +13 -0
- package/types/utils/collectOxcTemplateDependencies/staticEvaluator.d.ts +13 -0
- package/types/utils/collectOxcTemplateDependencies/staticEvaluator.js +626 -0
- package/types/utils/collectOxcTemplateDependencies/types.d.ts +116 -0
- package/types/utils/collectOxcTemplateDependencies/types.js +1 -0
- package/types/utils/collectOxcTemplateDependencies.d.ts +4 -38
- package/types/utils/collectOxcTemplateDependencies.js +3 -1580
- package/types/utils/nativeResolver.d.ts +13 -0
- package/types/utils/nativeResolver.js +91 -0
- package/types/utils/oxc/ast.d.ts +4 -0
- package/types/utils/oxc/ast.js +37 -0
- package/types/utils/oxc/parse.d.ts +3 -0
- package/types/utils/oxc/parse.js +2 -0
- package/types/utils/oxc/replacements.d.ts +12 -0
- package/types/utils/oxc/replacements.js +18 -0
- package/types/utils/oxc/sourceLocations.d.ts +5 -0
- package/types/utils/oxc/sourceLocations.js +63 -0
- package/types/utils/oxcPreevalStage/evalStrategy.d.ts +3 -0
- package/types/utils/oxcPreevalStage/evalStrategy.js +2 -0
- package/types/utils/oxcPreevalStage/prepareCode.d.ts +3 -0
- package/types/utils/oxcPreevalStage/prepareCode.js +20 -0
- package/types/utils/oxcPreevalStage/prevalExport.d.ts +1 -0
- package/types/utils/oxcPreevalStage/prevalExport.js +22 -0
- package/types/utils/oxcPreevalStage/processors.d.ts +10 -0
- package/types/utils/oxcPreevalStage/processors.js +16 -0
- package/types/utils/oxcPreevalStage/staticOverlay.d.ts +3 -0
- package/types/utils/oxcPreevalStage/staticOverlay.js +23 -0
- package/types/utils/oxcPreevalStage/types.d.ts +22 -0
- package/types/utils/oxcPreevalStage/types.js +1 -0
- package/types/utils/oxcPreevalStage.d.ts +2 -18
- package/types/utils/oxcPreevalStage.js +17 -79
- package/types/utils/oxcPreevalTransforms.js +14 -1
- package/types/utils/processorStaticSemantics.d.ts +13 -0
- package/types/utils/processorStaticSemantics.js +191 -0
- package/types/utils/resolveWithConditions.js +3 -3
- package/esm/eval/resolverStrategy.js +0 -51
- package/esm/eval/resolverStrategy.js.map +0 -1
- package/types/eval/resolverStrategy.d.ts +0 -13
- package/types/eval/resolverStrategy.js +0 -46
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */
|
|
2
|
+
import { collectLocalConstExpressions } from './programAnalysis';
|
|
3
|
+
import { collectImportBindings, moduleExportName, unwrapExpression, } from './staticExpression';
|
|
4
|
+
export const getExportSpecifierNames = (specifier) => ({
|
|
5
|
+
exported: moduleExportName(specifier.exported),
|
|
6
|
+
local: moduleExportName(specifier.local),
|
|
7
|
+
});
|
|
8
|
+
export const findExportTarget = (program, exportedName) => {
|
|
9
|
+
const imports = collectImportBindings(program);
|
|
10
|
+
const locals = collectLocalConstExpressions(program);
|
|
11
|
+
for (const statement of program.body) {
|
|
12
|
+
if (statement.type === 'ExportNamedDeclaration') {
|
|
13
|
+
if (statement.source) {
|
|
14
|
+
for (const specifier of statement.specifiers) {
|
|
15
|
+
if (specifier.type !== 'ExportSpecifier') {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const names = getExportSpecifierNames(specifier);
|
|
19
|
+
if (names.exported === exportedName) {
|
|
20
|
+
return {
|
|
21
|
+
imported: names.local,
|
|
22
|
+
kind: 'import',
|
|
23
|
+
source: statement.source.value,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (statement.declaration?.type === 'VariableDeclaration') {
|
|
30
|
+
for (const declarator of statement.declaration.declarations) {
|
|
31
|
+
if (declarator.id.type === 'Identifier' &&
|
|
32
|
+
declarator.id.name === exportedName &&
|
|
33
|
+
declarator.init) {
|
|
34
|
+
return {
|
|
35
|
+
expression: declarator.init,
|
|
36
|
+
kind: 'expression',
|
|
37
|
+
localName: declarator.id.name,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
for (const specifier of statement.specifiers) {
|
|
44
|
+
if (specifier.type !== 'ExportSpecifier') {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const names = getExportSpecifierNames(specifier);
|
|
48
|
+
if (names.exported !== exportedName) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const importBinding = imports.get(names.local);
|
|
52
|
+
if (importBinding) {
|
|
53
|
+
return {
|
|
54
|
+
imported: importBinding.imported,
|
|
55
|
+
kind: 'import',
|
|
56
|
+
source: importBinding.source,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const local = locals.get(names.local);
|
|
60
|
+
if (local) {
|
|
61
|
+
return {
|
|
62
|
+
expression: local,
|
|
63
|
+
kind: 'expression',
|
|
64
|
+
localName: names.local,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (exportedName === 'default' &&
|
|
70
|
+
statement.type === 'ExportDefaultDeclaration') {
|
|
71
|
+
const { declaration } = statement;
|
|
72
|
+
if (declaration.type === 'Identifier') {
|
|
73
|
+
const importBinding = imports.get(declaration.name);
|
|
74
|
+
if (importBinding) {
|
|
75
|
+
return {
|
|
76
|
+
imported: importBinding.imported,
|
|
77
|
+
kind: 'import',
|
|
78
|
+
source: importBinding.source,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const local = locals.get(declaration.name);
|
|
82
|
+
if (local) {
|
|
83
|
+
return {
|
|
84
|
+
expression: local,
|
|
85
|
+
kind: 'expression',
|
|
86
|
+
localName: declaration.name,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
expression: declaration,
|
|
93
|
+
kind: 'expression',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
};
|
|
99
|
+
export const exportedLocalName = (program, exportedName) => {
|
|
100
|
+
for (const statement of program.body) {
|
|
101
|
+
if (statement.type === 'ExportNamedDeclaration') {
|
|
102
|
+
if (statement.source || statement.declaration) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
for (const specifier of statement.specifiers) {
|
|
106
|
+
if (specifier.type !== 'ExportSpecifier') {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const names = getExportSpecifierNames(specifier);
|
|
110
|
+
if (names.exported === exportedName) {
|
|
111
|
+
return names.local;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (exportedName === 'default' &&
|
|
116
|
+
statement.type === 'ExportDefaultDeclaration' &&
|
|
117
|
+
statement.declaration.type === 'Identifier') {
|
|
118
|
+
return statement.declaration.name;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
};
|
|
123
|
+
export const isIdentifierNamed = (node, name) => node.type === 'Identifier' && node.name === name;
|
|
124
|
+
export const enumLiteralValue = (node) => {
|
|
125
|
+
const unwrapped = unwrapExpression(node);
|
|
126
|
+
if (unwrapped.type === 'Literal') {
|
|
127
|
+
const { value } = unwrapped;
|
|
128
|
+
return typeof value === 'string' || typeof value === 'number'
|
|
129
|
+
? value
|
|
130
|
+
: null;
|
|
131
|
+
}
|
|
132
|
+
if (unwrapped.type === 'UnaryExpression') {
|
|
133
|
+
const argument = unwrapExpression(unwrapped.argument);
|
|
134
|
+
if ((unwrapped.operator === '-' || unwrapped.operator === '+') &&
|
|
135
|
+
argument.type === 'Literal' &&
|
|
136
|
+
typeof argument.value === 'number') {
|
|
137
|
+
return unwrapped.operator === '-' ? -argument.value : argument.value;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
};
|
|
142
|
+
export const enumMemberKey = (node, computed) => {
|
|
143
|
+
const unwrapped = unwrapExpression(node);
|
|
144
|
+
if (!computed && unwrapped.type === 'Identifier') {
|
|
145
|
+
return unwrapped.name;
|
|
146
|
+
}
|
|
147
|
+
const value = enumLiteralValue(unwrapped);
|
|
148
|
+
return typeof value === 'string' || typeof value === 'number'
|
|
149
|
+
? String(value)
|
|
150
|
+
: null;
|
|
151
|
+
};
|
|
152
|
+
export const enumSimpleAssignment = (node, enumParamName) => {
|
|
153
|
+
const unwrapped = unwrapExpression(node);
|
|
154
|
+
if (unwrapped.type !== 'AssignmentExpression' || unwrapped.operator !== '=') {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const left = unwrapExpression(unwrapped.left);
|
|
158
|
+
if (left.type !== 'MemberExpression' ||
|
|
159
|
+
!isIdentifierNamed(unwrapExpression(left.object), enumParamName)) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
const key = enumMemberKey(left.property, left.computed);
|
|
163
|
+
const value = enumLiteralValue(unwrapped.right);
|
|
164
|
+
return key !== null && value !== null ? { key, value } : null;
|
|
165
|
+
};
|
|
166
|
+
export const collectEnumIifeAssignments = (call, localName) => {
|
|
167
|
+
const unwrapped = unwrapExpression(call.type === 'ExpressionStatement' ? call.expression : call);
|
|
168
|
+
if (unwrapped.type !== 'CallExpression' || unwrapped.arguments.length !== 1) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const callee = unwrapExpression(unwrapped.callee);
|
|
172
|
+
if (callee.type !== 'FunctionExpression' ||
|
|
173
|
+
callee.async ||
|
|
174
|
+
!callee.body ||
|
|
175
|
+
callee.params.length !== 1 ||
|
|
176
|
+
callee.params[0]?.type !== 'Identifier') {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
const enumParamName = callee.params[0].name;
|
|
180
|
+
const argument = unwrapExpression(unwrapped.arguments[0]);
|
|
181
|
+
if (argument.type !== 'LogicalExpression' || argument.operator !== '||') {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
const fallback = unwrapExpression(argument.right);
|
|
185
|
+
if (!isIdentifierNamed(unwrapExpression(argument.left), localName) ||
|
|
186
|
+
fallback.type !== 'AssignmentExpression' ||
|
|
187
|
+
fallback.operator !== '=' ||
|
|
188
|
+
!isIdentifierNamed(unwrapExpression(fallback.left), localName) ||
|
|
189
|
+
unwrapExpression(fallback.right).type !== 'ObjectExpression') {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
const result = {};
|
|
193
|
+
for (const statement of callee.body.body) {
|
|
194
|
+
if (statement.type !== 'ExpressionStatement') {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
const expression = unwrapExpression(statement.expression);
|
|
198
|
+
if (expression.type !== 'AssignmentExpression' ||
|
|
199
|
+
expression.operator !== '=') {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
const left = unwrapExpression(expression.left);
|
|
203
|
+
if (left.type === 'MemberExpression' &&
|
|
204
|
+
isIdentifierNamed(unwrapExpression(left.object), enumParamName)) {
|
|
205
|
+
const numericEnumAssignment = enumSimpleAssignment(left.property, enumParamName);
|
|
206
|
+
const reverseValue = enumLiteralValue(expression.right);
|
|
207
|
+
if (numericEnumAssignment &&
|
|
208
|
+
typeof numericEnumAssignment.value === 'number' &&
|
|
209
|
+
typeof reverseValue === 'string') {
|
|
210
|
+
result[numericEnumAssignment.key] = numericEnumAssignment.value;
|
|
211
|
+
result[String(numericEnumAssignment.value)] = reverseValue;
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const assignment = enumSimpleAssignment(expression, enumParamName);
|
|
216
|
+
if (!assignment) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
result[assignment.key] = assignment.value;
|
|
220
|
+
}
|
|
221
|
+
return Object.keys(result).length > 0 ? result : null;
|
|
222
|
+
};
|
|
223
|
+
export const enumIifeLocalName = (statement) => {
|
|
224
|
+
if (statement.type !== 'ExpressionStatement') {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
const expression = unwrapExpression(statement.expression);
|
|
228
|
+
if (expression.type !== 'CallExpression' ||
|
|
229
|
+
expression.arguments.length !== 1) {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
const argument = unwrapExpression(expression.arguments[0]);
|
|
233
|
+
if (argument.type !== 'LogicalExpression' || argument.operator !== '||') {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
const fallback = unwrapExpression(argument.right);
|
|
237
|
+
if (argument.left.type !== 'Identifier' ||
|
|
238
|
+
fallback.type !== 'AssignmentExpression' ||
|
|
239
|
+
fallback.left.type !== 'Identifier') {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
return argument.left.name === fallback.left.name ? argument.left.name : null;
|
|
243
|
+
};
|
|
244
|
+
export const isEnumVarDeclaration = (statement) => statement.type === 'VariableDeclaration' &&
|
|
245
|
+
statement.kind === 'var' &&
|
|
246
|
+
statement.declarations.length > 0 &&
|
|
247
|
+
statement.declarations.every((declarator) => declarator.id.type === 'Identifier' && declarator.init === null);
|
|
248
|
+
export const isTypeScriptEnumOnlyModule = (program) => program.body.every((statement) => {
|
|
249
|
+
if (isEnumVarDeclaration(statement)) {
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
const localName = enumIifeLocalName(statement);
|
|
253
|
+
if (localName) {
|
|
254
|
+
return collectEnumIifeAssignments(statement, localName) !== null;
|
|
255
|
+
}
|
|
256
|
+
if (statement.type === 'ExportDefaultDeclaration') {
|
|
257
|
+
return statement.declaration.type === 'Identifier';
|
|
258
|
+
}
|
|
259
|
+
return (statement.type === 'ExportNamedDeclaration' &&
|
|
260
|
+
!statement.source &&
|
|
261
|
+
!statement.declaration &&
|
|
262
|
+
statement.specifiers.every((specifier) => specifier.type === 'ExportSpecifier'));
|
|
263
|
+
});
|
|
264
|
+
export const typeScriptEnumStaticExportValue = (program, exportedName) => {
|
|
265
|
+
if (!isTypeScriptEnumOnlyModule(program)) {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
const localName = exportedLocalName(program, exportedName);
|
|
269
|
+
if (!localName) {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
const hasDeclaration = program.body.some((statement) => isEnumVarDeclaration(statement) &&
|
|
273
|
+
statement.declarations.some((declarator) => declarator.id.type === 'Identifier' &&
|
|
274
|
+
declarator.id.name === localName));
|
|
275
|
+
if (!hasDeclaration) {
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
for (const statement of program.body) {
|
|
279
|
+
const enumValue = collectEnumIifeAssignments(statement, localName);
|
|
280
|
+
if (enumValue) {
|
|
281
|
+
return enumValue;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return null;
|
|
285
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Expression, Node, Program } from 'oxc-parser';
|
|
2
|
+
import type { ITransformAction, SyncScenarioFor } from '../../types';
|
|
3
|
+
import type { ExportTarget, StaticExportResolverContext, StaticExportResult } from './types';
|
|
4
|
+
export declare const isObjectAssignCallee: (program: Program, expr: Node) => boolean;
|
|
5
|
+
export declare const isSafeObjectAssignAliasExpression: (program: Program, expr: Node, seen?: Set<string>) => boolean;
|
|
6
|
+
export declare const objectAssignTargetExpression: (program: Program, expr: Node) => Expression | null;
|
|
7
|
+
export declare const objectAssignAliasExpressions: (program: Program, expr: Node) => Expression[] | null;
|
|
8
|
+
export declare const isFunctionBoundaryNode: (node: Node) => boolean;
|
|
9
|
+
export declare const callHasArgumentRootName: (expr: Node, targetName: string) => boolean;
|
|
10
|
+
export declare const isSafeObjectAssignAliasAugmentation: (program: Program, expr: Node, targetName: string) => boolean;
|
|
11
|
+
export declare const hasOnlySafeObjectAssignCallArgumentUses: (program: Program, targetName: string) => boolean;
|
|
12
|
+
export declare const objectAssignAugmentationAliasExpressions: (program: Program, targetName: string) => Expression[] | null;
|
|
13
|
+
export declare const objectAssignAliasExpressionsForTarget: (program: Program, target: Extract<ExportTarget, {
|
|
14
|
+
kind: "expression";
|
|
15
|
+
}>) => Expression[] | null;
|
|
16
|
+
export declare const resolveObjectAssignProcessorExpression: (program: Program, expr: Expression) => Expression;
|
|
17
|
+
export type ObjectAssignAliasResolution = {
|
|
18
|
+
dependencies: string[];
|
|
19
|
+
sideEffectDependencies: string[];
|
|
20
|
+
values: Record<string, unknown>[];
|
|
21
|
+
};
|
|
22
|
+
export type ObjectAssignAliasPropertyResolution = {
|
|
23
|
+
dependencies: string[];
|
|
24
|
+
sideEffectDependencies: string[];
|
|
25
|
+
value: unknown;
|
|
26
|
+
};
|
|
27
|
+
export type ObjectAssignAliasPropertyEntry = {
|
|
28
|
+
key: string;
|
|
29
|
+
value: Expression;
|
|
30
|
+
};
|
|
31
|
+
export declare const mergeStaticObjectAssignAliases: (targetValue: unknown, aliasValues: Record<string, unknown>[]) => unknown | null;
|
|
32
|
+
export declare const objectAssignAliasObjectExpression: (program: Program, alias: Expression, seen?: Set<string>) => Expression | null;
|
|
33
|
+
export declare const objectAssignAliasPropertyEntries: (program: Program, alias: Expression) => ObjectAssignAliasPropertyEntry[] | null;
|
|
34
|
+
export declare function resolveObjectAssignAliasExpressionValue(action: ITransformAction, filename: string, code: string, program: Program, expression: Expression, ignoredMutableCallArgumentNames: Set<string>, stack: Set<string>, memo: Map<string, StaticExportResult | null>, resolvers: StaticExportResolverContext): SyncScenarioFor<ObjectAssignAliasPropertyResolution | null>;
|
|
35
|
+
export declare function resolveObjectAssignAliasPropertyValue(action: ITransformAction, filename: string, code: string, program: Program, expression: Expression, ignoredMutableCallArgumentNames: Set<string>, stack: Set<string>, memo: Map<string, StaticExportResult | null>, resolvers: StaticExportResolverContext): SyncScenarioFor<ObjectAssignAliasPropertyResolution | null>;
|
|
36
|
+
export declare function resolveObjectAssignAliasValue(action: ITransformAction, filename: string, code: string, program: Program, alias: Expression, ignoredMutableCallArgumentNames: Set<string>, stack: Set<string>, memo: Map<string, StaticExportResult | null>, resolvers: StaticExportResolverContext): SyncScenarioFor<{
|
|
37
|
+
dependencies: string[];
|
|
38
|
+
sideEffectDependencies: string[];
|
|
39
|
+
value: Record<string, unknown>;
|
|
40
|
+
} | null>;
|
|
41
|
+
export declare function resolveObjectAssignAliasValues(action: ITransformAction, filename: string, code: string, program: Program, aliases: Expression[], stack: Set<string>, memo: Map<string, StaticExportResult | null>, resolvers: StaticExportResolverContext): SyncScenarioFor<ObjectAssignAliasResolution | null>;
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */
|
|
2
|
+
import { evaluateOxcStaticExpressionAt } from '../../../utils/collectOxcTemplateDependencies';
|
|
3
|
+
import { getOxcNodeChildren } from '../../../utils/oxc/ast';
|
|
4
|
+
import { getStaticBindings } from './environment';
|
|
5
|
+
import { findExportTarget } from './exportTargets';
|
|
6
|
+
import { findTopLevelConstExpression, hasTopLevelBinding, objectPropertyKeyName, topLevelStatements, } from './programAnalysis';
|
|
7
|
+
import { isPlainObjectRecord, isStaticObjectAssignAliasValue, isStaticWYWMetaValue, } from './processorStaticModel';
|
|
8
|
+
import { bindStaticResolvedValue, isSafeStaticExpression, unwrapExpression, } from './staticExpression';
|
|
9
|
+
import { collectStaticExpressionDependencies, rootIdentifierName, staticMemberName, } from './staticExpressionDependencies';
|
|
10
|
+
export const isObjectAssignCallee = (program, expr) => {
|
|
11
|
+
const unwrapped = unwrapExpression(expr);
|
|
12
|
+
if (unwrapped.type !== 'MemberExpression' || unwrapped.computed) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const methodName = staticMemberName(unwrapped.property);
|
|
16
|
+
return (methodName === 'assign' &&
|
|
17
|
+
unwrapped.object.type === 'Identifier' &&
|
|
18
|
+
unwrapped.object.name === 'Object' &&
|
|
19
|
+
!hasTopLevelBinding(program, 'Object'));
|
|
20
|
+
};
|
|
21
|
+
export const isSafeObjectAssignAliasExpression = (program, expr, seen = new Set()) => {
|
|
22
|
+
const unwrapped = unwrapExpression(expr);
|
|
23
|
+
if (unwrapped.type === 'Identifier') {
|
|
24
|
+
if (seen.has(unwrapped.name)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const local = findTopLevelConstExpression(program, unwrapped.name);
|
|
28
|
+
if (!local) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
seen.add(unwrapped.name);
|
|
32
|
+
const result = isSafeObjectAssignAliasExpression(program, local, seen);
|
|
33
|
+
seen.delete(unwrapped.name);
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
if (unwrapped.type !== 'ObjectExpression') {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return unwrapped.properties.every((property) => {
|
|
40
|
+
if (property.type === 'SpreadElement') {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const propertyNode = property;
|
|
44
|
+
if (propertyNode.computed ||
|
|
45
|
+
propertyNode.method ||
|
|
46
|
+
!propertyNode.value ||
|
|
47
|
+
typeof propertyNode.value !== 'object') {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return isSafeStaticExpression(propertyNode.value);
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
export const objectAssignTargetExpression = (program, expr) => {
|
|
54
|
+
const unwrapped = unwrapExpression(expr);
|
|
55
|
+
if (unwrapped.type !== 'CallExpression' ||
|
|
56
|
+
!isObjectAssignCallee(program, unwrapped.callee) ||
|
|
57
|
+
unwrapped.arguments.length < 2) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const [target, ...aliases] = unwrapped.arguments;
|
|
61
|
+
if (!target || target.type === 'SpreadElement') {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
if (aliases.some((alias) => alias.type === 'SpreadElement' ||
|
|
65
|
+
!isSafeObjectAssignAliasExpression(program, alias))) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return target;
|
|
69
|
+
};
|
|
70
|
+
export const objectAssignAliasExpressions = (program, expr) => {
|
|
71
|
+
const unwrapped = unwrapExpression(expr);
|
|
72
|
+
if (unwrapped.type !== 'CallExpression' ||
|
|
73
|
+
!isObjectAssignCallee(program, unwrapped.callee) ||
|
|
74
|
+
unwrapped.arguments.length < 2) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const [, ...aliases] = unwrapped.arguments;
|
|
78
|
+
if (aliases.some((alias) => alias.type === 'SpreadElement' ||
|
|
79
|
+
!isSafeObjectAssignAliasExpression(program, alias))) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return aliases;
|
|
83
|
+
};
|
|
84
|
+
export const isFunctionBoundaryNode = (node) => node.type === 'ArrowFunctionExpression' ||
|
|
85
|
+
node.type === 'FunctionDeclaration' ||
|
|
86
|
+
node.type === 'FunctionExpression' ||
|
|
87
|
+
node.type === 'ClassDeclaration' ||
|
|
88
|
+
node.type === 'ClassExpression';
|
|
89
|
+
export const callHasArgumentRootName = (expr, targetName) => {
|
|
90
|
+
const unwrapped = unwrapExpression(expr);
|
|
91
|
+
return (unwrapped.type === 'CallExpression' &&
|
|
92
|
+
unwrapped.arguments.some((argument) => {
|
|
93
|
+
const argumentNode = argument.type === 'SpreadElement' ? argument.argument : argument;
|
|
94
|
+
return rootIdentifierName(argumentNode) === targetName;
|
|
95
|
+
}));
|
|
96
|
+
};
|
|
97
|
+
export const isSafeObjectAssignAliasAugmentation = (program, expr, targetName) => {
|
|
98
|
+
const unwrapped = unwrapExpression(expr);
|
|
99
|
+
if (unwrapped.type !== 'CallExpression' ||
|
|
100
|
+
!isObjectAssignCallee(program, unwrapped.callee) ||
|
|
101
|
+
unwrapped.arguments.length < 2) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
const [target, ...aliases] = unwrapped.arguments;
|
|
105
|
+
if (!target || target.type === 'SpreadElement') {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
const unwrappedTarget = unwrapExpression(target);
|
|
109
|
+
if (unwrappedTarget.type !== 'Identifier' ||
|
|
110
|
+
unwrappedTarget.name !== targetName) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
return aliases.every((alias) => alias.type !== 'SpreadElement' &&
|
|
114
|
+
isSafeObjectAssignAliasExpression(program, alias));
|
|
115
|
+
};
|
|
116
|
+
export const hasOnlySafeObjectAssignCallArgumentUses = (program, targetName) => {
|
|
117
|
+
let hasSafeUse = false;
|
|
118
|
+
let hasUnsafeUse = false;
|
|
119
|
+
const visit = (node) => {
|
|
120
|
+
if (hasUnsafeUse || isFunctionBoundaryNode(node)) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const unwrapped = unwrapExpression(node);
|
|
124
|
+
if (unwrapped.type === 'CallExpression') {
|
|
125
|
+
if (callHasArgumentRootName(unwrapped, targetName)) {
|
|
126
|
+
if (isSafeObjectAssignAliasAugmentation(program, unwrapped, targetName)) {
|
|
127
|
+
hasSafeUse = true;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
hasUnsafeUse = true;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
getOxcNodeChildren(node).forEach(visit);
|
|
136
|
+
};
|
|
137
|
+
topLevelStatements(program).forEach(visit);
|
|
138
|
+
return hasSafeUse && !hasUnsafeUse;
|
|
139
|
+
};
|
|
140
|
+
export const objectAssignAugmentationAliasExpressions = (program, targetName) => {
|
|
141
|
+
const aliases = [];
|
|
142
|
+
let hasUnsafeUse = false;
|
|
143
|
+
const visit = (node) => {
|
|
144
|
+
if (hasUnsafeUse || isFunctionBoundaryNode(node)) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const unwrapped = unwrapExpression(node);
|
|
148
|
+
if (unwrapped.type === 'CallExpression') {
|
|
149
|
+
if (callHasArgumentRootName(unwrapped, targetName)) {
|
|
150
|
+
if (isSafeObjectAssignAliasAugmentation(program, unwrapped, targetName)) {
|
|
151
|
+
const [, ...nextAliases] = unwrapped.arguments;
|
|
152
|
+
aliases.push(...nextAliases);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
hasUnsafeUse = true;
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
getOxcNodeChildren(node).forEach(visit);
|
|
161
|
+
};
|
|
162
|
+
topLevelStatements(program).forEach(visit);
|
|
163
|
+
return !hasUnsafeUse && aliases.length > 0 ? aliases : null;
|
|
164
|
+
};
|
|
165
|
+
export const objectAssignAliasExpressionsForTarget = (program, target) => {
|
|
166
|
+
const aliases = [
|
|
167
|
+
...(objectAssignAliasExpressions(program, target.expression) ?? []),
|
|
168
|
+
...(target.localName
|
|
169
|
+
? objectAssignAugmentationAliasExpressions(program, target.localName) ??
|
|
170
|
+
[]
|
|
171
|
+
: []),
|
|
172
|
+
];
|
|
173
|
+
return aliases.length > 0 ? aliases : null;
|
|
174
|
+
};
|
|
175
|
+
export const resolveObjectAssignProcessorExpression = (program, expr) => {
|
|
176
|
+
const objectAssignTarget = objectAssignTargetExpression(program, expr);
|
|
177
|
+
const target = objectAssignTarget ?? expr;
|
|
178
|
+
if (target.type !== 'Identifier') {
|
|
179
|
+
return target;
|
|
180
|
+
}
|
|
181
|
+
return findTopLevelConstExpression(program, target.name) ?? target;
|
|
182
|
+
};
|
|
183
|
+
export const mergeStaticObjectAssignAliases = (targetValue, aliasValues) => {
|
|
184
|
+
if (!isPlainObjectRecord(targetValue) || !isStaticWYWMetaValue(targetValue)) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
const result = { ...targetValue };
|
|
188
|
+
aliasValues.forEach((aliasValue) => {
|
|
189
|
+
Object.assign(result, aliasValue);
|
|
190
|
+
});
|
|
191
|
+
return result;
|
|
192
|
+
};
|
|
193
|
+
export const objectAssignAliasObjectExpression = (program, alias, seen = new Set()) => {
|
|
194
|
+
const unwrapped = unwrapExpression(alias);
|
|
195
|
+
if (unwrapped.type === 'ObjectExpression') {
|
|
196
|
+
return unwrapped;
|
|
197
|
+
}
|
|
198
|
+
if (unwrapped.type !== 'Identifier' || seen.has(unwrapped.name)) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
const local = findTopLevelConstExpression(program, unwrapped.name);
|
|
202
|
+
if (!local) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
seen.add(unwrapped.name);
|
|
206
|
+
const result = objectAssignAliasObjectExpression(program, local, seen);
|
|
207
|
+
seen.delete(unwrapped.name);
|
|
208
|
+
return result;
|
|
209
|
+
};
|
|
210
|
+
export const objectAssignAliasPropertyEntries = (program, alias) => {
|
|
211
|
+
const aliasObject = objectAssignAliasObjectExpression(program, alias);
|
|
212
|
+
if (!aliasObject || aliasObject.type !== 'ObjectExpression') {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
const entries = [];
|
|
216
|
+
for (const property of aliasObject.properties) {
|
|
217
|
+
if (property.type === 'SpreadElement') {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
const propertyNode = property;
|
|
221
|
+
if (propertyNode.computed ||
|
|
222
|
+
propertyNode.method ||
|
|
223
|
+
!propertyNode.key ||
|
|
224
|
+
!propertyNode.value ||
|
|
225
|
+
typeof propertyNode.key !== 'object' ||
|
|
226
|
+
typeof propertyNode.value !== 'object') {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
const key = objectPropertyKeyName(propertyNode.key);
|
|
230
|
+
if (!key) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
entries.push({
|
|
234
|
+
key,
|
|
235
|
+
value: propertyNode.value,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
return entries;
|
|
239
|
+
};
|
|
240
|
+
export function* resolveObjectAssignAliasExpressionValue(action, filename, code, program, expression, ignoredMutableCallArgumentNames, stack, memo, resolvers) {
|
|
241
|
+
const staticDependencies = collectStaticExpressionDependencies(program, {
|
|
242
|
+
expression,
|
|
243
|
+
kind: 'expression',
|
|
244
|
+
}, {
|
|
245
|
+
allowMetadataCalls: true,
|
|
246
|
+
ignoredMutableCallArgumentNames,
|
|
247
|
+
});
|
|
248
|
+
if (!staticDependencies) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
const env = new Map();
|
|
252
|
+
const dependencies = new Set();
|
|
253
|
+
const sideEffectDependencies = new Set();
|
|
254
|
+
for (const binding of staticDependencies.imports) {
|
|
255
|
+
const resolved = yield* resolvers.resolveImportValue(action, filename, binding, stack, memo);
|
|
256
|
+
if (!resolved ||
|
|
257
|
+
!bindStaticResolvedValue(env, expression, binding.local, resolved)) {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
resolved.dependencies.forEach((item) => dependencies.add(item));
|
|
261
|
+
resolved.sideEffectDependencies?.forEach((item) => sideEffectDependencies.add(item));
|
|
262
|
+
}
|
|
263
|
+
const value = evaluateOxcStaticExpressionAt(code, filename, {
|
|
264
|
+
end: expression.end,
|
|
265
|
+
start: expression.start,
|
|
266
|
+
}, env, getStaticBindings(action));
|
|
267
|
+
return isStaticObjectAssignAliasValue(value)
|
|
268
|
+
? {
|
|
269
|
+
dependencies: [...dependencies],
|
|
270
|
+
sideEffectDependencies: [...sideEffectDependencies],
|
|
271
|
+
value,
|
|
272
|
+
}
|
|
273
|
+
: null;
|
|
274
|
+
}
|
|
275
|
+
export function* resolveObjectAssignAliasPropertyValue(action, filename, code, program, expression, ignoredMutableCallArgumentNames, stack, memo, resolvers) {
|
|
276
|
+
const expressionValue = yield* resolveObjectAssignAliasExpressionValue(action, filename, code, program, expression, ignoredMutableCallArgumentNames, stack, memo, resolvers);
|
|
277
|
+
if (expressionValue) {
|
|
278
|
+
return expressionValue;
|
|
279
|
+
}
|
|
280
|
+
const unwrapped = unwrapExpression(expression);
|
|
281
|
+
if (unwrapped.type !== 'Identifier' ||
|
|
282
|
+
!findExportTarget(program, unwrapped.name)) {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
const resolved = yield* resolvers.resolveStaticExport(action, filename, unwrapped.name, stack, memo);
|
|
286
|
+
return resolved && isStaticObjectAssignAliasValue(resolved.value)
|
|
287
|
+
? {
|
|
288
|
+
dependencies: resolved.dependencies,
|
|
289
|
+
sideEffectDependencies: resolved.sideEffectDependencies ?? [],
|
|
290
|
+
value: resolved.value,
|
|
291
|
+
}
|
|
292
|
+
: null;
|
|
293
|
+
}
|
|
294
|
+
export function* resolveObjectAssignAliasValue(action, filename, code, program, alias, ignoredMutableCallArgumentNames, stack, memo, resolvers) {
|
|
295
|
+
const aliasValue = yield* resolveObjectAssignAliasExpressionValue(action, filename, code, program, alias, ignoredMutableCallArgumentNames, stack, memo, resolvers);
|
|
296
|
+
if (aliasValue && isPlainObjectRecord(aliasValue.value)) {
|
|
297
|
+
return Object.values(aliasValue.value).every(isStaticObjectAssignAliasValue)
|
|
298
|
+
? {
|
|
299
|
+
dependencies: aliasValue.dependencies,
|
|
300
|
+
sideEffectDependencies: aliasValue.sideEffectDependencies,
|
|
301
|
+
value: aliasValue.value,
|
|
302
|
+
}
|
|
303
|
+
: null;
|
|
304
|
+
}
|
|
305
|
+
const entries = objectAssignAliasPropertyEntries(program, alias);
|
|
306
|
+
if (!entries) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
const dependencies = new Set();
|
|
310
|
+
const sideEffectDependencies = new Set();
|
|
311
|
+
const value = {};
|
|
312
|
+
for (const entry of entries) {
|
|
313
|
+
const resolved = yield* resolveObjectAssignAliasPropertyValue(action, filename, code, program, entry.value, ignoredMutableCallArgumentNames, stack, memo, resolvers);
|
|
314
|
+
if (!resolved || !isStaticObjectAssignAliasValue(resolved.value)) {
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
value[entry.key] = resolved.value;
|
|
318
|
+
resolved.dependencies.forEach((item) => dependencies.add(item));
|
|
319
|
+
resolved.sideEffectDependencies.forEach((item) => sideEffectDependencies.add(item));
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
dependencies: [...dependencies],
|
|
323
|
+
sideEffectDependencies: [...sideEffectDependencies],
|
|
324
|
+
value,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
export function* resolveObjectAssignAliasValues(action, filename, code, program, aliases, stack, memo, resolvers) {
|
|
328
|
+
const dependencies = new Set();
|
|
329
|
+
const sideEffectDependencies = new Set();
|
|
330
|
+
const values = [];
|
|
331
|
+
const ignoredMutableCallArgumentNames = new Set();
|
|
332
|
+
aliases.forEach((alias) => {
|
|
333
|
+
const name = rootIdentifierName(alias);
|
|
334
|
+
if (name) {
|
|
335
|
+
ignoredMutableCallArgumentNames.add(name);
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
for (const alias of aliases) {
|
|
339
|
+
const aliasValue = yield* resolveObjectAssignAliasValue(action, filename, code, program, alias, ignoredMutableCallArgumentNames, stack, memo, resolvers);
|
|
340
|
+
if (!aliasValue) {
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
aliasValue.dependencies.forEach((item) => dependencies.add(item));
|
|
344
|
+
aliasValue.sideEffectDependencies.forEach((item) => sideEffectDependencies.add(item));
|
|
345
|
+
values.push(aliasValue.value);
|
|
346
|
+
}
|
|
347
|
+
return {
|
|
348
|
+
dependencies: [...dependencies],
|
|
349
|
+
sideEffectDependencies: [...sideEffectDependencies],
|
|
350
|
+
values,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Program } from 'oxc-parser';
|
|
2
|
+
import type { ITransformAction, SyncScenarioFor } from '../../types';
|
|
3
|
+
import type { ExportTarget, StaticExportResolverContext, StaticExportResult } from './types';
|
|
4
|
+
export declare function resolveObjectAssignStaticExport(action: ITransformAction, filename: string, code: string, program: Program, target: Extract<ExportTarget, {
|
|
5
|
+
kind: 'expression';
|
|
6
|
+
}>, stack: Set<string>, memo: Map<string, StaticExportResult | null>, resolvers: StaticExportResolverContext): SyncScenarioFor<StaticExportResult | null>;
|