mirror of
https://github.com/javascript-obfuscator/javascript-obfuscator
synced 2026-08-09 12:42:29 +00:00
WIP: shifted indexes of string array wrappers #2: refactoring
This commit is contained in:
@@ -50,7 +50,8 @@ export enum ServiceIdentifiers {
|
||||
IScopeIdentifiersTraverser = 'IScopeIdentifiersTraverser',
|
||||
ISourceCode = 'ISourceCode',
|
||||
IScopeAnalyzer = 'IScopeAnalyzer',
|
||||
IStringArrayScopeCallsWrapperDataStorage = 'IStringArrayScopeCallsWrapperDataStorage',
|
||||
IStringArrayScopeCallsWrapperLexicalScopeDataStorage = 'IStringArrayScopeCallsWrapperLexicalScopeDataStorage',
|
||||
IStringArrayScopeCallsWrapperNamesDataStorage = 'IStringArrayScopeCallsWrapperNamesDataStorage',
|
||||
IStringArrayStorage = 'IStringArrayStorage',
|
||||
IStringArrayStorageAnalyzer = 'IStringArrayStorageAnalyzer',
|
||||
IVisitedLexicalScopeNodesStackStorage = 'IVisitedLexicalScopeNodesStackStorage',
|
||||
|
||||
@@ -7,14 +7,16 @@ import { TCustomCodeHelperGroupStorage } from '../../../types/storages/TCustomCo
|
||||
import { ILiteralNodesCacheStorage } from '../../../interfaces/storages/string-array-transformers/ILiteralNodesCacheStorage';
|
||||
import { IOptions } from '../../../interfaces/options/IOptions';
|
||||
import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator';
|
||||
import { IStringArrayScopeCallsWrapperDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperDataStorage';
|
||||
import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
|
||||
import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
|
||||
import { IStringArrayStorage } from '../../../interfaces/storages/string-array-transformers/IStringArrayStorage';
|
||||
import { IVisitedLexicalScopeNodesStackStorage } from '../../../interfaces/storages/string-array-transformers/IVisitedLexicalScopeNodesStackStorage';
|
||||
|
||||
import { ControlFlowStorage } from '../../../storages/custom-nodes/ControlFlowStorage';
|
||||
import { CustomCodeHelperGroupStorage } from '../../../storages/custom-code-helpers/CustomCodeHelperGroupStorage';
|
||||
import { LiteralNodesCacheStorage } from '../../../storages/string-array-transformers/LiteralNodesCacheStorage';
|
||||
import { StringArrayScopeCallsWrapperDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperDataStorage';
|
||||
import { StringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperLexicalScopeDataStorage';
|
||||
import { StringArrayScopeCallsWrapperNamesDataStorage } from '../../../storages/string-array-transformers/StringArrayScopeCallsWrapperNamesDataStorage';
|
||||
import { StringArrayStorage } from '../../../storages/string-array-transformers/StringArrayStorage';
|
||||
import { VisitedLexicalScopeNodesStackStorage } from '../../../storages/string-array-transformers/VisitedLexicalScopeNodesStackStorage';
|
||||
|
||||
@@ -32,8 +34,12 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b
|
||||
.to(StringArrayStorage)
|
||||
.inSingletonScope();
|
||||
|
||||
bind<IStringArrayScopeCallsWrapperDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperDataStorage)
|
||||
.to(StringArrayScopeCallsWrapperDataStorage)
|
||||
bind<IStringArrayScopeCallsWrapperLexicalScopeDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage)
|
||||
.to(StringArrayScopeCallsWrapperLexicalScopeDataStorage)
|
||||
.inSingletonScope();
|
||||
|
||||
bind<IStringArrayScopeCallsWrapperNamesDataStorage>(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage)
|
||||
.to(StringArrayScopeCallsWrapperNamesDataStorage)
|
||||
.inSingletonScope();
|
||||
|
||||
bind<IVisitedLexicalScopeNodesStackStorage>(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage)
|
||||
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
|
||||
import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
|
||||
|
||||
export interface IStringArrayScopeCallsWrapperData {
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
globalIndexShift: number;
|
||||
|
||||
/**
|
||||
* @type {TStringArrayScopeCallsWrapperNamesDataByEncoding}
|
||||
*/
|
||||
names: TStringArrayScopeCallsWrapperNamesDataByEncoding;
|
||||
|
||||
/**
|
||||
* @type {TNodeWithLexicalScopeStatements | null}
|
||||
*/
|
||||
parentLexicalScopeNode: TNodeWithLexicalScopeStatements | null;
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
scopeIndexShift: number;
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
|
||||
|
||||
export interface IStringArrayScopeCallsWrapperLexicalScopeData {
|
||||
/**
|
||||
* @type {TNodeWithLexicalScopeStatements | null}
|
||||
*/
|
||||
parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null;
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
resultShiftedIndex: number;
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
scopeShiftedIndex: number;
|
||||
}
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
|
||||
|
||||
import { IStringArrayScopeCallsWrapperData } from '../../node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
|
||||
|
||||
import { IMapStorage } from '../IMapStorage';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface IStringArrayScopeCallsWrapperDataStorage extends IMapStorage<
|
||||
TNodeWithLexicalScopeStatements,
|
||||
IStringArrayScopeCallsWrapperData
|
||||
> {}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
import { TNodeWithLexicalScopeStatements } from '../../../types/node/TNodeWithLexicalScopeStatements';
|
||||
|
||||
import { IMapStorage } from '../IMapStorage';
|
||||
import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
export interface IStringArrayScopeCallsWrapperLexicalScopeDataStorage extends IMapStorage<
|
||||
TNodeWithLexicalScopeStatements,
|
||||
IStringArrayScopeCallsWrapperLexicalScopeData
|
||||
> {}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
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
|
||||
> {}
|
||||
+37
-25
@@ -5,28 +5,30 @@ import * as ESTree from 'estree';
|
||||
|
||||
import { TInitialData } from '../../types/TInitialData';
|
||||
import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
|
||||
import { TStatement } from '../../types/node/TStatement';
|
||||
import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding';
|
||||
import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
|
||||
import { TStringArrayTransformerCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayTransformerCustomNodeFactory';
|
||||
|
||||
import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
|
||||
import { IOptions } from '../../interfaces/options/IOptions';
|
||||
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 { IStringArrayScopeCallsWrapperDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperDataStorage';
|
||||
import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
|
||||
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';
|
||||
|
||||
import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage';
|
||||
import { StringArrayTransformerCustomNode } from '../../enums/custom-nodes/StringArrayTransformerCustomNode';
|
||||
import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
|
||||
|
||||
import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
|
||||
import { NodeAppender } from '../../node/NodeAppender';
|
||||
import { NodeGuards } from '../../node/NodeGuards';
|
||||
import { StringArrayScopeCallsWrapperVariableNode } from '../../custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperVariableNode';
|
||||
import { TStatement } from '../../types/node/TStatement';
|
||||
import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
|
||||
import { StringArrayScopeCallsWrapperFunctionNode } from '../../custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode';
|
||||
|
||||
@injectable()
|
||||
@@ -37,9 +39,14 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
private readonly stringArrayStorage: IStringArrayStorage;
|
||||
|
||||
/**
|
||||
* @type {IStringArrayScopeCallsWrapperDataStorage}
|
||||
* @type {IStringArrayScopeCallsWrapperLexicalScopeDataStorage}
|
||||
*/
|
||||
private readonly stringArrayScopeCallsWrapperDataStorage: IStringArrayScopeCallsWrapperDataStorage;
|
||||
private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
|
||||
|
||||
/**
|
||||
* @type {IStringArrayScopeCallsWrapperNamesDataStorage}
|
||||
*/
|
||||
private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
|
||||
|
||||
/**
|
||||
* @type {TStringArrayTransformerCustomNodeFactory}
|
||||
@@ -56,7 +63,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
* @param {IOptions} options
|
||||
* @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
|
||||
* @param {IStringArrayStorage} stringArrayStorage
|
||||
* @param {IStringArrayScopeCallsWrapperDataStorage} stringArrayScopeCallsWrapperDataStorage
|
||||
* @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
|
||||
* @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
|
||||
* @param {TStringArrayTransformerCustomNodeFactory} stringArrayTransformerCustomNodeFactory
|
||||
*/
|
||||
public constructor (
|
||||
@@ -64,7 +72,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
@inject(ServiceIdentifiers.IOptions) options: IOptions,
|
||||
@inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
|
||||
@inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
|
||||
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperDataStorage) stringArrayScopeCallsWrapperDataStorage: IStringArrayScopeCallsWrapperDataStorage,
|
||||
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage) stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage,
|
||||
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage) stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
|
||||
@inject(ServiceIdentifiers.Factory__IStringArrayTransformerCustomNode)
|
||||
stringArrayTransformerCustomNodeFactory: TStringArrayTransformerCustomNodeFactory
|
||||
) {
|
||||
@@ -72,7 +81,8 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
|
||||
this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
|
||||
this.stringArrayStorage = stringArrayStorage;
|
||||
this.stringArrayScopeCallsWrapperDataStorage = stringArrayScopeCallsWrapperDataStorage;
|
||||
this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
|
||||
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
|
||||
this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
|
||||
}
|
||||
|
||||
@@ -114,18 +124,20 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
public transformNode (
|
||||
lexicalScopeBodyNode: TNodeWithLexicalScopeStatements
|
||||
): TNodeWithLexicalScopeStatements {
|
||||
const stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData | null =
|
||||
this.stringArrayScopeCallsWrapperDataStorage.get(lexicalScopeBodyNode) ?? null;
|
||||
const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null =
|
||||
this.stringArrayScopeCallsWrapperNamesDataStorage.get(lexicalScopeBodyNode) ?? null;
|
||||
const stringArrayScopeCallsWrapperNamesLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null =
|
||||
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(lexicalScopeBodyNode) ?? null;
|
||||
|
||||
if (!stringArrayScopeCallsWrapperData) {
|
||||
if (!stringArrayScopeCallsWrapperNamesDataByEncoding || !stringArrayScopeCallsWrapperNamesLexicalScopeData) {
|
||||
return lexicalScopeBodyNode;
|
||||
}
|
||||
|
||||
const indexShift: number = this.options.stringArrayWrappersChainedCalls
|
||||
? stringArrayScopeCallsWrapperData.scopeIndexShift
|
||||
: stringArrayScopeCallsWrapperData.globalIndexShift;
|
||||
const stringArrayScopeCallsWrapperNamesDataList: (IStringArrayScopeCallsWrapperNamesData | undefined)[] =
|
||||
Object.values(stringArrayScopeCallsWrapperData.names);
|
||||
Object.values(stringArrayScopeCallsWrapperNamesDataByEncoding);
|
||||
const stringArrayScopeCallsWrapperShiftedIndex: number = this.options.stringArrayWrappersChainedCalls
|
||||
? stringArrayScopeCallsWrapperNamesLexicalScopeData.scopeShiftedIndex
|
||||
: stringArrayScopeCallsWrapperNamesLexicalScopeData.resultShiftedIndex;
|
||||
|
||||
// iterates over data for each encoding type
|
||||
for (const stringArrayScopeCallsWrapperNamesData of stringArrayScopeCallsWrapperNamesDataList) {
|
||||
@@ -147,7 +159,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
const stringArrayScopeCallsWrapperNode: TStatement[] = this.getStringArrayScopeCallsWrapperNode(
|
||||
stringArrayScopeCallsWrapperName,
|
||||
upperStringArrayCallsWrapperName,
|
||||
indexShift
|
||||
stringArrayScopeCallsWrapperShiftedIndex
|
||||
);
|
||||
|
||||
NodeAppender.prepend(
|
||||
@@ -186,9 +198,9 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
return rootStringArrayCallsWrapperName;
|
||||
}
|
||||
|
||||
const parentLexicalScopeData: IStringArrayScopeCallsWrapperData | null = this.stringArrayScopeCallsWrapperDataStorage
|
||||
const parentLexicalScopeNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding | null = this.stringArrayScopeCallsWrapperNamesDataStorage
|
||||
.get(parentLexicalScopeBodyNode) ?? null;
|
||||
const parentLexicalScopeNames: string[] | null = parentLexicalScopeData?.names[encoding]?.names ?? null;
|
||||
const parentLexicalScopeNames: string[] | null = parentLexicalScopeNamesDataByEncoding?.[encoding]?.names ?? null;
|
||||
|
||||
return parentLexicalScopeNames?.length
|
||||
? this.randomGenerator
|
||||
@@ -200,20 +212,20 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
/**
|
||||
* @param {string} stringArrayScopeCallsWrapperName
|
||||
* @param {string} upperStringArrayCallsWrapperName
|
||||
* @param {number} indexShift
|
||||
* @param {number} stringArrayScopeCallsWrapperShiftedIndex
|
||||
* @returns {TStatement[]}
|
||||
*/
|
||||
private getStringArrayScopeCallsWrapperNode (
|
||||
stringArrayScopeCallsWrapperName: string,
|
||||
upperStringArrayCallsWrapperName: string,
|
||||
indexShift: number
|
||||
stringArrayScopeCallsWrapperShiftedIndex: number
|
||||
): TStatement[] {
|
||||
switch (this.options.stringArrayWrappersType) {
|
||||
case StringArrayWrappersType.Function:
|
||||
return this.getStringArrayScopeCallsWrapperFunctionNode(
|
||||
stringArrayScopeCallsWrapperName,
|
||||
upperStringArrayCallsWrapperName,
|
||||
indexShift
|
||||
stringArrayScopeCallsWrapperShiftedIndex
|
||||
);
|
||||
|
||||
case StringArrayWrappersType.Variable:
|
||||
@@ -250,13 +262,13 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
/**
|
||||
* @param {string} stringArrayScopeCallsWrapperName
|
||||
* @param {string} upperStringArrayCallsWrapperName
|
||||
* @param {number} indexShift
|
||||
* @param {number} stringArrayScopeCallsWrapperShiftedIndex
|
||||
* @returns {TStatement[]}
|
||||
*/
|
||||
private getStringArrayScopeCallsWrapperFunctionNode (
|
||||
stringArrayScopeCallsWrapperName: string,
|
||||
upperStringArrayCallsWrapperName: string,
|
||||
indexShift: number
|
||||
stringArrayScopeCallsWrapperShiftedIndex: number
|
||||
): TStatement[] {
|
||||
const stringArrayScopeCallsWrapperFunctionNode: ICustomNode<TInitialData<StringArrayScopeCallsWrapperFunctionNode>> =
|
||||
this.stringArrayTransformerCustomNodeFactory(
|
||||
@@ -266,7 +278,7 @@ export class StringArrayScopeCallsWrapperTransformer extends AbstractNodeTransfo
|
||||
stringArrayScopeCallsWrapperFunctionNode.initialize(
|
||||
stringArrayScopeCallsWrapperName,
|
||||
upperStringArrayCallsWrapperName,
|
||||
indexShift
|
||||
stringArrayScopeCallsWrapperShiftedIndex
|
||||
);
|
||||
|
||||
return stringArrayScopeCallsWrapperFunctionNode.getNode();
|
||||
|
||||
@@ -3,21 +3,22 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
|
||||
|
||||
import * as ESTree from 'estree';
|
||||
|
||||
import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory';
|
||||
import { TInitialData } from '../../types/TInitialData';
|
||||
import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
|
||||
import { TStatement } from '../../types/node/TStatement';
|
||||
import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding';
|
||||
import { TStringArrayScopeCallsWrapperNamesDataByEncoding } from '../../types/node-transformers/string-array-transformers/TStringArrayScopeCallsWrapperNamesDataByEncoding';
|
||||
import { TStringArrayTransformerCustomNodeFactory } from '../../types/container/custom-nodes/TStringArrayTransformerCustomNodeFactory';
|
||||
|
||||
import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
|
||||
import { IEscapeSequenceEncoder } from '../../interfaces/utils/IEscapeSequenceEncoder';
|
||||
import { IIdentifierNamesGenerator } from '../../interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator';
|
||||
import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory';
|
||||
import { ILiteralNodesCacheStorage } from '../../interfaces/storages/string-array-transformers/ILiteralNodesCacheStorage';
|
||||
import { IOptions } from '../../interfaces/options/IOptions';
|
||||
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
|
||||
import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
|
||||
import { IStringArrayScopeCallsWrapperDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperDataStorage';
|
||||
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 { IStringArrayStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayStorage';
|
||||
import { IStringArrayStorageAnalyzer } from '../../interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer';
|
||||
import { IStringArrayStorageItemData } from '../../interfaces/storages/string-array-transformers/IStringArrayStorageItem';
|
||||
@@ -74,9 +75,14 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
||||
private readonly stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer;
|
||||
|
||||
/**
|
||||
* @type {IStringArrayScopeCallsWrapperDataStorage}
|
||||
* @type {IStringArrayScopeCallsWrapperLexicalScopeDataStorage}
|
||||
*/
|
||||
private readonly stringArrayScopeCallsWrapperDataStorage: IStringArrayScopeCallsWrapperDataStorage;
|
||||
private readonly stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage;
|
||||
|
||||
/**
|
||||
* @type {IStringArrayScopeCallsWrapperNamesDataStorage}
|
||||
*/
|
||||
private readonly stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage;
|
||||
|
||||
/**
|
||||
* @type {TStringArrayTransformerCustomNodeFactory}
|
||||
@@ -95,7 +101,8 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
||||
* @param {ILiteralNodesCacheStorage} literalNodesCacheStorage
|
||||
* @param {IVisitedLexicalScopeNodesStackStorage} visitedLexicalScopeNodesStackStorage
|
||||
* @param {IStringArrayStorage} stringArrayStorage
|
||||
* @param {IStringArrayScopeCallsWrapperDataStorage} stringArrayScopeCallsWrapperDataStorage
|
||||
* @param {IStringArrayScopeCallsWrapperNamesDataStorage} stringArrayScopeCallsWrapperNamesDataStorage
|
||||
* @param {IStringArrayScopeCallsWrapperLexicalScopeDataStorage} stringArrayScopeCallsWrapperLexicalScopeDataStorage
|
||||
* @param {IStringArrayStorageAnalyzer} stringArrayStorageAnalyzer
|
||||
* @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
|
||||
* @param {TStringArrayTransformerCustomNodeFactory} stringArrayTransformerCustomNodeFactory
|
||||
@@ -107,7 +114,10 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
||||
@inject(ServiceIdentifiers.ILiteralNodesCacheStorage) literalNodesCacheStorage: ILiteralNodesCacheStorage,
|
||||
@inject(ServiceIdentifiers.IVisitedLexicalScopeNodesStackStorage) visitedLexicalScopeNodesStackStorage: IVisitedLexicalScopeNodesStackStorage,
|
||||
@inject(ServiceIdentifiers.IStringArrayStorage) stringArrayStorage: IStringArrayStorage,
|
||||
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperDataStorage) stringArrayScopeCallsWrapperDataStorage: IStringArrayScopeCallsWrapperDataStorage,
|
||||
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperNamesDataStorage)
|
||||
stringArrayScopeCallsWrapperNamesDataStorage: IStringArrayScopeCallsWrapperNamesDataStorage,
|
||||
@inject(ServiceIdentifiers.IStringArrayScopeCallsWrapperLexicalScopeDataStorage)
|
||||
stringArrayScopeCallsWrapperLexicalScopeDataStorage: IStringArrayScopeCallsWrapperLexicalScopeDataStorage,
|
||||
@inject(ServiceIdentifiers.IStringArrayStorageAnalyzer) stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer,
|
||||
@inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator)
|
||||
identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory,
|
||||
@@ -120,7 +130,8 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
||||
this.literalNodesCacheStorage = literalNodesCacheStorage;
|
||||
this.visitedLexicalScopeNodesStackStorage = visitedLexicalScopeNodesStackStorage;
|
||||
this.stringArrayStorage = stringArrayStorage;
|
||||
this.stringArrayScopeCallsWrapperDataStorage = stringArrayScopeCallsWrapperDataStorage;
|
||||
this.stringArrayScopeCallsWrapperNamesDataStorage = stringArrayScopeCallsWrapperNamesDataStorage;
|
||||
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage = stringArrayScopeCallsWrapperLexicalScopeDataStorage;
|
||||
this.stringArrayStorageAnalyzer = stringArrayStorageAnalyzer;
|
||||
this.identifierNamesGenerator = identifierNamesGeneratorFactory(options);
|
||||
this.stringArrayTransformerCustomNodeFactory = stringArrayTransformerCustomNodeFactory;
|
||||
@@ -219,23 +230,13 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
||||
* @returns {Node}
|
||||
*/
|
||||
private getStringArrayCallNode (stringArrayStorageItemData: IStringArrayStorageItemData): ESTree.Node {
|
||||
const stringArrayCallsWrapperName: string = this.getStringArrayCallsWrapperName(stringArrayStorageItemData);
|
||||
const { index, decodeKey } = stringArrayStorageItemData;
|
||||
const [stringArrayCallsWrapperName, index] = this.getStringArrayCallsWrapperData(stringArrayStorageItemData);
|
||||
const {decodeKey } = stringArrayStorageItemData;
|
||||
|
||||
// todo: refactor this
|
||||
const lastElement: TNodeWithLexicalScopeStatements | null =
|
||||
this.visitedLexicalScopeNodesStackStorage.getLastElement() ?? null;
|
||||
const stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData | null = lastElement
|
||||
? this.stringArrayScopeCallsWrapperDataStorage.get(lastElement) ?? null
|
||||
: null;
|
||||
|
||||
const resultIndex: number = stringArrayScopeCallsWrapperData
|
||||
? stringArrayScopeCallsWrapperData.globalIndexShift + index
|
||||
: index;
|
||||
const stringArrayCallCustomNode: ICustomNode<TInitialData<StringArrayCallNode>> =
|
||||
this.stringArrayTransformerCustomNodeFactory(StringArrayTransformerCustomNode.StringArrayCallNode);
|
||||
|
||||
stringArrayCallCustomNode.initialize(stringArrayCallsWrapperName, resultIndex, decodeKey);
|
||||
stringArrayCallCustomNode.initialize(stringArrayCallsWrapperName, index, decodeKey);
|
||||
|
||||
const statementNode: TStatement = stringArrayCallCustomNode.getNode()[0];
|
||||
|
||||
@@ -248,30 +249,41 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
||||
|
||||
/**
|
||||
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
|
||||
* @returns {string}
|
||||
* @returns {[name: string, index: number]}
|
||||
*/
|
||||
private getStringArrayCallsWrapperName (stringArrayStorageItemData: IStringArrayStorageItemData): string {
|
||||
const {encoding} = stringArrayStorageItemData;
|
||||
|
||||
private getStringArrayCallsWrapperData (
|
||||
stringArrayStorageItemData: IStringArrayStorageItemData
|
||||
): [name: string, index: number] {
|
||||
return !this.options.stringArrayWrappersCount
|
||||
? this.getRootStringArrayCallsWrapperName(encoding)
|
||||
: this.getUpperStringArrayCallsWrapperName(encoding);
|
||||
|
||||
? this.getRootStringArrayCallsWrapperData(stringArrayStorageItemData)
|
||||
: this.getUpperStringArrayCallsWrapperData(stringArrayStorageItemData);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {TStringArrayEncoding} encoding
|
||||
* @returns {string}
|
||||
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
|
||||
* @returns {[name: string, index: number]}
|
||||
*/
|
||||
private getRootStringArrayCallsWrapperName (encoding: TStringArrayEncoding): string {
|
||||
return this.stringArrayStorage.getStorageCallsWrapperName(encoding);
|
||||
private getRootStringArrayCallsWrapperData (
|
||||
stringArrayStorageItemData: IStringArrayStorageItemData
|
||||
): [name: string, index: number] {
|
||||
const {encoding, index} = stringArrayStorageItemData;
|
||||
|
||||
const rootStringArrayCallsWrapperName: string = this.stringArrayStorage.getStorageCallsWrapperName(encoding);
|
||||
|
||||
return [
|
||||
rootStringArrayCallsWrapperName,
|
||||
index
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {TStringArrayEncoding} encoding
|
||||
* @returns {string}
|
||||
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
|
||||
* @returns {[name: string, index: number]}
|
||||
*/
|
||||
private getUpperStringArrayCallsWrapperName (encoding: TStringArrayEncoding): string {
|
||||
private getUpperStringArrayCallsWrapperData (
|
||||
stringArrayStorageItemData: IStringArrayStorageItemData
|
||||
): [name: string, index: number] {
|
||||
const {encoding, index} = stringArrayStorageItemData;
|
||||
const currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
|
||||
this.visitedLexicalScopeNodesStackStorage.getLastElement() ?? null;
|
||||
const parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null =
|
||||
@@ -281,57 +293,115 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
|
||||
throw new Error('Cannot find current lexical scope body node');
|
||||
}
|
||||
|
||||
const stringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData =
|
||||
this.stringArrayScopeCallsWrapperDataStorage.get(currentLexicalScopeBodyNode)
|
||||
?? this.initializeStringArrayScopeCallsWrapperData(parentLexicalScopeBodyNode);
|
||||
const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperData.names[encoding]?.names ?? [];
|
||||
const isFilledScopeCallsWrapperNamesList: boolean = stringArrayScopeCallsWrapperNames.length === this.options.stringArrayWrappersCount;
|
||||
|
||||
if (!isFilledScopeCallsWrapperNamesList) {
|
||||
const nextScopeCallsWrapperName: string = this.identifierNamesGenerator.generateNext();
|
||||
|
||||
stringArrayScopeCallsWrapperNames.push(nextScopeCallsWrapperName);
|
||||
stringArrayScopeCallsWrapperData.names[encoding] = {
|
||||
encoding,
|
||||
names: stringArrayScopeCallsWrapperNames
|
||||
};
|
||||
|
||||
this.stringArrayScopeCallsWrapperDataStorage.set(
|
||||
const stringArrayScopeCallsWrapperNamesDataByEncoding: TStringArrayScopeCallsWrapperNamesDataByEncoding =
|
||||
this.getAndUpdateStringArrayScopeCallsWrapperNamesDataByEncoding(
|
||||
currentLexicalScopeBodyNode,
|
||||
stringArrayScopeCallsWrapperData
|
||||
stringArrayStorageItemData
|
||||
);
|
||||
const stringArrayScopeCallsWrapperLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData =
|
||||
this.getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData(
|
||||
currentLexicalScopeBodyNode,
|
||||
parentLexicalScopeBodyNode
|
||||
);
|
||||
}
|
||||
|
||||
return this.randomGenerator.getRandomGenerator().pickone(stringArrayScopeCallsWrapperNames);
|
||||
const stringArrayScopeCallsWrapperNames: string[] = stringArrayScopeCallsWrapperNamesDataByEncoding[encoding]?.names ?? [];
|
||||
const randomUpperStringArrayCallsWrapperName: string = this.randomGenerator
|
||||
.getRandomGenerator()
|
||||
.pickone(stringArrayScopeCallsWrapperNames);
|
||||
|
||||
const resultIndex: number = stringArrayScopeCallsWrapperLexicalScopeData
|
||||
? stringArrayScopeCallsWrapperLexicalScopeData.resultShiftedIndex + index
|
||||
: index;
|
||||
|
||||
return [
|
||||
randomUpperStringArrayCallsWrapperName,
|
||||
resultIndex
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {TNodeWithLexicalScopeStatements | null} parentLexicalScopeBodyNode
|
||||
* @returns {IStringArrayScopeCallsWrapperData}
|
||||
* @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
|
||||
* @param {IStringArrayStorageItemData} stringArrayStorageItemData
|
||||
* @returns {TStringArrayScopeCallsWrapperNamesDataByEncoding}
|
||||
*/
|
||||
private initializeStringArrayScopeCallsWrapperData (
|
||||
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;
|
||||
}
|
||||
|
||||
const nextScopeCallsWrapperName: string = this.identifierNamesGenerator.generateNext();
|
||||
|
||||
stringArrayScopeCallsWrapperNamesDataByEncoding[encoding] = {
|
||||
encoding,
|
||||
names: [
|
||||
...stringArrayScopeCallsWrapperNames,
|
||||
nextScopeCallsWrapperName
|
||||
]
|
||||
};
|
||||
|
||||
this.stringArrayScopeCallsWrapperNamesDataStorage.set(
|
||||
currentLexicalScopeBodyNode,
|
||||
stringArrayScopeCallsWrapperNamesDataByEncoding
|
||||
);
|
||||
|
||||
return stringArrayScopeCallsWrapperNamesDataByEncoding;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {TNodeWithLexicalScopeStatements} currentLexicalScopeBodyNode
|
||||
* @param {TNodeWithLexicalScopeStatements | null} parentLexicalScopeBodyNode
|
||||
* @returns {IStringArrayScopeCallsWrapperLexicalScopeData}
|
||||
* @private
|
||||
*/
|
||||
private getAndUpdateStringArrayScopeCallsWrapperLexicalScopeData (
|
||||
currentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements,
|
||||
parentLexicalScopeBodyNode: TNodeWithLexicalScopeStatements | null
|
||||
): IStringArrayScopeCallsWrapperData {
|
||||
const parentStringArrayScopeCallsWrapperData: IStringArrayScopeCallsWrapperData | null = parentLexicalScopeBodyNode
|
||||
? this.stringArrayScopeCallsWrapperDataStorage.get(parentLexicalScopeBodyNode) ?? null
|
||||
): IStringArrayScopeCallsWrapperLexicalScopeData {
|
||||
const storedLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null =
|
||||
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(currentLexicalScopeBodyNode)
|
||||
?? null;
|
||||
|
||||
if (storedLexicalScopeData) {
|
||||
return storedLexicalScopeData;
|
||||
}
|
||||
|
||||
const parentLexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData | null = parentLexicalScopeBodyNode
|
||||
? this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.get(parentLexicalScopeBodyNode) ?? null
|
||||
: null;
|
||||
|
||||
const scopeIndexShift: number = this.options.stringArrayWrappersType === StringArrayWrappersType.Function
|
||||
const scopeShiftedIndex: number = this.options.stringArrayWrappersType === StringArrayWrappersType.Function
|
||||
? this.randomGenerator.getRandomInteger(
|
||||
StringArrayTransformer.minShiftedIndexValue,
|
||||
StringArrayTransformer.maxShiftedIndexValue
|
||||
)
|
||||
: 0;
|
||||
const globalIndexShift: number = parentStringArrayScopeCallsWrapperData
|
||||
? parentStringArrayScopeCallsWrapperData.globalIndexShift + scopeIndexShift
|
||||
: scopeIndexShift;
|
||||
const resultShiftedIndex: number = parentLexicalScopeData
|
||||
? parentLexicalScopeData.resultShiftedIndex + scopeShiftedIndex
|
||||
: scopeShiftedIndex;
|
||||
|
||||
return {
|
||||
globalIndexShift,
|
||||
scopeIndexShift,
|
||||
names: {},
|
||||
parentLexicalScopeNode: parentLexicalScopeBodyNode ?? null
|
||||
const lexicalScopeData: IStringArrayScopeCallsWrapperLexicalScopeData = {
|
||||
parentLexicalScopeBodyNode,
|
||||
resultShiftedIndex,
|
||||
scopeShiftedIndex
|
||||
};
|
||||
|
||||
this.stringArrayScopeCallsWrapperLexicalScopeDataStorage.set(
|
||||
currentLexicalScopeBodyNode,
|
||||
lexicalScopeData
|
||||
);
|
||||
|
||||
return lexicalScopeData;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
import { inject, injectable } from 'inversify';
|
||||
import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
|
||||
|
||||
import { TNodeWithLexicalScopeStatements } from '../../types/node/TNodeWithLexicalScopeStatements';
|
||||
|
||||
import { IOptions } from '../../interfaces/options/IOptions';
|
||||
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
|
||||
import { IStringArrayScopeCallsWrapperLexicalScopeData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeData';
|
||||
import { IStringArrayScopeCallsWrapperLexicalScopeDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperLexicalScopeDataStorage';
|
||||
|
||||
import { MapStorage } from '../MapStorage';
|
||||
|
||||
@injectable()
|
||||
export class StringArrayScopeCallsWrapperLexicalScopeDataStorage extends MapStorage <
|
||||
TNodeWithLexicalScopeStatements,
|
||||
IStringArrayScopeCallsWrapperLexicalScopeData
|
||||
> implements IStringArrayScopeCallsWrapperLexicalScopeDataStorage {
|
||||
/**
|
||||
* @param {IRandomGenerator} randomGenerator
|
||||
* @param {IOptions} options
|
||||
*/
|
||||
public constructor (
|
||||
@inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
|
||||
@inject(ServiceIdentifiers.IOptions) options: IOptions
|
||||
) {
|
||||
super(randomGenerator, options);
|
||||
}
|
||||
}
|
||||
+5
-5
@@ -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 { IOptions } from '../../interfaces/options/IOptions';
|
||||
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
|
||||
import { IStringArrayScopeCallsWrapperData } from '../../interfaces/node-transformers/string-array-transformers/IStringArrayScopeCallsWrapperData';
|
||||
import { IStringArrayScopeCallsWrapperDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperDataStorage';
|
||||
import { IStringArrayScopeCallsWrapperNamesDataStorage } from '../../interfaces/storages/string-array-transformers/IStringArrayScopeCallsWrapperNamesDataStorage';
|
||||
|
||||
import { MapStorage } from '../MapStorage';
|
||||
|
||||
@injectable()
|
||||
export class StringArrayScopeCallsWrapperDataStorage extends MapStorage <
|
||||
export class StringArrayScopeCallsWrapperNamesDataStorage extends MapStorage <
|
||||
TNodeWithLexicalScopeStatements,
|
||||
IStringArrayScopeCallsWrapperData
|
||||
> implements IStringArrayScopeCallsWrapperDataStorage {
|
||||
TStringArrayScopeCallsWrapperNamesDataByEncoding
|
||||
> implements IStringArrayScopeCallsWrapperNamesDataStorage {
|
||||
/**
|
||||
* @param {IRandomGenerator} randomGenerator
|
||||
* @param {IOptions} options
|
||||
Reference in New Issue
Block a user