From ba75c0df1731a3f1fb7bce4e602fc90a5d400e82 Mon Sep 17 00:00:00 2001 From: Eduardo Speroni Date: Mon, 5 Jan 2026 11:52:56 -0300 Subject: [PATCH] fix: ts-patch transform --- .../src/transformers/NativeClass/index.ts | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/packages/webpack5/src/transformers/NativeClass/index.ts b/packages/webpack5/src/transformers/NativeClass/index.ts index 3610190a35..e3f36114f4 100644 --- a/packages/webpack5/src/transformers/NativeClass/index.ts +++ b/packages/webpack5/src/transformers/NativeClass/index.ts @@ -19,7 +19,7 @@ export default function (context: ts.TransformationContext, ...args) { return (sourceFile: ts.SourceFile) => { if (sourceFile.isDeclarationFile) return sourceFile; let mutated = false; - + // Minimal mutable shape type MutableNode = ts.Node & { flags?: ts.NodeFlags; @@ -182,8 +182,8 @@ export default function (context: ts.TransformationContext, ...args) { } function visitNode(node: ts.Node): ts.Node { - // Do not traverse synthesized helper trees; leave them intact - if (((node as MutableNode).flags ?? 0) & ts.NodeFlags.Synthesized ) { + // Do not traverse synthesized helper trees; leave them intact + if (((node as MutableNode).flags ?? 0) & ts.NodeFlags.Synthesized) { return node; } if (ts.isSourceFile(node)) { @@ -223,7 +223,9 @@ export default function (context: ts.TransformationContext, ...args) { } const result: ts.Statement[] = []; for (const statement of statements) { - if (((statement as MutableNode).flags ?? 0) & ts.NodeFlags.Synthesized) { + if ( + ((statement as MutableNode).flags ?? 0) & ts.NodeFlags.Synthesized + ) { result.push(statement); continue; } @@ -282,22 +284,6 @@ export default function (context: ts.TransformationContext, ...args) { } return [changed ? factory.createNodeArray(result) : statements, changed]; } - - - // we detect ts-patch - if (args.length) { - const statements= ts.visitNodes(sourceFile.statements, visitNode) as unknown as ts.Statement[]; - if (!mutated) { - return sourceFile; - } - const updatedSource = factory.updateSourceFile(sourceFile, statements as unknown as ts.Statement[]); - // Do NOT clear or rebind the entire SourceFile here. Doing so can break TS's - // import usage analysis and lead to import elision. The factory/update API - // preserves parents/bindings for original nodes (like imports). We only - // synthesize/bind the newly inserted class replacement statements. - return updatedSource; - } - const updated = ts.visitNode(sourceFile, visitNode) as ts.SourceFile; if (!mutated) return sourceFile; return updated; @@ -339,4 +325,4 @@ function setSynthesizedRangeRecursive(node: ts.Node): void { function setOriginalRecursive(node: ts.Node, original: ts.Node): void { ts.setOriginalNode(node, original); ts.forEachChild(node, (child) => setOriginalRecursive(child, original)); -} \ No newline at end of file +}