@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,133 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */
|
|
2
|
+
import { collectImportBindings, isSafeLiteral, unwrapExpression, } from './staticExpression';
|
|
3
|
+
export const collectLocalConstExpressions = (program) => {
|
|
4
|
+
const result = new Map();
|
|
5
|
+
const collect = (declaration) => {
|
|
6
|
+
if (declaration.kind !== 'const') {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
declaration.declarations.forEach((declarator) => {
|
|
10
|
+
if (declarator.id.type === 'Identifier' && declarator.init) {
|
|
11
|
+
result.set(declarator.id.name, declarator.init);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
program.body.forEach((statement) => {
|
|
16
|
+
if (statement.type === 'VariableDeclaration') {
|
|
17
|
+
collect(statement);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (statement.type === 'ExportNamedDeclaration' &&
|
|
21
|
+
statement.declaration?.type === 'VariableDeclaration') {
|
|
22
|
+
collect(statement.declaration);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return result;
|
|
26
|
+
};
|
|
27
|
+
export const objectPropertyKeyName = (node) => {
|
|
28
|
+
const unwrapped = unwrapExpression(node);
|
|
29
|
+
if (unwrapped.type === 'Identifier') {
|
|
30
|
+
return unwrapped.name;
|
|
31
|
+
}
|
|
32
|
+
if (isSafeLiteral(unwrapped) && typeof unwrapped.value === 'string') {
|
|
33
|
+
return unwrapped.value;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
};
|
|
37
|
+
export const findObjectPropertyValue = (expr, name) => {
|
|
38
|
+
const unwrapped = unwrapExpression(expr);
|
|
39
|
+
if (unwrapped.type !== 'ObjectExpression') {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
for (const property of unwrapped.properties) {
|
|
43
|
+
if (property.type === 'SpreadElement') {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const propertyNode = property;
|
|
47
|
+
if (propertyNode.computed) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const key = propertyNode.key;
|
|
51
|
+
const value = propertyNode.value;
|
|
52
|
+
if (key && value && objectPropertyKeyName(key) === name) {
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
};
|
|
58
|
+
export const topLevelStatements = (program) => {
|
|
59
|
+
const result = [];
|
|
60
|
+
program.body.forEach((statement) => {
|
|
61
|
+
if (statement.type === 'ExportNamedDeclaration' ||
|
|
62
|
+
statement.type === 'ExportDefaultDeclaration') {
|
|
63
|
+
result.push(statement.declaration ?? statement);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
result.push(statement);
|
|
67
|
+
});
|
|
68
|
+
return result;
|
|
69
|
+
};
|
|
70
|
+
export const findTopLevelConstExpression = (program, name) => {
|
|
71
|
+
for (const statement of topLevelStatements(program)) {
|
|
72
|
+
if (statement.type !== 'VariableDeclaration' ||
|
|
73
|
+
statement.kind !== 'const') {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
for (const declarator of statement.declarations) {
|
|
77
|
+
if (declarator.id.type === 'Identifier' &&
|
|
78
|
+
declarator.id.name === name &&
|
|
79
|
+
declarator.init) {
|
|
80
|
+
return declarator.init;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
};
|
|
86
|
+
export const hasTopLevelBinding = (program, name) => {
|
|
87
|
+
if (collectImportBindings(program).has(name)) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return topLevelStatements(program).some((statement) => {
|
|
91
|
+
if (statement.type === 'VariableDeclaration') {
|
|
92
|
+
return statement.declarations.some((declarator) => declarator.id.type === 'Identifier' && declarator.id.name === name);
|
|
93
|
+
}
|
|
94
|
+
if (statement.type === 'FunctionDeclaration') {
|
|
95
|
+
return statement.id?.name === name;
|
|
96
|
+
}
|
|
97
|
+
if (statement.type === 'ClassDeclaration') {
|
|
98
|
+
return statement.id?.name === name;
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
export const isTopLevelFunctionOrClass = (program, name) => topLevelStatements(program).some((statement) => {
|
|
104
|
+
if (statement.type === 'FunctionDeclaration') {
|
|
105
|
+
return statement.id?.name === name;
|
|
106
|
+
}
|
|
107
|
+
if (statement.type === 'ClassDeclaration') {
|
|
108
|
+
return statement.id?.name === name;
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
});
|
|
112
|
+
export const functionReturnExpression = (expr, options = {}) => {
|
|
113
|
+
const unwrapped = unwrapExpression(expr);
|
|
114
|
+
if (unwrapped.type !== 'ArrowFunctionExpression' &&
|
|
115
|
+
unwrapped.type !== 'FunctionExpression') {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
if (unwrapped.async ||
|
|
119
|
+
(!options.allowParams && unwrapped.params.length > 0) ||
|
|
120
|
+
!unwrapped.body) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
if (unwrapped.body.type !== 'BlockStatement') {
|
|
124
|
+
return unwrapped.body;
|
|
125
|
+
}
|
|
126
|
+
if (unwrapped.body.body.length !== 1) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const [statement] = unwrapped.body.body;
|
|
130
|
+
return statement.type === 'ReturnStatement' && statement.argument
|
|
131
|
+
? statement.argument
|
|
132
|
+
: null;
|
|
133
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ImportDeclaration, Node, Program } from 'oxc-parser';
|
|
2
|
+
export declare const isIdentifierBindingPosition: (node: Node, parent: Node | null) => boolean;
|
|
3
|
+
export declare const isPropertyKeyOnlyIdentifier: (node: Node, parent: Node | null) => boolean;
|
|
4
|
+
export declare const collectUsedIdentifierNames: (program: Program) => Set<string>;
|
|
5
|
+
export declare const removableStaticHelperNames: (program: Program, staticValueNames: Set<string>) => Set<string>;
|
|
6
|
+
export declare const collectImportLocalReferences: (node: Node, importLocals: Set<string>, result: Set<string>) => void;
|
|
7
|
+
export declare const removeStaticHelperDeclarations: (code: string, filename: string, staticValueNames: Set<string>) => {
|
|
8
|
+
code: string;
|
|
9
|
+
removed: Set<string>;
|
|
10
|
+
removedImportLocals: Set<string>;
|
|
11
|
+
};
|
|
12
|
+
export declare const importSpecifierLocalName: (specifier: ImportDeclaration["specifiers"][number]) => string | null;
|
|
13
|
+
export declare const removeUnusedStaticImports: (code: string, filename: string, staticImportLocals: Set<string>, sideEffectImportLocals: Set<string>) => string;
|
|
14
|
+
export declare const replaceStaticWYWMetaExtendsHelpers: (code: string, filename: string, helperValues: Map<string, unknown>) => string;
|
|
15
|
+
export declare const pruneStaticPreevalCode: (code: string, filename: string, staticValueNames: Set<string>, staticImportLocals: Set<string>, staticExtendsHelperValues: Map<string, unknown>, sideEffectImportLocals: Set<string>) => string;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */
|
|
2
|
+
import { getOxcNodeChildren } from '../../../utils/oxc/ast';
|
|
3
|
+
import { applyOxcReplacements } from '../../../utils/oxc/replacements';
|
|
4
|
+
import { parseProgram } from './environment';
|
|
5
|
+
import { collectImportBindings, unwrapExpression } from './staticExpression';
|
|
6
|
+
import { findWYWMetaExtendsExpression, staticWYWMetaExtendsReplacementCode, } from './processorStaticModel';
|
|
7
|
+
export const isIdentifierBindingPosition = (node, parent) => {
|
|
8
|
+
if (node.type !== 'Identifier' || !parent) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if ((parent.type === 'VariableDeclarator' && parent.id === node) ||
|
|
12
|
+
(parent.type === 'FunctionDeclaration' && parent.id === node) ||
|
|
13
|
+
(parent.type === 'FunctionExpression' && parent.id === node) ||
|
|
14
|
+
(parent.type === 'ClassDeclaration' && parent.id === node) ||
|
|
15
|
+
(parent.type === 'ClassExpression' && parent.id === node)) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if ((parent.type === 'ArrowFunctionExpression' ||
|
|
19
|
+
parent.type === 'FunctionDeclaration' ||
|
|
20
|
+
parent.type === 'FunctionExpression') &&
|
|
21
|
+
parent.params.some((param) => param === node)) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return ((parent.type === 'ImportSpecifier' && parent.local === node) ||
|
|
25
|
+
(parent.type === 'ImportDefaultSpecifier' && parent.local === node) ||
|
|
26
|
+
(parent.type === 'ImportNamespaceSpecifier' && parent.local === node));
|
|
27
|
+
};
|
|
28
|
+
export const isPropertyKeyOnlyIdentifier = (node, parent) => node.type === 'Identifier' &&
|
|
29
|
+
!!parent &&
|
|
30
|
+
((parent.type === 'MemberExpression' &&
|
|
31
|
+
parent.property === node &&
|
|
32
|
+
!parent.computed) ||
|
|
33
|
+
(parent.type === 'Property' &&
|
|
34
|
+
parent.key === node &&
|
|
35
|
+
!parent.computed &&
|
|
36
|
+
!parent.shorthand));
|
|
37
|
+
export const collectUsedIdentifierNames = (program) => {
|
|
38
|
+
const used = new Set();
|
|
39
|
+
const walk = (node, parent) => {
|
|
40
|
+
if (node.type === 'ImportDeclaration') {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (node.type === 'Identifier' &&
|
|
44
|
+
!isIdentifierBindingPosition(node, parent) &&
|
|
45
|
+
!isPropertyKeyOnlyIdentifier(node, parent)) {
|
|
46
|
+
used.add(node.name);
|
|
47
|
+
}
|
|
48
|
+
getOxcNodeChildren(node).forEach((child) => walk(child, node));
|
|
49
|
+
};
|
|
50
|
+
walk(program, null);
|
|
51
|
+
return used;
|
|
52
|
+
};
|
|
53
|
+
export const removableStaticHelperNames = (program, staticValueNames) => {
|
|
54
|
+
const used = collectUsedIdentifierNames(program);
|
|
55
|
+
const result = new Set();
|
|
56
|
+
program.body.forEach((statement) => {
|
|
57
|
+
if (statement.type !== 'VariableDeclaration') {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
statement.declarations.forEach((declarator) => {
|
|
61
|
+
if (declarator.id.type === 'Identifier' &&
|
|
62
|
+
staticValueNames.has(declarator.id.name) &&
|
|
63
|
+
!used.has(declarator.id.name)) {
|
|
64
|
+
result.add(declarator.id.name);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
return result;
|
|
69
|
+
};
|
|
70
|
+
export const collectImportLocalReferences = (node, importLocals, result) => {
|
|
71
|
+
const walk = (item, parent) => {
|
|
72
|
+
if (item.type === 'Identifier' &&
|
|
73
|
+
importLocals.has(item.name) &&
|
|
74
|
+
!isIdentifierBindingPosition(item, parent) &&
|
|
75
|
+
!isPropertyKeyOnlyIdentifier(item, parent)) {
|
|
76
|
+
result.add(item.name);
|
|
77
|
+
}
|
|
78
|
+
getOxcNodeChildren(item).forEach((child) => walk(child, item));
|
|
79
|
+
};
|
|
80
|
+
walk(node, null);
|
|
81
|
+
};
|
|
82
|
+
export const removeStaticHelperDeclarations = (code, filename, staticValueNames) => {
|
|
83
|
+
if (staticValueNames.size === 0) {
|
|
84
|
+
return { code, removed: new Set(), removedImportLocals: new Set() };
|
|
85
|
+
}
|
|
86
|
+
const program = parseProgram(code, filename);
|
|
87
|
+
const removableNames = removableStaticHelperNames(program, staticValueNames);
|
|
88
|
+
const importLocals = new Set();
|
|
89
|
+
collectImportBindings(program).forEach((_, local) => importLocals.add(local));
|
|
90
|
+
const removedImportLocals = new Set();
|
|
91
|
+
const ranges = [];
|
|
92
|
+
const replacements = [];
|
|
93
|
+
program.body.forEach((statement) => {
|
|
94
|
+
if (statement.type !== 'VariableDeclaration' ||
|
|
95
|
+
statement.declarations.length === 0) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const removableIndexes = statement.declarations.flatMap((declarator, index) => declarator.id.type === 'Identifier' &&
|
|
99
|
+
removableNames.has(declarator.id.name)
|
|
100
|
+
? [index]
|
|
101
|
+
: []);
|
|
102
|
+
if (removableIndexes.length === 0) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
removableIndexes.forEach((index) => {
|
|
106
|
+
collectImportLocalReferences(statement.declarations[index], importLocals, removedImportLocals);
|
|
107
|
+
});
|
|
108
|
+
if (removableIndexes.length === statement.declarations.length) {
|
|
109
|
+
ranges.push({
|
|
110
|
+
end: statement.end,
|
|
111
|
+
start: statement.start,
|
|
112
|
+
});
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const keptDeclarations = statement.declarations
|
|
116
|
+
.filter((_, index) => !removableIndexes.includes(index))
|
|
117
|
+
.map((declarator) => code.slice(declarator.start, declarator.end));
|
|
118
|
+
replacements.push({
|
|
119
|
+
end: statement.end,
|
|
120
|
+
start: statement.start,
|
|
121
|
+
text: `${statement.kind} ${keptDeclarations.join(', ')};`,
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
code: applyOxcReplacements(code, [
|
|
126
|
+
...ranges.map((range) => ({ ...range, text: '' })),
|
|
127
|
+
...replacements,
|
|
128
|
+
]),
|
|
129
|
+
removed: removableNames,
|
|
130
|
+
removedImportLocals,
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
export const importSpecifierLocalName = (specifier) => specifier.local?.name ?? null;
|
|
134
|
+
export const removeUnusedStaticImports = (code, filename, staticImportLocals, sideEffectImportLocals) => {
|
|
135
|
+
if (staticImportLocals.size === 0) {
|
|
136
|
+
return code;
|
|
137
|
+
}
|
|
138
|
+
const program = parseProgram(code, filename);
|
|
139
|
+
const used = collectUsedIdentifierNames(program);
|
|
140
|
+
const ranges = [];
|
|
141
|
+
const replacements = [];
|
|
142
|
+
program.body.forEach((statement) => {
|
|
143
|
+
if (statement.type !== 'ImportDeclaration' ||
|
|
144
|
+
statement.specifiers.length === 0) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const removable = statement.specifiers.flatMap((specifier, index) => {
|
|
148
|
+
const localName = importSpecifierLocalName(specifier);
|
|
149
|
+
return localName &&
|
|
150
|
+
staticImportLocals.has(localName) &&
|
|
151
|
+
!used.has(localName)
|
|
152
|
+
? [{ index, localName }]
|
|
153
|
+
: [];
|
|
154
|
+
});
|
|
155
|
+
if (removable.length === 0) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (removable.length === statement.specifiers.length) {
|
|
159
|
+
if (removable.some((item) => sideEffectImportLocals.has(item.localName))) {
|
|
160
|
+
replacements.push({
|
|
161
|
+
end: statement.end,
|
|
162
|
+
start: statement.start,
|
|
163
|
+
text: `import ${code.slice(statement.source.start, statement.source.end)};`,
|
|
164
|
+
});
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
ranges.push({
|
|
168
|
+
end: statement.end,
|
|
169
|
+
start: statement.start,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
return applyOxcReplacements(code, [
|
|
174
|
+
...ranges.map((range) => ({ ...range, text: '' })),
|
|
175
|
+
...replacements,
|
|
176
|
+
]);
|
|
177
|
+
};
|
|
178
|
+
export const replaceStaticWYWMetaExtendsHelpers = (code, filename, helperValues) => {
|
|
179
|
+
if (helperValues.size === 0) {
|
|
180
|
+
return code;
|
|
181
|
+
}
|
|
182
|
+
const program = parseProgram(code, filename);
|
|
183
|
+
const replacements = [];
|
|
184
|
+
const visit = (node) => {
|
|
185
|
+
if (node.type === 'ObjectExpression') {
|
|
186
|
+
const extendsExpression = findWYWMetaExtendsExpression(node);
|
|
187
|
+
if (extendsExpression) {
|
|
188
|
+
const unwrapped = unwrapExpression(extendsExpression);
|
|
189
|
+
if (unwrapped.type === 'CallExpression' &&
|
|
190
|
+
unwrapped.callee.type === 'Identifier' &&
|
|
191
|
+
unwrapped.arguments.length === 0 &&
|
|
192
|
+
helperValues.has(unwrapped.callee.name)) {
|
|
193
|
+
const replacement = staticWYWMetaExtendsReplacementCode(helperValues.get(unwrapped.callee.name));
|
|
194
|
+
if (replacement) {
|
|
195
|
+
replacements.push({
|
|
196
|
+
end: extendsExpression.end,
|
|
197
|
+
start: extendsExpression.start,
|
|
198
|
+
text: replacement,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
getOxcNodeChildren(node).forEach(visit);
|
|
205
|
+
};
|
|
206
|
+
visit(program);
|
|
207
|
+
return applyOxcReplacements(code, replacements);
|
|
208
|
+
};
|
|
209
|
+
export const pruneStaticPreevalCode = (code, filename, staticValueNames, staticImportLocals, staticExtendsHelperValues, sideEffectImportLocals) => {
|
|
210
|
+
const codeWithMetadataPruned = replaceStaticWYWMetaExtendsHelpers(code, filename, staticExtendsHelperValues);
|
|
211
|
+
const helpersRemoved = removeStaticHelperDeclarations(codeWithMetadataPruned, filename, staticValueNames);
|
|
212
|
+
if (helpersRemoved.removed.size === 0) {
|
|
213
|
+
return codeWithMetadataPruned;
|
|
214
|
+
}
|
|
215
|
+
const importLocalsToPrune = new Set([
|
|
216
|
+
...staticImportLocals,
|
|
217
|
+
...helpersRemoved.removedImportLocals,
|
|
218
|
+
]);
|
|
219
|
+
return removeUnusedStaticImports(helpersRemoved.code, filename, importLocalsToPrune, sideEffectImportLocals);
|
|
220
|
+
};
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */
|
|
2
|
+
import { isAbsolute } from 'path';
|
|
3
|
+
import { appendOxcWywPreval } from '../../../utils/oxcPreevalStage';
|
|
4
|
+
import { stripQueryAndHash } from '../../../utils/parseRequest';
|
|
5
|
+
import { resolveCandidateValue, resolveOpaqueRuntimeCandidateValue, } from './candidateResolver';
|
|
6
|
+
import { debugStaticResolve, getEvalStrategy, getStaticStrategyFailure, parseProgram, } from './environment';
|
|
7
|
+
import { collectWYWMetaExtendsHelperNames, createSameFileStaticWYWMetaHelperResolver, } from './processorStaticModel';
|
|
8
|
+
import { pruneStaticPreevalCode } from './prune';
|
|
9
|
+
import { runtimeCallbackPlaceholder } from './staticExpression';
|
|
10
|
+
export function* resolveStaticOxcPreevalValues() {
|
|
11
|
+
const preevalResult = this.entrypoint.getPreevalResult();
|
|
12
|
+
if (!preevalResult) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const candidates = preevalResult.staticValueCandidates ?? [];
|
|
16
|
+
const evalDependencyNames = new Set(preevalResult.dependencyNames ?? []);
|
|
17
|
+
if (candidates.length === 0 && evalDependencyNames.size === 0) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const filename = this.entrypoint.loadedAndParsed.evaluator === 'ignored'
|
|
21
|
+
? this.entrypoint.name
|
|
22
|
+
: this.entrypoint.loadedAndParsed.evalConfig.filename ??
|
|
23
|
+
this.entrypoint.name;
|
|
24
|
+
const evalStrategy = getEvalStrategy(this);
|
|
25
|
+
if (evalStrategy === 'execute') {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const staticOnly = evalStrategy === 'static';
|
|
29
|
+
const staticValueCache = preevalResult.staticValueCache ?? new Map();
|
|
30
|
+
const staticDependencies = new Set(preevalResult.staticDependencies ?? []);
|
|
31
|
+
const staticImportLocals = new Set();
|
|
32
|
+
const sideEffectImportLocals = new Set();
|
|
33
|
+
const staticNullWYWMetaExtendsHelpers = new Set(preevalResult.staticNullWYWMetaExtendsHelpers ?? []);
|
|
34
|
+
const memo = new Map();
|
|
35
|
+
const opaqueRuntimeBaseHelpers = collectWYWMetaExtendsHelperNames(parseProgram(preevalResult.baseCode ?? preevalResult.code, filename));
|
|
36
|
+
// Names of candidates resolved to runtime callbacks (function values).
|
|
37
|
+
// They keep the file out of evalFile but their helper declarations must
|
|
38
|
+
// not be pruned — the runtime call site relies on them.
|
|
39
|
+
const runtimeOnlyCandidateNames = new Set(preevalResult.runtimeOnlyStaticValueNames ?? []);
|
|
40
|
+
let changed = false;
|
|
41
|
+
let hasKnownStaticCandidate = false;
|
|
42
|
+
const resolveSameFileStaticWYWMetaHelpers = createSameFileStaticWYWMetaHelperResolver(preevalResult.baseCode ?? preevalResult.code, filename);
|
|
43
|
+
const applySameFileStaticWYWMetaHelpers = () => {
|
|
44
|
+
let appliedAny = false;
|
|
45
|
+
for (;;) {
|
|
46
|
+
let applied = false;
|
|
47
|
+
const values = resolveSameFileStaticWYWMetaHelpers(staticValueCache);
|
|
48
|
+
values.forEach((value, name) => {
|
|
49
|
+
if (staticValueCache.has(name) ||
|
|
50
|
+
(!evalDependencyNames.has(name) &&
|
|
51
|
+
!opaqueRuntimeBaseHelpers.has(name))) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
staticValueCache.set(name, value);
|
|
55
|
+
debugStaticResolve(this, {
|
|
56
|
+
candidate: name,
|
|
57
|
+
filename,
|
|
58
|
+
phase: 'candidate',
|
|
59
|
+
reason: 'same-file-static-metadata',
|
|
60
|
+
status: 'resolved',
|
|
61
|
+
});
|
|
62
|
+
applied = true;
|
|
63
|
+
});
|
|
64
|
+
if (!applied) {
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
appliedAny = true;
|
|
68
|
+
}
|
|
69
|
+
if (appliedAny) {
|
|
70
|
+
changed = true;
|
|
71
|
+
hasKnownStaticCandidate = true;
|
|
72
|
+
}
|
|
73
|
+
return appliedAny;
|
|
74
|
+
};
|
|
75
|
+
applySameFileStaticWYWMetaHelpers();
|
|
76
|
+
for (const candidate of candidates) {
|
|
77
|
+
applySameFileStaticWYWMetaHelpers();
|
|
78
|
+
const isOpaqueRuntimeBaseHelper = opaqueRuntimeBaseHelpers.has(candidate.name);
|
|
79
|
+
if (!evalDependencyNames.has(candidate.name) &&
|
|
80
|
+
!isOpaqueRuntimeBaseHelper &&
|
|
81
|
+
!staticValueCache.has(candidate.name)) {
|
|
82
|
+
debugStaticResolve(this, {
|
|
83
|
+
candidate: candidate.name,
|
|
84
|
+
filename,
|
|
85
|
+
phase: 'candidate',
|
|
86
|
+
reason: 'not-eval-dependency',
|
|
87
|
+
status: 'skipped',
|
|
88
|
+
});
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (staticValueCache.has(candidate.name)) {
|
|
92
|
+
hasKnownStaticCandidate = true;
|
|
93
|
+
candidate.imports.forEach((item) => staticImportLocals.add(item.importLocal ?? item.local));
|
|
94
|
+
if (isOpaqueRuntimeBaseHelper &&
|
|
95
|
+
staticValueCache.get(candidate.name) === null) {
|
|
96
|
+
staticNullWYWMetaExtendsHelpers.add(candidate.name);
|
|
97
|
+
}
|
|
98
|
+
debugStaticResolve(this, {
|
|
99
|
+
candidate: candidate.name,
|
|
100
|
+
filename,
|
|
101
|
+
phase: 'candidate',
|
|
102
|
+
reason: 'already-static',
|
|
103
|
+
status: 'skipped',
|
|
104
|
+
});
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
let resolved;
|
|
108
|
+
let resolvedOpaqueRuntimeBase = false;
|
|
109
|
+
if (isOpaqueRuntimeBaseHelper) {
|
|
110
|
+
resolved = yield* resolveOpaqueRuntimeCandidateValue(this, candidate, filename);
|
|
111
|
+
resolvedOpaqueRuntimeBase = !!resolved;
|
|
112
|
+
if (!resolved) {
|
|
113
|
+
resolved = yield* resolveCandidateValue(this, candidate, filename, memo);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
resolved = yield* resolveCandidateValue(this, candidate, filename, memo);
|
|
118
|
+
}
|
|
119
|
+
if (!resolved) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (resolvedOpaqueRuntimeBase) {
|
|
123
|
+
debugStaticResolve(this, {
|
|
124
|
+
candidate: candidate.name,
|
|
125
|
+
filename,
|
|
126
|
+
phase: 'candidate',
|
|
127
|
+
reason: 'opaque-runtime-component',
|
|
128
|
+
status: 'resolved',
|
|
129
|
+
});
|
|
130
|
+
staticNullWYWMetaExtendsHelpers.add(candidate.name);
|
|
131
|
+
}
|
|
132
|
+
if (resolved.runtimeOnly) {
|
|
133
|
+
// Runtime callback — seed a callable placeholder for collect() but
|
|
134
|
+
// track it separately so the `_exp = () => target` helper survives
|
|
135
|
+
// pruning. The runtime call site relies on that helper declaration.
|
|
136
|
+
runtimeOnlyCandidateNames.add(candidate.name);
|
|
137
|
+
staticValueCache.set(candidate.name, runtimeCallbackPlaceholder);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
staticValueCache.set(candidate.name, resolved.value);
|
|
141
|
+
}
|
|
142
|
+
hasKnownStaticCandidate = true;
|
|
143
|
+
candidate.imports.forEach((item) => staticImportLocals.add(item.importLocal ?? item.local));
|
|
144
|
+
resolved.dependencies.forEach((dependency) => staticDependencies.add(dependency));
|
|
145
|
+
resolved.sideEffectImportLocals?.forEach((local) => sideEffectImportLocals.add(local));
|
|
146
|
+
changed = true;
|
|
147
|
+
applySameFileStaticWYWMetaHelpers();
|
|
148
|
+
}
|
|
149
|
+
if (!changed &&
|
|
150
|
+
(!hasKnownStaticCandidate || preevalResult.staticValuesApplied)) {
|
|
151
|
+
if (staticOnly && evalDependencyNames.size > 0) {
|
|
152
|
+
throw getStaticStrategyFailure(filename, evalDependencyNames);
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
const dependencyNames = (preevalResult.dependencyNames ?? []).filter((name) => !staticValueCache.has(name) && !runtimeOnlyCandidateNames.has(name));
|
|
157
|
+
if (staticOnly && dependencyNames.length > 0) {
|
|
158
|
+
throw getStaticStrategyFailure(filename, dependencyNames);
|
|
159
|
+
}
|
|
160
|
+
preevalResult.dependencyNames = dependencyNames;
|
|
161
|
+
preevalResult.staticValueCache = staticValueCache;
|
|
162
|
+
preevalResult.staticDependencies = [...staticDependencies];
|
|
163
|
+
preevalResult.staticNullWYWMetaExtendsHelpers = [
|
|
164
|
+
...staticNullWYWMetaExtendsHelpers,
|
|
165
|
+
];
|
|
166
|
+
preevalResult.runtimeOnlyStaticValueNames = [...runtimeOnlyCandidateNames];
|
|
167
|
+
preevalResult.staticValuesApplied = true;
|
|
168
|
+
const originalBaseCode = preevalResult.baseCode ?? preevalResult.code;
|
|
169
|
+
const prunableStaticValueNames = new Set([...staticValueCache.keys()].filter((name) => !runtimeOnlyCandidateNames.has(name)));
|
|
170
|
+
const staticExtendsHelperValues = new Map([...staticValueCache].filter(([name]) => !runtimeOnlyCandidateNames.has(name)));
|
|
171
|
+
staticNullWYWMetaExtendsHelpers.forEach((name) => {
|
|
172
|
+
if (!staticExtendsHelperValues.has(name)) {
|
|
173
|
+
staticExtendsHelperValues.set(name, null);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
const baseCode = pruneStaticPreevalCode(originalBaseCode, filename, prunableStaticValueNames, staticImportLocals, staticExtendsHelperValues, sideEffectImportLocals);
|
|
177
|
+
const evalBaseCode = sideEffectImportLocals.size > 0
|
|
178
|
+
? pruneStaticPreevalCode(originalBaseCode, filename, prunableStaticValueNames, staticImportLocals, staticExtendsHelperValues, new Set())
|
|
179
|
+
: baseCode;
|
|
180
|
+
preevalResult.baseCode = baseCode;
|
|
181
|
+
preevalResult.code = appendOxcWywPreval(baseCode, filename, dependencyNames);
|
|
182
|
+
preevalResult.evalCode = appendOxcWywPreval(evalBaseCode, filename, dependencyNames);
|
|
183
|
+
preevalResult.staticSideEffectImportLocals = [...sideEffectImportLocals];
|
|
184
|
+
for (const dependency of staticDependencies) {
|
|
185
|
+
const strippedDependency = stripQueryAndHash(dependency);
|
|
186
|
+
if (isAbsolute(strippedDependency)) {
|
|
187
|
+
this.services.cache.checkFreshness(dependency, strippedDependency);
|
|
188
|
+
}
|
|
189
|
+
this.entrypoint.addInvalidationDependency({
|
|
190
|
+
only: ['*'],
|
|
191
|
+
resolved: dependency,
|
|
192
|
+
source: dependency,
|
|
193
|
+
});
|
|
194
|
+
this.entrypoint.markInvalidateOnDependencyChange(dependency);
|
|
195
|
+
}
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Expression, ImportDeclaration, ModuleExportName, Node, Program } from 'oxc-parser';
|
|
2
|
+
import type { CollectImportBindingsOptions, ImportBinding, StaticExportResult, StaticExpressionOptions } from './types';
|
|
3
|
+
export declare const moduleExportName: (node: ModuleExportName) => string;
|
|
4
|
+
export declare const unwrapExpression: (expr: Node) => Node;
|
|
5
|
+
export declare const isProcessEnvMember: (node: Node) => boolean;
|
|
6
|
+
export declare const isSafeLiteral: (node: Node) => node is Node & {
|
|
7
|
+
type: "Literal";
|
|
8
|
+
value: boolean | null | number | string;
|
|
9
|
+
};
|
|
10
|
+
export declare const isSafeStaticExpression: (expr: Node, options?: StaticExpressionOptions) => boolean;
|
|
11
|
+
export declare const isTypeOnlyImport: (statement: ImportDeclaration) => boolean;
|
|
12
|
+
export declare const getImportBinding: (statement: ImportDeclaration, specifier: ImportDeclaration["specifiers"][number], options?: CollectImportBindingsOptions) => ImportBinding | null;
|
|
13
|
+
export declare const collectImportBindings: (program: Program, options?: CollectImportBindingsOptions) => Map<string, ImportBinding>;
|
|
14
|
+
export declare const parseStaticExpressionSource: (source: string, filename: string) => Expression | null;
|
|
15
|
+
export declare const isRuntimeCallbackExpression: (expression: Expression | null) => boolean;
|
|
16
|
+
export declare const runtimeCallbackPlaceholder: () => undefined;
|
|
17
|
+
export declare const isIdentifierBindingPosition: (node: Node, parent: Node | null) => boolean;
|
|
18
|
+
export declare const isPropertyKeyOnlyIdentifier: (node: Node, parent: Node | null) => boolean;
|
|
19
|
+
export declare const expressionUsesNameOnlyAsZeroArgCalls: (expression: Node, name: string) => boolean;
|
|
20
|
+
export declare const bindStaticResolvedValue: (env: Map<string, unknown>, expression: Node, local: string, resolved: StaticExportResult, options?: {
|
|
21
|
+
wrapNonCallable?: boolean;
|
|
22
|
+
}) => boolean;
|
|
23
|
+
export declare const isSafeFunctionBodyExpression: (body: Node, options: StaticExpressionOptions) => boolean;
|
|
24
|
+
export declare const collectStaticFunctionBodyReferences: (body: Node, references: Set<string>, options: StaticExpressionOptions) => boolean;
|
|
25
|
+
export declare const collectStaticExpressionReferences: (expr: Node, references: Set<string>, options?: StaticExpressionOptions) => boolean;
|