浏览代码

refactoring

sanex3339 8 年之前
父节点
当前提交
c1b3afa92c
共有 96 个文件被更改,包括 705 次插入489 次删除
  1. 271 176
      dist/index.js
  2. 1 1
      src/JavaScriptObfuscator.ts
  3. 16 15
      src/JavaScriptObfuscatorInternal.ts
  4. 5 5
      src/Obfuscator.ts
  5. 36 41
      src/SourceMapCorrector.ts
  6. 13 9
      src/Utils.ts
  7. 2 2
      src/cli/JavaScriptObfuscatorCLI.ts
  8. 26 19
      src/container/InversifyContainerFacade.ts
  9. 2 0
      src/container/ServiceIdentifiers.ts
  10. 1 1
      src/container/modules/node-transformers/NodeControlFlowTransformersModule.ts
  11. 1 1
      src/container/modules/node-transformers/NodeObfuscatorsModule.ts
  12. 1 1
      src/container/modules/node-transformers/NodeTransformersModule.ts
  13. 3 3
      src/custom-nodes/AbstractCustomNode.ts
  14. 2 2
      src/custom-nodes/AbstractCustomNodesFactory.ts
  15. 3 3
      src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts
  16. 3 3
      src/custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionFunctionNode.ts
  17. 3 3
      src/custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/ControlFlowStorageCallNode.ts
  18. 4 4
      src/custom-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts
  19. 3 3
      src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts
  20. 3 3
      src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts
  21. 3 3
      src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts
  22. 3 3
      src/custom-nodes/domain-lock-nodes/DomainLockNode.ts
  23. 3 3
      src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts
  24. 3 3
      src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts
  25. 1 1
      src/custom-nodes/self-defending-nodes/factory/SelfDefendingCustomNodesFactory.ts
  26. 5 5
      src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts
  27. 5 5
      src/custom-nodes/string-array-nodes/StringArrayNode.ts
  28. 4 4
      src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts
  29. 2 2
      src/custom-nodes/string-array-nodes/factory/StringArrayCustomNodesFactory.ts
  30. 1 1
      src/enums/ObfuscationEvents.ts
  31. 1 1
      src/event-emitters/ObfuscationEventEmitter.ts
  32. 1 1
      src/interfaces/IObfuscator.d.ts
  33. 1 1
      src/interfaces/ISourceMapCorrector.d.ts
  34. 2 0
      src/interfaces/container/IContainerServiceIdentifiers.d.ts
  35. 0 1
      src/interfaces/container/IInversifyContainerFacade.d.ts
  36. 2 2
      src/interfaces/custom-nodes/ICustomNode.d.ts
  37. 1 1
      src/interfaces/event-emitters/IObfuscationEventEmitter.d.ts
  38. 2 2
      src/interfaces/node-transformers/IControlFlowReplacer.d.ts
  39. 0 0
      src/interfaces/node-transformers/INodeTransformer.d.ts
  40. 0 0
      src/interfaces/node-transformers/IReplacer.d.ts
  41. 2 2
      src/interfaces/options/IInputOptions.d.ts
  42. 2 2
      src/interfaces/options/IOptions.d.ts
  43. 0 0
      src/interfaces/storages/IStorage.d.ts
  44. 3 3
      src/node-transformers/AbstractNodeTransformer.ts
  45. 4 4
      src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts
  46. 3 3
      src/node-transformers/node-control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts
  47. 4 4
      src/node-transformers/node-control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts
  48. 3 3
      src/node-transformers/node-obfuscators/CatchClauseObfuscator.ts
  49. 4 4
      src/node-transformers/node-obfuscators/FunctionDeclarationObfuscator.ts
  50. 3 3
      src/node-transformers/node-obfuscators/FunctionObfuscator.ts
  51. 3 3
      src/node-transformers/node-obfuscators/LabeledStatementObfuscator.ts
  52. 3 3
      src/node-transformers/node-obfuscators/LiteralObfuscator.ts
  53. 3 3
      src/node-transformers/node-obfuscators/MemberExpressionObfuscator.ts
  54. 3 3
      src/node-transformers/node-obfuscators/MethodDefinitionObfuscator.ts
  55. 2 2
      src/node-transformers/node-obfuscators/ObjectExpressionObfuscator.ts
  56. 4 4
      src/node-transformers/node-obfuscators/VariableDeclarationObfuscator.ts
  57. 3 3
      src/node-transformers/node-obfuscators/replacers/AbstractReplacer.ts
  58. 2 2
      src/node-transformers/node-obfuscators/replacers/BooleanLiteralReplacer.ts
  59. 2 2
      src/node-transformers/node-obfuscators/replacers/IdentifierReplacer.ts
  60. 3 5
      src/node-transformers/node-obfuscators/replacers/NumberLiteralReplacer.ts
  61. 3 4
      src/node-transformers/node-obfuscators/replacers/StringLiteralReplacer.ts
  62. 2 2
      src/node/Node.ts
  63. 2 2
      src/node/NodeAppender.ts
  64. 3 3
      src/node/NodeUtils.ts
  65. 3 3
      src/options/Options.ts
  66. 3 3
      src/options/OptionsNormalizer.ts
  67. 1 1
      src/preset-options/DefaultPreset.ts
  68. 1 1
      src/preset-options/NoCustomNodesPreset.ts
  69. 39 25
      src/stack-trace-analyzer/StackTraceAnalyzer.ts
  70. 1 1
      src/stack-trace-analyzer/callee-data-extractors/ObjectExpressionCalleeDataExtractor.ts
  71. 1 1
      src/storages/ArrayStorage.ts
  72. 1 1
      src/storages/MapStorage.ts
  73. 2 2
      src/storages/custom-nodes/CustomNodesStorage.ts
  74. 0 5
      src/types/TCalleeDataExtractorsFactory.d.ts
  75. 0 6
      src/types/TControlFlowReplacer.d.ts
  76. 0 4
      src/types/TCustomNodesFactory.d.ts
  77. 0 6
      src/types/TNodeTransformer.d.ts
  78. 0 5
      src/types/TNodeTransformersFactory.d.ts
  79. 5 0
      src/types/container/TCalleeDataExtractorsFactory.d.ts
  80. 4 0
      src/types/container/TCustomNodesFactory.d.ts
  81. 5 0
      src/types/container/TNodeTransformersFactory.d.ts
  82. 3 0
      src/types/container/TObfuscationResultFactory.d.ts
  83. 0 0
      src/types/event-emitters/TObfuscationEvent.d.ts
  84. 6 0
      src/types/node-transformers/TControlFlowReplacer.d.ts
  85. 6 0
      src/types/node-transformers/TNodeTransformer.d.ts
  86. 0 0
      src/types/node/TNodeWithBlockStatement.d.ts
  87. 0 0
      src/types/node/TStatement.d.ts
  88. 1 1
      src/types/options/TOptionsNormalizerRule.d.ts
  89. 0 0
      src/types/options/TStringArrayEncoding.d.ts
  90. 0 0
      src/types/stack-trace-analyzer/TObjectMembersCallsChain.d.ts
  91. 1 1
      test/functional-tests/stack-trace-analyzer/StackTraceAnalyzer.spec.ts
  92. 1 1
      test/mocks/NodeMocks.ts
  93. 2 2
      test/unit-tests/OptionsNormalizer.spec.ts
  94. 31 16
      test/unit-tests/SourceMapCorrector.spec.ts
  95. 1 1
      test/unit-tests/node/NodeAppender.spec.ts
  96. 82 0
      test/unit-tests/node/NodeUtils.spec.ts

文件差异内容过多而无法显示
+ 271 - 176
dist/index.js


+ 1 - 1
src/JavaScriptObfuscator.ts

@@ -4,7 +4,7 @@ if (!(<any>global)._babelPolyfill) {
     require('babel-polyfill');
 }
 
-import { IInputOptions } from './interfaces/IInputOptions';
+import { IInputOptions } from './interfaces/options/IInputOptions';
 import { IInversifyContainerFacade } from './interfaces/container/IInversifyContainerFacade';
 import { IJavaScriptObfuscator } from './interfaces/IJavaScriptObfsucator';
 import { IObfuscationResult } from './interfaces/IObfuscationResult';

+ 16 - 15
src/JavaScriptObfuscatorInternal.ts

@@ -5,18 +5,15 @@ import * as esprima from 'esprima';
 import * as escodegen from 'escodegen';
 import * as ESTree from 'estree';
 
-import { Chance } from 'chance';
-
 import { ICustomNode } from './interfaces/custom-nodes/ICustomNode';
 import { IJavaScriptObfuscator } from './interfaces/IJavaScriptObfsucator';
 import { IObfuscationResult } from './interfaces/IObfuscationResult';
 import { IObfuscator } from './interfaces/IObfuscator';
 import { IGeneratorOutput } from './interfaces/IGeneratorOutput';
-import { IOptions } from './interfaces/IOptions';
-import { IStorage } from './interfaces/IStorage';
+import { IOptions } from './interfaces/options/IOptions';
+import { ISourceMapCorrector } from './interfaces/ISourceMapCorrector';
+import { IStorage } from './interfaces/storages/IStorage';
 
-import { ObfuscationResult } from './ObfuscationResult';
-import { SourceMapCorrector } from './SourceMapCorrector';
 import { Utils } from './Utils';
 
 @injectable()
@@ -51,17 +48,25 @@ export class JavaScriptObfuscatorInternal implements IJavaScriptObfuscator {
      */
     private readonly options: IOptions;
 
+    /**
+     * @type {ISourceMapCorrector}
+     */
+    private readonly sourceMapCorrector: ISourceMapCorrector;
+
     /**
      * @param obfuscator
+     * @param sourceMapCorrector
      * @param customNodesStorage
      * @param options
      */
     constructor (
         @inject(ServiceIdentifiers.IObfuscator) obfuscator: IObfuscator,
+        @inject(ServiceIdentifiers.ISourceMapCorrector) sourceMapCorrector: ISourceMapCorrector,
         @inject(ServiceIdentifiers['IStorage<ICustomNode>']) customNodesStorage: IStorage<ICustomNode>,
         @inject(ServiceIdentifiers.IOptions) options: IOptions
     ) {
         this.obfuscator = obfuscator;
+        this.sourceMapCorrector = sourceMapCorrector;
         this.customNodesStorage = customNodesStorage;
         this.options = options;
     }
@@ -97,14 +102,10 @@ export class JavaScriptObfuscatorInternal implements IJavaScriptObfuscator {
      * @returns {IObfuscationResult}
      */
     private getObfuscationResult (generatorOutput: IGeneratorOutput): IObfuscationResult {
-        return new SourceMapCorrector(
-            new ObfuscationResult(
-                generatorOutput.code,
-                generatorOutput.map
-            ),
-            this.options.sourceMapBaseUrl + this.options.sourceMapFileName,
-            this.options.sourceMapMode
-        ).correct();
+        return this.sourceMapCorrector.correct(
+            generatorOutput.code,
+            generatorOutput.map
+        );
     }
 
     /**
@@ -113,7 +114,7 @@ export class JavaScriptObfuscatorInternal implements IJavaScriptObfuscator {
      */
     public obfuscate (sourceCode: string): IObfuscationResult {
         if (this.options.seed !== 0) {
-            Utils.setRandomGenerator(new Chance(this.options.seed));
+            Utils.setRandomGeneratorSeed(this.options.seed);
         }
 
         // parse AST tree

+ 5 - 5
src/Obfuscator.ts

@@ -4,16 +4,16 @@ import { ServiceIdentifiers } from './container/ServiceIdentifiers';
 import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
-import { TNodeTransformersFactory } from './types/TNodeTransformersFactory';
+import { TNodeTransformersFactory } from './types/container/TNodeTransformersFactory';
 import { TVisitorDirection } from './types/TVisitorDirection';
 
 import { ICustomNode } from './interfaces/custom-nodes/ICustomNode';
-import { IObfuscationEventEmitter } from './interfaces/IObfuscationEventEmitter';
+import { IObfuscationEventEmitter } from './interfaces/event-emitters/IObfuscationEventEmitter';
 import { IObfuscator } from './interfaces/IObfuscator';
-import { IOptions } from './interfaces/IOptions';
-import { INodeTransformer } from './interfaces/INodeTransformer';
+import { IOptions } from './interfaces/options/IOptions';
+import { INodeTransformer } from './interfaces/node-transformers/INodeTransformer';
 import { IStackTraceAnalyzer } from './interfaces/stack-trace-analyzer/IStackTraceAnalyzer';
-import { IStorage } from './interfaces/IStorage';
+import { IStorage } from './interfaces/storages/IStorage';
 
 import { NodeTransformers } from './enums/container/NodeTransformers';
 import { NodeType } from './enums/NodeType';

+ 36 - 41
src/SourceMapCorrector.ts

@@ -1,88 +1,83 @@
+import { injectable, inject } from 'inversify';
+import { ServiceIdentifiers } from './container/ServiceIdentifiers';
+
+import { TObfuscationResultFactory } from './types/container/TObfuscationResultFactory';
+
 import { IObfuscationResult } from './interfaces/IObfuscationResult';
+import { IOptions } from './interfaces/options/IOptions';
 import { ISourceMapCorrector } from './interfaces/ISourceMapCorrector';
 
-import { TSourceMapMode } from './types/TSourceMapMode';
-
 import { SourceMapMode } from './enums/SourceMapMode';
 
-import { ObfuscationResult } from './ObfuscationResult';
 import { Utils } from './Utils';
 
+@injectable()
 export class SourceMapCorrector implements ISourceMapCorrector {
     /**
-     * @type {string}
-     */
-    private readonly obfuscatedCode: string;
-
-    /**
-     * @type {string}
+     * @type {TObfuscationResultFactory}
      */
-    private readonly sourceMap: string;
+    private readonly obfuscationResultFactory: TObfuscationResultFactory;
 
     /**
-     * @type {TSourceMapMode}
+     * @type {IOptions}
      */
-    private readonly sourceMapMode: TSourceMapMode;
+    private readonly options: IOptions;
 
     /**
-     * @type {string}
-     */
-    private readonly sourceMapUrl: string;
-
-    /**
-     * @param obfuscationResult
-     * @param sourceMapUrl
-     * @param sourceMapMode
+     * @param obfuscationResultFactory
+     * @param options
      */
     constructor (
-        obfuscationResult: IObfuscationResult,
-        sourceMapUrl: string,
-        sourceMapMode: TSourceMapMode
+        @inject(ServiceIdentifiers['Factory<IObfuscationResult>']) obfuscationResultFactory: TObfuscationResultFactory,
+        @inject(ServiceIdentifiers.IOptions) options: IOptions
     ) {
-        this.obfuscatedCode = obfuscationResult.getObfuscatedCode();
-        this.sourceMap = obfuscationResult.getSourceMap();
-
-        this.sourceMapUrl = sourceMapUrl;
-        this.sourceMapMode = sourceMapMode;
+        this.obfuscationResultFactory = obfuscationResultFactory;
+        this.options = options;
     }
 
     /**
      * @returns {ObfuscationResult}
+     * @param obfuscatedCode
+     * @param sourceMap
      */
-    public correct (): IObfuscationResult {
-        return new ObfuscationResult(
-            this.correctObfuscatedCode(),
-            this.sourceMap
+    public correct (obfuscatedCode: string, sourceMap: string): IObfuscationResult {
+        return this.obfuscationResultFactory(
+            this.correctObfuscatedCode(obfuscatedCode, sourceMap),
+            sourceMap
         );
     }
 
     /**
+     * @param obfuscatedCode
+     * @param sourceMap
      * @returns {string}
      */
-    private correctObfuscatedCode (): string {
-        if (!this.sourceMap) {
-            return this.obfuscatedCode;
+    private correctObfuscatedCode (obfuscatedCode: string, sourceMap: string): string {
+        if (!sourceMap) {
+            return obfuscatedCode;
         }
 
+        const sourceMapUrl: string = this.options.sourceMapBaseUrl + this.options.sourceMapFileName;
+
         let sourceMappingUrl: string = '//# sourceMappingURL=';
 
-        switch (this.sourceMapMode) {
+        switch (this.options.sourceMapMode) {
             case SourceMapMode.Inline:
-                sourceMappingUrl += `data:application/json;base64,${Utils.btoa(this.sourceMap)}`;
+                sourceMappingUrl += `data:application/json;base64,${Utils.btoa(sourceMap)}`;
 
                 break;
 
             case SourceMapMode.Separate:
             default:
-                if (!this.sourceMapUrl) {
-                    return this.obfuscatedCode;
+                if (!sourceMapUrl) {
+                    return obfuscatedCode;
                 }
 
-                sourceMappingUrl += this.sourceMapUrl;
+                sourceMappingUrl += sourceMapUrl;
 
                 break;
         }
 
-        return `${this.obfuscatedCode}\n${sourceMappingUrl}`;
+        return `${obfuscatedCode}\n${sourceMappingUrl}`;
     };
 }

+ 13 - 9
src/Utils.ts

@@ -5,6 +5,11 @@ import { JSFuck } from './enums/JSFuck';
 const isEqual = require('is-equal');
 
 export class Utils {
+    /**
+     * @type {string}
+     */
+    public static readonly hexadecimalPrefix: string = '0x';
+
     /**
      * @type {string}
      */
@@ -58,7 +63,7 @@ export class Utils {
         let output: string = '';
 
         string = encodeURIComponent(string).replace(/%([0-9A-F]{2})/g, (match, p1) => {
-            return String.fromCharCode(parseInt('0x' + p1));
+            return String.fromCharCode(parseInt(`${Utils.hexadecimalPrefix}${p1}`));
         });
 
         for (
@@ -112,7 +117,7 @@ export class Utils {
      * @returns {number}
      */
     public static getRandomFloat (min: number, max: number): number {
-        return Utils.getRandomGenerator().floating({
+        return Utils.randomGenerator.floating({
             min: min,
             max: max,
             fixed: 7
@@ -138,7 +143,7 @@ export class Utils {
      * @returns {number}
      */
     public static getRandomInteger (min: number, max: number): number {
-        return Utils.getRandomGenerator().integer({
+        return Utils.randomGenerator.integer({
             min: min,
             max: max
         });
@@ -150,10 +155,9 @@ export class Utils {
      */
     public static getRandomVariableName (length: number = 6): string {
         const rangeMinInteger: number = 10000,
-            rangeMaxInteger: number = 99999999,
-            prefix: string = '_0x';
+            rangeMaxInteger: number = 99999999;
 
-        return `${prefix}${(
+        return `_${Utils.hexadecimalPrefix}${(
             Utils.decToHex(
                 Utils.getRandomInteger(rangeMinInteger, rangeMaxInteger)
             )
@@ -267,10 +271,10 @@ export class Utils {
     }
 
     /**
-     * @param randomGenerator
+     * @param randomGeneratorSeed
      */
-    public static setRandomGenerator (randomGenerator: Chance.Chance | Chance.SeededChance): void {
-        Utils.randomGenerator = randomGenerator;
+    public static setRandomGeneratorSeed (randomGeneratorSeed: number): void {
+        Utils.randomGenerator = new Chance(randomGeneratorSeed);
     }
 
     /**

+ 2 - 2
src/cli/JavaScriptObfuscatorCLI.ts

@@ -1,9 +1,9 @@
 import * as commander from 'commander';
 import * as path from 'path';
 
-import { TStringArrayEncoding } from '../types/TStringArrayEncoding';
+import { TStringArrayEncoding } from '../types/options/TStringArrayEncoding';
 
-import { IInputOptions } from '../interfaces/IInputOptions';
+import { IInputOptions } from '../interfaces/options/IInputOptions';
 import { IObfuscationResult } from '../interfaces/IObfuscationResult';
 
 import { SourceMapMode } from '../enums/SourceMapMode';

+ 26 - 19
src/container/InversifyContainerFacade.ts

@@ -7,19 +7,23 @@ import { nodeTransformersModule } from './modules/node-transformers/NodeTransfor
 import { stackTraceAnalyzerModule } from './modules/stack-trace-analyzer/StackTraceAnalyzerModule';
 
 import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode';
-import { IInputOptions } from '../interfaces/IInputOptions';
+import { IInputOptions } from '../interfaces/options/IInputOptions';
 import { IInversifyContainerFacade } from '../interfaces/container/IInversifyContainerFacade';
 import { IJavaScriptObfuscator } from '../interfaces/IJavaScriptObfsucator';
-import { IObfuscationEventEmitter } from '../interfaces/IObfuscationEventEmitter';
+import { IObfuscationEventEmitter } from '../interfaces/event-emitters/IObfuscationEventEmitter';
+import { IObfuscationResult } from '../interfaces/IObfuscationResult';
 import { IObfuscator } from '../interfaces/IObfuscator';
-import { IOptions } from '../interfaces/IOptions';
-import { IStorage } from '../interfaces/IStorage';
+import { IOptions } from '../interfaces/options/IOptions';
+import { ISourceMapCorrector } from '../interfaces/ISourceMapCorrector';
+import { IStorage } from '../interfaces/storages/IStorage';
 
 import { CustomNodesStorage } from '../storages/custom-nodes/CustomNodesStorage';
 import { JavaScriptObfuscatorInternal } from '../JavaScriptObfuscatorInternal';
 import { ObfuscationEventEmitter } from '../event-emitters/ObfuscationEventEmitter';
+import { ObfuscationResult } from '../ObfuscationResult';
 import { Obfuscator } from '../Obfuscator';
 import { Options } from "../options/Options";
+import { SourceMapCorrector } from '../SourceMapCorrector';
 
 export class InversifyContainerFacade implements IInversifyContainerFacade {
     /**
@@ -33,11 +37,6 @@ export class InversifyContainerFacade implements IInversifyContainerFacade {
     constructor (options: IInputOptions) {
         this.container = new Container();
 
-        this.container
-            .bind<IJavaScriptObfuscator>(ServiceIdentifiers.IJavaScriptObfuscator)
-            .to(JavaScriptObfuscatorInternal)
-            .inSingletonScope();
-
         this.container
             .bind<IOptions>(ServiceIdentifiers.IOptions)
             .toDynamicValue(() => {
@@ -45,11 +44,29 @@ export class InversifyContainerFacade implements IInversifyContainerFacade {
             })
             .inSingletonScope();
 
+        this.container
+            .bind<IJavaScriptObfuscator>(ServiceIdentifiers.IJavaScriptObfuscator)
+            .to(JavaScriptObfuscatorInternal)
+            .inSingletonScope();
+
         this.container
             .bind<IObfuscator>(ServiceIdentifiers.IObfuscator)
             .to(Obfuscator)
             .inSingletonScope();
 
+        this.container
+            .bind<IObfuscationResult>(ServiceIdentifiers['Factory<IObfuscationResult>'])
+            .toFactory<IObfuscationResult>(() => {
+                return (obfuscatedCode: string, sourceMap: string) => {
+                    return new ObfuscationResult(obfuscatedCode, sourceMap);
+                };
+            });
+
+        this.container
+            .bind<ISourceMapCorrector>(ServiceIdentifiers.ISourceMapCorrector)
+            .to(SourceMapCorrector)
+            .inSingletonScope();
+
         this.container
             .bind<IObfuscationEventEmitter>(ServiceIdentifiers.IObfuscationEventEmitter)
             .to(ObfuscationEventEmitter)
@@ -74,14 +91,4 @@ export class InversifyContainerFacade implements IInversifyContainerFacade {
     public get <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>): T {
         return this.container.get<T>(serviceIdentifier);
     }
-
-    /**
-     * @param serviceIdentifier
-     * @param key
-     * @param value
-     * @returns {T}
-     */
-    public getTagged <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>, key: string, value: any): T {
-        return this.container.getTagged<T>(serviceIdentifier, key, value);
-    }
 }

+ 2 - 0
src/container/ServiceIdentifiers.ts

@@ -4,6 +4,7 @@ export const ServiceIdentifiers: IContainerServiceIdentifiers = {
     'Factory<ICalleeDataExtractor>': Symbol('Factory<ICalleeDataExtractor>'),
     'Factory<IControlFlowReplacer>': Symbol('Factory<IControlFlowReplacer>'),
     'Factory<INodeTransformer[]>': Symbol('Factory<INodeTransformer[]>'),
+    'Factory<IObfuscationResult>': Symbol('Factory<IObfuscationResult>'),
     'Factory<IReplacer>': Symbol('Factory<IReplacer>'),
     ICalleeDataExtractor: Symbol('ICalleeDataExtractor'),
     IControlFlowReplacer: Symbol('IControlFlowReplacer'),
@@ -13,6 +14,7 @@ export const ServiceIdentifiers: IContainerServiceIdentifiers = {
     IObfuscator: Symbol('IObfuscator'),
     IOptions: Symbol('IOptions'),
     IReplacer: Symbol('IReplacer'),
+    ISourceMapCorrector: Symbol('ISourceMapCorrector'),
     IStackTraceAnalyzer: Symbol('IStackTraceAnalyzer'),
     'IStorage<ICustomNode>': Symbol('IStorage<ICustomNode>')
 };

+ 1 - 1
src/container/modules/node-transformers/NodeControlFlowTransformersModule.ts

@@ -1,7 +1,7 @@
 import { ContainerModule, interfaces } from 'inversify';
 import { ServiceIdentifiers } from '../../ServiceIdentifiers';
 
-import { IControlFlowReplacer } from '../../../interfaces/IControlFlowReplacer';
+import { IControlFlowReplacer } from '../../../interfaces/node-transformers/IControlFlowReplacer';
 
 import { NodeControlFlowTransformersReplacers } from '../../../enums/container/NodeControlFlowTransformersReplacers';
 

+ 1 - 1
src/container/modules/node-transformers/NodeObfuscatorsModule.ts

@@ -1,7 +1,7 @@
 import { ContainerModule, interfaces } from 'inversify';
 import { ServiceIdentifiers } from '../../ServiceIdentifiers';
 
-import { IReplacer } from '../../../interfaces/IReplacer';
+import { IReplacer } from '../../../interfaces/node-transformers/IReplacer';
 
 import { NodeObfuscatorsReplacers } from '../../../enums/container/NodeObfuscatorsReplacers';
 

+ 1 - 1
src/container/modules/node-transformers/NodeTransformersModule.ts

@@ -1,7 +1,7 @@
 import { ContainerModule, interfaces } from 'inversify';
 import { ServiceIdentifiers } from '../../ServiceIdentifiers';
 
-import { INodeTransformer } from '../../../interfaces/INodeTransformer';
+import { INodeTransformer } from '../../../interfaces/node-transformers/INodeTransformer';
 
 import { NodeTransformers } from '../../../enums/container/NodeTransformers';
 

+ 3 - 3
src/custom-nodes/AbstractCustomNode.ts

@@ -1,10 +1,10 @@
 import * as ESTree from 'estree';
 
-import { TObfuscationEvent } from '../types/TObfuscationEvent';
+import { TObfuscationEvent } from '../types/event-emitters/TObfuscationEvent';
 
 import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../interfaces/IOptions';
-import { TStatement } from '../types/TStatement';
+import { IOptions } from '../interfaces/options/IOptions';
+import { TStatement } from '../types/node/TStatement';
 
 import { NodeUtils } from '../node/NodeUtils';
 

+ 2 - 2
src/custom-nodes/AbstractCustomNodesFactory.ts

@@ -1,8 +1,8 @@
-import { TObfuscationEvent } from '../types/TObfuscationEvent';
+import { TObfuscationEvent } from '../types/event-emitters/TObfuscationEvent';
 
 import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode';
 import { ICustomNodesFactory } from '../interfaces/custom-nodes/ICustomNodesFactory';
-import { IOptions } from '../interfaces/IOptions';
+import { IOptions } from '../interfaces/options/IOptions';
 import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData';
 
 import { ObfuscationEvents } from '../enums/ObfuscationEvents';

+ 3 - 3
src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts

@@ -1,9 +1,9 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../interfaces/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 import { IStackTraceData } from '../../interfaces/stack-trace-analyzer/IStackTraceData';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';

+ 3 - 3
src/custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionFunctionNode.ts

@@ -1,9 +1,9 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../../interfaces/IOptions';
+import { IOptions } from '../../../interfaces/options/IOptions';
 
 import { ObfuscationEvents } from '../../../enums/ObfuscationEvents';
 

+ 3 - 3
src/custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/ControlFlowStorageCallNode.ts

@@ -1,9 +1,9 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../../interfaces/IOptions';
+import { IOptions } from '../../../interfaces/options/IOptions';
 
 import { ObfuscationEvents } from '../../../enums/ObfuscationEvents';
 

+ 4 - 4
src/custom-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts

@@ -1,11 +1,11 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';
 

+ 3 - 3
src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts

@@ -1,9 +1,9 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../interfaces/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';
 

+ 3 - 3
src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts

@@ -1,9 +1,9 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../interfaces/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';
 

+ 3 - 3
src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts

@@ -1,9 +1,9 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../interfaces/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';
 

+ 3 - 3
src/custom-nodes/domain-lock-nodes/DomainLockNode.ts

@@ -1,9 +1,9 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../interfaces/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 import { IStackTraceData } from '../../interfaces/stack-trace-analyzer/IStackTraceData';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';

+ 3 - 3
src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts

@@ -1,9 +1,9 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../interfaces/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 import { IStackTraceData } from '../../interfaces/stack-trace-analyzer/IStackTraceData';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';

+ 3 - 3
src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts

@@ -1,9 +1,9 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../interfaces/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 import { IStackTraceData } from '../../interfaces/stack-trace-analyzer/IStackTraceData';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';

+ 1 - 1
src/custom-nodes/self-defending-nodes/factory/SelfDefendingCustomNodesFactory.ts

@@ -1,4 +1,4 @@
-import { TObfuscationEvent } from '../../../types/TObfuscationEvent';
+import { TObfuscationEvent } from '../../../types/event-emitters/TObfuscationEvent';
 
 import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
 import { IStackTraceData } from '../../../interfaces/stack-trace-analyzer/IStackTraceData';

+ 5 - 5
src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts

@@ -1,12 +1,12 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
-import { TStatement } from '../../types/TStatement';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
+import { TStatement } from '../../types/node/TStatement';
 
 import { ICustomNodeWithIdentifier } from '../../interfaces/custom-nodes/ICustomNodeWithIdentifier';
-import { IOptions } from '../../interfaces/IOptions';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';
 import { StringArrayEncoding } from '../../enums/StringArrayEncoding';

+ 5 - 5
src/custom-nodes/string-array-nodes/StringArrayNode.ts

@@ -1,12 +1,12 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
-import { TStatement } from '../../types/TStatement';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
+import { TStatement } from '../../types/node/TStatement';
 
 import { ICustomNodeWithData } from '../../interfaces/custom-nodes/ICustomNodeWithData';
-import { IOptions } from '../../interfaces/IOptions';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';
 

+ 4 - 4
src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts

@@ -1,10 +1,10 @@
 import * as format from 'string-template';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
-import { IOptions } from '../../interfaces/IOptions';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { ObfuscationEvents } from '../../enums/ObfuscationEvents';
 

+ 2 - 2
src/custom-nodes/string-array-nodes/factory/StringArrayCustomNodesFactory.ts

@@ -1,4 +1,4 @@
-import { TObfuscationEvent } from '../../../types/TObfuscationEvent';
+import { TObfuscationEvent } from '../../../types/event-emitters/TObfuscationEvent';
 
 import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
 import { IStackTraceData } from '../../../interfaces/stack-trace-analyzer/IStackTraceData';
@@ -12,7 +12,7 @@ import { StringArrayRotateFunctionNode } from '../StringArrayRotateFunctionNode'
 import { AbstractCustomNodesFactory } from '../../AbstractCustomNodesFactory';
 import { StringArrayStorage } from '../../../storages/string-array/StringArrayStorage';
 import { Utils } from '../../../Utils';
-import { IStorage } from '../../../interfaces/IStorage';
+import { IStorage } from '../../../interfaces/storages/IStorage';
 
 export class StringArrayCustomNodesFactory extends AbstractCustomNodesFactory {
     /**

+ 1 - 1
src/enums/ObfuscationEvents.ts

@@ -1,4 +1,4 @@
-import { TObfuscationEvent } from '../types/TObfuscationEvent';
+import { TObfuscationEvent } from '../types/event-emitters/TObfuscationEvent';
 
 import { Utils } from '../Utils';
 

+ 1 - 1
src/event-emitters/ObfuscationEventEmitter.ts

@@ -1,6 +1,6 @@
 import { decorate, injectable } from 'inversify';
 
-import { IObfuscationEventEmitter } from '../interfaces/IObfuscationEventEmitter';
+import { IObfuscationEventEmitter } from '../interfaces/event-emitters/IObfuscationEventEmitter';
 
 import { EventEmitter } from 'events';
 

+ 1 - 1
src/interfaces/IObfuscator.d.ts

@@ -1,7 +1,7 @@
 import * as ESTree from 'estree';
 
 import { ICustomNode } from './custom-nodes/ICustomNode';
-import { IStorage } from './IStorage';
+import { IStorage } from './storages/IStorage';
 
 export interface IObfuscator {
     obfuscateAstTree (astTree: ESTree.Program, customNodesStorage: IStorage<ICustomNode>): ESTree.Program;

+ 1 - 1
src/interfaces/ISourceMapCorrector.d.ts

@@ -1,5 +1,5 @@
 import { IObfuscationResult } from './IObfuscationResult';
 
 export interface ISourceMapCorrector {
-    correct (): IObfuscationResult;
+    correct (obfuscatedCode: string, sourceMap: string): IObfuscationResult;
 }

+ 2 - 0
src/interfaces/container/IContainerServiceIdentifiers.d.ts

@@ -4,6 +4,7 @@ export interface IContainerServiceIdentifiers {
     'Factory<ICalleeDataExtractor>': interfaces.ServiceIdentifier<any>;
     'Factory<IControlFlowReplacer>': interfaces.ServiceIdentifier<any>;
     'Factory<INodeTransformer[]>': interfaces.ServiceIdentifier<any>;
+    'Factory<IObfuscationResult>': interfaces.ServiceIdentifier<any>;
     'Factory<IReplacer>': interfaces.ServiceIdentifier<any>;
     ICalleeDataExtractor: interfaces.ServiceIdentifier<any>;
     IControlFlowReplacer: interfaces.ServiceIdentifier<any>;
@@ -13,6 +14,7 @@ export interface IContainerServiceIdentifiers {
     IObfuscator: interfaces.ServiceIdentifier<any>;
     IOptions: interfaces.ServiceIdentifier<any>;
     IReplacer: interfaces.ServiceIdentifier<any>;
+    ISourceMapCorrector: interfaces.ServiceIdentifier<any>;
     IStackTraceAnalyzer: interfaces.ServiceIdentifier<any>;
     'IStorage<ICustomNode>': interfaces.ServiceIdentifier<any>;
     [key: string]: interfaces.ServiceIdentifier<any>;

+ 0 - 1
src/interfaces/container/IInversifyContainerFacade.d.ts

@@ -2,5 +2,4 @@ import { interfaces } from 'inversify';
 
 export interface IInversifyContainerFacade {
     get <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>): T;
-    getTagged <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>, key: string, value: any): T;
 }

+ 2 - 2
src/interfaces/custom-nodes/ICustomNode.d.ts

@@ -1,7 +1,7 @@
 import * as ESTree from 'estree';
 
-import { TObfuscationEvent } from '../../types/TObfuscationEvent';
-import { TStatement } from '../../types/TStatement';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
+import { TStatement } from '../../types/node/TStatement';
 
 export interface ICustomNode {
     /**

+ 1 - 1
src/interfaces/IObfuscationEventEmitter.d.ts → src/interfaces/event-emitters/IObfuscationEventEmitter.d.ts

@@ -1,6 +1,6 @@
 import Events = NodeJS.Events;
 
-import { TObfuscationEvent } from '../types/TObfuscationEvent';
+import { TObfuscationEvent } from '../../types/event-emitters/TObfuscationEvent';
 
 export interface IObfuscationEventEmitter extends Events {
     on(event: TObfuscationEvent, listener: Function): this;

+ 2 - 2
src/interfaces/IControlFlowReplacer.d.ts → src/interfaces/node-transformers/IControlFlowReplacer.d.ts

@@ -1,7 +1,7 @@
 import * as ESTree from 'estree';
 
-import { ICustomNode } from './custom-nodes/ICustomNode';
-import { IStorage } from './IStorage';
+import { ICustomNode } from '../custom-nodes/ICustomNode';
+import { IStorage } from '../storages/IStorage';
 
 export interface IControlFlowReplacer {
     replace (

+ 0 - 0
src/interfaces/INodeTransformer.d.ts → src/interfaces/node-transformers/INodeTransformer.d.ts


+ 0 - 0
src/interfaces/IReplacer.d.ts → src/interfaces/node-transformers/IReplacer.d.ts


+ 2 - 2
src/interfaces/IInputOptions.d.ts → src/interfaces/options/IInputOptions.d.ts

@@ -1,5 +1,5 @@
-import { TSourceMapMode } from '../types/TSourceMapMode';
-import { TStringArrayEncoding } from '../types/TStringArrayEncoding';
+import { TSourceMapMode } from '../../types/TSourceMapMode';
+import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding';
 
 export interface IInputOptions {
     compact?: boolean;

+ 2 - 2
src/interfaces/IOptions.d.ts → src/interfaces/options/IOptions.d.ts

@@ -1,5 +1,5 @@
-import { TSourceMapMode } from '../types/TSourceMapMode';
-import { TStringArrayEncoding } from '../types/TStringArrayEncoding';
+import { TSourceMapMode } from '../../types/TSourceMapMode';
+import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding';
 
 export interface IOptions {
     readonly compact: boolean;

+ 0 - 0
src/interfaces/IStorage.d.ts → src/interfaces/storages/IStorage.d.ts


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

@@ -3,9 +3,9 @@ import { injectable, inject } from 'inversify';
 import * as ESTree from 'estree';
 
 import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode';
-import { INodeTransformer } from '../interfaces/INodeTransformer';
-import { IOptions } from '../interfaces/IOptions';
-import { IStorage } from '../interfaces/IStorage';
+import { INodeTransformer } from '../interfaces/node-transformers/INodeTransformer';
+import { IOptions } from '../interfaces/options/IOptions';
+import { IStorage } from '../interfaces/storages/IStorage';
 import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
 
 @injectable()

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

@@ -4,12 +4,12 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
-import { TControlFlowReplacer } from '../../types/TControlFlowReplacer';
-import { TStatement } from '../../types/TStatement';
+import { TControlFlowReplacer } from '../../types/node-transformers/TControlFlowReplacer';
+import { TStatement } from '../../types/node/TStatement';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeType } from '../../enums/NodeType';
 

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

@@ -3,10 +3,10 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 
 import * as ESTree from 'estree';
 
-import { IControlFlowReplacer } from '../../../interfaces/IControlFlowReplacer';
+import { IControlFlowReplacer } from '../../../interfaces/node-transformers/IControlFlowReplacer';
 import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../../interfaces/IOptions';
-import { IStorage } from '../../../interfaces/IStorage';
+import { IOptions } from '../../../interfaces/options/IOptions';
+import { IStorage } from '../../../interfaces/storages/IStorage';
 
 import { Utils } from '../../../Utils';
 

+ 4 - 4
src/node-transformers/node-control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.ts

@@ -5,8 +5,8 @@ import * as escodegen from 'escodegen';
 import * as ESTree from 'estree';
 
 import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../../interfaces/IOptions';
-import { IStorage } from '../../../interfaces/IStorage';
+import { IOptions } from '../../../interfaces/options/IOptions';
+import { IStorage } from '../../../interfaces/storages/IStorage';
 
 import { AbstractControlFlowReplacer } from './AbstractControlFlowReplacer';
 import { BinaryExpressionFunctionNode } from '../../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionFunctionNode';
@@ -40,14 +40,14 @@ export class BinaryExpressionControlFlowReplacer extends AbstractControlFlowRepl
      * @param parentNode
      * @param controlFlowStorage
      * @param controlFlowStorageCustomNodeName
-     * @returns {ICustomNode | undefined}
+     * @returns {ICustomNode}
      */
     public replace (
         binaryExpressionNode: ESTree.BinaryExpression,
         parentNode: ESTree.Node,
         controlFlowStorage: IStorage <ICustomNode>,
         controlFlowStorageCustomNodeName: string
-    ): ICustomNode | undefined {
+    ): ICustomNode {
         const key: string = AbstractControlFlowReplacer.getStorageKey();
 
         controlFlowStorage.set(key, new BinaryExpressionFunctionNode(binaryExpressionNode.operator, this.options));

+ 3 - 3
src/node-transformers/node-obfuscators/CatchClauseObfuscator.ts

@@ -5,9 +5,9 @@ import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IReplacer } from '../../interfaces/IReplacer';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IReplacer } from '../../interfaces/node-transformers/IReplacer';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
 import { NodeType } from '../../enums/NodeType';

+ 4 - 4
src/node-transformers/node-obfuscators/FunctionDeclarationObfuscator.ts

@@ -4,12 +4,12 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IReplacer } from '../../interfaces/IReplacer';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IReplacer } from '../../interfaces/node-transformers/IReplacer';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
 import { NodeType } from '../../enums/NodeType';

+ 3 - 3
src/node-transformers/node-obfuscators/FunctionObfuscator.ts

@@ -5,9 +5,9 @@ import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IReplacer } from '../../interfaces/IReplacer';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IReplacer } from '../../interfaces/node-transformers/IReplacer';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
 import { NodeType } from '../../enums/NodeType';

+ 3 - 3
src/node-transformers/node-obfuscators/LabeledStatementObfuscator.ts

@@ -5,9 +5,9 @@ import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IReplacer } from '../../interfaces/IReplacer';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IReplacer } from '../../interfaces/node-transformers/IReplacer';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
 import { NodeType } from '../../enums/NodeType';

+ 3 - 3
src/node-transformers/node-obfuscators/LiteralObfuscator.ts

@@ -5,9 +5,9 @@ import * as escodegen from 'escodegen';
 import * as ESTree from 'estree';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IReplacer } from '../../interfaces/IReplacer';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IReplacer } from '../../interfaces/node-transformers/IReplacer';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
 

+ 3 - 3
src/node-transformers/node-obfuscators/MemberExpressionObfuscator.ts

@@ -6,9 +6,9 @@ import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IReplacer } from '../../interfaces/IReplacer';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IReplacer } from '../../interfaces/node-transformers/IReplacer';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
 import { NodeType } from '../../enums/NodeType';

+ 3 - 3
src/node-transformers/node-obfuscators/MethodDefinitionObfuscator.ts

@@ -5,9 +5,9 @@ import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IReplacer } from '../../interfaces/IReplacer';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IReplacer } from '../../interfaces/node-transformers/IReplacer';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
 

+ 2 - 2
src/node-transformers/node-obfuscators/ObjectExpressionObfuscator.ts

@@ -6,8 +6,8 @@ import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeType } from '../../enums/NodeType';
 

+ 4 - 4
src/node-transformers/node-obfuscators/VariableDeclarationObfuscator.ts

@@ -4,12 +4,12 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
-import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
+import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
-import { IReplacer } from '../../interfaces/IReplacer';
-import { IStorage } from '../../interfaces/IStorage';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IReplacer } from '../../interfaces/node-transformers/IReplacer';
+import { IStorage } from '../../interfaces/storages/IStorage';
 
 import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
 import { NodeType } from '../../enums/NodeType';

+ 3 - 3
src/node-transformers/node-obfuscators/replacers/AbstractReplacer.ts

@@ -2,9 +2,9 @@ import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 
 import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../../interfaces/IOptions';
-import { IReplacer } from '../../../interfaces/IReplacer';
-import { IStorage } from '../../../interfaces/IStorage';
+import { IOptions } from '../../../interfaces/options/IOptions';
+import { IReplacer } from '../../../interfaces/node-transformers/IReplacer';
+import { IStorage } from '../../../interfaces/storages/IStorage';
 
 @injectable()
 export abstract class AbstractReplacer implements IReplacer {

+ 2 - 2
src/node-transformers/node-obfuscators/replacers/BooleanLiteralReplacer.ts

@@ -2,8 +2,8 @@ import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 
 import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../../interfaces/IOptions';
-import { IStorage } from '../../../interfaces/IStorage';
+import { IOptions } from '../../../interfaces/options/IOptions';
+import { IStorage } from '../../../interfaces/storages/IStorage';
 
 import { JSFuck } from '../../../enums/JSFuck';
 

+ 2 - 2
src/node-transformers/node-obfuscators/replacers/IdentifierReplacer.ts

@@ -2,8 +2,8 @@ import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 
 import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../../interfaces/IOptions';
-import { IStorage } from '../../../interfaces/IStorage';
+import { IOptions } from '../../../interfaces/options/IOptions';
+import { IStorage } from '../../../interfaces/storages/IStorage';
 
 import { AbstractReplacer } from './AbstractReplacer';
 import { Utils } from '../../../Utils';

+ 3 - 5
src/node-transformers/node-obfuscators/replacers/NumberLiteralReplacer.ts

@@ -2,8 +2,8 @@ import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 
 import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../../interfaces/IOptions';
-import { IStorage } from '../../../interfaces/IStorage';
+import { IOptions } from '../../../interfaces/options/IOptions';
+import { IStorage } from '../../../interfaces/storages/IStorage';
 
 import { AbstractReplacer } from './AbstractReplacer';
 import { Utils } from '../../../Utils';
@@ -26,12 +26,10 @@ export class NumberLiteralReplacer extends AbstractReplacer {
      * @returns {string}
      */
     public replace (nodeValue: number): string {
-        const prefix: string = '0x';
-
         if (!Utils.isInteger(nodeValue)) {
             return String(nodeValue);
         }
 
-        return `${prefix}${Utils.decToHex(nodeValue)}`;
+        return `${Utils.hexadecimalPrefix}${Utils.decToHex(nodeValue)}`;
     }
 }

+ 3 - 4
src/node-transformers/node-obfuscators/replacers/StringLiteralReplacer.ts

@@ -4,13 +4,12 @@ import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
 import { ICustomNodeWithData } from '../../../interfaces/custom-nodes/ICustomNodeWithData';
 import { ICustomNodeWithIdentifier } from '../../../interfaces/custom-nodes/ICustomNodeWithIdentifier';
-import { IOptions } from '../../../interfaces/IOptions';
-import { IStorage } from '../../../interfaces/IStorage';
+import { IOptions } from '../../../interfaces/options/IOptions';
+import { IStorage } from '../../../interfaces/storages/IStorage';
 
 import { StringArrayEncoding } from '../../../enums/StringArrayEncoding';
 
 import { AbstractReplacer } from './AbstractReplacer';
-import { NumberLiteralReplacer } from './NumberLiteralReplacer';
 import { Utils } from '../../../Utils';
 
 @injectable()
@@ -93,7 +92,7 @@ export class StringLiteralReplacer extends AbstractReplacer {
         }
 
         const stringArrayCallsWrapper: ICustomNodeWithIdentifier = <ICustomNodeWithIdentifier>this.customNodesStorage.get('stringArrayCallsWrapper');
-        const hexadecimalIndex: string = new NumberLiteralReplacer(this.customNodesStorage, this.options).replace(indexOfValue);
+        const hexadecimalIndex: string = `${Utils.hexadecimalPrefix}${Utils.decToHex(indexOfValue)}`;
 
         if (this.options.stringArrayEncoding === StringArrayEncoding.rc4) {
             return `${stringArrayCallsWrapper.getNodeIdentifier()}('${hexadecimalIndex}', '${Utils.stringToUnicodeEscapeSequence(rc4Key)}')`;

+ 2 - 2
src/node/Node.ts

@@ -1,7 +1,7 @@
 import * as ESTree from 'estree';
 
-import { TNodeWithBlockStatement } from '../types/TNodeWithBlockStatement';
-import { TStatement } from '../types/TStatement';
+import { TNodeWithBlockStatement } from '../types/node/TNodeWithBlockStatement';
+import { TStatement } from '../types/node/TStatement';
 
 import { NodeType } from '../enums/NodeType';
 

+ 2 - 2
src/node/NodeAppender.ts

@@ -1,7 +1,7 @@
 import * as ESTree from 'estree';
 
-import { TNodeWithBlockStatement } from '../types/TNodeWithBlockStatement';
-import { TStatement } from '../types/TStatement';
+import { TNodeWithBlockStatement } from '../types/node/TNodeWithBlockStatement';
+import { TStatement } from '../types/node/TStatement';
 
 import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData';
 

+ 3 - 3
src/node/NodeUtils.ts

@@ -3,8 +3,8 @@ import * as esprima from 'esprima';
 import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
-import { TNodeWithBlockStatement } from '../types/TNodeWithBlockStatement';
-import { TStatement } from '../types/TStatement';
+import { TNodeWithBlockStatement } from '../types/node/TNodeWithBlockStatement';
+import { TStatement } from '../types/node/TStatement';
 
 import { NodeType } from '../enums/NodeType';
 
@@ -116,7 +116,7 @@ export class NodeUtils {
             return depth;
         }
 
-        if (Node.isBlockStatementNode(node)) {
+        if (Node.isBlockStatementNode(node) && Utils.arrayContains(NodeUtils.nodesWithBlockScope, parentNode.type)) {
             return NodeUtils.getNodeBlockScopeDepth(parentNode, ++depth);
         }
 

+ 3 - 3
src/options/Options.ts

@@ -16,11 +16,11 @@ ValidationError,
 ValidatorOptions
 } from 'class-validator';
 
-import { IInputOptions } from '../interfaces/IInputOptions';
-import { IOptions } from '../interfaces/IOptions';
+import { IInputOptions } from '../interfaces/options/IInputOptions';
+import { IOptions } from '../interfaces/options/IOptions';
 
 import { TSourceMapMode } from '../types/TSourceMapMode';
-import { TStringArrayEncoding } from '../types/TStringArrayEncoding';
+import { TStringArrayEncoding } from '../types/options/TStringArrayEncoding';
 
 import { DEFAULT_PRESET } from '../preset-options/DefaultPreset';
 

+ 3 - 3
src/options/OptionsNormalizer.ts

@@ -1,7 +1,7 @@
-import { IInputOptions } from '../interfaces/IInputOptions';
-import { IOptions } from '../interfaces/IOptions';
+import { IInputOptions } from '../interfaces/options/IInputOptions';
+import { IOptions } from '../interfaces/options/IOptions';
 
-import { TOptionsNormalizerRule } from '../types/TOptionsNormalizerRule';
+import { TOptionsNormalizerRule } from '../types/options/TOptionsNormalizerRule';
 
 import { Utils } from '../Utils';
 

+ 1 - 1
src/preset-options/DefaultPreset.ts

@@ -1,4 +1,4 @@
-import { IInputOptions } from '../interfaces/IInputOptions';
+import { IInputOptions } from '../interfaces/options/IInputOptions';
 
 import { SourceMapMode } from '../enums/SourceMapMode';
 

+ 1 - 1
src/preset-options/NoCustomNodesPreset.ts

@@ -1,4 +1,4 @@
-import { IInputOptions } from '../interfaces/IInputOptions';
+import { IInputOptions } from '../interfaces/options/IInputOptions';
 
 import { SourceMapMode } from '../enums/SourceMapMode';
 

+ 39 - 25
src/stack-trace-analyzer/StackTraceAnalyzer.ts

@@ -4,7 +4,7 @@ import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
 import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
-import { TCalleeDataExtractorsFactory } from '../types/TCalleeDataExtractorsFactory';
+import { TCalleeDataExtractorsFactory } from '../types/container/TCalleeDataExtractorsFactory';
 
 import { ICalleeData } from '../interfaces/stack-trace-analyzer/ICalleeData';
 import { ICalleeDataExtractor } from '../interfaces/stack-trace-analyzer/ICalleeDataExtractor';
@@ -117,42 +117,56 @@ export class StackTraceAnalyzer implements IStackTraceAnalyzer {
     private analyzeRecursive (blockScopeBody: ESTree.Node[]): IStackTraceData[] {
         const limitIndex: number = StackTraceAnalyzer.getLimitIndex(blockScopeBody.length);
         const stackTraceData: IStackTraceData[] = [];
+        const blockScopeBodyLength: number = blockScopeBody.length;
 
-        for (
-            let index: number = 0, blockScopeBodyLength: number = blockScopeBody.length;
-            index < blockScopeBodyLength;
-            index++
-        ) {
-            const rootNode: ESTree.Node = blockScopeBody[index];
-
+        for (let index: number = 0; index < blockScopeBodyLength; index++) {
             if (index > limitIndex) {
                 break;
             }
 
-            estraverse.traverse(rootNode, {
-                enter: (node: ESTree.Node): any => {
-                    if (!Node.isCallExpressionNode(node) || rootNode.parentNode !== NodeUtils.getBlockScopeOfNode(node)) {
+            const blockScopeBodyNode: ESTree.Node = blockScopeBody[index];
+
+            estraverse.traverse(blockScopeBodyNode, {
+                enter: (node: ESTree.Node): void => {
+                    if (
+                        !Node.isCallExpressionNode(node) ||
+                        blockScopeBodyNode.parentNode !== NodeUtils.getBlockScopeOfNode(node)
+                    ) {
                         return;
                     }
 
-                    StackTraceAnalyzer.calleeDataExtractorsList.forEach((calleeDataExtractorName: CalleeDataExtractors) => {
-                        const calleeData: ICalleeData | null = this.calleeDataExtractorsFactory(calleeDataExtractorName)
-                            .extract(blockScopeBody, node.callee);
-
-                        if (!calleeData) {
-                            return;
-                        }
-
-                        stackTraceData.push(
-                            Object.assign({}, calleeData, {
-                                stackTrace: this.analyzeRecursive(calleeData.callee.body)
-                            })
-                        );
-                    });
+                    this.analyzeCallExpressionNode(stackTraceData, blockScopeBody, node);
                 }
             });
         }
 
         return stackTraceData;
     }
+
+    /**
+     * @param stackTraceData
+     * @param blockScopeBody
+     * @param callExpressionNode
+     * @returns {IStackTraceData[]}
+     */
+    private analyzeCallExpressionNode (
+        stackTraceData: IStackTraceData[],
+        blockScopeBody: ESTree.Node[],
+        callExpressionNode: ESTree.CallExpression
+    ): void {
+        StackTraceAnalyzer.calleeDataExtractorsList.forEach((calleeDataExtractorName: CalleeDataExtractors) => {
+            const calleeData: ICalleeData | null = this.calleeDataExtractorsFactory(calleeDataExtractorName)
+                .extract(blockScopeBody, callExpressionNode.callee);
+
+            if (!calleeData) {
+                return;
+            }
+
+            stackTraceData.push(
+                Object.assign({}, calleeData, {
+                    stackTrace: this.analyzeRecursive(calleeData.callee.body)
+                })
+            );
+        });
+    }
 }

+ 1 - 1
src/stack-trace-analyzer/callee-data-extractors/ObjectExpressionCalleeDataExtractor.ts

@@ -3,7 +3,7 @@ import { injectable } from 'inversify';
 import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
-import { TObjectMembersCallsChain } from '../../types/TObjectMembersCallsChain';
+import { TObjectMembersCallsChain } from '../../types/stack-trace-analyzer/TObjectMembersCallsChain';
 
 import { ICalleeData } from '../../interfaces/stack-trace-analyzer/ICalleeData';
 

+ 1 - 1
src/storages/ArrayStorage.ts

@@ -1,4 +1,4 @@
-import { IStorage } from '../interfaces/IStorage';
+import { IStorage } from '../interfaces/storages/IStorage';
 
 export abstract class ArrayStorage <T> implements IStorage <T> {
     /**

+ 1 - 1
src/storages/MapStorage.ts

@@ -1,6 +1,6 @@
 import { injectable } from 'inversify';
 
-import { IStorage } from '../interfaces/IStorage';
+import { IStorage } from '../interfaces/storages/IStorage';
 
 import { Utils } from '../Utils';
 

+ 2 - 2
src/storages/custom-nodes/CustomNodesStorage.ts

@@ -1,10 +1,10 @@
 import { injectable, inject } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
-import { TCustomNodesFactory } from '../../types/TCustomNodesFactory';
+import { TCustomNodesFactory } from '../../types/container/TCustomNodesFactory';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 import { IStackTraceData } from '../../interfaces/stack-trace-analyzer/IStackTraceData';
 
 import { ConsoleOutputCustomNodesFactory } from '../../custom-nodes/console-output-nodes/factory/ConsoleOutputCustomNodesFactory';

+ 0 - 5
src/types/TCalleeDataExtractorsFactory.d.ts

@@ -1,5 +0,0 @@
-import { ICalleeDataExtractor } from '../interfaces/stack-trace-analyzer/ICalleeDataExtractor';
-
-import { CalleeDataExtractors } from '../enums/container/CalleeDataExtractors';
-
-export type TCalleeDataExtractorsFactory = (calleeDataExtractorName: CalleeDataExtractors) => ICalleeDataExtractor;

+ 0 - 6
src/types/TControlFlowReplacer.d.ts

@@ -1,6 +0,0 @@
-import { IControlFlowReplacer } from '../interfaces/IControlFlowReplacer';
-import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../interfaces/IOptions';
-import { IStorage } from '../interfaces/IStorage';
-
-export type TControlFlowReplacer = (new (customNodesStorage: IStorage<ICustomNode>, options: IOptions) => IControlFlowReplacer);

+ 0 - 4
src/types/TCustomNodesFactory.d.ts

@@ -1,4 +0,0 @@
-import { ICustomNodesFactory } from '../interfaces/custom-nodes/ICustomNodesFactory';
-import { IOptions } from '../interfaces/IOptions';
-
-export type TCustomNodesFactory = new (options: IOptions) => ICustomNodesFactory;

+ 0 - 6
src/types/TNodeTransformer.d.ts

@@ -1,6 +0,0 @@
-import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode';
-import { INodeTransformer } from '../interfaces/INodeTransformer';
-import { IOptions } from '../interfaces/IOptions';
-import { IStorage } from '../interfaces/IStorage';
-
-export type TNodeTransformer = (new (customNodesStorage: IStorage<ICustomNode>, options: IOptions) => INodeTransformer);

+ 0 - 5
src/types/TNodeTransformersFactory.d.ts

@@ -1,5 +0,0 @@
-import { INodeTransformer } from '../interfaces/INodeTransformer';
-
-import { NodeTransformers } from '../enums/container/NodeTransformers';
-
-export type TNodeTransformersFactory = (nodeTransformersMap: Map<string, NodeTransformers[]>) => (nodeType: string) => INodeTransformer[];

+ 5 - 0
src/types/container/TCalleeDataExtractorsFactory.d.ts

@@ -0,0 +1,5 @@
+import { ICalleeDataExtractor } from '../../interfaces/stack-trace-analyzer/ICalleeDataExtractor';
+
+import { CalleeDataExtractors } from '../../enums/container/CalleeDataExtractors';
+
+export type TCalleeDataExtractorsFactory = (calleeDataExtractorName: CalleeDataExtractors) => ICalleeDataExtractor;

+ 4 - 0
src/types/container/TCustomNodesFactory.d.ts

@@ -0,0 +1,4 @@
+import { ICustomNodesFactory } from '../../interfaces/custom-nodes/ICustomNodesFactory';
+import { IOptions } from '../../interfaces/options/IOptions';
+
+export type TCustomNodesFactory = new (options: IOptions) => ICustomNodesFactory;

+ 5 - 0
src/types/container/TNodeTransformersFactory.d.ts

@@ -0,0 +1,5 @@
+import { INodeTransformer } from '../../interfaces/node-transformers/INodeTransformer';
+
+import { NodeTransformers } from '../../enums/container/NodeTransformers';
+
+export type TNodeTransformersFactory = (nodeTransformersMap: Map<string, NodeTransformers[]>) => (nodeType: string) => INodeTransformer[];

+ 3 - 0
src/types/container/TObfuscationResultFactory.d.ts

@@ -0,0 +1,3 @@
+import { IObfuscationResult } from '../../interfaces/IObfuscationResult';
+
+export type TObfuscationResultFactory = (obfuscatedCode: string, sourceMap: string) => IObfuscationResult;

+ 0 - 0
src/types/TObfuscationEvent.d.ts → src/types/event-emitters/TObfuscationEvent.d.ts


+ 6 - 0
src/types/node-transformers/TControlFlowReplacer.d.ts

@@ -0,0 +1,6 @@
+import { IControlFlowReplacer } from '../../interfaces/node-transformers/IControlFlowReplacer';
+import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IStorage } from '../../interfaces/storages/IStorage';
+
+export type TControlFlowReplacer = (new (customNodesStorage: IStorage<ICustomNode>, options: IOptions) => IControlFlowReplacer);

+ 6 - 0
src/types/node-transformers/TNodeTransformer.d.ts

@@ -0,0 +1,6 @@
+import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
+import { INodeTransformer } from '../../interfaces/node-transformers/INodeTransformer';
+import { IOptions } from '../../interfaces/options/IOptions';
+import { IStorage } from '../../interfaces/storages/IStorage';
+
+export type TNodeTransformer = (new (customNodesStorage: IStorage<ICustomNode>, options: IOptions) => INodeTransformer);

+ 0 - 0
src/types/TNodeWithBlockStatement.d.ts → src/types/node/TNodeWithBlockStatement.d.ts


+ 0 - 0
src/types/TStatement.d.ts → src/types/node/TStatement.d.ts


+ 1 - 1
src/types/TOptionsNormalizerRule.d.ts → src/types/options/TOptionsNormalizerRule.d.ts

@@ -1,3 +1,3 @@
-import { IOptions } from '../interfaces/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 
 export type TOptionsNormalizerRule = (options: IOptions) => IOptions;

+ 0 - 0
src/types/TStringArrayEncoding.d.ts → src/types/options/TStringArrayEncoding.d.ts


+ 0 - 0
src/types/TObjectMembersCallsChain.d.ts → src/types/stack-trace-analyzer/TObjectMembersCallsChain.d.ts


+ 1 - 1
test/functional-tests/stack-trace-analyzer/StackTraceAnalyzer.spec.ts

@@ -4,7 +4,7 @@ import * as chai from 'chai';
 import * as estraverse from 'estraverse';
 import * as ESTree from 'estree';
 
-import { TNodeWithBlockStatement } from '../../../src/types/TNodeWithBlockStatement';
+import { TNodeWithBlockStatement } from '../../../src/types/node/TNodeWithBlockStatement';
 
 import { IInversifyContainerFacade } from '../../../src/interfaces/container/IInversifyContainerFacade';
 import { IStackTraceAnalyzer } from '../../../src/interfaces/stack-trace-analyzer/IStackTraceAnalyzer';

+ 1 - 1
test/mocks/NodeMocks.ts

@@ -1,7 +1,7 @@
 import * as escodegen from 'escodegen';
 import * as ESTree from 'estree';
 
-import { TStatement } from '../../src/types/TStatement';
+import { TStatement } from '../../src/types/node/TStatement';
 
 import { NodeType } from '../../src/enums/NodeType';
 

+ 2 - 2
test/unit-tests/OptionsNormalizer.spec.ts

@@ -1,5 +1,5 @@
-import { IInputOptions } from '../../src/interfaces/IInputOptions';
-import { IOptions } from '../../src/interfaces/IOptions';
+import { IInputOptions } from '../../src/interfaces/options/IInputOptions';
+import { IOptions } from '../../src/interfaces/options/IOptions';
 
 import { DEFAULT_PRESET } from '../../src/preset-options/DefaultPreset';
 

+ 31 - 16
test/unit-tests/SourceMapCorrector.spec.ts

@@ -1,35 +1,41 @@
-import { IObfuscationResult } from '../../src/interfaces/IObfuscationResult';
-import { ISourceMapCorrector } from '../../src/interfaces/ISourceMapCorrector';
+import { ServiceIdentifiers } from '../../src/container/ServiceIdentifiers';
 
 import { TSourceMapMode } from '../../src/types/TSourceMapMode';
 
+import { IInversifyContainerFacade } from '../../src/interfaces/container/IInversifyContainerFacade';
+import { IObfuscationResult } from '../../src/interfaces/IObfuscationResult';
+import { ISourceMapCorrector } from '../../src/interfaces/ISourceMapCorrector';
+
 import { SourceMapMode } from '../../src/enums/SourceMapMode';
 
-import { ObfuscationResult } from '../../src/ObfuscationResult';
-import { SourceMapCorrector } from '../../src/SourceMapCorrector';
+import { InversifyContainerFacade } from '../../src/container/InversifyContainerFacade';
 
 const assert: Chai.AssertStatic = require('chai').assert;
 
 /**
  * @param obfuscatedCode
  * @param sourceMap
- * @param sourceMapUrl
+ * @param sourceMapBaseUrl
+ * @param sourceMapFileName
  * @param sourceMapMode
  */
 function getCorrectedObfuscationResult (
     obfuscatedCode: string,
     sourceMap: string,
-    sourceMapUrl: string,
+    sourceMapBaseUrl: string,
+    sourceMapFileName: string,
     sourceMapMode: TSourceMapMode
 ): IObfuscationResult {
-    let obfuscationResult: IObfuscationResult = new ObfuscationResult(obfuscatedCode, sourceMap),
-        sourceMapCorrector: ISourceMapCorrector = new SourceMapCorrector(
-            obfuscationResult,
-            sourceMapUrl,
-            sourceMapMode
-        );
-
-    return sourceMapCorrector.correct();
+    const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade({
+        sourceMap: true,
+        sourceMapBaseUrl: sourceMapBaseUrl,
+        sourceMapFileName: sourceMapFileName,
+        sourceMapMode: sourceMapMode
+    });
+    const sourceMapCorrector: ISourceMapCorrector = inversifyContainerFacade
+        .get<ISourceMapCorrector>(ServiceIdentifiers.ISourceMapCorrector);
+
+    return sourceMapCorrector.correct(obfuscatedCode, sourceMap);
 }
 
 describe('SourceMapCorrector', () => {
@@ -39,7 +45,13 @@ describe('SourceMapCorrector', () => {
             sourceMap: string = 'test';
 
         it('should return untouched obfuscated code if source map does not exist', () => {
-            expectedObfuscationResult = getCorrectedObfuscationResult(obfuscatedCode, '', '', SourceMapMode.Separate);
+            expectedObfuscationResult = getCorrectedObfuscationResult(
+                obfuscatedCode,
+                '',
+                '',
+                '',
+                SourceMapMode.Separate)
+            ;
 
             assert.equal(expectedObfuscationResult.getObfuscatedCode(), obfuscatedCode);
         });
@@ -50,6 +62,7 @@ describe('SourceMapCorrector', () => {
                     obfuscatedCode,
                     sourceMap,
                     '',
+                    '',
                     SourceMapMode.Inline
                 );
             });
@@ -63,11 +76,12 @@ describe('SourceMapCorrector', () => {
             expectedObfuscationResult = getCorrectedObfuscationResult(
                 obfuscatedCode,
                 sourceMap,
+                'http://example.com',
                 'output.js.map',
                 SourceMapMode.Separate
             );
 
-            assert.match(expectedObfuscationResult.getObfuscatedCode(), /sourceMappingURL=output\.js\.map/);
+            assert.match(expectedObfuscationResult.getObfuscatedCode(), /sourceMappingURL=http:\/\/example\.com\/output\.js\.map/);
         });
 
         it('should not touch obfuscated code if source map mode is `separate` and `sourceMapUrl` is not set', () => {
@@ -75,6 +89,7 @@ describe('SourceMapCorrector', () => {
                 obfuscatedCode,
                 sourceMap,
                 '',
+                '',
                 SourceMapMode.Separate
             );
 

+ 1 - 1
test/unit-tests/node/NodeAppender.spec.ts

@@ -3,7 +3,7 @@ import { ServiceIdentifiers } from '../../../src/container/ServiceIdentifiers';
 import * as chai from 'chai';
 import * as ESTree from 'estree';
 
-import { TStatement } from '../../../src/types/TStatement';
+import { TStatement } from '../../../src/types/node/TStatement';
 
 import { IInversifyContainerFacade } from '../../../src/interfaces/container/IInversifyContainerFacade';
 import { IStackTraceAnalyzer } from '../../../src/interfaces/stack-trace-analyzer/IStackTraceAnalyzer';

+ 82 - 0
test/unit-tests/node/NodeUtils.spec.ts

@@ -159,6 +159,88 @@ describe('NodeUtils', () => {
         });
     });
 
+
+    describe('getNodeBlockScopeDepth (node: ESTree.Node, depth: number = 0): number', () => {
+        let functionDeclarationBlockStatementNode1: ESTree.BlockStatement,
+            functionDeclarationBlockStatementNode2: ESTree.BlockStatement,
+            ifStatementBlockStatementNode1: ESTree.BlockStatement,
+            ifStatementBlockStatementNode2: ESTree.BlockStatement,
+            ifStatementNode1: ESTree.IfStatement,
+            ifStatementNode2: ESTree.IfStatement,
+            expressionStatementNode1: ESTree.ExpressionStatement,
+            expressionStatementNode2: ESTree.ExpressionStatement,
+            expressionStatementNode3: ESTree.ExpressionStatement,
+            functionDeclarationNode1: ESTree.FunctionDeclaration,
+            functionDeclarationNode2: ESTree.FunctionDeclaration,
+            programNode: ESTree.Program;
+
+        beforeEach(() => {
+            expressionStatementNode1 = NodeMocks.getExpressionStatementNode();
+            expressionStatementNode2 = NodeMocks.getExpressionStatementNode();
+            expressionStatementNode3 = NodeMocks.getExpressionStatementNode();
+
+            ifStatementBlockStatementNode2 = NodeMocks.getBlockStatementNode([
+                expressionStatementNode3
+            ]);
+
+            ifStatementNode2 = NodeMocks.getIfStatementNode(ifStatementBlockStatementNode2);
+
+            functionDeclarationBlockStatementNode2 = NodeMocks.getBlockStatementNode([
+                ifStatementNode2,
+                expressionStatementNode2
+            ]);
+
+            functionDeclarationNode2 = NodeMocks.getFunctionDeclarationNode('test', functionDeclarationBlockStatementNode2);
+
+            ifStatementBlockStatementNode1 = NodeMocks.getBlockStatementNode([
+                functionDeclarationNode2
+            ]);
+
+            ifStatementNode1 = NodeMocks.getIfStatementNode(ifStatementBlockStatementNode1);
+
+            functionDeclarationBlockStatementNode1 = NodeMocks.getBlockStatementNode([
+                expressionStatementNode1,
+                ifStatementNode1
+            ]);
+
+            functionDeclarationNode1 = NodeMocks.getFunctionDeclarationNode('test', functionDeclarationBlockStatementNode1);
+
+            programNode = NodeMocks.getProgramNode([
+                functionDeclarationNode1
+            ]);
+
+            programNode['parentNode'] = programNode;
+            functionDeclarationNode1['parentNode'] = programNode;
+            functionDeclarationBlockStatementNode1['parentNode'] = functionDeclarationNode1;
+            expressionStatementNode1['parentNode'] = functionDeclarationBlockStatementNode1;
+            ifStatementNode1['parentNode'] = functionDeclarationBlockStatementNode1;
+            ifStatementBlockStatementNode1['parentNode'] = ifStatementNode1;
+            functionDeclarationNode2['parentNode'] = ifStatementBlockStatementNode1;
+            functionDeclarationBlockStatementNode2['parentNode'] = functionDeclarationNode2;
+            expressionStatementNode2['parentNode'] = functionDeclarationBlockStatementNode2;
+            ifStatementNode2['parentNode'] = functionDeclarationBlockStatementNode2;
+            ifStatementBlockStatementNode2['parentNode'] = ifStatementNode2;
+        });
+
+        it('should return block-scope depth for given node', () => {
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(programNode), 0);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(functionDeclarationNode1), 0);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(functionDeclarationBlockStatementNode1), 1);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(expressionStatementNode1), 1);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(ifStatementNode1), 1);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(ifStatementBlockStatementNode1), 1);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(functionDeclarationNode2), 1);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(functionDeclarationBlockStatementNode2), 2);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(expressionStatementNode2), 2);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(ifStatementNode2), 2);
+            assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(ifStatementBlockStatementNode2), 2);
+        });
+
+        it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
+            assert.throws(() => NodeUtils.getNodeBlockScopeDepth(expressionStatementNode3), ReferenceError);
+        });
+    });
+
     describe('parentize (node: ESTree.Node): void', () => {
         let ifStatementNode: ESTree.IfStatement,
             ifStatementBlockStatementNode: ESTree.BlockStatement,

部分文件因为文件数量过多而无法显示