@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,298 @@
|
|
|
1
|
+
import { createOxcStaticCallableValue } from "../../../utils/collectOxcTemplateDependencies.js";
|
|
2
|
+
import { getOxcNodeChildren } from "../../../utils/oxc/ast.js";
|
|
3
|
+
import { parseProgram } from "./environment.js";
|
|
4
|
+
export const moduleExportName = (node) => node.type === "Literal" ? String(node.value) : node.name;
|
|
5
|
+
export const unwrapExpression = (expr) => {
|
|
6
|
+
let current = expr;
|
|
7
|
+
for (;;) {
|
|
8
|
+
if (current.type === "TSAsExpression" || current.type === "TSSatisfiesExpression" || current.type === "TSNonNullExpression" || current.type === "TSInstantiationExpression" || current.type === "TSTypeAssertion" || current.type === "ParenthesizedExpression") {
|
|
9
|
+
current = current.expression;
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
return current;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export const isProcessEnvMember = (node) => {
|
|
16
|
+
if (node.type !== "MemberExpression" || node.computed) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
if (node.property.type !== "Identifier" || node.property.name !== "env") {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return node.object.type === "Identifier" && node.object.name === "process";
|
|
23
|
+
};
|
|
24
|
+
export const isSafeLiteral = (node) => {
|
|
25
|
+
if (node.type !== "Literal") {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const { value } = node;
|
|
29
|
+
return value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean";
|
|
30
|
+
};
|
|
31
|
+
export const isSafeStaticExpression = (expr, options = {}) => {
|
|
32
|
+
const unwrapped = unwrapExpression(expr);
|
|
33
|
+
if (isSafeLiteral(unwrapped)) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
if (unwrapped.type === "Identifier") {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
if (unwrapped.type === "TemplateLiteral") {
|
|
40
|
+
return unwrapped.expressions.every((item) => isSafeStaticExpression(item, options));
|
|
41
|
+
}
|
|
42
|
+
if (unwrapped.type === "UnaryExpression") {
|
|
43
|
+
return isSafeStaticExpression(unwrapped.argument, options);
|
|
44
|
+
}
|
|
45
|
+
if (unwrapped.type === "BinaryExpression" || unwrapped.type === "LogicalExpression") {
|
|
46
|
+
return isSafeStaticExpression(unwrapped.left, options) && isSafeStaticExpression(unwrapped.right, options);
|
|
47
|
+
}
|
|
48
|
+
if (unwrapped.type === "ConditionalExpression") {
|
|
49
|
+
return isSafeStaticExpression(unwrapped.test, options) && isSafeStaticExpression(unwrapped.consequent, options) && isSafeStaticExpression(unwrapped.alternate, options);
|
|
50
|
+
}
|
|
51
|
+
if (unwrapped.type === "MemberExpression") {
|
|
52
|
+
return isSafeStaticExpression(unwrapped.object, options) && (unwrapped.computed ? isSafeStaticExpression(unwrapped.property, options) : unwrapped.property.type === "Identifier");
|
|
53
|
+
}
|
|
54
|
+
if (options.allowMetadataCalls && unwrapped.type === "CallExpression") {
|
|
55
|
+
return unwrapped.callee.type === "Identifier" && unwrapped.arguments.length === 0;
|
|
56
|
+
}
|
|
57
|
+
if (unwrapped.type === "CallExpression" && options.staticHelperLocals && unwrapped.callee.type === "Identifier" && options.staticHelperLocals.has(unwrapped.callee.name)) {
|
|
58
|
+
return unwrapped.arguments.every((argument) => argument.type === "SpreadElement" ? isSafeStaticExpression(argument.argument, options) : isSafeStaticExpression(argument, options));
|
|
59
|
+
}
|
|
60
|
+
if (options.allowMetadataCalls && (unwrapped.type === "ArrowFunctionExpression" || unwrapped.type === "FunctionExpression")) {
|
|
61
|
+
return !unwrapped.async && unwrapped.params.length === 0 && !!unwrapped.body && isSafeFunctionBodyExpression(unwrapped.body, options);
|
|
62
|
+
}
|
|
63
|
+
if (unwrapped.type === "ArrayExpression") {
|
|
64
|
+
return unwrapped.elements.every((item) => {
|
|
65
|
+
if (!item) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return item.type === "SpreadElement" ? isSafeStaticExpression(item.argument, options) : isSafeStaticExpression(item, options);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (unwrapped.type === "ObjectExpression") {
|
|
72
|
+
return unwrapped.properties.every((property) => {
|
|
73
|
+
if (property.type === "SpreadElement") {
|
|
74
|
+
return isSafeStaticExpression(property.argument);
|
|
75
|
+
}
|
|
76
|
+
const propertyNode = property;
|
|
77
|
+
if (propertyNode.method) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
// Computed keys are admissible as long as the key expression
|
|
81
|
+
// itself is safe-static — the downstream evaluator already folds
|
|
82
|
+
// them against the env. Common shape: `[\`${imp} &\`]: { ... }`.
|
|
83
|
+
if (propertyNode.computed && (!propertyNode.key || typeof propertyNode.key !== "object" || !isSafeStaticExpression(propertyNode.key, options))) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
return propertyNode.value && typeof propertyNode.value === "object" && isSafeStaticExpression(propertyNode.value, options);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
};
|
|
91
|
+
export const isTypeOnlyImport = (statement) => {
|
|
92
|
+
if (statement.importKind === "type") {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return statement.specifiers.every((specifier) => specifier.type === "ImportSpecifier" && specifier.importKind === "type");
|
|
96
|
+
};
|
|
97
|
+
export const getImportBinding = (statement, specifier, options = {}) => {
|
|
98
|
+
const local = specifier.local?.name;
|
|
99
|
+
if (!local) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
if (specifier.type === "ImportNamespaceSpecifier") {
|
|
103
|
+
return options.includeNamespace ? {
|
|
104
|
+
imported: "*",
|
|
105
|
+
local,
|
|
106
|
+
source: statement.source.value
|
|
107
|
+
} : null;
|
|
108
|
+
}
|
|
109
|
+
if (specifier.type === "ImportDefaultSpecifier") {
|
|
110
|
+
return {
|
|
111
|
+
imported: "default",
|
|
112
|
+
local,
|
|
113
|
+
source: statement.source.value
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (specifier.type !== "ImportSpecifier") {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
if (statement.importKind === "type" || specifier.importKind === "type") {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
imported: moduleExportName(specifier.imported),
|
|
124
|
+
local,
|
|
125
|
+
source: statement.source.value
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
export const collectImportBindings = (program, options = {}) => {
|
|
129
|
+
const result = new Map();
|
|
130
|
+
program.body.forEach((statement) => {
|
|
131
|
+
if (statement.type !== "ImportDeclaration" || isTypeOnlyImport(statement)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
statement.specifiers.forEach((specifier) => {
|
|
135
|
+
const binding = getImportBinding(statement, specifier, options);
|
|
136
|
+
if (binding) {
|
|
137
|
+
result.set(binding.local, binding);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
return result;
|
|
142
|
+
};
|
|
143
|
+
export const parseStaticExpressionSource = (source, filename) => {
|
|
144
|
+
try {
|
|
145
|
+
const program = parseProgram(`const __wyw_static_value = ${source};`, filename);
|
|
146
|
+
const declaration = program.body[0];
|
|
147
|
+
if (declaration?.type !== "VariableDeclaration") {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
const [declarator] = declaration.declarations;
|
|
151
|
+
return declarator?.init ?? null;
|
|
152
|
+
} catch {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
export const isRuntimeCallbackExpression = (expression) => {
|
|
157
|
+
const unwrapped = expression ? unwrapExpression(expression) : null;
|
|
158
|
+
return unwrapped?.type === "ArrowFunctionExpression" || unwrapped?.type === "FunctionExpression";
|
|
159
|
+
};
|
|
160
|
+
export const runtimeCallbackPlaceholder = () => undefined;
|
|
161
|
+
export const isIdentifierBindingPosition = (node, parent) => {
|
|
162
|
+
if (node.type !== "Identifier" || !parent) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
if (parent.type === "VariableDeclarator" && parent.id === node || parent.type === "FunctionDeclaration" && parent.id === node || parent.type === "FunctionExpression" && parent.id === node || parent.type === "ClassDeclaration" && parent.id === node || parent.type === "ClassExpression" && parent.id === node) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
if ((parent.type === "ArrowFunctionExpression" || parent.type === "FunctionDeclaration" || parent.type === "FunctionExpression") && parent.params.some((param) => param === node)) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
return parent.type === "ImportSpecifier" && parent.local === node || parent.type === "ImportDefaultSpecifier" && parent.local === node || parent.type === "ImportNamespaceSpecifier" && parent.local === node;
|
|
172
|
+
};
|
|
173
|
+
export const isPropertyKeyOnlyIdentifier = (node, parent) => node.type === "Identifier" && !!parent && (parent.type === "MemberExpression" && parent.property === node && !parent.computed || parent.type === "Property" && parent.key === node && !parent.computed && !parent.shorthand);
|
|
174
|
+
export const expressionUsesNameOnlyAsZeroArgCalls = (expression, name) => {
|
|
175
|
+
let seen = false;
|
|
176
|
+
let valid = true;
|
|
177
|
+
const walk = (node, parent) => {
|
|
178
|
+
if (!valid) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (node.type === "Identifier" && node.name === name && !isIdentifierBindingPosition(node, parent) && !isPropertyKeyOnlyIdentifier(node, parent)) {
|
|
182
|
+
if (parent?.type === "CallExpression" && parent.callee === node && parent.arguments.length === 0) {
|
|
183
|
+
seen = true;
|
|
184
|
+
} else {
|
|
185
|
+
valid = false;
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
getOxcNodeChildren(node).forEach((child) => walk(child, node));
|
|
190
|
+
};
|
|
191
|
+
walk(expression, null);
|
|
192
|
+
return seen && valid;
|
|
193
|
+
};
|
|
194
|
+
export const bindStaticResolvedValue = (env, expression, local, resolved, options = {}) => {
|
|
195
|
+
if (resolved.callable === "zero-arg") {
|
|
196
|
+
if (!expressionUsesNameOnlyAsZeroArgCalls(expression, local)) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
env.set(local, createOxcStaticCallableValue(resolved.value));
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
env.set(local, options.wrapNonCallable ? createOxcStaticCallableValue(resolved.value) : resolved.value);
|
|
203
|
+
return true;
|
|
204
|
+
};
|
|
205
|
+
export const isSafeFunctionBodyExpression = (body, options) => {
|
|
206
|
+
if (body.type !== "BlockStatement") {
|
|
207
|
+
return isSafeStaticExpression(body, options);
|
|
208
|
+
}
|
|
209
|
+
return body.body.every((statement) => {
|
|
210
|
+
if (statement.type === "VariableDeclaration") {
|
|
211
|
+
return statement.kind === "const" && statement.declarations.every((declarator) => declarator.init && declarator.id.type === "Identifier" && isSafeStaticExpression(declarator.init, options));
|
|
212
|
+
}
|
|
213
|
+
return statement.type === "ReturnStatement" && !!statement.argument && isSafeStaticExpression(statement.argument, options);
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
export const collectStaticFunctionBodyReferences = (body, references, options) => {
|
|
217
|
+
if (body.type !== "BlockStatement") {
|
|
218
|
+
return collectStaticExpressionReferences(body, references, options);
|
|
219
|
+
}
|
|
220
|
+
return body.body.every((statement) => {
|
|
221
|
+
if (statement.type === "VariableDeclaration") {
|
|
222
|
+
return statement.kind === "const" && statement.declarations.every((declarator) => declarator.init && declarator.id.type === "Identifier" && collectStaticExpressionReferences(declarator.init, references, options));
|
|
223
|
+
}
|
|
224
|
+
return statement.type === "ReturnStatement" && !!statement.argument && collectStaticExpressionReferences(statement.argument, references, options);
|
|
225
|
+
});
|
|
226
|
+
};
|
|
227
|
+
export const collectStaticExpressionReferences = (expr, references, options = {}) => {
|
|
228
|
+
const unwrapped = unwrapExpression(expr);
|
|
229
|
+
if (isSafeLiteral(unwrapped)) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
if (unwrapped.type === "Identifier") {
|
|
233
|
+
references.add(unwrapped.name);
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
if (unwrapped.type === "TemplateLiteral") {
|
|
237
|
+
return unwrapped.expressions.every((item) => collectStaticExpressionReferences(item, references, options));
|
|
238
|
+
}
|
|
239
|
+
if (unwrapped.type === "UnaryExpression") {
|
|
240
|
+
return collectStaticExpressionReferences(unwrapped.argument, references, options);
|
|
241
|
+
}
|
|
242
|
+
if (unwrapped.type === "BinaryExpression" || unwrapped.type === "LogicalExpression") {
|
|
243
|
+
return collectStaticExpressionReferences(unwrapped.left, references, options) && collectStaticExpressionReferences(unwrapped.right, references, options);
|
|
244
|
+
}
|
|
245
|
+
if (unwrapped.type === "ConditionalExpression") {
|
|
246
|
+
return collectStaticExpressionReferences(unwrapped.test, references, options) && collectStaticExpressionReferences(unwrapped.consequent, references, options) && collectStaticExpressionReferences(unwrapped.alternate, references, options);
|
|
247
|
+
}
|
|
248
|
+
if (unwrapped.type === "MemberExpression") {
|
|
249
|
+
if (isProcessEnvMember(unwrapped) || isProcessEnvMember(unwrapped.object)) {
|
|
250
|
+
// process.env / process.env.X is an opaque build-time global —
|
|
251
|
+
// don't treat `process` as an unresolved local reference.
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
return collectStaticExpressionReferences(unwrapped.object, references, options) && (!unwrapped.computed || collectStaticExpressionReferences(unwrapped.property, references, options));
|
|
255
|
+
}
|
|
256
|
+
if (options.allowMetadataCalls && unwrapped.type === "CallExpression") {
|
|
257
|
+
if (unwrapped.callee.type !== "Identifier" || unwrapped.arguments.length !== 0) {
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
references.add(unwrapped.callee.name);
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
if (unwrapped.type === "CallExpression" && options.staticHelperLocals && unwrapped.callee.type === "Identifier" && options.staticHelperLocals.has(unwrapped.callee.name)) {
|
|
264
|
+
references.add(unwrapped.callee.name);
|
|
265
|
+
return unwrapped.arguments.every((argument) => argument.type === "SpreadElement" ? collectStaticExpressionReferences(argument.argument, references, options) : collectStaticExpressionReferences(argument, references, options));
|
|
266
|
+
}
|
|
267
|
+
if (options.allowMetadataCalls && (unwrapped.type === "ArrowFunctionExpression" || unwrapped.type === "FunctionExpression")) {
|
|
268
|
+
if (unwrapped.async || unwrapped.params.length !== 0) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
return !!unwrapped.body && collectStaticFunctionBodyReferences(unwrapped.body, references, options);
|
|
272
|
+
}
|
|
273
|
+
if (unwrapped.type === "ArrayExpression") {
|
|
274
|
+
return unwrapped.elements.every((item) => {
|
|
275
|
+
if (!item) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
return item.type === "SpreadElement" ? collectStaticExpressionReferences(item.argument, references, options) : collectStaticExpressionReferences(item, references, options);
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
if (unwrapped.type === "ObjectExpression") {
|
|
282
|
+
return unwrapped.properties.every((property) => {
|
|
283
|
+
if (property.type === "SpreadElement") {
|
|
284
|
+
return collectStaticExpressionReferences(property.argument, references, options);
|
|
285
|
+
}
|
|
286
|
+
const propertyNode = property;
|
|
287
|
+
if (!propertyNode.value || typeof propertyNode.value !== "object") {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
if (propertyNode.computed && (!propertyNode.key || typeof propertyNode.key !== "object" || !collectStaticExpressionReferences(propertyNode.key, references, options))) {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
return collectStaticExpressionReferences(propertyNode.value, references, options);
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
return false;
|
|
297
|
+
};
|
|
298
|
+
//# sourceMappingURL=staticExpression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/staticExpression.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport type {\n Expression,\n ImportDeclaration,\n ImportSpecifier,\n ModuleExportName,\n Node,\n Program,\n} from 'oxc-parser';\n\nimport { createOxcStaticCallableValue } from '../../../utils/collectOxcTemplateDependencies';\nimport { getOxcNodeChildren } from '../../../utils/oxc/ast';\nimport { parseProgram } from './environment';\nimport type {\n AnyNode,\n CollectImportBindingsOptions,\n ImportBinding,\n StaticExportResult,\n StaticExpressionOptions,\n} from './types';\n\nexport const moduleExportName = (node: ModuleExportName): string =>\n node.type === 'Literal' ? String(node.value) : node.name;\n\nexport const unwrapExpression = (expr: Node): Node => {\n let current = expr;\n\n for (;;) {\n if (\n current.type === 'TSAsExpression' ||\n current.type === 'TSSatisfiesExpression' ||\n current.type === 'TSNonNullExpression' ||\n current.type === 'TSInstantiationExpression' ||\n current.type === 'TSTypeAssertion' ||\n current.type === 'ParenthesizedExpression'\n ) {\n current = current.expression;\n continue;\n }\n\n return current;\n }\n};\n\nexport const isProcessEnvMember = (node: Node): boolean => {\n if (node.type !== 'MemberExpression' || node.computed) {\n return false;\n }\n\n if (node.property.type !== 'Identifier' || node.property.name !== 'env') {\n return false;\n }\n\n return node.object.type === 'Identifier' && node.object.name === 'process';\n};\n\nexport const isSafeLiteral = (\n node: Node\n): node is Node & {\n type: 'Literal';\n value: boolean | null | number | string;\n} => {\n if (node.type !== 'Literal') {\n return false;\n }\n\n const { value } = node as AnyNode;\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n );\n};\n\nexport const isSafeStaticExpression = (\n expr: Node,\n options: StaticExpressionOptions = {}\n): boolean => {\n const unwrapped = unwrapExpression(expr);\n\n if (isSafeLiteral(unwrapped)) {\n return true;\n }\n\n if (unwrapped.type === 'Identifier') {\n return true;\n }\n\n if (unwrapped.type === 'TemplateLiteral') {\n return unwrapped.expressions.every((item) =>\n isSafeStaticExpression(item, options)\n );\n }\n\n if (unwrapped.type === 'UnaryExpression') {\n return isSafeStaticExpression(unwrapped.argument, options);\n }\n\n if (\n unwrapped.type === 'BinaryExpression' ||\n unwrapped.type === 'LogicalExpression'\n ) {\n return (\n isSafeStaticExpression(unwrapped.left, options) &&\n isSafeStaticExpression(unwrapped.right, options)\n );\n }\n\n if (unwrapped.type === 'ConditionalExpression') {\n return (\n isSafeStaticExpression(unwrapped.test, options) &&\n isSafeStaticExpression(unwrapped.consequent, options) &&\n isSafeStaticExpression(unwrapped.alternate, options)\n );\n }\n\n if (unwrapped.type === 'MemberExpression') {\n return (\n isSafeStaticExpression(unwrapped.object, options) &&\n (unwrapped.computed\n ? isSafeStaticExpression(unwrapped.property, options)\n : unwrapped.property.type === 'Identifier')\n );\n }\n\n if (options.allowMetadataCalls && unwrapped.type === 'CallExpression') {\n return (\n unwrapped.callee.type === 'Identifier' && unwrapped.arguments.length === 0\n );\n }\n\n if (\n unwrapped.type === 'CallExpression' &&\n options.staticHelperLocals &&\n unwrapped.callee.type === 'Identifier' &&\n options.staticHelperLocals.has(unwrapped.callee.name)\n ) {\n return unwrapped.arguments.every((argument) =>\n argument.type === 'SpreadElement'\n ? isSafeStaticExpression(argument.argument, options)\n : isSafeStaticExpression(argument as Node, options)\n );\n }\n\n if (\n options.allowMetadataCalls &&\n (unwrapped.type === 'ArrowFunctionExpression' ||\n unwrapped.type === 'FunctionExpression')\n ) {\n return (\n !unwrapped.async &&\n unwrapped.params.length === 0 &&\n !!unwrapped.body &&\n isSafeFunctionBodyExpression(unwrapped.body, options)\n );\n }\n\n if (unwrapped.type === 'ArrayExpression') {\n return unwrapped.elements.every((item) => {\n if (!item) {\n return false;\n }\n\n return item.type === 'SpreadElement'\n ? isSafeStaticExpression(item.argument, options)\n : isSafeStaticExpression(item, options);\n });\n }\n\n if (unwrapped.type === 'ObjectExpression') {\n return unwrapped.properties.every((property) => {\n if (property.type === 'SpreadElement') {\n return isSafeStaticExpression(property.argument);\n }\n\n const propertyNode = property as AnyNode;\n if (propertyNode.method) {\n return false;\n }\n\n // Computed keys are admissible as long as the key expression\n // itself is safe-static — the downstream evaluator already folds\n // them against the env. Common shape: `[\\`${imp} &\\`]: { ... }`.\n if (\n propertyNode.computed &&\n (!propertyNode.key ||\n typeof propertyNode.key !== 'object' ||\n !isSafeStaticExpression(propertyNode.key as Node, options))\n ) {\n return false;\n }\n\n return (\n propertyNode.value &&\n typeof propertyNode.value === 'object' &&\n isSafeStaticExpression(propertyNode.value as Node, options)\n );\n });\n }\n\n return false;\n};\n\nexport const isTypeOnlyImport = (statement: ImportDeclaration): boolean => {\n if (statement.importKind === 'type') {\n return true;\n }\n\n return statement.specifiers.every(\n (specifier) =>\n specifier.type === 'ImportSpecifier' &&\n (specifier as ImportSpecifier).importKind === 'type'\n );\n};\n\nexport const getImportBinding = (\n statement: ImportDeclaration,\n specifier: ImportDeclaration['specifiers'][number],\n options: CollectImportBindingsOptions = {}\n): ImportBinding | null => {\n const local = specifier.local?.name;\n if (!local) {\n return null;\n }\n\n if (specifier.type === 'ImportNamespaceSpecifier') {\n return options.includeNamespace\n ? {\n imported: '*',\n local,\n source: statement.source.value,\n }\n : null;\n }\n\n if (specifier.type === 'ImportDefaultSpecifier') {\n return {\n imported: 'default',\n local,\n source: statement.source.value,\n };\n }\n\n if (specifier.type !== 'ImportSpecifier') {\n return null;\n }\n\n if (\n statement.importKind === 'type' ||\n (specifier as ImportSpecifier).importKind === 'type'\n ) {\n return null;\n }\n\n return {\n imported: moduleExportName((specifier as ImportSpecifier).imported),\n local,\n source: statement.source.value,\n };\n};\n\nexport const collectImportBindings = (\n program: Program,\n options: CollectImportBindingsOptions = {}\n): Map<string, ImportBinding> => {\n const result = new Map<string, ImportBinding>();\n\n program.body.forEach((statement) => {\n if (statement.type !== 'ImportDeclaration' || isTypeOnlyImport(statement)) {\n return;\n }\n\n statement.specifiers.forEach((specifier) => {\n const binding = getImportBinding(statement, specifier, options);\n if (binding) {\n result.set(binding.local, binding);\n }\n });\n });\n\n return result;\n};\nexport const parseStaticExpressionSource = (\n source: string,\n filename: string\n): Expression | null => {\n try {\n const program = parseProgram(\n `const __wyw_static_value = ${source};`,\n filename\n );\n const declaration = program.body[0];\n if (declaration?.type !== 'VariableDeclaration') {\n return null;\n }\n\n const [declarator] = declaration.declarations;\n return declarator?.init ?? null;\n } catch {\n return null;\n }\n};\n\nexport const isRuntimeCallbackExpression = (\n expression: Expression | null\n): boolean => {\n const unwrapped = expression ? unwrapExpression(expression) : null;\n return (\n unwrapped?.type === 'ArrowFunctionExpression' ||\n unwrapped?.type === 'FunctionExpression'\n );\n};\n\nexport const runtimeCallbackPlaceholder = (): undefined => undefined;\n\nexport const isIdentifierBindingPosition = (\n node: Node,\n parent: Node | null\n): boolean => {\n if (node.type !== 'Identifier' || !parent) {\n return false;\n }\n\n if (\n (parent.type === 'VariableDeclarator' && parent.id === node) ||\n (parent.type === 'FunctionDeclaration' && parent.id === node) ||\n (parent.type === 'FunctionExpression' && parent.id === node) ||\n (parent.type === 'ClassDeclaration' && parent.id === node) ||\n (parent.type === 'ClassExpression' && parent.id === node)\n ) {\n return true;\n }\n\n if (\n (parent.type === 'ArrowFunctionExpression' ||\n parent.type === 'FunctionDeclaration' ||\n parent.type === 'FunctionExpression') &&\n parent.params.some((param) => param === node)\n ) {\n return true;\n }\n\n return (\n (parent.type === 'ImportSpecifier' && parent.local === node) ||\n (parent.type === 'ImportDefaultSpecifier' && parent.local === node) ||\n (parent.type === 'ImportNamespaceSpecifier' && parent.local === node)\n );\n};\n\nexport const isPropertyKeyOnlyIdentifier = (\n node: Node,\n parent: Node | null\n): boolean =>\n node.type === 'Identifier' &&\n !!parent &&\n ((parent.type === 'MemberExpression' &&\n parent.property === node &&\n !parent.computed) ||\n (parent.type === 'Property' &&\n parent.key === node &&\n !parent.computed &&\n !parent.shorthand));\n\nexport const expressionUsesNameOnlyAsZeroArgCalls = (\n expression: Node,\n name: string\n): boolean => {\n let seen = false;\n let valid = true;\n\n const walk = (node: Node, parent: Node | null): void => {\n if (!valid) {\n return;\n }\n\n if (\n node.type === 'Identifier' &&\n node.name === name &&\n !isIdentifierBindingPosition(node, parent) &&\n !isPropertyKeyOnlyIdentifier(node, parent)\n ) {\n if (\n parent?.type === 'CallExpression' &&\n parent.callee === node &&\n parent.arguments.length === 0\n ) {\n seen = true;\n } else {\n valid = false;\n return;\n }\n }\n\n getOxcNodeChildren(node).forEach((child) => walk(child, node));\n };\n\n walk(expression, null);\n return seen && valid;\n};\n\nexport const bindStaticResolvedValue = (\n env: Map<string, unknown>,\n expression: Node,\n local: string,\n resolved: StaticExportResult,\n options: { wrapNonCallable?: boolean } = {}\n): boolean => {\n if (resolved.callable === 'zero-arg') {\n if (!expressionUsesNameOnlyAsZeroArgCalls(expression, local)) {\n return false;\n }\n\n env.set(local, createOxcStaticCallableValue(resolved.value));\n return true;\n }\n\n env.set(\n local,\n options.wrapNonCallable\n ? createOxcStaticCallableValue(resolved.value)\n : resolved.value\n );\n return true;\n};\nexport const isSafeFunctionBodyExpression = (\n body: Node,\n options: StaticExpressionOptions\n): boolean => {\n if (body.type !== 'BlockStatement') {\n return isSafeStaticExpression(body, options);\n }\n\n return body.body.every((statement) => {\n if (statement.type === 'VariableDeclaration') {\n return (\n statement.kind === 'const' &&\n statement.declarations.every(\n (declarator) =>\n declarator.init &&\n declarator.id.type === 'Identifier' &&\n isSafeStaticExpression(declarator.init, options)\n )\n );\n }\n\n return (\n statement.type === 'ReturnStatement' &&\n !!statement.argument &&\n isSafeStaticExpression(statement.argument, options)\n );\n });\n};\n\nexport const collectStaticFunctionBodyReferences = (\n body: Node,\n references: Set<string>,\n options: StaticExpressionOptions\n): boolean => {\n if (body.type !== 'BlockStatement') {\n return collectStaticExpressionReferences(body, references, options);\n }\n\n return body.body.every((statement) => {\n if (statement.type === 'VariableDeclaration') {\n return (\n statement.kind === 'const' &&\n statement.declarations.every(\n (declarator) =>\n declarator.init &&\n declarator.id.type === 'Identifier' &&\n collectStaticExpressionReferences(\n declarator.init,\n references,\n options\n )\n )\n );\n }\n\n return (\n statement.type === 'ReturnStatement' &&\n !!statement.argument &&\n collectStaticExpressionReferences(statement.argument, references, options)\n );\n });\n};\n\nexport const collectStaticExpressionReferences = (\n expr: Node,\n references: Set<string>,\n options: StaticExpressionOptions = {}\n): boolean => {\n const unwrapped = unwrapExpression(expr);\n\n if (isSafeLiteral(unwrapped)) {\n return true;\n }\n\n if (unwrapped.type === 'Identifier') {\n references.add(unwrapped.name);\n return true;\n }\n\n if (unwrapped.type === 'TemplateLiteral') {\n return unwrapped.expressions.every((item) =>\n collectStaticExpressionReferences(item, references, options)\n );\n }\n\n if (unwrapped.type === 'UnaryExpression') {\n return collectStaticExpressionReferences(\n unwrapped.argument,\n references,\n options\n );\n }\n\n if (\n unwrapped.type === 'BinaryExpression' ||\n unwrapped.type === 'LogicalExpression'\n ) {\n return (\n collectStaticExpressionReferences(unwrapped.left, references, options) &&\n collectStaticExpressionReferences(unwrapped.right, references, options)\n );\n }\n\n if (unwrapped.type === 'ConditionalExpression') {\n return (\n collectStaticExpressionReferences(unwrapped.test, references, options) &&\n collectStaticExpressionReferences(\n unwrapped.consequent,\n references,\n options\n ) &&\n collectStaticExpressionReferences(\n unwrapped.alternate,\n references,\n options\n )\n );\n }\n\n if (unwrapped.type === 'MemberExpression') {\n if (isProcessEnvMember(unwrapped) || isProcessEnvMember(unwrapped.object)) {\n // process.env / process.env.X is an opaque build-time global —\n // don't treat `process` as an unresolved local reference.\n return true;\n }\n\n return (\n collectStaticExpressionReferences(\n unwrapped.object,\n references,\n options\n ) &&\n (!unwrapped.computed ||\n collectStaticExpressionReferences(\n unwrapped.property,\n references,\n options\n ))\n );\n }\n\n if (options.allowMetadataCalls && unwrapped.type === 'CallExpression') {\n if (\n unwrapped.callee.type !== 'Identifier' ||\n unwrapped.arguments.length !== 0\n ) {\n return false;\n }\n\n references.add(unwrapped.callee.name);\n return true;\n }\n\n if (\n unwrapped.type === 'CallExpression' &&\n options.staticHelperLocals &&\n unwrapped.callee.type === 'Identifier' &&\n options.staticHelperLocals.has(unwrapped.callee.name)\n ) {\n references.add(unwrapped.callee.name);\n return unwrapped.arguments.every((argument) =>\n argument.type === 'SpreadElement'\n ? collectStaticExpressionReferences(\n argument.argument,\n references,\n options\n )\n : collectStaticExpressionReferences(\n argument as Node,\n references,\n options\n )\n );\n }\n\n if (\n options.allowMetadataCalls &&\n (unwrapped.type === 'ArrowFunctionExpression' ||\n unwrapped.type === 'FunctionExpression')\n ) {\n if (unwrapped.async || unwrapped.params.length !== 0) {\n return false;\n }\n\n return (\n !!unwrapped.body &&\n collectStaticFunctionBodyReferences(unwrapped.body, references, options)\n );\n }\n\n if (unwrapped.type === 'ArrayExpression') {\n return unwrapped.elements.every((item) => {\n if (!item) {\n return false;\n }\n\n return item.type === 'SpreadElement'\n ? collectStaticExpressionReferences(item.argument, references, options)\n : collectStaticExpressionReferences(item, references, options);\n });\n }\n\n if (unwrapped.type === 'ObjectExpression') {\n return unwrapped.properties.every((property) => {\n if (property.type === 'SpreadElement') {\n return collectStaticExpressionReferences(\n property.argument,\n references,\n options\n );\n }\n\n const propertyNode = property as AnyNode;\n if (!propertyNode.value || typeof propertyNode.value !== 'object') {\n return false;\n }\n\n if (\n propertyNode.computed &&\n (!propertyNode.key ||\n typeof propertyNode.key !== 'object' ||\n !collectStaticExpressionReferences(\n propertyNode.key as Node,\n references,\n options\n ))\n ) {\n return false;\n }\n\n return collectStaticExpressionReferences(\n propertyNode.value as Node,\n references,\n options\n );\n });\n }\n\n return false;\n};\n"],"file":"staticExpression.js"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { collectLocalConstExpressions } from "./programAnalysis.js";
|
|
2
|
+
import { collectImportBindings, collectStaticExpressionReferences, isSafeLiteral, isSafeStaticExpression, unwrapExpression } from "./staticExpression.js";
|
|
3
|
+
export const mutatingMethodNames = new Set([
|
|
4
|
+
"add",
|
|
5
|
+
"clear",
|
|
6
|
+
"copyWithin",
|
|
7
|
+
"delete",
|
|
8
|
+
"fill",
|
|
9
|
+
"pop",
|
|
10
|
+
"push",
|
|
11
|
+
"reverse",
|
|
12
|
+
"set",
|
|
13
|
+
"shift",
|
|
14
|
+
"sort",
|
|
15
|
+
"splice",
|
|
16
|
+
"unshift"
|
|
17
|
+
]);
|
|
18
|
+
export const rootIdentifierName = (expr) => {
|
|
19
|
+
const unwrapped = unwrapExpression(expr);
|
|
20
|
+
if (unwrapped.type === "Identifier") {
|
|
21
|
+
return unwrapped.name;
|
|
22
|
+
}
|
|
23
|
+
if (unwrapped.type === "MemberExpression") {
|
|
24
|
+
return rootIdentifierName(unwrapped.object);
|
|
25
|
+
}
|
|
26
|
+
if (unwrapped.type === "ChainExpression") {
|
|
27
|
+
return rootIdentifierName(unwrapped.expression);
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
};
|
|
31
|
+
export const staticMemberName = (expr) => {
|
|
32
|
+
const unwrapped = unwrapExpression(expr);
|
|
33
|
+
if (unwrapped.type === "Identifier") {
|
|
34
|
+
return unwrapped.name;
|
|
35
|
+
}
|
|
36
|
+
if (isSafeLiteral(unwrapped) && typeof unwrapped.value === "string") {
|
|
37
|
+
return unwrapped.value;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
};
|
|
41
|
+
export const expressionMayProduceMutableValue = (expr, locals, visiting) => {
|
|
42
|
+
const unwrapped = unwrapExpression(expr);
|
|
43
|
+
if (unwrapped.type === "ObjectExpression" || unwrapped.type === "ArrayExpression") {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
if (unwrapped.type === "Identifier") {
|
|
47
|
+
const local = locals.get(unwrapped.name);
|
|
48
|
+
if (!local || visiting.has(unwrapped.name)) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
visiting.add(unwrapped.name);
|
|
52
|
+
const result = expressionMayProduceMutableValue(local, locals, visiting);
|
|
53
|
+
visiting.delete(unwrapped.name);
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
if (unwrapped.type === "ConditionalExpression") {
|
|
57
|
+
return expressionMayProduceMutableValue(unwrapped.consequent, locals, visiting) || expressionMayProduceMutableValue(unwrapped.alternate, locals, visiting);
|
|
58
|
+
}
|
|
59
|
+
if (unwrapped.type === "LogicalExpression" || unwrapped.type === "MemberExpression") {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
};
|
|
64
|
+
export const collectExpressionMutationHints = (expr, mutatedNames, callArgumentNames) => {
|
|
65
|
+
const unwrapped = unwrapExpression(expr);
|
|
66
|
+
if (unwrapped.type === "AssignmentExpression") {
|
|
67
|
+
const rootName = rootIdentifierName(unwrapped.left);
|
|
68
|
+
if (rootName) {
|
|
69
|
+
mutatedNames.add(rootName);
|
|
70
|
+
}
|
|
71
|
+
collectExpressionMutationHints(unwrapped.right, mutatedNames, callArgumentNames);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (unwrapped.type === "UpdateExpression") {
|
|
75
|
+
const rootName = rootIdentifierName(unwrapped.argument);
|
|
76
|
+
if (rootName) {
|
|
77
|
+
mutatedNames.add(rootName);
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (unwrapped.type === "UnaryExpression") {
|
|
82
|
+
if (unwrapped.operator === "delete") {
|
|
83
|
+
const rootName = rootIdentifierName(unwrapped.argument);
|
|
84
|
+
if (rootName) {
|
|
85
|
+
mutatedNames.add(rootName);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
collectExpressionMutationHints(unwrapped.argument, mutatedNames, callArgumentNames);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (unwrapped.type === "CallExpression") {
|
|
92
|
+
const callee = unwrapExpression(unwrapped.callee);
|
|
93
|
+
if (callee.type === "MemberExpression") {
|
|
94
|
+
const methodName = staticMemberName(callee.property);
|
|
95
|
+
const rootName = rootIdentifierName(callee.object);
|
|
96
|
+
if (rootName && methodName && mutatingMethodNames.has(methodName)) {
|
|
97
|
+
mutatedNames.add(rootName);
|
|
98
|
+
}
|
|
99
|
+
collectExpressionMutationHints(callee.object, mutatedNames, callArgumentNames);
|
|
100
|
+
if (callee.computed) {
|
|
101
|
+
collectExpressionMutationHints(callee.property, mutatedNames, callArgumentNames);
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
collectExpressionMutationHints(unwrapped.callee, mutatedNames, callArgumentNames);
|
|
105
|
+
}
|
|
106
|
+
unwrapped.arguments.forEach((argument) => {
|
|
107
|
+
const argumentNode = argument.type === "SpreadElement" ? argument.argument : argument;
|
|
108
|
+
const rootName = rootIdentifierName(argumentNode);
|
|
109
|
+
if (rootName) {
|
|
110
|
+
callArgumentNames.add(rootName);
|
|
111
|
+
}
|
|
112
|
+
collectExpressionMutationHints(argumentNode, mutatedNames, callArgumentNames);
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (unwrapped.type === "TaggedTemplateExpression") {
|
|
117
|
+
collectExpressionMutationHints(unwrapped.tag, mutatedNames, callArgumentNames);
|
|
118
|
+
unwrapped.quasi.expressions.forEach((item) => collectExpressionMutationHints(item, mutatedNames, callArgumentNames));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (unwrapped.type === "ConditionalExpression") {
|
|
122
|
+
collectExpressionMutationHints(unwrapped.test, mutatedNames, callArgumentNames);
|
|
123
|
+
collectExpressionMutationHints(unwrapped.consequent, mutatedNames, callArgumentNames);
|
|
124
|
+
collectExpressionMutationHints(unwrapped.alternate, mutatedNames, callArgumentNames);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (unwrapped.type === "BinaryExpression" || unwrapped.type === "LogicalExpression") {
|
|
128
|
+
collectExpressionMutationHints(unwrapped.left, mutatedNames, callArgumentNames);
|
|
129
|
+
collectExpressionMutationHints(unwrapped.right, mutatedNames, callArgumentNames);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (unwrapped.type === "MemberExpression") {
|
|
133
|
+
collectExpressionMutationHints(unwrapped.object, mutatedNames, callArgumentNames);
|
|
134
|
+
if (unwrapped.computed) {
|
|
135
|
+
collectExpressionMutationHints(unwrapped.property, mutatedNames, callArgumentNames);
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (unwrapped.type === "ArrayExpression") {
|
|
140
|
+
unwrapped.elements.forEach((item) => {
|
|
141
|
+
if (!item) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
collectExpressionMutationHints(item.type === "SpreadElement" ? item.argument : item, mutatedNames, callArgumentNames);
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (unwrapped.type === "ObjectExpression") {
|
|
149
|
+
unwrapped.properties.forEach((property) => {
|
|
150
|
+
if (property.type === "SpreadElement") {
|
|
151
|
+
collectExpressionMutationHints(property.argument, mutatedNames, callArgumentNames);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const propertyNode = property;
|
|
155
|
+
if (propertyNode.computed && propertyNode.key) {
|
|
156
|
+
collectExpressionMutationHints(propertyNode.key, mutatedNames, callArgumentNames);
|
|
157
|
+
}
|
|
158
|
+
if (propertyNode.value && typeof propertyNode.value === "object") {
|
|
159
|
+
collectExpressionMutationHints(propertyNode.value, mutatedNames, callArgumentNames);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
export const collectTopLevelMutationHints = (program, closureNames = null) => {
|
|
165
|
+
const callArgumentNames = new Set();
|
|
166
|
+
const mutatedNames = new Set();
|
|
167
|
+
const collectDeclaration = (declaration) => {
|
|
168
|
+
declaration.declarations.forEach((declarator) => {
|
|
169
|
+
if (closureNames) {
|
|
170
|
+
const declaredName = declarator.id.type === "Identifier" ? declarator.id.name : null;
|
|
171
|
+
if (!declaredName || !closureNames.has(declaredName)) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (declarator.init) {
|
|
176
|
+
collectExpressionMutationHints(declarator.init, mutatedNames, callArgumentNames);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
program.body.forEach((statement) => {
|
|
181
|
+
if (statement.type === "VariableDeclaration") {
|
|
182
|
+
collectDeclaration(statement);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (statement.type === "ExpressionStatement") {
|
|
186
|
+
collectExpressionMutationHints(statement.expression, mutatedNames, callArgumentNames);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (statement.type === "ExportNamedDeclaration") {
|
|
190
|
+
if (statement.declaration?.type === "VariableDeclaration") {
|
|
191
|
+
collectDeclaration(statement.declaration);
|
|
192
|
+
}
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (statement.type === "ExportDefaultDeclaration") {
|
|
196
|
+
if (statement.declaration.type !== "FunctionDeclaration" && statement.declaration.type !== "ClassDeclaration") {
|
|
197
|
+
collectExpressionMutationHints(statement.declaration, mutatedNames, callArgumentNames);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
return {
|
|
202
|
+
callArgumentNames,
|
|
203
|
+
mutatedNames
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
export const collectStaticExpressionDependencies = (program, target, options = {}) => {
|
|
207
|
+
const imports = collectImportBindings(program);
|
|
208
|
+
const locals = collectLocalConstExpressions(program);
|
|
209
|
+
const collectedImports = new Map();
|
|
210
|
+
const referencedNames = new Set();
|
|
211
|
+
const mutableReferencedNames = new Set();
|
|
212
|
+
const visitedLocals = new Set();
|
|
213
|
+
const visitingLocals = new Set();
|
|
214
|
+
const markMutable = (name, expression) => {
|
|
215
|
+
if (expressionMayProduceMutableValue(expression, locals, new Set())) {
|
|
216
|
+
mutableReferencedNames.add(name);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
const collectLocal = (name) => {
|
|
220
|
+
// Pre-resolved locals (e.g. `const x = css\`\``) have a known value
|
|
221
|
+
// (the className string). Skip walking their init — its
|
|
222
|
+
// TaggedTemplateExpression isn't safe-static by itself, but the
|
|
223
|
+
// value is already determined.
|
|
224
|
+
if (options.preResolvedLocals?.has(name)) {
|
|
225
|
+
referencedNames.add(name);
|
|
226
|
+
visitedLocals.add(name);
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
const expression = locals.get(name);
|
|
230
|
+
if (!expression || visitingLocals.has(name)) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
referencedNames.add(name);
|
|
234
|
+
markMutable(name, expression);
|
|
235
|
+
if (visitedLocals.has(name)) {
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
visitingLocals.add(name);
|
|
239
|
+
const result = collectExpression(expression);
|
|
240
|
+
visitingLocals.delete(name);
|
|
241
|
+
if (result) {
|
|
242
|
+
visitedLocals.add(name);
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
};
|
|
246
|
+
const collectExpression = (expr) => {
|
|
247
|
+
if (!isSafeStaticExpression(expr, options)) {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
const references = new Set();
|
|
251
|
+
if (!collectStaticExpressionReferences(expr, references, options)) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
for (const reference of references) {
|
|
255
|
+
referencedNames.add(reference);
|
|
256
|
+
const importBinding = imports.get(reference);
|
|
257
|
+
if (importBinding) {
|
|
258
|
+
collectedImports.set(`${importBinding.source}\0${importBinding.imported}\0${importBinding.local}`, importBinding);
|
|
259
|
+
mutableReferencedNames.add(reference);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (!collectLocal(reference)) {
|
|
263
|
+
// Unknown identifier — neither an import nor a same-file local.
|
|
264
|
+
// Common case: undeclared globals like __DEV__ used in
|
|
265
|
+
// `typeof __DEV__ !== "undefined"` short-circuit guards. The
|
|
266
|
+
// evaluator returns undefined for unknowns, which the outer
|
|
267
|
+
// expression's logical short-circuits handle correctly. Don't
|
|
268
|
+
// reject the whole walk upfront — let the evaluator decide.
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return true;
|
|
273
|
+
};
|
|
274
|
+
if (target.localName) {
|
|
275
|
+
referencedNames.add(target.localName);
|
|
276
|
+
markMutable(target.localName, target.expression);
|
|
277
|
+
}
|
|
278
|
+
if (!collectExpression(target.expression)) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
const closureNames = new Set(referencedNames);
|
|
282
|
+
if (target.localName) {
|
|
283
|
+
closureNames.add(target.localName);
|
|
284
|
+
}
|
|
285
|
+
const mutationHints = collectTopLevelMutationHints(program, closureNames);
|
|
286
|
+
for (const name of referencedNames) {
|
|
287
|
+
if (mutationHints.mutatedNames.has(name)) {
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
for (const name of mutableReferencedNames) {
|
|
292
|
+
if (mutationHints.callArgumentNames.has(name) && !options.ignoredMutableCallArgumentNames?.has(name)) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return { imports: [...collectedImports.values()] };
|
|
297
|
+
};
|
|
298
|
+
//# sourceMappingURL=staticExpressionDependencies.js.map
|