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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
- package/.github/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +105 -0
- package/Migration.md +57 -0
- package/README.md +23 -913
- package/dist/constants.js +69 -13
- package/dist/index.js +108 -152
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -109
- package/dist/order.js +30 -30
- package/dist/presets.js +47 -45
- package/dist/probability.js +25 -32
- package/dist/templates/bufferToStringTemplate.js +9 -0
- package/dist/templates/deadCodeTemplates.js +9 -0
- package/dist/templates/getGlobalTemplate.js +19 -0
- package/dist/templates/integrityTemplate.js +30 -0
- package/dist/templates/setFunctionLengthTemplate.js +9 -0
- package/dist/templates/stringCompressionTemplate.js +10 -0
- package/dist/templates/tamperProtectionTemplates.js +21 -0
- package/dist/templates/template.js +213 -93
- package/dist/transforms/astScrambler.js +100 -0
- package/dist/transforms/calculator.js +70 -127
- package/dist/transforms/controlFlowFlattening.js +1182 -0
- package/dist/transforms/deadCode.js +62 -577
- package/dist/transforms/dispatcher.js +300 -309
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
- package/dist/transforms/extraction/objectExtraction.js +131 -215
- package/dist/transforms/finalizer.js +56 -59
- package/dist/transforms/flatten.js +275 -276
- package/dist/transforms/functionOutlining.js +230 -0
- package/dist/transforms/identifier/globalConcealing.js +217 -103
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +240 -187
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +263 -303
- package/dist/transforms/minify.js +431 -436
- package/dist/transforms/opaquePredicates.js +65 -118
- package/dist/transforms/pack.js +160 -0
- package/dist/transforms/plugin.js +179 -0
- package/dist/transforms/preparation.js +263 -163
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +142 -240
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +45 -173
- package/dist/transforms/string/stringCompression.js +81 -126
- package/dist/transforms/string/stringConcealing.js +189 -224
- package/dist/transforms/string/stringEncoding.js +32 -40
- package/dist/transforms/string/stringSplitting.js +54 -55
- package/dist/transforms/variableMasking.js +232 -0
- package/dist/utils/ControlObject.js +125 -0
- package/dist/utils/IntGen.js +46 -0
- package/dist/utils/NameGen.js +106 -0
- package/dist/utils/ast-utils.js +560 -0
- package/dist/utils/function-utils.js +56 -0
- package/dist/utils/gen-utils.js +48 -0
- package/dist/utils/node.js +77 -0
- package/dist/utils/object-utils.js +21 -0
- package/dist/utils/random-utils.js +91 -0
- package/dist/utils/static-utils.js +64 -0
- package/dist/validateOptions.js +122 -0
- package/index.d.ts +1 -17
- package/package.json +27 -22
- package/src/constants.ts +139 -77
- package/src/index.ts +70 -163
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +154 -623
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
- package/src/templates/deadCodeTemplates.ts +1185 -0
- package/src/templates/getGlobalTemplate.ts +72 -0
- package/src/templates/integrityTemplate.ts +69 -0
- package/src/templates/setFunctionLengthTemplate.ts +11 -0
- package/src/templates/stringCompressionTemplate.ts +42 -0
- package/src/templates/tamperProtectionTemplates.ts +116 -0
- package/src/templates/template.ts +183 -92
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -224
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -628
- package/src/transforms/dispatcher.ts +431 -636
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
- package/src/transforms/extraction/objectExtraction.ts +160 -333
- package/src/transforms/finalizer.ts +63 -64
- package/src/transforms/flatten.ts +439 -557
- package/src/transforms/functionOutlining.ts +225 -0
- package/src/transforms/identifier/globalConcealing.ts +261 -189
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +252 -258
- package/src/transforms/lock/integrity.ts +84 -260
- package/src/transforms/lock/lock.ts +342 -491
- package/src/transforms/minify.ts +523 -663
- package/src/transforms/opaquePredicates.ts +90 -229
- package/src/transforms/pack.ts +195 -0
- package/src/transforms/plugin.ts +185 -0
- package/src/transforms/preparation.ts +337 -215
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -386
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +26 -129
- package/src/transforms/string/stringCompression.ts +118 -236
- package/src/transforms/string/stringConcealing.ts +255 -339
- package/src/transforms/string/stringEncoding.ts +28 -47
- package/src/transforms/string/stringSplitting.ts +61 -75
- package/src/transforms/variableMasking.ts +257 -0
- package/src/utils/ControlObject.ts +141 -0
- package/src/utils/IntGen.ts +33 -0
- package/src/utils/NameGen.ts +106 -0
- package/src/utils/ast-utils.ts +667 -0
- package/src/utils/function-utils.ts +50 -0
- package/src/utils/gen-utils.ts +48 -0
- package/src/utils/node.ts +78 -0
- package/src/utils/object-utils.ts +21 -0
- package/src/utils/random-utils.ts +79 -0
- package/src/utils/static-utils.ts +66 -0
- package/src/validateOptions.ts +256 -0
- package/tsconfig.json +13 -8
- package/babel.config.js +0 -12
- package/dev.js +0 -8
- package/dist/compiler.js +0 -34
- package/dist/parser.js +0 -59
- package/dist/precedence.js +0 -66
- package/dist/templates/bufferToString.js +0 -108
- package/dist/templates/crash.js +0 -59
- package/dist/templates/es5.js +0 -137
- package/dist/templates/functionLength.js +0 -34
- package/dist/templates/globals.js +0 -9
- package/dist/transforms/antiTooling.js +0 -88
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1281
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
- package/dist/transforms/es5/antiClass.js +0 -164
- package/dist/transforms/es5/antiDestructuring.js +0 -193
- package/dist/transforms/es5/antiES6Object.js +0 -185
- package/dist/transforms/es5/antiSpreadOperator.js +0 -35
- package/dist/transforms/es5/antiTemplate.js +0 -66
- package/dist/transforms/es5/es5.js +0 -123
- package/dist/transforms/extraction/classExtraction.js +0 -83
- package/dist/transforms/identifier/globalAnalysis.js +0 -70
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -343
- package/dist/transforms/transform.js +0 -350
- package/dist/traverse.js +0 -110
- package/dist/util/compare.js +0 -145
- package/dist/util/gen.js +0 -564
- package/dist/util/guard.js +0 -9
- package/dist/util/identifiers.js +0 -355
- package/dist/util/insert.js +0 -362
- package/dist/util/math.js +0 -19
- package/dist/util/object.js +0 -40
- package/dist/util/random.js +0 -130
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -63
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -75
- package/docs/RGF.md +0 -419
- package/samples/example.js +0 -15
- package/samples/high.js +0 -1
- package/samples/input.js +0 -3
- package/samples/javascriptobfuscator.com.js +0 -8
- package/samples/jscrambler_advanced.js +0 -1894
- package/samples/jscrambler_light.js +0 -1134
- package/samples/low.js +0 -1
- package/samples/medium.js +0 -1
- package/samples/obfuscator.io.js +0 -1686
- package/samples/preemptive.com.js +0 -16
- package/src/compiler.ts +0 -35
- package/src/parser.ts +0 -49
- package/src/precedence.ts +0 -61
- package/src/templates/crash.ts +0 -55
- package/src/templates/es5.ts +0 -131
- package/src/templates/functionLength.ts +0 -32
- package/src/templates/globals.ts +0 -3
- package/src/transforms/antiTooling.ts +0 -102
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2146
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -272
- package/src/transforms/es5/antiDestructuring.ts +0 -294
- package/src/transforms/es5/antiES6Object.ts +0 -267
- package/src/transforms/es5/antiSpreadOperator.ts +0 -56
- package/src/transforms/es5/antiTemplate.ts +0 -98
- package/src/transforms/es5/es5.ts +0 -149
- package/src/transforms/extraction/classExtraction.ts +0 -168
- package/src/transforms/identifier/globalAnalysis.ts +0 -85
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -551
- package/src/transforms/transform.ts +0 -453
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -131
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -7
- package/src/util/identifiers.ts +0 -494
- package/src/util/insert.ts +0 -419
- package/src/util/math.ts +0 -15
- package/src/util/object.ts +0 -39
- package/src/util/random.ts +0 -141
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -49
- package/test/code/Dynamic.src.js +0 -118
- package/test/code/Dynamic.test.ts +0 -49
- package/test/code/ES6.src.js +0 -235
- package/test/code/ES6.test.ts +0 -42
- package/test/code/NewFeatures.test.ts +0 -19
- package/test/code/StrictMode.src.js +0 -65
- package/test/code/StrictMode.test.js +0 -37
- package/test/compare.test.ts +0 -104
- package/test/index.test.ts +0 -249
- package/test/options.test.ts +0 -132
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -14
- package/test/transforms/antiTooling.test.ts +0 -52
- package/test/transforms/calculator.test.ts +0 -78
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
- package/test/transforms/deadCode.test.ts +0 -85
- package/test/transforms/dispatcher.test.ts +0 -457
- package/test/transforms/es5/antiClass.test.ts +0 -427
- package/test/transforms/es5/antiDestructuring.test.ts +0 -157
- package/test/transforms/es5/antiES6Object.test.ts +0 -245
- package/test/transforms/es5/antiTemplate.test.ts +0 -116
- package/test/transforms/es5/es5.test.ts +0 -110
- package/test/transforms/extraction/classExtraction.test.ts +0 -86
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
- package/test/transforms/extraction/objectExtraction.test.ts +0 -491
- package/test/transforms/flatten.test.ts +0 -721
- package/test/transforms/hexadecimalNumbers.test.ts +0 -62
- package/test/transforms/identifier/globalConcealing.test.ts +0 -72
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -621
- package/test/transforms/lock/antiDebug.test.ts +0 -66
- package/test/transforms/lock/browserLock.test.ts +0 -129
- package/test/transforms/lock/countermeasures.test.ts +0 -100
- package/test/transforms/lock/integrity.test.ts +0 -161
- package/test/transforms/lock/lock.test.ts +0 -204
- package/test/transforms/lock/osLock.test.ts +0 -312
- package/test/transforms/lock/selfDefending.test.ts +0 -68
- package/test/transforms/minify.test.ts +0 -575
- package/test/transforms/opaquePredicates.test.ts +0 -43
- package/test/transforms/preparation.test.ts +0 -157
- package/test/transforms/renameLabels.test.ts +0 -95
- package/test/transforms/rgf.test.ts +0 -378
- package/test/transforms/shuffle.test.ts +0 -135
- package/test/transforms/stack.test.ts +0 -573
- package/test/transforms/string/stringCompression.test.ts +0 -120
- package/test/transforms/string/stringConcealing.test.ts +0 -299
- package/test/transforms/string/stringEncoding.test.ts +0 -95
- package/test/transforms/string/stringSplitting.test.ts +0 -135
- package/test/transforms/transform.test.ts +0 -66
- package/test/traverse.test.ts +0 -139
- package/test/util/compare.test.ts +0 -34
- package/test/util/gen.test.ts +0 -121
- package/test/util/identifiers.test.ts +0 -253
- package/test/util/insert.test.ts +0 -142
- package/test/util/math.test.ts +0 -5
- package/test/util/random.test.ts +0 -71
- /package/dist/{types.js → obfuscationResult.js} +0 -0
|
@@ -1,109 +1,185 @@
|
|
|
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
|
|
7
|
-
var _transform = _interopRequireDefault(require("../transform"));
|
|
8
|
-
var _gen = require("../../util/gen");
|
|
9
|
-
var _insert = require("../../util/insert");
|
|
10
|
-
var _assert = require("assert");
|
|
7
|
+
exports["default"] = void 0;
|
|
11
8
|
var _order = require("../../order");
|
|
12
9
|
var _constants = require("../../constants");
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
|
|
10
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
11
|
+
var _staticUtils = require("../../utils/static-utils");
|
|
12
|
+
var _astUtils = require("../../utils/ast-utils");
|
|
13
|
+
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
15
|
+
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); }
|
|
16
|
+
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; }
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Moved Declarations moves variables in two ways:
|
|
19
|
+
*
|
|
20
|
+
* 1) Move variables to top of the current block
|
|
21
|
+
* 2) Move variables as unused function parameters
|
|
19
22
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
24
|
+
var Plugin = _ref.Plugin;
|
|
25
|
+
var me = Plugin(_order.Order.MovedDeclarations, {
|
|
26
|
+
changeData: {
|
|
27
|
+
variableDeclarations: 0,
|
|
28
|
+
functionParameters: 0
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
function isFunctionEligibleForParameterPacking(functionPath, proposedParameterName) {
|
|
32
|
+
// Getter/setter functions must have zero or one formal parameter
|
|
33
|
+
// We cannot add extra parameters to them
|
|
34
|
+
if (functionPath.isObjectMethod() || functionPath.isClassMethod()) {
|
|
35
|
+
if (functionPath.node.kind !== "method") {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Rest params check
|
|
41
|
+
if (functionPath.get("params").find(function (p) {
|
|
42
|
+
return p.isRestElement();
|
|
43
|
+
})) return false;
|
|
44
|
+
|
|
45
|
+
// Max 1,000 parameters
|
|
46
|
+
if (functionPath.get("params").length > 1000) return false;
|
|
47
|
+
|
|
48
|
+
// Check for duplicate parameter names
|
|
49
|
+
var bindingIdentifiers = (0, _astUtils.getPatternIdentifierNames)(functionPath.get("params"));
|
|
50
|
+
|
|
51
|
+
// Duplicate parameter name not allowed
|
|
52
|
+
if (bindingIdentifiers.has(proposedParameterName)) return false;
|
|
53
|
+
return true;
|
|
26
54
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
55
|
+
return {
|
|
56
|
+
visitor: {
|
|
57
|
+
FunctionDeclaration: {
|
|
58
|
+
exit: function exit(path) {
|
|
59
|
+
var functionPath = path.findParent(function (path) {
|
|
60
|
+
return path.isFunction();
|
|
61
|
+
});
|
|
62
|
+
if (!functionPath || !functionPath.node[_constants.PREDICTABLE]) return;
|
|
31
63
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
var body = block.type === "SwitchCase" ? block.consequent : block.body;
|
|
36
|
-
(0, _assert.ok)(Array.isArray(body), "No body array found.");
|
|
37
|
-
var bodyObject = parents[blockIndex - 2] || object;
|
|
38
|
-
var index = body.indexOf(bodyObject);
|
|
39
|
-
var varName = object.declarations[0].id.name;
|
|
40
|
-
(0, _assert.ok)(typeof varName === "string");
|
|
41
|
-
var predictableFunctionIndex = parents.findIndex(x => (0, _insert.isFunction)(x));
|
|
42
|
-
var predictableFunction = parents[predictableFunctionIndex];
|
|
43
|
-
var deleteStatement = false;
|
|
44
|
-
if (predictableFunction && (predictableFunction.id && predictableFunction.id.name.includes(_constants.predictableFunctionTag) || predictableFunction[_constants.predictableFunctionTag]) &&
|
|
45
|
-
// Must have predictableFunctionTag in the name, or on object
|
|
46
|
-
predictableFunction[_constants.predictableFunctionTag] !== false &&
|
|
47
|
-
// If === false, the function is deemed not predictable
|
|
48
|
-
predictableFunction.params.length < 1000 &&
|
|
49
|
-
// Max 1,000 parameters
|
|
50
|
-
!predictableFunction.params.find(x => x.type === "RestElement") &&
|
|
51
|
-
// Cannot add parameters after spread operator
|
|
52
|
-
!(["Property", "MethodDefinition"].includes((_parents = parents[predictableFunctionIndex + 1]) === null || _parents === void 0 ? void 0 : _parents.type) && ((_parents2 = parents[predictableFunctionIndex + 1]) === null || _parents2 === void 0 ? void 0 : _parents2.kind) !== "init") &&
|
|
53
|
-
// Preserve getter/setter methods
|
|
54
|
-
!(0, _identifiers.getFunctionParameters)(predictableFunction, parents.slice(predictableFunctionIndex)).find(entry => entry[0].name === varName) // Ensure not duplicate param name
|
|
55
|
-
) {
|
|
56
|
-
// Use function f(..., x, y, z) to declare name
|
|
64
|
+
// Must be direct child of the function
|
|
65
|
+
if (path.parentPath !== functionPath.get("body")) return;
|
|
66
|
+
var functionName = path.node.id.name;
|
|
57
67
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
// Must be eligible for parameter packing
|
|
69
|
+
if (!isFunctionEligibleForParameterPacking(functionPath, functionName)) return;
|
|
70
|
+
var strictMode = (0, _astUtils.isStrictMode)(functionPath);
|
|
71
|
+
|
|
72
|
+
// Default parameters are not allowed when 'use strict' is declared
|
|
73
|
+
if (strictMode) return;
|
|
74
|
+
var functionExpression = path.node;
|
|
75
|
+
functionExpression.type = "FunctionExpression";
|
|
76
|
+
functionExpression.id = null;
|
|
77
|
+
var identifier = t.identifier(functionName);
|
|
78
|
+
functionPath.node.params.push(identifier);
|
|
79
|
+
var paramPath = functionPath.get("params").at(-1);
|
|
70
80
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
// Update binding to point to new path
|
|
82
|
+
var binding = functionPath.scope.getBinding(functionName);
|
|
83
|
+
if (binding) {
|
|
84
|
+
binding.kind = "param";
|
|
85
|
+
binding.path = paramPath;
|
|
86
|
+
binding.identifier = identifier;
|
|
87
|
+
}
|
|
88
|
+
(0, _astUtils.prepend)(functionPath, new _template["default"]("\n if(!".concat(functionName, ") {\n ").concat(functionName, " = {functionExpression};\n }\n ")).single({
|
|
89
|
+
functionExpression: functionExpression
|
|
90
|
+
}));
|
|
91
|
+
path.remove();
|
|
92
|
+
me.changeData.functionParameters++;
|
|
83
93
|
}
|
|
94
|
+
},
|
|
95
|
+
VariableDeclaration: {
|
|
96
|
+
exit: function exit(path) {
|
|
97
|
+
if (path.node.kind !== "var") return;
|
|
98
|
+
if (path.node.declarations.length !== 1) return;
|
|
99
|
+
var insertionMethod = "variableDeclaration";
|
|
100
|
+
var functionPath = path.findParent(function (path) {
|
|
101
|
+
return path.isFunction();
|
|
102
|
+
});
|
|
103
|
+
var declaration = path.node.declarations[0];
|
|
104
|
+
if (!t.isIdentifier(declaration.id)) return;
|
|
105
|
+
var varName = declaration.id.name;
|
|
106
|
+
var allowDefaultParamValue = true;
|
|
107
|
+
if (functionPath && functionPath.node[_constants.PREDICTABLE]) {
|
|
108
|
+
// Check for "use strict" directive
|
|
109
|
+
// Strict mode disallows non-simple parameters
|
|
110
|
+
// So we can't move the declaration to the function parameters
|
|
111
|
+
var strictMode = (0, _astUtils.isStrictMode)(functionPath);
|
|
112
|
+
if (strictMode) {
|
|
113
|
+
allowDefaultParamValue = false;
|
|
114
|
+
}
|
|
84
115
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
116
|
+
// Cannot add variables after rest element
|
|
117
|
+
// Cannot add over 1,000 parameters
|
|
118
|
+
if (isFunctionEligibleForParameterPacking(functionPath, varName)) {
|
|
119
|
+
insertionMethod = "functionParameter";
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
var name = declaration.id.name;
|
|
123
|
+
var value = declaration.init || t.identifier("undefined");
|
|
124
|
+
var isStatic = (0, _staticUtils.isStaticValue)(value);
|
|
125
|
+
var isDefinedAtTop = false;
|
|
126
|
+
var parentPath = path.parentPath;
|
|
127
|
+
if (parentPath.isBlock()) {
|
|
128
|
+
isDefinedAtTop = parentPath.get("body").indexOf(path) === 0;
|
|
129
|
+
}
|
|
95
130
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
131
|
+
// Already at the top - nothing will change
|
|
132
|
+
if (insertionMethod === "variableDeclaration" && isDefinedAtTop) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
var defaultParamValue;
|
|
136
|
+
if (insertionMethod === "functionParameter" && isStatic && isDefinedAtTop && allowDefaultParamValue) {
|
|
137
|
+
defaultParamValue = value;
|
|
138
|
+
path.remove();
|
|
139
|
+
} else {
|
|
140
|
+
// For-in / For-of can only reference the variable name
|
|
141
|
+
if (parentPath.isForInStatement() || parentPath.isForOfStatement()) {
|
|
142
|
+
path.replaceWith(t.identifier(name));
|
|
143
|
+
} else {
|
|
144
|
+
path.replaceWith(t.assignmentExpression("=", t.identifier(name), declaration.init || t.identifier("undefined")));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
switch (insertionMethod) {
|
|
148
|
+
case "functionParameter":
|
|
149
|
+
var identifier = t.identifier(name);
|
|
150
|
+
var param = identifier;
|
|
151
|
+
if (allowDefaultParamValue && defaultParamValue) {
|
|
152
|
+
param = t.assignmentPattern(param, defaultParamValue);
|
|
153
|
+
}
|
|
154
|
+
functionPath.node.params.push(param);
|
|
155
|
+
var paramPath = functionPath.get("params").at(-1);
|
|
156
|
+
|
|
157
|
+
// Update binding to point to new path
|
|
158
|
+
var binding = functionPath.scope.getBinding(name);
|
|
159
|
+
if (binding) {
|
|
160
|
+
binding.kind = "param";
|
|
161
|
+
binding.path = paramPath;
|
|
162
|
+
binding.identifier = identifier;
|
|
163
|
+
}
|
|
164
|
+
me.changeData.functionParameters++;
|
|
165
|
+
break;
|
|
166
|
+
case "variableDeclaration":
|
|
167
|
+
var block = path.findParent(function (path) {
|
|
168
|
+
return path.isBlock();
|
|
169
|
+
});
|
|
170
|
+
var topNode = block.node.body[0];
|
|
171
|
+
var variableDeclarator = t.variableDeclarator(t.identifier(name));
|
|
172
|
+
if (t.isVariableDeclaration(topNode) && topNode.kind === "var") {
|
|
173
|
+
topNode.declarations.push(variableDeclarator);
|
|
174
|
+
break;
|
|
175
|
+
} else {
|
|
176
|
+
block.node.body.unshift(t.variableDeclaration("var", [variableDeclarator]));
|
|
177
|
+
}
|
|
178
|
+
me.changeData.variableDeclarations++;
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
104
181
|
}
|
|
105
182
|
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
exports.default = MovedDeclarations;
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
};
|