Преглед на файлове

Migration from tslint on eslint #2

sanex3339 преди 5 години
родител
ревизия
7a6a35964b
променени са 60 файла, в които са добавени 189 реда и са изтрити 413 реда
  1. 55 18
      .eslintrc.js
  2. 0 0
      dist/index.browser.js
  3. 0 0
      dist/index.cli.js
  4. 0 0
      dist/index.js
  5. 4 6
      src/ASTParserFacade.ts
  6. 1 1
      src/JavaScriptObfuscatorFacade.ts
  7. 1 1
      src/analyzers/calls-graph-analyzer/callee-data-extractors/FunctionExpressionCalleeDataExtractor.ts
  8. 1 1
      src/analyzers/prevailing-kind-of-variables-analyzer/PrevailingKindOfVariablesAnalyzer.ts
  9. 1 1
      src/analyzers/scope-analyzer/ScopeAnalyzer.ts
  10. 3 3
      src/cli/JavaScriptObfuscatorCLI.ts
  11. 1 1
      src/cli/sanitizers/ArraySanitizer.ts
  12. 4 4
      src/container/InversifyContainerFacade.ts
  13. 1 1
      src/container/modules/custom-nodes/CustomNodesModule.ts
  14. 1 1
      src/container/modules/generators/GeneratorsModule.ts
  15. 1 1
      src/container/modules/node-transformers/PreparingTransformersModule.ts
  16. 1 1
      src/container/modules/storages/StoragesModule.ts
  17. 10 10
      src/custom-nodes/AbstractCustomNode.ts
  18. 18 18
      src/custom-nodes/AbstractCustomNodeGroup.ts
  19. 1 1
      src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/CallExpressionControlFlowStorageCallNode.ts
  20. 1 1
      src/custom-nodes/domain-lock-nodes/DomainLockNode.ts
  21. 4 4
      src/decorators/Initializable.ts
  22. 12 12
      src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts
  23. 1 1
      src/logger/Logger.ts
  24. 2 2
      src/node-transformers/TransformersRunner.ts
  25. 1 1
      src/node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer.ts
  26. 1 1
      src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts
  27. 8 8
      src/node-transformers/control-flow-transformers/control-flow-replacers/AbstractControlFlowReplacer.ts
  28. 1 1
      src/node-transformers/control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.ts
  29. 1 1
      src/node-transformers/control-flow-transformers/control-flow-replacers/ExpressionWithOperatorControlFlowReplacer.ts
  30. 1 1
      src/node-transformers/control-flow-transformers/control-flow-replacers/StringLiteralControlFlowReplacer.ts
  31. 1 1
      src/node-transformers/converting-transformers/MemberExpressionTransformer.ts
  32. 1 1
      src/node-transformers/converting-transformers/MethodDefinitionTransformer.ts
  33. 1 1
      src/node-transformers/converting-transformers/ObjectExpressionKeysTransformer.ts
  34. 1 1
      src/node-transformers/converting-transformers/ObjectExpressionTransformer.ts
  35. 1 1
      src/node-transformers/converting-transformers/SplitStringTransformer.ts
  36. 3 3
      src/node-transformers/converting-transformers/TemplateLiteralTransformer.ts
  37. 3 3
      src/node-transformers/converting-transformers/object-expression-extractors/ObjectExpressionToVariableDeclarationExtractor.ts
  38. 9 3
      src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts
  39. 1 1
      src/node-transformers/obfuscating-transformers/LabeledStatementTransformer.ts
  40. 2 2
      src/node-transformers/obfuscating-transformers/LiteralTransformer.ts
  41. 1 1
      src/node-transformers/obfuscating-transformers/ScopeIdentifiersTransformer.ts
  42. 3 3
      src/node-transformers/preparing-transformers/CommentsTransformer.ts
  43. 2 2
      src/node-transformers/preparing-transformers/CustomNodesTransformer.ts
  44. 3 3
      src/node-transformers/preparing-transformers/EvalCallExpressionTransformer.ts
  45. 1 1
      src/node-transformers/preparing-transformers/MetadataTransformer.ts
  46. 1 1
      src/node-transformers/preparing-transformers/ObfuscatingGuardsTransformer.ts
  47. 1 1
      src/node-transformers/preparing-transformers/ParentificationTransformer.ts
  48. 2 2
      src/node-transformers/preparing-transformers/VariablePreserveTransformer.ts
  49. 1 1
      src/node/NodeMetadata.ts
  50. 1 1
      src/node/NodeUtils.ts
  51. 2 2
      src/options/ValidationErrorsFormatter.ts
  52. 1 1
      src/options/validators/IsAllowedForObfuscationTargets.ts
  53. 1 7
      src/storages/custom-node-group/CustomNodeGroupStorage.ts
  54. 2 2
      src/templates/self-defending-nodes/self-defending-unicode-node/SelfDefendingTemplate.ts
  55. 2 2
      src/templates/string-array-nodes/string-array-calls-wrapper/SelfDefendingTemplate.ts
  56. 1 1
      src/templates/string-array-nodes/string-array-rotate-function-node/SelfDefendingTemplate.ts
  57. 1 1
      src/utils/ArrayUtils.ts
  58. 2 2
      src/utils/CryptUtils.ts
  59. 1 1
      src/utils/NodeTransformerNamesGroupsBuilder.ts
  60. 0 259
      tslint.json

+ 55 - 18
.eslintrc.js

@@ -18,18 +18,42 @@ module.exports = {
     ],
     "rules": {
         "@typescript-eslint/adjacent-overload-signatures": "error",
-        "@typescript-eslint/array-type": "error",
+        "@typescript-eslint/array-type": [
+            "error",
+            {
+                "default": "array"
+            }
+        ],
         "@typescript-eslint/await-thenable": "error",
+        "@typescript-eslint/ban-ts-comment": "error",
         "@typescript-eslint/ban-types": "error",
+        "@typescript-eslint/brace-style": [
+            "error",
+            "1tbs",
+            {
+                "allowSingleLine": true
+            }
+        ],
+        "@typescript-eslint/camelcase": "off",
         "@typescript-eslint/class-name-casing": "error",
-        "@typescript-eslint/consistent-type-assertions": "off",
+        "@typescript-eslint/comma-spacing": "error",
+        "@typescript-eslint/consistent-type-assertions": [
+            "error",
+            {
+                "assertionStyle": "angle-bracket"
+            }
+        ],
         "@typescript-eslint/consistent-type-definitions": "error",
+        "@typescript-eslint/default-param-last": "error",
+        "@typescript-eslint/explicit-function-return-type": "error",
         "@typescript-eslint/explicit-member-accessibility": [
             "error",
             {
                 "accessibility": "explicit"
             }
         ],
+        "@typescript-eslint/explicit-module-boundary-types": "error",
+        "@typescript-eslint/func-call-spacing": "error",
         "@typescript-eslint/indent": [
             "off",
             4
@@ -51,15 +75,18 @@ module.exports = {
                 }
             }
         ],
-        "@typescript-eslint/member-ordering": "off",
+        "@typescript-eslint/member-ordering": "error",
         "@typescript-eslint/no-empty-function": "off",
         "@typescript-eslint/no-empty-interface": "error",
         "@typescript-eslint/no-explicit-any": "off",
+        "@typescript-eslint/no-extra-parens": "off",
         "@typescript-eslint/no-floating-promises": "error",
         "@typescript-eslint/no-for-in-array": "error",
         "@typescript-eslint/no-inferrable-types": "off",
+        "@typescript-eslint/no-magic-numbers": "off",
         "@typescript-eslint/no-misused-new": "error",
         "@typescript-eslint/no-namespace": "error",
+        "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
         "@typescript-eslint/no-non-null-assertion": "error",
         "@typescript-eslint/no-param-reassign": "off",
         "@typescript-eslint/no-parameter-properties": "error",
@@ -68,33 +95,41 @@ module.exports = {
         "@typescript-eslint/no-unnecessary-qualifier": "error",
         "@typescript-eslint/no-unnecessary-type-arguments": "error",
         "@typescript-eslint/no-unnecessary-type-assertion": "error",
+        "@typescript-eslint/no-unused-expressions": "error",
         "@typescript-eslint/no-use-before-define": "off",
         "@typescript-eslint/no-var-requires": "error",
         "@typescript-eslint/prefer-for-of": "error",
         "@typescript-eslint/prefer-function-type": "error",
         "@typescript-eslint/prefer-namespace-keyword": "error",
+        "@typescript-eslint/prefer-nullish-coalescing": "error",
+        "@typescript-eslint/prefer-optional-chain": "error",
         "@typescript-eslint/prefer-readonly": "error",
         "@typescript-eslint/promise-function-async": "error",
-        "@typescript-eslint/quotes": "off",
+        "@typescript-eslint/quotes": [
+            "error",
+            "single"
+        ],
+        "@typescript-eslint/require-array-sort-compare": "error",
         "@typescript-eslint/restrict-plus-operands": "error",
         "@typescript-eslint/semi": [
             "error",
             "always"
         ],
+        "@typescript-eslint/space-before-function-paren": "error",
         "@typescript-eslint/strict-boolean-expressions": "off",
         "@typescript-eslint/triple-slash-reference": "error",
         "@typescript-eslint/type-annotation-spacing": "error",
+        "@typescript-eslint/typedef": "error",
         "@typescript-eslint/unified-signatures": "error",
         "arrow-body-style": "off",
         "arrow-parens": [
             "off",
             "as-needed"
         ],
-        "camelcase": "off",
-        "capitalized-comments": [
-            "off"
-        ],
+        "brace-style": "off",
+        "capitalized-comments": "off",
         "comma-dangle": "off",
+        "comma-spacing": "off",
         "complexity": [
             "error",
             {
@@ -110,17 +145,17 @@ module.exports = {
             "error",
             "smart"
         ],
+        "func-call-spacing": "off",
         "guard-for-in": "error",
         "id-blacklist": "off",
         "id-match": "off",
         "import/no-default-export": "error",
-        "import/no-deprecated": "off",
-        "import/no-extraneous-dependencies": "off",
+        "import/no-deprecated": "error",
+        "import/no-extraneous-dependencies": "error",
         "import/no-internal-modules": "error",
         "import/no-unassigned-import": "off",
-        "import/order": [
-            "off"
-        ],
+        "import/order": "off",
+        "indent": "off",
         "jsdoc/no-types": "off",
         "linebreak-style": "error",
         "max-classes-per-file": [
@@ -171,13 +206,14 @@ module.exports = {
         "no-empty": "off",
         "no-eval": "off",
         "no-extra-bind": "error",
+        "no-extra-parens": "off",
         "no-extra-semi": "error",
-        "no-fallthrough": "off",
+        "no-fallthrough": "error",
         "no-invalid-regexp": "error",
         "no-invalid-this": "off",
         "no-irregular-whitespace": "error",
         "no-magic-numbers": "off",
-        "no-multi-str": "off",
+        "no-multi-str": "error",
         "no-multiple-empty-lines": "error",
         "no-new-wrappers": "error",
         "no-null/no-null": "off",
@@ -228,14 +264,15 @@ module.exports = {
         ],
         "prefer-arrow/prefer-arrow-functions": "off",
         "prefer-const": "error",
-        "prefer-object-spread": "off",
+        "prefer-object-spread": "error",
         "prefer-template": "error",
         "quote-props": [
             "error",
             "as-needed"
         ],
+        "quotes": "off",
         "radix": "error",
-        "space-before-function-paren": "error",
+        "space-before-function-paren": "off",
         "spaced-comment": "error",
         "space-in-parens": [
             "error",
@@ -254,7 +291,7 @@ module.exports = {
         "unicorn/prefer-starts-ends-with": "error",
         "unicorn/prefer-trim-start-end": "error",
         "use-isnan": "error",
-        "valid-typeof": "off",
+        "valid-typeof": "error",
         "yoda": "error"
     }
 };

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/index.browser.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/index.cli.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/index.js


+ 4 - 6
src/ASTParserFacade.ts

@@ -51,7 +51,7 @@ export class ASTParserFacade {
             }
         }
 
-        throw new Error(`Acorn parsing error`);
+        throw new Error('Acorn parsing error');
     }
 
     /**
@@ -73,11 +73,9 @@ export class ASTParserFacade {
             sourceType
         };
 
-        const program: ESTree.Program = (
-            <any>acorn
-                .Parser.extend(acornImportMeta)
-                .parse(sourceCode, config)
-        );
+        const program: ESTree.Program = <any>acorn
+            .Parser.extend(acornImportMeta)
+            .parse(sourceCode, config);
 
         if (comments.length) {
             program.comments = comments;

+ 1 - 1
src/JavaScriptObfuscatorFacade.ts

@@ -14,7 +14,7 @@ class JavaScriptObfuscatorFacade {
     /**
      * @type {string | undefined}
      */
-    public static version: string = process.env.VERSION || 'unknown';
+    public static version: string = process.env.VERSION ?? 'unknown';
 
     /**
      * @param {string} sourceCode

+ 1 - 1
src/analyzers/calls-graph-analyzer/callee-data-extractors/FunctionExpressionCalleeDataExtractor.ts

@@ -36,7 +36,7 @@ export class FunctionExpressionCalleeDataExtractor extends AbstractCalleeDataExt
 
         return {
             callee: calleeBlockStatement,
-            name: callee.name || null
+            name: callee.name ?? null
         };
     }
 

+ 1 - 1
src/analyzers/prevailing-kind-of-variables-analyzer/PrevailingKindOfVariablesAnalyzer.ts

@@ -49,7 +49,7 @@ export class PrevailingKindOfVariablesAnalyzer implements IPrevailingKindOfVaria
         });
 
         this.prevailingKindOfVariables = this.arrayUtils.findMostOccurringElement(variableKinds)
-            || PrevailingKindOfVariablesAnalyzer.defaultKindOfVariables;
+            ?? PrevailingKindOfVariablesAnalyzer.defaultKindOfVariables;
     }
 
     /**

+ 1 - 1
src/analyzers/scope-analyzer/ScopeAnalyzer.ts

@@ -92,7 +92,7 @@ export class ScopeAnalyzer implements IScopeAnalyzer {
             }
         }
 
-        throw new Error(`Scope analyzing error`);
+        throw new Error('Scope analyzing error');
     }
 
     /**

+ 3 - 3
src/cli/JavaScriptObfuscatorCLI.ts

@@ -123,7 +123,7 @@ export class JavaScriptObfuscatorCLI implements IInitializable {
     ): void {
         const outputSourceMapPath: string = CLIUtils.getOutputSourceMapPath(
             outputCodePath,
-            options.sourceMapFileName || ''
+            options.sourceMapFileName ?? ''
         );
 
         options = {
@@ -189,7 +189,7 @@ export class JavaScriptObfuscatorCLI implements IInitializable {
         this.commands
             .usage('<inputPath> [options]')
             .version(
-                process.env.VERSION || 'unknown',
+                process.env.VERSION ?? 'unknown',
                 '-v, --version'
             )
             .option(
@@ -416,7 +416,7 @@ export class JavaScriptObfuscatorCLI implements IInitializable {
 
         if (sourceCodeIndex !== null) {
             const baseIdentifiersPrefix: string = this.inputCLIOptions.identifiersPrefix
-                || JavaScriptObfuscatorCLI.baseIdentifiersPrefix;
+                ?? JavaScriptObfuscatorCLI.baseIdentifiersPrefix;
             const identifiersPrefix: string = `${baseIdentifiersPrefix}${sourceCodeIndex}`;
 
             options = {

+ 1 - 1
src/cli/sanitizers/ArraySanitizer.ts

@@ -6,7 +6,7 @@ import { TCLISanitizer } from '../../types/cli/TCLISanitizer';
  */
 export const ArraySanitizer: TCLISanitizer <string[]> = (value: string): string[] => {
     if (value.endsWith(',')) {
-        throw new SyntaxError(`Multiple <list> values should be wrapped inside quotes: --option-name 'value1','value2'`);
+        throw new SyntaxError('Multiple <list> values should be wrapped inside quotes: --option-name \'value1\',\'value2\'');
     }
 
     return value.split(',').map((string: string) => string.trim());

+ 4 - 4
src/container/InversifyContainerFacade.ts

@@ -49,7 +49,7 @@ export class InversifyContainerFacade implements IInversifyContainerFacade {
         serviceIdentifier: interfaces.ServiceIdentifier<U>
     ): (context: interfaces.Context) => (bindingName: T) => U {
         return (context: interfaces.Context): (bindingName: T) => U => {
-            return (bindingName: T) => {
+            return (bindingName: T): U => {
                 return context.container.getNamed<U>(serviceIdentifier, bindingName);
             };
         };
@@ -65,7 +65,7 @@ export class InversifyContainerFacade implements IInversifyContainerFacade {
         return (context: interfaces.Context): (bindingName: T) => U => {
             const cache: Map <T, U> = new Map();
 
-            return (bindingName: T) => {
+            return (bindingName: T): U => {
                 if (cache.has(bindingName)) {
                     return <U>cache.get(bindingName);
                 }
@@ -92,7 +92,7 @@ export class InversifyContainerFacade implements IInversifyContainerFacade {
             const cache: Map<T, interfaces.Newable<U>> = new Map();
             const cachedDependencies: Record<string, any>[] = [];
 
-            return (bindingName: T) => {
+            return (bindingName: T): U => {
                 dependencies.forEach((
                     dependency: interfaces.ServiceIdentifier<interfaces.Newable<Record<string, any>>>,
                     index: number
@@ -174,7 +174,7 @@ export class InversifyContainerFacade implements IInversifyContainerFacade {
         this.container
             .bind<IObfuscatedCode>(ServiceIdentifiers.Factory__IObfuscatedCode)
             .toFactory<IObfuscatedCode>((context: interfaces.Context) => {
-                return (obfuscatedCodeAsString: string, sourceMapAsString: string) => {
+                return (obfuscatedCodeAsString: string, sourceMapAsString: string): IObfuscatedCode => {
                     const obfuscatedCode: IObfuscatedCode = context.container
                         .get<IObfuscatedCode>(ServiceIdentifiers.IObfuscatedCode);
 

+ 1 - 1
src/container/modules/custom-nodes/CustomNodesModule.ts

@@ -6,7 +6,7 @@ import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
 import { ICustomNodeFormatter } from '../../../interfaces/custom-nodes/ICustomNodeFormatter';
 import { ICustomNodeGroup } from '../../../interfaces/custom-nodes/ICustomNodeGroup';
 
-import { ControlFlowCustomNode } from "../../../enums/custom-nodes/ControlFlowCustomNode";
+import { ControlFlowCustomNode } from '../../../enums/custom-nodes/ControlFlowCustomNode';
 import { CustomNode } from '../../../enums/custom-nodes/CustomNode';
 import { CustomNodeGroup } from '../../../enums/custom-nodes/CustomNodeGroup';
 import { DeadCodeInjectionCustomNode } from '../../../enums/custom-nodes/DeadCodeInjectionCustomNode';

+ 1 - 1
src/container/modules/generators/GeneratorsModule.ts

@@ -31,7 +31,7 @@ export const generatorsModule: interfaces.ContainerModule = new ContainerModule(
     function identifierNameGeneratorFactory (): (context: interfaces.Context) => (options: IOptions) => IIdentifierNamesGenerator {
         let cachedIdentifierNamesGenerator: IIdentifierNamesGenerator | null = null;
 
-        return (context: interfaces.Context): (options: IOptions) => IIdentifierNamesGenerator => (options: IOptions) => {
+        return (context: interfaces.Context): (options: IOptions) => IIdentifierNamesGenerator => (options: IOptions): IIdentifierNamesGenerator => {
             if (cachedIdentifierNamesGenerator) {
                 return cachedIdentifierNamesGenerator;
             }

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

@@ -17,7 +17,7 @@ import { MetadataTransformer } from '../../../node-transformers/preparing-transf
 import { ObfuscatingGuardsTransformer } from '../../../node-transformers/preparing-transformers/ObfuscatingGuardsTransformer';
 import { ParentificationTransformer } from '../../../node-transformers/preparing-transformers/ParentificationTransformer';
 import { ReservedStringObfuscatingGuard } from '../../../node-transformers/preparing-transformers/obfuscating-guards/ReservedStringObfuscatingGuard';
-import { VariablePreserveTransformer } from "../../../node-transformers/preparing-transformers/VariablePreserveTransformer";
+import { VariablePreserveTransformer } from '../../../node-transformers/preparing-transformers/VariablePreserveTransformer';
 
 export const preparingTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => {
     // preparing transformers

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

@@ -28,7 +28,7 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b
     // controlFlowStorage factory
     bind<TControlFlowStorage>(ServiceIdentifiers.Factory__TControlFlowStorage)
         .toFactory<TControlFlowStorage>((context: interfaces.Context) => {
-            return () => {
+            return (): TControlFlowStorage => {
                 const constructor: interfaces.Newable<TControlFlowStorage> = context.container
                     .get<interfaces.Newable<TControlFlowStorage>>(ServiceIdentifiers.Newable__TControlFlowStorage);
                 const randomGenerator: IRandomGenerator = context.container

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

@@ -69,11 +69,6 @@ export abstract class AbstractCustomNode <
         this.options = options;
     }
 
-    /**
-     * @param {TInitialData} args
-     */
-    public abstract initialize (...args: TInitialData): void;
-
     /**
      * @returns {TStatement[]}
      */
@@ -98,15 +93,20 @@ export abstract class AbstractCustomNode <
             .pickone(AbstractCustomNode.globalVariableTemplateFunctions);
     }
 
-    /**
-     * @returns {TStatement[]}
-     */
-    protected abstract getNodeStructure (nodeTemplate: string): TStatement[];
-
     /**
      * @returns {string}
      */
     protected getNodeTemplate (): string {
         return '';
     }
+
+    /**
+     * @param {TInitialData} args
+     */
+    public abstract initialize (...args: TInitialData): void;
+
+    /**
+     * @returns {TStatement[]}
+     */
+    protected abstract getNodeStructure (nodeTemplate: string): TStatement[];
 }

+ 18 - 18
src/custom-nodes/AbstractCustomNodeGroup.ts

@@ -16,16 +16,6 @@ import { ObfuscationEvent } from '../enums/event-emitters/ObfuscationEvent';
 
 @injectable()
 export abstract class AbstractCustomNodeGroup implements ICustomNodeGroup {
-    /**
-     * @type {ObfuscationEvent}
-     */
-    protected abstract readonly appendEvent: ObfuscationEvent;
-
-    /**
-     * @type {Map<CustomNode, ICustomNode>}
-     */
-    protected abstract customNodes: Map <CustomNode, ICustomNode>;
-
     /**
      * @type {IIdentifierNamesGenerator}
      */
@@ -41,6 +31,16 @@ export abstract class AbstractCustomNodeGroup implements ICustomNodeGroup {
      */
     protected readonly randomGenerator: IRandomGenerator;
 
+    /**
+     * @type {ObfuscationEvent}
+     */
+    protected abstract readonly appendEvent: ObfuscationEvent;
+
+    /**
+     * @type {Map<CustomNode, ICustomNode>}
+     */
+    protected abstract customNodes: Map <CustomNode, ICustomNode>;
+
     /**
      * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
      * @param {IRandomGenerator} randomGenerator
@@ -57,12 +57,6 @@ export abstract class AbstractCustomNodeGroup implements ICustomNodeGroup {
         this.options = options;
     }
 
-    /**
-     * @param {TNodeWithStatements} nodeWithStatements
-     * @param {ICallsGraphData[]} callsGraphData
-     */
-    public abstract appendCustomNodes (nodeWithStatements: TNodeWithStatements, callsGraphData: ICallsGraphData[]): void;
-
     /**
      * @returns {ObfuscationEvent}
      */
@@ -77,8 +71,6 @@ export abstract class AbstractCustomNodeGroup implements ICustomNodeGroup {
         return this.customNodes;
     }
 
-    public abstract initialize (): void;
-
     /**
      * @param {CustomNode} customNodeName
      * @param {callback} callback
@@ -100,4 +92,12 @@ export abstract class AbstractCustomNodeGroup implements ICustomNodeGroup {
     protected getRandomCallsGraphIndex (callsGraphLength: number): number {
         return this.randomGenerator.getRandomInteger(0, Math.max(0, Math.round(callsGraphLength - 1)));
     }
+
+    /**
+     * @param {TNodeWithStatements} nodeWithStatements
+     * @param {ICallsGraphData[]} callsGraphData
+     */
+    public abstract appendCustomNodes (nodeWithStatements: TNodeWithStatements, callsGraphData: ICallsGraphData[]): void;
+
+    public abstract initialize (): void;
 }

+ 1 - 1
src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/CallExpressionControlFlowStorageCallNode.ts

@@ -7,7 +7,7 @@ import { TIdentifierNamesGeneratorFactory } from '../../../types/container/gener
 import { TStatement } from '../../../types/node/TStatement';
 
 import { IOptions } from '../../../interfaces/options/IOptions';
-import { IRandomGenerator } from "../../../interfaces/utils/IRandomGenerator";
+import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator';
 import { ICustomNodeFormatter } from '../../../interfaces/custom-nodes/ICustomNodeFormatter';
 
 import { initializable } from '../../../decorators/Initializable';

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

@@ -82,7 +82,7 @@ export class DomainLockNode extends AbstractCustomNode {
 
         return this.customNodeFormatter.formatTemplate(DomainLockNodeTemplate(), {
             domainLockFunctionName: this.identifierNamesGenerator.generate(),
-            diff: diff,
+            diff,
             domains: hiddenDomainsString,
             globalVariableTemplate,
             singleNodeCallControllerFunctionName: this.callsControllerFunctionName

+ 4 - 4
src/decorators/Initializable.ts

@@ -90,12 +90,12 @@ function wrapTargetMethodsInInitializedCheck (target: IInitializable, initialize
         }
 
         const methodDescriptor: PropertyDescriptor = Object
-            .getOwnPropertyDescriptor(target, propertyName) || defaultDescriptor;
+            .getOwnPropertyDescriptor(target, propertyName) ?? defaultDescriptor;
         const originalMethod: Function = methodDescriptor.value;
 
         Object.defineProperty(target, propertyName, {
             ...methodDescriptor,
-            value: function (): void {
+            value (): void {
                 if (!Reflect.getMetadata(initializedTargetMetadataKey, this)) {
                     throw new Error(`Class should be initialized with \`${initializeMethodName}()\` method`);
                 }
@@ -121,7 +121,7 @@ function wrapInitializeMethodInInitializeCheck (
     propertyKey: string | symbol
 ): void {
     const methodDescriptor: PropertyDescriptor = Object
-        .getOwnPropertyDescriptor(target, initializeMethodName) || defaultDescriptor;
+        .getOwnPropertyDescriptor(target, initializeMethodName) ?? defaultDescriptor;
     const originalMethod: Function = methodDescriptor.value;
 
     Object.defineProperty(target, initializeMethodName, {
@@ -157,7 +157,7 @@ function wrapInitializableProperty (target: IInitializable, propertyKey: string
 
     const initializablePropertyMetadataKey: string = `_${propertyKey.toString()}`;
     const propertyDescriptor: PropertyDescriptor = Object
-            .getOwnPropertyDescriptor(target, initializablePropertyMetadataKey) || defaultDescriptor;
+            .getOwnPropertyDescriptor(target, initializablePropertyMetadataKey) ?? defaultDescriptor;
 
     Object.defineProperty(target, propertyKey, {
         ...propertyDescriptor,

+ 12 - 12
src/generators/identifier-names-generators/AbstractIdentifierNamesGenerator.ts

@@ -34,18 +34,6 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam
         this.options = options;
     }
 
-    /**
-     * @param {number} nameLength
-     * @returns {string}
-     */
-    public abstract generate (nameLength?: number): string;
-
-    /**
-     * @param {number} nameLength
-     * @returns {string}
-     */
-    public abstract generateWithPrefix (nameLength?: number): string;
-
     /**
      * @param {string} name
      * @returns {void}
@@ -74,4 +62,16 @@ export abstract class AbstractIdentifierNamesGenerator implements IIdentifierNam
             : true;
 
     }
+
+    /**
+     * @param {number} nameLength
+     * @returns {string}
+     */
+    public abstract generate (nameLength?: number): string;
+
+    /**
+     * @param {number} nameLength
+     * @returns {string}
+     */
+    public abstract generateWithPrefix (nameLength?: number): string;
 }

+ 1 - 1
src/logger/Logger.ts

@@ -54,7 +54,7 @@ export class Logger implements ILogger {
     ): void {
         const processedMessage: string = loggingLevelColor(`\n${loggingPrefix} ${loggingMessage}`);
 
-        console.log(processedMessage, value || '');
+        console.log(processedMessage, value ?? '');
     }
 
     /**

+ 2 - 2
src/node-transformers/TransformersRunner.ts

@@ -142,10 +142,10 @@ export class TransformersRunner implements ITransformersRunner {
         const visitorsLength: number = visitors.length;
 
         if (!visitorsLength) {
-            return (node: ESTree.Node, parentNode: ESTree.Node | null) => node;
+            return (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node => node;
         }
 
-        return (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+        return (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | estraverse.VisitorOption => {
             if (NodeMetadata.isIgnoredNode(node)) {
                 return estraverse.VisitorOption.Skip;
             }

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

@@ -104,7 +104,7 @@ export class BlockStatementControlFlowTransformer extends AbstractNodeTransforme
         switch (transformationStage) {
             case TransformationStage.ControlFlowFlattening:
                 return {
-                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && NodeGuards.isBlockStatementNode(node)) {
                             return this.transformNode(node, parentNode);
                         }

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

@@ -113,7 +113,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.ControlFlowFlattening:
                 return {
-                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (
                             parentNode && (
                                 NodeGuards.isFunctionDeclarationNode(node) ||

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

@@ -69,14 +69,6 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace
         return storageKeysById;
     }
 
-    /**
-     * @param {Node} node
-     * @param {Node} parentNode
-     * @param {TControlFlowStorage} controlFlowStorage
-     * @returns {Node}
-     */
-    public abstract replace (node: ESTree.Node, parentNode: ESTree.Node, controlFlowStorage: TControlFlowStorage): ESTree.Node;
-
     /**
      * @param {ICustomNode} customNode
      * @param {TControlFlowStorage} controlFlowStorage
@@ -120,4 +112,12 @@ export abstract class AbstractControlFlowReplacer implements IControlFlowReplace
 
         return storageKey;
     }
+
+    /**
+     * @param {Node} node
+     * @param {Node} parentNode
+     * @param {TControlFlowStorage} controlFlowStorage
+     * @returns {Node}
+     */
+    public abstract replace (node: ESTree.Node, parentNode: ESTree.Node, controlFlowStorage: TControlFlowStorage): ESTree.Node;
 }

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

@@ -100,7 +100,7 @@ export class CallExpressionControlFlowReplacer extends AbstractControlFlowReplac
         const statementNode: TStatement = controlFlowStorageCallCustomNode.getNode()[0];
 
         if (!statementNode || !NodeGuards.isExpressionStatementNode(statementNode)) {
-            throw new Error(`\`controlFlowStorageCallCustomNode.getNode()[0]\` should returns array with \`ExpressionStatement\` node`);
+            throw new Error('`controlFlowStorageCallCustomNode.getNode()[0]` should returns array with `ExpressionStatement` node');
         }
 
         return statementNode.expression;

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

@@ -54,7 +54,7 @@ export abstract class ExpressionWithOperatorControlFlowReplacer extends Abstract
         const statementNode: TStatement = controlFlowStorageCallCustomNode.getNode()[0];
 
         if (!statementNode || !NodeGuards.isExpressionStatementNode(statementNode)) {
-            throw new Error(`\`controlFlowStorageCallCustomNode.getNode()[0]\` should returns array with \`ExpressionStatement\` node`);
+            throw new Error('`controlFlowStorageCallCustomNode.getNode()[0]` should returns array with `ExpressionStatement` node');
         }
 
         return statementNode.expression;

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

@@ -92,7 +92,7 @@ export class StringLiteralControlFlowReplacer extends AbstractControlFlowReplace
         const statementNode: TStatement = controlFlowStorageCallCustomNode.getNode()[0];
 
         if (!statementNode || !NodeGuards.isExpressionStatementNode(statementNode)) {
-            throw new Error(`\`controlFlowStorageCallCustomNode.getNode()[0]\` should returns array with \`ExpressionStatement\` node`);
+            throw new Error('`controlFlowStorageCallCustomNode.getNode()[0]` should returns array with `ExpressionStatement` node');
         }
 
         return statementNode.expression;

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

@@ -34,7 +34,7 @@ export class MemberExpressionTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Converting:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && NodeGuards.isMemberExpressionNode(node)) {
                             return this.transformNode(node, parentNode);
                         }

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

@@ -51,7 +51,7 @@ export class MethodDefinitionTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Converting:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && NodeGuards.isMethodDefinitionNode(node)) {
                             return this.transformNode(node, parentNode);
                         }

+ 1 - 1
src/node-transformers/converting-transformers/ObjectExpressionKeysTransformer.ts

@@ -122,7 +122,7 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Converting:
                 return {
-                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (
                             parentNode
                             && NodeGuards.isObjectExpressionNode(node)

+ 1 - 1
src/node-transformers/converting-transformers/ObjectExpressionTransformer.ts

@@ -41,7 +41,7 @@ export class ObjectExpressionTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Converting:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && NodeGuards.isObjectExpressionNode(node)) {
                             return this.transformNode(node, parentNode);
                         }

+ 1 - 1
src/node-transformers/converting-transformers/SplitStringTransformer.ts

@@ -76,7 +76,7 @@ export class SplitStringTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Converting:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (!this.options.splitStrings) {
                             return;
                         }

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

@@ -35,8 +35,8 @@ export class TemplateLiteralTransformer extends AbstractNodeTransformer {
      * @param {NodeGuards} node
      * @returns {boolean}
      */
-    private static isLiteralNodeWithStringValue (node: ESTree.Node): boolean {
-        return node && NodeGuards.isLiteralNode(node) && typeof node.value === 'string';
+    private static isLiteralNodeWithStringValue (node: ESTree.Node | undefined): boolean {
+        return !!node && NodeGuards.isLiteralNode(node) && typeof node.value === 'string';
     }
 
     /**
@@ -56,7 +56,7 @@ export class TemplateLiteralTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Converting:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && TemplateLiteralTransformer.isValidTemplateLiteralNode(node, parentNode)) {
                             return this.transformNode(node, parentNode);
                         }

+ 3 - 3
src/node-transformers/converting-transformers/object-expression-extractors/ObjectExpressionToVariableDeclarationExtractor.ts

@@ -112,7 +112,7 @@ export class ObjectExpressionToVariableDeclarationExtractor implements IObjectEx
             !statementNode
             || !NodeGuards.isVariableDeclarationNode(statementNode)
         ) {
-            throw new Error(`\`objectExpressionHostCustomNode.getNode()[0]\` should returns array with \`VariableDeclaration\` node`);
+            throw new Error('`objectExpressionHostCustomNode.getNode()[0]` should returns array with `VariableDeclaration` node');
         }
 
         return statementNode;
@@ -126,7 +126,7 @@ export class ObjectExpressionToVariableDeclarationExtractor implements IObjectEx
         const newObjectExpressionIdentifierNode: ESTree.Pattern = objectExpressionHostNode.declarations[0].id;
 
         if (!NodeGuards.isIdentifierNode(newObjectExpressionIdentifierNode)) {
-            throw new Error(`\`objectExpressionHostNode\` should contain \`VariableDeclarator\` node with \`Identifier\` id property`);
+            throw new Error('`objectExpressionHostNode` should contain `VariableDeclarator` node with `Identifier` id property');
         }
 
         return newObjectExpressionIdentifierNode;
@@ -140,7 +140,7 @@ export class ObjectExpressionToVariableDeclarationExtractor implements IObjectEx
         const newObjectExpressionNode: ESTree.Expression | null = objectExpressionHostNode.declarations[0].init ?? null;
 
         if (!newObjectExpressionNode || !NodeGuards.isObjectExpressionNode(newObjectExpressionNode)) {
-            throw new Error(`\`objectExpressionHostNode\` should contain \`VariableDeclarator\` node with \`ObjectExpression\` init property`);
+            throw new Error('`objectExpressionHostNode` should contain `VariableDeclarator` node with `ObjectExpression` init property');
         }
 
         return newObjectExpressionNode;

+ 9 - 3
src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts

@@ -216,14 +216,17 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.DeadCodeInjection:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && NodeGuards.isProgramNode(node)) {
                             this.analyzeNode(node, parentNode);
 
                             return node;
                         }
                     },
-                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    leave: (
+                        node: ESTree.Node,
+                        parentNode: ESTree.Node | null
+                    ): ESTree.Node | estraverse.VisitorOption | undefined => {
                         if (parentNode && NodeGuards.isBlockStatementNode(node)) {
                             return this.transformNode(node, parentNode);
                         }
@@ -236,7 +239,10 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer {
                 }
 
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (
+                        node: ESTree.Node,
+                        parentNode: ESTree.Node | null
+                    ): ESTree.Node | estraverse.VisitorOption |undefined => {
                         if (parentNode && this.isDeadCodeInjectionRootAstHostNode(node)) {
                             return this.restoreNode(node, parentNode);
                         }

+ 1 - 1
src/node-transformers/obfuscating-transformers/LabeledStatementTransformer.ts

@@ -68,7 +68,7 @@ export class LabeledStatementTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Obfuscating:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && NodeGuards.isLabeledStatementNode(node)) {
                             return this.transformNode(node, parentNode);
                         }

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

@@ -68,7 +68,7 @@ export class LiteralTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Obfuscating:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (NodeGuards.isProgramNode(node)) {
                             this.analyzeNode(node);
                         }
@@ -81,7 +81,7 @@ export class LiteralTransformer extends AbstractNodeTransformer {
 
             case TransformationStage.Finalizing:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && NodeGuards.isLiteralNode(node)) {
                             return this.encodeLiteralNodeToEscapeSequence(node, parentNode);
                         }

+ 1 - 1
src/node-transformers/obfuscating-transformers/ScopeIdentifiersTransformer.ts

@@ -83,7 +83,7 @@ export class ScopeIdentifiersTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Obfuscating:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && NodeGuards.isProgramNode(node)) {
                             this.analyzeNode(node, parentNode);
 

+ 3 - 3
src/node-transformers/preparing-transformers/CommentsTransformer.ts

@@ -2,7 +2,7 @@ import { inject, injectable, } from 'inversify';
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import * as ESTree from 'estree';
-import * as estraverse from "estraverse";
+import * as estraverse from 'estraverse';
 
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
@@ -12,7 +12,7 @@ import { TransformationStage } from '../../enums/node-transformers/Transformatio
 
 import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
 import { NodeGuards } from '../../node/NodeGuards';
-import { ConditionalCommentObfuscatingGuard } from "./obfuscating-guards/ConditionalCommentObfuscatingGuard";
+import { ConditionalCommentObfuscatingGuard } from './obfuscating-guards/ConditionalCommentObfuscatingGuard';
 
 @injectable()
 export class CommentsTransformer extends AbstractNodeTransformer {
@@ -43,7 +43,7 @@ export class CommentsTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Initializing:
                 return {
-                    leave: (node: ESTree.Node) => {
+                    leave: (node: ESTree.Node): ESTree.Node | undefined => {
                         if (NodeGuards.isProgramNode(node)) {
                             return this.transformNode(node);
                         }

+ 2 - 2
src/node-transformers/preparing-transformers/CustomNodesTransformer.ts

@@ -83,7 +83,7 @@ export class CustomNodesTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Preparing:
                 return {
-                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (NodeGuards.isProgramNode(node)) {
                             this.analyzeNode(node, parentNode);
                             this.appendCustomNodesBeforeObfuscation(node, parentNode);
@@ -95,7 +95,7 @@ export class CustomNodesTransformer extends AbstractNodeTransformer {
 
             case TransformationStage.Finalizing:
                 return {
-                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null): void => {
                         if (NodeGuards.isProgramNode(node)) {
                             this.appendCustomNodesAfterObfuscation(node, parentNode);
                         }

+ 3 - 3
src/node-transformers/preparing-transformers/EvalCallExpressionTransformer.ts

@@ -82,7 +82,7 @@ export class EvalCallExpressionTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Preparing:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (
                             parentNode
                             && NodeGuards.isCallExpressionNode(node)
@@ -100,7 +100,7 @@ export class EvalCallExpressionTransformer extends AbstractNodeTransformer {
                 }
 
                 return {
-                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    leave: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (parentNode && this.isEvalRootAstHostNode(node)) {
                             return this.restoreNode(node, parentNode);
                         }
@@ -118,7 +118,7 @@ export class EvalCallExpressionTransformer extends AbstractNodeTransformer {
      * @returns {Node}
      */
     public transformNode (callExpressionNode: ESTree.CallExpression, parentNode: ESTree.Node): ESTree.Node {
-        const callExpressionFirstArgument: ESTree.Expression | ESTree.SpreadElement = callExpressionNode.arguments[0];
+        const callExpressionFirstArgument: ESTree.Expression | ESTree.SpreadElement | undefined = callExpressionNode.arguments[0];
 
         if (!callExpressionFirstArgument) {
             return callExpressionNode;

+ 1 - 1
src/node-transformers/preparing-transformers/MetadataTransformer.ts

@@ -37,7 +37,7 @@ export class MetadataTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Preparing:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         return this.transformNode(node, parentNode);
                     }
                 };

+ 1 - 1
src/node-transformers/preparing-transformers/ObfuscatingGuardsTransformer.ts

@@ -58,7 +58,7 @@ export class ObfuscatingGuardsTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Preparing:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         return this.transformNode(node, parentNode);
                     }
                 };

+ 1 - 1
src/node-transformers/preparing-transformers/ParentificationTransformer.ts

@@ -36,7 +36,7 @@ export class ParentificationTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Preparing:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         return this.transformNode(node, parentNode);
                     }
                 };

+ 2 - 2
src/node-transformers/preparing-transformers/VariablePreserveTransformer.ts

@@ -7,7 +7,7 @@ import { IIdentifierObfuscatingReplacer } from '../../interfaces/node-transforme
 import { IOptions } from '../../interfaces/options/IOptions';
 import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
 import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
-import { IdentifierObfuscatingReplacer } from "../../enums/node-transformers/obfuscating-transformers/obfuscating-replacers/IdentifierObfuscatingReplacer";
+import { IdentifierObfuscatingReplacer } from '../../enums/node-transformers/obfuscating-transformers/obfuscating-replacers/IdentifierObfuscatingReplacer';
 
 import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 import { TransformationStage } from '../../enums/node-transformers/TransformationStage';
@@ -51,7 +51,7 @@ export class VariablePreserveTransformer extends AbstractNodeTransformer {
         switch (transformationStage) {
             case TransformationStage.Preparing:
                 return {
-                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
+                    enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
                         if (
                             NodeGuards.isIdentifierNode(node)
                             && parentNode

+ 1 - 1
src/node/NodeMetadata.ts

@@ -6,7 +6,7 @@ export class NodeMetadata {
      * @param {Partial<T["metadata"]>} metadata
      */
     public static set <T extends ESTree.Node = ESTree.Node> (node: T, metadata: Partial<T['metadata']>): void {
-        node.metadata = Object.assign(node.metadata || {}, metadata);
+        node.metadata = Object.assign(node.metadata ?? {}, metadata);
     }
 
     /**

+ 1 - 1
src/node/NodeUtils.ts

@@ -102,7 +102,7 @@ export class NodeUtils {
      * @returns {T}
      */
     public static parentizeNode <T extends ESTree.Node = ESTree.Node> (node: T, parentNode: ESTree.Node | null): T {
-        node.parentNode = parentNode || node;
+        node.parentNode = parentNode ?? node;
 
         return node;
     }

+ 2 - 2
src/options/ValidationErrorsFormatter.ts

@@ -10,10 +10,10 @@ export class ValidationErrorsFormatter {
     public static format (errors: ValidationError[]): string {
         return errors
             .reduce(
-                (errorMessages: string[], error: ValidationError) => ([
+                (errorMessages: string[], error: ValidationError) => [
                     ...errorMessages,
                     ValidationErrorsFormatter.formatWithNestedConstraints(error)
-                ]),
+                ],
                 []
             )
             .join('\n');

+ 1 - 1
src/options/validators/IsAllowedForObfuscationTargets.ts

@@ -18,7 +18,7 @@ export function IsAllowedForObfuscationTargets (
     obfuscationTargets: TypeFromEnum<typeof ObfuscationTarget>[],
     validationOptions?: ValidationOptions
 ): (options: IOptions, propertyName: keyof IOptions) => void {
-    return (optionsObject: IOptions, propertyName: keyof IOptions) => {
+    return (optionsObject: IOptions, propertyName: keyof IOptions): void => {
         registerDecorator({
             propertyName,
             constraints: [obfuscationTargets],

+ 1 - 7
src/storages/custom-node-group/CustomNodeGroupStorage.ts

@@ -49,13 +49,7 @@ export class CustomNodeGroupStorage extends MapStorage <string, ICustomNodeGroup
         super.initialize();
 
         CustomNodeGroupStorage.customNodeGroupsList.forEach((customNodeGroupName: CustomNodeGroup) => {
-            const customNodeGroup: ICustomNodeGroup = this.customNodeGroupFactory(
-                customNodeGroupName
-            );
-
-            if (!customNodeGroup) {
-                return;
-            }
+            const customNodeGroup: ICustomNodeGroup = this.customNodeGroupFactory(customNodeGroupName);
 
             this.storage.set(customNodeGroupName, customNodeGroup);
         });

+ 2 - 2
src/templates/self-defending-nodes/self-defending-unicode-node/SelfDefendingTemplate.ts

@@ -17,7 +17,7 @@ export function SelfDefendingTemplate (escapeSequenceEncoder: IEscapeSequenceEnc
                 
             const test1 = function () {
                 const regExp = new RegExp('${
-                    escapeSequenceEncoder.encode(`\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}`, true)
+                    escapeSequenceEncoder.encode('\\w+ *\\(\\) *{\\w+ *[\'|"].+[\'|"];? *}', true)
                 }');
                 
                 return !regExp.test(func1.toString());
@@ -25,7 +25,7 @@ export function SelfDefendingTemplate (escapeSequenceEncoder: IEscapeSequenceEnc
             
             const test2 = function () {
                 const regExp = new RegExp('${
-                    escapeSequenceEncoder.encode(`(\\\\[x|u](\\w){2,4})+`, true)
+                    escapeSequenceEncoder.encode('(\\\\[x|u](\\w){2,4})+', true)
                 }');
                 
                 return regExp.test(func2.toString());

+ 2 - 2
src/templates/string-array-nodes/string-array-calls-wrapper/SelfDefendingTemplate.ts

@@ -28,10 +28,10 @@ export function SelfDefendingTemplate (
             this.${statesIdentifier} = [1, 0, 0];
             this.${newStateIdentifier} = function(){return 'newState';};
             this.${firstStateIdentifier} = '${
-                escapeSequenceEncoder.encode(`\\w+ *\\(\\) *{\\w+ *`, true)
+                escapeSequenceEncoder.encode('\\w+ *\\(\\) *{\\w+ *', true)
             }';
             this.${secondStateIdentifier} = '${
-                escapeSequenceEncoder.encode(`['|"].+['|"];? *}`, true)
+                escapeSequenceEncoder.encode('[\'|"].+[\'|"];? *}', true)
             }';
         };
         

+ 1 - 1
src/templates/string-array-nodes/string-array-rotate-function-node/SelfDefendingTemplate.ts

@@ -56,7 +56,7 @@ export function SelfDefendingTemplate (escapeSequenceEncoder: IEscapeSequenceEnc
             
             const test1 = function () {
                 const regExp = new RegExp('${
-                    escapeSequenceEncoder.encode(`\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}`, true)
+                    escapeSequenceEncoder.encode('\\w+ *\\(\\) *{\\w+ *[\'|"].+[\'|"];? *}', true)
                 }');
                 
                 return regExp.test(object.removeCookie.toString());

+ 1 - 1
src/utils/ArrayUtils.ts

@@ -72,7 +72,7 @@ export class ArrayUtils implements IArrayUtils {
      */
     public rotate <T> (array: T[], times: number): T[] {
         if (!array.length) {
-            throw new ReferenceError(`Cannot rotate empty array.`);
+            throw new ReferenceError('Cannot rotate empty array.');
         }
 
         if (times <= 0) {

+ 2 - 2
src/utils/CryptUtils.ts

@@ -32,7 +32,7 @@ export class CryptUtils implements ICryptUtils {
 
         let output: string = '';
 
-        string = encodeURIComponent(string).replace(/%([0-9A-F]{2})/g, (match, p1) => {
+        string = encodeURIComponent(string).replace(/%([0-9A-F]{2})/g, (match: string, p1: string) => {
             return String.fromCharCode(parseInt(`${Utils.hexadecimalPrefix}${p1}`, 16));
         });
 
@@ -44,7 +44,7 @@ export class CryptUtils implements ICryptUtils {
             charCode = string.charCodeAt(idx += 3/4);
 
             if (charCode > 0xFF) {
-                throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");
+                throw new Error('\'btoa\' failed: The string to be encoded contains characters outside of the Latin1 range.');
             }
 
             block = <number>block << 8 | charCode;

+ 1 - 1
src/utils/NodeTransformerNamesGroupsBuilder.ts

@@ -82,7 +82,7 @@ export class NodeTransformerNamesGroupsBuilder implements INodeTransformerNamesG
             }
 
             for (const runAfterRelation of runAfterRelations) {
-                const isUnknownRelation: boolean = !normalizedNodeTransformers[runAfterRelation];
+                const isUnknownRelation: boolean = normalizedNodeTransformers[runAfterRelation] === undefined;
 
                 if (isUnknownRelation) {
                     relationEdges.push([nodeTransformerName, null]);

+ 0 - 259
tslint.json

@@ -1,259 +0,0 @@
-{
-  "extends": [
-    "tslint-eslint-rules",
-    "tslint-microsoft-contrib"
-  ],
-  "rules": {
-    "adjacent-overload-signatures": true,
-    "align": [
-      true,
-      "parameters",
-      "statements"
-    ],
-    "array-bracket-spacing": [true, "never"],
-    "arrow-return-shorthand": true,
-    "ban": [
-      true,
-      [ "_", "forEach" ],
-      [ "_", "each" ],
-      [ "$", "each" ],
-      [ "angular", "forEach" ]
-    ],
-    "ban-comma-operator": true,
-    "binary-expression-operand-order": true,
-    "block-spacing": [true, "always"],
-    "brace-style": [true, "1tbs"],
-    "callable-types": true,
-    "class-name": true,
-    "comment-format": [
-      true,
-      "check-space",
-      "check-lowercase"
-    ],
-    "completed-docs": false,
-    "curly": true,
-    "cyclomatic-complexity": [true, 10],
-    "eofline": true,
-    "export-name": false,
-    "forin": true,
-    "function-name": [true, {
-      "method-regex": "^[a-z][\\w\\d]+$",
-      "private-method-regex": "^[a-z][\\w\\d]+$",
-      "protected-method-regex": "^[a-z][\\w\\d]+$",
-      "static-method-regex": "^[a-z][\\w\\d]+$",
-      "function-regex": "^[a-zA-Z][\\w\\d]+$"
-    }],
-    "no-function-constructor-with-string-args": false,
-    "no-use-before-declare": false,
-    "no-unnecessary-bind": false,
-    "indent": [
-      true,
-      "spaces"
-    ],
-    "insecure-random": false,
-    "interface-name": [
-      true,
-      "always-prefix"
-    ],
-    "interface-over-type-literal": true,
-    "import-name": false,
-    "import-spacing": true,
-    "jsdoc-format": true,
-    "label-position": true,
-    "max-classes-per-file": [true, 1],
-    "max-func-body-length": [true, 200],
-    "max-line-length": false,
-    "member-access": [true],
-    "member-ordering": [
-      true,
-      { "order": "fields-first" }
-    ],
-    "missing-jsdoc": false,
-    "newline-before-return": true,
-    "new-parens": true,
-    "newline-per-chained-call": false,
-    "no-angle-bracket-type-assertion": false,
-    "no-any": false,
-    "no-arg": true,
-    "no-banned-terms": false,
-    "no-bitwise": true,
-    "no-conditional-assignment": true,
-    "no-consecutive-blank-lines": true,
-    "no-console": [
-      true,
-      "debug",
-      "info",
-      "time",
-      "timeEnd",
-      "trace"
-    ],
-    "no-constant-condition": true,
-    "no-construct": true,
-    "no-control-regex": true,
-    "no-debugger": true,
-    "no-default-export": true,
-    "no-duplicate-case": true,
-    "no-duplicate-super": true,
-    "no-duplicate-switch-case": true,
-    "no-duplicate-variable": true,
-    "no-dynamic-delete": true,
-    "no-empty": false,
-    "no-empty-character-class": true,
-    "no-empty-interface": true,
-    "no-empty-line-after-opening-brace": true,
-    "no-eval": false,
-    "no-ex-assign": true,
-    "no-extra-boolean-cast": true,
-    "no-extra-semi": true,
-    "no-import-side-effect": false,
-    "no-inferrable-types": false,
-    "no-inner-declarations": [true, "both"],
-    "no-implicit-dependencies": false,
-    "no-increment-decrement": false,
-    "no-internal-module": true,
-    "no-invalid-regexp": true,
-    "no-invalid-this": true,
-    "no-misused-new": true,
-    "no-multi-spaces": [true],
-    "no-multiline-string": false,
-    "no-namespace": true,
-    "no-null-keyword": false,
-    "no-parameter-properties": true,
-    "no-parameter-reassignment": false,
-    "no-redundant-jsdoc": false,
-    "no-reference": true,
-    "no-reference-import": true,
-    "no-regex-spaces": true,
-    "no-relative-imports": false,
-    "no-require-imports": true,
-    "no-reserved-keywords": false,
-    "no-shadowed-variable": true,
-    "no-string-literal": true,
-    "no-string-throw": true,
-    "no-submodule-imports": true,
-    "no-switch-case-fall-through": false,
-    "no-trailing-whitespace": [true, "ignore-blank-lines"],
-    "no-typeof-undefined": true,
-    "no-unnecessary-callback-wrapper": true,
-    "no-unnecessary-class": [true, "allow-static-only"],
-    "no-unnecessary-initializer": true,
-    "no-unnecessary-field-initialization": true,
-    "no-unnecessary-local-variable": false,
-    "no-unexpected-multiline": true,
-    "no-unsafe-any": false,
-    "no-unsafe-finally": true,
-    "no-unused-expression": true,
-    "no-useless-files": true,
-    "no-var-keyword": true,
-    "no-var-requires": true,
-    "non-literal-require": false,
-    "non-literal-fs-path": false,
-    "max-file-line-count": [true, 500],
-    "object-curly-spacing": [true, "always"],
-    "object-literal-sort-keys": false,
-    "one-line": [
-      true,
-      "check-open-brace",
-      "check-catch",
-      "check-else",
-      "check-finally",
-      "check-whitespace"
-    ],
-    "one-variable-per-declaration": true,
-    "only-arrow-functions": [true, "allow-declarations"],
-    "ordered-imports": [
-      true,
-      {
-        "import-sources-order": "any",
-        "grouped-imports": false,
-        "named-imports-order": "case-insensitive"
-      }
-    ],
-    "prefer-const": true,
-    "prefer-object-spread": false,
-    "prefer-method-signature": true,
-    "prefer-readonly": true,
-    "prefer-template": true,
-    "prefer-while": true,
-    "quotemark": false,
-    "radix": true,
-    "semicolon": [true, "always"],
-    "space-before-function-paren": true,
-    "space-in-parens": [true, "never"],
-    "strict-boolean-expressions": false,
-    "switch-default": false,
-    "ter-arrow-parens": true,
-    "ter-func-call-spacing": [true, "never"],
-    "ter-indent": [
-      true,
-      4,
-      {
-        "ArrayExpression": 1,
-        "CallExpression": { "arguments": "first" },
-        "FunctionDeclaration": { "body": 1, "parameters": 1 },
-        "FunctionExpression": { "body": 1, "parameters": 1 },
-        "MemberExpression": 1,
-        "ObjectExpression": 1,
-        "outerIIFEBody": 1,
-        "SwitchCase": 1,
-        "VariableDeclarator": 1
-      }
-    ],
-    "ter-no-irregular-whitespace": [true],
-    "ter-no-proto": true,
-    "ter-no-self-compare": true,
-    "ter-no-sparse-arrays": [true],
-    "trailing-comma": false,
-    "triple-equals": [
-      true,
-      "allow-null-check",
-      "allow-undefined-check"
-    ],
-    "typedef": [
-      true,
-      "call-signature",
-      "parameter",
-      "arrow-parameter",
-      "property-declaration",
-      "variable-declaration",
-      "member-variable-declaration"
-    ],
-    "typedef-whitespace": [
-      true,
-      {
-        "call-signature": "nospace",
-        "index-signature": "nospace",
-        "parameter": "nospace",
-        "property-declaration": "nospace",
-        "variable-declaration": "nospace"
-      },
-      {
-        "call-signature": "space",
-        "index-signature": "space",
-        "parameter": "space",
-        "property-declaration": "space",
-        "variable-declaration": "space"
-      }
-    ],
-    "unified-signatures": true,
-    "unnecessary-bind": true,
-    "use-isnan": true,
-    "valid-jsdoc": [false, {
-      "requireReturn": false,
-      "requireParamDescription": false,
-      "requireReturnDescription": false
-    }],
-    "valid-typeof": true,
-    "variable-name": false,
-    "whitespace": [
-      true,
-      "check-branch",
-      "check-decl",
-      "check-operator",
-      "check-separator",
-      "check-type",
-      "check-type-operator",
-      "check-rest-spread"
-    ]
-  }
-}

Някои файлове не бяха показани, защото твърде много файлове са промени