@wyw-in-js/transform 2.0.1 → 2.1.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 (39) hide show
  1. package/esm/index.js.map +1 -1
  2. package/esm/transform/Entrypoint.types.js.map +1 -1
  3. package/esm/transform/generators/processImports.js +1 -1
  4. package/esm/transform/generators/processImports.js.map +1 -1
  5. package/esm/transform/generators/resolveImports.js +24 -2
  6. package/esm/transform/generators/resolveImports.js.map +1 -1
  7. package/esm/transform/helpers/withDefaultServices.js +2 -1
  8. package/esm/transform/helpers/withDefaultServices.js.map +1 -1
  9. package/esm/transform/types.js.map +1 -1
  10. package/esm/transform.js +3 -2
  11. package/esm/transform.js.map +1 -1
  12. package/esm/types.js.map +1 -1
  13. package/esm/utils/applyOxcProcessors/applyOxcProcessors.js.map +1 -1
  14. package/esm/utils/applyOxcProcessors/processorFactory.js.map +1 -1
  15. package/esm/utils/collectOxcRuntime/normalizeRuntimeCode.js +2 -12
  16. package/esm/utils/collectOxcRuntime/normalizeRuntimeCode.js.map +1 -1
  17. package/esm/utils/collectOxcRuntime/types.js.map +1 -1
  18. package/esm/utils/collectOxcTemplateDependencies/staticEvaluator.js +51 -0
  19. package/esm/utils/collectOxcTemplateDependencies/staticEvaluator.js.map +1 -1
  20. package/esm/utils/oxcPreevalStage/types.js.map +1 -1
  21. package/esm/utils/parseOxc.js +16 -2
  22. package/esm/utils/parseOxc.js.map +1 -1
  23. package/package.json +6 -6
  24. package/types/index.d.ts +1 -1
  25. package/types/transform/Entrypoint.types.d.ts +1 -0
  26. package/types/transform/generators/processImports.js +3 -1
  27. package/types/transform/generators/resolveImports.js +27 -2
  28. package/types/transform/helpers/withDefaultServices.d.ts +1 -1
  29. package/types/transform/helpers/withDefaultServices.js +2 -1
  30. package/types/transform/types.d.ts +2 -0
  31. package/types/transform.js +3 -2
  32. package/types/types.d.ts +4 -3
  33. package/types/utils/applyOxcProcessors/applyOxcProcessors.d.ts +1 -1
  34. package/types/utils/applyOxcProcessors/processorFactory.d.ts +1 -1
  35. package/types/utils/collectOxcRuntime/normalizeRuntimeCode.js +2 -11
  36. package/types/utils/collectOxcRuntime/types.d.ts +1 -1
  37. package/types/utils/collectOxcTemplateDependencies/staticEvaluator.js +59 -0
  38. package/types/utils/oxcPreevalStage/types.d.ts +1 -1
  39. package/types/utils/parseOxc.js +17 -2
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"AAAA,SAAS,eAAe;AAExB,SAAS,0BAA0B;AAEnC,SACE,yBACA,sBACA,4BACA,2BACA,6BACK;AAOP,SAAS,mCAAmC;AAE5C,SAAS,QAAQ,mCAAmC;AACpD,SAAS,WAAW,QAAQ,iBAAiB;AAC7C,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAClC,SACE,8BACA,kCACK;AAgBP,SAAS,2BAA2B;AAEpC,SAAS,iBAAiB;AAE1B,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SACE,qBACA,0BACK;AACP,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AAEpC,SAAS,oBAAoB;AAO7B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAE/B,SAAS,YAAY;AACrB,SAAS,gCAAgC","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["export { slugify } from '@wyw-in-js/shared';\n\nexport { createFileReporter } from './debug/fileReporter';\nexport type { IFileReporterOptions } from './debug/fileReporter';\nexport {\n createTransformManifest,\n getTransformMetadata,\n stringifyTransformManifest,\n toTransformResultMetadata,\n withTransformMetadata,\n} from './utils/TransformMetadata';\nexport type {\n WYWTransformManifest,\n WYWTransformMetadata,\n WYWTransformProcessorMetadata,\n WYWTransformResultMetadata,\n} from './utils/TransformMetadata';\nexport { collectTransformDiagnostics } from './utils/TransformDiagnostics';\nexport type { WYWTransformDiagnostic } from './utils/TransformDiagnostics';\nexport { Module, DefaultModuleImplementation } from './module';\nexport { default as shaker, oxcShaker } from './shaker';\nexport { transform } from './transform';\nexport { disposeEvalBroker } from './eval/broker';\nexport {\n isUnprocessedEntrypointError,\n UnprocessedEntrypointError,\n} from './transform/actions/UnprocessedEntrypointError';\nexport type {\n Dependencies,\n ITransformFileResult,\n JSONArray,\n JSONObject,\n JSONValue,\n Options,\n ParentEntrypoint,\n PluginOptions,\n Preprocessor,\n PreprocessorFn,\n Result,\n Serializable,\n Stage,\n} from './types';\nexport { EvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nexport type { IEvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nexport { parseFile } from './transform/Entrypoint.helpers';\nexport type { LoadAndParseFn } from './transform/Entrypoint.types';\nexport { baseHandlers } from './transform/generators';\nexport { prepareCode } from './transform/generators/transform';\nexport { Entrypoint } from './transform/Entrypoint';\nexport { transformUrl } from './transform/generators/createStylisPreprocessor';\nexport {\n asyncResolveImports,\n syncResolveImports,\n} from './transform/generators/resolveImports';\nexport { loadWywOptions } from './transform/helpers/loadWywOptions';\nexport { withDefaultServices } from './transform/helpers/withDefaultServices';\nexport type { Services } from './transform/types';\nexport { EventEmitter } from './utils/EventEmitter';\nexport type {\n EntrypointEvent,\n OnEvent,\n OnActionStartArgs,\n OnActionFinishArgs,\n} from './utils/EventEmitter';\nexport { isNode } from './utils/isNode';\nexport { getFileIdx } from './utils/getFileIdx';\nexport { getVisitorKeys } from './utils/getVisitorKeys';\nexport type { VisitorKeys } from './utils/getVisitorKeys';\nexport { peek } from './utils/peek';\nexport { TransformCacheCollection } from './cache';\n"],"file":"index.js"}
1
+ {"mappings":"AAAA,SAAS,eAAe;AAExB,SAAS,0BAA0B;AAEnC,SACE,yBACA,sBACA,4BACA,2BACA,6BACK;AAOP,SAAS,mCAAmC;AAE5C,SAAS,QAAQ,mCAAmC;AACpD,SAAS,WAAW,QAAQ,iBAAiB;AAC7C,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAClC,SACE,8BACA,kCACK;AAiBP,SAAS,2BAA2B;AAEpC,SAAS,iBAAiB;AAE1B,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SACE,qBACA,0BACK;AACP,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AAEpC,SAAS,oBAAoB;AAO7B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAE/B,SAAS,YAAY;AACrB,SAAS,gCAAgC","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["export { slugify } from '@wyw-in-js/shared';\n\nexport { createFileReporter } from './debug/fileReporter';\nexport type { IFileReporterOptions } from './debug/fileReporter';\nexport {\n createTransformManifest,\n getTransformMetadata,\n stringifyTransformManifest,\n toTransformResultMetadata,\n withTransformMetadata,\n} from './utils/TransformMetadata';\nexport type {\n WYWTransformManifest,\n WYWTransformMetadata,\n WYWTransformProcessorMetadata,\n WYWTransformResultMetadata,\n} from './utils/TransformMetadata';\nexport { collectTransformDiagnostics } from './utils/TransformDiagnostics';\nexport type { WYWTransformDiagnostic } from './utils/TransformDiagnostics';\nexport { Module, DefaultModuleImplementation } from './module';\nexport { default as shaker, oxcShaker } from './shaker';\nexport { transform } from './transform';\nexport { disposeEvalBroker } from './eval/broker';\nexport {\n isUnprocessedEntrypointError,\n UnprocessedEntrypointError,\n} from './transform/actions/UnprocessedEntrypointError';\nexport type {\n Dependencies,\n ITransformFileResult,\n JSONArray,\n JSONObject,\n JSONValue,\n Options,\n ParentEntrypoint,\n PluginOptions,\n Preprocessor,\n PreprocessorFn,\n Result,\n Serializable,\n Stage,\n WywInJsProcessorOptions,\n} from './types';\nexport { EvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nexport type { IEvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nexport { parseFile } from './transform/Entrypoint.helpers';\nexport type { LoadAndParseFn } from './transform/Entrypoint.types';\nexport { baseHandlers } from './transform/generators';\nexport { prepareCode } from './transform/generators/transform';\nexport { Entrypoint } from './transform/Entrypoint';\nexport { transformUrl } from './transform/generators/createStylisPreprocessor';\nexport {\n asyncResolveImports,\n syncResolveImports,\n} from './transform/generators/resolveImports';\nexport { loadWywOptions } from './transform/helpers/loadWywOptions';\nexport { withDefaultServices } from './transform/helpers/withDefaultServices';\nexport type { Services } from './transform/types';\nexport { EventEmitter } from './utils/EventEmitter';\nexport type {\n EntrypointEvent,\n OnEvent,\n OnActionStartArgs,\n OnActionFinishArgs,\n} from './utils/EventEmitter';\nexport { isNode } from './utils/isNode';\nexport { getFileIdx } from './utils/getFileIdx';\nexport { getVisitorKeys } from './utils/getVisitorKeys';\nexport type { VisitorKeys } from './utils/getVisitorKeys';\nexport { peek } from './utils/peek';\nexport { TransformCacheCollection } from './cache';\n"],"file":"index.js"}
@@ -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 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"}
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 loadedCode?: string;\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"}
@@ -68,7 +68,7 @@ export function* processImports() {
68
68
  }
69
69
  continue;
70
70
  }
71
- const nextEntrypoint = this.entrypoint.createChild(resolved, requiredOnly);
71
+ const nextEntrypoint = dependency.loadedCode === undefined ? this.entrypoint.createChild(resolved, requiredOnly) : this.entrypoint.createChild(resolved, requiredOnly, dependency.loadedCode);
72
72
  if (nextEntrypoint === "loop" || nextEntrypoint.ignored) {
73
73
  continue;
74
74
  }
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../../src/transform/generators/processImports.ts"],"version":3,"sourcesContent":["/* eslint-disable no-continue */\n\nimport type {\n IProcessImportsAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\nimport {\n hasCachedWywPrevalExport,\n type CachedEntrypointLike,\n} from '../../utils/hasCachedWywPrevalExport';\nimport { toImportKey } from '../../utils/importOverrides';\nimport { stripQueryAndHash } from '../../utils/parseRequest';\nimport { isSuperSet, mergeOnly } from '../Entrypoint.helpers';\n\ntype ProcessImportsCachedEntrypoint = CachedEntrypointLike & {\n only: string[];\n parents?: Array<{ name: string }>;\n transformed?: boolean;\n};\n\nconst warnedSlowImportsByServices = new WeakMap<Services, Set<string>>();\n\nfunction emitWarning(services: Services, message: string) {\n if (services.emitWarning) {\n services.emitWarning(message);\n return;\n }\n\n // eslint-disable-next-line no-console\n console.warn(message);\n}\n\nfunction getWarnedSlowImports(services: Services): Set<string> {\n const cached = warnedSlowImportsByServices.get(services);\n if (cached) return cached;\n\n const created = new Set<string>();\n warnedSlowImportsByServices.set(services, created);\n return created;\n}\n\nfunction isWarningEnabled(value: string | undefined): boolean {\n return Boolean(value) && value !== '0' && value !== 'false';\n}\n\nfunction hasLoop(\n name: string,\n parent: {\n name: string;\n parents: { name: string; parents: { name: string }[] }[];\n },\n processed: string[] = []\n): boolean {\n if (parent.name === name || processed.includes(parent.name)) {\n return true;\n }\n\n for (const nextParent of parent.parents) {\n if (\n hasLoop(name, nextParent as typeof parent, [...processed, parent.name])\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function* processImports(\n this: IProcessImportsAction\n): SyncScenarioForAction<IProcessImportsAction> {\n const slowImportWarningsEnabled = isWarningEnabled(\n process.env.WYW_WARN_SLOW_IMPORTS\n );\n const slowImportThresholdMs = (() => {\n const raw = process.env.WYW_WARN_SLOW_IMPORTS_MS;\n if (!raw) return 50;\n\n const parsed = Number(raw);\n if (!Number.isFinite(parsed)) return 50;\n return parsed;\n })();\n\n const warnedSlowImports = slowImportWarningsEnabled\n ? getWarnedSlowImports(this.services)\n : null;\n\n const { root } = this.services.options;\n const prepareStageRequiresEvaluatedDeps =\n this.entrypoint.only.includes('__wywPreval');\n const skippedParentDependencySources = new Set(\n this.data.skipParentDependencyTracking ?? []\n );\n\n for (const dependency of this.data.resolved) {\n const { resolved, only } = dependency;\n if (!resolved) {\n continue;\n }\n\n const cached = this.services.cache.get('entrypoints', resolved) as\n | ProcessImportsCachedEntrypoint\n | undefined;\n const shouldRequireWywPreval =\n prepareStageRequiresEvaluatedDeps &&\n (!cached?.evaluated ||\n cached.ignored ||\n hasCachedWywPrevalExport(this.services, resolved, cached));\n const requiredOnly = shouldRequireWywPreval\n ? mergeOnly(only, ['__wywPreval'])\n : only;\n\n if (!skippedParentDependencySources.has(dependency.source)) {\n this.entrypoint.addDependency({\n ...dependency,\n only: requiredOnly,\n });\n }\n\n const canReuseTransformedDependency =\n !prepareStageRequiresEvaluatedDeps &&\n Boolean(cached && !cached.evaluated && cached.transformed);\n if (\n cached &&\n (cached.evaluated || canReuseTransformedDependency) &&\n isSuperSet(cached.only, requiredOnly) &&\n !hasLoop(resolved, this.entrypoint) &&\n !this.services.cache.checkFreshness(resolved, stripQueryAndHash(resolved))\n ) {\n if (Array.isArray(cached.parents)) {\n if (\n !cached.parents\n .map((parent) => parent.name)\n .includes(this.entrypoint.name)\n ) {\n cached.parents.push(this.entrypoint);\n }\n }\n\n continue;\n }\n\n const nextEntrypoint = this.entrypoint.createChild(resolved, requiredOnly);\n if (nextEntrypoint === 'loop' || nextEntrypoint.ignored) {\n continue;\n }\n\n const startedAt = slowImportWarningsEnabled ? performance.now() : 0;\n yield* this.getNext('processEntrypoint', nextEntrypoint, undefined, null);\n\n if (\n slowImportWarningsEnabled &&\n warnedSlowImports &&\n slowImportThresholdMs > 0\n ) {\n const durationMs = performance.now() - startedAt;\n if (durationMs >= slowImportThresholdMs) {\n const { key: importKey } = toImportKey({\n source: dependency.source,\n resolved,\n root,\n });\n const dedupeKey = `${this.entrypoint.name}::${importKey}`;\n\n if (!warnedSlowImports.has(dedupeKey)) {\n warnedSlowImports.add(dedupeKey);\n\n const warning = [\n '[wyw-in-js] Slow import during prepare stage',\n '',\n `file: ${this.entrypoint.name}`,\n `import: ${dependency.source}`,\n `resolved: ${resolved}`,\n `duration: ${durationMs.toFixed(1)}ms`,\n '',\n 'tip: if this import is runtime-only or heavy, mock it during evaluation via importOverrides:',\n ' importOverrides: {',\n ` '${importKey}': { mock: './path/to/mock' },`,\n ' }',\n '',\n 'note: importOverrides affects only build-time evaluation (it does not change your bundler runtime behavior)',\n '',\n `note: configure threshold with WYW_WARN_SLOW_IMPORTS_MS (current: ${slowImportThresholdMs}ms)`,\n ].join('\\n');\n\n emitWarning(this.services, warning);\n }\n }\n }\n }\n}\n"],"file":"processImports.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../src/transform/generators/processImports.ts"],"version":3,"sourcesContent":["/* eslint-disable no-continue */\n\nimport type {\n IProcessImportsAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\nimport {\n hasCachedWywPrevalExport,\n type CachedEntrypointLike,\n} from '../../utils/hasCachedWywPrevalExport';\nimport { toImportKey } from '../../utils/importOverrides';\nimport { stripQueryAndHash } from '../../utils/parseRequest';\nimport { isSuperSet, mergeOnly } from '../Entrypoint.helpers';\n\ntype ProcessImportsCachedEntrypoint = CachedEntrypointLike & {\n only: string[];\n parents?: Array<{ name: string }>;\n transformed?: boolean;\n};\n\nconst warnedSlowImportsByServices = new WeakMap<Services, Set<string>>();\n\nfunction emitWarning(services: Services, message: string) {\n if (services.emitWarning) {\n services.emitWarning(message);\n return;\n }\n\n // eslint-disable-next-line no-console\n console.warn(message);\n}\n\nfunction getWarnedSlowImports(services: Services): Set<string> {\n const cached = warnedSlowImportsByServices.get(services);\n if (cached) return cached;\n\n const created = new Set<string>();\n warnedSlowImportsByServices.set(services, created);\n return created;\n}\n\nfunction isWarningEnabled(value: string | undefined): boolean {\n return Boolean(value) && value !== '0' && value !== 'false';\n}\n\nfunction hasLoop(\n name: string,\n parent: {\n name: string;\n parents: { name: string; parents: { name: string }[] }[];\n },\n processed: string[] = []\n): boolean {\n if (parent.name === name || processed.includes(parent.name)) {\n return true;\n }\n\n for (const nextParent of parent.parents) {\n if (\n hasLoop(name, nextParent as typeof parent, [...processed, parent.name])\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function* processImports(\n this: IProcessImportsAction\n): SyncScenarioForAction<IProcessImportsAction> {\n const slowImportWarningsEnabled = isWarningEnabled(\n process.env.WYW_WARN_SLOW_IMPORTS\n );\n const slowImportThresholdMs = (() => {\n const raw = process.env.WYW_WARN_SLOW_IMPORTS_MS;\n if (!raw) return 50;\n\n const parsed = Number(raw);\n if (!Number.isFinite(parsed)) return 50;\n return parsed;\n })();\n\n const warnedSlowImports = slowImportWarningsEnabled\n ? getWarnedSlowImports(this.services)\n : null;\n\n const { root } = this.services.options;\n const prepareStageRequiresEvaluatedDeps =\n this.entrypoint.only.includes('__wywPreval');\n const skippedParentDependencySources = new Set(\n this.data.skipParentDependencyTracking ?? []\n );\n\n for (const dependency of this.data.resolved) {\n const { resolved, only } = dependency;\n if (!resolved) {\n continue;\n }\n\n const cached = this.services.cache.get('entrypoints', resolved) as\n | ProcessImportsCachedEntrypoint\n | undefined;\n const shouldRequireWywPreval =\n prepareStageRequiresEvaluatedDeps &&\n (!cached?.evaluated ||\n cached.ignored ||\n hasCachedWywPrevalExport(this.services, resolved, cached));\n const requiredOnly = shouldRequireWywPreval\n ? mergeOnly(only, ['__wywPreval'])\n : only;\n\n if (!skippedParentDependencySources.has(dependency.source)) {\n this.entrypoint.addDependency({\n ...dependency,\n only: requiredOnly,\n });\n }\n\n const canReuseTransformedDependency =\n !prepareStageRequiresEvaluatedDeps &&\n Boolean(cached && !cached.evaluated && cached.transformed);\n if (\n cached &&\n (cached.evaluated || canReuseTransformedDependency) &&\n isSuperSet(cached.only, requiredOnly) &&\n !hasLoop(resolved, this.entrypoint) &&\n !this.services.cache.checkFreshness(resolved, stripQueryAndHash(resolved))\n ) {\n if (Array.isArray(cached.parents)) {\n if (\n !cached.parents\n .map((parent) => parent.name)\n .includes(this.entrypoint.name)\n ) {\n cached.parents.push(this.entrypoint);\n }\n }\n\n continue;\n }\n\n const nextEntrypoint =\n dependency.loadedCode === undefined\n ? this.entrypoint.createChild(resolved, requiredOnly)\n : this.entrypoint.createChild(\n resolved,\n requiredOnly,\n dependency.loadedCode\n );\n if (nextEntrypoint === 'loop' || nextEntrypoint.ignored) {\n continue;\n }\n\n const startedAt = slowImportWarningsEnabled ? performance.now() : 0;\n yield* this.getNext('processEntrypoint', nextEntrypoint, undefined, null);\n\n if (\n slowImportWarningsEnabled &&\n warnedSlowImports &&\n slowImportThresholdMs > 0\n ) {\n const durationMs = performance.now() - startedAt;\n if (durationMs >= slowImportThresholdMs) {\n const { key: importKey } = toImportKey({\n source: dependency.source,\n resolved,\n root,\n });\n const dedupeKey = `${this.entrypoint.name}::${importKey}`;\n\n if (!warnedSlowImports.has(dedupeKey)) {\n warnedSlowImports.add(dedupeKey);\n\n const warning = [\n '[wyw-in-js] Slow import during prepare stage',\n '',\n `file: ${this.entrypoint.name}`,\n `import: ${dependency.source}`,\n `resolved: ${resolved}`,\n `duration: ${durationMs.toFixed(1)}ms`,\n '',\n 'tip: if this import is runtime-only or heavy, mock it during evaluation via importOverrides:',\n ' importOverrides: {',\n ` '${importKey}': { mock: './path/to/mock' },`,\n ' }',\n '',\n 'note: importOverrides affects only build-time evaluation (it does not change your bundler runtime behavior)',\n '',\n `note: configure threshold with WYW_WARN_SLOW_IMPORTS_MS (current: ${slowImportThresholdMs}ms)`,\n ].join('\\n');\n\n emitWarning(this.services, warning);\n }\n }\n }\n }\n}\n"],"file":"processImports.js"}
@@ -102,6 +102,27 @@ function filterUnresolved(entrypoint, resolvedImports) {
102
102
  return true;
103
103
  });
104
104
  }
105
+ async function loadDependencyCodes(services, entrypoint, dependencies) {
106
+ if (!services.loadDependencyCode) {
107
+ return dependencies;
108
+ }
109
+ const { loadDependencyCode } = services;
110
+ return Promise.all(dependencies.map(async (dependency) => {
111
+ if (!dependency.resolved) {
112
+ return dependency;
113
+ }
114
+ try {
115
+ const loadedCode = await loadDependencyCode(dependency.resolved, entrypoint.name, dependency.source);
116
+ return loadedCode === undefined ? dependency : {
117
+ ...dependency,
118
+ loadedCode
119
+ };
120
+ } catch (err) {
121
+ entrypoint.log("[load] ❌ cannot load %s in %s: %O", dependency.source, entrypoint.name, err);
122
+ return dependency;
123
+ }
124
+ }));
125
+ }
105
126
  function getPreResolvedImports(preResolved) {
106
127
  return new Map((preResolved ?? []).map((dependency) => [dependency.source, dependency]));
107
128
  }
@@ -220,7 +241,8 @@ export async function* asyncResolveImports(resolve) {
220
241
  log("resolved %d imports", resolvedImports.length);
221
242
  const overriddenImports = applyImportOverrides(this.services, entrypoint, resolvedImports);
222
243
  const filteredImports = filterUnresolved(entrypoint, overriddenImports);
223
- emitDependency(eventEmitter, entrypoint, filteredImports, this.data.phase);
224
- return filteredImports;
244
+ const loadedImports = await loadDependencyCodes(this.services, entrypoint, filteredImports);
245
+ emitDependency(eventEmitter, entrypoint, loadedImports, this.data.phase);
246
+ return loadedImports;
225
247
  }
226
248
  //# sourceMappingURL=resolveImports.js.map
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../../src/transform/generators/resolveImports.ts"],"version":3,"sourcesContent":["/* eslint-disable no-continue,no-await-in-loop,require-yield */\nimport type { EvalOptionsV2 } from '@wyw-in-js/shared';\n\nimport { getFileIdx } from '../../utils/getFileIdx';\nimport type { Entrypoint } from '../Entrypoint';\nimport { getStack, isSuperSet, mergeOnly } from '../Entrypoint.helpers';\nimport type { IEntrypointDependency } from '../Entrypoint.types';\nimport {\n applyImportOverrideToOnly,\n getImportOverride,\n resolveMockSpecifier,\n toImportKey,\n} from '../../utils/importOverrides';\nimport { resolveWithNativeResolver } from '../../utils/nativeResolver';\nimport type {\n AsyncScenarioForAction,\n IResolveImportsAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\ntype AsyncResolve = (\n what: string,\n importer: string,\n stack: string[]\n) => Promise<string | null>;\n\nconst DEFAULT_EVAL_OPTIONS: Required<\n Pick<EvalOptionsV2, 'errors' | 'require' | 'resolver'>\n> = {\n errors: 'strict',\n require: 'warn-and-run',\n resolver: 'bundler',\n};\n\nconst getEvalOptions = (services: Services): EvalOptionsV2 => ({\n ...DEFAULT_EVAL_OPTIONS,\n ...(services.options.pluginOptions.eval ?? {}),\n});\n\nconst resolveWithConfiguredEvalResolver = async (\n services: Services,\n source: string,\n importer: string,\n stack: string[],\n resolve: AsyncResolve\n): Promise<string | null> => {\n const evalOptions = getEvalOptions(services);\n\n if (evalOptions.customResolver) {\n const customResolved = await evalOptions.customResolver(\n source,\n importer,\n 'import'\n );\n if (customResolved) {\n return customResolved.external ? null : customResolved.id;\n }\n\n if (evalOptions.resolver === 'custom') {\n return null;\n }\n }\n\n if (evalOptions.resolver === 'hybrid') {\n try {\n return resolveWithNativeResolver({\n conditionNames: services.options.pluginOptions.conditionNames,\n extensions: services.options.pluginOptions.extensions,\n importer,\n kind: 'import',\n oxcOptions: services.options.pluginOptions.oxcOptions,\n specifier: source,\n });\n } catch {\n return resolve(source, importer, stack);\n }\n }\n\n if (evalOptions.resolver === 'native') {\n return resolveWithNativeResolver({\n conditionNames: services.options.pluginOptions.conditionNames,\n extensions: services.options.pluginOptions.extensions,\n importer,\n kind: 'import',\n oxcOptions: services.options.pluginOptions.oxcOptions,\n specifier: source,\n });\n }\n\n return resolve(source, importer, stack);\n};\n\nfunction applyImportOverrides(\n services: Services,\n entrypoint: Entrypoint,\n resolvedImports: IEntrypointDependency[]\n): IEntrypointDependency[] {\n const overrides = services.options.pluginOptions.importOverrides;\n if (!overrides || Object.keys(overrides).length === 0) {\n return resolvedImports;\n }\n\n const { root } = services.options;\n const importer = entrypoint.name;\n const stack = getStack(entrypoint);\n\n return resolvedImports.map((dependency) => {\n const { key } = toImportKey({\n source: dependency.source,\n resolved: dependency.resolved,\n root,\n });\n const override = getImportOverride(overrides, key);\n if (!override) {\n return dependency;\n }\n\n const nextOnly = applyImportOverrideToOnly(dependency.only, override);\n const nextResolved = override.mock\n ? resolveMockSpecifier({\n mock: override.mock,\n importer,\n root,\n stack,\n })\n : dependency.resolved;\n\n return {\n ...dependency,\n only: nextOnly,\n resolved: nextResolved,\n };\n });\n}\n\nfunction emitDependency(\n emitter: Services['eventEmitter'],\n entrypoint: IResolveImportsAction['entrypoint'],\n imports: IEntrypointDependency[],\n phase?: IResolveImportsAction['data']['phase']\n) {\n emitter.single({\n type: 'dependency',\n file: entrypoint.name,\n only: entrypoint.only,\n phase,\n imports: imports.map(({ resolved, only }) => ({\n from: resolved,\n what: only,\n })),\n fileIdx: getFileIdx(entrypoint.name),\n });\n}\n\nfunction filterUnresolved(\n entrypoint: Entrypoint,\n resolvedImports: IEntrypointDependency[]\n): IEntrypointDependency[] {\n return resolvedImports.filter((i): i is IEntrypointDependency => {\n if (i.resolved === null) {\n entrypoint.log(\n `[resolve] ✅ %s in %s is ignored`,\n i.source,\n entrypoint.name\n );\n return false;\n }\n\n return true;\n });\n}\n\nfunction getPreResolvedImports(\n preResolved: IResolveImportsAction['data']['preResolved']\n): Map<string, IEntrypointDependency> {\n return new Map(\n (preResolved ?? []).map((dependency) => [dependency.source, dependency])\n );\n}\n\n/**\n * Synchronously resolves specified imports with a provided resolver.\n */\nexport function* syncResolveImports(\n this: IResolveImportsAction,\n resolve: (what: string, importer: string, stack: string[]) => string\n): SyncScenarioForAction<IResolveImportsAction> {\n const {\n data: { imports },\n entrypoint,\n services: { eventEmitter },\n } = this;\n const listOfImports = Array.from(imports?.entries() ?? []);\n const preResolvedImports = getPreResolvedImports(this.data.preResolved);\n const { log } = entrypoint;\n\n if (listOfImports.length === 0) {\n emitDependency(eventEmitter, entrypoint, [], this.data.phase);\n\n log('%s has no imports', entrypoint.name);\n return [];\n }\n\n const resolvedImports = listOfImports.map(([source, only]) => {\n const preResolved = preResolvedImports.get(source);\n if (preResolved) {\n const mergedOnly = mergeOnly(preResolved.only, only);\n log(\n '[sync-resolve] ♻️ %s -> %s (only: %o)',\n source,\n preResolved.resolved,\n mergedOnly\n );\n return {\n ...preResolved,\n only: mergedOnly,\n };\n }\n\n let resolved: string | null = null;\n try {\n resolved = resolve(source, entrypoint.name, getStack(entrypoint));\n log('[sync-resolve] ✅ %s -> %s (only: %o)', source, resolved, only);\n } catch (err) {\n log('[sync-resolve] ❌ cannot resolve %s: %O', source, err);\n }\n\n return {\n source,\n only,\n resolved,\n };\n });\n\n const overriddenImports = applyImportOverrides(\n this.services,\n entrypoint,\n resolvedImports\n );\n const filteredImports = filterUnresolved(entrypoint, overriddenImports);\n emitDependency(eventEmitter, entrypoint, filteredImports, this.data.phase);\n\n return filteredImports;\n}\n\n/**\n * Asynchronously resolves specified imports with a provided resolver.\n */\nexport async function* asyncResolveImports(\n this: IResolveImportsAction,\n resolve: AsyncResolve\n): AsyncScenarioForAction<IResolveImportsAction> {\n const {\n data: { imports },\n entrypoint,\n services: { eventEmitter },\n } = this;\n const listOfImports = Array.from(imports?.entries() ?? []);\n const preResolvedImports = getPreResolvedImports(this.data.preResolved);\n const { log } = entrypoint;\n\n if (listOfImports.length === 0) {\n emitDependency(eventEmitter, entrypoint, [], this.data.phase);\n\n log('%s has no imports', entrypoint.name);\n return [];\n }\n\n log('resolving %d imports', listOfImports.length);\n\n const getResolveTask = async (\n source: string,\n only: string[]\n ): Promise<IEntrypointDependency> => {\n let resolved: string | null = null;\n try {\n resolved = await resolveWithConfiguredEvalResolver(\n this.services,\n source,\n entrypoint.name,\n getStack(entrypoint),\n resolve\n );\n } catch (err) {\n log(\n '[async-resolve] ❌ cannot resolve %s in %s: %O',\n source,\n entrypoint.name,\n err\n );\n }\n\n if (resolved !== null) {\n log(\n '[async-resolve] ✅ %s (%o) in %s -> %s',\n source,\n only,\n entrypoint.name,\n resolved\n );\n }\n\n return {\n source,\n only,\n resolved,\n };\n };\n\n const resolvedImports = await Promise.all<IEntrypointDependency>(\n listOfImports.map(([source, importsOnly]) => {\n const preResolved = preResolvedImports.get(source);\n if (preResolved) {\n const mergedOnly = mergeOnly(preResolved.only, importsOnly);\n log(\n '[async-resolve] ♻️ %s (%o) in %s -> %s',\n source,\n mergedOnly,\n entrypoint.name,\n preResolved.resolved\n );\n return {\n ...preResolved,\n only: mergedOnly,\n };\n }\n\n const cached = entrypoint.getDependency(source);\n if (cached) {\n return {\n source,\n only: mergeOnly(cached.only, importsOnly),\n resolved: cached.resolved,\n };\n }\n\n const task = entrypoint.getResolveTask(source);\n if (task) {\n // If we have cached task, we need to merge only…\n const newTask = task.then((res) => {\n if (isSuperSet(res.only, importsOnly)) {\n return res;\n }\n\n // Is this branch even possible?\n const merged = mergeOnly(res.only, importsOnly);\n\n log('merging imports %o and %o: %o', importsOnly, res.only, merged);\n\n return { ...res, only: merged };\n });\n\n // … and update the cache\n entrypoint.addResolveTask(source, newTask);\n return newTask;\n }\n\n const resolveTask = getResolveTask(source, importsOnly);\n\n entrypoint.addResolveTask(source, resolveTask);\n\n return resolveTask;\n })\n );\n\n log('resolved %d imports', resolvedImports.length);\n\n const overriddenImports = applyImportOverrides(\n this.services,\n entrypoint,\n resolvedImports\n );\n const filteredImports = filterUnresolved(entrypoint, overriddenImports);\n emitDependency(eventEmitter, entrypoint, filteredImports, this.data.phase);\n return filteredImports;\n}\n"],"file":"resolveImports.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../src/transform/generators/resolveImports.ts"],"version":3,"sourcesContent":["/* eslint-disable no-continue,no-await-in-loop,require-yield */\nimport type { EvalOptionsV2 } from '@wyw-in-js/shared';\n\nimport { getFileIdx } from '../../utils/getFileIdx';\nimport type { Entrypoint } from '../Entrypoint';\nimport { getStack, isSuperSet, mergeOnly } from '../Entrypoint.helpers';\nimport type { IEntrypointDependency } from '../Entrypoint.types';\nimport {\n applyImportOverrideToOnly,\n getImportOverride,\n resolveMockSpecifier,\n toImportKey,\n} from '../../utils/importOverrides';\nimport { resolveWithNativeResolver } from '../../utils/nativeResolver';\nimport type {\n AsyncScenarioForAction,\n IResolveImportsAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\ntype AsyncResolve = (\n what: string,\n importer: string,\n stack: string[]\n) => Promise<string | null>;\n\nconst DEFAULT_EVAL_OPTIONS: Required<\n Pick<EvalOptionsV2, 'errors' | 'require' | 'resolver'>\n> = {\n errors: 'strict',\n require: 'warn-and-run',\n resolver: 'bundler',\n};\n\nconst getEvalOptions = (services: Services): EvalOptionsV2 => ({\n ...DEFAULT_EVAL_OPTIONS,\n ...(services.options.pluginOptions.eval ?? {}),\n});\n\nconst resolveWithConfiguredEvalResolver = async (\n services: Services,\n source: string,\n importer: string,\n stack: string[],\n resolve: AsyncResolve\n): Promise<string | null> => {\n const evalOptions = getEvalOptions(services);\n\n if (evalOptions.customResolver) {\n const customResolved = await evalOptions.customResolver(\n source,\n importer,\n 'import'\n );\n if (customResolved) {\n return customResolved.external ? null : customResolved.id;\n }\n\n if (evalOptions.resolver === 'custom') {\n return null;\n }\n }\n\n if (evalOptions.resolver === 'hybrid') {\n try {\n return resolveWithNativeResolver({\n conditionNames: services.options.pluginOptions.conditionNames,\n extensions: services.options.pluginOptions.extensions,\n importer,\n kind: 'import',\n oxcOptions: services.options.pluginOptions.oxcOptions,\n specifier: source,\n });\n } catch {\n return resolve(source, importer, stack);\n }\n }\n\n if (evalOptions.resolver === 'native') {\n return resolveWithNativeResolver({\n conditionNames: services.options.pluginOptions.conditionNames,\n extensions: services.options.pluginOptions.extensions,\n importer,\n kind: 'import',\n oxcOptions: services.options.pluginOptions.oxcOptions,\n specifier: source,\n });\n }\n\n return resolve(source, importer, stack);\n};\n\nfunction applyImportOverrides(\n services: Services,\n entrypoint: Entrypoint,\n resolvedImports: IEntrypointDependency[]\n): IEntrypointDependency[] {\n const overrides = services.options.pluginOptions.importOverrides;\n if (!overrides || Object.keys(overrides).length === 0) {\n return resolvedImports;\n }\n\n const { root } = services.options;\n const importer = entrypoint.name;\n const stack = getStack(entrypoint);\n\n return resolvedImports.map((dependency) => {\n const { key } = toImportKey({\n source: dependency.source,\n resolved: dependency.resolved,\n root,\n });\n const override = getImportOverride(overrides, key);\n if (!override) {\n return dependency;\n }\n\n const nextOnly = applyImportOverrideToOnly(dependency.only, override);\n const nextResolved = override.mock\n ? resolveMockSpecifier({\n mock: override.mock,\n importer,\n root,\n stack,\n })\n : dependency.resolved;\n\n return {\n ...dependency,\n only: nextOnly,\n resolved: nextResolved,\n };\n });\n}\n\nfunction emitDependency(\n emitter: Services['eventEmitter'],\n entrypoint: IResolveImportsAction['entrypoint'],\n imports: IEntrypointDependency[],\n phase?: IResolveImportsAction['data']['phase']\n) {\n emitter.single({\n type: 'dependency',\n file: entrypoint.name,\n only: entrypoint.only,\n phase,\n imports: imports.map(({ resolved, only }) => ({\n from: resolved,\n what: only,\n })),\n fileIdx: getFileIdx(entrypoint.name),\n });\n}\n\nfunction filterUnresolved(\n entrypoint: Entrypoint,\n resolvedImports: IEntrypointDependency[]\n): IEntrypointDependency[] {\n return resolvedImports.filter((i): i is IEntrypointDependency => {\n if (i.resolved === null) {\n entrypoint.log(\n `[resolve] ✅ %s in %s is ignored`,\n i.source,\n entrypoint.name\n );\n return false;\n }\n\n return true;\n });\n}\n\nasync function loadDependencyCodes(\n services: Services,\n entrypoint: Entrypoint,\n dependencies: IEntrypointDependency[]\n): Promise<IEntrypointDependency[]> {\n if (!services.loadDependencyCode) {\n return dependencies;\n }\n\n const { loadDependencyCode } = services;\n\n return Promise.all(\n dependencies.map(async (dependency) => {\n if (!dependency.resolved) {\n return dependency;\n }\n\n try {\n const loadedCode = await loadDependencyCode(\n dependency.resolved,\n entrypoint.name,\n dependency.source\n );\n\n return loadedCode === undefined\n ? dependency\n : {\n ...dependency,\n loadedCode,\n };\n } catch (err) {\n entrypoint.log(\n '[load] ❌ cannot load %s in %s: %O',\n dependency.source,\n entrypoint.name,\n err\n );\n return dependency;\n }\n })\n );\n}\n\nfunction getPreResolvedImports(\n preResolved: IResolveImportsAction['data']['preResolved']\n): Map<string, IEntrypointDependency> {\n return new Map(\n (preResolved ?? []).map((dependency) => [dependency.source, dependency])\n );\n}\n\n/**\n * Synchronously resolves specified imports with a provided resolver.\n */\nexport function* syncResolveImports(\n this: IResolveImportsAction,\n resolve: (what: string, importer: string, stack: string[]) => string\n): SyncScenarioForAction<IResolveImportsAction> {\n const {\n data: { imports },\n entrypoint,\n services: { eventEmitter },\n } = this;\n const listOfImports = Array.from(imports?.entries() ?? []);\n const preResolvedImports = getPreResolvedImports(this.data.preResolved);\n const { log } = entrypoint;\n\n if (listOfImports.length === 0) {\n emitDependency(eventEmitter, entrypoint, [], this.data.phase);\n\n log('%s has no imports', entrypoint.name);\n return [];\n }\n\n const resolvedImports = listOfImports.map(([source, only]) => {\n const preResolved = preResolvedImports.get(source);\n if (preResolved) {\n const mergedOnly = mergeOnly(preResolved.only, only);\n log(\n '[sync-resolve] ♻️ %s -> %s (only: %o)',\n source,\n preResolved.resolved,\n mergedOnly\n );\n return {\n ...preResolved,\n only: mergedOnly,\n };\n }\n\n let resolved: string | null = null;\n try {\n resolved = resolve(source, entrypoint.name, getStack(entrypoint));\n log('[sync-resolve] ✅ %s -> %s (only: %o)', source, resolved, only);\n } catch (err) {\n log('[sync-resolve] ❌ cannot resolve %s: %O', source, err);\n }\n\n return {\n source,\n only,\n resolved,\n };\n });\n\n const overriddenImports = applyImportOverrides(\n this.services,\n entrypoint,\n resolvedImports\n );\n const filteredImports = filterUnresolved(entrypoint, overriddenImports);\n emitDependency(eventEmitter, entrypoint, filteredImports, this.data.phase);\n\n return filteredImports;\n}\n\n/**\n * Asynchronously resolves specified imports with a provided resolver.\n */\nexport async function* asyncResolveImports(\n this: IResolveImportsAction,\n resolve: AsyncResolve\n): AsyncScenarioForAction<IResolveImportsAction> {\n const {\n data: { imports },\n entrypoint,\n services: { eventEmitter },\n } = this;\n const listOfImports = Array.from(imports?.entries() ?? []);\n const preResolvedImports = getPreResolvedImports(this.data.preResolved);\n const { log } = entrypoint;\n\n if (listOfImports.length === 0) {\n emitDependency(eventEmitter, entrypoint, [], this.data.phase);\n\n log('%s has no imports', entrypoint.name);\n return [];\n }\n\n log('resolving %d imports', listOfImports.length);\n\n const getResolveTask = async (\n source: string,\n only: string[]\n ): Promise<IEntrypointDependency> => {\n let resolved: string | null = null;\n try {\n resolved = await resolveWithConfiguredEvalResolver(\n this.services,\n source,\n entrypoint.name,\n getStack(entrypoint),\n resolve\n );\n } catch (err) {\n log(\n '[async-resolve] ❌ cannot resolve %s in %s: %O',\n source,\n entrypoint.name,\n err\n );\n }\n\n if (resolved !== null) {\n log(\n '[async-resolve] ✅ %s (%o) in %s -> %s',\n source,\n only,\n entrypoint.name,\n resolved\n );\n }\n\n return {\n source,\n only,\n resolved,\n };\n };\n\n const resolvedImports = await Promise.all<IEntrypointDependency>(\n listOfImports.map(([source, importsOnly]) => {\n const preResolved = preResolvedImports.get(source);\n if (preResolved) {\n const mergedOnly = mergeOnly(preResolved.only, importsOnly);\n log(\n '[async-resolve] ♻️ %s (%o) in %s -> %s',\n source,\n mergedOnly,\n entrypoint.name,\n preResolved.resolved\n );\n return {\n ...preResolved,\n only: mergedOnly,\n };\n }\n\n const cached = entrypoint.getDependency(source);\n if (cached) {\n return {\n source,\n only: mergeOnly(cached.only, importsOnly),\n resolved: cached.resolved,\n };\n }\n\n const task = entrypoint.getResolveTask(source);\n if (task) {\n // If we have cached task, we need to merge only…\n const newTask = task.then((res) => {\n if (isSuperSet(res.only, importsOnly)) {\n return res;\n }\n\n // Is this branch even possible?\n const merged = mergeOnly(res.only, importsOnly);\n\n log('merging imports %o and %o: %o', importsOnly, res.only, merged);\n\n return { ...res, only: merged };\n });\n\n // … and update the cache\n entrypoint.addResolveTask(source, newTask);\n return newTask;\n }\n\n const resolveTask = getResolveTask(source, importsOnly);\n\n entrypoint.addResolveTask(source, resolveTask);\n\n return resolveTask;\n })\n );\n\n log('resolved %d imports', resolvedImports.length);\n\n const overriddenImports = applyImportOverrides(\n this.services,\n entrypoint,\n resolvedImports\n );\n const filteredImports = filterUnresolved(entrypoint, overriddenImports);\n const loadedImports = await loadDependencyCodes(\n this.services,\n entrypoint,\n filteredImports\n );\n emitDependency(eventEmitter, entrypoint, loadedImports, this.data.phase);\n return loadedImports;\n}\n"],"file":"resolveImports.js"}
@@ -2,10 +2,11 @@ import { TransformCacheCollection } from "../../cache.js";
2
2
  import { EventEmitter } from "../../utils/EventEmitter.js";
3
3
  import { loadAndParse } from "../Entrypoint.helpers.js";
4
4
  import { rootLog } from "../rootLog.js";
5
- export const withDefaultServices = ({ cache = new TransformCacheCollection(), emitWarning, eventEmitter = EventEmitter.dummy, loadAndParseFn = loadAndParse, log = rootLog, options, asyncResolveKey }) => ({
5
+ export const withDefaultServices = ({ cache = new TransformCacheCollection(), emitWarning, eventEmitter = EventEmitter.dummy, loadDependencyCode, loadAndParseFn = loadAndParse, log = rootLog, options, asyncResolveKey }) => ({
6
6
  cache,
7
7
  emitWarning,
8
8
  eventEmitter,
9
+ loadDependencyCode,
9
10
  loadAndParseFn,
10
11
  log,
11
12
  options,
@@ -1 +1 @@
1
- {"mappings":"AAAA,SAAS,gCAAgC;AACzC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AAOxB,OAAO,MAAM,uBAAuB,EAClC,QAAQ,IAAI,0BAA0B,EACtC,aACA,eAAe,aAAa,OAC5B,iBAAiB,cACjB,MAAM,SACN,SACA,uBACgC;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACD","names":[],"sources":["../../../src/transform/helpers/withDefaultServices.ts"],"version":3,"sourcesContent":["import { TransformCacheCollection } from '../../cache';\nimport { EventEmitter } from '../../utils/EventEmitter';\nimport { loadAndParse } from '../Entrypoint.helpers';\nimport { rootLog } from '../rootLog';\nimport type { Services } from '../types';\n\ntype RequiredServices = 'options';\nexport type PartialServices = Partial<Omit<Services, RequiredServices>> &\n Pick<Services, RequiredServices>;\n\nexport const withDefaultServices = ({\n cache = new TransformCacheCollection(),\n emitWarning,\n eventEmitter = EventEmitter.dummy,\n loadAndParseFn = loadAndParse,\n log = rootLog,\n options,\n asyncResolveKey,\n}: PartialServices): Services => ({\n cache,\n emitWarning,\n eventEmitter,\n loadAndParseFn,\n log,\n options,\n asyncResolveKey,\n});\n"],"file":"withDefaultServices.js"}
1
+ {"mappings":"AAAA,SAAS,gCAAgC;AACzC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AAOxB,OAAO,MAAM,uBAAuB,EAClC,QAAQ,IAAI,0BAA0B,EACtC,aACA,eAAe,aAAa,OAC5B,oBACA,iBAAiB,cACjB,MAAM,SACN,SACA,uBACgC;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD","names":[],"sources":["../../../src/transform/helpers/withDefaultServices.ts"],"version":3,"sourcesContent":["import { TransformCacheCollection } from '../../cache';\nimport { EventEmitter } from '../../utils/EventEmitter';\nimport { loadAndParse } from '../Entrypoint.helpers';\nimport { rootLog } from '../rootLog';\nimport type { Services } from '../types';\n\ntype RequiredServices = 'options';\nexport type PartialServices = Partial<Omit<Services, RequiredServices>> &\n Pick<Services, RequiredServices>;\n\nexport const withDefaultServices = ({\n cache = new TransformCacheCollection(),\n emitWarning,\n eventEmitter = EventEmitter.dummy,\n loadDependencyCode,\n loadAndParseFn = loadAndParse,\n log = rootLog,\n options,\n asyncResolveKey,\n}: PartialServices): Services => ({\n cache,\n emitWarning,\n eventEmitter,\n loadDependencyCode,\n loadAndParseFn,\n log,\n options,\n asyncResolveKey,\n});\n"],"file":"withDefaultServices.js"}
@@ -1 +1 @@
1
- {"mappings":"AAgDA,OAAO,MAAM,UAAU,OAAO,UAAU","names":[],"sources":["../../src/transform/types.ts"],"version":3,"sourcesContent":["import type { ValueCache } from '@wyw-in-js/processor-utils';\nimport type { Debugger, Artifact, StrictOptions } from '@wyw-in-js/shared';\nimport type { RawSourceMap } from 'source-map';\n\nimport type { TransformCacheCollection } from '../cache';\nimport type { Options, ITransformFileResult } from '../types';\nimport type { EventEmitter } from '../utils/EventEmitter';\nimport type { WYWTransformMetadata } from '../utils/TransformMetadata';\n\nimport type { Entrypoint } from './Entrypoint';\nimport type { LoadAndParseFn, IEntrypointDependency } from './Entrypoint.types';\nimport type { BaseAction } from './actions/BaseAction';\nimport type {\n IExtracted,\n IWorkflowActionLinariaResult,\n IWorkflowActionNonLinariaResult,\n} from './actions/types';\nimport type { EvalBroker } from '../eval/broker';\n\nexport type Services = {\n cache: TransformCacheCollection;\n emitWarning?: (message: string) => void;\n eventEmitter: EventEmitter;\n loadAndParseFn: LoadAndParseFn;\n log: Debugger;\n options: Options & {\n pluginOptions: StrictOptions;\n };\n asyncResolve?: (\n what: string,\n importer: string,\n stack: string[]\n ) => Promise<string | null>;\n asyncResolveKey?: string;\n evalBroker?: EvalBroker;\n};\n\nexport interface IBaseNode {\n type: ActionTypes;\n}\n\nexport type ActionByType<TType extends ActionQueueItem['type']> = Extract<\n ActionQueueItem,\n {\n type: TType;\n }\n>;\n\nexport const Pending = Symbol('pending');\n\nexport type YieldResult = Exclude<ActionQueueItem['result'], typeof Pending>;\n\nexport type AnyIteratorResult<TMode extends 'async' | 'sync', TResult> = {\n async: Promise<IteratorResult<YieldArg, TResult>>;\n sync: IteratorResult<YieldArg, TResult>;\n}[TMode];\n\nexport interface IBaseAction<TAction extends ActionQueueItem, TResult, TData>\n extends IBaseNode {\n actionContext: unknown;\n abortSignal: AbortSignal | null;\n createAbortSignal: () => AbortSignal & Disposable;\n data: TData;\n entrypoint: Entrypoint;\n getNext: GetNext;\n idx: string;\n result: TResult | typeof Pending;\n run: <TMode extends 'async' | 'sync'>(\n handler: Handler<TMode, TAction>\n ) => {\n next: (arg: YieldResult) => AnyIteratorResult<TMode, TResult>;\n throw(e: unknown): AnyIteratorResult<TMode, TResult>;\n };\n services: Services;\n}\n\ntype NextParams<\n TType extends ActionTypes,\n TNextAction extends ActionByType<TType> = ActionByType<TType>,\n> = [\n type: TType,\n entrypoint: Entrypoint,\n data: TNextAction['data'],\n abortSignal?: AbortSignal | null,\n];\n\nexport type YieldArg = {\n [K in ActionQueueItem['type']]: NextParams<K>;\n}[ActionQueueItem['type']];\n\nexport type SyncScenarioFor<TResult> = {\n [Symbol.iterator](): SyncScenarioFor<TResult>;\n next(arg: YieldResult): IteratorResult<YieldArg, TResult>;\n return(value: TResult): IteratorResult<YieldArg, TResult>;\n throw(e: unknown): IteratorResult<YieldArg, TResult>;\n};\n\nexport type AsyncScenarioFor<TResult> = {\n [Symbol.asyncIterator](): AsyncScenarioFor<TResult>;\n next(arg: YieldResult): Promise<IteratorResult<YieldArg, TResult>>;\n return(\n value: TResult | PromiseLike<TResult>\n ): Promise<IteratorResult<YieldArg, TResult>>;\n throw(e: unknown): Promise<IteratorResult<YieldArg, TResult>>;\n};\n\nexport type SyncScenarioForAction<TAction extends ActionQueueItem> =\n SyncScenarioFor<TypeOfResult<TAction>>;\n\nexport type AsyncScenarioForAction<TAction extends ActionQueueItem> =\n AsyncScenarioFor<TypeOfResult<TAction>>;\n\nexport type Handler<\n TMode extends 'async' | 'sync',\n TAction extends ActionQueueItem,\n> = ((this: BaseAction<TAction>) => {\n async: AsyncScenarioForAction<TAction>;\n sync: SyncScenarioForAction<TAction>;\n}[TMode]) & {\n recover?: (e: unknown, action: BaseAction<TAction>) => YieldArg;\n};\n\nexport type Handlers<TMode extends 'async' | 'sync'> = {\n [TAction in ActionQueueItem as TAction['type']]: Handler<TMode, TAction>;\n};\n\nexport type TypeOfResult<T extends ActionQueueItem> = Exclude<\n T['result'],\n typeof Pending\n>;\n\nexport type GetNext = <\n TType extends ActionTypes,\n TNextAction extends ActionByType<TType> = ActionByType<TType>,\n>(\n ...args: NextParams<TType, TNextAction>\n) => Generator<\n [TType, Entrypoint, TNextAction['data'], AbortSignal | null],\n TypeOfResult<TNextAction>,\n YieldResult\n>;\n\nexport interface ICollectActionResult {\n ast: unknown; // FIXME: looks like this is not used\n code: string | null | undefined;\n map?: RawSourceMap | null;\n metadata?: WYWTransformMetadata | null;\n}\n\nexport interface ICollectAction\n extends IBaseAction<\n ICollectAction,\n ICollectActionResult,\n { valueCache: ValueCache }\n > {\n type: 'collect';\n}\n\nexport interface IEvalAction\n extends IBaseAction<IEvalAction, [ValueCache, string[]] | null, undefined> {\n type: 'evalFile';\n}\n\nexport interface IExplodeReexportsAction\n extends IBaseAction<IExplodeReexportsAction, void, undefined> {\n type: 'explodeReexports';\n}\n\nexport interface IExtractAction\n extends IBaseAction<\n IExtractAction,\n IExtracted,\n { processors: { artifacts: Artifact[] }[] }\n > {\n type: 'extract';\n}\n\nexport interface IGetExportsAction\n extends IBaseAction<IGetExportsAction, string[], undefined> {\n type: 'getExports';\n}\n\nexport interface IProcessEntrypointAction\n extends IBaseAction<IProcessEntrypointAction, void, undefined> {\n type: 'processEntrypoint';\n}\n\nexport interface IProcessImportsAction\n extends IBaseAction<\n IProcessImportsAction,\n void,\n {\n resolved: IEntrypointDependency[];\n skipParentDependencyTracking?: string[];\n }\n > {\n type: 'processImports';\n}\n\nexport interface IResolveImportsAction\n extends IBaseAction<\n IResolveImportsAction,\n IEntrypointDependency[],\n {\n imports: Map<string, string[]> | null;\n phase?: 'initial' | 'rewritten';\n preResolved?: IEntrypointDependency[];\n }\n > {\n type: 'resolveImports';\n}\n\nexport interface ITransformAction\n extends IBaseAction<ITransformAction, ITransformFileResult, undefined> {\n type: 'transform';\n}\n\nexport interface IWorkflowAction\n extends IBaseAction<\n IWorkflowAction,\n IWorkflowActionLinariaResult | IWorkflowActionNonLinariaResult,\n undefined\n > {\n type: 'workflow';\n}\n\nexport type ActionQueueItem =\n | IEvalAction\n | IExplodeReexportsAction\n | IExtractAction\n | IGetExportsAction\n | ICollectAction\n | IProcessEntrypointAction\n | IProcessImportsAction\n | IResolveImportsAction\n | ITransformAction\n | IWorkflowAction;\n\nexport type ActionTypes = ActionQueueItem['type'];\n"],"file":"types.js"}
1
+ {"mappings":"AAuDA,OAAO,MAAM,UAAU,OAAO,UAAU","names":[],"sources":["../../src/transform/types.ts"],"version":3,"sourcesContent":["import type { ValueCache } from '@wyw-in-js/processor-utils';\nimport type { Debugger, Artifact, StrictOptions } from '@wyw-in-js/shared';\nimport type { RawSourceMap } from 'source-map';\n\nimport type { TransformCacheCollection } from '../cache';\nimport type { Options, ITransformFileResult } from '../types';\nimport type { EventEmitter } from '../utils/EventEmitter';\nimport type { WYWTransformMetadata } from '../utils/TransformMetadata';\n\nimport type { Entrypoint } from './Entrypoint';\nimport type { LoadAndParseFn, IEntrypointDependency } from './Entrypoint.types';\nimport type { BaseAction } from './actions/BaseAction';\nimport type {\n IExtracted,\n IWorkflowActionLinariaResult,\n IWorkflowActionNonLinariaResult,\n} from './actions/types';\nimport type { EvalBroker } from '../eval/broker';\n\nexport type LoadDependencyCodeFn = (\n resolved: string,\n importer: string,\n source: string\n) => Promise<string | undefined>;\n\nexport type Services = {\n cache: TransformCacheCollection;\n emitWarning?: (message: string) => void;\n eventEmitter: EventEmitter;\n loadDependencyCode?: LoadDependencyCodeFn;\n loadAndParseFn: LoadAndParseFn;\n log: Debugger;\n options: Options & {\n pluginOptions: StrictOptions;\n };\n asyncResolve?: (\n what: string,\n importer: string,\n stack: string[]\n ) => Promise<string | null>;\n asyncResolveKey?: string;\n evalBroker?: EvalBroker;\n};\n\nexport interface IBaseNode {\n type: ActionTypes;\n}\n\nexport type ActionByType<TType extends ActionQueueItem['type']> = Extract<\n ActionQueueItem,\n {\n type: TType;\n }\n>;\n\nexport const Pending = Symbol('pending');\n\nexport type YieldResult = Exclude<ActionQueueItem['result'], typeof Pending>;\n\nexport type AnyIteratorResult<TMode extends 'async' | 'sync', TResult> = {\n async: Promise<IteratorResult<YieldArg, TResult>>;\n sync: IteratorResult<YieldArg, TResult>;\n}[TMode];\n\nexport interface IBaseAction<TAction extends ActionQueueItem, TResult, TData>\n extends IBaseNode {\n actionContext: unknown;\n abortSignal: AbortSignal | null;\n createAbortSignal: () => AbortSignal & Disposable;\n data: TData;\n entrypoint: Entrypoint;\n getNext: GetNext;\n idx: string;\n result: TResult | typeof Pending;\n run: <TMode extends 'async' | 'sync'>(\n handler: Handler<TMode, TAction>\n ) => {\n next: (arg: YieldResult) => AnyIteratorResult<TMode, TResult>;\n throw(e: unknown): AnyIteratorResult<TMode, TResult>;\n };\n services: Services;\n}\n\ntype NextParams<\n TType extends ActionTypes,\n TNextAction extends ActionByType<TType> = ActionByType<TType>,\n> = [\n type: TType,\n entrypoint: Entrypoint,\n data: TNextAction['data'],\n abortSignal?: AbortSignal | null,\n];\n\nexport type YieldArg = {\n [K in ActionQueueItem['type']]: NextParams<K>;\n}[ActionQueueItem['type']];\n\nexport type SyncScenarioFor<TResult> = {\n [Symbol.iterator](): SyncScenarioFor<TResult>;\n next(arg: YieldResult): IteratorResult<YieldArg, TResult>;\n return(value: TResult): IteratorResult<YieldArg, TResult>;\n throw(e: unknown): IteratorResult<YieldArg, TResult>;\n};\n\nexport type AsyncScenarioFor<TResult> = {\n [Symbol.asyncIterator](): AsyncScenarioFor<TResult>;\n next(arg: YieldResult): Promise<IteratorResult<YieldArg, TResult>>;\n return(\n value: TResult | PromiseLike<TResult>\n ): Promise<IteratorResult<YieldArg, TResult>>;\n throw(e: unknown): Promise<IteratorResult<YieldArg, TResult>>;\n};\n\nexport type SyncScenarioForAction<TAction extends ActionQueueItem> =\n SyncScenarioFor<TypeOfResult<TAction>>;\n\nexport type AsyncScenarioForAction<TAction extends ActionQueueItem> =\n AsyncScenarioFor<TypeOfResult<TAction>>;\n\nexport type Handler<\n TMode extends 'async' | 'sync',\n TAction extends ActionQueueItem,\n> = ((this: BaseAction<TAction>) => {\n async: AsyncScenarioForAction<TAction>;\n sync: SyncScenarioForAction<TAction>;\n}[TMode]) & {\n recover?: (e: unknown, action: BaseAction<TAction>) => YieldArg;\n};\n\nexport type Handlers<TMode extends 'async' | 'sync'> = {\n [TAction in ActionQueueItem as TAction['type']]: Handler<TMode, TAction>;\n};\n\nexport type TypeOfResult<T extends ActionQueueItem> = Exclude<\n T['result'],\n typeof Pending\n>;\n\nexport type GetNext = <\n TType extends ActionTypes,\n TNextAction extends ActionByType<TType> = ActionByType<TType>,\n>(\n ...args: NextParams<TType, TNextAction>\n) => Generator<\n [TType, Entrypoint, TNextAction['data'], AbortSignal | null],\n TypeOfResult<TNextAction>,\n YieldResult\n>;\n\nexport interface ICollectActionResult {\n ast: unknown; // FIXME: looks like this is not used\n code: string | null | undefined;\n map?: RawSourceMap | null;\n metadata?: WYWTransformMetadata | null;\n}\n\nexport interface ICollectAction\n extends IBaseAction<\n ICollectAction,\n ICollectActionResult,\n { valueCache: ValueCache }\n > {\n type: 'collect';\n}\n\nexport interface IEvalAction\n extends IBaseAction<IEvalAction, [ValueCache, string[]] | null, undefined> {\n type: 'evalFile';\n}\n\nexport interface IExplodeReexportsAction\n extends IBaseAction<IExplodeReexportsAction, void, undefined> {\n type: 'explodeReexports';\n}\n\nexport interface IExtractAction\n extends IBaseAction<\n IExtractAction,\n IExtracted,\n { processors: { artifacts: Artifact[] }[] }\n > {\n type: 'extract';\n}\n\nexport interface IGetExportsAction\n extends IBaseAction<IGetExportsAction, string[], undefined> {\n type: 'getExports';\n}\n\nexport interface IProcessEntrypointAction\n extends IBaseAction<IProcessEntrypointAction, void, undefined> {\n type: 'processEntrypoint';\n}\n\nexport interface IProcessImportsAction\n extends IBaseAction<\n IProcessImportsAction,\n void,\n {\n resolved: IEntrypointDependency[];\n skipParentDependencyTracking?: string[];\n }\n > {\n type: 'processImports';\n}\n\nexport interface IResolveImportsAction\n extends IBaseAction<\n IResolveImportsAction,\n IEntrypointDependency[],\n {\n imports: Map<string, string[]> | null;\n phase?: 'initial' | 'rewritten';\n preResolved?: IEntrypointDependency[];\n }\n > {\n type: 'resolveImports';\n}\n\nexport interface ITransformAction\n extends IBaseAction<ITransformAction, ITransformFileResult, undefined> {\n type: 'transform';\n}\n\nexport interface IWorkflowAction\n extends IBaseAction<\n IWorkflowAction,\n IWorkflowActionLinariaResult | IWorkflowActionNonLinariaResult,\n undefined\n > {\n type: 'workflow';\n}\n\nexport type ActionQueueItem =\n | IEvalAction\n | IExplodeReexportsAction\n | IExtractAction\n | IGetExportsAction\n | ICollectAction\n | IProcessEntrypointAction\n | IProcessImportsAction\n | IResolveImportsAction\n | ITransformAction\n | IWorkflowAction;\n\nexport type ActionTypes = ActionQueueItem['type'];\n"],"file":"types.js"}
package/esm/transform.js CHANGED
@@ -40,7 +40,7 @@ const canonicalizeForHash = (value) => {
40
40
  }
41
41
  return value;
42
42
  };
43
- const getEvalCacheKey = (pluginOptions, asyncResolveKey, asyncResolve) => {
43
+ const getEvalCacheKey = (pluginOptions, asyncResolveKey, asyncResolve, loadDependencyCode) => {
44
44
  const evalOptions = pluginOptions.eval ?? {};
45
45
  const payload = JSON.stringify({
46
46
  errors: evalOptions.errors,
@@ -55,6 +55,7 @@ const getEvalCacheKey = (pluginOptions, asyncResolveKey, asyncResolve) => {
55
55
  // them to provide a stable scope key so cache/broker reuse tracks resolver
56
56
  // semantics instead of closure identity.
57
57
  bundlerResolver: asyncResolveKey ?? getResolverId(asyncResolve),
58
+ bundlerLoader: getResolverId(loadDependencyCode),
58
59
  overrideContext: getResolverId(pluginOptions.overrideContext),
59
60
  importOverrides: pluginOptions.importOverrides ?? null,
60
61
  extensions: pluginOptions.extensions,
@@ -79,7 +80,7 @@ export async function transform(partialServices, originalCode, asyncResolve, cus
79
80
  // If global cache is disabled, we need to create a new cache for each file
80
81
  services.cache = new TransformCacheCollection();
81
82
  }
82
- const evalCacheKey = getEvalCacheKey(pluginOptions, services.asyncResolveKey, asyncResolve);
83
+ const evalCacheKey = getEvalCacheKey(pluginOptions, services.asyncResolveKey, asyncResolve, services.loadDependencyCode);
83
84
  services.cache.setKeySalt(evalCacheKey);
84
85
  services.asyncResolve = asyncResolve;
85
86
  services.evalBroker = getEvalBroker(services, asyncResolve, evalCacheKey);
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../src/transform.ts"],"version":3,"sourcesContent":["/**\n * This file exposes sync and async transform functions that:\n * - parse the passed code to AST\n * - builds a dependency graph for the file\n * - shakes each dependency and removes unused code\n * - runs generated code in a sandbox\n * - collects artifacts\n * - returns transformed code (without WYW template literals), generated CSS, source maps and transform metadata.\n */\n\nimport { createHash } from 'crypto';\n\nimport { isFeatureEnabled } from '@wyw-in-js/shared';\n\nimport type { PartialOptions } from './transform/helpers/loadWywOptions';\nimport { loadWywOptions } from './transform/helpers/loadWywOptions';\nimport { TransformCacheCollection } from './cache';\nimport { Entrypoint } from './transform/Entrypoint';\nimport { asyncActionRunner } from './transform/actions/actionRunner';\nimport { baseHandlers } from './transform/generators';\nimport { asyncResolveImports } from './transform/generators/resolveImports';\nimport { withDefaultServices } from './transform/helpers/withDefaultServices';\nimport type {\n Handler,\n Handlers,\n IResolveImportsAction,\n Services,\n} from './transform/types';\nimport type { Result } from './types';\nimport { getEvalBroker } from './eval/broker';\nimport { encodeGlobals } from './eval/serialize';\n\ntype PartialServices = Partial<Omit<Services, 'options'>> & {\n options: Omit<Services['options'], 'pluginOptions'> & {\n pluginOptions?: PartialOptions;\n };\n};\n\ntype AllHandlers<TMode extends 'async' | 'sync'> = Handlers<TMode>;\n\nconst memoizedAsyncResolve = new WeakMap<\n (what: string, importer: string, stack: string[]) => Promise<string | null>,\n Handler<'async' | 'sync', IResolveImportsAction>\n>();\n\ntype ResolverFn = (...args: unknown[]) => unknown;\n\nconst resolverIds = new WeakMap<ResolverFn, number>();\nlet resolverId = 0;\n\nconst getResolverId = (fn: unknown) => {\n if (typeof fn !== 'function') return null;\n const resolver = fn as ResolverFn;\n const cached = resolverIds.get(resolver);\n if (cached) return cached;\n resolverId += 1;\n resolverIds.set(resolver, resolverId);\n return resolverId;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst canonicalizeForHash = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map((item) => canonicalizeForHash(item));\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, canonicalizeForHash(value[key])])\n );\n }\n\n return value;\n};\n\nconst getEvalCacheKey = (\n pluginOptions: ReturnType<typeof loadWywOptions>,\n asyncResolveKey: string | undefined,\n asyncResolve: (\n what: string,\n importer: string,\n stack: string[]\n ) => Promise<string | null>\n) => {\n const evalOptions = pluginOptions.eval ?? {};\n const payload = JSON.stringify({\n errors: evalOptions.errors,\n resolver: evalOptions.resolver,\n require: evalOptions.require,\n runtime: evalOptions.runtime,\n strategy: evalOptions.strategy,\n globals: canonicalizeForHash(encodeGlobals(evalOptions.globals ?? {})),\n customResolver: getResolverId(evalOptions.customResolver),\n customLoader: getResolverId(evalOptions.customLoader),\n // Bundlers like webpack can recreate transport resolvers per file. Allow\n // them to provide a stable scope key so cache/broker reuse tracks resolver\n // semantics instead of closure identity.\n bundlerResolver: asyncResolveKey ?? getResolverId(asyncResolve),\n overrideContext: getResolverId(pluginOptions.overrideContext),\n importOverrides: pluginOptions.importOverrides ?? null,\n extensions: pluginOptions.extensions,\n features: pluginOptions.features,\n });\n\n return createHash('sha256').update(payload).digest('hex');\n};\n\nexport function transformSync(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _partialServices: PartialServices,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _originalCode: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _syncResolve: (what: string, importer: string, stack: string[]) => string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _customHandlers: Partial<AllHandlers<'sync'>> = {}\n): Result {\n throw new Error(\n '[wyw-in-js] transformSync is not supported in v2. Use transform() (async) instead.'\n );\n}\n\nexport async function transform(\n partialServices: PartialServices,\n originalCode: string,\n asyncResolve: (\n what: string,\n importer: string,\n stack: string[]\n ) => Promise<string | null>,\n customHandlers: Partial<AllHandlers<'sync'>> = {}\n): Promise<Result> {\n const { options } = partialServices;\n const pluginOptions = loadWywOptions(options.pluginOptions);\n const services = withDefaultServices({\n ...partialServices,\n options: {\n ...options,\n pluginOptions,\n },\n });\n\n if (\n !isFeatureEnabled(pluginOptions.features, 'globalCache', options.filename)\n ) {\n // If global cache is disabled, we need to create a new cache for each file\n services.cache = new TransformCacheCollection();\n }\n\n const evalCacheKey = getEvalCacheKey(\n pluginOptions,\n services.asyncResolveKey,\n asyncResolve\n );\n services.cache.setKeySalt(evalCacheKey);\n services.asyncResolve = asyncResolve;\n services.evalBroker = getEvalBroker(services, asyncResolve, evalCacheKey);\n\n /*\n * This method can be run simultaneously for multiple files.\n * A shared cache is accessible for all runs, but each run has its own queue\n * to maintain the correct processing order. The cache stores the outcome\n * of tree-shaking, and if the result is already stored in the cache\n * but the \"only\" option has changed, the file will be re-processed using\n * the combined \"only\" option.\n */\n const entrypoint = Entrypoint.createRoot(\n services,\n options.filename,\n ['__wywPreval'],\n originalCode\n );\n\n if (entrypoint.ignored) {\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n // Separate top-level runs must not share action state, even for the same\n // entrypoint, otherwise concurrent transforms can collide in BaseAction.run.\n const workflowAction = entrypoint.createAction(\n 'workflow',\n undefined,\n null,\n {}\n );\n\n if (!memoizedAsyncResolve.has(asyncResolve)) {\n const resolveImports = function resolveImports(\n this: IResolveImportsAction\n ) {\n return asyncResolveImports.call(this, asyncResolve);\n };\n\n memoizedAsyncResolve.set(asyncResolve, resolveImports);\n }\n\n try {\n const result = await asyncActionRunner(workflowAction, {\n ...baseHandlers,\n ...customHandlers,\n resolveImports: memoizedAsyncResolve.get(asyncResolve)!,\n });\n\n entrypoint.log('%s is ready', entrypoint.name);\n\n return result;\n } catch (err) {\n entrypoint.log('Unhandled error %O', err);\n\n if (\n isFeatureEnabled(pluginOptions.features, 'softErrors', options.filename)\n ) {\n // eslint-disable-next-line no-console\n console.error(`Error during transform of ${entrypoint.name}:`, err);\n\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n throw err;\n }\n}\n"],"file":"transform.js"}
1
+ {"mappings":"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","names":[],"sources":["../src/transform.ts"],"version":3,"sourcesContent":["/**\n * This file exposes sync and async transform functions that:\n * - parse the passed code to AST\n * - builds a dependency graph for the file\n * - shakes each dependency and removes unused code\n * - runs generated code in a sandbox\n * - collects artifacts\n * - returns transformed code (without WYW template literals), generated CSS, source maps and transform metadata.\n */\n\nimport { createHash } from 'crypto';\n\nimport { isFeatureEnabled } from '@wyw-in-js/shared';\n\nimport type { PartialOptions } from './transform/helpers/loadWywOptions';\nimport { loadWywOptions } from './transform/helpers/loadWywOptions';\nimport { TransformCacheCollection } from './cache';\nimport { Entrypoint } from './transform/Entrypoint';\nimport { asyncActionRunner } from './transform/actions/actionRunner';\nimport { baseHandlers } from './transform/generators';\nimport { asyncResolveImports } from './transform/generators/resolveImports';\nimport { withDefaultServices } from './transform/helpers/withDefaultServices';\nimport type {\n Handler,\n Handlers,\n IResolveImportsAction,\n Services,\n} from './transform/types';\nimport type { Result } from './types';\nimport { getEvalBroker } from './eval/broker';\nimport { encodeGlobals } from './eval/serialize';\n\ntype PartialServices = Partial<Omit<Services, 'options'>> & {\n options: Omit<Services['options'], 'pluginOptions'> & {\n pluginOptions?: PartialOptions;\n };\n};\n\ntype AllHandlers<TMode extends 'async' | 'sync'> = Handlers<TMode>;\n\nconst memoizedAsyncResolve = new WeakMap<\n (what: string, importer: string, stack: string[]) => Promise<string | null>,\n Handler<'async' | 'sync', IResolveImportsAction>\n>();\n\ntype ResolverFn = (...args: unknown[]) => unknown;\n\nconst resolverIds = new WeakMap<ResolverFn, number>();\nlet resolverId = 0;\n\nconst getResolverId = (fn: unknown) => {\n if (typeof fn !== 'function') return null;\n const resolver = fn as ResolverFn;\n const cached = resolverIds.get(resolver);\n if (cached) return cached;\n resolverId += 1;\n resolverIds.set(resolver, resolverId);\n return resolverId;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst canonicalizeForHash = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map((item) => canonicalizeForHash(item));\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, canonicalizeForHash(value[key])])\n );\n }\n\n return value;\n};\n\nconst getEvalCacheKey = (\n pluginOptions: ReturnType<typeof loadWywOptions>,\n asyncResolveKey: string | undefined,\n asyncResolve: (\n what: string,\n importer: string,\n stack: string[]\n ) => Promise<string | null>,\n loadDependencyCode: Services['loadDependencyCode'] | undefined\n) => {\n const evalOptions = pluginOptions.eval ?? {};\n const payload = JSON.stringify({\n errors: evalOptions.errors,\n resolver: evalOptions.resolver,\n require: evalOptions.require,\n runtime: evalOptions.runtime,\n strategy: evalOptions.strategy,\n globals: canonicalizeForHash(encodeGlobals(evalOptions.globals ?? {})),\n customResolver: getResolverId(evalOptions.customResolver),\n customLoader: getResolverId(evalOptions.customLoader),\n // Bundlers like webpack can recreate transport resolvers per file. Allow\n // them to provide a stable scope key so cache/broker reuse tracks resolver\n // semantics instead of closure identity.\n bundlerResolver: asyncResolveKey ?? getResolverId(asyncResolve),\n bundlerLoader: getResolverId(loadDependencyCode),\n overrideContext: getResolverId(pluginOptions.overrideContext),\n importOverrides: pluginOptions.importOverrides ?? null,\n extensions: pluginOptions.extensions,\n features: pluginOptions.features,\n });\n\n return createHash('sha256').update(payload).digest('hex');\n};\n\nexport function transformSync(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _partialServices: PartialServices,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _originalCode: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _syncResolve: (what: string, importer: string, stack: string[]) => string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _customHandlers: Partial<AllHandlers<'sync'>> = {}\n): Result {\n throw new Error(\n '[wyw-in-js] transformSync is not supported in v2. Use transform() (async) instead.'\n );\n}\n\nexport async function transform(\n partialServices: PartialServices,\n originalCode: string,\n asyncResolve: (\n what: string,\n importer: string,\n stack: string[]\n ) => Promise<string | null>,\n customHandlers: Partial<AllHandlers<'sync'>> = {}\n): Promise<Result> {\n const { options } = partialServices;\n const pluginOptions = loadWywOptions(options.pluginOptions);\n const services = withDefaultServices({\n ...partialServices,\n options: {\n ...options,\n pluginOptions,\n },\n });\n\n if (\n !isFeatureEnabled(pluginOptions.features, 'globalCache', options.filename)\n ) {\n // If global cache is disabled, we need to create a new cache for each file\n services.cache = new TransformCacheCollection();\n }\n\n const evalCacheKey = getEvalCacheKey(\n pluginOptions,\n services.asyncResolveKey,\n asyncResolve,\n services.loadDependencyCode\n );\n services.cache.setKeySalt(evalCacheKey);\n services.asyncResolve = asyncResolve;\n services.evalBroker = getEvalBroker(services, asyncResolve, evalCacheKey);\n\n /*\n * This method can be run simultaneously for multiple files.\n * A shared cache is accessible for all runs, but each run has its own queue\n * to maintain the correct processing order. The cache stores the outcome\n * of tree-shaking, and if the result is already stored in the cache\n * but the \"only\" option has changed, the file will be re-processed using\n * the combined \"only\" option.\n */\n const entrypoint = Entrypoint.createRoot(\n services,\n options.filename,\n ['__wywPreval'],\n originalCode\n );\n\n if (entrypoint.ignored) {\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n // Separate top-level runs must not share action state, even for the same\n // entrypoint, otherwise concurrent transforms can collide in BaseAction.run.\n const workflowAction = entrypoint.createAction(\n 'workflow',\n undefined,\n null,\n {}\n );\n\n if (!memoizedAsyncResolve.has(asyncResolve)) {\n const resolveImports = function resolveImports(\n this: IResolveImportsAction\n ) {\n return asyncResolveImports.call(this, asyncResolve);\n };\n\n memoizedAsyncResolve.set(asyncResolve, resolveImports);\n }\n\n try {\n const result = await asyncActionRunner(workflowAction, {\n ...baseHandlers,\n ...customHandlers,\n resolveImports: memoizedAsyncResolve.get(asyncResolve)!,\n });\n\n entrypoint.log('%s is ready', entrypoint.name);\n\n return result;\n } catch (err) {\n entrypoint.log('Unhandled error %O', err);\n\n if (\n isFeatureEnabled(pluginOptions.features, 'softErrors', options.filename)\n ) {\n // eslint-disable-next-line no-console\n console.error(`Error during transform of ${entrypoint.name}:`, err);\n\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n throw err;\n }\n}\n"],"file":"transform.js"}
package/esm/types.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"","names":[],"sources":["../src/types.ts"],"version":3,"sourcesContent":["import type { RawSourceMap } from 'source-map';\n\nimport type {\n Debugger,\n Replacement,\n Rules,\n StrictOptions,\n} from '@wyw-in-js/shared';\n\nimport type {\n WYWTransformMetadata,\n WYWTransformResultMetadata,\n} from './utils/TransformMetadata';\nimport type { WYWTransformDiagnostic } from './utils/TransformDiagnostics';\n\nexport type PluginOptions = StrictOptions & {\n configFile?: string | false;\n stage?: Stage;\n};\n\nexport type ParentEntrypoint = {\n evaluated: boolean;\n log: Debugger;\n name: string;\n parents: ParentEntrypoint[];\n seqId: number;\n};\n\nexport type Dependencies = string[];\n\nexport interface ITransformFileResult {\n code: string;\n metadata: WYWTransformMetadata | null;\n}\n\nexport type Stage = 'preeval' | 'collect';\n\nexport type Result = {\n code: string;\n cssSourceMapText?: string;\n cssText?: string;\n dependencies?: string[];\n diagnostics?: WYWTransformDiagnostic[];\n metadata?: WYWTransformResultMetadata;\n replacements?: Replacement[];\n rules?: Rules;\n sourceMap?: RawSourceMap | null;\n};\n\nexport type Options = {\n filename: string;\n inputSourceMap?: RawSourceMap;\n keepComments?: boolean | RegExp;\n outputFilename?: string;\n pluginOptions?: Partial<PluginOptions>;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n root?: string;\n};\n\nexport type PreprocessorFn = (selector: string, cssText: string) => string;\nexport type Preprocessor = 'none' | 'stylis' | PreprocessorFn | void;\n\nexport type JSONValue =\n | null\n | string\n | number\n | boolean\n | JSONObject\n | JSONArray;\n\nexport interface JSONObject {\n [x: string]: JSONValue;\n}\n\nexport type JSONArray = Array<JSONValue>;\n\nexport type Serializable = JSONValue;\n\n/**\n * CSS-related types\n */\n"],"file":"types.js"}
1
+ {"mappings":"","names":[],"sources":["../src/types.ts"],"version":3,"sourcesContent":["import type { RawSourceMap } from 'source-map';\n\nimport type {\n Debugger,\n Replacement,\n Rules,\n StrictOptions,\n WywInJsProcessorOptions,\n} from '@wyw-in-js/shared';\n\nimport type {\n WYWTransformMetadata,\n WYWTransformResultMetadata,\n} from './utils/TransformMetadata';\nimport type { WYWTransformDiagnostic } from './utils/TransformDiagnostics';\n\nexport type { WywInJsProcessorOptions };\n\nexport interface PluginOptions extends StrictOptions {\n configFile?: string | false;\n stage?: Stage;\n}\n\nexport type ParentEntrypoint = {\n evaluated: boolean;\n log: Debugger;\n name: string;\n parents: ParentEntrypoint[];\n seqId: number;\n};\n\nexport type Dependencies = string[];\n\nexport interface ITransformFileResult {\n code: string;\n metadata: WYWTransformMetadata | null;\n}\n\nexport type Stage = 'preeval' | 'collect';\n\nexport type Result = {\n code: string;\n cssSourceMapText?: string;\n cssText?: string;\n dependencies?: string[];\n diagnostics?: WYWTransformDiagnostic[];\n metadata?: WYWTransformResultMetadata;\n replacements?: Replacement[];\n rules?: Rules;\n sourceMap?: RawSourceMap | null;\n};\n\nexport type Options = {\n filename: string;\n inputSourceMap?: RawSourceMap;\n keepComments?: boolean | RegExp;\n outputFilename?: string;\n pluginOptions?: Partial<PluginOptions>;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n root?: string;\n};\n\nexport type PreprocessorFn = (selector: string, cssText: string) => string;\nexport type Preprocessor = 'none' | 'stylis' | PreprocessorFn | void;\n\nexport type JSONValue =\n | null\n | string\n | number\n | boolean\n | JSONObject\n | JSONArray;\n\nexport interface JSONObject {\n [x: string]: JSONValue;\n}\n\nexport type JSONArray = Array<JSONValue>;\n\nexport type Serializable = JSONValue;\n\n/**\n * CSS-related types\n */\n"],"file":"types.js"}
@@ -1 +1 @@
1
- {"mappings":"AAGA,SAAS,6CAA6C;AACtD,SAAS,wCAAwC;AACjD,SAAS,oBAAoB;AAE7B,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SACE,wBACA,+BACK;AACP,SAAS,6BAA6B;AACtC,SAAS,uCAAuC;AAChD,SAAS,wBAAwB;AACjC,SACE,6BACA,mDACA,6CACA,kCACA,0CACK;AACP,SACE,sCACA,aACA,uBACK;AACP,SAAS,mBAAmB;AAC5B,SACE,iBACA,2CACK;AACP,SACE,wBACA,mCACK;AACP,SAAS,oCAAoC;AAC7C,SAAS,oBAAoB,gBAAgB;AAQ7C,OAAO,MAAM,sBACX,MACA,aACA,SAaA,UACA,gBAAgB,UACa;CAC7B,MAAM,WAAW,YAAY,YAAY;CACzC,MAAM,eAAe,QAAQ,gBAAgB,aAAa;CAC1D,MAAM,gCACJ,oCAAoC,QAAQ;CAC9C,IAAI,cAAc;CAClB,IAAI,UAAU,SAAS,aAAa,SAAS;CAC7C,MAAM,oBAAoB,IAAI,KAA+B;CAC7D,MAAM,wBAAwB,IAAI,KAAa;CAC/C,MAAM,0BAA0B,IAAI,KAAa;AAEjD,cAAa,KAAK,mDAAmD;EACnE,MAAM,UAAU,aAAa,KAC3B,4DACM,sCAAsC,SAAS,YAAY,CAClE;AAED,eAAa,KACX,0DACM;AACJ,WAAQ,SAAS,SAAS;IACxB,MAAM,YAAY,KAAK,MAAM,QAAQ,KAAK,MAAM;AAChD,QAAI,KAAK,aAAa,iBAAiB,CAAC,WAAW;AACjD;;IAGF,MAAM,CAAC,WAAW,aAAa,sBAC7B;KACE,UAAU,KAAK;KACf,QAAQ,KAAK;KACd,EACD,UACA,QACD;AAED,QAAI,WAAW;AACb,uBAAkB,IAAI,WAAW,CAAC,WAAW,UAAU,CAAC;AACxD,2BAAsB,IAAI,UAAU;KACpC,MAAM,gBAAgB,UAAU,MAAM,IAAI,CAAC;AAC3C,SAAI,eAAe;AACjB,4BAAsB,IAAI,cAAc;;;KAG5C;IAEL;GACD;AAEF,KAAI,kBAAkB,SAAS,GAAG;AAChC,SAAO;GACL,MAAM;GACN,4BAA4B,IAAI,KAAK;GACrC,YAAY,EAAE;GACd,uBAAuB,EAAE;GACzB,cAAc,EAAE;GACjB;;CAGH,IAAI,kBAAkB,aAAa,KACjC,kDACM,uBAAuB,SAAS,kBAAkB,CACzD;AACD,KAAI,gBAAgB,WAAW,GAAG;AAChC,SAAO;GACL,MAAM;GACN,4BAA4B,IAAI,KAAK;GACrC,YAAY,EAAE;GACd,uBAAuB,EAAE;GACzB,cAAc,EAAE;GACjB;;CAGH,MAAM,wBAAwB,gBAAgB,QAC5C,4BACD;CAED,MAAM,YACJ,sBAAsB,SAAS,IAC3B,aAAa,KAAK,gDAChB,iCACE,aACA,UACA,+BACA,uBACA,QAAQ,eACT,CACF,GACD;EACE,MAAM;EACN,iBAAiB,EAAE;EACnB,kBAAkB,EAAE;EACpB,uBAAuB,EAAE;EACzB,cAAc,EAAE;EACjB;AAEP,KAAI,UAAU,SAAS,aAAa;AAClC,gBAAc,UAAU;AACxB,YAAU,aAAa,KACrB,mDACM,SAAS,aAAa,SAAS,CACtC;AACD,oBAAkB,aAAa,KAC7B,kDACM,uBAAuB,SAAS,kBAAkB,CACzD;;CAGH,MAAM,2BAA2B,UAAU,iBAAiB,KACzD,WACE;EACC,GAAG;EACH,sBAAsB,YACpB,uBAAuB,MAAM,MAAM,GAAG,KAAM,QAAQ;EACvD,EACJ;CACD,MAAM,MAAM,wBAAwB,YAAY;CAChD,MAAM,YAAY,aAAa,KAC7B,qDACM,iBAAiB,QAAQ,CAChC;CACD,MAAM,eAA8B,EAAE;CACtC,MAAM,eAA8B,EAAE;CACtC,MAAM,aAA8B,EAAE;CACtC,MAAM,6BAA6B,IAAI,KAAqB;CAC5D,MAAM,4BAA4B,IAAI,KAA4B;CAClE,MAAM,kCAAkC,IAAI,KAGzC;AACH,WAAU,gBAAgB,SAAS,SACjC,sBAAsB,IAAI,KAAK,CAChC;AAED,cAAa,KAAK,sDAAsD;AACtE,kBAAgB,SAAS,OAAO,QAAQ;GACtC,MAAM,SAAS,YACb,OACA,aACA,KACA,UACA,0BACA,MAAM,wBACP;AACD,OAAI,CAAC,QAAQ;AACX;;GAGF,MAAM,UAAU,gBACd,MAAM,kBACN,QACA,MAAM,QACN,MAAM,mBACN,MAAM,WACN,aACA,SACA,aACA,KACA,KACA,gBAAgB,SAAS,MAAM,UAAU,EACzC,WACA,aACD;AAED,OAAI,CAAC,SAAS;AACZ;;GAGF,MAAM,EAAE,YAAY,cAAc;GAElC,MAAM,QAAQ,YAAY,MAAM,UAAU;AAC1C,OAAI,OAAO,SAAS,sBAAsB;IACxC,MAAM,EAAE,OAAO;AACf,QAAI,UAAU,GAAG,IAAI,GAAG,SAAS,cAAc;AAC7C,6BAAwB,IAAI,GAAG,KAAK;AACpC,+BAA0B,IAAI,GAAG,MAAM,UAAU;;;;;;KAMjD,MAAM,kBAAkB,gCAAgC,UAAU;AAClE,SAAI,iBAAiB;AACnB,iCAA2B,IAAI,GAAG,MAAM,gBAAgB;YACnD;MACL,MAAM,cAAc,UAAU;AAI9B,WACG,aAAa,SAAS,mBACrB,aAAa,SAAS,cACxB,OAAO,YAAY,UAAU,UAC7B;AACA,kCAA2B,IAAI,GAAG,MAAM,UAAU,UAAU;;;;;GAMpE,MAAM,iBAAiB,mCACrB,MAAM,UACP;AACD,OAAI,gBAAgB;IAClB,MAAM,WAAW,gCAAgC,IAC/C,eAAe,UAChB;IACD,MAAM,SAAS,YAAY;KACzB,YAAY,IAAI,KAA4B;KAC5C,eAAe,eAAe;KAC/B;AAED,WAAO,WAAW,IAAI,eAAe,cAAc,UAAU;AAC7D,oCAAgC,IAAI,eAAe,WAAW,OAAO;;AAGvE,cAAW,KAAK,UAAU;AAC1B,YAAS,UAAU;AACnB,gBAAa,KAAK,GAAG,WAAW,iBAAiB,CAAC;IAClD;GACF;CACF,MAAM,uCACJ,4CACE,2BACA,UAAU,iBACX;CACH,MAAM,6CACJ,kDACE,iCACA,2BACA,UAAU,iBACX;AACH,4CAA2C,SAAS,OAAO,UAAU;AACnE,uCAAqC,IAAI,OAAO,MAAM;GACtD;CAEF,MAAM,eAAe,qBAAqB,aAAa,aAAa;CACpE,MAAM,6BACJ,iCAAiC,aAAa;CAChD,MAAM,wBAAwB,UAAU,sBAAsB,QAC3D,cACC,UAAU,QAAQ,SAAS,KAC3B,CAAC,2BAA2B,IAAI,UAAU,KAAK,CAClD;CACD,MAAM,gCAAgC,qCACpC,UAAU,kBACV,qCACD;CACD,MAAM,uBAAuB,mBAC3B,cACA,SACA,aACD;AAED,QAAO;EACL,MAAM,gBACF,aAAa,KAAK,mDAChB,6BACE,sBACA,UACA,uBACA,IAAI,IAAI,CAAC,GAAG,yBAAyB,GAAG,UAAU,gBAAgB,CAAC,EACnE,QAAQ,kCAAkC,IAAI,KAAK,EACnD,QAAQ,uCACN,QAAQ,kCACR,IAAI,KAAK,CACZ,CACF,GACD;EACJ;EACA;EACA,uBAAuB,4BACrB,uBACA,qCACD;EACD,cAAc,CAAC,GAAG,UAAU,cAAc,GAAG,8BAA8B;EAC5E","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"}
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 | 'processors'\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"}
@@ -1 +1 @@
1
- {"mappings":"AAAA,SAAS,eAAe,wBAAwB;AAShD,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAQlC,IAAI,4BAA4B;AAChC,OAAO,MAAM,qBAAqB,gBAChC,YAAY,SAAS;AAEvB,OAAO,MAAM,uCACX,aACa,QAAQ,MAAM,YAAY,cAAc;AAEvD,OAAO,MAAM,mBACX,kBACA,QACA,QACA,mBACA,WACA,aACA,SAIA,MACA,KACA,KACA,cACA,WACA,iBAC4B;CAC5B,MAAM,CAAC,WAAW,aAAa;CAC/B,MAAM,aAAa,oBAAoB,UAAU;CAEjD,MAAM,YACJ,aAGA,WACG;EACH,MAAM,OACJ,OAAO,gBAAgB,aAAa,YAAY,OAAO,GAAG;EAC5D,MAAM,kBAAkB,iBAAiB,KAAK;AAC9C,eAAa,KAAK;GAChB,OAAO,kBAAkB;GACzB,KAAK,kBAAkB;GACvB,OACE,UAAU,kBAAkB,KAAK,GAC7B,gBAAgB,oBAChB;GACP,CAAC;;AAGJ,KAAI;EACF,IAAI;AACJ,MAAI;AACF,iBAAc,eAAe,WAAW,KAAK,MAAM,YAAY,SAAS;WACjE,OAAO;AACd,OACE,iBAAiB,SACjB,MAAM,QAAQ,WAAW,8CAA8C,EACvE;IACA,IAAI,kBAAwB;AAC5B,QAAI,OAAO,SAAS,4BAA4B;AAC9C,uBAAkB,OAAO;eAChB,OAAO,SAAS,kBAAkB;AAC3C,uBAAkB,OAAO;;IAE3B,MAAM,cACJ,gBAAgB,SAAS,qBACrB,kBAAkB,gBAAgB,IAAI,kBACtC;AACN,UAAM,uBACJ,MACA,kBACE,YAAY,OACZ,YAAY,KACZ,KACA,YAAY,SACb,EACD,MAAM,QACP;;AAEH,SAAM;;AAGR,SAAO;GACL;GACA,WAAW,IAAI,UACb,QACA,WACA,YACA,kBAAkB,OAAO,OAAO,OAAO,KAAK,KAAK,YAAY,SAAS,EACtE,UACA,aACA,cACA,KACA,SACA,YACD;GACF;UACM,GAAG;AACV,MAAI,MAAM,cAAc,MAAM;AAC5B,UAAO;;AAGT,MACE,OAAO,MAAM,YACb,EAAE,gBAAgB,cAAc,KAAK,aACrC;AACA,OAAI,CAAC,2BAA2B;AAC9B,gCAA4B;;AAE5B,YAAQ,KACN;KACE;KACA;KACA;KACD,CAAC,KAAK,KAAK,CACb;;AAGH,UAAO;;AAGT,QAAM","names":[],"sources":["../../../src/utils/applyOxcProcessors/processorFactory.ts"],"version":3,"sourcesContent":["import { BaseProcessor, expressionToCode } from '@wyw-in-js/processor-utils';\nimport type {\n Expression as ProcessorExpression,\n IFileContext,\n Params,\n} from '@wyw-in-js/processor-utils';\nimport type { StrictOptions } from '@wyw-in-js/shared';\nimport type { Expression, Node } from 'oxc-parser';\n\nimport { createOxcAstService } from '../oxcAstService';\nimport { buildOxcCodeFrameError } from '../oxc/sourceLocations';\nimport { getDisplayName } from './displayName';\nimport { getRootIdentifier } from './processorUsages';\nimport { getSourceLocation } from './shared';\nimport type {\n CreatedProcessor,\n DefinedProcessor,\n LocationLookup,\n Replacement,\n} from './types';\n\nlet didWarnSkipSymbolMismatch = false;\nexport const isReplacementPure = (replacement: ProcessorExpression): boolean =>\n replacement.type === 'CallExpression';\n\nexport const shouldCollectStaticExpressionValues = (\n options: Pick<StrictOptions, 'eval'>\n): boolean => (options.eval?.strategy ?? 'hybrid') !== 'execute';\n\nexport const createProcessor = (\n definedProcessor: DefinedProcessor,\n params: Params,\n target: Expression,\n replacementTarget: Expression,\n ancestors: Node[],\n fileContext: IFileContext,\n options: Pick<\n StrictOptions,\n 'classNameSlug' | 'displayName' | 'extensions' | 'tagResolver'\n >,\n code: string,\n loc: LocationLookup,\n idx: number,\n isReferenced: boolean,\n usedNames: Set<string>,\n replacements: Replacement[]\n): CreatedProcessor | null => {\n const [Processor, tagSource] = definedProcessor;\n const astService = createOxcAstService(usedNames);\n\n const replacer = (\n replacement:\n | ProcessorExpression\n | ((tagPath: unknown) => ProcessorExpression),\n isPure: boolean\n ) => {\n const next =\n typeof replacement === 'function' ? replacement(target) : replacement;\n const replacementCode = expressionToCode(next);\n replacements.push({\n start: replacementTarget.start,\n end: replacementTarget.end,\n value:\n isPure && isReplacementPure(next)\n ? `/*#__PURE__*/${replacementCode}`\n : replacementCode,\n });\n };\n\n try {\n let displayName: string;\n try {\n displayName = getDisplayName(ancestors, idx, code, fileContext.filename);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.startsWith(\"Couldn't determine a name for the component\")\n ) {\n let displayNameNode: Node = target;\n if (target.type === 'TaggedTemplateExpression') {\n displayNameNode = target.tag;\n } else if (target.type === 'CallExpression') {\n displayNameNode = target.callee;\n }\n const pointerNode =\n displayNameNode.type === 'MemberExpression'\n ? getRootIdentifier(displayNameNode) ?? displayNameNode\n : displayNameNode;\n throw buildOxcCodeFrameError(\n code,\n getSourceLocation(\n pointerNode.start,\n pointerNode.end,\n loc,\n fileContext.filename\n ),\n error.message\n );\n }\n throw error;\n }\n\n return {\n astService,\n processor: new Processor(\n params,\n tagSource,\n astService,\n getSourceLocation(target.start, target.end, loc, fileContext.filename),\n replacer,\n displayName,\n isReferenced,\n idx,\n options,\n fileContext\n ),\n };\n } catch (e) {\n if (e === BaseProcessor.SKIP) {\n return null;\n }\n\n if (\n typeof e === 'symbol' &&\n e.description === BaseProcessor.SKIP.description\n ) {\n if (!didWarnSkipSymbolMismatch) {\n didWarnSkipSymbolMismatch = true;\n // eslint-disable-next-line no-console\n console.warn(\n [\n \"[wyw-in-js] Processor threw Symbol('skip') that does not match BaseProcessor.SKIP identity.\",\n 'This usually means duplicate copies of @wyw-in-js/processor-utils (or the processor) are bundled/installed.',\n 'Consider deduping dependencies to avoid subtle issues (instanceof checks, sentinels, etc).',\n ].join('\\n')\n );\n }\n\n return null;\n }\n\n throw e;\n }\n};\n"],"file":"processorFactory.js"}
1
+ {"mappings":"AAAA,SAAS,eAAe,wBAAwB;AAShD,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAQlC,IAAI,4BAA4B;AAChC,OAAO,MAAM,qBAAqB,gBAChC,YAAY,SAAS;AAEvB,OAAO,MAAM,uCACX,aACa,QAAQ,MAAM,YAAY,cAAc;AAEvD,OAAO,MAAM,mBACX,kBACA,QACA,QACA,mBACA,WACA,aACA,SAQA,MACA,KACA,KACA,cACA,WACA,iBAC4B;CAC5B,MAAM,CAAC,WAAW,aAAa;CAC/B,MAAM,aAAa,oBAAoB,UAAU;CAEjD,MAAM,YACJ,aAGA,WACG;EACH,MAAM,OACJ,OAAO,gBAAgB,aAAa,YAAY,OAAO,GAAG;EAC5D,MAAM,kBAAkB,iBAAiB,KAAK;AAC9C,eAAa,KAAK;GAChB,OAAO,kBAAkB;GACzB,KAAK,kBAAkB;GACvB,OACE,UAAU,kBAAkB,KAAK,GAC7B,gBAAgB,oBAChB;GACP,CAAC;;AAGJ,KAAI;EACF,IAAI;AACJ,MAAI;AACF,iBAAc,eAAe,WAAW,KAAK,MAAM,YAAY,SAAS;WACjE,OAAO;AACd,OACE,iBAAiB,SACjB,MAAM,QAAQ,WAAW,8CAA8C,EACvE;IACA,IAAI,kBAAwB;AAC5B,QAAI,OAAO,SAAS,4BAA4B;AAC9C,uBAAkB,OAAO;eAChB,OAAO,SAAS,kBAAkB;AAC3C,uBAAkB,OAAO;;IAE3B,MAAM,cACJ,gBAAgB,SAAS,qBACrB,kBAAkB,gBAAgB,IAAI,kBACtC;AACN,UAAM,uBACJ,MACA,kBACE,YAAY,OACZ,YAAY,KACZ,KACA,YAAY,SACb,EACD,MAAM,QACP;;AAEH,SAAM;;AAGR,SAAO;GACL;GACA,WAAW,IAAI,UACb,QACA,WACA,YACA,kBAAkB,OAAO,OAAO,OAAO,KAAK,KAAK,YAAY,SAAS,EACtE,UACA,aACA,cACA,KACA,SACA,YACD;GACF;UACM,GAAG;AACV,MAAI,MAAM,cAAc,MAAM;AAC5B,UAAO;;AAGT,MACE,OAAO,MAAM,YACb,EAAE,gBAAgB,cAAc,KAAK,aACrC;AACA,OAAI,CAAC,2BAA2B;AAC9B,gCAA4B;;AAE5B,YAAQ,KACN;KACE;KACA;KACA;KACD,CAAC,KAAK,KAAK,CACb;;AAGH,UAAO;;AAGT,QAAM","names":[],"sources":["../../../src/utils/applyOxcProcessors/processorFactory.ts"],"version":3,"sourcesContent":["import { BaseProcessor, expressionToCode } from '@wyw-in-js/processor-utils';\nimport type {\n Expression as ProcessorExpression,\n IFileContext,\n Params,\n} from '@wyw-in-js/processor-utils';\nimport type { StrictOptions } from '@wyw-in-js/shared';\nimport type { Expression, Node } from 'oxc-parser';\n\nimport { createOxcAstService } from '../oxcAstService';\nimport { buildOxcCodeFrameError } from '../oxc/sourceLocations';\nimport { getDisplayName } from './displayName';\nimport { getRootIdentifier } from './processorUsages';\nimport { getSourceLocation } from './shared';\nimport type {\n CreatedProcessor,\n DefinedProcessor,\n LocationLookup,\n Replacement,\n} from './types';\n\nlet didWarnSkipSymbolMismatch = false;\nexport const isReplacementPure = (replacement: ProcessorExpression): boolean =>\n replacement.type === 'CallExpression';\n\nexport const shouldCollectStaticExpressionValues = (\n options: Pick<StrictOptions, 'eval'>\n): boolean => (options.eval?.strategy ?? 'hybrid') !== 'execute';\n\nexport const createProcessor = (\n definedProcessor: DefinedProcessor,\n params: Params,\n target: Expression,\n replacementTarget: Expression,\n ancestors: Node[],\n fileContext: IFileContext,\n options: Pick<\n StrictOptions,\n | 'classNameSlug'\n | 'displayName'\n | 'extensions'\n | 'processors'\n | 'tagResolver'\n >,\n code: string,\n loc: LocationLookup,\n idx: number,\n isReferenced: boolean,\n usedNames: Set<string>,\n replacements: Replacement[]\n): CreatedProcessor | null => {\n const [Processor, tagSource] = definedProcessor;\n const astService = createOxcAstService(usedNames);\n\n const replacer = (\n replacement:\n | ProcessorExpression\n | ((tagPath: unknown) => ProcessorExpression),\n isPure: boolean\n ) => {\n const next =\n typeof replacement === 'function' ? replacement(target) : replacement;\n const replacementCode = expressionToCode(next);\n replacements.push({\n start: replacementTarget.start,\n end: replacementTarget.end,\n value:\n isPure && isReplacementPure(next)\n ? `/*#__PURE__*/${replacementCode}`\n : replacementCode,\n });\n };\n\n try {\n let displayName: string;\n try {\n displayName = getDisplayName(ancestors, idx, code, fileContext.filename);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.startsWith(\"Couldn't determine a name for the component\")\n ) {\n let displayNameNode: Node = target;\n if (target.type === 'TaggedTemplateExpression') {\n displayNameNode = target.tag;\n } else if (target.type === 'CallExpression') {\n displayNameNode = target.callee;\n }\n const pointerNode =\n displayNameNode.type === 'MemberExpression'\n ? getRootIdentifier(displayNameNode) ?? displayNameNode\n : displayNameNode;\n throw buildOxcCodeFrameError(\n code,\n getSourceLocation(\n pointerNode.start,\n pointerNode.end,\n loc,\n fileContext.filename\n ),\n error.message\n );\n }\n throw error;\n }\n\n return {\n astService,\n processor: new Processor(\n params,\n tagSource,\n astService,\n getSourceLocation(target.start, target.end, loc, fileContext.filename),\n replacer,\n displayName,\n isReferenced,\n idx,\n options,\n fileContext\n ),\n };\n } catch (e) {\n if (e === BaseProcessor.SKIP) {\n return null;\n }\n\n if (\n typeof e === 'symbol' &&\n e.description === BaseProcessor.SKIP.description\n ) {\n if (!didWarnSkipSymbolMismatch) {\n didWarnSkipSymbolMismatch = true;\n // eslint-disable-next-line no-console\n console.warn(\n [\n \"[wyw-in-js] Processor threw Symbol('skip') that does not match BaseProcessor.SKIP identity.\",\n 'This usually means duplicate copies of @wyw-in-js/processor-utils (or the processor) are bundled/installed.',\n 'Consider deduping dependencies to avoid subtle issues (instanceof checks, sentinels, etc).',\n ].join('\\n')\n );\n }\n\n return null;\n }\n\n throw e;\n }\n};\n"],"file":"processorFactory.js"}
@@ -1,16 +1,6 @@
1
- /* eslint-disable no-restricted-syntax */
2
- import { parseSync } from "oxc-parser";
1
+ import { parseOxcProgramCached } from "../parseOxc.js";
3
2
  const parseOxc = (code, filename) => {
4
- const parsed = parseSync(filename, code, {
5
- astType: filename.endsWith(".ts") || filename.endsWith(".tsx") ? "ts" : "js",
6
- range: true,
7
- sourceType: "module"
8
- });
9
- const fatalError = parsed.errors.find((error) => error.severity === "Error");
10
- if (fatalError) {
11
- throw new Error(fatalError.message);
12
- }
13
- return parsed.program;
3
+ return parseOxcProgramCached(filename, code, "module");
14
4
  };
15
5
  const applyReplacements = (code, replacements) => {
16
6
  let result = code;
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../../../src/utils/collectOxcRuntime/normalizeRuntimeCode.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax */\n\nimport { parseSync } from 'oxc-parser';\nimport type { Node, Program } from 'oxc-parser';\n\nimport type { RuntimeReplacement } from './types';\n\ntype AnyNode = Node & Record<string, unknown>;\ntype AnyProperty = AnyNode & {\n computed?: boolean;\n key: Node;\n kind?: string;\n method?: boolean;\n value: Node;\n};\n\nconst parseOxc = (code: string, filename: string): Program => {\n const parsed = parseSync(filename, code, {\n astType:\n filename.endsWith('.ts') || filename.endsWith('.tsx') ? 'ts' : 'js',\n range: true,\n sourceType: 'module',\n });\n const fatalError = parsed.errors.find((error) => error.severity === 'Error');\n if (fatalError) {\n throw new Error(fatalError.message);\n }\n\n return parsed.program as Program;\n};\n\nconst applyReplacements = (\n code: string,\n replacements: RuntimeReplacement[]\n): string => {\n let result = code;\n replacements\n .sort((a, b) => b.start - a.start)\n .forEach((replacement) => {\n result =\n result.slice(0, replacement.start) +\n replacement.value +\n result.slice(replacement.end);\n });\n\n return result;\n};\n\nconst shouldTerminateWithSemicolon = (\n node: Node,\n parent: Node | null,\n key: string | null\n): boolean => {\n if (node.type === 'VariableDeclaration' && parent) {\n if (\n (parent.type === 'ForStatement' ||\n parent.type === 'ForInStatement' ||\n parent.type === 'ForOfStatement') &&\n key &&\n ['init', 'left'].includes(key)\n ) {\n return false;\n }\n\n if (parent.type === 'ExportNamedDeclaration') {\n return false;\n }\n }\n\n if (\n node.type === 'ImportDeclaration' ||\n node.type === 'ExpressionStatement' ||\n node.type === 'ReturnStatement' ||\n node.type === 'ThrowStatement' ||\n node.type === 'VariableDeclaration'\n ) {\n return true;\n }\n\n if (node.type === 'ExportNamedDeclaration') {\n if (node.declaration) {\n return node.declaration.type === 'VariableDeclaration';\n }\n\n return Array.isArray(node.specifiers) && node.specifiers.length > 0;\n }\n\n return false;\n};\n\nconst getChildren = (node: Node): Array<{ key: string | null; node: Node }> => {\n const result: Array<{ key: string | null; node: Node }> = [];\n const record = node as Node & Record<string, unknown>;\n\n Object.keys(record).forEach((key) => {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'range') {\n return;\n }\n\n const value = record[key];\n if (value && typeof value === 'object' && 'type' in (value as object)) {\n result.push({ key, node: value as Node });\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item) => {\n if (item && typeof item === 'object' && 'type' in (item as object)) {\n result.push({ key, node: item as Node });\n }\n });\n }\n });\n\n return result;\n};\n\nconst getLineIndent = (code: string, offset: number): string => {\n const lineStart = code.lastIndexOf('\\n', offset - 1) + 1;\n let idx = lineStart;\n while (idx < code.length && (code[idx] === ' ' || code[idx] === '\\t')) {\n idx += 1;\n }\n\n return code.slice(lineStart, idx).replace(/\\t/g, ' ');\n};\n\nconst isPlainObjectProperty = (property: Node): property is AnyProperty =>\n property.type === 'Property' &&\n (property as AnyProperty).kind === 'init' &&\n (property as AnyProperty).method !== true;\n\nconst isFormattableObjectExpression = (node: Node): boolean =>\n node.type === 'ObjectExpression' &&\n node.properties.every(\n (property) =>\n property.type === 'SpreadElement' || isPlainObjectProperty(property)\n );\n\nconst hasNestedObjectValue = (node: Node): boolean =>\n node.type === 'ObjectExpression' &&\n node.properties.some(\n (property) =>\n isPlainObjectProperty(property) &&\n property.value.type === 'ObjectExpression'\n );\n\nconst printFormattedObjectExpression = (\n node: Node,\n code: string,\n baseIndent: string\n): string => {\n if (\n node.type !== 'ObjectExpression' ||\n node.properties.length === 0 ||\n !isFormattableObjectExpression(node)\n ) {\n return code.slice(node.start, node.end);\n }\n\n const lines = node.properties.map((property) => {\n if (property.type === 'SpreadElement') {\n return `${baseIndent} ...${code.slice(\n property.argument.start,\n property.argument.end\n )}`;\n }\n\n const keySource = property.computed\n ? `[${code.slice(property.key.start, property.key.end)}]`\n : code.slice(property.key.start, property.key.end);\n const valueSource =\n property.value.type === 'ObjectExpression'\n ? printFormattedObjectExpression(\n property.value,\n code,\n `${baseIndent} `\n )\n : code.slice(property.value.start, property.value.end).trim();\n\n return `${baseIndent} ${keySource}: ${valueSource}`;\n });\n\n return `{\\n${lines.join(',\\n')}\\n${baseIndent}}`;\n};\n\nconst formatRuntimeObjectLiterals = (\n code: string,\n filename: string\n): string => {\n const replacements: RuntimeReplacement[] = [];\n\n const walk = (node: Node, parent: Node | null = null): void => {\n if (node.type === 'ObjectExpression') {\n const shouldFormat =\n (parent?.type === 'VariableDeclarator' && hasNestedObjectValue(node)) ||\n parent?.type === 'CallExpression';\n\n if (shouldFormat) {\n replacements.push({\n end: node.end,\n start: node.start,\n value: printFormattedObjectExpression(\n node,\n code,\n getLineIndent(code, node.start)\n ),\n });\n return;\n }\n }\n\n getChildren(node).forEach((child) => walk(child.node, node));\n };\n\n walk(parseOxc(code, filename));\n return replacements.length > 0 ? applyReplacements(code, replacements) : code;\n};\n\nconst collapseRuntimeBlankLines = (code: string): string => {\n const lines = code.split('\\n');\n const result: string[] = [];\n\n for (let idx = 0; idx < lines.length; idx += 1) {\n const line = lines[idx]!;\n if (line.trim() !== '') {\n result.push(line);\n } else {\n let nextIdx = idx;\n while (nextIdx < lines.length && lines[nextIdx]?.trim() === '') {\n nextIdx += 1;\n }\n\n const previousNonEmpty = [...result]\n .reverse()\n .find((entry) => entry.trim() !== '');\n const nextNonEmpty = lines\n .slice(nextIdx)\n .find((entry) => entry.trim() !== '');\n\n if (previousNonEmpty && nextNonEmpty) {\n const trimmedPrevious = previousNonEmpty.trim();\n if (\n trimmedPrevious.startsWith('//') ||\n trimmedPrevious.endsWith('*/')\n ) {\n result.push('');\n }\n }\n\n idx = nextIdx - 1;\n }\n }\n\n return result.join('\\n');\n};\n\nconst ensureBlankLineAfterLeadingBlockComment = (code: string): string =>\n code.replace(/^(\\/\\*[\\s\\S]*?\\*\\/)\\n(?!\\n)/, '$1\\n\\n');\n\nconst insertMissingSemicolons = (code: string, filename: string): string => {\n const replacements: RuntimeReplacement[] = [];\n const hasTrailingSemicolon = (node: Node): boolean =>\n code.slice(node.start, node.end).trimEnd().endsWith(';');\n\n const walk = (\n node: Node,\n parent: Node | null = null,\n key: string | null = null\n ): void => {\n if (\n shouldTerminateWithSemicolon(node, parent, key) &&\n !hasTrailingSemicolon(node)\n ) {\n replacements.push({\n end: node.end,\n start: node.end,\n value: ';',\n });\n }\n\n getChildren(node).forEach((child) => walk(child.node, node, child.key));\n };\n\n walk(parseOxc(code, filename));\n return replacements.length > 0 ? applyReplacements(code, replacements) : code;\n};\n\nexport const normalizeRuntimeCode = (code: string, filename: string): string =>\n insertMissingSemicolons(\n ensureBlankLineAfterLeadingBlockComment(\n collapseRuntimeBlankLines(\n formatRuntimeObjectLiterals(\n code\n .replace(/^\\n+/, '')\n .replace(/\\n+$/, '')\n .replace(/[ \\t]+\\n/g, '\\n'),\n filename\n )\n )\n ),\n filename\n );\n"],"file":"normalizeRuntimeCode.js"}
1
+ {"mappings":"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","names":[],"sources":["../../../src/utils/collectOxcRuntime/normalizeRuntimeCode.ts"],"version":3,"sourcesContent":["/* eslint-disable no-restricted-syntax */\n\nimport type { Node, Program } from 'oxc-parser';\n\nimport { parseOxcProgramCached } from '../parseOxc';\nimport type { RuntimeReplacement } from './types';\n\ntype AnyNode = Node & Record<string, unknown>;\ntype AnyProperty = AnyNode & {\n computed?: boolean;\n key: Node;\n kind?: string;\n method?: boolean;\n value: Node;\n};\n\nconst parseOxc = (code: string, filename: string): Program => {\n return parseOxcProgramCached(filename, code, 'module');\n};\n\nconst applyReplacements = (\n code: string,\n replacements: RuntimeReplacement[]\n): string => {\n let result = code;\n replacements\n .sort((a, b) => b.start - a.start)\n .forEach((replacement) => {\n result =\n result.slice(0, replacement.start) +\n replacement.value +\n result.slice(replacement.end);\n });\n\n return result;\n};\n\nconst shouldTerminateWithSemicolon = (\n node: Node,\n parent: Node | null,\n key: string | null\n): boolean => {\n if (node.type === 'VariableDeclaration' && parent) {\n if (\n (parent.type === 'ForStatement' ||\n parent.type === 'ForInStatement' ||\n parent.type === 'ForOfStatement') &&\n key &&\n ['init', 'left'].includes(key)\n ) {\n return false;\n }\n\n if (parent.type === 'ExportNamedDeclaration') {\n return false;\n }\n }\n\n if (\n node.type === 'ImportDeclaration' ||\n node.type === 'ExpressionStatement' ||\n node.type === 'ReturnStatement' ||\n node.type === 'ThrowStatement' ||\n node.type === 'VariableDeclaration'\n ) {\n return true;\n }\n\n if (node.type === 'ExportNamedDeclaration') {\n if (node.declaration) {\n return node.declaration.type === 'VariableDeclaration';\n }\n\n return Array.isArray(node.specifiers) && node.specifiers.length > 0;\n }\n\n return false;\n};\n\nconst getChildren = (node: Node): Array<{ key: string | null; node: Node }> => {\n const result: Array<{ key: string | null; node: Node }> = [];\n const record = node as Node & Record<string, unknown>;\n\n Object.keys(record).forEach((key) => {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'range') {\n return;\n }\n\n const value = record[key];\n if (value && typeof value === 'object' && 'type' in (value as object)) {\n result.push({ key, node: value as Node });\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item) => {\n if (item && typeof item === 'object' && 'type' in (item as object)) {\n result.push({ key, node: item as Node });\n }\n });\n }\n });\n\n return result;\n};\n\nconst getLineIndent = (code: string, offset: number): string => {\n const lineStart = code.lastIndexOf('\\n', offset - 1) + 1;\n let idx = lineStart;\n while (idx < code.length && (code[idx] === ' ' || code[idx] === '\\t')) {\n idx += 1;\n }\n\n return code.slice(lineStart, idx).replace(/\\t/g, ' ');\n};\n\nconst isPlainObjectProperty = (property: Node): property is AnyProperty =>\n property.type === 'Property' &&\n (property as AnyProperty).kind === 'init' &&\n (property as AnyProperty).method !== true;\n\nconst isFormattableObjectExpression = (node: Node): boolean =>\n node.type === 'ObjectExpression' &&\n node.properties.every(\n (property) =>\n property.type === 'SpreadElement' || isPlainObjectProperty(property)\n );\n\nconst hasNestedObjectValue = (node: Node): boolean =>\n node.type === 'ObjectExpression' &&\n node.properties.some(\n (property) =>\n isPlainObjectProperty(property) &&\n property.value.type === 'ObjectExpression'\n );\n\nconst printFormattedObjectExpression = (\n node: Node,\n code: string,\n baseIndent: string\n): string => {\n if (\n node.type !== 'ObjectExpression' ||\n node.properties.length === 0 ||\n !isFormattableObjectExpression(node)\n ) {\n return code.slice(node.start, node.end);\n }\n\n const lines = node.properties.map((property) => {\n if (property.type === 'SpreadElement') {\n return `${baseIndent} ...${code.slice(\n property.argument.start,\n property.argument.end\n )}`;\n }\n\n const keySource = property.computed\n ? `[${code.slice(property.key.start, property.key.end)}]`\n : code.slice(property.key.start, property.key.end);\n const valueSource =\n property.value.type === 'ObjectExpression'\n ? printFormattedObjectExpression(\n property.value,\n code,\n `${baseIndent} `\n )\n : code.slice(property.value.start, property.value.end).trim();\n\n return `${baseIndent} ${keySource}: ${valueSource}`;\n });\n\n return `{\\n${lines.join(',\\n')}\\n${baseIndent}}`;\n};\n\nconst formatRuntimeObjectLiterals = (\n code: string,\n filename: string\n): string => {\n const replacements: RuntimeReplacement[] = [];\n\n const walk = (node: Node, parent: Node | null = null): void => {\n if (node.type === 'ObjectExpression') {\n const shouldFormat =\n (parent?.type === 'VariableDeclarator' && hasNestedObjectValue(node)) ||\n parent?.type === 'CallExpression';\n\n if (shouldFormat) {\n replacements.push({\n end: node.end,\n start: node.start,\n value: printFormattedObjectExpression(\n node,\n code,\n getLineIndent(code, node.start)\n ),\n });\n return;\n }\n }\n\n getChildren(node).forEach((child) => walk(child.node, node));\n };\n\n walk(parseOxc(code, filename));\n return replacements.length > 0 ? applyReplacements(code, replacements) : code;\n};\n\nconst collapseRuntimeBlankLines = (code: string): string => {\n const lines = code.split('\\n');\n const result: string[] = [];\n\n for (let idx = 0; idx < lines.length; idx += 1) {\n const line = lines[idx]!;\n if (line.trim() !== '') {\n result.push(line);\n } else {\n let nextIdx = idx;\n while (nextIdx < lines.length && lines[nextIdx]?.trim() === '') {\n nextIdx += 1;\n }\n\n const previousNonEmpty = [...result]\n .reverse()\n .find((entry) => entry.trim() !== '');\n const nextNonEmpty = lines\n .slice(nextIdx)\n .find((entry) => entry.trim() !== '');\n\n if (previousNonEmpty && nextNonEmpty) {\n const trimmedPrevious = previousNonEmpty.trim();\n if (\n trimmedPrevious.startsWith('//') ||\n trimmedPrevious.endsWith('*/')\n ) {\n result.push('');\n }\n }\n\n idx = nextIdx - 1;\n }\n }\n\n return result.join('\\n');\n};\n\nconst ensureBlankLineAfterLeadingBlockComment = (code: string): string =>\n code.replace(/^(\\/\\*[\\s\\S]*?\\*\\/)\\n(?!\\n)/, '$1\\n\\n');\n\nconst insertMissingSemicolons = (code: string, filename: string): string => {\n const replacements: RuntimeReplacement[] = [];\n const hasTrailingSemicolon = (node: Node): boolean =>\n code.slice(node.start, node.end).trimEnd().endsWith(';');\n\n const walk = (\n node: Node,\n parent: Node | null = null,\n key: string | null = null\n ): void => {\n if (\n shouldTerminateWithSemicolon(node, parent, key) &&\n !hasTrailingSemicolon(node)\n ) {\n replacements.push({\n end: node.end,\n start: node.end,\n value: ';',\n });\n }\n\n getChildren(node).forEach((child) => walk(child.node, node, child.key));\n };\n\n walk(parseOxc(code, filename));\n return replacements.length > 0 ? applyReplacements(code, replacements) : code;\n};\n\nexport const normalizeRuntimeCode = (code: string, filename: string): string =>\n insertMissingSemicolons(\n ensureBlankLineAfterLeadingBlockComment(\n collapseRuntimeBlankLines(\n formatRuntimeObjectLiterals(\n code\n .replace(/^\\n+/, '')\n .replace(/\\n+$/, '')\n .replace(/[ \\t]+\\n/g, '\\n'),\n filename\n )\n )\n ),\n filename\n );\n"],"file":"normalizeRuntimeCode.js"}
@@ -1 +1 @@
1
- {"mappings":"","names":[],"sources":["../../../src/utils/collectOxcRuntime/types.ts"],"version":3,"sourcesContent":["import type { StrictOptions } from '@wyw-in-js/shared';\nimport type { RawSourceMap } from 'source-map';\n\nimport type { WYWTransformMetadata } from '../TransformMetadata';\n\nexport type OxcCollectOptions = Pick<\n StrictOptions,\n | 'classNameSlug'\n | 'displayName'\n | 'eval'\n | 'extensions'\n | 'tagResolver'\n | 'variableNameConfig'\n> & {\n preserveSideEffectImportOrderLocals?: Set<string>;\n preserveSideEffectImportLocals?: Set<string>;\n};\n\nexport type OxcCollectResult = {\n code: string;\n map: RawSourceMap;\n metadata: WYWTransformMetadata | null;\n};\n\nexport type RuntimeReplacement = {\n end: number;\n start: number;\n value: string;\n};\n"],"file":"types.js"}
1
+ {"mappings":"","names":[],"sources":["../../../src/utils/collectOxcRuntime/types.ts"],"version":3,"sourcesContent":["import type { StrictOptions } from '@wyw-in-js/shared';\nimport type { RawSourceMap } from 'source-map';\n\nimport type { WYWTransformMetadata } from '../TransformMetadata';\n\nexport type OxcCollectOptions = Pick<\n StrictOptions,\n | 'classNameSlug'\n | 'displayName'\n | 'eval'\n | 'extensions'\n | 'processors'\n | 'tagResolver'\n | 'variableNameConfig'\n> & {\n preserveSideEffectImportOrderLocals?: Set<string>;\n preserveSideEffectImportLocals?: Set<string>;\n};\n\nexport type OxcCollectResult = {\n code: string;\n map: RawSourceMap;\n metadata: WYWTransformMetadata | null;\n};\n\nexport type RuntimeReplacement = {\n end: number;\n start: number;\n value: string;\n};\n"],"file":"types.js"}