@wyw-in-js/transform 2.0.0-alpha.0 → 2.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/cache.js +7 -0
- package/esm/cache.js.map +1 -1
- package/esm/debug/fileReporter.js +35 -1
- package/esm/debug/fileReporter.js.map +1 -1
- package/esm/eval/broker.js +230 -89
- package/esm/eval/broker.js.map +1 -1
- package/esm/eval/protocol.js.map +1 -1
- package/esm/eval/runner.js +143 -24
- package/esm/eval/runner.js.map +1 -1
- package/esm/module.js +70 -43
- package/esm/module.js.map +1 -1
- package/esm/transform/Entrypoint.types.js.map +1 -1
- package/esm/transform/generators/processEntrypoint.js +35 -20
- package/esm/transform/generators/processEntrypoint.js.map +1 -1
- package/esm/transform/generators/resolveImports.js +48 -2
- package/esm/transform/generators/resolveImports.js.map +1 -1
- package/esm/transform/generators/resolveStaticOxcValues/cache.js +182 -0
- package/esm/transform/generators/resolveStaticOxcValues/cache.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/candidateResolver.js +146 -0
- package/esm/transform/generators/resolveStaticOxcValues/candidateResolver.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/dependencies.js +33 -0
- package/esm/transform/generators/resolveStaticOxcValues/dependencies.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/environment.js +29 -0
- package/esm/transform/generators/resolveStaticOxcValues/environment.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/exportResolver.js +351 -0
- package/esm/transform/generators/resolveStaticOxcValues/exportResolver.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/exportTargets.js +253 -0
- package/esm/transform/generators/resolveStaticOxcValues/exportTargets.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/objectAssign.js +310 -0
- package/esm/transform/generators/resolveStaticOxcValues/objectAssign.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.js +74 -0
- package/esm/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/opaqueRuntime.js +229 -0
- package/esm/transform/generators/resolveStaticOxcValues/opaqueRuntime.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorStaticExport.js +172 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorStaticExport.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorStaticModel.js +476 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorStaticModel.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorTarget.js +55 -0
- package/esm/transform/generators/resolveStaticOxcValues/processorTarget.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/programAnalysis.js +123 -0
- package/esm/transform/generators/resolveStaticOxcValues/programAnalysis.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/prune.js +186 -0
- package/esm/transform/generators/resolveStaticOxcValues/prune.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js +183 -0
- package/esm/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/staticExpression.js +298 -0
- package/esm/transform/generators/resolveStaticOxcValues/staticExpression.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.js +298 -0
- package/esm/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/types.js +3 -0
- package/esm/transform/generators/resolveStaticOxcValues/types.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.js +59 -0
- package/esm/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.js.map +1 -0
- package/esm/transform/generators/resolveStaticOxcValues.js +1 -2910
- package/esm/transform/generators/resolveStaticOxcValues.js.map +1 -1
- package/esm/transform/generators/transform.js +57 -45
- package/esm/transform/generators/transform.js.map +1 -1
- package/esm/transform/helpers/loadWywOptions.js +33 -4
- package/esm/transform/helpers/loadWywOptions.js.map +1 -1
- package/esm/transform.js +3 -1
- package/esm/transform.js.map +1 -1
- package/esm/utils/EventEmitter.js +42 -9
- package/esm/utils/EventEmitter.js.map +1 -1
- package/esm/utils/applyOxcProcessors/applyOxcProcessors.js +160 -0
- package/esm/utils/applyOxcProcessors/applyOxcProcessors.js.map +1 -0
- package/esm/utils/applyOxcProcessors/cleanupBindings.js +157 -0
- package/esm/utils/applyOxcProcessors/cleanupBindings.js.map +1 -0
- package/esm/utils/applyOxcProcessors/cleanupRemovals.js +431 -0
- package/esm/utils/applyOxcProcessors/cleanupRemovals.js.map +1 -0
- package/esm/utils/applyOxcProcessors/displayName.js +93 -0
- package/esm/utils/applyOxcProcessors/displayName.js.map +1 -0
- package/esm/utils/applyOxcProcessors/expressionValues.js +152 -0
- package/esm/utils/applyOxcProcessors/expressionValues.js.map +1 -0
- package/esm/utils/applyOxcProcessors/processorFactory.js +62 -0
- package/esm/utils/applyOxcProcessors/processorFactory.js.map +1 -0
- package/esm/utils/applyOxcProcessors/processorUsages.js +143 -0
- package/esm/utils/applyOxcProcessors/processorUsages.js.map +1 -0
- package/esm/utils/applyOxcProcessors/sameFileStaticValues.js +207 -0
- package/esm/utils/applyOxcProcessors/sameFileStaticValues.js.map +1 -0
- package/esm/utils/applyOxcProcessors/shared.js +29 -0
- package/esm/utils/applyOxcProcessors/shared.js.map +1 -0
- package/esm/utils/applyOxcProcessors/types.js +2 -0
- package/esm/utils/applyOxcProcessors/types.js.map +1 -0
- package/esm/utils/applyOxcProcessors.js +1 -1216
- package/esm/utils/applyOxcProcessors.js.map +1 -1
- package/esm/utils/collectOxcRuntime/normalizeRuntimeCode.js +157 -0
- package/esm/utils/collectOxcRuntime/normalizeRuntimeCode.js.map +1 -0
- package/esm/utils/collectOxcRuntime/sourceMap.js +36 -0
- package/esm/utils/collectOxcRuntime/sourceMap.js.map +1 -0
- package/esm/utils/collectOxcRuntime/types.js +2 -0
- package/esm/utils/collectOxcRuntime/types.js.map +1 -0
- package/esm/utils/collectOxcRuntime.js +5 -193
- package/esm/utils/collectOxcRuntime.js.map +1 -1
- package/esm/utils/collectOxcTemplateDependencies/expressionExtraction.js +496 -0
- package/esm/utils/collectOxcTemplateDependencies/expressionExtraction.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/expressionReplacements.js +113 -0
- package/esm/utils/collectOxcTemplateDependencies/expressionReplacements.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/scopeAnalysis.js +387 -0
- package/esm/utils/collectOxcTemplateDependencies/scopeAnalysis.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/staticBindings.js +17 -0
- package/esm/utils/collectOxcTemplateDependencies/staticBindings.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/staticEvaluator.js +540 -0
- package/esm/utils/collectOxcTemplateDependencies/staticEvaluator.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies/types.js +2 -0
- package/esm/utils/collectOxcTemplateDependencies/types.js.map +1 -0
- package/esm/utils/collectOxcTemplateDependencies.js +3 -1397
- package/esm/utils/collectOxcTemplateDependencies.js.map +1 -1
- package/esm/utils/nativeResolver.js +93 -0
- package/esm/utils/nativeResolver.js.map +1 -0
- package/esm/utils/oxc/ast.js +28 -0
- package/esm/utils/oxc/ast.js.map +1 -0
- package/esm/utils/oxc/parse.js +3 -0
- package/esm/utils/oxc/parse.js.map +1 -0
- package/esm/utils/oxc/replacements.js +14 -0
- package/esm/utils/oxc/replacements.js.map +1 -0
- package/esm/utils/oxc/sourceLocations.js +59 -0
- package/esm/utils/oxc/sourceLocations.js.map +1 -0
- package/esm/utils/oxcPreevalStage/evalStrategy.js +3 -0
- package/esm/utils/oxcPreevalStage/evalStrategy.js.map +1 -0
- package/esm/utils/oxcPreevalStage/prepareCode.js +21 -0
- package/esm/utils/oxcPreevalStage/prepareCode.js.map +1 -0
- package/esm/utils/oxcPreevalStage/prevalExport.js +23 -0
- package/esm/utils/oxcPreevalStage/prevalExport.js.map +1 -0
- package/esm/utils/oxcPreevalStage/processors.js +17 -0
- package/esm/utils/oxcPreevalStage/processors.js.map +1 -0
- package/esm/utils/oxcPreevalStage/staticOverlay.js +18 -0
- package/esm/utils/oxcPreevalStage/staticOverlay.js.map +1 -0
- package/esm/utils/oxcPreevalStage/types.js +2 -0
- package/esm/utils/oxcPreevalStage/types.js.map +1 -0
- package/esm/utils/oxcPreevalStage.js +17 -73
- package/esm/utils/oxcPreevalStage.js.map +1 -1
- package/esm/utils/oxcPreevalTransforms.js +12 -1
- package/esm/utils/oxcPreevalTransforms.js.map +1 -1
- package/esm/utils/processorStaticSemantics.js +157 -0
- package/esm/utils/processorStaticSemantics.js.map +1 -0
- package/esm/utils/resolveWithConditions.js +3 -3
- package/esm/utils/resolveWithConditions.js.map +1 -1
- package/package.json +4 -3
- package/types/cache.js +8 -0
- package/types/debug/fileReporter.js +46 -1
- package/types/eval/broker.d.ts +6 -2
- package/types/eval/broker.js +244 -95
- package/types/eval/protocol.d.ts +15 -1
- package/types/module.d.ts +4 -1
- package/types/module.js +97 -48
- package/types/transform/Entrypoint.types.d.ts +3 -0
- package/types/transform/generators/resolveImports.d.ts +3 -1
- package/types/transform/generators/resolveImports.js +49 -2
- package/types/transform/generators/resolveStaticOxcValues/cache.d.ts +25 -0
- package/types/transform/generators/resolveStaticOxcValues/cache.js +182 -0
- package/types/transform/generators/resolveStaticOxcValues/candidateResolver.d.ts +5 -0
- package/types/transform/generators/resolveStaticOxcValues/candidateResolver.js +149 -0
- package/types/transform/generators/resolveStaticOxcValues/dependencies.d.ts +6 -0
- package/types/transform/generators/resolveStaticOxcValues/dependencies.js +37 -0
- package/types/transform/generators/resolveStaticOxcValues/environment.d.ts +12 -0
- package/types/transform/generators/resolveStaticOxcValues/environment.js +32 -0
- package/types/transform/generators/resolveStaticOxcValues/exportResolver.d.ts +4 -0
- package/types/transform/generators/resolveStaticOxcValues/exportResolver.js +358 -0
- package/types/transform/generators/resolveStaticOxcValues/exportTargets.d.ts +20 -0
- package/types/transform/generators/resolveStaticOxcValues/exportTargets.js +285 -0
- package/types/transform/generators/resolveStaticOxcValues/objectAssign.d.ts +41 -0
- package/types/transform/generators/resolveStaticOxcValues/objectAssign.js +352 -0
- package/types/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.d.ts +6 -0
- package/types/transform/generators/resolveStaticOxcValues/objectAssignStaticExport.js +88 -0
- package/types/transform/generators/resolveStaticOxcValues/opaqueRuntime.d.ts +13 -0
- package/types/transform/generators/resolveStaticOxcValues/opaqueRuntime.js +263 -0
- package/types/transform/generators/resolveStaticOxcValues/processorStaticExport.d.ts +4 -0
- package/types/transform/generators/resolveStaticOxcValues/processorStaticExport.js +191 -0
- package/types/transform/generators/resolveStaticOxcValues/processorStaticModel.d.ts +40 -0
- package/types/transform/generators/resolveStaticOxcValues/processorStaticModel.js +516 -0
- package/types/transform/generators/resolveStaticOxcValues/processorTarget.d.ts +5 -0
- package/types/transform/generators/resolveStaticOxcValues/processorTarget.js +62 -0
- package/types/transform/generators/resolveStaticOxcValues/programAnalysis.d.ts +11 -0
- package/types/transform/generators/resolveStaticOxcValues/programAnalysis.js +133 -0
- package/types/transform/generators/resolveStaticOxcValues/prune.d.ts +15 -0
- package/types/transform/generators/resolveStaticOxcValues/prune.js +220 -0
- package/types/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.d.ts +2 -0
- package/types/transform/generators/resolveStaticOxcValues/resolveStaticOxcPreevalValues.js +197 -0
- package/types/transform/generators/resolveStaticOxcValues/staticExpression.d.ts +25 -0
- package/types/transform/generators/resolveStaticOxcValues/staticExpression.js +391 -0
- package/types/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.d.ts +14 -0
- package/types/transform/generators/resolveStaticOxcValues/staticExpressionDependencies.js +304 -0
- package/types/transform/generators/resolveStaticOxcValues/types.d.ts +99 -0
- package/types/transform/generators/resolveStaticOxcValues/types.js +2 -0
- package/types/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.d.ts +7 -0
- package/types/transform/generators/resolveStaticOxcValues/zeroArgFunctionStaticExport.js +64 -0
- package/types/transform/generators/resolveStaticOxcValues.d.ts +1 -2
- package/types/transform/generators/resolveStaticOxcValues.js +1 -3235
- package/types/transform/generators/transform.js +63 -49
- package/types/transform/helpers/loadWywOptions.js +23 -3
- package/types/transform.js +3 -1
- package/types/utils/EventEmitter.d.ts +16 -1
- package/types/utils/EventEmitter.js +44 -9
- package/types/utils/applyOxcProcessors/applyOxcProcessors.d.ts +8 -0
- package/types/utils/applyOxcProcessors/applyOxcProcessors.js +167 -0
- package/types/utils/applyOxcProcessors/cleanupBindings.d.ts +12 -0
- package/types/utils/applyOxcProcessors/cleanupBindings.js +189 -0
- package/types/utils/applyOxcProcessors/cleanupRemovals.d.ts +16 -0
- package/types/utils/applyOxcProcessors/cleanupRemovals.js +482 -0
- package/types/utils/applyOxcProcessors/displayName.d.ts +9 -0
- package/types/utils/applyOxcProcessors/displayName.js +113 -0
- package/types/utils/applyOxcProcessors/expressionValues.d.ts +11 -0
- package/types/utils/applyOxcProcessors/expressionValues.js +170 -0
- package/types/utils/applyOxcProcessors/processorFactory.d.ts +7 -0
- package/types/utils/applyOxcProcessors/processorFactory.js +70 -0
- package/types/utils/applyOxcProcessors/processorUsages.d.ts +16 -0
- package/types/utils/applyOxcProcessors/processorUsages.js +163 -0
- package/types/utils/applyOxcProcessors/sameFileStaticValues.d.ts +23 -0
- package/types/utils/applyOxcProcessors/sameFileStaticValues.js +211 -0
- package/types/utils/applyOxcProcessors/shared.d.ts +10 -0
- package/types/utils/applyOxcProcessors/shared.js +37 -0
- package/types/utils/applyOxcProcessors/types.d.ts +88 -0
- package/types/utils/applyOxcProcessors/types.js +1 -0
- package/types/utils/applyOxcProcessors.d.ts +1 -16
- package/types/utils/applyOxcProcessors.js +1 -1391
- package/types/utils/collectOxcRuntime/normalizeRuntimeCode.d.ts +1 -0
- package/types/utils/collectOxcRuntime/normalizeRuntimeCode.js +185 -0
- package/types/utils/collectOxcRuntime/sourceMap.d.ts +2 -0
- package/types/utils/collectOxcRuntime/sourceMap.js +37 -0
- package/types/utils/collectOxcRuntime/types.d.ts +16 -0
- package/types/utils/collectOxcRuntime/types.js +1 -0
- package/types/utils/collectOxcRuntime.d.ts +2 -12
- package/types/utils/collectOxcRuntime.js +5 -224
- package/types/utils/collectOxcTemplateDependencies/expressionExtraction.d.ts +6 -0
- package/types/utils/collectOxcTemplateDependencies/expressionExtraction.js +550 -0
- package/types/utils/collectOxcTemplateDependencies/expressionReplacements.d.ts +11 -0
- package/types/utils/collectOxcTemplateDependencies/expressionReplacements.js +131 -0
- package/types/utils/collectOxcTemplateDependencies/scopeAnalysis.d.ts +20 -0
- package/types/utils/collectOxcTemplateDependencies/scopeAnalysis.js +434 -0
- package/types/utils/collectOxcTemplateDependencies/staticBindings.d.ts +7 -0
- package/types/utils/collectOxcTemplateDependencies/staticBindings.js +13 -0
- package/types/utils/collectOxcTemplateDependencies/staticEvaluator.d.ts +13 -0
- package/types/utils/collectOxcTemplateDependencies/staticEvaluator.js +626 -0
- package/types/utils/collectOxcTemplateDependencies/types.d.ts +116 -0
- package/types/utils/collectOxcTemplateDependencies/types.js +1 -0
- package/types/utils/collectOxcTemplateDependencies.d.ts +4 -38
- package/types/utils/collectOxcTemplateDependencies.js +3 -1580
- package/types/utils/nativeResolver.d.ts +13 -0
- package/types/utils/nativeResolver.js +91 -0
- package/types/utils/oxc/ast.d.ts +4 -0
- package/types/utils/oxc/ast.js +37 -0
- package/types/utils/oxc/parse.d.ts +3 -0
- package/types/utils/oxc/parse.js +2 -0
- package/types/utils/oxc/replacements.d.ts +12 -0
- package/types/utils/oxc/replacements.js +18 -0
- package/types/utils/oxc/sourceLocations.d.ts +5 -0
- package/types/utils/oxc/sourceLocations.js +63 -0
- package/types/utils/oxcPreevalStage/evalStrategy.d.ts +3 -0
- package/types/utils/oxcPreevalStage/evalStrategy.js +2 -0
- package/types/utils/oxcPreevalStage/prepareCode.d.ts +3 -0
- package/types/utils/oxcPreevalStage/prepareCode.js +20 -0
- package/types/utils/oxcPreevalStage/prevalExport.d.ts +1 -0
- package/types/utils/oxcPreevalStage/prevalExport.js +22 -0
- package/types/utils/oxcPreevalStage/processors.d.ts +10 -0
- package/types/utils/oxcPreevalStage/processors.js +16 -0
- package/types/utils/oxcPreevalStage/staticOverlay.d.ts +3 -0
- package/types/utils/oxcPreevalStage/staticOverlay.js +23 -0
- package/types/utils/oxcPreevalStage/types.d.ts +22 -0
- package/types/utils/oxcPreevalStage/types.js +1 -0
- package/types/utils/oxcPreevalStage.d.ts +2 -18
- package/types/utils/oxcPreevalStage.js +17 -79
- package/types/utils/oxcPreevalTransforms.js +14 -1
- package/types/utils/processorStaticSemantics.d.ts +13 -0
- package/types/utils/processorStaticSemantics.js +191 -0
- package/types/utils/resolveWithConditions.js +3 -3
- package/esm/eval/resolverStrategy.js +0 -51
- package/esm/eval/resolverStrategy.js.map +0 -1
- package/types/eval/resolverStrategy.d.ts +0 -13
- package/types/eval/resolverStrategy.js +0 -46
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAAA,SAAS,iBAAiB;AAE1B,SAAS,mCAAmC;AAC5C,SAAS,iBAAiB,+BAA+B;AACzD,SAAS,0BAA0B;AACnC,SAAS,qBAAqB;AAY9B,SAAS,wCAAwC;AACjD,SAAS,qCAAqC;AAE9C,MAAM,aAAa;AAEnB,MAAM,yBACJ,MACA,aAC0B;CAC1B,MAAM,UAAU,IAAI,KAAuB;CAC3C,MAAM,aAAa,QAAgB,aAAqB;EACtD,MAAM,SAAS,QAAQ,IAAI,OAAO,IAAI,EAAE;AACxC,MAAI,CAAC,OAAO,SAAS,SAAS,EAAE;AAC9B,UAAO,KAAK,SAAS;;AAGvB,UAAQ,IAAI,QAAQ,OAAO;;AAG7B,6BAA4B,MAAM,SAAS,CAAC,QAAQ,SAAS,SAAS;AACpE,YAAU,KAAK,QAAQ,KAAK,YAAY,cAAc;GACtD;AAEF,QAAO;;AAaT,MAAM,gBAAgB,SACpB,KAAK,WAAW,KAAK,KAAK,OAAO;AAEnC,MAAM,sBAAsB,MAAc,aACxC,OAAO,OACL,4BAA4B,MAAM,SAAS,CAAC,SAC5C,cACD;AAQH,MAAM,2BAA2B,SAC/B,KACG,QAAQ,kBAAkB,GAAG,CAC7B,QAAQ,aAAa,GAAG,CACxB,QAAQ,WAAW,KAAK,CACxB,QAAQ,aAAa,OAAO;AAEjC,MAAM,0BACJ,UACA,MACA,gBACmB;CACnB,MAAM,SAAS,KAAK,kBAAkB;AACtC,KAAI,QAAQ;AACV,SAAO;;CAGT,MAAM,EAAE,oBAAoB;AAC5B,KAAI,gBAAgB,cAAc,WAAW;AAC3C,QAAM,IAAI,MAAM,oDAAoD;;CAGtE,MAAM,WAAW,gBAAgB,WAAW,YAAY,KAAK;CAC7D,MAAM,EAAE,iBAAiB;CACzB,MAAM,EAAE,kBAAkB,SAAS;CACnC,MAAM,OAAO,SAAS,QAAQ,QAAQ,QAAQ,KAAK;CAEnD,MAAM,qBAAqB,aAAa,KAAK,2BAA2B;EACtE,MAAM,SAAS,mBACb,gBAAgB,MAChB;GACE;GACA;GACD,EACD;GACE,GAAG;GACH;GACD,CACF;AAED,SAAO;GACL,KAAK;GACL,UAAU,OAAO;GACjB,MAAM,OAAO;GACb,iBAAiB,OAAO;GACxB,UAAU,OAAO;GACjB,UAAU,OAAO;GACjB,8BAA8B,EAAE;GAChC,oBAAoB,OAAO;GAC3B,kBAAkB,OAAO;GACzB,uBAAuB,OAAO;GAC/B;GACD;AAEF,MAAK,iBAAiB,mBAAmB;AACzC,QAAO;;AAGT,MAAM,sBACJ,UACA,MACA,aACA,UAA8B,EAAE,KACF;CAC9B,MAAM,EAAE,MAAM,iBAAiB,QAAQ;AACvC,KAAI,gBAAgB,cAAc,WAAW;AAC3C,MAAI,aAAa;AACjB,SAAO;GAAC,gBAAgB,QAAQ;GAAI;GAAM;GAAK;;CAGjD,MAAM,WAAW,gBAAgB,WAAW,YAAY,KAAK;CAC7D,MAAM,EAAE,iBAAiB;CACzB,MAAM,EAAE,kBAAkB,SAAS;CACnC,MAAM,OAAO,SAAS,QAAQ,QAAQ,QAAQ,KAAK;CAEnD,MAAM,qBAAqB,uBACzB,UACA,MACA,YACD;CAED,MAAM,oBAAoB,mBAAmB;CAC7C,MAAM,cACJ,QAAQ,uBAAuB,mBAAmB,WAC9C,mBAAmB,WACnB,mBAAmB;AACzB,KACE,aAAa,KAAK,IAClB,CAAC,qBACD,CAAC,mBAAmB,aAAa,SAAS,IAC1C,QAAQ,kCAAkC,OAC1C;AACA,MAAI,8BAA8B;EAClC,MAAM,eAAe,wBAAwB,aAAa,SAAS,CAAC;AAEpE,SAAO;GACL,wBAAwB,aAAa;GACrC,sBAAsB,cAAc,SAAS;GAC7C;GACD;;AAGH,KAAI,yBAAyB,kBAAkB;AAC/C,KAAI,8BAA8B,gBAAgB,UAAU,KAAK;AACjE,KAAI,OAAO,SAAS,CAAC,MAAM,YAAY;CAEvC,MAAM,SAAS,aAAa,KAAK,6BAC/B,cAAc,aAAa,UAAU;EACnC,iBAAiB,cAAc;EAC/B,aAAa;EACb;EACD,CAAC,CACH;AAED,KAAI,kBAAkB;AAEtB,KAAI,CAAC,QAAQ,cAAc;EACzB,MAAM,eAAe,QAAQ,sBACzB,wBAAwB,OAAO,MAAM,SAAS,CAAC,OAC/C,OAAO;AAEX,SAAO;GACL,wBAAwB,aAAa;GACrC,QAAQ,sBACJ,sBAAsB,cAAc,SAAS,GAC7C,OAAO;GACX,qBAAqB;GACtB;;CAGH,MAAM,UAAU,aAAa,KAAK,gCAChC,gBAAgB,OAAO,MAAM,SAAS,CACvC;AAED,QAAO;EAAC,QAAQ;EAAM,OAAO;EAAS,qBAAqB;EAAK;;AAGlE,MAAM,mBACJ,UACA,MACA,aACA,UAA8B,EAAE,KACF;CAC9B,MAAM,EAAE,KAAK,oBAAoB;AACjC,KAAI,gBAAgB,cAAc,WAAW;AAC3C,MAAI,aAAa;AACjB,SAAO;GAAC,gBAAgB,QAAQ;GAAI;GAAM;GAAK;;CAGjD,MAAM,EAAE,cAAc;AACtB,KAAI,cAAc,WAAW;AAC3B,QAAM,IAAI,MACR,eAAe,KAAK,KAAK,4FAC1B;;AAGH,QAAO,mBAAmB,UAAU,MAAM,aAAa,QAAQ;;AAGjE,OAAO,MAAM,eACX,UACA,MACA,gBAC8B,gBAAgB,UAAU,MAAM,YAAY;AAE5E,OAAO,MAAM,6BACX,UACA,MACA,gBAEA,gBAAgB,UAAU,MAAM,aAAa;CAC3C,+BAA+B;CAC/B,qBAAqB;CACtB,CAAC;AAEJ,OAAO,UAAU,kBAEf,WACyC;CACzC,MAAM,EAAE,MAAM,iBAAiB,QAAQ,KAAK;AAC5C,KAAI,gBAAgB,cAAc,WAAW;AAC3C,MAAI,aAAa;AACjB,SAAO;GACL,MAAM,gBAAgB,QAAQ;GAC9B,UAAU;GACX;;AAGH,KAAI,gBAAgB,cAAc,WAAW;AAC3C,QAAM,IAAI,MACR,eAAe,KAAK,WAAW,KAAK,4FACrC;;AAGH,KAAI,WAAW,KAAK;AAEpB,KAAI,gBAAgB,cAAc,WAAW;AAC3C,yBAAuB,KAAK,UAAU,KAAK,YAAY,KAAK;AAC5D,SAAO,8BAA8B,KAAK,KAAK;;CAGjD,MAAM,CAAC,cAAc,SAAS,YAAY,UACxC,KAAK,UACL,KAAK,YACL,KACD;CACD,IAAI,oBAAoB;AAExB,KAAI,gBAAgB,cAAc,WAAW;AAC3C,MAAI,aAAa,QAAQ,aAAa,KAAK,EAAE;AAC3C,OACE,0EACD;AACD,UAAO;IACL,MAAM;IACN,UAAU;IACX;;EAGH,IAAI,WAAW;EACf,IAAI,sBAA+C,EAAE;EACrD,IAAI,kCAA4C,EAAE;AAElD,MAAI,YAAY,QAAQ,QAAQ,OAAO,GAAG;GACxC,MAAM,kBAAkB,OAAO,KAAK,QAClC,kBACA,KAAK,YACL;IACE;IACA,OAAO;IACR,CACF;AAED,OAAI,gBAAgB,SAAS,GAAG;IAC9B,MAAM,YAAY,OAAO,iCAAiC,KACxD,MACA,cACA,gBAAgB,WAAW,YAAY,KAAK,WAAW,MACvD,gBACD;AAED,eAAW,UAAU;AAErB,QAAI,UAAU,iBAAiB,GAAG;AAChC,uCAAkC,UAAU;KAC5C,MAAM,wBAAwB,IAAI,IAChC,UAAU,sBACX;KACD,MAAM,yBAAyB,IAAI,IACjC,UAAU,uBACX;AAED,UAAK,MAAM,cAAc,iBAAiB;AACxC,UACE,WAAW,aACV,sBAAsB,IAAI,WAAW,OAAO,IAC3C,uBAAuB,IAAI,WAAW,OAAO,GAC/C;AACA,WAAI,uBAAuB,IAAI,WAAW,OAAO,EAAE;AACjD,aAAK,WAAW,cAAc,WAAW;cACpC;AACL,aAAK,WAAW,0BAA0B,WAAW;;AAGvD,YAAK,WAAW,iCACd,WAAW,SACZ;;;AAIL,2BAAsB,OAAO,KAAK,QAChC,kBACA,KAAK,YACL;MACE,SAAS,UAAU;MACnB,OAAO;MACP,aAAa,UAAU;MACxB,CACF;WACI;AACL,2BAAsB;;;;AAK5B,MAAI,oBAAoB,WAAW,GAAG;AACpC,SAAM;IACJ;IACA,KAAK;IACL;KACE,UAAU;KACV,8BAA8B;KAC/B;IACF;;AAGH,sBAAoB,KAAK,SAAS,aAAa,KAC7C,gCAEE,gBACE,UACA,gBAAgB,WAAW,YAAY,KAAK,WAAW,KACxD,CAAC,KACL;;AAGH,KAAI,gBAAgB,SAAS,mBAAmB;AAC9C,MAAI,gCAAgC,KAAK;QACpC;AACL,MAAI,WAAW,KAAK;AACpB,MAAI,OAAO,SAAS,CAAC,MAAM,qBAAqB,WAAW;;AAG7D,KAAI,sBAAsB,IAAI;AAC5B,MAAI,aAAa;AACjB,SAAO;GACL,MAAM,gBAAgB,QAAQ;GAC9B;GACD;;AAGH,KAAI,aAAa,QAAQ,aAAa,KAAK,EAAE;AAC3C,MACE,0EACD;AACD,SAAO;GACL,MAAM;GACN,UAAU;GACX;;AAGH,KACE,gBAAgB,cAAc,aAC9B,YAAY,QACZ,QAAQ,OAAO,GACf;EACA,MAAM,kBAAkB,OAAO,KAAK,QAClC,kBACA,KAAK,YACL,EACE,SACD,CACF;AAED,MAAI,gBAAgB,WAAW,GAAG;AAChC,SAAM;IACJ;IACA,KAAK;IACL,EACE,UAAU,iBACX;IACF;;;AAIL,QAAO;EACL,MAAM;EACN;EACD;;AAGH,OAAO,UAAU,YAE0B;AACzC,QAAO,OAAO,kBAAkB,KAAK,MAAM,YAAY","names":[],"sources":["../../../src/transform/generators/transform.ts"],"version":3,"sourcesContent":["import { oxcShaker } from '../../shaker';\nimport type { WYWTransformMetadata } from '../../utils/TransformMetadata';\nimport { collectOxcExportsAndImports } from '../../utils/collectOxcExportsAndImports';\nimport { emitOxcCommonJS, stripTypesAndJsxWithOxc } from '../../utils/oxcEmit';\nimport { runOxcPreevalStage } from '../../utils/oxcPreevalStage';\nimport { shakeOxcToESM } from '../../utils/oxcShaker';\nimport type { Entrypoint } from '../Entrypoint';\nimport type {\n IEntrypointDependency,\n IPreevalResult,\n} from '../Entrypoint.types';\nimport type {\n ITransformAction,\n Services,\n SyncScenarioForAction,\n} from '../types';\n\nimport { rewriteOptimizedOxcBarrelImports } from './rewriteOxcBarrelImports';\nimport { resolveStaticOxcPreevalValues } from './resolveStaticOxcValues';\n\nconst EMPTY_FILE = '=== empty file ===';\n\nconst collectImportsFromOxc = (\n code: string,\n filename: string\n): Map<string, string[]> => {\n const imports = new Map<string, string[]>();\n const addImport = (source: string, imported: string) => {\n const bucket = imports.get(source) ?? [];\n if (!bucket.includes(imported)) {\n bucket.push(imported);\n }\n\n imports.set(source, bucket);\n };\n\n collectOxcExportsAndImports(code, filename).imports.forEach((item) => {\n addImport(item.source, item.imported || 'side-effect');\n });\n\n return imports;\n};\n\ntype PrepareCodeFn = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n) => [\n code: string,\n imports: Map<string, string[]> | null,\n metadata: WYWTransformMetadata | null,\n];\n\nconst isPrevalOnly = (only: string[]) =>\n only.length === 1 && only[0] === '__wywPreval';\n\nconst hasWywPrevalExport = (code: string, filename: string): boolean =>\n Object.hasOwn(\n collectOxcExportsAndImports(code, filename).exports,\n '__wywPreval'\n );\n\ntype PrepareCodeOptions = {\n emitCommonJS?: boolean;\n shortCircuitOnMissingMetadata?: boolean;\n stripForEvalRuntime?: boolean;\n};\n\nconst normalizeOxcPreparedESM = (code: string): string =>\n code\n .replace(/^(?:[ \\t]*\\n)+/, '')\n .replace(/[ \\t\\n]+$/, '')\n .replace(/\\n{2,}/g, '\\n')\n .replace(/^const /gm, 'var ');\n\nconst ensureOxcPreevalResult = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): IPreevalResult => {\n const cached = item.getPreevalResult();\n if (cached) {\n return cached;\n }\n\n const { loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n throw new Error('Cannot run Oxc preeval for an ignored entrypoint.');\n }\n\n const filename = loadedAndParsed.evalConfig.filename ?? item.name;\n const { eventEmitter } = services;\n const { pluginOptions } = services.options;\n const root = services.options.root ?? process.cwd();\n\n const preevalStageResult = eventEmitter.perf('transform:preeval', () => {\n const result = runOxcPreevalStage(\n loadedAndParsed.code,\n {\n filename,\n root,\n },\n {\n ...pluginOptions,\n eventEmitter,\n }\n );\n\n return {\n ast: originalAst,\n baseCode: result.baseCode,\n code: result.code,\n dependencyNames: result.dependencyNames,\n evalCode: result.code,\n metadata: result.metadata,\n staticSideEffectImportLocals: [],\n staticDependencies: result.staticDependencies,\n staticValueCache: result.staticValueCache,\n staticValueCandidates: result.staticValueCandidates,\n };\n });\n\n item.setPreevalResult(preevalStageResult);\n return preevalStageResult;\n};\n\nconst prepareOxcCodeImpl = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null,\n options: PrepareCodeOptions = {}\n): ReturnType<PrepareCodeFn> => {\n const { only, loadedAndParsed, log } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const filename = loadedAndParsed.evalConfig.filename ?? item.name;\n const { eventEmitter } = services;\n const { pluginOptions } = services.options;\n const root = services.options.root ?? process.cwd();\n\n const preevalStageResult = ensureOxcPreevalResult(\n services,\n item,\n originalAst\n );\n\n const transformMetadata = preevalStageResult.metadata;\n const preevalCode =\n options.stripForEvalRuntime && preevalStageResult.evalCode\n ? preevalStageResult.evalCode\n : preevalStageResult.code;\n if (\n isPrevalOnly(only) &&\n !transformMetadata &&\n !hasWywPrevalExport(preevalCode, filename) &&\n options.shortCircuitOnMissingMetadata !== false\n ) {\n log('[evaluator:end] no metadata');\n const strippedCode = stripTypesAndJsxWithOxc(preevalCode, filename).code;\n\n return [\n normalizeOxcPreparedESM(strippedCode),\n collectImportsFromOxc(strippedCode, filename),\n null,\n ];\n }\n\n log('[preeval] metadata %O', transformMetadata);\n log('[evaluator:start] using %s', loadedAndParsed.evaluator.name);\n log.extend('source')('%s', preevalCode);\n\n const shaken = eventEmitter.perf('transform:evaluator', () =>\n shakeOxcToESM(preevalCode, filename, {\n importOverrides: pluginOptions.importOverrides,\n onlyExports: only,\n root,\n })\n );\n\n log('[evaluator:end]');\n\n if (!options.emitCommonJS) {\n const preparedCode = options.stripForEvalRuntime\n ? stripTypesAndJsxWithOxc(shaken.code, filename).code\n : shaken.code;\n\n return [\n normalizeOxcPreparedESM(preparedCode),\n options.stripForEvalRuntime\n ? collectImportsFromOxc(preparedCode, filename)\n : shaken.imports,\n transformMetadata ?? null,\n ];\n }\n\n const emitted = eventEmitter.perf('transform:emitCommonJS', () =>\n emitOxcCommonJS(shaken.code, filename)\n );\n\n return [emitted.code, shaken.imports, transformMetadata ?? null];\n};\n\nconst prepareCodeImpl = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null,\n options: PrepareCodeOptions = {}\n): ReturnType<PrepareCodeFn> => {\n const { log, loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const { evaluator } = loadedAndParsed;\n if (evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${item.name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n return prepareOxcCodeImpl(services, item, originalAst, options);\n};\n\nexport const prepareCode = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): ReturnType<PrepareCodeFn> => prepareCodeImpl(services, item, originalAst);\n\nexport const prepareCodeForEvalRuntime = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): ReturnType<PrepareCodeFn> =>\n prepareCodeImpl(services, item, originalAst, {\n shortCircuitOnMissingMetadata: true,\n stripForEvalRuntime: true,\n });\n\nexport function* internalTransform(\n this: ITransformAction,\n prepareFn: PrepareCodeFn\n): SyncScenarioForAction<ITransformAction> {\n const { only, loadedAndParsed, log } = this.entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n if (loadedAndParsed.evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${this.entrypoint.name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n log('>> (%o)', only);\n\n if (loadedAndParsed.evaluator === oxcShaker) {\n ensureOxcPreevalResult(this.services, this.entrypoint, null);\n yield* resolveStaticOxcPreevalValues.call(this);\n }\n\n const [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n null\n );\n let finalPreparedCode = preparedCode;\n\n if (loadedAndParsed.evaluator === oxcShaker) {\n if (metadata === null && isPrevalOnly(only)) {\n log(\n 'skip resolving imports for __wywPreval-only entrypoint without metadata'\n );\n return {\n code: finalPreparedCode,\n metadata: null,\n };\n }\n\n let nextCode = preparedCode;\n let nextResolvedImports: IEntrypointDependency[] = [];\n let skippedParentDependencyTracking: string[] = [];\n\n if (imports !== null && imports.size > 0) {\n const resolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports,\n phase: 'initial',\n }\n );\n\n if (resolvedImports.length > 0) {\n const rewritten = yield* rewriteOptimizedOxcBarrelImports.call(\n this,\n preparedCode,\n loadedAndParsed.evalConfig.filename ?? this.entrypoint.name,\n resolvedImports\n );\n\n nextCode = rewritten.code;\n\n if (rewritten.optimizedCount > 0) {\n skippedParentDependencyTracking = rewritten.generatedSources;\n const fullyRewrittenSources = new Set(\n rewritten.fullyRewrittenSources\n );\n const partialFallbackSources = new Set(\n rewritten.partialFallbackSources\n );\n\n for (const dependency of resolvedImports) {\n if (\n dependency.resolved &&\n (fullyRewrittenSources.has(dependency.source) ||\n partialFallbackSources.has(dependency.source))\n ) {\n if (partialFallbackSources.has(dependency.source)) {\n this.entrypoint.addDependency(dependency);\n } else {\n this.entrypoint.addInvalidationDependency(dependency);\n }\n\n this.entrypoint.markInvalidateOnDependencyChange(\n dependency.resolved\n );\n }\n }\n\n nextResolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports: rewritten.imports,\n phase: 'rewritten',\n preResolved: rewritten.preResolvedImports,\n }\n );\n } else {\n nextResolvedImports = resolvedImports;\n }\n }\n }\n\n if (nextResolvedImports.length !== 0) {\n yield [\n 'processImports',\n this.entrypoint,\n {\n resolved: nextResolvedImports,\n skipParentDependencyTracking: skippedParentDependencyTracking,\n },\n ];\n }\n\n finalPreparedCode = this.services.eventEmitter.perf(\n 'transform:emitCommonJS',\n () =>\n emitOxcCommonJS(\n nextCode,\n loadedAndParsed.evalConfig.filename ?? this.entrypoint.name\n ).code\n );\n }\n\n if (loadedAndParsed.code === finalPreparedCode) {\n log('<< (%o)\\n === no changes ===', only);\n } else {\n log('<< (%o)', only);\n log.extend('source')('%s', finalPreparedCode || EMPTY_FILE);\n }\n\n if (finalPreparedCode === '') {\n log('is skipped');\n return {\n code: loadedAndParsed.code ?? '',\n metadata,\n };\n }\n\n if (metadata === null && isPrevalOnly(only)) {\n log(\n 'skip resolving imports for __wywPreval-only entrypoint without metadata'\n );\n return {\n code: finalPreparedCode,\n metadata: null,\n };\n }\n\n if (\n loadedAndParsed.evaluator !== oxcShaker &&\n imports !== null &&\n imports.size > 0\n ) {\n const resolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports,\n }\n );\n\n if (resolvedImports.length !== 0) {\n yield [\n 'processImports',\n this.entrypoint,\n {\n resolved: resolvedImports,\n },\n ];\n }\n }\n\n return {\n code: finalPreparedCode,\n metadata,\n };\n}\n\nexport function* transform(\n this: ITransformAction\n): SyncScenarioForAction<ITransformAction> {\n return yield* internalTransform.call(this, prepareCode);\n}\n"],"file":"transform.js"}
|
|
1
|
+
{"mappings":"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","names":[],"sources":["../../../src/transform/generators/transform.ts"],"version":3,"sourcesContent":["import { oxcShaker } from '../../shaker';\nimport type { WYWTransformMetadata } from '../../utils/TransformMetadata';\nimport { collectOxcExportsAndImports } from '../../utils/collectOxcExportsAndImports';\nimport { emitOxcCommonJS, stripTypesAndJsxWithOxc } from '../../utils/oxcEmit';\nimport { runOxcPreevalStage } from '../../utils/oxcPreevalStage';\nimport { shakeOxcToESM } from '../../utils/oxcShaker';\nimport type { Entrypoint } from '../Entrypoint';\nimport type {\n IEntrypointDependency,\n IPreevalResult,\n} from '../Entrypoint.types';\nimport type {\n ITransformAction,\n Services,\n SyncScenarioFor,\n SyncScenarioForAction,\n} from '../types';\n\nimport { rewriteOptimizedOxcBarrelImports } from './rewriteOxcBarrelImports';\nimport { resolveStaticOxcPreevalValues } from './resolveStaticOxcValues';\n\nconst EMPTY_FILE = '=== empty file ===';\n\nconst collectImportsFromOxc = (\n code: string,\n filename: string\n): Map<string, string[]> => {\n const imports = new Map<string, string[]>();\n const addImport = (source: string, imported: string) => {\n const bucket = imports.get(source) ?? [];\n if (!bucket.includes(imported)) {\n bucket.push(imported);\n }\n\n imports.set(source, bucket);\n };\n\n collectOxcExportsAndImports(code, filename).imports.forEach((item) => {\n addImport(item.source, item.imported || 'side-effect');\n });\n\n return imports;\n};\n\ntype PrepareCodeFn = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n) => [\n code: string,\n imports: Map<string, string[]> | null,\n metadata: WYWTransformMetadata | null,\n];\n\nconst isPrevalOnly = (only: string[]) =>\n only.length === 1 && only[0] === '__wywPreval';\n\nconst hasWywPrevalExport = (code: string, filename: string): boolean =>\n Object.hasOwn(\n collectOxcExportsAndImports(code, filename).exports,\n '__wywPreval'\n );\n\ntype PrepareCodeOptions = {\n emitCommonJS?: boolean;\n shortCircuitOnMissingMetadata?: boolean;\n stripForEvalRuntime?: boolean;\n};\n\nconst normalizeOxcPreparedESM = (code: string): string =>\n code\n .replace(/^(?:[ \\t]*\\n)+/, '')\n .replace(/[ \\t\\n]+$/, '')\n .replace(/\\n{2,}/g, '\\n')\n .replace(/^const /gm, 'var ');\n\nconst ensureOxcPreevalResult = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): IPreevalResult => {\n const cached = item.getPreevalResult();\n if (cached) {\n return cached;\n }\n\n const { loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n throw new Error('Cannot run Oxc preeval for an ignored entrypoint.');\n }\n\n const filename = loadedAndParsed.evalConfig.filename ?? item.name;\n const { eventEmitter } = services;\n const { pluginOptions } = services.options;\n const root = services.options.root ?? process.cwd();\n\n const preevalStageResult = eventEmitter.perf('transform:preeval', () => {\n const result = runOxcPreevalStage(\n loadedAndParsed.code,\n {\n filename,\n root,\n },\n {\n ...pluginOptions,\n eventEmitter,\n }\n );\n\n return {\n ast: originalAst,\n baseCode: result.baseCode,\n code: result.code,\n dependencyNames: result.dependencyNames,\n evalCode: result.code,\n metadata: result.metadata,\n processorClassNames: result.processorClassNames,\n staticSideEffectImportLocals: [],\n staticDependencies: result.staticDependencies,\n staticValuesApplied: false,\n staticValueCache: result.staticValueCache,\n staticValueCandidates: result.staticValueCandidates,\n };\n });\n\n item.setPreevalResult(preevalStageResult);\n return preevalStageResult;\n};\n\nconst prepareOxcCodeImpl = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null,\n options: PrepareCodeOptions = {}\n): ReturnType<PrepareCodeFn> => {\n const { only, loadedAndParsed, log } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const filename = loadedAndParsed.evalConfig.filename ?? item.name;\n const { eventEmitter } = services;\n const { pluginOptions } = services.options;\n const root = services.options.root ?? process.cwd();\n\n const preevalStageResult = ensureOxcPreevalResult(\n services,\n item,\n originalAst\n );\n\n const transformMetadata = preevalStageResult.metadata;\n const preevalCode =\n options.stripForEvalRuntime && preevalStageResult.evalCode\n ? preevalStageResult.evalCode\n : preevalStageResult.code;\n if (\n isPrevalOnly(only) &&\n !transformMetadata &&\n !hasWywPrevalExport(preevalCode, filename) &&\n options.shortCircuitOnMissingMetadata !== false\n ) {\n log('[evaluator:end] no metadata');\n const strippedCode = stripTypesAndJsxWithOxc(preevalCode, filename).code;\n\n return [\n normalizeOxcPreparedESM(strippedCode),\n collectImportsFromOxc(strippedCode, filename),\n null,\n ];\n }\n\n log('[preeval] metadata %O', transformMetadata);\n log('[evaluator:start] using %s', loadedAndParsed.evaluator.name);\n log.extend('source')('%s', preevalCode);\n\n const shaken = eventEmitter.perf('transform:evaluator', () =>\n shakeOxcToESM(preevalCode, filename, {\n importOverrides: pluginOptions.importOverrides,\n onlyExports: only,\n root,\n })\n );\n\n log('[evaluator:end]');\n\n if (!options.emitCommonJS) {\n const preparedCode = options.stripForEvalRuntime\n ? stripTypesAndJsxWithOxc(shaken.code, filename).code\n : shaken.code;\n\n return [\n normalizeOxcPreparedESM(preparedCode),\n options.stripForEvalRuntime\n ? collectImportsFromOxc(preparedCode, filename)\n : shaken.imports,\n transformMetadata ?? null,\n ];\n }\n\n const emitted = eventEmitter.perf('transform:emitCommonJS', () =>\n emitOxcCommonJS(shaken.code, filename)\n );\n\n return [emitted.code, shaken.imports, transformMetadata ?? null];\n};\n\nconst prepareCodeImpl = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null,\n options: PrepareCodeOptions = {}\n): ReturnType<PrepareCodeFn> => {\n const { log, loadedAndParsed } = item;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return [loadedAndParsed.code ?? '', null, null];\n }\n\n const { evaluator } = loadedAndParsed;\n if (evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${item.name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n return prepareOxcCodeImpl(services, item, originalAst, options);\n};\n\nexport const prepareCode = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): ReturnType<PrepareCodeFn> => prepareCodeImpl(services, item, originalAst);\n\nexport const prepareCodeForEvalRuntime = (\n services: Services,\n item: Entrypoint,\n originalAst: unknown | null\n): ReturnType<PrepareCodeFn> =>\n prepareCodeImpl(services, item, originalAst, {\n shortCircuitOnMissingMetadata: true,\n stripForEvalRuntime: true,\n });\n\nfunction* resolveAndProcessOxcPreparedImports(\n action: ITransformAction,\n preparedCode: string,\n imports: Map<string, string[]> | null\n): SyncScenarioFor<string> {\n const { loadedAndParsed } = action.entrypoint;\n if (imports === null || imports.size === 0) {\n return preparedCode;\n }\n\n const resolvedImports = yield* action.getNext(\n 'resolveImports',\n action.entrypoint,\n {\n imports,\n phase: 'initial',\n }\n );\n\n let nextCode = preparedCode;\n let nextResolvedImports: IEntrypointDependency[] = [];\n let skippedParentDependencyTracking: string[] = [];\n\n if (resolvedImports.length > 0) {\n const rewritten = yield* rewriteOptimizedOxcBarrelImports.call(\n action,\n preparedCode,\n loadedAndParsed.evaluator === 'ignored'\n ? action.entrypoint.name\n : loadedAndParsed.evalConfig.filename ?? action.entrypoint.name,\n resolvedImports\n );\n\n nextCode = rewritten.code;\n\n if (rewritten.optimizedCount > 0) {\n skippedParentDependencyTracking = rewritten.generatedSources;\n const fullyRewrittenSources = new Set(rewritten.fullyRewrittenSources);\n const partialFallbackSources = new Set(rewritten.partialFallbackSources);\n\n for (const dependency of resolvedImports) {\n if (\n dependency.resolved &&\n (fullyRewrittenSources.has(dependency.source) ||\n partialFallbackSources.has(dependency.source))\n ) {\n if (partialFallbackSources.has(dependency.source)) {\n action.entrypoint.addDependency(dependency);\n } else {\n action.entrypoint.addInvalidationDependency(dependency);\n }\n\n action.entrypoint.markInvalidateOnDependencyChange(\n dependency.resolved\n );\n }\n }\n\n nextResolvedImports = yield* action.getNext(\n 'resolveImports',\n action.entrypoint,\n {\n imports: rewritten.imports,\n phase: 'rewritten',\n preResolved: rewritten.preResolvedImports,\n }\n );\n } else {\n nextResolvedImports = resolvedImports;\n }\n }\n\n if (nextResolvedImports.length !== 0) {\n yield [\n 'processImports',\n action.entrypoint,\n {\n resolved: nextResolvedImports,\n skipParentDependencyTracking: skippedParentDependencyTracking,\n },\n ];\n }\n\n return nextCode;\n}\n\nexport function* internalTransform(\n this: ITransformAction,\n prepareFn: PrepareCodeFn\n): SyncScenarioForAction<ITransformAction> {\n const { only, loadedAndParsed, log } = this.entrypoint;\n if (loadedAndParsed.evaluator === 'ignored') {\n log('is ignored');\n return {\n code: loadedAndParsed.code ?? '',\n metadata: null,\n };\n }\n\n if (loadedAndParsed.evaluator !== oxcShaker) {\n throw new Error(\n `[wyw-in-js] ${this.entrypoint.name} matched a legacy evaluator. The Oxc runtime path supports only the default Oxc evaluator.`\n );\n }\n\n log('>> (%o)', only);\n\n if (loadedAndParsed.evaluator === oxcShaker) {\n ensureOxcPreevalResult(this.services, this.entrypoint, null);\n yield* resolveStaticOxcPreevalValues.call(this);\n }\n\n let [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n null\n );\n let finalPreparedCode = preparedCode;\n\n if (loadedAndParsed.evaluator === oxcShaker) {\n if (metadata === null && isPrevalOnly(only)) {\n log(\n 'skip resolving imports for __wywPreval-only entrypoint without metadata'\n );\n return {\n code: finalPreparedCode,\n metadata: null,\n };\n }\n\n let nextCode = yield* resolveAndProcessOxcPreparedImports(\n this,\n preparedCode,\n imports\n );\n\n if (yield* resolveStaticOxcPreevalValues.call(this)) {\n [preparedCode, imports, metadata] = prepareFn(\n this.services,\n this.entrypoint,\n null\n );\n nextCode = yield* resolveAndProcessOxcPreparedImports(\n this,\n preparedCode,\n imports\n );\n }\n\n finalPreparedCode = this.services.eventEmitter.perf(\n 'transform:emitCommonJS',\n () =>\n emitOxcCommonJS(\n nextCode,\n loadedAndParsed.evalConfig.filename ?? this.entrypoint.name\n ).code\n );\n }\n\n if (loadedAndParsed.code === finalPreparedCode) {\n log('<< (%o)\\n === no changes ===', only);\n } else {\n log('<< (%o)', only);\n log.extend('source')('%s', finalPreparedCode || EMPTY_FILE);\n }\n\n if (finalPreparedCode === '') {\n log('is skipped');\n return {\n code: loadedAndParsed.code ?? '',\n metadata,\n };\n }\n\n if (metadata === null && isPrevalOnly(only)) {\n log(\n 'skip resolving imports for __wywPreval-only entrypoint without metadata'\n );\n return {\n code: finalPreparedCode,\n metadata: null,\n };\n }\n\n if (\n loadedAndParsed.evaluator !== oxcShaker &&\n imports !== null &&\n imports.size > 0\n ) {\n const resolvedImports = yield* this.getNext(\n 'resolveImports',\n this.entrypoint,\n {\n imports,\n }\n );\n\n if (resolvedImports.length !== 0) {\n yield [\n 'processImports',\n this.entrypoint,\n {\n resolved: resolvedImports,\n },\n ];\n }\n }\n\n return {\n code: finalPreparedCode,\n metadata,\n };\n}\n\nexport function* transform(\n this: ITransformAction\n): SyncScenarioForAction<ITransformAction> {\n return yield* internalTransform.call(this, prepareCode);\n}\n"],"file":"transform.js"}
|
|
@@ -26,6 +26,19 @@ const explorerSync = cosmiconfigSync("wyw-in-js", { searchPlaces: searchPlaces.f
|
|
|
26
26
|
const cache = new WeakMap();
|
|
27
27
|
const defaultOverrides = {};
|
|
28
28
|
const nodeModulesRegExp = /[\\/]node_modules[\\/]/;
|
|
29
|
+
const evalResolverModes = new Set([
|
|
30
|
+
"bundler",
|
|
31
|
+
"hybrid",
|
|
32
|
+
"native",
|
|
33
|
+
"custom"
|
|
34
|
+
]);
|
|
35
|
+
const evalStrategies = new Set([
|
|
36
|
+
"execute",
|
|
37
|
+
"hybrid",
|
|
38
|
+
"static"
|
|
39
|
+
]);
|
|
40
|
+
const evalRuntimes = new Set(["nodejs"]);
|
|
41
|
+
const evalErrorModes = new Set(["strict", "loose"]);
|
|
29
42
|
const defaultImportLoaders = {
|
|
30
43
|
raw: "raw",
|
|
31
44
|
url: "url"
|
|
@@ -81,13 +94,14 @@ export function loadWywOptions(overrides = defaultOverrides) {
|
|
|
81
94
|
globalCache: true,
|
|
82
95
|
happyDOM: true,
|
|
83
96
|
softErrors: false,
|
|
84
|
-
staticImportValues: false,
|
|
85
97
|
useWeakRefInEval: true
|
|
86
98
|
};
|
|
87
99
|
const defaultEval = {
|
|
88
|
-
|
|
100
|
+
errors: "strict",
|
|
89
101
|
require: "warn-and-run",
|
|
90
|
-
resolver: "bundler"
|
|
102
|
+
resolver: "bundler",
|
|
103
|
+
runtime: "nodejs",
|
|
104
|
+
strategy: "hybrid"
|
|
91
105
|
};
|
|
92
106
|
const config = (() => {
|
|
93
107
|
if (configFile === false) {
|
|
@@ -103,7 +117,6 @@ export function loadWywOptions(overrides = defaultOverrides) {
|
|
|
103
117
|
const configEval = config.eval;
|
|
104
118
|
const options = {
|
|
105
119
|
displayName: false,
|
|
106
|
-
evaluate: true,
|
|
107
120
|
evalConsole: "pipe",
|
|
108
121
|
extensions: [
|
|
109
122
|
".cjs",
|
|
@@ -155,6 +168,22 @@ export function loadWywOptions(overrides = defaultOverrides) {
|
|
|
155
168
|
...rest.features
|
|
156
169
|
}
|
|
157
170
|
};
|
|
171
|
+
const evalResolver = options.eval?.resolver;
|
|
172
|
+
if (evalResolver && !evalResolverModes.has(evalResolver)) {
|
|
173
|
+
throw new Error(`[wyw-in-js] Unsupported eval.resolver "${evalResolver}". Use "bundler", "hybrid", "native", or "custom".`);
|
|
174
|
+
}
|
|
175
|
+
const evalStrategy = options.eval?.strategy;
|
|
176
|
+
if (evalStrategy && !evalStrategies.has(evalStrategy)) {
|
|
177
|
+
throw new Error(`[wyw-in-js] Unsupported eval.strategy "${evalStrategy}". Use "execute", "hybrid", or "static".`);
|
|
178
|
+
}
|
|
179
|
+
const evalRuntime = options.eval?.runtime;
|
|
180
|
+
if (evalRuntime && !evalRuntimes.has(evalRuntime)) {
|
|
181
|
+
throw new Error(`[wyw-in-js] Unsupported eval.runtime "${evalRuntime}". Use "nodejs".`);
|
|
182
|
+
}
|
|
183
|
+
const evalErrors = options.eval?.errors;
|
|
184
|
+
if (evalErrors && !evalErrorModes.has(evalErrors)) {
|
|
185
|
+
throw new Error(`[wyw-in-js] Unsupported eval.errors "${evalErrors}". Use "strict" or "loose".`);
|
|
186
|
+
}
|
|
158
187
|
cache.set(overrides, options);
|
|
159
188
|
return options;
|
|
160
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","names":[],"sources":["../../../src/transform/helpers/loadWywOptions.ts"],"version":3,"sourcesContent":["import { existsSync } from 'fs';\nimport { createRequire } from 'module';\nimport path from 'path';\n\nimport { cosmiconfigSync } from 'cosmiconfig';\n\nimport type {\n EvalOptionsV2,\n FeatureFlags,\n ImportLoaders,\n StrictOptions,\n} from '@wyw-in-js/shared';\n\nimport { shaker } from '../../shaker';\nimport type { PluginOptions } from '../../types';\n\nconst searchPlaces = [\n `.wyw-in-jsrc`,\n `.wyw-in-jsrc.json`,\n `.wyw-in-jsrc.yaml`,\n `.wyw-in-jsrc.yml`,\n `.wyw-in-jsrc.mjs`,\n `.wyw-in-jsrc.js`,\n `.wyw-in-jsrc.cjs`,\n `.config/wyw-in-jsrc`,\n `.config/wyw-in-jsrc.json`,\n `.config/wyw-in-jsrc.yaml`,\n `.config/wyw-in-jsrc.yml`,\n `.config/wyw-in-jsrc.mjs`,\n `.config/wyw-in-jsrc.js`,\n `.config/wyw-in-jsrc.cjs`,\n `wyw-in-js.config.mjs`,\n `wyw-in-js.config.js`,\n `wyw-in-js.config.cjs`,\n];\n\nconst explorerSync = cosmiconfigSync('wyw-in-js', {\n searchPlaces: searchPlaces.filter(\n (searchPlace) => !searchPlace.endsWith('.mjs')\n ),\n});\n\nexport type PartialOptions = Partial<Omit<PluginOptions, 'features'>> & {\n features?: Partial<FeatureFlags>;\n};\n\nconst cache = new WeakMap<Partial<PartialOptions>, StrictOptions>();\nconst defaultOverrides = {};\nconst nodeModulesRegExp = /[\\\\/]node_modules[\\\\/]/;\nconst defaultImportLoaders: ImportLoaders = {\n raw: 'raw',\n url: 'url',\n};\nconst resolveConfigFilePath = (configFile: string): string =>\n path.isAbsolute(configFile)\n ? configFile\n : path.resolve(process.cwd(), configFile);\n\nconst normalizeLoadedConfig = (loadedConfig: unknown): Partial<StrictOptions> =>\n (loadedConfig && typeof loadedConfig === 'object' && 'default' in loadedConfig\n ? (loadedConfig as { default: unknown }).default\n : loadedConfig) as Partial<StrictOptions>;\n\nconst loadMjsConfig = (configFile: string): Partial<StrictOptions> => {\n const resolvedConfigFile = resolveConfigFilePath(configFile);\n const configRequire = createRequire(resolvedConfigFile);\n\n try {\n const cacheKey = configRequire.resolve(resolvedConfigFile);\n delete configRequire.cache[cacheKey];\n } catch {\n // Ignore cache cleanup failures and let the require call surface the real error.\n }\n\n try {\n return normalizeLoadedConfig(configRequire(resolvedConfigFile));\n } catch (error) {\n const code =\n error && typeof error === 'object' && 'code' in error\n ? (error as { code?: string }).code\n : undefined;\n const message = error instanceof Error ? error.message : String(error);\n\n if (\n code === 'ERR_REQUIRE_ASYNC_MODULE' ||\n message.includes('require() async module') ||\n message.includes('top-level await')\n ) {\n throw new Error(\n `[wyw-in-js] Failed to load ${resolvedConfigFile}. ` +\n 'WyW config loading is synchronous, so .mjs config files must not use top-level await ' +\n 'or depend on async ESM modules. Remove top-level await or switch to a synchronous config.'\n );\n }\n\n throw error;\n }\n};\n\nconst loadConfigFromFile = (configFile: string): Partial<StrictOptions> => {\n const resolvedConfigFile = resolveConfigFilePath(configFile);\n if (path.extname(resolvedConfigFile) === '.mjs') {\n return loadMjsConfig(resolvedConfigFile);\n }\n\n return (explorerSync.load(resolvedConfigFile)?.config ??\n {}) as Partial<StrictOptions>;\n};\n\nconst searchConfig = (): Partial<StrictOptions> => {\n let currentDir: string | null = process.cwd();\n\n while (currentDir) {\n for (const searchPlace of searchPlaces) {\n const candidate = path.join(currentDir, searchPlace);\n if (existsSync(candidate)) {\n return loadConfigFromFile(candidate);\n }\n }\n\n const parentDir = path.dirname(currentDir);\n currentDir = parentDir === currentDir ? null : parentDir;\n }\n\n return {};\n};\n\nexport function loadWywOptions(\n overrides: PartialOptions = defaultOverrides\n): StrictOptions {\n if (cache.has(overrides)) {\n return cache.get(overrides)!;\n }\n\n const {\n configFile,\n ignore,\n rules,\n oxcOptions = {},\n importLoaders: overridesImportLoaders,\n ...rest\n } = overrides;\n\n const defaultFeatures = {\n dangerousCodeRemover: true,\n globalCache: true,\n happyDOM: true,\n softErrors: false,\n staticImportValues: false,\n useWeakRefInEval: true,\n } satisfies FeatureFlags & { staticImportValues: boolean };\n const defaultEval: EvalOptionsV2 = {\n mode: 'strict',\n require: 'warn-and-run',\n resolver: 'bundler',\n };\n\n const config = (() => {\n if (configFile === false) {\n return {};\n }\n\n if (configFile !== undefined) {\n return loadConfigFromFile(configFile);\n }\n\n return searchConfig();\n })();\n const configImportLoaders = config.importLoaders;\n const configFeatures = config.features;\n const configEval = config.eval;\n\n const options: StrictOptions = {\n displayName: false,\n evaluate: true,\n evalConsole: 'pipe',\n extensions: ['.cjs', '.cts', '.js', '.jsx', '.mjs', '.mts', '.ts', '.tsx'],\n outputMetadata: false,\n rules: rules ?? [\n {\n action: shaker,\n },\n {\n // The old `ignore` option is used as a default value for `ignore` rule.\n test: ignore ?? nodeModulesRegExp,\n action: 'ignore',\n },\n {\n // Do not ignore ES-modules\n test: (filename, code) => {\n if (!nodeModulesRegExp.test(filename)) {\n return false;\n }\n\n // If a file contains `export` or `import` keywords, we assume it's an ES-module\n return /(?:^|\\*\\/|;|})\\s*(?:export|import)[\\s{]/m.test(code);\n },\n action: shaker,\n },\n ],\n highPriorityPlugins: ['module-resolver'],\n oxcOptions,\n ...config,\n ...rest,\n eval: {\n ...defaultEval,\n ...(configEval ?? {}),\n ...(rest.eval ?? {}),\n },\n importLoaders: {\n ...defaultImportLoaders,\n ...(configImportLoaders ?? {}),\n ...(overridesImportLoaders ?? {}),\n },\n features: {\n ...defaultFeatures,\n ...(configFeatures ?? {}),\n ...rest.features,\n },\n };\n\n cache.set(overrides, options);\n\n return options;\n}\n"],"file":"loadWywOptions.js"}
|
|
1
|
+
{"mappings":"AAAA,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAEjB,SAAS,uBAAuB;AAShC,SAAS,cAAc;AAGvB,MAAM,eAAe;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,eAAe,gBAAgB,aAAa,EAChD,cAAc,aAAa,QACxB,gBAAgB,CAAC,YAAY,SAAS,OAAO,CAC/C,EACF,CAAC;AAMF,MAAM,QAAQ,IAAI,SAAiD;AACnE,MAAM,mBAAmB,EAAE;AAC3B,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB,IAAI,IAAI;CAAC;CAAW;CAAU;CAAU;CAAS,CAAC;AAC5E,MAAM,iBAAiB,IAAI,IAAI;CAAC;CAAW;CAAU;CAAS,CAAC;AAC/D,MAAM,eAAe,IAAI,IAAI,CAAC,SAAS,CAAC;AACxC,MAAM,iBAAiB,IAAI,IAAI,CAAC,UAAU,QAAQ,CAAC;AACnD,MAAM,uBAAsC;CAC1C,KAAK;CACL,KAAK;CACN;AACD,MAAM,yBAAyB,eAC7B,KAAK,WAAW,WAAW,GACvB,aACA,KAAK,QAAQ,QAAQ,KAAK,EAAE,WAAW;AAE7C,MAAM,yBAAyB,iBAC5B,gBAAgB,OAAO,iBAAiB,YAAY,aAAa,eAC7D,aAAsC,UACvC;AAEN,MAAM,iBAAiB,eAA+C;CACpE,MAAM,qBAAqB,sBAAsB,WAAW;CAC5D,MAAM,gBAAgB,cAAc,mBAAmB;AAEvD,KAAI;EACF,MAAM,WAAW,cAAc,QAAQ,mBAAmB;AAC1D,SAAO,cAAc,MAAM;SACrB;AAIR,KAAI;AACF,SAAO,sBAAsB,cAAc,mBAAmB,CAAC;UACxD,OAAO;EACd,MAAM,OACJ,SAAS,OAAO,UAAU,YAAY,UAAU,QAC3C,MAA4B,OAC7B;EACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAEtE,MACE,SAAS,8BACT,QAAQ,SAAS,yBAAyB,IAC1C,QAAQ,SAAS,kBAAkB,EACnC;AACA,SAAM,IAAI,MACR,8BAA8B,mBAAmB,MAC/C,0FACA,4FACH;;AAGH,QAAM;;;AAIV,MAAM,sBAAsB,eAA+C;CACzE,MAAM,qBAAqB,sBAAsB,WAAW;AAC5D,KAAI,KAAK,QAAQ,mBAAmB,KAAK,QAAQ;AAC/C,SAAO,cAAc,mBAAmB;;AAG1C,QAAQ,aAAa,KAAK,mBAAmB,EAAE,UAC7C,EAAE;;AAGN,MAAM,qBAA6C;CACjD,IAAI,aAA4B,QAAQ,KAAK;AAE7C,QAAO,YAAY;AACjB,OAAK,MAAM,eAAe,cAAc;GACtC,MAAM,YAAY,KAAK,KAAK,YAAY,YAAY;AACpD,OAAI,WAAW,UAAU,EAAE;AACzB,WAAO,mBAAmB,UAAU;;;EAIxC,MAAM,YAAY,KAAK,QAAQ,WAAW;AAC1C,eAAa,cAAc,aAAa,OAAO;;AAGjD,QAAO,EAAE;;AAGX,OAAO,SAAS,eACd,YAA4B,kBACb;AACf,KAAI,MAAM,IAAI,UAAU,EAAE;AACxB,SAAO,MAAM,IAAI,UAAU;;CAG7B,MAAM,EACJ,YACA,QACA,OACA,aAAa,EAAE,EACf,eAAe,wBACf,GAAG,SACD;CAEJ,MAAM,kBAAkB;EACtB,sBAAsB;EACtB,aAAa;EACb,UAAU;EACV,YAAY;EACZ,kBAAkB;EACnB;CACD,MAAM,cAA6B;EACjC,QAAQ;EACR,SAAS;EACT,UAAU;EACV,SAAS;EACT,UAAU;EACX;CAED,MAAM,gBAAgB;AACpB,MAAI,eAAe,OAAO;AACxB,UAAO,EAAE;;AAGX,MAAI,eAAe,WAAW;AAC5B,UAAO,mBAAmB,WAAW;;AAGvC,SAAO,cAAc;KACnB;CACJ,MAAM,sBAAsB,OAAO;CACnC,MAAM,iBAAiB,OAAO;CAC9B,MAAM,aAAa,OAAO;CAE1B,MAAM,UAAyB;EAC7B,aAAa;EACb,aAAa;EACb,YAAY;GAAC;GAAQ;GAAQ;GAAO;GAAQ;GAAQ;GAAQ;GAAO;GAAO;EAC1E,gBAAgB;EAChB,OAAO,SAAS;GACd,EACE,QAAQ,QACT;GACD;;IAEE,MAAM,UAAU;IAChB,QAAQ;IACT;GACD;;IAEE,OAAO,UAAU,SAAS;AACxB,SAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE;AACrC,aAAO;;;AAIT,YAAO,2CAA2C,KAAK,KAAK;;IAE9D,QAAQ;IACT;GACF;EACD,qBAAqB,CAAC,kBAAkB;EACxC;EACA,GAAG;EACH,GAAG;EACH,MAAM;GACJ,GAAG;GACH,GAAI,cAAc,EAAE;GACpB,GAAI,KAAK,QAAQ,EAAE;GACpB;EACD,eAAe;GACb,GAAG;GACH,GAAI,uBAAuB,EAAE;GAC7B,GAAI,0BAA0B,EAAE;GACjC;EACD,UAAU;GACR,GAAG;GACH,GAAI,kBAAkB,EAAE;GACxB,GAAG,KAAK;GACT;EACF;CAED,MAAM,eAAe,QAAQ,MAAM;AACnC,KAAI,gBAAgB,CAAC,kBAAkB,IAAI,aAAa,EAAE;AACxD,QAAM,IAAI,MACR,0CAA0C,aAAa,oDACxD;;CAEH,MAAM,eAAe,QAAQ,MAAM;AACnC,KAAI,gBAAgB,CAAC,eAAe,IAAI,aAAa,EAAE;AACrD,QAAM,IAAI,MACR,0CAA0C,aAAa,0CACxD;;CAEH,MAAM,cAAc,QAAQ,MAAM;AAClC,KAAI,eAAe,CAAC,aAAa,IAAI,YAAY,EAAE;AACjD,QAAM,IAAI,MACR,yCAAyC,YAAY,kBACtD;;CAEH,MAAM,aAAa,QAAQ,MAAM;AACjC,KAAI,cAAc,CAAC,eAAe,IAAI,WAAW,EAAE;AACjD,QAAM,IAAI,MACR,wCAAwC,WAAW,6BACpD;;AAGH,OAAM,IAAI,WAAW,QAAQ;AAE7B,QAAO","names":[],"sources":["../../../src/transform/helpers/loadWywOptions.ts"],"version":3,"sourcesContent":["import { existsSync } from 'fs';\nimport { createRequire } from 'module';\nimport path from 'path';\n\nimport { cosmiconfigSync } from 'cosmiconfig';\n\nimport type {\n EvalOptionsV2,\n FeatureFlags,\n ImportLoaders,\n StrictOptions,\n} from '@wyw-in-js/shared';\n\nimport { shaker } from '../../shaker';\nimport type { PluginOptions } from '../../types';\n\nconst searchPlaces = [\n `.wyw-in-jsrc`,\n `.wyw-in-jsrc.json`,\n `.wyw-in-jsrc.yaml`,\n `.wyw-in-jsrc.yml`,\n `.wyw-in-jsrc.mjs`,\n `.wyw-in-jsrc.js`,\n `.wyw-in-jsrc.cjs`,\n `.config/wyw-in-jsrc`,\n `.config/wyw-in-jsrc.json`,\n `.config/wyw-in-jsrc.yaml`,\n `.config/wyw-in-jsrc.yml`,\n `.config/wyw-in-jsrc.mjs`,\n `.config/wyw-in-jsrc.js`,\n `.config/wyw-in-jsrc.cjs`,\n `wyw-in-js.config.mjs`,\n `wyw-in-js.config.js`,\n `wyw-in-js.config.cjs`,\n];\n\nconst explorerSync = cosmiconfigSync('wyw-in-js', {\n searchPlaces: searchPlaces.filter(\n (searchPlace) => !searchPlace.endsWith('.mjs')\n ),\n});\n\nexport type PartialOptions = Partial<Omit<PluginOptions, 'features'>> & {\n features?: Partial<FeatureFlags>;\n};\n\nconst cache = new WeakMap<Partial<PartialOptions>, StrictOptions>();\nconst defaultOverrides = {};\nconst nodeModulesRegExp = /[\\\\/]node_modules[\\\\/]/;\nconst evalResolverModes = new Set(['bundler', 'hybrid', 'native', 'custom']);\nconst evalStrategies = new Set(['execute', 'hybrid', 'static']);\nconst evalRuntimes = new Set(['nodejs']);\nconst evalErrorModes = new Set(['strict', 'loose']);\nconst defaultImportLoaders: ImportLoaders = {\n raw: 'raw',\n url: 'url',\n};\nconst resolveConfigFilePath = (configFile: string): string =>\n path.isAbsolute(configFile)\n ? configFile\n : path.resolve(process.cwd(), configFile);\n\nconst normalizeLoadedConfig = (loadedConfig: unknown): Partial<StrictOptions> =>\n (loadedConfig && typeof loadedConfig === 'object' && 'default' in loadedConfig\n ? (loadedConfig as { default: unknown }).default\n : loadedConfig) as Partial<StrictOptions>;\n\nconst loadMjsConfig = (configFile: string): Partial<StrictOptions> => {\n const resolvedConfigFile = resolveConfigFilePath(configFile);\n const configRequire = createRequire(resolvedConfigFile);\n\n try {\n const cacheKey = configRequire.resolve(resolvedConfigFile);\n delete configRequire.cache[cacheKey];\n } catch {\n // Ignore cache cleanup failures and let the require call surface the real error.\n }\n\n try {\n return normalizeLoadedConfig(configRequire(resolvedConfigFile));\n } catch (error) {\n const code =\n error && typeof error === 'object' && 'code' in error\n ? (error as { code?: string }).code\n : undefined;\n const message = error instanceof Error ? error.message : String(error);\n\n if (\n code === 'ERR_REQUIRE_ASYNC_MODULE' ||\n message.includes('require() async module') ||\n message.includes('top-level await')\n ) {\n throw new Error(\n `[wyw-in-js] Failed to load ${resolvedConfigFile}. ` +\n 'WyW config loading is synchronous, so .mjs config files must not use top-level await ' +\n 'or depend on async ESM modules. Remove top-level await or switch to a synchronous config.'\n );\n }\n\n throw error;\n }\n};\n\nconst loadConfigFromFile = (configFile: string): Partial<StrictOptions> => {\n const resolvedConfigFile = resolveConfigFilePath(configFile);\n if (path.extname(resolvedConfigFile) === '.mjs') {\n return loadMjsConfig(resolvedConfigFile);\n }\n\n return (explorerSync.load(resolvedConfigFile)?.config ??\n {}) as Partial<StrictOptions>;\n};\n\nconst searchConfig = (): Partial<StrictOptions> => {\n let currentDir: string | null = process.cwd();\n\n while (currentDir) {\n for (const searchPlace of searchPlaces) {\n const candidate = path.join(currentDir, searchPlace);\n if (existsSync(candidate)) {\n return loadConfigFromFile(candidate);\n }\n }\n\n const parentDir = path.dirname(currentDir);\n currentDir = parentDir === currentDir ? null : parentDir;\n }\n\n return {};\n};\n\nexport function loadWywOptions(\n overrides: PartialOptions = defaultOverrides\n): StrictOptions {\n if (cache.has(overrides)) {\n return cache.get(overrides)!;\n }\n\n const {\n configFile,\n ignore,\n rules,\n oxcOptions = {},\n importLoaders: overridesImportLoaders,\n ...rest\n } = overrides;\n\n const defaultFeatures = {\n dangerousCodeRemover: true,\n globalCache: true,\n happyDOM: true,\n softErrors: false,\n useWeakRefInEval: true,\n } satisfies FeatureFlags;\n const defaultEval: EvalOptionsV2 = {\n errors: 'strict',\n require: 'warn-and-run',\n resolver: 'bundler',\n runtime: 'nodejs',\n strategy: 'hybrid',\n };\n\n const config = (() => {\n if (configFile === false) {\n return {};\n }\n\n if (configFile !== undefined) {\n return loadConfigFromFile(configFile);\n }\n\n return searchConfig();\n })();\n const configImportLoaders = config.importLoaders;\n const configFeatures = config.features;\n const configEval = config.eval;\n\n const options: StrictOptions = {\n displayName: false,\n evalConsole: 'pipe',\n extensions: ['.cjs', '.cts', '.js', '.jsx', '.mjs', '.mts', '.ts', '.tsx'],\n outputMetadata: false,\n rules: rules ?? [\n {\n action: shaker,\n },\n {\n // The old `ignore` option is used as a default value for `ignore` rule.\n test: ignore ?? nodeModulesRegExp,\n action: 'ignore',\n },\n {\n // Do not ignore ES-modules\n test: (filename, code) => {\n if (!nodeModulesRegExp.test(filename)) {\n return false;\n }\n\n // If a file contains `export` or `import` keywords, we assume it's an ES-module\n return /(?:^|\\*\\/|;|})\\s*(?:export|import)[\\s{]/m.test(code);\n },\n action: shaker,\n },\n ],\n highPriorityPlugins: ['module-resolver'],\n oxcOptions,\n ...config,\n ...rest,\n eval: {\n ...defaultEval,\n ...(configEval ?? {}),\n ...(rest.eval ?? {}),\n },\n importLoaders: {\n ...defaultImportLoaders,\n ...(configImportLoaders ?? {}),\n ...(overridesImportLoaders ?? {}),\n },\n features: {\n ...defaultFeatures,\n ...(configFeatures ?? {}),\n ...rest.features,\n },\n };\n\n const evalResolver = options.eval?.resolver;\n if (evalResolver && !evalResolverModes.has(evalResolver)) {\n throw new Error(\n `[wyw-in-js] Unsupported eval.resolver \"${evalResolver}\". Use \"bundler\", \"hybrid\", \"native\", or \"custom\".`\n );\n }\n const evalStrategy = options.eval?.strategy;\n if (evalStrategy && !evalStrategies.has(evalStrategy)) {\n throw new Error(\n `[wyw-in-js] Unsupported eval.strategy \"${evalStrategy}\". Use \"execute\", \"hybrid\", or \"static\".`\n );\n }\n const evalRuntime = options.eval?.runtime;\n if (evalRuntime && !evalRuntimes.has(evalRuntime)) {\n throw new Error(\n `[wyw-in-js] Unsupported eval.runtime \"${evalRuntime}\". Use \"nodejs\".`\n );\n }\n const evalErrors = options.eval?.errors;\n if (evalErrors && !evalErrorModes.has(evalErrors)) {\n throw new Error(\n `[wyw-in-js] Unsupported eval.errors \"${evalErrors}\". Use \"strict\" or \"loose\".`\n );\n }\n\n cache.set(overrides, options);\n\n return options;\n}\n"],"file":"loadWywOptions.js"}
|
package/esm/transform.js
CHANGED
|
@@ -43,9 +43,11 @@ const canonicalizeForHash = (value) => {
|
|
|
43
43
|
const getEvalCacheKey = (pluginOptions, asyncResolveKey, asyncResolve) => {
|
|
44
44
|
const evalOptions = pluginOptions.eval ?? {};
|
|
45
45
|
const payload = JSON.stringify({
|
|
46
|
-
|
|
46
|
+
errors: evalOptions.errors,
|
|
47
47
|
resolver: evalOptions.resolver,
|
|
48
48
|
require: evalOptions.require,
|
|
49
|
+
runtime: evalOptions.runtime,
|
|
50
|
+
strategy: evalOptions.strategy,
|
|
49
51
|
globals: canonicalizeForHash(encodeGlobals(evalOptions.globals ?? {})),
|
|
50
52
|
customResolver: getResolverId(evalOptions.customResolver),
|
|
51
53
|
customLoader: getResolverId(evalOptions.customLoader),
|
package/esm/transform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;;;;;;AAUA,SAAS,kBAAkB;AAE3B,SAAS,wBAAwB;AAGjC,SAAS,sBAAsB;AAC/B,SAAS,gCAAgC;AACzC,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AAQpC,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAU9B,MAAM,uBAAuB,IAAI,SAG9B;AAIH,MAAM,cAAc,IAAI,SAA6B;AACrD,IAAI,aAAa;AAEjB,MAAM,iBAAiB,OAAgB;AACrC,KAAI,OAAO,OAAO,WAAY,QAAO;CACrC,MAAM,WAAW;CACjB,MAAM,SAAS,YAAY,IAAI,SAAS;AACxC,KAAI,OAAQ,QAAO;AACnB,eAAc;AACd,aAAY,IAAI,UAAU,WAAW;AACrC,QAAO;;AAGT,MAAM,iBAAiB,UACrB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;AAEtE,MAAM,uBAAuB,UAA4B;AACvD,KAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,SAAO,MAAM,KAAK,SAAS,oBAAoB,KAAK,CAAC;;AAGvD,KAAI,cAAc,MAAM,EAAE;AACxB,SAAO,OAAO,YACZ,OAAO,KAAK,MAAM,CACf,MAAM,CACN,KAAK,QAAQ,CAAC,KAAK,oBAAoB,MAAM,KAAK,CAAC,CAAC,CACxD;;AAGH,QAAO;;AAGT,MAAM,mBACJ,eACA,iBACA,iBAKG;CACH,MAAM,cAAc,cAAc,QAAQ,EAAE;CAC5C,MAAM,UAAU,KAAK,UAAU;EAC7B,
|
|
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"}
|
|
@@ -5,11 +5,13 @@ export const isOnActionFinishArgs = (args) => {
|
|
|
5
5
|
return args[0] === "finish" || args[0] === "fail";
|
|
6
6
|
};
|
|
7
7
|
export class EventEmitter {
|
|
8
|
-
static dummy = new EventEmitter(() => {}, () => 0, () => {});
|
|
9
|
-
|
|
8
|
+
static dummy = new EventEmitter(() => {}, () => 0, () => {}, false);
|
|
9
|
+
perfSpanId = 0;
|
|
10
|
+
constructor(onEvent, onAction, onEntrypointEvent, enabled = true) {
|
|
10
11
|
this.onEvent = onEvent;
|
|
11
12
|
this.onAction = onAction;
|
|
12
13
|
this.onEntrypointEvent = onEntrypointEvent;
|
|
14
|
+
this.enabled = enabled;
|
|
13
15
|
}
|
|
14
16
|
action(actonType, idx, entrypointRef, fn) {
|
|
15
17
|
const id = this.onAction("start", performance.now(), actonType, idx, entrypointRef);
|
|
@@ -30,15 +32,46 @@ export class EventEmitter {
|
|
|
30
32
|
this.onEntrypointEvent(sequenceId, performance.now(), event);
|
|
31
33
|
}
|
|
32
34
|
perf(method, fn) {
|
|
35
|
+
const spanId = this.perfSpanId;
|
|
36
|
+
this.perfSpanId += 1;
|
|
37
|
+
const startedAt = performance.now();
|
|
33
38
|
const labels = { method };
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
const startEvent = {
|
|
40
|
+
method,
|
|
41
|
+
spanId,
|
|
42
|
+
startedAt,
|
|
43
|
+
type: "perf-span-start"
|
|
44
|
+
};
|
|
45
|
+
this.onEvent(labels, "start", startEvent);
|
|
46
|
+
const finish = (status, isAsync, error) => {
|
|
47
|
+
const finishedAt = performance.now();
|
|
48
|
+
const finishEvent = {
|
|
49
|
+
durationMs: finishedAt - startedAt,
|
|
50
|
+
finishedAt,
|
|
51
|
+
isAsync,
|
|
52
|
+
method,
|
|
53
|
+
spanId,
|
|
54
|
+
startedAt,
|
|
55
|
+
status,
|
|
56
|
+
type: "perf-span"
|
|
57
|
+
};
|
|
58
|
+
if (error !== undefined) {
|
|
59
|
+
finishEvent.error = error;
|
|
60
|
+
}
|
|
61
|
+
this.onEvent(labels, "finish", finishEvent);
|
|
62
|
+
};
|
|
63
|
+
try {
|
|
64
|
+
const result = fn();
|
|
65
|
+
if (result instanceof Promise) {
|
|
66
|
+
result.then(() => finish("finished", true), (error) => finish("failed", true, error));
|
|
67
|
+
} else {
|
|
68
|
+
finish("finished", false);
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
finish("failed", false, error);
|
|
73
|
+
throw error;
|
|
40
74
|
}
|
|
41
|
-
return result;
|
|
42
75
|
}
|
|
43
76
|
single(labels) {
|
|
44
77
|
this.onEvent({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AA8DA,OAAO,MAAM,uBACX,SAC8B;AAC9B,QAAO,KAAK,OAAO;;AAGrB,OAAO,MAAM,wBACX,SAC+B;AAC/B,QAAO,KAAK,OAAO,YAAY,KAAK,OAAO;;
|
|
1
|
+
{"mappings":"AA8DA,OAAO,MAAM,uBACX,SAC8B;AAC9B,QAAO,KAAK,OAAO;;AAGrB,OAAO,MAAM,wBACX,SAC+B;AAC/B,QAAO,KAAK,OAAO,YAAY,KAAK,OAAO;;AA6B7C,OAAO,MAAM,aAAa;CACxB,OAAO,QAAQ,IAAI,mBACX,UACA,SACA,IACN,MACD;CAED,AAAQ,aAAa;CAErB,YACE,AAAU,SACV,AAAU,UACV,AAAU,mBACV,AAAgB,UAAU,MAC1B;EAJU;EACA;EACA;EACM;;CAGlB,AAAO,OACL,WACA,KACA,eACA,IACA;EACA,MAAM,KAAK,KAAK,SACd,SACA,YAAY,KAAK,EACjB,WACA,KACA,cACD;AAED,MAAI;GACF,MAAM,SAAS,IAAI;AACnB,OAAI,kBAAkB,SAAS;AAC7B,WAAO,WACC,KAAK,SAAS,UAAU,YAAY,KAAK,EAAE,IAAI,KAAK,GACzD,MAAM,KAAK,SAAS,QAAQ,YAAY,KAAK,EAAE,IAAI,MAAM,EAAE,CAC7D;UACI;AACL,SAAK,SAAS,UAAU,YAAY,KAAK,EAAE,IAAI,MAAM;;AAGvD,UAAO;WACA,GAAG;AACV,QAAK,SAAS,QAAQ,YAAY,KAAK,EAAE,IAAI,OAAO,EAAE;AACtD,SAAM;;;CAIV,AAAO,gBAAgB,YAAoB,OAAwB;AACjE,OAAK,kBAAkB,YAAY,YAAY,KAAK,EAAE,MAAM;;CAG9D,AAAO,KAAW,QAAgB,IAAsB;EACtD,MAAM,SAAS,KAAK;AACpB,OAAK,cAAc;EACnB,MAAM,YAAY,YAAY,KAAK;EACnC,MAAM,SAAS,EAAE,QAAQ;EACzB,MAAM,aAA6B;GACjC;GACA;GACA;GACA,MAAM;GACP;AAED,OAAK,QAAQ,QAAQ,SAAS,WAAW;EAEzC,MAAM,UAAU,QAAoB,SAAkB,UAAoB;GACxE,MAAM,aAAa,YAAY,KAAK;GACpC,MAAM,cAA+B;IACnC,YAAY,aAAa;IACzB;IACA;IACA;IACA;IACA;IACA;IACA,MAAM;IACP;AAED,OAAI,UAAU,WAAW;AACvB,gBAAY,QAAQ;;AAGtB,QAAK,QAAQ,QAAQ,UAAU,YAAY;;AAG7C,MAAI;GACF,MAAM,SAAS,IAAI;AACnB,OAAI,kBAAkB,SAAS;AAC7B,WAAO,WACC,OAAO,YAAY,KAAK,GAC7B,UAAU,OAAO,UAAU,MAAM,MAAM,CACzC;UACI;AACL,WAAO,YAAY,MAAM;;AAG3B,UAAO;WACA,OAAO;AACd,UAAO,UAAU,OAAO,MAAM;AAC9B,SAAM;;;CAIV,AAAO,OAAO,QAAiC;AAC7C,OAAK,QACH;GACE,GAAG;GACH,UAAU,IAAI,MAAM;GACrB,EACD,SACD","names":[],"sources":["../../src/utils/EventEmitter.ts"],"version":3,"sourcesContent":["export type OnEvent = (\n labels: Record<string, unknown>,\n type: 'start' | 'finish' | 'single',\n event?: unknown\n) => void;\n\nexport interface IActionCreated {\n actionIdx: string;\n actionType: string;\n type: 'actionCreated';\n}\n\nexport interface ICreatedEvent {\n class: string;\n evaluatedOnly: string[];\n filename: string;\n generation: number;\n idx: string;\n isExportsInherited: boolean;\n only: string[];\n parentId: number | null;\n type: 'created';\n}\n\nexport interface ISupersededEvent {\n type: 'superseded';\n with: number;\n}\n\nexport interface ISetTransformResultEvent {\n isNull: boolean;\n type: 'setTransformResult';\n}\n\nexport type EntrypointEvent =\n | IActionCreated\n | ICreatedEvent\n | ISupersededEvent\n | ISetTransformResultEvent;\n\nexport type OnEntrypointEvent = (\n idx: number,\n timestamp: number,\n event: EntrypointEvent\n) => void;\n\nexport type OnActionStartArgs = [\n phase: 'start',\n timestamp: number,\n type: string,\n idx: string,\n entrypointRef: string,\n];\n\nexport type OnActionFinishArgs = [\n phase: 'finish' | 'fail',\n timestamp: number,\n id: number,\n isAsync: boolean,\n error?: unknown,\n];\n\nexport const isOnActionStartArgs = (\n args: OnActionStartArgs | OnActionFinishArgs\n): args is OnActionStartArgs => {\n return args[0] === 'start';\n};\n\nexport const isOnActionFinishArgs = (\n args: OnActionStartArgs | OnActionFinishArgs\n): args is OnActionFinishArgs => {\n return args[0] === 'finish' || args[0] === 'fail';\n};\n\nexport interface OnAction {\n (...args: OnActionStartArgs): number;\n (...args: OnActionFinishArgs): void;\n}\n\ntype PerfStatus = 'failed' | 'finished';\n\ntype PerfStartEvent = {\n method: string;\n spanId: number;\n startedAt: number;\n type: 'perf-span-start';\n};\n\nexport type PerfFinishEvent = {\n durationMs: number;\n error?: unknown;\n finishedAt: number;\n isAsync: boolean;\n method: string;\n spanId: number;\n startedAt: number;\n status: PerfStatus;\n type: 'perf-span';\n};\n\nexport class EventEmitter {\n static dummy = new EventEmitter(\n () => {},\n () => 0,\n () => {},\n false\n );\n\n private perfSpanId = 0;\n\n constructor(\n protected onEvent: OnEvent,\n protected onAction: OnAction,\n protected onEntrypointEvent: OnEntrypointEvent,\n public readonly enabled = true\n ) {}\n\n public action<TRes>(\n actonType: string,\n idx: string,\n entrypointRef: string,\n fn: () => TRes\n ) {\n const id = this.onAction(\n 'start',\n performance.now(),\n actonType,\n idx,\n entrypointRef\n );\n\n try {\n const result = fn();\n if (result instanceof Promise) {\n result.then(\n () => this.onAction('finish', performance.now(), id, true),\n (e) => this.onAction('fail', performance.now(), id, true, e)\n );\n } else {\n this.onAction('finish', performance.now(), id, false);\n }\n\n return result;\n } catch (e) {\n this.onAction('fail', performance.now(), id, false, e);\n throw e;\n }\n }\n\n public entrypointEvent(sequenceId: number, event: EntrypointEvent) {\n this.onEntrypointEvent(sequenceId, performance.now(), event);\n }\n\n public perf<TRes>(method: string, fn: () => TRes): TRes {\n const spanId = this.perfSpanId;\n this.perfSpanId += 1;\n const startedAt = performance.now();\n const labels = { method };\n const startEvent: PerfStartEvent = {\n method,\n spanId,\n startedAt,\n type: 'perf-span-start',\n };\n\n this.onEvent(labels, 'start', startEvent);\n\n const finish = (status: PerfStatus, isAsync: boolean, error?: unknown) => {\n const finishedAt = performance.now();\n const finishEvent: PerfFinishEvent = {\n durationMs: finishedAt - startedAt,\n finishedAt,\n isAsync,\n method,\n spanId,\n startedAt,\n status,\n type: 'perf-span',\n };\n\n if (error !== undefined) {\n finishEvent.error = error;\n }\n\n this.onEvent(labels, 'finish', finishEvent);\n };\n\n try {\n const result = fn();\n if (result instanceof Promise) {\n result.then(\n () => finish('finished', true),\n (error) => finish('failed', true, error)\n );\n } else {\n finish('finished', false);\n }\n\n return result;\n } catch (error) {\n finish('failed', false, error);\n throw error;\n }\n }\n\n public single(labels: Record<string, unknown>) {\n this.onEvent(\n {\n ...labels,\n datetime: new Date(),\n },\n 'single'\n );\n }\n}\n"],"file":"EventEmitter.js"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { collectOxcProcessorImportsFromProgram } from "../collectOxcExportsAndImports.js";
|
|
2
|
+
import { collectOxcExpressionDependencies } from "../collectOxcTemplateDependencies.js";
|
|
3
|
+
import { EventEmitter } from "../EventEmitter.js";
|
|
4
|
+
import { isOxcNode } from "../oxc/ast.js";
|
|
5
|
+
import { applyOxcReplacements } from "../oxc/replacements.js";
|
|
6
|
+
import { buildOxcCodeFrameError, createOxcLocationLookup } from "../oxc/sourceLocations.js";
|
|
7
|
+
import { getProcessorForImport } from "../processorLookup.js";
|
|
8
|
+
import { resolveProcessorStaticClassName } from "../processorStaticSemantics.js";
|
|
9
|
+
import { collectUsedNames } from "./cleanupBindings.js";
|
|
10
|
+
import { addCandidateInlineConstants, collectSameFileProcessorObjectStaticValuesByLocal, collectSameFileProcessorStaticValuesByLocal, collectWYWMetaExtendsHelperNames, getSameFileProcessorObjectProperty } from "./sameFileStaticValues.js";
|
|
11
|
+
import { collectSameFileProcessorStaticValues, getTagOwner, isTagReferenced } from "./displayName.js";
|
|
12
|
+
import { buildParams } from "./expressionValues.js";
|
|
13
|
+
import { createProcessor, shouldCollectStaticExpressionValues } from "./processorFactory.js";
|
|
14
|
+
import { collectProcessorUsages, collectUsageExpressionSpans } from "./processorUsages.js";
|
|
15
|
+
import { removeUnusedAfterReplacement } from "./cleanupRemovals.js";
|
|
16
|
+
import { insertAddedImports, parseOxc } from "./shared.js";
|
|
17
|
+
export const applyOxcProcessors = (code, fileContext, options, callback, cleanupUnused = false) => {
|
|
18
|
+
const filename = fileContext.filename ?? "unknown.js";
|
|
19
|
+
const eventEmitter = options.eventEmitter ?? EventEmitter.dummy;
|
|
20
|
+
const collectStaticExpressionValues = shouldCollectStaticExpressionValues(options);
|
|
21
|
+
let workingCode = code;
|
|
22
|
+
let program = parseOxc(workingCode, filename);
|
|
23
|
+
const definedProcessors = new Map();
|
|
24
|
+
const removableImportLocals = new Set();
|
|
25
|
+
const removableExpressionRefs = new Set();
|
|
26
|
+
eventEmitter.perf("transform:preeval:processTemplate:imports", () => {
|
|
27
|
+
const imports = eventEmitter.perf("transform:preeval:processTemplate:imports:analysis", () => collectOxcProcessorImportsFromProgram(program, workingCode));
|
|
28
|
+
eventEmitter.perf("transform:preeval:processTemplate:imports:lookup", () => {
|
|
29
|
+
imports.forEach((item) => {
|
|
30
|
+
const localName = item.local.name ?? item.local.code;
|
|
31
|
+
if (item.imported === "side-effect" || !localName) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const [processor, tagSource] = getProcessorForImport({
|
|
35
|
+
imported: item.imported,
|
|
36
|
+
source: item.source
|
|
37
|
+
}, filename, options);
|
|
38
|
+
if (processor) {
|
|
39
|
+
definedProcessors.set(localName, [processor, tagSource]);
|
|
40
|
+
removableImportLocals.add(localName);
|
|
41
|
+
const rootLocalName = localName.split(".")[0];
|
|
42
|
+
if (rootLocalName) {
|
|
43
|
+
removableImportLocals.add(rootLocalName);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
if (definedProcessors.size === 0) {
|
|
50
|
+
return {
|
|
51
|
+
code: workingCode,
|
|
52
|
+
processorClassNamesByLocal: new Map(),
|
|
53
|
+
processors: [],
|
|
54
|
+
staticValueCandidates: [],
|
|
55
|
+
staticValues: []
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
let processorUsages = eventEmitter.perf("transform:preeval:processTemplate:usages", () => collectProcessorUsages(program, definedProcessors));
|
|
59
|
+
if (processorUsages.length === 0) {
|
|
60
|
+
return {
|
|
61
|
+
code: workingCode,
|
|
62
|
+
processorClassNamesByLocal: new Map(),
|
|
63
|
+
processors: [],
|
|
64
|
+
staticValueCandidates: [],
|
|
65
|
+
staticValues: []
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const targetExpressionSpans = processorUsages.flatMap(collectUsageExpressionSpans);
|
|
69
|
+
const extracted = targetExpressionSpans.length > 0 ? eventEmitter.perf("transform:preeval:processTemplate:deps", () => collectOxcExpressionDependencies(workingCode, filename, collectStaticExpressionValues, targetExpressionSpans, options.staticBindings)) : {
|
|
70
|
+
code: workingCode,
|
|
71
|
+
dependencyNames: [],
|
|
72
|
+
expressionValues: [],
|
|
73
|
+
staticValueCandidates: [],
|
|
74
|
+
staticValues: []
|
|
75
|
+
};
|
|
76
|
+
if (extracted.code !== workingCode) {
|
|
77
|
+
workingCode = extracted.code;
|
|
78
|
+
program = eventEmitter.perf("transform:preeval:processTemplate:reparse", () => parseOxc(workingCode, filename));
|
|
79
|
+
processorUsages = eventEmitter.perf("transform:preeval:processTemplate:usages", () => collectProcessorUsages(program, definedProcessors));
|
|
80
|
+
}
|
|
81
|
+
const templateExpressionValues = extracted.expressionValues.map((value) => ({
|
|
82
|
+
...value,
|
|
83
|
+
buildCodeFrameError: (message) => buildOxcCodeFrameError(code, value.ex.loc, message)
|
|
84
|
+
}));
|
|
85
|
+
const loc = createOxcLocationLookup(workingCode);
|
|
86
|
+
const usedNames = eventEmitter.perf("transform:preeval:processTemplate:usedNames", () => collectUsedNames(program));
|
|
87
|
+
const addedImports = [];
|
|
88
|
+
const replacements = [];
|
|
89
|
+
const processors = [];
|
|
90
|
+
const processorClassNamesByLocal = new Map();
|
|
91
|
+
const sameFileProcessorsByLocal = new Map();
|
|
92
|
+
const sameFileProcessorObjectsByLocal = new Map();
|
|
93
|
+
extracted.dependencyNames.forEach((name) => removableImportLocals.add(name));
|
|
94
|
+
eventEmitter.perf("transform:preeval:processTemplate:processors", () => {
|
|
95
|
+
processorUsages.forEach((usage, idx) => {
|
|
96
|
+
const params = buildParams(usage, workingCode, loc, filename, templateExpressionValues, usage.collapseQualifiedCallee);
|
|
97
|
+
if (!params) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const created = createProcessor(usage.definedProcessor, params, usage.target, usage.replacementTarget, usage.ancestors, fileContext, options, workingCode, loc, idx, isTagReferenced(program, usage.ancestors), usedNames, replacements);
|
|
101
|
+
if (!created) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const { astService, processor } = created;
|
|
105
|
+
const owner = getTagOwner(usage.ancestors);
|
|
106
|
+
if (owner?.type === "VariableDeclarator") {
|
|
107
|
+
const { id } = owner;
|
|
108
|
+
if (isOxcNode(id) && id.type === "Identifier") {
|
|
109
|
+
removableExpressionRefs.add(id.name);
|
|
110
|
+
sameFileProcessorsByLocal.set(id.name, processor);
|
|
111
|
+
// Cross-file map (used as a className-only fallback in
|
|
112
|
+
// resolveStaticExport) is restricted to processors whose
|
|
113
|
+
// runtime value IS the className string. Styled-component
|
|
114
|
+
// bindings emit a richer value and must reach consumers via
|
|
115
|
+
// resolveProcessorStaticExport so composition still works.
|
|
116
|
+
const staticClassName = resolveProcessorStaticClassName(processor);
|
|
117
|
+
if (staticClassName) {
|
|
118
|
+
processorClassNamesByLocal.set(id.name, staticClassName);
|
|
119
|
+
} else {
|
|
120
|
+
const replacement = processor.value;
|
|
121
|
+
if ((replacement?.type === "StringLiteral" || replacement?.type === "Literal") && typeof replacement.value === "string") {
|
|
122
|
+
processorClassNamesByLocal.set(id.name, processor.className);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const objectProperty = getSameFileProcessorObjectProperty(usage.ancestors);
|
|
128
|
+
if (objectProperty) {
|
|
129
|
+
const existing = sameFileProcessorObjectsByLocal.get(objectProperty.localName);
|
|
130
|
+
const object = existing ?? {
|
|
131
|
+
properties: new Map(),
|
|
132
|
+
propertyNames: objectProperty.propertyNames
|
|
133
|
+
};
|
|
134
|
+
object.properties.set(objectProperty.propertyName, processor);
|
|
135
|
+
sameFileProcessorObjectsByLocal.set(objectProperty.localName, object);
|
|
136
|
+
}
|
|
137
|
+
processors.push(processor);
|
|
138
|
+
callback(processor);
|
|
139
|
+
addedImports.push(...astService.getAddedImports());
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
const sameFileProcessorStaticValuesByLocal = collectSameFileProcessorStaticValuesByLocal(sameFileProcessorsByLocal, extracted.expressionValues);
|
|
143
|
+
const sameFileProcessorObjectStaticValuesByLocal = collectSameFileProcessorObjectStaticValuesByLocal(sameFileProcessorObjectsByLocal, sameFileProcessorsByLocal, extracted.expressionValues);
|
|
144
|
+
sameFileProcessorObjectStaticValuesByLocal.forEach((value, local) => {
|
|
145
|
+
sameFileProcessorStaticValuesByLocal.set(local, value);
|
|
146
|
+
});
|
|
147
|
+
const replacedCode = applyOxcReplacements(workingCode, replacements);
|
|
148
|
+
const metadataExtendsHelperNames = collectWYWMetaExtendsHelperNames(replacedCode);
|
|
149
|
+
const staticValueCandidates = extracted.staticValueCandidates.filter((candidate) => candidate.imports.length > 0 || !metadataExtendsHelperNames.has(candidate.name));
|
|
150
|
+
const sameFileProcessorStaticValues = collectSameFileProcessorStaticValues(extracted.expressionValues, sameFileProcessorStaticValuesByLocal);
|
|
151
|
+
const codeWithAddedImports = insertAddedImports(replacedCode, program, addedImports);
|
|
152
|
+
return {
|
|
153
|
+
code: cleanupUnused ? eventEmitter.perf("transform:preeval:processTemplate:cleanup", () => removeUnusedAfterReplacement(codeWithAddedImports, filename, removableImportLocals, new Set([...removableExpressionRefs, ...extracted.dependencyNames]), options.preserveSideEffectImportLocals ?? new Set())) : codeWithAddedImports,
|
|
154
|
+
processorClassNamesByLocal,
|
|
155
|
+
processors,
|
|
156
|
+
staticValueCandidates: addCandidateInlineConstants(staticValueCandidates, sameFileProcessorStaticValuesByLocal),
|
|
157
|
+
staticValues: [...extracted.staticValues, ...sameFileProcessorStaticValues]
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=applyOxcProcessors.js.map
|
|
@@ -0,0 +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,SAYA,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,CACpD,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 preserveSideEffectImportLocals?: Set<string>;\n },\n callback: (processor: BaseProcessor) => void,\n cleanupUnused = false\n): ApplyOxcProcessorsResult => {\n const filename = fileContext.filename ?? 'unknown.js';\n const eventEmitter = options.eventEmitter ?? EventEmitter.dummy;\n const collectStaticExpressionValues =\n shouldCollectStaticExpressionValues(options);\n let workingCode = code;\n let program = parseOxc(workingCode, filename);\n const definedProcessors = new Map<string, DefinedProcessor>();\n const removableImportLocals = new Set<string>();\n const removableExpressionRefs = new Set<string>();\n\n eventEmitter.perf('transform:preeval:processTemplate:imports', () => {\n const imports = eventEmitter.perf(\n 'transform:preeval:processTemplate:imports:analysis',\n () => collectOxcProcessorImportsFromProgram(program, workingCode)\n );\n\n eventEmitter.perf(\n 'transform:preeval:processTemplate:imports:lookup',\n () => {\n imports.forEach((item) => {\n const localName = item.local.name ?? item.local.code;\n if (item.imported === 'side-effect' || !localName) {\n return;\n }\n\n const [processor, tagSource] = getProcessorForImport(\n {\n imported: item.imported,\n source: item.source,\n },\n filename,\n options\n );\n\n if (processor) {\n definedProcessors.set(localName, [processor, tagSource]);\n removableImportLocals.add(localName);\n const rootLocalName = localName.split('.')[0];\n if (rootLocalName) {\n removableImportLocals.add(rootLocalName);\n }\n }\n });\n }\n );\n });\n\n if (definedProcessors.size === 0) {\n return {\n code: workingCode,\n processorClassNamesByLocal: new Map(),\n processors: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n }\n\n let processorUsages = eventEmitter.perf(\n 'transform:preeval:processTemplate:usages',\n () => collectProcessorUsages(program, definedProcessors)\n );\n if (processorUsages.length === 0) {\n return {\n code: workingCode,\n processorClassNamesByLocal: new Map(),\n processors: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n }\n\n const targetExpressionSpans = processorUsages.flatMap(\n collectUsageExpressionSpans\n );\n\n const extracted =\n targetExpressionSpans.length > 0\n ? eventEmitter.perf('transform:preeval:processTemplate:deps', () =>\n collectOxcExpressionDependencies(\n workingCode,\n filename,\n collectStaticExpressionValues,\n targetExpressionSpans,\n options.staticBindings\n )\n )\n : {\n code: workingCode,\n dependencyNames: [],\n expressionValues: [],\n staticValueCandidates: [],\n staticValues: [],\n };\n\n if (extracted.code !== workingCode) {\n workingCode = extracted.code;\n program = eventEmitter.perf(\n 'transform:preeval:processTemplate:reparse',\n () => parseOxc(workingCode, filename)\n );\n processorUsages = eventEmitter.perf(\n 'transform:preeval:processTemplate:usages',\n () => collectProcessorUsages(program, definedProcessors)\n );\n }\n\n const templateExpressionValues = extracted.expressionValues.map(\n (value) =>\n ({\n ...value,\n buildCodeFrameError: (message: string) =>\n buildOxcCodeFrameError(code, value.ex.loc!, message),\n }) as ExpressionValue\n );\n const loc = createOxcLocationLookup(workingCode);\n const usedNames = eventEmitter.perf(\n 'transform:preeval:processTemplate:usedNames',\n () => collectUsedNames(program)\n );\n const addedImports: AddedImport[] = [];\n const replacements: Replacement[] = [];\n const processors: BaseProcessor[] = [];\n const processorClassNamesByLocal = new Map<string, string>();\n const sameFileProcessorsByLocal = new Map<string, BaseProcessor>();\n const sameFileProcessorObjectsByLocal = new Map<\n string,\n SameFileProcessorObject\n >();\n extracted.dependencyNames.forEach((name: string) =>\n removableImportLocals.add(name)\n );\n\n eventEmitter.perf('transform:preeval:processTemplate:processors', () => {\n processorUsages.forEach((usage, idx) => {\n const params = buildParams(\n usage,\n workingCode,\n loc,\n filename,\n templateExpressionValues,\n usage.collapseQualifiedCallee\n );\n if (!params) {\n return;\n }\n\n const created = createProcessor(\n usage.definedProcessor,\n params,\n usage.target,\n usage.replacementTarget,\n usage.ancestors,\n fileContext,\n options,\n workingCode,\n loc,\n idx,\n isTagReferenced(program, usage.ancestors),\n usedNames,\n replacements\n );\n\n if (!created) {\n return;\n }\n\n const { astService, processor } = created;\n\n const owner = getTagOwner(usage.ancestors);\n if (owner?.type === 'VariableDeclarator') {\n const { id } = owner;\n if (isOxcNode(id) && id.type === 'Identifier') {\n removableExpressionRefs.add(id.name);\n sameFileProcessorsByLocal.set(id.name, processor);\n // Cross-file map (used as a className-only fallback in\n // resolveStaticExport) is restricted to processors whose\n // runtime value IS the className string. Styled-component\n // bindings emit a richer value and must reach consumers via\n // resolveProcessorStaticExport so composition still works.\n const staticClassName = resolveProcessorStaticClassName(processor);\n if (staticClassName) {\n processorClassNamesByLocal.set(id.name, staticClassName);\n } else {\n const replacement = processor.value as {\n type?: string;\n value?: unknown;\n };\n if (\n (replacement?.type === 'StringLiteral' ||\n replacement?.type === 'Literal') &&\n typeof replacement.value === 'string'\n ) {\n processorClassNamesByLocal.set(id.name, processor.className);\n }\n }\n }\n }\n\n const objectProperty = getSameFileProcessorObjectProperty(\n usage.ancestors\n );\n if (objectProperty) {\n const existing = sameFileProcessorObjectsByLocal.get(\n objectProperty.localName\n );\n const object = existing ?? {\n properties: new Map<string, BaseProcessor>(),\n propertyNames: objectProperty.propertyNames,\n };\n\n object.properties.set(objectProperty.propertyName, processor);\n sameFileProcessorObjectsByLocal.set(objectProperty.localName, object);\n }\n\n processors.push(processor);\n callback(processor);\n addedImports.push(...astService.getAddedImports());\n });\n });\n const sameFileProcessorStaticValuesByLocal =\n collectSameFileProcessorStaticValuesByLocal(\n sameFileProcessorsByLocal,\n extracted.expressionValues\n );\n const sameFileProcessorObjectStaticValuesByLocal =\n collectSameFileProcessorObjectStaticValuesByLocal(\n sameFileProcessorObjectsByLocal,\n sameFileProcessorsByLocal,\n extracted.expressionValues\n );\n sameFileProcessorObjectStaticValuesByLocal.forEach((value, local) => {\n sameFileProcessorStaticValuesByLocal.set(local, value);\n });\n\n const replacedCode = applyOxcReplacements(workingCode, replacements);\n const metadataExtendsHelperNames =\n collectWYWMetaExtendsHelperNames(replacedCode);\n const staticValueCandidates = extracted.staticValueCandidates.filter(\n (candidate) =>\n candidate.imports.length > 0 ||\n !metadataExtendsHelperNames.has(candidate.name)\n );\n const sameFileProcessorStaticValues = collectSameFileProcessorStaticValues(\n extracted.expressionValues,\n sameFileProcessorStaticValuesByLocal\n );\n const codeWithAddedImports = insertAddedImports(\n replacedCode,\n program,\n addedImports\n );\n\n return {\n code: cleanupUnused\n ? eventEmitter.perf('transform:preeval:processTemplate:cleanup', () =>\n removeUnusedAfterReplacement(\n codeWithAddedImports,\n filename,\n removableImportLocals,\n new Set([...removableExpressionRefs, ...extracted.dependencyNames]),\n options.preserveSideEffectImportLocals ?? new Set()\n )\n )\n : codeWithAddedImports,\n processorClassNamesByLocal,\n processors,\n staticValueCandidates: addCandidateInlineConstants(\n staticValueCandidates,\n sameFileProcessorStaticValuesByLocal\n ),\n staticValues: [...extracted.staticValues, ...sameFileProcessorStaticValues],\n };\n};\n"],"file":"applyOxcProcessors.js"}
|