Browse Source

new `deadCodeInjectionThresholdRule` and tests

sanex3339 8 years ago
parent
commit
6fe0136794

+ 20 - 1
dist/index.js

@@ -6482,6 +6482,17 @@ var OptionsNormalizer = function () {
             }
             return options;
         }
+    }, {
+        key: "deadCodeInjectionRule",
+        value: function deadCodeInjectionRule(options) {
+            if (options.deadCodeInjection) {
+                options = Object.assign({}, options, OptionsNormalizer.ENABLED_DEAD_CODE_INJECTION_OPTIONS);
+                if (!options.stringArrayThreshold) {
+                    options = Object.assign({}, options, OptionsNormalizer.ENABLED_STRING_ARRAY_THRESHOLD_OPTIONS);
+                }
+            }
+            return options;
+        }
     }, {
         key: "deadCodeInjectionThresholdRule",
         value: function deadCodeInjectionThresholdRule(options) {
@@ -6602,6 +6613,14 @@ OptionsNormalizer.DISABLED_STRING_ARRAY_OPTIONS = {
     stringArrayEncoding: false,
     stringArrayThreshold: 0
 };
+OptionsNormalizer.ENABLED_DEAD_CODE_INJECTION_OPTIONS = {
+    deadCodeInjection: true,
+    stringArray: true
+};
+OptionsNormalizer.ENABLED_STRING_ARRAY_THRESHOLD_OPTIONS = {
+    stringArray: true,
+    stringArrayThreshold: 0.75
+};
 OptionsNormalizer.SELF_DEFENDING_OPTIONS = {
     compact: true,
     selfDefending: true
@@ -6609,7 +6628,7 @@ OptionsNormalizer.SELF_DEFENDING_OPTIONS = {
 OptionsNormalizer.STRING_ARRAY_ENCODING_OPTIONS = {
     stringArrayEncoding: 'base64'
 };
-OptionsNormalizer.normalizerRules = [OptionsNormalizer.controlFlowFlatteningThresholdRule, OptionsNormalizer.deadCodeInjectionThresholdRule, OptionsNormalizer.domainLockRule, OptionsNormalizer.selfDefendingRule, OptionsNormalizer.sourceMapBaseUrlRule, OptionsNormalizer.sourceMapFileNameRule, OptionsNormalizer.stringArrayRule, OptionsNormalizer.stringArrayEncodingRule, OptionsNormalizer.stringArrayThresholdRule];
+OptionsNormalizer.normalizerRules = [OptionsNormalizer.controlFlowFlatteningThresholdRule, OptionsNormalizer.deadCodeInjectionRule, OptionsNormalizer.deadCodeInjectionThresholdRule, OptionsNormalizer.domainLockRule, OptionsNormalizer.selfDefendingRule, OptionsNormalizer.sourceMapBaseUrlRule, OptionsNormalizer.sourceMapFileNameRule, OptionsNormalizer.stringArrayRule, OptionsNormalizer.stringArrayEncodingRule, OptionsNormalizer.stringArrayThresholdRule];
 exports.OptionsNormalizer = OptionsNormalizer;
 
 /***/ }),

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "javascript-obfuscator",
-  "version": "0.9.2",
+  "version": "0.10.0",
   "description": "JavaScript obfuscator",
   "keywords": [
     "obfuscator",

+ 39 - 0
src/options/OptionsNormalizer.ts

@@ -33,6 +33,22 @@ export class OptionsNormalizer {
         stringArrayThreshold: 0
     };
 
+    /**
+     * @type {TInputOptions}
+     */
+    private static readonly ENABLED_DEAD_CODE_INJECTION_OPTIONS: TInputOptions = {
+        deadCodeInjection: true,
+        stringArray: true
+    };
+
+    /**
+     * @type {TInputOptions}
+     */
+    private static readonly ENABLED_STRING_ARRAY_THRESHOLD_OPTIONS: TInputOptions = {
+        stringArray: true,
+        stringArrayThreshold: 0.75
+    };
+
     /**
      * @type {TInputOptions}
      */
@@ -53,6 +69,7 @@ export class OptionsNormalizer {
      */
     private static readonly normalizerRules: TOptionsNormalizerRule[] = [
         OptionsNormalizer.controlFlowFlatteningThresholdRule,
+        OptionsNormalizer.deadCodeInjectionRule,
         OptionsNormalizer.deadCodeInjectionThresholdRule,
         OptionsNormalizer.domainLockRule,
         OptionsNormalizer.selfDefendingRule,
@@ -94,6 +111,28 @@ export class OptionsNormalizer {
         return options;
     }
 
+    /**
+     * @param options
+     * @returns {IOptions}
+     */
+    private static deadCodeInjectionRule (options: IOptions): IOptions {
+        if (options.deadCodeInjection) {
+            options = {
+                ...options,
+                ...OptionsNormalizer.ENABLED_DEAD_CODE_INJECTION_OPTIONS,
+            };
+
+            if (!options.stringArrayThreshold) {
+                options = {
+                    ...options,
+                    ...OptionsNormalizer.ENABLED_STRING_ARRAY_THRESHOLD_OPTIONS
+                };
+            }
+        }
+
+        return options;
+    }
+
     /**
      * @param options
      * @returns {IOptions}

+ 11 - 10
test/dev/dev.ts

@@ -10,31 +10,32 @@ import { NO_CUSTOM_NODES_PRESET } from '../../src/options/presets/NoCustomNodes'
                 if (true) {
                     var foo = function () {
                         console.log('abc');
-                        console.log('cde');
-                        console.log('efg');
-                        console.log('hij');
                     };
                     var bar = function () {
-                        console.log('klm');
-                        console.log('nop');
-                        console.log('qrs');
+                        console.log('def');
                     };
                     var baz = function () {
-                        console.log('tuv');
-                        console.log('wxy');
-                        console.log('z');
+                        console.log('ghi');
+                    };
+                    var bark = function () {
+                        console.log('jkl');
+                    };
+                    var hawk = function () {
+                        console.log('mno');
                     };
 
                     foo();
                     bar();
                     baz();
+                    bark();
+                    hawk();
                 }
             })();
         `,
         {
             ...NO_CUSTOM_NODES_PRESET,
             compact: false,
-            stringArray: true,
+            stringArray: false,
             stringArrayThreshold: 1,
             deadCodeInjection: true,
             deadCodeInjectionThreshold: 1

+ 40 - 0
test/unit-tests/options/options-normalizer/OptionsNormalizer.spec.ts

@@ -40,6 +40,46 @@ describe('OptionsNormalizer', () => {
             assert.deepEqual(getNormalizedOptions(optionsPreset), expectedOptionsPreset);
         });
 
+        it('should normalize options preset: deadCodeInjectionRule', () => {
+            optionsPreset = {
+                ...DEFAULT_PRESET,
+                deadCodeInjection: true,
+                deadCodeInjectionThreshold: 0.4,
+                stringArray: false,
+                stringArrayThreshold: 0
+            };
+
+            expectedOptionsPreset = {
+                ...DEFAULT_PRESET,
+                deadCodeInjection: true,
+                deadCodeInjectionThreshold: 0.4,
+                stringArray: true,
+                stringArrayThreshold: 0.75
+            };
+
+            assert.deepEqual(getNormalizedOptions(optionsPreset), expectedOptionsPreset);
+        });
+
+        it('should normalize options preset: deadCodeInjectionRule. `stringArrayThreshold` option is not empty', () => {
+            optionsPreset = {
+                ...DEFAULT_PRESET,
+                deadCodeInjection: true,
+                deadCodeInjectionThreshold: 0.4,
+                stringArray: false,
+                stringArrayThreshold: 0.5
+            };
+
+            expectedOptionsPreset = {
+                ...DEFAULT_PRESET,
+                deadCodeInjection: true,
+                deadCodeInjectionThreshold: 0.4,
+                stringArray: true,
+                stringArrayThreshold: 0.5
+            };
+
+            assert.deepEqual(getNormalizedOptions(optionsPreset), expectedOptionsPreset);
+        });
+
         it('should normalize options preset: deadCodeInjectionThresholdRule', () => {
             optionsPreset = {
                 ...DEFAULT_PRESET,