From 6819ba675ad009ffedd78a71efa11e6d5d2c44c6 Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Thu, 7 Sep 2017 19:47:17 +0300 Subject: [PATCH] Refactoring --- dist/index.js | 2 +- index.ts | 2 +- src/JavaScriptObfuscator.ts | 298 ++++++++++++++++-- src/JavaScriptObfuscatorFacade.ts | 45 +++ src/JavaScriptObfuscatorInternal.ts | 152 --------- src/Obfuscator.ts | 270 ---------------- src/TransformersRunner.ts | 111 +++++++ src/cli/JavaScriptObfuscatorCLI.ts | 2 +- src/container/InversifyContainerFacade.ts | 12 +- src/container/ServiceIdentifiers.ts | 2 +- .../NodeTransformersModule.ts | 11 + .../NodeCallsControllerFunctionNode.ts | 2 +- .../SelfDefendingUnicodeNode.ts | 2 +- .../StringArrayCallsWrapper.ts | 2 +- .../StringArrayRotateFunctionNode.ts | 2 +- src/declarations/ESTree.d.ts | 1 + .../node-transformers/NodeTransformer.ts | 2 + src/enums/logger/LoggingMessage.ts | 1 + src/interfaces/IObfuscator.d.ts | 9 - src/interfaces/ITransformersRunner.d.ts | 12 + src/interfaces/IVisitor.d.ts | 5 +- .../node-transformers/INodeTransformer.d.ts | 15 +- .../ConditionalCommentNodeGuard.ts | 26 +- .../AbstractNodeTransformer.ts | 5 +- .../DeadCodeInjectionTransformer.ts | 107 ++++--- .../NodeGuardTransformer.ts | 72 +++++ .../ParentizeTransformer.ts | 50 +++ src/node/NodeUtils.ts | 30 +- test/dev/dev.ts | 1 + .../cli/JavaScriptObfuscatorCLI.spec.ts | 2 +- ...ConsoleOutputDisableExpressionNode.spec.ts | 2 +- .../domain-lock-nodes/DomainLockNode.spec.ts | 2 +- .../StringArrayCallsWrapper.spec.ts | 2 +- .../StringArrayNode.spec.ts | 2 +- .../StringArrayRotateFunctionNode.spec.ts | 2 +- .../JavaScriptObfuscator.spec.ts | 2 +- .../BlackListNodeGuard.spec.ts | 2 +- ...ockStatementControlFlowTransformer.spec.ts | 2 +- ...inaryExpressionControlFlowReplacer.spec.ts | 2 +- .../CallExpressionControlFlowReplacer.spec.ts | 2 +- ...gicalExpressionControlFlowReplacer.spec.ts | 2 +- .../StringLiteralControlFlowReplacer.spec.ts | 2 +- .../FunctionControlFlowTransformer.spec.ts | 2 +- .../MemberExpressionTransformer.spec.ts | 2 +- .../MethodDefinitionTransformer.spec.ts | 2 +- .../TemplateLiteralTransformer.spec.ts | 2 +- .../DeadCodeInjectionTransformer.spec.ts | 2 +- .../CatchClauseTransformer.spec.ts | 2 +- .../ClassDeclarationTransformer.spec.ts | 2 +- .../FunctionDeclarationTransformer.spec.ts | 2 +- .../FunctionTransformer.spec.ts | 2 +- .../LabeledStatementTransformer.spec.ts | 2 +- .../LiteralTransformer.spec.ts | 2 +- .../ObjectExpressionTransformer.spec.ts | 2 +- .../VariableDeclarationTransformer.spec.ts | 2 +- .../JavaScriptObfuscatorPerformance.spec.ts | 2 +- .../JavaScriptObfuscatorRuntime.spec.ts | 2 +- .../node/node-utils/NodeUtils.spec.ts | 7 +- 58 files changed, 719 insertions(+), 595 deletions(-) create mode 100644 src/JavaScriptObfuscatorFacade.ts delete mode 100644 src/JavaScriptObfuscatorInternal.ts delete mode 100644 src/Obfuscator.ts create mode 100644 src/TransformersRunner.ts delete mode 100644 src/interfaces/IObfuscator.d.ts create mode 100644 src/interfaces/ITransformersRunner.d.ts create mode 100644 src/node-transformers/preparing-transformers/NodeGuardTransformer.ts create mode 100644 src/node-transformers/preparing-transformers/ParentizeTransformer.ts diff --git a/dist/index.js b/dist/index.js index 71f6810a..ca95c443 100644 --- a/dist/index.js +++ b/dist/index.js @@ -21,5 +21,5 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -require("source-map-support").install(),module.exports=function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=41)}([function(e,t){e.exports=require("inversify")},function(e,t){e.exports=require("tslib")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e.Factory__ICalleeDataExtractor="Factory",e.Factory__IControlFlowCustomNode="Factory",e.Factory__IControlFlowReplacer="Factory",e.Factory__ICustomNode="Factory",e.Factory__ICustomNodeGroup="Factory",e.Factory__IIdentifierObfuscatingReplacer="Factory",e.Factory__INodeGuard="Factory",e.Factory__INodeTransformer="Factory",e.Factory__IObfuscationResult="Factory",e.Factory__IObfuscatingReplacer="Factory",e.Factory__TControlFlowStorage="Factory",e.IArrayUtils="IArrayUtils",e.ICalleeDataExtractor="ICalleeDataExtractor",e.ICryptUtils="ICryptUtils",e.ICustomNode="ICustomNode",e.ICustomNodeGroup="ICustomNodeGroup",e.IControlFlowReplacer="IControlFlowReplacer",e.IDeadCodeInjectionReplacer="IDeadCodeInjectionReplacer",e.IEscapeSequenceEncoder="IEscapeSequenceEncoder",e.IIdentifierObfuscatingReplacer="IIdentifierObfuscatingReplacer",e.IJavaScriptObfuscator="IJavaScriptObfuscator",e.ILogger="ILogger",e.INodeGuard="INodeGuard",e.INodeTransformer="INodeTransformer",e.IObfuscationEventEmitter="IObfuscationEventEmitter",e.IObfuscationResult="IObfuscationResult",e.IObfuscator="IObfuscator",e.IOptions="IOptions",e.IObfuscatingReplacer="IObfuscatingReplacer",e.IRandomGenerator="IRandomGenerator",e.ISourceCode="ISourceCode",e.ISourceMapCorrector="ISourceMapCorrector",e.IStackTraceAnalyzer="IStackTraceAnalyzer",e.Newable__ICustomNode="Newable",e.Newable__TControlFlowStorage="Newable",e.TCustomNodeGroupStorage="TCustomNodeGroupStorage",e.TStringArrayStorage="TStringArrayStorage"}(t.ServiceIdentifiers||(t.ServiceIdentifiers={}))},function(e,t,r){"use strict";function n(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"initialize",t=Object.keys(this)[0];return function(r,n){var o={configurable:!0,enumerable:!0},a=r[e];if(!a||"function"!=typeof a)throw new Error("`"+e+"` method with initialization logic not found. `@"+t+"` decorator requires `"+e+"` method");var i="_"+n,c=Object.getOwnPropertyDescriptor(r,i)||o,s=Object.getOwnPropertyDescriptor(r,e)||o,u=s.value;return Object.defineProperty(r,n,Object.assign({},c,{get:function(){if(void 0===this[i])throw new Error("Property `"+n+"` is not initialized! Initialize it first!");return this[i]},set:function(e){this[i]=e}})),Object.defineProperty(r,e,Object.assign({},s,{value:function(){u.apply(this,arguments),this[n]}})),c}}Object.defineProperty(t,"__esModule",{value:!0}),t.initializable=n},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=function(){function e(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:0;if(l.Node.isNodeHasBlockStatement(e)){if(void 0===e.body[t])throw new ReferenceError("Wrong index `"+t+"`. Block-statement body length is `"+e.body.length+"`");return e.body[t]}throw new TypeError("The specified node have no a block-statement")}},{key:"getBlockScopesOfNode",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=t.parentNode;if(!n)throw new ReferenceError("`parentNode` property of given node is `undefined`");if(l.Node.isBlockStatementNode(n)){if(!n.parentNode)throw new ReferenceError("`parentNode` property of `parentNode` of given node is `undefined`");-1!==e.nodesWithBlockScope.indexOf(n.parentNode.type)&&r.push(n)}return l.Node.isProgramNode(n)?(r.push(n),r):e.getBlockScopesOfNode(n,r)}},{key:"getNodeBlockScopeDepth",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=t.parentNode;if(!n)throw new ReferenceError("`parentNode` property of given node is `undefined`");return l.Node.isProgramNode(n)?r:l.Node.isBlockStatementNode(t)&&-1!==e.nodesWithBlockScope.indexOf(n.type)?e.getNodeBlockScopeDepth(n,++r):e.getNodeBlockScopeDepth(n,r)}},{key:"getUnaryExpressionArgumentNode",value:function(t){return l.Node.isUnaryExpressionNode(t.argument)?e.getUnaryExpressionArgumentNode(t.argument):t.argument}},{key:"parentize",value:function(e){var t=!0;return s.traverse(e,{enter:function(e,r){var n=void 0;t?(e.type===u.NodeType.Program?n=e:(n=d.Nodes.getProgramNode([e]),n.parentNode=n),t=!1):n=r||e,e.parentNode=n,e.obfuscatedNode=!1}}),e}},{key:"typedReplace",value:function(t,r,n){e.typedTraverse(t,r,n,"replace")}},{key:"typedTraverse",value:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"traverse";s[n](e,{enter:function(e,n){if(e.type===t&&r.enter)return r.enter(e,n)},leave:function(e,n){if(e.type===t&&r.leave)return r.leave(e,n)}})}}]),e}();f.nodesWithBlockScope=[u.NodeType.ArrowFunctionExpression,u.NodeType.FunctionDeclaration,u.NodeType.FunctionExpression,u.NodeType.MethodDefinition,u.NodeType.Program],t.NodeUtils=f},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:[];return{type:i.NodeType.Program,body:e,sourceType:"script",obfuscatedNode:!1}}},{key:"getArrayExpressionNode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{type:i.NodeType.ArrayExpression,elements:e}}},{key:"getAssignmentExpressionNode",value:function(e,t,r){return{type:i.NodeType.AssignmentExpression,operator:e,left:t,right:r,obfuscatedNode:!1}}},{key:"getBinaryExpressionNode",value:function(e,t,r){return{type:i.NodeType.BinaryExpression,operator:e,left:t,right:r,obfuscatedNode:!1}}},{key:"getBlockStatementNode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{type:i.NodeType.BlockStatement,body:e,obfuscatedNode:!1}}},{key:"getBreakStatement",value:function(e){var t={type:i.NodeType.BreakStatement,obfuscatedNode:!1};return e&&(t.label=e),t}},{key:"getCatchClauseNode",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{type:i.NodeType.CatchClause,param:e.getIdentifierNode("err"),body:e.getBlockStatementNode(t),obfuscatedNode:!1}}},{key:"getCallExpressionNode",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return{type:i.NodeType.CallExpression,callee:e,arguments:t,obfuscatedNode:!1}}},{key:"getContinueStatement",value:function(e){var t={type:i.NodeType.ContinueStatement,obfuscatedNode:!1};return e&&(t.label=e),t}},{key:"getExpressionStatementNode",value:function(e){return{type:i.NodeType.ExpressionStatement,expression:e,obfuscatedNode:!1}}},{key:"getFunctionDeclarationNode",value:function(t,r,n){return{type:i.NodeType.FunctionDeclaration,id:e.getIdentifierNode(t),params:r,body:n,generator:!1,obfuscatedNode:!1}}},{key:"getFunctionExpressionNode",value:function(e,t){return{type:i.NodeType.FunctionExpression,params:e,body:t,generator:!1,obfuscatedNode:!1}}},{key:"getIfStatementNode",value:function(e,t,r){return Object.assign({type:i.NodeType.IfStatement,test:e,consequent:t},r&&{alternate:r},{obfuscatedNode:!1})}},{key:"getIdentifierNode",value:function(e){return{type:i.NodeType.Identifier,name:e,obfuscatedNode:!1}}},{key:"getLabeledStatement",value:function(e,t){return{type:i.NodeType.LabeledStatement,label:e,body:t,obfuscatedNode:!1}}},{key:"getLiteralNode",value:function(e,t){return t=void 0!==t?t:"'"+e+"'",{type:i.NodeType.Literal,value:e,raw:t,"x-verbatim-property":{content:t,precedence:a.Precedence.Primary},obfuscatedNode:!1}}},{key:"getLogicalExpressionNode",value:function(e,t,r){return{type:i.NodeType.LogicalExpression,operator:e,left:t,right:r,obfuscatedNode:!1}}},{key:"getMemberExpressionNode",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return{type:i.NodeType.MemberExpression,computed:r,object:e,property:t,obfuscatedNode:!1}}},{key:"getObjectExpressionNode",value:function(e){return{type:i.NodeType.ObjectExpression,properties:e,obfuscatedNode:!1}}},{key:"getPropertyNode",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return{type:i.NodeType.Property,key:e,value:t,kind:"init",method:!1,shorthand:!1,computed:r,obfuscatedNode:!1}}},{key:"getUnaryExpressionNode",value:function(e,t){var r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return{type:i.NodeType.UnaryExpression,operator:e,argument:t,prefix:r,obfuscatedNode:!1}}},{key:"getReturnStatementNode",value:function(e){return{type:i.NodeType.ReturnStatement,argument:e,obfuscatedNode:!1}}},{key:"getSwitchStatementNode",value:function(e,t){return{type:i.NodeType.SwitchStatement,discriminant:e,cases:t,obfuscatedNode:!1}}},{key:"getSwitchCaseNode",value:function(e,t){return{type:i.NodeType.SwitchCase,test:e,consequent:t,obfuscatedNode:!1}}},{key:"getUpdateExpressionNode",value:function(e,t){return{type:i.NodeType.UpdateExpression,operator:e,argument:t,prefix:!1,obfuscatedNode:!1}}},{key:"getVariableDeclarationNode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"var";return{type:i.NodeType.VariableDeclaration,declarations:e,kind:t,obfuscatedNode:!1}}},{key:"getVariableDeclaratorNode",value:function(e,t){return{type:i.NodeType.VariableDeclarator,id:e,init:t,obfuscatedNode:!1}}},{key:"getWhileStatementNode",value:function(e,t){return{type:i.NodeType.WhileStatement,test:e,body:t,obfuscatedNode:!1}}}]),e}();t.Nodes=c},function(e,t){e.exports=require("estraverse")},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var r=0;r1?t-1:0),n=1;n-1||0===e.indexOf("//")?e.split("/")[2]:e.split("/")[0],t=t.split(":")[0]}},{key:"isCeilNumber",value:function(e){return e%1==0}},{key:"stringRotate",value:function(e,t){if(!e)throw new ReferenceError("Cannot rotate empty string.");for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{},r=new i.InversifyContainerFacade;r.load(e,t);var n=r.get(a.ServiceIdentifiers.IJavaScriptObfuscator),o=n.obfuscate(e);return r.unload(),o}},{key:"runCLI",value:function(e){var t=new c.JavaScriptObfuscatorCLI(e);t.initialize(),t.run()}}]),e}();t.JavaScriptObfuscator=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.ConsoleOutputDisableExpressionNode=0]="ConsoleOutputDisableExpressionNode",e[e.DebugProtectionFunctionCallNode=1]="DebugProtectionFunctionCallNode",e[e.DebugProtectionFunctionIntervalNode=2]="DebugProtectionFunctionIntervalNode",e[e.DebugProtectionFunctionNode=3]="DebugProtectionFunctionNode",e[e.DomainLockNode=4]="DomainLockNode",e[e.NodeCallsControllerFunctionNode=5]="NodeCallsControllerFunctionNode",e[e.SelfDefendingUnicodeNode=6]="SelfDefendingUnicodeNode",e[e.StringArrayCallsWrapper=7]="StringArrayCallsWrapper",e[e.StringArrayNode=8]="StringArrayNode",e[e.StringArrayRotateFunctionNode=9]="StringArrayRotateFunctionNode"}(t.CustomNode||(t.CustomNode={}))},function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t3&&void 0!==arguments[3]?arguments[3]:0,a=void 0;a=t.length?e.getOptimalBlockScope(t,o):r,e.prependNode(a,n)}},{key:"getOptimalBlockScope",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1/0,o=t[r];if(n<=0)throw new Error("Invalid `deep` argument value. Value should be bigger then 0.");return n>1&&o.stackTrace.length?e.getOptimalBlockScope(o.stackTrace,0,--n):o.callee}},{key:"insertNodeAtIndex",value:function(t,r,o){e.validateBodyStatements(r)||(r=[]),r=e.parentizeBodyStatementsBeforeAppend(t,r),t.body=[].concat(n(t.body.slice(0,o)),n(r),n(t.body.slice(o)))}},{key:"prependNode",value:function(t,r){e.validateBodyStatements(r)||(r=[]),r=e.parentizeBodyStatementsBeforeAppend(t,r),t.body=[].concat(n(r),n(t.body))}},{key:"parentizeBodyStatementsBeforeAppend",value:function(e,t){return t.forEach(function(t){t.parentNode=e}),t}},{key:"validateBodyStatements",value:function(e){return e.every(function(e){return!!e&&e.hasOwnProperty("type")})}}]),e}();t.NodeAppender=i},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:p.randomGeneratorPool;return this.getRandomGenerator().string({length:e,pool:t})}},{key:"getRandomVariableName",value:function(e){var t="_"+d.Utils.hexadecimalPrefix,r=this.getRandomInteger(1e4,99999999),n=d.Utils.decToHex(r),o=""+t+n.substr(0,e);return this.randomVariableNameSet.has(o)?this.getRandomVariableName(e):(this.randomVariableNameSet.add(o),o)}},{key:"getSeed",value:function(){return this.seed}}]),e}();f.randomGeneratorPool="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",f.randomGeneratorPoolNumbers="0123456789",f.randomGeneratorPoolHexadecimal="abcdef"+p.randomGeneratorPoolNumbers,a.__decorate([l.initializable(),a.__metadata("design:type",Object)],f.prototype,"randomGenerator",void 0),a.__decorate([l.initializable(),a.__metadata("design:type",Number)],f.prototype,"seed",void 0),a.__decorate([i.postConstruct(),a.__metadata("design:type",Function),a.__metadata("design:paramtypes",[]),a.__metadata("design:returntype",void 0)],f.prototype,"initialize",null),f=p=a.__decorate([i.injectable(),a.__param(0,i.inject(c.ServiceIdentifiers.ISourceCode)),a.__param(1,i.inject(c.ServiceIdentifiers.IOptions)),a.__metadata("design:paramtypes",[Object,Object])],f),t.RandomGenerator=f;var p},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(22);t.DEFAULT_PRESET=Object.freeze({compact:!0,config:"",controlFlowFlattening:!1,controlFlowFlatteningThreshold:.75,deadCodeInjection:!1,deadCodeInjectionThreshold:.4,debugProtection:!1,debugProtectionInterval:!1,disableConsoleOutput:!1,domainLock:[],log:!1,mangle:!1,renameGlobals:!1,reservedNames:[],rotateStringArray:!0,seed:0,selfDefending:!1,sourceMap:!1,sourceMapBaseUrl:"",sourceMapFileName:"",sourceMapMode:n.SourceMapMode.Separate,stringArray:!0,stringArrayEncoding:!1,stringArrayThreshold:.75,unicodeEscapeSequence:!1})},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.FunctionDeclarationCalleeDataExtractor=0]="FunctionDeclarationCalleeDataExtractor",e[e.FunctionExpressionCalleeDataExtractor=1]="FunctionExpressionCalleeDataExtractor",e[e.ObjectExpressionCalleeDataExtractor=2]="ObjectExpressionCalleeDataExtractor"}(t.CalleeDataExtractor||(t.CalleeDataExtractor={}))},function(e,t){e.exports=require("esprima")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.BinaryExpressionControlFlowReplacer=0]="BinaryExpressionControlFlowReplacer",e[e.CallExpressionControlFlowReplacer=1]="CallExpressionControlFlowReplacer",e[e.LogicalExpressionControlFlowReplacer=2]="LogicalExpressionControlFlowReplacer",e[e.StringLiteralControlFlowReplacer=3]="StringLiteralControlFlowReplacer"}(t.ControlFlowReplacer||(t.ControlFlowReplacer={}))},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r1&&void 0!==arguments[1]&&arguments[1];this.storage=new Map([].concat(n(this.storage),n(e.getStorage()))),t&&(this.storageId=e.getStorageId())}},{key:"set",value:function(e,t){this.storage.set(e,t)}}]),e}();c.__decorate([l.initializable(),c.__metadata("design:type",String)],d.prototype,"storageId",void 0),c.__decorate([l.initializable(),c.__metadata("design:type",Map)],d.prototype,"storage",void 0),c.__decorate([s.postConstruct(),c.__metadata("design:type",Function),c.__metadata("design:paramtypes",[]),c.__metadata("design:returntype",void 0)],d.prototype,"initialize",null),d=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__metadata("design:paramtypes",[Object])],d),t.MapStorage=d},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e.EmptySourceCode="Empty source code. Obfuscation canceled...",e.ObfuscationCompleted="Obfuscation completed. Total time: %s sec.",e.ObfuscationStarted="Obfuscation started...",e.RandomGeneratorSeed="Random generator seed: %s...",e.StageAnalyzingASTTree="Stage: analyzing AST-tree...",e.StageControlFlowFlattening="Stage: control flow flattening...",e.StageDeadCodeInjection="Stage: dead code injection...",e.StageObfuscation="Stage: obfuscation..."}(t.LoggingMessage||(t.LoggingMessage={}))},function(e,t){e.exports=require("path")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(17);e.exports=n.JavaScriptObfuscator},function(e,t){e.exports=require("reflect-metadata")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(13),o=r(0),a=r(2),i=r(30),c=r(44),s=r(45),u=r(46),l=r(47);t.analyzersModule=new o.ContainerModule(function(e){e(a.ServiceIdentifiers.IStackTraceAnalyzer).to(l.StackTraceAnalyzer).inSingletonScope(),e(a.ServiceIdentifiers.ICalleeDataExtractor).to(c.FunctionDeclarationCalleeDataExtractor).whenTargetNamed(i.CalleeDataExtractor.FunctionDeclarationCalleeDataExtractor),e(a.ServiceIdentifiers.ICalleeDataExtractor).to(s.FunctionExpressionCalleeDataExtractor).whenTargetNamed(i.CalleeDataExtractor.FunctionExpressionCalleeDataExtractor),e(a.ServiceIdentifiers.ICalleeDataExtractor).to(u.ObjectExpressionCalleeDataExtractor).whenTargetNamed(i.CalleeDataExtractor.ObjectExpressionCalleeDataExtractor),e(a.ServiceIdentifiers.Factory__ICalleeDataExtractor).toFactory(n.InversifyContainerFacade.getCacheFactory(a.ServiceIdentifiers.ICalleeDataExtractor))})},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;rr)return"break";var a=e[o];s.traverse(a,{enter:function(r){if(l.Node.isCallExpressionNode(r))return a.parentNode!==d.NodeUtils.getBlockScopesOfNode(r)[0]?s.VisitorOption.Skip:void t.analyzeCallExpressionNode(n,e,r)}})}(a))break}return n}},{key:"analyzeCallExpressionNode",value:function(e,t,r){var n=this;p.calleeDataExtractorsList.forEach(function(o){var a=n.calleeDataExtractorFactory(o).extract(t,r.callee);a&&e.push(Object.assign({},a,{stackTrace:n.analyzeRecursive(a.callee.body)}))})}}],[{key:"getLimitIndex",value:function(e){var t=e-1,r=p.limitThresholdActivationLength-1,n=t;return t>r&&(n=Math.round(r+t*p.limitThreshold))>t&&(n=t),n}}]),e}();f.calleeDataExtractorsList=[u.CalleeDataExtractor.FunctionDeclarationCalleeDataExtractor,u.CalleeDataExtractor.FunctionExpressionCalleeDataExtractor,u.CalleeDataExtractor.ObjectExpressionCalleeDataExtractor],f.limitThresholdActivationLength=25,f.limitThreshold=.002,f=p=a.__decorate([i.injectable(),a.__param(0,i.inject(c.ServiceIdentifiers.Factory__ICalleeDataExtractor)),a.__metadata("design:paramtypes",[Function])],f),t.StackTraceAnalyzer=f;var p},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(13),o=r(0),a=r(2),i=r(32),c=r(49),s=r(50),u=r(51),l=r(52);t.controlFlowTransformersModule=new o.ContainerModule(function(e){e(a.ServiceIdentifiers.IControlFlowReplacer).to(c.BinaryExpressionControlFlowReplacer).whenTargetNamed(i.ControlFlowReplacer.BinaryExpressionControlFlowReplacer),e(a.ServiceIdentifiers.IControlFlowReplacer).to(s.CallExpressionControlFlowReplacer).whenTargetNamed(i.ControlFlowReplacer.CallExpressionControlFlowReplacer),e(a.ServiceIdentifiers.IControlFlowReplacer).to(u.LogicalExpressionControlFlowReplacer).whenTargetNamed(i.ControlFlowReplacer.LogicalExpressionControlFlowReplacer),e(a.ServiceIdentifiers.IControlFlowReplacer).to(l.StringLiteralControlFlowReplacer).whenTargetNamed(i.ControlFlowReplacer.StringLiteralControlFlowReplacer),e(a.ServiceIdentifiers.Factory__IControlFlowReplacer).toFactory(n.InversifyContainerFacade.getCacheFactory(a.ServiceIdentifiers.IControlFlowReplacer))})},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r 0;\n \n switch (isPositive) {\n case true:\n return this.item + '_' + this.value + '_' + i;\n default:\n this.item + '_' + this.value;\n }\n }\n }()\n };\n };\n \n var regExp = new RegExp(\"[{diff}]\", \"g\");\n var domains = \"{domains}\".replace(regExp, \"\").split(\";\");\n var document;\n var domain;\n \n for (var d in that) {\n if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) {\n document = d;\n \n break;\n }\n }\n\n for (var d1 in that[document]) {\n if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) {\n domain = d1;\n \n break;\n }\n }\n \n if ((!document && !domain) || (!that[document] && !that[document][domain])) {\n return;\n }\n \n var currentDomain = that[document][domain];\n\n var ok = false;\n \n for (var i = 0; i < domains.length; i++) {\n var domain = domains[i];\n var position = currentDomain.length - domain.length;\n var lastIndex = currentDomain.indexOf(domain, position);\n var endsWith = lastIndex !== -1 && lastIndex === position;\n \n if (endsWith) {\n if (currentDomain.length == domain.length || domain.indexOf(\".\") === 0) {\n ok = true;\n }\n \n break;\n }\n }\n \n if (!ok) {\n data;\n } else {\n return;\n }\n \n func();\n });\n\n {domainLockFunctionName}();\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.DomainLockNodeTemplate=n},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r> 1 + 255 % 0;\n \n if (string.indexOf('i' === i)) {\n recursiveFunc2(string)\n }\n };\n \n var recursiveFunc2 = function (string) {\n var i = ~-4 >> 1 + 255 % 0;\n \n if (string.indexOf((true+\"\")[3]) !== i) {\n recursiveFunc1(string)\n }\n };\n \n if (!test1()) {\n if (!test2()) {\n recursiveFunc1('indеxOf');\n } else {\n recursiveFunc1('indexOf');\n }\n } else {\n recursiveFunc1('indеxOf');\n }\n })\n \n {selfDefendingFunctionName}();\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.SelfDefendingTemplate=n},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r> (-2 * bc & 6)) : 0\n ) {\n buffer = chars.indexOf(buffer);\n }\n return output;\n });\n })();\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.AtobTemplate=n},function(e,t,r){"use strict";function n(){return"\n var rc4 = function (str, key) {\n var s = [], j = 0, x, res = '', newStr = '';\n \n str = atob(str);\n \n for (var k = 0, length = str.length; k < length; k++) {\n newStr += '%' + ('00' + str.charCodeAt(k).toString(16)).slice(-2);\n }\n \n str = decodeURIComponent(newStr);\n \t \n\t for (var i = 0; i < 256; i++) {\n s[i] = i;\n }\n \n for (i = 0; i < 256; i++) {\n j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;\n x = s[i];\n s[i] = s[j];\n s[j] = x;\n }\n \n i = 0;\n j = 0;\n \n for (var y = 0; y < str.length; y++) {\n i = (i + 1) % 256;\n j = (j + s[i]) % 256;\n x = s[i];\n s[i] = s[j];\n s[j] = x;\n res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);\n }\n \n return res;\n }\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.Rc4Template=n},function(e,t,r){"use strict";function n(e){return"\n var StatesClass = function (rc4Bytes) {\n this.rc4Bytes = rc4Bytes;\n this.states = [1, 0, 0];\n this.newState = function(){return 'newState';};\n this.firstState = '"+e.encode("\\w+ *\\(\\) *{\\w+ *",!0)+"';\n this.secondState = '"+e.encode("['|\"].+['|\"];? *}",!0)+"';\n };\n \n StatesClass.prototype.checkState = function () {\n var regExp = new RegExp(this.firstState + this.secondState);\n\n return this.runState(regExp.test(this.newState.toString()) ? --this.states[1] : --this.states[0]);\n };\n \n StatesClass.prototype.runState = function (stateResult) {\n if (!Boolean(~stateResult)) {\n return stateResult;\n }\n \n return this.getState(this.rc4Bytes);\n };\n\n StatesClass.prototype.getState = function (rc4Bytes) {\n for (var i = 0, len = this.states.length; i < len; i++) {\n this.states.push(Math.round(Math.random()));\n len = this.states.length;\n }\n \n return rc4Bytes(this.states[0]);\n };\n\n new StatesClass({stringArrayCallsWrapperName}).checkState();\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.SelfDefendingTemplate=n},function(e,t,r){"use strict";function n(){return" \n if ({stringArrayCallsWrapperName}.initialized === undefined) {\n {atobPolyfill}\n \n {stringArrayCallsWrapperName}.base64DecodeUnicode = function (str) {\n var string = atob(str);\n var newStringChars = [];\n \n for (var i = 0, length = string.length; i < length; i++) {\n newStringChars += '%' + ('00' + string.charCodeAt(i).toString(16)).slice(-2);\n }\n \n return decodeURIComponent(newStringChars);\n };\n \n {stringArrayCallsWrapperName}.data = {};\n \n {stringArrayCallsWrapperName}.initialized = true;\n }\n \n var cachedValue = {stringArrayCallsWrapperName}.data[index];\n \n if (cachedValue === undefined) {\n {selfDefendingCode}\n \n value = {stringArrayCallsWrapperName}.base64DecodeUnicode(value);\n {stringArrayCallsWrapperName}.data[index] = value;\n } else {\n value = cachedValue;\n } \n "}Object.defineProperty(t,"__esModule",{value:!0}),t.StringArrayBase64DecodeNodeTemplate=n},function(e,t,r){"use strict";function n(){return"\n var {stringArrayCallsWrapperName} = function (index, key) {\n index = index - 0;\n \n var value = {stringArrayName}[index];\n \n {decodeNodeTemplate}\n \n return value;\n };\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.StringArrayCallsWrapperTemplate=n},function(e,t,r){"use strict";function n(){return"\n if ({stringArrayCallsWrapperName}.initialized === undefined) {\n {atobPolyfill}\n \n {rc4Polyfill}\n {stringArrayCallsWrapperName}.rc4 = rc4;\n \n {stringArrayCallsWrapperName}.data = {};\n \n {stringArrayCallsWrapperName}.initialized = true;\n }\n \n var cachedValue = {stringArrayCallsWrapperName}.data[index];\n\n if (cachedValue === undefined) {\n if ({stringArrayCallsWrapperName}.once === undefined) {\n {selfDefendingCode}\n \n {stringArrayCallsWrapperName}.once = true;\n }\n \n value = {stringArrayCallsWrapperName}.rc4(value, key);\n {stringArrayCallsWrapperName}.data[index] = value;\n } else {\n value = cachedValue;\n }\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.StringArrayRc4DecodeNodeTemplate=n},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;rh.hostNodeSearchMinDepth&&t.splice(0,h.hostNodeSearchMinDepth),t.length>h.hostNodeSearchMaxDepth&&(t.length=h.hostNodeSearchMaxDepth),this.randomGenerator.getRandomGenerator().pickone(t))}},{key:"isVisitedFunctionNode",value:function(e){return(y.Node.isFunctionDeclarationNode(e)||y.Node.isFunctionExpressionNode(e)||y.Node.isArrowFunctionExpressionNode(e))&&this.visitedFunctionNodes.has(e)}},{key:"transformFunctionBody",value:function(e,t){var r=this;l.replace(e,{enter:function(e,n){if(r.isVisitedFunctionNode(e))return l.VisitorOption.Skip;if(!h.controlFlowReplacersMap.has(e.type))return e;if(r.randomGenerator.getMathRandom()>r.options.controlFlowFlatteningThreshold)return e;var o=h.controlFlowReplacersMap.get(e.type);return void 0===o?e:Object.assign({},r.controlFlowReplacerFactory(o).replace(e,n,t),{parentNode:n})}})}}]),t}(p.AbstractNodeTransformer);v.controlFlowReplacersMap=new Map([[f.NodeType.BinaryExpression,b.ControlFlowReplacer.BinaryExpressionControlFlowReplacer],[f.NodeType.CallExpression,b.ControlFlowReplacer.CallExpressionControlFlowReplacer],[f.NodeType.LogicalExpression,b.ControlFlowReplacer.LogicalExpressionControlFlowReplacer],[f.NodeType.Literal,b.ControlFlowReplacer.StringLiteralControlFlowReplacer]]),v.hostNodeSearchMinDepth=0,v.hostNodeSearchMaxDepth=2,v=h=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.Factory__TControlFlowStorage)),c.__param(1,s.inject(u.ServiceIdentifiers.Factory__IControlFlowReplacer)),c.__param(2,s.inject(u.ServiceIdentifiers.Factory__IControlFlowCustomNode)),c.__param(3,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(4,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Function,Function,Function,Object,Object])],v),t.FunctionControlFlowTransformer=v;var h},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;rthis.options.controlFlowFlatteningThreshold||!m.canTransformBlockStatementNode(e))return e;var r=e.body,n=this.arrayUtils.arrayRange(r.length),o=this.arrayUtils.arrayShuffle(n),a=n.map(function(e){return o.indexOf(e)}),i=this.controlFlowCustomNodeFactory(d.ControlFlowCustomNode.BlockStatementControlFlowFlatteningNode);return i.initialize(r,o,a),i.getNode()[0]}}],[{key:"blockStatementHasProhibitedStatements",value:function(e){return e.body.some(function(e){var t=p.Node.isBreakStatementNode(e)||p.Node.isContinueStatementNode(e),r=p.Node.isVariableDeclarationNode(e)&&("const"===e.kind||"let"===e.kind);return p.Node.isFunctionDeclarationNode(e)||t||r})}},{key:"canTransformBlockStatementNode",value:function(e){var t=!0;return l.traverse(e,{enter:function(e){if(p.Node.isWhileStatementNode(e))return l.VisitorOption.Skip;p.Node.isBlockStatementNode(e)&&m.blockStatementHasProhibitedStatements(e)&&(t=!1)}}),e.body.length<=4&&(t=!1),t}}]),t}(f.AbstractNodeTransformer);y=m=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.Factory__IControlFlowCustomNode)),c.__param(1,s.inject(u.ServiceIdentifiers.IArrayUtils)),c.__param(2,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(3,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Function,Object,Object,Object])],y),t.BlockStatementControlFlowTransformer=y;var m},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;rb.maxNestedBlockStatementsCount||f.Node.isBreakStatementNode(e)||f.Node.isContinueStatementNode(e)?(a=!1,l.VisitorOption.Break):(f.Node.isIdentifierNode(e)&&!f.Node.isMemberExpressionNode(t)&&(e.name=r.randomGenerator.getRandomVariableName(6)),e)}}),a&&t.push(n)}},{key:"replaceBlockStatementNode",value:function(e,t){var r=this.randomGenerator.getMathRandom()>.5,n=this.randomGenerator.getMathRandom()>.5,o=r?"===":"!==",a=this.randomGenerator.getRandomString(3),i=n?a:this.randomGenerator.getRandomString(3),c=void 0,s=void 0;r&&n||!r&&!n?(c=e,s=t):(c=t,s=e);var u=p.Nodes.getBlockStatementNode([p.Nodes.getIfStatementNode(p.Nodes.getBinaryExpressionNode(o,p.Nodes.getLiteralNode(a),p.Nodes.getLiteralNode(i)),c,s)]);return u=y.NodeUtils.parentize(u)}},{key:"transformProgramNode",value:function(e){var t=this;l.traverse(e,{enter:function(e,r){f.Node.isBlockStatementNode(e)&&t.collectBlockStatementNodes(e,t.collectedBlockStatements)}}),this.collectedBlockStatements.lengtht.options.deadCodeInjectionThreshold)return e;var n=t.collectedBlockStatements.length-1,o=t.randomGenerator.getRandomInteger(0,n),a=t.collectedBlockStatements.splice(o,1)[0];return a===e?e:t.replaceBlockStatementNode(e,a)}})}}]),t}(d.AbstractNodeTransformer);m.maxNestedBlockStatementsCount=4,m.minCollectedBlockStatementsCount=5,m=b=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(1,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Object,Object])],m),t.DeadCodeInjectionTransformer=m;var b},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r1){var o=f.Nodes.getBinaryExpressionNode("+",n.shift(),n.shift());return n.forEach(function(e){o=f.Nodes.getBinaryExpressionNode("+",o,e)}),o}return n[0]}}],[{key:"isLiteralNodeWithStringValue",value:function(e){return e&&d.Node.isLiteralNode(e)&&"string"==typeof e.value}}]),t}(l.AbstractNodeTransformer);p=y=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(1,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Object,Object])],p),t.TemplateLiteralTransformer=p;var y},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r=m.minimumLengthForStringArray&&this.randomGenerator.getMathRandom()<=this.options.stringArrayThreshold}},{key:"getStringArrayHexadecimalIndex",value:function(e,t){if(this.stringLiteralHexadecimalIndexCache.has(e))return{fromCache:!0,index:this.stringLiteralHexadecimalIndexCache.get(e)};var r=p.Utils.decToHex(t),n=""+p.Utils.hexadecimalPrefix+r;return this.stringLiteralHexadecimalIndexCache.set(e,n),{fromCache:!1,index:n}}},{key:"getEncodedValue",value:function(e){var t=void 0,r=null;switch(this.options.stringArrayEncoding){case l.StringArrayEncoding.Rc4:r=this.randomGenerator.getRandomGenerator().pickone(this.rc4Keys),t=this.cryptUtils.btoa(this.cryptUtils.rc4(e,r));break;case l.StringArrayEncoding.Base64:t=this.cryptUtils.btoa(e);break;default:t=e}return{encodedValue:t,key:r}}},{key:"replaceWithLiteralNode",value:function(e){return f.Nodes.getLiteralNode(this.escapeSequenceEncoder.encode(e,this.options.unicodeEscapeSequence))}},{key:"replaceWithStringArrayCallNode",value:function(e){var t=this.getEncodedValue(e),r=t.encodedValue,n=t.key,o=this.escapeSequenceEncoder.encode(r,this.options.unicodeEscapeSequence),a=this.stringArrayStorage.getLength(),i=p.Utils.stringRotate(this.stringArrayStorage.getStorageId(),1),c="_"+p.Utils.hexadecimalPrefix+i,s=this.getStringArrayHexadecimalIndex(o,a),u=s.fromCache,l=s.index;u||this.stringArrayStorage.set(a,o);var d=[m.getHexadecimalLiteralNode(l)];return n&&d.push(m.getRc4KeyLiteralNode(this.escapeSequenceEncoder.encode(n,this.options.unicodeEscapeSequence))),f.Nodes.getCallExpressionNode(f.Nodes.getIdentifierNode(c),d)}}],[{key:"getHexadecimalLiteralNode",value:function(e){var t=f.Nodes.getLiteralNode(e);return t.obfuscatedNode=!0,t}},{key:"getRc4KeyLiteralNode",value:function(e){var t=f.Nodes.getLiteralNode(e);return t.obfuscatedNode=!0,t}}]),t}(d.AbstractObfuscatingReplacer);y.minimumLengthForStringArray=3,y.rc4KeyLength=4,y.rc4KeysCount=50,y=m=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.TCustomNodeGroupStorage)),c.__param(1,s.inject(u.ServiceIdentifiers.TStringArrayStorage)),c.__param(2,s.inject(u.ServiceIdentifiers.IEscapeSequenceEncoder)),c.__param(3,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(4,s.inject(u.ServiceIdentifiers.ICryptUtils)),c.__param(5,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Object,Object,Object,Object,Object,Object])],y),t.StringLiteralObfuscatingReplacer=y;var m},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),o=r(2),a=r(119),i=r(120),c=r(121);t.storagesModule=new n.ContainerModule(function(e){e(o.ServiceIdentifiers.TCustomNodeGroupStorage).to(i.CustomNodeGroupStorage).inSingletonScope(),e(o.ServiceIdentifiers.TStringArrayStorage).to(c.StringArrayStorage).inSingletonScope(),e(o.ServiceIdentifiers.Newable__TControlFlowStorage).toConstructor(a.ControlFlowStorage),e(o.ServiceIdentifiers.Factory__TControlFlowStorage).toFactory(function(e){return function(){var t=e.container.get(o.ServiceIdentifiers.Newable__TControlFlowStorage),r=e.container.get(o.ServiceIdentifiers.IRandomGenerator),n=new t(r);return n.initialize(),n}})})},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=r(1),c=r(0),s=r(2),u=r(38),l=function(e){function t(e){return n(this,t),o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e))}return a(t,e),t}(u.MapStorage);l=i.__decorate([c.injectable(),i.__param(0,c.inject(s.ServiceIdentifiers.IRandomGenerator)),i.__metadata("design:paramtypes",[Object])],l),t.ControlFlowStorage=l},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r=0?t:null}},{key:"getLength",value:function(){return this.storageLength}},{key:"getStorage",value:function(){return this.storage}},{key:"getStorageId",value:function(){return this.storageId}},{key:"mergeWith",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.storage=[].concat(n(this.storage),n(e.getStorage())),t&&(this.storageId=e.getStorageId())}},{key:"set",value:function(e,t){e===this.storageLength?this.storage.push(t):this.storage.splice(e,0,t),this.storageLength++}}]),e}();i.__decorate([u.initializable(),i.__metadata("design:type",Array)],l.prototype,"storage",void 0),i.__decorate([u.initializable(),i.__metadata("design:type",String)],l.prototype,"storageId",void 0),i.__decorate([c.postConstruct(),i.__metadata("design:type",Function),i.__metadata("design:paramtypes",[]),i.__metadata("design:returntype",void 0)],l.prototype,"initialize",null),l=i.__decorate([c.injectable(),i.__param(0,c.inject(s.ServiceIdentifiers.IRandomGenerator)),i.__metadata("design:paramtypes",[Object])],l),t.ArrayStorage=l},function(e,t){e.exports=require("md5")},function(e,t){e.exports=require("chance")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),o=r(2),a=r(126),i=r(127),c=r(128),s=r(28);t.utilsModule=new n.ContainerModule(function(e){e(o.ServiceIdentifiers.IArrayUtils).to(a.ArrayUtils).inSingletonScope(),e(o.ServiceIdentifiers.IRandomGenerator).to(s.RandomGenerator).inSingletonScope(),e(o.ServiceIdentifiers.ICryptUtils).to(i.CryptUtils).inSingletonScope(),e(o.ServiceIdentifiers.IEscapeSequenceEncoder).to(c.EscapeSequenceEncoder).inSingletonScope()})},function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t>8-o%1*8)){if((n=e.charCodeAt(o+=.75))>255)throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");r=r<<8|n}return t}},{key:"hideString",value:function(e,t){var r=this,n=this.randomGenerator.getRandomGenerator().string({length:t,pool:s.RandomGenerator.randomGeneratorPool}),o=n.replace(new RegExp("["+function(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}(e)+"]","g"),""),a=o.split("");return this.randomGenerator.getRandomGenerator().shuffle(a),o=a.join(""),[function(e,t){for(var n=-1,o=-1,a="";n [options]").version(y.CLIUtils.getPackageConfig().version,"-v, --version").option("-o, --output ","Output path for obfuscated code").option("--compact ","Disable one line output code compacting",d.BooleanSanitizer).option("--config ","Name of js / json config file").option("--controlFlowFlattening ","Enables control flow flattening",d.BooleanSanitizer).option("--controlFlowFlatteningThreshold ","The probability that the control flow flattening transformation will be applied to the node",parseFloat).option("--deadCodeInjection ","Enables dead code injection",d.BooleanSanitizer).option("--deadCodeInjectionThreshold ","The probability that the dead code injection transformation will be applied to the node",parseFloat).option("--debugProtection ","Disable browser Debug panel (can cause DevTools enabled browser freeze)",d.BooleanSanitizer).option("--debugProtectionInterval ","Disable browser Debug panel even after page was loaded (can cause DevTools enabled browser freeze)",d.BooleanSanitizer).option("--disableConsoleOutput ","Allow console.log, console.info, console.error and console.warn messages output into browser console",d.BooleanSanitizer).option("--domainLock ","Blocks the execution of the code in domains that do not match the passed RegExp patterns (comma separated)",l.ArraySanitizer).option("--log ","Enables logging of the information to the console",d.BooleanSanitizer).option("--mangle ","Enables mangling of variable names",d.BooleanSanitizer).option("--reservedNames ","Disable obfuscation of variable names, function names and names of function parameters that match the passed RegExp patterns (comma separated)",l.ArraySanitizer).option("--renameGlobals ","Allows to enable obfuscation of global variable and function names with declaration.",d.BooleanSanitizer).option("--rotateStringArray ","Disable rotation of unicode array values during obfuscation",d.BooleanSanitizer).option("--seed ","Sets seed for random generator. This is useful for creating repeatable results.",parseFloat).option("--selfDefending ","Disables self-defending for obfuscated code",d.BooleanSanitizer).option("--sourceMap ","Enables source map generation",d.BooleanSanitizer).option("--sourceMapBaseUrl ","Sets base url to the source map import url when `--sourceMapMode=separate`").option("--sourceMapFileName ","Sets file name for output source map when `--sourceMapMode=separate`").option("--sourceMapMode [inline, separate]","Specify source map output mode",f.SourceMapModeSanitizer).option("--stringArray ","Disables gathering of all literal strings into an array and replacing every literal string with an array call",d.BooleanSanitizer).option("--stringArrayEncoding [true, false, base64, rc4]","Encodes all strings in strings array using base64 or rc4 (this option can slow down your code speed",p.StringArrayEncodingSanitizer).option("--stringArrayThreshold ","The probability that the literal string will be inserted into stringArray (Default: 0.8, Min: 0, Max: 1)",parseFloat).option("--unicodeEscapeSequence ","Allows to enable/disable string conversion to unicode escape sequence",d.BooleanSanitizer).parse(this.rawArguments)}},{key:"configureHelp",value:function(){this.commands.on("--help",function(){console.log(" Examples:\n"),console.log(" %> javascript-obfuscator in.js --compact true --selfDefending false"),console.log(" %> javascript-obfuscator in.js --output out.js --compact true --selfDefending false"),console.log("")})}},{key:"processSourceCode",value:function(){var e=this.buildOptions(),t=y.CLIUtils.getOutputCodePath(this.inputCLIOptions.output,this.inputPath);e.sourceMap?this.processSourceCodeWithSourceMap(t,e):this.processSourceCodeWithoutSourceMap(t,e)}},{key:"processSourceCodeWithoutSourceMap",value:function(e,t){var r=m.JavaScriptObfuscator.obfuscate(this.sourceCode,t).getObfuscatedCode();y.CLIUtils.writeFile(e,r)}},{key:"processSourceCodeWithSourceMap",value:function(e,t){var r=y.CLIUtils.getOutputSourceMapPath(e,t.sourceMapFileName||"");t=Object.assign({},t,{sourceMapFileName:c.basename(r)});var n=m.JavaScriptObfuscator.obfuscate(this.sourceCode,t);y.CLIUtils.writeFile(e,n.getObfuscatedCode()),"separate"===t.sourceMapMode&&n.getSourceMap()&&y.CLIUtils.writeFile(r,n.getSourceMap())}}],[{key:"filterOptions",value:function(e){var t={};for(var r in e)e.hasOwnProperty(r)&&void 0!==e[r]&&(t[r]=e[r]);return t}}]),e}();a.__decorate([s.initializable(),a.__metadata("design:type",Object)],b.prototype,"commands",void 0),a.__decorate([s.initializable(),a.__metadata("design:type",Object)],b.prototype,"inputCLIOptions",void 0),a.__decorate([s.initializable(),a.__metadata("design:type",String)],b.prototype,"inputPath",void 0),a.__decorate([s.initializable(),a.__metadata("design:type",String)],b.prototype,"sourceCode",void 0),t.JavaScriptObfuscatorCLI=b},function(e,t){e.exports=require("commander")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ArraySanitizer=function(e){return e.split(",").map(function(e){return e.trim()})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BooleanSanitizer=function(e){return"true"===e||"1"===e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(22);t.SourceMapModeSanitizer=function(e){if(!Object.keys(n.SourceMapMode).some(function(t){return n.SourceMapMode[t]===e}))throw new ReferenceError("Invalid value of `--sourceMapMode` option");return e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(27);t.StringArrayEncodingSanitizer=function(e){switch(e){case"true":case"1":case n.StringArrayEncoding.Base64:return!0;case n.StringArrayEncoding.Rc4:return n.StringArrayEncoding.Rc4;default:return!1}}},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:"";return t&&(e=e.substring(0,e.lastIndexOf("/"))+"/"+t),/\.js\.map$/.test(e)?/\.js$/.test(e)&&(e+=".map"):e=e.split(".")[0]+".js.map",e}},{key:"getPackageConfig",value:function(){return JSON.parse(a.readFileSync(c.join(c.dirname(a.realpathSync(process.argv[1])),"../package.json"),e.encoding))}},{key:"getUserConfig",value:function(e){var t=void 0;try{t=!function(){var e=new Error('Cannot find module "."');throw e.code="MODULE_NOT_FOUND",e}()}catch(r){try{t=require(e)}catch(e){throw new ReferenceError("Given config path must be a valid file path")}}return t}},{key:"isFilePath",value:function(e){try{return a.statSync(e).isFile()}catch(e){return!1}}},{key:"readSourceCode",value:function(t){if(!e.isFilePath(t))throw new ReferenceError("Given input path must be a valid file path");if(-1===e.availableInputExtensions.indexOf(c.extname(t)))throw new ReferenceError("Input file must have .js extension");return a.readFileSync(t,e.encoding)}},{key:"writeFile",value:function(t,r){i.sync(c.dirname(t)),a.writeFileSync(t,r,{encoding:e.encoding})}}]),e}();s.availableInputExtensions=[".js"],s.encoding="utf8",t.CLIUtils=s},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("mkdirp")},function(e,t){function r(e){throw new Error("Cannot find module '"+e+"'.")}r.keys=function(){return[]},r.resolve=r,e.exports=r,r.id=163}]); +require("source-map-support").install(),module.exports=function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=40)}([function(e,t){e.exports=require("inversify")},function(e,t){e.exports=require("tslib")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e.Factory__ICalleeDataExtractor="Factory",e.Factory__IControlFlowCustomNode="Factory",e.Factory__IControlFlowReplacer="Factory",e.Factory__ICustomNode="Factory",e.Factory__ICustomNodeGroup="Factory",e.Factory__IIdentifierObfuscatingReplacer="Factory",e.Factory__INodeGuard="Factory",e.Factory__INodeTransformer="Factory",e.Factory__IObfuscationResult="Factory",e.Factory__IObfuscatingReplacer="Factory",e.Factory__TControlFlowStorage="Factory",e.IArrayUtils="IArrayUtils",e.ICalleeDataExtractor="ICalleeDataExtractor",e.ICryptUtils="ICryptUtils",e.ICustomNode="ICustomNode",e.ICustomNodeGroup="ICustomNodeGroup",e.IControlFlowReplacer="IControlFlowReplacer",e.IDeadCodeInjectionReplacer="IDeadCodeInjectionReplacer",e.IEscapeSequenceEncoder="IEscapeSequenceEncoder",e.IIdentifierObfuscatingReplacer="IIdentifierObfuscatingReplacer",e.IJavaScriptObfuscator="IJavaScriptObfuscator",e.ILogger="ILogger",e.INodeGuard="INodeGuard",e.INodeTransformer="INodeTransformer",e.IObfuscationEventEmitter="IObfuscationEventEmitter",e.IObfuscationResult="IObfuscationResult",e.IOptions="IOptions",e.IObfuscatingReplacer="IObfuscatingReplacer",e.IRandomGenerator="IRandomGenerator",e.ISourceCode="ISourceCode",e.ISourceMapCorrector="ISourceMapCorrector",e.IStackTraceAnalyzer="IStackTraceAnalyzer",e.ITransformersRunner="ITransformersRunner",e.Newable__ICustomNode="Newable",e.Newable__TControlFlowStorage="Newable",e.TCustomNodeGroupStorage="TCustomNodeGroupStorage",e.TStringArrayStorage="TStringArrayStorage"}(t.ServiceIdentifiers||(t.ServiceIdentifiers={}))},function(e,t,r){"use strict";function n(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"initialize",t=Object.keys(this)[0];return function(r,n){var o={configurable:!0,enumerable:!0},a=r[e];if(!a||"function"!=typeof a)throw new Error("`"+e+"` method with initialization logic not found. `@"+t+"` decorator requires `"+e+"` method");var i="_"+n,c=Object.getOwnPropertyDescriptor(r,i)||o,s=Object.getOwnPropertyDescriptor(r,e)||o,u=s.value;return Object.defineProperty(r,n,Object.assign({},c,{get:function(){if(void 0===this[i])throw new Error("Property `"+n+"` is not initialized! Initialize it first!");return this[i]},set:function(e){this[i]=e}})),Object.defineProperty(r,e,Object.assign({},s,{value:function(){u.apply(this,arguments),this[n]}})),c}}Object.defineProperty(t,"__esModule",{value:!0}),t.initializable=n},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=function(){function e(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:0;if(l.Node.isNodeHasBlockStatement(e)){if(void 0===e.body[t])throw new ReferenceError("Wrong index `"+t+"`. Block-statement body length is `"+e.body.length+"`");return e.body[t]}throw new TypeError("The specified node have no a block-statement")}},{key:"getBlockScopesOfNode",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=t.parentNode;if(!n)throw new ReferenceError("`parentNode` property of given node is `undefined`");if(l.Node.isBlockStatementNode(n)){if(!n.parentNode)throw new ReferenceError("`parentNode` property of `parentNode` of given node is `undefined`");-1!==e.nodesWithBlockScope.indexOf(n.parentNode.type)&&r.push(n)}return t!==n?e.getBlockScopesOfNode(n,r):(l.Node.isNodeHasBlockStatement(n)&&r.push(n),r)}},{key:"getNodeBlockScopeDepth",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=t.parentNode;if(!n)throw new ReferenceError("`parentNode` property of given node is `undefined`");return l.Node.isProgramNode(n)?r:l.Node.isBlockStatementNode(t)&&-1!==e.nodesWithBlockScope.indexOf(n.type)?e.getNodeBlockScopeDepth(n,++r):e.getNodeBlockScopeDepth(n,r)}},{key:"getUnaryExpressionArgumentNode",value:function(t){return l.Node.isUnaryExpressionNode(t.argument)?e.getUnaryExpressionArgumentNode(t.argument):t.argument}},{key:"parentize",value:function(e){return s.traverse(e,{enter:function(e,t){e.parentNode=t||e,e.obfuscatedNode=!1}}),e}},{key:"typedReplace",value:function(t,r,n){e.typedTraverse(t,r,n,"replace")}},{key:"typedTraverse",value:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"traverse";s[n](e,{enter:function(e,n){if(e.type===t&&r.enter)return r.enter(e,n)},leave:function(e,n){if(e.type===t&&r.leave)return r.leave(e,n)}})}}]),e}();f.nodesWithBlockScope=[u.NodeType.ArrowFunctionExpression,u.NodeType.FunctionDeclaration,u.NodeType.FunctionExpression,u.NodeType.MethodDefinition,u.NodeType.Program],t.NodeUtils=f},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:[];return{type:i.NodeType.Program,body:e,sourceType:"script",obfuscatedNode:!1}}},{key:"getArrayExpressionNode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{type:i.NodeType.ArrayExpression,elements:e}}},{key:"getAssignmentExpressionNode",value:function(e,t,r){return{type:i.NodeType.AssignmentExpression,operator:e,left:t,right:r,obfuscatedNode:!1}}},{key:"getBinaryExpressionNode",value:function(e,t,r){return{type:i.NodeType.BinaryExpression,operator:e,left:t,right:r,obfuscatedNode:!1}}},{key:"getBlockStatementNode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{type:i.NodeType.BlockStatement,body:e,obfuscatedNode:!1}}},{key:"getBreakStatement",value:function(e){var t={type:i.NodeType.BreakStatement,obfuscatedNode:!1};return e&&(t.label=e),t}},{key:"getCatchClauseNode",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{type:i.NodeType.CatchClause,param:e.getIdentifierNode("err"),body:e.getBlockStatementNode(t),obfuscatedNode:!1}}},{key:"getCallExpressionNode",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return{type:i.NodeType.CallExpression,callee:e,arguments:t,obfuscatedNode:!1}}},{key:"getContinueStatement",value:function(e){var t={type:i.NodeType.ContinueStatement,obfuscatedNode:!1};return e&&(t.label=e),t}},{key:"getExpressionStatementNode",value:function(e){return{type:i.NodeType.ExpressionStatement,expression:e,obfuscatedNode:!1}}},{key:"getFunctionDeclarationNode",value:function(t,r,n){return{type:i.NodeType.FunctionDeclaration,id:e.getIdentifierNode(t),params:r,body:n,generator:!1,obfuscatedNode:!1}}},{key:"getFunctionExpressionNode",value:function(e,t){return{type:i.NodeType.FunctionExpression,params:e,body:t,generator:!1,obfuscatedNode:!1}}},{key:"getIfStatementNode",value:function(e,t,r){return Object.assign({type:i.NodeType.IfStatement,test:e,consequent:t},r&&{alternate:r},{obfuscatedNode:!1})}},{key:"getIdentifierNode",value:function(e){return{type:i.NodeType.Identifier,name:e,obfuscatedNode:!1}}},{key:"getLabeledStatement",value:function(e,t){return{type:i.NodeType.LabeledStatement,label:e,body:t,obfuscatedNode:!1}}},{key:"getLiteralNode",value:function(e,t){return t=void 0!==t?t:"'"+e+"'",{type:i.NodeType.Literal,value:e,raw:t,"x-verbatim-property":{content:t,precedence:a.Precedence.Primary},obfuscatedNode:!1}}},{key:"getLogicalExpressionNode",value:function(e,t,r){return{type:i.NodeType.LogicalExpression,operator:e,left:t,right:r,obfuscatedNode:!1}}},{key:"getMemberExpressionNode",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return{type:i.NodeType.MemberExpression,computed:r,object:e,property:t,obfuscatedNode:!1}}},{key:"getObjectExpressionNode",value:function(e){return{type:i.NodeType.ObjectExpression,properties:e,obfuscatedNode:!1}}},{key:"getPropertyNode",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return{type:i.NodeType.Property,key:e,value:t,kind:"init",method:!1,shorthand:!1,computed:r,obfuscatedNode:!1}}},{key:"getUnaryExpressionNode",value:function(e,t){var r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return{type:i.NodeType.UnaryExpression,operator:e,argument:t,prefix:r,obfuscatedNode:!1}}},{key:"getReturnStatementNode",value:function(e){return{type:i.NodeType.ReturnStatement,argument:e,obfuscatedNode:!1}}},{key:"getSwitchStatementNode",value:function(e,t){return{type:i.NodeType.SwitchStatement,discriminant:e,cases:t,obfuscatedNode:!1}}},{key:"getSwitchCaseNode",value:function(e,t){return{type:i.NodeType.SwitchCase,test:e,consequent:t,obfuscatedNode:!1}}},{key:"getUpdateExpressionNode",value:function(e,t){return{type:i.NodeType.UpdateExpression,operator:e,argument:t,prefix:!1,obfuscatedNode:!1}}},{key:"getVariableDeclarationNode",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"var";return{type:i.NodeType.VariableDeclaration,declarations:e,kind:t,obfuscatedNode:!1}}},{key:"getVariableDeclaratorNode",value:function(e,t){return{type:i.NodeType.VariableDeclarator,id:e,init:t,obfuscatedNode:!1}}},{key:"getWhileStatementNode",value:function(e,t){return{type:i.NodeType.WhileStatement,test:e,body:t,obfuscatedNode:!1}}}]),e}();t.Nodes=c},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e.ArrayExpression="ArrayExpression",e.ArrowFunctionExpression="ArrowFunctionExpression",e.AssignmentExpression="AssignmentExpression",e.AssignmentPattern="AssignmentPattern",e.BinaryExpression="BinaryExpression",e.BlockStatement="BlockStatement",e.BreakStatement="BreakStatement",e.CallExpression="CallExpression",e.CatchClause="CatchClause",e.ClassDeclaration="ClassDeclaration",e.ContinueStatement="ContinueStatement",e.ExpressionStatement="ExpressionStatement",e.FunctionDeclaration="FunctionDeclaration",e.FunctionExpression="FunctionExpression",e.Identifier="Identifier",e.IfStatement="IfStatement",e.LabeledStatement="LabeledStatement",e.Literal="Literal",e.LogicalExpression="LogicalExpression",e.MemberExpression="MemberExpression",e.MethodDefinition="MethodDefinition",e.ObjectExpression="ObjectExpression",e.ObjectPattern="ObjectPattern",e.Program="Program",e.Property="Property",e.ReturnStatement="ReturnStatement",e.SwitchCase="SwitchCase",e.SwitchStatement="SwitchStatement",e.TemplateLiteral="TemplateLiteral",e.TryStatement="TryStatement",e.UnaryExpression="UnaryExpression",e.UpdateExpression="UpdateExpression",e.VariableDeclaration="VariableDeclaration",e.VariableDeclarator="VariableDeclarator",e.WhileStatement="WhileStatement"}(t.NodeType||(t.NodeType={}))},function(e,t){e.exports=require("string-template")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.BinaryExpressionFunctionNode=0]="BinaryExpressionFunctionNode",e[e.BlockStatementControlFlowFlatteningNode=1]="BlockStatementControlFlowFlatteningNode",e[e.CallExpressionControlFlowStorageCallNode=2]="CallExpressionControlFlowStorageCallNode",e[e.CallExpressionFunctionNode=3]="CallExpressionFunctionNode",e[e.ControlFlowStorageNode=4]="ControlFlowStorageNode",e[e.ExpressionWithOperatorControlFlowStorageCallNode=5]="ExpressionWithOperatorControlFlowStorageCallNode",e[e.LogicalExpressionFunctionNode=6]="LogicalExpressionFunctionNode",e[e.StringLiteralControlFlowStorageCallNode=7]="StringLiteralControlFlowStorageCallNode",e[e.StringLiteralNode=8]="StringLiteralNode"}(t.ControlFlowCustomNode||(t.ControlFlowCustomNode={}))},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var r=0;r1?t-1:0),n=1;n-1||0===e.indexOf("//")?e.split("/")[2]:e.split("/")[0],t=t.split(":")[0]}},{key:"isCeilNumber",value:function(e){return e%1==0}},{key:"stringRotate",value:function(e,t){if(!e)throw new ReferenceError("Cannot rotate empty string.");for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{},r=new i.InversifyContainerFacade;r.load(e,t);var n=r.get(a.ServiceIdentifiers.IJavaScriptObfuscator),o=n.obfuscate(e);return r.unload(),o}},{key:"runCLI",value:function(e){var t=new c.JavaScriptObfuscatorCLI(e);t.initialize(),t.run()}}]),e}();t.JavaScriptObfuscator=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.ConsoleOutputDisableExpressionNode=0]="ConsoleOutputDisableExpressionNode",e[e.DebugProtectionFunctionCallNode=1]="DebugProtectionFunctionCallNode",e[e.DebugProtectionFunctionIntervalNode=2]="DebugProtectionFunctionIntervalNode",e[e.DebugProtectionFunctionNode=3]="DebugProtectionFunctionNode",e[e.DomainLockNode=4]="DomainLockNode",e[e.NodeCallsControllerFunctionNode=5]="NodeCallsControllerFunctionNode",e[e.SelfDefendingUnicodeNode=6]="SelfDefendingUnicodeNode",e[e.StringArrayCallsWrapper=7]="StringArrayCallsWrapper",e[e.StringArrayNode=8]="StringArrayNode",e[e.StringArrayRotateFunctionNode=9]="StringArrayRotateFunctionNode"}(t.CustomNode||(t.CustomNode={}))},function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t3&&void 0!==arguments[3]?arguments[3]:0,a=void 0;a=t.length?e.getOptimalBlockScope(t,o):r,e.prependNode(a,n)}},{key:"getOptimalBlockScope",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1/0,o=t[r];if(n<=0)throw new Error("Invalid `deep` argument value. Value should be bigger then 0.");return n>1&&o.stackTrace.length?e.getOptimalBlockScope(o.stackTrace,0,--n):o.callee}},{key:"insertNodeAtIndex",value:function(t,r,o){e.validateBodyStatements(r)||(r=[]),r=e.parentizeBodyStatementsBeforeAppend(t,r),t.body=[].concat(n(t.body.slice(0,o)),n(r),n(t.body.slice(o)))}},{key:"prependNode",value:function(t,r){e.validateBodyStatements(r)||(r=[]),r=e.parentizeBodyStatementsBeforeAppend(t,r),t.body=[].concat(n(r),n(t.body))}},{key:"parentizeBodyStatementsBeforeAppend",value:function(e,t){return t.forEach(function(t){t.parentNode=e}),t}},{key:"validateBodyStatements",value:function(e){return e.every(function(e){return!!e&&e.hasOwnProperty("type")})}}]),e}();t.NodeAppender=i},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:p.randomGeneratorPool;return this.getRandomGenerator().string({length:e,pool:t})}},{key:"getRandomVariableName",value:function(e){var t="_"+f.Utils.hexadecimalPrefix,r=this.getRandomInteger(1e4,99999999),n=f.Utils.decToHex(r),o=""+t+n.substr(0,e);return this.randomVariableNameSet.has(o)?this.getRandomVariableName(e):(this.randomVariableNameSet.add(o),o)}},{key:"getSeed",value:function(){return this.seed}}]),e}();d.randomGeneratorPool="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",d.randomGeneratorPoolNumbers="0123456789",d.randomGeneratorPoolHexadecimal="abcdef"+p.randomGeneratorPoolNumbers,a.__decorate([l.initializable(),a.__metadata("design:type",Object)],d.prototype,"randomGenerator",void 0),a.__decorate([l.initializable(),a.__metadata("design:type",Number)],d.prototype,"seed",void 0),a.__decorate([i.postConstruct(),a.__metadata("design:type",Function),a.__metadata("design:paramtypes",[]),a.__metadata("design:returntype",void 0)],d.prototype,"initialize",null),d=p=a.__decorate([i.injectable(),a.__param(0,i.inject(c.ServiceIdentifiers.ISourceCode)),a.__param(1,i.inject(c.ServiceIdentifiers.IOptions)),a.__metadata("design:paramtypes",[Object,Object])],d),t.RandomGenerator=d;var p},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(22);t.DEFAULT_PRESET=Object.freeze({compact:!0,config:"",controlFlowFlattening:!1,controlFlowFlatteningThreshold:.75,deadCodeInjection:!1,deadCodeInjectionThreshold:.4,debugProtection:!1,debugProtectionInterval:!1,disableConsoleOutput:!1,domainLock:[],log:!1,mangle:!1,renameGlobals:!1,reservedNames:[],rotateStringArray:!0,seed:0,selfDefending:!1,sourceMap:!1,sourceMapBaseUrl:"",sourceMapFileName:"",sourceMapMode:n.SourceMapMode.Separate,stringArray:!0,stringArrayEncoding:!1,stringArrayThreshold:.75,unicodeEscapeSequence:!1})},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.FunctionDeclarationCalleeDataExtractor=0]="FunctionDeclarationCalleeDataExtractor",e[e.FunctionExpressionCalleeDataExtractor=1]="FunctionExpressionCalleeDataExtractor",e[e.ObjectExpressionCalleeDataExtractor=2]="ObjectExpressionCalleeDataExtractor"}(t.CalleeDataExtractor||(t.CalleeDataExtractor={}))},function(e,t){e.exports=require("esprima")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.BinaryExpressionControlFlowReplacer=0]="BinaryExpressionControlFlowReplacer",e[e.CallExpressionControlFlowReplacer=1]="CallExpressionControlFlowReplacer",e[e.LogicalExpressionControlFlowReplacer=2]="LogicalExpressionControlFlowReplacer",e[e.StringLiteralControlFlowReplacer=3]="StringLiteralControlFlowReplacer"}(t.ControlFlowReplacer||(t.ControlFlowReplacer={}))},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r1&&void 0!==arguments[1]&&arguments[1];this.storage=new Map([].concat(n(this.storage),n(e.getStorage()))),t&&(this.storageId=e.getStorageId())}},{key:"set",value:function(e,t){this.storage.set(e,t)}}]),e}();c.__decorate([l.initializable(),c.__metadata("design:type",String)],f.prototype,"storageId",void 0),c.__decorate([l.initializable(),c.__metadata("design:type",Map)],f.prototype,"storage",void 0),c.__decorate([s.postConstruct(),c.__metadata("design:type",Function),c.__metadata("design:paramtypes",[]),c.__metadata("design:returntype",void 0)],f.prototype,"initialize",null),f=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__metadata("design:paramtypes",[Object])],f),t.MapStorage=f},function(e,t){e.exports=require("path")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(17);e.exports=n.JavaScriptObfuscator},function(e,t){e.exports=require("reflect-metadata")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(13),o=r(0),a=r(2),i=r(30),c=r(43),s=r(44),u=r(45),l=r(46);t.analyzersModule=new o.ContainerModule(function(e){e(a.ServiceIdentifiers.IStackTraceAnalyzer).to(l.StackTraceAnalyzer).inSingletonScope(),e(a.ServiceIdentifiers.ICalleeDataExtractor).to(c.FunctionDeclarationCalleeDataExtractor).whenTargetNamed(i.CalleeDataExtractor.FunctionDeclarationCalleeDataExtractor),e(a.ServiceIdentifiers.ICalleeDataExtractor).to(s.FunctionExpressionCalleeDataExtractor).whenTargetNamed(i.CalleeDataExtractor.FunctionExpressionCalleeDataExtractor),e(a.ServiceIdentifiers.ICalleeDataExtractor).to(u.ObjectExpressionCalleeDataExtractor).whenTargetNamed(i.CalleeDataExtractor.ObjectExpressionCalleeDataExtractor),e(a.ServiceIdentifiers.Factory__ICalleeDataExtractor).toFactory(n.InversifyContainerFacade.getCacheFactory(a.ServiceIdentifiers.ICalleeDataExtractor))})},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;rr)return"break";var a=e[o];s.traverse(a,{enter:function(r){if(l.Node.isCallExpressionNode(r))return a.parentNode!==f.NodeUtils.getBlockScopesOfNode(r)[0]?s.VisitorOption.Skip:void t.analyzeCallExpressionNode(n,e,r)}})}(a))break}return n}},{key:"analyzeCallExpressionNode",value:function(e,t,r){var n=this;p.calleeDataExtractorsList.forEach(function(o){var a=n.calleeDataExtractorFactory(o).extract(t,r.callee);a&&e.push(Object.assign({},a,{stackTrace:n.analyzeRecursive(a.callee.body)}))})}}],[{key:"getLimitIndex",value:function(e){var t=e-1,r=p.limitThresholdActivationLength-1,n=t;return t>r&&(n=Math.round(r+t*p.limitThreshold))>t&&(n=t),n}}]),e}();d.calleeDataExtractorsList=[u.CalleeDataExtractor.FunctionDeclarationCalleeDataExtractor,u.CalleeDataExtractor.FunctionExpressionCalleeDataExtractor,u.CalleeDataExtractor.ObjectExpressionCalleeDataExtractor],d.limitThresholdActivationLength=25,d.limitThreshold=.002,d=p=a.__decorate([i.injectable(),a.__param(0,i.inject(c.ServiceIdentifiers.Factory__ICalleeDataExtractor)),a.__metadata("design:paramtypes",[Function])],d),t.StackTraceAnalyzer=d;var p},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(13),o=r(0),a=r(2),i=r(32),c=r(48),s=r(49),u=r(50),l=r(51);t.controlFlowTransformersModule=new o.ContainerModule(function(e){e(a.ServiceIdentifiers.IControlFlowReplacer).to(c.BinaryExpressionControlFlowReplacer).whenTargetNamed(i.ControlFlowReplacer.BinaryExpressionControlFlowReplacer),e(a.ServiceIdentifiers.IControlFlowReplacer).to(s.CallExpressionControlFlowReplacer).whenTargetNamed(i.ControlFlowReplacer.CallExpressionControlFlowReplacer),e(a.ServiceIdentifiers.IControlFlowReplacer).to(u.LogicalExpressionControlFlowReplacer).whenTargetNamed(i.ControlFlowReplacer.LogicalExpressionControlFlowReplacer),e(a.ServiceIdentifiers.IControlFlowReplacer).to(l.StringLiteralControlFlowReplacer).whenTargetNamed(i.ControlFlowReplacer.StringLiteralControlFlowReplacer),e(a.ServiceIdentifiers.Factory__IControlFlowReplacer).toFactory(n.InversifyContainerFacade.getCacheFactory(a.ServiceIdentifiers.IControlFlowReplacer))})},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r 0;\n \n switch (isPositive) {\n case true:\n return this.item + '_' + this.value + '_' + i;\n default:\n this.item + '_' + this.value;\n }\n }\n }()\n };\n };\n \n var regExp = new RegExp(\"[{diff}]\", \"g\");\n var domains = \"{domains}\".replace(regExp, \"\").split(\";\");\n var document;\n var domain;\n \n for (var d in that) {\n if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) {\n document = d;\n \n break;\n }\n }\n\n for (var d1 in that[document]) {\n if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) {\n domain = d1;\n \n break;\n }\n }\n \n if ((!document && !domain) || (!that[document] && !that[document][domain])) {\n return;\n }\n \n var currentDomain = that[document][domain];\n\n var ok = false;\n \n for (var i = 0; i < domains.length; i++) {\n var domain = domains[i];\n var position = currentDomain.length - domain.length;\n var lastIndex = currentDomain.indexOf(domain, position);\n var endsWith = lastIndex !== -1 && lastIndex === position;\n \n if (endsWith) {\n if (currentDomain.length == domain.length || domain.indexOf(\".\") === 0) {\n ok = true;\n }\n \n break;\n }\n }\n \n if (!ok) {\n data;\n } else {\n return;\n }\n \n func();\n });\n\n {domainLockFunctionName}();\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.DomainLockNodeTemplate=n},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r> 1 + 255 % 0;\n \n if (string.indexOf('i' === i)) {\n recursiveFunc2(string)\n }\n };\n \n var recursiveFunc2 = function (string) {\n var i = ~-4 >> 1 + 255 % 0;\n \n if (string.indexOf((true+\"\")[3]) !== i) {\n recursiveFunc1(string)\n }\n };\n \n if (!test1()) {\n if (!test2()) {\n recursiveFunc1('indеxOf');\n } else {\n recursiveFunc1('indexOf');\n }\n } else {\n recursiveFunc1('indеxOf');\n }\n })\n \n {selfDefendingFunctionName}();\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.SelfDefendingTemplate=n},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r> (-2 * bc & 6)) : 0\n ) {\n buffer = chars.indexOf(buffer);\n }\n return output;\n });\n })();\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.AtobTemplate=n},function(e,t,r){"use strict";function n(){return"\n var rc4 = function (str, key) {\n var s = [], j = 0, x, res = '', newStr = '';\n \n str = atob(str);\n \n for (var k = 0, length = str.length; k < length; k++) {\n newStr += '%' + ('00' + str.charCodeAt(k).toString(16)).slice(-2);\n }\n \n str = decodeURIComponent(newStr);\n \t \n\t for (var i = 0; i < 256; i++) {\n s[i] = i;\n }\n \n for (i = 0; i < 256; i++) {\n j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;\n x = s[i];\n s[i] = s[j];\n s[j] = x;\n }\n \n i = 0;\n j = 0;\n \n for (var y = 0; y < str.length; y++) {\n i = (i + 1) % 256;\n j = (j + s[i]) % 256;\n x = s[i];\n s[i] = s[j];\n s[j] = x;\n res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);\n }\n \n return res;\n }\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.Rc4Template=n},function(e,t,r){"use strict";function n(e){return"\n var StatesClass = function (rc4Bytes) {\n this.rc4Bytes = rc4Bytes;\n this.states = [1, 0, 0];\n this.newState = function(){return 'newState';};\n this.firstState = '"+e.encode("\\w+ *\\(\\) *{\\w+ *",!0)+"';\n this.secondState = '"+e.encode("['|\"].+['|\"];? *}",!0)+"';\n };\n \n StatesClass.prototype.checkState = function () {\n var regExp = new RegExp(this.firstState + this.secondState);\n\n return this.runState(regExp.test(this.newState.toString()) ? --this.states[1] : --this.states[0]);\n };\n \n StatesClass.prototype.runState = function (stateResult) {\n if (!Boolean(~stateResult)) {\n return stateResult;\n }\n \n return this.getState(this.rc4Bytes);\n };\n\n StatesClass.prototype.getState = function (rc4Bytes) {\n for (var i = 0, len = this.states.length; i < len; i++) {\n this.states.push(Math.round(Math.random()));\n len = this.states.length;\n }\n \n return rc4Bytes(this.states[0]);\n };\n\n new StatesClass({stringArrayCallsWrapperName}).checkState();\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.SelfDefendingTemplate=n},function(e,t,r){"use strict";function n(){return" \n if ({stringArrayCallsWrapperName}.initialized === undefined) {\n {atobPolyfill}\n \n {stringArrayCallsWrapperName}.base64DecodeUnicode = function (str) {\n var string = atob(str);\n var newStringChars = [];\n \n for (var i = 0, length = string.length; i < length; i++) {\n newStringChars += '%' + ('00' + string.charCodeAt(i).toString(16)).slice(-2);\n }\n \n return decodeURIComponent(newStringChars);\n };\n \n {stringArrayCallsWrapperName}.data = {};\n \n {stringArrayCallsWrapperName}.initialized = true;\n }\n \n var cachedValue = {stringArrayCallsWrapperName}.data[index];\n \n if (cachedValue === undefined) {\n {selfDefendingCode}\n \n value = {stringArrayCallsWrapperName}.base64DecodeUnicode(value);\n {stringArrayCallsWrapperName}.data[index] = value;\n } else {\n value = cachedValue;\n } \n "}Object.defineProperty(t,"__esModule",{value:!0}),t.StringArrayBase64DecodeNodeTemplate=n},function(e,t,r){"use strict";function n(){return"\n var {stringArrayCallsWrapperName} = function (index, key) {\n index = index - 0;\n \n var value = {stringArrayName}[index];\n \n {decodeNodeTemplate}\n \n return value;\n };\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.StringArrayCallsWrapperTemplate=n},function(e,t,r){"use strict";function n(){return"\n if ({stringArrayCallsWrapperName}.initialized === undefined) {\n {atobPolyfill}\n \n {rc4Polyfill}\n {stringArrayCallsWrapperName}.rc4 = rc4;\n \n {stringArrayCallsWrapperName}.data = {};\n \n {stringArrayCallsWrapperName}.initialized = true;\n }\n \n var cachedValue = {stringArrayCallsWrapperName}.data[index];\n\n if (cachedValue === undefined) {\n if ({stringArrayCallsWrapperName}.once === undefined) {\n {selfDefendingCode}\n \n {stringArrayCallsWrapperName}.once = true;\n }\n \n value = {stringArrayCallsWrapperName}.rc4(value, key);\n {stringArrayCallsWrapperName}.data[index] = value;\n } else {\n value = cachedValue;\n }\n "}Object.defineProperty(t,"__esModule",{value:!0}),t.StringArrayRc4DecodeNodeTemplate=n},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;rv.hostNodeSearchMinDepth&&t.splice(0,v.hostNodeSearchMinDepth),t.length>v.hostNodeSearchMaxDepth&&(t.length=v.hostNodeSearchMaxDepth),this.randomGenerator.getRandomGenerator().pickone(t))}},{key:"isVisitedFunctionNode",value:function(e){return(y.Node.isFunctionDeclarationNode(e)||y.Node.isFunctionExpressionNode(e)||y.Node.isArrowFunctionExpressionNode(e))&&this.visitedFunctionNodes.has(e)}},{key:"transformFunctionBody",value:function(e,t){var r=this;l.replace(e,{enter:function(e,n){if(r.isVisitedFunctionNode(e))return l.VisitorOption.Skip;if(!v.controlFlowReplacersMap.has(e.type))return e;if(r.randomGenerator.getMathRandom()>r.options.controlFlowFlatteningThreshold)return e;var o=v.controlFlowReplacersMap.get(e.type);return void 0===o?e:Object.assign({},r.controlFlowReplacerFactory(o).replace(e,n,t),{parentNode:n})}})}}]),t}(p.AbstractNodeTransformer);h.controlFlowReplacersMap=new Map([[d.NodeType.BinaryExpression,b.ControlFlowReplacer.BinaryExpressionControlFlowReplacer],[d.NodeType.CallExpression,b.ControlFlowReplacer.CallExpressionControlFlowReplacer],[d.NodeType.LogicalExpression,b.ControlFlowReplacer.LogicalExpressionControlFlowReplacer],[d.NodeType.Literal,b.ControlFlowReplacer.StringLiteralControlFlowReplacer]]),h.hostNodeSearchMinDepth=0,h.hostNodeSearchMaxDepth=2,h=v=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.Factory__TControlFlowStorage)),c.__param(1,s.inject(u.ServiceIdentifiers.Factory__IControlFlowReplacer)),c.__param(2,s.inject(u.ServiceIdentifiers.Factory__IControlFlowCustomNode)),c.__param(3,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(4,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Function,Function,Function,Object,Object])],h),t.FunctionControlFlowTransformer=h;var v},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;rthis.options.controlFlowFlatteningThreshold||!m.canTransformBlockStatementNode(e))return e;var r=e.body,n=this.arrayUtils.arrayRange(r.length),o=this.arrayUtils.arrayShuffle(n),a=n.map(function(e){return o.indexOf(e)}),i=this.controlFlowCustomNodeFactory(f.ControlFlowCustomNode.BlockStatementControlFlowFlatteningNode);return i.initialize(r,o,a),i.getNode()[0]}}],[{key:"blockStatementHasProhibitedStatements",value:function(e){return e.body.some(function(e){var t=p.Node.isBreakStatementNode(e)||p.Node.isContinueStatementNode(e),r=p.Node.isVariableDeclarationNode(e)&&("const"===e.kind||"let"===e.kind);return p.Node.isFunctionDeclarationNode(e)||t||r})}},{key:"canTransformBlockStatementNode",value:function(e){var t=!0;return l.traverse(e,{enter:function(e){if(p.Node.isWhileStatementNode(e))return l.VisitorOption.Skip;p.Node.isBlockStatementNode(e)&&m.blockStatementHasProhibitedStatements(e)&&(t=!1)}}),e.body.length<=4&&(t=!1),t}}]),t}(d.AbstractNodeTransformer);y=m=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.Factory__IControlFlowCustomNode)),c.__param(1,s.inject(u.ServiceIdentifiers.IArrayUtils)),c.__param(2,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(3,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Function,Object,Object,Object])],y),t.BlockStatementControlFlowTransformer=y;var m},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;rthis.options.deadCodeInjectionThreshold)return e;var r=this.collectedBlockStatements.length-1,n=this.randomGenerator.getRandomInteger(0,r),o=this.collectedBlockStatements.splice(n,1)[0];return o===e?e:this.replaceBlockStatementNode(e,o)}},{key:"collectBlockStatementNodes",value:function(e,t){var r=this,n=y.NodeUtils.clone(e),o=0,a=!0;l.replace(n,{enter:function(e,t){return d.Node.isBlockStatementNode(e)&&o++,o>b.maxNestedBlockStatementsCount||d.Node.isBreakStatementNode(e)||d.Node.isContinueStatementNode(e)?(a=!1,l.VisitorOption.Break):(d.Node.isIdentifierNode(e)&&!d.Node.isMemberExpressionNode(t)&&(e.name=r.randomGenerator.getRandomVariableName(6)),e)}}),a&&t.push(n)}},{key:"replaceBlockStatementNode",value:function(e,t){var r=this.randomGenerator.getMathRandom()>.5,n=this.randomGenerator.getMathRandom()>.5,o=r?"===":"!==",a=this.randomGenerator.getRandomString(3),i=n?a:this.randomGenerator.getRandomString(3),c=void 0,s=void 0;r&&n||!r&&!n?(c=e,s=t):(c=t,s=e);var u=p.Nodes.getBlockStatementNode([p.Nodes.getIfStatementNode(p.Nodes.getBinaryExpressionNode(o,p.Nodes.getLiteralNode(a),p.Nodes.getLiteralNode(i)),c,s)]);return u=y.NodeUtils.parentize(u)}}]),t}(f.AbstractNodeTransformer);m.maxNestedBlockStatementsCount=4,m.minCollectedBlockStatementsCount=5,m=b=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(1,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Object,Object])],m),t.DeadCodeInjectionTransformer=m;var b},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r1){var o=d.Nodes.getBinaryExpressionNode("+",n.shift(),n.shift());return n.forEach(function(e){o=d.Nodes.getBinaryExpressionNode("+",o,e)}),o}return n[0]}}],[{key:"isLiteralNodeWithStringValue",value:function(e){return e&&f.Node.isLiteralNode(e)&&"string"==typeof e.value}}]),t}(l.AbstractNodeTransformer);p=y=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(1,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Object,Object])],p),t.TemplateLiteralTransformer=p;var y},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r=m.minimumLengthForStringArray&&this.randomGenerator.getMathRandom()<=this.options.stringArrayThreshold}},{key:"getStringArrayHexadecimalIndex",value:function(e,t){if(this.stringLiteralHexadecimalIndexCache.has(e))return{fromCache:!0,index:this.stringLiteralHexadecimalIndexCache.get(e)};var r=p.Utils.decToHex(t),n=""+p.Utils.hexadecimalPrefix+r;return this.stringLiteralHexadecimalIndexCache.set(e,n),{fromCache:!1,index:n}}},{key:"getEncodedValue",value:function(e){var t=void 0,r=null;switch(this.options.stringArrayEncoding){case l.StringArrayEncoding.Rc4:r=this.randomGenerator.getRandomGenerator().pickone(this.rc4Keys),t=this.cryptUtils.btoa(this.cryptUtils.rc4(e,r));break;case l.StringArrayEncoding.Base64:t=this.cryptUtils.btoa(e);break;default:t=e}return{encodedValue:t,key:r}}},{key:"replaceWithLiteralNode",value:function(e){return d.Nodes.getLiteralNode(this.escapeSequenceEncoder.encode(e,this.options.unicodeEscapeSequence))}},{key:"replaceWithStringArrayCallNode",value:function(e){var t=this.getEncodedValue(e),r=t.encodedValue,n=t.key,o=this.escapeSequenceEncoder.encode(r,this.options.unicodeEscapeSequence),a=this.stringArrayStorage.getLength(),i=p.Utils.stringRotate(this.stringArrayStorage.getStorageId(),1),c="_"+p.Utils.hexadecimalPrefix+i,s=this.getStringArrayHexadecimalIndex(o,a),u=s.fromCache,l=s.index;u||this.stringArrayStorage.set(a,o);var f=[m.getHexadecimalLiteralNode(l)];return n&&f.push(m.getRc4KeyLiteralNode(this.escapeSequenceEncoder.encode(n,this.options.unicodeEscapeSequence))),d.Nodes.getCallExpressionNode(d.Nodes.getIdentifierNode(c),f)}}],[{key:"getHexadecimalLiteralNode",value:function(e){var t=d.Nodes.getLiteralNode(e);return t.obfuscatedNode=!0,t}},{key:"getRc4KeyLiteralNode",value:function(e){var t=d.Nodes.getLiteralNode(e);return t.obfuscatedNode=!0,t}}]),t}(f.AbstractObfuscatingReplacer);y.minimumLengthForStringArray=3,y.rc4KeyLength=4,y.rc4KeysCount=50,y=m=c.__decorate([s.injectable(),c.__param(0,s.inject(u.ServiceIdentifiers.TCustomNodeGroupStorage)),c.__param(1,s.inject(u.ServiceIdentifiers.TStringArrayStorage)),c.__param(2,s.inject(u.ServiceIdentifiers.IEscapeSequenceEncoder)),c.__param(3,s.inject(u.ServiceIdentifiers.IRandomGenerator)),c.__param(4,s.inject(u.ServiceIdentifiers.ICryptUtils)),c.__param(5,s.inject(u.ServiceIdentifiers.IOptions)),c.__metadata("design:paramtypes",[Object,Object,Object,Object,Object,Object])],y),t.StringLiteralObfuscatingReplacer=y;var m},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),o=r(2),a=r(120),i=r(121),c=r(122);t.storagesModule=new n.ContainerModule(function(e){e(o.ServiceIdentifiers.TCustomNodeGroupStorage).to(i.CustomNodeGroupStorage).inSingletonScope(),e(o.ServiceIdentifiers.TStringArrayStorage).to(c.StringArrayStorage).inSingletonScope(),e(o.ServiceIdentifiers.Newable__TControlFlowStorage).toConstructor(a.ControlFlowStorage),e(o.ServiceIdentifiers.Factory__TControlFlowStorage).toFactory(function(e){return function(){var t=e.container.get(o.ServiceIdentifiers.Newable__TControlFlowStorage),r=e.container.get(o.ServiceIdentifiers.IRandomGenerator),n=new t(r);return n.initialize(),n}})})},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=r(1),c=r(0),s=r(2),u=r(38),l=function(e){function t(e){return n(this,t),o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e))}return a(t,e),t}(u.MapStorage);l=i.__decorate([c.injectable(),i.__param(0,c.inject(s.ServiceIdentifiers.IRandomGenerator)),i.__metadata("design:paramtypes",[Object])],l),t.ControlFlowStorage=l},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var r=0;r=0?t:null}},{key:"getLength",value:function(){return this.storageLength}},{key:"getStorage",value:function(){return this.storage}},{key:"getStorageId",value:function(){return this.storageId}},{key:"mergeWith",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.storage=[].concat(n(this.storage),n(e.getStorage())),t&&(this.storageId=e.getStorageId())}},{key:"set",value:function(e,t){e===this.storageLength?this.storage.push(t):this.storage.splice(e,0,t),this.storageLength++}}]),e}();i.__decorate([u.initializable(),i.__metadata("design:type",Array)],l.prototype,"storage",void 0),i.__decorate([u.initializable(),i.__metadata("design:type",String)],l.prototype,"storageId",void 0),i.__decorate([c.postConstruct(),i.__metadata("design:type",Function),i.__metadata("design:paramtypes",[]),i.__metadata("design:returntype",void 0)],l.prototype,"initialize",null),l=i.__decorate([c.injectable(),i.__param(0,c.inject(s.ServiceIdentifiers.IRandomGenerator)),i.__metadata("design:paramtypes",[Object])],l),t.ArrayStorage=l},function(e,t){e.exports=require("md5")},function(e,t){e.exports=require("chance")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),o=r(2),a=r(127),i=r(128),c=r(129),s=r(28);t.utilsModule=new n.ContainerModule(function(e){e(o.ServiceIdentifiers.IArrayUtils).to(a.ArrayUtils).inSingletonScope(),e(o.ServiceIdentifiers.IRandomGenerator).to(s.RandomGenerator).inSingletonScope(),e(o.ServiceIdentifiers.ICryptUtils).to(i.CryptUtils).inSingletonScope(),e(o.ServiceIdentifiers.IEscapeSequenceEncoder).to(c.EscapeSequenceEncoder).inSingletonScope()})},function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t>8-o%1*8)){if((n=e.charCodeAt(o+=.75))>255)throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");r=r<<8|n}return t}},{key:"hideString",value:function(e,t){var r=this,n=this.randomGenerator.getRandomGenerator().string({length:t,pool:s.RandomGenerator.randomGeneratorPool}),o=n.replace(new RegExp("["+function(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}(e)+"]","g"),""),a=o.split("");return this.randomGenerator.getRandomGenerator().shuffle(a),o=a.join(""),[function(e,t){for(var n=-1,o=-1,a="";n [options]").version(y.CLIUtils.getPackageConfig().version,"-v, --version").option("-o, --output ","Output path for obfuscated code").option("--compact ","Disable one line output code compacting",f.BooleanSanitizer).option("--config ","Name of js / json config file").option("--controlFlowFlattening ","Enables control flow flattening",f.BooleanSanitizer).option("--controlFlowFlatteningThreshold ","The probability that the control flow flattening transformation will be applied to the node",parseFloat).option("--deadCodeInjection ","Enables dead code injection",f.BooleanSanitizer).option("--deadCodeInjectionThreshold ","The probability that the dead code injection transformation will be applied to the node",parseFloat).option("--debugProtection ","Disable browser Debug panel (can cause DevTools enabled browser freeze)",f.BooleanSanitizer).option("--debugProtectionInterval ","Disable browser Debug panel even after page was loaded (can cause DevTools enabled browser freeze)",f.BooleanSanitizer).option("--disableConsoleOutput ","Allow console.log, console.info, console.error and console.warn messages output into browser console",f.BooleanSanitizer).option("--domainLock ","Blocks the execution of the code in domains that do not match the passed RegExp patterns (comma separated)",l.ArraySanitizer).option("--log ","Enables logging of the information to the console",f.BooleanSanitizer).option("--mangle ","Enables mangling of variable names",f.BooleanSanitizer).option("--reservedNames ","Disable obfuscation of variable names, function names and names of function parameters that match the passed RegExp patterns (comma separated)",l.ArraySanitizer).option("--renameGlobals ","Allows to enable obfuscation of global variable and function names with declaration.",f.BooleanSanitizer).option("--rotateStringArray ","Disable rotation of unicode array values during obfuscation",f.BooleanSanitizer).option("--seed ","Sets seed for random generator. This is useful for creating repeatable results.",parseFloat).option("--selfDefending ","Disables self-defending for obfuscated code",f.BooleanSanitizer).option("--sourceMap ","Enables source map generation",f.BooleanSanitizer).option("--sourceMapBaseUrl ","Sets base url to the source map import url when `--sourceMapMode=separate`").option("--sourceMapFileName ","Sets file name for output source map when `--sourceMapMode=separate`").option("--sourceMapMode [inline, separate]","Specify source map output mode",d.SourceMapModeSanitizer).option("--stringArray ","Disables gathering of all literal strings into an array and replacing every literal string with an array call",f.BooleanSanitizer).option("--stringArrayEncoding [true, false, base64, rc4]","Encodes all strings in strings array using base64 or rc4 (this option can slow down your code speed",p.StringArrayEncodingSanitizer).option("--stringArrayThreshold ","The probability that the literal string will be inserted into stringArray (Default: 0.8, Min: 0, Max: 1)",parseFloat).option("--unicodeEscapeSequence ","Allows to enable/disable string conversion to unicode escape sequence",f.BooleanSanitizer).parse(this.rawArguments)}},{key:"configureHelp",value:function(){this.commands.on("--help",function(){console.log(" Examples:\n"),console.log(" %> javascript-obfuscator in.js --compact true --selfDefending false"),console.log(" %> javascript-obfuscator in.js --output out.js --compact true --selfDefending false"),console.log("")})}},{key:"processSourceCode",value:function(){var e=this.buildOptions(),t=y.CLIUtils.getOutputCodePath(this.inputCLIOptions.output,this.inputPath);e.sourceMap?this.processSourceCodeWithSourceMap(t,e):this.processSourceCodeWithoutSourceMap(t,e)}},{key:"processSourceCodeWithoutSourceMap",value:function(e,t){var r=m.JavaScriptObfuscator.obfuscate(this.sourceCode,t).getObfuscatedCode();y.CLIUtils.writeFile(e,r)}},{key:"processSourceCodeWithSourceMap",value:function(e,t){var r=y.CLIUtils.getOutputSourceMapPath(e,t.sourceMapFileName||"");t=Object.assign({},t,{sourceMapFileName:c.basename(r)});var n=m.JavaScriptObfuscator.obfuscate(this.sourceCode,t);y.CLIUtils.writeFile(e,n.getObfuscatedCode()),"separate"===t.sourceMapMode&&n.getSourceMap()&&y.CLIUtils.writeFile(r,n.getSourceMap())}}],[{key:"filterOptions",value:function(e){var t={};for(var r in e)e.hasOwnProperty(r)&&void 0!==e[r]&&(t[r]=e[r]);return t}}]),e}();a.__decorate([s.initializable(),a.__metadata("design:type",Object)],b.prototype,"commands",void 0),a.__decorate([s.initializable(),a.__metadata("design:type",Object)],b.prototype,"inputCLIOptions",void 0),a.__decorate([s.initializable(),a.__metadata("design:type",String)],b.prototype,"inputPath",void 0),a.__decorate([s.initializable(),a.__metadata("design:type",String)],b.prototype,"sourceCode",void 0),t.JavaScriptObfuscatorCLI=b},function(e,t){e.exports=require("commander")},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ArraySanitizer=function(e){return e.split(",").map(function(e){return e.trim()})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BooleanSanitizer=function(e){return"true"===e||"1"===e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(22);t.SourceMapModeSanitizer=function(e){if(!Object.keys(n.SourceMapMode).some(function(t){return n.SourceMapMode[t]===e}))throw new ReferenceError("Invalid value of `--sourceMapMode` option");return e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(27);t.StringArrayEncodingSanitizer=function(e){switch(e){case"true":case"1":case n.StringArrayEncoding.Base64:return!0;case n.StringArrayEncoding.Rc4:return n.StringArrayEncoding.Rc4;default:return!1}}},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:"";return t&&(e=e.substring(0,e.lastIndexOf("/"))+"/"+t),/\.js\.map$/.test(e)?/\.js$/.test(e)&&(e+=".map"):e=e.split(".")[0]+".js.map",e}},{key:"getPackageConfig",value:function(){return JSON.parse(a.readFileSync(c.join(c.dirname(a.realpathSync(process.argv[1])),"../package.json"),e.encoding))}},{key:"getUserConfig",value:function(e){var t=void 0;try{t=!function(){var e=new Error('Cannot find module "."');throw e.code="MODULE_NOT_FOUND",e}()}catch(r){try{t=require(e)}catch(e){throw new ReferenceError("Given config path must be a valid file path")}}return t}},{key:"isFilePath",value:function(e){try{return a.statSync(e).isFile()}catch(e){return!1}}},{key:"readSourceCode",value:function(t){if(!e.isFilePath(t))throw new ReferenceError("Given input path must be a valid file path");if(-1===e.availableInputExtensions.indexOf(c.extname(t)))throw new ReferenceError("Input file must have .js extension");return a.readFileSync(t,e.encoding)}},{key:"writeFile",value:function(t,r){i.sync(c.dirname(t)),a.writeFileSync(t,r,{encoding:e.encoding})}}]),e}();s.availableInputExtensions=[".js"],s.encoding="utf8",t.CLIUtils=s},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("mkdirp")},function(e,t){function r(e){throw new Error("Cannot find module '"+e+"'.")}r.keys=function(){return[]},r.resolve=r,e.exports=r,r.id=165}]); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/index.ts b/index.ts index eee91d17..0afc6e09 100644 --- a/index.ts +++ b/index.ts @@ -1,5 +1,5 @@ "use strict"; -import { JavaScriptObfuscator } from './src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from './src/JavaScriptObfuscatorFacade'; module.exports = JavaScriptObfuscator; diff --git a/src/JavaScriptObfuscator.ts b/src/JavaScriptObfuscator.ts index 6dc32cf9..a2176fa8 100644 --- a/src/JavaScriptObfuscator.ts +++ b/src/JavaScriptObfuscator.ts @@ -1,43 +1,299 @@ -import 'reflect-metadata'; - +import { injectable, inject } from 'inversify'; import { ServiceIdentifiers } from './container/ServiceIdentifiers'; -import { TInputOptions } from './types/options/TInputOptions'; +import * as esprima from 'esprima'; +import * as escodegen from 'escodegen-wallaby'; +import * as esmangle from 'esmangle'; +import * as ESTree from 'estree'; -import { IInversifyContainerFacade } from './interfaces/container/IInversifyContainerFacade'; +import { ICustomNodeGroup } from './interfaces/custom-nodes/ICustomNodeGroup'; +import { IGeneratorOutput } from './interfaces/IGeneratorOutput'; import { IJavaScriptObfuscator } from './interfaces/IJavaScriptObfsucator'; +import { ILogger } from './interfaces/logger/ILogger'; +import { IObfuscationEventEmitter } from './interfaces/event-emitters/IObfuscationEventEmitter'; import { IObfuscationResult } from './interfaces/IObfuscationResult'; +import { IOptions } from './interfaces/options/IOptions'; +import { IRandomGenerator } from './interfaces/utils/IRandomGenerator'; +import { ISourceMapCorrector } from './interfaces/ISourceMapCorrector'; +import { IStackTraceAnalyzer } from './interfaces/analyzers/stack-trace-analyzer/IStackTraceAnalyzer'; +import { IStackTraceData } from './interfaces/analyzers/stack-trace-analyzer/IStackTraceData'; +import { IStorage } from './interfaces/storages/IStorage'; +import { ITransformersRunner } from './interfaces/ITransformersRunner'; -import { InversifyContainerFacade } from './container/InversifyContainerFacade'; -import { JavaScriptObfuscatorCLI } from './cli/JavaScriptObfuscatorCLI'; +import { LoggingMessage } from './enums/logger/LoggingMessage'; +import { NodeTransformer } from './enums/container/node-transformers/NodeTransformer'; +import { ObfuscationEvent } from './enums/event-emitters/ObfuscationEvent'; + +import { Node } from './node/Node'; + +@injectable() +export class JavaScriptObfuscator implements IJavaScriptObfuscator { + /** + * @type {GenerateOptions} + */ + private static readonly escodegenParams: escodegen.GenerateOptions = { + verbatim: 'x-verbatim-property', + sourceMapWithCode: true + }; + + /** + * @type {NodeTransformer[]} + */ + private static readonly controlFlowTransformersList: NodeTransformer[] = [ + NodeTransformer.BlockStatementControlFlowTransformer, + NodeTransformer.FunctionControlFlowTransformer + ]; + + /** + * @type {NodeTransformer[]} + */ + private static readonly convertingTransformersList: NodeTransformer[] = [ + NodeTransformer.MemberExpressionTransformer, + NodeTransformer.MethodDefinitionTransformer, + NodeTransformer.TemplateLiteralTransformer + ]; + + /** + * @type {NodeTransformer[]} + */ + private static readonly deadCodeInjectionTransformersList: NodeTransformer[] = [ + NodeTransformer.DeadCodeInjectionTransformer + ]; + + /** + * @type {NodeTransformer[]} + */ + private static readonly obfuscatingTransformersList: NodeTransformer[] = [ + NodeTransformer.CatchClauseTransformer, + NodeTransformer.ClassDeclarationTransformer, + NodeTransformer.FunctionDeclarationTransformer, + NodeTransformer.FunctionTransformer, + NodeTransformer.LabeledStatementTransformer, + NodeTransformer.LiteralTransformer, + NodeTransformer.ObjectExpressionTransformer, + NodeTransformer.VariableDeclarationTransformer + ]; + + /** + * @type {NodeTransformer[]} + */ + private static readonly preparingTransformersList: NodeTransformer[] = [ + NodeTransformer.ParentizeTransformer, + NodeTransformer.NodeGuardTransformer + ]; + + /** + * @type {IStorage} + */ + private readonly customNodeGroupStorage: IStorage; + + /** + * @type {ILogger} + */ + private readonly logger: ILogger; + + /** + * @type {IObfuscationEventEmitter} + */ + private readonly obfuscationEventEmitter: IObfuscationEventEmitter; + + /** + * @type {IOptions} + */ + private readonly options: IOptions; + + /** + * @type {IRandomGenerator} + */ + private readonly randomGenerator: IRandomGenerator; + + /** + * @type {ISourceMapCorrector} + */ + private readonly sourceMapCorrector: ISourceMapCorrector; + + /** + * @type {IStackTraceAnalyzer} + */ + private readonly stackTraceAnalyzer: IStackTraceAnalyzer; + + /** + * @type {ITransformersRunner} + */ + private readonly transformersRunner: ITransformersRunner; + + /** + * @param {IStackTraceAnalyzer} stackTraceAnalyzer + * @param {IObfuscationEventEmitter} obfuscationEventEmitter + * @param {IStorage} customNodeGroupStorage + * @param {ITransformersRunner} transformersRunner + * @param {ISourceMapCorrector} sourceMapCorrector + * @param {IRandomGenerator} randomGenerator + * @param {ILogger} logger + * @param {IOptions} options + */ + constructor ( + @inject(ServiceIdentifiers.IStackTraceAnalyzer) stackTraceAnalyzer: IStackTraceAnalyzer, + @inject(ServiceIdentifiers.IObfuscationEventEmitter) obfuscationEventEmitter: IObfuscationEventEmitter, + @inject(ServiceIdentifiers.TCustomNodeGroupStorage) customNodeGroupStorage: IStorage, + @inject(ServiceIdentifiers.ITransformersRunner) transformersRunner: ITransformersRunner, + @inject(ServiceIdentifiers.ISourceMapCorrector) sourceMapCorrector: ISourceMapCorrector, + @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, + @inject(ServiceIdentifiers.ILogger) logger: ILogger, + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + this.stackTraceAnalyzer = stackTraceAnalyzer; + this.obfuscationEventEmitter = obfuscationEventEmitter; + this.customNodeGroupStorage = customNodeGroupStorage; + this.transformersRunner = transformersRunner; + this.sourceMapCorrector = sourceMapCorrector; + this.randomGenerator = randomGenerator; + this.logger = logger; + this.options = options; + } -export class JavaScriptObfuscator { /** * @param {string} sourceCode - * @param {TInputOptions} inputOptions * @returns {IObfuscationResult} */ - public static obfuscate (sourceCode: string, inputOptions: TInputOptions = {}): IObfuscationResult { - const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); + public obfuscate (sourceCode: string): IObfuscationResult { + const timeStart: number = Date.now(); + this.logger.info(LoggingMessage.ObfuscationStarted); + this.logger.info(LoggingMessage.RandomGeneratorSeed, this.randomGenerator.getSeed()); - inversifyContainerFacade.load(sourceCode, inputOptions); + // parse AST tree + const astTree: ESTree.Program = this.parseCode(sourceCode); - const javaScriptObfuscator: IJavaScriptObfuscator = inversifyContainerFacade - .get(ServiceIdentifiers.IJavaScriptObfuscator); - const obfuscationResult: IObfuscationResult = javaScriptObfuscator.obfuscate(sourceCode); + // obfuscate AST tree + const obfuscatedAstTree: ESTree.Program = this.transformAstTree(astTree); - inversifyContainerFacade.unload(); + // generate code + const generatorOutput: IGeneratorOutput = this.generateCode(sourceCode, obfuscatedAstTree); - return obfuscationResult; + const obfuscationTime: number = (Date.now() - timeStart) / 1000; + this.logger.success(LoggingMessage.ObfuscationCompleted, obfuscationTime); + + return this.getObfuscationResult(generatorOutput); } /** - * @param {string[]} argv + * @param {string} sourceCode + * @returns {Program} */ - public static runCLI (argv: string[]): void { - const javaScriptObfuscatorCLI: JavaScriptObfuscatorCLI = new JavaScriptObfuscatorCLI(argv); + private parseCode (sourceCode: string): ESTree.Program { + return esprima.parseScript(sourceCode, { + attachComment: true, + loc: this.options.sourceMap + }); + } - javaScriptObfuscatorCLI.initialize(); - javaScriptObfuscatorCLI.run(); + /** + * @param {Program} astTree + * @returns {Program} + */ + private transformAstTree (astTree: ESTree.Program): ESTree.Program { + if (Node.isProgramNode(astTree) && !astTree.body.length) { + this.logger.warn(LoggingMessage.EmptySourceCode); + + return astTree; + } + + // first pass: AST-tree preparation + this.logger.info(LoggingMessage.StagePreparingASTTree); + astTree = this.transformersRunner.transform( + astTree, + JavaScriptObfuscator.preparingTransformersList + ); + + // second pass: AST-tree analyzing + this.logger.info(LoggingMessage.StageAnalyzingASTTree); + const stackTraceData: IStackTraceData[] = this.stackTraceAnalyzer.analyze(astTree); + + // initialize custom node groups and configure custom nodes + this.customNodeGroupStorage + .getStorage() + .forEach((customNodeGroup: ICustomNodeGroup) => { + customNodeGroup.initialize(); + + this.obfuscationEventEmitter.once( + customNodeGroup.getAppendEvent(), + customNodeGroup.appendCustomNodes.bind(customNodeGroup) + ); + }); + + this.obfuscationEventEmitter.emit(ObfuscationEvent.BeforeObfuscation, astTree, stackTraceData); + + // third pass: dead code injection transformer + if (this.options.deadCodeInjection) { + this.logger.info(LoggingMessage.StageDeadCodeInjection); + + astTree = this.transformersRunner.transform( + astTree, + JavaScriptObfuscator.deadCodeInjectionTransformersList + ); + } + + // fourth pass: control flow flattening transformers + if (this.options.controlFlowFlattening) { + this.logger.info(LoggingMessage.StageControlFlowFlattening); + + astTree = this.transformersRunner.transform( + astTree, + JavaScriptObfuscator.controlFlowTransformersList + ); + } + + // fifth pass: converting and obfuscating transformers + this.logger.info(LoggingMessage.StageObfuscation); + astTree = this.transformersRunner.transform(astTree, [ + ...JavaScriptObfuscator.convertingTransformersList, + ...JavaScriptObfuscator.obfuscatingTransformersList + ]); + + this.obfuscationEventEmitter.emit(ObfuscationEvent.AfterObfuscation, astTree, stackTraceData); + + return astTree; + } + + /** + * @param {string} sourceCode + * @param {Program} astTree + * @returns {IGeneratorOutput} + */ + private generateCode (sourceCode: string, astTree: ESTree.Program): IGeneratorOutput { + const escodegenParams: escodegen.GenerateOptions = { + ...JavaScriptObfuscator.escodegenParams + }; + + if (this.options.sourceMap) { + escodegenParams.sourceMap = 'sourceMap'; + escodegenParams.sourceContent = sourceCode; + } + + if (this.options.mangle) { + astTree = esmangle.mangle(astTree); + } + + const generatorOutput: IGeneratorOutput = escodegen.generate(astTree, { + ...escodegenParams, + format: { + compact: this.options.compact + } + }); + + generatorOutput.map = generatorOutput.map ? generatorOutput.map.toString() : ''; + + return generatorOutput; + } + + /** + * @param {IGeneratorOutput} generatorOutput + * @returns {IObfuscationResult} + */ + private getObfuscationResult (generatorOutput: IGeneratorOutput): IObfuscationResult { + return this.sourceMapCorrector.correct( + generatorOutput.code, + generatorOutput.map + ); } } diff --git a/src/JavaScriptObfuscatorFacade.ts b/src/JavaScriptObfuscatorFacade.ts new file mode 100644 index 00000000..fdaddccb --- /dev/null +++ b/src/JavaScriptObfuscatorFacade.ts @@ -0,0 +1,45 @@ +import 'reflect-metadata'; + +import { ServiceIdentifiers } from './container/ServiceIdentifiers'; + +import { TInputOptions } from './types/options/TInputOptions'; + +import { IInversifyContainerFacade } from './interfaces/container/IInversifyContainerFacade'; +import { IJavaScriptObfuscator } from './interfaces/IJavaScriptObfsucator'; +import { IObfuscationResult } from './interfaces/IObfuscationResult'; + +import { InversifyContainerFacade } from './container/InversifyContainerFacade'; +import { JavaScriptObfuscatorCLI } from './cli/JavaScriptObfuscatorCLI'; + +class JavaScriptObfuscatorFacade { + /** + * @param {string} sourceCode + * @param {TInputOptions} inputOptions + * @returns {IObfuscationResult} + */ + public static obfuscate (sourceCode: string, inputOptions: TInputOptions = {}): IObfuscationResult { + const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); + + inversifyContainerFacade.load(sourceCode, inputOptions); + + const javaScriptObfuscator: IJavaScriptObfuscator = inversifyContainerFacade + .get(ServiceIdentifiers.IJavaScriptObfuscator); + const obfuscationResult: IObfuscationResult = javaScriptObfuscator.obfuscate(sourceCode); + + inversifyContainerFacade.unload(); + + return obfuscationResult; + } + + /** + * @param {string[]} argv + */ + public static runCLI (argv: string[]): void { + const javaScriptObfuscatorCLI: JavaScriptObfuscatorCLI = new JavaScriptObfuscatorCLI(argv); + + javaScriptObfuscatorCLI.initialize(); + javaScriptObfuscatorCLI.run(); + } +} + +export { JavaScriptObfuscatorFacade as JavaScriptObfuscator }; diff --git a/src/JavaScriptObfuscatorInternal.ts b/src/JavaScriptObfuscatorInternal.ts deleted file mode 100644 index 76350433..00000000 --- a/src/JavaScriptObfuscatorInternal.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { injectable, inject } from 'inversify'; -import { ServiceIdentifiers } from './container/ServiceIdentifiers'; - -import * as esprima from 'esprima'; -import * as escodegen from 'escodegen-wallaby'; -import * as esmangle from 'esmangle'; -import * as ESTree from 'estree'; - -import { IGeneratorOutput } from './interfaces/IGeneratorOutput'; -import { IJavaScriptObfuscator } from './interfaces/IJavaScriptObfsucator'; -import { ILogger } from './interfaces/logger/ILogger'; -import { IObfuscationResult } from './interfaces/IObfuscationResult'; -import { IObfuscator } from './interfaces/IObfuscator'; -import { IOptions } from './interfaces/options/IOptions'; -import { IRandomGenerator } from './interfaces/utils/IRandomGenerator'; -import { ISourceMapCorrector } from './interfaces/ISourceMapCorrector'; - -import { LoggingMessage } from './enums/logger/LoggingMessage'; - -@injectable() -export class JavaScriptObfuscatorInternal implements IJavaScriptObfuscator { - /** - * @type {GenerateOptions} - */ - private static readonly escodegenParams: escodegen.GenerateOptions = { - verbatim: 'x-verbatim-property', - sourceMapWithCode: true - }; - - /** - * @type {ILogger} - */ - private readonly logger: ILogger; - - /** - * @type {IObfuscator} - */ - private readonly obfuscator: IObfuscator; - - /** - * @type {IOptions} - */ - private readonly options: IOptions; - - /** - * @type {IRandomGenerator} - */ - private readonly randomGenerator: IRandomGenerator; - - /** - * @type {ISourceMapCorrector} - */ - private readonly sourceMapCorrector: ISourceMapCorrector; - - /** - * @param {IObfuscator} obfuscator - * @param {ISourceMapCorrector} sourceMapCorrector - * @param {IRandomGenerator} randomGenerator - * @param {ILogger} logger - * @param {IOptions} options - */ - constructor ( - @inject(ServiceIdentifiers.IObfuscator) obfuscator: IObfuscator, - @inject(ServiceIdentifiers.ISourceMapCorrector) sourceMapCorrector: ISourceMapCorrector, - @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, - @inject(ServiceIdentifiers.ILogger) logger: ILogger, - @inject(ServiceIdentifiers.IOptions) options: IOptions - ) { - this.obfuscator = obfuscator; - this.sourceMapCorrector = sourceMapCorrector; - this.randomGenerator = randomGenerator; - this.logger = logger; - this.options = options; - } - - /** - * @param {string} sourceCode - * @returns {IObfuscationResult} - */ - public obfuscate (sourceCode: string): IObfuscationResult { - const timeStart: number = Date.now(); - this.logger.info(LoggingMessage.ObfuscationStarted); - this.logger.info(LoggingMessage.RandomGeneratorSeed, this.randomGenerator.getSeed()); - - // parse AST tree - const astTree: ESTree.Program = this.parseCode(sourceCode); - - // obfuscate AST tree - const obfuscatedAstTree: ESTree.Program = this.obfuscator.obfuscateAstTree(astTree); - - // generate code - const generatorOutput: IGeneratorOutput = this.generateCode(sourceCode, obfuscatedAstTree); - - const obfuscationTime: number = (Date.now() - timeStart) / 1000; - this.logger.success(LoggingMessage.ObfuscationCompleted, obfuscationTime); - - return this.getObfuscationResult(generatorOutput); - } - - /** - * @param {string} sourceCode - * @returns {Program} - */ - private parseCode (sourceCode: string): ESTree.Program { - return esprima.parseScript(sourceCode, { - attachComment: true, - loc: this.options.sourceMap - }); - } - - /** - * @param {string} sourceCode - * @param {Program} astTree - * @returns {IGeneratorOutput} - */ - private generateCode (sourceCode: string, astTree: ESTree.Program): IGeneratorOutput { - const escodegenParams: escodegen.GenerateOptions = { - ...JavaScriptObfuscatorInternal.escodegenParams - }; - - if (this.options.sourceMap) { - escodegenParams.sourceMap = 'sourceMap'; - escodegenParams.sourceContent = sourceCode; - } - - if (this.options.mangle) { - astTree = esmangle.mangle(astTree); - } - - const generatorOutput: IGeneratorOutput = escodegen.generate(astTree, { - ...escodegenParams, - format: { - compact: this.options.compact - } - }); - - generatorOutput.map = generatorOutput.map ? generatorOutput.map.toString() : ''; - - return generatorOutput; - } - - /** - * @param {IGeneratorOutput} generatorOutput - * @returns {IObfuscationResult} - */ - private getObfuscationResult (generatorOutput: IGeneratorOutput): IObfuscationResult { - return this.sourceMapCorrector.correct( - generatorOutput.code, - generatorOutput.map - ); - } -} diff --git a/src/Obfuscator.ts b/src/Obfuscator.ts deleted file mode 100644 index af629348..00000000 --- a/src/Obfuscator.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { injectable, inject } from 'inversify'; -import { ServiceIdentifiers } from './container/ServiceIdentifiers'; - -import * as estraverse from 'estraverse'; -import * as ESTree from 'estree'; - -import { TNodeGuardFactory } from './types/container/node-guards/TNodeGuardFactory'; -import { TNodeTransformerFactory } from './types/container/node-transformers/TNodeTransformerFactory'; -import { TVisitorDirection } from './types/TVisitorDirection'; -import { TVisitorFunction } from './types/TVisitorFunction'; -import { TVisitorResult } from './types/TVisitorResult'; - -import { ICustomNodeGroup } from './interfaces/custom-nodes/ICustomNodeGroup'; -import { ILogger } from './interfaces/logger/ILogger'; -import { IObfuscationEventEmitter } from './interfaces/event-emitters/IObfuscationEventEmitter'; -import { IObfuscator } from './interfaces/IObfuscator'; -import { IOptions } from './interfaces/options/IOptions'; -import { IStackTraceAnalyzer } from './interfaces/analyzers/stack-trace-analyzer/IStackTraceAnalyzer'; -import { IStackTraceData } from './interfaces/analyzers/stack-trace-analyzer/IStackTraceData'; -import { IStorage } from './interfaces/storages/IStorage'; -import { IVisitor } from './interfaces/IVisitor'; - -import { LoggingMessage } from './enums/logger/LoggingMessage'; -import { NodeGuard } from './enums/container/node-guards/NodeGuard'; -import { NodeTransformer } from './enums/container/node-transformers/NodeTransformer'; -import { ObfuscationEvent } from './enums/event-emitters/ObfuscationEvent'; -import { VisitorDirection } from './enums/VisitorDirection'; - -import { Node } from './node/Node'; -import { NodeUtils } from './node/NodeUtils'; - -@injectable() -export class Obfuscator implements IObfuscator { - /** - * @type {NodeTransformer[]} - */ - private static readonly controlFlowTransformersList: NodeTransformer[] = [ - NodeTransformer.BlockStatementControlFlowTransformer, - NodeTransformer.FunctionControlFlowTransformer - ]; - - /** - * @type {NodeTransformer[]} - */ - private static readonly convertingTransformersList: NodeTransformer[] = [ - NodeTransformer.MemberExpressionTransformer, - NodeTransformer.MethodDefinitionTransformer, - NodeTransformer.TemplateLiteralTransformer - ]; - - /** - * @type {NodeTransformer[]} - */ - private static readonly deadCodeInjectionTransformersList: NodeTransformer[] = [ - NodeTransformer.DeadCodeInjectionTransformer - ]; - - /** - * @type {NodeTransformer[]} - */ - private static readonly obfuscatingTransformersList: NodeTransformer[] = [ - NodeTransformer.CatchClauseTransformer, - NodeTransformer.ClassDeclarationTransformer, - NodeTransformer.FunctionDeclarationTransformer, - NodeTransformer.FunctionTransformer, - NodeTransformer.LabeledStatementTransformer, - NodeTransformer.LiteralTransformer, - NodeTransformer.ObjectExpressionTransformer, - NodeTransformer.VariableDeclarationTransformer - ]; - - private static readonly nodeGuardsList: NodeGuard[] = [ - NodeGuard.BlackListNodeGuard, - NodeGuard.ConditionalCommentNodeGuard - ]; - - /** - * @type {IStorage} - */ - private readonly customNodeGroupStorage: IStorage; - - /** - * @type {Ilogger} - */ - private readonly logger: ILogger; - - /** - * @type {TNodeGuardFactory} - */ - private readonly nodeGuardFactory: TNodeGuardFactory; - - /** - * @type {TNodeTransformerFactory} - */ - private readonly nodeTransformerFactory: TNodeTransformerFactory; - - /** - * @type {IObfuscationEventEmitter} - */ - private readonly obfuscationEventEmitter: IObfuscationEventEmitter; - - /** - * @type {IOptions} - */ - private readonly options: IOptions; - - /** - * @type {IStackTraceAnalyzer} - */ - private readonly stackTraceAnalyzer: IStackTraceAnalyzer; - - /** - * @param {IStackTraceAnalyzer} stackTraceAnalyzer - * @param {IObfuscationEventEmitter} obfuscationEventEmitter - * @param {IStorage} customNodeGroupStorage - * @param {TNodeGuardFactory} nodeGuardFactory - * @param {TNodeTransformerFactory} nodeTransformerFactory - * @param {ILogger} logger - * @param {IOptions} options - */ - constructor ( - @inject(ServiceIdentifiers.IStackTraceAnalyzer) stackTraceAnalyzer: IStackTraceAnalyzer, - @inject(ServiceIdentifiers.IObfuscationEventEmitter) obfuscationEventEmitter: IObfuscationEventEmitter, - @inject(ServiceIdentifiers.TCustomNodeGroupStorage) customNodeGroupStorage: IStorage, - @inject(ServiceIdentifiers.Factory__INodeGuard) nodeGuardFactory: TNodeGuardFactory, - @inject(ServiceIdentifiers.Factory__INodeTransformer) nodeTransformerFactory: TNodeTransformerFactory, - @inject(ServiceIdentifiers.ILogger) logger: ILogger, - @inject(ServiceIdentifiers.IOptions) options: IOptions - ) { - this.stackTraceAnalyzer = stackTraceAnalyzer; - this.obfuscationEventEmitter = obfuscationEventEmitter; - this.customNodeGroupStorage = customNodeGroupStorage; - this.nodeGuardFactory = nodeGuardFactory; - this.nodeTransformerFactory = nodeTransformerFactory; - this.logger = logger; - this.options = options; - } - - /** - * @param {Program} astTree - * @returns {Program} - */ - public obfuscateAstTree (astTree: ESTree.Program): ESTree.Program { - if (Node.isProgramNode(astTree) && !astTree.body.length) { - this.logger.warn(LoggingMessage.EmptySourceCode); - - return astTree; - } - - astTree = NodeUtils.parentize(astTree); - - this.logger.info(LoggingMessage.StageAnalyzingASTTree); - const stackTraceData: IStackTraceData[] = this.stackTraceAnalyzer.analyze(astTree); - - // initialize custom node groups and configure custom nodes - this.customNodeGroupStorage - .getStorage() - .forEach((customNodeGroup: ICustomNodeGroup) => { - customNodeGroup.initialize(); - - this.obfuscationEventEmitter.once( - customNodeGroup.getAppendEvent(), - customNodeGroup.appendCustomNodes.bind(customNodeGroup) - ); - }); - - this.obfuscationEventEmitter.emit(ObfuscationEvent.BeforeObfuscation, astTree, stackTraceData); - - // first pass transformers: dead code injection transformer - if (this.options.deadCodeInjection) { - this.logger.info(LoggingMessage.StageDeadCodeInjection); - - astTree = this.transformAstTree(astTree, Obfuscator.deadCodeInjectionTransformersList); - } - - // second pass transformers: control flow flattening transformers - if (this.options.controlFlowFlattening) { - this.logger.info(LoggingMessage.StageControlFlowFlattening); - - astTree = this.transformAstTree(astTree, Obfuscator.controlFlowTransformersList); - } - - // third pass: converting and obfuscating transformers - this.logger.info(LoggingMessage.StageObfuscation); - astTree = this.transformAstTree(astTree, [ - ...Obfuscator.convertingTransformersList, - ...Obfuscator.obfuscatingTransformersList - ]); - - this.obfuscationEventEmitter.emit(ObfuscationEvent.AfterObfuscation, astTree, stackTraceData); - - return astTree; - } - - /** - * @param {Program} astTree - * @param {NodeTransformer[]} nodeTransformers - * @returns {Program} - */ - private transformAstTree (astTree: ESTree.Program, nodeTransformers: NodeTransformer[]): ESTree.Program { - if (!nodeTransformers.length) { - return astTree; - } - - const enterVisitors: IVisitor[] = []; - const leaveVisitors: IVisitor[] = []; - const nodeTransformersLength: number = nodeTransformers.length; - - let visitor: IVisitor; - - for (let i: number = 0; i < nodeTransformersLength; i++) { - visitor = this.nodeTransformerFactory(nodeTransformers[i]).getVisitor(); - - if (visitor.enter) { - enterVisitors.push(visitor); - } - - if (visitor.leave) { - leaveVisitors.push(visitor); - } - } - - estraverse.replace(astTree, { - enter: this.mergeVisitorsForDirection(enterVisitors, VisitorDirection.Enter), - leave: this.mergeVisitorsForDirection(leaveVisitors, VisitorDirection.Leave) - }); - - return astTree; - } - - /** - * @param {IVisitor[]} visitors - * @param {TVisitorDirection} direction - * @returns {TVisitorFunction} - */ - private mergeVisitorsForDirection (visitors: IVisitor[], direction: TVisitorDirection): TVisitorFunction { - const visitorsLength: number = visitors.length; - - if (!visitorsLength) { - return (node: ESTree.Node, parentNode: ESTree.Node) => node; - } - - return (node: ESTree.Node, parentNode: ESTree.Node) => { - const obfuscationEnabled: boolean = Obfuscator.nodeGuardsList - .every((nodeGuardName: NodeGuard) => this.nodeGuardFactory(nodeGuardName).check(node)); - - if (!obfuscationEnabled) { - return estraverse.VisitorOption.Skip; - } - - for (let i: number = 0; i < visitorsLength; i++) { - const visitorFunction: TVisitorFunction | undefined = visitors[i][direction]; - - if (!visitorFunction) { - continue; - } - - const visitorResult: TVisitorResult = visitorFunction(node, parentNode); - - if (!visitorResult || !Node.isNode(visitorResult)) { - continue; - } - - node = visitorResult; - } - - return node; - }; - } -} diff --git a/src/TransformersRunner.ts b/src/TransformersRunner.ts new file mode 100644 index 00000000..ad1346a4 --- /dev/null +++ b/src/TransformersRunner.ts @@ -0,0 +1,111 @@ +import { injectable, inject } from 'inversify'; +import { ServiceIdentifiers } from './container/ServiceIdentifiers'; + +import * as estraverse from 'estraverse'; +import * as ESTree from 'estree'; + +import { TNodeTransformerFactory } from './types/container/node-transformers/TNodeTransformerFactory'; +import { TVisitorDirection } from './types/TVisitorDirection'; +import { TVisitorFunction } from './types/TVisitorFunction'; +import { TVisitorResult } from './types/TVisitorResult'; + +import { ITransformersRunner } from './interfaces/ITransformersRunner'; +import { IVisitor } from './interfaces/IVisitor'; + +import { NodeTransformer } from './enums/container/node-transformers/NodeTransformer'; +import { VisitorDirection } from './enums/VisitorDirection'; + +import { Node } from './node/Node'; + +@injectable() +export class TransformersRunner implements ITransformersRunner { + /** + * @type {TNodeTransformerFactory} + */ + private readonly nodeTransformerFactory: TNodeTransformerFactory; + + /** + * @param {TNodeTransformerFactory} nodeTransformerFactory + */ + constructor ( + @inject(ServiceIdentifiers.Factory__INodeTransformer) nodeTransformerFactory: TNodeTransformerFactory, + ) { + this.nodeTransformerFactory = nodeTransformerFactory; + } + + /** + * @param {T} astTree + * @param {NodeTransformer[]} nodeTransformers + * @returns {T} + */ + public transform ( + astTree: T, + nodeTransformers: NodeTransformer[] + ): T { + if (!nodeTransformers.length) { + return astTree; + } + + const enterVisitors: IVisitor[] = []; + const leaveVisitors: IVisitor[] = []; + const nodeTransformersLength: number = nodeTransformers.length; + + let visitor: IVisitor; + + for (let i: number = 0; i < nodeTransformersLength; i++) { + visitor = this.nodeTransformerFactory(nodeTransformers[i]).getVisitor(); + + if (visitor.enter) { + enterVisitors.push(visitor); + } + + if (visitor.leave) { + leaveVisitors.push(visitor); + } + } + + estraverse.replace(astTree, { + enter: this.mergeVisitorsForDirection(enterVisitors, VisitorDirection.Enter), + leave: this.mergeVisitorsForDirection(leaveVisitors, VisitorDirection.Leave) + }); + + return astTree; + } + + /** + * @param {IVisitor[]} visitors + * @param {TVisitorDirection} direction + * @returns {TVisitorFunction} + */ + private mergeVisitorsForDirection (visitors: IVisitor[], direction: TVisitorDirection): TVisitorFunction { + const visitorsLength: number = visitors.length; + + if (!visitorsLength) { + return (node: ESTree.Node, parentNode: ESTree.Node) => node; + } + + return (node: ESTree.Node, parentNode: ESTree.Node) => { + if (node.ignoredNode) { + return estraverse.VisitorOption.Skip; + } + + for (let i: number = 0; i < visitorsLength; i++) { + const visitorFunction: TVisitorFunction | undefined = visitors[i][direction]; + + if (!visitorFunction) { + continue; + } + + const visitorResult: TVisitorResult = visitorFunction(node, parentNode); + + if (!visitorResult || !Node.isNode(visitorResult)) { + continue; + } + + node = visitorResult; + } + + return node; + }; + } +} diff --git a/src/cli/JavaScriptObfuscatorCLI.ts b/src/cli/JavaScriptObfuscatorCLI.ts index 65957873..1157687d 100644 --- a/src/cli/JavaScriptObfuscatorCLI.ts +++ b/src/cli/JavaScriptObfuscatorCLI.ts @@ -18,7 +18,7 @@ import { SourceMapModeSanitizer } from './sanitizers/SourceMapModeSanitizer'; import { StringArrayEncodingSanitizer } from './sanitizers/StringArrayEncodingSanitizer'; import { CLIUtils } from './utils/CLIUtils'; -import { JavaScriptObfuscator } from '../JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../JavaScriptObfuscatorFacade'; export class JavaScriptObfuscatorCLI implements IInitializable { /** diff --git a/src/container/InversifyContainerFacade.ts b/src/container/InversifyContainerFacade.ts index 9f610edd..eaefdc1b 100644 --- a/src/container/InversifyContainerFacade.ts +++ b/src/container/InversifyContainerFacade.ts @@ -17,19 +17,19 @@ import { IJavaScriptObfuscator } from '../interfaces/IJavaScriptObfsucator'; import { ILogger } from '../interfaces/logger/ILogger'; import { IObfuscationEventEmitter } from '../interfaces/event-emitters/IObfuscationEventEmitter'; import { IObfuscationResult } from '../interfaces/IObfuscationResult'; -import { IObfuscator } from '../interfaces/IObfuscator'; import { IOptions } from '../interfaces/options/IOptions'; import { ISourceCode } from '../interfaces/ISourceCode'; import { ISourceMapCorrector } from '../interfaces/ISourceMapCorrector'; +import { ITransformersRunner } from '../interfaces/ITransformersRunner'; -import { JavaScriptObfuscatorInternal } from '../JavaScriptObfuscatorInternal'; +import { JavaScriptObfuscator } from '../JavaScriptObfuscator'; import { Logger } from '../logger/Logger'; import { ObfuscationEventEmitter } from '../event-emitters/ObfuscationEventEmitter'; import { ObfuscationResult } from '../ObfuscationResult'; -import { Obfuscator } from '../Obfuscator'; import { Options } from "../options/Options"; import { SourceCode } from '../SourceCode'; import { SourceMapCorrector } from '../SourceMapCorrector'; +import { TransformersRunner } from '../TransformersRunner'; export class InversifyContainerFacade implements IInversifyContainerFacade { /** @@ -155,12 +155,12 @@ export class InversifyContainerFacade implements IInversifyContainerFacade { this.container .bind(ServiceIdentifiers.IJavaScriptObfuscator) - .to(JavaScriptObfuscatorInternal) + .to(JavaScriptObfuscator) .inSingletonScope(); this.container - .bind(ServiceIdentifiers.IObfuscator) - .to(Obfuscator) + .bind(ServiceIdentifiers.ITransformersRunner) + .to(TransformersRunner) .inSingletonScope(); this.container diff --git a/src/container/ServiceIdentifiers.ts b/src/container/ServiceIdentifiers.ts index 7ebe9119..cca98bf7 100644 --- a/src/container/ServiceIdentifiers.ts +++ b/src/container/ServiceIdentifiers.ts @@ -25,13 +25,13 @@ export enum ServiceIdentifiers { INodeTransformer = 'INodeTransformer', IObfuscationEventEmitter = 'IObfuscationEventEmitter', IObfuscationResult = 'IObfuscationResult', - IObfuscator = 'IObfuscator', IOptions = 'IOptions', IObfuscatingReplacer = 'IObfuscatingReplacer', IRandomGenerator = 'IRandomGenerator', ISourceCode = 'ISourceCode', ISourceMapCorrector = 'ISourceMapCorrector', IStackTraceAnalyzer = 'IStackTraceAnalyzer', + ITransformersRunner = 'ITransformersRunner', Newable__ICustomNode = 'Newable', Newable__TControlFlowStorage = 'Newable', TCustomNodeGroupStorage = 'TCustomNodeGroupStorage', diff --git a/src/container/modules/node-transformers/NodeTransformersModule.ts b/src/container/modules/node-transformers/NodeTransformersModule.ts index f3294821..acab4287 100644 --- a/src/container/modules/node-transformers/NodeTransformersModule.ts +++ b/src/container/modules/node-transformers/NodeTransformersModule.ts @@ -19,10 +19,21 @@ import { LiteralTransformer } from '../../../node-transformers/obfuscating-trans import { MemberExpressionTransformer } from '../../../node-transformers/converting-transformers/MemberExpressionTransformer'; import { MethodDefinitionTransformer } from '../../../node-transformers/converting-transformers/MethodDefinitionTransformer'; import { ObjectExpressionTransformer } from '../../../node-transformers/obfuscating-transformers/ObjectExpressionTransformer'; +import { ParentizeTransformer } from '../../../node-transformers/preparing-transformers/ParentizeTransformer'; import { TemplateLiteralTransformer } from '../../../node-transformers/converting-transformers/TemplateLiteralTransformer'; import { VariableDeclarationTransformer } from '../../../node-transformers/obfuscating-transformers/VariableDeclarationTransformer'; +import { NodeGuardTransformer } from '../../../node-transformers/preparing-transformers/NodeGuardTransformer'; export const nodeTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => { + // preparing transformers + bind(ServiceIdentifiers.INodeTransformer) + .to(ParentizeTransformer) + .whenTargetNamed(NodeTransformer.ParentizeTransformer); + + bind(ServiceIdentifiers.INodeTransformer) + .to(NodeGuardTransformer) + .whenTargetNamed(NodeTransformer.NodeGuardTransformer); + // control flow transformers bind(ServiceIdentifiers.INodeTransformer) .to(BlockStatementControlFlowTransformer) diff --git a/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts b/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts index 3383a248..5bbbe9b2 100644 --- a/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts +++ b/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts @@ -16,7 +16,7 @@ import { SingleNodeCallControllerTemplate } from '../../templates/custom-nodes/S import { NO_CUSTOM_NODES_PRESET } from '../../options/presets/NoCustomNodes'; import { AbstractCustomNode } from '../AbstractCustomNode'; -import { JavaScriptObfuscator } from '../../JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../JavaScriptObfuscatorFacade'; import { NodeUtils } from '../../node/NodeUtils'; @injectable() diff --git a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts index f3e6958c..c1252028 100644 --- a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts +++ b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts @@ -16,7 +16,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../options/presets/NoCustomNodes'; import { SelfDefendingTemplate } from '../../templates/custom-nodes/self-defending-nodes/self-defending-unicode-node/SelfDefendingTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; -import { JavaScriptObfuscator } from '../../JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../JavaScriptObfuscatorFacade'; import { NodeUtils } from '../../node/NodeUtils'; @injectable() diff --git a/src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts b/src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts index b7bd714c..6712fe0e 100644 --- a/src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts +++ b/src/custom-nodes/string-array-nodes/StringArrayCallsWrapper.ts @@ -23,7 +23,7 @@ import { StringArrayCallsWrapperTemplate } from '../../templates/custom-nodes/st import { StringArrayRc4DecodeNodeTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-calls-wrapper/StringArrayRC4DecodeNodeTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; -import { JavaScriptObfuscator } from '../../JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../JavaScriptObfuscatorFacade'; import { NodeUtils } from '../../node/NodeUtils'; @injectable() diff --git a/src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts b/src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts index 7d2eb1b0..dd9fbd15 100644 --- a/src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts +++ b/src/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.ts @@ -18,7 +18,7 @@ import { SelfDefendingTemplate } from '../../templates/custom-nodes/string-array import { StringArrayRotateFunctionTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-rotate-function-node/StringArrayRotateFunctionTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; -import { JavaScriptObfuscator } from '../../JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../JavaScriptObfuscatorFacade'; import { NodeUtils } from '../../node/NodeUtils'; import { Utils } from '../../utils/Utils'; diff --git a/src/declarations/ESTree.d.ts b/src/declarations/ESTree.d.ts index 9f2c7a93..db3aaca6 100644 --- a/src/declarations/ESTree.d.ts +++ b/src/declarations/ESTree.d.ts @@ -4,6 +4,7 @@ import * as ESTree from 'estree'; declare module 'estree' { interface BaseNode { + ignoredNode?: boolean; obfuscatedNode?: boolean; parentNode?: ESTree.Node; } diff --git a/src/enums/container/node-transformers/NodeTransformer.ts b/src/enums/container/node-transformers/NodeTransformer.ts index e5266f64..db867e92 100644 --- a/src/enums/container/node-transformers/NodeTransformer.ts +++ b/src/enums/container/node-transformers/NodeTransformer.ts @@ -10,7 +10,9 @@ export enum NodeTransformer { LiteralTransformer, MemberExpressionTransformer, MethodDefinitionTransformer, + NodeGuardTransformer, ObjectExpressionTransformer, + ParentizeTransformer, TemplateLiteralTransformer, VariableDeclarationTransformer } diff --git a/src/enums/logger/LoggingMessage.ts b/src/enums/logger/LoggingMessage.ts index da0efe6d..2ab161ea 100644 --- a/src/enums/logger/LoggingMessage.ts +++ b/src/enums/logger/LoggingMessage.ts @@ -3,6 +3,7 @@ export enum LoggingMessage { ObfuscationCompleted = 'Obfuscation completed. Total time: %s sec.', ObfuscationStarted = 'Obfuscation started...', RandomGeneratorSeed = 'Random generator seed: %s...', + StagePreparingASTTree = 'Stage: preparing AST-tree...', StageAnalyzingASTTree = 'Stage: analyzing AST-tree...', StageControlFlowFlattening = 'Stage: control flow flattening...', StageDeadCodeInjection = 'Stage: dead code injection...', diff --git a/src/interfaces/IObfuscator.d.ts b/src/interfaces/IObfuscator.d.ts deleted file mode 100644 index edfaa4e5..00000000 --- a/src/interfaces/IObfuscator.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import * as ESTree from 'estree'; - -export interface IObfuscator { - /** - * @param astTree - * @returns ESTree.Program - */ - obfuscateAstTree (astTree: ESTree.Program): ESTree.Program; -} diff --git a/src/interfaces/ITransformersRunner.d.ts b/src/interfaces/ITransformersRunner.d.ts new file mode 100644 index 00000000..95436c70 --- /dev/null +++ b/src/interfaces/ITransformersRunner.d.ts @@ -0,0 +1,12 @@ +import * as ESTree from 'estree'; + +import { NodeTransformer } from '../enums/container/node-transformers/NodeTransformer'; + +export interface ITransformersRunner { + /** + * @param {T} astTree + * @param {NodeTransformer[]} nodeTransformers + * @returns {T} + */ + transform (astTree: T, nodeTransformers: NodeTransformer[]): T; +} diff --git a/src/interfaces/IVisitor.d.ts b/src/interfaces/IVisitor.d.ts index 7baa588d..3adf1564 100644 --- a/src/interfaces/IVisitor.d.ts +++ b/src/interfaces/IVisitor.d.ts @@ -1,6 +1,7 @@ +import * as estraverse from 'estraverse'; import * as ESTree from 'estree'; export interface IVisitor { - enter?: (node: ESTree.Node, parentNode: ESTree.Node | null) => ESTree.Node | void; - leave?: (node: ESTree.Node, parentNode: ESTree.Node | null) => ESTree.Node | void; + enter?: (node: ESTree.Node, parentNode: ESTree.Node | null) => ESTree.Node | estraverse.VisitorOption | void; + leave?: (node: ESTree.Node, parentNode: ESTree.Node | null) => ESTree.Node | estraverse.VisitorOption | void; } diff --git a/src/interfaces/node-transformers/INodeTransformer.d.ts b/src/interfaces/node-transformers/INodeTransformer.d.ts index d3207a9d..e72cfbc1 100644 --- a/src/interfaces/node-transformers/INodeTransformer.d.ts +++ b/src/interfaces/node-transformers/INodeTransformer.d.ts @@ -1,3 +1,4 @@ +import * as estraverse from 'estraverse'; import * as ESTree from 'estree'; import { IVisitor } from '../IVisitor'; @@ -9,9 +10,15 @@ export interface INodeTransformer { getVisitor (): IVisitor; /** - * @param node - * @param parentNode - * @returns {ESTree.Node} + * @param {Node} node + * @param {Node} parentNode */ - transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node; + analyzeNode ? (node: ESTree.Node, parentNode: ESTree.Node): void; + + /** + * @param {Node} node + * @param {Node} parentNode + * @returns {Node | VisitorOption} + */ + transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node | estraverse.VisitorOption; } diff --git a/src/node-guards/ConditionalCommentNodeGuard.ts b/src/node-guards/ConditionalCommentNodeGuard.ts index 59d210ff..93870140 100644 --- a/src/node-guards/ConditionalCommentNodeGuard.ts +++ b/src/node-guards/ConditionalCommentNodeGuard.ts @@ -19,39 +19,39 @@ export class ConditionalCommentNodeGuard implements INodeGuard { /** * @type {boolean} */ - private obfuscationEnabledForCurrentNode: boolean = true; + private obfuscationAllowedForCurrentNode: boolean = true; /** * @type {boolean} */ - private obfuscationEnabledForNextNode: boolean | null = null; + private obfuscationAllowedForNextNode: boolean | null = null; /** * @returns {boolean} * @param node */ public check (node: ESTree.Node): boolean { - if (this.obfuscationEnabledForNextNode) { - this.obfuscationEnabledForCurrentNode = this.obfuscationEnabledForNextNode; - this.obfuscationEnabledForNextNode = null; + if (this.obfuscationAllowedForNextNode) { + this.obfuscationAllowedForCurrentNode = this.obfuscationAllowedForNextNode; + this.obfuscationAllowedForNextNode = null; } if (!node.leadingComments && !node.trailingComments) { - return this.obfuscationEnabledForCurrentNode; + return this.obfuscationAllowedForCurrentNode; } const leadingComments: ESTree.Comment[] | undefined = node.leadingComments; const trailingComments: ESTree.Comment[] | undefined = node.trailingComments; if (leadingComments) { - this.obfuscationEnabledForCurrentNode = this.checkComments(leadingComments); + this.obfuscationAllowedForCurrentNode = this.checkComments(leadingComments); } if (trailingComments) { - this.obfuscationEnabledForNextNode = this.checkComments(trailingComments); + this.obfuscationAllowedForNextNode = this.checkComments(trailingComments); } - return this.obfuscationEnabledForCurrentNode; + return this.obfuscationAllowedForCurrentNode; } /** @@ -61,22 +61,22 @@ export class ConditionalCommentNodeGuard implements INodeGuard { private checkComments (comments: ESTree.Comment[]): boolean { const commentsLength: number = comments.length; - let obfuscationEnabled: boolean = this.obfuscationEnabledForCurrentNode; + let obfuscationAllowed: boolean = this.obfuscationAllowedForCurrentNode; for (let i: number = 0; i < commentsLength; i++) { const comment: ESTree.Comment = comments[i]; if (ConditionalCommentNodeGuard.obfuscationEnableCommentRegExp.test(comment.value)) { - obfuscationEnabled = true; + obfuscationAllowed = true; continue; } if (ConditionalCommentNodeGuard.obfuscationDisableCommentRegExp.test(comment.value)) { - obfuscationEnabled = false; + obfuscationAllowed = false; } } - return obfuscationEnabled; + return obfuscationAllowed; } } diff --git a/src/node-transformers/AbstractNodeTransformer.ts b/src/node-transformers/AbstractNodeTransformer.ts index dacd9e8c..58e95fdb 100644 --- a/src/node-transformers/AbstractNodeTransformer.ts +++ b/src/node-transformers/AbstractNodeTransformer.ts @@ -1,6 +1,7 @@ import { injectable, inject, postConstruct } from 'inversify'; import { ServiceIdentifiers } from '../container/ServiceIdentifiers'; +import * as estraverse from 'estraverse'; import * as ESTree from 'estree'; import { IInitializable } from '../interfaces/IInitializable'; @@ -54,7 +55,7 @@ export abstract class AbstractNodeTransformer implements INodeTransformer, IInit /** * @param {Node} node * @param {Node} parentNode - * @returns {Node} + * @returns {Node | VisitorOption} */ - public abstract transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node; + public abstract transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node | estraverse.VisitorOption; } diff --git a/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts b/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts index 80f1effb..73344288 100644 --- a/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts +++ b/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts @@ -30,6 +30,11 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer { */ private readonly collectedBlockStatements: ESTree.BlockStatement[] = []; + /** + * @type {number} + */ + private collectedBlockStatementsLength: number; + /** * @param {IRandomGenerator} randomGenerator * @param {IOptions} options @@ -46,8 +51,15 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer { */ public getVisitor (): IVisitor { return { - leave: (node: ESTree.Node, parentNode: ESTree.Node) => { + enter: (node: ESTree.Node, parentNode: ESTree.Node) => { if (Node.isProgramNode(node)) { + this.analyzeNode(node, parentNode); + + return node; + } + }, + leave: (node: ESTree.Node, parentNode: ESTree.Node) => { + if (Node.isBlockStatementNode(node)) { return this.transformNode(node, parentNode); } } @@ -55,14 +67,52 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer { } /** - * @param {Program} programNode + * @param {Node} programNode * @param {Node} parentNode - * @returns {Node} */ - public transformNode (programNode: ESTree.Program, parentNode: ESTree.Node): ESTree.Node { - this.transformProgramNode(programNode); + public analyzeNode (programNode: ESTree.Node, parentNode: ESTree.Node): void { + estraverse.traverse(programNode, { + enter: (node: ESTree.Node): any => { + if (Node.isBlockStatementNode(node)) { + this.collectBlockStatementNodes(node, this.collectedBlockStatements); + } + } + }); - return programNode; + this.collectedBlockStatementsLength = this.collectedBlockStatements.length; + } + + /** + * @param {BlockStatement} blockStatementNode + * @param {Node} parentNode + * @returns {Node | VisitorOption} + */ + public transformNode ( + blockStatementNode: ESTree.BlockStatement, + parentNode: ESTree.Node + ): ESTree.Node | estraverse.VisitorOption { + if (this.collectedBlockStatementsLength < DeadCodeInjectionTransformer.minCollectedBlockStatementsCount) { + return estraverse.VisitorOption.Break; + } + + if (!this.collectedBlockStatements.length) { + return estraverse.VisitorOption.Break; + } + + if (this.randomGenerator.getMathRandom() > this.options.deadCodeInjectionThreshold) { + return blockStatementNode; + } + + const minInteger: number = 0; + const maxInteger: number = this.collectedBlockStatements.length - 1; + const randomIndex: number = this.randomGenerator.getRandomInteger(minInteger, maxInteger); + const randomBlockStatementNode: ESTree.BlockStatement = this.collectedBlockStatements.splice(randomIndex, 1)[0]; + + if (randomBlockStatementNode === blockStatementNode) { + return blockStatementNode; + } + + return this.replaceBlockStatementNode(blockStatementNode, randomBlockStatementNode); } /** @@ -163,49 +213,4 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer { return newBlockStatementNode; } - - /** - * @param {Program} programNode - */ - private transformProgramNode (programNode: ESTree.Program): void { - estraverse.traverse(programNode, { - enter: (node: ESTree.Node, parentNode: ESTree.Node): any => { - if (!Node.isBlockStatementNode(node)) { - return; - } - - this.collectBlockStatementNodes(node, this.collectedBlockStatements); - } - }); - - if (this.collectedBlockStatements.length < DeadCodeInjectionTransformer.minCollectedBlockStatementsCount) { - return; - } - - estraverse.replace(programNode, { - leave: (node: ESTree.Node, parentNode: ESTree.Node): any => { - if (!this.collectedBlockStatements.length) { - return estraverse.VisitorOption.Break; - } - - if ( - !Node.isBlockStatementNode(node) || - this.randomGenerator.getMathRandom() > this.options.deadCodeInjectionThreshold - ) { - return node; - } - - const minInteger: number = 0; - const maxInteger: number = this.collectedBlockStatements.length - 1; - const randomIndex: number = this.randomGenerator.getRandomInteger(minInteger, maxInteger); - const randomBlockStatementNode: ESTree.BlockStatement = this.collectedBlockStatements.splice(randomIndex, 1)[0]; - - if (randomBlockStatementNode === node) { - return node; - } - - return this.replaceBlockStatementNode(node, randomBlockStatementNode); - } - }); - } } diff --git a/src/node-transformers/preparing-transformers/NodeGuardTransformer.ts b/src/node-transformers/preparing-transformers/NodeGuardTransformer.ts new file mode 100644 index 00000000..6a2a48b4 --- /dev/null +++ b/src/node-transformers/preparing-transformers/NodeGuardTransformer.ts @@ -0,0 +1,72 @@ +import { injectable, inject } from 'inversify'; +import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; + +import * as ESTree from 'estree'; + +import { IOptions } from '../../interfaces/options/IOptions'; +import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; +import { IVisitor } from '../../interfaces/IVisitor'; + +import { NodeGuard } from '../../enums/container/node-guards/NodeGuard'; + +import { AbstractNodeTransformer } from '../AbstractNodeTransformer'; +import { TNodeGuardFactory } from '../../types/container/node-guards/TNodeGuardFactory'; +import { INodeGuard } from '../../interfaces/node-guards/INodeGuard'; + +/** + * Adds `parentNode` properties to each node + */ +@injectable() +export class NodeGuardTransformer extends AbstractNodeTransformer { + /** + * @type {NodeGuard[]} + */ + private static readonly nodeGuardsList: NodeGuard[] = [ + NodeGuard.BlackListNodeGuard, + NodeGuard.ConditionalCommentNodeGuard + ]; + + /** + * @type {INodeGuard[]} + */ + private readonly nodeGuards: INodeGuard[]; + + /** + * @param {TNodeGuardFactory} nodeGuardFactory + * @param {IRandomGenerator} randomGenerator + * @param {IOptions} options + */ + constructor ( + @inject(ServiceIdentifiers.Factory__INodeGuard) nodeGuardFactory: TNodeGuardFactory, + @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + super(randomGenerator, options); + + this.nodeGuards = NodeGuardTransformer.nodeGuardsList.map(nodeGuardFactory); + } + + /** + * @return {IVisitor} + */ + public getVisitor (): IVisitor { + return { + enter: (node: ESTree.Node, parentNode: ESTree.Node) => { + return this.transformNode(node, parentNode); + } + }; + } + + /** + * @param {Node} node + * @param {Node} parentNode + * @returns {Node} + */ + public transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node { + const obfuscationAllowed: boolean = this.nodeGuards.every((nodeGuard: INodeGuard) => nodeGuard.check(node)); + + node.ignoredNode = !obfuscationAllowed; + + return node; + } +} diff --git a/src/node-transformers/preparing-transformers/ParentizeTransformer.ts b/src/node-transformers/preparing-transformers/ParentizeTransformer.ts new file mode 100644 index 00000000..02f51d24 --- /dev/null +++ b/src/node-transformers/preparing-transformers/ParentizeTransformer.ts @@ -0,0 +1,50 @@ +import { injectable, inject } from 'inversify'; +import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; + +import * as ESTree from 'estree'; + +import { IOptions } from '../../interfaces/options/IOptions'; +import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator'; +import { IVisitor } from '../../interfaces/IVisitor'; + +import { AbstractNodeTransformer } from '../AbstractNodeTransformer'; + +/** + * Adds `parentNode` properties to each node + */ +@injectable() +export class ParentizeTransformer extends AbstractNodeTransformer { + /** + * @param {IRandomGenerator} randomGenerator + * @param {IOptions} options + */ + constructor ( + @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, + @inject(ServiceIdentifiers.IOptions) options: IOptions + ) { + super(randomGenerator, options); + } + + /** + * @return {IVisitor} + */ + public getVisitor (): IVisitor { + return { + enter: (node: ESTree.Node, parentNode: ESTree.Node) => { + return this.transformNode(node, parentNode); + } + }; + } + + /** + * @param {Node} node + * @param {Node} parentNode + * @returns {Node} + */ + public transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node { + node.parentNode = parentNode || node; + node.obfuscatedNode = false; + + return node; + } +} diff --git a/src/node/NodeUtils.ts b/src/node/NodeUtils.ts index 998a3026..626a9f96 100644 --- a/src/node/NodeUtils.ts +++ b/src/node/NodeUtils.ts @@ -9,7 +9,6 @@ import { TStatement } from '../types/node/TStatement'; import { NodeType } from '../enums/NodeType'; import { Node } from './Node'; -import { Nodes } from './Nodes'; export class NodeUtils { /** @@ -44,7 +43,7 @@ export class NodeUtils { * @param {T} astTree * @returns {T} */ - public static clone (astTree: T): T { + public static clone (astTree: T): T { /** * @param {T} node * @returns {T} @@ -151,11 +150,13 @@ export class NodeUtils { } } - if (!Node.isProgramNode(parentNode)) { + if (node !== parentNode) { return NodeUtils.getBlockScopesOfNode(parentNode, blockScopes); } - blockScopes.push(parentNode); + if (Node.isNodeHasBlockStatement(parentNode)) { + blockScopes.push(parentNode); + } return blockScopes; } @@ -199,27 +200,10 @@ export class NodeUtils { * @param {T} astTree * @returns {T} */ - public static parentize (astTree: T): T { - let isRootNode: boolean = true; - + public static parentize (astTree: T): T { estraverse.traverse(astTree, { enter: (node: ESTree.Node, parentNode: ESTree.Node): any => { - let value: ESTree.Node; - - if (isRootNode) { - if (node.type === NodeType.Program) { - value = node; - } else { - value = Nodes.getProgramNode([node]); - value.parentNode = value; - } - - isRootNode = false; - } else { - value = parentNode || node; - } - - node.parentNode = value; + node.parentNode = parentNode || node; node.obfuscatedNode = false; } }); diff --git a/test/dev/dev.ts b/test/dev/dev.ts index f4603eca..2e6c98a0 100644 --- a/test/dev/dev.ts +++ b/test/dev/dev.ts @@ -11,6 +11,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../src/options/presets/NoCustomNodes' var foo = function () { console.log('abc'); }; + // javascript-obfuscator:disable var bar = function () { console.log('def'); }; diff --git a/test/functional-tests/cli/JavaScriptObfuscatorCLI.spec.ts b/test/functional-tests/cli/JavaScriptObfuscatorCLI.spec.ts index ea619577..3b8cbf4b 100644 --- a/test/functional-tests/cli/JavaScriptObfuscatorCLI.spec.ts +++ b/test/functional-tests/cli/JavaScriptObfuscatorCLI.spec.ts @@ -6,7 +6,7 @@ import { assert } from 'chai'; import { StdoutWriteMock } from '../../mocks/StdoutWriteMock'; -import { JavaScriptObfuscator } from '../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../src/JavaScriptObfuscatorFacade'; describe('JavaScriptObfuscatorCLI', function (): void { this.timeout(100000); diff --git a/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts b/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts index 6ec6eee3..a7d3d5ec 100644 --- a/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts +++ b/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustom import { readFileAsString } from '../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade'; describe('ConsoleOutputDisableExpressionNode', () => { const consoleLogRegExp: RegExp = /_0x([a-f0-9]){4,6}\['console'\]\['log'\] *= *_0x([a-f0-9]){4,6};/u; diff --git a/test/functional-tests/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts b/test/functional-tests/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts index 5cfa1075..007df024 100644 --- a/test/functional-tests/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts +++ b/test/functional-tests/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustom import { readFileAsString } from '../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade'; describe('DomainLockNode', () => { const regExp: RegExp = /var _0x([a-f0-9]){4,6} *= *new RegExp/; diff --git a/test/functional-tests/custom-nodes/string-array-nodes/StringArrayCallsWrapper.spec.ts b/test/functional-tests/custom-nodes/string-array-nodes/StringArrayCallsWrapper.spec.ts index 2500ce2d..86789093 100644 --- a/test/functional-tests/custom-nodes/string-array-nodes/StringArrayCallsWrapper.spec.ts +++ b/test/functional-tests/custom-nodes/string-array-nodes/StringArrayCallsWrapper.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustom import { readFileAsString } from '../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade'; describe('StringArrayCallsWrapper', () => { const regExp: RegExp = /_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6} *- *0x0\;/; diff --git a/test/functional-tests/custom-nodes/string-array-nodes/StringArrayNode.spec.ts b/test/functional-tests/custom-nodes/string-array-nodes/StringArrayNode.spec.ts index 8c142896..8a4df36f 100644 --- a/test/functional-tests/custom-nodes/string-array-nodes/StringArrayNode.spec.ts +++ b/test/functional-tests/custom-nodes/string-array-nodes/StringArrayNode.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustom import { readFileAsString } from '../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade'; describe('StringArrayNode', () => { const regExp: RegExp = /^var _0x([a-f0-9]){4} *= *\[/; diff --git a/test/functional-tests/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.spec.ts b/test/functional-tests/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.spec.ts index 9fe7ec6d..9ea7e475 100644 --- a/test/functional-tests/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.spec.ts +++ b/test/functional-tests/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustom import { readFileAsString } from '../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade'; describe('StringArrayRotateFunctionNode', () => { const regExp: RegExp = /while *\(-- *_0x([a-f0-9]){4,6}\) *\{/; diff --git a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts b/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts index 143954ab..f507bc51 100644 --- a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts +++ b/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts @@ -2,7 +2,7 @@ import { assert } from 'chai'; import { IObfuscationResult } from '../../../src/interfaces/IObfuscationResult'; -import { JavaScriptObfuscator } from '../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../src/JavaScriptObfuscatorFacade'; import { NO_CUSTOM_NODES_PRESET } from '../../../src/options/presets/NoCustomNodes'; diff --git a/test/functional-tests/node-guards/black-list-node-guard/BlackListNodeGuard.spec.ts b/test/functional-tests/node-guards/black-list-node-guard/BlackListNodeGuard.spec.ts index 528b1b01..dbd713f0 100644 --- a/test/functional-tests/node-guards/black-list-node-guard/BlackListNodeGuard.spec.ts +++ b/test/functional-tests/node-guards/black-list-node-guard/BlackListNodeGuard.spec.ts @@ -2,7 +2,7 @@ import { assert } from 'chai'; import { IObfuscationResult } from '../../../../src/interfaces/IObfuscationResult'; -import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade'; import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustomNodes'; diff --git a/test/functional-tests/node-transformers/control-flow-transformers/block-statement-control-flow-transformer/BlockStatementControlFlowTransformer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/block-statement-control-flow-transformer/BlockStatementControlFlowTransformer.spec.ts index 69191ca6..25aef9f8 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/block-statement-control-flow-transformer/BlockStatementControlFlowTransformer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/block-statement-control-flow-transformer/BlockStatementControlFlowTransformer.spec.ts @@ -7,7 +7,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { getRegExpMatch } from '../../../../helpers/getRegExpMatch'; import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; /** * @param hexNumber diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts index e3619aaa..28651770 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/BinaryExpressionControlFlowReplacer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../../src/options/presets/No import { readFileAsString } from '../../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscatorFacade'; describe('BinaryExpressionControlFlowReplacer', function () { this.timeout(100000); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts index 26831cf1..a707e34b 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/CallExpressionControlFlowReplacer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../../src/options/presets/No import { readFileAsString } from '../../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscatorFacade'; describe('CallExpressionControlFlowReplacer', function () { this.timeout(100000); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts index a4fc1c80..12dc5a5d 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/LogicalExpressionControlFlowReplacer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../../src/options/presets/No import { readFileAsString } from '../../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscatorFacade'; describe('LogicalExpressionControlFlowReplacer', function () { this.timeout(100000); diff --git a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts index 0430bd8c..2efdabd3 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/control-flow-replacers/string-litertal-control-flow-replacer/StringLiteralControlFlowReplacer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../../src/options/presets/No import { readFileAsString } from '../../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../../src/JavaScriptObfuscatorFacade'; describe('StringLiteralControlFlowReplacer', () => { describe('replace (literalNode: ESTree.Literal,parentNode: ESTree.Node,controlFlowStorage: IStorage )', () => { diff --git a/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts b/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts index ac36764a..85d2a848 100644 --- a/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts +++ b/test/functional-tests/node-transformers/control-flow-transformers/function-control-flow-transformer/FunctionControlFlowTransformer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('FunctionControlFlowTransformer', function () { this.timeout(100000); diff --git a/test/functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec.ts b/test/functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec.ts index 3bd0e027..44cd63b6 100644 --- a/test/functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/converting-transformers/member-expression-transformer/MemberExpressionTransformer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('MemberExpressionTransformer', () => { describe('transformation of member expression node with dot notation', () => { diff --git a/test/functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.spec.ts b/test/functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.spec.ts index 728eb5e4..4641841d 100644 --- a/test/functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/converting-transformers/method-definition-transformer/MethodDefinitionTransformer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('MethodDefinitionTransformer', () => { const code: string = readFileAsString(__dirname + '/fixtures/input.js'); diff --git a/test/functional-tests/node-transformers/converting-transformers/template-literal-transformer/TemplateLiteralTransformer.spec.ts b/test/functional-tests/node-transformers/converting-transformers/template-literal-transformer/TemplateLiteralTransformer.spec.ts index 23fefe28..223b3cba 100644 --- a/test/functional-tests/node-transformers/converting-transformers/template-literal-transformer/TemplateLiteralTransformer.spec.ts +++ b/test/functional-tests/node-transformers/converting-transformers/template-literal-transformer/TemplateLiteralTransformer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('TemplateLiteralTransformer', () => { describe('variant #1: simple template literal', () => { diff --git a/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts b/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts index de13f87e..e5a282e4 100644 --- a/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustom import { readFileAsString } from '../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscatorFacade'; describe('DeadCodeInjectionTransformer', () => { const variableMatch: string = '_0x([a-f0-9]){4,6}'; diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec.ts index 6392a0cf..8bed91a1 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/catch-clause-transformer/CatchClauseTransformer.spec.ts @@ -7,7 +7,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { getRegExpMatch } from '../../../../helpers/getRegExpMatch'; import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('CatchClauseTransformer', () => { let obfuscatedCode: string; diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/class-declaration-transformer/ClassDeclarationTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/class-declaration-transformer/ClassDeclarationTransformer.spec.ts index 87706a43..4b0b1887 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/class-declaration-transformer/ClassDeclarationTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/class-declaration-transformer/ClassDeclarationTransformer.spec.ts @@ -7,7 +7,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { getRegExpMatch } from '../../../../helpers/getRegExpMatch'; import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('ClassDeclarationTransformer', () => { describe('transformation of `classDeclaration` node names', () => { diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/function-declaration-transformer/FunctionDeclarationTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/function-declaration-transformer/FunctionDeclarationTransformer.spec.ts index 0fa1826b..5c3e07f7 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/function-declaration-transformer/FunctionDeclarationTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/function-declaration-transformer/FunctionDeclarationTransformer.spec.ts @@ -7,7 +7,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { getRegExpMatch } from '../../../../helpers/getRegExpMatch'; import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('FunctionDeclarationTransformer', () => { describe('transformation of `functionDeclaration` node names', () => { diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts index 531db379..834a3e6f 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; import { getRegExpMatch } from '../../../../helpers/getRegExpMatch'; describe('FunctionTransformer', () => { diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/labeled-statement-transformer/LabeledStatementTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/labeled-statement-transformer/LabeledStatementTransformer.spec.ts index 659495ff..ba3b2628 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/labeled-statement-transformer/LabeledStatementTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/labeled-statement-transformer/LabeledStatementTransformer.spec.ts @@ -7,7 +7,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { getRegExpMatch } from '../../../../helpers/getRegExpMatch'; import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('LabeledStatementTransformer', () => { describe('changeControlFlow (labeledStatementNode: ESTree.LabeledStatement): void', () => { diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/literal-transformer/LiteralTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/literal-transformer/LiteralTransformer.spec.ts index 1ae7173c..7531525e 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/literal-transformer/LiteralTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/literal-transformer/LiteralTransformer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('LiteralTransformer', () => { describe('transformation of literal node with string value', () => { diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/object-expression-transformer/ObjectExpressionTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/object-expression-transformer/ObjectExpressionTransformer.spec.ts index aaae47e6..390c2a3b 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/object-expression-transformer/ObjectExpressionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/object-expression-transformer/ObjectExpressionTransformer.spec.ts @@ -6,7 +6,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('ObjectExpressionTransformer', () => { describe('default behaviour', () => { diff --git a/test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts b/test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts index 0ba2c9e8..7315f208 100644 --- a/test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts +++ b/test/functional-tests/node-transformers/obfuscating-transformers/variable-declaration-transformer/VariableDeclarationTransformer.spec.ts @@ -7,7 +7,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../../../../src/options/presets/NoCus import { getRegExpMatch } from '../../../../helpers/getRegExpMatch'; import { readFileAsString } from '../../../../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade'; describe('VariableDeclarationTransformer', () => { describe('variant #1: default behaviour', () => { diff --git a/test/performance-tests/JavaScriptObfuscatorPerformance.spec.ts b/test/performance-tests/JavaScriptObfuscatorPerformance.spec.ts index af76b56a..8a1c364a 100644 --- a/test/performance-tests/JavaScriptObfuscatorPerformance.spec.ts +++ b/test/performance-tests/JavaScriptObfuscatorPerformance.spec.ts @@ -2,7 +2,7 @@ import { assert } from 'chai'; import { readFileAsString } from '../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../src/JavaScriptObfuscatorFacade'; describe('JavaScriptObfuscator performance', function () { const iterationsCount: number = 500; diff --git a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts index 137e646d..2165aa5c 100644 --- a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts +++ b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts @@ -4,7 +4,7 @@ import { IObfuscationResult } from '../../src/interfaces/IObfuscationResult'; import { readFileAsString } from '../helpers/readFileAsString'; -import { JavaScriptObfuscator } from '../../src/JavaScriptObfuscator'; +import { JavaScriptObfuscator } from '../../src/JavaScriptObfuscatorFacade'; describe('JavaScriptObfuscator runtime eval', function () { this.timeout(100000); diff --git a/test/unit-tests/node/node-utils/NodeUtils.spec.ts b/test/unit-tests/node/node-utils/NodeUtils.spec.ts index 3f58b51d..9819777a 100644 --- a/test/unit-tests/node/node-utils/NodeUtils.spec.ts +++ b/test/unit-tests/node/node-utils/NodeUtils.spec.ts @@ -525,16 +525,11 @@ describe('NodeUtils', () => { describe('parentize AST-tree', () => { beforeEach(() => { - programNode = Nodes.getProgramNode([ - ifStatementNode - ]); - programNode.parentNode = programNode; - ifStatementNode = NodeUtils.parentize(ifStatementNode); }); it('should parentize `ifStatement` node', () => { - assert.deepEqual(ifStatementNode.parentNode, programNode); + assert.deepEqual(ifStatementNode.parentNode, ifStatementNode); }); it('should parentize `ifStatement blockStatement` node', () => {