webfuscator 1.2.0 → 1.3.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/dist/analysis/constant.js +3 -4
- package/dist/analysis/constant.js.map +1 -1
- package/dist/analysis/inlineability.d.ts.map +1 -1
- package/dist/analysis/inlineability.js +37 -25
- package/dist/analysis/inlineability.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 +24 -4
- package/dist/options.d.ts.map +1 -1
- package/dist/preparation/expand-destructuring.d.ts +3 -3
- package/dist/preparation/expand-destructuring.js +6 -6
- package/dist/preparation/expand-destructuring.js.map +1 -1
- package/dist/transforms/arrow-to-function.js +3 -5
- package/dist/transforms/arrow-to-function.js.map +1 -1
- package/dist/transforms/conceal-strings.d.ts +57 -0
- package/dist/transforms/conceal-strings.d.ts.map +1 -0
- package/dist/transforms/conceal-strings.js +361 -0
- package/dist/transforms/conceal-strings.js.map +1 -0
- package/dist/transforms/const-let-to-var.d.ts +3 -3
- package/dist/transforms/const-let-to-var.d.ts.map +1 -1
- package/dist/transforms/const-let-to-var.js +36 -9
- package/dist/transforms/const-let-to-var.js.map +1 -1
- package/dist/transforms/const-to-let.d.ts +2 -3
- package/dist/transforms/const-to-let.d.ts.map +1 -1
- package/dist/transforms/const-to-let.js +3 -5
- package/dist/transforms/const-to-let.js.map +1 -1
- package/dist/transforms/fold-builtin-methods.d.ts.map +1 -1
- package/dist/transforms/fold-builtin-methods.js +48 -10
- package/dist/transforms/fold-builtin-methods.js.map +1 -1
- package/dist/transforms/fold-constants.js +3 -0
- package/dist/transforms/fold-constants.js.map +1 -1
- package/dist/transforms/hoist-variables.d.ts +30 -0
- package/dist/transforms/hoist-variables.d.ts.map +1 -0
- package/dist/transforms/hoist-variables.js +224 -0
- package/dist/transforms/hoist-variables.js.map +1 -0
- package/dist/transforms/inline-functions.js +3 -4
- package/dist/transforms/inline-functions.js.map +1 -1
- package/dist/transforms/mangle-properties.js +7 -4
- 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/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/pack-declarations-into-parameters.js +1 -5
- package/dist/transforms/pack-declarations-into-parameters.js.map +1 -1
- package/dist/transforms/pack.d.ts +5 -7
- package/dist/transforms/pack.d.ts.map +1 -1
- package/dist/transforms/pack.js +194 -32
- package/dist/transforms/pack.js.map +1 -1
- package/dist/transforms/remove-unused-code.d.ts.map +1 -1
- package/dist/transforms/remove-unused-code.js +7 -39
- package/dist/transforms/remove-unused-code.js.map +1 -1
- package/dist/transforms/rename-identifiers.d.ts.map +1 -1
- package/dist/transforms/rename-identifiers.js +29 -17
- package/dist/transforms/rename-identifiers.js.map +1 -1
- package/dist/transforms/reorder-function-declarations.d.ts +25 -0
- package/dist/transforms/reorder-function-declarations.d.ts.map +1 -0
- package/dist/transforms/reorder-function-declarations.js +64 -0
- package/dist/transforms/reorder-function-declarations.js.map +1 -0
- package/dist/transforms/specials-to-strings.js +4 -3
- package/dist/transforms/specials-to-strings.js.map +1 -1
- package/dist/transforms/update-to-assignment.js +1 -16
- package/dist/transforms/update-to-assignment.js.map +1 -1
- package/dist/utils/ast.d.ts +1 -2
- package/dist/utils/ast.d.ts.map +1 -1
- package/dist/utils/ast.js +12 -42
- package/dist/utils/ast.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/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 +12 -13
- package/src/analysis/constant.ts +3 -6
- package/src/analysis/inlineability.ts +40 -32
- package/src/index.ts +1 -0
- package/src/obfuscator.ts +51 -14
- package/src/options.ts +28 -3
- package/src/preparation/expand-destructuring.ts +6 -6
- package/src/transforms/arrow-to-function.ts +3 -5
- package/src/transforms/conceal-strings.ts +530 -0
- package/src/transforms/const-let-to-var.ts +37 -9
- package/src/transforms/const-to-let.ts +3 -5
- package/src/transforms/fold-builtin-methods.ts +67 -12
- package/src/transforms/fold-constants.ts +3 -0
- package/src/transforms/hoist-variables.ts +272 -0
- package/src/transforms/inline-functions.ts +3 -4
- package/src/transforms/mangle-properties.ts +7 -7
- package/src/transforms/merge-variable-declarations.ts +91 -0
- package/src/transforms/numbers-to-strings.ts +2 -12
- package/src/transforms/pack-declarations-into-parameters.ts +1 -5
- package/src/transforms/pack.ts +202 -35
- package/src/transforms/remove-unused-code.ts +9 -64
- package/src/transforms/rename-identifiers.ts +42 -17
- package/src/transforms/reorder-function-declarations.ts +80 -0
- package/src/transforms/specials-to-strings.ts +4 -3
- package/src/transforms/update-to-assignment.ts +1 -17
- package/src/utils/ast.ts +15 -51
- package/src/utils/literal.ts +91 -2
- package/src/utils/statement-lists.ts +45 -0
- package/DISCLOSURE +0 -9
- package/README.md +0 -62
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from '@babel/types';
|
|
2
|
-
import {
|
|
2
|
+
import { isInsideWith } from '../utils/ast.js';
|
|
3
3
|
import { traverseForChanges } from '../utils/change-tracking.js';
|
|
4
4
|
/**
|
|
5
5
|
* Lowers arrows with Babel's capture-aware `arrowFunctionToExpression`. Arrows
|
|
@@ -59,10 +59,8 @@ const visitor = {
|
|
|
59
59
|
arrowReferencesSuper(path) ||
|
|
60
60
|
inUnsafeCaptureContext(path) ||
|
|
61
61
|
usesReassignedArguments(path) ||
|
|
62
|
-
// `with` can
|
|
63
|
-
|
|
64
|
-
isInsideWith(path) ||
|
|
65
|
-
enclosingScopeHasDirectEval(path)) {
|
|
62
|
+
// `with` can capture Babel's `this` or `arguments` alias.
|
|
63
|
+
isInsideWith(path)) {
|
|
66
64
|
return;
|
|
67
65
|
}
|
|
68
66
|
path.arrowFunctionToExpression({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow-to-function.js","sourceRoot":"","sources":["../../src/transforms/arrow-to-function.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"arrow-to-function.js","sourceRoot":"","sources":["../../src/transforms/arrow-to-function.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { File } from '@babel/types';
|
|
2
|
+
import type { TransformContext } from '../options.js';
|
|
3
|
+
/**
|
|
4
|
+
* Replaces runtime string literals with calls to a generated decoder. Each vault
|
|
5
|
+
* stores masked positions in a shuffled UTF-16 pool. The decoder handles lone
|
|
6
|
+
* surrogates without relying on mutable built-ins. The default `regional` pool
|
|
7
|
+
* covers U+0000-00FF and every 256-unit page used by the program. `full` covers
|
|
8
|
+
* all 65,536 code units.
|
|
9
|
+
*
|
|
10
|
+
* `scope: 'program'` creates one vault. `scope: 'function'` creates a vault per
|
|
11
|
+
* function but repeats the program-wide pool in each one. Parameter defaults and
|
|
12
|
+
* computed keys use the enclosing vault because they run before the function
|
|
13
|
+
* body. Code inside `with` gets a lexical vault so the object cannot capture
|
|
14
|
+
* decoder references.
|
|
15
|
+
*
|
|
16
|
+
* Directives, module specifiers, import attributes, and non-computed keys are not
|
|
17
|
+
* runtime expressions, so they stay unchanged.
|
|
18
|
+
*
|
|
19
|
+
* This is obfuscation, not encryption. The output contains the decoder and all
|
|
20
|
+
* data needed to recover each string. `cover: 'used'` also leaves one-unit
|
|
21
|
+
* strings in the pool and may reproduce longer text by chance.
|
|
22
|
+
*
|
|
23
|
+
* The example uses `{ cover: 'used' }` to keep the pool short.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // ◀️ before
|
|
27
|
+
* function greet(name) {
|
|
28
|
+
* return "Hello, " + name;
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* // ▶️ after
|
|
32
|
+
* const _stringPool = " lo,He",
|
|
33
|
+
* _stringPayload = [0, 4, 7, 2, 2, 6, 2],
|
|
34
|
+
* _stringMetadata = [0, 7, 4, 5],
|
|
35
|
+
* _stringCache = [null],
|
|
36
|
+
* _stringDecoder = function (_entry) {
|
|
37
|
+
* let _cached = _stringCache[_entry];
|
|
38
|
+
* if (_cached !== null) return _cached;
|
|
39
|
+
* let _result = "",
|
|
40
|
+
* _record = _entry * 4,
|
|
41
|
+
* _start = _stringMetadata[_record],
|
|
42
|
+
* _length = _stringMetadata[_record + 1],
|
|
43
|
+
* _stringKey = _stringMetadata[_record + 2],
|
|
44
|
+
* _stringStep = _stringMetadata[_record + 3];
|
|
45
|
+
* for (let _position = 0; _position < _length; _position++) {
|
|
46
|
+
* let _stringMask = _stringKey + _position * _stringStep & 7;
|
|
47
|
+
* _result += _stringPool[_stringPayload[_start + _position] ^ _stringMask];
|
|
48
|
+
* }
|
|
49
|
+
* _stringCache[_entry] = _result;
|
|
50
|
+
* return _result;
|
|
51
|
+
* };
|
|
52
|
+
* function greet(name) {
|
|
53
|
+
* return _stringDecoder(0) + name;
|
|
54
|
+
* }
|
|
55
|
+
*/
|
|
56
|
+
export declare function concealStrings(ast: File, ctx: TransformContext): boolean;
|
|
57
|
+
//# sourceMappingURL=conceal-strings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conceal-strings.d.ts","sourceRoot":"","sources":["../../src/transforms/conceal-strings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,KAAK,EAAyB,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAOzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAmBxE"}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import traverse from '@babel/traverse';
|
|
2
|
+
import * as t from '@babel/types';
|
|
3
|
+
import { isNonComputedKey } from '../utils/ast.js';
|
|
4
|
+
import { mulberry32, shuffleInPlace } from '../utils/random.js';
|
|
5
|
+
const RECORD_WIDTH = 4;
|
|
6
|
+
/**
|
|
7
|
+
* Replaces runtime string literals with calls to a generated decoder. Each vault
|
|
8
|
+
* stores masked positions in a shuffled UTF-16 pool. The decoder handles lone
|
|
9
|
+
* surrogates without relying on mutable built-ins. The default `regional` pool
|
|
10
|
+
* covers U+0000-00FF and every 256-unit page used by the program. `full` covers
|
|
11
|
+
* all 65,536 code units.
|
|
12
|
+
*
|
|
13
|
+
* `scope: 'program'` creates one vault. `scope: 'function'` creates a vault per
|
|
14
|
+
* function but repeats the program-wide pool in each one. Parameter defaults and
|
|
15
|
+
* computed keys use the enclosing vault because they run before the function
|
|
16
|
+
* body. Code inside `with` gets a lexical vault so the object cannot capture
|
|
17
|
+
* decoder references.
|
|
18
|
+
*
|
|
19
|
+
* Directives, module specifiers, import attributes, and non-computed keys are not
|
|
20
|
+
* runtime expressions, so they stay unchanged.
|
|
21
|
+
*
|
|
22
|
+
* This is obfuscation, not encryption. The output contains the decoder and all
|
|
23
|
+
* data needed to recover each string. `cover: 'used'` also leaves one-unit
|
|
24
|
+
* strings in the pool and may reproduce longer text by chance.
|
|
25
|
+
*
|
|
26
|
+
* The example uses `{ cover: 'used' }` to keep the pool short.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* // ◀️ before
|
|
30
|
+
* function greet(name) {
|
|
31
|
+
* return "Hello, " + name;
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* // ▶️ after
|
|
35
|
+
* const _stringPool = " lo,He",
|
|
36
|
+
* _stringPayload = [0, 4, 7, 2, 2, 6, 2],
|
|
37
|
+
* _stringMetadata = [0, 7, 4, 5],
|
|
38
|
+
* _stringCache = [null],
|
|
39
|
+
* _stringDecoder = function (_entry) {
|
|
40
|
+
* let _cached = _stringCache[_entry];
|
|
41
|
+
* if (_cached !== null) return _cached;
|
|
42
|
+
* let _result = "",
|
|
43
|
+
* _record = _entry * 4,
|
|
44
|
+
* _start = _stringMetadata[_record],
|
|
45
|
+
* _length = _stringMetadata[_record + 1],
|
|
46
|
+
* _stringKey = _stringMetadata[_record + 2],
|
|
47
|
+
* _stringStep = _stringMetadata[_record + 3];
|
|
48
|
+
* for (let _position = 0; _position < _length; _position++) {
|
|
49
|
+
* let _stringMask = _stringKey + _position * _stringStep & 7;
|
|
50
|
+
* _result += _stringPool[_stringPayload[_start + _position] ^ _stringMask];
|
|
51
|
+
* }
|
|
52
|
+
* _stringCache[_entry] = _result;
|
|
53
|
+
* return _result;
|
|
54
|
+
* };
|
|
55
|
+
* function greet(name) {
|
|
56
|
+
* return _stringDecoder(0) + name;
|
|
57
|
+
* }
|
|
58
|
+
*/
|
|
59
|
+
export function concealStrings(ast, ctx) {
|
|
60
|
+
const options = resolveOptions(ctx.concealStrings);
|
|
61
|
+
const rng = mulberry32(ctx.seed);
|
|
62
|
+
const state = { changed: false, groups: new Map(), options };
|
|
63
|
+
if (options.scope === 'function') {
|
|
64
|
+
normalizeConciseArrows(ast, options);
|
|
65
|
+
}
|
|
66
|
+
traverse(ast, collectVisitor, undefined, state);
|
|
67
|
+
if (state.groups.size === 0) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
const pool = buildSharedPool(state.groups.values(), options.cover, rng);
|
|
71
|
+
for (const group of state.groups.values()) {
|
|
72
|
+
concealGroup(group, options, pool, rng);
|
|
73
|
+
state.changed = true;
|
|
74
|
+
}
|
|
75
|
+
return state.changed;
|
|
76
|
+
}
|
|
77
|
+
const collectVisitor = {
|
|
78
|
+
StringLiteral(path, state) {
|
|
79
|
+
if (!isRuntimeString(path)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const owner = findVaultOwner(path, state.options.scope);
|
|
83
|
+
if (!owner) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
let group = state.groups.get(owner.node);
|
|
87
|
+
if (!group) {
|
|
88
|
+
group = { occurrences: [], owner };
|
|
89
|
+
state.groups.set(owner.node, group);
|
|
90
|
+
}
|
|
91
|
+
group.occurrences.push({ path, value: path.node.value });
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
function resolveOptions(options) {
|
|
95
|
+
const cache = options?.cache ?? true;
|
|
96
|
+
const cover = options?.cover ?? 'regional';
|
|
97
|
+
const deduplicate = options?.deduplicate ?? true;
|
|
98
|
+
const scope = options?.scope ?? 'program';
|
|
99
|
+
if (typeof cache !== 'boolean') {
|
|
100
|
+
throw new TypeError('concealStrings cache must be a boolean');
|
|
101
|
+
}
|
|
102
|
+
if (cover !== 'full' && cover !== 'regional' && cover !== 'used') {
|
|
103
|
+
throw new TypeError("concealStrings cover must be 'full', 'regional', or 'used'");
|
|
104
|
+
}
|
|
105
|
+
if (typeof deduplicate !== 'boolean') {
|
|
106
|
+
throw new TypeError('concealStrings deduplicate must be a boolean');
|
|
107
|
+
}
|
|
108
|
+
if (scope !== 'function' && scope !== 'program') {
|
|
109
|
+
throw new TypeError("concealStrings scope must be 'function' or 'program'");
|
|
110
|
+
}
|
|
111
|
+
return { cache, cover, deduplicate, scope };
|
|
112
|
+
}
|
|
113
|
+
function normalizeConciseArrows(ast, options) {
|
|
114
|
+
const marked = new WeakSet();
|
|
115
|
+
traverse(ast, {
|
|
116
|
+
StringLiteral(path) {
|
|
117
|
+
if (!isRuntimeString(path)) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const owner = findVaultOwner(path, options.scope);
|
|
121
|
+
if (owner?.isArrowFunctionExpression() && !t.isBlockStatement(owner.node.body)) {
|
|
122
|
+
marked.add(owner.node);
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
ArrowFunctionExpression: {
|
|
126
|
+
exit(path) {
|
|
127
|
+
if (!marked.has(path.node) || t.isBlockStatement(path.node.body)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const expression = path.node.body;
|
|
131
|
+
path.get('body').replaceWith(t.blockStatement([t.returnStatement(expression)]));
|
|
132
|
+
path.node.expression = false;
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
function findVaultOwner(path, scope) {
|
|
138
|
+
let child = path;
|
|
139
|
+
let current = path.parentPath;
|
|
140
|
+
while (current) {
|
|
141
|
+
if (current.isFunction() && child.key === 'body' && scope === 'function') {
|
|
142
|
+
return current;
|
|
143
|
+
}
|
|
144
|
+
if (current.isWithStatement() && child.key === 'body') {
|
|
145
|
+
const body = current.get('body');
|
|
146
|
+
return body.isBlockStatement() ? body : null;
|
|
147
|
+
}
|
|
148
|
+
if (current.isProgram()) {
|
|
149
|
+
return current;
|
|
150
|
+
}
|
|
151
|
+
child = current;
|
|
152
|
+
current = current.parentPath;
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
function isRuntimeString(path) {
|
|
157
|
+
const parent = path.parent;
|
|
158
|
+
const node = path.node;
|
|
159
|
+
if ((t.isImportDeclaration(parent) && parent.source === node) ||
|
|
160
|
+
(t.isExportNamedDeclaration(parent) && parent.source === node) ||
|
|
161
|
+
(t.isExportAllDeclaration(parent) && parent.source === node) ||
|
|
162
|
+
t.isImportAttribute(parent) ||
|
|
163
|
+
(t.isImportSpecifier(parent) && parent.imported === node) ||
|
|
164
|
+
(t.isExportSpecifier(parent) && parent.exported === node) ||
|
|
165
|
+
(t.isExportNamespaceSpecifier(parent) && parent.exported === node)) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
return !isNonComputedKey(path);
|
|
169
|
+
}
|
|
170
|
+
function concealGroup(group, options, pool, rng) {
|
|
171
|
+
const entries = makeEntries(group.occurrences, options.deduplicate);
|
|
172
|
+
shuffleInPlace(entries, rng);
|
|
173
|
+
const data = encodeEntries(entries, pool, rng);
|
|
174
|
+
const identifiers = insertVault(statementBody(group.owner), entries.length, data, options.cache);
|
|
175
|
+
for (let index = 0; index < entries.length; index++) {
|
|
176
|
+
for (const occurrence of entries[index].occurrences) {
|
|
177
|
+
occurrence.path.replaceWith(t.callExpression(t.identifier(identifiers.decoder.name), [t.numericLiteral(index)]));
|
|
178
|
+
occurrence.path.skip();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function makeEntries(occurrences, deduplicate) {
|
|
183
|
+
if (!deduplicate) {
|
|
184
|
+
return occurrences.map((occurrence) => ({ occurrences: [occurrence], value: occurrence.value }));
|
|
185
|
+
}
|
|
186
|
+
const byValue = new Map();
|
|
187
|
+
for (const occurrence of occurrences) {
|
|
188
|
+
let entry = byValue.get(occurrence.value);
|
|
189
|
+
if (!entry) {
|
|
190
|
+
entry = { occurrences: [], value: occurrence.value };
|
|
191
|
+
byValue.set(occurrence.value, entry);
|
|
192
|
+
}
|
|
193
|
+
entry.occurrences.push(occurrence);
|
|
194
|
+
}
|
|
195
|
+
return [...byValue.values()];
|
|
196
|
+
}
|
|
197
|
+
function buildSharedPool(groups, cover, rng) {
|
|
198
|
+
const usedUnits = new Set();
|
|
199
|
+
for (const group of groups) {
|
|
200
|
+
for (const occurrence of group.occurrences) {
|
|
201
|
+
let index = 0;
|
|
202
|
+
while (index < occurrence.value.length) {
|
|
203
|
+
usedUnits.add(occurrence.value[index]);
|
|
204
|
+
index++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const poolUnits = makePoolUnits(usedUnits, cover);
|
|
209
|
+
shuffleInPlace(poolUnits, rng);
|
|
210
|
+
return {
|
|
211
|
+
indexMask: coveringBitMask(poolUnits.length),
|
|
212
|
+
positions: indexPoolPositions(poolUnits),
|
|
213
|
+
value: poolUnits.join(''),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function encodeEntries(entries, pool, rng) {
|
|
217
|
+
const metadata = [];
|
|
218
|
+
const payload = [];
|
|
219
|
+
for (const entry of entries) {
|
|
220
|
+
const key = randomInteger(pool.indexMask + 1, rng);
|
|
221
|
+
const step = randomOddInteger(pool.indexMask, rng);
|
|
222
|
+
metadata.push(payload.length, entry.value.length, key, step);
|
|
223
|
+
for (let position = 0; position < entry.value.length; position++) {
|
|
224
|
+
const truePosition = pool.positions.get(entry.value[position]);
|
|
225
|
+
payload.push(truePosition ^ maskPosition(position, key, step, pool.indexMask));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return { indexMask: pool.indexMask, metadata, payload, pool: pool.value };
|
|
229
|
+
}
|
|
230
|
+
function makePoolUnits(usedUnits, cover) {
|
|
231
|
+
return cover === 'used' ? [...usedUnits] : coveredPageUnits(usedUnits, cover);
|
|
232
|
+
}
|
|
233
|
+
function coveredPageUnits(usedUnits, cover) {
|
|
234
|
+
const pages = new Set();
|
|
235
|
+
if (cover === 'full') {
|
|
236
|
+
for (let page = 0; page < 0x01_00; page++) {
|
|
237
|
+
pages.add(page);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
pages.add(0);
|
|
242
|
+
for (const unit of usedUnits) {
|
|
243
|
+
pages.add(unit.codePointAt(0) >>> 8);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const units = [];
|
|
247
|
+
for (const page of pages) {
|
|
248
|
+
const start = page << 8;
|
|
249
|
+
for (let offset = 0; offset < 0x01_00; offset++) {
|
|
250
|
+
units.push(String.fromCodePoint(start + offset));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return units;
|
|
254
|
+
}
|
|
255
|
+
function indexPoolPositions(pool) {
|
|
256
|
+
const positions = new Map();
|
|
257
|
+
for (let index = 0; index < pool.length; index++) {
|
|
258
|
+
positions.set(pool[index], index);
|
|
259
|
+
}
|
|
260
|
+
return positions;
|
|
261
|
+
}
|
|
262
|
+
function coveringBitMask(length) {
|
|
263
|
+
let mask = 0;
|
|
264
|
+
while (mask < length - 1) {
|
|
265
|
+
mask = (mask << 1) | 1;
|
|
266
|
+
}
|
|
267
|
+
return mask;
|
|
268
|
+
}
|
|
269
|
+
function randomInteger(limit, rng) {
|
|
270
|
+
return limit === 0 ? 0 : Math.floor(rng() * limit);
|
|
271
|
+
}
|
|
272
|
+
function randomOddInteger(mask, rng) {
|
|
273
|
+
return mask === 0 ? 0 : randomInteger((mask + 1) / 2, rng) * 2 + 1;
|
|
274
|
+
}
|
|
275
|
+
function maskPosition(position, key, step, indexMask) {
|
|
276
|
+
return (key + position * step) & indexMask;
|
|
277
|
+
}
|
|
278
|
+
function statementBody(owner) {
|
|
279
|
+
if (owner.isProgram() || owner.isBlockStatement()) {
|
|
280
|
+
return owner;
|
|
281
|
+
}
|
|
282
|
+
const body = owner.get('body');
|
|
283
|
+
if (!body.isBlockStatement()) {
|
|
284
|
+
throw new Error('concealStrings expected a normalized function body');
|
|
285
|
+
}
|
|
286
|
+
return body;
|
|
287
|
+
}
|
|
288
|
+
function insertVault(body, entryCount, data, cache) {
|
|
289
|
+
const fresh = (purpose) => t.identifier(body.scope.generateUid(purpose));
|
|
290
|
+
const identifiers = {
|
|
291
|
+
cache: cache ? fresh('stringCache') : null,
|
|
292
|
+
decoder: fresh('stringDecoder'),
|
|
293
|
+
metadata: fresh('stringMetadata'),
|
|
294
|
+
payload: fresh('stringPayload'),
|
|
295
|
+
pool: fresh('stringPool'),
|
|
296
|
+
};
|
|
297
|
+
const decoder = t.functionExpression(null, [], t.blockStatement([]));
|
|
298
|
+
const declarations = [
|
|
299
|
+
t.variableDeclarator(identifiers.pool, t.stringLiteral(data.pool)),
|
|
300
|
+
t.variableDeclarator(identifiers.payload, numericArray(data.payload)),
|
|
301
|
+
t.variableDeclarator(identifiers.metadata, numericArray(data.metadata)),
|
|
302
|
+
];
|
|
303
|
+
if (identifiers.cache) {
|
|
304
|
+
declarations.push(t.variableDeclarator(identifiers.cache, t.arrayExpression(Array.from({ length: entryCount }, () => t.nullLiteral()))));
|
|
305
|
+
}
|
|
306
|
+
declarations.push(t.variableDeclarator(identifiers.decoder, decoder));
|
|
307
|
+
const declaration = t.variableDeclaration('const', declarations);
|
|
308
|
+
const [declarationPath] = body.unshiftContainer('body', declaration);
|
|
309
|
+
const declaratorPaths = declarationPath.get('declarations');
|
|
310
|
+
const decoderPath = declaratorPaths
|
|
311
|
+
.find((path) => path.node.init === decoder)
|
|
312
|
+
.get('init');
|
|
313
|
+
populateDecoder(decoderPath, identifiers, data.indexMask);
|
|
314
|
+
return identifiers;
|
|
315
|
+
}
|
|
316
|
+
function populateDecoder(decoderPath, vault, indexMask) {
|
|
317
|
+
const fresh = (purpose) => t.identifier(decoderPath.scope.generateUid(purpose));
|
|
318
|
+
const entry = fresh('entry');
|
|
319
|
+
const result = fresh('result');
|
|
320
|
+
const record = fresh('record');
|
|
321
|
+
const start = fresh('start');
|
|
322
|
+
const length = fresh('length');
|
|
323
|
+
const key = fresh('stringKey');
|
|
324
|
+
const step = fresh('stringStep');
|
|
325
|
+
const position = fresh('position');
|
|
326
|
+
const mask = fresh('stringMask');
|
|
327
|
+
const statements = [];
|
|
328
|
+
if (vault.cache) {
|
|
329
|
+
const cached = fresh('cached');
|
|
330
|
+
statements.push(t.variableDeclaration('let', [t.variableDeclarator(cached, indexed(vault.cache, entry))]), t.ifStatement(t.binaryExpression('!==', cached, t.nullLiteral()), t.returnStatement(cached)));
|
|
331
|
+
}
|
|
332
|
+
statements.push(t.variableDeclaration('let', [
|
|
333
|
+
t.variableDeclarator(result, t.stringLiteral('')),
|
|
334
|
+
t.variableDeclarator(record, t.binaryExpression('*', entry, t.numericLiteral(RECORD_WIDTH))),
|
|
335
|
+
t.variableDeclarator(start, indexed(vault.metadata, record)),
|
|
336
|
+
t.variableDeclarator(length, indexed(vault.metadata, t.binaryExpression('+', record, t.numericLiteral(1)))),
|
|
337
|
+
t.variableDeclarator(key, indexed(vault.metadata, t.binaryExpression('+', record, t.numericLiteral(2)))),
|
|
338
|
+
t.variableDeclarator(step, indexed(vault.metadata, t.binaryExpression('+', record, t.numericLiteral(3)))),
|
|
339
|
+
]), t.forStatement(t.variableDeclaration('let', [t.variableDeclarator(position, t.numericLiteral(0))]), t.binaryExpression('<', position, length), t.updateExpression('++', position), t.blockStatement([
|
|
340
|
+
t.variableDeclaration('let', [
|
|
341
|
+
t.variableDeclarator(mask, maskExpression(position, key, step, indexMask)),
|
|
342
|
+
]),
|
|
343
|
+
t.expressionStatement(t.assignmentExpression('+=', result, indexed(vault.pool, t.binaryExpression('^', indexed(vault.payload, t.binaryExpression('+', start, position)), mask)))),
|
|
344
|
+
])));
|
|
345
|
+
if (vault.cache) {
|
|
346
|
+
statements.push(t.expressionStatement(t.assignmentExpression('=', indexed(vault.cache, entry), result)));
|
|
347
|
+
}
|
|
348
|
+
statements.push(t.returnStatement(result));
|
|
349
|
+
decoderPath.node.params = [entry];
|
|
350
|
+
decoderPath.node.body.body = statements;
|
|
351
|
+
}
|
|
352
|
+
function maskExpression(position, key, step, indexMask) {
|
|
353
|
+
return t.binaryExpression('&', t.binaryExpression('+', t.cloneNode(key), t.binaryExpression('*', t.cloneNode(position), t.cloneNode(step))), t.numericLiteral(indexMask));
|
|
354
|
+
}
|
|
355
|
+
function indexed(object, property) {
|
|
356
|
+
return t.memberExpression(t.cloneNode(object), t.cloneNode(property), true);
|
|
357
|
+
}
|
|
358
|
+
function numericArray(values) {
|
|
359
|
+
return t.arrayExpression(values.map((value) => t.numericLiteral(value)));
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=conceal-strings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conceal-strings.js","sourceRoot":"","sources":["../../src/transforms/conceal-strings.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAIjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAE5D,MAAM,YAAY,GAAG,CAAC,CAAA;AAEtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,MAAM,UAAU,cAAc,CAAC,GAAS,EAAE,GAAqB;IAC7D,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAClD,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,KAAK,GAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,CAAA;IAEnE,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACjC,sBAAsB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IAED,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;IAC/C,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACvE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QACvC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;IACtB,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAA;AACtB,CAAC;AAqDD,MAAM,cAAc,GAAmB;IACrC,aAAa,CAAC,IAAI,EAAE,KAAK;QACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QACD,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA;YAClC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IAC1D,CAAC;CACF,CAAA;AAED,SAAS,cAAc,CAAC,OAA0C;IAChE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAA;IACpC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,UAAU,CAAA;IAC1C,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAA;IAChD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,SAAS,CAAA;IACzC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACjE,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAA;IACnF,CAAC;IACD,IAAI,OAAO,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAA;IACrE,CAAC;IACD,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAChD,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAA;IAC7E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAS,EAAE,OAAwB;IACjE,MAAM,MAAM,GAAG,IAAI,OAAO,EAA6B,CAAA;IACvD,QAAQ,CAAC,GAAG,EAAE;QACZ,aAAa,CAAC,IAAI;YAChB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAM;YACR,CAAC;YACD,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;YACjD,IAAI,KAAK,EAAE,yBAAyB,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/E,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;QACD,uBAAuB,EAAE;YACvB,IAAI,CAAC,IAAI;gBACP,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjE,OAAM;gBACR,CAAC;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;gBACjC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC/E,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;YAC9B,CAAC;SACF;KACF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,IAA+B,EAC/B,KAA+B;IAE/B,IAAI,KAAK,GAAa,IAAI,CAAA;IAC1B,IAAI,OAAO,GAAoB,IAAI,CAAC,UAAU,CAAA;IAC9C,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACzE,OAAO,OAAyB,CAAA;QAClC,CAAC;QACD,IAAI,OAAO,CAAC,eAAe,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAChC,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAE,IAAuB,CAAC,CAAC,CAAC,IAAI,CAAA;QAClE,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YACxB,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,KAAK,GAAG,OAAO,CAAA;QACf,OAAO,GAAG,OAAO,CAAC,UAAU,CAAA;IAC9B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,eAAe,CAAC,IAA+B;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IACtB,IACE,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;QACzD,CAAC,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;QAC9D,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;QAC5D,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAC3B,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC;QACzD,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC;QACzD,CAAC,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,EAClE,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,YAAY,CACnB,KAAiB,EACjB,OAAwB,EACxB,IAAgB,EAChB,GAAiB;IAEjB,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IACnE,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IAC9C,MAAM,WAAW,GAAG,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IAEhG,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACpD,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,KAAK,CAAE,CAAC,WAAW,EAAE,CAAC;YACrD,UAAU,CAAC,IAAI,CAAC,WAAW,CACzB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CACpF,CAAA;YACD,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,WAAyB,EAAE,WAAoB;IAClE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAClG,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAA;IACxC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAA;YACpD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACtC,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AAC9B,CAAC;AAED,SAAS,eAAe,CACtB,MAA4B,EAC5B,KAA+B,EAC/B,GAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,KAAK,GAAG,CAAC,CAAA;YACb,OAAO,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACvC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAA;gBACvC,KAAK,EAAE,CAAA;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACjD,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IAC9B,OAAO;QACL,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC;QAC5C,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;QACxC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;KAC1B,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB,EAAE,IAAgB,EAAE,GAAiB;IAC1E,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAA;IAE5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAClD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAC5D,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;YACjE,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAE,CAAA;YAChE,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAChF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,SAA8B,EAAE,KAA+B;IACpF,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,gBAAgB,CACvB,SAA8B,EAC9B,KAAgD;IAEhD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACZ,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAA;QACvB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAuB;IACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAE,EAAE,KAAK,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,OAAO,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,GAAiB;IACrD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,GAAiB;IACvD,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACpE,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,GAAW,EAAE,IAAY,EAAE,SAAiB;IAClF,OAAO,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;AAC5C,CAAC;AAED,SAAS,aAAa,CAAC,KAAqB;IAC1C,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,KAAK,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAClD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAa,CAAA;IAC1C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;IACvE,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,WAAW,CAClB,IAA4C,EAC5C,UAAkB,EAClB,IAAe,EACf,KAAc;IAEd,MAAM,KAAK,GAAG,CAAC,OAAe,EAAgB,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9F,MAAM,WAAW,GAAqB;QACpC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1C,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC;QAC/B,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC;QACjC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC;QAC/B,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC;KAC1B,CAAA;IACD,MAAM,OAAO,GAAG,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;IACpE,MAAM,YAAY,GAAG;QACnB,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrE,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACxE,CAAA;IACD,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,YAAY,CAAC,IAAI,CACf,CAAC,CAAC,kBAAkB,CAClB,WAAW,CAAC,KAAK,EACjB,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAC7E,CACF,CAAA;IACH,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IAErE,MAAM,WAAW,GAAG,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAChE,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACpE,MAAM,eAAe,GAAG,eAAgB,CAAC,GAAG,CAAC,cAAc,CAAqC,CAAA;IAChG,MAAM,WAAW,GAAG,eAAe;SAChC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAE;SAC3C,GAAG,CAAC,MAAM,CAAmC,CAAA;IAChD,eAAe,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACzD,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,SAAS,eAAe,CACtB,WAA2C,EAC3C,KAAuB,EACvB,SAAiB;IAEjB,MAAM,KAAK,GAAG,CAAC,OAAe,EAAgB,EAAE,CAC9C,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;IAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;IAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,CAAA;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAA;IAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAA;IAChC,MAAM,UAAU,GAAkB,EAAE,CAAA;IAEpC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC9B,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EACzF,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAC7F,CAAA;IACH,CAAC;IAED,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE;QAC3B,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;QAC5F,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC,CAAC,kBAAkB,CAClB,MAAM,EACN,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9E;QACD,CAAC,CAAC,kBAAkB,CAClB,GAAG,EACH,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9E;QACD,CAAC,CAAC,kBAAkB,CAClB,IAAI,EACJ,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9E;KACF,CAAC,EACF,CAAC,CAAC,YAAY,CACZ,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACnF,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,EACzC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAClC,CAAC,CAAC,cAAc,CAAC;QACf,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE;YAC3B,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;SAC3E,CAAC;QACF,CAAC,CAAC,mBAAmB,CACnB,CAAC,CAAC,oBAAoB,CACpB,IAAI,EACJ,MAAM,EACN,OAAO,CACL,KAAK,CAAC,IAAI,EACV,CAAC,CAAC,gBAAgB,CAChB,GAAG,EACH,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,EAChE,IAAI,CACL,CACF,CACF,CACF;KACF,CAAC,CACH,CACF,CAAA;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CACxF,CAAA;IACH,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1C,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAA;IACjC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;AACzC,CAAC;AAED,SAAS,cAAc,CACrB,QAAsB,EACtB,GAAiB,EACjB,IAAkB,EAClB,SAAiB;IAEjB,OAAO,CAAC,CAAC,gBAAgB,CACvB,GAAG,EACH,CAAC,CAAC,gBAAgB,CAChB,GAAG,EACH,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAChB,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAClE,EACD,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAC5B,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAAoB,EAAE,QAAsB;IAC3D,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,YAAY,CAAC,MAAyB;IAC7C,OAAO,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC1E,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { File } from '@babel/types';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* uninitialized loop heads,
|
|
3
|
+
* Converts safe `let` and `const` declarations to `var` and renames bindings
|
|
4
|
+
* that would conflict after hoisting. It skips TDZ reads, reassigned constants,
|
|
5
|
+
* captured loop bindings, uninitialized loop heads, script globals, and `with`.
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* // ◀️ before
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const-let-to-var.d.ts","sourceRoot":"","sources":["../../src/transforms/const-let-to-var.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAMxC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"const-let-to-var.d.ts","sourceRoot":"","sources":["../../src/transforms/const-let-to-var.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAMxC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CA+DhD"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import traverse from '@babel/traverse';
|
|
2
2
|
import * as t from '@babel/types';
|
|
3
3
|
import { initializerReaches } from '../analysis/document-order.js';
|
|
4
|
-
import {
|
|
4
|
+
import { isInsideWith } from '../utils/ast.js';
|
|
5
5
|
import { hasConstantViolation } from '../utils/paths.js';
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* uninitialized loop heads,
|
|
7
|
+
* Converts safe `let` and `const` declarations to `var` and renames bindings
|
|
8
|
+
* that would conflict after hoisting. It skips TDZ reads, reassigned constants,
|
|
9
|
+
* captured loop bindings, uninitialized loop heads, script globals, and `with`.
|
|
10
10
|
*
|
|
11
11
|
* @example
|
|
12
12
|
* // ◀️ before
|
|
@@ -29,8 +29,8 @@ export function constLetToVar(ast) {
|
|
|
29
29
|
if (kind !== 'let' && kind !== 'const') {
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
|
-
// Babel cannot
|
|
33
|
-
if (isInsideWith(path)
|
|
32
|
+
// Babel's scope table cannot account for properties supplied by `with`.
|
|
33
|
+
if (isInsideWith(path)) {
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
// A `var` write would lose the `const` TypeError.
|
|
@@ -45,11 +45,19 @@ export function constLetToVar(ast) {
|
|
|
45
45
|
if (forHeadMissingInitializer(path)) {
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
|
-
// Top-level `var` creates a global property. Lexical declarations do not.
|
|
49
48
|
const blockScope = path.scope;
|
|
50
49
|
const varScope = blockScope.getFunctionParent() ?? blockScope.getProgramParent();
|
|
51
50
|
if (varScope.path.isProgram()) {
|
|
52
|
-
|
|
51
|
+
// Script `var` creates a global-object property; module `var` does not.
|
|
52
|
+
if (varScope.path.node.sourceType !== 'module') {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// A circular importer can read this binding before initialization. A
|
|
56
|
+
// lexical binding throws in TDZ then, while `var` reads `undefined`. That
|
|
57
|
+
// external read does not appear in this file's references.
|
|
58
|
+
if (bindsExportedName(path)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
53
61
|
}
|
|
54
62
|
// One `var` cannot preserve per-iteration bindings captured by closures.
|
|
55
63
|
if (capturedInEnclosingLoop(path)) {
|
|
@@ -63,7 +71,7 @@ export function constLetToVar(ast) {
|
|
|
63
71
|
if (!id) {
|
|
64
72
|
return;
|
|
65
73
|
}
|
|
66
|
-
if (isInsideWith(path)
|
|
74
|
+
if (isInsideWith(path)) {
|
|
67
75
|
return;
|
|
68
76
|
}
|
|
69
77
|
const scope = path.parentPath.scope;
|
|
@@ -125,6 +133,25 @@ function forHeadMissingInitializer(path) {
|
|
|
125
133
|
}
|
|
126
134
|
return path.node.declarations.some((decl) => decl.init == null);
|
|
127
135
|
}
|
|
136
|
+
// A source clause re-exports another module's binding, not this local binding.
|
|
137
|
+
function bindsExportedName(path) {
|
|
138
|
+
if (path.parentPath.isExportNamedDeclaration()) {
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
const names = new Set(Object.keys(path.getBindingIdentifiers()));
|
|
142
|
+
const program = path.scope.getProgramParent().path.node;
|
|
143
|
+
for (const statement of program.body) {
|
|
144
|
+
if (!t.isExportNamedDeclaration(statement) || statement.source) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
for (const specifier of statement.specifiers) {
|
|
148
|
+
if (t.isExportSpecifier(specifier) && names.has(specifier.local.name)) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
128
155
|
// A nested function or class can observe the loop's per-iteration binding.
|
|
129
156
|
function capturedInEnclosingLoop(path) {
|
|
130
157
|
const loop = enclosingLoop(path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const-let-to-var.js","sourceRoot":"","sources":["../../src/transforms/const-let-to-var.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"const-let-to-var.js","sourceRoot":"","sources":["../../src/transforms/const-let-to-var.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { File } from '@babel/types';
|
|
2
2
|
/**
|
|
3
|
-
* Changes `const` to `let` when
|
|
4
|
-
*
|
|
5
|
-
* and TDZ behavior are otherwise identical.
|
|
3
|
+
* Changes `const` to `let` when Babel finds no writes. Read-only bindings keep
|
|
4
|
+
* the same scope and TDZ behavior; the declarations differ only on writes.
|
|
6
5
|
*
|
|
7
6
|
* @example
|
|
8
7
|
* // ◀️ before
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const-to-let.d.ts","sourceRoot":"","sources":["../../src/transforms/const-to-let.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"const-to-let.d.ts","sourceRoot":"","sources":["../../src/transforms/const-to-let.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAMxC;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAE7C"}
|