From 59624a4ebe5d9bb4f42f0dd6b04c9427e0fed479 Mon Sep 17 00:00:00 2001 From: Igor Randjelovic Date: Mon, 14 Nov 2022 13:13:06 +0100 Subject: [PATCH] fix(webpack): make NativeClass transformer backwards compatible --- .../webpack5/src/stubs/default.config.stub.js | 2 -- .../src/transformers/NativeClass/index.ts | 26 +++++++++++-------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/webpack5/src/stubs/default.config.stub.js b/packages/webpack5/src/stubs/default.config.stub.js index a561e0e2b..45573416d 100644 --- a/packages/webpack5/src/stubs/default.config.stub.js +++ b/packages/webpack5/src/stubs/default.config.stub.js @@ -8,5 +8,3 @@ module.exports = (env) => { return webpack.resolveConfig(); }; - - diff --git a/packages/webpack5/src/transformers/NativeClass/index.ts b/packages/webpack5/src/transformers/NativeClass/index.ts index 1a8d19a3c..4b3ceea52 100644 --- a/packages/webpack5/src/transformers/NativeClass/index.ts +++ b/packages/webpack5/src/transformers/NativeClass/index.ts @@ -1,20 +1,24 @@ import ts from 'typescript'; /** - * A TypeScript transform that compiles classes marked with @NativeClass as es5 & commonjs - * - * @param ctx + * A TypeScript transform that compiles classes marked with `@NativeClass` as es5 */ export default function (ctx: ts.TransformationContext) { function isNativeClassExtension(node: ts.ClassDeclaration) { - return ( - ts.canHaveDecorators(node) && - ts.getDecorators(node) && - ts.getDecorators(node).filter((d) => { - const fullText = d.getFullText().trim(); - return fullText.indexOf('@NativeClass') > -1; - }).length > 0 - ); + let decorators: Readonly; + + if ('canHaveDecorators' in ts && ts.canHaveDecorators(node)) { + // use the newer decorators API when using a newer typescript version + decorators = ts.getDecorators(node); + } else { + // fallback to old behavior on older typescript versions + decorators = node.decorators; + } + + return !!decorators?.some((d) => { + const fullText = d.getFullText().trim(); + return fullText.indexOf('@NativeClass') > -1; + }); } function visitNode(node: ts.Node): ts.Node { if (ts.isClassDeclaration(node) && isNativeClassExtension(node)) {