Ver código fonte

Merge pull request #776 from javascript-obfuscator/webpack-5

2.6.0: issue 777, issue 778, Webpack 5 migration.
Timofey Kachalov 4 anos atrás
pai
commit
cfe20449ee
31 arquivos alterados com 1126 adições e 241 exclusões
  1. 6 0
      CHANGELOG.md
  2. 0 23
      dist/index.browser.js
  3. 67 0
      dist/index.browser.js.LICENSE.txt
  4. 0 23
      dist/index.cli.js
  5. 23 0
      dist/index.cli.js.LICENSE.txt
  6. 0 23
      dist/index.js
  7. 23 0
      dist/index.js.LICENSE.txt
  8. 16 15
      package.json
  9. 2 2
      src/enums/ObfuscationTarget.ts
  10. 2 2
      src/enums/generators/identifier-names-generators/IdentifierNamesGenerator.ts
  11. 2 2
      src/enums/node-transformers/string-array-transformers/StringArrayEncoding.ts
  12. 2 2
      src/enums/node-transformers/string-array-transformers/StringArrayWrappersType.ts
  13. 2 2
      src/enums/options/presets/OptionsPreset.ts
  14. 2 2
      src/enums/source-map/SourceMapMode.ts
  15. 38 81
      src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts
  16. 4 5
      src/interfaces/options/IOptions.ts
  17. 4 2
      src/node-transformers/simplifying-transformers/ExpressionStatementsMergeTransformer.ts
  18. 4 5
      src/options/Options.ts
  19. 3 2
      src/options/validators/IsAllowedForObfuscationTargets.ts
  20. 2 2
      src/types/options/TOptionsPreset.ts
  21. 2 2
      src/types/options/TStringArrayEncoding.ts
  22. 2 2
      src/types/options/TStringArrayWrappersType.ts
  23. 1 0
      src/types/utils/TTypeFromEnum.ts
  24. 11 0
      src/utils/Utils.ts
  25. 4 4
      test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts
  26. 40 0
      test/unit-tests/generators/identifier-names-generators/MangledShuffledlIdentifierNamesGenerator.spec.ts
  27. 4 2
      test/unit-tests/generators/identifier-names-generators/MangledlIdentifierNamesGenerator.spec.ts
  28. 3 2
      test/unit-tests/source-code/ObfuscatedCode.spec.ts
  29. 7 1
      webpack/webpack.browser.config.js
  30. 10 3
      webpack/webpack.node.config.js
  31. 840 32
      yarn.lock

+ 6 - 0
CHANGELOG.md

@@ -1,5 +1,11 @@
 Change Log
 
+v2.6.0
+---
+* Migration to `webpack@5`
+* Optimized performance of `ExpressionStatementsMergeTransformer` when `simplify` option is enabled. Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/777
+* Fixed broken `identifierNamesGenerator: 'mangled-shuffled'` after `2.2.0`. Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/778
+
 v2.5.0
 ---
 * Improved hierarchy of generated directories when `--output` is a directory path

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 23
dist/index.browser.js


+ 67 - 0
dist/index.browser.js.LICENSE.txt

@@ -0,0 +1,67 @@
+/*!
+ * Determine if an object is a Buffer
+ *
+ * @author   Feross Aboukhadijeh <https://feross.org>
+ * @license  MIT
+ */
+
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <[email protected]> <http://feross.org>
+ * @license  MIT
+ */
+
+/*!
+Copyright (C) 2016-2020 Timofey Kachalov <[email protected]>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*! *****************************************************************************
+Copyright (C) Microsoft. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 23
dist/index.cli.js


+ 23 - 0
dist/index.cli.js.LICENSE.txt

@@ -0,0 +1,23 @@
+/*!
+Copyright (C) 2016-2020 Timofey Kachalov <[email protected]>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 23
dist/index.js


+ 23 - 0
dist/index.js.LICENSE.txt

@@ -0,0 +1,23 @@
+/*!
+Copyright (C) 2016-2020 Timofey Kachalov <[email protected]>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/

+ 16 - 15
package.json

@@ -1,6 +1,6 @@
 {
   "name": "javascript-obfuscator",
-  "version": "2.5.0",
+  "version": "2.6.0",
   "description": "JavaScript obfuscator",
   "keywords": [
     "obfuscator",
@@ -21,9 +21,9 @@
   },
   "types": "index.d.ts",
   "dependencies": {
-    "@gradecam/tsenum": "1.2.0",
     "@nuxtjs/opencollective": "0.2.2",
-    "acorn": "8.0.3",
+    "acorn": "8.0.4",
+    "assert": "2.0.0",
     "chalk": "4.1.0",
     "chance": "1.1.7",
     "class-validator": "0.12.2",
@@ -37,12 +37,13 @@
     "js-string-escape": "1.0.1",
     "md5": "2.3.0",
     "mkdirp": "1.0.4",
-    "multimatch": "4.0.0",
+    "multimatch": "5.0.0",
+    "process": "0.11.10",
     "reflect-metadata": "0.1.13",
     "source-map-support": "0.5.19",
     "string-template": "1.0.0",
     "stringz": "2.1.0",
-    "tslib": "2.0.2"
+    "tslib": "2.0.3"
   },
   "devDependencies": {
     "@istanbuljs/nyc-config-typescript": "1.0.1",
@@ -57,20 +58,20 @@
     "@types/mkdirp": "1.0.1",
     "@types/mocha": "8.0.3",
     "@types/multimatch": "4.0.0",
-    "@types/node": "14.11.5",
+    "@types/node": "14.11.8",
     "@types/rimraf": "3.0.0",
     "@types/sinon": "9.0.8",
     "@types/string-template": "1.0.2",
     "@types/webpack-env": "1.15.3",
-    "@typescript-eslint/eslint-plugin": "4.4.0",
-    "@typescript-eslint/parser": "4.4.0",
+    "@typescript-eslint/eslint-plugin": "4.4.1",
+    "@typescript-eslint/parser": "4.4.1",
     "chai": "4.2.0",
     "chai-exclude": "2.0.2",
     "coveralls": "3.1.0",
     "cross-env": "7.0.2",
-    "eslint": "7.10.0",
+    "eslint": "7.11.0",
     "eslint-plugin-import": "2.22.1",
-    "eslint-plugin-jsdoc": "30.6.3",
+    "eslint-plugin-jsdoc": "30.6.4",
     "eslint-plugin-no-null": "1.0.2",
     "eslint-plugin-prefer-arrow": "1.2.2",
     "eslint-plugin-unicorn": "22.0.0",
@@ -83,11 +84,11 @@
     "rimraf": "3.0.2",
     "sinon": "9.2.0",
     "threads": "1.6.3",
-    "ts-loader": "8.0.4",
+    "ts-loader": "8.0.5",
     "ts-node": "9.0.0",
     "typescript": "4.1.0-beta",
-    "webpack": "4.44.2",
-    "webpack-cli": "3.3.12",
+    "webpack": "5.1.0",
+    "webpack-cli": "4.0.0",
     "webpack-node-externals": "2.5.2"
   },
   "repository": {
@@ -97,9 +98,9 @@
   "homepage": "https://obfuscator.io/",
   "scripts": {
     "start": "yarn run watch",
-    "webpack:prod": "webpack --config webpack/webpack.node.config.js --config webpack/webpack.browser.config.js --mode production",
+    "webpack:prod": "webpack --config ./webpack/webpack.node.config.js --config ./webpack/webpack.browser.config.js --mode production",
     "build": "yarn run webpack:prod && yarn run eslint && yarn test",
-    "watch": "webpack --config webpack/webpack.node.config.js --mode development --watch",
+    "watch": "webpack --config ./webpack/webpack.node.config.js --mode development --watch",
     "test:dev": "ts-node --type-check test/dev/dev.ts",
     "test:devCompilePerformance": "ts-node test/dev/dev-compile-performance.ts",
     "test:devRuntimePerformance": "ts-node test/dev/dev-runtime-performance.ts",

+ 2 - 2
src/enums/ObfuscationTarget.ts

@@ -1,10 +1,10 @@
-import { MakeEnum } from '@gradecam/tsenum';
+import { Utils } from '../utils/Utils';
 
 export const ObfuscationTarget: Readonly<{
     Browser: 'browser';
     BrowserNoEval: 'browser-no-eval';
     Node: 'node';
-}> = MakeEnum({
+}> = Utils.makeEnum({
     Browser: 'browser',
     BrowserNoEval: 'browser-no-eval',
     Node: 'node'

+ 2 - 2
src/enums/generators/identifier-names-generators/IdentifierNamesGenerator.ts

@@ -1,11 +1,11 @@
-import { MakeEnum } from '@gradecam/tsenum';
+import { Utils } from '../../../utils/Utils';
 
 export const IdentifierNamesGenerator: Readonly<{
     DictionaryIdentifierNamesGenerator: 'dictionary';
     HexadecimalIdentifierNamesGenerator: 'hexadecimal';
     MangledIdentifierNamesGenerator: 'mangled';
     MangledShuffledIdentifierNamesGenerator: 'mangled-shuffled';
-}> = MakeEnum({
+}> = Utils.makeEnum({
     DictionaryIdentifierNamesGenerator: 'dictionary',
     HexadecimalIdentifierNamesGenerator: 'hexadecimal',
     MangledIdentifierNamesGenerator: 'mangled',

+ 2 - 2
src/enums/node-transformers/string-array-transformers/StringArrayEncoding.ts

@@ -1,10 +1,10 @@
-import { MakeEnum } from '@gradecam/tsenum';
+import { Utils } from '../../../utils/Utils';
 
 export const StringArrayEncoding: Readonly<{
     None: 'none';
     Base64: 'base64';
     Rc4: 'rc4';
-}> = MakeEnum({
+}> = Utils.makeEnum({
     None: 'none',
     Base64: 'base64',
     Rc4: 'rc4'

+ 2 - 2
src/enums/node-transformers/string-array-transformers/StringArrayWrappersType.ts

@@ -1,9 +1,9 @@
-import { MakeEnum } from '@gradecam/tsenum';
+import { Utils } from '../../../utils/Utils';
 
 export const StringArrayWrappersType: Readonly<{
     Variable: 'variable';
     Function: 'function';
-}> = MakeEnum({
+}> = Utils.makeEnum({
     Variable: 'variable',
     Function: 'function',
 });

+ 2 - 2
src/enums/options/presets/OptionsPreset.ts

@@ -1,11 +1,11 @@
-import { MakeEnum } from '@gradecam/tsenum';
+import { Utils } from '../../../utils/Utils';
 
 export const OptionsPreset: Readonly<{
     Default: 'default';
     LowObfuscation: 'low-obfuscation';
     MediumObfuscation: 'medium-obfuscation';
     HighObfuscation: 'high-obfuscation';
-}> = MakeEnum({
+}> = Utils.makeEnum({
     Default: 'default',
     LowObfuscation: 'low-obfuscation',
     MediumObfuscation: 'medium-obfuscation',

+ 2 - 2
src/enums/source-map/SourceMapMode.ts

@@ -1,9 +1,9 @@
-import { MakeEnum } from '@gradecam/tsenum';
+import { Utils } from '../../utils/Utils';
 
 export const SourceMapMode: Readonly<{
     Inline: 'inline';
     Separate: 'separate';
-}> = MakeEnum({
+}> = Utils.makeEnum({
     Inline: 'inline',
     Separate: 'separate'
 });

+ 38 - 81
src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts

@@ -59,86 +59,6 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene
         super(randomGenerator, options);
     }
 
-    /**
-     * @param {string} nextName
-     * @param {string} prevName
-     * @returns {boolean}
-     */
-    // eslint-disable-next-line complexity
-    public static isIncrementedMangledName (nextName: string, prevName: string): boolean {
-        if (nextName === prevName) {
-            return false;
-        }
-
-        const nextNameLength: number = nextName.length;
-        const prevNameLength: number = prevName.length;
-
-        if (nextNameLength !== prevNameLength) {
-            return nextNameLength > prevNameLength;
-        }
-
-        let isIncrementedPrevCharacter: boolean = false;
-
-        for (let i: number = 0; i < nextNameLength; i++) {
-            const nextNameCharacter: string = nextName[i];
-            const prevNameCharacter: string = prevName[i];
-
-            if (nextNameCharacter === prevNameCharacter) {
-                continue;
-            }
-
-            const isDigitNextNameCharacter: boolean = MangledIdentifierNamesGenerator.isDigitCharacter(nextNameCharacter);
-            const isDigitPrevNameCharacter: boolean = MangledIdentifierNamesGenerator.isDigitCharacter(prevNameCharacter);
-
-            if (
-                isIncrementedPrevCharacter
-                && isDigitNextNameCharacter
-                && !isDigitPrevNameCharacter
-            ) {
-                return true;
-            }
-
-            const isUpperCaseNextNameCharacter: boolean = MangledIdentifierNamesGenerator.isUpperCaseCharacter(nextNameCharacter);
-            const isUpperCasePrevNameCharacter: boolean = MangledIdentifierNamesGenerator.isUpperCaseCharacter(prevNameCharacter);
-
-            if (
-                isUpperCaseNextNameCharacter
-                && !isUpperCasePrevNameCharacter
-            ) {
-                return true;
-            } else if (
-                !isUpperCaseNextNameCharacter
-                && isUpperCasePrevNameCharacter
-            ) {
-                return false;
-            }
-
-            isIncrementedPrevCharacter = nextNameCharacter > prevNameCharacter;
-
-            if (nextNameCharacter < prevNameCharacter) {
-                return false;
-            }
-        }
-
-        return nextName > prevName;
-    }
-
-    /**
-     * @param {string} character
-     * @returns {boolean}
-     */
-    private static isUpperCaseCharacter (string: string): boolean {
-        return /^[A-Z]*$/.test(string);
-    }
-
-    /**
-     * @param {string} character
-     * @returns {boolean}
-     */
-    private static isDigitCharacter (string: string): boolean {
-        return /^[0-9]*$/.test(string);
-    }
-
     /**
      * Generates next name based on a global previous mangled name
      * We can ignore nameLength parameter here, it hasn't sense with this generator
@@ -204,6 +124,43 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene
         return identifierName;
     }
 
+    /**
+     * @param {string} nextName
+     * @param {string} prevName
+     * @returns {boolean}
+     */
+    // eslint-disable-next-line complexity
+    public isIncrementedMangledName (nextName: string, prevName: string): boolean {
+        if (nextName === prevName) {
+            return false;
+        }
+
+        const nextNameLength: number = nextName.length;
+        const prevNameLength: number = prevName.length;
+
+        if (nextNameLength !== prevNameLength) {
+            return nextNameLength > prevNameLength;
+        }
+
+        const nameSequence: string[] = this.getNameSequence();
+
+        for (let i: number = 0; i < nextNameLength; i++) {
+            const nextNameCharacter: string = nextName[i];
+            const prevNameCharacter: string = prevName[i];
+
+            if (nextNameCharacter === prevNameCharacter) {
+                continue;
+            }
+
+            const indexOfNextNameCharacter: number = nameSequence.indexOf(nextNameCharacter);
+            const indexOfPrevNameCharacter: number = nameSequence.indexOf(prevNameCharacter);
+
+            return indexOfNextNameCharacter > indexOfPrevNameCharacter;
+        }
+
+        throw new Error('Something goes wrong during comparison of mangled names');
+    }
+
     /**
      * @param {string} mangledName
      * @returns {boolean}
@@ -224,7 +181,7 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene
      * @param {string} name
      */
     protected updatePreviousMangledName (name: string): void {
-        if (!MangledIdentifierNamesGenerator.isIncrementedMangledName(name, this.previousMangledName)) {
+        if (!this.isIncrementedMangledName(name, this.previousMangledName)) {
             return;
         }
 

+ 4 - 5
src/interfaces/options/IOptions.ts

@@ -1,8 +1,7 @@
-import { TypeFromEnum } from '@gradecam/tsenum';
-
 import { TOptionsPreset } from '../../types/options/TOptionsPreset';
 import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding';
 import { TStringArrayWrappersType } from '../../types/options/TStringArrayWrappersType';
+import { TTypeFromEnum } from '../../types/utils/TTypeFromEnum';
 
 import { IdentifierNamesGenerator } from '../../enums/generators/identifier-names-generators/IdentifierNamesGenerator';
 import { ObfuscationTarget } from '../../enums/ObfuscationTarget';
@@ -19,7 +18,7 @@ export interface IOptions {
     readonly disableConsoleOutput: boolean;
     readonly domainLock: string[];
     readonly forceTransformStrings: string[];
-    readonly identifierNamesGenerator: TypeFromEnum<typeof IdentifierNamesGenerator>;
+    readonly identifierNamesGenerator: TTypeFromEnum<typeof IdentifierNamesGenerator>;
     readonly identifiersDictionary: string[];
     readonly identifiersPrefix: string;
     readonly inputFileName: string;
@@ -38,7 +37,7 @@ export interface IOptions {
     readonly sourceMap: boolean;
     readonly sourceMapBaseUrl: string;
     readonly sourceMapFileName: string;
-    readonly sourceMapMode: TypeFromEnum<typeof SourceMapMode>;
+    readonly sourceMapMode: TTypeFromEnum<typeof SourceMapMode>;
     readonly splitStrings: boolean;
     readonly splitStringsChunkLength: number;
     readonly stringArray: boolean;
@@ -47,7 +46,7 @@ export interface IOptions {
     readonly stringArrayWrappersCount: number;
     readonly stringArrayWrappersType: TStringArrayWrappersType;
     readonly stringArrayThreshold: number;
-    readonly target: TypeFromEnum<typeof ObfuscationTarget>;
+    readonly target: TTypeFromEnum<typeof ObfuscationTarget>;
     readonly transformObjectKeys: boolean;
     readonly unicodeEscapeSequence: boolean;
 }

+ 4 - 2
src/node-transformers/simplifying-transformers/ExpressionStatementsMergeTransformer.ts

@@ -83,14 +83,16 @@ export class ExpressionStatementsMergeTransformer extends AbstractNodeTransforme
 
         if (NodeGuards.isSequenceExpressionNode(prevStatement.expression)) {
             prevStatement.expression.expressions.push(expressionStatementNode.expression);
+            NodeUtils.parentizeNode(expressionStatementNode.expression, prevStatement.expression);
         } else {
             prevStatement.expression = NodeFactory.sequenceExpressionNode([
                 prevStatement.expression,
                 expressionStatementNode.expression
             ]);
-        }
 
-        NodeUtils.parentizeAst(prevStatement);
+            NodeUtils.parentizeAst(prevStatement.expression);
+            NodeUtils.parentizeNode(prevStatement.expression, prevStatement);
+        }
 
         return estraverse.VisitorOption.Remove;
     }

+ 4 - 5
src/options/Options.ts

@@ -1,5 +1,3 @@
-import { TypeFromEnum } from '@gradecam/tsenum';
-
 import { inject, injectable } from 'inversify';
 import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
 
@@ -24,6 +22,7 @@ import { TInputOptions } from '../types/options/TInputOptions';
 import { TOptionsPreset } from '../types/options/TOptionsPreset';
 import { TStringArrayEncoding } from '../types/options/TStringArrayEncoding';
 import { TStringArrayWrappersType } from '../types/options/TStringArrayWrappersType';
+import { TTypeFromEnum } from '../types/utils/TTypeFromEnum';
 
 import { IOptions } from '../interfaces/options/IOptions';
 import { IOptionsNormalizer } from '../interfaces/options/IOptionsNormalizer';
@@ -147,7 +146,7 @@ export class Options implements IOptions {
         IdentifierNamesGenerator.MangledIdentifierNamesGenerator,
         IdentifierNamesGenerator.MangledShuffledIdentifierNamesGenerator
     ])
-    public readonly identifierNamesGenerator!: TypeFromEnum<typeof IdentifierNamesGenerator>;
+    public readonly identifierNamesGenerator!: TTypeFromEnum<typeof IdentifierNamesGenerator>;
 
     /**
      * @type {string}
@@ -279,7 +278,7 @@ export class Options implements IOptions {
      * @type {SourceMapMode}
      */
     @IsIn([SourceMapMode.Inline, SourceMapMode.Separate])
-    public readonly sourceMapMode!: TypeFromEnum<typeof SourceMapMode>;
+    public readonly sourceMapMode!: TTypeFromEnum<typeof SourceMapMode>;
 
     /**
      * @type {boolean}
@@ -340,7 +339,7 @@ export class Options implements IOptions {
      * @type {ObfuscationTarget}
      */
     @IsIn([ObfuscationTarget.Browser, ObfuscationTarget.BrowserNoEval, ObfuscationTarget.Node])
-    public readonly target!: TypeFromEnum<typeof ObfuscationTarget>;
+    public readonly target!: TTypeFromEnum<typeof ObfuscationTarget>;
 
     /**
      * @type {boolean}

+ 3 - 2
src/options/validators/IsAllowedForObfuscationTargets.ts

@@ -1,7 +1,8 @@
 import { registerDecorator, ValidationArguments, ValidationOptions } from 'class-validator';
-import { TypeFromEnum } from '@gradecam/tsenum';
 import equal from 'fast-deep-equal';
 
+import { TTypeFromEnum } from '../../types/utils/TTypeFromEnum';
+
 import { IOptions } from '../../interfaces/options/IOptions';
 
 import { ObfuscationTarget } from '../../enums/ObfuscationTarget';
@@ -15,7 +16,7 @@ import { DEFAULT_PRESET } from '../presets/Default';
  * @returns {(options: IOptions, propertyName: keyof IOptions) => void}
  */
 export function IsAllowedForObfuscationTargets (
-    obfuscationTargets: TypeFromEnum<typeof ObfuscationTarget>[],
+    obfuscationTargets: TTypeFromEnum<typeof ObfuscationTarget>[],
     validationOptions?: ValidationOptions
 ): (options: IOptions, propertyName: keyof IOptions) => void {
     return (optionsObject: IOptions, propertyName: keyof IOptions): void => {

+ 2 - 2
src/types/options/TOptionsPreset.ts

@@ -1,5 +1,5 @@
-import { TypeFromEnum } from '@gradecam/tsenum';
+import { TTypeFromEnum } from '../utils/TTypeFromEnum';
 
 import { OptionsPreset } from '../../enums/options/presets/OptionsPreset';
 
-export type TOptionsPreset = TypeFromEnum<typeof OptionsPreset>;
+export type TOptionsPreset = TTypeFromEnum<typeof OptionsPreset>;

+ 2 - 2
src/types/options/TStringArrayEncoding.ts

@@ -1,5 +1,5 @@
-import { TypeFromEnum } from '@gradecam/tsenum';
+import { TTypeFromEnum } from '../utils/TTypeFromEnum';
 
 import { StringArrayEncoding } from '../../enums/node-transformers/string-array-transformers/StringArrayEncoding';
 
-export type TStringArrayEncoding = TypeFromEnum<typeof StringArrayEncoding>;
+export type TStringArrayEncoding = TTypeFromEnum<typeof StringArrayEncoding>;

+ 2 - 2
src/types/options/TStringArrayWrappersType.ts

@@ -1,5 +1,5 @@
-import { TypeFromEnum } from '@gradecam/tsenum';
+import { TTypeFromEnum } from '../utils/TTypeFromEnum';
 
 import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
 
-export type TStringArrayWrappersType = TypeFromEnum<typeof StringArrayWrappersType>;
+export type TStringArrayWrappersType = TTypeFromEnum<typeof StringArrayWrappersType>;

+ 1 - 0
src/types/utils/TTypeFromEnum.ts

@@ -0,0 +1 @@
+export type TTypeFromEnum<T extends object> = (T)[keyof T];

+ 11 - 0
src/utils/Utils.ts

@@ -57,4 +57,15 @@ export class Utils {
 
         return `${baseIdentifiersPrefix}${sourceCodeIndex}`;
     }
+
+    /**
+     * @param {TObject} enumLikeObject
+     * @returns {Readonly<TObject>}
+     */
+    public static makeEnum<
+        TObject extends {[index: string]: TValue},
+        TValue extends string
+    > (enumLikeObject: TObject): Readonly<TObject> {
+        return Object.freeze({...enumLikeObject});
+    }
 }

+ 4 - 4
test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts

@@ -1,9 +1,9 @@
 import { assert } from 'chai';
-import { TypeFromEnum } from '@gradecam/tsenum';
 
 import { TDictionary } from '../../../src/types/TDictionary';
 import { TInputOptions } from '../../../src/types/options/TInputOptions';
 import { TOptionsPreset } from '../../../src/types/options/TOptionsPreset';
+import { TTypeFromEnum } from '../../../src/types/utils/TTypeFromEnum';
 
 import { IObfuscatedCode } from '../../../src/interfaces/source-code/IObfuscatedCode';
 
@@ -921,12 +921,12 @@ describe('JavaScriptObfuscator', () => {
             const samplesCount: number = 30;
 
             let areCollisionsExists: boolean = false;
-            let obfuscateFunc: (identifierNamesGenerator: TypeFromEnum<typeof IdentifierNamesGenerator>) => string;
+            let obfuscateFunc: (identifierNamesGenerator: TTypeFromEnum<typeof IdentifierNamesGenerator>) => string;
 
             before(() => {
                 const code: string = readFileAsString(__dirname + '/fixtures/custom-nodes-identifier-names-collision.js');
 
-                obfuscateFunc = (identifierNamesGenerator: TypeFromEnum<typeof IdentifierNamesGenerator>) => {
+                obfuscateFunc = (identifierNamesGenerator: TTypeFromEnum<typeof IdentifierNamesGenerator>) => {
                     const obfuscatedCode = JavaScriptObfuscator.obfuscate(
                         code,
                         {
@@ -945,7 +945,7 @@ describe('JavaScriptObfuscator', () => {
                 [
                     IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator,
                     IdentifierNamesGenerator.MangledIdentifierNamesGenerator
-                ].forEach((identifierNamesGenerator: TypeFromEnum<typeof IdentifierNamesGenerator>) => {
+                ].forEach((identifierNamesGenerator: TTypeFromEnum<typeof IdentifierNamesGenerator>) => {
                     for (let i = 0; i < samplesCount; i++) {
                         try {
                             eval(obfuscateFunc(identifierNamesGenerator));

+ 40 - 0
test/unit-tests/generators/identifier-names-generators/MangledShuffledlIdentifierNamesGenerator.spec.ts

@@ -10,6 +10,7 @@ import { IInversifyContainerFacade } from '../../../../src/interfaces/container/
 import { IdentifierNamesGenerator } from '../../../../src/enums/generators/identifier-names-generators/IdentifierNamesGenerator';
 
 import { InversifyContainerFacade } from '../../../../src/container/InversifyContainerFacade';
+import { MangledShuffledIdentifierNamesGenerator } from '../../../../src/generators/identifier-names-generators/MangledShuffledIdentifierNamesGenerator';
 
 describe('MangledShuffledIdentifierNamesGenerator', () => {
     describe('generateNext', () => {
@@ -112,4 +113,43 @@ describe('MangledShuffledIdentifierNamesGenerator', () => {
             });
         });
     });
+
+    describe('isIncrementedMangledName', function () {
+        this.timeout(60000);
+
+        const samplesCount: number = 1000000;
+        const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
+
+        inversifyContainerFacade.load('', '', {});
+        const identifierNamesGenerator: IIdentifierNamesGenerator = inversifyContainerFacade.getNamed<IIdentifierNamesGenerator>(
+            ServiceIdentifiers.IIdentifierNamesGenerator,
+            IdentifierNamesGenerator.MangledShuffledIdentifierNamesGenerator
+        );
+
+        let isSuccessComparison: boolean = true;
+        let mangledName: string = '';
+        let prevMangledName: string = '9';
+
+        for (let sample = 0; sample <= samplesCount; sample++) {
+            let resultNormal: boolean;
+            let resultReversed: boolean;
+
+            mangledName = identifierNamesGenerator.generateNext();
+            resultNormal = (<MangledShuffledIdentifierNamesGenerator>identifierNamesGenerator)
+                .isIncrementedMangledName(mangledName, prevMangledName);
+            resultReversed = (<MangledShuffledIdentifierNamesGenerator>identifierNamesGenerator)
+                .isIncrementedMangledName(prevMangledName, mangledName);
+
+            if (!resultNormal || resultReversed) {
+                isSuccessComparison = false;
+                break;
+            }
+
+            prevMangledName = mangledName;
+        }
+
+        it('should correctly compare mangled names', () => {
+            assert.isTrue(isSuccessComparison);
+        });
+    });
 });

+ 4 - 2
test/unit-tests/generators/identifier-names-generators/MangledlIdentifierNamesGenerator.spec.ts

@@ -192,8 +192,10 @@ describe('MangledIdentifierNamesGenerator', () => {
             let resultReversed: boolean;
 
             mangledName = identifierNamesGenerator.generateNext();
-            resultNormal = MangledIdentifierNamesGenerator.isIncrementedMangledName(mangledName, prevMangledName);
-            resultReversed = MangledIdentifierNamesGenerator.isIncrementedMangledName(prevMangledName, mangledName);
+            resultNormal = (<MangledIdentifierNamesGenerator>identifierNamesGenerator)
+                .isIncrementedMangledName(mangledName, prevMangledName);
+            resultReversed = (<MangledIdentifierNamesGenerator>identifierNamesGenerator)
+                .isIncrementedMangledName(prevMangledName, mangledName);
 
             if (!resultNormal || resultReversed) {
                 isSuccessComparison = false;

+ 3 - 2
test/unit-tests/source-code/ObfuscatedCode.spec.ts

@@ -1,10 +1,11 @@
 import 'reflect-metadata';
-import { TypeFromEnum } from '@gradecam/tsenum';
 
 import { ServiceIdentifiers } from '../../../src/container/ServiceIdentifiers';
 
 import { assert } from 'chai';
 
+import { TTypeFromEnum } from '../../../src/types/utils/TTypeFromEnum';
+
 import { IInversifyContainerFacade } from '../../../src/interfaces/container/IInversifyContainerFacade';
 import { IObfuscatedCode } from '../../../src/interfaces/source-code/IObfuscatedCode';
 
@@ -24,7 +25,7 @@ function getObfuscatedCode (
     sourceMap: string,
     sourceMapBaseUrl: string,
     sourceMapFileName: string,
-    sourceMapMode: TypeFromEnum<typeof SourceMapMode>
+    sourceMapMode: TTypeFromEnum<typeof SourceMapMode>
 ): IObfuscatedCode {
     const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
 

+ 7 - 1
webpack/webpack.browser.config.js

@@ -21,6 +21,9 @@ module.exports = {
         ]
     },
     resolve: {
+        alias: {
+            assert: 'assert'
+        },
         extensions: ['.ts', '.js']
     },
     plugins: [
@@ -33,6 +36,9 @@ module.exports = {
         ),
         new webpack.EnvironmentPlugin({
             VERSION: packageJson.version
+        }),
+        new webpack.ProvidePlugin({
+            process: ['process']
         })
     ],
     output: {
@@ -44,7 +50,7 @@ module.exports = {
         hints: false
     },
     stats: {
-        maxModules: 0,
+        excludeModules: true,
         warnings: false
     }
 };

+ 10 - 3
webpack/webpack.node.config.js

@@ -34,6 +34,14 @@ module.exports = {
     resolve: {
         extensions: ['.ts']
     },
+    cache: {
+        type: 'filesystem',
+        buildDependencies: {
+            config: [
+                __filename
+            ]
+        }
+    },
     plugins: [
         new webpack.BannerPlugin(
             {
@@ -62,10 +70,9 @@ module.exports = {
         })
     ],
     output: {
-        libraryTarget:  'commonjs2',
-        library: 'JavaScriptObfuscator'
+        libraryTarget:  'commonjs2'
     },
     stats: {
-        maxModules: 0
+        excludeModules: true
     }
 };

Diferenças do arquivo suprimidas por serem muito extensas
+ 840 - 32
yarn.lock


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff