@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,9 @@
|
|
|
1
|
+
import type { ExpressionValue } from '@wyw-in-js/shared';
|
|
2
|
+
import type { Node, Program } from 'oxc-parser';
|
|
3
|
+
import type { OxcStaticValue } from '../collectOxcTemplateDependencies';
|
|
4
|
+
import type { AnyNode } from './types';
|
|
5
|
+
export declare const getPropertyKeyName: (property: AnyNode, code: string) => string | null;
|
|
6
|
+
export declare const getDisplayName: (ancestors: Node[], idx: number, code: string, filename?: string | null) => string;
|
|
7
|
+
export declare const getTagOwner: (ancestors: Node[]) => AnyNode | null;
|
|
8
|
+
export declare const isTagReferenced: (program: Program, ancestors: Node[]) => boolean;
|
|
9
|
+
export declare const collectSameFileProcessorStaticValues: (expressionValues: Omit<ExpressionValue, "buildCodeFrameError">[], processorStaticValuesByLocal: Map<string, unknown>) => OxcStaticValue[];
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax */
|
|
2
|
+
import { basename, dirname } from 'path';
|
|
3
|
+
import { ValueType } from '@wyw-in-js/shared';
|
|
4
|
+
import { isOxcNode, walkOxc } from '../oxc/ast';
|
|
5
|
+
import { isNodeReference } from './cleanupBindings';
|
|
6
|
+
export const getPropertyKeyName = (property, code) => {
|
|
7
|
+
const { key } = property;
|
|
8
|
+
if (!isOxcNode(key)) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
if (key.type === 'Identifier') {
|
|
12
|
+
return key.name;
|
|
13
|
+
}
|
|
14
|
+
if (key.type === 'Literal') {
|
|
15
|
+
return String(key.value);
|
|
16
|
+
}
|
|
17
|
+
return typeof key.start === 'number' && typeof key.end === 'number'
|
|
18
|
+
? code.slice(key.start, key.end)
|
|
19
|
+
: null;
|
|
20
|
+
};
|
|
21
|
+
export const getDisplayName = (ancestors, idx, code, filename) => {
|
|
22
|
+
const owner = [...ancestors].reverse().find((node) => {
|
|
23
|
+
return (node.type === 'Property' ||
|
|
24
|
+
node.type === 'JSXOpeningElement' ||
|
|
25
|
+
node.type === 'VariableDeclarator');
|
|
26
|
+
});
|
|
27
|
+
if (owner?.type === 'Property') {
|
|
28
|
+
const keyName = getPropertyKeyName(owner, code);
|
|
29
|
+
if (keyName) {
|
|
30
|
+
return keyName;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (owner?.type === 'JSXOpeningElement') {
|
|
34
|
+
const { name } = owner;
|
|
35
|
+
if (isOxcNode(name) && name.type === 'JSXIdentifier') {
|
|
36
|
+
return name.name;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else if (owner?.type === 'VariableDeclarator') {
|
|
40
|
+
const { id } = owner;
|
|
41
|
+
if (isOxcNode(id) && id.type === 'Identifier') {
|
|
42
|
+
return id.name;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
let displayName = basename(filename ?? 'unknown').replace(/\.[a-z\d]+$/, '');
|
|
46
|
+
if (filename && /^index\.[a-z\d]+$/.test(basename(filename))) {
|
|
47
|
+
displayName = basename(dirname(filename));
|
|
48
|
+
}
|
|
49
|
+
if (!displayName) {
|
|
50
|
+
throw new Error("Couldn't determine a name for the component. Ensure that it's either:\n" +
|
|
51
|
+
'- Assigned to a variable\n' +
|
|
52
|
+
'- Is an object property\n' +
|
|
53
|
+
'- Is a prop in a JSX element\n');
|
|
54
|
+
}
|
|
55
|
+
return `${displayName}${idx}`;
|
|
56
|
+
};
|
|
57
|
+
export const getTagOwner = (ancestors) => {
|
|
58
|
+
const owner = [...ancestors]
|
|
59
|
+
.reverse()
|
|
60
|
+
.find((node) => node.type === 'Property' ||
|
|
61
|
+
node.type === 'JSXOpeningElement' ||
|
|
62
|
+
node.type === 'VariableDeclarator');
|
|
63
|
+
return owner ?? null;
|
|
64
|
+
};
|
|
65
|
+
export const isTagReferenced = (program, ancestors) => {
|
|
66
|
+
const owner = getTagOwner(ancestors);
|
|
67
|
+
if (owner?.type !== 'VariableDeclarator') {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
const { id } = owner;
|
|
71
|
+
if (!isOxcNode(id) || id.type !== 'Identifier') {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
if (ancestors.some((node) => node.type === 'ExportNamedDeclaration')) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
let referenced = false;
|
|
78
|
+
walkOxc(program, (node, parent) => {
|
|
79
|
+
const referenceName = node.type === 'Identifier' || node.type === 'JSXIdentifier'
|
|
80
|
+
? node.name
|
|
81
|
+
: null;
|
|
82
|
+
if (referenced ||
|
|
83
|
+
referenceName !== id.name ||
|
|
84
|
+
(node.type === 'Identifier' &&
|
|
85
|
+
node.start === id.start &&
|
|
86
|
+
node.end === id.end)) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
referenced = isNodeReference(node, parent);
|
|
90
|
+
});
|
|
91
|
+
return referenced;
|
|
92
|
+
};
|
|
93
|
+
export const collectSameFileProcessorStaticValues = (expressionValues, processorStaticValuesByLocal) => {
|
|
94
|
+
const staticValues = [];
|
|
95
|
+
const seen = new Set();
|
|
96
|
+
expressionValues.forEach((value) => {
|
|
97
|
+
if (value.kind !== ValueType.LAZY) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const staticValue = processorStaticValuesByLocal.get(value.source);
|
|
101
|
+
if (staticValue === undefined ||
|
|
102
|
+
value.ex.type !== 'Identifier' ||
|
|
103
|
+
seen.has(value.ex.name)) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
seen.add(value.ex.name);
|
|
107
|
+
staticValues.push({
|
|
108
|
+
name: value.ex.name,
|
|
109
|
+
value: staticValue,
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
return staticValues;
|
|
113
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Param, Params, SourceLocation } from '@wyw-in-js/processor-utils';
|
|
2
|
+
import type { ExpressionValue } from '@wyw-in-js/shared';
|
|
3
|
+
import type { Expression, TaggedTemplateExpression } from 'oxc-parser';
|
|
4
|
+
import type { LocationLookup, ProcessorUsage } from './types';
|
|
5
|
+
export declare const literalExpressionValue: (expression: Expression, code: string, source: string, location: SourceLocation) => ExpressionValue | null;
|
|
6
|
+
export declare const expressionValue: (expression: Expression, code: string, loc: LocationLookup, filename?: string | null) => ExpressionValue;
|
|
7
|
+
export declare const withCurrentExpressionLocation: (value: ExpressionValue, expression: Expression, loc: LocationLookup, filename?: string | null) => ExpressionValue;
|
|
8
|
+
export declare const shiftExpressionValue: (expressionValues: ExpressionValue[], expression: Expression, code: string, loc: LocationLookup, filename?: string | null) => ExpressionValue;
|
|
9
|
+
export declare const zipTemplate: (template: TaggedTemplateExpression, code: string, loc: LocationLookup, filename: string | null | undefined, expressionValues: ExpressionValue[]) => Param;
|
|
10
|
+
export declare const buildCalleeParams: (node: Expression, code: string, loc: LocationLookup, filename: string | null | undefined, expressionValues: ExpressionValue[], collapseQualifiedCallee?: boolean) => Params | null;
|
|
11
|
+
export declare const buildParams: (usage: ProcessorUsage, code: string, loc: LocationLookup, filename: string | null | undefined, expressionValues: ExpressionValue[], collapseQualifiedCallee: boolean) => Params | null;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { ValueType } from '@wyw-in-js/shared';
|
|
2
|
+
import { isNotNull } from '../isNotNull';
|
|
3
|
+
import { buildOxcCodeFrameError } from '../oxc/sourceLocations';
|
|
4
|
+
import { getMemberName, unwrapQualifiedExpression } from './processorUsages';
|
|
5
|
+
import { GENERATED_HELPER_NAME_RE, getSourceLocation } from './shared';
|
|
6
|
+
export const literalExpressionValue = (expression, code, source, location) => {
|
|
7
|
+
if (expression.type !== 'Literal') {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
if (expression.value === null ||
|
|
11
|
+
typeof expression.value === 'string' ||
|
|
12
|
+
typeof expression.value === 'number' ||
|
|
13
|
+
typeof expression.value === 'boolean') {
|
|
14
|
+
let type;
|
|
15
|
+
if (expression.value === null) {
|
|
16
|
+
type = 'NullLiteral';
|
|
17
|
+
}
|
|
18
|
+
else if (typeof expression.value === 'string') {
|
|
19
|
+
type = 'StringLiteral';
|
|
20
|
+
}
|
|
21
|
+
else if (typeof expression.value === 'number') {
|
|
22
|
+
type = 'NumericLiteral';
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
type = 'BooleanLiteral';
|
|
26
|
+
}
|
|
27
|
+
const ex = expression.value === null
|
|
28
|
+
? { loc: location, type }
|
|
29
|
+
: {
|
|
30
|
+
loc: location,
|
|
31
|
+
type,
|
|
32
|
+
value: expression.value,
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
buildCodeFrameError: (message) => buildOxcCodeFrameError(code, location, message),
|
|
36
|
+
ex,
|
|
37
|
+
kind: ValueType.CONST,
|
|
38
|
+
source,
|
|
39
|
+
value: expression.value,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
};
|
|
44
|
+
export const expressionValue = (expression, code, loc, filename) => {
|
|
45
|
+
const source = code.slice(expression.start, expression.end);
|
|
46
|
+
const location = getSourceLocation(expression.start, expression.end, loc, filename);
|
|
47
|
+
const literal = literalExpressionValue(expression, code, source, location);
|
|
48
|
+
if (literal) {
|
|
49
|
+
return literal;
|
|
50
|
+
}
|
|
51
|
+
const helperCallName = expression.type === 'CallExpression' &&
|
|
52
|
+
expression.arguments.length === 0 &&
|
|
53
|
+
expression.callee.type === 'Identifier' &&
|
|
54
|
+
GENERATED_HELPER_NAME_RE.test(expression.callee.name)
|
|
55
|
+
? expression.callee.name
|
|
56
|
+
: null;
|
|
57
|
+
let ex;
|
|
58
|
+
if (expression.type === 'Identifier') {
|
|
59
|
+
ex = { loc: location, name: expression.name, type: 'Identifier' };
|
|
60
|
+
}
|
|
61
|
+
else if (helperCallName) {
|
|
62
|
+
ex = { loc: location, name: helperCallName, type: 'Identifier' };
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
ex = {
|
|
66
|
+
loc: location,
|
|
67
|
+
name: code.slice(expression.start, expression.end),
|
|
68
|
+
type: 'Identifier',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
buildCodeFrameError: (message) => buildOxcCodeFrameError(code, location, message),
|
|
73
|
+
ex,
|
|
74
|
+
kind: expression.type === 'ArrowFunctionExpression' ||
|
|
75
|
+
expression.type === 'FunctionExpression'
|
|
76
|
+
? ValueType.FUNCTION
|
|
77
|
+
: ValueType.LAZY,
|
|
78
|
+
source,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
export const withCurrentExpressionLocation = (value, expression, loc, filename) => {
|
|
82
|
+
const location = getSourceLocation(expression.start, expression.end, loc, filename);
|
|
83
|
+
if (value.kind === ValueType.CONST) {
|
|
84
|
+
return {
|
|
85
|
+
...value,
|
|
86
|
+
ex: {
|
|
87
|
+
...value.ex,
|
|
88
|
+
loc: location,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (value.kind === ValueType.FUNCTION) {
|
|
93
|
+
return {
|
|
94
|
+
...value,
|
|
95
|
+
ex: {
|
|
96
|
+
...value.ex,
|
|
97
|
+
loc: location,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
...value,
|
|
103
|
+
ex: {
|
|
104
|
+
...value.ex,
|
|
105
|
+
loc: location,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
export const shiftExpressionValue = (expressionValues, expression, code, loc, filename) => expressionValues.length > 0
|
|
110
|
+
? withCurrentExpressionLocation(expressionValues.shift(), expression, loc, filename)
|
|
111
|
+
: expressionValue(expression, code, loc, filename);
|
|
112
|
+
export const zipTemplate = (template, code, loc, filename, expressionValues) => {
|
|
113
|
+
const parts = template.quasi.quasis.flatMap((quasi, idx) => {
|
|
114
|
+
const expression = template.quasi.expressions[idx];
|
|
115
|
+
const templateElement = {
|
|
116
|
+
...quasi,
|
|
117
|
+
loc: getSourceLocation(quasi.start, quasi.end, loc, filename),
|
|
118
|
+
};
|
|
119
|
+
return [
|
|
120
|
+
templateElement,
|
|
121
|
+
expression
|
|
122
|
+
? shiftExpressionValue(expressionValues, expression, code, loc, filename)
|
|
123
|
+
: null,
|
|
124
|
+
].filter(isNotNull);
|
|
125
|
+
});
|
|
126
|
+
return ['template', parts];
|
|
127
|
+
};
|
|
128
|
+
export const buildCalleeParams = (node, code, loc, filename, expressionValues, collapseQualifiedCallee = false) => {
|
|
129
|
+
const expression = unwrapQualifiedExpression(node);
|
|
130
|
+
if (collapseQualifiedCallee &&
|
|
131
|
+
(expression.type === 'Identifier' || expression.type === 'MemberExpression')) {
|
|
132
|
+
return [['callee', expression]];
|
|
133
|
+
}
|
|
134
|
+
if (expression.type === 'Identifier') {
|
|
135
|
+
return [['callee', { name: expression.name, type: 'Identifier' }]];
|
|
136
|
+
}
|
|
137
|
+
if (expression.type === 'MemberExpression') {
|
|
138
|
+
const params = buildCalleeParams(expression.object, code, loc, filename, expressionValues, collapseQualifiedCallee);
|
|
139
|
+
const member = getMemberName(expression);
|
|
140
|
+
return params && member ? [...params, ['member', member]] : null;
|
|
141
|
+
}
|
|
142
|
+
if (expression.type === 'CallExpression') {
|
|
143
|
+
const call = expression;
|
|
144
|
+
const params = buildCalleeParams(call.callee, code, loc, filename, expressionValues, collapseQualifiedCallee);
|
|
145
|
+
if (!params) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const callValues = call.arguments
|
|
149
|
+
.filter((arg) => arg.type !== 'SpreadElement')
|
|
150
|
+
.map((arg) => shiftExpressionValue(expressionValues, arg, code, loc, filename));
|
|
151
|
+
return [...params, ['call', ...callValues]];
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
};
|
|
155
|
+
export const buildParams = (usage, code, loc, filename, expressionValues, collapseQualifiedCallee) => {
|
|
156
|
+
const params = buildCalleeParams(usage.callee, code, loc, filename, expressionValues, collapseQualifiedCallee);
|
|
157
|
+
if (!params) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
if (usage.kind === 'template') {
|
|
161
|
+
return [
|
|
162
|
+
...params,
|
|
163
|
+
zipTemplate(usage.target, code, loc, filename, expressionValues),
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
const callValues = usage.target.arguments
|
|
167
|
+
.filter((arg) => arg.type !== 'SpreadElement')
|
|
168
|
+
.map((arg) => shiftExpressionValue(expressionValues, arg, code, loc, filename));
|
|
169
|
+
return [...params, ['call', ...callValues]];
|
|
170
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Expression as ProcessorExpression, IFileContext, Params } from '@wyw-in-js/processor-utils';
|
|
2
|
+
import type { StrictOptions } from '@wyw-in-js/shared';
|
|
3
|
+
import type { Expression, Node } from 'oxc-parser';
|
|
4
|
+
import type { CreatedProcessor, DefinedProcessor, LocationLookup, Replacement } from './types';
|
|
5
|
+
export declare const isReplacementPure: (replacement: ProcessorExpression) => boolean;
|
|
6
|
+
export declare const shouldCollectStaticExpressionValues: (options: Pick<StrictOptions, "eval">) => boolean;
|
|
7
|
+
export declare const createProcessor: (definedProcessor: DefinedProcessor, params: Params, target: Expression, replacementTarget: Expression, ancestors: Node[], fileContext: IFileContext, options: Pick<StrictOptions, "classNameSlug" | "displayName" | "extensions" | "tagResolver">, code: string, loc: LocationLookup, idx: number, isReferenced: boolean, usedNames: Set<string>, replacements: Replacement[]) => CreatedProcessor | null;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { BaseProcessor, expressionToCode } from '@wyw-in-js/processor-utils';
|
|
2
|
+
import { createOxcAstService } from '../oxcAstService';
|
|
3
|
+
import { buildOxcCodeFrameError } from '../oxc/sourceLocations';
|
|
4
|
+
import { getDisplayName } from './displayName';
|
|
5
|
+
import { getRootIdentifier } from './processorUsages';
|
|
6
|
+
import { getSourceLocation } from './shared';
|
|
7
|
+
let didWarnSkipSymbolMismatch = false;
|
|
8
|
+
export const isReplacementPure = (replacement) => replacement.type === 'CallExpression';
|
|
9
|
+
export const shouldCollectStaticExpressionValues = (options) => (options.eval?.strategy ?? 'hybrid') !== 'execute';
|
|
10
|
+
export const createProcessor = (definedProcessor, params, target, replacementTarget, ancestors, fileContext, options, code, loc, idx, isReferenced, usedNames, replacements) => {
|
|
11
|
+
const [Processor, tagSource] = definedProcessor;
|
|
12
|
+
const astService = createOxcAstService(usedNames);
|
|
13
|
+
const replacer = (replacement, isPure) => {
|
|
14
|
+
const next = typeof replacement === 'function' ? replacement(target) : replacement;
|
|
15
|
+
const replacementCode = expressionToCode(next);
|
|
16
|
+
replacements.push({
|
|
17
|
+
start: replacementTarget.start,
|
|
18
|
+
end: replacementTarget.end,
|
|
19
|
+
value: isPure && isReplacementPure(next)
|
|
20
|
+
? `/*#__PURE__*/${replacementCode}`
|
|
21
|
+
: replacementCode,
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
try {
|
|
25
|
+
let displayName;
|
|
26
|
+
try {
|
|
27
|
+
displayName = getDisplayName(ancestors, idx, code, fileContext.filename);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error instanceof Error &&
|
|
31
|
+
error.message.startsWith("Couldn't determine a name for the component")) {
|
|
32
|
+
let displayNameNode = target;
|
|
33
|
+
if (target.type === 'TaggedTemplateExpression') {
|
|
34
|
+
displayNameNode = target.tag;
|
|
35
|
+
}
|
|
36
|
+
else if (target.type === 'CallExpression') {
|
|
37
|
+
displayNameNode = target.callee;
|
|
38
|
+
}
|
|
39
|
+
const pointerNode = displayNameNode.type === 'MemberExpression'
|
|
40
|
+
? getRootIdentifier(displayNameNode) ?? displayNameNode
|
|
41
|
+
: displayNameNode;
|
|
42
|
+
throw buildOxcCodeFrameError(code, getSourceLocation(pointerNode.start, pointerNode.end, loc, fileContext.filename), error.message);
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
astService,
|
|
48
|
+
processor: new Processor(params, tagSource, astService, getSourceLocation(target.start, target.end, loc, fileContext.filename), replacer, displayName, isReferenced, idx, options, fileContext),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
if (e === BaseProcessor.SKIP) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
if (typeof e === 'symbol' &&
|
|
56
|
+
e.description === BaseProcessor.SKIP.description) {
|
|
57
|
+
if (!didWarnSkipSymbolMismatch) {
|
|
58
|
+
didWarnSkipSymbolMismatch = true;
|
|
59
|
+
// eslint-disable-next-line no-console
|
|
60
|
+
console.warn([
|
|
61
|
+
"[wyw-in-js] Processor threw Symbol('skip') that does not match BaseProcessor.SKIP identity.",
|
|
62
|
+
'This usually means duplicate copies of @wyw-in-js/processor-utils (or the processor) are bundled/installed.',
|
|
63
|
+
'Consider deduping dependencies to avoid subtle issues (instanceof checks, sentinels, etc).',
|
|
64
|
+
].join('\n'));
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
throw e;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Expression, MemberExpression, Node, Program } from 'oxc-parser';
|
|
2
|
+
import type { DefinedProcessor, ExpressionSpan, OxcIdentifier, ProcessorUsage } from './types';
|
|
3
|
+
export declare const getMemberName: (node: MemberExpression) => string | null;
|
|
4
|
+
export declare const unwrapQualifiedExpression: (node: Expression) => Expression;
|
|
5
|
+
export declare const getRootIdentifier: (node: Expression) => OxcIdentifier | null;
|
|
6
|
+
export declare const getQualifiedName: (node: Expression) => string | null;
|
|
7
|
+
export declare const resolveDefinedProcessor: (callee: Expression, definedProcessors: Map<string, DefinedProcessor>) => {
|
|
8
|
+
collapseQualifiedCallee: boolean;
|
|
9
|
+
definedProcessor: DefinedProcessor;
|
|
10
|
+
} | null;
|
|
11
|
+
export declare const isCallTagOfTaggedTemplate: (node: Node, parent: Node | null) => boolean;
|
|
12
|
+
export declare const expandReplacementTarget: (target: Expression, ancestors: Node[]) => Expression;
|
|
13
|
+
export declare const collectProcessorUsages: (program: Program, definedProcessors: Map<string, DefinedProcessor>) => ProcessorUsage[];
|
|
14
|
+
export declare const expressionSpan: (expression: Expression) => ExpressionSpan;
|
|
15
|
+
export declare const collectCallArgumentSpans: (node: Expression) => ExpressionSpan[];
|
|
16
|
+
export declare const collectUsageExpressionSpans: (usage: ProcessorUsage) => ExpressionSpan[];
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { getOxcNodeChildren } from '../oxc/ast';
|
|
2
|
+
export const getMemberName = (node) => {
|
|
3
|
+
if (node.computed) {
|
|
4
|
+
return node.property.type === 'Literal' &&
|
|
5
|
+
typeof node.property.value === 'string'
|
|
6
|
+
? node.property.value
|
|
7
|
+
: null;
|
|
8
|
+
}
|
|
9
|
+
return node.property.type === 'Identifier' ? node.property.name : null;
|
|
10
|
+
};
|
|
11
|
+
export const unwrapQualifiedExpression = (node) => {
|
|
12
|
+
if (node.type === 'TSAsExpression' ||
|
|
13
|
+
node.type === 'TSSatisfiesExpression' ||
|
|
14
|
+
node.type === 'TSNonNullExpression' ||
|
|
15
|
+
node.type === 'TSTypeAssertion' ||
|
|
16
|
+
node.type === 'ParenthesizedExpression') {
|
|
17
|
+
return unwrapQualifiedExpression(node.expression);
|
|
18
|
+
}
|
|
19
|
+
if (node.type === 'SequenceExpression') {
|
|
20
|
+
const sequence = node;
|
|
21
|
+
return unwrapQualifiedExpression(sequence.expressions[sequence.expressions.length - 1] ?? node);
|
|
22
|
+
}
|
|
23
|
+
return node;
|
|
24
|
+
};
|
|
25
|
+
export const getRootIdentifier = (node) => {
|
|
26
|
+
const expression = unwrapQualifiedExpression(node);
|
|
27
|
+
if (expression.type === 'Identifier') {
|
|
28
|
+
return expression;
|
|
29
|
+
}
|
|
30
|
+
if (expression.type === 'MemberExpression') {
|
|
31
|
+
return getRootIdentifier(expression.object);
|
|
32
|
+
}
|
|
33
|
+
if (expression.type === 'CallExpression') {
|
|
34
|
+
return getRootIdentifier(expression.callee);
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
};
|
|
38
|
+
export const getQualifiedName = (node) => {
|
|
39
|
+
const expression = unwrapQualifiedExpression(node);
|
|
40
|
+
if (expression.type === 'Identifier') {
|
|
41
|
+
return expression.name;
|
|
42
|
+
}
|
|
43
|
+
if (expression.type === 'MemberExpression') {
|
|
44
|
+
const object = getQualifiedName(expression.object);
|
|
45
|
+
const member = getMemberName(expression);
|
|
46
|
+
return object && member ? `${object}.${member}` : null;
|
|
47
|
+
}
|
|
48
|
+
if (expression.type === 'CallExpression') {
|
|
49
|
+
return getQualifiedName(expression.callee);
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
};
|
|
53
|
+
export const resolveDefinedProcessor = (callee, definedProcessors) => {
|
|
54
|
+
const qualified = getQualifiedName(callee);
|
|
55
|
+
if (qualified) {
|
|
56
|
+
const definedProcessor = definedProcessors.get(qualified);
|
|
57
|
+
if (definedProcessor) {
|
|
58
|
+
return {
|
|
59
|
+
collapseQualifiedCallee: qualified.includes('.'),
|
|
60
|
+
definedProcessor,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const root = getRootIdentifier(callee);
|
|
65
|
+
if (!root) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const definedProcessor = definedProcessors.get(root.name);
|
|
69
|
+
return definedProcessor
|
|
70
|
+
? {
|
|
71
|
+
collapseQualifiedCallee: false,
|
|
72
|
+
definedProcessor,
|
|
73
|
+
}
|
|
74
|
+
: null;
|
|
75
|
+
};
|
|
76
|
+
export const isCallTagOfTaggedTemplate = (node, parent) => parent?.type === 'TaggedTemplateExpression' && parent.tag === node;
|
|
77
|
+
export const expandReplacementTarget = (target, ancestors) => {
|
|
78
|
+
let current = target;
|
|
79
|
+
for (let idx = ancestors.length - 1; idx >= 0; idx -= 1) {
|
|
80
|
+
const ancestor = ancestors[idx];
|
|
81
|
+
if (ancestor.type === 'SequenceExpression' &&
|
|
82
|
+
ancestor.expressions[ancestor.expressions.length - 1] === current) {
|
|
83
|
+
current = ancestor;
|
|
84
|
+
}
|
|
85
|
+
else if (ancestor.type === 'ParenthesizedExpression' &&
|
|
86
|
+
ancestor.expression === current) {
|
|
87
|
+
current = ancestor;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return current;
|
|
94
|
+
};
|
|
95
|
+
export const collectProcessorUsages = (program, definedProcessors) => {
|
|
96
|
+
const usages = [];
|
|
97
|
+
const walk = (node, ancestors, parent = null) => {
|
|
98
|
+
if (node.type === 'TaggedTemplateExpression') {
|
|
99
|
+
const callee = node.tag;
|
|
100
|
+
const resolvedProcessor = resolveDefinedProcessor(callee, definedProcessors);
|
|
101
|
+
if (resolvedProcessor) {
|
|
102
|
+
usages.push({
|
|
103
|
+
ancestors,
|
|
104
|
+
callee,
|
|
105
|
+
collapseQualifiedCallee: resolvedProcessor.collapseQualifiedCallee,
|
|
106
|
+
definedProcessor: resolvedProcessor.definedProcessor,
|
|
107
|
+
kind: 'template',
|
|
108
|
+
replacementTarget: expandReplacementTarget(node, ancestors),
|
|
109
|
+
target: node,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else if (node.type === 'CallExpression' &&
|
|
114
|
+
!isCallTagOfTaggedTemplate(node, parent)) {
|
|
115
|
+
const { callee } = node;
|
|
116
|
+
const resolvedProcessor = resolveDefinedProcessor(callee, definedProcessors);
|
|
117
|
+
if (resolvedProcessor) {
|
|
118
|
+
usages.push({
|
|
119
|
+
ancestors,
|
|
120
|
+
callee,
|
|
121
|
+
collapseQualifiedCallee: resolvedProcessor.collapseQualifiedCallee,
|
|
122
|
+
definedProcessor: resolvedProcessor.definedProcessor,
|
|
123
|
+
kind: 'call',
|
|
124
|
+
replacementTarget: expandReplacementTarget(node, ancestors),
|
|
125
|
+
target: node,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
getOxcNodeChildren(node).forEach((child) => walk(child, [...ancestors, node], node));
|
|
130
|
+
};
|
|
131
|
+
walk(program, []);
|
|
132
|
+
return usages.sort((a, b) => a.target.start - b.target.start);
|
|
133
|
+
};
|
|
134
|
+
export const expressionSpan = (expression) => ({
|
|
135
|
+
end: expression.end,
|
|
136
|
+
start: expression.start,
|
|
137
|
+
});
|
|
138
|
+
export const collectCallArgumentSpans = (node) => {
|
|
139
|
+
const expression = unwrapQualifiedExpression(node);
|
|
140
|
+
if (expression.type === 'CallExpression') {
|
|
141
|
+
const call = expression;
|
|
142
|
+
const calleeSpans = collectCallArgumentSpans(call.callee);
|
|
143
|
+
const argumentSpans = call.arguments.flatMap((arg) => arg.type === 'SpreadElement' ? [] : [expressionSpan(arg)]);
|
|
144
|
+
return [...calleeSpans, ...argumentSpans];
|
|
145
|
+
}
|
|
146
|
+
if (expression.type === 'MemberExpression') {
|
|
147
|
+
return collectCallArgumentSpans(expression.object);
|
|
148
|
+
}
|
|
149
|
+
return [];
|
|
150
|
+
};
|
|
151
|
+
export const collectUsageExpressionSpans = (usage) => {
|
|
152
|
+
const calleeSpans = collectCallArgumentSpans(usage.callee);
|
|
153
|
+
if (usage.kind === 'template') {
|
|
154
|
+
return [
|
|
155
|
+
...calleeSpans,
|
|
156
|
+
...usage.target.quasi.expressions.map((expression) => expressionSpan(expression)),
|
|
157
|
+
];
|
|
158
|
+
}
|
|
159
|
+
return [
|
|
160
|
+
...calleeSpans,
|
|
161
|
+
...usage.target.arguments.flatMap((arg) => arg.type === 'SpreadElement' ? [] : [expressionSpan(arg)]),
|
|
162
|
+
];
|
|
163
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { BaseProcessor } from '@wyw-in-js/processor-utils';
|
|
2
|
+
import type { ExpressionValue } from '@wyw-in-js/shared';
|
|
3
|
+
import type { Node } from 'oxc-parser';
|
|
4
|
+
import type { OxcStaticValueCandidate } from '../collectOxcTemplateDependencies';
|
|
5
|
+
import { type UnknownProcessorStaticValue } from '../processorStaticSemantics';
|
|
6
|
+
import type { SameFileProcessorObject } from './types';
|
|
7
|
+
export declare const oxcLiteralValue: (expression: Node) => unknown | UnknownProcessorStaticValue;
|
|
8
|
+
export declare const oxcPropertyKeyName: (key: Node) => string | null;
|
|
9
|
+
export declare const collectStaticObjectPropertyNames: (objectExpression: Node) => Set<string> | null;
|
|
10
|
+
export declare const getSameFileProcessorObjectProperty: (ancestors: Node[]) => {
|
|
11
|
+
localName: string;
|
|
12
|
+
propertyName: string;
|
|
13
|
+
propertyNames: Set<string>;
|
|
14
|
+
} | null;
|
|
15
|
+
export declare const createSameFileProcessorStaticValueResolver: (processorsByLocal: Map<string, BaseProcessor>, expressionValues: Omit<ExpressionValue, "buildCodeFrameError">[]) => {
|
|
16
|
+
resolveLocal: (local: string) => unknown | UnknownProcessorStaticValue;
|
|
17
|
+
resolveProcessor: (processor: BaseProcessor) => unknown | UnknownProcessorStaticValue;
|
|
18
|
+
};
|
|
19
|
+
export declare const collectSameFileProcessorStaticValuesByLocal: (processorsByLocal: Map<string, BaseProcessor>, expressionValues: Omit<ExpressionValue, "buildCodeFrameError">[]) => Map<string, unknown>;
|
|
20
|
+
export declare const collectSameFileProcessorObjectStaticValuesByLocal: (processorObjectsByLocal: Map<string, SameFileProcessorObject>, processorsByLocal: Map<string, BaseProcessor>, expressionValues: Omit<ExpressionValue, "buildCodeFrameError">[]) => Map<string, unknown>;
|
|
21
|
+
export declare const collectWYWMetaExtendsHelperNames: (code: string) => Set<string>;
|
|
22
|
+
export declare const collectCandidateInlineConstants: (candidate: OxcStaticValueCandidate, processorStaticValuesByLocal: Map<string, unknown>) => Record<string, unknown> | null;
|
|
23
|
+
export declare const addCandidateInlineConstants: (candidates: OxcStaticValueCandidate[], processorStaticValuesByLocal: Map<string, unknown>) => OxcStaticValueCandidate[];
|