@wyw-in-js/transform 2.0.0-alpha.1 → 2.0.0

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.
Files changed (41) hide show
  1. package/esm/transform/Entrypoint.types.js.map +1 -1
  2. package/esm/transform/generators/collect.js +1 -0
  3. package/esm/transform/generators/collect.js.map +1 -1
  4. package/esm/transform/generators/resolveStaticOxcValues/prune.js +91 -5
  5. package/esm/transform/generators/resolveStaticOxcValues/prune.js.map +1 -1
  6. package/esm/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js +2 -1
  7. package/esm/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js.map +1 -1
  8. package/esm/transform/generators/transform.js +1 -0
  9. package/esm/transform/generators/transform.js.map +1 -1
  10. package/esm/utils/EventEmitter.js +13 -0
  11. package/esm/utils/EventEmitter.js.map +1 -1
  12. package/esm/utils/applyOxcProcessors/applyOxcProcessors.js +1 -1
  13. package/esm/utils/applyOxcProcessors/applyOxcProcessors.js.map +1 -1
  14. package/esm/utils/applyOxcProcessors/cleanupRemovals.js +102 -16
  15. package/esm/utils/applyOxcProcessors/cleanupRemovals.js.map +1 -1
  16. package/esm/utils/collectOxcExportsAndImports.js +8 -0
  17. package/esm/utils/collectOxcExportsAndImports.js.map +1 -1
  18. package/esm/utils/collectOxcRuntime/types.js.map +1 -1
  19. package/esm/utils/oxc/ast.js +42 -12
  20. package/esm/utils/oxc/ast.js.map +1 -1
  21. package/esm/utils/oxcPreevalTransforms.js +94 -65
  22. package/esm/utils/oxcPreevalTransforms.js.map +1 -1
  23. package/esm/utils/parseOxc.js +6 -1
  24. package/esm/utils/parseOxc.js.map +1 -1
  25. package/package.json +5 -5
  26. package/types/transform/Entrypoint.types.d.ts +1 -0
  27. package/types/transform/generators/collect.js +1 -0
  28. package/types/transform/generators/resolveStaticOxcValues/prune.d.ts +1 -1
  29. package/types/transform/generators/resolveStaticOxcValues/prune.js +96 -4
  30. package/types/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js +2 -1
  31. package/types/transform/generators/transform.js +1 -0
  32. package/types/utils/EventEmitter.js +13 -0
  33. package/types/utils/applyOxcProcessors/applyOxcProcessors.d.ts +1 -0
  34. package/types/utils/applyOxcProcessors/applyOxcProcessors.js +3 -1
  35. package/types/utils/applyOxcProcessors/cleanupRemovals.d.ts +2 -2
  36. package/types/utils/applyOxcProcessors/cleanupRemovals.js +104 -19
  37. package/types/utils/collectOxcExportsAndImports.js +8 -0
  38. package/types/utils/collectOxcRuntime/types.d.ts +1 -0
  39. package/types/utils/oxc/ast.js +42 -18
  40. package/types/utils/oxcPreevalTransforms.js +97 -74
  41. package/types/utils/parseOxc.js +6 -1
@@ -1 +1 @@
1
- {"mappings":"","names":[],"sources":["../../src/transform/Entrypoint.types.ts"],"version":3,"sourcesContent":["import type {\n Debugger,\n Evaluator,\n TransformEngineOptions,\n} from '@wyw-in-js/shared';\n\nimport type { Services } from './types';\nimport type { WYWTransformMetadata } from '../utils/TransformMetadata';\n\nexport type ParsedAst = unknown;\n\nexport interface IEntrypointCode {\n readonly ast: ParsedAst;\n code: string;\n evalConfig: TransformEngineOptions;\n evaluator: Evaluator;\n}\n\nexport interface IIgnoredEntrypoint {\n readonly ast?: ParsedAst;\n readonly code?: string;\n evaluator: 'ignored';\n reason: 'extension' | 'rule';\n}\n\nexport interface IEntrypointDependency {\n only: string[];\n resolved: string | null;\n source: string;\n}\n\nexport interface IPreevalResult {\n ast: ParsedAst | null;\n baseCode?: string;\n code: string;\n dependencyNames?: string[];\n evalCode?: string;\n metadata: WYWTransformMetadata | null;\n processorClassNames?: Record<string, string>;\n staticSideEffectImportLocals?: string[];\n staticDependencies?: string[];\n staticNullWYWMetaExtendsHelpers?: string[];\n staticValuesApplied?: boolean;\n staticValueCache?: Map<string, unknown>;\n runtimeOnlyStaticValueNames?: string[];\n staticValueCandidates?: Array<{\n imports: Array<{\n imported: 'default' | string;\n importLocal?: string;\n local: string;\n source: string;\n }>;\n name: string;\n source: string;\n }>;\n}\n\nexport type LoadAndParseFn = (\n services: Services,\n name: string,\n loadedCode: string | undefined,\n log: Debugger\n) => IEntrypointCode | IIgnoredEntrypoint;\n"],"file":"Entrypoint.types.js"}
1
+ {"mappings":"","names":[],"sources":["../../src/transform/Entrypoint.types.ts"],"version":3,"sourcesContent":["import type {\n Debugger,\n Evaluator,\n TransformEngineOptions,\n} from '@wyw-in-js/shared';\n\nimport type { Services } from './types';\nimport type { WYWTransformMetadata } from '../utils/TransformMetadata';\n\nexport type ParsedAst = unknown;\n\nexport interface IEntrypointCode {\n readonly ast: ParsedAst;\n code: string;\n evalConfig: TransformEngineOptions;\n evaluator: Evaluator;\n}\n\nexport interface IIgnoredEntrypoint {\n readonly ast?: ParsedAst;\n readonly code?: string;\n evaluator: 'ignored';\n reason: 'extension' | 'rule';\n}\n\nexport interface IEntrypointDependency {\n only: string[];\n resolved: string | null;\n source: string;\n}\n\nexport interface IPreevalResult {\n ast: ParsedAst | null;\n baseCode?: string;\n code: string;\n dependencyNames?: string[];\n evalCode?: string;\n metadata: WYWTransformMetadata | null;\n processorClassNames?: Record<string, string>;\n staticImportLocals?: string[];\n staticSideEffectImportLocals?: string[];\n staticDependencies?: string[];\n staticNullWYWMetaExtendsHelpers?: string[];\n staticValuesApplied?: boolean;\n staticValueCache?: Map<string, unknown>;\n runtimeOnlyStaticValueNames?: string[];\n staticValueCandidates?: Array<{\n imports: Array<{\n imported: 'default' | string;\n importLocal?: string;\n local: string;\n source: string;\n }>;\n name: string;\n source: string;\n }>;\n}\n\nexport type LoadAndParseFn = (\n services: Services,\n name: string,\n loadedCode: string | undefined,\n log: Debugger\n) => IEntrypointCode | IIgnoredEntrypoint;\n"],"file":"Entrypoint.types.js"}
@@ -19,6 +19,7 @@ export function* collect() {
19
19
  }
20
20
  const result = collectOxcRuntime(loadedAndParsed.code, name, options.root ?? process.cwd(), {
21
21
  ...options.pluginOptions,
22
+ preserveSideEffectImportOrderLocals: new Set(preevalResult?.staticImportLocals ?? []),
22
23
  preserveSideEffectImportLocals: new Set(preevalResult?.staticSideEffectImportLocals ?? [])
23
24
  }, valueCache, options.inputSourceMap);
24
25
  return {
@@ -1 +1 @@
1
- {"mappings":"AAAA,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;;;;;;AAQlC,OAAO,UAAU,UAEwB;CACvC,MAAM,EAAE,YAAY,KAAK;CACzB,MAAM,EAAE,eAAe,KAAK;CAC5B,MAAM,EAAE,eAAe;CACvB,MAAM,EAAE,iBAAiB,SAAS;CAClC,MAAM,gBAAgB,WAAW,kBAAkB;AAEnD,KAAI,gBAAgB,cAAc,WAAW;AAC3C,QAAM,IAAI,MAAM,yBAAyB;;AAG3C,KAAI,gBAAgB,cAAc,WAAW;AAC3C,QAAM,IAAI,MACR,eAAe,KAAK,4FACrB;;CAGH,MAAM,SAAS,kBACb,gBAAgB,MAChB,MACA,QAAQ,QAAQ,QAAQ,KAAK,EAC7B;EACE,GAAG,QAAQ;EACX,gCAAgC,IAAI,IAClC,eAAe,gCAAgC,EAAE,CAClD;EACF,EACD,YACA,QAAQ,eACT;AAED,QAAO;EACL,KAAK;EACL,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,UAAU,OAAO;EAClB","names":[],"sources":["../../../src/transform/generators/collect.ts"],"version":3,"sourcesContent":["import { oxcShaker } from '../../shaker';\nimport { collectOxcRuntime } from '../../utils/collectOxcRuntime';\nimport type { ICollectAction, SyncScenarioForAction } from '../types';\n\n/**\n * Parses the specified file, finds tags, applies run-time replacements,\n * removes dead code.\n */\n// eslint-disable-next-line require-yield\nexport function* collect(\n this: ICollectAction\n): SyncScenarioForAction<ICollectAction> {\n const { options } = this.services;\n const { valueCache } = this.data;\n const { entrypoint } = this;\n const { loadedAndParsed, name } = entrypoint;\n const preevalResult = entrypoint.getPreevalResult();\n\n if (loadedAndParsed.evaluator === 'ignored') {\n throw new Error('entrypoint was ignored');\n }\n\n if (loadedAndParsed.evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n const result = collectOxcRuntime(\n loadedAndParsed.code,\n name,\n options.root ?? process.cwd(),\n {\n ...options.pluginOptions,\n preserveSideEffectImportLocals: new Set(\n preevalResult?.staticSideEffectImportLocals ?? []\n ),\n },\n valueCache,\n options.inputSourceMap\n );\n\n return {\n ast: null,\n code: result.code,\n map: result.map,\n metadata: result.metadata,\n };\n}\n"],"file":"collect.js"}
1
+ {"mappings":"AAAA,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;;;;;;AAQlC,OAAO,UAAU,UAEwB;CACvC,MAAM,EAAE,YAAY,KAAK;CACzB,MAAM,EAAE,eAAe,KAAK;CAC5B,MAAM,EAAE,eAAe;CACvB,MAAM,EAAE,iBAAiB,SAAS;CAClC,MAAM,gBAAgB,WAAW,kBAAkB;AAEnD,KAAI,gBAAgB,cAAc,WAAW;AAC3C,QAAM,IAAI,MAAM,yBAAyB;;AAG3C,KAAI,gBAAgB,cAAc,WAAW;AAC3C,QAAM,IAAI,MACR,eAAe,KAAK,4FACrB;;CAGH,MAAM,SAAS,kBACb,gBAAgB,MAChB,MACA,QAAQ,QAAQ,QAAQ,KAAK,EAC7B;EACE,GAAG,QAAQ;EACX,qCAAqC,IAAI,IACvC,eAAe,sBAAsB,EAAE,CACxC;EACD,gCAAgC,IAAI,IAClC,eAAe,gCAAgC,EAAE,CAClD;EACF,EACD,YACA,QAAQ,eACT;AAED,QAAO;EACL,KAAK;EACL,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,UAAU,OAAO;EAClB","names":[],"sources":["../../../src/transform/generators/collect.ts"],"version":3,"sourcesContent":["import { oxcShaker } from '../../shaker';\nimport { collectOxcRuntime } from '../../utils/collectOxcRuntime';\nimport type { ICollectAction, SyncScenarioForAction } from '../types';\n\n/**\n * Parses the specified file, finds tags, applies run-time replacements,\n * removes dead code.\n */\n// eslint-disable-next-line require-yield\nexport function* collect(\n this: ICollectAction\n): SyncScenarioForAction<ICollectAction> {\n const { options } = this.services;\n const { valueCache } = this.data;\n const { entrypoint } = this;\n const { loadedAndParsed, name } = entrypoint;\n const preevalResult = entrypoint.getPreevalResult();\n\n if (loadedAndParsed.evaluator === 'ignored') {\n throw new Error('entrypoint was ignored');\n }\n\n if (loadedAndParsed.evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n const result = collectOxcRuntime(\n loadedAndParsed.code,\n name,\n options.root ?? process.cwd(),\n {\n ...options.pluginOptions,\n preserveSideEffectImportOrderLocals: new Set(\n preevalResult?.staticImportLocals ?? []\n ),\n preserveSideEffectImportLocals: new Set(\n preevalResult?.staticSideEffectImportLocals ?? []\n ),\n },\n valueCache,\n options.inputSourceMap\n );\n\n return {\n ast: null,\n code: result.code,\n map: result.map,\n metadata: result.metadata,\n };\n}\n"],"file":"collect.js"}
@@ -104,7 +104,7 @@ export const removeStaticHelperDeclarations = (code, filename, staticValueNames)
104
104
  };
105
105
  };
106
106
  export const importSpecifierLocalName = (specifier) => specifier.local?.name ?? null;
107
- export const removeUnusedStaticImports = (code, filename, staticImportLocals, sideEffectImportLocals) => {
107
+ export const removeUnusedStaticImports = (code, filename, staticImportLocals, sideEffectImportLocals, sideEffectImportOrderLocals = sideEffectImportLocals) => {
108
108
  if (staticImportLocals.size === 0) {
109
109
  return code;
110
110
  }
@@ -112,10 +112,25 @@ export const removeUnusedStaticImports = (code, filename, staticImportLocals, si
112
112
  const used = collectUsedIdentifierNames(program);
113
113
  const ranges = [];
114
114
  const replacements = [];
115
+ const importSourceByLocal = new Map();
116
+ const removedSideEffectImportRanges = [];
117
+ const keptImportRangesBySource = new Map();
115
118
  program.body.forEach((statement) => {
116
119
  if (statement.type !== "ImportDeclaration" || statement.specifiers.length === 0) {
117
120
  return;
118
121
  }
122
+ const source = code.slice(statement.source.start, statement.source.end);
123
+ const orderedLocalNames = statement.specifiers.flatMap((specifier) => {
124
+ const localName = importSpecifierLocalName(specifier);
125
+ return localName && sideEffectImportOrderLocals.has(localName) ? [localName] : [];
126
+ });
127
+ const sideEffectLocalNames = statement.specifiers.flatMap((specifier) => {
128
+ const localName = importSpecifierLocalName(specifier);
129
+ return localName && sideEffectImportLocals.has(localName) ? [localName] : [];
130
+ });
131
+ [...orderedLocalNames, ...sideEffectLocalNames].forEach((localName) => {
132
+ importSourceByLocal.set(localName, source);
133
+ });
119
134
  const removable = statement.specifiers.flatMap((specifier, index) => {
120
135
  const localName = importSpecifierLocalName(specifier);
121
136
  return localName && staticImportLocals.has(localName) && !used.has(localName) ? [{
@@ -124,14 +139,19 @@ export const removeUnusedStaticImports = (code, filename, staticImportLocals, si
124
139
  }] : [];
125
140
  });
126
141
  if (removable.length === 0) {
142
+ if (orderedLocalNames.length > 0 && !keptImportRangesBySource.has(source)) {
143
+ keptImportRangesBySource.set(source, {
144
+ end: statement.end,
145
+ start: statement.start
146
+ });
147
+ }
127
148
  return;
128
149
  }
129
150
  if (removable.length === statement.specifiers.length) {
130
151
  if (removable.some((item) => sideEffectImportLocals.has(item.localName))) {
131
- replacements.push({
152
+ removedSideEffectImportRanges.push({
132
153
  end: statement.end,
133
- start: statement.start,
134
- text: `import ${code.slice(statement.source.start, statement.source.end)};`
154
+ start: statement.start
135
155
  });
136
156
  return;
137
157
  }
@@ -139,8 +159,74 @@ export const removeUnusedStaticImports = (code, filename, staticImportLocals, si
139
159
  end: statement.end,
140
160
  start: statement.start
141
161
  });
162
+ return;
163
+ }
164
+ if (orderedLocalNames.length > 0 && !keptImportRangesBySource.has(source)) {
165
+ keptImportRangesBySource.set(source, {
166
+ end: statement.end,
167
+ start: statement.start
168
+ });
142
169
  }
143
170
  });
171
+ if (removedSideEffectImportRanges.length > 0) {
172
+ const seenSources = new Set();
173
+ const removedRanges = removedSideEffectImportRanges.sort((a, b) => a.start - b.start);
174
+ const [firstRemoved, ...restRemoved] = removedRanges;
175
+ const pendingImports = [];
176
+ let insertionAfterLastKept = null;
177
+ let usedFirstRemovedRange = false;
178
+ const flushBefore = (position) => {
179
+ if (pendingImports.length === 0) {
180
+ return;
181
+ }
182
+ replacements.push({
183
+ end: position,
184
+ start: position,
185
+ text: `${pendingImports.join("\n")}\n`
186
+ });
187
+ pendingImports.length = 0;
188
+ };
189
+ [...sideEffectImportOrderLocals].forEach((local) => {
190
+ const source = importSourceByLocal.get(local);
191
+ if (!source) {
192
+ return;
193
+ }
194
+ const keptRange = keptImportRangesBySource.get(source);
195
+ if (keptRange) {
196
+ flushBefore(keptRange.start);
197
+ insertionAfterLastKept = keptRange.end;
198
+ if (sideEffectImportLocals.has(local)) {
199
+ seenSources.add(source);
200
+ }
201
+ return;
202
+ }
203
+ if (!sideEffectImportLocals.has(local) || seenSources.has(source)) {
204
+ return;
205
+ }
206
+ seenSources.add(source);
207
+ pendingImports.push(`import ${source};`);
208
+ });
209
+ if (pendingImports.length > 0) {
210
+ if (insertionAfterLastKept !== null) {
211
+ replacements.push({
212
+ end: insertionAfterLastKept,
213
+ start: insertionAfterLastKept,
214
+ text: `\n${pendingImports.join("\n")}`
215
+ });
216
+ } else if (firstRemoved) {
217
+ usedFirstRemovedRange = true;
218
+ replacements.push({
219
+ end: firstRemoved.end,
220
+ start: firstRemoved.start,
221
+ text: pendingImports.join("\n")
222
+ });
223
+ }
224
+ }
225
+ ranges.push(...usedFirstRemovedRange ? restRemoved : removedRanges);
226
+ }
227
+ if (ranges.length > 1) {
228
+ ranges.sort((a, b) => a.start - b.start);
229
+ }
144
230
  return applyOxcReplacements(code, [...ranges.map((range) => ({
145
231
  ...range,
146
232
  text: ""
@@ -181,6 +267,6 @@ export const pruneStaticPreevalCode = (code, filename, staticValueNames, staticI
181
267
  return codeWithMetadataPruned;
182
268
  }
183
269
  const importLocalsToPrune = new Set([...staticImportLocals, ...helpersRemoved.removedImportLocals]);
184
- return removeUnusedStaticImports(helpersRemoved.code, filename, importLocalsToPrune, sideEffectImportLocals);
270
+ return removeUnusedStaticImports(helpersRemoved.code, filename, importLocalsToPrune, sideEffectImportLocals, new Set([...staticImportLocals, ...sideEffectImportLocals]));
185
271
  };
186
272
  //# sourceMappingURL=prune.js.map
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/prune.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport type { ImportDeclaration, Node, Program } from 'oxc-parser';\n\nimport { getOxcNodeChildren } from '../../../utils/oxc/ast';\nimport { applyOxcReplacements } from '../../../utils/oxc/replacements';\nimport { parseProgram } from './environment';\nimport { collectImportBindings, unwrapExpression } from './staticExpression';\nimport {\n findWYWMetaExtendsExpression,\n staticWYWMetaExtendsReplacementCode,\n} from './processorStaticModel';\nimport type { Range, Replacement } from './types';\n\nexport const isIdentifierBindingPosition = (\n node: Node,\n parent: Node | null\n): boolean => {\n if (node.type !== 'Identifier' || !parent) {\n return false;\n }\n\n if (\n (parent.type === 'VariableDeclarator' && parent.id === node) ||\n (parent.type === 'FunctionDeclaration' && parent.id === node) ||\n (parent.type === 'FunctionExpression' && parent.id === node) ||\n (parent.type === 'ClassDeclaration' && parent.id === node) ||\n (parent.type === 'ClassExpression' && parent.id === node)\n ) {\n return true;\n }\n\n if (\n (parent.type === 'ArrowFunctionExpression' ||\n parent.type === 'FunctionDeclaration' ||\n parent.type === 'FunctionExpression') &&\n parent.params.some((param) => param === node)\n ) {\n return true;\n }\n\n return (\n (parent.type === 'ImportSpecifier' && parent.local === node) ||\n (parent.type === 'ImportDefaultSpecifier' && parent.local === node) ||\n (parent.type === 'ImportNamespaceSpecifier' && parent.local === node)\n );\n};\n\nexport const isPropertyKeyOnlyIdentifier = (\n node: Node,\n parent: Node | null\n): boolean =>\n node.type === 'Identifier' &&\n !!parent &&\n ((parent.type === 'MemberExpression' &&\n parent.property === node &&\n !parent.computed) ||\n (parent.type === 'Property' &&\n parent.key === node &&\n !parent.computed &&\n !parent.shorthand));\n\nexport const collectUsedIdentifierNames = (program: Program): Set<string> => {\n const used = new Set<string>();\n\n const walk = (node: Node, parent: Node | null): void => {\n if (node.type === 'ImportDeclaration') {\n return;\n }\n\n if (\n node.type === 'Identifier' &&\n !isIdentifierBindingPosition(node, parent) &&\n !isPropertyKeyOnlyIdentifier(node, parent)\n ) {\n used.add(node.name);\n }\n\n getOxcNodeChildren(node).forEach((child) => walk(child, node));\n };\n\n walk(program, null);\n return used;\n};\n\nexport const removableStaticHelperNames = (\n program: Program,\n staticValueNames: Set<string>\n): Set<string> => {\n const used = collectUsedIdentifierNames(program);\n const result = new Set<string>();\n\n program.body.forEach((statement) => {\n if (statement.type !== 'VariableDeclaration') {\n return;\n }\n\n statement.declarations.forEach((declarator) => {\n if (\n declarator.id.type === 'Identifier' &&\n staticValueNames.has(declarator.id.name) &&\n !used.has(declarator.id.name)\n ) {\n result.add(declarator.id.name);\n }\n });\n });\n\n return result;\n};\n\nexport const collectImportLocalReferences = (\n node: Node,\n importLocals: Set<string>,\n result: Set<string>\n): void => {\n const walk = (item: Node, parent: Node | null): void => {\n if (\n item.type === 'Identifier' &&\n importLocals.has(item.name) &&\n !isIdentifierBindingPosition(item, parent) &&\n !isPropertyKeyOnlyIdentifier(item, parent)\n ) {\n result.add(item.name);\n }\n\n getOxcNodeChildren(item).forEach((child) => walk(child, item));\n };\n\n walk(node, null);\n};\nexport const removeStaticHelperDeclarations = (\n code: string,\n filename: string,\n staticValueNames: Set<string>\n): { code: string; removed: Set<string>; removedImportLocals: Set<string> } => {\n if (staticValueNames.size === 0) {\n return { code, removed: new Set(), removedImportLocals: new Set() };\n }\n\n const program = parseProgram(code, filename);\n const removableNames = removableStaticHelperNames(program, staticValueNames);\n const importLocals = new Set<string>();\n collectImportBindings(program).forEach((_, local) => importLocals.add(local));\n const removedImportLocals = new Set<string>();\n const ranges: Range[] = [];\n const replacements: Replacement[] = [];\n\n program.body.forEach((statement) => {\n if (\n statement.type !== 'VariableDeclaration' ||\n statement.declarations.length === 0\n ) {\n return;\n }\n\n const removableIndexes = statement.declarations.flatMap(\n (declarator, index) =>\n declarator.id.type === 'Identifier' &&\n removableNames.has(declarator.id.name)\n ? [index]\n : []\n );\n if (removableIndexes.length === 0) {\n return;\n }\n\n removableIndexes.forEach((index) => {\n collectImportLocalReferences(\n statement.declarations[index],\n importLocals,\n removedImportLocals\n );\n });\n\n if (removableIndexes.length === statement.declarations.length) {\n ranges.push({\n end: statement.end,\n start: statement.start,\n });\n return;\n }\n\n const keptDeclarations = statement.declarations\n .filter((_, index) => !removableIndexes.includes(index))\n .map((declarator) => code.slice(declarator.start, declarator.end));\n replacements.push({\n end: statement.end,\n start: statement.start,\n text: `${statement.kind} ${keptDeclarations.join(', ')};`,\n });\n });\n\n return {\n code: applyOxcReplacements(code, [\n ...ranges.map((range) => ({ ...range, text: '' })),\n ...replacements,\n ]),\n removed: removableNames,\n removedImportLocals,\n };\n};\n\nexport const importSpecifierLocalName = (\n specifier: ImportDeclaration['specifiers'][number]\n): string | null => specifier.local?.name ?? null;\n\nexport const removeUnusedStaticImports = (\n code: string,\n filename: string,\n staticImportLocals: Set<string>,\n sideEffectImportLocals: Set<string>\n): string => {\n if (staticImportLocals.size === 0) {\n return code;\n }\n\n const program = parseProgram(code, filename);\n const used = collectUsedIdentifierNames(program);\n const ranges: Range[] = [];\n const replacements: Replacement[] = [];\n\n program.body.forEach((statement) => {\n if (\n statement.type !== 'ImportDeclaration' ||\n statement.specifiers.length === 0\n ) {\n return;\n }\n\n const removable = statement.specifiers.flatMap((specifier, index) => {\n const localName = importSpecifierLocalName(specifier);\n return localName &&\n staticImportLocals.has(localName) &&\n !used.has(localName)\n ? [{ index, localName }]\n : [];\n });\n\n if (removable.length === 0) {\n return;\n }\n\n if (removable.length === statement.specifiers.length) {\n if (\n removable.some((item) => sideEffectImportLocals.has(item.localName))\n ) {\n replacements.push({\n end: statement.end,\n start: statement.start,\n text: `import ${code.slice(\n statement.source.start,\n statement.source.end\n )};`,\n });\n return;\n }\n\n ranges.push({\n end: statement.end,\n start: statement.start,\n });\n }\n });\n\n return applyOxcReplacements(code, [\n ...ranges.map((range) => ({ ...range, text: '' })),\n ...replacements,\n ]);\n};\n\nexport const replaceStaticWYWMetaExtendsHelpers = (\n code: string,\n filename: string,\n helperValues: Map<string, unknown>\n): string => {\n if (helperValues.size === 0) {\n return code;\n }\n\n const program = parseProgram(code, filename);\n const replacements: Replacement[] = [];\n\n const visit = (node: Node): void => {\n if (node.type === 'ObjectExpression') {\n const extendsExpression = findWYWMetaExtendsExpression(node);\n if (extendsExpression) {\n const unwrapped = unwrapExpression(extendsExpression);\n if (\n unwrapped.type === 'CallExpression' &&\n unwrapped.callee.type === 'Identifier' &&\n unwrapped.arguments.length === 0 &&\n helperValues.has(unwrapped.callee.name)\n ) {\n const replacement = staticWYWMetaExtendsReplacementCode(\n helperValues.get(unwrapped.callee.name)\n );\n if (replacement) {\n replacements.push({\n end: extendsExpression.end,\n start: extendsExpression.start,\n text: replacement,\n });\n }\n }\n }\n }\n\n getOxcNodeChildren(node).forEach(visit);\n };\n\n visit(program);\n return applyOxcReplacements(code, replacements);\n};\n\nexport const pruneStaticPreevalCode = (\n code: string,\n filename: string,\n staticValueNames: Set<string>,\n staticImportLocals: Set<string>,\n staticExtendsHelperValues: Map<string, unknown>,\n sideEffectImportLocals: Set<string>\n): string => {\n const codeWithMetadataPruned = replaceStaticWYWMetaExtendsHelpers(\n code,\n filename,\n staticExtendsHelperValues\n );\n const helpersRemoved = removeStaticHelperDeclarations(\n codeWithMetadataPruned,\n filename,\n staticValueNames\n );\n if (helpersRemoved.removed.size === 0) {\n return codeWithMetadataPruned;\n }\n\n const importLocalsToPrune = new Set([\n ...staticImportLocals,\n ...helpersRemoved.removedImportLocals,\n ]);\n\n return removeUnusedStaticImports(\n helpersRemoved.code,\n filename,\n importLocalsToPrune,\n sideEffectImportLocals\n );\n};\n"],"file":"prune.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/prune.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport type { ImportDeclaration, Node, Program } from 'oxc-parser';\n\nimport { getOxcNodeChildren } from '../../../utils/oxc/ast';\nimport { applyOxcReplacements } from '../../../utils/oxc/replacements';\nimport { parseProgram } from './environment';\nimport { collectImportBindings, unwrapExpression } from './staticExpression';\nimport {\n findWYWMetaExtendsExpression,\n staticWYWMetaExtendsReplacementCode,\n} from './processorStaticModel';\nimport type { Range, Replacement } from './types';\n\nexport const isIdentifierBindingPosition = (\n node: Node,\n parent: Node | null\n): boolean => {\n if (node.type !== 'Identifier' || !parent) {\n return false;\n }\n\n if (\n (parent.type === 'VariableDeclarator' && parent.id === node) ||\n (parent.type === 'FunctionDeclaration' && parent.id === node) ||\n (parent.type === 'FunctionExpression' && parent.id === node) ||\n (parent.type === 'ClassDeclaration' && parent.id === node) ||\n (parent.type === 'ClassExpression' && parent.id === node)\n ) {\n return true;\n }\n\n if (\n (parent.type === 'ArrowFunctionExpression' ||\n parent.type === 'FunctionDeclaration' ||\n parent.type === 'FunctionExpression') &&\n parent.params.some((param) => param === node)\n ) {\n return true;\n }\n\n return (\n (parent.type === 'ImportSpecifier' && parent.local === node) ||\n (parent.type === 'ImportDefaultSpecifier' && parent.local === node) ||\n (parent.type === 'ImportNamespaceSpecifier' && parent.local === node)\n );\n};\n\nexport const isPropertyKeyOnlyIdentifier = (\n node: Node,\n parent: Node | null\n): boolean =>\n node.type === 'Identifier' &&\n !!parent &&\n ((parent.type === 'MemberExpression' &&\n parent.property === node &&\n !parent.computed) ||\n (parent.type === 'Property' &&\n parent.key === node &&\n !parent.computed &&\n !parent.shorthand));\n\nexport const collectUsedIdentifierNames = (program: Program): Set<string> => {\n const used = new Set<string>();\n\n const walk = (node: Node, parent: Node | null): void => {\n if (node.type === 'ImportDeclaration') {\n return;\n }\n\n if (\n node.type === 'Identifier' &&\n !isIdentifierBindingPosition(node, parent) &&\n !isPropertyKeyOnlyIdentifier(node, parent)\n ) {\n used.add(node.name);\n }\n\n getOxcNodeChildren(node).forEach((child) => walk(child, node));\n };\n\n walk(program, null);\n return used;\n};\n\nexport const removableStaticHelperNames = (\n program: Program,\n staticValueNames: Set<string>\n): Set<string> => {\n const used = collectUsedIdentifierNames(program);\n const result = new Set<string>();\n\n program.body.forEach((statement) => {\n if (statement.type !== 'VariableDeclaration') {\n return;\n }\n\n statement.declarations.forEach((declarator) => {\n if (\n declarator.id.type === 'Identifier' &&\n staticValueNames.has(declarator.id.name) &&\n !used.has(declarator.id.name)\n ) {\n result.add(declarator.id.name);\n }\n });\n });\n\n return result;\n};\n\nexport const collectImportLocalReferences = (\n node: Node,\n importLocals: Set<string>,\n result: Set<string>\n): void => {\n const walk = (item: Node, parent: Node | null): void => {\n if (\n item.type === 'Identifier' &&\n importLocals.has(item.name) &&\n !isIdentifierBindingPosition(item, parent) &&\n !isPropertyKeyOnlyIdentifier(item, parent)\n ) {\n result.add(item.name);\n }\n\n getOxcNodeChildren(item).forEach((child) => walk(child, item));\n };\n\n walk(node, null);\n};\nexport const removeStaticHelperDeclarations = (\n code: string,\n filename: string,\n staticValueNames: Set<string>\n): { code: string; removed: Set<string>; removedImportLocals: Set<string> } => {\n if (staticValueNames.size === 0) {\n return { code, removed: new Set(), removedImportLocals: new Set() };\n }\n\n const program = parseProgram(code, filename);\n const removableNames = removableStaticHelperNames(program, staticValueNames);\n const importLocals = new Set<string>();\n collectImportBindings(program).forEach((_, local) => importLocals.add(local));\n const removedImportLocals = new Set<string>();\n const ranges: Range[] = [];\n const replacements: Replacement[] = [];\n\n program.body.forEach((statement) => {\n if (\n statement.type !== 'VariableDeclaration' ||\n statement.declarations.length === 0\n ) {\n return;\n }\n\n const removableIndexes = statement.declarations.flatMap(\n (declarator, index) =>\n declarator.id.type === 'Identifier' &&\n removableNames.has(declarator.id.name)\n ? [index]\n : []\n );\n if (removableIndexes.length === 0) {\n return;\n }\n\n removableIndexes.forEach((index) => {\n collectImportLocalReferences(\n statement.declarations[index],\n importLocals,\n removedImportLocals\n );\n });\n\n if (removableIndexes.length === statement.declarations.length) {\n ranges.push({\n end: statement.end,\n start: statement.start,\n });\n return;\n }\n\n const keptDeclarations = statement.declarations\n .filter((_, index) => !removableIndexes.includes(index))\n .map((declarator) => code.slice(declarator.start, declarator.end));\n replacements.push({\n end: statement.end,\n start: statement.start,\n text: `${statement.kind} ${keptDeclarations.join(', ')};`,\n });\n });\n\n return {\n code: applyOxcReplacements(code, [\n ...ranges.map((range) => ({ ...range, text: '' })),\n ...replacements,\n ]),\n removed: removableNames,\n removedImportLocals,\n };\n};\n\nexport const importSpecifierLocalName = (\n specifier: ImportDeclaration['specifiers'][number]\n): string | null => specifier.local?.name ?? null;\n\nexport const removeUnusedStaticImports = (\n code: string,\n filename: string,\n staticImportLocals: Set<string>,\n sideEffectImportLocals: Set<string>,\n sideEffectImportOrderLocals: Set<string> = sideEffectImportLocals\n): string => {\n if (staticImportLocals.size === 0) {\n return code;\n }\n\n const program = parseProgram(code, filename);\n const used = collectUsedIdentifierNames(program);\n const ranges: Range[] = [];\n const replacements: Replacement[] = [];\n const importSourceByLocal = new Map<string, string>();\n const removedSideEffectImportRanges: Range[] = [];\n const keptImportRangesBySource = new Map<string, Range>();\n\n program.body.forEach((statement) => {\n if (\n statement.type !== 'ImportDeclaration' ||\n statement.specifiers.length === 0\n ) {\n return;\n }\n\n const source = code.slice(statement.source.start, statement.source.end);\n const orderedLocalNames = statement.specifiers.flatMap((specifier) => {\n const localName = importSpecifierLocalName(specifier);\n return localName && sideEffectImportOrderLocals.has(localName)\n ? [localName]\n : [];\n });\n const sideEffectLocalNames = statement.specifiers.flatMap((specifier) => {\n const localName = importSpecifierLocalName(specifier);\n return localName && sideEffectImportLocals.has(localName)\n ? [localName]\n : [];\n });\n [...orderedLocalNames, ...sideEffectLocalNames].forEach((localName) => {\n importSourceByLocal.set(localName, source);\n });\n\n const removable = statement.specifiers.flatMap((specifier, index) => {\n const localName = importSpecifierLocalName(specifier);\n return localName &&\n staticImportLocals.has(localName) &&\n !used.has(localName)\n ? [{ index, localName }]\n : [];\n });\n\n if (removable.length === 0) {\n if (\n orderedLocalNames.length > 0 &&\n !keptImportRangesBySource.has(source)\n ) {\n keptImportRangesBySource.set(source, {\n end: statement.end,\n start: statement.start,\n });\n }\n return;\n }\n\n if (removable.length === statement.specifiers.length) {\n if (\n removable.some((item) => sideEffectImportLocals.has(item.localName))\n ) {\n removedSideEffectImportRanges.push({\n end: statement.end,\n start: statement.start,\n });\n return;\n }\n\n ranges.push({\n end: statement.end,\n start: statement.start,\n });\n return;\n }\n\n if (orderedLocalNames.length > 0 && !keptImportRangesBySource.has(source)) {\n keptImportRangesBySource.set(source, {\n end: statement.end,\n start: statement.start,\n });\n }\n });\n\n if (removedSideEffectImportRanges.length > 0) {\n const seenSources = new Set<string>();\n const removedRanges = removedSideEffectImportRanges.sort(\n (a, b) => a.start - b.start\n );\n const [firstRemoved, ...restRemoved] = removedRanges;\n const pendingImports: string[] = [];\n let insertionAfterLastKept: number | null = null;\n let usedFirstRemovedRange = false;\n const flushBefore = (position: number): void => {\n if (pendingImports.length === 0) {\n return;\n }\n\n replacements.push({\n end: position,\n start: position,\n text: `${pendingImports.join('\\n')}\\n`,\n });\n pendingImports.length = 0;\n };\n\n [...sideEffectImportOrderLocals].forEach((local) => {\n const source = importSourceByLocal.get(local);\n if (!source) {\n return;\n }\n\n const keptRange = keptImportRangesBySource.get(source);\n if (keptRange) {\n flushBefore(keptRange.start);\n insertionAfterLastKept = keptRange.end;\n if (sideEffectImportLocals.has(local)) {\n seenSources.add(source);\n }\n return;\n }\n\n if (!sideEffectImportLocals.has(local) || seenSources.has(source)) {\n return;\n }\n\n seenSources.add(source);\n pendingImports.push(`import ${source};`);\n });\n\n if (pendingImports.length > 0) {\n if (insertionAfterLastKept !== null) {\n replacements.push({\n end: insertionAfterLastKept,\n start: insertionAfterLastKept,\n text: `\\n${pendingImports.join('\\n')}`,\n });\n } else if (firstRemoved) {\n usedFirstRemovedRange = true;\n replacements.push({\n end: firstRemoved.end,\n start: firstRemoved.start,\n text: pendingImports.join('\\n'),\n });\n }\n }\n\n ranges.push(...(usedFirstRemovedRange ? restRemoved : removedRanges));\n }\n\n if (ranges.length > 1) {\n ranges.sort((a, b) => a.start - b.start);\n }\n\n return applyOxcReplacements(code, [\n ...ranges.map((range) => ({ ...range, text: '' })),\n ...replacements,\n ]);\n};\n\nexport const replaceStaticWYWMetaExtendsHelpers = (\n code: string,\n filename: string,\n helperValues: Map<string, unknown>\n): string => {\n if (helperValues.size === 0) {\n return code;\n }\n\n const program = parseProgram(code, filename);\n const replacements: Replacement[] = [];\n\n const visit = (node: Node): void => {\n if (node.type === 'ObjectExpression') {\n const extendsExpression = findWYWMetaExtendsExpression(node);\n if (extendsExpression) {\n const unwrapped = unwrapExpression(extendsExpression);\n if (\n unwrapped.type === 'CallExpression' &&\n unwrapped.callee.type === 'Identifier' &&\n unwrapped.arguments.length === 0 &&\n helperValues.has(unwrapped.callee.name)\n ) {\n const replacement = staticWYWMetaExtendsReplacementCode(\n helperValues.get(unwrapped.callee.name)\n );\n if (replacement) {\n replacements.push({\n end: extendsExpression.end,\n start: extendsExpression.start,\n text: replacement,\n });\n }\n }\n }\n }\n\n getOxcNodeChildren(node).forEach(visit);\n };\n\n visit(program);\n return applyOxcReplacements(code, replacements);\n};\n\nexport const pruneStaticPreevalCode = (\n code: string,\n filename: string,\n staticValueNames: Set<string>,\n staticImportLocals: Set<string>,\n staticExtendsHelperValues: Map<string, unknown>,\n sideEffectImportLocals: Set<string>\n): string => {\n const codeWithMetadataPruned = replaceStaticWYWMetaExtendsHelpers(\n code,\n filename,\n staticExtendsHelperValues\n );\n const helpersRemoved = removeStaticHelperDeclarations(\n codeWithMetadataPruned,\n filename,\n staticValueNames\n );\n if (helpersRemoved.removed.size === 0) {\n return codeWithMetadataPruned;\n }\n\n const importLocalsToPrune = new Set([\n ...staticImportLocals,\n ...helpersRemoved.removedImportLocals,\n ]);\n\n return removeUnusedStaticImports(\n helpersRemoved.code,\n filename,\n importLocalsToPrune,\n sideEffectImportLocals,\n new Set([...staticImportLocals, ...sideEffectImportLocals])\n );\n};\n"],"file":"prune.js"}
@@ -25,7 +25,7 @@ export function* resolveStaticOxcPreevalValues() {
25
25
  const staticOnly = evalStrategy === "static";
26
26
  const staticValueCache = preevalResult.staticValueCache ?? new Map();
27
27
  const staticDependencies = new Set(preevalResult.staticDependencies ?? []);
28
- const staticImportLocals = new Set();
28
+ const staticImportLocals = new Set(preevalResult.staticImportLocals ?? []);
29
29
  const sideEffectImportLocals = new Set();
30
30
  const staticNullWYWMetaExtendsHelpers = new Set(preevalResult.staticNullWYWMetaExtendsHelpers ?? []);
31
31
  const memo = new Map();
@@ -165,6 +165,7 @@ export function* resolveStaticOxcPreevalValues() {
165
165
  preevalResult.baseCode = baseCode;
166
166
  preevalResult.code = appendOxcWywPreval(baseCode, filename, dependencyNames);
167
167
  preevalResult.evalCode = appendOxcWywPreval(evalBaseCode, filename, dependencyNames);
168
+ preevalResult.staticImportLocals = [...staticImportLocals];
168
169
  preevalResult.staticSideEffectImportLocals = [...sideEffectImportLocals];
169
170
  for (const dependency of staticDependencies) {
170
171
  const strippedDependency = stripQueryAndHash(dependency);
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport { isAbsolute } from 'path';\n\nimport { appendOxcWywPreval } from '../../../utils/oxcPreevalStage';\nimport { stripQueryAndHash } from '../../../utils/parseRequest';\nimport type { ITransformAction, SyncScenarioFor } from '../../types';\nimport {\n resolveCandidateValue,\n resolveOpaqueRuntimeCandidateValue,\n} from './candidateResolver';\nimport {\n debugStaticResolve,\n getEvalStrategy,\n getStaticStrategyFailure,\n parseProgram,\n} from './environment';\nimport {\n collectWYWMetaExtendsHelperNames,\n createSameFileStaticWYWMetaHelperResolver,\n} from './processorStaticModel';\nimport { pruneStaticPreevalCode } from './prune';\nimport { runtimeCallbackPlaceholder } from './staticExpression';\nimport type { StaticExportResult } from './types';\n\nexport function* resolveStaticOxcPreevalValues(\n this: ITransformAction\n): SyncScenarioFor<boolean> {\n const preevalResult = this.entrypoint.getPreevalResult();\n if (!preevalResult) {\n return false;\n }\n\n const candidates = preevalResult.staticValueCandidates ?? [];\n const evalDependencyNames = new Set(preevalResult.dependencyNames ?? []);\n if (candidates.length === 0 && evalDependencyNames.size === 0) {\n return false;\n }\n\n const filename =\n this.entrypoint.loadedAndParsed.evaluator === 'ignored'\n ? this.entrypoint.name\n : this.entrypoint.loadedAndParsed.evalConfig.filename ??\n this.entrypoint.name;\n const evalStrategy = getEvalStrategy(this);\n if (evalStrategy === 'execute') {\n return false;\n }\n const staticOnly = evalStrategy === 'static';\n\n const staticValueCache =\n preevalResult.staticValueCache ?? new Map<string, unknown>();\n const staticDependencies = new Set(preevalResult.staticDependencies ?? []);\n const staticImportLocals = new Set<string>();\n const sideEffectImportLocals = new Set<string>();\n const staticNullWYWMetaExtendsHelpers = new Set(\n preevalResult.staticNullWYWMetaExtendsHelpers ?? []\n );\n const memo = new Map<string, StaticExportResult | null>();\n const opaqueRuntimeBaseHelpers = collectWYWMetaExtendsHelperNames(\n parseProgram(preevalResult.baseCode ?? preevalResult.code, filename)\n );\n // Names of candidates resolved to runtime callbacks (function values).\n // They keep the file out of evalFile but their helper declarations must\n // not be pruned — the runtime call site relies on them.\n const runtimeOnlyCandidateNames = new Set<string>(\n preevalResult.runtimeOnlyStaticValueNames ?? []\n );\n let changed = false;\n let hasKnownStaticCandidate = false;\n const resolveSameFileStaticWYWMetaHelpers =\n createSameFileStaticWYWMetaHelperResolver(\n preevalResult.baseCode ?? preevalResult.code,\n filename\n );\n const applySameFileStaticWYWMetaHelpers = (): boolean => {\n let appliedAny = false;\n\n for (;;) {\n let applied = false;\n const values = resolveSameFileStaticWYWMetaHelpers(staticValueCache);\n values.forEach((value, name) => {\n if (\n staticValueCache.has(name) ||\n (!evalDependencyNames.has(name) &&\n !opaqueRuntimeBaseHelpers.has(name))\n ) {\n return;\n }\n\n staticValueCache.set(name, value);\n debugStaticResolve(this, {\n candidate: name,\n filename,\n phase: 'candidate',\n reason: 'same-file-static-metadata',\n status: 'resolved',\n });\n applied = true;\n });\n\n if (!applied) {\n break;\n }\n\n appliedAny = true;\n }\n\n if (appliedAny) {\n changed = true;\n hasKnownStaticCandidate = true;\n }\n\n return appliedAny;\n };\n\n applySameFileStaticWYWMetaHelpers();\n\n for (const candidate of candidates) {\n applySameFileStaticWYWMetaHelpers();\n\n const isOpaqueRuntimeBaseHelper = opaqueRuntimeBaseHelpers.has(\n candidate.name\n );\n if (\n !evalDependencyNames.has(candidate.name) &&\n !isOpaqueRuntimeBaseHelper &&\n !staticValueCache.has(candidate.name)\n ) {\n debugStaticResolve(this, {\n candidate: candidate.name,\n filename,\n phase: 'candidate',\n reason: 'not-eval-dependency',\n status: 'skipped',\n });\n continue;\n }\n\n if (staticValueCache.has(candidate.name)) {\n hasKnownStaticCandidate = true;\n candidate.imports.forEach((item) =>\n staticImportLocals.add(item.importLocal ?? item.local)\n );\n if (\n isOpaqueRuntimeBaseHelper &&\n staticValueCache.get(candidate.name) === null\n ) {\n staticNullWYWMetaExtendsHelpers.add(candidate.name);\n }\n debugStaticResolve(this, {\n candidate: candidate.name,\n filename,\n phase: 'candidate',\n reason: 'already-static',\n status: 'skipped',\n });\n continue;\n }\n\n let resolved: StaticExportResult | null;\n let resolvedOpaqueRuntimeBase = false;\n if (isOpaqueRuntimeBaseHelper) {\n resolved = yield* resolveOpaqueRuntimeCandidateValue(\n this,\n candidate,\n filename\n );\n resolvedOpaqueRuntimeBase = !!resolved;\n if (!resolved) {\n resolved = yield* resolveCandidateValue(\n this,\n candidate,\n filename,\n memo\n );\n }\n } else {\n resolved = yield* resolveCandidateValue(this, candidate, filename, memo);\n }\n if (!resolved) {\n continue;\n }\n\n if (resolvedOpaqueRuntimeBase) {\n debugStaticResolve(this, {\n candidate: candidate.name,\n filename,\n phase: 'candidate',\n reason: 'opaque-runtime-component',\n status: 'resolved',\n });\n staticNullWYWMetaExtendsHelpers.add(candidate.name);\n }\n\n if (resolved.runtimeOnly) {\n // Runtime callback — seed a callable placeholder for collect() but\n // track it separately so the `_exp = () => target` helper survives\n // pruning. The runtime call site relies on that helper declaration.\n runtimeOnlyCandidateNames.add(candidate.name);\n staticValueCache.set(candidate.name, runtimeCallbackPlaceholder);\n } else {\n staticValueCache.set(candidate.name, resolved.value);\n }\n hasKnownStaticCandidate = true;\n candidate.imports.forEach((item) =>\n staticImportLocals.add(item.importLocal ?? item.local)\n );\n resolved.dependencies.forEach((dependency) =>\n staticDependencies.add(dependency)\n );\n resolved.sideEffectImportLocals?.forEach((local) =>\n sideEffectImportLocals.add(local)\n );\n changed = true;\n applySameFileStaticWYWMetaHelpers();\n }\n\n if (\n !changed &&\n (!hasKnownStaticCandidate || preevalResult.staticValuesApplied)\n ) {\n if (staticOnly && evalDependencyNames.size > 0) {\n throw getStaticStrategyFailure(filename, evalDependencyNames);\n }\n return false;\n }\n\n const dependencyNames = (preevalResult.dependencyNames ?? []).filter(\n (name) =>\n !staticValueCache.has(name) && !runtimeOnlyCandidateNames.has(name)\n );\n if (staticOnly && dependencyNames.length > 0) {\n throw getStaticStrategyFailure(filename, dependencyNames);\n }\n preevalResult.dependencyNames = dependencyNames;\n preevalResult.staticValueCache = staticValueCache;\n preevalResult.staticDependencies = [...staticDependencies];\n preevalResult.staticNullWYWMetaExtendsHelpers = [\n ...staticNullWYWMetaExtendsHelpers,\n ];\n preevalResult.runtimeOnlyStaticValueNames = [...runtimeOnlyCandidateNames];\n preevalResult.staticValuesApplied = true;\n const originalBaseCode = preevalResult.baseCode ?? preevalResult.code;\n const prunableStaticValueNames = new Set(\n [...staticValueCache.keys()].filter(\n (name) => !runtimeOnlyCandidateNames.has(name)\n )\n );\n const staticExtendsHelperValues = new Map(\n [...staticValueCache].filter(\n ([name]) => !runtimeOnlyCandidateNames.has(name)\n )\n );\n staticNullWYWMetaExtendsHelpers.forEach((name) => {\n if (!staticExtendsHelperValues.has(name)) {\n staticExtendsHelperValues.set(name, null);\n }\n });\n const baseCode = pruneStaticPreevalCode(\n originalBaseCode,\n filename,\n prunableStaticValueNames,\n staticImportLocals,\n staticExtendsHelperValues,\n sideEffectImportLocals\n );\n const evalBaseCode =\n sideEffectImportLocals.size > 0\n ? pruneStaticPreevalCode(\n originalBaseCode,\n filename,\n prunableStaticValueNames,\n staticImportLocals,\n staticExtendsHelperValues,\n new Set()\n )\n : baseCode;\n preevalResult.baseCode = baseCode;\n preevalResult.code = appendOxcWywPreval(baseCode, filename, dependencyNames);\n preevalResult.evalCode = appendOxcWywPreval(\n evalBaseCode,\n filename,\n dependencyNames\n );\n preevalResult.staticSideEffectImportLocals = [...sideEffectImportLocals];\n\n for (const dependency of staticDependencies) {\n const strippedDependency = stripQueryAndHash(dependency);\n if (isAbsolute(strippedDependency)) {\n this.services.cache.checkFreshness(dependency, strippedDependency);\n }\n\n this.entrypoint.addInvalidationDependency({\n only: ['*'],\n resolved: dependency,\n source: dependency,\n });\n this.entrypoint.markInvalidateOnDependencyChange(dependency);\n }\n\n return true;\n}\n"],"file":"resolveStaticOxcPreevalValues.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../../src/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax,no-continue,@typescript-eslint/no-use-before-define */\n\nimport { isAbsolute } from 'path';\n\nimport { appendOxcWywPreval } from '../../../utils/oxcPreevalStage';\nimport { stripQueryAndHash } from '../../../utils/parseRequest';\nimport type { ITransformAction, SyncScenarioFor } from '../../types';\nimport {\n resolveCandidateValue,\n resolveOpaqueRuntimeCandidateValue,\n} from './candidateResolver';\nimport {\n debugStaticResolve,\n getEvalStrategy,\n getStaticStrategyFailure,\n parseProgram,\n} from './environment';\nimport {\n collectWYWMetaExtendsHelperNames,\n createSameFileStaticWYWMetaHelperResolver,\n} from './processorStaticModel';\nimport { pruneStaticPreevalCode } from './prune';\nimport { runtimeCallbackPlaceholder } from './staticExpression';\nimport type { StaticExportResult } from './types';\n\nexport function* resolveStaticOxcPreevalValues(\n this: ITransformAction\n): SyncScenarioFor<boolean> {\n const preevalResult = this.entrypoint.getPreevalResult();\n if (!preevalResult) {\n return false;\n }\n\n const candidates = preevalResult.staticValueCandidates ?? [];\n const evalDependencyNames = new Set(preevalResult.dependencyNames ?? []);\n if (candidates.length === 0 && evalDependencyNames.size === 0) {\n return false;\n }\n\n const filename =\n this.entrypoint.loadedAndParsed.evaluator === 'ignored'\n ? this.entrypoint.name\n : this.entrypoint.loadedAndParsed.evalConfig.filename ??\n this.entrypoint.name;\n const evalStrategy = getEvalStrategy(this);\n if (evalStrategy === 'execute') {\n return false;\n }\n const staticOnly = evalStrategy === 'static';\n\n const staticValueCache =\n preevalResult.staticValueCache ?? new Map<string, unknown>();\n const staticDependencies = new Set(preevalResult.staticDependencies ?? []);\n const staticImportLocals = new Set<string>(\n preevalResult.staticImportLocals ?? []\n );\n const sideEffectImportLocals = new Set<string>();\n const staticNullWYWMetaExtendsHelpers = new Set(\n preevalResult.staticNullWYWMetaExtendsHelpers ?? []\n );\n const memo = new Map<string, StaticExportResult | null>();\n const opaqueRuntimeBaseHelpers = collectWYWMetaExtendsHelperNames(\n parseProgram(preevalResult.baseCode ?? preevalResult.code, filename)\n );\n // Names of candidates resolved to runtime callbacks (function values).\n // They keep the file out of evalFile but their helper declarations must\n // not be pruned — the runtime call site relies on them.\n const runtimeOnlyCandidateNames = new Set<string>(\n preevalResult.runtimeOnlyStaticValueNames ?? []\n );\n let changed = false;\n let hasKnownStaticCandidate = false;\n const resolveSameFileStaticWYWMetaHelpers =\n createSameFileStaticWYWMetaHelperResolver(\n preevalResult.baseCode ?? preevalResult.code,\n filename\n );\n const applySameFileStaticWYWMetaHelpers = (): boolean => {\n let appliedAny = false;\n\n for (;;) {\n let applied = false;\n const values = resolveSameFileStaticWYWMetaHelpers(staticValueCache);\n values.forEach((value, name) => {\n if (\n staticValueCache.has(name) ||\n (!evalDependencyNames.has(name) &&\n !opaqueRuntimeBaseHelpers.has(name))\n ) {\n return;\n }\n\n staticValueCache.set(name, value);\n debugStaticResolve(this, {\n candidate: name,\n filename,\n phase: 'candidate',\n reason: 'same-file-static-metadata',\n status: 'resolved',\n });\n applied = true;\n });\n\n if (!applied) {\n break;\n }\n\n appliedAny = true;\n }\n\n if (appliedAny) {\n changed = true;\n hasKnownStaticCandidate = true;\n }\n\n return appliedAny;\n };\n\n applySameFileStaticWYWMetaHelpers();\n\n for (const candidate of candidates) {\n applySameFileStaticWYWMetaHelpers();\n\n const isOpaqueRuntimeBaseHelper = opaqueRuntimeBaseHelpers.has(\n candidate.name\n );\n if (\n !evalDependencyNames.has(candidate.name) &&\n !isOpaqueRuntimeBaseHelper &&\n !staticValueCache.has(candidate.name)\n ) {\n debugStaticResolve(this, {\n candidate: candidate.name,\n filename,\n phase: 'candidate',\n reason: 'not-eval-dependency',\n status: 'skipped',\n });\n continue;\n }\n\n if (staticValueCache.has(candidate.name)) {\n hasKnownStaticCandidate = true;\n candidate.imports.forEach((item) =>\n staticImportLocals.add(item.importLocal ?? item.local)\n );\n if (\n isOpaqueRuntimeBaseHelper &&\n staticValueCache.get(candidate.name) === null\n ) {\n staticNullWYWMetaExtendsHelpers.add(candidate.name);\n }\n debugStaticResolve(this, {\n candidate: candidate.name,\n filename,\n phase: 'candidate',\n reason: 'already-static',\n status: 'skipped',\n });\n continue;\n }\n\n let resolved: StaticExportResult | null;\n let resolvedOpaqueRuntimeBase = false;\n if (isOpaqueRuntimeBaseHelper) {\n resolved = yield* resolveOpaqueRuntimeCandidateValue(\n this,\n candidate,\n filename\n );\n resolvedOpaqueRuntimeBase = !!resolved;\n if (!resolved) {\n resolved = yield* resolveCandidateValue(\n this,\n candidate,\n filename,\n memo\n );\n }\n } else {\n resolved = yield* resolveCandidateValue(this, candidate, filename, memo);\n }\n if (!resolved) {\n continue;\n }\n\n if (resolvedOpaqueRuntimeBase) {\n debugStaticResolve(this, {\n candidate: candidate.name,\n filename,\n phase: 'candidate',\n reason: 'opaque-runtime-component',\n status: 'resolved',\n });\n staticNullWYWMetaExtendsHelpers.add(candidate.name);\n }\n\n if (resolved.runtimeOnly) {\n // Runtime callback — seed a callable placeholder for collect() but\n // track it separately so the `_exp = () => target` helper survives\n // pruning. The runtime call site relies on that helper declaration.\n runtimeOnlyCandidateNames.add(candidate.name);\n staticValueCache.set(candidate.name, runtimeCallbackPlaceholder);\n } else {\n staticValueCache.set(candidate.name, resolved.value);\n }\n hasKnownStaticCandidate = true;\n candidate.imports.forEach((item) =>\n staticImportLocals.add(item.importLocal ?? item.local)\n );\n resolved.dependencies.forEach((dependency) =>\n staticDependencies.add(dependency)\n );\n resolved.sideEffectImportLocals?.forEach((local) =>\n sideEffectImportLocals.add(local)\n );\n changed = true;\n applySameFileStaticWYWMetaHelpers();\n }\n\n if (\n !changed &&\n (!hasKnownStaticCandidate || preevalResult.staticValuesApplied)\n ) {\n if (staticOnly && evalDependencyNames.size > 0) {\n throw getStaticStrategyFailure(filename, evalDependencyNames);\n }\n return false;\n }\n\n const dependencyNames = (preevalResult.dependencyNames ?? []).filter(\n (name) =>\n !staticValueCache.has(name) && !runtimeOnlyCandidateNames.has(name)\n );\n if (staticOnly && dependencyNames.length > 0) {\n throw getStaticStrategyFailure(filename, dependencyNames);\n }\n preevalResult.dependencyNames = dependencyNames;\n preevalResult.staticValueCache = staticValueCache;\n preevalResult.staticDependencies = [...staticDependencies];\n preevalResult.staticNullWYWMetaExtendsHelpers = [\n ...staticNullWYWMetaExtendsHelpers,\n ];\n preevalResult.runtimeOnlyStaticValueNames = [...runtimeOnlyCandidateNames];\n preevalResult.staticValuesApplied = true;\n const originalBaseCode = preevalResult.baseCode ?? preevalResult.code;\n const prunableStaticValueNames = new Set(\n [...staticValueCache.keys()].filter(\n (name) => !runtimeOnlyCandidateNames.has(name)\n )\n );\n const staticExtendsHelperValues = new Map(\n [...staticValueCache].filter(\n ([name]) => !runtimeOnlyCandidateNames.has(name)\n )\n );\n staticNullWYWMetaExtendsHelpers.forEach((name) => {\n if (!staticExtendsHelperValues.has(name)) {\n staticExtendsHelperValues.set(name, null);\n }\n });\n const baseCode = pruneStaticPreevalCode(\n originalBaseCode,\n filename,\n prunableStaticValueNames,\n staticImportLocals,\n staticExtendsHelperValues,\n sideEffectImportLocals\n );\n const evalBaseCode =\n sideEffectImportLocals.size > 0\n ? pruneStaticPreevalCode(\n originalBaseCode,\n filename,\n prunableStaticValueNames,\n staticImportLocals,\n staticExtendsHelperValues,\n new Set()\n )\n : baseCode;\n preevalResult.baseCode = baseCode;\n preevalResult.code = appendOxcWywPreval(baseCode, filename, dependencyNames);\n preevalResult.evalCode = appendOxcWywPreval(\n evalBaseCode,\n filename,\n dependencyNames\n );\n preevalResult.staticImportLocals = [...staticImportLocals];\n preevalResult.staticSideEffectImportLocals = [...sideEffectImportLocals];\n\n for (const dependency of staticDependencies) {\n const strippedDependency = stripQueryAndHash(dependency);\n if (isAbsolute(strippedDependency)) {\n this.services.cache.checkFreshness(dependency, strippedDependency);\n }\n\n this.entrypoint.addInvalidationDependency({\n only: ['*'],\n resolved: dependency,\n source: dependency,\n });\n this.entrypoint.markInvalidateOnDependencyChange(dependency);\n }\n\n return true;\n}\n"],"file":"resolveStaticOxcPreevalValues.js"}
@@ -52,6 +52,7 @@ const ensureOxcPreevalResult = (services, item, originalAst) => {
52
52
  evalCode: result.code,
53
53
  metadata: result.metadata,
54
54
  processorClassNames: result.processorClassNames,
55
+ staticImportLocals: [],
55
56
  staticSideEffectImportLocals: [],
56
57
  staticDependencies: result.staticDependencies,
57
58
  staticValuesApplied: false,
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../../src/transform/generators/transform.ts"],"version":3,"sourcesContent":["import { oxcShaker } from '../../shaker';\nimport type { WYWTransformMetadata } from '../../utils/TransformMetadata';\nimport { collectOxcExportsAndImports } from '../../utils/collectOxcExportsAndImports';\nimport { emitOxcCommonJS, stripTypesAndJsxWithOxc } from '../../utils/oxcEmit';\nimport { runOxcPreevalStage } from '../../utils/oxcPreevalStage';\nimport { shakeOxcToESM } from '../../utils/oxcShaker';\nimport type { Entrypoint } from '../Entrypoint';\nimport type {\n IEntrypointDependency,\n IPreevalResult,\n} from '../Entrypoint.types';\nimport type {\n ITransformAction,\n Services,\n SyncScenarioFor,\n SyncScenarioForAction,\n} from '../types';\n\nimport { rewriteOptimizedOxcBarrelImports } from './rewriteOxcBarrelImports';\nimport { resolveStaticOxcPreevalValues } from './resolveStaticOxcValues';\n\nconst EMPTY_FILE = '=== empty file ===';\n\nconst collectImportsFromOxc = (\n code: string,\n filename: string\n): Map<string, string[]> => {\n const imports = new Map<string, string[]>();\n const addImport = (source: string, imported: string) => {\n const bucket = imports.get(source) ?? [];\n if (!bucket.includes(imported)) {\n bucket.push(imported);\n }\n\n imports.set(source, bucket);\n };\n\n collectOxcExportsAndImports(code, filename).imports.forEach((item) => {\n addImport(item.source, item.imported || 'side-effect');\n });\n\n return imports;\n};\n\ntype PrepareCodeFn = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n) => [\n code: string,\n imports: Map<string, string[]> | null,\n metadata: WYWTransformMetadata | null,\n];\n\nconst isPrevalOnly = (only: string[]) =>\n only.length === 1 && only[0] === '__wywPreval';\n\nconst hasWywPrevalExport = (code: string, filename: string): boolean =>\n Object.hasOwn(\n collectOxcExportsAndImports(code, filename).exports,\n '__wywPreval'\n );\n\ntype PrepareCodeOptions = {\n emitCommonJS?: boolean;\n shortCircuitOnMissingMetadata?: boolean;\n stripForEvalRuntime?: boolean;\n};\n\nconst normalizeOxcPreparedESM = (code: string): string =>\n code\n .replace(/^(?:[ \\t]*\\n)+/, '')\n .replace(/[ \\t\\n]+$/, '')\n .replace(/\\n{2,}/g, '\\n')\n .replace(/^const /gm, 'var ');\n\nconst ensureOxcPreevalResult = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): IPreevalResult => {\n const cached = item.getPreevalResult();\n if (cached) {\n return cached;\n }\n\n const { loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n throw new Error('Cannot run Oxc preeval for an ignored entrypoint.');\n }\n\n const filename = loadedAndParsed.evalConfig.filename ?? item.name;\n const { eventEmitter } = services;\n const { pluginOptions } = services.options;\n const root = services.options.root ?? process.cwd();\n\n const preevalStageResult = eventEmitter.perf('transform:preeval', () => {\n const result = runOxcPreevalStage(\n loadedAndParsed.code,\n {\n filename,\n root,\n },\n {\n ...pluginOptions,\n eventEmitter,\n }\n );\n\n return {\n ast: originalAst,\n baseCode: result.baseCode,\n code: result.code,\n dependencyNames: result.dependencyNames,\n evalCode: result.code,\n metadata: result.metadata,\n processorClassNames: result.processorClassNames,\n staticSideEffectImportLocals: [],\n staticDependencies: result.staticDependencies,\n staticValuesApplied: false,\n staticValueCache: result.staticValueCache,\n staticValueCandidates: result.staticValueCandidates,\n };\n });\n\n item.setPreevalResult(preevalStageResult);\n return preevalStageResult;\n};\n\nconst prepareOxcCodeImpl = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null,\n options: PrepareCodeOptions = {}\n): ReturnType<PrepareCodeFn> => {\n const { only, loadedAndParsed, log } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const filename = loadedAndParsed.evalConfig.filename ?? item.name;\n const { eventEmitter } = services;\n const { pluginOptions } = services.options;\n const root = services.options.root ?? process.cwd();\n\n const preevalStageResult = ensureOxcPreevalResult(\n services,\n item,\n originalAst\n );\n\n const transformMetadata = preevalStageResult.metadata;\n const preevalCode =\n options.stripForEvalRuntime && preevalStageResult.evalCode\n ? preevalStageResult.evalCode\n : preevalStageResult.code;\n if (\n isPrevalOnly(only) &&\n !transformMetadata &&\n !hasWywPrevalExport(preevalCode, filename) &&\n options.shortCircuitOnMissingMetadata !== false\n ) {\n log('[evaluator:end] no metadata');\n const strippedCode = stripTypesAndJsxWithOxc(preevalCode, filename).code;\n\n return [\n normalizeOxcPreparedESM(strippedCode),\n collectImportsFromOxc(strippedCode, filename),\n null,\n ];\n }\n\n log('[preeval] metadata %O', transformMetadata);\n log('[evaluator:start] using %s', loadedAndParsed.evaluator.name);\n log.extend('source')('%s', preevalCode);\n\n const shaken = eventEmitter.perf('transform:evaluator', () =>\n shakeOxcToESM(preevalCode, filename, {\n importOverrides: pluginOptions.importOverrides,\n onlyExports: only,\n root,\n })\n );\n\n log('[evaluator:end]');\n\n if (!options.emitCommonJS) {\n const preparedCode = options.stripForEvalRuntime\n ? stripTypesAndJsxWithOxc(shaken.code, filename).code\n : shaken.code;\n\n return [\n normalizeOxcPreparedESM(preparedCode),\n options.stripForEvalRuntime\n ? collectImportsFromOxc(preparedCode, filename)\n : shaken.imports,\n transformMetadata ?? null,\n ];\n }\n\n const emitted = eventEmitter.perf('transform:emitCommonJS', () =>\n emitOxcCommonJS(shaken.code, filename)\n );\n\n return [emitted.code, shaken.imports, transformMetadata ?? null];\n};\n\nconst prepareCodeImpl = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null,\n options: PrepareCodeOptions = {}\n): ReturnType<PrepareCodeFn> => {\n const { log, loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const { evaluator } = loadedAndParsed;\n if (evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${item.name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n return prepareOxcCodeImpl(services, item, originalAst, options);\n};\n\nexport const prepareCode = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): ReturnType<PrepareCodeFn> => prepareCodeImpl(services, item, originalAst);\n\nexport const prepareCodeForEvalRuntime = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): ReturnType<PrepareCodeFn> =>\n prepareCodeImpl(services, item, originalAst, {\n shortCircuitOnMissingMetadata: true,\n stripForEvalRuntime: true,\n });\n\nfunction* resolveAndProcessOxcPreparedImports(\n action: ITransformAction,\n preparedCode: string,\n imports: Map<string, string[]> | null\n): SyncScenarioFor<string> {\n const { loadedAndParsed } = action.entrypoint;\n if (imports === null || imports.size === 0) {\n return preparedCode;\n }\n\n const resolvedImports = yield* action.getNext(\n 'resolveImports',\n action.entrypoint,\n {\n imports,\n phase: 'initial',\n }\n );\n\n let nextCode = preparedCode;\n let nextResolvedImports: IEntrypointDependency[] = [];\n let skippedParentDependencyTracking: string[] = [];\n\n if (resolvedImports.length > 0) {\n const rewritten = yield* rewriteOptimizedOxcBarrelImports.call(\n action,\n preparedCode,\n loadedAndParsed.evaluator === 'ignored'\n ? action.entrypoint.name\n : loadedAndParsed.evalConfig.filename ?? action.entrypoint.name,\n resolvedImports\n );\n\n nextCode = rewritten.code;\n\n if (rewritten.optimizedCount > 0) {\n skippedParentDependencyTracking = rewritten.generatedSources;\n const fullyRewrittenSources = new Set(rewritten.fullyRewrittenSources);\n const partialFallbackSources = new Set(rewritten.partialFallbackSources);\n\n for (const dependency of resolvedImports) {\n if (\n dependency.resolved &&\n (fullyRewrittenSources.has(dependency.source) ||\n partialFallbackSources.has(dependency.source))\n ) {\n if (partialFallbackSources.has(dependency.source)) {\n action.entrypoint.addDependency(dependency);\n } else {\n action.entrypoint.addInvalidationDependency(dependency);\n }\n\n action.entrypoint.markInvalidateOnDependencyChange(\n dependency.resolved\n );\n }\n }\n\n nextResolvedImports = yield* action.getNext(\n 'resolveImports',\n action.entrypoint,\n {\n imports: rewritten.imports,\n phase: 'rewritten',\n preResolved: rewritten.preResolvedImports,\n }\n );\n } else {\n nextResolvedImports = resolvedImports;\n }\n }\n\n if (nextResolvedImports.length !== 0) {\n yield [\n 'processImports',\n action.entrypoint,\n {\n resolved: nextResolvedImports,\n skipParentDependencyTracking: skippedParentDependencyTracking,\n },\n ];\n }\n\n return nextCode;\n}\n\nexport function* internalTransform(\n this: ITransformAction,\n prepareFn: PrepareCodeFn\n): SyncScenarioForAction<ITransformAction> {\n const { only, loadedAndParsed, log } = this.entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n if (loadedAndParsed.evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${this.entrypoint.name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n log('>> (%o)', only);\n\n if (loadedAndParsed.evaluator === oxcShaker) {\n ensureOxcPreevalResult(this.services, this.entrypoint, null);\n yield* resolveStaticOxcPreevalValues.call(this);\n }\n\n let [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n null\n );\n let finalPreparedCode = preparedCode;\n\n if (loadedAndParsed.evaluator === oxcShaker) {\n if (metadata === null && isPrevalOnly(only)) {\n log(\n 'skip resolving imports for __wywPreval-only entrypoint without metadata'\n );\n return {\n code: finalPreparedCode,\n metadata: null,\n };\n }\n\n let nextCode = yield* resolveAndProcessOxcPreparedImports(\n this,\n preparedCode,\n imports\n );\n\n if (yield* resolveStaticOxcPreevalValues.call(this)) {\n [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n null\n );\n nextCode = yield* resolveAndProcessOxcPreparedImports(\n this,\n preparedCode,\n imports\n );\n }\n\n finalPreparedCode = this.services.eventEmitter.perf(\n 'transform:emitCommonJS',\n () =>\n emitOxcCommonJS(\n nextCode,\n loadedAndParsed.evalConfig.filename ?? this.entrypoint.name\n ).code\n );\n }\n\n if (loadedAndParsed.code === finalPreparedCode) {\n log('<< (%o)\\n === no changes ===', only);\n } else {\n log('<< (%o)', only);\n log.extend('source')('%s', finalPreparedCode || EMPTY_FILE);\n }\n\n if (finalPreparedCode === '') {\n log('is skipped');\n return {\n code: loadedAndParsed.code ?? '',\n metadata,\n };\n }\n\n if (metadata === null && isPrevalOnly(only)) {\n log(\n 'skip resolving imports for __wywPreval-only entrypoint without metadata'\n );\n return {\n code: finalPreparedCode,\n metadata: null,\n };\n }\n\n if (\n loadedAndParsed.evaluator !== oxcShaker &&\n imports !== null &&\n imports.size > 0\n ) {\n const resolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports,\n }\n );\n\n if (resolvedImports.length !== 0) {\n yield [\n 'processImports',\n this.entrypoint,\n {\n resolved: resolvedImports,\n },\n ];\n }\n }\n\n return {\n code: finalPreparedCode,\n metadata,\n };\n}\n\nexport function* transform(\n this: ITransformAction\n): SyncScenarioForAction<ITransformAction> {\n return yield* internalTransform.call(this, prepareCode);\n}\n"],"file":"transform.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../src/transform/generators/transform.ts"],"version":3,"sourcesContent":["import { oxcShaker } from '../../shaker';\nimport type { WYWTransformMetadata } from '../../utils/TransformMetadata';\nimport { collectOxcExportsAndImports } from '../../utils/collectOxcExportsAndImports';\nimport { emitOxcCommonJS, stripTypesAndJsxWithOxc } from '../../utils/oxcEmit';\nimport { runOxcPreevalStage } from '../../utils/oxcPreevalStage';\nimport { shakeOxcToESM } from '../../utils/oxcShaker';\nimport type { Entrypoint } from '../Entrypoint';\nimport type {\n IEntrypointDependency,\n IPreevalResult,\n} from '../Entrypoint.types';\nimport type {\n ITransformAction,\n Services,\n SyncScenarioFor,\n SyncScenarioForAction,\n} from '../types';\n\nimport { rewriteOptimizedOxcBarrelImports } from './rewriteOxcBarrelImports';\nimport { resolveStaticOxcPreevalValues } from './resolveStaticOxcValues';\n\nconst EMPTY_FILE = '=== empty file ===';\n\nconst collectImportsFromOxc = (\n code: string,\n filename: string\n): Map<string, string[]> => {\n const imports = new Map<string, string[]>();\n const addImport = (source: string, imported: string) => {\n const bucket = imports.get(source) ?? [];\n if (!bucket.includes(imported)) {\n bucket.push(imported);\n }\n\n imports.set(source, bucket);\n };\n\n collectOxcExportsAndImports(code, filename).imports.forEach((item) => {\n addImport(item.source, item.imported || 'side-effect');\n });\n\n return imports;\n};\n\ntype PrepareCodeFn = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n) => [\n code: string,\n imports: Map<string, string[]> | null,\n metadata: WYWTransformMetadata | null,\n];\n\nconst isPrevalOnly = (only: string[]) =>\n only.length === 1 && only[0] === '__wywPreval';\n\nconst hasWywPrevalExport = (code: string, filename: string): boolean =>\n Object.hasOwn(\n collectOxcExportsAndImports(code, filename).exports,\n '__wywPreval'\n );\n\ntype PrepareCodeOptions = {\n emitCommonJS?: boolean;\n shortCircuitOnMissingMetadata?: boolean;\n stripForEvalRuntime?: boolean;\n};\n\nconst normalizeOxcPreparedESM = (code: string): string =>\n code\n .replace(/^(?:[ \\t]*\\n)+/, '')\n .replace(/[ \\t\\n]+$/, '')\n .replace(/\\n{2,}/g, '\\n')\n .replace(/^const /gm, 'var ');\n\nconst ensureOxcPreevalResult = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): IPreevalResult => {\n const cached = item.getPreevalResult();\n if (cached) {\n return cached;\n }\n\n const { loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n throw new Error('Cannot run Oxc preeval for an ignored entrypoint.');\n }\n\n const filename = loadedAndParsed.evalConfig.filename ?? item.name;\n const { eventEmitter } = services;\n const { pluginOptions } = services.options;\n const root = services.options.root ?? process.cwd();\n\n const preevalStageResult = eventEmitter.perf('transform:preeval', () => {\n const result = runOxcPreevalStage(\n loadedAndParsed.code,\n {\n filename,\n root,\n },\n {\n ...pluginOptions,\n eventEmitter,\n }\n );\n\n return {\n ast: originalAst,\n baseCode: result.baseCode,\n code: result.code,\n dependencyNames: result.dependencyNames,\n evalCode: result.code,\n metadata: result.metadata,\n processorClassNames: result.processorClassNames,\n staticImportLocals: [],\n staticSideEffectImportLocals: [],\n staticDependencies: result.staticDependencies,\n staticValuesApplied: false,\n staticValueCache: result.staticValueCache,\n staticValueCandidates: result.staticValueCandidates,\n };\n });\n\n item.setPreevalResult(preevalStageResult);\n return preevalStageResult;\n};\n\nconst prepareOxcCodeImpl = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null,\n options: PrepareCodeOptions = {}\n): ReturnType<PrepareCodeFn> => {\n const { only, loadedAndParsed, log } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const filename = loadedAndParsed.evalConfig.filename ?? item.name;\n const { eventEmitter } = services;\n const { pluginOptions } = services.options;\n const root = services.options.root ?? process.cwd();\n\n const preevalStageResult = ensureOxcPreevalResult(\n services,\n item,\n originalAst\n );\n\n const transformMetadata = preevalStageResult.metadata;\n const preevalCode =\n options.stripForEvalRuntime && preevalStageResult.evalCode\n ? preevalStageResult.evalCode\n : preevalStageResult.code;\n if (\n isPrevalOnly(only) &&\n !transformMetadata &&\n !hasWywPrevalExport(preevalCode, filename) &&\n options.shortCircuitOnMissingMetadata !== false\n ) {\n log('[evaluator:end] no metadata');\n const strippedCode = stripTypesAndJsxWithOxc(preevalCode, filename).code;\n\n return [\n normalizeOxcPreparedESM(strippedCode),\n collectImportsFromOxc(strippedCode, filename),\n null,\n ];\n }\n\n log('[preeval] metadata %O', transformMetadata);\n log('[evaluator:start] using %s', loadedAndParsed.evaluator.name);\n log.extend('source')('%s', preevalCode);\n\n const shaken = eventEmitter.perf('transform:evaluator', () =>\n shakeOxcToESM(preevalCode, filename, {\n importOverrides: pluginOptions.importOverrides,\n onlyExports: only,\n root,\n })\n );\n\n log('[evaluator:end]');\n\n if (!options.emitCommonJS) {\n const preparedCode = options.stripForEvalRuntime\n ? stripTypesAndJsxWithOxc(shaken.code, filename).code\n : shaken.code;\n\n return [\n normalizeOxcPreparedESM(preparedCode),\n options.stripForEvalRuntime\n ? collectImportsFromOxc(preparedCode, filename)\n : shaken.imports,\n transformMetadata ?? null,\n ];\n }\n\n const emitted = eventEmitter.perf('transform:emitCommonJS', () =>\n emitOxcCommonJS(shaken.code, filename)\n );\n\n return [emitted.code, shaken.imports, transformMetadata ?? null];\n};\n\nconst prepareCodeImpl = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null,\n options: PrepareCodeOptions = {}\n): ReturnType<PrepareCodeFn> => {\n const { log, loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const { evaluator } = loadedAndParsed;\n if (evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${item.name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n return prepareOxcCodeImpl(services, item, originalAst, options);\n};\n\nexport const prepareCode = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): ReturnType<PrepareCodeFn> => prepareCodeImpl(services, item, originalAst);\n\nexport const prepareCodeForEvalRuntime = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): ReturnType<PrepareCodeFn> =>\n prepareCodeImpl(services, item, originalAst, {\n shortCircuitOnMissingMetadata: true,\n stripForEvalRuntime: true,\n });\n\nfunction* resolveAndProcessOxcPreparedImports(\n action: ITransformAction,\n preparedCode: string,\n imports: Map<string, string[]> | null\n): SyncScenarioFor<string> {\n const { loadedAndParsed } = action.entrypoint;\n if (imports === null || imports.size === 0) {\n return preparedCode;\n }\n\n const resolvedImports = yield* action.getNext(\n 'resolveImports',\n action.entrypoint,\n {\n imports,\n phase: 'initial',\n }\n );\n\n let nextCode = preparedCode;\n let nextResolvedImports: IEntrypointDependency[] = [];\n let skippedParentDependencyTracking: string[] = [];\n\n if (resolvedImports.length > 0) {\n const rewritten = yield* rewriteOptimizedOxcBarrelImports.call(\n action,\n preparedCode,\n loadedAndParsed.evaluator === 'ignored'\n ? action.entrypoint.name\n : loadedAndParsed.evalConfig.filename ?? action.entrypoint.name,\n resolvedImports\n );\n\n nextCode = rewritten.code;\n\n if (rewritten.optimizedCount > 0) {\n skippedParentDependencyTracking = rewritten.generatedSources;\n const fullyRewrittenSources = new Set(rewritten.fullyRewrittenSources);\n const partialFallbackSources = new Set(rewritten.partialFallbackSources);\n\n for (const dependency of resolvedImports) {\n if (\n dependency.resolved &&\n (fullyRewrittenSources.has(dependency.source) ||\n partialFallbackSources.has(dependency.source))\n ) {\n if (partialFallbackSources.has(dependency.source)) {\n action.entrypoint.addDependency(dependency);\n } else {\n action.entrypoint.addInvalidationDependency(dependency);\n }\n\n action.entrypoint.markInvalidateOnDependencyChange(\n dependency.resolved\n );\n }\n }\n\n nextResolvedImports = yield* action.getNext(\n 'resolveImports',\n action.entrypoint,\n {\n imports: rewritten.imports,\n phase: 'rewritten',\n preResolved: rewritten.preResolvedImports,\n }\n );\n } else {\n nextResolvedImports = resolvedImports;\n }\n }\n\n if (nextResolvedImports.length !== 0) {\n yield [\n 'processImports',\n action.entrypoint,\n {\n resolved: nextResolvedImports,\n skipParentDependencyTracking: skippedParentDependencyTracking,\n },\n ];\n }\n\n return nextCode;\n}\n\nexport function* internalTransform(\n this: ITransformAction,\n prepareFn: PrepareCodeFn\n): SyncScenarioForAction<ITransformAction> {\n const { only, loadedAndParsed, log } = this.entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n if (loadedAndParsed.evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${this.entrypoint.name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n log('>> (%o)', only);\n\n if (loadedAndParsed.evaluator === oxcShaker) {\n ensureOxcPreevalResult(this.services, this.entrypoint, null);\n yield* resolveStaticOxcPreevalValues.call(this);\n }\n\n let [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n null\n );\n let finalPreparedCode = preparedCode;\n\n if (loadedAndParsed.evaluator === oxcShaker) {\n if (metadata === null && isPrevalOnly(only)) {\n log(\n 'skip resolving imports for __wywPreval-only entrypoint without metadata'\n );\n return {\n code: finalPreparedCode,\n metadata: null,\n };\n }\n\n let nextCode = yield* resolveAndProcessOxcPreparedImports(\n this,\n preparedCode,\n imports\n );\n\n if (yield* resolveStaticOxcPreevalValues.call(this)) {\n [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n null\n );\n nextCode = yield* resolveAndProcessOxcPreparedImports(\n this,\n preparedCode,\n imports\n );\n }\n\n finalPreparedCode = this.services.eventEmitter.perf(\n 'transform:emitCommonJS',\n () =>\n emitOxcCommonJS(\n nextCode,\n loadedAndParsed.evalConfig.filename ?? this.entrypoint.name\n ).code\n );\n }\n\n if (loadedAndParsed.code === finalPreparedCode) {\n log('<< (%o)\\n === no changes ===', only);\n } else {\n log('<< (%o)', only);\n log.extend('source')('%s', finalPreparedCode || EMPTY_FILE);\n }\n\n if (finalPreparedCode === '') {\n log('is skipped');\n return {\n code: loadedAndParsed.code ?? '',\n metadata,\n };\n }\n\n if (metadata === null && isPrevalOnly(only)) {\n log(\n 'skip resolving imports for __wywPreval-only entrypoint without metadata'\n );\n return {\n code: finalPreparedCode,\n metadata: null,\n };\n }\n\n if (\n loadedAndParsed.evaluator !== oxcShaker &&\n imports !== null &&\n imports.size > 0\n ) {\n const resolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports,\n }\n );\n\n if (resolvedImports.length !== 0) {\n yield [\n 'processImports',\n this.entrypoint,\n {\n resolved: resolvedImports,\n },\n ];\n }\n }\n\n return {\n code: finalPreparedCode,\n metadata,\n };\n}\n\nexport function* transform(\n this: ITransformAction\n): SyncScenarioForAction<ITransformAction> {\n return yield* internalTransform.call(this, prepareCode);\n}\n"],"file":"transform.js"}
@@ -14,6 +14,13 @@ export class EventEmitter {
14
14
  this.enabled = enabled;
15
15
  }
16
16
  action(actonType, idx, entrypointRef, fn) {
17
+ // Fast path: when the emitter is disabled (the dummy used by the
18
+ // production transform path) skip start/finish bookkeeping and the
19
+ // Promise hookup. action() is on the hot path for every step of every
20
+ // action — its per-call overhead is small but ubiquitous.
21
+ if (!this.enabled) {
22
+ return fn();
23
+ }
17
24
  const id = this.onAction("start", performance.now(), actonType, idx, entrypointRef);
18
25
  try {
19
26
  const result = fn();
@@ -32,6 +39,12 @@ export class EventEmitter {
32
39
  this.onEntrypointEvent(sequenceId, performance.now(), event);
33
40
  }
34
41
  perf(method, fn) {
42
+ // Fast path: see action() above. perf() wraps ~28s of cumulative time
43
+ // in the production-path CPU profile; the wrapper overhead per call is
44
+ // small but everywhere.
45
+ if (!this.enabled) {
46
+ return fn();
47
+ }
35
48
  const spanId = this.perfSpanId;
36
49
  this.perfSpanId += 1;
37
50
  const startedAt = performance.now();
@@ -1 +1 @@
1
- {"mappings":"AA8DA,OAAO,MAAM,uBACX,SAC8B;AAC9B,QAAO,KAAK,OAAO;;AAGrB,OAAO,MAAM,wBACX,SAC+B;AAC/B,QAAO,KAAK,OAAO,YAAY,KAAK,OAAO;;AA6B7C,OAAO,MAAM,aAAa;CACxB,OAAO,QAAQ,IAAI,mBACX,UACA,SACA,IACN,MACD;CAED,AAAQ,aAAa;CAErB,YACE,AAAU,SACV,AAAU,UACV,AAAU,mBACV,AAAgB,UAAU,MAC1B;EAJU;EACA;EACA;EACM;;CAGlB,AAAO,OACL,WACA,KACA,eACA,IACA;EACA,MAAM,KAAK,KAAK,SACd,SACA,YAAY,KAAK,EACjB,WACA,KACA,cACD;AAED,MAAI;GACF,MAAM,SAAS,IAAI;AACnB,OAAI,kBAAkB,SAAS;AAC7B,WAAO,WACC,KAAK,SAAS,UAAU,YAAY,KAAK,EAAE,IAAI,KAAK,GACzD,MAAM,KAAK,SAAS,QAAQ,YAAY,KAAK,EAAE,IAAI,MAAM,EAAE,CAC7D;UACI;AACL,SAAK,SAAS,UAAU,YAAY,KAAK,EAAE,IAAI,MAAM;;AAGvD,UAAO;WACA,GAAG;AACV,QAAK,SAAS,QAAQ,YAAY,KAAK,EAAE,IAAI,OAAO,EAAE;AACtD,SAAM;;;CAIV,AAAO,gBAAgB,YAAoB,OAAwB;AACjE,OAAK,kBAAkB,YAAY,YAAY,KAAK,EAAE,MAAM;;CAG9D,AAAO,KAAW,QAAgB,IAAsB;EACtD,MAAM,SAAS,KAAK;AACpB,OAAK,cAAc;EACnB,MAAM,YAAY,YAAY,KAAK;EACnC,MAAM,SAAS,EAAE,QAAQ;EACzB,MAAM,aAA6B;GACjC;GACA;GACA;GACA,MAAM;GACP;AAED,OAAK,QAAQ,QAAQ,SAAS,WAAW;EAEzC,MAAM,UAAU,QAAoB,SAAkB,UAAoB;GACxE,MAAM,aAAa,YAAY,KAAK;GACpC,MAAM,cAA+B;IACnC,YAAY,aAAa;IACzB;IACA;IACA;IACA;IACA;IACA;IACA,MAAM;IACP;AAED,OAAI,UAAU,WAAW;AACvB,gBAAY,QAAQ;;AAGtB,QAAK,QAAQ,QAAQ,UAAU,YAAY;;AAG7C,MAAI;GACF,MAAM,SAAS,IAAI;AACnB,OAAI,kBAAkB,SAAS;AAC7B,WAAO,WACC,OAAO,YAAY,KAAK,GAC7B,UAAU,OAAO,UAAU,MAAM,MAAM,CACzC;UACI;AACL,WAAO,YAAY,MAAM;;AAG3B,UAAO;WACA,OAAO;AACd,UAAO,UAAU,OAAO,MAAM;AAC9B,SAAM;;;CAIV,AAAO,OAAO,QAAiC;AAC7C,OAAK,QACH;GACE,GAAG;GACH,UAAU,IAAI,MAAM;GACrB,EACD,SACD","names":[],"sources":["../../src/utils/EventEmitter.ts"],"version":3,"sourcesContent":["export type OnEvent = (\n labels: Record<string, unknown>,\n type: 'start' | 'finish' | 'single',\n event?: unknown\n) => void;\n\nexport interface IActionCreated {\n actionIdx: string;\n actionType: string;\n type: 'actionCreated';\n}\n\nexport interface ICreatedEvent {\n class: string;\n evaluatedOnly: string[];\n filename: string;\n generation: number;\n idx: string;\n isExportsInherited: boolean;\n only: string[];\n parentId: number | null;\n type: 'created';\n}\n\nexport interface ISupersededEvent {\n type: 'superseded';\n with: number;\n}\n\nexport interface ISetTransformResultEvent {\n isNull: boolean;\n type: 'setTransformResult';\n}\n\nexport type EntrypointEvent =\n | IActionCreated\n | ICreatedEvent\n | ISupersededEvent\n | ISetTransformResultEvent;\n\nexport type OnEntrypointEvent = (\n idx: number,\n timestamp: number,\n event: EntrypointEvent\n) => void;\n\nexport type OnActionStartArgs = [\n phase: 'start',\n timestamp: number,\n type: string,\n idx: string,\n entrypointRef: string,\n];\n\nexport type OnActionFinishArgs = [\n phase: 'finish' | 'fail',\n timestamp: number,\n id: number,\n isAsync: boolean,\n error?: unknown,\n];\n\nexport const isOnActionStartArgs = (\n args: OnActionStartArgs | OnActionFinishArgs\n): args is OnActionStartArgs => {\n return args[0] === 'start';\n};\n\nexport const isOnActionFinishArgs = (\n args: OnActionStartArgs | OnActionFinishArgs\n): args is OnActionFinishArgs => {\n return args[0] === 'finish' || args[0] === 'fail';\n};\n\nexport interface OnAction {\n (...args: OnActionStartArgs): number;\n (...args: OnActionFinishArgs): void;\n}\n\ntype PerfStatus = 'failed' | 'finished';\n\ntype PerfStartEvent = {\n method: string;\n spanId: number;\n startedAt: number;\n type: 'perf-span-start';\n};\n\nexport type PerfFinishEvent = {\n durationMs: number;\n error?: unknown;\n finishedAt: number;\n isAsync: boolean;\n method: string;\n spanId: number;\n startedAt: number;\n status: PerfStatus;\n type: 'perf-span';\n};\n\nexport class EventEmitter {\n static dummy = new EventEmitter(\n () => {},\n () => 0,\n () => {},\n false\n );\n\n private perfSpanId = 0;\n\n constructor(\n protected onEvent: OnEvent,\n protected onAction: OnAction,\n protected onEntrypointEvent: OnEntrypointEvent,\n public readonly enabled = true\n ) {}\n\n public action<TRes>(\n actonType: string,\n idx: string,\n entrypointRef: string,\n fn: () => TRes\n ) {\n const id = this.onAction(\n 'start',\n performance.now(),\n actonType,\n idx,\n entrypointRef\n );\n\n try {\n const result = fn();\n if (result instanceof Promise) {\n result.then(\n () => this.onAction('finish', performance.now(), id, true),\n (e) => this.onAction('fail', performance.now(), id, true, e)\n );\n } else {\n this.onAction('finish', performance.now(), id, false);\n }\n\n return result;\n } catch (e) {\n this.onAction('fail', performance.now(), id, false, e);\n throw e;\n }\n }\n\n public entrypointEvent(sequenceId: number, event: EntrypointEvent) {\n this.onEntrypointEvent(sequenceId, performance.now(), event);\n }\n\n public perf<TRes>(method: string, fn: () => TRes): TRes {\n const spanId = this.perfSpanId;\n this.perfSpanId += 1;\n const startedAt = performance.now();\n const labels = { method };\n const startEvent: PerfStartEvent = {\n method,\n spanId,\n startedAt,\n type: 'perf-span-start',\n };\n\n this.onEvent(labels, 'start', startEvent);\n\n const finish = (status: PerfStatus, isAsync: boolean, error?: unknown) => {\n const finishedAt = performance.now();\n const finishEvent: PerfFinishEvent = {\n durationMs: finishedAt - startedAt,\n finishedAt,\n isAsync,\n method,\n spanId,\n startedAt,\n status,\n type: 'perf-span',\n };\n\n if (error !== undefined) {\n finishEvent.error = error;\n }\n\n this.onEvent(labels, 'finish', finishEvent);\n };\n\n try {\n const result = fn();\n if (result instanceof Promise) {\n result.then(\n () => finish('finished', true),\n (error) => finish('failed', true, error)\n );\n } else {\n finish('finished', false);\n }\n\n return result;\n } catch (error) {\n finish('failed', false, error);\n throw error;\n }\n }\n\n public single(labels: Record<string, unknown>) {\n this.onEvent(\n {\n ...labels,\n datetime: new Date(),\n },\n 'single'\n );\n }\n}\n"],"file":"EventEmitter.js"}
1
+ {"mappings":"AA8DA,OAAO,MAAM,uBACX,SAC8B;AAC9B,QAAO,KAAK,OAAO;;AAGrB,OAAO,MAAM,wBACX,SAC+B;AAC/B,QAAO,KAAK,OAAO,YAAY,KAAK,OAAO;;AA6B7C,OAAO,MAAM,aAAa;CACxB,OAAO,QAAQ,IAAI,mBACX,UACA,SACA,IACN,MACD;CAED,AAAQ,aAAa;CAErB,YACE,AAAU,SACV,AAAU,UACV,AAAU,mBACV,AAAgB,UAAU,MAC1B;EAJU;EACA;EACA;EACM;;CAGlB,AAAO,OACL,WACA,KACA,eACA,IACA;;;;;AAKA,MAAI,CAAC,KAAK,SAAS;AACjB,UAAO,IAAI;;EAEb,MAAM,KAAK,KAAK,SACd,SACA,YAAY,KAAK,EACjB,WACA,KACA,cACD;AAED,MAAI;GACF,MAAM,SAAS,IAAI;AACnB,OAAI,kBAAkB,SAAS;AAC7B,WAAO,WACC,KAAK,SAAS,UAAU,YAAY,KAAK,EAAE,IAAI,KAAK,GACzD,MAAM,KAAK,SAAS,QAAQ,YAAY,KAAK,EAAE,IAAI,MAAM,EAAE,CAC7D;UACI;AACL,SAAK,SAAS,UAAU,YAAY,KAAK,EAAE,IAAI,MAAM;;AAGvD,UAAO;WACA,GAAG;AACV,QAAK,SAAS,QAAQ,YAAY,KAAK,EAAE,IAAI,OAAO,EAAE;AACtD,SAAM;;;CAIV,AAAO,gBAAgB,YAAoB,OAAwB;AACjE,OAAK,kBAAkB,YAAY,YAAY,KAAK,EAAE,MAAM;;CAG9D,AAAO,KAAW,QAAgB,IAAsB;;;;AAItD,MAAI,CAAC,KAAK,SAAS;AACjB,UAAO,IAAI;;EAEb,MAAM,SAAS,KAAK;AACpB,OAAK,cAAc;EACnB,MAAM,YAAY,YAAY,KAAK;EACnC,MAAM,SAAS,EAAE,QAAQ;EACzB,MAAM,aAA6B;GACjC;GACA;GACA;GACA,MAAM;GACP;AAED,OAAK,QAAQ,QAAQ,SAAS,WAAW;EAEzC,MAAM,UAAU,QAAoB,SAAkB,UAAoB;GACxE,MAAM,aAAa,YAAY,KAAK;GACpC,MAAM,cAA+B;IACnC,YAAY,aAAa;IACzB;IACA;IACA;IACA;IACA;IACA;IACA,MAAM;IACP;AAED,OAAI,UAAU,WAAW;AACvB,gBAAY,QAAQ;;AAGtB,QAAK,QAAQ,QAAQ,UAAU,YAAY;;AAG7C,MAAI;GACF,MAAM,SAAS,IAAI;AACnB,OAAI,kBAAkB,SAAS;AAC7B,WAAO,WACC,OAAO,YAAY,KAAK,GAC7B,UAAU,OAAO,UAAU,MAAM,MAAM,CACzC;UACI;AACL,WAAO,YAAY,MAAM;;AAG3B,UAAO;WACA,OAAO;AACd,UAAO,UAAU,OAAO,MAAM;AAC9B,SAAM;;;CAIV,AAAO,OAAO,QAAiC;AAC7C,OAAK,QACH;GACE,GAAG;GACH,UAAU,IAAI,MAAM;GACrB,EACD,SACD","names":[],"sources":["../../src/utils/EventEmitter.ts"],"version":3,"sourcesContent":["export type OnEvent = (\n labels: Record<string, unknown>,\n type: 'start' | 'finish' | 'single',\n event?: unknown\n) => void;\n\nexport interface IActionCreated {\n actionIdx: string;\n actionType: string;\n type: 'actionCreated';\n}\n\nexport interface ICreatedEvent {\n class: string;\n evaluatedOnly: string[];\n filename: string;\n generation: number;\n idx: string;\n isExportsInherited: boolean;\n only: string[];\n parentId: number | null;\n type: 'created';\n}\n\nexport interface ISupersededEvent {\n type: 'superseded';\n with: number;\n}\n\nexport interface ISetTransformResultEvent {\n isNull: boolean;\n type: 'setTransformResult';\n}\n\nexport type EntrypointEvent =\n | IActionCreated\n | ICreatedEvent\n | ISupersededEvent\n | ISetTransformResultEvent;\n\nexport type OnEntrypointEvent = (\n idx: number,\n timestamp: number,\n event: EntrypointEvent\n) => void;\n\nexport type OnActionStartArgs = [\n phase: 'start',\n timestamp: number,\n type: string,\n idx: string,\n entrypointRef: string,\n];\n\nexport type OnActionFinishArgs = [\n phase: 'finish' | 'fail',\n timestamp: number,\n id: number,\n isAsync: boolean,\n error?: unknown,\n];\n\nexport const isOnActionStartArgs = (\n args: OnActionStartArgs | OnActionFinishArgs\n): args is OnActionStartArgs => {\n return args[0] === 'start';\n};\n\nexport const isOnActionFinishArgs = (\n args: OnActionStartArgs | OnActionFinishArgs\n): args is OnActionFinishArgs => {\n return args[0] === 'finish' || args[0] === 'fail';\n};\n\nexport interface OnAction {\n (...args: OnActionStartArgs): number;\n (...args: OnActionFinishArgs): void;\n}\n\ntype PerfStatus = 'failed' | 'finished';\n\ntype PerfStartEvent = {\n method: string;\n spanId: number;\n startedAt: number;\n type: 'perf-span-start';\n};\n\nexport type PerfFinishEvent = {\n durationMs: number;\n error?: unknown;\n finishedAt: number;\n isAsync: boolean;\n method: string;\n spanId: number;\n startedAt: number;\n status: PerfStatus;\n type: 'perf-span';\n};\n\nexport class EventEmitter {\n static dummy = new EventEmitter(\n () => {},\n () => 0,\n () => {},\n false\n );\n\n private perfSpanId = 0;\n\n constructor(\n protected onEvent: OnEvent,\n protected onAction: OnAction,\n protected onEntrypointEvent: OnEntrypointEvent,\n public readonly enabled = true\n ) {}\n\n public action<TRes>(\n actonType: string,\n idx: string,\n entrypointRef: string,\n fn: () => TRes\n ) {\n // Fast path: when the emitter is disabled (the dummy used by the\n // production transform path) skip start/finish bookkeeping and the\n // Promise hookup. action() is on the hot path for every step of every\n // action — its per-call overhead is small but ubiquitous.\n if (!this.enabled) {\n return fn();\n }\n const id = this.onAction(\n 'start',\n performance.now(),\n actonType,\n idx,\n entrypointRef\n );\n\n try {\n const result = fn();\n if (result instanceof Promise) {\n result.then(\n () => this.onAction('finish', performance.now(), id, true),\n (e) => this.onAction('fail', performance.now(), id, true, e)\n );\n } else {\n this.onAction('finish', performance.now(), id, false);\n }\n\n return result;\n } catch (e) {\n this.onAction('fail', performance.now(), id, false, e);\n throw e;\n }\n }\n\n public entrypointEvent(sequenceId: number, event: EntrypointEvent) {\n this.onEntrypointEvent(sequenceId, performance.now(), event);\n }\n\n public perf<TRes>(method: string, fn: () => TRes): TRes {\n // Fast path: see action() above. perf() wraps ~28s of cumulative time\n // in the production-path CPU profile; the wrapper overhead per call is\n // small but everywhere.\n if (!this.enabled) {\n return fn();\n }\n const spanId = this.perfSpanId;\n this.perfSpanId += 1;\n const startedAt = performance.now();\n const labels = { method };\n const startEvent: PerfStartEvent = {\n method,\n spanId,\n startedAt,\n type: 'perf-span-start',\n };\n\n this.onEvent(labels, 'start', startEvent);\n\n const finish = (status: PerfStatus, isAsync: boolean, error?: unknown) => {\n const finishedAt = performance.now();\n const finishEvent: PerfFinishEvent = {\n durationMs: finishedAt - startedAt,\n finishedAt,\n isAsync,\n method,\n spanId,\n startedAt,\n status,\n type: 'perf-span',\n };\n\n if (error !== undefined) {\n finishEvent.error = error;\n }\n\n this.onEvent(labels, 'finish', finishEvent);\n };\n\n try {\n const result = fn();\n if (result instanceof Promise) {\n result.then(\n () => finish('finished', true),\n (error) => finish('failed', true, error)\n );\n } else {\n finish('finished', false);\n }\n\n return result;\n } catch (error) {\n finish('failed', false, error);\n throw error;\n }\n }\n\n public single(labels: Record<string, unknown>) {\n this.onEvent(\n {\n ...labels,\n datetime: new Date(),\n },\n 'single'\n );\n }\n}\n"],"file":"EventEmitter.js"}
@@ -150,7 +150,7 @@ export const applyOxcProcessors = (code, fileContext, options, callback, cleanup
150
150
  const sameFileProcessorStaticValues = collectSameFileProcessorStaticValues(extracted.expressionValues, sameFileProcessorStaticValuesByLocal);
151
151
  const codeWithAddedImports = insertAddedImports(replacedCode, program, addedImports);
152
152
  return {
153
- code: cleanupUnused ? eventEmitter.perf("transform:preeval:processTemplate:cleanup", () => removeUnusedAfterReplacement(codeWithAddedImports, filename, removableImportLocals, new Set([...removableExpressionRefs, ...extracted.dependencyNames]), options.preserveSideEffectImportLocals ?? new Set())) : codeWithAddedImports,
153
+ code: cleanupUnused ? eventEmitter.perf("transform:preeval:processTemplate:cleanup", () => removeUnusedAfterReplacement(codeWithAddedImports, filename, removableImportLocals, new Set([...removableExpressionRefs, ...extracted.dependencyNames]), options.preserveSideEffectImportLocals ?? new Set(), options.preserveSideEffectImportOrderLocals ?? options.preserveSideEffectImportLocals ?? new Set())) : codeWithAddedImports,
154
154
  processorClassNamesByLocal,
155
155
  processors,
156
156
  staticValueCandidates: addCandidateInlineConstants(staticValueCandidates, sameFileProcessorStaticValuesByLocal),
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../../src/utils/applyOxcProcessors/applyOxcProcessors.ts"],"version":3,"sourcesContent":["import type { BaseProcessor, IFileContext } from '@wyw-in-js/processor-utils';\nimport type { ExpressionValue, StrictOptions } from '@wyw-in-js/shared';\n\nimport { collectOxcProcessorImportsFromProgram } from '../collectOxcExportsAndImports';\nimport { collectOxcExpressionDependencies } from '../collectOxcTemplateDependencies';\nimport { EventEmitter } from '../EventEmitter';\nimport type { AddedImport } from '../oxcAstService';\nimport { isOxcNode } from '../oxc/ast';\nimport { applyOxcReplacements } from '../oxc/replacements';\nimport {\n buildOxcCodeFrameError,\n createOxcLocationLookup,\n} from '../oxc/sourceLocations';\nimport { getProcessorForImport } from '../processorLookup';\nimport { resolveProcessorStaticClassName } from '../processorStaticSemantics';\nimport { collectUsedNames } from './cleanupBindings';\nimport {\n addCandidateInlineConstants,\n collectSameFileProcessorObjectStaticValuesByLocal,\n collectSameFileProcessorStaticValuesByLocal,\n collectWYWMetaExtendsHelperNames,\n getSameFileProcessorObjectProperty,\n} from './sameFileStaticValues';\nimport {\n collectSameFileProcessorStaticValues,\n getTagOwner,\n isTagReferenced,\n} from './displayName';\nimport { buildParams } from './expressionValues';\nimport {\n createProcessor,\n shouldCollectStaticExpressionValues,\n} from './processorFactory';\nimport {\n collectProcessorUsages,\n collectUsageExpressionSpans,\n} from './processorUsages';\nimport { removeUnusedAfterReplacement } from './cleanupRemovals';\nimport { insertAddedImports, parseOxc } from './shared';\nimport type {\n ApplyOxcProcessorsResult,\n DefinedProcessor,\n Replacement,\n SameFileProcessorObject,\n} from './types';\n\nexport const applyOxcProcessors = (\n code: string,\n fileContext: IFileContext,\n options: Pick<\n StrictOptions,\n | 'classNameSlug'\n | 'displayName'\n | 'eval'\n | 'extensions'\n | 'staticBindings'\n | 'tagResolver'\n > & {\n eventEmitter?: EventEmitter;\n preserveSideEffectImportLocals?: Set<string>;\n },\n callback: (processor: BaseProcessor) => void,\n cleanupUnused = false\n): ApplyOxcProcessorsResult => {\n const filename = fileContext.filename ?? 'unknown.js';\n const eventEmitter = options.eventEmitter ?? EventEmitter.dummy;\n const collectStaticExpressionValues =\n shouldCollectStaticExpressionValues(options);\n let workingCode = code;\n let program = parseOxc(workingCode, filename);\n const definedProcessors = new Map<string, DefinedProcessor>();\n const removableImportLocals = new Set<string>();\n const removableExpressionRefs = new Set<string>();\n\n eventEmitter.perf('transform:preeval:processTemplate:imports', () => {\n const imports = eventEmitter.perf(\n 'transform:preeval:processTemplate:imports:analysis',\n () => collectOxcProcessorImportsFromProgram(program, workingCode)\n );\n\n eventEmitter.perf(\n 'transform:preeval:processTemplate:imports:lookup',\n () => {\n imports.forEach((item) => {\n const localName = item.local.name ?? item.local.code;\n if (item.imported === 'side-effect' || !localName) {\n return;\n }\n\n const [processor, tagSource] = getProcessorForImport(\n {\n imported: item.imported,\n source: item.source,\n },\n filename,\n options\n );\n\n if (processor) {\n definedProcessors.set(localName, [processor, tagSource]);\n removableImportLocals.add(localName);\n const rootLocalName = localName.split('.')[0];\n if (rootLocalName) {\n removableImportLocals.add(rootLocalName);\n }\n }\n });\n }\n );\n });\n\n if (definedProcessors.size === 0) {\n return {\n code: workingCode,\n processorClassNamesByLocal: new Map(),\n processors: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n }\n\n let processorUsages = eventEmitter.perf(\n 'transform:preeval:processTemplate:usages',\n () => collectProcessorUsages(program, definedProcessors)\n );\n if (processorUsages.length === 0) {\n return {\n code: workingCode,\n processorClassNamesByLocal: new Map(),\n processors: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n }\n\n const targetExpressionSpans = processorUsages.flatMap(\n collectUsageExpressionSpans\n );\n\n const extracted =\n targetExpressionSpans.length > 0\n ? eventEmitter.perf('transform:preeval:processTemplate:deps', () =>\n collectOxcExpressionDependencies(\n workingCode,\n filename,\n collectStaticExpressionValues,\n targetExpressionSpans,\n options.staticBindings\n )\n )\n : {\n code: workingCode,\n dependencyNames: [],\n expressionValues: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n\n if (extracted.code !== workingCode) {\n workingCode = extracted.code;\n program = eventEmitter.perf(\n 'transform:preeval:processTemplate:reparse',\n () => parseOxc(workingCode, filename)\n );\n processorUsages = eventEmitter.perf(\n 'transform:preeval:processTemplate:usages',\n () => collectProcessorUsages(program, definedProcessors)\n );\n }\n\n const templateExpressionValues = extracted.expressionValues.map(\n (value) =>\n ({\n ...value,\n buildCodeFrameError: (message: string) =>\n buildOxcCodeFrameError(code, value.ex.loc!, message),\n }) as ExpressionValue\n );\n const loc = createOxcLocationLookup(workingCode);\n const usedNames = eventEmitter.perf(\n 'transform:preeval:processTemplate:usedNames',\n () => collectUsedNames(program)\n );\n const addedImports: AddedImport[] = [];\n const replacements: Replacement[] = [];\n const processors: BaseProcessor[] = [];\n const processorClassNamesByLocal = new Map<string, string>();\n const sameFileProcessorsByLocal = new Map<string, BaseProcessor>();\n const sameFileProcessorObjectsByLocal = new Map<\n string,\n SameFileProcessorObject\n >();\n extracted.dependencyNames.forEach((name: string) =>\n removableImportLocals.add(name)\n );\n\n eventEmitter.perf('transform:preeval:processTemplate:processors', () => {\n processorUsages.forEach((usage, idx) => {\n const params = buildParams(\n usage,\n workingCode,\n loc,\n filename,\n templateExpressionValues,\n usage.collapseQualifiedCallee\n );\n if (!params) {\n return;\n }\n\n const created = createProcessor(\n usage.definedProcessor,\n params,\n usage.target,\n usage.replacementTarget,\n usage.ancestors,\n fileContext,\n options,\n workingCode,\n loc,\n idx,\n isTagReferenced(program, usage.ancestors),\n usedNames,\n replacements\n );\n\n if (!created) {\n return;\n }\n\n const { astService, processor } = created;\n\n const owner = getTagOwner(usage.ancestors);\n if (owner?.type === 'VariableDeclarator') {\n const { id } = owner;\n if (isOxcNode(id) && id.type === 'Identifier') {\n removableExpressionRefs.add(id.name);\n sameFileProcessorsByLocal.set(id.name, processor);\n // Cross-file map (used as a className-only fallback in\n // resolveStaticExport) is restricted to processors whose\n // runtime value IS the className string. Styled-component\n // bindings emit a richer value and must reach consumers via\n // resolveProcessorStaticExport so composition still works.\n const staticClassName = resolveProcessorStaticClassName(processor);\n if (staticClassName) {\n processorClassNamesByLocal.set(id.name, staticClassName);\n } else {\n const replacement = processor.value as {\n type?: string;\n value?: unknown;\n };\n if (\n (replacement?.type === 'StringLiteral' ||\n replacement?.type === 'Literal') &&\n typeof replacement.value === 'string'\n ) {\n processorClassNamesByLocal.set(id.name, processor.className);\n }\n }\n }\n }\n\n const objectProperty = getSameFileProcessorObjectProperty(\n usage.ancestors\n );\n if (objectProperty) {\n const existing = sameFileProcessorObjectsByLocal.get(\n objectProperty.localName\n );\n const object = existing ?? {\n properties: new Map<string, BaseProcessor>(),\n propertyNames: objectProperty.propertyNames,\n };\n\n object.properties.set(objectProperty.propertyName, processor);\n sameFileProcessorObjectsByLocal.set(objectProperty.localName, object);\n }\n\n processors.push(processor);\n callback(processor);\n addedImports.push(...astService.getAddedImports());\n });\n });\n const sameFileProcessorStaticValuesByLocal =\n collectSameFileProcessorStaticValuesByLocal(\n sameFileProcessorsByLocal,\n extracted.expressionValues\n );\n const sameFileProcessorObjectStaticValuesByLocal =\n collectSameFileProcessorObjectStaticValuesByLocal(\n sameFileProcessorObjectsByLocal,\n sameFileProcessorsByLocal,\n extracted.expressionValues\n );\n sameFileProcessorObjectStaticValuesByLocal.forEach((value, local) => {\n sameFileProcessorStaticValuesByLocal.set(local, value);\n });\n\n const replacedCode = applyOxcReplacements(workingCode, replacements);\n const metadataExtendsHelperNames =\n collectWYWMetaExtendsHelperNames(replacedCode);\n const staticValueCandidates = extracted.staticValueCandidates.filter(\n (candidate) =>\n candidate.imports.length > 0 ||\n !metadataExtendsHelperNames.has(candidate.name)\n );\n const sameFileProcessorStaticValues = collectSameFileProcessorStaticValues(\n extracted.expressionValues,\n sameFileProcessorStaticValuesByLocal\n );\n const codeWithAddedImports = insertAddedImports(\n replacedCode,\n program,\n addedImports\n );\n\n return {\n code: cleanupUnused\n ? eventEmitter.perf('transform:preeval:processTemplate:cleanup', () =>\n removeUnusedAfterReplacement(\n codeWithAddedImports,\n filename,\n removableImportLocals,\n new Set([...removableExpressionRefs, ...extracted.dependencyNames]),\n options.preserveSideEffectImportLocals ?? new Set()\n )\n )\n : codeWithAddedImports,\n processorClassNamesByLocal,\n processors,\n staticValueCandidates: addCandidateInlineConstants(\n staticValueCandidates,\n sameFileProcessorStaticValuesByLocal\n ),\n staticValues: [...extracted.staticValues, ...sameFileProcessorStaticValues],\n };\n};\n"],"file":"applyOxcProcessors.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../src/utils/applyOxcProcessors/applyOxcProcessors.ts"],"version":3,"sourcesContent":["import type { BaseProcessor, IFileContext } from '@wyw-in-js/processor-utils';\nimport type { ExpressionValue, StrictOptions } from '@wyw-in-js/shared';\n\nimport { collectOxcProcessorImportsFromProgram } from '../collectOxcExportsAndImports';\nimport { collectOxcExpressionDependencies } from '../collectOxcTemplateDependencies';\nimport { EventEmitter } from '../EventEmitter';\nimport type { AddedImport } from '../oxcAstService';\nimport { isOxcNode } from '../oxc/ast';\nimport { applyOxcReplacements } from '../oxc/replacements';\nimport {\n buildOxcCodeFrameError,\n createOxcLocationLookup,\n} from '../oxc/sourceLocations';\nimport { getProcessorForImport } from '../processorLookup';\nimport { resolveProcessorStaticClassName } from '../processorStaticSemantics';\nimport { collectUsedNames } from './cleanupBindings';\nimport {\n addCandidateInlineConstants,\n collectSameFileProcessorObjectStaticValuesByLocal,\n collectSameFileProcessorStaticValuesByLocal,\n collectWYWMetaExtendsHelperNames,\n getSameFileProcessorObjectProperty,\n} from './sameFileStaticValues';\nimport {\n collectSameFileProcessorStaticValues,\n getTagOwner,\n isTagReferenced,\n} from './displayName';\nimport { buildParams } from './expressionValues';\nimport {\n createProcessor,\n shouldCollectStaticExpressionValues,\n} from './processorFactory';\nimport {\n collectProcessorUsages,\n collectUsageExpressionSpans,\n} from './processorUsages';\nimport { removeUnusedAfterReplacement } from './cleanupRemovals';\nimport { insertAddedImports, parseOxc } from './shared';\nimport type {\n ApplyOxcProcessorsResult,\n DefinedProcessor,\n Replacement,\n SameFileProcessorObject,\n} from './types';\n\nexport const applyOxcProcessors = (\n code: string,\n fileContext: IFileContext,\n options: Pick<\n StrictOptions,\n | 'classNameSlug'\n | 'displayName'\n | 'eval'\n | 'extensions'\n | 'staticBindings'\n | 'tagResolver'\n > & {\n eventEmitter?: EventEmitter;\n preserveSideEffectImportOrderLocals?: Set<string>;\n preserveSideEffectImportLocals?: Set<string>;\n },\n callback: (processor: BaseProcessor) => void,\n cleanupUnused = false\n): ApplyOxcProcessorsResult => {\n const filename = fileContext.filename ?? 'unknown.js';\n const eventEmitter = options.eventEmitter ?? EventEmitter.dummy;\n const collectStaticExpressionValues =\n shouldCollectStaticExpressionValues(options);\n let workingCode = code;\n let program = parseOxc(workingCode, filename);\n const definedProcessors = new Map<string, DefinedProcessor>();\n const removableImportLocals = new Set<string>();\n const removableExpressionRefs = new Set<string>();\n\n eventEmitter.perf('transform:preeval:processTemplate:imports', () => {\n const imports = eventEmitter.perf(\n 'transform:preeval:processTemplate:imports:analysis',\n () => collectOxcProcessorImportsFromProgram(program, workingCode)\n );\n\n eventEmitter.perf(\n 'transform:preeval:processTemplate:imports:lookup',\n () => {\n imports.forEach((item) => {\n const localName = item.local.name ?? item.local.code;\n if (item.imported === 'side-effect' || !localName) {\n return;\n }\n\n const [processor, tagSource] = getProcessorForImport(\n {\n imported: item.imported,\n source: item.source,\n },\n filename,\n options\n );\n\n if (processor) {\n definedProcessors.set(localName, [processor, tagSource]);\n removableImportLocals.add(localName);\n const rootLocalName = localName.split('.')[0];\n if (rootLocalName) {\n removableImportLocals.add(rootLocalName);\n }\n }\n });\n }\n );\n });\n\n if (definedProcessors.size === 0) {\n return {\n code: workingCode,\n processorClassNamesByLocal: new Map(),\n processors: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n }\n\n let processorUsages = eventEmitter.perf(\n 'transform:preeval:processTemplate:usages',\n () => collectProcessorUsages(program, definedProcessors)\n );\n if (processorUsages.length === 0) {\n return {\n code: workingCode,\n processorClassNamesByLocal: new Map(),\n processors: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n }\n\n const targetExpressionSpans = processorUsages.flatMap(\n collectUsageExpressionSpans\n );\n\n const extracted =\n targetExpressionSpans.length > 0\n ? eventEmitter.perf('transform:preeval:processTemplate:deps', () =>\n collectOxcExpressionDependencies(\n workingCode,\n filename,\n collectStaticExpressionValues,\n targetExpressionSpans,\n options.staticBindings\n )\n )\n : {\n code: workingCode,\n dependencyNames: [],\n expressionValues: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n\n if (extracted.code !== workingCode) {\n workingCode = extracted.code;\n program = eventEmitter.perf(\n 'transform:preeval:processTemplate:reparse',\n () => parseOxc(workingCode, filename)\n );\n processorUsages = eventEmitter.perf(\n 'transform:preeval:processTemplate:usages',\n () => collectProcessorUsages(program, definedProcessors)\n );\n }\n\n const templateExpressionValues = extracted.expressionValues.map(\n (value) =>\n ({\n ...value,\n buildCodeFrameError: (message: string) =>\n buildOxcCodeFrameError(code, value.ex.loc!, message),\n }) as ExpressionValue\n );\n const loc = createOxcLocationLookup(workingCode);\n const usedNames = eventEmitter.perf(\n 'transform:preeval:processTemplate:usedNames',\n () => collectUsedNames(program)\n );\n const addedImports: AddedImport[] = [];\n const replacements: Replacement[] = [];\n const processors: BaseProcessor[] = [];\n const processorClassNamesByLocal = new Map<string, string>();\n const sameFileProcessorsByLocal = new Map<string, BaseProcessor>();\n const sameFileProcessorObjectsByLocal = new Map<\n string,\n SameFileProcessorObject\n >();\n extracted.dependencyNames.forEach((name: string) =>\n removableImportLocals.add(name)\n );\n\n eventEmitter.perf('transform:preeval:processTemplate:processors', () => {\n processorUsages.forEach((usage, idx) => {\n const params = buildParams(\n usage,\n workingCode,\n loc,\n filename,\n templateExpressionValues,\n usage.collapseQualifiedCallee\n );\n if (!params) {\n return;\n }\n\n const created = createProcessor(\n usage.definedProcessor,\n params,\n usage.target,\n usage.replacementTarget,\n usage.ancestors,\n fileContext,\n options,\n workingCode,\n loc,\n idx,\n isTagReferenced(program, usage.ancestors),\n usedNames,\n replacements\n );\n\n if (!created) {\n return;\n }\n\n const { astService, processor } = created;\n\n const owner = getTagOwner(usage.ancestors);\n if (owner?.type === 'VariableDeclarator') {\n const { id } = owner;\n if (isOxcNode(id) && id.type === 'Identifier') {\n removableExpressionRefs.add(id.name);\n sameFileProcessorsByLocal.set(id.name, processor);\n // Cross-file map (used as a className-only fallback in\n // resolveStaticExport) is restricted to processors whose\n // runtime value IS the className string. Styled-component\n // bindings emit a richer value and must reach consumers via\n // resolveProcessorStaticExport so composition still works.\n const staticClassName = resolveProcessorStaticClassName(processor);\n if (staticClassName) {\n processorClassNamesByLocal.set(id.name, staticClassName);\n } else {\n const replacement = processor.value as {\n type?: string;\n value?: unknown;\n };\n if (\n (replacement?.type === 'StringLiteral' ||\n replacement?.type === 'Literal') &&\n typeof replacement.value === 'string'\n ) {\n processorClassNamesByLocal.set(id.name, processor.className);\n }\n }\n }\n }\n\n const objectProperty = getSameFileProcessorObjectProperty(\n usage.ancestors\n );\n if (objectProperty) {\n const existing = sameFileProcessorObjectsByLocal.get(\n objectProperty.localName\n );\n const object = existing ?? {\n properties: new Map<string, BaseProcessor>(),\n propertyNames: objectProperty.propertyNames,\n };\n\n object.properties.set(objectProperty.propertyName, processor);\n sameFileProcessorObjectsByLocal.set(objectProperty.localName, object);\n }\n\n processors.push(processor);\n callback(processor);\n addedImports.push(...astService.getAddedImports());\n });\n });\n const sameFileProcessorStaticValuesByLocal =\n collectSameFileProcessorStaticValuesByLocal(\n sameFileProcessorsByLocal,\n extracted.expressionValues\n );\n const sameFileProcessorObjectStaticValuesByLocal =\n collectSameFileProcessorObjectStaticValuesByLocal(\n sameFileProcessorObjectsByLocal,\n sameFileProcessorsByLocal,\n extracted.expressionValues\n );\n sameFileProcessorObjectStaticValuesByLocal.forEach((value, local) => {\n sameFileProcessorStaticValuesByLocal.set(local, value);\n });\n\n const replacedCode = applyOxcReplacements(workingCode, replacements);\n const metadataExtendsHelperNames =\n collectWYWMetaExtendsHelperNames(replacedCode);\n const staticValueCandidates = extracted.staticValueCandidates.filter(\n (candidate) =>\n candidate.imports.length > 0 ||\n !metadataExtendsHelperNames.has(candidate.name)\n );\n const sameFileProcessorStaticValues = collectSameFileProcessorStaticValues(\n extracted.expressionValues,\n sameFileProcessorStaticValuesByLocal\n );\n const codeWithAddedImports = insertAddedImports(\n replacedCode,\n program,\n addedImports\n );\n\n return {\n code: cleanupUnused\n ? eventEmitter.perf('transform:preeval:processTemplate:cleanup', () =>\n removeUnusedAfterReplacement(\n codeWithAddedImports,\n filename,\n removableImportLocals,\n new Set([...removableExpressionRefs, ...extracted.dependencyNames]),\n options.preserveSideEffectImportLocals ?? new Set(),\n options.preserveSideEffectImportOrderLocals ??\n options.preserveSideEffectImportLocals ??\n new Set()\n )\n )\n : codeWithAddedImports,\n processorClassNamesByLocal,\n processors,\n staticValueCandidates: addCandidateInlineConstants(\n staticValueCandidates,\n sameFileProcessorStaticValuesByLocal\n ),\n staticValues: [...extracted.staticValues, ...sameFileProcessorStaticValues],\n };\n};\n"],"file":"applyOxcProcessors.js"}