@wyw-in-js/transform 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -281,10 +281,12 @@ const extractExpression = (expression, ctx, evaluate) => {
281
281
  } else {
282
282
  hasNonStaticLocalReference = true;
283
283
  }
284
- assertHoistable(binding, ctx);
285
- addHoistedDeclaration(binding, ctx);
286
- if (!binding.isRoot && binding.declarator?.id.type === "Identifier") {
287
- identifierReplacements.set(name, getHoistedBindingName(binding, ctx));
284
+ if (!isProcessorManagedLocal) {
285
+ assertHoistable(binding, ctx);
286
+ addHoistedDeclaration(binding, ctx);
287
+ if (!binding.isRoot && binding.declarator?.id.type === "Identifier") {
288
+ identifierReplacements.set(name, getHoistedBindingName(binding, ctx));
289
+ }
288
290
  }
289
291
  });
290
292
  // Merge literal-const inlines (e.g. `const A = 32` -> "32") with
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../../src/utils/collectOxcTemplateDependencies/expressionExtraction.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue */\n\nimport type { ExpressionValue } from '@wyw-in-js/shared';\nimport { ValueType } from '@wyw-in-js/shared';\nimport type { Expression, Program } from 'oxc-parser';\n\nimport { applyOxcReplacements } from '../oxc/replacements';\nimport { createOxcLocationLookup } from '../oxc/sourceLocations';\nimport {\n analyzeProgram,\n containsTaggedTemplateExpression,\n createSpanLookup,\n findReferences,\n getSourceLocation,\n isBindingDeclaredWithin,\n parseOxc,\n resolveBindingAt,\n} from './scopeAnalysis';\nimport {\n applyExpressionReplacements,\n collectIdentifierReferenceReplacements,\n collectStaticNamespaceMemberReferences,\n getConstantReplacement,\n replaceIdentifierReferences,\n} from './expressionReplacements';\nimport {\n cloneStaticValue,\n evaluateStatic,\n isStaticSerializableValue,\n literalCode,\n} from './staticEvaluator';\nimport type {\n Binding,\n ExtractedExpression,\n ExpressionSpan,\n ExtractionContext,\n OxcStaticImportReference,\n ProgramAnalysis,\n Replacement,\n StaticBindings,\n StaticLocalExpression,\n TemplateExtractionResult,\n} from './types';\n\nconst allocateExpressionName = (ctx: ExtractionContext): string => {\n let base = '_exp';\n let idx = 1;\n while (ctx.usedNames.has(base)) {\n idx += 1;\n base = `_exp${idx}`;\n }\n\n ctx.usedNames.add(base);\n return base;\n};\n\nconst hoistedBindingKey = (binding: Binding): string =>\n `${binding.scope.start}:${binding.scope.end}:${binding.declaredAt}:${binding.name}`;\n\nconst allocateHoistedBindingName = (\n originalName: string,\n ctx: ExtractionContext\n): string => {\n const sanitized = originalName.replace(/[^A-Za-z0-9_$]/g, '_') || 'hoisted';\n const base = /^[A-Za-z_$]/.test(sanitized) ? `_${sanitized}` : '_hoisted';\n let candidate = base;\n let idx = 2;\n\n while (ctx.usedNames.has(candidate)) {\n candidate = `${base}${idx}`;\n idx += 1;\n }\n\n ctx.usedNames.add(candidate);\n return candidate;\n};\n\nconst getHoistedBindingName = (\n binding: Binding,\n ctx: ExtractionContext\n): string => {\n const key = hoistedBindingKey(binding);\n const existing = ctx.hoistedBindingNames.get(key);\n if (existing) {\n return existing;\n }\n\n const next = allocateHoistedBindingName(binding.name, ctx);\n ctx.hoistedBindingNames.set(key, next);\n return next;\n};\n\nconst parenthesizeStaticReplacement = (source: string): string => `(${source})`;\n\nconst replaceStaticLocalReferences = (\n expression: Expression,\n replacements: Map<string, string>,\n ctx: ExtractionContext,\n extraReplacements: Replacement[] = []\n): string => {\n if (expression.type === 'Identifier' && extraReplacements.length === 0) {\n return (\n replacements.get(expression.name) ??\n ctx.code.slice(expression.start, expression.end)\n );\n }\n\n const parenthesized = new Map<string, string>();\n replacements.forEach((value, key) => {\n parenthesized.set(key, parenthesizeStaticReplacement(value));\n });\n\n return applyExpressionReplacements(\n expression,\n [\n ...extraReplacements,\n ...collectIdentifierReferenceReplacements(expression, parenthesized),\n ],\n ctx.code\n );\n};\n\nconst collectStaticLocalExpression = (\n expression: Expression,\n ctx: ExtractionContext,\n stack: string[] = []\n): StaticLocalExpression | null => {\n const replacements = new Map<string, string>();\n const importedFrom = new Set<string>();\n const imports: OxcStaticImportReference[] = [];\n\n for (const { name, start } of findReferences(\n expression,\n ctx.referencesByNode\n )) {\n const binding = resolveBindingAt(ctx, name, start);\n if (!binding) {\n return null;\n }\n\n if (binding.importedFrom) {\n importedFrom.add(binding.importedFrom);\n if (binding.imported && binding.imported !== '*') {\n imports.push({\n imported: binding.imported,\n local: binding.name,\n source: binding.importedFrom,\n });\n continue;\n }\n\n return null;\n }\n\n const replacement = getConstantReplacement(binding, ctx);\n if (replacement) {\n replacements.set(name, replacement);\n continue;\n }\n\n if (\n binding.kind === 'param' ||\n binding.declarationKind !== 'const' ||\n !binding.declarator?.init ||\n binding.declarator.id.type !== 'Identifier'\n ) {\n return null;\n }\n\n // Processor-managed bindings (const x = css``) carry their value\n // (the generated className string) via inlineConstants at candidate\n // evaluation time. Walking the TaggedTemplateExpression here would\n // pull the processor's tag import (e.g. `css` from '@linaria/core')\n // into the candidate's static imports, where it fails to resolve.\n // Leave the identifier as a free reference; the candidate-side env\n // supplies the className.\n if (binding.declarator.init.type === 'TaggedTemplateExpression') {\n continue;\n }\n\n const key = hoistedBindingKey(binding);\n if (stack.includes(key)) {\n return null;\n }\n\n const nested = collectStaticLocalExpression(binding.declarator.init, ctx, [\n ...stack,\n key,\n ]);\n if (!nested) {\n return null;\n }\n\n replacements.set(name, nested.source);\n nested.importedFrom.forEach((source) => importedFrom.add(source));\n imports.push(...nested.imports);\n }\n\n return {\n importedFrom: [...importedFrom],\n imports,\n source:\n replacements.size > 0\n ? replaceStaticLocalReferences(expression, replacements, ctx)\n : ctx.code.slice(expression.start, expression.end),\n };\n};\n\nconst declarationInitCode = (\n init: Expression,\n ctx: ExtractionContext\n): string => {\n const renamedDependencies = new Map<string, string>();\n findReferences(init, ctx.referencesByNode).forEach(({ name, start }) => {\n const dependency = resolveBindingAt(ctx, name, start);\n if (\n !dependency ||\n dependency.importedFrom ||\n dependency.isRoot ||\n dependency.declarator?.id.type !== 'Identifier'\n ) {\n return;\n }\n\n renamedDependencies.set(name, getHoistedBindingName(dependency, ctx));\n });\n\n return renamedDependencies.size > 0\n ? replaceIdentifierReferences(init, renamedDependencies, ctx.code)\n : ctx.code.slice(init.start, init.end);\n};\n\nconst addHoistedCode = (\n key: string,\n code: string,\n ctx: ExtractionContext\n): void => {\n if (ctx.hoistedDeclarations.has(key)) {\n return;\n }\n\n ctx.hoistedDeclarations.set(key, code);\n const declarations =\n ctx.hoistedDeclarationsByInsertionPoint.get(ctx.currentInsertionPoint) ??\n [];\n declarations.push(code);\n ctx.hoistedDeclarationsByInsertionPoint.set(\n ctx.currentInsertionPoint,\n declarations\n );\n};\n\nconst declarationCode = (binding: Binding, ctx: ExtractionContext): string => {\n const { declarator } = binding;\n if (!declarator) {\n return '';\n }\n\n const { id } = declarator;\n if (id.type !== 'Identifier') {\n const idCode = ctx.code.slice(id.start, id.end);\n if (!declarator.init) {\n return `let ${idCode};`;\n }\n\n return `let ${idCode} = ${declarationInitCode(declarator.init, ctx)};`;\n }\n\n const hoistedName = getHoistedBindingName(binding, ctx);\n if (!declarator.init) {\n return `let ${hoistedName};`;\n }\n\n return `let ${hoistedName} = ${declarationInitCode(declarator.init, ctx)};`;\n};\n\nconst assertHoistable = (\n binding: Binding,\n ctx: ExtractionContext,\n stack: string[] = []\n): void => {\n if (!binding.declarator?.init || binding.importedFrom || binding.isRoot) {\n return;\n }\n\n if (stack.includes(binding.name)) {\n return;\n }\n\n const refs = findReferences(binding.declarator.init, ctx.referencesByNode);\n refs.forEach(({ name, start }) => {\n const nextBinding = resolveBindingAt(ctx, name, start);\n if (!nextBinding) {\n return;\n }\n\n if (nextBinding.kind === 'param') {\n throw new Error(\n `This identifier cannot be used in the template, because it is a function parameter.`\n );\n }\n\n assertHoistable(nextBinding, ctx, [...stack, binding.name]);\n });\n};\n\nconst addHoistedDeclaration = (\n binding: Binding,\n ctx: ExtractionContext,\n stack: string[] = []\n): void => {\n if (\n !binding.declaration ||\n !binding.declarator ||\n binding.importedFrom ||\n binding.isRoot ||\n stack.includes(binding.name)\n ) {\n return;\n }\n\n const hoistSource = binding.declarator.init ?? binding.declarator;\n findReferences(hoistSource, ctx.referencesByNode).forEach(\n ({ name, start }) => {\n const dependency = resolveBindingAt(ctx, name, start);\n if (dependency) {\n addHoistedDeclaration(dependency, ctx, [...stack, binding.name]);\n }\n }\n );\n\n if (!ctx.hoistedDeclarations.has(binding.name)) {\n addHoistedCode(binding.name, declarationCode(binding, ctx), ctx);\n }\n};\n\nconst literalExpressionValue = (\n expression: Expression,\n ctx: ExtractionContext\n): Omit<ExpressionValue, 'buildCodeFrameError'> | null => {\n if (expression.type !== 'Literal') {\n return null;\n }\n\n if (\n expression.value !== null &&\n typeof expression.value !== 'string' &&\n typeof expression.value !== 'number' &&\n typeof expression.value !== 'boolean'\n ) {\n return null;\n }\n\n let type:\n | 'BooleanLiteral'\n | 'NullLiteral'\n | 'NumericLiteral'\n | 'StringLiteral';\n if (expression.value === null) {\n type = 'NullLiteral';\n } else if (typeof expression.value === 'string') {\n type = 'StringLiteral';\n } else if (typeof expression.value === 'number') {\n type = 'NumericLiteral';\n } else {\n type = 'BooleanLiteral';\n }\n\n const loc = getSourceLocation(expression.start, expression.end, ctx);\n const ex =\n expression.value === null\n ? { loc, type }\n : {\n loc,\n type,\n value: expression.value,\n };\n\n return {\n ex,\n kind: ValueType.CONST,\n source: ctx.code.slice(expression.start, expression.end),\n value: expression.value,\n } as unknown as Omit<ExpressionValue, 'buildCodeFrameError'>;\n};\n\nconst extractExpression = (\n expression: Expression,\n ctx: ExtractionContext,\n evaluate: boolean\n): ExtractedExpression => {\n const source = ctx.code.slice(expression.start, expression.end);\n // Only inline function expressions are function-valued here. A bare\n // identifier that points to a local function may be a styled runtime\n // component, so it has to stay as a lazy `_exp()` reference.\n const isFunction =\n expression.type === 'FunctionExpression' ||\n expression.type === 'ArrowFunctionExpression';\n\n if (evaluate) {\n const evaluated = evaluateStatic(expression, ctx);\n const literal = literalCode(evaluated);\n if (literal) {\n findReferences(expression, ctx.referencesByNode).forEach(({ name }) =>\n ctx.dependencyNames.add(name)\n );\n return {\n expressionCode: literal,\n importedFrom: [],\n kind: isFunction ? ValueType.FUNCTION : ValueType.LAZY,\n staticImports: [],\n staticValue: isStaticSerializableValue(evaluated)\n ? cloneStaticValue(evaluated)\n : undefined,\n };\n }\n }\n\n const identifierReplacements = new Map<string, string>();\n const importedFrom: string[] = [];\n const namespaceStatic = collectStaticNamespaceMemberReferences(\n expression,\n ctx\n );\n const staticIdentifierReplacements = new Map<string, string>();\n const staticImports: OxcStaticImportReference[] = [\n ...namespaceStatic.imports,\n ];\n let hasNonStaticLocalReference = false;\n let hasInlinableLocalReference = false;\n\n findReferences(expression, ctx.referencesByNode).forEach(\n ({ name, start }) => {\n const binding = resolveBindingAt(ctx, name, start);\n if (!binding) {\n return;\n }\n\n if (isFunction && isBindingDeclaredWithin(binding, expression)) {\n return;\n }\n\n ctx.dependencyNames.add(name);\n\n if (binding.importedFrom) {\n importedFrom.push(binding.importedFrom);\n if (binding.imported && binding.imported !== '*') {\n staticImports.push({\n imported: binding.imported,\n local: binding.name,\n source: binding.importedFrom,\n });\n } else if (\n binding.imported === '*' &&\n namespaceStatic.coveredReferenceStarts.has(start)\n ) {\n // The static candidate source gets a synthetic named import alias,\n // while the eval fallback keeps the original namespace expression.\n } else {\n hasNonStaticLocalReference = true;\n }\n return;\n }\n\n const replacement = getConstantReplacement(binding, ctx);\n if (evaluate && replacement) {\n identifierReplacements.set(name, replacement);\n return;\n }\n\n const init = binding.declarator?.init;\n // Processor-managed bindings (`const x = css```, or object literals\n // containing processor tags) carry values that only become known after\n // processors run. Leave the identifier free in the candidate source so\n // the resolver can supply it via inlineConstants at evaluation time.\n const isProcessorManagedLocal =\n !!evaluate && !!init && containsTaggedTemplateExpression(init);\n const staticLocalExpression =\n evaluate && init && !isProcessorManagedLocal\n ? collectStaticLocalExpression(init, ctx, [\n hoistedBindingKey(binding),\n ])\n : null;\n if (staticLocalExpression) {\n staticIdentifierReplacements.set(name, staticLocalExpression.source);\n importedFrom.push(...staticLocalExpression.importedFrom);\n staticImports.push(...staticLocalExpression.imports);\n } else if (isProcessorManagedLocal) {\n hasInlinableLocalReference = true;\n } else {\n hasNonStaticLocalReference = true;\n }\n\n assertHoistable(binding, ctx);\n addHoistedDeclaration(binding, ctx);\n if (!binding.isRoot && binding.declarator?.id.type === 'Identifier') {\n identifierReplacements.set(name, getHoistedBindingName(binding, ctx));\n }\n }\n );\n\n // Merge literal-const inlines (e.g. `const A = 32` -> \"32\") with\n // local-to-imported substitutions (e.g. `const X = imp.y` -> \"imp.y\").\n // Both must reach the candidate source so the resolver's evaluator\n // can fold every Identifier in the expression; env only carries\n // imported bindings, never same-file locals.\n const mergedReplacements = new Map(staticIdentifierReplacements);\n identifierReplacements.forEach((value, key) => {\n if (!mergedReplacements.has(key)) {\n mergedReplacements.set(key, value);\n }\n });\n\n let staticExpressionCode: string | undefined;\n if (mergedReplacements.size > 0) {\n staticExpressionCode = replaceStaticLocalReferences(\n expression,\n mergedReplacements,\n ctx,\n namespaceStatic.replacements\n );\n } else if (namespaceStatic.replacements.length > 0) {\n staticExpressionCode = applyExpressionReplacements(\n expression,\n namespaceStatic.replacements,\n ctx.code\n );\n }\n\n return {\n expressionCode:\n identifierReplacements.size > 0\n ? replaceIdentifierReferences(\n expression,\n identifierReplacements,\n ctx.code\n )\n : source,\n importedFrom,\n kind: isFunction ? ValueType.FUNCTION : ValueType.LAZY,\n staticExpressionCode,\n hasInlinableLocalReference:\n !hasNonStaticLocalReference && hasInlinableLocalReference,\n staticImports: hasNonStaticLocalReference ? [] : staticImports,\n };\n};\n\nconst getInsertionPoints = (\n program: Program,\n expressions: Expression[]\n): number[] => {\n if (expressions.length === 0) {\n return [];\n }\n\n if (program.body.length === 0) {\n return expressions.map(() => 0);\n }\n\n const insertionPoints: number[] = [];\n let ownerIndex = 0;\n\n expressions.forEach((expression) => {\n while (\n ownerIndex < program.body.length - 1 &&\n program.body[ownerIndex]!.end < expression.start\n ) {\n ownerIndex += 1;\n }\n\n let owner: Program['body'][number] | undefined = program.body[ownerIndex];\n if (\n !owner ||\n owner.start > expression.start ||\n owner.end < expression.end\n ) {\n owner = program.body.find(\n (statement) =>\n statement.start <= expression.start && statement.end >= expression.end\n );\n }\n\n insertionPoints.push(owner?.start ?? 0);\n });\n\n return insertionPoints;\n};\n\nconst extractExpressions = (\n code: string,\n filename: string,\n evaluate: boolean,\n program: Program,\n analysis: Pick<\n ProgramAnalysis,\n 'bindingsByName' | 'rootMutationsByBinding' | 'usedNames'\n >,\n expressions: Expression[],\n staticBindings?: StaticBindings\n): TemplateExtractionResult => {\n if (expressions.length === 0) {\n return {\n code,\n dependencyNames: [],\n expressionValues: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n }\n\n const insertionPoints = getInsertionPoints(program, expressions);\n const ctx: ExtractionContext = {\n bindingResolutionCache: new Map(),\n bindingsByName: analysis.bindingsByName,\n code,\n currentInsertionPoint: insertionPoints[0] ?? 0,\n currentExpressionStart: expressions[0].start,\n dependencyNames: new Set(),\n expressionValues: [],\n filename,\n hoistedBindingNames: new Map(),\n hoistedDeclarations: new Map(),\n hoistedDeclarationsByInsertionPoint: new Map(),\n loc: createOxcLocationLookup(code),\n referencesByNode: new WeakMap(),\n replacements: [],\n rootMutationsByBinding: analysis.rootMutationsByBinding,\n staticBindings,\n staticImportAliases: new Map(),\n staticValueCandidates: [],\n staticValues: [],\n usedNames: new Set(analysis.usedNames),\n };\n\n expressions.forEach((expression, index) => {\n ctx.currentInsertionPoint = insertionPoints[index] ?? 0;\n ctx.currentExpressionStart = expression.start;\n\n const literal = literalExpressionValue(expression, ctx);\n if (literal) {\n ctx.expressionValues.push(literal);\n return;\n }\n\n const {\n expressionCode,\n hasInlinableLocalReference,\n importedFrom,\n kind,\n staticExpressionCode,\n staticImports,\n staticValue,\n } = extractExpression(expression, ctx, evaluate);\n const expName = allocateExpressionName(ctx);\n\n addHoistedCode(\n expName,\n `const ${expName} = () => (${expressionCode});`,\n ctx\n );\n if (staticValue !== undefined && kind !== ValueType.FUNCTION) {\n ctx.staticValues.push({\n name: expName,\n value: staticValue,\n });\n } else if (\n (staticImports.length > 0 ||\n hasInlinableLocalReference ||\n staticExpressionCode !== undefined) &&\n kind !== ValueType.FUNCTION\n ) {\n const uniqueImports = new Map<string, OxcStaticImportReference>();\n staticImports.forEach((item) => {\n uniqueImports.set(\n `${item.local}\\0${item.importLocal ?? ''}\\0${item.source}\\0${\n item.imported\n }`,\n item\n );\n });\n ctx.staticValueCandidates.push({\n imports: [...uniqueImports.values()],\n name: expName,\n source: staticExpressionCode ?? expressionCode,\n });\n }\n ctx.replacements.push({\n start: expression.start,\n end: expression.end,\n value: `${expName}()`,\n });\n ctx.expressionValues.push({\n ex: {\n loc: getSourceLocation(expression.start, expression.end, ctx),\n name: expName,\n type: 'Identifier',\n },\n importedFrom,\n kind,\n source: ctx.code.slice(expression.start, expression.end),\n } as unknown as Omit<ExpressionValue, 'buildCodeFrameError'>);\n });\n\n ctx.hoistedDeclarationsByInsertionPoint.forEach((declarations, point) => {\n ctx.replacements.push({\n start: point,\n end: point,\n value: `${declarations.join('\\n')}\\n`,\n });\n });\n\n return {\n code: applyOxcReplacements(code, ctx.replacements),\n dependencyNames: [...ctx.dependencyNames],\n expressionValues: ctx.expressionValues,\n staticValueCandidates: ctx.staticValueCandidates,\n staticValues: ctx.staticValues,\n };\n};\n\nexport const isOxcStaticSerializableValue = (value: unknown): boolean =>\n isStaticSerializableValue(value);\n\nexport const evaluateOxcStaticExpressionAt = (\n code: string,\n filename: string,\n expressionSpan: ExpressionSpan,\n env: Map<string, unknown> = new Map(),\n staticBindings?: StaticBindings\n): unknown | undefined => {\n const program = parseOxc(code, filename);\n const analysis = analyzeProgram(program, {\n collectTargetExpressions: true,\n expressionSpanLookup: createSpanLookup([expressionSpan]),\n });\n const [expression] = analysis.targetExpressions;\n if (!expression) {\n return undefined;\n }\n\n const ctx: ExtractionContext = {\n bindingResolutionCache: new Map(),\n bindingsByName: analysis.bindingsByName,\n code,\n currentInsertionPoint: 0,\n currentExpressionStart: expression.start,\n dependencyNames: new Set(),\n expressionValues: [],\n filename,\n hoistedBindingNames: new Map(),\n hoistedDeclarations: new Map(),\n hoistedDeclarationsByInsertionPoint: new Map(),\n loc: createOxcLocationLookup(code),\n referencesByNode: new WeakMap(),\n replacements: [],\n rootMutationsByBinding: analysis.rootMutationsByBinding,\n staticBindings,\n staticImportAliases: new Map(),\n staticValueCandidates: [],\n staticValues: [],\n usedNames: new Set(analysis.usedNames),\n };\n\n return evaluateStatic(expression, ctx, new Map(env));\n};\n\nexport const evaluateOxcStaticExpression = (\n source: string,\n filename: string,\n env: Map<string, unknown> = new Map(),\n staticBindings?: StaticBindings\n): unknown | undefined => {\n const code = `const __wyw_static_value = ${source};`;\n const program = parseOxc(code, filename);\n const declaration = program.body[0];\n if (declaration?.type !== 'VariableDeclaration') {\n return undefined;\n }\n\n const [declarator] = declaration.declarations;\n if (!declarator?.init) {\n return undefined;\n }\n\n return evaluateOxcStaticExpressionAt(\n code,\n filename,\n {\n end: declarator.init.end,\n start: declarator.init.start,\n },\n env,\n staticBindings\n );\n};\n\nexport const collectOxcExpressionDependencies = (\n code: string,\n filename: string,\n evaluate = false,\n targetExpressionSpans?: ExpressionSpan[],\n staticBindings?: StaticBindings\n): TemplateExtractionResult => {\n const program = parseOxc(code, filename);\n const analysis = analyzeProgram(program, {\n collectTargetExpressions: true,\n expressionSpanLookup: createSpanLookup(targetExpressionSpans),\n });\n\n return extractExpressions(\n code,\n filename,\n evaluate,\n program,\n analysis,\n analysis.targetExpressions,\n staticBindings\n );\n};\n\nexport const collectOxcTemplateDependencies = (\n code: string,\n filename: string,\n evaluate = false,\n targetTemplateSpans?: ExpressionSpan[]\n): TemplateExtractionResult => {\n const program = parseOxc(code, filename);\n const analysis = analyzeProgram(program, {\n collectTemplateLiterals: true,\n templateSpanLookup: createSpanLookup(targetTemplateSpans),\n });\n const expressions = analysis.templateLiterals.flatMap(\n (template) => template.expressions\n );\n\n return extractExpressions(\n code,\n filename,\n evaluate,\n program,\n analysis,\n expressions\n );\n};\n"],"file":"expressionExtraction.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../src/utils/collectOxcTemplateDependencies/expressionExtraction.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue */\n\nimport type { ExpressionValue } from '@wyw-in-js/shared';\nimport { ValueType } from '@wyw-in-js/shared';\nimport type { Expression, Program } from 'oxc-parser';\n\nimport { applyOxcReplacements } from '../oxc/replacements';\nimport { createOxcLocationLookup } from '../oxc/sourceLocations';\nimport {\n analyzeProgram,\n containsTaggedTemplateExpression,\n createSpanLookup,\n findReferences,\n getSourceLocation,\n isBindingDeclaredWithin,\n parseOxc,\n resolveBindingAt,\n} from './scopeAnalysis';\nimport {\n applyExpressionReplacements,\n collectIdentifierReferenceReplacements,\n collectStaticNamespaceMemberReferences,\n getConstantReplacement,\n replaceIdentifierReferences,\n} from './expressionReplacements';\nimport {\n cloneStaticValue,\n evaluateStatic,\n isStaticSerializableValue,\n literalCode,\n} from './staticEvaluator';\nimport type {\n Binding,\n ExtractedExpression,\n ExpressionSpan,\n ExtractionContext,\n OxcStaticImportReference,\n ProgramAnalysis,\n Replacement,\n StaticBindings,\n StaticLocalExpression,\n TemplateExtractionResult,\n} from './types';\n\nconst allocateExpressionName = (ctx: ExtractionContext): string => {\n let base = '_exp';\n let idx = 1;\n while (ctx.usedNames.has(base)) {\n idx += 1;\n base = `_exp${idx}`;\n }\n\n ctx.usedNames.add(base);\n return base;\n};\n\nconst hoistedBindingKey = (binding: Binding): string =>\n `${binding.scope.start}:${binding.scope.end}:${binding.declaredAt}:${binding.name}`;\n\nconst allocateHoistedBindingName = (\n originalName: string,\n ctx: ExtractionContext\n): string => {\n const sanitized = originalName.replace(/[^A-Za-z0-9_$]/g, '_') || 'hoisted';\n const base = /^[A-Za-z_$]/.test(sanitized) ? `_${sanitized}` : '_hoisted';\n let candidate = base;\n let idx = 2;\n\n while (ctx.usedNames.has(candidate)) {\n candidate = `${base}${idx}`;\n idx += 1;\n }\n\n ctx.usedNames.add(candidate);\n return candidate;\n};\n\nconst getHoistedBindingName = (\n binding: Binding,\n ctx: ExtractionContext\n): string => {\n const key = hoistedBindingKey(binding);\n const existing = ctx.hoistedBindingNames.get(key);\n if (existing) {\n return existing;\n }\n\n const next = allocateHoistedBindingName(binding.name, ctx);\n ctx.hoistedBindingNames.set(key, next);\n return next;\n};\n\nconst parenthesizeStaticReplacement = (source: string): string => `(${source})`;\n\nconst replaceStaticLocalReferences = (\n expression: Expression,\n replacements: Map<string, string>,\n ctx: ExtractionContext,\n extraReplacements: Replacement[] = []\n): string => {\n if (expression.type === 'Identifier' && extraReplacements.length === 0) {\n return (\n replacements.get(expression.name) ??\n ctx.code.slice(expression.start, expression.end)\n );\n }\n\n const parenthesized = new Map<string, string>();\n replacements.forEach((value, key) => {\n parenthesized.set(key, parenthesizeStaticReplacement(value));\n });\n\n return applyExpressionReplacements(\n expression,\n [\n ...extraReplacements,\n ...collectIdentifierReferenceReplacements(expression, parenthesized),\n ],\n ctx.code\n );\n};\n\nconst collectStaticLocalExpression = (\n expression: Expression,\n ctx: ExtractionContext,\n stack: string[] = []\n): StaticLocalExpression | null => {\n const replacements = new Map<string, string>();\n const importedFrom = new Set<string>();\n const imports: OxcStaticImportReference[] = [];\n\n for (const { name, start } of findReferences(\n expression,\n ctx.referencesByNode\n )) {\n const binding = resolveBindingAt(ctx, name, start);\n if (!binding) {\n return null;\n }\n\n if (binding.importedFrom) {\n importedFrom.add(binding.importedFrom);\n if (binding.imported && binding.imported !== '*') {\n imports.push({\n imported: binding.imported,\n local: binding.name,\n source: binding.importedFrom,\n });\n continue;\n }\n\n return null;\n }\n\n const replacement = getConstantReplacement(binding, ctx);\n if (replacement) {\n replacements.set(name, replacement);\n continue;\n }\n\n if (\n binding.kind === 'param' ||\n binding.declarationKind !== 'const' ||\n !binding.declarator?.init ||\n binding.declarator.id.type !== 'Identifier'\n ) {\n return null;\n }\n\n // Processor-managed bindings (const x = css``) carry their value\n // (the generated className string) via inlineConstants at candidate\n // evaluation time. Walking the TaggedTemplateExpression here would\n // pull the processor's tag import (e.g. `css` from '@linaria/core')\n // into the candidate's static imports, where it fails to resolve.\n // Leave the identifier as a free reference; the candidate-side env\n // supplies the className.\n if (binding.declarator.init.type === 'TaggedTemplateExpression') {\n continue;\n }\n\n const key = hoistedBindingKey(binding);\n if (stack.includes(key)) {\n return null;\n }\n\n const nested = collectStaticLocalExpression(binding.declarator.init, ctx, [\n ...stack,\n key,\n ]);\n if (!nested) {\n return null;\n }\n\n replacements.set(name, nested.source);\n nested.importedFrom.forEach((source) => importedFrom.add(source));\n imports.push(...nested.imports);\n }\n\n return {\n importedFrom: [...importedFrom],\n imports,\n source:\n replacements.size > 0\n ? replaceStaticLocalReferences(expression, replacements, ctx)\n : ctx.code.slice(expression.start, expression.end),\n };\n};\n\nconst declarationInitCode = (\n init: Expression,\n ctx: ExtractionContext\n): string => {\n const renamedDependencies = new Map<string, string>();\n findReferences(init, ctx.referencesByNode).forEach(({ name, start }) => {\n const dependency = resolveBindingAt(ctx, name, start);\n if (\n !dependency ||\n dependency.importedFrom ||\n dependency.isRoot ||\n dependency.declarator?.id.type !== 'Identifier'\n ) {\n return;\n }\n\n renamedDependencies.set(name, getHoistedBindingName(dependency, ctx));\n });\n\n return renamedDependencies.size > 0\n ? replaceIdentifierReferences(init, renamedDependencies, ctx.code)\n : ctx.code.slice(init.start, init.end);\n};\n\nconst addHoistedCode = (\n key: string,\n code: string,\n ctx: ExtractionContext\n): void => {\n if (ctx.hoistedDeclarations.has(key)) {\n return;\n }\n\n ctx.hoistedDeclarations.set(key, code);\n const declarations =\n ctx.hoistedDeclarationsByInsertionPoint.get(ctx.currentInsertionPoint) ??\n [];\n declarations.push(code);\n ctx.hoistedDeclarationsByInsertionPoint.set(\n ctx.currentInsertionPoint,\n declarations\n );\n};\n\nconst declarationCode = (binding: Binding, ctx: ExtractionContext): string => {\n const { declarator } = binding;\n if (!declarator) {\n return '';\n }\n\n const { id } = declarator;\n if (id.type !== 'Identifier') {\n const idCode = ctx.code.slice(id.start, id.end);\n if (!declarator.init) {\n return `let ${idCode};`;\n }\n\n return `let ${idCode} = ${declarationInitCode(declarator.init, ctx)};`;\n }\n\n const hoistedName = getHoistedBindingName(binding, ctx);\n if (!declarator.init) {\n return `let ${hoistedName};`;\n }\n\n return `let ${hoistedName} = ${declarationInitCode(declarator.init, ctx)};`;\n};\n\nconst assertHoistable = (\n binding: Binding,\n ctx: ExtractionContext,\n stack: string[] = []\n): void => {\n if (!binding.declarator?.init || binding.importedFrom || binding.isRoot) {\n return;\n }\n\n if (stack.includes(binding.name)) {\n return;\n }\n\n const refs = findReferences(binding.declarator.init, ctx.referencesByNode);\n refs.forEach(({ name, start }) => {\n const nextBinding = resolveBindingAt(ctx, name, start);\n if (!nextBinding) {\n return;\n }\n\n if (nextBinding.kind === 'param') {\n throw new Error(\n `This identifier cannot be used in the template, because it is a function parameter.`\n );\n }\n\n assertHoistable(nextBinding, ctx, [...stack, binding.name]);\n });\n};\n\nconst addHoistedDeclaration = (\n binding: Binding,\n ctx: ExtractionContext,\n stack: string[] = []\n): void => {\n if (\n !binding.declaration ||\n !binding.declarator ||\n binding.importedFrom ||\n binding.isRoot ||\n stack.includes(binding.name)\n ) {\n return;\n }\n\n const hoistSource = binding.declarator.init ?? binding.declarator;\n findReferences(hoistSource, ctx.referencesByNode).forEach(\n ({ name, start }) => {\n const dependency = resolveBindingAt(ctx, name, start);\n if (dependency) {\n addHoistedDeclaration(dependency, ctx, [...stack, binding.name]);\n }\n }\n );\n\n if (!ctx.hoistedDeclarations.has(binding.name)) {\n addHoistedCode(binding.name, declarationCode(binding, ctx), ctx);\n }\n};\n\nconst literalExpressionValue = (\n expression: Expression,\n ctx: ExtractionContext\n): Omit<ExpressionValue, 'buildCodeFrameError'> | null => {\n if (expression.type !== 'Literal') {\n return null;\n }\n\n if (\n expression.value !== null &&\n typeof expression.value !== 'string' &&\n typeof expression.value !== 'number' &&\n typeof expression.value !== 'boolean'\n ) {\n return null;\n }\n\n let type:\n | 'BooleanLiteral'\n | 'NullLiteral'\n | 'NumericLiteral'\n | 'StringLiteral';\n if (expression.value === null) {\n type = 'NullLiteral';\n } else if (typeof expression.value === 'string') {\n type = 'StringLiteral';\n } else if (typeof expression.value === 'number') {\n type = 'NumericLiteral';\n } else {\n type = 'BooleanLiteral';\n }\n\n const loc = getSourceLocation(expression.start, expression.end, ctx);\n const ex =\n expression.value === null\n ? { loc, type }\n : {\n loc,\n type,\n value: expression.value,\n };\n\n return {\n ex,\n kind: ValueType.CONST,\n source: ctx.code.slice(expression.start, expression.end),\n value: expression.value,\n } as unknown as Omit<ExpressionValue, 'buildCodeFrameError'>;\n};\n\nconst extractExpression = (\n expression: Expression,\n ctx: ExtractionContext,\n evaluate: boolean\n): ExtractedExpression => {\n const source = ctx.code.slice(expression.start, expression.end);\n // Only inline function expressions are function-valued here. A bare\n // identifier that points to a local function may be a styled runtime\n // component, so it has to stay as a lazy `_exp()` reference.\n const isFunction =\n expression.type === 'FunctionExpression' ||\n expression.type === 'ArrowFunctionExpression';\n\n if (evaluate) {\n const evaluated = evaluateStatic(expression, ctx);\n const literal = literalCode(evaluated);\n if (literal) {\n findReferences(expression, ctx.referencesByNode).forEach(({ name }) =>\n ctx.dependencyNames.add(name)\n );\n return {\n expressionCode: literal,\n importedFrom: [],\n kind: isFunction ? ValueType.FUNCTION : ValueType.LAZY,\n staticImports: [],\n staticValue: isStaticSerializableValue(evaluated)\n ? cloneStaticValue(evaluated)\n : undefined,\n };\n }\n }\n\n const identifierReplacements = new Map<string, string>();\n const importedFrom: string[] = [];\n const namespaceStatic = collectStaticNamespaceMemberReferences(\n expression,\n ctx\n );\n const staticIdentifierReplacements = new Map<string, string>();\n const staticImports: OxcStaticImportReference[] = [\n ...namespaceStatic.imports,\n ];\n let hasNonStaticLocalReference = false;\n let hasInlinableLocalReference = false;\n\n findReferences(expression, ctx.referencesByNode).forEach(\n ({ name, start }) => {\n const binding = resolveBindingAt(ctx, name, start);\n if (!binding) {\n return;\n }\n\n if (isFunction && isBindingDeclaredWithin(binding, expression)) {\n return;\n }\n\n ctx.dependencyNames.add(name);\n\n if (binding.importedFrom) {\n importedFrom.push(binding.importedFrom);\n if (binding.imported && binding.imported !== '*') {\n staticImports.push({\n imported: binding.imported,\n local: binding.name,\n source: binding.importedFrom,\n });\n } else if (\n binding.imported === '*' &&\n namespaceStatic.coveredReferenceStarts.has(start)\n ) {\n // The static candidate source gets a synthetic named import alias,\n // while the eval fallback keeps the original namespace expression.\n } else {\n hasNonStaticLocalReference = true;\n }\n return;\n }\n\n const replacement = getConstantReplacement(binding, ctx);\n if (evaluate && replacement) {\n identifierReplacements.set(name, replacement);\n return;\n }\n\n const init = binding.declarator?.init;\n // Processor-managed bindings (`const x = css```, or object literals\n // containing processor tags) carry values that only become known after\n // processors run. Leave the identifier free in the candidate source so\n // the resolver can supply it via inlineConstants at evaluation time.\n const isProcessorManagedLocal =\n !!evaluate && !!init && containsTaggedTemplateExpression(init);\n const staticLocalExpression =\n evaluate && init && !isProcessorManagedLocal\n ? collectStaticLocalExpression(init, ctx, [\n hoistedBindingKey(binding),\n ])\n : null;\n if (staticLocalExpression) {\n staticIdentifierReplacements.set(name, staticLocalExpression.source);\n importedFrom.push(...staticLocalExpression.importedFrom);\n staticImports.push(...staticLocalExpression.imports);\n } else if (isProcessorManagedLocal) {\n hasInlinableLocalReference = true;\n } else {\n hasNonStaticLocalReference = true;\n }\n\n if (!isProcessorManagedLocal) {\n assertHoistable(binding, ctx);\n addHoistedDeclaration(binding, ctx);\n if (!binding.isRoot && binding.declarator?.id.type === 'Identifier') {\n identifierReplacements.set(name, getHoistedBindingName(binding, ctx));\n }\n }\n }\n );\n\n // Merge literal-const inlines (e.g. `const A = 32` -> \"32\") with\n // local-to-imported substitutions (e.g. `const X = imp.y` -> \"imp.y\").\n // Both must reach the candidate source so the resolver's evaluator\n // can fold every Identifier in the expression; env only carries\n // imported bindings, never same-file locals.\n const mergedReplacements = new Map(staticIdentifierReplacements);\n identifierReplacements.forEach((value, key) => {\n if (!mergedReplacements.has(key)) {\n mergedReplacements.set(key, value);\n }\n });\n\n let staticExpressionCode: string | undefined;\n if (mergedReplacements.size > 0) {\n staticExpressionCode = replaceStaticLocalReferences(\n expression,\n mergedReplacements,\n ctx,\n namespaceStatic.replacements\n );\n } else if (namespaceStatic.replacements.length > 0) {\n staticExpressionCode = applyExpressionReplacements(\n expression,\n namespaceStatic.replacements,\n ctx.code\n );\n }\n\n return {\n expressionCode:\n identifierReplacements.size > 0\n ? replaceIdentifierReferences(\n expression,\n identifierReplacements,\n ctx.code\n )\n : source,\n importedFrom,\n kind: isFunction ? ValueType.FUNCTION : ValueType.LAZY,\n staticExpressionCode,\n hasInlinableLocalReference:\n !hasNonStaticLocalReference && hasInlinableLocalReference,\n staticImports: hasNonStaticLocalReference ? [] : staticImports,\n };\n};\n\nconst getInsertionPoints = (\n program: Program,\n expressions: Expression[]\n): number[] => {\n if (expressions.length === 0) {\n return [];\n }\n\n if (program.body.length === 0) {\n return expressions.map(() => 0);\n }\n\n const insertionPoints: number[] = [];\n let ownerIndex = 0;\n\n expressions.forEach((expression) => {\n while (\n ownerIndex < program.body.length - 1 &&\n program.body[ownerIndex]!.end < expression.start\n ) {\n ownerIndex += 1;\n }\n\n let owner: Program['body'][number] | undefined = program.body[ownerIndex];\n if (\n !owner ||\n owner.start > expression.start ||\n owner.end < expression.end\n ) {\n owner = program.body.find(\n (statement) =>\n statement.start <= expression.start && statement.end >= expression.end\n );\n }\n\n insertionPoints.push(owner?.start ?? 0);\n });\n\n return insertionPoints;\n};\n\nconst extractExpressions = (\n code: string,\n filename: string,\n evaluate: boolean,\n program: Program,\n analysis: Pick<\n ProgramAnalysis,\n 'bindingsByName' | 'rootMutationsByBinding' | 'usedNames'\n >,\n expressions: Expression[],\n staticBindings?: StaticBindings\n): TemplateExtractionResult => {\n if (expressions.length === 0) {\n return {\n code,\n dependencyNames: [],\n expressionValues: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n }\n\n const insertionPoints = getInsertionPoints(program, expressions);\n const ctx: ExtractionContext = {\n bindingResolutionCache: new Map(),\n bindingsByName: analysis.bindingsByName,\n code,\n currentInsertionPoint: insertionPoints[0] ?? 0,\n currentExpressionStart: expressions[0].start,\n dependencyNames: new Set(),\n expressionValues: [],\n filename,\n hoistedBindingNames: new Map(),\n hoistedDeclarations: new Map(),\n hoistedDeclarationsByInsertionPoint: new Map(),\n loc: createOxcLocationLookup(code),\n referencesByNode: new WeakMap(),\n replacements: [],\n rootMutationsByBinding: analysis.rootMutationsByBinding,\n staticBindings,\n staticImportAliases: new Map(),\n staticValueCandidates: [],\n staticValues: [],\n usedNames: new Set(analysis.usedNames),\n };\n\n expressions.forEach((expression, index) => {\n ctx.currentInsertionPoint = insertionPoints[index] ?? 0;\n ctx.currentExpressionStart = expression.start;\n\n const literal = literalExpressionValue(expression, ctx);\n if (literal) {\n ctx.expressionValues.push(literal);\n return;\n }\n\n const {\n expressionCode,\n hasInlinableLocalReference,\n importedFrom,\n kind,\n staticExpressionCode,\n staticImports,\n staticValue,\n } = extractExpression(expression, ctx, evaluate);\n const expName = allocateExpressionName(ctx);\n\n addHoistedCode(\n expName,\n `const ${expName} = () => (${expressionCode});`,\n ctx\n );\n if (staticValue !== undefined && kind !== ValueType.FUNCTION) {\n ctx.staticValues.push({\n name: expName,\n value: staticValue,\n });\n } else if (\n (staticImports.length > 0 ||\n hasInlinableLocalReference ||\n staticExpressionCode !== undefined) &&\n kind !== ValueType.FUNCTION\n ) {\n const uniqueImports = new Map<string, OxcStaticImportReference>();\n staticImports.forEach((item) => {\n uniqueImports.set(\n `${item.local}\\0${item.importLocal ?? ''}\\0${item.source}\\0${\n item.imported\n }`,\n item\n );\n });\n ctx.staticValueCandidates.push({\n imports: [...uniqueImports.values()],\n name: expName,\n source: staticExpressionCode ?? expressionCode,\n });\n }\n ctx.replacements.push({\n start: expression.start,\n end: expression.end,\n value: `${expName}()`,\n });\n ctx.expressionValues.push({\n ex: {\n loc: getSourceLocation(expression.start, expression.end, ctx),\n name: expName,\n type: 'Identifier',\n },\n importedFrom,\n kind,\n source: ctx.code.slice(expression.start, expression.end),\n } as unknown as Omit<ExpressionValue, 'buildCodeFrameError'>);\n });\n\n ctx.hoistedDeclarationsByInsertionPoint.forEach((declarations, point) => {\n ctx.replacements.push({\n start: point,\n end: point,\n value: `${declarations.join('\\n')}\\n`,\n });\n });\n\n return {\n code: applyOxcReplacements(code, ctx.replacements),\n dependencyNames: [...ctx.dependencyNames],\n expressionValues: ctx.expressionValues,\n staticValueCandidates: ctx.staticValueCandidates,\n staticValues: ctx.staticValues,\n };\n};\n\nexport const isOxcStaticSerializableValue = (value: unknown): boolean =>\n isStaticSerializableValue(value);\n\nexport const evaluateOxcStaticExpressionAt = (\n code: string,\n filename: string,\n expressionSpan: ExpressionSpan,\n env: Map<string, unknown> = new Map(),\n staticBindings?: StaticBindings\n): unknown | undefined => {\n const program = parseOxc(code, filename);\n const analysis = analyzeProgram(program, {\n collectTargetExpressions: true,\n expressionSpanLookup: createSpanLookup([expressionSpan]),\n });\n const [expression] = analysis.targetExpressions;\n if (!expression) {\n return undefined;\n }\n\n const ctx: ExtractionContext = {\n bindingResolutionCache: new Map(),\n bindingsByName: analysis.bindingsByName,\n code,\n currentInsertionPoint: 0,\n currentExpressionStart: expression.start,\n dependencyNames: new Set(),\n expressionValues: [],\n filename,\n hoistedBindingNames: new Map(),\n hoistedDeclarations: new Map(),\n hoistedDeclarationsByInsertionPoint: new Map(),\n loc: createOxcLocationLookup(code),\n referencesByNode: new WeakMap(),\n replacements: [],\n rootMutationsByBinding: analysis.rootMutationsByBinding,\n staticBindings,\n staticImportAliases: new Map(),\n staticValueCandidates: [],\n staticValues: [],\n usedNames: new Set(analysis.usedNames),\n };\n\n return evaluateStatic(expression, ctx, new Map(env));\n};\n\nexport const evaluateOxcStaticExpression = (\n source: string,\n filename: string,\n env: Map<string, unknown> = new Map(),\n staticBindings?: StaticBindings\n): unknown | undefined => {\n const code = `const __wyw_static_value = ${source};`;\n const program = parseOxc(code, filename);\n const declaration = program.body[0];\n if (declaration?.type !== 'VariableDeclaration') {\n return undefined;\n }\n\n const [declarator] = declaration.declarations;\n if (!declarator?.init) {\n return undefined;\n }\n\n return evaluateOxcStaticExpressionAt(\n code,\n filename,\n {\n end: declarator.init.end,\n start: declarator.init.start,\n },\n env,\n staticBindings\n );\n};\n\nexport const collectOxcExpressionDependencies = (\n code: string,\n filename: string,\n evaluate = false,\n targetExpressionSpans?: ExpressionSpan[],\n staticBindings?: StaticBindings\n): TemplateExtractionResult => {\n const program = parseOxc(code, filename);\n const analysis = analyzeProgram(program, {\n collectTargetExpressions: true,\n expressionSpanLookup: createSpanLookup(targetExpressionSpans),\n });\n\n return extractExpressions(\n code,\n filename,\n evaluate,\n program,\n analysis,\n analysis.targetExpressions,\n staticBindings\n );\n};\n\nexport const collectOxcTemplateDependencies = (\n code: string,\n filename: string,\n evaluate = false,\n targetTemplateSpans?: ExpressionSpan[]\n): TemplateExtractionResult => {\n const program = parseOxc(code, filename);\n const analysis = analyzeProgram(program, {\n collectTemplateLiterals: true,\n templateSpanLookup: createSpanLookup(targetTemplateSpans),\n });\n const expressions = analysis.templateLiterals.flatMap(\n (template) => template.expressions\n );\n\n return extractExpressions(\n code,\n filename,\n evaluate,\n program,\n analysis,\n expressions\n );\n};\n"],"file":"expressionExtraction.js"}
@@ -42,6 +42,53 @@ const getObjectMember = (objectValue, property) => {
42
42
  }
43
43
  return objectValue[property];
44
44
  };
45
+ const staticObjectPropertyKey = (property, ctx, env, stack) => {
46
+ if (!property.key) {
47
+ return null;
48
+ }
49
+ let key;
50
+ if (property.computed) {
51
+ key = evaluateStatic(property.key, ctx, env, stack);
52
+ } else if (property.key.type === "Identifier") {
53
+ key = property.key.name;
54
+ } else if (property.key.type === "Literal") {
55
+ key = property.key.value;
56
+ }
57
+ return typeof key === "string" || typeof key === "number" ? key : null;
58
+ };
59
+ const evaluateObjectExpressionMember = (expression, propertyKey, ctx, env, stack) => {
60
+ if (expression.type !== "ObjectExpression") {
61
+ return undefined;
62
+ }
63
+ for (let idx = expression.properties.length - 1; idx >= 0; idx -= 1) {
64
+ const property = expression.properties[idx];
65
+ if (property.type === "SpreadElement") {
66
+ return undefined;
67
+ }
68
+ const key = staticObjectPropertyKey(property, ctx, env, stack);
69
+ if (key === null) {
70
+ return undefined;
71
+ }
72
+ if (key === propertyKey) {
73
+ return evaluateStatic(property.value, ctx, env, stack);
74
+ }
75
+ }
76
+ return undefined;
77
+ };
78
+ const evaluateKnownObjectMember = (expression, propertyKey, ctx, env, stack) => {
79
+ const objectMember = evaluateObjectExpressionMember(expression, propertyKey, ctx, env, stack);
80
+ if (objectMember !== undefined) {
81
+ return objectMember;
82
+ }
83
+ if (expression.type !== "Identifier" || env.has(expression.name)) {
84
+ return undefined;
85
+ }
86
+ const binding = resolveBindingAt(ctx, expression.name, expression.start);
87
+ if (!binding || binding.kind === "param" || binding.importedFrom || binding.isRoot || stack.includes(binding.name) || !binding.declarator?.init || binding.declarator.id.type !== "Identifier") {
88
+ return undefined;
89
+ }
90
+ return evaluateKnownObjectMember(binding.declarator.init, propertyKey, ctx, env, [...stack, binding.name]);
91
+ };
45
92
  const oxcStaticCallableValue = Symbol("wyw.oxc.staticCallableValue");
46
93
  const isOxcStaticCallableValue = (value) => typeof value === "object" && value !== null && oxcStaticCallableValue in value;
47
94
  const unwrapOxcStaticCallableValue = (value) => isOxcStaticCallableValue(value) ? value[oxcStaticCallableValue] : value;
@@ -440,6 +487,10 @@ export const evaluateStatic = (expression, ctx, env = new Map(), stack = []) =>
440
487
  // ?? / || branch (or a runtime read) is more predictable.
441
488
  return undefined;
442
489
  }
490
+ const knownObjectMember = evaluateKnownObjectMember(expression.object, key, ctx, env, stack);
491
+ if (knownObjectMember !== undefined) {
492
+ return knownObjectMember;
493
+ }
443
494
  const objectValue = evaluateStatic(expression.object, ctx, env, stack);
444
495
  if (objectValue === undefined) {
445
496
  return undefined;
@@ -1 +1 @@
1
- {"mappings":"AASA,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AAGjC,OAAO,MAAM,eAAe,UAAkC;AAC5D,KAAI,OAAO,UAAU,UAAU;AAC7B,SAAO,OAAO,SAAS,MAAM,GAAG,KAAK,UAAU,MAAM,GAAG;;AAG1D,KACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,SAAO,KAAK,UAAU,MAAM;;AAG9B,KAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,SAAO,KAAK,UAAU,MAAM;;AAG9B,KAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,SAAO,IAAI,KAAK,UAAU,MAAM,CAAC;;AAGnC,QAAO;;AAGT,OAAO,MAAM,6BAA6B,UACxC,YAAY,MAAM,KAAK;AAEzB,OAAO,MAAM,oBAAoB,UAA4B;AAC3D,KAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,SAAO,MAAM,KAAK,SAAS,iBAAiB,KAAK,CAAC;;AAGpD,KAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,SAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,iBAAiB,KAAK,CAAC,CAAC,CAC1E;;AAGH,QAAO;;AAGT,MAAM,aAAa,KAAK;AACxB,MAAM,iBAAiB,KAAK;AAE5B,MAAM,WAAW,UAA0B;AACzC,KAAI,CAAC,OAAO,SAAS,MAAM,IAAI,UAAU,GAAG;AAC1C,SAAO;;CAGT,MAAM,UAAU,KAAK,KAAK,MAAM,GAAG,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC;CAC9D,MAAM,YAAa,UAAU,aAAc,cAAc;AAEzD,QAAO,YAAY,iBAAiB,WAAW,aAAa;;AAG9D,MAAM,cAAc,UAA0B,CAAC,QAAQ,MAAM,GAAG;AAEhE,MAAM,mBACJ,aACA,aACwB;AACxB,KACE,gBAAgB,QAChB,gBAAgB,aACf,OAAO,gBAAgB,YACtB,OAAO,gBAAgB,YACvB,OAAO,gBAAgB,YACvB,OAAO,gBAAgB,WACzB;AACA,SAAO;;AAGT,QAAQ,YAAiD;;AAK3D,MAAM,yBAAyB,OAAO,8BAA8B;AAMpE,MAAM,4BACJ,UAEA,OAAO,UAAU,YACjB,UAAU,QACV,0BAA0B;AAE5B,MAAM,gCAAgC,UACpC,yBAAyB,MAAM,GAAG,MAAM,0BAA0B;AAEpE,OAAO,MAAM,gCACX,WAC4B,GAC3B,yBAAyB,OAC3B;AAED,MAAM,sBACJ,SACA,OACA,KACA,KACA,UACY;AACZ,KAAI,QAAQ,SAAS,cAAc;AACjC,MAAI,IAAI,QAAQ,MAAM,MAAM;AAC5B,SAAO;;AAGT,KAAI,QAAQ,SAAS,qBAAqB;AACxC,SAAO,mBACL,QAAQ,MACR,UAAU,YACN,eAAe,QAAQ,OAAO,KAAK,KAAK,MAAM,GAC9C,OACJ,KACA,KACA,MACD;;AAGH,KAAI,QAAQ,SAAS,iBAAiB;AACpC,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAO;;AAGT,SAAO,QAAQ,WAAW,OAAO,aAAa;AAC5C,OAAI,SAAS,SAAS,eAAe;AACnC,WAAO;;GAGT,IAAI;AACJ,OAAI,SAAS,UAAU;AACrB,UAAM,eAAe,SAAS,KAAmB,KAAK,KAAK,MAAM;cACxD,SAAS,IAAI,SAAS,cAAc;AAC7C,UAAM,SAAS,IAAI;cACV,SAAS,IAAI,SAAS,WAAW;AAC1C,UAAM,SAAS,IAAI;;AAErB,OAAI,QAAQ,aAAa,QAAQ,MAAM;AACrC,WAAO;;AAGT,UAAO,mBACL,SAAS,OACT,gBAAgB,OAAO,IAAuB,EAC9C,KACA,KACA,MACD;IACD;;AAGJ,KAAI,QAAQ,SAAS,gBAAgB;AACnC,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAE;AACzB,UAAO;;AAGT,SAAO,QAAQ,SAAS,OAAO,SAAS,UACtC,UACI,mBAAmB,SAAS,MAAM,QAAQ,KAAK,KAAK,MAAM,GAC1D,KACL;;AAGH,QAAO;;AAGT,MAAM,qBACJ,aACA,WACA,UACA,KACA,KACA,UACwB;CACxB,MAAM,eAAe,SAAwD;AAC3E,MAAI,KAAK,SAAS,cAAc;AAC9B,UAAO,KAAK,SAAS,cAAc,EAAE,MAAM,EAAE,EAAE,GAAG;;AAGpD,MAAI,KAAK,SAAS,oBAAoB;AACpC,UAAO;;EAGT,MAAM,SAAS,YAAY,KAAK,OAAO;AACvC,MAAI,CAAC,QAAQ;AACX,UAAO;;EAGT,IAAI;AACJ,MAAI,KAAK,UAAU;AACjB,SAAM,eAAe,KAAK,UAAwB,KAAK,KAAK,MAAM;aACzD,KAAK,SAAS,SAAS,cAAc;AAC9C,SAAM,KAAK,SAAS;;AAEtB,MACE,QAAQ,aACR,QAAQ,QACP,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAC3C;AACA,UAAO;;AAGT,SAAO,EACL,MAAM,CAAC,GAAG,OAAO,MAAM,IAAI,EAC5B;;CAGH,MAAM,WAAW,YACf,SAAS,SAAS,yBAAyB,SAAS,OAAO,SAAS,SACrE;AACD,KAAI,CAAC,UAAU;AACb,SAAO;;CAGT,MAAM,SAAS,iBAAiB,UAAU;AAC1C,KAAI,SAAS,KAAK,WAAW,GAAG;AAC9B,MAAI,SAAS,SAAS,wBAAwB;AAC5C,UAAO;;AAGT,SAAO,eAAe,SAAS,OAAO,KAAK,KAAK,MAAM;;CAGxD,IAAI,SAAS;AACb,MAAK,IAAI,MAAM,GAAG,MAAM,SAAS,KAAK,SAAS,GAAG,OAAO,GAAG;EAC1D,MAAM,MAAM,SAAS,KAAK;EAC1B,MAAM,OAAO,SAAS;AACtB,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,UAAO;;AAGT,WAAS;;CAGX,MAAM,UAAU,SAAS,KAAK,SAAS,KAAK,SAAS;AACrD,KAAI,SAAS,SAAS,wBAAwB;EAC5C,MAAM,YAAY,eAAe,SAAS,OAAO,KAAK,KAAK,MAAM;AACjE,MAAI,cAAc,WAAW;AAC3B,UAAO;;AAGT,SAAO,WAAW;AAClB,SAAO;;CAGT,MAAM,eAAe,OAAO;AAC5B,KAAI,OAAO,iBAAiB,UAAU;AACpC,SAAO;;AAGT,QAAO,WACL,SAAS,aAAa,OAAO,eAAe,IAAI,eAAe;AACjE,QAAO;;AAGT,MAAM,wBACJ,IACA,MACA,KACA,KACA,UACwB;AACxB,KAAI,GAAG,SAAS,CAAC,GAAG,MAAM;AACxB,SAAO;;CAGT,MAAM,WAAW,IAAI,IAAI,IAAI;AAC7B,MAAK,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,QAAQ,OAAO,GAAG;AAClD,MAAI,CAAC,mBAAmB,GAAG,OAAO,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,EAAE;AACxE,UAAO;;;AAIX,KAAI,GAAG,KAAK,SAAS,kBAAkB;AACrC,SAAO,eAAe,GAAG,MAAoB,KAAK,UAAU,MAAM;;AAGpE,MAAK,MAAM,aAAa,GAAG,KAAK,MAAM;AACpC,MAAI,UAAU,SAAS,uBAAuB;AAC5C,QAAK,MAAM,cAAc,UAAU,cAAc;IAC/C,MAAM,QAAQ,WAAW,OACrB,eAAe,WAAW,MAAM,KAAK,UAAU,MAAM,GACrD;AACJ,QAAI,CAAC,mBAAmB,WAAW,IAAI,OAAO,KAAK,UAAU,MAAM,EAAE;AACnE,YAAO;;;AAGX;;AAGF,MAAI,UAAU,SAAS,mBAAmB;AACxC,OAAI,CAAC,UAAU,UAAU;AACvB,WAAO;;AAGT,UAAO,eAAe,UAAU,UAAU,KAAK,UAAU,MAAM;;AAGjE,SAAO;;AAGT,QAAO;;AAGT,MAAM,sBAAsB,SAAwB;AAClD,KAAI,KAAK,SAAS,sBAAsB,KAAK,UAAU;AACrD,SAAO;;AAGT,KAAI,KAAK,SAAS,SAAS,gBAAgB,KAAK,SAAS,SAAS,OAAO;AACvE,SAAO;;AAGT,QAAO,KAAK,OAAO,SAAS,gBAAgB,KAAK,OAAO,SAAS;;AAGnE,MAAM,2BACJ,YACA,QAEA,WAAW,SAAS,sBACpB,mBAAmB,WAAW,OAAO,IACrC,CAAC,IAAI,IAAI,UAAU;AAErB,MAAM,sCACJ,YACA,KACA,QACY;AACZ,KAAI,wBAAwB,YAAY,IAAI,EAAE;AAC5C,SAAO;;AAGT,KAAI,WAAW,SAAS,qBAAqB,WAAW,aAAa,QAAQ;AAC3E,SAAO;;AAGT,QACE,WAAW,SAAS,gBACpB,WAAW,SAAS,eACpB,CAAC,iBAAiB,KAAK,WAAW,MAAM,WAAW,MAAM;;AAI7D,MAAM,kBACJ,YACA,KACA,MAAe,IAAI,KAAK,EACxB,QAAkB,EAAE,KACI;AACxB,KAAI,WAAW,SAAS,oBAAoB;AAC1C,SAAO;;CAGT,MAAM,OAAO,eAAe,WAAW,MAAoB,KAAK,KAAK,MAAM;CAC3E,MAAM,QAAQ,eAAe,WAAW,OAAqB,KAAK,KAAK,MAAM;CAE7E,MAAM,+BACJ,SAAS,aACT,mCAAmC,WAAW,MAAoB,KAAK,IAAI;CAC7E,MAAM,gCACJ,UAAU,aACV,mCACE,WAAW,OACX,KACA,IACD;AAEH,KACG,SAAS,aAAa,CAAC,gCACvB,UAAU,aAAa,CAAC,+BACzB;AACA,SAAO;;AAGT,SAAQ,WAAW,UAAnB;EACE,KAAK,MACH,QAAO,SAAS;EAClB,KAAK,MACH,QAAO,SAAS;EAClB,KAAK;;AAEH,SAAO,QAAQ;EACjB,KAAK;;AAEH,SAAO,QAAQ;EACjB,QACE;;AAGJ,KAAI,WAAW,aAAa,KAAK;AAC/B,MAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU;AACzD,UAAO,OAAO;;AAGhB,OACG,OAAO,SAAS,YAAY,OAAO,SAAS,cAC5C,OAAO,UAAU,YAAY,OAAO,UAAU,WAC/C;AACA,UAAO,GAAG,OAAO;;;AAIrB,KAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU;AACzD,UAAQ,WAAW,UAAnB;GACE,KAAK,IACH,QAAO,OAAO;GAChB,KAAK,KACH,QAAO,QAAQ;GACjB,KAAK,IACH,QAAO,OAAO;GAChB,KAAK,KACH,QAAO,QAAQ;GACjB,KAAK,IACH,QAAO,OAAO;GAChB,KAAK,IACH,QAAO,OAAO;GAChB,KAAK,IACH,QAAO,OAAO;GAChB,KAAK,IACH,QAAO,OAAO;GAChB,KAAK,KACH,QAAO,QAAQ;GACjB,QACE;;;AAIN,QAAO;;AAGT,OAAO,MAAM,kBACX,YACA,KACA,MAAe,IAAI,KAAK,EACxB,QAAkB,EAAE,KACI;AACxB,KACE,WAAW,SAAS,oBACpB,WAAW,SAAS,2BACpB,WAAW,SAAS,yBACpB,WAAW,SAAS,+BACpB,WAAW,SAAS,qBACpB,WAAW,SAAS,2BACpB;AACA,SAAO,eAAe,WAAW,YAA0B,KAAK,KAAK,MAAM;;AAG7E,KAAI,WAAW,SAAS,WAAW;AACjC,SAAO,WAAW;;AAGpB,KAAI,WAAW,SAAS,mBAAmB;AACzC,MAAI,WAAW,aAAa,UAAU;GACpC,MAAM,wBAAwB,wBAC5B,WAAW,UACX,IACD;;;;;GAKD,MAAM,6BACJ,WAAW,SAAS,SAAS,gBAC7B,CAAC,iBACC,KACA,WAAW,SAAS,MACpB,WAAW,SAAS,MACrB;GACH,MAAM,MAAM,eACV,WAAW,UACX,KACA,KACA,MACD;AACD,OAAI,QAAQ,WAAW;AACrB,WAAO,yBAAyB,6BAC5B,cACA;;AAGN,UAAO,OAAO;;EAGhB,MAAM,MAAM,eACV,WAAW,UACX,KACA,KACA,MACD;AACD,MAAI,QAAQ,WAAW;AACrB,UAAO;;AAGT,UAAQ,WAAW,UAAnB;GACE,KAAK,IACH,QAAO,OAAO,QAAQ,WAAW,CAAC,MAAM;GAC1C,KAAK,IACH,QAAO,OAAO,QAAQ,WAAW,CAAC,MAAM;GAC1C,KAAK,IACH,QAAO,CAAC;GACV,KAAK,IACH,QAAO,OAAO,QAAQ,WAAW,WAAW,IAAI,GAAG;GACrD,KAAK,OACH,QAAO;GACT,QACE,QAAO;;;AAIb,KAAI,WAAW,SAAS,qBAAqB;EAC3C,MAAM,OAAO,eAAe,WAAW,MAAM,KAAK,KAAK,MAAM;;;;;EAK7D,MAAM,yBAAyB,wBAC7B,WAAW,MACX,IACD;AAED,MAAI,SAAS,aAAa,CAAC,wBAAwB;AACjD,UAAO;;AAGT,MAAI,WAAW,aAAa,MAAM;AAChC,UAAO,QAAQ,eAAe,WAAW,OAAO,KAAK,KAAK,MAAM;;AAGlE,MAAI,WAAW,aAAa,MAAM;AAChC,UAAO,QAAQ,eAAe,WAAW,OAAO,KAAK,KAAK,MAAM;;AAGlE,MAAI,WAAW,aAAa,MAAM;AAChC,UAAO,QAAQ,eAAe,WAAW,OAAO,KAAK,KAAK,MAAM;;AAGlE,SAAO;;AAGT,KAAI,WAAW,SAAS,yBAAyB;EAC/C,MAAM,OAAO,eAAe,WAAW,MAAM,KAAK,KAAK,MAAM;AAC7D,MAAI,SAAS,WAAW;AACtB,UAAO;;AAGT,SAAO,eACL,OAAO,WAAW,aAAa,WAAW,WAC1C,KACA,KACA,MACD;;AAGH,KAAI,WAAW,SAAS,mBAAmB;EACzC,IAAI,SAAS;AAEb,OAAK,IAAI,MAAM,GAAG,MAAM,WAAW,OAAO,QAAQ,OAAO,GAAG;AAC1D,aAAU,WAAW,OAAO,MAAM,MAAM,UAAU;GAElD,MAAM,iBAAiB,WAAW,YAAY;AAC9C,OAAI,CAAC,gBAAgB;AACnB;;GAGF,MAAM,QAAQ,eAAe,gBAAgB,KAAK,KAAK,MAAM;AAC7D,OACE,UAAU,aACT,OAAO,UAAU,YAAY,OAAO,UAAU,UAC/C;AACA,WAAO;;AAGT,aAAU,OAAO,MAAM;;AAGzB,SAAO;;AAGT,KAAI,WAAW,SAAS,cAAc;AACpC,MAAI,IAAI,IAAI,WAAW,KAAK,EAAE;AAC5B,UAAO,6BAA6B,IAAI,IAAI,WAAW,KAAK,CAAC;;EAG/D,MAAM,UAAU,iBAAiB,KAAK,WAAW,MAAM,WAAW,MAAM;AACxE,MAAI,SAAS,cAAc;;;;GAIzB,MAAM,WAAW,oBACf,IAAI,gBACJ,QAAQ,cACR,QAAQ,SACT;AACD,OAAI,SAAS,SAAS,OAAO,SAAS,UAAU,YAAY;AAC1D,WAAO,SAAS;;AAElB,UAAO;;AAET,MAAI,CAAC,SAAS;AACZ,UAAO;;AAGT,MAAI,QAAQ,SAAS,SAAS;AAC5B,UAAO;;AAGT,MAAI,MAAM,SAAS,QAAQ,KAAK,EAAE;AAChC,UAAO;;EAGT,IAAI;EACJ,MAAM,EAAE,eAAe;EACvB,MAAM,OAAO,YAAY;AACzB,MAAI,MAAM;AACR,OAAI,WAAW,GAAG,SAAS,cAAc;AACvC,WAAO;;AAGT,WAAQ,eAAe,MAAM,KAAK,KAAK,CAAC,GAAG,OAAO,QAAQ,KAAK,CAAC;aACvD,QAAQ,cAAc;AAC/B,WAAQ,QAAQ;;AAGlB,MACE,UAAU,aACV,QAAQ,UACR,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,MAAM,EACrB;GACA,MAAM,YAAY,IAAI,uBAAuB,IAAI,QAAQ,KAAK,IAAI,EAAE;GACpE,IAAI,YAAY,iBAAiB,MAAM;AACvC,QAAK,MAAM,YAAY,WAAW;AAChC,QAAI,SAAS,SAAS,IAAI,wBAAwB;AAChD;;IAGF,MAAM,UAAU,kBACd,QAAQ,MACR,WACA,UACA,KACA,KACA,CAAC,GAAG,OAAO,QAAQ,KAAK,CACzB;AACD,QAAI,YAAY,WAAW;AACzB,YAAO;;AAGT,gBAAY;;AAGd,UAAO;;AAGT,SAAO;;AAGT,KAAI,WAAW,SAAS,oBAAoB;EAC1C,MAAM,SAAkC,EAAE;AAE1C,OAAK,MAAM,YAAY,WAAW,YAAY;AAC5C,OAAI,SAAS,SAAS,iBAAiB;IACrC,MAAM,cAAc,eAAe,SAAS,UAAU,KAAK,KAAK,MAAM;AACtE,QAAI,OAAO,gBAAgB,YAAY,gBAAgB,MAAM;AAC3D,YAAO;;AAGT,WAAO,OAAO,QAAQ,YAAY;AAClC;;GAGF,IAAI;AACJ,OAAI,SAAS,UAAU;AACrB,UAAM,eAAe,SAAS,KAAmB,KAAK,KAAK,MAAM;cACxD,SAAS,IAAI,SAAS,cAAc;AAC7C,UAAM,SAAS,IAAI;cACV,SAAS,IAAI,SAAS,WAAW;AAC1C,UAAM,SAAS,IAAI;;AAErB,OACE,QAAQ,aACR,QAAQ,QACP,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAC3C;AACA,WAAO;;GAGT,MAAM,QAAQ,eAAe,SAAS,OAAO,KAAK,KAAK,MAAM;AAC7D,OAAI,UAAU,WAAW;AACvB,WAAO;;AAGT,UAAO,OAAO;;AAGhB,SAAO;;AAGT,KAAI,WAAW,SAAS,mBAAmB;EACzC,MAAM,SAAoB,EAAE;AAE5B,OAAK,MAAM,WAAW,WAAW,UAAU;AACzC,OAAI,CAAC,SAAS;AACZ,WAAO;;AAGT,OAAI,QAAQ,SAAS,iBAAiB;IACpC,MAAM,cAAc,eAAe,QAAQ,UAAU,KAAK,KAAK,MAAM;AACrE,QAAI,CAAC,MAAM,QAAQ,YAAY,EAAE;AAC/B,YAAO;;AAGT,WAAO,KAAK,GAAG,YAAY;AAC3B;;GAGF,MAAM,QAAQ,eAAe,SAAS,KAAK,KAAK,MAAM;AACtD,OAAI,UAAU,WAAW;AACvB,WAAO;;AAGT,UAAO,KAAK,MAAM;;AAGpB,SAAO;;AAGT,KAAI,WAAW,SAAS,oBAAoB;EAC1C,IAAI;AACJ,MAAI,WAAW,UAAU;AACvB,SAAM,eAAe,WAAW,UAAwB,KAAK,KAAK,MAAM;aAC/D,WAAW,SAAS,SAAS,cAAc;AACpD,SAAM,WAAW,SAAS;;AAE5B,MACE,QAAQ,aACR,QAAQ,QACP,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAC3C;AACA,UAAO;;AAGT,MAAI,wBAAwB,YAAY,IAAI,IAAI,OAAO,QAAQ,UAAU;;;;;AAKvE,UAAO;;EAGT,MAAM,cAAc,eAAe,WAAW,QAAQ,KAAK,KAAK,MAAM;AACtE,MAAI,gBAAgB,WAAW;AAC7B,UAAO;;AAGT,SAAO,gBAAgB,aAAa,IAAI;;AAG1C,KAAI,WAAW,SAAS,iBAAiB;AACvC,MACE,WAAW,OAAO,SAAS,gBAC3B,WAAW,UAAU,WAAW,GAChC;AACA,UAAO;;EAGT,MAAM,CAAC,YAAY,WAAW;AAC9B,MAAI,CAAC,YAAY,SAAS,SAAS,iBAAiB;AAClD,UAAO;;EAGT,MAAM,QAAQ,eAAe,UAAU,KAAK,KAAK,MAAM;AACvD,MAAI,UAAU,WAAW;AACvB,UAAO;;AAGT,MAAI,WAAW,OAAO,SAAS,UAAU;AACvC,UAAO,OAAO,MAAM;;AAGtB,MAAI,WAAW,OAAO,SAAS,UAAU;AACvC,UAAO,OAAO,MAAM;;AAGtB,MAAI,WAAW,OAAO,SAAS,WAAW;AACxC,UAAO,QAAQ,MAAM;;AAGvB,SAAO;;AAGT,KAAI,WAAW,SAAS,kBAAkB;AACxC,MAAI,WAAW,OAAO,SAAS,cAAc;GAC3C,MAAM,OAAO,WAAW,UAAU,KAAK,QACrC,IAAI,SAAS,kBACT,YACA,eAAe,KAAK,KAAK,KAAK,MAAM,CACzC;AACD,OAAI,KAAK,MAAM,UAAU,UAAU,UAAU,EAAE;AAC7C,WAAO;;GAGT,MAAM,iBAAiB,IAAI,IAAI,WAAW,OAAO,KAAK;AACtD,OACE,yBAAyB,eAAe,IACxC,WAAW,UAAU,WAAW,GAChC;AACA,WAAO,6BAA6B,eAAe;;;;AAKrD,OAAI,OAAO,mBAAmB,YAAY;AACxC,QAAI;AACF,YAAQ,eAAgD,GAAG,KAAK;YAC1D;AACN,YAAO;;;AAIX,OAAI,WAAW,OAAO,SAAS,YAAY,KAAK,WAAW,GAAG;AAC5D,WAAO,OAAO,KAAK,GAAG;;AAGxB,OAAI,WAAW,OAAO,SAAS,YAAY,KAAK,WAAW,GAAG;AAC5D,WAAO,OAAO,KAAK,GAAG;;AAGxB,OAAI,WAAW,OAAO,SAAS,aAAa,KAAK,WAAW,GAAG;AAC7D,WAAO,QAAQ,KAAK,GAAG;;GAGzB,MAAM,UAAU,iBACd,KACA,WAAW,OAAO,MAClB,WAAW,OAAO,MACnB;;;;;AAMD,OAAI,SAAS,cAAc;IACzB,MAAM,WAAW,oBACf,IAAI,gBACJ,QAAQ,cACR,QAAQ,SACT;AACD,QAAI,SAAS,SAAS,OAAO,SAAS,UAAU,YAAY;AAC1D,SAAI;AACF,aAAQ,SAAS,MAAuC,GAAG,KAAK;aAC1D;AACN,aAAO;;;;GAKb,MAAM,KAAK,SAAS,gBAAgB,SAAS,YAAY;AACzD,OACE,OACC,GAAG,SAAS,6BACX,GAAG,SAAS,yBACZ,GAAG,SAAS,uBACd;AACA,WAAO,qBAAqB,IAAI,MAAM,KAAK,KAAK,CAC9C,GAAG,OACH,WAAW,OAAO,KACnB,CAAC;;;AAIN,MAAI,WAAW,OAAO,SAAS,oBAAoB;GACjD,MAAM,cAAc,eAClB,WAAW,OAAO,QAClB,KACA,KACA,MACD;GACD,IAAI;AACJ,OAAI,WAAW,OAAO,UAAU;AAC9B,UAAM,eACJ,WAAW,OAAO,UAClB,KACA,KACA,MACD;cACQ,WAAW,OAAO,SAAS,SAAS,cAAc;AAC3D,UAAM,WAAW,OAAO,SAAS;;AAEnC,OAAI,OAAO,gBAAgB,UAAU;AACnC,QAAI,QAAQ,iBAAiB,WAAW,UAAU,WAAW,GAAG;AAC9D,YAAO,YAAY,aAAa;;AAGlC,QAAI,QAAQ,iBAAiB,WAAW,UAAU,WAAW,GAAG;AAC9D,YAAO,YAAY,aAAa;;;;;AAMxC,QAAO,eAAe,YAAY,KAAK,KAAK,MAAM","names":[],"sources":["../../../src/utils/collectOxcTemplateDependencies/staticEvaluator.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport type {\n AssignmentExpression,\n Expression,\n Node,\n UpdateExpression,\n} from 'oxc-parser';\n\nimport { lookupStaticBinding } from './staticBindings';\nimport { resolveBindingAt } from './scopeAnalysis';\nimport type { ExtractionContext, OxcFunctionLikeNode } from './types';\n\nexport const literalCode = (value: unknown): string | null => {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? JSON.stringify(value) : null;\n }\n\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return JSON.stringify(value);\n }\n\n if (typeof value === 'object' && value !== null) {\n return `(${JSON.stringify(value)})`;\n }\n\n return null;\n};\n\nexport const isStaticSerializableValue = (value: unknown): boolean =>\n literalCode(value) !== null;\n\nexport const cloneStaticValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map((item) => cloneStaticValue(item));\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, cloneStaticValue(item)])\n );\n }\n\n return value;\n};\n\nconst INT32_SIZE = 2 ** 32;\nconst INT32_SIGN_BIT = 2 ** 31;\n\nconst toInt32 = (value: number): number => {\n if (!Number.isFinite(value) || value === 0) {\n return 0;\n }\n\n const integer = Math.sign(value) * Math.floor(Math.abs(value));\n const int32bit = ((integer % INT32_SIZE) + INT32_SIZE) % INT32_SIZE;\n\n return int32bit >= INT32_SIGN_BIT ? int32bit - INT32_SIZE : int32bit;\n};\n\nconst bitwiseNot = (value: number): number => -toInt32(value) - 1;\n\nconst getObjectMember = (\n objectValue: unknown,\n property: string | number\n): unknown | undefined => {\n if (\n objectValue === null ||\n objectValue === undefined ||\n (typeof objectValue !== 'object' &&\n typeof objectValue !== 'string' &&\n typeof objectValue !== 'number' &&\n typeof objectValue !== 'boolean')\n ) {\n return undefined;\n }\n\n return (objectValue as Record<string | number, unknown>)[property];\n};\n\ntype EvalEnv = Map<string, unknown>;\n\nconst oxcStaticCallableValue = Symbol('wyw.oxc.staticCallableValue');\n\ntype OxcStaticCallableValue = {\n [oxcStaticCallableValue]: unknown;\n};\n\nconst isOxcStaticCallableValue = (\n value: unknown\n): value is OxcStaticCallableValue =>\n typeof value === 'object' &&\n value !== null &&\n oxcStaticCallableValue in value;\n\nconst unwrapOxcStaticCallableValue = (value: unknown): unknown =>\n isOxcStaticCallableValue(value) ? value[oxcStaticCallableValue] : value;\n\nexport const createOxcStaticCallableValue = (\n value: unknown\n): OxcStaticCallableValue => ({\n [oxcStaticCallableValue]: value,\n});\n\nconst assignPatternValue = (\n pattern: Node,\n value: unknown,\n ctx: ExtractionContext,\n env: EvalEnv,\n stack: string[]\n): boolean => {\n if (pattern.type === 'Identifier') {\n env.set(pattern.name, value);\n return true;\n }\n\n if (pattern.type === 'AssignmentPattern') {\n return assignPatternValue(\n pattern.left,\n value === undefined\n ? evaluateStatic(pattern.right, ctx, env, stack)\n : value,\n ctx,\n env,\n stack\n );\n }\n\n if (pattern.type === 'ObjectPattern') {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n return pattern.properties.every((property) => {\n if (property.type === 'RestElement') {\n return false;\n }\n\n let key: unknown;\n if (property.computed) {\n key = evaluateStatic(property.key as Expression, ctx, env, stack);\n } else if (property.key.type === 'Identifier') {\n key = property.key.name;\n } else if (property.key.type === 'Literal') {\n key = property.key.value;\n }\n if (key === undefined || key === null) {\n return false;\n }\n\n return assignPatternValue(\n property.value,\n getObjectMember(value, key as string | number),\n ctx,\n env,\n stack\n );\n });\n }\n\n if (pattern.type === 'ArrayPattern') {\n if (!Array.isArray(value)) {\n return false;\n }\n\n return pattern.elements.every((element, index) =>\n element\n ? assignPatternValue(element, value[index], ctx, env, stack)\n : true\n );\n }\n\n return false;\n};\n\nconst applyRootMutation = (\n bindingName: string,\n baseValue: unknown,\n mutation: AssignmentExpression | UpdateExpression,\n ctx: ExtractionContext,\n env: EvalEnv,\n stack: string[]\n): unknown | undefined => {\n const resolvePath = (node: Node): { path: Array<string | number> } | null => {\n if (node.type === 'Identifier') {\n return node.name === bindingName ? { path: [] } : null;\n }\n\n if (node.type !== 'MemberExpression') {\n return null;\n }\n\n const parent = resolvePath(node.object);\n if (!parent) {\n return null;\n }\n\n let key: unknown;\n if (node.computed) {\n key = evaluateStatic(node.property as Expression, ctx, env, stack);\n } else if (node.property.type === 'Identifier') {\n key = node.property.name;\n }\n if (\n key === undefined ||\n key === null ||\n (typeof key !== 'string' && typeof key !== 'number')\n ) {\n return null;\n }\n\n return {\n path: [...parent.path, key],\n };\n };\n\n const pathInfo = resolvePath(\n mutation.type === 'AssignmentExpression' ? mutation.left : mutation.argument\n );\n if (!pathInfo) {\n return undefined;\n }\n\n const cloned = cloneStaticValue(baseValue);\n if (pathInfo.path.length === 0) {\n if (mutation.type !== 'AssignmentExpression') {\n return undefined;\n }\n\n return evaluateStatic(mutation.right, ctx, env, stack);\n }\n\n let target = cloned as Record<string | number, unknown>;\n for (let idx = 0; idx < pathInfo.path.length - 1; idx += 1) {\n const key = pathInfo.path[idx];\n const next = target?.[key];\n if (typeof next !== 'object' || next === null) {\n return undefined;\n }\n\n target = next as Record<string | number, unknown>;\n }\n\n const lastKey = pathInfo.path[pathInfo.path.length - 1]!;\n if (mutation.type === 'AssignmentExpression') {\n const nextValue = evaluateStatic(mutation.right, ctx, env, stack);\n if (nextValue === undefined) {\n return undefined;\n }\n\n target[lastKey] = nextValue;\n return cloned;\n }\n\n const currentValue = target[lastKey];\n if (typeof currentValue !== 'number') {\n return undefined;\n }\n\n target[lastKey] =\n mutation.operator === '++' ? currentValue + 1 : currentValue - 1;\n return cloned;\n};\n\nconst evaluateFunctionCall = (\n fn: OxcFunctionLikeNode,\n args: unknown[],\n ctx: ExtractionContext,\n env: EvalEnv,\n stack: string[]\n): unknown | undefined => {\n if (fn.async || !fn.body) {\n return undefined;\n }\n\n const localEnv = new Map(env);\n for (let idx = 0; idx < fn.params.length; idx += 1) {\n if (!assignPatternValue(fn.params[idx], args[idx], ctx, localEnv, stack)) {\n return undefined;\n }\n }\n\n if (fn.body.type !== 'BlockStatement') {\n return evaluateStatic(fn.body as Expression, ctx, localEnv, stack);\n }\n\n for (const statement of fn.body.body) {\n if (statement.type === 'VariableDeclaration') {\n for (const declarator of statement.declarations) {\n const value = declarator.init\n ? evaluateStatic(declarator.init, ctx, localEnv, stack)\n : undefined;\n if (!assignPatternValue(declarator.id, value, ctx, localEnv, stack)) {\n return undefined;\n }\n }\n continue;\n }\n\n if (statement.type === 'ReturnStatement') {\n if (!statement.argument) {\n return undefined;\n }\n\n return evaluateStatic(statement.argument, ctx, localEnv, stack);\n }\n\n return undefined;\n }\n\n return undefined;\n};\n\nconst 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\nconst isProcessEnvValueAccess = (\n expression: Expression,\n env: EvalEnv\n): boolean =>\n expression.type === 'MemberExpression' &&\n isProcessEnvMember(expression.object) &&\n !env.has('process');\n\nconst isDeterministicUndefinedExpression = (\n expression: Expression,\n ctx: ExtractionContext,\n env: EvalEnv\n): boolean => {\n if (isProcessEnvValueAccess(expression, env)) {\n return true;\n }\n\n if (expression.type === 'UnaryExpression' && expression.operator === 'void') {\n return true;\n }\n\n return (\n expression.type === 'Identifier' &&\n expression.name === 'undefined' &&\n !resolveBindingAt(ctx, expression.name, expression.start)\n );\n};\n\nconst evaluateBinary = (\n expression: Expression,\n ctx: ExtractionContext,\n env: EvalEnv = new Map(),\n stack: string[] = []\n): unknown | undefined => {\n if (expression.type !== 'BinaryExpression') {\n return undefined;\n }\n\n const left = evaluateStatic(expression.left as Expression, ctx, env, stack);\n const right = evaluateStatic(expression.right as Expression, ctx, env, stack);\n\n const leftIsDeterministicUndefined =\n left === undefined &&\n isDeterministicUndefinedExpression(expression.left as Expression, ctx, env);\n const rightIsDeterministicUndefined =\n right === undefined &&\n isDeterministicUndefinedExpression(\n expression.right as Expression,\n ctx,\n env\n );\n\n if (\n (left === undefined && !leftIsDeterministicUndefined) ||\n (right === undefined && !rightIsDeterministicUndefined)\n ) {\n return undefined;\n }\n\n switch (expression.operator) {\n case '===':\n return left === right;\n case '!==':\n return left !== right;\n case '==':\n // eslint-disable-next-line eqeqeq\n return left == right;\n case '!=':\n // eslint-disable-next-line eqeqeq\n return left != right;\n default:\n break;\n }\n\n if (expression.operator === '+') {\n if (typeof left === 'number' && typeof right === 'number') {\n return left + right;\n }\n\n if (\n (typeof left === 'string' || typeof left === 'number') &&\n (typeof right === 'string' || typeof right === 'number')\n ) {\n return `${left}${right}`;\n }\n }\n\n if (typeof left === 'number' && typeof right === 'number') {\n switch (expression.operator) {\n case '<':\n return left < right;\n case '<=':\n return left <= right;\n case '>':\n return left > right;\n case '>=':\n return left >= right;\n case '-':\n return left - right;\n case '*':\n return left * right;\n case '/':\n return left / right;\n case '%':\n return left % right;\n case '**':\n return left ** right;\n default:\n break;\n }\n }\n\n return undefined;\n};\n\nexport const evaluateStatic = (\n expression: Expression,\n ctx: ExtractionContext,\n env: EvalEnv = new Map(),\n stack: string[] = []\n): unknown | undefined => {\n if (\n expression.type === 'TSAsExpression' ||\n expression.type === 'TSSatisfiesExpression' ||\n expression.type === 'TSNonNullExpression' ||\n expression.type === 'TSInstantiationExpression' ||\n expression.type === 'TSTypeAssertion' ||\n expression.type === 'ParenthesizedExpression'\n ) {\n return evaluateStatic(expression.expression as Expression, ctx, env, stack);\n }\n\n if (expression.type === 'Literal') {\n return expression.value;\n }\n\n if (expression.type === 'UnaryExpression') {\n if (expression.operator === 'typeof') {\n const argIsProcessEnvAccess = isProcessEnvValueAccess(\n expression.argument as Expression,\n env\n );\n // `typeof someIdentifier` is the canonical undeclared-global\n // probe — it returns 'undefined' regardless of whether the\n // symbol is declared. Only fold truly unbound identifiers: declared\n // but dynamic locals still have runtime values we cannot infer.\n const argIsUnboundBareIdentifier =\n expression.argument.type === 'Identifier' &&\n !resolveBindingAt(\n ctx,\n expression.argument.name,\n expression.argument.start\n );\n const arg = evaluateStatic(\n expression.argument as Expression,\n ctx,\n env,\n stack\n );\n if (arg === undefined) {\n return argIsProcessEnvAccess || argIsUnboundBareIdentifier\n ? 'undefined'\n : undefined;\n }\n\n return typeof arg;\n }\n\n const arg = evaluateStatic(\n expression.argument as Expression,\n ctx,\n env,\n stack\n );\n if (arg === undefined) {\n return undefined;\n }\n\n switch (expression.operator) {\n case '-':\n return typeof arg === 'number' ? -arg : undefined;\n case '+':\n return typeof arg === 'number' ? +arg : undefined;\n case '!':\n return !arg;\n case '~':\n return typeof arg === 'number' ? bitwiseNot(arg) : undefined;\n case 'void':\n return undefined;\n default:\n return undefined;\n }\n }\n\n if (expression.type === 'LogicalExpression') {\n const left = evaluateStatic(expression.left, ctx, env, stack);\n // process.env.X access is the only source we trust as \"deterministically\n // undefined\" — it's a build-time lookup we control. For everything else,\n // undefined means \"couldn't evaluate\" and we must bail to avoid inlining\n // a wrong fallback when the runtime value isn't actually nullish.\n const leftIsProcessEnvAccess = isProcessEnvValueAccess(\n expression.left,\n env\n );\n\n if (left === undefined && !leftIsProcessEnvAccess) {\n return undefined;\n }\n\n if (expression.operator === '||') {\n return left || evaluateStatic(expression.right, ctx, env, stack);\n }\n\n if (expression.operator === '??') {\n return left ?? evaluateStatic(expression.right, ctx, env, stack);\n }\n\n if (expression.operator === '&&') {\n return left && evaluateStatic(expression.right, ctx, env, stack);\n }\n\n return undefined;\n }\n\n if (expression.type === 'ConditionalExpression') {\n const test = evaluateStatic(expression.test, ctx, env, stack);\n if (test === undefined) {\n return undefined;\n }\n\n return evaluateStatic(\n test ? expression.consequent : expression.alternate,\n ctx,\n env,\n stack\n );\n }\n\n if (expression.type === 'TemplateLiteral') {\n let result = '';\n\n for (let idx = 0; idx < expression.quasis.length; idx += 1) {\n result += expression.quasis[idx]?.value.cooked ?? '';\n\n const nextExpression = expression.expressions[idx];\n if (!nextExpression) {\n continue;\n }\n\n const value = evaluateStatic(nextExpression, ctx, env, stack);\n if (\n value === undefined ||\n (typeof value !== 'string' && typeof value !== 'number')\n ) {\n return undefined;\n }\n\n result += String(value);\n }\n\n return result;\n }\n\n if (expression.type === 'Identifier') {\n if (env.has(expression.name)) {\n return unwrapOxcStaticCallableValue(env.get(expression.name));\n }\n\n const binding = resolveBindingAt(ctx, expression.name, expression.start);\n if (binding?.importedFrom) {\n // staticBindings can supply a literal value for an imported name,\n // bypassing whatever the source module would otherwise resolve to.\n // Function values are deferred to the CallExpression branch.\n const override = lookupStaticBinding(\n ctx.staticBindings,\n binding.importedFrom,\n binding.imported\n );\n if (override.found && typeof override.value !== 'function') {\n return override.value;\n }\n return undefined;\n }\n if (!binding) {\n return undefined;\n }\n\n if (binding.kind === 'param') {\n return undefined;\n }\n\n if (stack.includes(binding.name)) {\n return undefined;\n }\n\n let value: unknown | undefined;\n const { declarator } = binding;\n const init = declarator?.init;\n if (init) {\n if (declarator.id.type !== 'Identifier') {\n return undefined;\n }\n\n value = evaluateStatic(init, ctx, env, [...stack, binding.name]);\n } else if (binding.functionNode) {\n value = binding.functionNode;\n }\n\n if (\n value !== undefined &&\n binding.isRoot &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n const mutations = ctx.rootMutationsByBinding.get(binding.name) ?? [];\n let nextValue = cloneStaticValue(value);\n for (const mutation of mutations) {\n if (mutation.start >= ctx.currentExpressionStart) {\n break;\n }\n\n const applied = applyRootMutation(\n binding.name,\n nextValue,\n mutation,\n ctx,\n env,\n [...stack, binding.name]\n );\n if (applied === undefined) {\n return undefined;\n }\n\n nextValue = applied;\n }\n\n return nextValue;\n }\n\n return value;\n }\n\n if (expression.type === 'ObjectExpression') {\n const result: Record<string, unknown> = {};\n\n for (const property of expression.properties) {\n if (property.type === 'SpreadElement') {\n const spreadValue = evaluateStatic(property.argument, ctx, env, stack);\n if (typeof spreadValue !== 'object' || spreadValue === null) {\n return undefined;\n }\n\n Object.assign(result, spreadValue);\n continue;\n }\n\n let key: unknown;\n if (property.computed) {\n key = evaluateStatic(property.key as Expression, ctx, env, stack);\n } else if (property.key.type === 'Identifier') {\n key = property.key.name;\n } else if (property.key.type === 'Literal') {\n key = property.key.value;\n }\n if (\n key === undefined ||\n key === null ||\n (typeof key !== 'string' && typeof key !== 'number')\n ) {\n return undefined;\n }\n\n const value = evaluateStatic(property.value, ctx, env, stack);\n if (value === undefined) {\n return undefined;\n }\n\n result[key] = value;\n }\n\n return result;\n }\n\n if (expression.type === 'ArrayExpression') {\n const result: unknown[] = [];\n\n for (const element of expression.elements) {\n if (!element) {\n return undefined;\n }\n\n if (element.type === 'SpreadElement') {\n const spreadValue = evaluateStatic(element.argument, ctx, env, stack);\n if (!Array.isArray(spreadValue)) {\n return undefined;\n }\n\n result.push(...spreadValue);\n continue;\n }\n\n const value = evaluateStatic(element, ctx, env, stack);\n if (value === undefined) {\n return undefined;\n }\n\n result.push(value);\n }\n\n return result;\n }\n\n if (expression.type === 'MemberExpression') {\n let key: unknown;\n if (expression.computed) {\n key = evaluateStatic(expression.property as Expression, ctx, env, stack);\n } else if (expression.property.type === 'Identifier') {\n key = expression.property.name;\n }\n if (\n key === undefined ||\n key === null ||\n (typeof key !== 'string' && typeof key !== 'number')\n ) {\n return undefined;\n }\n\n if (isProcessEnvValueAccess(expression, env) && typeof key === 'string') {\n // Treat process.env.X as deterministically undefined at build time.\n // Reading from real process.env would couple the bundle to whatever\n // happens to be set on the build machine; falling back to the\n // ?? / || branch (or a runtime read) is more predictable.\n return undefined;\n }\n\n const objectValue = evaluateStatic(expression.object, ctx, env, stack);\n if (objectValue === undefined) {\n return undefined;\n }\n\n return getObjectMember(objectValue, key);\n }\n\n if (expression.type === 'NewExpression') {\n if (\n expression.callee.type !== 'Identifier' ||\n expression.arguments.length !== 1\n ) {\n return undefined;\n }\n\n const [argument] = expression.arguments;\n if (!argument || argument.type === 'SpreadElement') {\n return undefined;\n }\n\n const value = evaluateStatic(argument, ctx, env, stack);\n if (value === undefined) {\n return undefined;\n }\n\n if (expression.callee.name === 'String') {\n return String(value);\n }\n\n if (expression.callee.name === 'Number') {\n return Number(value);\n }\n\n if (expression.callee.name === 'Boolean') {\n return Boolean(value);\n }\n\n return undefined;\n }\n\n if (expression.type === 'CallExpression') {\n if (expression.callee.type === 'Identifier') {\n const args = expression.arguments.map((arg) =>\n arg.type === 'SpreadElement'\n ? undefined\n : evaluateStatic(arg, ctx, env, stack)\n );\n if (args.some((value) => value === undefined)) {\n return undefined;\n }\n\n const staticCallable = env.get(expression.callee.name);\n if (\n isOxcStaticCallableValue(staticCallable) &&\n expression.arguments.length === 0\n ) {\n return unwrapOxcStaticCallableValue(staticCallable);\n }\n\n // Plain function in env (e.g. supplied via staticBindings as a\n // pure helper). Invoke with already-evaluated args.\n if (typeof staticCallable === 'function') {\n try {\n return (staticCallable as (...a: unknown[]) => unknown)(...args);\n } catch {\n return undefined;\n }\n }\n\n if (expression.callee.name === 'String' && args.length === 1) {\n return String(args[0]);\n }\n\n if (expression.callee.name === 'Number' && args.length === 1) {\n return Number(args[0]);\n }\n\n if (expression.callee.name === 'Boolean' && args.length === 1) {\n return Boolean(args[0]);\n }\n\n const binding = resolveBindingAt(\n ctx,\n expression.callee.name,\n expression.callee.start\n );\n\n // staticBindings can register a pure helper for an imported name\n // (e.g. linaria's `cx` from '@linaria/core'). When the callee\n // resolves to such an import and every arg evaluated, invoke the\n // helper and return its result as a static value.\n if (binding?.importedFrom) {\n const override = lookupStaticBinding(\n ctx.staticBindings,\n binding.importedFrom,\n binding.imported\n );\n if (override.found && typeof override.value === 'function') {\n try {\n return (override.value as (...a: unknown[]) => unknown)(...args);\n } catch {\n return undefined;\n }\n }\n }\n\n const fn = binding?.functionNode ?? binding?.declarator?.init;\n if (\n fn &&\n (fn.type === 'ArrowFunctionExpression' ||\n fn.type === 'FunctionDeclaration' ||\n fn.type === 'FunctionExpression')\n ) {\n return evaluateFunctionCall(fn, args, ctx, env, [\n ...stack,\n expression.callee.name,\n ]);\n }\n }\n\n if (expression.callee.type === 'MemberExpression') {\n const objectValue = evaluateStatic(\n expression.callee.object,\n ctx,\n env,\n stack\n );\n let key: unknown;\n if (expression.callee.computed) {\n key = evaluateStatic(\n expression.callee.property as Expression,\n ctx,\n env,\n stack\n );\n } else if (expression.callee.property.type === 'Identifier') {\n key = expression.callee.property.name;\n }\n if (typeof objectValue === 'string') {\n if (key === 'toLowerCase' && expression.arguments.length === 0) {\n return objectValue.toLowerCase();\n }\n\n if (key === 'toUpperCase' && expression.arguments.length === 0) {\n return objectValue.toUpperCase();\n }\n }\n }\n }\n\n return evaluateBinary(expression, ctx, env, stack);\n};\n"],"file":"staticEvaluator.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../src/utils/collectOxcTemplateDependencies/staticEvaluator.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport type {\n AssignmentExpression,\n Expression,\n Node,\n UpdateExpression,\n} from 'oxc-parser';\n\nimport { lookupStaticBinding } from './staticBindings';\nimport { resolveBindingAt } from './scopeAnalysis';\nimport type { ExtractionContext, OxcFunctionLikeNode } from './types';\n\nexport const literalCode = (value: unknown): string | null => {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? JSON.stringify(value) : null;\n }\n\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return JSON.stringify(value);\n }\n\n if (typeof value === 'object' && value !== null) {\n return `(${JSON.stringify(value)})`;\n }\n\n return null;\n};\n\nexport const isStaticSerializableValue = (value: unknown): boolean =>\n literalCode(value) !== null;\n\nexport const cloneStaticValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map((item) => cloneStaticValue(item));\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, cloneStaticValue(item)])\n );\n }\n\n return value;\n};\n\nconst INT32_SIZE = 2 ** 32;\nconst INT32_SIGN_BIT = 2 ** 31;\n\nconst toInt32 = (value: number): number => {\n if (!Number.isFinite(value) || value === 0) {\n return 0;\n }\n\n const integer = Math.sign(value) * Math.floor(Math.abs(value));\n const int32bit = ((integer % INT32_SIZE) + INT32_SIZE) % INT32_SIZE;\n\n return int32bit >= INT32_SIGN_BIT ? int32bit - INT32_SIZE : int32bit;\n};\n\nconst bitwiseNot = (value: number): number => -toInt32(value) - 1;\n\nconst getObjectMember = (\n objectValue: unknown,\n property: string | number\n): unknown | undefined => {\n if (\n objectValue === null ||\n objectValue === undefined ||\n (typeof objectValue !== 'object' &&\n typeof objectValue !== 'string' &&\n typeof objectValue !== 'number' &&\n typeof objectValue !== 'boolean')\n ) {\n return undefined;\n }\n\n return (objectValue as Record<string | number, unknown>)[property];\n};\n\nconst staticObjectPropertyKey = (\n property: Node & { computed?: boolean; key?: Node },\n ctx: ExtractionContext,\n env: EvalEnv,\n stack: string[]\n): string | number | null => {\n if (!property.key) {\n return null;\n }\n\n let key: unknown;\n if (property.computed) {\n key = evaluateStatic(property.key as Expression, ctx, env, stack);\n } else if (property.key.type === 'Identifier') {\n key = property.key.name;\n } else if (property.key.type === 'Literal') {\n key = property.key.value;\n }\n\n return typeof key === 'string' || typeof key === 'number' ? key : null;\n};\n\nconst evaluateObjectExpressionMember = (\n expression: Expression,\n propertyKey: string | number,\n ctx: ExtractionContext,\n env: EvalEnv,\n stack: string[]\n): unknown | undefined => {\n if (expression.type !== 'ObjectExpression') {\n return undefined;\n }\n\n for (let idx = expression.properties.length - 1; idx >= 0; idx -= 1) {\n const property = expression.properties[idx]!;\n if (property.type === 'SpreadElement') {\n return undefined;\n }\n\n const key = staticObjectPropertyKey(property, ctx, env, stack);\n if (key === null) {\n return undefined;\n }\n\n if (key === propertyKey) {\n return evaluateStatic(property.value, ctx, env, stack);\n }\n }\n\n return undefined;\n};\n\nconst evaluateKnownObjectMember = (\n expression: Expression,\n propertyKey: string | number,\n ctx: ExtractionContext,\n env: EvalEnv,\n stack: string[]\n): unknown | undefined => {\n const objectMember = evaluateObjectExpressionMember(\n expression,\n propertyKey,\n ctx,\n env,\n stack\n );\n if (objectMember !== undefined) {\n return objectMember;\n }\n\n if (expression.type !== 'Identifier' || env.has(expression.name)) {\n return undefined;\n }\n\n const binding = resolveBindingAt(ctx, expression.name, expression.start);\n if (\n !binding ||\n binding.kind === 'param' ||\n binding.importedFrom ||\n binding.isRoot ||\n stack.includes(binding.name) ||\n !binding.declarator?.init ||\n binding.declarator.id.type !== 'Identifier'\n ) {\n return undefined;\n }\n\n return evaluateKnownObjectMember(\n binding.declarator.init,\n propertyKey,\n ctx,\n env,\n [...stack, binding.name]\n );\n};\n\ntype EvalEnv = Map<string, unknown>;\n\nconst oxcStaticCallableValue = Symbol('wyw.oxc.staticCallableValue');\n\ntype OxcStaticCallableValue = {\n [oxcStaticCallableValue]: unknown;\n};\n\nconst isOxcStaticCallableValue = (\n value: unknown\n): value is OxcStaticCallableValue =>\n typeof value === 'object' &&\n value !== null &&\n oxcStaticCallableValue in value;\n\nconst unwrapOxcStaticCallableValue = (value: unknown): unknown =>\n isOxcStaticCallableValue(value) ? value[oxcStaticCallableValue] : value;\n\nexport const createOxcStaticCallableValue = (\n value: unknown\n): OxcStaticCallableValue => ({\n [oxcStaticCallableValue]: value,\n});\n\nconst assignPatternValue = (\n pattern: Node,\n value: unknown,\n ctx: ExtractionContext,\n env: EvalEnv,\n stack: string[]\n): boolean => {\n if (pattern.type === 'Identifier') {\n env.set(pattern.name, value);\n return true;\n }\n\n if (pattern.type === 'AssignmentPattern') {\n return assignPatternValue(\n pattern.left,\n value === undefined\n ? evaluateStatic(pattern.right, ctx, env, stack)\n : value,\n ctx,\n env,\n stack\n );\n }\n\n if (pattern.type === 'ObjectPattern') {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n return pattern.properties.every((property) => {\n if (property.type === 'RestElement') {\n return false;\n }\n\n let key: unknown;\n if (property.computed) {\n key = evaluateStatic(property.key as Expression, ctx, env, stack);\n } else if (property.key.type === 'Identifier') {\n key = property.key.name;\n } else if (property.key.type === 'Literal') {\n key = property.key.value;\n }\n if (key === undefined || key === null) {\n return false;\n }\n\n return assignPatternValue(\n property.value,\n getObjectMember(value, key as string | number),\n ctx,\n env,\n stack\n );\n });\n }\n\n if (pattern.type === 'ArrayPattern') {\n if (!Array.isArray(value)) {\n return false;\n }\n\n return pattern.elements.every((element, index) =>\n element\n ? assignPatternValue(element, value[index], ctx, env, stack)\n : true\n );\n }\n\n return false;\n};\n\nconst applyRootMutation = (\n bindingName: string,\n baseValue: unknown,\n mutation: AssignmentExpression | UpdateExpression,\n ctx: ExtractionContext,\n env: EvalEnv,\n stack: string[]\n): unknown | undefined => {\n const resolvePath = (node: Node): { path: Array<string | number> } | null => {\n if (node.type === 'Identifier') {\n return node.name === bindingName ? { path: [] } : null;\n }\n\n if (node.type !== 'MemberExpression') {\n return null;\n }\n\n const parent = resolvePath(node.object);\n if (!parent) {\n return null;\n }\n\n let key: unknown;\n if (node.computed) {\n key = evaluateStatic(node.property as Expression, ctx, env, stack);\n } else if (node.property.type === 'Identifier') {\n key = node.property.name;\n }\n if (\n key === undefined ||\n key === null ||\n (typeof key !== 'string' && typeof key !== 'number')\n ) {\n return null;\n }\n\n return {\n path: [...parent.path, key],\n };\n };\n\n const pathInfo = resolvePath(\n mutation.type === 'AssignmentExpression' ? mutation.left : mutation.argument\n );\n if (!pathInfo) {\n return undefined;\n }\n\n const cloned = cloneStaticValue(baseValue);\n if (pathInfo.path.length === 0) {\n if (mutation.type !== 'AssignmentExpression') {\n return undefined;\n }\n\n return evaluateStatic(mutation.right, ctx, env, stack);\n }\n\n let target = cloned as Record<string | number, unknown>;\n for (let idx = 0; idx < pathInfo.path.length - 1; idx += 1) {\n const key = pathInfo.path[idx];\n const next = target?.[key];\n if (typeof next !== 'object' || next === null) {\n return undefined;\n }\n\n target = next as Record<string | number, unknown>;\n }\n\n const lastKey = pathInfo.path[pathInfo.path.length - 1]!;\n if (mutation.type === 'AssignmentExpression') {\n const nextValue = evaluateStatic(mutation.right, ctx, env, stack);\n if (nextValue === undefined) {\n return undefined;\n }\n\n target[lastKey] = nextValue;\n return cloned;\n }\n\n const currentValue = target[lastKey];\n if (typeof currentValue !== 'number') {\n return undefined;\n }\n\n target[lastKey] =\n mutation.operator === '++' ? currentValue + 1 : currentValue - 1;\n return cloned;\n};\n\nconst evaluateFunctionCall = (\n fn: OxcFunctionLikeNode,\n args: unknown[],\n ctx: ExtractionContext,\n env: EvalEnv,\n stack: string[]\n): unknown | undefined => {\n if (fn.async || !fn.body) {\n return undefined;\n }\n\n const localEnv = new Map(env);\n for (let idx = 0; idx < fn.params.length; idx += 1) {\n if (!assignPatternValue(fn.params[idx], args[idx], ctx, localEnv, stack)) {\n return undefined;\n }\n }\n\n if (fn.body.type !== 'BlockStatement') {\n return evaluateStatic(fn.body as Expression, ctx, localEnv, stack);\n }\n\n for (const statement of fn.body.body) {\n if (statement.type === 'VariableDeclaration') {\n for (const declarator of statement.declarations) {\n const value = declarator.init\n ? evaluateStatic(declarator.init, ctx, localEnv, stack)\n : undefined;\n if (!assignPatternValue(declarator.id, value, ctx, localEnv, stack)) {\n return undefined;\n }\n }\n continue;\n }\n\n if (statement.type === 'ReturnStatement') {\n if (!statement.argument) {\n return undefined;\n }\n\n return evaluateStatic(statement.argument, ctx, localEnv, stack);\n }\n\n return undefined;\n }\n\n return undefined;\n};\n\nconst 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\nconst isProcessEnvValueAccess = (\n expression: Expression,\n env: EvalEnv\n): boolean =>\n expression.type === 'MemberExpression' &&\n isProcessEnvMember(expression.object) &&\n !env.has('process');\n\nconst isDeterministicUndefinedExpression = (\n expression: Expression,\n ctx: ExtractionContext,\n env: EvalEnv\n): boolean => {\n if (isProcessEnvValueAccess(expression, env)) {\n return true;\n }\n\n if (expression.type === 'UnaryExpression' && expression.operator === 'void') {\n return true;\n }\n\n return (\n expression.type === 'Identifier' &&\n expression.name === 'undefined' &&\n !resolveBindingAt(ctx, expression.name, expression.start)\n );\n};\n\nconst evaluateBinary = (\n expression: Expression,\n ctx: ExtractionContext,\n env: EvalEnv = new Map(),\n stack: string[] = []\n): unknown | undefined => {\n if (expression.type !== 'BinaryExpression') {\n return undefined;\n }\n\n const left = evaluateStatic(expression.left as Expression, ctx, env, stack);\n const right = evaluateStatic(expression.right as Expression, ctx, env, stack);\n\n const leftIsDeterministicUndefined =\n left === undefined &&\n isDeterministicUndefinedExpression(expression.left as Expression, ctx, env);\n const rightIsDeterministicUndefined =\n right === undefined &&\n isDeterministicUndefinedExpression(\n expression.right as Expression,\n ctx,\n env\n );\n\n if (\n (left === undefined && !leftIsDeterministicUndefined) ||\n (right === undefined && !rightIsDeterministicUndefined)\n ) {\n return undefined;\n }\n\n switch (expression.operator) {\n case '===':\n return left === right;\n case '!==':\n return left !== right;\n case '==':\n // eslint-disable-next-line eqeqeq\n return left == right;\n case '!=':\n // eslint-disable-next-line eqeqeq\n return left != right;\n default:\n break;\n }\n\n if (expression.operator === '+') {\n if (typeof left === 'number' && typeof right === 'number') {\n return left + right;\n }\n\n if (\n (typeof left === 'string' || typeof left === 'number') &&\n (typeof right === 'string' || typeof right === 'number')\n ) {\n return `${left}${right}`;\n }\n }\n\n if (typeof left === 'number' && typeof right === 'number') {\n switch (expression.operator) {\n case '<':\n return left < right;\n case '<=':\n return left <= right;\n case '>':\n return left > right;\n case '>=':\n return left >= right;\n case '-':\n return left - right;\n case '*':\n return left * right;\n case '/':\n return left / right;\n case '%':\n return left % right;\n case '**':\n return left ** right;\n default:\n break;\n }\n }\n\n return undefined;\n};\n\nexport const evaluateStatic = (\n expression: Expression,\n ctx: ExtractionContext,\n env: EvalEnv = new Map(),\n stack: string[] = []\n): unknown | undefined => {\n if (\n expression.type === 'TSAsExpression' ||\n expression.type === 'TSSatisfiesExpression' ||\n expression.type === 'TSNonNullExpression' ||\n expression.type === 'TSInstantiationExpression' ||\n expression.type === 'TSTypeAssertion' ||\n expression.type === 'ParenthesizedExpression'\n ) {\n return evaluateStatic(expression.expression as Expression, ctx, env, stack);\n }\n\n if (expression.type === 'Literal') {\n return expression.value;\n }\n\n if (expression.type === 'UnaryExpression') {\n if (expression.operator === 'typeof') {\n const argIsProcessEnvAccess = isProcessEnvValueAccess(\n expression.argument as Expression,\n env\n );\n // `typeof someIdentifier` is the canonical undeclared-global\n // probe — it returns 'undefined' regardless of whether the\n // symbol is declared. Only fold truly unbound identifiers: declared\n // but dynamic locals still have runtime values we cannot infer.\n const argIsUnboundBareIdentifier =\n expression.argument.type === 'Identifier' &&\n !resolveBindingAt(\n ctx,\n expression.argument.name,\n expression.argument.start\n );\n const arg = evaluateStatic(\n expression.argument as Expression,\n ctx,\n env,\n stack\n );\n if (arg === undefined) {\n return argIsProcessEnvAccess || argIsUnboundBareIdentifier\n ? 'undefined'\n : undefined;\n }\n\n return typeof arg;\n }\n\n const arg = evaluateStatic(\n expression.argument as Expression,\n ctx,\n env,\n stack\n );\n if (arg === undefined) {\n return undefined;\n }\n\n switch (expression.operator) {\n case '-':\n return typeof arg === 'number' ? -arg : undefined;\n case '+':\n return typeof arg === 'number' ? +arg : undefined;\n case '!':\n return !arg;\n case '~':\n return typeof arg === 'number' ? bitwiseNot(arg) : undefined;\n case 'void':\n return undefined;\n default:\n return undefined;\n }\n }\n\n if (expression.type === 'LogicalExpression') {\n const left = evaluateStatic(expression.left, ctx, env, stack);\n // process.env.X access is the only source we trust as \"deterministically\n // undefined\" — it's a build-time lookup we control. For everything else,\n // undefined means \"couldn't evaluate\" and we must bail to avoid inlining\n // a wrong fallback when the runtime value isn't actually nullish.\n const leftIsProcessEnvAccess = isProcessEnvValueAccess(\n expression.left,\n env\n );\n\n if (left === undefined && !leftIsProcessEnvAccess) {\n return undefined;\n }\n\n if (expression.operator === '||') {\n return left || evaluateStatic(expression.right, ctx, env, stack);\n }\n\n if (expression.operator === '??') {\n return left ?? evaluateStatic(expression.right, ctx, env, stack);\n }\n\n if (expression.operator === '&&') {\n return left && evaluateStatic(expression.right, ctx, env, stack);\n }\n\n return undefined;\n }\n\n if (expression.type === 'ConditionalExpression') {\n const test = evaluateStatic(expression.test, ctx, env, stack);\n if (test === undefined) {\n return undefined;\n }\n\n return evaluateStatic(\n test ? expression.consequent : expression.alternate,\n ctx,\n env,\n stack\n );\n }\n\n if (expression.type === 'TemplateLiteral') {\n let result = '';\n\n for (let idx = 0; idx < expression.quasis.length; idx += 1) {\n result += expression.quasis[idx]?.value.cooked ?? '';\n\n const nextExpression = expression.expressions[idx];\n if (!nextExpression) {\n continue;\n }\n\n const value = evaluateStatic(nextExpression, ctx, env, stack);\n if (\n value === undefined ||\n (typeof value !== 'string' && typeof value !== 'number')\n ) {\n return undefined;\n }\n\n result += String(value);\n }\n\n return result;\n }\n\n if (expression.type === 'Identifier') {\n if (env.has(expression.name)) {\n return unwrapOxcStaticCallableValue(env.get(expression.name));\n }\n\n const binding = resolveBindingAt(ctx, expression.name, expression.start);\n if (binding?.importedFrom) {\n // staticBindings can supply a literal value for an imported name,\n // bypassing whatever the source module would otherwise resolve to.\n // Function values are deferred to the CallExpression branch.\n const override = lookupStaticBinding(\n ctx.staticBindings,\n binding.importedFrom,\n binding.imported\n );\n if (override.found && typeof override.value !== 'function') {\n return override.value;\n }\n return undefined;\n }\n if (!binding) {\n return undefined;\n }\n\n if (binding.kind === 'param') {\n return undefined;\n }\n\n if (stack.includes(binding.name)) {\n return undefined;\n }\n\n let value: unknown | undefined;\n const { declarator } = binding;\n const init = declarator?.init;\n if (init) {\n if (declarator.id.type !== 'Identifier') {\n return undefined;\n }\n\n value = evaluateStatic(init, ctx, env, [...stack, binding.name]);\n } else if (binding.functionNode) {\n value = binding.functionNode;\n }\n\n if (\n value !== undefined &&\n binding.isRoot &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n const mutations = ctx.rootMutationsByBinding.get(binding.name) ?? [];\n let nextValue = cloneStaticValue(value);\n for (const mutation of mutations) {\n if (mutation.start >= ctx.currentExpressionStart) {\n break;\n }\n\n const applied = applyRootMutation(\n binding.name,\n nextValue,\n mutation,\n ctx,\n env,\n [...stack, binding.name]\n );\n if (applied === undefined) {\n return undefined;\n }\n\n nextValue = applied;\n }\n\n return nextValue;\n }\n\n return value;\n }\n\n if (expression.type === 'ObjectExpression') {\n const result: Record<string, unknown> = {};\n\n for (const property of expression.properties) {\n if (property.type === 'SpreadElement') {\n const spreadValue = evaluateStatic(property.argument, ctx, env, stack);\n if (typeof spreadValue !== 'object' || spreadValue === null) {\n return undefined;\n }\n\n Object.assign(result, spreadValue);\n continue;\n }\n\n let key: unknown;\n if (property.computed) {\n key = evaluateStatic(property.key as Expression, ctx, env, stack);\n } else if (property.key.type === 'Identifier') {\n key = property.key.name;\n } else if (property.key.type === 'Literal') {\n key = property.key.value;\n }\n if (\n key === undefined ||\n key === null ||\n (typeof key !== 'string' && typeof key !== 'number')\n ) {\n return undefined;\n }\n\n const value = evaluateStatic(property.value, ctx, env, stack);\n if (value === undefined) {\n return undefined;\n }\n\n result[key] = value;\n }\n\n return result;\n }\n\n if (expression.type === 'ArrayExpression') {\n const result: unknown[] = [];\n\n for (const element of expression.elements) {\n if (!element) {\n return undefined;\n }\n\n if (element.type === 'SpreadElement') {\n const spreadValue = evaluateStatic(element.argument, ctx, env, stack);\n if (!Array.isArray(spreadValue)) {\n return undefined;\n }\n\n result.push(...spreadValue);\n continue;\n }\n\n const value = evaluateStatic(element, ctx, env, stack);\n if (value === undefined) {\n return undefined;\n }\n\n result.push(value);\n }\n\n return result;\n }\n\n if (expression.type === 'MemberExpression') {\n let key: unknown;\n if (expression.computed) {\n key = evaluateStatic(expression.property as Expression, ctx, env, stack);\n } else if (expression.property.type === 'Identifier') {\n key = expression.property.name;\n }\n if (\n key === undefined ||\n key === null ||\n (typeof key !== 'string' && typeof key !== 'number')\n ) {\n return undefined;\n }\n\n if (isProcessEnvValueAccess(expression, env) && typeof key === 'string') {\n // Treat process.env.X as deterministically undefined at build time.\n // Reading from real process.env would couple the bundle to whatever\n // happens to be set on the build machine; falling back to the\n // ?? / || branch (or a runtime read) is more predictable.\n return undefined;\n }\n\n const knownObjectMember = evaluateKnownObjectMember(\n expression.object as Expression,\n key,\n ctx,\n env,\n stack\n );\n if (knownObjectMember !== undefined) {\n return knownObjectMember;\n }\n\n const objectValue = evaluateStatic(expression.object, ctx, env, stack);\n if (objectValue === undefined) {\n return undefined;\n }\n\n return getObjectMember(objectValue, key);\n }\n\n if (expression.type === 'NewExpression') {\n if (\n expression.callee.type !== 'Identifier' ||\n expression.arguments.length !== 1\n ) {\n return undefined;\n }\n\n const [argument] = expression.arguments;\n if (!argument || argument.type === 'SpreadElement') {\n return undefined;\n }\n\n const value = evaluateStatic(argument, ctx, env, stack);\n if (value === undefined) {\n return undefined;\n }\n\n if (expression.callee.name === 'String') {\n return String(value);\n }\n\n if (expression.callee.name === 'Number') {\n return Number(value);\n }\n\n if (expression.callee.name === 'Boolean') {\n return Boolean(value);\n }\n\n return undefined;\n }\n\n if (expression.type === 'CallExpression') {\n if (expression.callee.type === 'Identifier') {\n const args = expression.arguments.map((arg) =>\n arg.type === 'SpreadElement'\n ? undefined\n : evaluateStatic(arg, ctx, env, stack)\n );\n if (args.some((value) => value === undefined)) {\n return undefined;\n }\n\n const staticCallable = env.get(expression.callee.name);\n if (\n isOxcStaticCallableValue(staticCallable) &&\n expression.arguments.length === 0\n ) {\n return unwrapOxcStaticCallableValue(staticCallable);\n }\n\n // Plain function in env (e.g. supplied via staticBindings as a\n // pure helper). Invoke with already-evaluated args.\n if (typeof staticCallable === 'function') {\n try {\n return (staticCallable as (...a: unknown[]) => unknown)(...args);\n } catch {\n return undefined;\n }\n }\n\n if (expression.callee.name === 'String' && args.length === 1) {\n return String(args[0]);\n }\n\n if (expression.callee.name === 'Number' && args.length === 1) {\n return Number(args[0]);\n }\n\n if (expression.callee.name === 'Boolean' && args.length === 1) {\n return Boolean(args[0]);\n }\n\n const binding = resolveBindingAt(\n ctx,\n expression.callee.name,\n expression.callee.start\n );\n\n // staticBindings can register a pure helper for an imported name\n // (e.g. linaria's `cx` from '@linaria/core'). When the callee\n // resolves to such an import and every arg evaluated, invoke the\n // helper and return its result as a static value.\n if (binding?.importedFrom) {\n const override = lookupStaticBinding(\n ctx.staticBindings,\n binding.importedFrom,\n binding.imported\n );\n if (override.found && typeof override.value === 'function') {\n try {\n return (override.value as (...a: unknown[]) => unknown)(...args);\n } catch {\n return undefined;\n }\n }\n }\n\n const fn = binding?.functionNode ?? binding?.declarator?.init;\n if (\n fn &&\n (fn.type === 'ArrowFunctionExpression' ||\n fn.type === 'FunctionDeclaration' ||\n fn.type === 'FunctionExpression')\n ) {\n return evaluateFunctionCall(fn, args, ctx, env, [\n ...stack,\n expression.callee.name,\n ]);\n }\n }\n\n if (expression.callee.type === 'MemberExpression') {\n const objectValue = evaluateStatic(\n expression.callee.object,\n ctx,\n env,\n stack\n );\n let key: unknown;\n if (expression.callee.computed) {\n key = evaluateStatic(\n expression.callee.property as Expression,\n ctx,\n env,\n stack\n );\n } else if (expression.callee.property.type === 'Identifier') {\n key = expression.callee.property.name;\n }\n if (typeof objectValue === 'string') {\n if (key === 'toLowerCase' && expression.arguments.length === 0) {\n return objectValue.toLowerCase();\n }\n\n if (key === 'toUpperCase' && expression.arguments.length === 0) {\n return objectValue.toUpperCase();\n }\n }\n }\n }\n\n return evaluateBinary(expression, ctx, env, stack);\n};\n"],"file":"staticEvaluator.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wyw-in-js/transform",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "type": "module",
5
5
  "dependencies": {
6
6
  "@jridgewell/remapping": "^2.3.5",
@@ -326,10 +326,12 @@ const extractExpression = (expression, ctx, evaluate) => {
326
326
  else {
327
327
  hasNonStaticLocalReference = true;
328
328
  }
329
- assertHoistable(binding, ctx);
330
- addHoistedDeclaration(binding, ctx);
331
- if (!binding.isRoot && binding.declarator?.id.type === 'Identifier') {
332
- identifierReplacements.set(name, getHoistedBindingName(binding, ctx));
329
+ if (!isProcessorManagedLocal) {
330
+ assertHoistable(binding, ctx);
331
+ addHoistedDeclaration(binding, ctx);
332
+ if (!binding.isRoot && binding.declarator?.id.type === 'Identifier') {
333
+ identifierReplacements.set(name, getHoistedBindingName(binding, ctx));
334
+ }
333
335
  }
334
336
  });
335
337
  // Merge literal-const inlines (e.g. `const A = 32` -> "32") with
@@ -50,6 +50,61 @@ const getObjectMember = (objectValue, property) => {
50
50
  }
51
51
  return objectValue[property];
52
52
  };
53
+ const staticObjectPropertyKey = (property, ctx, env, stack) => {
54
+ if (!property.key) {
55
+ return null;
56
+ }
57
+ let key;
58
+ if (property.computed) {
59
+ key = evaluateStatic(property.key, ctx, env, stack);
60
+ }
61
+ else if (property.key.type === 'Identifier') {
62
+ key = property.key.name;
63
+ }
64
+ else if (property.key.type === 'Literal') {
65
+ key = property.key.value;
66
+ }
67
+ return typeof key === 'string' || typeof key === 'number' ? key : null;
68
+ };
69
+ const evaluateObjectExpressionMember = (expression, propertyKey, ctx, env, stack) => {
70
+ if (expression.type !== 'ObjectExpression') {
71
+ return undefined;
72
+ }
73
+ for (let idx = expression.properties.length - 1; idx >= 0; idx -= 1) {
74
+ const property = expression.properties[idx];
75
+ if (property.type === 'SpreadElement') {
76
+ return undefined;
77
+ }
78
+ const key = staticObjectPropertyKey(property, ctx, env, stack);
79
+ if (key === null) {
80
+ return undefined;
81
+ }
82
+ if (key === propertyKey) {
83
+ return evaluateStatic(property.value, ctx, env, stack);
84
+ }
85
+ }
86
+ return undefined;
87
+ };
88
+ const evaluateKnownObjectMember = (expression, propertyKey, ctx, env, stack) => {
89
+ const objectMember = evaluateObjectExpressionMember(expression, propertyKey, ctx, env, stack);
90
+ if (objectMember !== undefined) {
91
+ return objectMember;
92
+ }
93
+ if (expression.type !== 'Identifier' || env.has(expression.name)) {
94
+ return undefined;
95
+ }
96
+ const binding = resolveBindingAt(ctx, expression.name, expression.start);
97
+ if (!binding ||
98
+ binding.kind === 'param' ||
99
+ binding.importedFrom ||
100
+ binding.isRoot ||
101
+ stack.includes(binding.name) ||
102
+ !binding.declarator?.init ||
103
+ binding.declarator.id.type !== 'Identifier') {
104
+ return undefined;
105
+ }
106
+ return evaluateKnownObjectMember(binding.declarator.init, propertyKey, ctx, env, [...stack, binding.name]);
107
+ };
53
108
  const oxcStaticCallableValue = Symbol('wyw.oxc.staticCallableValue');
54
109
  const isOxcStaticCallableValue = (value) => typeof value === 'object' &&
55
110
  value !== null &&
@@ -514,6 +569,10 @@ export const evaluateStatic = (expression, ctx, env = new Map(), stack = []) =>
514
569
  // ?? / || branch (or a runtime read) is more predictable.
515
570
  return undefined;
516
571
  }
572
+ const knownObjectMember = evaluateKnownObjectMember(expression.object, key, ctx, env, stack);
573
+ if (knownObjectMember !== undefined) {
574
+ return knownObjectMember;
575
+ }
517
576
  const objectValue = evaluateStatic(expression.object, ctx, env, stack);
518
577
  if (objectValue === undefined) {
519
578
  return undefined;