webfuscator 1.2.1 → 1.3.1
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/README.md +3 -3
- package/dist/analysis/constant.d.ts.map +1 -1
- package/dist/analysis/constant.js +10 -27
- package/dist/analysis/constant.js.map +1 -1
- package/dist/analysis/inlineability.d.ts.map +1 -1
- package/dist/analysis/inlineability.js +5 -13
- package/dist/analysis/inlineability.js.map +1 -1
- package/dist/analysis/purity.d.ts +3 -3
- package/dist/analysis/purity.d.ts.map +1 -1
- package/dist/analysis/purity.js +28 -75
- package/dist/analysis/purity.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/obfuscator.d.ts +2 -1
- package/dist/obfuscator.d.ts.map +1 -1
- package/dist/obfuscator.js +47 -12
- package/dist/obfuscator.js.map +1 -1
- package/dist/options.d.ts +17 -4
- package/dist/options.d.ts.map +1 -1
- package/dist/preparation/expand-destructuring.d.ts +2 -3
- package/dist/preparation/expand-destructuring.d.ts.map +1 -1
- package/dist/preparation/expand-destructuring.js +2 -8
- package/dist/preparation/expand-destructuring.js.map +1 -1
- package/dist/transforms/arguments-to-parameters.d.ts +5 -4
- package/dist/transforms/arguments-to-parameters.d.ts.map +1 -1
- package/dist/transforms/arguments-to-parameters.js +5 -4
- package/dist/transforms/arguments-to-parameters.js.map +1 -1
- package/dist/transforms/arrow-to-function.d.ts +4 -3
- package/dist/transforms/arrow-to-function.d.ts.map +1 -1
- package/dist/transforms/arrow-to-function.js +6 -10
- package/dist/transforms/arrow-to-function.js.map +1 -1
- package/dist/transforms/collapse-single-use-temps.d.ts +2 -1
- package/dist/transforms/collapse-single-use-temps.d.ts.map +1 -1
- package/dist/transforms/collapse-single-use-temps.js +12 -20
- package/dist/transforms/collapse-single-use-temps.js.map +1 -1
- package/dist/transforms/conceal-strings.d.ts +56 -0
- package/dist/transforms/conceal-strings.d.ts.map +1 -0
- package/dist/transforms/conceal-strings.js +356 -0
- package/dist/transforms/conceal-strings.js.map +1 -0
- package/dist/transforms/const-let-to-var.d.ts +4 -3
- package/dist/transforms/const-let-to-var.d.ts.map +1 -1
- package/dist/transforms/const-let-to-var.js +8 -67
- package/dist/transforms/const-let-to-var.js.map +1 -1
- package/dist/transforms/const-to-let.d.ts +1 -3
- package/dist/transforms/const-to-let.d.ts.map +1 -1
- package/dist/transforms/const-to-let.js +1 -8
- package/dist/transforms/const-to-let.js.map +1 -1
- package/dist/transforms/drop-console.d.ts.map +1 -1
- package/dist/transforms/drop-console.js +3 -5
- package/dist/transforms/drop-console.js.map +1 -1
- package/dist/transforms/expand-binary-assignment.d.ts.map +1 -1
- package/dist/transforms/expand-binary-assignment.js +0 -5
- package/dist/transforms/expand-binary-assignment.js.map +1 -1
- package/dist/transforms/expand-logical-assignment.d.ts.map +1 -1
- package/dist/transforms/expand-logical-assignment.js +0 -5
- package/dist/transforms/expand-logical-assignment.js.map +1 -1
- package/dist/transforms/extract-object-properties.js +5 -12
- package/dist/transforms/extract-object-properties.js.map +1 -1
- package/dist/transforms/fold-builtin-methods.d.ts.map +1 -1
- package/dist/transforms/fold-builtin-methods.js +44 -14
- package/dist/transforms/fold-builtin-methods.js.map +1 -1
- package/dist/transforms/fold-constants.js +5 -2
- package/dist/transforms/fold-constants.js.map +1 -1
- package/dist/transforms/function-declaration-to-expression.d.ts +5 -6
- package/dist/transforms/function-declaration-to-expression.d.ts.map +1 -1
- package/dist/transforms/function-declaration-to-expression.js +5 -6
- package/dist/transforms/function-declaration-to-expression.js.map +1 -1
- package/dist/transforms/hoist-variables.d.ts +29 -0
- package/dist/transforms/hoist-variables.d.ts.map +1 -0
- package/dist/transforms/hoist-variables.js +215 -0
- package/dist/transforms/hoist-variables.js.map +1 -0
- package/dist/transforms/inline-functions.js +11 -40
- package/dist/transforms/inline-functions.js.map +1 -1
- package/dist/transforms/logical-to-ternary.d.ts +1 -1
- package/dist/transforms/logical-to-ternary.js +5 -9
- package/dist/transforms/logical-to-ternary.js.map +1 -1
- package/dist/transforms/mangle-properties.d.ts +2 -5
- package/dist/transforms/mangle-properties.d.ts.map +1 -1
- package/dist/transforms/mangle-properties.js +9 -9
- package/dist/transforms/mangle-properties.js.map +1 -1
- package/dist/transforms/merge-variable-declarations.d.ts +17 -0
- package/dist/transforms/merge-variable-declarations.d.ts.map +1 -0
- package/dist/transforms/merge-variable-declarations.js +68 -0
- package/dist/transforms/merge-variable-declarations.js.map +1 -0
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts +4 -5
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts.map +1 -1
- package/dist/transforms/nullish-coalescing-to-ternary.js +7 -12
- package/dist/transforms/nullish-coalescing-to-ternary.js.map +1 -1
- package/dist/transforms/numbers-to-strings.d.ts.map +1 -1
- package/dist/transforms/numbers-to-strings.js +1 -8
- package/dist/transforms/numbers-to-strings.js.map +1 -1
- package/dist/transforms/object-method-to-property.d.ts +1 -1
- package/dist/transforms/object-method-to-property.js +1 -1
- package/dist/transforms/optional-chaining-to-ternary.d.ts +4 -3
- package/dist/transforms/optional-chaining-to-ternary.d.ts.map +1 -1
- package/dist/transforms/optional-chaining-to-ternary.js +9 -9
- package/dist/transforms/optional-chaining-to-ternary.js.map +1 -1
- package/dist/transforms/pack-declarations-into-parameters.d.ts.map +1 -1
- package/dist/transforms/pack-declarations-into-parameters.js +5 -21
- package/dist/transforms/pack-declarations-into-parameters.js.map +1 -1
- package/dist/transforms/pack.d.ts +4 -13
- package/dist/transforms/pack.d.ts.map +1 -1
- package/dist/transforms/pack.js +9 -29
- package/dist/transforms/pack.js.map +1 -1
- package/dist/transforms/remove-anonymous-function-names.d.ts +2 -4
- package/dist/transforms/remove-anonymous-function-names.d.ts.map +1 -1
- package/dist/transforms/remove-anonymous-function-names.js +2 -40
- package/dist/transforms/remove-anonymous-function-names.js.map +1 -1
- package/dist/transforms/remove-unreachable-code.js +2 -21
- package/dist/transforms/remove-unreachable-code.js.map +1 -1
- package/dist/transforms/remove-unused-code.d.ts.map +1 -1
- package/dist/transforms/remove-unused-code.js +12 -49
- package/dist/transforms/remove-unused-code.js.map +1 -1
- package/dist/transforms/rename-identifiers.d.ts +3 -3
- package/dist/transforms/rename-identifiers.d.ts.map +1 -1
- package/dist/transforms/rename-identifiers.js +31 -35
- package/dist/transforms/rename-identifiers.js.map +1 -1
- package/dist/transforms/reorder-function-declarations.d.ts +24 -0
- package/dist/transforms/reorder-function-declarations.d.ts.map +1 -0
- package/dist/transforms/reorder-function-declarations.js +62 -0
- package/dist/transforms/reorder-function-declarations.js.map +1 -0
- package/dist/transforms/specials-to-strings.d.ts.map +1 -1
- package/dist/transforms/specials-to-strings.js +2 -3
- package/dist/transforms/specials-to-strings.js.map +1 -1
- package/dist/transforms/switch-to-if.js +5 -15
- package/dist/transforms/switch-to-if.js.map +1 -1
- package/dist/transforms/ternary-to-if.d.ts.map +1 -1
- package/dist/transforms/ternary-to-if.js +5 -9
- package/dist/transforms/ternary-to-if.js.map +1 -1
- package/dist/transforms/update-to-assignment.d.ts.map +1 -1
- package/dist/transforms/update-to-assignment.js +6 -23
- package/dist/transforms/update-to-assignment.js.map +1 -1
- package/dist/transforms/yodify-conditions.d.ts +3 -4
- package/dist/transforms/yodify-conditions.d.ts.map +1 -1
- package/dist/transforms/yodify-conditions.js +3 -4
- package/dist/transforms/yodify-conditions.js.map +1 -1
- package/dist/utils/ast.d.ts +1 -3
- package/dist/utils/ast.d.ts.map +1 -1
- package/dist/utils/ast.js +4 -60
- package/dist/utils/ast.js.map +1 -1
- package/dist/utils/evaluation-order.js +1 -1
- package/dist/utils/evaluation-order.js.map +1 -1
- package/dist/utils/literal.d.ts.map +1 -1
- package/dist/utils/literal.js +74 -2
- package/dist/utils/literal.js.map +1 -1
- package/dist/utils/logical-lowering.d.ts.map +1 -1
- package/dist/utils/logical-lowering.js +7 -9
- package/dist/utils/logical-lowering.js.map +1 -1
- package/dist/utils/nullish.d.ts +4 -0
- package/dist/utils/nullish.d.ts.map +1 -0
- package/dist/utils/nullish.js +8 -0
- package/dist/utils/nullish.js.map +1 -0
- package/dist/utils/paths.d.ts +0 -2
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +0 -28
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/statement-lists.d.ts +9 -0
- package/dist/utils/statement-lists.d.ts.map +1 -0
- package/dist/utils/statement-lists.js +27 -0
- package/dist/utils/statement-lists.js.map +1 -0
- package/package.json +6 -2
- package/src/analysis/constant.ts +12 -33
- package/src/analysis/inlineability.ts +5 -13
- package/src/analysis/purity.ts +29 -92
- package/src/index.ts +1 -0
- package/src/obfuscator.ts +51 -14
- package/src/options.ts +21 -3
- package/src/preparation/expand-destructuring.ts +2 -10
- package/src/transforms/arguments-to-parameters.ts +5 -4
- package/src/transforms/arrow-to-function.ts +6 -10
- package/src/transforms/collapse-single-use-temps.ts +12 -23
- package/src/transforms/conceal-strings.ts +525 -0
- package/src/transforms/const-let-to-var.ts +9 -72
- package/src/transforms/const-to-let.ts +1 -8
- package/src/transforms/drop-console.ts +3 -5
- package/src/transforms/expand-binary-assignment.ts +0 -5
- package/src/transforms/expand-logical-assignment.ts +0 -5
- package/src/transforms/extract-object-properties.ts +5 -14
- package/src/transforms/fold-builtin-methods.ts +63 -17
- package/src/transforms/fold-constants.ts +5 -2
- package/src/transforms/function-declaration-to-expression.ts +5 -6
- package/src/transforms/hoist-variables.ts +262 -0
- package/src/transforms/inline-functions.ts +16 -47
- package/src/transforms/logical-to-ternary.ts +5 -10
- package/src/transforms/mangle-properties.ts +9 -12
- package/src/transforms/merge-variable-declarations.ts +91 -0
- package/src/transforms/nullish-coalescing-to-ternary.ts +7 -13
- package/src/transforms/numbers-to-strings.ts +2 -12
- package/src/transforms/object-method-to-property.ts +1 -1
- package/src/transforms/optional-chaining-to-ternary.ts +9 -9
- package/src/transforms/pack-declarations-into-parameters.ts +11 -21
- package/src/transforms/pack.ts +9 -30
- package/src/transforms/remove-anonymous-function-names.ts +3 -46
- package/src/transforms/remove-unreachable-code.ts +2 -22
- package/src/transforms/remove-unused-code.ts +14 -74
- package/src/transforms/rename-identifiers.ts +44 -35
- package/src/transforms/reorder-function-declarations.ts +78 -0
- package/src/transforms/specials-to-strings.ts +2 -3
- package/src/transforms/switch-to-if.ts +5 -22
- package/src/transforms/ternary-to-if.ts +5 -9
- package/src/transforms/update-to-assignment.ts +6 -24
- package/src/transforms/yodify-conditions.ts +3 -4
- package/src/utils/ast.ts +4 -69
- package/src/utils/evaluation-order.ts +1 -1
- package/src/utils/literal.ts +91 -2
- package/src/utils/logical-lowering.ts +7 -11
- package/src/utils/nullish.ts +23 -0
- package/src/utils/paths.ts +0 -32
- package/src/utils/statement-lists.ts +45 -0
|
@@ -58,39 +58,20 @@ function isCompletion(node) {
|
|
|
58
58
|
t.isBreakStatement(node) ||
|
|
59
59
|
t.isContinueStatement(node));
|
|
60
60
|
}
|
|
61
|
-
// Hoisted bindings and referenced lexical TDZ remain observable from reachable
|
|
62
|
-
// code. An unreferenced lexical declaration is inert.
|
|
63
61
|
function isSafeToRemoveAfterCompletion(path) {
|
|
64
62
|
const node = path.node;
|
|
65
63
|
if (t.isFunctionDeclaration(node) || (t.isVariableDeclaration(node) && node.kind === 'var')) {
|
|
66
64
|
return false;
|
|
67
65
|
}
|
|
68
|
-
|
|
69
|
-
return !declaresReferencedBinding(path);
|
|
70
|
-
}
|
|
71
|
-
return !nestsHoistedDeclaration(node);
|
|
66
|
+
return !nestsHoistedVar(node);
|
|
72
67
|
}
|
|
73
|
-
|
|
74
|
-
function declaresReferencedBinding(path) {
|
|
75
|
-
for (const name of Object.keys(path.getBindingIdentifiers())) {
|
|
76
|
-
const binding = path.scope.getBinding(name);
|
|
77
|
-
if (binding && (binding.references > 0 || binding.constantViolations.length > 0)) {
|
|
78
|
-
return true;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
function nestsHoistedDeclaration(node) {
|
|
68
|
+
function nestsHoistedVar(node) {
|
|
84
69
|
let found = false;
|
|
85
70
|
t.traverseFast(node, (child) => {
|
|
86
71
|
if (found) {
|
|
87
72
|
return t.traverseFast.skip;
|
|
88
73
|
}
|
|
89
74
|
if (child !== node && t.isFunction(child)) {
|
|
90
|
-
// Function declarations may add Annex B aliases. Function bodies do not.
|
|
91
|
-
if (t.isFunctionDeclaration(child)) {
|
|
92
|
-
found = true;
|
|
93
|
-
}
|
|
94
75
|
return t.traverseFast.skip;
|
|
95
76
|
}
|
|
96
77
|
if (t.isVariableDeclaration(child) && child.kind === 'var') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-unreachable-code.js","sourceRoot":"","sources":["../../src/transforms/remove-unreachable-code.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAG7D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAS;IAC7C,OAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,OAAO,GAAyB;IACpC,cAAc,CAAC,IAAI,EAAE,KAAK;QACxB,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QACtB,CAAC;IACH,CAAC;IACD,UAAU,CAAC,IAAI,EAAE,KAAK;QACpB,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QACtB,CAAC;IACH,CAAC;CACF,CAAA;AAED,SAAS,SAAS,CAAC,IAA6B;IAC9C,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,MAAM,QAAQ,GAA4B,EAAE,CAAA;IAC5C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrB,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,QAAQ,GAAG,IAAI,CAAA;QACjB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,EAAE,CAAA;IAClB,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,CACL,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC;QACzB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAC5B,CAAA;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"remove-unreachable-code.js","sourceRoot":"","sources":["../../src/transforms/remove-unreachable-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-unused-code.d.ts","sourceRoot":"","sources":["../../src/transforms/remove-unused-code.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"remove-unused-code.d.ts","sourceRoot":"","sources":["../../src/transforms/remove-unused-code.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKxC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAcnD"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import traverse from '@babel/traverse';
|
|
2
2
|
import * as t from '@babel/types';
|
|
3
3
|
import { isSideEffectFree } from '../analysis/purity.js';
|
|
4
|
-
import { isDirectEvalCall } from '../utils/ast.js';
|
|
5
|
-
import { hasAnnexBFunctionAlias } from '../utils/paths.js';
|
|
6
4
|
/**
|
|
7
5
|
* Removes unused declarations and expression statements that have no effects.
|
|
8
6
|
* Sweeps continue because each removal can strand another binding.
|
|
@@ -23,10 +21,7 @@ export function removeUnusedCode(ast) {
|
|
|
23
21
|
// then maintain counts during removal.
|
|
24
22
|
crawlProgramScope(ast);
|
|
25
23
|
let anyChanged = false;
|
|
26
|
-
const state = {
|
|
27
|
-
changed: true,
|
|
28
|
-
evalReachableScopes: collectEvalReachableScopes(ast),
|
|
29
|
-
};
|
|
24
|
+
const state = { changed: true };
|
|
30
25
|
while (state.changed) {
|
|
31
26
|
state.changed = false;
|
|
32
27
|
traverse(ast, sweepVisitor, undefined, state);
|
|
@@ -44,38 +39,19 @@ function crawlProgramScope(ast) {
|
|
|
44
39
|
},
|
|
45
40
|
});
|
|
46
41
|
}
|
|
47
|
-
function collectEvalReachableScopes(ast) {
|
|
48
|
-
const reachable = new Set();
|
|
49
|
-
traverse(ast, {
|
|
50
|
-
CallExpression(path) {
|
|
51
|
-
if (!isDirectEvalCall(path.node)) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
let scope = path.scope;
|
|
55
|
-
while (scope) {
|
|
56
|
-
reachable.add(scope.block);
|
|
57
|
-
scope = scope.parent;
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
return reachable;
|
|
62
|
-
}
|
|
63
|
-
function bindingReachableByEval(binding, evalReachableScopes) {
|
|
64
|
-
return evalReachableScopes.has(binding.scope.block);
|
|
65
|
-
}
|
|
66
42
|
const sweepVisitor = {
|
|
67
43
|
VariableDeclarator(path, state) {
|
|
68
|
-
if (tryRemoveDeclarator(path
|
|
44
|
+
if (tryRemoveDeclarator(path)) {
|
|
69
45
|
state.changed = true;
|
|
70
46
|
}
|
|
71
47
|
},
|
|
72
48
|
FunctionDeclaration(path, state) {
|
|
73
|
-
if (tryRemoveFunctionDecl(path
|
|
49
|
+
if (tryRemoveFunctionDecl(path)) {
|
|
74
50
|
state.changed = true;
|
|
75
51
|
}
|
|
76
52
|
},
|
|
77
53
|
ClassDeclaration(path, state) {
|
|
78
|
-
if (tryRemoveClassDecl(path
|
|
54
|
+
if (tryRemoveClassDecl(path)) {
|
|
79
55
|
state.changed = true;
|
|
80
56
|
}
|
|
81
57
|
},
|
|
@@ -105,7 +81,7 @@ function dereferenceSubtree(rootPath) {
|
|
|
105
81
|
}
|
|
106
82
|
rootPath.traverse(dereferenceVisitor);
|
|
107
83
|
}
|
|
108
|
-
function tryRemoveDeclarator(path
|
|
84
|
+
function tryRemoveDeclarator(path) {
|
|
109
85
|
const declaration = path.parentPath;
|
|
110
86
|
if (!declaration || !declaration.isVariableDeclaration()) {
|
|
111
87
|
return false;
|
|
@@ -127,7 +103,7 @@ function tryRemoveDeclarator(path, evalReachableScopes) {
|
|
|
127
103
|
return false;
|
|
128
104
|
}
|
|
129
105
|
const init = path.node.init;
|
|
130
|
-
if (init && !isSideEffectFree(init, path.scope
|
|
106
|
+
if (init && !isSideEffectFree(init, path.scope)) {
|
|
131
107
|
return false;
|
|
132
108
|
}
|
|
133
109
|
const binding = path.scope.getBinding(id.name);
|
|
@@ -137,10 +113,7 @@ function tryRemoveDeclarator(path, evalReachableScopes) {
|
|
|
137
113
|
if (binding.references > 0) {
|
|
138
114
|
return false;
|
|
139
115
|
}
|
|
140
|
-
if (binding.constantViolations.length > 0) {
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
if (bindingReachableByEval(binding, evalReachableScopes)) {
|
|
116
|
+
if (declaration.node.kind !== 'const' && binding.constantViolations.length > 0) {
|
|
144
117
|
return false;
|
|
145
118
|
}
|
|
146
119
|
if (path.node.init) {
|
|
@@ -153,14 +126,10 @@ function tryRemoveDeclarator(path, evalReachableScopes) {
|
|
|
153
126
|
}
|
|
154
127
|
return true;
|
|
155
128
|
}
|
|
156
|
-
function tryRemoveFunctionDecl(path
|
|
129
|
+
function tryRemoveFunctionDecl(path) {
|
|
157
130
|
if (isExported(path)) {
|
|
158
131
|
return false;
|
|
159
132
|
}
|
|
160
|
-
// Babel misses the sloppy Annex B alias of a block-level function.
|
|
161
|
-
if (hasAnnexBFunctionAlias(path)) {
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
133
|
const id = path.node.id;
|
|
165
134
|
if (!id) {
|
|
166
135
|
return false;
|
|
@@ -175,15 +144,12 @@ function tryRemoveFunctionDecl(path, evalReachableScopes) {
|
|
|
175
144
|
if (binding.constantViolations.length > 0) {
|
|
176
145
|
return false;
|
|
177
146
|
}
|
|
178
|
-
if (bindingReachableByEval(binding, evalReachableScopes)) {
|
|
179
|
-
return false;
|
|
180
|
-
}
|
|
181
147
|
dereferenceSubtree(path.get('body'));
|
|
182
148
|
path.scope.removeBinding(id.name);
|
|
183
149
|
path.remove();
|
|
184
150
|
return true;
|
|
185
151
|
}
|
|
186
|
-
function tryRemoveClassDecl(path
|
|
152
|
+
function tryRemoveClassDecl(path) {
|
|
187
153
|
if (isExported(path)) {
|
|
188
154
|
return false;
|
|
189
155
|
}
|
|
@@ -192,7 +158,7 @@ function tryRemoveClassDecl(path, evalReachableScopes) {
|
|
|
192
158
|
return false;
|
|
193
159
|
}
|
|
194
160
|
// `extends`, computed keys, static fields, and static blocks run on evaluation.
|
|
195
|
-
if (path.node.superClass && !isSideEffectFree(path.node.superClass, path.scope
|
|
161
|
+
if (path.node.superClass && !isSideEffectFree(path.node.superClass, path.scope)) {
|
|
196
162
|
return false;
|
|
197
163
|
}
|
|
198
164
|
for (const member of path.node.body.body) {
|
|
@@ -206,7 +172,7 @@ function tryRemoveClassDecl(path, evalReachableScopes) {
|
|
|
206
172
|
if ('computed' in member &&
|
|
207
173
|
member.computed &&
|
|
208
174
|
'key' in member &&
|
|
209
|
-
!isSideEffectFree(member.key, path.scope
|
|
175
|
+
!isSideEffectFree(member.key, path.scope)) {
|
|
210
176
|
return false;
|
|
211
177
|
}
|
|
212
178
|
}
|
|
@@ -220,9 +186,6 @@ function tryRemoveClassDecl(path, evalReachableScopes) {
|
|
|
220
186
|
if (binding.constantViolations.length > 0) {
|
|
221
187
|
return false;
|
|
222
188
|
}
|
|
223
|
-
if (bindingReachableByEval(binding, evalReachableScopes)) {
|
|
224
|
-
return false;
|
|
225
|
-
}
|
|
226
189
|
dereferenceSubtree(path.get('body'));
|
|
227
190
|
if (path.node.superClass) {
|
|
228
191
|
dereferenceSubtree(path.get('superClass'));
|
|
@@ -232,7 +195,7 @@ function tryRemoveClassDecl(path, evalReachableScopes) {
|
|
|
232
195
|
return true;
|
|
233
196
|
}
|
|
234
197
|
function tryRemoveExpressionStatement(path) {
|
|
235
|
-
if (!isSideEffectFree(path.node.expression, path.scope
|
|
198
|
+
if (!isSideEffectFree(path.node.expression, path.scope)) {
|
|
236
199
|
return false;
|
|
237
200
|
}
|
|
238
201
|
dereferenceSubtree(path.get('expression'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-unused-code.js","sourceRoot":"","sources":["../../src/transforms/remove-unused-code.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"remove-unused-code.js","sourceRoot":"","sources":["../../src/transforms/remove-unused-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { File } from '@babel/types';
|
|
2
2
|
import type { TransformContext } from '../options.js';
|
|
3
3
|
/**
|
|
4
|
-
* Renames bindings and labels with
|
|
5
|
-
*
|
|
6
|
-
* sibling scopes.
|
|
4
|
+
* Renames bindings and labels with the configured string generator. Generated
|
|
5
|
+
* names do not capture unresolved names or bindings still used from an outer
|
|
6
|
+
* scope. Separate sibling scopes may reuse the same names.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* // ◀️ before
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rename-identifiers.d.ts","sourceRoot":"","sources":["../../src/transforms/rename-identifiers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"rename-identifiers.d.ts","sourceRoot":"","sources":["../../src/transforms/rename-identifiers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAKlD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CA6I3E"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import traverse from '@babel/traverse';
|
|
2
2
|
import * as t from '@babel/types';
|
|
3
|
-
import {
|
|
4
|
-
import { hasAnnexBFunctionAlias, referencesOrWritesVariable } from '../utils/paths.js';
|
|
3
|
+
import { referencesOrWritesVariable } from '../utils/paths.js';
|
|
5
4
|
import { mulberry32 } from '../utils/random.js';
|
|
6
5
|
import { StringGenerator } from '../utils/string-generator.js';
|
|
7
6
|
/**
|
|
8
|
-
* Renames bindings and labels with
|
|
9
|
-
*
|
|
10
|
-
* sibling scopes.
|
|
7
|
+
* Renames bindings and labels with the configured string generator. Generated
|
|
8
|
+
* names do not capture unresolved names or bindings still used from an outer
|
|
9
|
+
* scope. Separate sibling scopes may reuse the same names.
|
|
11
10
|
*
|
|
12
11
|
* @example
|
|
13
12
|
* // ◀️ before
|
|
@@ -26,6 +25,7 @@ import { StringGenerator } from '../utils/string-generator.js';
|
|
|
26
25
|
*/
|
|
27
26
|
export function renameIdentifiers(ast, ctx) {
|
|
28
27
|
const generator = new StringGenerator(ctx.stringGeneratorMode, mulberry32(ctx.seed));
|
|
28
|
+
const separatedDirectExports = separateDirectExports(ast.program);
|
|
29
29
|
let programScope;
|
|
30
30
|
traverse(ast, {
|
|
31
31
|
Program(path) {
|
|
@@ -34,13 +34,12 @@ export function renameIdentifiers(ast, ctx) {
|
|
|
34
34
|
},
|
|
35
35
|
});
|
|
36
36
|
if (!programScope) {
|
|
37
|
-
return
|
|
37
|
+
return separatedDirectExports;
|
|
38
38
|
}
|
|
39
39
|
programScope.crawl();
|
|
40
40
|
const liveAncestors = new Map();
|
|
41
41
|
// Reserve unbound names so generated bindings cannot capture them.
|
|
42
42
|
const freeNames = new Set();
|
|
43
|
-
// `with` and direct eval pin bindings to their source names.
|
|
44
43
|
const unrenamable = new Set();
|
|
45
44
|
// Reserve pinned source names globally, including before their binding is seen.
|
|
46
45
|
const pinnedNames = new Set();
|
|
@@ -61,9 +60,6 @@ export function renameIdentifiers(ast, ctx) {
|
|
|
61
60
|
}
|
|
62
61
|
return;
|
|
63
62
|
}
|
|
64
|
-
if (isInsideWith(path)) {
|
|
65
|
-
pin(binding, path.node.name);
|
|
66
|
-
}
|
|
67
63
|
let scope = path.scope;
|
|
68
64
|
while (scope && scope !== binding.scope) {
|
|
69
65
|
let live = liveAncestors.get(scope);
|
|
@@ -75,30 +71,6 @@ export function renameIdentifiers(ast, ctx) {
|
|
|
75
71
|
scope = scope.parent;
|
|
76
72
|
}
|
|
77
73
|
},
|
|
78
|
-
CallExpression(path) {
|
|
79
|
-
// Direct eval can read every visible binding by its source name.
|
|
80
|
-
if (!isDirectEvalCall(path.node)) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
let scope = path.scope;
|
|
84
|
-
while (scope) {
|
|
85
|
-
for (const name of Object.keys(scope.bindings)) {
|
|
86
|
-
pin(scope.bindings[name], name);
|
|
87
|
-
}
|
|
88
|
-
scope = scope.parent;
|
|
89
|
-
}
|
|
90
|
-
},
|
|
91
|
-
FunctionDeclaration(path) {
|
|
92
|
-
// ECMA-262 B.3.3 gives sloppy block functions an alias Babel does not model.
|
|
93
|
-
if (!hasAnnexBFunctionAlias(path)) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
const name = path.node.id?.name;
|
|
97
|
-
const binding = name === undefined ? undefined : path.scope.getBinding(name);
|
|
98
|
-
if (binding && name !== undefined) {
|
|
99
|
-
pin(binding, name);
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
74
|
CatchClause(path) {
|
|
103
75
|
// Babel splits a catch parameter and same-named `var` that share one runtime
|
|
104
76
|
// variable. They must keep the same name.
|
|
@@ -155,7 +127,7 @@ export function renameIdentifiers(ast, ctx) {
|
|
|
155
127
|
},
|
|
156
128
|
});
|
|
157
129
|
if (bindingToName.size === 0) {
|
|
158
|
-
return renameLabels(ast, generator);
|
|
130
|
+
return renameLabels(ast, generator) || separatedDirectExports;
|
|
159
131
|
}
|
|
160
132
|
traverse(ast, {
|
|
161
133
|
Identifier(path) {
|
|
@@ -182,6 +154,30 @@ export function renameIdentifiers(ast, ctx) {
|
|
|
182
154
|
renameLabels(ast, generator);
|
|
183
155
|
return true;
|
|
184
156
|
}
|
|
157
|
+
function separateDirectExports(program) {
|
|
158
|
+
const body = [];
|
|
159
|
+
let changed = false;
|
|
160
|
+
for (const statement of program.body) {
|
|
161
|
+
const declaration = t.isExportNamedDeclaration(statement) ? statement.declaration : null;
|
|
162
|
+
if (!t.isVariableDeclaration(declaration) &&
|
|
163
|
+
!t.isFunctionDeclaration(declaration) &&
|
|
164
|
+
!t.isClassDeclaration(declaration)) {
|
|
165
|
+
body.push(statement);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const names = Object.keys(t.getBindingIdentifiers(declaration));
|
|
169
|
+
if (names.length === 0) {
|
|
170
|
+
body.push(statement);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
body.push(declaration, t.exportNamedDeclaration(null, names.map((name) => t.exportSpecifier(t.identifier(name), t.identifier(name)))));
|
|
174
|
+
changed = true;
|
|
175
|
+
}
|
|
176
|
+
if (changed) {
|
|
177
|
+
program.body = body;
|
|
178
|
+
}
|
|
179
|
+
return changed;
|
|
180
|
+
}
|
|
185
181
|
function isNonBindingPosition(path) {
|
|
186
182
|
const node = path.node;
|
|
187
183
|
const parent = path.parent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rename-identifiers.js","sourceRoot":"","sources":["../../src/transforms/rename-identifiers.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAIjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"rename-identifiers.js","sourceRoot":"","sources":["../../src/transforms/rename-identifiers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { File } from '@babel/types';
|
|
2
|
+
/**
|
|
3
|
+
* Moves hoisted function declarations to the end of each program, block, switch
|
|
4
|
+
* case, or static block. It keeps declaration order, including duplicate names.
|
|
5
|
+
*
|
|
6
|
+
* If moving every declaration would turn a string expression into a directive,
|
|
7
|
+
* one declaration stays before the string. Direct exports stay in place.
|
|
8
|
+
* Indirect exports move with their local declaration.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // ◀️ before
|
|
12
|
+
* function area(r) {
|
|
13
|
+
* return r * r;
|
|
14
|
+
* }
|
|
15
|
+
* log(area(2));
|
|
16
|
+
*
|
|
17
|
+
* // ▶️ after
|
|
18
|
+
* log(area(2));
|
|
19
|
+
* function area(r) {
|
|
20
|
+
* return r * r;
|
|
21
|
+
* }
|
|
22
|
+
*/
|
|
23
|
+
export declare function reorderFunctionDeclarations(ast: File): boolean;
|
|
24
|
+
//# sourceMappingURL=reorder-function-declarations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-function-declarations.d.ts","sourceRoot":"","sources":["../../src/transforms/reorder-function-declarations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKxC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAI9D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { rewriteStatementLists } from '../utils/statement-lists.js';
|
|
2
|
+
/**
|
|
3
|
+
* Moves hoisted function declarations to the end of each program, block, switch
|
|
4
|
+
* case, or static block. It keeps declaration order, including duplicate names.
|
|
5
|
+
*
|
|
6
|
+
* If moving every declaration would turn a string expression into a directive,
|
|
7
|
+
* one declaration stays before the string. Direct exports stay in place.
|
|
8
|
+
* Indirect exports move with their local declaration.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // ◀️ before
|
|
12
|
+
* function area(r) {
|
|
13
|
+
* return r * r;
|
|
14
|
+
* }
|
|
15
|
+
* log(area(2));
|
|
16
|
+
*
|
|
17
|
+
* // ▶️ after
|
|
18
|
+
* log(area(2));
|
|
19
|
+
* function area(r) {
|
|
20
|
+
* return r * r;
|
|
21
|
+
* }
|
|
22
|
+
*/
|
|
23
|
+
export function reorderFunctionDeclarations(ast) {
|
|
24
|
+
return rewriteStatementLists(ast, (statements, container) => reorderedStatements(statements, containerAllowsDirective(container)));
|
|
25
|
+
}
|
|
26
|
+
// Only programs and function bodies recognize directives, so only they need the guard.
|
|
27
|
+
function containerAllowsDirective(container) {
|
|
28
|
+
if (container.isProgram()) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return container.isBlockStatement() && container.parentPath.isFunction();
|
|
32
|
+
}
|
|
33
|
+
function reorderedStatements(children, canCreateDirective) {
|
|
34
|
+
const rest = [];
|
|
35
|
+
const moved = [];
|
|
36
|
+
for (const child of children) {
|
|
37
|
+
if (isMovable(child)) {
|
|
38
|
+
moved.push(child.node);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
rest.push(child.node);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (moved.length === 0) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (canCreateDirective && createsDirective(rest)) {
|
|
48
|
+
rest.unshift(moved.shift());
|
|
49
|
+
}
|
|
50
|
+
const reordered = [...rest, ...moved];
|
|
51
|
+
return reordered.every((node, index) => node === children[index]?.node) ? null : reordered;
|
|
52
|
+
}
|
|
53
|
+
function createsDirective(statements) {
|
|
54
|
+
const first = statements[0];
|
|
55
|
+
return (first !== undefined &&
|
|
56
|
+
first.type === 'ExpressionStatement' &&
|
|
57
|
+
first.expression.type === 'StringLiteral');
|
|
58
|
+
}
|
|
59
|
+
function isMovable(child) {
|
|
60
|
+
return child.isFunctionDeclaration() && child.node.id !== null;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=reorder-function-declarations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-function-declarations.js","sourceRoot":"","sources":["../../src/transforms/reorder-function-declarations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAGhE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAS;IACnD,OAAO,qBAAqB,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,CAC1D,mBAAmB,CAAC,UAAU,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC,CACrE,CAAA;AACH,CAAC;AAED,uFAAuF;AACvF,SAAS,wBAAwB,CAAC,SAA2C;IAC3E,IAAI,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,SAAS,CAAC,gBAAgB,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,CAAA;AAC1E,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAiC,EACjC,kBAA2B;IAE3B,MAAM,IAAI,GAAkB,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,kBAAkB,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,CAAA;IACrC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AAC5F,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkC;IAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;IAC3B,OAAO,CACL,KAAK,KAAK,SAAS;QACnB,KAAK,CAAC,IAAI,KAAK,qBAAqB;QACpC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,eAAe,CAC1C,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAA4B;IAC7C,OAAO,KAAK,CAAC,qBAAqB,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAA;AAChE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specials-to-strings.d.ts","sourceRoot":"","sources":["../../src/transforms/specials-to-strings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"specials-to-strings.d.ts","sourceRoot":"","sources":["../../src/transforms/specials-to-strings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAKlD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAO3E"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import traverse from '@babel/traverse';
|
|
2
2
|
import * as t from '@babel/types';
|
|
3
|
-
import { enclosingScopeHasDirectEval, isInsideWith } from '../utils/ast.js';
|
|
4
3
|
import { mulberry32 } from '../utils/random.js';
|
|
5
4
|
import { StringGenerator } from '../utils/string-generator.js';
|
|
6
5
|
/**
|
|
@@ -57,8 +56,8 @@ const visitor = {
|
|
|
57
56
|
if (path.scope.getBinding(name)) {
|
|
58
57
|
return;
|
|
59
58
|
}
|
|
60
|
-
//
|
|
61
|
-
if (isWriteTarget(path)
|
|
59
|
+
// A replacement cannot occupy a write target.
|
|
60
|
+
if (isWriteTarget(path)) {
|
|
62
61
|
return;
|
|
63
62
|
}
|
|
64
63
|
const str = t.stringLiteral(state.generator.next());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specials-to-strings.js","sourceRoot":"","sources":["../../src/transforms/specials-to-strings.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"specials-to-strings.js","sourceRoot":"","sources":["../../src/transforms/specials-to-strings.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,8 +40,7 @@ const visitor = {
|
|
|
40
40
|
};
|
|
41
41
|
function transformSwitch(path) {
|
|
42
42
|
const node = path.node;
|
|
43
|
-
// Separate `if` blocks cannot preserve cross-case lexical scope
|
|
44
|
-
// function hoisting.
|
|
43
|
+
// Separate `if` blocks cannot preserve cross-case lexical scope.
|
|
45
44
|
if (hasBlockScopedDeclaration(node)) {
|
|
46
45
|
return false;
|
|
47
46
|
}
|
|
@@ -49,7 +48,7 @@ function transformSwitch(path) {
|
|
|
49
48
|
lowerToIfElseChain(path);
|
|
50
49
|
return true;
|
|
51
50
|
}
|
|
52
|
-
if (!labeledLoweringIsSafe(node, path.scope
|
|
51
|
+
if (!labeledLoweringIsSafe(node, path.scope)) {
|
|
53
52
|
return false;
|
|
54
53
|
}
|
|
55
54
|
lowerToLabeledBlock(path);
|
|
@@ -60,30 +59,21 @@ function hasBlockScopedDeclaration(node) {
|
|
|
60
59
|
for (const stmt of caseClause.consequent) {
|
|
61
60
|
if ((t.isVariableDeclaration(stmt) && stmt.kind !== 'var') ||
|
|
62
61
|
t.isClassDeclaration(stmt) ||
|
|
63
|
-
t.isFunctionDeclaration(stmt)
|
|
64
|
-
isLabeledFunctionDeclaration(stmt)) {
|
|
62
|
+
t.isFunctionDeclaration(stmt)) {
|
|
65
63
|
return true;
|
|
66
64
|
}
|
|
67
65
|
}
|
|
68
66
|
}
|
|
69
67
|
return false;
|
|
70
68
|
}
|
|
71
|
-
// Babel hides an Annex B.3.4 labeled function under LabeledStatement wrappers.
|
|
72
|
-
function isLabeledFunctionDeclaration(stmt) {
|
|
73
|
-
let current = stmt;
|
|
74
|
-
while (t.isLabeledStatement(current)) {
|
|
75
|
-
current = current.body;
|
|
76
|
-
}
|
|
77
|
-
return t.isFunctionDeclaration(current);
|
|
78
|
-
}
|
|
79
69
|
// A non-final default needs match results from later cases. Precomputing that
|
|
80
70
|
// result rereads tests, so every test must be pure in this shape.
|
|
81
|
-
function labeledLoweringIsSafe(node, scope
|
|
71
|
+
function labeledLoweringIsSafe(node, scope) {
|
|
82
72
|
const defaultIndex = node.cases.findIndex((caseClause) => caseClause.test === null);
|
|
83
73
|
if (defaultIndex === -1 || defaultIndex === node.cases.length - 1) {
|
|
84
74
|
return true;
|
|
85
75
|
}
|
|
86
|
-
return node.cases.every((caseClause) => caseClause.test == null || isPure(caseClause.test, scope
|
|
76
|
+
return node.cases.every((caseClause) => caseClause.test == null || isPure(caseClause.test, scope));
|
|
87
77
|
}
|
|
88
78
|
function canLowerToIfElseChain(node) {
|
|
89
79
|
for (let i = 0; i < node.cases.length; i++) {
|