Pārlūkot izejas kodu

Improved `disableConsoleOutput` template. https://github.com/javascript-obfuscator/javascript-obfuscator/issues/691

sanex3339 4 gadi atpakaļ
vecāks
revīzija
af0649bb56

+ 4 - 0
CHANGELOG.md

@@ -1,5 +1,9 @@
 Change Log
 
+v1.10.0
+---
+* Improved `disableConsoleOutput` template. https://github.com/javascript-obfuscator/javascript-obfuscator/issues/691
+
 v1.9.0
 ---
 * Improved obfuscation of destructured variables. https://github.com/javascript-obfuscator/javascript-obfuscator/issues/688

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/index.browser.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/index.cli.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/index.js


+ 10 - 10
package.json

@@ -1,6 +1,6 @@
 {
   "name": "javascript-obfuscator",
-  "version": "1.9.0",
+  "version": "1.10.0",
   "description": "JavaScript obfuscator",
   "keywords": [
     "obfuscator",
@@ -23,7 +23,7 @@
   "dependencies": {
     "@gradecam/tsenum": "1.2.0",
     "@nuxtjs/opencollective": "0.2.2",
-    "acorn": "7.3.1",
+    "acorn": "7.4.0",
     "chalk": "4.1.0",
     "chance": "1.1.6",
     "class-validator": "0.12.2",
@@ -35,7 +35,7 @@
     "fast-deep-equal": "3.1.3",
     "inversify": "5.0.1",
     "js-string-escape": "1.0.1",
-    "md5": "2.2.1",
+    "md5": "2.3.0",
     "mkdirp": "1.0.4",
     "multimatch": "4.0.0",
     "reflect-metadata": "0.1.13",
@@ -52,25 +52,25 @@
     "@types/estree": "0.0.44",
     "@types/md5": "2.2.0",
     "@types/mkdirp": "1.0.1",
-    "@types/mocha": "8.0.0",
+    "@types/mocha": "8.0.1",
     "@types/multimatch": "4.0.0",
     "@types/node": "14.0.27",
     "@types/rimraf": "3.0.0",
     "@types/sinon": "9.0.4",
     "@types/string-template": "1.0.2",
     "@types/webpack-env": "1.15.2",
-    "@typescript-eslint/eslint-plugin": "3.7.1",
-    "@typescript-eslint/parser": "3.7.1",
+    "@typescript-eslint/eslint-plugin": "3.8.0",
+    "@typescript-eslint/parser": "3.8.0",
     "chai": "4.2.0",
     "coveralls": "3.1.0",
-    "eslint": "7.5.0",
+    "eslint": "7.6.0",
     "eslint-plugin-import": "2.22.0",
-    "eslint-plugin-jsdoc": "30.1.0",
+    "eslint-plugin-jsdoc": "30.2.0",
     "eslint-plugin-no-null": "1.0.2",
     "eslint-plugin-prefer-arrow": "1.2.2",
     "eslint-plugin-unicorn": "21.0.0",
     "fork-ts-checker-notifier-webpack-plugin": "3.0.0",
-    "fork-ts-checker-webpack-plugin": "5.0.13",
+    "fork-ts-checker-webpack-plugin": "5.0.14",
     "mocha": "8.1.0",
     "nyc": "15.1.0",
     "pjson": "1.0.9",
@@ -78,7 +78,7 @@
     "rimraf": "3.0.2",
     "sinon": "9.0.2",
     "threads": "1.6.3",
-    "ts-loader": "8.0.1",
+    "ts-loader": "8.0.2",
     "ts-node": "8.10.2",
     "typescript": "3.9.7",
     "webpack": "4.44.1",

+ 12 - 28
src/custom-code-helpers/console-output/templates/ConsoleOutputDisableExpressionTemplate.ts

@@ -3,36 +3,20 @@
  */
 export function ConsoleOutputDisableExpressionTemplate (): string {
     return `
-        const {consoleLogDisableFunctionName} = {callControllerFunctionName}(this, function () {
-            const func = function () {};
-            
+        const {consoleLogDisableFunctionName} = {callControllerFunctionName}(this, function () {            
             {globalVariableTemplate}
                         
-            if (!that.console) {
-                that.console = (function (func){
-                    const c = {};
-                    
-                    c.log = func;
-                    c.warn = func;
-                    c.debug = func;
-                    c.info = func;
-                    c.error = func;
-                    c.exception = func;
-                    c.table = func;
-                    c.trace = func;
-                    
-                    return c;
-                })(func);
-            } else {
-                that.console.log = func;
-                that.console.warn = func;
-                that.console.debug = func;
-                that.console.info = func;
-                that.console.error = func;
-                that.console.exception = func;
-                that.console.table = func;
-                that.console.trace = func;
-            }
+            const _console = (that.console = that.console || {});
+            const methods = ['log', 'warn', 'info', 'error', 'exception', 'table', 'trace'];
+            
+            for (var i = 0; i < methods.length; i++){
+                const func = {consoleLogDisableFunctionName}.constructor();
+                const methodName = methods[i];
+                const originalFunction = _console[methodName] || func;
+
+                func.toString = originalFunction.toString.bind(originalFunction);
+                _console[methodName] = func;
+            };
         });
         
         {consoleLogDisableFunctionName}();

+ 2 - 2
test/dev/dev.ts

@@ -15,8 +15,8 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
         {
             ...NO_ADDITIONAL_NODES_PRESET,
             compact: false,
-            simplify: true,
-            renameGlobals: false
+            stringArray: true,
+            stringArrayThreshold: 1
         }
     ).getObfuscatedCode();
 

+ 3 - 26
test/functional-tests/custom-code-helpers/console-output/ConsoleOutputDisableExpressionCodeHelper.spec.ts

@@ -7,10 +7,7 @@ import { readFileAsString } from '../../../helpers/readFileAsString';
 import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade';
 
 describe('ConsoleOutputDisableExpressionCodeHelper', () => {
-    const consoleLogRegExp: RegExp = /_0x([a-f0-9]){4,6}\['console'\]\['log'\] *= *_0x([a-f0-9]){4,6};/u;
-    const consoleErrorRegExp: RegExp = /_0x([a-f0-9]){4,6}\['console'\]\['error'\] *= *_0x([a-f0-9]){4,6};/u;
-    const consoleWarnRegExp: RegExp = /_0x([a-f0-9]){4,6}\['console'\]\['warn'\] *= *_0x([a-f0-9]){4,6};/u;
-    const consoleTableRegExp: RegExp = /_0x([a-f0-9]){4,6}\['console'\]\['table'\] *= *_0x([a-f0-9]){4,6};/u;
+    const consoleGetterRegExp: RegExp = /var _0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['console'] *= *_0x([a-f0-9]){4,6}\['console'] *\|| *{};/;
 
     describe('`disableConsoleOutput` option is set', () => {
         let obfuscatedCode: string;
@@ -28,19 +25,7 @@ describe('ConsoleOutputDisableExpressionCodeHelper', () => {
         });
 
         it('match #1: should correctly append code helper into the obfuscated code', () => {
-            assert.match(obfuscatedCode, consoleLogRegExp);
-        });
-
-        it('match #2: should correctly append code helper into the obfuscated code', () => {
-            assert.match(obfuscatedCode, consoleErrorRegExp);
-        });
-
-        it('match #3: should correctly append code helper into the obfuscated code', () => {
-            assert.match(obfuscatedCode, consoleWarnRegExp);
-        });
-
-        it('match #4: should correctly append code helper into the obfuscated code', () => {
-            assert.match(obfuscatedCode, consoleTableRegExp);
+            assert.match(obfuscatedCode, consoleGetterRegExp);
         });
     });
 
@@ -60,15 +45,7 @@ describe('ConsoleOutputDisableExpressionCodeHelper', () => {
         });
 
         it('match #1: shouldn\'t append code helper into the obfuscated code', () => {
-            assert.notMatch(obfuscatedCode, consoleLogRegExp);
-        });
-
-        it('match #2: shouldn\'t append code helper into the obfuscated code', () => {
-            assert.notMatch(obfuscatedCode, consoleErrorRegExp);
-        });
-
-        it('match #3: shouldn\'t append code helper into the obfuscated code', () => {
-            assert.notMatch(obfuscatedCode, consoleWarnRegExp);
+            assert.notMatch(obfuscatedCode, consoleGetterRegExp);
         });
     });
 });

+ 192 - 0
test/functional-tests/custom-code-helpers/console-output/templates/ConsoleOutputDisableExpressionTemplate.spec.ts

@@ -0,0 +1,192 @@
+import 'reflect-metadata';
+
+import format from 'string-template';
+
+import { assert } from 'chai';
+import * as sinon from 'sinon';
+
+import { IInversifyContainerFacade } from '../../../../../src/interfaces/container/IInversifyContainerFacade';
+
+import { ConsoleOutputDisableExpressionTemplate } from '../../../../../src/custom-code-helpers/console-output/templates/ConsoleOutputDisableExpressionTemplate';
+import { GlobalVariableTemplate1 } from '../../../../../src/custom-code-helpers/common/templates/GlobalVariableTemplate1';
+
+import { InversifyContainerFacade } from '../../../../../src/container/InversifyContainerFacade';
+
+const consoleMethods: (keyof Console)[] = ['log', 'warn', 'info', 'error', 'table', 'trace'];
+
+/**
+ * @returns {string}
+ */
+const getWrongGlobalVariableTemplate: () => string = () => `
+    var that = {};
+`;
+
+/**
+ * @returns {string}
+ */
+const getUndefinedConsoleObjectGlobalVariableTemplate: () => string = () => `
+    ${GlobalVariableTemplate1()}
+    
+    that.console = undefined;
+`;
+
+/**
+ * @returns {string}
+ */
+const getPartialConsoleObjectGlobalVariableTemplate: () => string = () => `
+    ${GlobalVariableTemplate1()}
+    
+    that.console = {
+        log: that.console.log
+    };
+`;
+
+/**
+ * @param templateData
+ * @param {string} callsControllerFunctionName
+ * @param {string} consoleMethod
+ * @returns {Function}
+ */
+function getFunctionFromTemplate (
+    templateData: any,
+    callsControllerFunctionName: string,
+    consoleMethod: keyof Console
+): Function {
+    const formattedTemplate: string = format(ConsoleOutputDisableExpressionTemplate(), templateData);
+
+    return Function(`
+        var ${callsControllerFunctionName} = (function(){            
+            return function (context, fn){	
+                return function () {
+                    return fn.apply(context, arguments);
+                };
+            }
+        })();
+        
+        ${formattedTemplate}
+
+        console.${consoleMethod}(1);
+        console.${consoleMethod}.toString();
+    `);
+}
+
+describe('ConsoleOutputDisableExpressionTemplate', () => {
+    const callControllerFunctionName: string = 'callsController';
+    const consoleLogDisableFunctionName: string = 'consoleLogDisable';
+
+    let consoleObjectStubs: sinon.SinonStub[];
+    let processStdoutWriteSpy: sinon.SinonSpy;
+
+    before(() => {
+        const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
+
+        inversifyContainerFacade.load('', '', {});
+    });
+
+    beforeEach(() => {
+        processStdoutWriteSpy = sinon.spy();
+        consoleObjectStubs = consoleMethods.map((methodName: keyof Console) => {
+            return sinon.stub(console, methodName).callsFake(processStdoutWriteSpy);
+        });
+    });
+
+    describe('Base behaviour', () => {
+        consoleMethods.forEach((consoleMethodName: keyof Console, index: number) => {
+            describe(`Variant #${index + 1}: \`console.${consoleMethodName}\` call`, () => {
+                beforeEach(() => {
+                    const testFunc = getFunctionFromTemplate(
+                        {
+                            consoleLogDisableFunctionName,
+                            callControllerFunctionName,
+                            globalVariableTemplate: GlobalVariableTemplate1(),
+                        },
+                        callControllerFunctionName,
+                        consoleMethodName
+                    );
+
+                    testFunc();
+                });
+
+                it(`should replace \`console.${consoleMethodName}\` call with an empty function`, () => {
+                    assert.isNull(processStdoutWriteSpy.getCall(0));
+                });
+            });
+        });
+    });
+
+    describe('Partial `console` object', () => {
+        consoleMethods.forEach((consoleMethodName: keyof Console, index: number) => {
+            describe(`Variant #${index + 1}: \`console.${consoleMethodName}\` call`, () => {
+                beforeEach(() => {
+                    const testFunc = getFunctionFromTemplate(
+                        {
+                            consoleLogDisableFunctionName,
+                            callControllerFunctionName,
+                            globalVariableTemplate: getPartialConsoleObjectGlobalVariableTemplate(),
+                        },
+                        callControllerFunctionName,
+                        consoleMethodName
+                    );
+
+                    testFunc();
+                });
+
+                it(`should replace \`console.${consoleMethodName}\` call with an empty function`, () => {
+                    assert.isNull(processStdoutWriteSpy.getCall(0));
+                });
+            });
+        });
+    });
+
+    describe('Undefined `console` object', () => {
+        consoleMethods.forEach((consoleMethodName: keyof Console, index: number) => {
+            describe(`Variant #${index + 1}: \`console.${consoleMethodName}\` call`, () => {
+                beforeEach(() => {
+                    const testFunc = getFunctionFromTemplate(
+                        {
+                            consoleLogDisableFunctionName,
+                            callControllerFunctionName,
+                            globalVariableTemplate: getUndefinedConsoleObjectGlobalVariableTemplate(),
+                        },
+                        callControllerFunctionName,
+                        consoleMethodName
+                    );
+
+                    testFunc();
+                });
+
+                it(`should replace \`console.${consoleMethodName}\` call with an empty function`, () => {
+                    assert.isNull(processStdoutWriteSpy.getCall(0));
+                });
+            });
+        });
+    });
+
+    describe('Wrong global variable template', () => {
+        consoleMethods.forEach((consoleMethodName: keyof Console, index: number) => {
+            describe(`Variant #${index + 1}: \`console.${consoleMethodName}\` call`, () => {
+                beforeEach(() => {
+                    const testFunc = getFunctionFromTemplate(
+                        {
+                            consoleLogDisableFunctionName,
+                            callControllerFunctionName,
+                            globalVariableTemplate: getWrongGlobalVariableTemplate(),
+                        },
+                        callControllerFunctionName,
+                        consoleMethodName
+                    );
+
+                    testFunc();
+                });
+
+                it(`should not replace \`console.${consoleMethodName}\` call with an empty function`, () => {
+                    assert.isNotNull(processStdoutWriteSpy.getCall(0));
+                });
+            });
+        });
+    });
+
+    afterEach(() => {
+        consoleObjectStubs.forEach((stub: sinon.SinonStub) => stub.restore());
+    });
+});

+ 1 - 0
test/index.spec.ts

@@ -58,6 +58,7 @@ import './functional-tests/analyzers/calls-graph-analyzer/CallsGraphAnalyzer.spe
 import './functional-tests/cli/JavaScriptObfuscatorCLI.spec';
 import './functional-tests/code-transformers/preparing-transformers/hashbang-operator-transformer/HashbangOperatorTransformer.spec';
 import './functional-tests/custom-code-helpers/console-output/ConsoleOutputDisableExpressionCodeHelper.spec';
+import './functional-tests/custom-code-helpers/console-output/templates/ConsoleOutputDisableExpressionTemplate.spec';
 import './functional-tests/custom-code-helpers/common/templates/GlobalVariableNoEvalTemplate.spec';
 import './functional-tests/custom-code-helpers/debug-protection/templates/DebugProtectionFunctionCallTemplate.spec';
 import './functional-tests/custom-code-helpers/domain-lock/DomainLockCodeHelper.spec';

+ 71 - 66
yarn.lock

@@ -357,10 +357,10 @@
   dependencies:
     "@types/node" "*"
 
-"@types/[email protected].0":
-  version "8.0.0"
-  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.0.0.tgz#b0ba1c5b4cb3880c51a6b488ad007a657d1be888"
-  integrity sha512-jWeYcTo3sCH/rMgsdYXDTO85GNRyTCII5dayMIu/ZO4zbEot1E3iNGaOwpLReLUHjeNQFkgeNNVYlY4dX6azQQ==
+"@types/[email protected].1":
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.0.1.tgz#813b4ff8dd9920d652e1e6b451ff1e371a4561d2"
+  integrity sha512-TBZ6YdX7IZz4U9/mBoB8zCMRN1vXw8QdihRcZxD3I0Cv/r8XF8RggZ8WiXFws4aj5atzRR5hJrYer7g8nXwpnQ==
 
 "@types/[email protected]":
   version "4.0.0"
@@ -424,52 +424,52 @@
   resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.2.tgz#927997342bb9f4a5185a86e6579a0a18afc33b0a"
   integrity sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ==
 
-"@typescript-eslint/eslint-plugin@3.7.1":
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.7.1.tgz#d144c49a9a0ffe8dd704bb179c243df76c111bc9"
-  integrity sha512-3DB9JDYkMrc8Au00rGFiJLK2Ja9CoMP6Ut0sHsXp3ZtSugjNxvSSHTnKLfo4o+QmjYBJqEznDqsG1zj4F2xnsg==
+"@typescript-eslint/eslint-plugin@3.8.0":
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.8.0.tgz#f82947bcdd9a4e42be7ad80dfd61f1dc411dd1df"
+  integrity sha512-lFb4VCDleFSR+eo4Ew+HvrJ37ZH1Y9ZyE+qyP7EiwBpcCVxwmUc5PAqhShCQ8N8U5vqYydm74nss+a0wrrCErw==
   dependencies:
-    "@typescript-eslint/experimental-utils" "3.7.1"
+    "@typescript-eslint/experimental-utils" "3.8.0"
     debug "^4.1.1"
     functional-red-black-tree "^1.0.1"
     regexpp "^3.0.0"
     semver "^7.3.2"
     tsutils "^3.17.1"
 
-"@typescript-eslint/experimental-utils@3.7.1":
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.7.1.tgz#ab036caaed4c870d22531d41f9352f3147364d61"
-  integrity sha512-TqE97pv7HrqWcGJbLbZt1v59tcqsSVpWTOf1AqrWK7n8nok2sGgVtYRuGXeNeLw3wXlLEbY1MKP3saB2HsO/Ng==
+"@typescript-eslint/experimental-utils@3.8.0":
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.8.0.tgz#ac1f7c88322dcfb7635ece6f0441516dd951099a"
+  integrity sha512-o8T1blo1lAJE0QDsW7nSyvZHbiDzQDjINJKyB44Z3sSL39qBy5L10ScI/XwDtaiunoyKGLiY9bzRk4YjsUZl8w==
   dependencies:
     "@types/json-schema" "^7.0.3"
-    "@typescript-eslint/types" "3.7.1"
-    "@typescript-eslint/typescript-estree" "3.7.1"
+    "@typescript-eslint/types" "3.8.0"
+    "@typescript-eslint/typescript-estree" "3.8.0"
     eslint-scope "^5.0.0"
     eslint-utils "^2.0.0"
 
-"@typescript-eslint/parser@3.7.1":
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.7.1.tgz#5d9ccecb116d12d9c6073e9861c57c9b1aa88128"
-  integrity sha512-W4QV/gXvfIsccN8225784LNOorcm7ch68Fi3V4Wg7gmkWSQRKevO4RrRqWo6N/Z/myK1QAiGgeaXN57m+R/8iQ==
+"@typescript-eslint/parser@3.8.0":
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.8.0.tgz#8e1dcd404299bf79492409c81c415fa95a7c622b"
+  integrity sha512-u5vjOBaCsnMVQOvkKCXAmmOhyyMmFFf5dbkM3TIbg3MZ2pyv5peE4gj81UAbTHwTOXEwf7eCQTUMKrDl/+qGnA==
   dependencies:
     "@types/eslint-visitor-keys" "^1.0.0"
-    "@typescript-eslint/experimental-utils" "3.7.1"
-    "@typescript-eslint/types" "3.7.1"
-    "@typescript-eslint/typescript-estree" "3.7.1"
+    "@typescript-eslint/experimental-utils" "3.8.0"
+    "@typescript-eslint/types" "3.8.0"
+    "@typescript-eslint/typescript-estree" "3.8.0"
     eslint-visitor-keys "^1.1.0"
 
-"@typescript-eslint/types@3.7.1":
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.7.1.tgz#90375606b2fd73c1224fe9e397ee151e28fa1e0c"
-  integrity sha512-PZe8twm5Z4b61jt7GAQDor6KiMhgPgf4XmUb9zdrwTbgtC/Sj29gXP1dws9yEn4+aJeyXrjsD9XN7AWFhmnUfg==
+"@typescript-eslint/types@3.8.0":
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.8.0.tgz#58581dd863f86e0cd23353d94362bb90b4bea796"
+  integrity sha512-8kROmEQkv6ss9kdQ44vCN1dTrgu4Qxrd2kXr10kz2NP5T8/7JnEfYNxCpPkArbLIhhkGLZV3aVMplH1RXQRF7Q==
 
-"@typescript-eslint/typescript-estree@3.7.1":
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.7.1.tgz#ce1ffbd0fa53f34d4ce851a7a364e392432f6eb3"
-  integrity sha512-m97vNZkI08dunYOr2lVZOHoyfpqRs0KDpd6qkGaIcLGhQ2WPtgHOd/eVbsJZ0VYCQvupKrObAGTOvk3tfpybYA==
+"@typescript-eslint/typescript-estree@3.8.0":
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.8.0.tgz#0606d19f629f813dbdd5a34c7a1e895d6191cac6"
+  integrity sha512-MTv9nPDhlKfclwnplRNDL44mP2SY96YmPGxmMbMy6x12I+pERcxpIUht7DXZaj4mOKKtet53wYYXU0ABaiXrLw==
   dependencies:
-    "@typescript-eslint/types" "3.7.1"
-    "@typescript-eslint/visitor-keys" "3.7.1"
+    "@typescript-eslint/types" "3.8.0"
+    "@typescript-eslint/visitor-keys" "3.8.0"
     debug "^4.1.1"
     glob "^7.1.6"
     is-glob "^4.0.1"
@@ -477,10 +477,10 @@
     semver "^7.3.2"
     tsutils "^3.17.1"
 
-"@typescript-eslint/visitor-keys@3.7.1":
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.7.1.tgz#b90191e74efdee656be8c5a30f428ed16dda46d1"
-  integrity sha512-xn22sQbEya+Utj2IqJHGLA3i1jDzR43RzWupxojbSWnj3nnPLavaQmWe5utw03CwYao3r00qzXfgJMGNkrzrAA==
+"@typescript-eslint/visitor-keys@3.8.0":
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.8.0.tgz#ad35110249fb3fc30a36bfcbfeea93e710cfaab1"
+  integrity sha512-gfqQWyVPpT9NpLREXNR820AYwgz+Kr1GuF3nf1wxpHD6hdxI62tq03ToomFnDxY0m3pUB39IF7sil7D5TQexLA==
   dependencies:
     eslint-visitor-keys "^1.1.0"
 
@@ -644,10 +644,10 @@ acorn-jsx@^5.2.0:
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
   integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
 
-acorn@7.3.1, acorn@^7.3.1:
-  version "7.3.1"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd"
-  integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==
+acorn@7.4.0:
+  version "7.4.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c"
+  integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==
 
 acorn@^6.4.1:
   version "6.4.1"
@@ -659,6 +659,11 @@ acorn@^7.1.1:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
   integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
 
+acorn@^7.3.1:
+  version "7.3.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd"
+  integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==
+
 aggregate-error@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
@@ -1207,7 +1212,7 @@ [email protected]:
   resolved "https://registry.yarnpkg.com/chance/-/chance-1.1.6.tgz#967a0a129e0f342f7c65cd5d20f5ae870a26b8af"
   integrity sha512-DXLzaGjasDWbvlFAJyQBIwlzdQZuPdz4of9TTTxmHTjja88ZU/vBwUwxxjalSt43zWTPrhiJT0z0N4bZqfZS9w==
 
-charenc@~0.0.1:
+charenc@0.0.2:
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
   integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
@@ -1560,7 +1565,7 @@ cross-spawn@^7.0.2:
     shebang-command "^2.0.0"
     which "^2.0.1"
 
-crypt@~0.0.1:
+crypt@0.0.2:
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
   integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=
@@ -1957,10 +1962,10 @@ [email protected]:
     resolve "^1.17.0"
     tsconfig-paths "^3.9.0"
 
-eslint-plugin-jsdoc@30.1.0:
-  version "30.1.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.1.0.tgz#9d74854850ee16754dc6b549de26fcd5b48b8886"
-  integrity sha512-eMsX+TMW6ycgXwxqU9xqfts2/e7cWCSGzk+gHgDvqaITyMJr8AcHTdd4pAMjpnOh0cd16lPZv+/R5LbQ4uVHQA==
+eslint-plugin-jsdoc@30.2.0:
+  version "30.2.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.2.0.tgz#b6407a33410112e6bc12de3486ecdbbd488735a2"
+  integrity sha512-gBC5Wp7vSgMBRiGtCfjCgRQ9Wzdus6Hc8WuDNetYxuJoJ5rDHQMkJzBZ0/Qdg3fFh2eIpM7EcJD0pbrYKPxKLw==
   dependencies:
     comment-parser "^0.7.5"
     debug "^4.1.1"
@@ -2056,10 +2061,10 @@ eslint-visitor-keys@^1.3.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
   integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
 
-eslint@7.5.0:
-  version "7.5.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.5.0.tgz#9ecbfad62216d223b82ac9ffea7ef3444671d135"
-  integrity sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q==
+eslint@7.6.0:
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.6.0.tgz#522d67cfaea09724d96949c70e7a0550614d64d6"
+  integrity sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==
   dependencies:
     "@babel/code-frame" "^7.0.0"
     ajv "^6.10.0"
@@ -2395,10 +2400,10 @@ [email protected]:
   dependencies:
     node-notifier "^6.0.0"
 
[email protected]3:
-  version "5.0.13"
-  resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.0.13.tgz#916170e311d08f6dc0d85e1d8d4c8627941611d4"
-  integrity sha512-87KZknpv0HcXSl1/Z48Wbplcp9x6Pu7ZroZMXK8z2LdfBmPyCbka7E6qy5ubgfzQqjIsWBXilFTTRxi2Z6238Q==
[email protected]4:
+  version "5.0.14"
+  resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.0.14.tgz#83758b733ccd5d6e5780a72a5d5f099c353c108d"
+  integrity sha512-iwRdjgZx1Ll0DAMhmtOF4ffoICpiUxOqOHLrbIHmeCtZiwCrL/qscm+EXOJyzj3a9X8hLRLDEHy9FOyD6Gm42g==
   dependencies:
     "@babel/code-frame" "^7.8.3"
     "@types/json-schema" "^7.0.5"
@@ -2888,7 +2893,7 @@ is-binary-path@~2.1.0:
   dependencies:
     binary-extensions "^2.0.0"
 
-is-buffer@^1.1.5, is-buffer@~1.1.1:
+is-buffer@^1.1.5, is-buffer@~1.1.6:
   version "1.1.6"
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
   integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
@@ -3461,14 +3466,14 @@ md5.js@^1.3.4:
     inherits "^2.0.1"
     safe-buffer "^5.1.2"
 
-md5@2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9"
-  integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=
+md5@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
+  integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
   dependencies:
-    charenc "~0.0.1"
-    crypt "~0.0.1"
-    is-buffer "~1.1.1"
+    charenc "0.0.2"
+    crypt "0.0.2"
+    is-buffer "~1.1.6"
 
 memfs@^3.1.2:
   version "3.2.0"
@@ -5231,10 +5236,10 @@ tough-cookie@~2.5.0:
     psl "^1.1.28"
     punycode "^2.1.1"
 
[email protected].1:
-  version "8.0.1"
-  resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.1.tgz#9670dcbce2a8c8506d01a37fee042350d02c8c21"
-  integrity sha512-I9Nmly0ufJoZRMuAT9d5ijsC2B7oSPvUnOJt/GhgoATlPGYfa17VicDKPcqwUCrHpOkCxr/ybLYwbnS4cOxmvQ==
[email protected].2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.2.tgz#ee73ca9350f745799396fff8578ba29b1e95616b"
+  integrity sha512-oYT7wOTUawYXQ8XIDsRhziyW0KUEV38jISYlE+9adP6tDtG+O5GkRe4QKQXrHVH4mJJ88DysvEtvGP65wMLlhg==
   dependencies:
     chalk "^2.3.0"
     enhanced-resolve "^4.0.0"

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels