فهرست منبع

`stringArrayWrappersType: 'function'` now generates different indexes between each wrapper inside the same lexical scope

sanex 3 سال پیش
والد
کامیت
a1dc2df04f
21فایلهای تغییر یافته به همراه330 افزوده شده و 328 حذف شده
  1. 2 0
      CHANGELOG.md
  2. 0 0
      dist/index.browser.js
  3. 0 0
      dist/index.cli.js
  4. 0 0
      dist/index.js
  5. 1 1
      src/container/ServiceIdentifiers.ts
  6. 4 4
      src/container/modules/storages/StoragesModule.ts
  7. 12 21
      src/custom-nodes/string-array-nodes/StringArrayCallNode.ts
  8. 23 48
      src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode.ts
  9. 13 12
      src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperVariableNode.ts
  10. 0 7
      src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData.ts
  11. 4 2
      src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrappersData.ts
  12. 0 10
      src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage.ts
  13. 10 0
      src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage.ts
  14. 59 99
      src/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperTransformer.ts
  15. 106 98
      src/node-transformers/string-array-transformers/StringArrayTransformer.ts
  16. 5 5
      src/storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage.ts
  17. 0 7
      src/types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding.ts
  18. 7 0
      src/types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding.ts
  19. 28 14
      test/dev/dev.ts
  20. 54 0
      test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts
  21. 2 0
      test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/fixtures/function-calls-wrappers-different-indexes.js

+ 2 - 0
CHANGELOG.md

@@ -2,6 +2,8 @@ Change Log
 
 v2.16.0
 ---
+* `stringArrayWrappersType: 'function'` now generates different indexes between each wrapper inside the same lexical scope
+* `stringArrayWrappersType: 'function'` now generates different parameters order between each wrapper inside the same lexical scope
 * `stringArrayWrappersType: 'function'` now appends `FunctionDeclaration` functions instead of `FunctionExpression` functions. This allows to append these wrappers at random positions inside each scope
 
 v2.15.6

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


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


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


+ 1 - 1
src/container/ServiceIdentifiers.ts

@@ -54,7 +54,7 @@ export enum ServiceIdentifiers {
     IScopeAnalyzer = 'IScopeAnalyzer',
     IStringArrayIndexNode = 'IStringArrayIndexNode',
     IStringArrayScopeCallsWrapperLexicalScopeDataStorage = 'IStringArrayScopeCallsWrapperLexicalScopeDataStorage',
-    IStringArrayScopeCallsWrapperNamesDataStorage = 'IStringArrayScopeCallsWrapperNamesDataStorage',
+    IStringArrayScopeCallsWrappersDataStorage = 'IStringArrayScopeCallsWrappersDataStorage',
     IStringArrayStorage = 'IStringArrayStorage',
     IStringArrayStorageAnalyzer = 'IStringArrayStorageAnalyzer',
     IThroughIdentifierReplacer = 'IThroughIdentifierReplacer',

+ 4 - 4
src/container/modules/storages/StoragesModule.ts

@@ -10,7 +10,7 @@ import { IOptions } from '../../../interfaces/options/IOptions';
 import { IPropertyIdentifierNamesCacheStorage } from '../../../interfaces/storages/identifier-names-cache/IPropertyIdentifierNamesCacheStorage';
 import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator';
 import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
-import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
+import { IStringArrayScopeCallsWrappersDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage';
 import { IStringArrayStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 import { IVisitedLexicalScopeNodesStackStorage } from '../../../interfaces/storages/string-array-transformers/IVisitedLexicalScopeNodesStackStorage';
 
@@ -20,7 +20,7 @@ import { GlobalIdentifierNamesCacheStorage } from '../../../storages/identifier-
 import { LiteralNodesCacheStorage } from '../../../storages/string-array-transformers/LiteralNodesCacheStorage';
 import { PropertyIdentifierNamesCacheStorage } from '../../../storages/identifier-names-cache/PropertyIdentifierNamesCacheStorage';
 import { StringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperLexicalScopeDataStorage';
-import { StringArrayScopeCallsWrapperNamesDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperNamesDataStorage';
+import { StringArrayScopeCallsWrappersDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage';
 import { StringArrayStorage } from '../../../storages/string-array-transformers/StringArrayStorage';
 import { VisitedLexicalScopeNodesStackStorage } from '../../../storages/string-array-transformers/VisitedLexicalScopeNodesStackStorage';
 
@@ -50,8 +50,8 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b
         .to(StringArrayScopeCallsWrapperLexicalScopeDataStorage)
         .inSingletonScope();
 
-    bind<IStringArrayScopeCallsWrapperNamesDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage)
-        .to(StringArrayScopeCallsWrapperNamesDataStorage)
+    bind<IStringArrayScopeCallsWrappersDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrappersDataStorage)
+        .to(StringArrayScopeCallsWrappersDataStorage)
         .inSingletonScope();
 
     bind<IVisitedLexicalScopeNodesStackStorage>(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage)

+ 12 - 21
src/custom-nodes/string-array-nodes/StringArrayCallNode.ts

@@ -11,7 +11,6 @@ import { IArrayUtils } from '../../interfaces/utils/IArrayUtils';
 import { ICustomCodeHelperFormatter } from '../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
-import { IStringArrayScopeCallsWrapperParameterIndexesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperParameterIndexesData';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 
 import { initializable } from '../../decorators/Initializable';
@@ -19,6 +18,7 @@ import { initializable } from '../../decorators/Initializable';
 import { AbstractStringArrayCallNode } from './AbstractStringArrayCallNode';
 import { NodeFactory } from '../../node/NodeFactory';
 import { NodeUtils } from '../../node/NodeUtils';
+import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
 
 @injectable()
 export class StringArrayCallNode extends AbstractStringArrayCallNode {
@@ -41,16 +41,10 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
     private indexShiftAmount!: number;
 
     /**
-     * @type {string}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private stringArrayCallsWrapperName!: string;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperParameterIndexesData | null}
-     */
-    @initializable()
-    private stringArrayCallsWrapperParameterIndexesData!: IStringArrayScopeCallsWrapperParameterIndexesData | null;
+    private stringArrayCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
     /**
      * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
@@ -84,23 +78,20 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
     }
 
     /**
-     * @param {string} stringArrayCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayCallsWrapperParameterIndexesData
      * @param {number} index
      * @param {number} indexShiftAmount
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayCallsWrapperData
      * @param {string | null} decodeKey
      */
     public initialize (
-        stringArrayCallsWrapperName: string,
-        stringArrayCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null,
         index: number,
         indexShiftAmount: number,
+        stringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData,
         decodeKey: string | null
     ): void {
-        this.stringArrayCallsWrapperName = stringArrayCallsWrapperName;
-        this.stringArrayCallsWrapperParameterIndexesData = stringArrayCallsWrapperParameterIndexesData;
         this.index = index;
         this.indexShiftAmount = indexShiftAmount;
+        this.stringArrayCallsWrapperData = stringArrayCallsWrapperData;
         this.decodeKey = decodeKey;
     }
 
@@ -108,7 +99,7 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
      * @returns {TStatement[]}
      */
     protected getNodeStructure (): TStatement[] {
-        const resultIndex: number = this.indexShiftAmount + this.index;
+        const resultIndex: number = this.indexShiftAmount + this.stringArrayCallsWrapperData.index + this.index;
 
         const indexNode: ESTree.Expression = this.getStringArrayIndexNode(resultIndex);
         const rc4KeyLiteralNode: ESTree.Literal | null = this.decodeKey
@@ -117,7 +108,7 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
 
         // filling call expression arguments with a fake arguments first
         const callExpressionArgs: ESTree.Expression[] = this.arrayUtils.fillWithRange(
-            !this.stringArrayCallsWrapperParameterIndexesData
+            !this.stringArrayCallsWrapperData.parameterIndexesData
                 // root string array calls wrapper
                 ? AbstractStringArrayCallNode.stringArrayRootCallsWrapperParametersCount
                 // scope string array calls wrapper
@@ -126,14 +117,14 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
         );
 
         callExpressionArgs.splice(
-            this.stringArrayCallsWrapperParameterIndexesData?.valueIndexParameterIndex ?? 0,
+            this.stringArrayCallsWrapperData.parameterIndexesData?.valueIndexParameterIndex ?? 0,
             1,
             indexNode
         );
 
-        if (this.stringArrayCallsWrapperParameterIndexesData) {
+        if (this.stringArrayCallsWrapperData.parameterIndexesData) {
             callExpressionArgs.splice(
-                this.stringArrayCallsWrapperParameterIndexesData.decodeKeyParameterIndex,
+                this.stringArrayCallsWrapperData.parameterIndexesData.decodeKeyParameterIndex,
                 1,
                 // use rc4 key literal node if exists or a node with fake string array wrapper index
                 rc4KeyLiteralNode ?? this.getFakeStringArrayIndexNode(resultIndex)
@@ -147,7 +138,7 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
 
         const structure: TStatement = NodeFactory.expressionStatementNode(
             NodeFactory.callExpressionNode(
-                NodeFactory.identifierNode(this.stringArrayCallsWrapperName),
+                NodeFactory.identifierNode(this.stringArrayCallsWrapperData.name),
                 callExpressionArgs
             )
         );

+ 23 - 48
src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode.ts

@@ -11,7 +11,7 @@ import { IArrayUtils } from '../../interfaces/utils/IArrayUtils';
 import { ICustomCodeHelperFormatter } from '../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
-import { IStringArrayScopeCallsWrapperParameterIndexesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperParameterIndexesData';
+import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 
 import { initializable } from '../../decorators/Initializable';
@@ -23,35 +23,16 @@ import { NodeUtils } from '../../node/NodeUtils';
 @injectable()
 export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArrayCallNode {
     /**
-     * @type {number}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private shiftedIndex!: number;
+    private upperStringArrayCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
     /**
-     * @type {string}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private upperStringArrayCallsWrapperName!: string;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperParameterIndexesData}
-     */
-    @initializable()
-    private upperStringArrayCallsWrapperParameterIndexesData!: IStringArrayScopeCallsWrapperParameterIndexesData | null;
-
-    /**
-     * @type {string}
-     */
-    @initializable()
-    private stringArrayScopeCallsWrapperName!: string;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperParameterIndexesData}
-     */
-    @initializable()
-    private stringArrayScopeCallsWrapperParameterIndexesData!: IStringArrayScopeCallsWrapperParameterIndexesData | null;
-
+    private stringArrayScopeCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
     /**
      * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
@@ -85,24 +66,15 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
     }
 
     /**
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexesData
-     * @param {string} upperStringArrayCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexesData
-     * @param {number} shiftedIndex
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} upperStringArrayCallsWrapperData
      */
     public initialize (
-        stringArrayScopeCallsWrapperName: string,
-        stringArrayScopeCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        upperStringArrayCallsWrapperName: string,
-        upperStringArrayCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        shiftedIndex: number,
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        upperStringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData,
     ): void {
-        this.stringArrayScopeCallsWrapperName = stringArrayScopeCallsWrapperName;
-        this.stringArrayScopeCallsWrapperParameterIndexesData = stringArrayScopeCallsWrapperParameterIndexesData;
-        this.upperStringArrayCallsWrapperName = upperStringArrayCallsWrapperName;
-        this.upperStringArrayCallsWrapperParameterIndexesData = upperStringArrayCallsWrapperParameterIndexesData;
-        this.shiftedIndex = shiftedIndex;
+        this.stringArrayScopeCallsWrapperData = stringArrayScopeCallsWrapperData;
+        this.upperStringArrayCallsWrapperData = upperStringArrayCallsWrapperData;
     }
 
     /**
@@ -116,13 +88,16 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
 
         const stringArrayCallNode: ESTree.Expression = this.getUpperStringArrayCallNode(
             stringArrayCallIdentifierNode,
-            this.getStringArrayIndexNode(this.shiftedIndex)
+            this.getStringArrayIndexNode(
+                this.stringArrayScopeCallsWrapperData.index
+                - this.upperStringArrayCallsWrapperData.index
+            )
         );
 
         // stage 1: function expression node parameters
         // filling all parameters with a fake parameters first
         const parameters: ESTree.Identifier[] = this.arrayUtils.fillWithRange(
-            !this.stringArrayScopeCallsWrapperParameterIndexesData
+            !this.stringArrayScopeCallsWrapperData.parameterIndexesData
                 // root string array calls wrapper
                 ? AbstractStringArrayCallNode.stringArrayRootCallsWrapperParametersCount
                 // scope string array calls wrapper
@@ -130,12 +105,12 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
             () => this.getFakeParameterNode()
         );
         parameters.splice(
-            this.stringArrayScopeCallsWrapperParameterIndexesData?.valueIndexParameterIndex ?? 0,
+            this.stringArrayScopeCallsWrapperData.parameterIndexesData?.valueIndexParameterIndex ?? 0,
             1,
             stringArrayCallIdentifierNode
         );
         parameters.splice(
-            this.stringArrayScopeCallsWrapperParameterIndexesData?.decodeKeyParameterIndex ?? 1,
+            this.stringArrayScopeCallsWrapperData.parameterIndexesData?.decodeKeyParameterIndex ?? 1,
             1,
             decodeKeyIdentifierNode
         );
@@ -143,7 +118,7 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
         // stage 2: upper string array call expression arguments
         // filling all call expression arguments with a fake string array calls
         const callExpressionArgs: ESTree.Expression[] = this.arrayUtils.fillWithRange(
-            !this.upperStringArrayCallsWrapperParameterIndexesData
+            !this.upperStringArrayCallsWrapperData.parameterIndexesData
                 // root string array calls wrapper
                 ? AbstractStringArrayCallNode.stringArrayRootCallsWrapperParametersCount
                 // scope string array calls wrapper
@@ -155,24 +130,24 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
         );
 
         callExpressionArgs.splice(
-            this.upperStringArrayCallsWrapperParameterIndexesData?.valueIndexParameterIndex ?? 0,
+            this.upperStringArrayCallsWrapperData.parameterIndexesData?.valueIndexParameterIndex ?? 0,
             1,
             stringArrayCallNode
         );
         callExpressionArgs.splice(
-            this.upperStringArrayCallsWrapperParameterIndexesData?.decodeKeyParameterIndex ?? 1,
+            this.upperStringArrayCallsWrapperData.parameterIndexesData?.decodeKeyParameterIndex ?? 1,
             1,
             decodeKeyIdentifierNode
         );
 
         // stage 3: function declaration node
         const functionDeclarationNode: ESTree.FunctionDeclaration =  NodeFactory.functionDeclarationNode(
-            this.stringArrayScopeCallsWrapperName,
+            this.stringArrayScopeCallsWrapperData.name,
             parameters,
             NodeFactory.blockStatementNode([
                 NodeFactory.returnStatementNode(
                     NodeFactory.callExpressionNode(
-                        NodeFactory.identifierNode(this.upperStringArrayCallsWrapperName),
+                        NodeFactory.identifierNode(this.upperStringArrayCallsWrapperData.name),
                         callExpressionArgs
                     )
                 )

+ 13 - 12
src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperVariableNode.ts

@@ -9,6 +9,7 @@ import { IArrayUtils } from '../../interfaces/utils/IArrayUtils';
 import { ICustomCodeHelperFormatter } from '../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
+import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 
 import { initializable } from '../../decorators/Initializable';
@@ -20,16 +21,16 @@ import { NodeUtils } from '../../node/NodeUtils';
 @injectable()
 export class StringArrayScopeCallsWrapperVariableNode extends AbstractStringArrayCallNode {
     /**
-     * @type {string}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private stringArrayCallsWrapperName!: string;
+    private stringArrayCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
     /**
-     * @type {string}
+     * @type {IStringArrayScopeCallsWrapperData}
      */
     @initializable()
-    private stringArrayScopeCallsWrapperName!: string;
+    private stringArrayScopeCallsWrapperData!: IStringArrayScopeCallsWrapperData;
 
 
     /**
@@ -64,15 +65,15 @@ export class StringArrayScopeCallsWrapperVariableNode extends AbstractStringArra
     }
 
     /**
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {string} stringArrayCallsWrapperName
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayCallsWrapperData
      */
     public initialize (
-        stringArrayScopeCallsWrapperName: string,
-        stringArrayCallsWrapperName: string
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        stringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData
     ): void {
-        this.stringArrayScopeCallsWrapperName = stringArrayScopeCallsWrapperName;
-        this.stringArrayCallsWrapperName = stringArrayCallsWrapperName;
+        this.stringArrayScopeCallsWrapperData = stringArrayScopeCallsWrapperData;
+        this.stringArrayCallsWrapperData = stringArrayCallsWrapperData;
     }
 
     /**
@@ -82,8 +83,8 @@ export class StringArrayScopeCallsWrapperVariableNode extends AbstractStringArra
         const structure: TStatement = NodeFactory.variableDeclarationNode(
             [
                 NodeFactory.variableDeclaratorNode(
-                    NodeFactory.identifierNode(this.stringArrayScopeCallsWrapperName),
-                    NodeFactory.identifierNode(this.stringArrayCallsWrapperName)
+                    NodeFactory.identifierNode(this.stringArrayScopeCallsWrapperData.name),
+                    NodeFactory.identifierNode(this.stringArrayCallsWrapperData.name)
                 )
             ],
             'const',

+ 0 - 7
src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData.ts

@@ -1,7 +1,5 @@
 import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
 
-import { IStringArrayScopeCallsWrapperParameterIndexesData } from './IStringArrayScopeCallsWrapperParameterIndexesData';
-
 export interface IStringArrayScopeCallsWrapperLexicalScopeData {
     /**
      * @type {TNodeWithLexicalScopeStatements | null}
@@ -17,9 +15,4 @@ export interface IStringArrayScopeCallsWrapperLexicalScopeData {
      * @type {number}
      */
     scopeShiftedIndex: number;
-
-    /**
-     * @type {IStringArrayScopeCallsWrapperParameterIndexesData | null}
-     */
-    callsWrappersParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null;
 }

+ 4 - 2
src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperNamesData.ts → src/interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrappersData.ts

@@ -1,6 +1,8 @@
 import { TStringArrayEncoding } from '../../../types/options/TStringArrayEncoding';
 
-export interface IStringArrayScopeCallsWrapperNamesData {
+import { IStringArrayScopeCallsWrapperData } from './IStringArrayScopeCallsWrapperData';
+
+export interface IStringArrayScopeCallsWrappersData {
     /**
      * @type {TStringArrayEncoding}
      */
@@ -9,5 +11,5 @@ export interface IStringArrayScopeCallsWrapperNamesData {
     /**
      * @type {string[]}
      */
-    names: string[];
+    scopeCallsWrappersData: IStringArrayScopeCallsWrapperData[];
 }

+ 0 - 10
src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage.ts

@@ -1,10 +0,0 @@
-import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
-import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
-
-import { IMapStorage } from '../IMapStorage';
-
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-export interface IStringArrayScopeCallsWrapperNamesDataStorage extends IMapStorage<
-    TNodeWithLexicalScopeStatements,
-    TStringArrayScopeCallsWrapperNamesDataByEncoding
-> {}

+ 10 - 0
src/interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage.ts

@@ -0,0 +1,10 @@
+import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
+import { TStringArrayScopeCallsWrappersDataByEncoding } from '../../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding';
+
+import { IMapStorage } from '../IMapStorage';
+
+// eslint-disable-next-line @typescript-eslint/no-empty-interface
+export interface IStringArrayScopeCallsWrappersDataStorage extends IMapStorage<
+    TNodeWithLexicalScopeStatements,
+    TStringArrayScopeCallsWrappersDataByEncoding
+> {}

+ 59 - 99
src/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperTransformer.ts

@@ -6,7 +6,7 @@ import * as ESTree from 'estree';
 import { TInitialData } from '../../types/TInitialData';
 import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
 import { TStatement } from '../../types/node/TStatement';
-import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
+import { TStringArrayScopeCallsWrappersDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding';
 import { TStringArrayCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayCustomNodeFactory';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
@@ -15,9 +15,8 @@ import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
 import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
 import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
 import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
-import { IStringArrayScopeCallsWrapperNamesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperNamesData';
-import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
-import { IStringArrayScopeCallsWrapperParameterIndexesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperParameterIndexesData';
+import { IStringArrayScopeCallsWrappersData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrappersData';
+import { IStringArrayScopeCallsWrappersDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 import { IVisitedLexicalScopeNodesStackStorage } from '../../interfaces/storages/string-array-transformers/IVisitedLexicalScopeNodesStackStorage';
 import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
@@ -53,9 +52,9 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
     private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
 
     /**
-     * @type {IStringArrayScopeCallsWrapperNamesDataStorage}
+     * @type {IStringArrayScopeCallsWrappersDataStorage}
      */
-    private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
+    private readonly stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage;
 
     /**
      * @type {TStringArrayCustomNodeFactory}
@@ -72,7 +71,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
      * @param {IOptions} options
      * @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
      * @param {IStringArrayStorage} stringArrayStorage
-     * @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
+     * @param {IStringArrayScopeCallsWrappersDataStorage} stringArrayScopeCallsWrappersDataStorage
      * @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
      * @param {TStringArrayCustomNodeFactory} stringArrayTransformerCustomNodeFactory
      */
@@ -81,7 +80,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
         @inject(ServiceIdentifiers.IOptions) options: IOptions,
         @inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
         @inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
-        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage) stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage,
+        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrappersDataStorage) stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage,
         @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage) stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
         @inject(ServiceIdentifiers.Factory__IStringArrayCustomNode)
             stringArrayTransformerCustomNodeFactory: TStringArrayCustomNodeFactory
@@ -90,7 +89,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
 
         this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
         this.stringArrayStorage = stringArrayStorage;
-        this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
+        this.stringArrayScopeCallsWrappersDataStorage = stringArrayScopeCallsWrappersDataStorage;
         this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
         this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
     }
@@ -133,52 +132,42 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
     public transformNode (
         lexicalScopeBodyNode: TNodeWithLexicalScopeStatements
     ): TNodeWithLexicalScopeStatements {
-        const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null =
-            this.stringArrayScopeCallsWrapperNamesDataStorage.get(lexicalScopeBodyNode) ?? null;
+        const stringArrayScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding | null =
+            this.stringArrayScopeCallsWrappersDataStorage.get(lexicalScopeBodyNode) ?? null;
         const stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null =
             this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(lexicalScopeBodyNode) ?? null;
 
-        if (!stringArrayScopeCallsWrapperNamesDataByEncoding || !stringArrayScopeCallsWrapperLexicalScopeData) {
+        if (!stringArrayScopeCallsWrappersDataByEncoding || !stringArrayScopeCallsWrapperLexicalScopeData) {
             return lexicalScopeBodyNode;
         }
 
-        const {
-            callsWrappersParameterIndexesData: stringArrayScopeCallsWrapperParameterIndexes
-        } = stringArrayScopeCallsWrapperLexicalScopeData;
-        const stringArrayScopeCallsWrapperNamesDataList: (IStringArrayScopeCallsWrapperNamesData | undefined)[] =
-            Object.values(stringArrayScopeCallsWrapperNamesDataByEncoding);
+        const stringArrayScopeCallsWrappersDataList: (IStringArrayScopeCallsWrappersData | undefined)[] =
+            Object.values(stringArrayScopeCallsWrappersDataByEncoding);
 
         // iterates over data for each encoding type
-        for (const stringArrayScopeCallsWrapperNamesData of stringArrayScopeCallsWrapperNamesDataList) {
-            if (!stringArrayScopeCallsWrapperNamesData) {
+        for (const stringArrayScopeCallsWrappersData of stringArrayScopeCallsWrappersDataList) {
+            if (!stringArrayScopeCallsWrappersData) {
                 continue;
             }
 
-            const {names} = stringArrayScopeCallsWrapperNamesData;
-            const namesLength: number = names.length;
+            const {scopeCallsWrappersData} = stringArrayScopeCallsWrappersData;
+            const scopeCallsWrappersDataLength: number = scopeCallsWrappersData.length;
 
             /**
              * Iterates over each name of scope wrapper name
              * Reverse iteration appends wrappers at index `0` at the correct order
              */
-            for (let i = namesLength - 1; i >= 0; i--) {
-                const stringArrayScopeCallsWrapperName: string = names[i];
-                const {
-                    name: upperStringArrayCallsWrapperName,
-                    index: upperStringArrayCallsWrapperShiftedIndex,
-                    parameterIndexesData: upperStringArrayCallsWrapperParameterIndexes
-                } = this.getUpperStringArrayCallsWrapperData(
-                    stringArrayScopeCallsWrapperNamesData,
+            for (let i = scopeCallsWrappersDataLength - 1; i >= 0; i--) {
+                const stringArrayScopeCallsWrapperData = scopeCallsWrappersData[i];
+                const upperStringArrayCallsWrapperData = this.getUpperStringArrayCallsWrapperData(
+                    stringArrayScopeCallsWrappersData,
                     stringArrayScopeCallsWrapperLexicalScopeData,
                 );
 
                 this.getAndAppendStringArrayScopeCallsWrapperNode(
                     lexicalScopeBodyNode,
-                    stringArrayScopeCallsWrapperName,
-                    stringArrayScopeCallsWrapperParameterIndexes,
-                    upperStringArrayCallsWrapperName,
-                    upperStringArrayCallsWrapperParameterIndexes,
-                    upperStringArrayCallsWrapperShiftedIndex,
+                    stringArrayScopeCallsWrapperData,
+                    upperStringArrayCallsWrapperData
                 );
             }
         }
@@ -187,38 +176,36 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
     }
 
     /**
-     * @param {IStringArrayScopeCallsWrapperNamesData} stringArrayScopeCallsWrapperNamesData
+     * @param {IStringArrayScopeCallsWrappersData} stringArrayScopeCallsWrappersData
      * @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
     private getRootStringArrayCallsWrapperData (
-        stringArrayScopeCallsWrapperNamesData: IStringArrayScopeCallsWrapperNamesData,
+        stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrappersData,
         stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
     ): IStringArrayScopeCallsWrapperData {
-        const {encoding} = stringArrayScopeCallsWrapperNamesData;
-        const {resultShiftedIndex} = stringArrayScopeCallsWrapperLexicalScopeData;
+        const {encoding} = stringArrayScopeCallsWrappersData;
 
         return {
             name: this.stringArrayStorage.getStorageCallsWrapperName(encoding),
-            index: resultShiftedIndex,
+            index: 0,
             parameterIndexesData: null
         };
     }
 
     /**
-     * @param {IStringArrayScopeCallsWrapperNamesData} stringArrayScopeCallsWrapperNamesData
+     * @param {IStringArrayScopeCallsWrappersData} stringArrayScopeCallsWrappersData
      * @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
     private getUpperStringArrayCallsWrapperData (
-        stringArrayScopeCallsWrapperNamesData: IStringArrayScopeCallsWrapperNamesData,
+        stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrappersData,
         stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
     ): IStringArrayScopeCallsWrapperData {
-        const {encoding} = stringArrayScopeCallsWrapperNamesData;
-        const {scopeShiftedIndex} = stringArrayScopeCallsWrapperLexicalScopeData;
+        const {encoding} = stringArrayScopeCallsWrappersData;
 
         const rootStringArrayCallsWrapperData = this.getRootStringArrayCallsWrapperData(
-            stringArrayScopeCallsWrapperNamesData,
+            stringArrayScopeCallsWrappersData,
             stringArrayScopeCallsWrapperLexicalScopeData
         );
 
@@ -234,45 +221,30 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
             return rootStringArrayCallsWrapperData;
         }
 
-        const parentLexicalScopeNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null = this.stringArrayScopeCallsWrapperNamesDataStorage
-            .get(parentLexicalScopeBodyNode) ?? null;
-        const parentScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null = this.stringArrayScopeCallsWrapperLexicalScopeDataStorage
-            .get(parentLexicalScopeBodyNode) ?? null;
+        const parentLexicalScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding | null =
+            this.stringArrayScopeCallsWrappersDataStorage
+                .get(parentLexicalScopeBodyNode) ?? null;
+        const parentScopeCallsWrappersData: IStringArrayScopeCallsWrapperData[] | null =
+            parentLexicalScopeCallsWrappersDataByEncoding?.[encoding]?.scopeCallsWrappersData ?? null;
 
-        const parentLexicalScopeNames: string[] | null = parentLexicalScopeNamesDataByEncoding?.[encoding]?.names ?? null;
-
-        if (!parentLexicalScopeNames?.length) {
+        if (!parentScopeCallsWrappersData?.length) {
             return rootStringArrayCallsWrapperData;
         }
 
-        const upperStringArrayCallsWrapperName: string = this.randomGenerator
+        return this.randomGenerator
             .getRandomGenerator()
-            .pickone(parentLexicalScopeNames);
-        const parameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null =
-            parentScopeCallsWrapperLexicalScopeData?.callsWrappersParameterIndexesData ?? null;
-
-        return {
-            name: upperStringArrayCallsWrapperName,
-            index: scopeShiftedIndex,
-            parameterIndexesData
-        };
+            .pickone(parentScopeCallsWrappersData);
     }
 
     /**
      * @param {TNodeWithLexicalScopeStatements} lexicalScopeBodyNode
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexes
-     * @param {string} upperStringArrayCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexes
-     * @param {number} stringArrayScopeCallsWrapperShiftedIndex
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} upperStringArrayCallsWrapperData
      */
     private getAndAppendStringArrayScopeCallsWrapperNode (
         lexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
-        stringArrayScopeCallsWrapperName: string,
-        stringArrayScopeCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        upperStringArrayCallsWrapperName: string,
-        upperStringArrayCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        stringArrayScopeCallsWrapperShiftedIndex: number
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        upperStringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData,
     ): void {
         let stringArrayScopeCallsWrapperNode: TStatement[];
 
@@ -284,11 +256,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
                 );
 
                 stringArrayScopeCallsWrapperNode = this.getStringArrayScopeCallsWrapperFunctionNode(
-                    stringArrayScopeCallsWrapperName,
-                    stringArrayScopeCallsWrapperParameterIndexes,
-                    upperStringArrayCallsWrapperName,
-                    upperStringArrayCallsWrapperParameterIndexes,
-                    stringArrayScopeCallsWrapperShiftedIndex
+                    stringArrayScopeCallsWrapperData,
+                    upperStringArrayCallsWrapperData,
                 );
 
                 NodeAppender.insertAtIndex(
@@ -303,8 +272,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
             case StringArrayWrappersType.Variable:
             default: {
                 stringArrayScopeCallsWrapperNode = this.getStringArrayScopeCallsWrapperVariableNode(
-                    stringArrayScopeCallsWrapperName,
-                    upperStringArrayCallsWrapperName
+                    stringArrayScopeCallsWrapperData,
+                    upperStringArrayCallsWrapperData
                 );
 
                 NodeAppender.prepend(
@@ -316,13 +285,13 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
     }
 
     /**
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {string} upperStringArrayCallsWrapperName
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} upperStringArrayCallsWrapperData
      * @returns {TStatement[]}
      */
     private getStringArrayScopeCallsWrapperVariableNode (
-        stringArrayScopeCallsWrapperName: string,
-        upperStringArrayCallsWrapperName: string
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        upperStringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData
     ): TStatement[] {
         const stringArrayScopeCallsWrapperVariableNode: ICustomNode<TInitialData<StringArrayScopeCallsWrapperVariableNode>> =
             this.stringArrayTransformerCustomNodeFactory(
@@ -330,27 +299,21 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
             );
 
         stringArrayScopeCallsWrapperVariableNode.initialize(
-            stringArrayScopeCallsWrapperName,
-            upperStringArrayCallsWrapperName
+            stringArrayScopeCallsWrapperData,
+            upperStringArrayCallsWrapperData
         );
 
         return stringArrayScopeCallsWrapperVariableNode.getNode();
     }
 
     /**
-     * @param {string} stringArrayScopeCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} stringArrayScopeCallsWrapperParameterIndexes
-     * @param {string} upperStringArrayCallsWrapperName
-     * @param {IStringArrayScopeCallsWrapperParameterIndexesData | null} upperStringArrayCallsWrapperParameterIndexes
-     * @param {number} stringArrayScopeCallsWrapperShiftedIndex
+     * @param {IStringArrayScopeCallsWrapperData} stringArrayScopeCallsWrapperData
+     * @param {IStringArrayScopeCallsWrapperData} upperStringArrayCallsWrapperData
      * @returns {TStatement[]}
      */
     private getStringArrayScopeCallsWrapperFunctionNode (
-        stringArrayScopeCallsWrapperName: string,
-        stringArrayScopeCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        upperStringArrayCallsWrapperName: string,
-        upperStringArrayCallsWrapperParameterIndexes: IStringArrayScopeCallsWrapperParameterIndexesData | null,
-        stringArrayScopeCallsWrapperShiftedIndex: number
+        stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData,
+        upperStringArrayCallsWrapperData: IStringArrayScopeCallsWrapperData,
     ): TStatement[] {
         const stringArrayScopeCallsWrapperFunctionNode: ICustomNode<TInitialData<StringArrayScopeCallsWrapperFunctionNode>> =
             this.stringArrayTransformerCustomNodeFactory(
@@ -358,11 +321,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
             );
 
         stringArrayScopeCallsWrapperFunctionNode.initialize(
-            stringArrayScopeCallsWrapperName,
-            stringArrayScopeCallsWrapperParameterIndexes,
-            upperStringArrayCallsWrapperName,
-            upperStringArrayCallsWrapperParameterIndexes,
-            stringArrayScopeCallsWrapperShiftedIndex,
+            stringArrayScopeCallsWrapperData,
+            upperStringArrayCallsWrapperData
         );
 
         return stringArrayScopeCallsWrapperFunctionNode.getNode();

+ 106 - 98
src/node-transformers/string-array-transformers/StringArrayTransformer.ts

@@ -7,7 +7,7 @@ import { TIdentifierNamesGeneratorFactory } from '../../types/container/generato
 import { TInitialData } from '../../types/TInitialData';
 import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
 import { TStatement } from '../../types/node/TStatement';
-import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
+import { TStringArrayScopeCallsWrappersDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding';
 import { TStringArrayCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayCustomNodeFactory';
 
 import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
@@ -18,7 +18,7 @@ import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
 import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
 import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
 import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
-import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
+import { IStringArrayScopeCallsWrappersDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage';
 import { IStringArrayScopeCallsWrapperParameterIndexesData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperParameterIndexesData';
 import { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
 import { IStringArrayStorageAnalyzer } from '../../interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer';
@@ -84,9 +84,9 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
     private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
 
     /**
-     * @type {IStringArrayScopeCallsWrapperNamesDataStorage}
+     * @type {IStringArrayScopeCallsWrappersDataStorage}
      */
-    private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
+    private readonly stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage;
 
     /**
      * @type {TStringArrayCustomNodeFactory}
@@ -104,7 +104,7 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
      * @param {ILiteralNodesCacheStorage} literalNodesCacheStorage
      * @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
      * @param {IStringArrayStorage} stringArrayStorage
-     * @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
+     * @param {IStringArrayScopeCallsWrappersDataStorage} stringArrayScopeCallsWrappersDataStorage
      * @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
      * @param {IStringArrayStorageAnalyzer} stringArrayStorageAnalyzer
      * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
@@ -116,8 +116,8 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
         @inject(ServiceIdentifiers.ILiteralNodesCacheStorage) literalNodesCacheStorage: ILiteralNodesCacheStorage,
         @inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
         @inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
-        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage)
-            stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage,
+        @inject(ServiceIdentifiers.IStringArrayScopeCallsWrappersDataStorage)
+            stringArrayScopeCallsWrappersDataStorage: IStringArrayScopeCallsWrappersDataStorage,
         @inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage)
             stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
         @inject(ServiceIdentifiers.IStringArrayStorageAnalyzer) stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer,
@@ -131,7 +131,7 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
         this.literalNodesCacheStorage = literalNodesCacheStorage;
         this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
         this.stringArrayStorage = stringArrayStorage;
-        this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
+        this.stringArrayScopeCallsWrappersDataStorage = stringArrayScopeCallsWrappersDataStorage;
         this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
         this.stringArrayStorageAnalyzer = stringArrayStorageAnalyzer;
         this.identifierNamesGenerator = identifierNamesGeneratorFactory(options);
@@ -219,21 +219,17 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
      * @returns {Expression}
      */
     private getStringArrayCallNode (stringArrayStorageItemData: IStringArrayStorageItemData): ESTree.Expression {
-        const {
-            name: stringArrayCallsWrapperName,
-            index,
-            parameterIndexesData
-        } = this.getStringArrayCallsWrapperData(stringArrayStorageItemData);
-        const {decodeKey } = stringArrayStorageItemData;
+        const stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData =
+            this.getStringArrayScopeCallsWrapperData(stringArrayStorageItemData);
+        const {decodeKey, index} = stringArrayStorageItemData;
 
         const stringArrayCallCustomNode: ICustomNode<TInitialData<StringArrayCallNode>> =
             this.stringArrayTransformerCustomNodeFactory(StringArrayCustomNode.StringArrayCallNode);
 
         stringArrayCallCustomNode.initialize(
-            stringArrayCallsWrapperName,
-            parameterIndexesData,
             index,
             this.stringArrayStorage.getIndexShiftAmount(),
+            stringArrayScopeCallsWrapperData,
             decodeKey
         );
 
@@ -250,29 +246,29 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
      * @param {IStringArrayStorageItemData} stringArrayStorageItemData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
-    private getStringArrayCallsWrapperData (
+    private getStringArrayScopeCallsWrapperData (
         stringArrayStorageItemData: IStringArrayStorageItemData
     ): IStringArrayScopeCallsWrapperData {
         return !this.options.stringArrayWrappersCount
-            ? this.getRootStringArrayCallsWrapperData(stringArrayStorageItemData)
-            : this.getUpperStringArrayCallsWrapperData(stringArrayStorageItemData);
+            ? this.getRootStringArrayScopeCallsWrapperData(stringArrayStorageItemData)
+            : this.getUpperStringArrayScopeCallsWrapperData(stringArrayStorageItemData);
     }
 
     /**
      * @param {IStringArrayStorageItemData} stringArrayStorageItemData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
-    private getRootStringArrayCallsWrapperData (
+    private getRootStringArrayScopeCallsWrapperData (
         stringArrayStorageItemData: IStringArrayStorageItemData
     ): IStringArrayScopeCallsWrapperData {
-        const {encoding, index} = stringArrayStorageItemData;
+        const {encoding} = stringArrayStorageItemData;
 
         const rootStringArrayCallsWrapperName: string = this.stringArrayStorage.getStorageCallsWrapperName(encoding);
 
         return {
             name: rootStringArrayCallsWrapperName,
-            parameterIndexesData: null,
-            index
+            index: 0,
+            parameterIndexesData: null
         };
     }
 
@@ -280,10 +276,10 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
      * @param {IStringArrayStorageItemData} stringArrayStorageItemData
      * @returns {IStringArrayScopeCallsWrapperData}
      */
-    private getUpperStringArrayCallsWrapperData (
+    private getUpperStringArrayScopeCallsWrapperData (
         stringArrayStorageItemData: IStringArrayStorageItemData
     ): IStringArrayScopeCallsWrapperData {
-        const {encoding, index} = stringArrayStorageItemData;
+        const {encoding} = stringArrayStorageItemData;
         const currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
             this.visitedLexicalScopeNodesStackStorage.getLastElement() ?? null;
         const parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
@@ -293,73 +289,24 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
             throw new Error('Cannot find current lexical scope body node');
         }
 
-        const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding =
-            this.getAndUpdateStringArrayScopeCallsWrapperNamesDataByEncoding(
-                currentLexicalScopeBodyNode,
-                stringArrayStorageItemData
-            );
         const stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData =
             this.getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData(
                 currentLexicalScopeBodyNode,
                 parentLexicalScopeBodyNode
             );
+        const stringArrayScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding =
+            this.getAndUpdateStringArrayScopeCallsWrappersDataByEncoding(
+                currentLexicalScopeBodyNode,
+                stringArrayStorageItemData,
+                stringArrayScopeCallsWrapperLexicalScopeData
+            );
 
-        const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperNamesDataByEncoding[encoding]?.names ?? [];
-        const randomUpperStringArrayCallsWrapperName: string = this.randomGenerator
-            .getRandomGenerator()
-            .pickone(stringArrayScopeCallsWrapperNames);
-
-        const resultIndex: number = stringArrayScopeCallsWrapperLexicalScopeData
-            ? stringArrayScopeCallsWrapperLexicalScopeData.resultShiftedIndex + index
-            : index;
-
-        return {
-            name: randomUpperStringArrayCallsWrapperName,
-            index: resultIndex,
-            parameterIndexesData: stringArrayScopeCallsWrapperLexicalScopeData.callsWrappersParameterIndexesData
-        };
-    }
-
-    /**
-     * @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
-     * @param {IStringArrayStorageItemData} stringArrayStorageItemData
-     * @returns {TStringArrayScopeCallsWrapperNamesDataByEncoding}
-     */
-    private getAndUpdateStringArrayScopeCallsWrapperNamesDataByEncoding (
-        currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
-        stringArrayStorageItemData: IStringArrayStorageItemData
-    ): TStringArrayScopeCallsWrapperNamesDataByEncoding {
-        const {encoding} = stringArrayStorageItemData;
-        const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding =
-            this.stringArrayScopeCallsWrapperNamesDataStorage.get(currentLexicalScopeBodyNode)
-            ?? {};
-
-        const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperNamesDataByEncoding[encoding]?.names ?? [];
-        const isFilledScopeCallsWrapperNamesList: boolean = stringArrayScopeCallsWrapperNames.length === this.options.stringArrayWrappersCount;
-
-        if (isFilledScopeCallsWrapperNamesList) {
-            return stringArrayScopeCallsWrapperNamesDataByEncoding;
-        }
-
-        // have to use `generateForGlobalScope` for program node for correct attach prefix to the calls wrapper name
-        const nextScopeCallsWrapperName: string = NodeGuards.isProgramNode(currentLexicalScopeBodyNode)
-            ? this.identifierNamesGenerator.generateForGlobalScope()
-            : this.identifierNamesGenerator.generateNext();
-
-        stringArrayScopeCallsWrapperNamesDataByEncoding[encoding] = {
-            encoding,
-            names: [
-                ...stringArrayScopeCallsWrapperNames,
-                nextScopeCallsWrapperName
-            ]
-        };
-
-        this.stringArrayScopeCallsWrapperNamesDataStorage.set(
-            currentLexicalScopeBodyNode,
-            stringArrayScopeCallsWrapperNamesDataByEncoding
-        );
+        const stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrapperData[] =
+            stringArrayScopeCallsWrappersDataByEncoding[encoding]?.scopeCallsWrappersData ?? [];
 
-        return stringArrayScopeCallsWrapperNamesDataByEncoding;
+        return this.randomGenerator
+            .getRandomGenerator()
+            .pickone(stringArrayScopeCallsWrappersData);
     }
 
     /**
@@ -384,22 +331,12 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
             ? this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(parentLexicalScopeBodyNode) ?? null
             : null;
 
-        const callsWrappersParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null =
-            this.options.stringArrayWrappersType === StringArrayWrappersType.Function
-            ? this.getStringArrayCallsWrapperParameterIndexesData()
-            : null;
-        const scopeShiftedIndex: number = this.options.stringArrayWrappersType === StringArrayWrappersType.Function
-            ? this.randomGenerator.getRandomInteger(
-                StringArrayTransformer.minShiftedIndexValue,
-                StringArrayTransformer.maxShiftedIndexValue
-            )
-            : 0;
+        const scopeShiftedIndex: number = this.getStringArrayCallsWrapperShiftedIndex();
         const resultShiftedIndex: number = parentLexicalScopeData
             ? parentLexicalScopeData.resultShiftedIndex + scopeShiftedIndex
             : scopeShiftedIndex;
 
         const lexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData = {
-            callsWrappersParameterIndexesData,
             parentLexicalScopeBodyNode,
             resultShiftedIndex,
             scopeShiftedIndex
@@ -414,9 +351,80 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
     }
 
     /**
-     * @returns {IStringArrayScopeCallsWrapperParameterIndexesData}
+     * @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
+     * @param {IStringArrayStorageItemData} stringArrayStorageItemData
+     * @param {IStringArrayScopeCallsWrapperLexicalScopeData} stringArrayScopeCallsWrapperLexicalScopeData
+     * @returns {TStringArrayScopeCallsWrappersDataByEncoding}
      */
-    private getStringArrayCallsWrapperParameterIndexesData (): IStringArrayScopeCallsWrapperParameterIndexesData {
+    private getAndUpdateStringArrayScopeCallsWrappersDataByEncoding (
+        currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
+        stringArrayStorageItemData: IStringArrayStorageItemData,
+        stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData
+    ): TStringArrayScopeCallsWrappersDataByEncoding {
+        const {encoding} = stringArrayStorageItemData;
+        const stringArrayScopeCallsWrappersDataByEncoding: TStringArrayScopeCallsWrappersDataByEncoding =
+            this.stringArrayScopeCallsWrappersDataStorage.get(currentLexicalScopeBodyNode)
+            ?? {};
+
+        const stringArrayScopeCallsWrappersData: IStringArrayScopeCallsWrapperData[] =
+            stringArrayScopeCallsWrappersDataByEncoding[encoding]?.scopeCallsWrappersData ?? [];
+        const isFilledScopeCallsWrapperNamesList: boolean =
+            stringArrayScopeCallsWrappersData.length === this.options.stringArrayWrappersCount;
+
+        if (isFilledScopeCallsWrapperNamesList) {
+            return stringArrayScopeCallsWrappersDataByEncoding;
+        }
+
+        // have to use `generateForGlobalScope` for program node for correct attach prefix to the calls wrapper name
+        const nextScopeCallsWrapperName: string = NodeGuards.isProgramNode(currentLexicalScopeBodyNode)
+            ? this.identifierNamesGenerator.generateForGlobalScope()
+            : this.identifierNamesGenerator.generateNext();
+        const nextScopeCallsWrapperShiftedIndex: number =
+            this.getStringArrayCallsWrapperShiftedIndex();
+        const nextScopeCallsWrapperParameterIndexesData: IStringArrayScopeCallsWrapperParameterIndexesData | null =
+            this.getStringArrayCallsWrapperParameterIndexesData();
+
+        stringArrayScopeCallsWrappersDataByEncoding[encoding] = {
+            encoding,
+            scopeCallsWrappersData: [
+                ...stringArrayScopeCallsWrappersData,
+                {
+                    name: nextScopeCallsWrapperName,
+                    index: stringArrayScopeCallsWrapperLexicalScopeData.resultShiftedIndex
+                        + nextScopeCallsWrapperShiftedIndex,
+                    parameterIndexesData: nextScopeCallsWrapperParameterIndexesData
+                }
+            ]
+        };
+
+        this.stringArrayScopeCallsWrappersDataStorage.set(
+            currentLexicalScopeBodyNode,
+            stringArrayScopeCallsWrappersDataByEncoding
+        );
+
+        return stringArrayScopeCallsWrappersDataByEncoding;
+    }
+
+    /**
+     * @returns {number}
+     */
+    private getStringArrayCallsWrapperShiftedIndex (): number {
+        return this.options.stringArrayWrappersType === StringArrayWrappersType.Function
+            ? this.randomGenerator.getRandomInteger(
+                StringArrayTransformer.minShiftedIndexValue,
+                StringArrayTransformer.maxShiftedIndexValue
+            )
+            : 0;
+    }
+
+    /**
+     * @returns {IStringArrayScopeCallsWrapperParameterIndexesData | null}
+     */
+    private getStringArrayCallsWrapperParameterIndexesData (): IStringArrayScopeCallsWrapperParameterIndexesData | null {
+        if (this.options.stringArrayWrappersType !== StringArrayWrappersType.Function) {
+            return null;
+        }
+
         const minIndexValue: number = 0;
         const maxIndexValue: number = this.options.stringArrayWrappersParametersMaxCount - 1;
 

+ 5 - 5
src/storages/string-array-transformers/StringArrayScopeCallsWrapperNamesDataStorage.ts → src/storages/string-array-transformers/StringArrayScopeCallsWrappersDataStorage.ts

@@ -2,19 +2,19 @@ import { inject, injectable } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
-import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
+import { TStringArrayScopeCallsWrappersDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding';
 
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
-import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
+import { IStringArrayScopeCallsWrappersDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrappersDataStorage';
 
 import { MapStorage } from '../MapStorage';
 
 @injectable()
-export class StringArrayScopeCallsWrapperNamesDataStorage extends MapStorage <
+export class StringArrayScopeCallsWrappersDataStorage extends MapStorage <
     TNodeWithLexicalScopeStatements,
-    TStringArrayScopeCallsWrapperNamesDataByEncoding
-> implements IStringArrayScopeCallsWrapperNamesDataStorage {
+    TStringArrayScopeCallsWrappersDataByEncoding
+> implements IStringArrayScopeCallsWrappersDataStorage {
     /**
      * @param {IRandomGenerator} randomGenerator
      * @param {IOptions} options

+ 0 - 7
src/types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding.ts

@@ -1,7 +0,0 @@
-import { TStringArrayEncoding } from '../../options/TStringArrayEncoding';
-
-import { IStringArrayScopeCallsWrapperNamesData } from '../../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperNamesData';
-
-export type TStringArrayScopeCallsWrapperNamesDataByEncoding = Partial<{
-    [key in TStringArrayEncoding]: IStringArrayScopeCallsWrapperNamesData;
-}>;

+ 7 - 0
src/types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrappersDataByEncoding.ts

@@ -0,0 +1,7 @@
+import { TStringArrayEncoding } from '../../options/TStringArrayEncoding';
+
+import { IStringArrayScopeCallsWrappersData } from '../../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrappersData';
+
+export type TStringArrayScopeCallsWrappersDataByEncoding = Partial<{
+    [key in TStringArrayEncoding]: IStringArrayScopeCallsWrappersData;
+}>;

+ 28 - 14
test/dev/dev.ts

@@ -7,28 +7,42 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
 
     let obfuscationResult = JavaScriptObfuscator.obfuscate(
         `
-             (function(){
-                var variable1 = '5' - 3;
-                var variable2 = '5' + 3;
-                var variable3 = '5' + - '2';
-                var variable4 = ['10','10','10','10','10'].map(parseInt);
-                var variable5 = 'foo ' + 1 + 1;
-                console.log(variable1);
-                console.log(variable2);
-                console.log(variable3);
-                console.log(variable4);
-                console.log(variable5);
-            })();
+             function foo () {
+                console.log('foo', 1);             
+                console.log('foo', 2);             
+                console.log('foo', 3);
+                
+                function bar() {
+                    console.log('bar', 1);
+                    console.log('bar', 2);
+                    console.log('bar', 3);
+                    
+                    function baz() {
+                        console.log('baz', 1);
+                        console.log('baz', 2);
+                        console.log('baz', 3);
+                    }
+                    
+                    baz();
+                }             
+                
+                bar();
+             }
+             
+             foo();
         `,
         {
             ...NO_ADDITIONAL_NODES_PRESET,
+            seed: 1,
             compact: false,
             simplify: false,
             stringArray: true,
             stringArrayThreshold: 1,
-            stringArrayChainedCalls: true,
-            stringArrayWrappersCount: 2,
+            stringArrayIndexShift: true,
+            stringArrayWrappersChainedCalls: true,
+            stringArrayWrappersCount: 3,
             stringArrayWrappersType: 'function',
+            stringArrayWrappersParametersMaxCount: 5,
             identifierNamesGenerator: 'mangled'
         }
     );

+ 54 - 0
test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/StringArrayScopeCallsWrapperTransformer.spec.ts

@@ -9,6 +9,7 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/N
 
 import { readFileAsString } from '../../../../helpers/readFileAsString';
 import { checkCodeEvaluation } from '../../../../helpers/checkCodeEvaluation';
+import { getRegExpMatch } from '../../../../helpers/getRegExpMatch';
 
 import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade';
 
@@ -1246,6 +1247,59 @@ describe('StringArrayScopeCallsWrapperTransformer', function () {
                     });
                 });
             });
+
+            describe('Variant #6: different indexes for calls wrappers', () => {
+                const getStringArrayScopeCallsWrapperMatch = (stringArrayScopeCallsWrapperName: string) =>
+                    `function *${stringArrayScopeCallsWrapperName} *\\(e, *f\\) *{` +
+                        `return b\\([ef] *-(?: -)?(${hexadecimalIndexMatch}), *[ef]\\);` +
+                    '}.*';
+
+                const stringArrayScopeCallsWrapperIndexRegExp1: RegExp = new RegExp(
+                    getStringArrayScopeCallsWrapperMatch('c')
+                );
+                const stringArrayScopeCallsWrapperIndexRegExp2: RegExp = new RegExp(
+                    getStringArrayScopeCallsWrapperMatch('d')
+                );
+
+                const differentIndexesMatchesSamplesCount: number = 20;
+                let differentIndexesMatchesCount: number = 0;
+                let differentIndexesMatchesDelta: number = 3;
+
+                before(() => {
+                    const code: string = readFileAsString(__dirname + '/fixtures/function-calls-wrappers-different-indexes.js');
+
+                    for (let i = 0; i < differentIndexesMatchesSamplesCount; i++) {
+                        const obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
+                            code,
+                            {
+                                ...NO_ADDITIONAL_NODES_PRESET,
+                                identifierNamesGenerator: IdentifierNamesGenerator.MangledIdentifierNamesGenerator,
+                                stringArray: true,
+                                stringArrayThreshold: 1,
+                                stringArrayWrappersChainedCalls: true,
+                                stringArrayWrappersCount: 2,
+                                stringArrayWrappersParametersMaxCount: 2,
+                                stringArrayWrappersType: StringArrayWrappersType.Function
+                            }
+                        ).getObfuscatedCode();
+
+                        const indexMatch1 = getRegExpMatch(obfuscatedCode, stringArrayScopeCallsWrapperIndexRegExp1);
+                        const indexMatch2 = getRegExpMatch(obfuscatedCode, stringArrayScopeCallsWrapperIndexRegExp2);
+
+                        if (indexMatch1 !== indexMatch2) {
+                            differentIndexesMatchesCount++;
+                        }
+                    }
+                });
+
+                it('Should generate a different indexes for different string array scope calls wrappers', () => {
+                    assert.closeTo(
+                        differentIndexesMatchesCount,
+                        differentIndexesMatchesSamplesCount,
+                        differentIndexesMatchesDelta
+                    );
+                });
+            });
         });
     });
 

+ 2 - 0
test/functional-tests/node-transformers/string-array-transformers/string-array-scope-calls-wrapper-transformer/fixtures/function-calls-wrappers-different-indexes.js

@@ -0,0 +1,2 @@
+var foo = 'foo'
+var bar = 'bar'

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