js-confuser 1.7.2 → 2.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
  2. package/.github/workflows/node.js.yml +1 -1
  3. package/CHANGELOG.md +105 -0
  4. package/Migration.md +57 -0
  5. package/README.md +23 -913
  6. package/dist/constants.js +69 -13
  7. package/dist/index.js +108 -152
  8. package/dist/obfuscator.js +316 -118
  9. package/dist/options.js +1 -109
  10. package/dist/order.js +30 -30
  11. package/dist/presets.js +47 -45
  12. package/dist/probability.js +25 -32
  13. package/dist/templates/bufferToStringTemplate.js +9 -0
  14. package/dist/templates/deadCodeTemplates.js +9 -0
  15. package/dist/templates/getGlobalTemplate.js +19 -0
  16. package/dist/templates/integrityTemplate.js +30 -0
  17. package/dist/templates/setFunctionLengthTemplate.js +9 -0
  18. package/dist/templates/stringCompressionTemplate.js +10 -0
  19. package/dist/templates/tamperProtectionTemplates.js +21 -0
  20. package/dist/templates/template.js +213 -93
  21. package/dist/transforms/astScrambler.js +100 -0
  22. package/dist/transforms/calculator.js +70 -127
  23. package/dist/transforms/controlFlowFlattening.js +1182 -0
  24. package/dist/transforms/deadCode.js +62 -577
  25. package/dist/transforms/dispatcher.js +300 -309
  26. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
  27. package/dist/transforms/extraction/objectExtraction.js +131 -215
  28. package/dist/transforms/finalizer.js +56 -59
  29. package/dist/transforms/flatten.js +275 -276
  30. package/dist/transforms/functionOutlining.js +230 -0
  31. package/dist/transforms/identifier/globalConcealing.js +217 -103
  32. package/dist/transforms/identifier/movedDeclarations.js +167 -91
  33. package/dist/transforms/identifier/renameVariables.js +240 -187
  34. package/dist/transforms/lock/integrity.js +61 -184
  35. package/dist/transforms/lock/lock.js +263 -303
  36. package/dist/transforms/minify.js +431 -436
  37. package/dist/transforms/opaquePredicates.js +65 -118
  38. package/dist/transforms/pack.js +160 -0
  39. package/dist/transforms/plugin.js +179 -0
  40. package/dist/transforms/preparation.js +263 -163
  41. package/dist/transforms/renameLabels.js +132 -56
  42. package/dist/transforms/rgf.js +142 -240
  43. package/dist/transforms/shuffle.js +52 -145
  44. package/dist/transforms/string/encoding.js +45 -173
  45. package/dist/transforms/string/stringCompression.js +81 -126
  46. package/dist/transforms/string/stringConcealing.js +189 -224
  47. package/dist/transforms/string/stringEncoding.js +32 -40
  48. package/dist/transforms/string/stringSplitting.js +54 -55
  49. package/dist/transforms/variableMasking.js +232 -0
  50. package/dist/utils/ControlObject.js +125 -0
  51. package/dist/utils/IntGen.js +46 -0
  52. package/dist/utils/NameGen.js +106 -0
  53. package/dist/utils/ast-utils.js +560 -0
  54. package/dist/utils/function-utils.js +56 -0
  55. package/dist/utils/gen-utils.js +48 -0
  56. package/dist/utils/node.js +77 -0
  57. package/dist/utils/object-utils.js +21 -0
  58. package/dist/utils/random-utils.js +91 -0
  59. package/dist/utils/static-utils.js +64 -0
  60. package/dist/validateOptions.js +122 -0
  61. package/index.d.ts +1 -17
  62. package/package.json +27 -22
  63. package/src/constants.ts +139 -77
  64. package/src/index.ts +70 -163
  65. package/src/obfuscationResult.ts +43 -0
  66. package/src/obfuscator.ts +328 -135
  67. package/src/options.ts +154 -623
  68. package/src/order.ts +14 -14
  69. package/src/presets.ts +39 -34
  70. package/src/probability.ts +21 -36
  71. package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
  72. package/src/templates/deadCodeTemplates.ts +1185 -0
  73. package/src/templates/getGlobalTemplate.ts +72 -0
  74. package/src/templates/integrityTemplate.ts +69 -0
  75. package/src/templates/setFunctionLengthTemplate.ts +11 -0
  76. package/src/templates/stringCompressionTemplate.ts +42 -0
  77. package/src/templates/tamperProtectionTemplates.ts +116 -0
  78. package/src/templates/template.ts +183 -92
  79. package/src/transforms/astScrambler.ts +99 -0
  80. package/src/transforms/calculator.ts +96 -224
  81. package/src/transforms/controlFlowFlattening.ts +1594 -0
  82. package/src/transforms/deadCode.ts +85 -628
  83. package/src/transforms/dispatcher.ts +431 -636
  84. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
  85. package/src/transforms/extraction/objectExtraction.ts +160 -333
  86. package/src/transforms/finalizer.ts +63 -64
  87. package/src/transforms/flatten.ts +439 -557
  88. package/src/transforms/functionOutlining.ts +225 -0
  89. package/src/transforms/identifier/globalConcealing.ts +261 -189
  90. package/src/transforms/identifier/movedDeclarations.ts +228 -142
  91. package/src/transforms/identifier/renameVariables.ts +252 -258
  92. package/src/transforms/lock/integrity.ts +84 -260
  93. package/src/transforms/lock/lock.ts +342 -491
  94. package/src/transforms/minify.ts +523 -663
  95. package/src/transforms/opaquePredicates.ts +90 -229
  96. package/src/transforms/pack.ts +195 -0
  97. package/src/transforms/plugin.ts +185 -0
  98. package/src/transforms/preparation.ts +337 -215
  99. package/src/transforms/renameLabels.ts +176 -77
  100. package/src/transforms/rgf.ts +293 -386
  101. package/src/transforms/shuffle.ts +80 -254
  102. package/src/transforms/string/encoding.ts +26 -129
  103. package/src/transforms/string/stringCompression.ts +118 -236
  104. package/src/transforms/string/stringConcealing.ts +255 -339
  105. package/src/transforms/string/stringEncoding.ts +28 -47
  106. package/src/transforms/string/stringSplitting.ts +61 -75
  107. package/src/transforms/variableMasking.ts +257 -0
  108. package/src/utils/ControlObject.ts +141 -0
  109. package/src/utils/IntGen.ts +33 -0
  110. package/src/utils/NameGen.ts +106 -0
  111. package/src/utils/ast-utils.ts +667 -0
  112. package/src/utils/function-utils.ts +50 -0
  113. package/src/utils/gen-utils.ts +48 -0
  114. package/src/utils/node.ts +78 -0
  115. package/src/utils/object-utils.ts +21 -0
  116. package/src/utils/random-utils.ts +79 -0
  117. package/src/utils/static-utils.ts +66 -0
  118. package/src/validateOptions.ts +256 -0
  119. package/tsconfig.json +13 -8
  120. package/babel.config.js +0 -12
  121. package/dev.js +0 -8
  122. package/dist/compiler.js +0 -34
  123. package/dist/parser.js +0 -59
  124. package/dist/precedence.js +0 -66
  125. package/dist/templates/bufferToString.js +0 -108
  126. package/dist/templates/crash.js +0 -59
  127. package/dist/templates/es5.js +0 -137
  128. package/dist/templates/functionLength.js +0 -34
  129. package/dist/templates/globals.js +0 -9
  130. package/dist/transforms/antiTooling.js +0 -88
  131. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1281
  132. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
  133. package/dist/transforms/es5/antiClass.js +0 -164
  134. package/dist/transforms/es5/antiDestructuring.js +0 -193
  135. package/dist/transforms/es5/antiES6Object.js +0 -185
  136. package/dist/transforms/es5/antiSpreadOperator.js +0 -35
  137. package/dist/transforms/es5/antiTemplate.js +0 -66
  138. package/dist/transforms/es5/es5.js +0 -123
  139. package/dist/transforms/extraction/classExtraction.js +0 -83
  140. package/dist/transforms/identifier/globalAnalysis.js +0 -70
  141. package/dist/transforms/identifier/variableAnalysis.js +0 -104
  142. package/dist/transforms/lock/antiDebug.js +0 -76
  143. package/dist/transforms/stack.js +0 -343
  144. package/dist/transforms/transform.js +0 -350
  145. package/dist/traverse.js +0 -110
  146. package/dist/util/compare.js +0 -145
  147. package/dist/util/gen.js +0 -564
  148. package/dist/util/guard.js +0 -9
  149. package/dist/util/identifiers.js +0 -355
  150. package/dist/util/insert.js +0 -362
  151. package/dist/util/math.js +0 -19
  152. package/dist/util/object.js +0 -40
  153. package/dist/util/random.js +0 -130
  154. package/dist/util/scope.js +0 -20
  155. package/docs/ControlFlowFlattening.md +0 -595
  156. package/docs/Countermeasures.md +0 -63
  157. package/docs/ES5.md +0 -197
  158. package/docs/Integrity.md +0 -75
  159. package/docs/RGF.md +0 -419
  160. package/samples/example.js +0 -15
  161. package/samples/high.js +0 -1
  162. package/samples/input.js +0 -3
  163. package/samples/javascriptobfuscator.com.js +0 -8
  164. package/samples/jscrambler_advanced.js +0 -1894
  165. package/samples/jscrambler_light.js +0 -1134
  166. package/samples/low.js +0 -1
  167. package/samples/medium.js +0 -1
  168. package/samples/obfuscator.io.js +0 -1686
  169. package/samples/preemptive.com.js +0 -16
  170. package/src/compiler.ts +0 -35
  171. package/src/parser.ts +0 -49
  172. package/src/precedence.ts +0 -61
  173. package/src/templates/crash.ts +0 -55
  174. package/src/templates/es5.ts +0 -131
  175. package/src/templates/functionLength.ts +0 -32
  176. package/src/templates/globals.ts +0 -3
  177. package/src/transforms/antiTooling.ts +0 -102
  178. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2146
  179. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
  180. package/src/transforms/es5/antiClass.ts +0 -272
  181. package/src/transforms/es5/antiDestructuring.ts +0 -294
  182. package/src/transforms/es5/antiES6Object.ts +0 -267
  183. package/src/transforms/es5/antiSpreadOperator.ts +0 -56
  184. package/src/transforms/es5/antiTemplate.ts +0 -98
  185. package/src/transforms/es5/es5.ts +0 -149
  186. package/src/transforms/extraction/classExtraction.ts +0 -168
  187. package/src/transforms/identifier/globalAnalysis.ts +0 -85
  188. package/src/transforms/identifier/variableAnalysis.ts +0 -118
  189. package/src/transforms/lock/antiDebug.ts +0 -112
  190. package/src/transforms/stack.ts +0 -551
  191. package/src/transforms/transform.ts +0 -453
  192. package/src/traverse.ts +0 -120
  193. package/src/types.ts +0 -131
  194. package/src/util/compare.ts +0 -181
  195. package/src/util/gen.ts +0 -651
  196. package/src/util/guard.ts +0 -7
  197. package/src/util/identifiers.ts +0 -494
  198. package/src/util/insert.ts +0 -419
  199. package/src/util/math.ts +0 -15
  200. package/src/util/object.ts +0 -39
  201. package/src/util/random.ts +0 -141
  202. package/src/util/scope.ts +0 -21
  203. package/test/code/Cash.src.js +0 -1011
  204. package/test/code/Cash.test.ts +0 -49
  205. package/test/code/Dynamic.src.js +0 -118
  206. package/test/code/Dynamic.test.ts +0 -49
  207. package/test/code/ES6.src.js +0 -235
  208. package/test/code/ES6.test.ts +0 -42
  209. package/test/code/NewFeatures.test.ts +0 -19
  210. package/test/code/StrictMode.src.js +0 -65
  211. package/test/code/StrictMode.test.js +0 -37
  212. package/test/compare.test.ts +0 -104
  213. package/test/index.test.ts +0 -249
  214. package/test/options.test.ts +0 -132
  215. package/test/presets.test.ts +0 -22
  216. package/test/probability.test.ts +0 -44
  217. package/test/templates/template.test.ts +0 -14
  218. package/test/transforms/antiTooling.test.ts +0 -52
  219. package/test/transforms/calculator.test.ts +0 -78
  220. package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
  221. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
  222. package/test/transforms/deadCode.test.ts +0 -85
  223. package/test/transforms/dispatcher.test.ts +0 -457
  224. package/test/transforms/es5/antiClass.test.ts +0 -427
  225. package/test/transforms/es5/antiDestructuring.test.ts +0 -157
  226. package/test/transforms/es5/antiES6Object.test.ts +0 -245
  227. package/test/transforms/es5/antiTemplate.test.ts +0 -116
  228. package/test/transforms/es5/es5.test.ts +0 -110
  229. package/test/transforms/extraction/classExtraction.test.ts +0 -86
  230. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
  231. package/test/transforms/extraction/objectExtraction.test.ts +0 -491
  232. package/test/transforms/flatten.test.ts +0 -721
  233. package/test/transforms/hexadecimalNumbers.test.ts +0 -62
  234. package/test/transforms/identifier/globalConcealing.test.ts +0 -72
  235. package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
  236. package/test/transforms/identifier/renameVariables.test.ts +0 -621
  237. package/test/transforms/lock/antiDebug.test.ts +0 -66
  238. package/test/transforms/lock/browserLock.test.ts +0 -129
  239. package/test/transforms/lock/countermeasures.test.ts +0 -100
  240. package/test/transforms/lock/integrity.test.ts +0 -161
  241. package/test/transforms/lock/lock.test.ts +0 -204
  242. package/test/transforms/lock/osLock.test.ts +0 -312
  243. package/test/transforms/lock/selfDefending.test.ts +0 -68
  244. package/test/transforms/minify.test.ts +0 -575
  245. package/test/transforms/opaquePredicates.test.ts +0 -43
  246. package/test/transforms/preparation.test.ts +0 -157
  247. package/test/transforms/renameLabels.test.ts +0 -95
  248. package/test/transforms/rgf.test.ts +0 -378
  249. package/test/transforms/shuffle.test.ts +0 -135
  250. package/test/transforms/stack.test.ts +0 -573
  251. package/test/transforms/string/stringCompression.test.ts +0 -120
  252. package/test/transforms/string/stringConcealing.test.ts +0 -299
  253. package/test/transforms/string/stringEncoding.test.ts +0 -95
  254. package/test/transforms/string/stringSplitting.test.ts +0 -135
  255. package/test/transforms/transform.test.ts +0 -66
  256. package/test/traverse.test.ts +0 -139
  257. package/test/util/compare.test.ts +0 -34
  258. package/test/util/gen.test.ts +0 -121
  259. package/test/util/identifiers.test.ts +0 -253
  260. package/test/util/insert.test.ts +0 -142
  261. package/test/util/math.test.ts +0 -5
  262. package/test/util/random.test.ts +0 -71
  263. /package/dist/{types.js → obfuscationResult.js} +0 -0
@@ -1,336 +1,296 @@
1
1
  "use strict";
2
2
 
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.default = void 0;
7
- var _transform = _interopRequireDefault(require("../transform"));
8
- var _gen = require("../../util/gen");
9
- var _traverse = _interopRequireWildcard(require("../../traverse"));
10
- var _random = require("../../util/random");
11
- var _crash = require("../../templates/crash");
12
- var _insert = require("../../util/insert");
13
- var _template = _interopRequireDefault(require("../../templates/template"));
7
+ exports["default"] = void 0;
14
8
  var _order = require("../../order");
15
- var _integrity = _interopRequireDefault(require("./integrity"));
16
- var _antiDebug = _interopRequireDefault(require("./antiDebug"));
17
- var _identifiers = require("../../util/identifiers");
18
- var _compare = require("../../util/compare");
19
- var _assert = require("assert");
20
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
21
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
22
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
24
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
25
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
26
- /**
27
- * Applies browser & date locks.
28
- */
29
- class Lock extends _transform.default {
30
- constructor(o) {
31
- super(o, _order.ObfuscateOrder.Lock);
32
-
33
- // Removed feature
34
- // if (this.options.lock.startDate && this.options.lock.endDate) {
35
- // this.before.push(new LockStrings(o));
36
- // }
37
- _defineProperty(this, "globalVar", void 0);
38
- _defineProperty(this, "counterMeasuresNode", void 0);
39
- _defineProperty(this, "iosDetectFn", void 0);
40
- /**
41
- * This is a boolean variable injected into the source code determining wether the countermeasures function has been called.
42
- * This is used to prevent infinite loops from happening
43
- */
44
- _defineProperty(this, "counterMeasuresActivated", void 0);
45
- _defineProperty(this, "made", void 0);
46
- if (this.options.lock.integrity) {
47
- this.before.push(new _integrity.default(o, this));
48
- }
49
- if (this.options.lock.antiDebug) {
50
- this.before.push(new _antiDebug.default(o, this));
9
+ var _randomUtils = require("../../utils/random-utils");
10
+ var _template = _interopRequireDefault(require("../../templates/template"));
11
+ var t = _interopRequireWildcard(require("@babel/types"));
12
+ var _astUtils = require("../../utils/ast-utils");
13
+ var _integrity = require("./integrity");
14
+ var _integrityTemplate = require("../../templates/integrityTemplate");
15
+ var _constants = require("../../constants");
16
+ var _tamperProtectionTemplates = require("../../templates/tamperProtectionTemplates");
17
+ var _probability = require("../../probability");
18
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
19
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
20
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
21
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
22
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
23
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
24
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
25
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
26
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
27
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
28
+ var _default = exports["default"] = function _default(_ref) {
29
+ var Plugin = _ref.Plugin;
30
+ var me = Plugin(_order.Order.Lock, {
31
+ changeData: {
32
+ locksInserted: 0
51
33
  }
52
- this.made = 0;
34
+ });
35
+ if (me.options.lock.startDate instanceof Date) {
36
+ me.options.lock.customLocks.push({
37
+ code: ["\n if(Date.now()<".concat(me.options.lock.startDate.getTime(), ") {\n {countermeasures}\n }\n "), "\n if((new Date()).getTime()<".concat(me.options.lock.startDate.getTime(), ") {\n {countermeasures}\n }\n ")],
38
+ percentagePerBlock: 0.5
39
+ });
53
40
  }
54
- apply(tree) {
55
- if (typeof this.options.lock.countermeasures === "string" && (0, _compare.isValidIdentifier)(this.options.lock.countermeasures)) {
56
- (0, _traverse.default)(tree, (object, parents) => {
57
- if (object.type == "Identifier" && object.name === this.options.lock.countermeasures) {
58
- var info = (0, _identifiers.getIdentifierInfo)(object, parents);
59
- if (info.spec.isDefined) {
60
- if (this.counterMeasuresNode) {
61
- throw new Error("Countermeasures function was already defined, it must have a unique name from the rest of your code");
62
- } else {
63
- var definingContext = (0, _insert.getVarContext)(parents[0], parents.slice(1));
64
- if (definingContext != tree) {
65
- throw new Error("Countermeasures function must be defined at the global level");
66
- }
67
- var chain = [object, parents];
68
- if (info.isFunctionDeclaration) {
69
- chain = [parents[0], parents.slice(1)];
70
- } else if (info.isVariableDeclaration) {
71
- chain = [parents[1], parents.slice(2)];
72
- }
73
- this.counterMeasuresNode = chain;
41
+ if (me.options.lock.endDate instanceof Date) {
42
+ me.options.lock.customLocks.push({
43
+ code: ["\n if(Date.now()>".concat(me.options.lock.endDate.getTime(), ") {\n {countermeasures}\n }\n "), "\n if((new Date()).getTime()>".concat(me.options.lock.endDate.getTime(), ") {\n {countermeasures}\n }\n ")],
44
+ percentagePerBlock: 0.5
45
+ });
46
+ }
47
+ if (me.options.lock.domainLock) {
48
+ var domainArray = Array.isArray(me.options.lock.domainLock) ? me.options.lock.domainLock : [me.options.lock.domainLock];
49
+ var _iterator = _createForOfIteratorHelper(domainArray),
50
+ _step;
51
+ try {
52
+ var _loop = function _loop() {
53
+ var _regexString = _step.value;
54
+ me.options.lock.customLocks.push({
55
+ code: new _template["default"]("\n if(!new RegExp({regexString}).test(window.location.href)) {\n {countermeasures}\n }\n ").setDefaultVariables({
56
+ regexString: function regexString() {
57
+ return t.stringLiteral(_regexString.toString());
74
58
  }
75
- }
76
- }
77
- });
78
- if (!this.counterMeasuresNode) {
79
- throw new Error("Countermeasures function named '" + this.options.lock.countermeasures + "' was not found.");
59
+ }),
60
+ percentagePerBlock: 0.5
61
+ });
62
+ };
63
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
64
+ _loop();
80
65
  }
66
+ } catch (err) {
67
+ _iterator.e(err);
68
+ } finally {
69
+ _iterator.f();
81
70
  }
82
- super.apply(tree);
83
71
  }
84
- getCounterMeasuresCode(object, parents) {
85
- var opt = this.options.lock.countermeasures;
86
- if (opt === false) {
87
- return null;
88
- }
89
-
90
- // Call function
91
- if (typeof opt === "string") {
92
- if (!this.counterMeasuresActivated) {
93
- this.counterMeasuresActivated = this.getPlaceholder();
94
- (0, _insert.prepend)(parents[parents.length - 1] || object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.counterMeasuresActivated)));
95
- }
96
-
97
- // Since Lock occurs before variable renaming, we are using the pre-obfuscated function name
98
- return [(0, _gen.ExpressionStatement)((0, _gen.LogicalExpression)("||", (0, _gen.Identifier)(this.counterMeasuresActivated), (0, _gen.SequenceExpression)([(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(this.counterMeasuresActivated), (0, _gen.Literal)(true)), (0, _gen.CallExpression)((0, _template.default)(opt).single().expression, [])])))];
99
- }
100
- var type = (0, _random.choice)(["crash", "exit"]);
101
- switch (type) {
102
- case "crash":
103
- var varName = this.getPlaceholder();
104
- return (0, _random.choice)([_crash.CrashTemplate1, _crash.CrashTemplate2, _crash.CrashTemplate3]).compile({
105
- var: varName
106
- });
107
- case "exit":
108
- if (this.options.target == "browser") {
109
- return (0, _template.default)("document.documentElement.innerHTML = '';").compile();
110
- }
111
- return (0, _template.default)("process.exit()").compile();
112
- }
72
+ if (me.options.lock.selfDefending) {
73
+ me.options.lock.customLocks.push({
74
+ code: "\n (\n function(){\n // Breaks any code formatter\n var namedFunction = function(){\n const test = function(){\n const regExp=new RegExp('\\n');\n return regExp['test'](namedFunction)\n };\n\n if(test()) {\n {countermeasures}\n }\n }\n\n return namedFunction();\n }\n )();\n ",
75
+ percentagePerBlock: 0.5
76
+ });
113
77
  }
114
-
115
- /**
116
- * Converts Dates to numbers, then applies some randomness
117
- * @param object
118
- */
119
- getTime(object) {
120
- if (!object) {
121
- return 0;
122
- }
123
- if (object instanceof Date) {
124
- return this.getTime(object.getTime());
125
- }
126
- return object + (0, _random.getRandomInteger)(-4000, 4000);
78
+ if (me.options.lock.antiDebug) {
79
+ me.options.lock.customLocks.push({
80
+ code: "\n debugger;\n ",
81
+ percentagePerBlock: 0.5
82
+ });
127
83
  }
128
- match(object, parents) {
129
- return (0, _traverse.isBlock)(object);
84
+ var timesMap = new WeakMap();
85
+ var countermeasuresNode;
86
+ var invokeCountermeasuresFnName;
87
+ if (me.options.lock.countermeasures) {
88
+ invokeCountermeasuresFnName = me.getPlaceholder("invokeCountermeasures");
89
+ me.globalState.internals.invokeCountermeasuresFnName = invokeCountermeasuresFnName;
130
90
  }
131
- transform(object, parents) {
132
- if (parents.find(x => (0, _compare.isLoop)(x) && x.type != "SwitchStatement")) {
133
- return;
134
- }
135
-
136
- // no check in countermeasures code, otherwise it will infinitely call itself
137
- if (this.counterMeasuresNode && (object == this.counterMeasuresNode[0] || parents.indexOf(this.counterMeasuresNode[0]) !== -1)) {
138
- return;
139
- }
140
- var block = (0, _traverse.getBlock)(object, parents);
141
- var choices = [];
142
- if (this.options.lock.startDate) {
143
- choices.push("startDate");
144
- }
145
- if (this.options.lock.endDate) {
146
- choices.push("endDate");
91
+ var createCountermeasuresCode = function createCountermeasuresCode() {
92
+ if (invokeCountermeasuresFnName) {
93
+ return new _template["default"]("".concat(invokeCountermeasuresFnName, "()")).compile();
147
94
  }
148
- if (this.options.lock.domainLock && this.options.lock.domainLock.length) {
149
- choices.push("domainLock");
95
+ if (me.options.lock.countermeasures === false) {
96
+ return [];
150
97
  }
151
- if (this.options.lock.context && this.options.lock.context.length) {
152
- choices.push("context");
98
+ return new _template["default"]("while(true){}").compile();
99
+ };
100
+ me.globalState.lock.createCountermeasuresCode = createCountermeasuresCode;
101
+ function applyLockToBlock(path, customLock) {
102
+ var times = timesMap.get(customLock);
103
+ if (typeof times === "undefined") {
104
+ times = 0;
153
105
  }
154
- if (this.options.lock.browserLock && this.options.lock.browserLock.length) {
155
- choices.push("browserLock");
156
- }
157
- if (this.options.lock.osLock && this.options.lock.osLock.length) {
158
- choices.push("osLock");
159
- }
160
- if (this.options.lock.selfDefending) {
161
- choices.push("selfDefending");
106
+ var maxCount = customLock.maxCount || 100; // 100 is default max count
107
+ var minCount = customLock.minCount || 1; // 1 is default min count
108
+
109
+ if (maxCount >= 0 && times > maxCount) {
110
+ // Limit creation, allowing -1 to disable the limit entirely
111
+ return;
162
112
  }
163
- if (!choices.length) {
113
+
114
+ // The Program always gets a lock
115
+ // Else based on the percentage
116
+ // Try to reach the minimum count
117
+ if (!path.isProgram() && !(0, _randomUtils.chance)(customLock.percentagePerBlock * 100) && times >= minCount) {
164
118
  return;
165
119
  }
166
- return () => {
167
- this.made++;
168
- if (this.made > 150) {
169
- return;
170
- }
171
- var type = (0, _random.choice)(choices);
172
- var nodes = [];
173
- var dateNow = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)("Date"), (0, _gen.Literal)("now"), true), []);
174
- if (Math.random() > 0.5) {
175
- dateNow = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.NewExpression)((0, _gen.Identifier)("Date"), []), (0, _gen.Literal)("getTime")), []);
176
- }
177
- if (Math.random() > 0.5) {
178
- dateNow = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.MemberExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)("Date"), (0, _gen.Literal)("prototype"), true), (0, _gen.Literal)("getTime"), true), (0, _gen.Literal)("call"), true), [(0, _gen.NewExpression)((0, _gen.Identifier)("Date"), [])]);
120
+
121
+ // Increment the times
122
+ timesMap.set(customLock, times + 1);
123
+ var lockCode = Array.isArray(customLock.code) ? (0, _randomUtils.choice)(customLock.code) : customLock.code;
124
+ var template = typeof lockCode === "string" ? new _template["default"](lockCode) : lockCode;
125
+ var lockNodes = template.compile({
126
+ countermeasures: function countermeasures() {
127
+ return createCountermeasuresCode();
179
128
  }
180
- var test;
181
- var offset = 0;
182
- switch (type) {
183
- case "selfDefending":
184
- // A very simple mechanism inspired from https://github.com/javascript-obfuscator/javascript-obfuscator/blob/master/src/custom-code-helpers/self-defending/templates/SelfDefendingNoEvalTemplate.ts
185
- // regExp checks for a newline, formatters add these
186
- var callExpression = (0, _template.default)(`
187
- (
188
- function(){
189
- // Breaks JSNice.org, beautifier.io
190
- var namedFunction = function(){
191
- const test = function(){
192
- const regExp=new RegExp('\\n');
193
- return regExp['test'](namedFunction)
194
- };
195
- return test()
196
- }
129
+ });
130
+ var p = path.unshiftContainer("body", lockNodes);
131
+ p.forEach(function (p) {
132
+ return p.skip();
133
+ });
134
+ me.changeData.locksInserted++;
135
+ }
136
+ return {
137
+ visitor: {
138
+ BindingIdentifier: function BindingIdentifier(path) {
139
+ if (path.node.name !== me.options.lock.countermeasures) {
140
+ return;
141
+ }
197
142
 
198
- return namedFunction();
199
- }
200
- )()
201
- `).single().expression;
202
- nodes.push((0, _gen.IfStatement)(callExpression, this.getCounterMeasuresCode(object, parents) || [], null));
203
- break;
204
- case "startDate":
205
- test = (0, _gen.BinaryExpression)("<", dateNow, (0, _gen.Literal)(this.getTime(this.options.lock.startDate)));
206
- nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
207
- break;
208
- case "endDate":
209
- test = (0, _gen.BinaryExpression)(">", dateNow, (0, _gen.Literal)(this.getTime(this.options.lock.endDate)));
210
- nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
211
- break;
212
- case "context":
213
- var prop = (0, _random.choice)(this.options.lock.context);
214
- var code = this.getCounterMeasuresCode(object, parents) || [];
143
+ // Exclude labels
144
+ if (!(0, _astUtils.isVariableIdentifier)(path)) return;
145
+ if (!(0, _astUtils.isDefiningIdentifier)(path)) {
146
+ // Reassignments are not allowed
215
147
 
216
- // Todo: Alternative to `this`
217
- if (!this.globalVar) {
218
- offset = 1;
219
- this.globalVar = this.getPlaceholder();
220
- (0, _insert.prepend)(parents[parents.length - 1] || block, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.globalVar, (0, _gen.LogicalExpression)("||", (0, _gen.Identifier)(this.options.globalVariables.keys().next().value), (0, _gen.ThisExpression)()))));
148
+ me.error("Countermeasures function cannot be reassigned");
149
+ }
150
+ if (countermeasuresNode) {
151
+ // Disallow multiple countermeasures functions
152
+
153
+ me.error("Countermeasures function was already defined, it must have a unique name from the rest of your code");
154
+ }
155
+ if (path.scope.getBinding(path.node.name).scope !== path.scope.getProgramParent()) {
156
+ me.error("Countermeasures function must be defined at the global level");
157
+ }
158
+ countermeasuresNode = path;
159
+ },
160
+ Block: {
161
+ exit: function exit(path) {
162
+ var customLock = (0, _randomUtils.choice)(me.options.lock.customLocks);
163
+ if (customLock) {
164
+ applyLockToBlock(path, customLock);
221
165
  }
222
- test = (0, _gen.UnaryExpression)("!", (0, _gen.MemberExpression)((0, _gen.Identifier)(this.globalVar), (0, _gen.Literal)(prop), true));
223
- nodes.push((0, _gen.IfStatement)(test, code, null));
224
- break;
225
- case "osLock":
226
- var navigatorUserAgent = (0, _template.default)(`window.navigator.userAgent.toLowerCase()`).single().expression;
227
- (0, _assert.ok)(this.options.lock.osLock);
228
- var code = this.getCounterMeasuresCode(object, parents) || [];
229
- this.options.lock.osLock.forEach(osName => {
230
- var agentMatcher = {
231
- windows: "Win",
232
- linux: "Linux",
233
- osx: "Mac",
234
- android: "Android",
235
- ios: "---"
236
- }[osName];
237
- var thisTest = (0, _gen.CallExpression)((0, _gen.MemberExpression)(navigatorUserAgent, (0, _gen.Literal)("match"), true), [(0, _gen.Literal)(agentMatcher.toLowerCase())]);
238
- if (osName == "ios" && this.options.target === "browser") {
239
- if (!this.iosDetectFn) {
240
- this.iosDetectFn = this.getPlaceholder();
241
- (0, _insert.prepend)(parents[parents.length - 1] || object, (0, _template.default)(`function ${this.iosDetectFn}() {
242
- return [
243
- 'iPad Simulator',
244
- 'iPhone Simulator',
245
- 'iPod Simulator',
246
- 'iPad',
247
- 'iPhone',
248
- 'iPod'
249
- ].includes(navigator.platform)
250
- // iPad on iOS 13 detection
251
- || (navigator.userAgent.includes("Mac") && "ontouchend" in document)
252
- }`).single());
166
+ }
167
+ },
168
+ Program: {
169
+ exit: function exit(path) {
170
+ // Insert nativeFunctionCheck
171
+ if (me.options.lock.tamperProtection) {
172
+ // Disallow strict mode
173
+ // Tamper Protection uses non-strict mode features:
174
+ // - eval() with local scope assignments
175
+ var directives = path.get("directives");
176
+ var _iterator2 = _createForOfIteratorHelper(directives),
177
+ _step2;
178
+ try {
179
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
180
+ var directive = _step2.value;
181
+ if (directive.node.value.value === "use strict") {
182
+ me.error("Tamper Protection cannot be applied to code in strict mode. Disable strict mode by removing the 'use strict' directive, or disable Tamper Protection.");
183
+ }
253
184
  }
254
- thisTest = (0, _gen.CallExpression)((0, _gen.Identifier)(this.iosDetectFn), []);
255
- }
256
- if (this.options.target === "node") {
257
- var platformName = {
258
- windows: "win32",
259
- osx: "darwin",
260
- ios: "darwin"
261
- }[osName] || osName;
262
- thisTest = (0, _template.default)(`require('os').platform()==="${platformName}"`).single().expression;
263
- }
264
- if (!test) {
265
- test = thisTest;
266
- } else {
267
- test = (0, _gen.LogicalExpression)("||", {
268
- ...test
269
- }, thisTest);
185
+ } catch (err) {
186
+ _iterator2.e(err);
187
+ } finally {
188
+ _iterator2.f();
270
189
  }
271
- });
272
- test = (0, _gen.UnaryExpression)("!", {
273
- ...test
274
- });
275
- nodes.push((0, _gen.IfStatement)(test, code, null));
276
- break;
277
- case "browserLock":
278
- var navigatorUserAgent = (0, _template.default)(`window.navigator.userAgent.toLowerCase()`).single().expression;
279
- (0, _assert.ok)(this.options.lock.browserLock);
280
- this.options.lock.browserLock.forEach(browserName => {
281
- var thisTest = (0, _gen.CallExpression)((0, _gen.MemberExpression)(navigatorUserAgent, (0, _gen.Literal)("match"), true), [(0, _gen.Literal)(browserName == "iexplorer" ? "msie" : browserName.toLowerCase())]);
282
- if (browserName === "safari") {
283
- thisTest = (0, _template.default)(`/^((?!chrome|android).)*safari/i.test(navigator.userAgent)`).single().expression;
284
- }
285
- if (!test) {
286
- test = thisTest;
287
- } else {
288
- test = (0, _gen.LogicalExpression)("||", {
289
- ...test
290
- }, thisTest);
190
+ var nativeFunctionName = me.getPlaceholder() + "_nativeFunctionCheck";
191
+ me.obfuscator.globalState.internals.nativeFunctionName = nativeFunctionName;
192
+
193
+ // Ensure program is not in strict mode
194
+ // Tamper Protection forces non-strict mode
195
+ (0, _astUtils.prependProgram)(path, _tamperProtectionTemplates.StrictModeTemplate.compile({
196
+ nativeFunctionName: nativeFunctionName,
197
+ countermeasures: createCountermeasuresCode()
198
+ }));
199
+ var nativeFunctionDeclaration = _tamperProtectionTemplates.NativeFunctionTemplate.single({
200
+ nativeFunctionName: nativeFunctionName,
201
+ countermeasures: createCountermeasuresCode(),
202
+ IndexOfTemplate: _tamperProtectionTemplates.IndexOfTemplate
203
+ });
204
+
205
+ // Checks function's toString() value for [native code] signature
206
+ (0, _astUtils.prependProgram)(path, nativeFunctionDeclaration);
207
+ }
208
+
209
+ // Insert invokeCountermeasures function
210
+ if (invokeCountermeasuresFnName) {
211
+ if (!countermeasuresNode) {
212
+ me.error("Countermeasures function named '" + me.options.lock.countermeasures + "' was not found.");
291
213
  }
292
- });
293
- test = (0, _gen.UnaryExpression)("!", {
294
- ...test
295
- });
296
- nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
297
- break;
298
- case "domainLock":
299
- function removeSlashes(path) {
300
- var count = path.length - 1;
301
- var index = 0;
302
- while (path.charCodeAt(index) === 47 && ++index);
303
- while (path.charCodeAt(count) === 47 && --count);
304
- return path.slice(index, count + 1);
214
+ var hasInvoked = me.getPlaceholder("hasInvoked");
215
+ var statements = new _template["default"]("\n var ".concat(hasInvoked, " = false;\n function ").concat(invokeCountermeasuresFnName, "(){\n if(").concat(hasInvoked, ") return;\n ").concat(hasInvoked, " = true;\n ").concat(me.options.lock.countermeasures, "();\n }\n ")).addSymbols(_constants.MULTI_TRANSFORM).compile();
216
+ (0, _astUtils.prependProgram)(path, statements).forEach(function (p) {
217
+ return p.skip();
218
+ });
305
219
  }
306
- var locationHref = (0, _gen.MemberExpression)((0, _gen.Identifier)("location"), (0, _gen.Literal)("href"), true);
307
- var random = (0, _random.choice)(this.options.lock.domainLock);
308
- if (random) {
309
- test = (0, _gen.CallExpression)((0, _gen.MemberExpression)(locationHref, (0, _gen.Literal)("match"), true), [{
310
- type: "Literal",
311
- regex: {
312
- pattern: random instanceof RegExp ? random.source : removeSlashes(random + ""),
313
- flags: random instanceof RegExp ? "" : ""
220
+ if (me.options.lock.integrity) {
221
+ var hashFnName = me.getPlaceholder() + "_hash";
222
+ var imulFnName = me.getPlaceholder() + "_imul";
223
+ var _sensitivityRegex = me.globalState.lock.integrity.sensitivityRegex;
224
+ me.globalState.internals.integrityHashName = hashFnName;
225
+ var hashCode = _integrityTemplate.HashTemplate.compile({
226
+ imul: imulFnName,
227
+ name: hashFnName,
228
+ hashingUtilFnName: me.getPlaceholder(),
229
+ sensitivityRegex: function sensitivityRegex() {
230
+ return t.newExpression(t.identifier("RegExp"), [t.stringLiteral(_sensitivityRegex.source), t.stringLiteral(_sensitivityRegex.flags)]);
314
231
  }
315
- }]);
316
- test = (0, _gen.UnaryExpression)("!", test);
317
- if (Math.random() > 0.5) {
318
- test = (0, _gen.LogicalExpression)("||", (0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)("location")), (0, _gen.Literal)("undefined")), test);
319
- }
320
- nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
232
+ });
233
+ (0, _astUtils.prependProgram)(path, hashCode);
321
234
  }
322
- break;
323
- }
324
- if (nodes.length) {
325
- var body = (0, _insert.getBlockBody)(block);
326
- var randomIndex = (0, _random.getRandomInteger)(0, body.length) + offset;
327
- if (randomIndex >= body.length) {
328
- body.push(...nodes);
329
- } else {
330
- body.splice(randomIndex, 0, ...nodes);
235
+ }
236
+ },
237
+ // Integrity first pass
238
+ // Functions are prepared for Integrity by simply extracting the function body
239
+ // The extracted function is hashed in the 'integrity' plugin
240
+ FunctionDeclaration: {
241
+ exit: function exit(funcDecPath) {
242
+ if (!me.options.lock.integrity) return;
243
+
244
+ // Mark functions for integrity
245
+ // Don't apply to async or generator functions
246
+ if (funcDecPath.node.async || funcDecPath.node.generator) return;
247
+ if (funcDecPath.find(function (p) {
248
+ return !!p.node[_constants.SKIP];
249
+ })) return;
250
+ var program = (0, _astUtils.getParentFunctionOrProgram)(funcDecPath);
251
+ // Only top-level functions
252
+ if (!program.isProgram()) return;
253
+
254
+ // Check user's custom implementation
255
+ var functionName = (0, _astUtils.getFunctionName)(funcDecPath);
256
+ // Don't apply to the countermeasures function (Intended)
257
+ if (me.options.lock.countermeasures && functionName === me.options.lock.countermeasures) return;
258
+ // Don't apply to invokeCountermeasures function (Intended)
259
+ if (me.obfuscator.isInternalVariable(functionName)) return;
260
+ if (!(0, _probability.computeProbabilityMap)(me.options.lock.integrity, functionName)) return;
261
+ var newFnName = me.getPlaceholder();
262
+ var newFunctionDeclaration = t.functionDeclaration(t.identifier(newFnName), funcDecPath.node.params, funcDecPath.node.body);
263
+
264
+ // Clone semantic symbols like (UNSAFE, PREDICTABLE, MULTI_TRANSFORM, etc)
265
+ var source = funcDecPath.node;
266
+ Object.getOwnPropertySymbols(source).forEach(function (symbol) {
267
+ newFunctionDeclaration[symbol] = source[symbol];
268
+ });
269
+ newFunctionDeclaration[_constants.SKIP] = true;
270
+ var _program$unshiftConta = program.unshiftContainer("body", newFunctionDeclaration),
271
+ _program$unshiftConta2 = _slicedToArray(_program$unshiftConta, 1),
272
+ newFnPath = _program$unshiftConta2[0];
273
+
274
+ // Function simply calls the new function
275
+ // In the case Integrity cannot transform the function, the original behavior is preserved
276
+ funcDecPath.node.body = t.blockStatement(new _template["default"]("\n return ".concat(newFnName, "(...arguments);\n ")).compile(), funcDecPath.node.body.directives);
277
+
278
+ // Parameters no longer needed, using 'arguments' instead
279
+ funcDecPath.node.params = [];
280
+
281
+ // Mark the function as unsafe - use of 'arguments' is unsafe
282
+ funcDecPath.node[_constants.UNSAFE] = true;
283
+
284
+ // Params changed - function is no longer predictable
285
+ funcDecPath.node[_constants.PREDICTABLE] = false;
286
+
287
+ // Mark the function for integrity
288
+ funcDecPath.node[_integrity.INTEGRITY] = {
289
+ fnPath: newFnPath,
290
+ fnName: newFnName
291
+ };
331
292
  }
332
293
  }
333
- };
334
- }
335
- }
336
- exports.default = Lock;
294
+ }
295
+ };
296
+ };