فهرست منبع

Merge branch 'dev'

sanex3339 8 سال پیش
والد
کامیت
eb9947b1e9
37فایلهای تغییر یافته به همراه394 افزوده شده و 532 حذف شده
  1. 1 0
      .gitignore
  2. 1 1
      CHANGELOG.md
  3. 178 275
      dist/index.js
  4. 2 2
      package.json
  5. 11 18
      src/Obfuscator.ts
  6. 1 1
      src/cli/CLIUtils.ts
  7. 6 0
      src/interfaces/IVisitor.d.ts
  8. 4 3
      src/interfaces/node-transformers/INodeTransformer.d.ts
  9. 3 3
      src/node-transformers/AbstractNodeTransformer.ts
  10. 5 5
      src/node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer.ts
  11. 4 4
      src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts
  12. 1 1
      src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts
  13. 3 3
      src/node-transformers/converting-transformers/MemberExpressionTransformer.ts
  14. 3 3
      src/node-transformers/converting-transformers/MethodDefinitionTransformer.ts
  15. 8 8
      src/node-transformers/converting-transformers/TemplateLiteralTransformer.ts
  16. 3 2
      src/node-transformers/obfuscating-transformers/CatchClauseTransformer.ts
  17. 5 4
      src/node-transformers/obfuscating-transformers/FunctionDeclarationTransformer.ts
  18. 3 2
      src/node-transformers/obfuscating-transformers/FunctionTransformer.ts
  19. 3 2
      src/node-transformers/obfuscating-transformers/LabeledStatementTransformer.ts
  20. 3 3
      src/node-transformers/obfuscating-transformers/LiteralTransformer.ts
  21. 3 3
      src/node-transformers/obfuscating-transformers/ObjectExpressionTransformer.ts
  22. 5 4
      src/node-transformers/obfuscating-transformers/VariableDeclarationTransformer.ts
  23. 1 1
      src/node-transformers/obfuscating-transformers/replacers/IdentifierReplacer.ts
  24. 1 1
      src/node-transformers/obfuscating-transformers/replacers/StringLiteralReplacer.ts
  25. 2 2
      src/node/NodeAppender.ts
  26. 2 2
      src/node/NodeUtils.ts
  27. 1 2
      src/types/TVisitorFunction.d.ts
  28. 1 1
      src/utils/CryptUtils.ts
  29. 7 0
      src/utils/RandomGeneratorUtils.ts
  30. 20 6
      src/utils/Utils.ts
  31. 1 1
      test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts
  32. 1 3
      test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts
  33. 1 3
      test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts
  34. 1 3
      test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts
  35. 2 2
      test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts
  36. 15 0
      test/unit-tests/utils/utils/Utils.spec.ts
  37. 82 158
      yarn.lock

+ 1 - 0
.gitignore

@@ -6,3 +6,4 @@ npm-debug.log
 /node_modules
 /test-tmp
 /tmp
+test/benchmark/**/**

+ 1 - 1
CHANGELOG.md

@@ -2,7 +2,7 @@ Change Log
 ===
 v0.9.0-beta.3
 ---
-* **Breaking options change:** dropped `[email protected]` and `[email protected]` support.
+* **Breaking change:** dropped `[email protected]` and `[email protected]` support.
 * Switched from `npm` to `yarn` internally.
 
 v0.9.0-beta.2

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 178 - 275
dist/index.js


+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "javascript-obfuscator",
-  "version": "0.9.0-beta.3",
+  "version": "0.9.0-beta.4",
   "description": "JavaScript obfuscator",
   "keywords": [
     "obfuscator",
@@ -44,7 +44,7 @@
     "@types/lodash": "4.14.50",
     "@types/mkdirp": "0.3.29",
     "@types/mocha": "2.2.38",
-    "@types/node": "7.0.0",
+    "@types/node": "7.0.1",
     "@types/sinon": "1.16.34",
     "@types/string-template": "1.0.2",
     "awesome-typescript-loader": "3.0.0-beta.18",

+ 11 - 18
src/Obfuscator.ts

@@ -15,6 +15,7 @@ import { IOptions } from './interfaces/options/IOptions';
 import { IStackTraceAnalyzer } from './interfaces/stack-trace-analyzer/IStackTraceAnalyzer';
 import { IStackTraceData } from './interfaces/stack-trace-analyzer/IStackTraceData';
 import { IStorage } from './interfaces/storages/IStorage';
+import { IVisitor } from './interfaces/IVisitor';
 
 import { NodeTransformers } from './enums/container/NodeTransformers';
 import { ObfuscationEvents } from './enums/ObfuscationEvents';
@@ -158,18 +159,18 @@ export class Obfuscator implements IObfuscator {
         astTree: ESTree.Program,
         nodeTransformers: NodeTransformers[]
     ): ESTree.Program {
-        const visitors: estraverse.Visitor[] = nodeTransformers
-            .map((nodeTransformer: NodeTransformers): estraverse.Visitor => {
+        const visitors: IVisitor[] = nodeTransformers
+            .map((nodeTransformer: NodeTransformers): IVisitor => {
                 return this.nodeTransformersFactory(nodeTransformer).getVisitor();
             });
 
         estraverse.replace(astTree, {
             enter: this.mergeVisitorsForDirection(
-                visitors.filter((visitor: estraverse.Visitor) => visitor.enter !== undefined),
+                visitors.filter((visitor: IVisitor) => visitor.enter !== undefined),
                 VisitorDirection.enter
             ),
             leave: this.mergeVisitorsForDirection(
-                visitors.filter((visitor: estraverse.Visitor) => visitor.leave !== undefined),
+                visitors.filter((visitor: IVisitor) => visitor.leave !== undefined),
                 VisitorDirection.leave
             )
         });
@@ -182,35 +183,27 @@ export class Obfuscator implements IObfuscator {
      * @param direction
      * @return {TVisitorDirection}
      */
-    private mergeVisitorsForDirection (visitors: estraverse.Visitor[], direction: TVisitorDirection): TVisitorFunction {
+    private mergeVisitorsForDirection (visitors: IVisitor[], direction: TVisitorDirection): TVisitorFunction {
         if (!visitors.length) {
             return (node: ESTree.Node, parentNode: ESTree.Node) => node;
         }
 
         return (node: ESTree.Node, parentNode: ESTree.Node) => {
-            for (const visitor of visitors) {
+            visitors.forEach((visitor: IVisitor) => {
                 const visitorFunction: TVisitorFunction | undefined = visitor[direction];
 
                 if (!visitorFunction) {
-                    continue;
+                    return;
                 }
 
-                const visitorResult: estraverse.VisitorOption | ESTree.Node | void = visitorFunction(node, parentNode);
+                const visitorResult: ESTree.Node | void = visitorFunction(node, parentNode);
 
                 if (!visitorResult) {
-                    continue;
-                }
-
-                if (
-                    visitorResult === estraverse.VisitorOption.Break ||
-                    visitorResult === estraverse.VisitorOption.Remove ||
-                    visitorResult === estraverse.VisitorOption.Skip
-                ) {
-                    return visitorResult;
+                    return;
                 }
 
                 node = <ESTree.Node>visitorResult;
-            }
+            });
 
             return node;
         };

+ 1 - 1
src/cli/CLIUtils.ts

@@ -42,7 +42,7 @@ export class CLIUtils {
      */
     public static getOutputSourceMapPath (outputCodePath: string, sourceMapFileName: string = ''): string {
         if (sourceMapFileName) {
-            outputCodePath = `${outputCodePath.substr(
+            outputCodePath = `${outputCodePath.substring(
                 0, outputCodePath.lastIndexOf('/')
             )}/${sourceMapFileName}`;
         }

+ 6 - 0
src/interfaces/IVisitor.d.ts

@@ -0,0 +1,6 @@
+import * as ESTree from 'estree';
+
+export interface IVisitor {
+    enter?: (node: ESTree.Node, parentNode: ESTree.Node | null) => ESTree.Node | void;
+    leave?: (node: ESTree.Node, parentNode: ESTree.Node | null) => ESTree.Node | void;
+}

+ 4 - 3
src/interfaces/node-transformers/INodeTransformer.d.ts

@@ -1,11 +1,12 @@
-import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
+import { IVisitor } from '../IVisitor';
+
 export interface INodeTransformer {
     /**
-     * @returns {estraverse.Visitor}
+     * @returns {IVisitor}
      */
-    getVisitor (): estraverse.Visitor;
+    getVisitor (): IVisitor;
 
     /**
      * @param node

+ 3 - 3
src/node-transformers/AbstractNodeTransformer.ts

@@ -1,11 +1,11 @@
 import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
 
-import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { INodeTransformer } from '../interfaces/node-transformers/INodeTransformer';
 import { IOptions } from '../interfaces/options/IOptions';
+import { IVisitor } from '../interfaces/IVisitor';
 
 import { RandomGeneratorUtils } from '../utils/RandomGeneratorUtils';
 
@@ -31,9 +31,9 @@ export abstract class AbstractNodeTransformer implements INodeTransformer {
     }
 
     /**
-     * @returns {estraverse.Visitor}
+     * @returns {IVisitor}
      */
-    public abstract getVisitor (): estraverse.Visitor;
+    public abstract getVisitor (): IVisitor;
 
     /**
      * @param node

+ 5 - 5
src/node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer.ts

@@ -1,13 +1,13 @@
 import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
-import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { TCustomNodeFactory } from '../../types/container/TCustomNodeFactory';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
 import { IOptions } from '../../interfaces/options/IOptions';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { CustomNodes } from '../../enums/container/CustomNodes';
 
@@ -51,9 +51,9 @@ export class BlockStatementControlFlowTransformer extends AbstractNodeTransforme
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             leave: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isBlockStatementNode(node)) {
@@ -70,7 +70,7 @@ export class BlockStatementControlFlowTransformer extends AbstractNodeTransforme
      */
     public transformNode (blockStatementNode: ESTree.BlockStatement, parentNode: ESTree.Node): ESTree.Node {
         if (
-            RandomGeneratorUtils.getRandomFloat(0, 1) > this.options.controlFlowFlatteningThreshold ||
+            RandomGeneratorUtils.getMathRandom() > this.options.controlFlowFlatteningThreshold ||
             BlockStatementControlFlowTransformer.blockStatementHasProhibitedStatements(blockStatementNode)
         ) {
             return blockStatementNode;
@@ -82,7 +82,7 @@ export class BlockStatementControlFlowTransformer extends AbstractNodeTransforme
             return blockStatementNode;
         }
 
-        const originalKeys: number[] = [...Array(blockStatementBody.length).keys()];
+        const originalKeys: number[] = Utils.arrayRange(blockStatementBody.length);
         const shuffledKeys: number[] = Utils.arrayShuffle(originalKeys);
         const originalKeysIndexesInShuffledArray: number[] = originalKeys.map((key: number) => shuffledKeys.indexOf(key));
         const blockStatementControlFlowFlatteningCustomNode: ICustomNode = this.customNodeFactory(

+ 4 - 4
src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts

@@ -12,6 +12,7 @@ import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatemen
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IStorage } from '../../interfaces/storages/IStorage';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { CustomNodes } from '../../enums/container/CustomNodes';
 import { NodeType } from '../../enums/NodeType';
@@ -113,9 +114,9 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             leave: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isFunctionDeclarationNode(node) || Node.isFunctionExpressionNode(node)) {
@@ -140,7 +141,6 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
 
         this.controlFlowData.set(hostNode, controlFlowStorage);
         this.transformFunctionBody(functionNode.body, controlFlowStorage);
-        NodeUtils.parentize(functionNode);
 
         if (!controlFlowStorage.getLength()) {
             return functionNode;
@@ -186,7 +186,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
                     return node;
                 }
 
-                if (RandomGeneratorUtils.getRandomFloat(0, 1) > this.options.controlFlowFlatteningThreshold) {
+                if (RandomGeneratorUtils.getMathRandom() > this.options.controlFlowFlatteningThreshold) {
                     return node;
                 }
 

+ 1 - 1
src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts

@@ -88,7 +88,7 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace
         const storageKeysForCurrentId: string[] | undefined = storageKeysById.get(replacerId);
 
         if (
-            RandomGeneratorUtils.getRandomFloat(0, 1) > usingExistingIdentifierChance &&
+            RandomGeneratorUtils.getMathRandom() > usingExistingIdentifierChance &&
             storageKeysForCurrentId &&
             storageKeysForCurrentId.length
         ) {

+ 3 - 3
src/node-transformers/converting-transformers/MemberExpressionTransformer.ts

@@ -1,10 +1,10 @@
 import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
-import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { IOptions } from '../../interfaces/options/IOptions';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { NodeType } from '../../enums/NodeType';
 
@@ -23,9 +23,9 @@ export class MemberExpressionTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isMemberExpressionNode(node)) {

+ 3 - 3
src/node-transformers/converting-transformers/MethodDefinitionTransformer.ts

@@ -1,10 +1,10 @@
 import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
-import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { IOptions } from '../../interfaces/options/IOptions';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { NodeType } from '../../enums/NodeType';
 
@@ -37,9 +37,9 @@ export class MethodDefinitionTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isMethodDefinitionNode(node)) {

+ 8 - 8
src/node-transformers/converting-transformers/TemplateLiteralTransformer.ts

@@ -1,10 +1,10 @@
 import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
-import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { IOptions } from '../../interfaces/options/IOptions';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
 import { Node } from '../../node/Node';
@@ -34,9 +34,9 @@ export class TemplateLiteralTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isTemplateLiteralNode(node)) {
@@ -56,17 +56,17 @@ export class TemplateLiteralTransformer extends AbstractNodeTransformer {
 
         let nodes: (ESTree.Literal | ESTree.Expression)[] = [];
 
-        for (const templateElement of templateLiteralNode.quasis) {
+        templateLiteralNode.quasis.forEach((templateElement: ESTree.TemplateElement) => {
             nodes.push(Nodes.getLiteralNode(templateElement.value.cooked));
 
             const expression: ESTree.Expression | undefined = templateLiteralExpressions.shift();
 
             if (!expression) {
-                continue;
+                return;
             }
 
             nodes.push(expression);
-        }
+        });
 
         nodes = nodes.filter((node: ESTree.Literal | ESTree.Expression) => {
             return !(Node.isLiteralNode(node) && node.value === '');
@@ -88,9 +88,9 @@ export class TemplateLiteralTransformer extends AbstractNodeTransformer {
                 <ESTree.Expression>nodes.shift()
             );
 
-            for (const node of nodes) {
+            nodes.forEach((node: ESTree.Literal | ESTree.Expression) => {
                 root = Nodes.getBinaryExpressionNode('+', root, <ESTree.Literal | ESTree.Expression>node);
-            }
+            });
 
             return root;
         }

+ 3 - 2
src/node-transformers/obfuscating-transformers/CatchClauseTransformer.ts

@@ -7,6 +7,7 @@ import * as ESTree from 'estree';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IObfuscationReplacer } from '../../interfaces/node-transformers/IObfuscationReplacer';
 import { IObfuscationReplacerWithStorage } from '../../interfaces/node-transformers/IObfuscationReplacerWithStorage';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscationReplacers';
 
@@ -42,9 +43,9 @@ export class CatchClauseTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isCatchClauseNode(node)) {

+ 5 - 4
src/node-transformers/obfuscating-transformers/FunctionDeclarationTransformer.ts

@@ -9,6 +9,7 @@ import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatemen
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IObfuscationReplacer } from '../../interfaces/node-transformers/IObfuscationReplacer';
 import { IObfuscationReplacerWithStorage } from '../../interfaces/node-transformers/IObfuscationReplacerWithStorage';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscationReplacers';
 import { NodeType } from '../../enums/NodeType';
@@ -52,9 +53,9 @@ export class FunctionDeclarationTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isFunctionDeclarationNode(node)) {
@@ -103,9 +104,9 @@ export class FunctionDeclarationTransformer extends AbstractNodeTransformer {
         if (this.replaceableIdentifiers.has(scopeNode)) {
             replaceableIdentifiersForCurrentScope = <ESTree.Identifier[]>this.replaceableIdentifiers.get(scopeNode);
 
-            for (const replaceableIdentifier of replaceableIdentifiersForCurrentScope) {
+            replaceableIdentifiersForCurrentScope.forEach((replaceableIdentifier: ESTree.Identifier) => {
                 replaceableIdentifier.name = this.identifierReplacer.replace(replaceableIdentifier.name, nodeIdentifier);
-            }
+            });
 
             return;
         }

+ 3 - 2
src/node-transformers/obfuscating-transformers/FunctionTransformer.ts

@@ -7,6 +7,7 @@ import * as ESTree from 'estree';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IObfuscationReplacer } from '../../interfaces/node-transformers/IObfuscationReplacer';
 import { IObfuscationReplacerWithStorage } from '../../interfaces/node-transformers/IObfuscationReplacerWithStorage';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscationReplacers';
 
@@ -42,9 +43,9 @@ export class FunctionTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (

+ 3 - 2
src/node-transformers/obfuscating-transformers/LabeledStatementTransformer.ts

@@ -7,6 +7,7 @@ import * as ESTree from 'estree';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IObfuscationReplacer } from '../../interfaces/node-transformers/IObfuscationReplacer';
 import { IObfuscationReplacerWithStorage } from '../../interfaces/node-transformers/IObfuscationReplacerWithStorage';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscationReplacers';
 
@@ -50,9 +51,9 @@ export class LabeledStatementTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isLabeledStatementNode(node)) {

+ 3 - 3
src/node-transformers/obfuscating-transformers/LiteralTransformer.ts

@@ -2,11 +2,11 @@ import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import * as escodegen from 'escodegen';
-import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IObfuscationReplacer } from '../../interfaces/node-transformers/IObfuscationReplacer';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscationReplacers';
 
@@ -34,9 +34,9 @@ export class LiteralTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isLiteralNode(node)) {

+ 3 - 3
src/node-transformers/obfuscating-transformers/ObjectExpressionTransformer.ts

@@ -2,10 +2,10 @@ import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import * as escodegen from 'escodegen';
-import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { IOptions } from '../../interfaces/options/IOptions';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { NodeType } from '../../enums/NodeType';
 
@@ -66,9 +66,9 @@ export class ObjectExpressionTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isObjectExpressionNode(node)) {

+ 5 - 4
src/node-transformers/obfuscating-transformers/VariableDeclarationTransformer.ts

@@ -9,6 +9,7 @@ import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatemen
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IObfuscationReplacer } from '../../interfaces/node-transformers/IObfuscationReplacer';
 import { IObfuscationReplacerWithStorage } from '../../interfaces/node-transformers/IObfuscationReplacerWithStorage';
+import { IVisitor } from '../../interfaces/IVisitor';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscationReplacers';
 import { NodeType } from '../../enums/NodeType';
@@ -53,9 +54,9 @@ export class VariableDeclarationTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @return {estraverse.Visitor}
+     * @return {IVisitor}
      */
-    public getVisitor (): estraverse.Visitor {
+    public getVisitor (): IVisitor {
         return {
             enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
                 if (Node.isVariableDeclarationNode(node)) {
@@ -117,9 +118,9 @@ export class VariableDeclarationTransformer extends AbstractNodeTransformer {
         if (this.replaceableIdentifiers.has(scopeNode)) {
             replaceableIdentifiersForCurrentScope = <ESTree.Identifier[]>this.replaceableIdentifiers.get(scopeNode);
 
-            for (const replaceableIdentifier of replaceableIdentifiersForCurrentScope) {
+            replaceableIdentifiersForCurrentScope.forEach((replaceableIdentifier: ESTree.Identifier) => {
                 replaceableIdentifier.name = this.identifierReplacer.replace(replaceableIdentifier.name, nodeIdentifier);
-            }
+            });
 
             return;
         }

+ 1 - 1
src/node-transformers/obfuscating-transformers/replacers/IdentifierReplacer.ts

@@ -58,7 +58,7 @@ export class IdentifierReplacer extends AbstractReplacer implements IObfuscation
     private isReservedName (name: string): boolean {
         return this.options.reservedNames
             .some((reservedName: string) => {
-                return new RegExp(reservedName, 'g').test(name);
+                return new RegExp(reservedName, 'g').exec(name) !== null;
             });
     }
 }

+ 1 - 1
src/node-transformers/obfuscating-transformers/replacers/StringLiteralReplacer.ts

@@ -72,7 +72,7 @@ export class StringLiteralReplacer extends AbstractReplacer {
         const usingStringArray: boolean = (
             this.options.stringArray &&
             nodeValue.length >= StringLiteralReplacer.minimumLengthForStringArray &&
-            RandomGeneratorUtils.getRandomFloat(0, 1) <= this.options.stringArrayThreshold
+            RandomGeneratorUtils.getMathRandom() <= this.options.stringArrayThreshold
         );
         const cacheKey: string = `${nodeValue}-${String(usingStringArray)}`;
 

+ 2 - 2
src/node/NodeAppender.ts

@@ -155,9 +155,9 @@ export class NodeAppender {
         blockScopeNode: TNodeWithBlockStatement,
         nodeBodyStatements: TStatement[]
     ): TStatement[] {
-        for (const statement of nodeBodyStatements) {
+        nodeBodyStatements.forEach((statement: TStatement) => {
             statement.parentNode = blockScopeNode;
-        }
+        });
 
         return nodeBodyStatements;
     }

+ 2 - 2
src/node/NodeUtils.ts

@@ -60,11 +60,11 @@ export class NodeUtils {
     public static convertStructureToCode (structure: ESTree.Node[]): string {
         let code: string = '';
 
-        for (const node of structure) {
+        structure.forEach((node: ESTree.Node) => {
             code += escodegen.generate(node, {
                 sourceMapWithCode: true
             }).code;
-        }
+        });
 
         return code;
     }

+ 1 - 2
src/types/TVisitorFunction.d.ts

@@ -1,4 +1,3 @@
-import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
-export type TVisitorFunction = (node: ESTree.Node, parentNode: ESTree.Node | null) => estraverse.VisitorOption | ESTree.Node | void;
+export type TVisitorFunction = (node: ESTree.Node, parentNode: ESTree.Node | null) => ESTree.Node | void;

+ 1 - 1
src/utils/CryptUtils.ts

@@ -48,7 +48,7 @@ export class CryptUtils {
                 result: string = '';
 
             while (i1 < s1.length || i2 < s2.length) {
-                if (RandomGeneratorUtils.getRandomFloat(0, 1) < 0.5 && i2 < s2.length) {
+                if (RandomGeneratorUtils.getMathRandom() < 0.5 && i2 < s2.length) {
                     result += s2.charAt(++i2);
                 } else {
                     result += s1.charAt(++i1);

+ 7 - 0
src/utils/RandomGeneratorUtils.ts

@@ -43,6 +43,13 @@ export class RandomGeneratorUtils {
         RandomGeneratorUtils.randomVariableNameSet.clear();
     }
 
+    /**
+     * @returns {number}
+     */
+    public static getMathRandom (): number {
+        return RandomGeneratorUtils.getRandomInteger(0, 100000) / 100000;
+    }
+
     /**
      * @param min
      * @param max

+ 20 - 6
src/utils/Utils.ts

@@ -13,6 +13,20 @@ export class Utils {
      */
     private static readonly stringToUnicodeEscapeSequenceCache: Map <string, string> = new Map();
 
+    /**
+     * @param length
+     * @return {number[]}
+     */
+    public static arrayRange (length: number): number[] {
+        const range: number[] = [];
+
+        for (let i: number = 0; i < length; i++) {
+            range.push(i);
+        }
+
+        return range;
+    }
+
     /**
      * @param array
      * @param times
@@ -47,7 +61,7 @@ export class Utils {
         const shuffledArray: T[] = [...array];
 
         for (let i: number = shuffledArray.length; i; i--) {
-            const j: number = Math.floor(RandomGeneratorUtils.getRandomFloat(0, 1) * i);
+            const j: number = Math.floor(RandomGeneratorUtils.getMathRandom() * i);
 
             [shuffledArray[i - 1], shuffledArray[j]] = [shuffledArray[j], shuffledArray[i - 1]];
         }
@@ -62,7 +76,7 @@ export class Utils {
     public static decToHex (dec: number): string {
         const radix: number = 16;
 
-        return Number(dec).toString(radix);
+        return dec.toString(radix);
     }
 
     /**
@@ -150,16 +164,16 @@ export class Utils {
             template: string;
 
         const result: string = string.replace(replaceRegExp, (escape: string): string => {
-            if (nonLatinAndNonDigitsOnly && !escapeRegExp.test(escape)) {
+            if (nonLatinAndNonDigitsOnly && !escapeRegExp.exec(escape)) {
                 return escape;
             }
 
-            if (regexp.test(escape)) {
+            if (regexp.exec(escape)) {
                 prefix = '\\x';
-                template = '0'.repeat(2);
+                template = '00';
             } else {
                 prefix = '\\u';
-                template = '0'.repeat(4);
+                template = '0000';
             }
 
             return `${prefix}${(template + escape.charCodeAt(0).toString(radix)).slice(-template.length)}`;

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

@@ -145,7 +145,7 @@ describe('JavaScriptObfuscator', () => {
         });
 
         it('should returns same code every time with same `seed`', function () {
-            this.timeout(15000);
+            this.timeout(60000);
 
             const code: string = readFileAsString('./test/fixtures/sample.js');
             const samples: number = 100;

+ 1 - 3
test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts

@@ -29,7 +29,7 @@ describe('BinaryExpressionControlFlowReplacer', () => {
 
         describe('variant #2 - multiple binary expressions with threshold = 1', () => {
             it('should replace binary expression node by call to control flow storage node', function () {
-                this.timeout(15000);
+                this.timeout(60000);
 
                 const samplesCount: number = 1000;
                 const expectedValue: number = 0.5;
@@ -65,8 +65,6 @@ describe('BinaryExpressionControlFlowReplacer', () => {
                 }
 
                 assert.closeTo(equalsValue / samplesCount, expectedValue, delta);
-
-                console.log(equalsValue / samplesCount);
             });
         });
     });

+ 1 - 3
test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts

@@ -29,7 +29,7 @@ describe('CallExpressionControlFlowReplacer', () => {
 
         describe('variant #2 - multiple call expressions with threshold = 1', () => {
             it('should replace call expression node by call to control flow storage node', function () {
-                this.timeout(15000);
+                this.timeout(60000);
 
                 const samplesCount: number = 1000;
                 const expectedValue: number = 0.5;
@@ -65,8 +65,6 @@ describe('CallExpressionControlFlowReplacer', () => {
                 }
 
                 assert.closeTo(equalsValue / samplesCount, expectedValue, delta);
-
-                console.log(equalsValue / samplesCount);
             });
         });
 

+ 1 - 3
test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts

@@ -29,7 +29,7 @@ describe('LogicalExpressionControlFlowReplacer', () => {
 
         describe('variant #2 - multiple logical expressions with threshold = 1', () => {
             it('should replace logical expression node by call to control flow storage node', function () {
-                this.timeout(15000);
+                this.timeout(60000);
 
                 const samplesCount: number = 1000;
                 const expectedValue: number = 0.5;
@@ -65,8 +65,6 @@ describe('LogicalExpressionControlFlowReplacer', () => {
                 }
 
                 assert.closeTo(equalsValue / samplesCount, expectedValue, delta);
-
-                console.log(equalsValue / samplesCount);
             });
         });
 

+ 2 - 2
test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts

@@ -67,11 +67,11 @@ describe('VariableDeclarationTransformer', () => {
             );
         });
 
-        it('should transform variable call (`identifier` node) before variable declaration if this call is inside function body', () => {
+        it('should transform variable call (`identifier` node name) before variable declaration if this call is inside function body', () => {
             assert.match(obfuscationResult.getObfuscatedCode(),  /console\['\\x6c\\x6f\\x67'\]\(_0x([a-f0-9]){4,6}\['\\x69\\x74\\x65\\x6d'\]\);/);
         });
 
-        it('should not transform variable call (`identifier` node) before variable declaration', () => {
+        it('should transform variable call (`identifier` node name) before variable declaration', () => {
             assert.match(obfuscationResult.getObfuscatedCode(),  /console\['\\x6c\\x6f\\x67'\]\(_0x([a-f0-9]){4,6}\);/);
         });
     });

+ 15 - 0
test/unit-tests/utils/utils/Utils.spec.ts

@@ -5,6 +5,21 @@ import { Utils } from '../../../../src/utils/Utils';
 import { JSFuck } from '../../../../src/enums/JSFuck';
 
 describe('Utils', () => {
+    describe('arrayRange (length: number): number[]', () => {
+        it('should return array with range of numbers', () => {
+            assert.deepEqual(Utils.arrayRange(5), [0, 1, 2, 3, 4]);
+        });
+
+
+        it('should return empty array if length is 0', () => {
+            assert.deepEqual(Utils.arrayRange(0), []);
+        });
+
+        it('should return empty array if length less then 0', () => {
+            assert.deepEqual(Utils.arrayRange(-5), []);
+        });
+    });
+
     describe('arrayRotate <T> (array: T[], times: number): T[]', () => {
         let array: number[];
 

+ 82 - 158
yarn.lock

@@ -1,5 +1,7 @@
 # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
 # yarn lockfile v1
+
+
 "@types/[email protected]":
   version "3.4.34"
   resolved "https://registry.yarnpkg.com/@types/chai/-/chai-3.4.34.tgz#d5335792823bb09cddd5e38c3d211b709183854d"
@@ -46,10 +48,14 @@
   version "2.2.38"
   resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.38.tgz#8c188f6e34c2e7c3f1d0127d908d5a36e5a60dc9"
 
-"@types/node@*", "@types/[email protected]":
+"@types/node@*":
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.0.tgz#c081147b109da5f9c57af70571771be97ce9c0ba"
 
+"@types/[email protected]":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.1.tgz#858610f58e4d48dd4410145eef9e12c97e3aacfd"
+
 "@types/[email protected]":
   version "1.16.34"
   resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-1.16.34.tgz#a9761fff33d0f7b3fe61875b577778a2576a9a03"
@@ -193,7 +199,7 @@ async-each@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
 
-async@^1.4.0, async@^1.4.2, [email protected]:
+[email protected], async@^1.4.0, async@^1.4.2:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
 
@@ -230,9 +236,9 @@ aws4@^1.2.1:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755"
 
[email protected].1:
-  version "6.22.1"
-  resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.22.1.tgz#de32a6c635f2b3069228aa2238b23c09b926cb88"
[email protected].2:
+  version "6.22.2"
+  resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.22.2.tgz#3f814c8acf52759082b8fedd9627f938936ab559"
   dependencies:
     babel-core "^6.22.1"
     babel-polyfill "^6.22.0"
@@ -251,7 +257,7 @@ [email protected]:
   optionalDependencies:
     chokidar "^1.6.1"
 
-babel-code-frame@^6.16.0, babel-code-frame@^6.20.0:
+babel-code-frame@^6.20.0:
   version "6.20.0"
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26"
   dependencies:
@@ -291,19 +297,7 @@ babel-core@^6.22.0, babel-core@^6.22.1:
     slash "^1.0.0"
     source-map "^0.5.0"
 
-babel-generator@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.18.0.tgz#e4f104cb3063996d9850556a45aae4a022060a07"
-  dependencies:
-    babel-messages "^6.8.0"
-    babel-runtime "^6.9.0"
-    babel-types "^6.18.0"
-    detect-indent "^4.0.0"
-    jsesc "^1.3.0"
-    lodash "^4.2.0"
-    source-map "^0.5.0"
-
-babel-generator@^6.22.0:
+babel-generator@^6.18.0, babel-generator@^6.22.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.22.0.tgz#d642bf4961911a8adc7c692b0c9297f325cda805"
   dependencies:
@@ -405,12 +399,6 @@ babel-messages@^6.22.0:
   dependencies:
     babel-runtime "^6.22.0"
 
-babel-messages@^6.8.0:
-  version "6.8.0"
-  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9"
-  dependencies:
-    babel-runtime "^6.0.0"
-
 [email protected]:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/babel-plugin-array-includes/-/babel-plugin-array-includes-2.0.3.tgz#cf5452e81c7b803fb7959f1045ac88e2ec28ff76"
@@ -651,13 +639,6 @@ babel-register@^6.22.0:
     mkdirp "^0.5.1"
     source-map-support "^0.4.2"
 
-babel-runtime@^6.0.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078"
-  dependencies:
-    core-js "^2.4.0"
-    regenerator-runtime "^0.9.5"
-
 babel-runtime@^6.18.0, babel-runtime@^6.22.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611"
@@ -665,17 +646,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0:
     core-js "^2.4.0"
     regenerator-runtime "^0.10.0"
 
-babel-template@^6.16.0:
-  version "6.16.0"
-  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca"
-  dependencies:
-    babel-runtime "^6.9.0"
-    babel-traverse "^6.16.0"
-    babel-types "^6.16.0"
-    babylon "^6.11.0"
-    lodash "^4.2.0"
-
-babel-template@^6.22.0:
+babel-template@^6.16.0, babel-template@^6.22.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.22.0.tgz#403d110905a4626b317a2a1fcb8f3b73204b2edb"
   dependencies:
@@ -685,21 +656,7 @@ babel-template@^6.22.0:
     babylon "^6.11.0"
     lodash "^4.2.0"
 
-babel-traverse@^6.16.0, babel-traverse@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e"
-  dependencies:
-    babel-code-frame "^6.16.0"
-    babel-messages "^6.8.0"
-    babel-runtime "^6.9.0"
-    babel-types "^6.18.0"
-    babylon "^6.11.0"
-    debug "^2.2.0"
-    globals "^9.0.0"
-    invariant "^2.2.0"
-    lodash "^4.2.0"
-
-babel-traverse@^6.22.0, babel-traverse@^6.22.1:
+babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.22.1:
   version "6.22.1"
   resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.22.1.tgz#3b95cd6b7427d6f1f757704908f2fc9748a5f59f"
   dependencies:
@@ -713,16 +670,7 @@ babel-traverse@^6.22.0, babel-traverse@^6.22.1:
     invariant "^2.2.0"
     lodash "^4.2.0"
 
-babel-types@^6.16.0, babel-types@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8"
-  dependencies:
-    babel-runtime "^6.9.1"
-    esutils "^2.0.2"
-    lodash "^4.2.0"
-    to-fast-properties "^1.0.1"
-
-babel-types@^6.19.0, babel-types@^6.22.0:
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.22.0.tgz#2a447e8d0ea25d2512409e4175479fd78cc8b1db"
   dependencies:
@@ -731,11 +679,11 @@ babel-types@^6.19.0, babel-types@^6.22.0:
     lodash "^4.2.0"
     to-fast-properties "^1.0.1"
 
-babylon@^6.11.0, babylon@^6.13.0:
+babylon@^6.11.0:
   version "6.13.1"
   resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.1.tgz#adca350e088f0467647157652bafead6ddb8dfdb"
 
-babylon@^6.15.0:
+babylon@^6.13.0, babylon@^6.15.0:
   version "6.15.0"
   resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e"
 
@@ -1018,7 +966,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@^2.8.1, commander@^2.9.0, commander@2.9.0:
+[email protected], commander@^2.8.1, commander@^2.9.0:
   version "2.9.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
   dependencies:
@@ -1142,7 +1090,7 @@ date-now@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
 
-debug@^2.1.1, debug@^2.2.0, debug@~2.2.0, debug@2.2.0:
+[email protected], debug@^2.1.1, debug@^2.2.0, debug@~2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
   dependencies:
@@ -1187,14 +1135,14 @@ detect-indent@^4.0.0:
   dependencies:
     repeating "^2.0.0"
 
-diff@^3.0.1, diff@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/diff/-/diff-3.1.0.tgz#9406c73a401e6c2b3ba901c5e2c44eb6a60c5385"
-
 [email protected]:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf"
 
+diff@^3.0.1, diff@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.1.0.tgz#9406c73a401e6c2b3ba901c5e2c44eb6a60c5385"
+
 diffie-hellman@^5.0.0:
   version "5.0.2"
   resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
@@ -1268,7 +1216,7 @@ error-ex@^1.2.0:
   dependencies:
     is-arrayish "^0.2.1"
 
-escape-string-regexp@^1.0.2, [email protected]:
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
 
@@ -1283,22 +1231,22 @@ [email protected]:
   optionalDependencies:
     source-map "~0.2.0"
 
-esprima@^2.6.0, esprima@^2.7.1:
-  version "2.7.3"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
-
 [email protected]:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
 
-estraverse@^1.9.1:
-  version "1.9.3"
-  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+esprima@^2.6.0, esprima@^2.7.1:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
 
 [email protected]:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
 
+estraverse@^1.9.1:
+  version "1.9.3"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+
 esutils@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
@@ -1500,18 +1448,7 @@ glob-parent@^2.0.0:
   dependencies:
     is-glob "^2.0.0"
 
-glob@^7.0.0, glob@^7.0.5, glob@^7.1.1:
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.2"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-glob@~5.0.0, [email protected]:
[email protected], glob@~5.0.0:
   version "5.0.15"
   resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
   dependencies:
@@ -1532,6 +1469,17 @@ [email protected]:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+glob@^7.0.0, glob@^7.0.5, glob@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.2"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
 globals@^9.0.0:
   version "9.12.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d"
@@ -1666,7 +1614,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2:
+inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
 
@@ -1807,7 +1755,7 @@ is-utf8@^0.2.0:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
 
-isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0:
+[email protected], isarray@^1.0.0, isarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
 
@@ -2084,7 +2032,7 @@ lodash.keys@^3.0.0:
     lodash.isarguments "^3.0.0"
     lodash.isarray "^3.0.0"
 
-lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0, [email protected]:
+[email protected], lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0:
   version "4.17.4"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
 
@@ -2167,7 +2115,7 @@ minimalistic-assert@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
 
-minimatch@^3.0.0, minimatch@^3.0.2, "minimatch@2 || 3":
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
   dependencies:
@@ -2179,15 +2127,15 @@ [email protected]:
   dependencies:
     brace-expansion "^1.0.0"
 
-minimist@^1.2.0, [email protected]:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
-
-minimist@~0.0.1, [email protected]:
[email protected], minimist@~0.0.1:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
 
-mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0, mkdirp@~0.5.1, [email protected], [email protected]:
[email protected], minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
[email protected], [email protected], "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   dependencies:
@@ -2267,7 +2215,7 @@ node-uuid@~1.4.7:
   version "1.4.7"
   resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f"
 
-nopt@~3.0.6, [email protected]:
+nopt@3.x, nopt@~3.0.6:
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
   dependencies:
@@ -2314,7 +2262,7 @@ object.omit@^2.0.0:
     for-own "^0.1.4"
     is-extendable "^0.1.1"
 
-once@^1.3.0, [email protected]:
+once@1.x, once@^1.3.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   dependencies:
@@ -2509,14 +2457,14 @@ public-encrypt@^4.0.0:
     parse-asn1 "^5.0.0"
     randombytes "^2.0.1"
 
-punycode@^1.2.4, punycode@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
-
 [email protected]:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
 
+punycode@^1.2.4, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
 qs@~6.2.0:
   version "6.2.1"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625"
@@ -2615,10 +2563,6 @@ regenerator-runtime@^0.10.0:
   version "0.10.1"
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb"
 
-regenerator-runtime@^0.9.5:
-  version "0.9.5"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc"
-
 [email protected]:
   version "0.9.8"
   resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c"
@@ -2678,7 +2622,7 @@ repeating@^2.0.0:
   dependencies:
     is-finite "^1.0.0"
 
-request@^2.75.0, [email protected]:
[email protected], request@^2.75.0:
   version "2.75.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93"
   dependencies:
@@ -2722,7 +2666,7 @@ right-align@^0.1.1:
   dependencies:
     align-text "^0.1.1"
 
-rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2:
+rimraf@2, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4:
   version "2.5.4"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
   dependencies:
@@ -2746,7 +2690,7 @@ semver-diff@^2.0.0:
   dependencies:
     semver "^5.0.3"
 
-semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5":
+"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0:
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
 
@@ -2799,13 +2743,7 @@ source-list-map@~0.1.7:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
 
-source-map-support@^0.4.0:
-  version "0.4.8"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.8.tgz#4871918d8a3af07289182e974e32844327b2e98b"
-  dependencies:
-    source-map "^0.5.3"
-
-source-map-support@^0.4.2, [email protected]:
[email protected], source-map-support@^0.4.0, source-map-support@^0.4.2:
   version "0.4.10"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.10.tgz#d7b19038040a14c0837a18e630a196453952b378"
   dependencies:
@@ -2877,10 +2815,6 @@ stream-http@^2.3.1:
     to-arraybuffer "^1.0.0"
     xtend "^4.0.0"
 
-string_decoder@^0.10.25, string_decoder@~0.10.x:
-  version "0.10.31"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
-
 [email protected]:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/string-template/-/string-template-1.0.0.tgz#9e9f2233dc00f218718ec379a28a5673ecca8b96"
@@ -2893,6 +2827,10 @@ string-width@^1.0.1, string-width@^1.0.2:
     is-fullwidth-code-point "^1.0.0"
     strip-ansi "^3.0.0"
 
+string_decoder@^0.10.25, string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
 stringstream@~0.0.4:
   version "0.0.5"
   resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
@@ -2917,21 +2855,17 @@ strip-json-comments@~1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
 
-supports-color@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
-
-supports-color@^3.1.0, supports-color@^3.1.2, [email protected]:
[email protected], supports-color@^3.1.0, supports-color@^3.1.2:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5"
   dependencies:
     has-flag "^1.0.0"
 
-tapable@^0.2.3:
-  version "0.2.4"
-  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.4.tgz#a7814605089d4ba896c33c7e3566e13dcd194aa5"
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
 
-tapable@^0.2.5, tapable@~0.2.5:
+tapable@^0.2.3, tapable@^0.2.5, tapable@~0.2.5:
   version "0.2.6"
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d"
 
@@ -3067,16 +3001,7 @@ [email protected]:
   version "2.1.5"
   resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.1.5.tgz#6fe9479e00e01855247cea216e7561bafcdbcd4a"
 
-uglify-js@^2.6:
-  version "2.7.4"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.4.tgz#a295a0de12b6a650c031c40deb0dc40b14568bd2"
-  dependencies:
-    async "~0.2.6"
-    source-map "~0.5.1"
-    uglify-to-browserify "~1.0.0"
-    yargs "~3.10.0"
-
-uglify-js@^2.7.5:
+uglify-js@^2.6, uglify-js@^2.7.5:
   version "2.7.5"
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8"
   dependencies:
@@ -3138,7 +3063,7 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
 
-util@^0.10.3, [email protected]:
[email protected], util@^0.10.3:
   version "0.10.3"
   resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
   dependencies:
@@ -3243,13 +3168,17 @@ widest-line@^1.0.0:
   dependencies:
     string-width "^1.0.1"
 
[email protected]:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
 window-size@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
 
-w[email protected]:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+w[email protected]:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
 
 wordwrap@^1.0.0, wordwrap@~1.0.0:
   version "1.0.0"
@@ -3259,10 +3188,6 @@ wordwrap@~0.0.2:
   version "0.0.3"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
 
[email protected]:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
-
 wrap-ansi@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f"
@@ -3332,4 +3257,3 @@ yargs@~3.10.0:
 yn@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/yn/-/yn-1.2.0.tgz#d237a4c533f279b2b89d3acac2db4b8c795e4a63"
-

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است