webfuscator 0.9.4
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/DISCLOSURE +9 -0
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/dist/analysis/constant.d.ts +11 -0
- package/dist/analysis/constant.d.ts.map +1 -0
- package/dist/analysis/constant.js +261 -0
- package/dist/analysis/constant.js.map +1 -0
- package/dist/analysis/document-order.d.ts +5 -0
- package/dist/analysis/document-order.d.ts.map +1 -0
- package/dist/analysis/document-order.js +124 -0
- package/dist/analysis/document-order.js.map +1 -0
- package/dist/analysis/inlineability.d.ts +13 -0
- package/dist/analysis/inlineability.d.ts.map +1 -0
- package/dist/analysis/inlineability.js +270 -0
- package/dist/analysis/inlineability.js.map +1 -0
- package/dist/analysis/purity.d.ts +5 -0
- package/dist/analysis/purity.d.ts.map +1 -0
- package/dist/analysis/purity.js +281 -0
- package/dist/analysis/purity.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/obfuscator.d.ts +4 -0
- package/dist/obfuscator.d.ts.map +1 -0
- package/dist/obfuscator.js +222 -0
- package/dist/obfuscator.js.map +1 -0
- package/dist/options.d.ts +73 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +2 -0
- package/dist/options.js.map +1 -0
- package/dist/preparation/dot-to-bracket.d.ts +16 -0
- package/dist/preparation/dot-to-bracket.d.ts.map +1 -0
- package/dist/preparation/dot-to-bracket.js +36 -0
- package/dist/preparation/dot-to-bracket.js.map +1 -0
- package/dist/preparation/expand-destructuring.d.ts +26 -0
- package/dist/preparation/expand-destructuring.d.ts.map +1 -0
- package/dist/preparation/expand-destructuring.js +154 -0
- package/dist/preparation/expand-destructuring.js.map +1 -0
- package/dist/preparation/expand-template-literals.d.ts +23 -0
- package/dist/preparation/expand-template-literals.d.ts.map +1 -0
- package/dist/preparation/expand-template-literals.js +78 -0
- package/dist/preparation/expand-template-literals.js.map +1 -0
- package/dist/preparation/rewrite-class-fields.d.ts +43 -0
- package/dist/preparation/rewrite-class-fields.d.ts.map +1 -0
- package/dist/preparation/rewrite-class-fields.js +270 -0
- package/dist/preparation/rewrite-class-fields.js.map +1 -0
- package/dist/preparation/split-sequence-expressions.d.ts +15 -0
- package/dist/preparation/split-sequence-expressions.d.ts.map +1 -0
- package/dist/preparation/split-sequence-expressions.js +36 -0
- package/dist/preparation/split-sequence-expressions.js.map +1 -0
- package/dist/preparation/split-variable-declarations.d.ts +20 -0
- package/dist/preparation/split-variable-declarations.d.ts.map +1 -0
- package/dist/preparation/split-variable-declarations.js +36 -0
- package/dist/preparation/split-variable-declarations.js.map +1 -0
- package/dist/preparation/stringify-object-keys.d.ts +21 -0
- package/dist/preparation/stringify-object-keys.d.ts.map +1 -0
- package/dist/preparation/stringify-object-keys.js +96 -0
- package/dist/preparation/stringify-object-keys.js.map +1 -0
- package/dist/preparation/wrap-single-statements.d.ts +24 -0
- package/dist/preparation/wrap-single-statements.d.ts.map +1 -0
- package/dist/preparation/wrap-single-statements.js +53 -0
- package/dist/preparation/wrap-single-statements.js.map +1 -0
- package/dist/transforms/arguments-to-parameters.d.ts +20 -0
- package/dist/transforms/arguments-to-parameters.d.ts.map +1 -0
- package/dist/transforms/arguments-to-parameters.js +162 -0
- package/dist/transforms/arguments-to-parameters.js.map +1 -0
- package/dist/transforms/arrow-to-function.d.ts +46 -0
- package/dist/transforms/arrow-to-function.d.ts.map +1 -0
- package/dist/transforms/arrow-to-function.js +203 -0
- package/dist/transforms/arrow-to-function.js.map +1 -0
- package/dist/transforms/collapse-single-use-temps.d.ts +16 -0
- package/dist/transforms/collapse-single-use-temps.d.ts.map +1 -0
- package/dist/transforms/collapse-single-use-temps.js +805 -0
- package/dist/transforms/collapse-single-use-temps.js.map +1 -0
- package/dist/transforms/const-let-to-var.d.ts +21 -0
- package/dist/transforms/const-let-to-var.d.ts.map +1 -0
- package/dist/transforms/const-let-to-var.js +217 -0
- package/dist/transforms/const-let-to-var.js.map +1 -0
- package/dist/transforms/const-to-let.d.ts +17 -0
- package/dist/transforms/const-to-let.d.ts.map +1 -0
- package/dist/transforms/const-to-let.js +33 -0
- package/dist/transforms/const-to-let.js.map +1 -0
- package/dist/transforms/do-while-to-while.d.ts +26 -0
- package/dist/transforms/do-while-to-while.d.ts.map +1 -0
- package/dist/transforms/do-while-to-while.js +54 -0
- package/dist/transforms/do-while-to-while.js.map +1 -0
- package/dist/transforms/drop-console.d.ts +27 -0
- package/dist/transforms/drop-console.d.ts.map +1 -0
- package/dist/transforms/drop-console.js +107 -0
- package/dist/transforms/drop-console.js.map +1 -0
- package/dist/transforms/drop-debugger.d.ts +18 -0
- package/dist/transforms/drop-debugger.d.ts.map +1 -0
- package/dist/transforms/drop-debugger.js +34 -0
- package/dist/transforms/drop-debugger.js.map +1 -0
- package/dist/transforms/expand-binary-assignment.d.ts +26 -0
- package/dist/transforms/expand-binary-assignment.d.ts.map +1 -0
- package/dist/transforms/expand-binary-assignment.js +78 -0
- package/dist/transforms/expand-binary-assignment.js.map +1 -0
- package/dist/transforms/expand-logical-assignment.d.ts +22 -0
- package/dist/transforms/expand-logical-assignment.d.ts.map +1 -0
- package/dist/transforms/expand-logical-assignment.js +73 -0
- package/dist/transforms/expand-logical-assignment.js.map +1 -0
- package/dist/transforms/extract-object-properties.d.ts +21 -0
- package/dist/transforms/extract-object-properties.d.ts.map +1 -0
- package/dist/transforms/extract-object-properties.js +340 -0
- package/dist/transforms/extract-object-properties.js.map +1 -0
- package/dist/transforms/fold-builtin-methods.d.ts +23 -0
- package/dist/transforms/fold-builtin-methods.d.ts.map +1 -0
- package/dist/transforms/fold-builtin-methods.js +839 -0
- package/dist/transforms/fold-builtin-methods.js.map +1 -0
- package/dist/transforms/fold-constants.d.ts +16 -0
- package/dist/transforms/fold-constants.d.ts.map +1 -0
- package/dist/transforms/fold-constants.js +421 -0
- package/dist/transforms/fold-constants.js.map +1 -0
- package/dist/transforms/for-to-while.d.ts +29 -0
- package/dist/transforms/for-to-while.d.ts.map +1 -0
- package/dist/transforms/for-to-while.js +91 -0
- package/dist/transforms/for-to-while.js.map +1 -0
- package/dist/transforms/function-declaration-to-expression.d.ts +28 -0
- package/dist/transforms/function-declaration-to-expression.d.ts.map +1 -0
- package/dist/transforms/function-declaration-to-expression.js +95 -0
- package/dist/transforms/function-declaration-to-expression.js.map +1 -0
- package/dist/transforms/inline-functions.d.ts +16 -0
- package/dist/transforms/inline-functions.d.ts.map +1 -0
- package/dist/transforms/inline-functions.js +896 -0
- package/dist/transforms/inline-functions.js.map +1 -0
- package/dist/transforms/logical-to-ternary.d.ts +20 -0
- package/dist/transforms/logical-to-ternary.d.ts.map +1 -0
- package/dist/transforms/logical-to-ternary.js +78 -0
- package/dist/transforms/logical-to-ternary.js.map +1 -0
- package/dist/transforms/mangle-properties.d.ts +27 -0
- package/dist/transforms/mangle-properties.d.ts.map +1 -0
- package/dist/transforms/mangle-properties.js +703 -0
- package/dist/transforms/mangle-properties.js.map +1 -0
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts +18 -0
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts.map +1 -0
- package/dist/transforms/nullish-coalescing-to-ternary.js +61 -0
- package/dist/transforms/nullish-coalescing-to-ternary.js.map +1 -0
- package/dist/transforms/numbers-to-strings.d.ts +19 -0
- package/dist/transforms/numbers-to-strings.d.ts.map +1 -0
- package/dist/transforms/numbers-to-strings.js +51 -0
- package/dist/transforms/numbers-to-strings.js.map +1 -0
- package/dist/transforms/object-method-to-property.d.ts +34 -0
- package/dist/transforms/object-method-to-property.d.ts.map +1 -0
- package/dist/transforms/object-method-to-property.js +78 -0
- package/dist/transforms/object-method-to-property.js.map +1 -0
- package/dist/transforms/optional-chaining-to-ternary.d.ts +19 -0
- package/dist/transforms/optional-chaining-to-ternary.d.ts.map +1 -0
- package/dist/transforms/optional-chaining-to-ternary.js +206 -0
- package/dist/transforms/optional-chaining-to-ternary.js.map +1 -0
- package/dist/transforms/pack-declarations-into-parameters.d.ts +22 -0
- package/dist/transforms/pack-declarations-into-parameters.d.ts.map +1 -0
- package/dist/transforms/pack-declarations-into-parameters.js +208 -0
- package/dist/transforms/pack-declarations-into-parameters.js.map +1 -0
- package/dist/transforms/remove-anonymous-function-names.d.ts +17 -0
- package/dist/transforms/remove-anonymous-function-names.d.ts.map +1 -0
- package/dist/transforms/remove-anonymous-function-names.js +72 -0
- package/dist/transforms/remove-anonymous-function-names.js.map +1 -0
- package/dist/transforms/remove-unreachable-code.d.ts +21 -0
- package/dist/transforms/remove-unreachable-code.d.ts.map +1 -0
- package/dist/transforms/remove-unreachable-code.js +103 -0
- package/dist/transforms/remove-unreachable-code.js.map +1 -0
- package/dist/transforms/remove-unused-code.d.ts +18 -0
- package/dist/transforms/remove-unused-code.d.ts.map +1 -0
- package/dist/transforms/remove-unused-code.js +249 -0
- package/dist/transforms/remove-unused-code.js.map +1 -0
- package/dist/transforms/rename-identifiers.d.ts +24 -0
- package/dist/transforms/rename-identifiers.d.ts.map +1 -0
- package/dist/transforms/rename-identifiers.js +264 -0
- package/dist/transforms/rename-identifiers.js.map +1 -0
- package/dist/transforms/specials-to-strings.d.ts +30 -0
- package/dist/transforms/specials-to-strings.d.ts.map +1 -0
- package/dist/transforms/specials-to-strings.js +101 -0
- package/dist/transforms/specials-to-strings.js.map +1 -0
- package/dist/transforms/switch-to-if.d.ts +28 -0
- package/dist/transforms/switch-to-if.d.ts.map +1 -0
- package/dist/transforms/switch-to-if.js +279 -0
- package/dist/transforms/switch-to-if.js.map +1 -0
- package/dist/transforms/ternary-to-if.d.ts +20 -0
- package/dist/transforms/ternary-to-if.d.ts.map +1 -0
- package/dist/transforms/ternary-to-if.js +315 -0
- package/dist/transforms/ternary-to-if.js.map +1 -0
- package/dist/transforms/update-to-assignment.d.ts +26 -0
- package/dist/transforms/update-to-assignment.d.ts.map +1 -0
- package/dist/transforms/update-to-assignment.js +120 -0
- package/dist/transforms/update-to-assignment.js.map +1 -0
- package/dist/transforms/yodify-conditions.d.ts +22 -0
- package/dist/transforms/yodify-conditions.d.ts.map +1 -0
- package/dist/transforms/yodify-conditions.js +91 -0
- package/dist/transforms/yodify-conditions.js.map +1 -0
- package/dist/utils/ast.d.ts +10 -0
- package/dist/utils/ast.d.ts.map +1 -0
- package/dist/utils/ast.js +112 -0
- package/dist/utils/ast.js.map +1 -0
- package/dist/utils/change-tracking.d.ts +8 -0
- package/dist/utils/change-tracking.d.ts.map +1 -0
- package/dist/utils/change-tracking.js +8 -0
- package/dist/utils/change-tracking.js.map +1 -0
- package/dist/utils/dom-properties.d.ts +2 -0
- package/dist/utils/dom-properties.d.ts.map +1 -0
- package/dist/utils/dom-properties.js +9252 -0
- package/dist/utils/dom-properties.js.map +1 -0
- package/dist/utils/evaluation-order.d.ts +4 -0
- package/dist/utils/evaluation-order.d.ts.map +1 -0
- package/dist/utils/evaluation-order.js +152 -0
- package/dist/utils/evaluation-order.js.map +1 -0
- package/dist/utils/literal.d.ts +5 -0
- package/dist/utils/literal.d.ts.map +1 -0
- package/dist/utils/literal.js +90 -0
- package/dist/utils/literal.js.map +1 -0
- package/dist/utils/logical-lowering.d.ts +4 -0
- package/dist/utils/logical-lowering.d.ts.map +1 -0
- package/dist/utils/logical-lowering.js +104 -0
- package/dist/utils/logical-lowering.js.map +1 -0
- package/dist/utils/loop-lowering.d.ts +23 -0
- package/dist/utils/loop-lowering.d.ts.map +1 -0
- package/dist/utils/loop-lowering.js +88 -0
- package/dist/utils/loop-lowering.js.map +1 -0
- package/dist/utils/paths.d.ts +9 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +90 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/random.d.ts +3 -0
- package/dist/utils/random.d.ts.map +1 -0
- package/dist/utils/random.js +22 -0
- package/dist/utils/random.js.map +1 -0
- package/dist/utils/string-generator.d.ts +37 -0
- package/dist/utils/string-generator.d.ts.map +1 -0
- package/dist/utils/string-generator.js +175 -0
- package/dist/utils/string-generator.js.map +1 -0
- package/package.json +76 -0
- package/src/analysis/constant.ts +310 -0
- package/src/analysis/document-order.ts +141 -0
- package/src/analysis/inlineability.ts +336 -0
- package/src/analysis/purity.ts +315 -0
- package/src/index.ts +2 -0
- package/src/obfuscator.ts +271 -0
- package/src/options.ts +114 -0
- package/src/preparation/dot-to-bracket.ts +41 -0
- package/src/preparation/expand-destructuring.ts +211 -0
- package/src/preparation/expand-template-literals.ts +92 -0
- package/src/preparation/rewrite-class-fields.ts +320 -0
- package/src/preparation/split-sequence-expressions.ts +40 -0
- package/src/preparation/split-variable-declarations.ts +39 -0
- package/src/preparation/stringify-object-keys.ts +107 -0
- package/src/preparation/wrap-single-statements.ts +63 -0
- package/src/transforms/arguments-to-parameters.ts +187 -0
- package/src/transforms/arrow-to-function.ts +225 -0
- package/src/transforms/collapse-single-use-temps.ts +957 -0
- package/src/transforms/const-let-to-var.ts +246 -0
- package/src/transforms/const-to-let.ts +38 -0
- package/src/transforms/do-while-to-while.ts +69 -0
- package/src/transforms/drop-console.ts +119 -0
- package/src/transforms/drop-debugger.ts +38 -0
- package/src/transforms/expand-binary-assignment.ts +94 -0
- package/src/transforms/expand-logical-assignment.ts +84 -0
- package/src/transforms/extract-object-properties.ts +404 -0
- package/src/transforms/fold-builtin-methods.ts +949 -0
- package/src/transforms/fold-constants.ts +462 -0
- package/src/transforms/for-to-while.ts +109 -0
- package/src/transforms/function-declaration-to-expression.ts +108 -0
- package/src/transforms/inline-functions.ts +1074 -0
- package/src/transforms/logical-to-ternary.ts +92 -0
- package/src/transforms/mangle-properties.ts +819 -0
- package/src/transforms/nullish-coalescing-to-ternary.ts +77 -0
- package/src/transforms/numbers-to-strings.ts +61 -0
- package/src/transforms/object-method-to-property.ts +86 -0
- package/src/transforms/optional-chaining-to-ternary.ts +225 -0
- package/src/transforms/pack-declarations-into-parameters.ts +233 -0
- package/src/transforms/remove-anonymous-function-names.ts +84 -0
- package/src/transforms/remove-unreachable-code.ts +115 -0
- package/src/transforms/remove-unused-code.ts +296 -0
- package/src/transforms/rename-identifiers.ts +289 -0
- package/src/transforms/specials-to-strings.ts +116 -0
- package/src/transforms/switch-to-if.ts +339 -0
- package/src/transforms/ternary-to-if.ts +387 -0
- package/src/transforms/update-to-assignment.ts +132 -0
- package/src/transforms/yodify-conditions.ts +103 -0
- package/src/utils/ast.ts +129 -0
- package/src/utils/change-tracking.ts +15 -0
- package/src/utils/dom-properties.ts +9252 -0
- package/src/utils/evaluation-order.ts +178 -0
- package/src/utils/literal.ts +96 -0
- package/src/utils/logical-lowering.ts +132 -0
- package/src/utils/loop-lowering.ts +109 -0
- package/src/utils/paths.ts +103 -0
- package/src/utils/random.ts +22 -0
- package/src/utils/string-generator.ts +206 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import * as t from '@babel/types';
|
|
2
|
+
import { isSideEffectFree } from '../analysis/purity.js';
|
|
3
|
+
import { isStandaloneDeclaration } from '../utils/paths.js';
|
|
4
|
+
// Lowers a short-circuit expression assigned to a bare identifier:
|
|
5
|
+
//
|
|
6
|
+
// x = L;
|
|
7
|
+
// if (<fallbackTest(x)>) x = R;
|
|
8
|
+
//
|
|
9
|
+
// `fallbackTest` selects `!x`, `x`, or `x == null`. The parent must accept a
|
|
10
|
+
// multi-statement replacement.
|
|
11
|
+
export function lowerLogicalWriteStatement(path, fallbackTest) {
|
|
12
|
+
const { node } = path;
|
|
13
|
+
const parent = path.parentPath;
|
|
14
|
+
if (!parent) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (parent.isVariableDeclarator() &&
|
|
18
|
+
parent.node.init === node &&
|
|
19
|
+
t.isIdentifier(parent.node.id)) {
|
|
20
|
+
const declStmt = parent.parentPath;
|
|
21
|
+
if (!declStmt?.isVariableDeclaration() ||
|
|
22
|
+
// The split would emit illegal `const x;` and then write it.
|
|
23
|
+
declStmt.node.kind === 'const' ||
|
|
24
|
+
declStmt.node.declarations.length !== 1 ||
|
|
25
|
+
!isStandaloneDeclaration(declStmt)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const target = parent.node.id;
|
|
29
|
+
// The split writes `x` before evaluating the right side. Refuse any right
|
|
30
|
+
// side that could observe the new value or the ended TDZ.
|
|
31
|
+
if (rightCanObserveTarget(node.right, target.name)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
declStmt.replaceWithMultiple([
|
|
35
|
+
t.variableDeclaration(declStmt.node.kind, [
|
|
36
|
+
t.variableDeclarator(t.cloneNode(target), node.left),
|
|
37
|
+
]),
|
|
38
|
+
guardedReassignment(target, fallbackTest, node.right),
|
|
39
|
+
]);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
if (parent.isAssignmentExpression() &&
|
|
43
|
+
parent.node.operator === '=' &&
|
|
44
|
+
parent.node.right === node &&
|
|
45
|
+
t.isIdentifier(parent.node.left)) {
|
|
46
|
+
const exprStmt = parent.parentPath;
|
|
47
|
+
if (!exprStmt?.isExpressionStatement() || exprStmt.node.expression !== parent.node) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const target = parent.node.left;
|
|
51
|
+
// An unresolved name may be a global accessor. The split adds a getter read
|
|
52
|
+
// and can add a second setter call.
|
|
53
|
+
if (!path.scope.getBinding(target.name)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
// Writing first would change `x = 0 || x` before the right side reads `x`.
|
|
57
|
+
if (!isSideEffectFree(node.right, path.scope, path) ||
|
|
58
|
+
referencesName(node.right, target.name)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
exprStmt.replaceWithMultiple([
|
|
62
|
+
t.expressionStatement(t.assignmentExpression('=', t.cloneNode(target), node.left)),
|
|
63
|
+
guardedReassignment(target, fallbackTest, node.right),
|
|
64
|
+
]);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
// Calls, getters, and suspension can observe the target through code outside the
|
|
70
|
+
// expression, even when the target name does not appear directly.
|
|
71
|
+
function rightCanObserveTarget(rightNode, targetName) {
|
|
72
|
+
let observes = false;
|
|
73
|
+
t.traverseFast(rightNode, (node) => {
|
|
74
|
+
if ((t.isIdentifier(node) && node.name === targetName) ||
|
|
75
|
+
t.isCallExpression(node) ||
|
|
76
|
+
t.isOptionalCallExpression(node) ||
|
|
77
|
+
t.isNewExpression(node) ||
|
|
78
|
+
t.isTaggedTemplateExpression(node) ||
|
|
79
|
+
t.isMemberExpression(node) ||
|
|
80
|
+
t.isOptionalMemberExpression(node) ||
|
|
81
|
+
t.isAwaitExpression(node) ||
|
|
82
|
+
t.isYieldExpression(node)) {
|
|
83
|
+
observes = true;
|
|
84
|
+
}
|
|
85
|
+
return observes ? t.traverseFast.stop : undefined;
|
|
86
|
+
});
|
|
87
|
+
return observes;
|
|
88
|
+
}
|
|
89
|
+
function referencesName(node, name) {
|
|
90
|
+
let found = false;
|
|
91
|
+
t.traverseFast(node, (child) => {
|
|
92
|
+
if (!found && t.isIdentifier(child) && child.name === name) {
|
|
93
|
+
found = true;
|
|
94
|
+
}
|
|
95
|
+
return found ? t.traverseFast.skip : undefined;
|
|
96
|
+
});
|
|
97
|
+
return found;
|
|
98
|
+
}
|
|
99
|
+
function guardedReassignment(target, fallbackTest, value) {
|
|
100
|
+
return t.ifStatement(fallbackTest(t.cloneNode(target)), t.blockStatement([
|
|
101
|
+
t.expressionStatement(t.assignmentExpression('=', t.cloneNode(target), value)),
|
|
102
|
+
]));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=logical-lowering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logical-lowering.js","sourceRoot":"","sources":["../../src/utils/logical-lowering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { NodePath } from '@babel/traverse';
|
|
2
|
+
import * as t from '@babel/types';
|
|
3
|
+
/**
|
|
4
|
+
* Collects labels whose body is this loop. Their `continue` statements must be
|
|
5
|
+
* redirected after lowering. A hoisted initializer belongs outside the
|
|
6
|
+
* outermost label.
|
|
7
|
+
*/
|
|
8
|
+
export declare function collectLoopLabels(path: NodePath<t.Statement>): {
|
|
9
|
+
outermost: NodePath<t.Statement>;
|
|
10
|
+
ourLabels: Set<string>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Generates an inner-block label after reserving labels above and inside the
|
|
14
|
+
* loop. `scope.generateUid` alone can miss an enclosing user label.
|
|
15
|
+
*/
|
|
16
|
+
export declare function generateLoopLabel(path: NodePath<t.Statement>, hint: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Redirects this loop's `continue` statements to the lowered inner block.
|
|
19
|
+
* Nested loops, other labels, and nested functions stay untouched. The count
|
|
20
|
+
* lets callers omit an unused label.
|
|
21
|
+
*/
|
|
22
|
+
export declare function redirectContinues(rootPath: NodePath, innerLabel: string, ourLabels: Set<string>): number;
|
|
23
|
+
//# sourceMappingURL=loop-lowering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-lowering.d.ts","sourceRoot":"","sources":["../../src/utils/loop-lowering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,iBAAiB,CAAA;AACxD,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAEjC;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG;IAC9D,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAChC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACvB,CAYA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBnF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,MAAM,CAIR"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as t from '@babel/types';
|
|
2
|
+
/**
|
|
3
|
+
* Collects labels whose body is this loop. Their `continue` statements must be
|
|
4
|
+
* redirected after lowering. A hoisted initializer belongs outside the
|
|
5
|
+
* outermost label.
|
|
6
|
+
*/
|
|
7
|
+
export function collectLoopLabels(path) {
|
|
8
|
+
const ourLabels = new Set();
|
|
9
|
+
let outermost = path;
|
|
10
|
+
for (;;) {
|
|
11
|
+
const parent = outermost.parentPath;
|
|
12
|
+
if (!parent?.isLabeledStatement() || parent.node.body !== outermost.node) {
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
outermost = parent;
|
|
16
|
+
ourLabels.add(parent.node.label.name);
|
|
17
|
+
}
|
|
18
|
+
return { outermost, ourLabels };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generates an inner-block label after reserving labels above and inside the
|
|
22
|
+
* loop. `scope.generateUid` alone can miss an enclosing user label.
|
|
23
|
+
*/
|
|
24
|
+
export function generateLoopLabel(path, hint) {
|
|
25
|
+
const taken = new Set();
|
|
26
|
+
let ancestor = path.parentPath;
|
|
27
|
+
while (ancestor) {
|
|
28
|
+
if (ancestor.isLabeledStatement()) {
|
|
29
|
+
taken.add(ancestor.node.label.name);
|
|
30
|
+
}
|
|
31
|
+
ancestor = ancestor.parentPath;
|
|
32
|
+
}
|
|
33
|
+
path.traverse({
|
|
34
|
+
LabeledStatement(inner) {
|
|
35
|
+
taken.add(inner.node.label.name);
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
// `generateUid` supplies its own counter, even after stripping hint digits.
|
|
39
|
+
let name = path.scope.generateUid(hint);
|
|
40
|
+
while (taken.has(name)) {
|
|
41
|
+
name = path.scope.generateUid(hint);
|
|
42
|
+
}
|
|
43
|
+
return name;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Redirects this loop's `continue` statements to the lowered inner block.
|
|
47
|
+
* Nested loops, other labels, and nested functions stay untouched. The count
|
|
48
|
+
* lets callers omit an unused label.
|
|
49
|
+
*/
|
|
50
|
+
export function redirectContinues(rootPath, innerLabel, ourLabels) {
|
|
51
|
+
const state = { count: 0, innerLabel, ourLabels, rootPath };
|
|
52
|
+
rootPath.traverse(redirectVisitor, state);
|
|
53
|
+
return state.count;
|
|
54
|
+
}
|
|
55
|
+
const redirectVisitor = {
|
|
56
|
+
Function(path) {
|
|
57
|
+
path.skip();
|
|
58
|
+
},
|
|
59
|
+
ContinueStatement(path, state) {
|
|
60
|
+
const { label } = path.node;
|
|
61
|
+
if (!label) {
|
|
62
|
+
if (!hasInterposedLoop(path, state.rootPath)) {
|
|
63
|
+
path.replaceWith(t.breakStatement(t.identifier(state.innerLabel)));
|
|
64
|
+
state.count++;
|
|
65
|
+
}
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (state.ourLabels.has(label.name)) {
|
|
69
|
+
path.replaceWith(t.breakStatement(t.identifier(state.innerLabel)));
|
|
70
|
+
state.count++;
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
function hasInterposedLoop(path, rootPath) {
|
|
75
|
+
let current = path.parentPath;
|
|
76
|
+
while (current && current !== rootPath) {
|
|
77
|
+
if (current.isForStatement() ||
|
|
78
|
+
current.isForInStatement() ||
|
|
79
|
+
current.isForOfStatement() ||
|
|
80
|
+
current.isWhileStatement() ||
|
|
81
|
+
current.isDoWhileStatement()) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
current = current.parentPath;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=loop-lowering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-lowering.js","sourceRoot":"","sources":["../../src/utils/loop-lowering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { NodePath } from '@babel/traverse';
|
|
2
|
+
import * as t from '@babel/types';
|
|
3
|
+
export declare function isStandaloneDeclaration(declPath: NodePath<t.VariableDeclaration>): boolean;
|
|
4
|
+
export declare function referencesOrWritesVariable(path: NodePath<t.Identifier>): boolean;
|
|
5
|
+
export declare function isCalleeOrTagOf(path: NodePath): boolean;
|
|
6
|
+
export declare function isInStrictContext(path: NodePath): boolean;
|
|
7
|
+
export declare function hasAnnexBFunctionAlias(path: NodePath): boolean;
|
|
8
|
+
export declare function hasConstantViolation(path: NodePath<t.VariableDeclaration>): boolean;
|
|
9
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAe1F;AAID,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAQhF;AAGD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAYvD;AAGD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAiBzD;AAQD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAiB9D;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAQnF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as t from '@babel/types';
|
|
2
|
+
// Only statement-list positions accept several replacements. Loop heads do not.
|
|
3
|
+
export function isStandaloneDeclaration(declPath) {
|
|
4
|
+
const owner = declPath.parentPath;
|
|
5
|
+
if (!owner) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
if (owner.isForStatement() && owner.node.init === declPath.node) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if (owner.isForInStatement() && owner.node.left === declPath.node) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
if (owner.isForOfStatement() && owner.node.left === declPath.node) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return owner.isBlock() || owner.isSwitchCase();
|
|
18
|
+
}
|
|
19
|
+
// Babel treats destructured writes as binding identifiers. Labels must still be
|
|
20
|
+
// excluded because they bind no variable.
|
|
21
|
+
export function referencesOrWritesVariable(path) {
|
|
22
|
+
if (path.parentPath?.isLabeledStatement()) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
// Separate calls avoid an incorrect `never` narrowing across `||`.
|
|
26
|
+
const isRead = path.isReferencedIdentifier();
|
|
27
|
+
const isWrite = path.isBindingIdentifier();
|
|
28
|
+
return isRead || isWrite;
|
|
29
|
+
}
|
|
30
|
+
// Replacing a callee or tag member with a bare value would lose its `this`.
|
|
31
|
+
export function isCalleeOrTagOf(path) {
|
|
32
|
+
const parent = path.parentPath;
|
|
33
|
+
if (!parent) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if ((parent.isCallExpression() || parent.isOptionalCallExpression()) &&
|
|
37
|
+
parent.node.callee === path.node) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return parent.isTaggedTemplateExpression() && parent.node.tag === path.node;
|
|
41
|
+
}
|
|
42
|
+
// Strictness comes from modules, classes, or an enclosing directive prologue.
|
|
43
|
+
export function isInStrictContext(path) {
|
|
44
|
+
for (let current = path; current; current = current.parentPath) {
|
|
45
|
+
if (current.isClass()) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
if (current.isProgram()) {
|
|
49
|
+
return current.node.sourceType === 'module' || hasUseStrictDirective(current.node.directives);
|
|
50
|
+
}
|
|
51
|
+
if (current.isFunction() &&
|
|
52
|
+
t.isBlockStatement(current.node.body) &&
|
|
53
|
+
hasUseStrictDirective(current.node.body.directives)) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
function hasUseStrictDirective(directives) {
|
|
60
|
+
return directives.some((directive) => directive.value.value === 'use strict');
|
|
61
|
+
}
|
|
62
|
+
// ECMA-262 B.3.3 gives sloppy block-level functions a `var` alias that Babel
|
|
63
|
+
// omits from the enclosing scope. Renaming, moving, or removing one can expose it.
|
|
64
|
+
export function hasAnnexBFunctionAlias(path) {
|
|
65
|
+
if (!path.isFunctionDeclaration()) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const parent = path.parentPath;
|
|
69
|
+
if (!parent || parent.isProgram()) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (parent.isBlockStatement() &&
|
|
73
|
+
parent.key === 'body' &&
|
|
74
|
+
parent.parentPath != null &&
|
|
75
|
+
parent.parentPath.isFunction()) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
return !isInStrictContext(parent);
|
|
79
|
+
}
|
|
80
|
+
// A later write to `const` must keep throwing after transformation.
|
|
81
|
+
export function hasConstantViolation(path) {
|
|
82
|
+
for (const name of Object.keys(path.getBindingIdentifiers())) {
|
|
83
|
+
const binding = path.scope.getBinding(name);
|
|
84
|
+
if (binding && binding.constantViolations.length > 0) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../src/utils/random.ts"],"names":[],"mappings":"AACA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CASrD;AAGD,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,CAAC,EAAE,CAQpE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Mulberry32 is deterministic per seed and is not cryptographic.
|
|
2
|
+
export function mulberry32(seed) {
|
|
3
|
+
let state = seed >>> 0;
|
|
4
|
+
return () => {
|
|
5
|
+
state = (state + 0x6d_2b_79_f5) >>> 0;
|
|
6
|
+
let t = state;
|
|
7
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
8
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
9
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4_294_967_296;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
// Fisher-Yates shuffle, in place.
|
|
13
|
+
export function shuffleInPlace(items, rng) {
|
|
14
|
+
for (let index = items.length - 1; index > 0; index--) {
|
|
15
|
+
const pick = Math.floor(rng() * (index + 1));
|
|
16
|
+
const swapped = items[index];
|
|
17
|
+
items[index] = items[pick];
|
|
18
|
+
items[pick] = swapped;
|
|
19
|
+
}
|
|
20
|
+
return items;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=random.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/utils/random.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,CAAA;IACtB,OAAO,GAAG,EAAE;QACV,KAAK,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QACrC,IAAI,CAAC,GAAG,KAAK,CAAA;QACb,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;QACzC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,aAAa,CAAA;IACjD,CAAC,CAAA;AACH,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,cAAc,CAAI,KAAU,EAAE,GAAiB;IAC7D,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAE,CAAA;QAC7B,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAE,CAAA;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;IACvB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifier styles supported by `StringGenerator`. An array chooses a style
|
|
3
|
+
* for each emission with the seeded random source.
|
|
4
|
+
*
|
|
5
|
+
* - `mangled` emits bijective base-N names, shortest first
|
|
6
|
+
* - `hexadecimal` emits `_0x` plus 4-7 hexadecimal digits
|
|
7
|
+
* - `randomized` emits 4-7 random identifier characters
|
|
8
|
+
* - `zeroWidth` pads a reserved word with U+200C
|
|
9
|
+
* - `number` emits monotonic names such as `var_1` and `var_2`
|
|
10
|
+
*/
|
|
11
|
+
export type StringGeneratorMode = 'mangled' | 'hexadecimal' | 'randomized' | 'zeroWidth' | 'number';
|
|
12
|
+
/** A single style, or an array of styles to mix uniformly per emission. */
|
|
13
|
+
export type StringGeneratorModeOption = StringGeneratorMode | readonly StringGeneratorMode[];
|
|
14
|
+
export declare class StringGenerator {
|
|
15
|
+
private counter;
|
|
16
|
+
private cache;
|
|
17
|
+
private emitted;
|
|
18
|
+
private readonly modes;
|
|
19
|
+
private readonly rng;
|
|
20
|
+
private mangledAlphabet;
|
|
21
|
+
private mangledCursor;
|
|
22
|
+
private zeroWidthSize;
|
|
23
|
+
private zeroWidthPool;
|
|
24
|
+
private numberCursor;
|
|
25
|
+
constructor(option: StringGeneratorModeOption, rng: () => number);
|
|
26
|
+
next(): string;
|
|
27
|
+
at(index: number): string;
|
|
28
|
+
private compute;
|
|
29
|
+
private pickMode;
|
|
30
|
+
private advance;
|
|
31
|
+
private advanceMangled;
|
|
32
|
+
private advanceHexadecimal;
|
|
33
|
+
private advanceRandomized;
|
|
34
|
+
private advanceZeroWidth;
|
|
35
|
+
private advanceNumber;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=string-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-generator.d.ts","sourceRoot":"","sources":["../../src/utils/string-generator.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAA;AAEnG,2EAA2E;AAC3E,MAAM,MAAM,yBAAyB,GAAG,mBAAmB,GAAG,SAAS,mBAAmB,EAAE,CAAA;AAoE5F,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAElC,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,YAAY,CAAI;IAExB,YAAY,MAAM,EAAE,yBAAyB,EAAE,GAAG,EAAE,MAAM,MAAM,EAY/D;IAED,IAAI,IAAI,MAAM,CAEb;IAED,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKxB;IAED,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,OAAO;IAgBf,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { shuffleInPlace } from '../utils/random.js';
|
|
2
|
+
// Reserved words and sensitive globals cannot be emitted bare. Zero-width mode
|
|
3
|
+
// makes entries from this same pool legal with ZWNJ padding.
|
|
4
|
+
const RESERVED = new Set([
|
|
5
|
+
'await',
|
|
6
|
+
'break',
|
|
7
|
+
'case',
|
|
8
|
+
'catch',
|
|
9
|
+
'class',
|
|
10
|
+
'const',
|
|
11
|
+
'continue',
|
|
12
|
+
'debugger',
|
|
13
|
+
'default',
|
|
14
|
+
'delete',
|
|
15
|
+
'do',
|
|
16
|
+
'else',
|
|
17
|
+
'enum',
|
|
18
|
+
'export',
|
|
19
|
+
'extends',
|
|
20
|
+
'false',
|
|
21
|
+
'finally',
|
|
22
|
+
'for',
|
|
23
|
+
'function',
|
|
24
|
+
'if',
|
|
25
|
+
'implements',
|
|
26
|
+
'import',
|
|
27
|
+
'in',
|
|
28
|
+
'instanceof',
|
|
29
|
+
'interface',
|
|
30
|
+
'let',
|
|
31
|
+
'new',
|
|
32
|
+
'null',
|
|
33
|
+
'package',
|
|
34
|
+
'private',
|
|
35
|
+
'protected',
|
|
36
|
+
'public',
|
|
37
|
+
'return',
|
|
38
|
+
'static',
|
|
39
|
+
'super',
|
|
40
|
+
'switch',
|
|
41
|
+
'this',
|
|
42
|
+
'throw',
|
|
43
|
+
'true',
|
|
44
|
+
'try',
|
|
45
|
+
'typeof',
|
|
46
|
+
'var',
|
|
47
|
+
'void',
|
|
48
|
+
'while',
|
|
49
|
+
'with',
|
|
50
|
+
'yield',
|
|
51
|
+
'async',
|
|
52
|
+
'of',
|
|
53
|
+
'arguments',
|
|
54
|
+
'eval',
|
|
55
|
+
'undefined',
|
|
56
|
+
'NaN',
|
|
57
|
+
'Infinity',
|
|
58
|
+
]);
|
|
59
|
+
const MANGLED_ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$';
|
|
60
|
+
const HEX_ALPHABET = '0123456789abcdef';
|
|
61
|
+
const IDENT_START = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$';
|
|
62
|
+
const IDENT_CONT = `${IDENT_START}0123456789`;
|
|
63
|
+
// U+200C is legal after the first identifier character and pads a keyword.
|
|
64
|
+
const ZWNJ = '\u200C';
|
|
65
|
+
// Each index is stable per instance, allowing scopes to reuse short names.
|
|
66
|
+
export class StringGenerator {
|
|
67
|
+
counter = 0;
|
|
68
|
+
cache = [];
|
|
69
|
+
emitted = new Set();
|
|
70
|
+
modes;
|
|
71
|
+
rng;
|
|
72
|
+
mangledAlphabet;
|
|
73
|
+
mangledCursor = 0;
|
|
74
|
+
zeroWidthSize = 0;
|
|
75
|
+
zeroWidthPool = [];
|
|
76
|
+
numberCursor = 0;
|
|
77
|
+
constructor(option, rng) {
|
|
78
|
+
this.rng = rng;
|
|
79
|
+
const modeList = Array.isArray(option) ? [...option] : [option];
|
|
80
|
+
if (modeList.length === 0) {
|
|
81
|
+
throw new Error('StringGenerator requires at least one mode');
|
|
82
|
+
}
|
|
83
|
+
this.modes = modeList;
|
|
84
|
+
const alphabet = [...MANGLED_ALPHABET];
|
|
85
|
+
shuffleInPlace(alphabet, rng);
|
|
86
|
+
this.mangledAlphabet = alphabet.join('');
|
|
87
|
+
}
|
|
88
|
+
next() {
|
|
89
|
+
return this.at(this.counter++);
|
|
90
|
+
}
|
|
91
|
+
at(index) {
|
|
92
|
+
while (this.cache.length <= index) {
|
|
93
|
+
this.cache.push(this.compute());
|
|
94
|
+
}
|
|
95
|
+
return this.cache[index];
|
|
96
|
+
}
|
|
97
|
+
compute() {
|
|
98
|
+
let candidate;
|
|
99
|
+
do {
|
|
100
|
+
candidate = this.advance(this.pickMode());
|
|
101
|
+
} while (RESERVED.has(candidate) || this.emitted.has(candidate));
|
|
102
|
+
this.emitted.add(candidate);
|
|
103
|
+
return candidate;
|
|
104
|
+
}
|
|
105
|
+
pickMode() {
|
|
106
|
+
if (this.modes.length === 1) {
|
|
107
|
+
return this.modes[0];
|
|
108
|
+
}
|
|
109
|
+
return this.modes[Math.floor(this.rng() * this.modes.length)];
|
|
110
|
+
}
|
|
111
|
+
advance(mode) {
|
|
112
|
+
switch (mode) {
|
|
113
|
+
case 'mangled':
|
|
114
|
+
return this.advanceMangled();
|
|
115
|
+
case 'hexadecimal':
|
|
116
|
+
return this.advanceHexadecimal();
|
|
117
|
+
case 'randomized':
|
|
118
|
+
return this.advanceRandomized();
|
|
119
|
+
case 'zeroWidth':
|
|
120
|
+
return this.advanceZeroWidth();
|
|
121
|
+
case 'number':
|
|
122
|
+
return this.advanceNumber();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Bijective base-N yields unique names in shortest-first order.
|
|
126
|
+
advanceMangled() {
|
|
127
|
+
let cursor = ++this.mangledCursor;
|
|
128
|
+
const len = this.mangledAlphabet.length;
|
|
129
|
+
let name = '';
|
|
130
|
+
while (cursor > 0) {
|
|
131
|
+
const remainder = (cursor - 1) % len;
|
|
132
|
+
name = this.mangledAlphabet[remainder] + name;
|
|
133
|
+
cursor = ((cursor - remainder) / len) | 0;
|
|
134
|
+
}
|
|
135
|
+
return name;
|
|
136
|
+
}
|
|
137
|
+
advanceHexadecimal() {
|
|
138
|
+
const len = 4 + Math.floor(this.rng() * 4);
|
|
139
|
+
let hex = '';
|
|
140
|
+
for (let index = 0; index < len; index++) {
|
|
141
|
+
hex += HEX_ALPHABET[Math.floor(this.rng() * HEX_ALPHABET.length)];
|
|
142
|
+
}
|
|
143
|
+
return `_0x${hex}`;
|
|
144
|
+
}
|
|
145
|
+
advanceRandomized() {
|
|
146
|
+
const len = 4 + Math.floor(this.rng() * 4);
|
|
147
|
+
let result = IDENT_START[Math.floor(this.rng() * IDENT_START.length)];
|
|
148
|
+
for (let index = 1; index < len; index++) {
|
|
149
|
+
result += IDENT_CONT[Math.floor(this.rng() * IDENT_CONT.length)];
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
// ZWNJ padding makes reserved words legal. Exhausting one size grows all
|
|
154
|
+
// entries for the next round.
|
|
155
|
+
advanceZeroWidth() {
|
|
156
|
+
while (this.zeroWidthPool.length === 0) {
|
|
157
|
+
this.zeroWidthSize++;
|
|
158
|
+
const built = [];
|
|
159
|
+
for (const word of RESERVED) {
|
|
160
|
+
const padding = Math.max(this.zeroWidthSize - word.length, 1);
|
|
161
|
+
const candidate = word + ZWNJ.repeat(padding);
|
|
162
|
+
if (candidate.length === this.zeroWidthSize) {
|
|
163
|
+
built.push(candidate);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
shuffleInPlace(built, this.rng);
|
|
167
|
+
this.zeroWidthPool = built;
|
|
168
|
+
}
|
|
169
|
+
return this.zeroWidthPool.pop();
|
|
170
|
+
}
|
|
171
|
+
advanceNumber() {
|
|
172
|
+
return `var_${++this.numberCursor}`;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=string-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-generator.js","sourceRoot":"","sources":["../../src/utils/string-generator.ts"],"names":[],"mappings":"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"}
|