瀏覽代碼

Improved ObjectPatternPropertiesTransformer logic. Added tests.

sanex3339 4 年之前
父節點
當前提交
7ce5f964d6

文件差異過大導致無法顯示
+ 0 - 0
dist/index.browser.js


文件差異過大導致無法顯示
+ 0 - 0
dist/index.cli.js


文件差異過大導致無法顯示
+ 0 - 0
dist/index.js


+ 1 - 1
package.json

@@ -70,7 +70,7 @@
     "eslint-plugin-prefer-arrow": "1.2.2",
     "eslint-plugin-unicorn": "21.0.0",
     "fork-ts-checker-notifier-webpack-plugin": "3.0.0",
-    "fork-ts-checker-webpack-plugin": "5.0.12",
+    "fork-ts-checker-webpack-plugin": "5.0.13",
     "mocha": "8.1.0",
     "nyc": "15.1.0",
     "pjson": "1.0.9",

+ 12 - 0
src/node-transformers/converting-transformers/ObjectPatternPropertiesTransformer.ts

@@ -3,6 +3,8 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import * as ESTree from 'estree';
 
+import { TNodeWithLexicalScope } from '../../types/node/TNodeWithLexicalScope';
+
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
 import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
@@ -11,6 +13,7 @@ import { NodeTransformationStage } from '../../enums/node-transformers/NodeTrans
 
 import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
 import { NodeGuards } from '../../node/NodeGuards';
+import { NodeLexicalScopeUtils } from '../../node/NodeLexicalScopeUtils';
 import { NodeUtils } from '../../node/NodeUtils';
 
 @injectable()
@@ -62,6 +65,15 @@ export class ObjectPatternPropertiesTransformer extends AbstractNodeTransformer
             return propertyNode;
         }
 
+        if (!this.options.renameGlobals) {
+            const lexicalScope: TNodeWithLexicalScope | undefined = NodeLexicalScopeUtils.getLexicalScope(propertyNode);
+            const shouldNotTransformGlobalPropertyNode: boolean = !!lexicalScope && NodeGuards.isProgramNode(lexicalScope);
+
+            if (shouldNotTransformGlobalPropertyNode) {
+                return propertyNode;
+            }
+        }
+
         propertyNode.shorthand = false;
         propertyNode.value = NodeUtils.clone(propertyNode.value);
 

+ 5 - 3
test/dev/dev.ts

@@ -7,14 +7,16 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
 
     let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
         `
-            const {bar, baz} = {bar: 1, baz: 2};
-            console.log(bar, baz);
+            function foo () {
+                const {bar, baz} = {bar: 1, baz: 2};
+                console.log(bar, baz);
+            }
         `,
         {
             ...NO_ADDITIONAL_NODES_PRESET,
             compact: false,
             simplify: true,
-            renameGlobals: true
+            renameGlobals: false
         }
     ).getObfuscatedCode();
 

+ 129 - 0
test/functional-tests/node-transformers/converting-transformers/object-pattern-properties-transformer/ObjectPatternPropertiesTransformer.spec.ts

@@ -0,0 +1,129 @@
+import { assert } from 'chai';
+
+import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/NoCustomNodes';
+
+import { readFileAsString } from '../../../../helpers/readFileAsString';
+
+import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade';
+
+describe('ObjectPatternPropertiesTransformer', () => {
+    describe('Variant #1: function scope', () => {
+        describe('Variant #1: `renameGlobals` option is disabled', () => {
+            const regExp: RegExp = new RegExp(
+                'const { *' +
+                    'foo: *_0x([a-f0-9]){4,6}, *' +
+                    'bar: *_0x([a-f0-9]){4,6}, *' +
+                    '..._0x([a-f0-9]){4,6}' +
+                '} *= *{}; *' +
+                'console\\[\'log\']\\(_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}\\);'
+            );
+
+            let obfuscatedCode: string;
+
+            before(() => {
+                const code: string = readFileAsString(__dirname + '/fixtures/function-scope.js');
+
+                obfuscatedCode = JavaScriptObfuscator.obfuscate(
+                    code,
+                    {
+                        ...NO_ADDITIONAL_NODES_PRESET,
+                        renameGlobals: false
+                    }
+                ).getObfuscatedCode();
+            });
+
+            it('should transform object properties', () => {
+                assert.match(obfuscatedCode, regExp);
+            });
+        });
+
+        describe('Variant #2: `renameGlobals` option is enabled', () => {
+            const regExp: RegExp = new RegExp(
+                'const { *' +
+                    'foo: *_0x([a-f0-9]){4,6}, *' +
+                    'bar: *_0x([a-f0-9]){4,6}, *' +
+                    '..._0x([a-f0-9]){4,6}' +
+                '} *= *{}; *' +
+                'console\\[\'log\']\\(_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}\\);'
+            );
+
+            let obfuscatedCode: string;
+
+            before(() => {
+                const code: string = readFileAsString(__dirname + '/fixtures/function-scope.js');
+
+                obfuscatedCode = JavaScriptObfuscator.obfuscate(
+                    code,
+                    {
+                        ...NO_ADDITIONAL_NODES_PRESET,
+                        renameGlobals: true
+                    }
+                ).getObfuscatedCode();
+            });
+
+            it('should transform object properties', () => {
+                assert.match(obfuscatedCode, regExp);
+            });
+        });
+    });
+
+    describe('Variant #2: global scope', () => {
+        describe('Variant #1: `renameGlobals` option is disabled', () => {
+            const regExp: RegExp = new RegExp(
+                'const { *' +
+                    'foo, *' +
+                    'bar, *' +
+                    '...rest' +
+                '} *= *{}; *' +
+                'console\\[\'log\']\\(foo, *bar, *rest\\);'
+            );
+
+            let obfuscatedCode: string;
+
+            before(() => {
+                const code: string = readFileAsString(__dirname + '/fixtures/global-scope.js');
+
+                obfuscatedCode = JavaScriptObfuscator.obfuscate(
+                    code,
+                    {
+                        ...NO_ADDITIONAL_NODES_PRESET,
+                        renameGlobals: false
+                    }
+                ).getObfuscatedCode();
+            });
+
+            it('should transform object properties', () => {
+                assert.match(obfuscatedCode, regExp);
+            });
+        });
+
+        describe('Variant #2: `renameGlobals` option is enabled', () => {
+            const regExp: RegExp = new RegExp(
+                'const { *' +
+                    'foo: *_0x([a-f0-9]){4,6}, *' +
+                    'bar: *_0x([a-f0-9]){4,6}, *' +
+                    '..._0x([a-f0-9]){4,6}' +
+                '} *= *{}; *' +
+                'console\\[\'log\']\\(_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}, *_0x([a-f0-9]){4,6}\\);'
+            );
+
+            let obfuscatedCode: string;
+
+            before(() => {
+                const code: string = readFileAsString(__dirname + '/fixtures/global-scope.js');
+
+                obfuscatedCode = JavaScriptObfuscator.obfuscate(
+                    code,
+                    {
+                        ...NO_ADDITIONAL_NODES_PRESET,
+                        renameGlobals: true
+                    }
+                ).getObfuscatedCode();
+            });
+
+            it('should transform object properties', () => {
+                assert.match(obfuscatedCode, regExp);
+            });
+        });
+    });
+});

+ 4 - 0
test/functional-tests/node-transformers/converting-transformers/object-pattern-properties-transformer/fixtures/function-scope.js

@@ -0,0 +1,4 @@
+(function () {
+    const {foo, bar, ...rest} = {};
+    console.log(foo, bar, rest);
+})();

+ 2 - 0
test/functional-tests/node-transformers/converting-transformers/object-pattern-properties-transformer/fixtures/global-scope.js

@@ -0,0 +1,2 @@
+const {foo, bar, ...rest} = {};
+console.log(foo, bar, rest);

+ 1 - 0
test/index.spec.ts

@@ -91,6 +91,7 @@ import './functional-tests/node-transformers/converting-transformers/method-defi
 import './functional-tests/node-transformers/converting-transformers/numbers-to-numerical-expressions-transformer/NumbersToNumericalExpressionsTransformer.spec';
 import './functional-tests/node-transformers/converting-transformers/object-expression-keys-transformer/ObjectExpressionKeysTransformer.spec';
 import './functional-tests/node-transformers/converting-transformers/object-expression-transformer/ObjectExpressionTransformer.spec';
+import './functional-tests/node-transformers/converting-transformers/object-pattern-properties-transformer/ObjectPatternPropertiesTransformer.spec';
 import './functional-tests/node-transformers/converting-transformers/split-string-transformer/SplitStringTransformer.spec';
 import './functional-tests/node-transformers/converting-transformers/template-literal-transformer/TemplateLiteralTransformer.spec';
 import './functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec';

+ 4 - 4
yarn.lock

@@ -2395,10 +2395,10 @@ [email protected]:
   dependencies:
     node-notifier "^6.0.0"
 
[email protected]2:
-  version "5.0.12"
-  resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.0.12.tgz#6bd63e224c20a073c450ccde0daad0db365d4b8b"
-  integrity sha512-B/NZNlMq6nuPosU6M+QKxRqX9irG/8M2GVwV/4ufzM2R3cm7XQVcG4zLibJowE7e194Qw8/qppjiz+UBKzyZxw==
[email protected]3:
+  version "5.0.13"
+  resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.0.13.tgz#916170e311d08f6dc0d85e1d8d4c8627941611d4"
+  integrity sha512-87KZknpv0HcXSl1/Z48Wbplcp9x6Pu7ZroZMXK8z2LdfBmPyCbka7E6qy5ubgfzQqjIsWBXilFTTRxi2Z6238Q==
   dependencies:
     "@babel/code-frame" "^7.8.3"
     "@types/json-schema" "^7.0.5"

部分文件因文件數量過多而無法顯示