From fecc14506a7167dcb796887f61c9d5e412e2146c Mon Sep 17 00:00:00 2001 From: Sebastian Cao Date: Thu, 9 Jul 2026 13:33:44 +0800 Subject: [PATCH] Fixed `SyntaxError` when obfuscating a class that extends a boolean literal (#1420) --- CHANGELOG.md | 4 ++++ .../BooleanLiteralTransformer.ts | 9 +++++++++ .../BooleanLiteralTransformer.spec.ts | 18 ++++++++++++++++++ .../fixtures/super-class-value.js | 1 + 4 files changed, 32 insertions(+) create mode 100644 test/functional-tests/node-transformers/converting-transformers/boolean-literal-transformer/fixtures/super-class-value.js diff --git a/CHANGELOG.md b/CHANGELOG.md index eb4ce789..f4ae6370 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ Change Log +v5.4.5 +--- +* Fixed `SyntaxError` when obfuscating a class that extends a boolean literal (e.g. `class C extends true {}`). Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1131 + v5.4.4 --- * Fixed `Invalid regular expression` error when obfuscating code that uses ES2025 RegExp pattern modifiers (e.g. `/(?i:abc)/`). Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1410 diff --git a/src/node-transformers/converting-transformers/BooleanLiteralTransformer.ts b/src/node-transformers/converting-transformers/BooleanLiteralTransformer.ts index d3a6672c..cb8bbe16 100644 --- a/src/node-transformers/converting-transformers/BooleanLiteralTransformer.ts +++ b/src/node-transformers/converting-transformers/BooleanLiteralTransformer.ts @@ -66,6 +66,15 @@ export class BooleanLiteralTransformer extends AbstractNodeTransformer { return literalNode; } + /** + * A class heritage (`extends`) must be a `LeftHandSideExpression`, so replacing a + * boolean literal there with a unary expression (`class Foo extends ![] {}`) would + * produce a `SyntaxError`. Keep the original literal in that position. + */ + if ('superClass' in parentNode && parentNode.superClass === literalNode) { + return literalNode; + } + const literalValue: ESTree.SimpleLiteral['value'] = literalNode.value; const unaryExpressionNode: ESTree.UnaryExpression = literalValue diff --git a/test/functional-tests/node-transformers/converting-transformers/boolean-literal-transformer/BooleanLiteralTransformer.spec.ts b/test/functional-tests/node-transformers/converting-transformers/boolean-literal-transformer/BooleanLiteralTransformer.spec.ts index de8f025b..863ab61a 100644 --- a/test/functional-tests/node-transformers/converting-transformers/boolean-literal-transformer/BooleanLiteralTransformer.spec.ts +++ b/test/functional-tests/node-transformers/converting-transformers/boolean-literal-transformer/BooleanLiteralTransformer.spec.ts @@ -46,4 +46,22 @@ describe('BooleanLiteralTransformer', () => { assert.match(obfuscatedCode, regExp); }); }); + + describe('boolean literal as a class super class', () => { + const regExp: RegExp = /^class Foo extends true *{}$/; + + let obfuscatedCode: string; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/super-class-value.js'); + + obfuscatedCode = JavaScriptObfuscator.obfuscate(code, { + ...NO_ADDITIONAL_NODES_PRESET + }).getObfuscatedCode(); + }); + + it('should not transform a boolean literal used as a class heritage to avoid a `SyntaxError`', () => { + assert.match(obfuscatedCode, regExp); + }); + }); }); diff --git a/test/functional-tests/node-transformers/converting-transformers/boolean-literal-transformer/fixtures/super-class-value.js b/test/functional-tests/node-transformers/converting-transformers/boolean-literal-transformer/fixtures/super-class-value.js new file mode 100644 index 00000000..7e5c9c82 --- /dev/null +++ b/test/functional-tests/node-transformers/converting-transformers/boolean-literal-transformer/fixtures/super-class-value.js @@ -0,0 +1 @@ +class Foo extends true {}