webfuscator 1.2.0 → 1.2.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 +17 -12
- 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/options.d.ts +7 -0
- package/dist/options.d.ts.map +1 -1
- package/dist/transforms/pack.d.ts.map +1 -1
- package/dist/transforms/pack.js +184 -15
- package/dist/transforms/pack.js.map +1 -1
- package/package.json +4 -3
- package/src/analysis/inlineability.ts +40 -32
- package/src/options.ts +7 -0
- package/src/transforms/pack.ts +192 -17
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
`webfuscator` is a Babel-based JavaScript obfuscator. It parses a JavaScript source string, applies configurable transforms, and returns JavaScript source.
|
|
2
2
|
|
|
3
|
-
[Read the documentation](https://webfuscator.
|
|
3
|
+
[Read the documentation](https://docs.webfuscator.dev) for the quickstart, configuration guides, API details, and a reference page for every transform. To try it without installing anything, open the [playground](https://playground.webfuscator.dev) and obfuscate a file in your browser.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -34,24 +34,29 @@ Configurable transforms are disabled by default; preparation passes always run.
|
|
|
34
34
|
|
|
35
35
|
## Documentation
|
|
36
36
|
|
|
37
|
-
- [
|
|
38
|
-
- [
|
|
39
|
-
- [
|
|
40
|
-
- [
|
|
41
|
-
- [
|
|
42
|
-
- [
|
|
43
|
-
- [
|
|
37
|
+
- [Playground](https://playground.webfuscator.dev)
|
|
38
|
+
- [Quickstart](https://docs.webfuscator.dev/getting-started/quickstart)
|
|
39
|
+
- [JavaScript API](https://docs.webfuscator.dev/reference/api)
|
|
40
|
+
- [Configure transforms](https://docs.webfuscator.dev/guides/configure-transforms)
|
|
41
|
+
- [Obfuscator options](https://docs.webfuscator.dev/reference/options)
|
|
42
|
+
- [Property mangling](https://docs.webfuscator.dev/reference/property-mangling-options)
|
|
43
|
+
- [String generator modes](https://docs.webfuscator.dev/reference/string-generator-modes)
|
|
44
|
+
- [Report a bug](https://docs.webfuscator.dev/troubleshooting/report-a-bug)
|
|
44
45
|
|
|
45
46
|
## Development
|
|
46
47
|
|
|
48
|
+
Every task runs from the repository root.
|
|
49
|
+
|
|
47
50
|
```sh
|
|
48
51
|
pnpm install
|
|
49
|
-
pnpm
|
|
50
|
-
pnpm
|
|
51
|
-
pnpm
|
|
52
|
+
pnpm dev # playground at localhost:5173
|
|
53
|
+
pnpm docs:dev # documentation site
|
|
54
|
+
pnpm test # the full suite
|
|
55
|
+
pnpm check # typecheck, lint, format, knip, generated docs, tests
|
|
56
|
+
pnpm docs:check # links, snippets, redirects, accessibility
|
|
52
57
|
```
|
|
53
58
|
|
|
54
|
-
|
|
59
|
+
[AGENTS.md](./AGENTS.md) lists the rest and explains which workspace owns what. Read it before changing transforms or analysis code.
|
|
55
60
|
|
|
56
61
|
## Responsible use
|
|
57
62
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inlineability.d.ts","sourceRoot":"","sources":["../../src/analysis/inlineability.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAW,MAAM,iBAAiB,CAAA;AACjE,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AACjC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"inlineability.d.ts","sourceRoot":"","sources":["../../src/analysis/inlineability.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAW,MAAM,iBAAiB,CAAA;AACjE,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AACjC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAIxC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAA;IAClB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,eAAe,EAAE,QAAQ,CAAA;CAC1B;AAMD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAuE5E"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import traverse from '@babel/traverse';
|
|
2
2
|
import * as t from '@babel/types';
|
|
3
|
-
import { walkOwnFunctionScope } from '../utils/ast.js';
|
|
4
3
|
import { hasAnnexBFunctionAlias, referencesOrWritesVariable } from '../utils/paths.js';
|
|
5
|
-
//
|
|
4
|
+
// Inlining splices a deep clone of the callee body, so any call that clone
|
|
5
|
+
// contains expands again. Expansion stops only when the graph below is acyclic,
|
|
6
|
+
// so this pass drops every candidate on a cycle before the inliner reaches a
|
|
7
|
+
// call site.
|
|
6
8
|
export function analyzeInlineability(ast) {
|
|
7
9
|
const rawCandidates = [];
|
|
8
10
|
// Earlier passes can leave `binding.referencePaths` on detached nodes.
|
|
@@ -54,29 +56,41 @@ export function analyzeInlineability(ast) {
|
|
|
54
56
|
for (const candidate of rawCandidates) {
|
|
55
57
|
candidateByName.set(candidate.name, candidate);
|
|
56
58
|
}
|
|
57
|
-
|
|
59
|
+
const edges = buildExpansionGraph(candidateByName);
|
|
60
|
+
for (const scc of tarjanSCC([...candidateByName.keys()], edges)) {
|
|
61
|
+
// Tarjan reports an acyclic node as a singleton too, so a self-recursive
|
|
62
|
+
// candidate shows up only as an edge back to itself.
|
|
63
|
+
if (scc.length === 1 && !edges.get(scc[0]).has(scc[0])) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
for (const name of scc) {
|
|
67
|
+
candidateByName.delete(name);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return candidateByName;
|
|
71
|
+
}
|
|
72
|
+
// A clone keeps the whole body, so a reference inside a closure, an object
|
|
73
|
+
// method, or a getter is as live in the copy as one at the top level. Walking
|
|
74
|
+
// out to every enclosing candidate, rather than stopping at the innermost, also
|
|
75
|
+
// covers a candidate declared inside another candidate's body.
|
|
76
|
+
function buildExpansionGraph(candidateByName) {
|
|
77
|
+
const nameByFnNode = new Map();
|
|
58
78
|
const edges = new Map();
|
|
59
|
-
for (const candidate of
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (t.isIdentifier(node) && node.name !== candidate.name && candidateByName.has(node.name)) {
|
|
63
|
-
callees.add(node.name);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
edges.set(candidate.name, callees);
|
|
79
|
+
for (const [name, candidate] of candidateByName) {
|
|
80
|
+
nameByFnNode.set(candidate.fnNode, name);
|
|
81
|
+
edges.set(name, new Set());
|
|
67
82
|
}
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
83
|
+
for (const [name, candidate] of candidateByName) {
|
|
84
|
+
for (const ref of candidate.binding.referencePaths) {
|
|
85
|
+
for (let owner = ref.parentPath; owner; owner = owner.parentPath) {
|
|
86
|
+
const ownerName = owner.isFunction() ? nameByFnNode.get(owner.node) : undefined;
|
|
87
|
+
if (ownerName !== undefined) {
|
|
88
|
+
edges.get(ownerName).add(name);
|
|
89
|
+
}
|
|
73
90
|
}
|
|
74
91
|
}
|
|
75
92
|
}
|
|
76
|
-
|
|
77
|
-
candidateByName.delete(name);
|
|
78
|
-
}
|
|
79
|
-
return candidateByName;
|
|
93
|
+
return edges;
|
|
80
94
|
}
|
|
81
95
|
function checkCandidate(name, binding, fnNode, fnPath, declarationPath) {
|
|
82
96
|
if (fnNode.generator || fnNode.async) {
|
|
@@ -105,7 +119,7 @@ function checkCandidate(name, binding, fnNode, fnPath, declarationPath) {
|
|
|
105
119
|
if (params.some((param) => param === null)) {
|
|
106
120
|
return null;
|
|
107
121
|
}
|
|
108
|
-
const analysis = analyzeBody(
|
|
122
|
+
const analysis = analyzeBody(fnPath);
|
|
109
123
|
if (analysis.unsafe || analysis.closureCapture) {
|
|
110
124
|
return null;
|
|
111
125
|
}
|
|
@@ -152,9 +166,8 @@ function validateCallSites(binding) {
|
|
|
152
166
|
}
|
|
153
167
|
return true;
|
|
154
168
|
}
|
|
155
|
-
function analyzeBody(
|
|
169
|
+
function analyzeBody(fnPath) {
|
|
156
170
|
const state = {
|
|
157
|
-
candidateName: name,
|
|
158
171
|
outerScope: fnPath.scope,
|
|
159
172
|
innerFnDepth: 0,
|
|
160
173
|
unsafe: false,
|
|
@@ -208,8 +221,7 @@ const analyzeBodyVisitor = {
|
|
|
208
221
|
},
|
|
209
222
|
Identifier(path, state) {
|
|
210
223
|
const name = path.node.name;
|
|
211
|
-
if (state.innerFnDepth === 0 &&
|
|
212
|
-
(name === 'arguments' || name === 'eval' || name === state.candidateName)) {
|
|
224
|
+
if (state.innerFnDepth === 0 && (name === 'arguments' || name === 'eval')) {
|
|
213
225
|
state.unsafe = true;
|
|
214
226
|
path.stop();
|
|
215
227
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inlineability.js","sourceRoot":"","sources":["../../src/analysis/inlineability.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"inlineability.js","sourceRoot":"","sources":["../../src/analysis/inlineability.ts"],"names":[],"mappings":"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"}
|
package/dist/options.d.ts
CHANGED
|
@@ -47,6 +47,13 @@ export interface PackOptions {
|
|
|
47
47
|
* source is strict. This deliberately changes behavior. Default `false`.
|
|
48
48
|
*/
|
|
49
49
|
escapeStrict?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Free names to leave un-routed because they resolve to the real global from
|
|
52
|
+
* inside a detached Function body. `true` uses the built-in standard-globals
|
|
53
|
+
* list; an array names your own set. Stripped imports always route regardless,
|
|
54
|
+
* since a Function body cannot reach them. Default routes every free name.
|
|
55
|
+
*/
|
|
56
|
+
skipGlobals?: boolean | readonly string[];
|
|
50
57
|
/** Override the default string-generator mode for the names pack creates. */
|
|
51
58
|
stringGeneratorMode?: StringGeneratorModeOption;
|
|
52
59
|
}
|
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/transforms/pack.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/transforms/pack.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAuGlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAY9D"}
|
package/dist/transforms/pack.js
CHANGED
|
@@ -5,6 +5,102 @@ import { isInsideWith } from '../utils/ast.js';
|
|
|
5
5
|
import { isCalleeOrTagOf, isInStrictContext, referencesOrWritesVariable } from '../utils/paths.js';
|
|
6
6
|
import { mulberry32 } from '../utils/random.js';
|
|
7
7
|
import { StringGenerator } from '../utils/string-generator.js';
|
|
8
|
+
// The ECMAScript intrinsics and the common host globals. A detached Function
|
|
9
|
+
// body reaches every one of them and gets the same value, so pack can leave them
|
|
10
|
+
// bare. The CommonJS wrapper names (require, module, exports, __dirname,
|
|
11
|
+
// __filename) are left out on purpose. They are function parameters, not
|
|
12
|
+
// properties of the global object, so a Function body cannot see them and pack
|
|
13
|
+
// routes them like any other free name. `skipGlobals: true` opts into this list.
|
|
14
|
+
const STANDARD_GLOBALS = [
|
|
15
|
+
'globalThis',
|
|
16
|
+
'self',
|
|
17
|
+
'Infinity',
|
|
18
|
+
'NaN',
|
|
19
|
+
'undefined',
|
|
20
|
+
'parseInt',
|
|
21
|
+
'parseFloat',
|
|
22
|
+
'isNaN',
|
|
23
|
+
'isFinite',
|
|
24
|
+
'decodeURI',
|
|
25
|
+
'decodeURIComponent',
|
|
26
|
+
'encodeURI',
|
|
27
|
+
'encodeURIComponent',
|
|
28
|
+
'escape',
|
|
29
|
+
'unescape',
|
|
30
|
+
'btoa',
|
|
31
|
+
'atob',
|
|
32
|
+
'structuredClone',
|
|
33
|
+
'fetch',
|
|
34
|
+
'queueMicrotask',
|
|
35
|
+
'setTimeout',
|
|
36
|
+
'clearTimeout',
|
|
37
|
+
'setInterval',
|
|
38
|
+
'clearInterval',
|
|
39
|
+
'setImmediate',
|
|
40
|
+
'clearImmediate',
|
|
41
|
+
'Object',
|
|
42
|
+
'Function',
|
|
43
|
+
'Boolean',
|
|
44
|
+
'Symbol',
|
|
45
|
+
'BigInt',
|
|
46
|
+
'Number',
|
|
47
|
+
'Math',
|
|
48
|
+
'Date',
|
|
49
|
+
'String',
|
|
50
|
+
'RegExp',
|
|
51
|
+
'JSON',
|
|
52
|
+
'Promise',
|
|
53
|
+
'Proxy',
|
|
54
|
+
'Reflect',
|
|
55
|
+
'Error',
|
|
56
|
+
'EvalError',
|
|
57
|
+
'RangeError',
|
|
58
|
+
'ReferenceError',
|
|
59
|
+
'SyntaxError',
|
|
60
|
+
'TypeError',
|
|
61
|
+
'URIError',
|
|
62
|
+
'AggregateError',
|
|
63
|
+
'Array',
|
|
64
|
+
'Map',
|
|
65
|
+
'Set',
|
|
66
|
+
'WeakMap',
|
|
67
|
+
'WeakSet',
|
|
68
|
+
'WeakRef',
|
|
69
|
+
'FinalizationRegistry',
|
|
70
|
+
'ArrayBuffer',
|
|
71
|
+
'SharedArrayBuffer',
|
|
72
|
+
'DataView',
|
|
73
|
+
'Atomics',
|
|
74
|
+
'Int8Array',
|
|
75
|
+
'Uint8Array',
|
|
76
|
+
'Uint8ClampedArray',
|
|
77
|
+
'Int16Array',
|
|
78
|
+
'Uint16Array',
|
|
79
|
+
'Int32Array',
|
|
80
|
+
'Uint32Array',
|
|
81
|
+
'Float32Array',
|
|
82
|
+
'Float64Array',
|
|
83
|
+
'BigInt64Array',
|
|
84
|
+
'BigUint64Array',
|
|
85
|
+
'console',
|
|
86
|
+
'crypto',
|
|
87
|
+
'performance',
|
|
88
|
+
'Intl',
|
|
89
|
+
'URL',
|
|
90
|
+
'URLSearchParams',
|
|
91
|
+
'TextEncoder',
|
|
92
|
+
'TextDecoder',
|
|
93
|
+
'WebAssembly',
|
|
94
|
+
'window',
|
|
95
|
+
'document',
|
|
96
|
+
'location',
|
|
97
|
+
'postMessage',
|
|
98
|
+
'alert',
|
|
99
|
+
'confirm',
|
|
100
|
+
'global',
|
|
101
|
+
'process',
|
|
102
|
+
'Buffer',
|
|
103
|
+
];
|
|
8
104
|
/**
|
|
9
105
|
* Serializes the whole program to a string and rebuilds it at runtime through
|
|
10
106
|
* the `Function` constructor. A detached function body only reaches true globals
|
|
@@ -82,19 +178,41 @@ function packProgram(programPath, ctx) {
|
|
|
82
178
|
const readProperties = new Map();
|
|
83
179
|
const typeofProperties = new Map();
|
|
84
180
|
const settable = new Set();
|
|
181
|
+
const freshProperty = () => {
|
|
182
|
+
let property;
|
|
183
|
+
do {
|
|
184
|
+
// `__proto__` as an object-literal key would set the prototype rather
|
|
185
|
+
// than name an accessor.
|
|
186
|
+
property = generator.next();
|
|
187
|
+
} while (property === '__proto__');
|
|
188
|
+
return property;
|
|
189
|
+
};
|
|
85
190
|
const propertyFor = (registry, name) => {
|
|
86
191
|
let property = registry.get(name);
|
|
87
192
|
if (property === undefined) {
|
|
88
|
-
|
|
89
|
-
// `__proto__` as an object-literal key would set the prototype rather
|
|
90
|
-
// than name an accessor.
|
|
91
|
-
property = generator.next();
|
|
92
|
-
} while (property === '__proto__');
|
|
193
|
+
property = freshProperty();
|
|
93
194
|
registry.set(name, property);
|
|
94
195
|
}
|
|
95
196
|
return property;
|
|
96
197
|
};
|
|
97
198
|
const memberFor = (property) => t.memberExpression(t.identifier(objectName), t.stringLiteral(property), true);
|
|
199
|
+
// Import locals read as free once detached but are unreachable from a Function
|
|
200
|
+
// body, so they route even when the caller lists them in skipGlobals.
|
|
201
|
+
const importedNames = new Set();
|
|
202
|
+
for (const declaration of importDeclarations) {
|
|
203
|
+
for (const specifier of declaration.specifiers) {
|
|
204
|
+
importedNames.add(specifier.local.name);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const skipOption = ctx.pack?.skipGlobals ?? false;
|
|
208
|
+
let skipNames = [];
|
|
209
|
+
if (skipOption === true) {
|
|
210
|
+
skipNames = STANDARD_GLOBALS;
|
|
211
|
+
}
|
|
212
|
+
else if (skipOption !== false) {
|
|
213
|
+
skipNames = skipOption;
|
|
214
|
+
}
|
|
215
|
+
const skip = new Set(skipNames);
|
|
98
216
|
const isRoutable = (path) => {
|
|
99
217
|
const name = path.node.name;
|
|
100
218
|
// The wrapper parameter stays as written. `arguments` and `eval` are never
|
|
@@ -111,9 +229,26 @@ function packProgram(programPath, ctx) {
|
|
|
111
229
|
if (!referencesOrWritesVariable(path)) {
|
|
112
230
|
return false;
|
|
113
231
|
}
|
|
114
|
-
|
|
232
|
+
if (path.scope.getBinding(name)) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
return importedNames.has(name) || !skip.has(name);
|
|
115
236
|
};
|
|
237
|
+
// A strict script's top-level `this` is the global object, but a strict
|
|
238
|
+
// Function called plainly sees `undefined`. Rather than reach for `.call`,
|
|
239
|
+
// route top-level `this` through a captured property like any free name.
|
|
240
|
+
const routeTopLevelThis = bodyStrict && !wasModule;
|
|
241
|
+
let thisProperty = null;
|
|
116
242
|
const routingVisitor = {
|
|
243
|
+
ThisExpression(path) {
|
|
244
|
+
if (!routeTopLevelThis || !isTopLevelThis(path)) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (thisProperty === null) {
|
|
248
|
+
thisProperty = freshProperty();
|
|
249
|
+
}
|
|
250
|
+
path.replaceWith(memberFor(thisProperty));
|
|
251
|
+
},
|
|
117
252
|
UnaryExpression(path) {
|
|
118
253
|
if (path.node.operator !== 'typeof') {
|
|
119
254
|
return;
|
|
@@ -161,6 +296,7 @@ function packProgram(programPath, ctx) {
|
|
|
161
296
|
settable,
|
|
162
297
|
setterParam,
|
|
163
298
|
strict: bodyStrict,
|
|
299
|
+
thisProperty,
|
|
164
300
|
});
|
|
165
301
|
const constructorReference = shadowedConstructor
|
|
166
302
|
? t.memberExpression(t.functionExpression(null, [], t.blockStatement([])), t.identifier('constructor'))
|
|
@@ -169,15 +305,7 @@ function packProgram(programPath, ctx) {
|
|
|
169
305
|
t.stringLiteral(objectName),
|
|
170
306
|
t.stringLiteral(innerCode),
|
|
171
307
|
]);
|
|
172
|
-
|
|
173
|
-
// called strict function would instead see `undefined`, so pass the global
|
|
174
|
-
// `this` of the sloppy output script.
|
|
175
|
-
const invocation = bodyStrict && !wasModule
|
|
176
|
-
? t.callExpression(t.memberExpression(wrapper, t.identifier('call')), [
|
|
177
|
-
t.thisExpression(),
|
|
178
|
-
objectExpression,
|
|
179
|
-
])
|
|
180
|
-
: t.callExpression(wrapper, [objectExpression]);
|
|
308
|
+
const invocation = t.callExpression(wrapper, [objectExpression]);
|
|
181
309
|
programNode.body = [...importDeclarations, t.expressionStatement(invocation)];
|
|
182
310
|
programNode.directives = [];
|
|
183
311
|
programNode.sourceType = importDeclarations.length > 0 ? 'module' : 'script';
|
|
@@ -201,6 +329,41 @@ function collectImportDeclarations(programPath) {
|
|
|
201
329
|
function bindsFunctionConstructor(declaration) {
|
|
202
330
|
return declaration.specifiers.some((specifier) => specifier.local.name === 'Function');
|
|
203
331
|
}
|
|
332
|
+
// A `this` refers to the top-level `this` when no enclosing non-arrow function,
|
|
333
|
+
// class field, or static block captures it before the program does. A computed
|
|
334
|
+
// member key is the exception: it evaluates in the scope surrounding its method
|
|
335
|
+
// or field, not that member's `this`, so a `this` reached through a boundary's
|
|
336
|
+
// `key` skips it and keeps looking outward. `thisBinding` keeps every path
|
|
337
|
+
// predicate off the walked `current`, whose narrowed union would otherwise trip
|
|
338
|
+
// NodePath's invariant generic when reassigned to `child`.
|
|
339
|
+
function isTopLevelThis(path) {
|
|
340
|
+
let child = path;
|
|
341
|
+
let current = path.parentPath;
|
|
342
|
+
while (current) {
|
|
343
|
+
const binding = thisBinding(current);
|
|
344
|
+
if (binding === 'program') {
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
if (binding === 'captured' && child.key !== 'key') {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
child = current;
|
|
351
|
+
current = current.parentPath;
|
|
352
|
+
}
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
function thisBinding(boundary) {
|
|
356
|
+
if (boundary.isProgram()) {
|
|
357
|
+
return 'program';
|
|
358
|
+
}
|
|
359
|
+
if ((boundary.isFunction() && !boundary.isArrowFunctionExpression()) ||
|
|
360
|
+
boundary.isClassProperty() ||
|
|
361
|
+
boundary.isClassPrivateProperty() ||
|
|
362
|
+
boundary.isStaticBlock()) {
|
|
363
|
+
return 'captured';
|
|
364
|
+
}
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
204
367
|
function isBareDeleteArgument(path) {
|
|
205
368
|
const parent = path.parentPath;
|
|
206
369
|
return (parent != null &&
|
|
@@ -260,6 +423,12 @@ function buildAccessorObject(spec) {
|
|
|
260
423
|
for (const [name, property] of spec.typeofProperties) {
|
|
261
424
|
properties.push(t.objectMethod('get', t.stringLiteral(property), [], t.blockStatement([t.returnStatement(t.unaryExpression('typeof', t.identifier(name)))])));
|
|
262
425
|
}
|
|
426
|
+
// This is a data property. Its `this` value evaluates in the output script's
|
|
427
|
+
// top-level scope, where `this` is the global object. A getter would bind
|
|
428
|
+
// `this` to the accessor object instead.
|
|
429
|
+
if (spec.thisProperty !== null) {
|
|
430
|
+
properties.push(t.objectProperty(t.stringLiteral(spec.thisProperty), t.thisExpression()));
|
|
431
|
+
}
|
|
263
432
|
return t.objectExpression(properties);
|
|
264
433
|
}
|
|
265
434
|
//# sourceMappingURL=pack.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/transforms/pack.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/transforms/pack.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AACvC,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAIjC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,6EAA6E;AAC7E,iFAAiF;AACjF,yEAAyE;AACzE,yEAAyE;AACzE,+EAA+E;AAC/E,iFAAiF;AACjF,MAAM,gBAAgB,GAAsB;IAC1C,YAAY;IACZ,MAAM;IACN,UAAU;IACV,KAAK;IACL,WAAW;IACX,UAAU;IACV,YAAY;IACZ,OAAO;IACP,UAAU;IACV,WAAW;IACX,oBAAoB;IACpB,WAAW;IACX,oBAAoB;IACpB,QAAQ;IACR,UAAU;IACV,MAAM;IACN,MAAM;IACN,iBAAiB;IACjB,OAAO;IACP,gBAAgB;IAChB,YAAY;IACZ,cAAc;IACd,aAAa;IACb,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,QAAQ;IACR,UAAU;IACV,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,SAAS;IACT,OAAO;IACP,SAAS;IACT,OAAO;IACP,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,aAAa;IACb,WAAW;IACX,UAAU;IACV,gBAAgB;IAChB,OAAO;IACP,KAAK;IACL,KAAK;IACL,SAAS;IACT,SAAS;IACT,SAAS;IACT,sBAAsB;IACtB,aAAa;IACb,mBAAmB;IACnB,UAAU;IACV,SAAS;IACT,WAAW;IACX,YAAY;IACZ,mBAAmB;IACnB,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,SAAS;IACT,QAAQ;IACR,aAAa;IACb,MAAM;IACN,KAAK;IACL,iBAAiB;IACjB,aAAa;IACb,aAAa;IACb,aAAa;IACb,QAAQ;IACR,UAAU;IACV,UAAU;IACV,aAAa;IACb,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;CACT,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,IAAI,CAAC,GAAS,EAAE,GAAqB;IACnD,IAAI,WAAW,GAA+B,IAAI,CAAA;IAClD,QAAQ,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,IAAI;YACV,WAAW,GAAG,IAAI,CAAA;YAClB,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC;KACF,CAAC,CAAA;IACF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,WAAgC,EAAE,GAAqB;IAC1E,eAAe,CAAC,WAAW,CAAC,CAAA;IAC5B,MAAM,WAAW,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAA;IAC1D,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/D,8EAA8E;IAC9E,wEAAwE;IACxE,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAClE,wBAAwB,CAAC,WAAW,CAAC,CACtC,CAAA;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAA;IACpC,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,KAAK,QAAQ,CAAA;IACrD,2EAA2E;IAC3E,oDAAoD;IACpD,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,EAAE,YAAY,IAAI,KAAK,CAAA;IACpD,MAAM,UAAU,GAAG,CAAC,YAAY,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAA;IAElE,8EAA8E;IAC9E,0EAA0E;IAC1E,8CAA8C;IAC9C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAA;IACf,CAAC;IACD,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAEzB,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAA;IACnE,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACpF,MAAM,eAAe,GAAG,GAAW,EAAE;QACnC,IAAI,IAAY,CAAA;QAChB,GAAG,CAAC;YACF,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC,QAAQ,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAC;QAC7B,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IACD,MAAM,UAAU,GAAG,eAAe,EAAE,CAAA;IACpC,MAAM,WAAW,GAAG,eAAe,EAAE,CAAA;IAErC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;IAChD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAA;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,MAAM,aAAa,GAAG,GAAW,EAAE;QACjC,IAAI,QAAgB,CAAA;QACpB,GAAG,CAAC;YACF,sEAAsE;YACtE,yBAAyB;YACzB,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QAC7B,CAAC,QAAQ,QAAQ,KAAK,WAAW,EAAC;QAClC,OAAO,QAAQ,CAAA;IACjB,CAAC,CAAA;IACD,MAAM,WAAW,GAAG,CAAC,QAA6B,EAAE,IAAY,EAAU,EAAE;QAC1E,IAAI,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,GAAG,aAAa,EAAE,CAAA;YAC1B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC9B,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC,CAAA;IACD,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAsB,EAAE,CACzD,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;IAE/E,+EAA+E;IAC/E,sEAAsE;IACtE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;IACvC,KAAK,MAAM,WAAW,IAAI,kBAAkB,EAAE,CAAC;QAC7C,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;YAC/C,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,KAAK,CAAA;IACjD,IAAI,SAAS,GAAsB,EAAE,CAAA;IACrC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,SAAS,GAAG,gBAAgB,CAAA;IAC9B,CAAC;SAAM,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAChC,SAAS,GAAG,UAAU,CAAA;IACxB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,SAAS,CAAC,CAAA;IAEvC,MAAM,UAAU,GAAG,CAAC,IAA4B,EAAW,EAAE;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAC3B,2EAA2E;QAC3E,6EAA6E;QAC7E,8EAA8E;QAC9E,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACnE,OAAO,KAAK,CAAA;QACd,CAAC;QACD,6EAA6E;QAC7E,0EAA0E;QAC1E,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnD,CAAC,CAAA;IAED,wEAAwE;IACxE,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,iBAAiB,GAAG,UAAU,IAAI,CAAC,SAAS,CAAA;IAClD,IAAI,YAAY,GAAkB,IAAI,CAAA;IAEtC,MAAM,cAAc,GAAY;QAC9B,cAAc,CAAC,IAAI;YACjB,IAAI,CAAC,iBAAiB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAM;YACR,CAAC;YACD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,YAAY,GAAG,aAAa,EAAE,CAAA;YAChC,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAA;QAC3C,CAAC;QACD,eAAe,CAAC,IAAI;YAClB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAM;YACR,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACrC,2EAA2E;YAC3E,8DAA8D;YAC9D,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtD,OAAM;YACR,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,gBAAgB,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAChF,CAAC;QACD,UAAU,CAAC,IAAI;YACb,yEAAyE;YACzE,uEAAuE;YACvE,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,OAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;YAC3B,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACpB,CAAC;YACD,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAA;YAC3D,0EAA0E;YAC1E,wCAAwC;YACxC,IAAI,CAAC,WAAW,CACd,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CACrF,CAAA;QACH,CAAC;KACF,CAAA;IACD,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;IAEpC,6EAA6E;IAC7E,wDAAwD;IACxD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAA;IAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,IAAI,aAAa,IAAI,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;IACrE,CAAC;IAED,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzF,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE;QACrE,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC,IAAI,CAAA;IAEP,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;QAC3C,cAAc;QACd,gBAAgB;QAChB,QAAQ;QACR,WAAW;QACX,MAAM,EAAE,UAAU;QAClB,YAAY;KACb,CAAC,CAAA;IAEF,MAAM,oBAAoB,GAAG,mBAAmB;QAC9C,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAChB,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EACpD,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAC5B;QACH,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,cAAc,CAAC,oBAAoB,EAAE;QACrD,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC;QAC3B,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC;KAC3B,CAAC,CAAA;IACF,MAAM,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAEhE,WAAW,CAAC,IAAI,GAAG,CAAC,GAAG,kBAAkB,EAAE,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAA;IAC7E,WAAW,CAAC,UAAU,GAAG,EAAE,CAAA;IAC3B,WAAW,CAAC,UAAU,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC5E,OAAO,IAAI,CAAA;AACb,CAAC;AAED,8EAA8E;AAC9E,4EAA4E;AAC5E,SAAS,eAAe,CAAC,WAAgC;IACvD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC1C,CAAC,SAAS,EAAE,EAAE,CACZ,CAAC,CAAC,wBAAwB,CAAC,SAAS,CAAC;QACrC,CAAC,CAAC,0BAA0B,CAAC,SAAS,CAAC;QACvC,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,CACtC,CAAA;IACD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,WAAgC;IAEhC,OAAO,WAAW;SACf,GAAG,CAAC,MAAM,CAAC;SACX,MAAM,CAAC,CAAC,SAAS,EAA8C,EAAE,CAChE,SAAS,CAAC,mBAAmB,EAAE,CAChC,CAAA;AACL,CAAC;AAED,SAAS,wBAAwB,CAAC,WAAgC;IAChE,OAAO,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;AACxF,CAAC;AAED,gFAAgF;AAChF,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,2EAA2E;AAC3E,gFAAgF;AAChF,2DAA2D;AAC3D,SAAS,cAAc,CAAC,IAAgC;IACtD,IAAI,KAAK,GAAa,IAAI,CAAA;IAC1B,IAAI,OAAO,GAAoB,IAAI,CAAC,UAAU,CAAA;IAC9C,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;QACpC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YAClD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,KAAK,GAAG,OAAO,CAAA;QACf,OAAO,GAAG,OAAO,CAAC,UAAU,CAAA;IAC9B,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,WAAW,CAAC,QAAkB;IACrC,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IACE,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,EAAE,CAAC;QAChE,QAAQ,CAAC,eAAe,EAAE;QAC1B,QAAQ,CAAC,sBAAsB,EAAE;QACjC,QAAQ,CAAC,aAAa,EAAE,EACxB,CAAC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,oBAAoB,CAAC,IAA4B;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAA;IAC9B,OAAO,CACL,MAAM,IAAI,IAAI;QACd,MAAM,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CACnC,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA4B;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAA;IAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IACtB,IAAI,MAAM,CAAC,sBAAsB,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACjE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,MAAM,CAAC,kBAAkB,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACjE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC1F,OAAO,IAAI,CAAA;IACb,CAAC;IACD,2EAA2E;IAC3E,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAA;AACnC,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAkB,EAClB,kBAAyC;IAEzC,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,CAAC,UAAU,CAAC,CAAC,CAAA;IAC3C,KAAK,MAAM,WAAW,IAAI,kBAAkB,EAAE,CAAC;QAC7C,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;YAC/C,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IACD,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/B,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAWD,SAAS,mBAAmB,CAAC,IAAwB;IACnD,MAAM,UAAU,GAA0C,EAAE,CAAA;IAC5D,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACnD,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,YAAY,CACZ,KAAK,EACL,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,EACzB,EAAE,EACF,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC1D,CACF,CAAA;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC;gBAClC,CAAC,CAAC,mBAAmB,CACnB,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAChF;aACF,CAAC,CAAA;YACF,sEAAsE;YACtE,sDAAsD;YACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC3E,CAAC;YACD,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,YAAY,CACZ,KAAK,EACL,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,EACzB,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAChC,UAAU,CACX,CACF,CAAA;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrD,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,YAAY,CACZ,KAAK,EACL,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,EACzB,EAAE,EACF,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CACvF,CACF,CAAA;IACH,CAAC;IACD,6EAA6E;IAC7E,0EAA0E;IAC1E,yCAAyC;IACzC,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;IAC3F,CAAC;IACD,OAAO,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAA;AACvC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webfuscator",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "JavaScript obfuscator built on Babel",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"babel",
|
|
@@ -35,7 +35,8 @@
|
|
|
35
35
|
"source": "./src/index.ts",
|
|
36
36
|
"types": "./dist/index.d.ts",
|
|
37
37
|
"default": "./dist/index.js"
|
|
38
|
-
}
|
|
38
|
+
},
|
|
39
|
+
"./package.json": "./package.json"
|
|
39
40
|
},
|
|
40
41
|
"publishConfig": {
|
|
41
42
|
"access": "public"
|
|
@@ -44,8 +45,8 @@
|
|
|
44
45
|
"prepublishOnly": "pnpm --workspace-root check",
|
|
45
46
|
"prepack": "pnpm run build",
|
|
46
47
|
"build": "node --eval \"require('node:fs').rmSync('dist', { force: true, recursive: true })\" && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/verify-dist.mjs",
|
|
47
|
-
"check": "pnpm run typecheck && pnpm run test",
|
|
48
48
|
"test": "vitest run",
|
|
49
|
+
"test:watch": "vitest",
|
|
49
50
|
"typecheck": "tsc --noEmit"
|
|
50
51
|
},
|
|
51
52
|
"dependencies": {
|
|
@@ -3,7 +3,6 @@ import type { Binding, NodePath, Visitor } from '@babel/traverse'
|
|
|
3
3
|
import * as t from '@babel/types'
|
|
4
4
|
import type { File } from '@babel/types'
|
|
5
5
|
|
|
6
|
-
import { walkOwnFunctionScope } from '../utils/ast'
|
|
7
6
|
import { hasAnnexBFunctionAlias, referencesOrWritesVariable } from '../utils/paths'
|
|
8
7
|
|
|
9
8
|
export interface InlineCandidate {
|
|
@@ -15,7 +14,10 @@ export interface InlineCandidate {
|
|
|
15
14
|
declarationPath: NodePath
|
|
16
15
|
}
|
|
17
16
|
|
|
18
|
-
//
|
|
17
|
+
// Inlining splices a deep clone of the callee body, so any call that clone
|
|
18
|
+
// contains expands again. Expansion stops only when the graph below is acyclic,
|
|
19
|
+
// so this pass drops every candidate on a cycle before the inliner reaches a
|
|
20
|
+
// call site.
|
|
19
21
|
export function analyzeInlineability(ast: File): Map<string, InlineCandidate> {
|
|
20
22
|
const rawCandidates: InlineCandidate[] = []
|
|
21
23
|
|
|
@@ -75,34 +77,45 @@ export function analyzeInlineability(ast: File): Map<string, InlineCandidate> {
|
|
|
75
77
|
candidateByName.set(candidate.name, candidate)
|
|
76
78
|
}
|
|
77
79
|
|
|
78
|
-
|
|
80
|
+
const edges = buildExpansionGraph(candidateByName)
|
|
81
|
+
for (const scc of tarjanSCC([...candidateByName.keys()], edges)) {
|
|
82
|
+
// Tarjan reports an acyclic node as a singleton too, so a self-recursive
|
|
83
|
+
// candidate shows up only as an edge back to itself.
|
|
84
|
+
if (scc.length === 1 && !edges.get(scc[0]!)!.has(scc[0]!)) {
|
|
85
|
+
continue
|
|
86
|
+
}
|
|
87
|
+
for (const name of scc) {
|
|
88
|
+
candidateByName.delete(name)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return candidateByName
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// A clone keeps the whole body, so a reference inside a closure, an object
|
|
95
|
+
// method, or a getter is as live in the copy as one at the top level. Walking
|
|
96
|
+
// out to every enclosing candidate, rather than stopping at the innermost, also
|
|
97
|
+
// covers a candidate declared inside another candidate's body.
|
|
98
|
+
function buildExpansionGraph(
|
|
99
|
+
candidateByName: Map<string, InlineCandidate>,
|
|
100
|
+
): Map<string, Set<string>> {
|
|
101
|
+
const nameByFnNode = new Map<t.Function, string>()
|
|
79
102
|
const edges = new Map<string, Set<string>>()
|
|
80
|
-
for (const candidate of
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (t.isIdentifier(node) && node.name !== candidate.name && candidateByName.has(node.name)) {
|
|
84
|
-
callees.add(node.name)
|
|
85
|
-
}
|
|
86
|
-
})
|
|
87
|
-
edges.set(candidate.name, callees)
|
|
103
|
+
for (const [name, candidate] of candidateByName) {
|
|
104
|
+
nameByFnNode.set(candidate.fnNode, name)
|
|
105
|
+
edges.set(name, new Set())
|
|
88
106
|
}
|
|
89
107
|
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
inCycle.add(name)
|
|
108
|
+
for (const [name, candidate] of candidateByName) {
|
|
109
|
+
for (const ref of candidate.binding.referencePaths) {
|
|
110
|
+
for (let owner = ref.parentPath; owner; owner = owner.parentPath) {
|
|
111
|
+
const ownerName = owner.isFunction() ? nameByFnNode.get(owner.node) : undefined
|
|
112
|
+
if (ownerName !== undefined) {
|
|
113
|
+
edges.get(ownerName)!.add(name)
|
|
114
|
+
}
|
|
98
115
|
}
|
|
99
116
|
}
|
|
100
117
|
}
|
|
101
|
-
|
|
102
|
-
for (const name of inCycle) {
|
|
103
|
-
candidateByName.delete(name)
|
|
104
|
-
}
|
|
105
|
-
return candidateByName
|
|
118
|
+
return edges
|
|
106
119
|
}
|
|
107
120
|
|
|
108
121
|
function checkCandidate(
|
|
@@ -142,7 +155,7 @@ function checkCandidate(
|
|
|
142
155
|
return null
|
|
143
156
|
}
|
|
144
157
|
|
|
145
|
-
const analysis = analyzeBody(
|
|
158
|
+
const analysis = analyzeBody(fnPath as NodePath<t.Function>)
|
|
146
159
|
if (analysis.unsafe || analysis.closureCapture) {
|
|
147
160
|
return null
|
|
148
161
|
}
|
|
@@ -200,9 +213,8 @@ interface BodyAnalysis {
|
|
|
200
213
|
closureCapture: boolean
|
|
201
214
|
}
|
|
202
215
|
|
|
203
|
-
function analyzeBody(
|
|
216
|
+
function analyzeBody(fnPath: NodePath<t.Function>): BodyAnalysis {
|
|
204
217
|
const state: AnalyzeBodyState = {
|
|
205
|
-
candidateName: name,
|
|
206
218
|
outerScope: fnPath.scope,
|
|
207
219
|
innerFnDepth: 0,
|
|
208
220
|
unsafe: false,
|
|
@@ -216,7 +228,6 @@ function analyzeBody(name: string, fnPath: NodePath<t.Function>): BodyAnalysis {
|
|
|
216
228
|
}
|
|
217
229
|
|
|
218
230
|
interface AnalyzeBodyState {
|
|
219
|
-
candidateName: string
|
|
220
231
|
outerScope: NodePath<t.Function>['scope']
|
|
221
232
|
innerFnDepth: number
|
|
222
233
|
unsafe: boolean
|
|
@@ -268,10 +279,7 @@ const analyzeBodyVisitor: Visitor<AnalyzeBodyState> = {
|
|
|
268
279
|
},
|
|
269
280
|
Identifier(path, state) {
|
|
270
281
|
const name = path.node.name
|
|
271
|
-
if (
|
|
272
|
-
state.innerFnDepth === 0 &&
|
|
273
|
-
(name === 'arguments' || name === 'eval' || name === state.candidateName)
|
|
274
|
-
) {
|
|
282
|
+
if (state.innerFnDepth === 0 && (name === 'arguments' || name === 'eval')) {
|
|
275
283
|
state.unsafe = true
|
|
276
284
|
path.stop()
|
|
277
285
|
return
|
package/src/options.ts
CHANGED
|
@@ -84,6 +84,13 @@ export interface PackOptions {
|
|
|
84
84
|
* source is strict. This deliberately changes behavior. Default `false`.
|
|
85
85
|
*/
|
|
86
86
|
escapeStrict?: boolean
|
|
87
|
+
/**
|
|
88
|
+
* Free names to leave un-routed because they resolve to the real global from
|
|
89
|
+
* inside a detached Function body. `true` uses the built-in standard-globals
|
|
90
|
+
* list; an array names your own set. Stripped imports always route regardless,
|
|
91
|
+
* since a Function body cannot reach them. Default routes every free name.
|
|
92
|
+
*/
|
|
93
|
+
skipGlobals?: boolean | readonly string[]
|
|
87
94
|
/** Override the default string-generator mode for the names pack creates. */
|
|
88
95
|
stringGeneratorMode?: StringGeneratorModeOption
|
|
89
96
|
}
|
package/src/transforms/pack.ts
CHANGED
|
@@ -10,6 +10,103 @@ import { isCalleeOrTagOf, isInStrictContext, referencesOrWritesVariable } from '
|
|
|
10
10
|
import { mulberry32 } from '../utils/random'
|
|
11
11
|
import { StringGenerator } from '../utils/string-generator'
|
|
12
12
|
|
|
13
|
+
// The ECMAScript intrinsics and the common host globals. A detached Function
|
|
14
|
+
// body reaches every one of them and gets the same value, so pack can leave them
|
|
15
|
+
// bare. The CommonJS wrapper names (require, module, exports, __dirname,
|
|
16
|
+
// __filename) are left out on purpose. They are function parameters, not
|
|
17
|
+
// properties of the global object, so a Function body cannot see them and pack
|
|
18
|
+
// routes them like any other free name. `skipGlobals: true` opts into this list.
|
|
19
|
+
const STANDARD_GLOBALS: readonly string[] = [
|
|
20
|
+
'globalThis',
|
|
21
|
+
'self',
|
|
22
|
+
'Infinity',
|
|
23
|
+
'NaN',
|
|
24
|
+
'undefined',
|
|
25
|
+
'parseInt',
|
|
26
|
+
'parseFloat',
|
|
27
|
+
'isNaN',
|
|
28
|
+
'isFinite',
|
|
29
|
+
'decodeURI',
|
|
30
|
+
'decodeURIComponent',
|
|
31
|
+
'encodeURI',
|
|
32
|
+
'encodeURIComponent',
|
|
33
|
+
'escape',
|
|
34
|
+
'unescape',
|
|
35
|
+
'btoa',
|
|
36
|
+
'atob',
|
|
37
|
+
'structuredClone',
|
|
38
|
+
'fetch',
|
|
39
|
+
'queueMicrotask',
|
|
40
|
+
'setTimeout',
|
|
41
|
+
'clearTimeout',
|
|
42
|
+
'setInterval',
|
|
43
|
+
'clearInterval',
|
|
44
|
+
'setImmediate',
|
|
45
|
+
'clearImmediate',
|
|
46
|
+
'Object',
|
|
47
|
+
'Function',
|
|
48
|
+
'Boolean',
|
|
49
|
+
'Symbol',
|
|
50
|
+
'BigInt',
|
|
51
|
+
'Number',
|
|
52
|
+
'Math',
|
|
53
|
+
'Date',
|
|
54
|
+
'String',
|
|
55
|
+
'RegExp',
|
|
56
|
+
'JSON',
|
|
57
|
+
'Promise',
|
|
58
|
+
'Proxy',
|
|
59
|
+
'Reflect',
|
|
60
|
+
'Error',
|
|
61
|
+
'EvalError',
|
|
62
|
+
'RangeError',
|
|
63
|
+
'ReferenceError',
|
|
64
|
+
'SyntaxError',
|
|
65
|
+
'TypeError',
|
|
66
|
+
'URIError',
|
|
67
|
+
'AggregateError',
|
|
68
|
+
'Array',
|
|
69
|
+
'Map',
|
|
70
|
+
'Set',
|
|
71
|
+
'WeakMap',
|
|
72
|
+
'WeakSet',
|
|
73
|
+
'WeakRef',
|
|
74
|
+
'FinalizationRegistry',
|
|
75
|
+
'ArrayBuffer',
|
|
76
|
+
'SharedArrayBuffer',
|
|
77
|
+
'DataView',
|
|
78
|
+
'Atomics',
|
|
79
|
+
'Int8Array',
|
|
80
|
+
'Uint8Array',
|
|
81
|
+
'Uint8ClampedArray',
|
|
82
|
+
'Int16Array',
|
|
83
|
+
'Uint16Array',
|
|
84
|
+
'Int32Array',
|
|
85
|
+
'Uint32Array',
|
|
86
|
+
'Float32Array',
|
|
87
|
+
'Float64Array',
|
|
88
|
+
'BigInt64Array',
|
|
89
|
+
'BigUint64Array',
|
|
90
|
+
'console',
|
|
91
|
+
'crypto',
|
|
92
|
+
'performance',
|
|
93
|
+
'Intl',
|
|
94
|
+
'URL',
|
|
95
|
+
'URLSearchParams',
|
|
96
|
+
'TextEncoder',
|
|
97
|
+
'TextDecoder',
|
|
98
|
+
'WebAssembly',
|
|
99
|
+
'window',
|
|
100
|
+
'document',
|
|
101
|
+
'location',
|
|
102
|
+
'postMessage',
|
|
103
|
+
'alert',
|
|
104
|
+
'confirm',
|
|
105
|
+
'global',
|
|
106
|
+
'process',
|
|
107
|
+
'Buffer',
|
|
108
|
+
]
|
|
109
|
+
|
|
13
110
|
/**
|
|
14
111
|
* Serializes the whole program to a string and rebuilds it at runtime through
|
|
15
112
|
* the `Function` constructor. A detached function body only reaches true globals
|
|
@@ -94,14 +191,19 @@ function packProgram(programPath: NodePath<t.Program>, ctx: TransformContext): b
|
|
|
94
191
|
const readProperties = new Map<string, string>()
|
|
95
192
|
const typeofProperties = new Map<string, string>()
|
|
96
193
|
const settable = new Set<string>()
|
|
194
|
+
const freshProperty = (): string => {
|
|
195
|
+
let property: string
|
|
196
|
+
do {
|
|
197
|
+
// `__proto__` as an object-literal key would set the prototype rather
|
|
198
|
+
// than name an accessor.
|
|
199
|
+
property = generator.next()
|
|
200
|
+
} while (property === '__proto__')
|
|
201
|
+
return property
|
|
202
|
+
}
|
|
97
203
|
const propertyFor = (registry: Map<string, string>, name: string): string => {
|
|
98
204
|
let property = registry.get(name)
|
|
99
205
|
if (property === undefined) {
|
|
100
|
-
|
|
101
|
-
// `__proto__` as an object-literal key would set the prototype rather
|
|
102
|
-
// than name an accessor.
|
|
103
|
-
property = generator.next()
|
|
104
|
-
} while (property === '__proto__')
|
|
206
|
+
property = freshProperty()
|
|
105
207
|
registry.set(name, property)
|
|
106
208
|
}
|
|
107
209
|
return property
|
|
@@ -109,6 +211,23 @@ function packProgram(programPath: NodePath<t.Program>, ctx: TransformContext): b
|
|
|
109
211
|
const memberFor = (property: string): t.MemberExpression =>
|
|
110
212
|
t.memberExpression(t.identifier(objectName), t.stringLiteral(property), true)
|
|
111
213
|
|
|
214
|
+
// Import locals read as free once detached but are unreachable from a Function
|
|
215
|
+
// body, so they route even when the caller lists them in skipGlobals.
|
|
216
|
+
const importedNames = new Set<string>()
|
|
217
|
+
for (const declaration of importDeclarations) {
|
|
218
|
+
for (const specifier of declaration.specifiers) {
|
|
219
|
+
importedNames.add(specifier.local.name)
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const skipOption = ctx.pack?.skipGlobals ?? false
|
|
223
|
+
let skipNames: readonly string[] = []
|
|
224
|
+
if (skipOption === true) {
|
|
225
|
+
skipNames = STANDARD_GLOBALS
|
|
226
|
+
} else if (skipOption !== false) {
|
|
227
|
+
skipNames = skipOption
|
|
228
|
+
}
|
|
229
|
+
const skip = new Set<string>(skipNames)
|
|
230
|
+
|
|
112
231
|
const isRoutable = (path: NodePath<t.Identifier>): boolean => {
|
|
113
232
|
const name = path.node.name
|
|
114
233
|
// The wrapper parameter stays as written. `arguments` and `eval` are never
|
|
@@ -125,10 +244,28 @@ function packProgram(programPath: NodePath<t.Program>, ctx: TransformContext): b
|
|
|
125
244
|
if (!referencesOrWritesVariable(path)) {
|
|
126
245
|
return false
|
|
127
246
|
}
|
|
128
|
-
|
|
247
|
+
if (path.scope.getBinding(name)) {
|
|
248
|
+
return false
|
|
249
|
+
}
|
|
250
|
+
return importedNames.has(name) || !skip.has(name)
|
|
129
251
|
}
|
|
130
252
|
|
|
253
|
+
// A strict script's top-level `this` is the global object, but a strict
|
|
254
|
+
// Function called plainly sees `undefined`. Rather than reach for `.call`,
|
|
255
|
+
// route top-level `this` through a captured property like any free name.
|
|
256
|
+
const routeTopLevelThis = bodyStrict && !wasModule
|
|
257
|
+
let thisProperty: string | null = null
|
|
258
|
+
|
|
131
259
|
const routingVisitor: Visitor = {
|
|
260
|
+
ThisExpression(path) {
|
|
261
|
+
if (!routeTopLevelThis || !isTopLevelThis(path)) {
|
|
262
|
+
return
|
|
263
|
+
}
|
|
264
|
+
if (thisProperty === null) {
|
|
265
|
+
thisProperty = freshProperty()
|
|
266
|
+
}
|
|
267
|
+
path.replaceWith(memberFor(thisProperty))
|
|
268
|
+
},
|
|
132
269
|
UnaryExpression(path) {
|
|
133
270
|
if (path.node.operator !== 'typeof') {
|
|
134
271
|
return
|
|
@@ -181,6 +318,7 @@ function packProgram(programPath: NodePath<t.Program>, ctx: TransformContext): b
|
|
|
181
318
|
settable,
|
|
182
319
|
setterParam,
|
|
183
320
|
strict: bodyStrict,
|
|
321
|
+
thisProperty,
|
|
184
322
|
})
|
|
185
323
|
|
|
186
324
|
const constructorReference = shadowedConstructor
|
|
@@ -193,16 +331,7 @@ function packProgram(programPath: NodePath<t.Program>, ctx: TransformContext): b
|
|
|
193
331
|
t.stringLiteral(objectName),
|
|
194
332
|
t.stringLiteral(innerCode),
|
|
195
333
|
])
|
|
196
|
-
|
|
197
|
-
// called strict function would instead see `undefined`, so pass the global
|
|
198
|
-
// `this` of the sloppy output script.
|
|
199
|
-
const invocation =
|
|
200
|
-
bodyStrict && !wasModule
|
|
201
|
-
? t.callExpression(t.memberExpression(wrapper, t.identifier('call')), [
|
|
202
|
-
t.thisExpression(),
|
|
203
|
-
objectExpression,
|
|
204
|
-
])
|
|
205
|
-
: t.callExpression(wrapper, [objectExpression])
|
|
334
|
+
const invocation = t.callExpression(wrapper, [objectExpression])
|
|
206
335
|
|
|
207
336
|
programNode.body = [...importDeclarations, t.expressionStatement(invocation)]
|
|
208
337
|
programNode.directives = []
|
|
@@ -238,6 +367,45 @@ function bindsFunctionConstructor(declaration: t.ImportDeclaration): boolean {
|
|
|
238
367
|
return declaration.specifiers.some((specifier) => specifier.local.name === 'Function')
|
|
239
368
|
}
|
|
240
369
|
|
|
370
|
+
// A `this` refers to the top-level `this` when no enclosing non-arrow function,
|
|
371
|
+
// class field, or static block captures it before the program does. A computed
|
|
372
|
+
// member key is the exception: it evaluates in the scope surrounding its method
|
|
373
|
+
// or field, not that member's `this`, so a `this` reached through a boundary's
|
|
374
|
+
// `key` skips it and keeps looking outward. `thisBinding` keeps every path
|
|
375
|
+
// predicate off the walked `current`, whose narrowed union would otherwise trip
|
|
376
|
+
// NodePath's invariant generic when reassigned to `child`.
|
|
377
|
+
function isTopLevelThis(path: NodePath<t.ThisExpression>): boolean {
|
|
378
|
+
let child: NodePath = path
|
|
379
|
+
let current: NodePath | null = path.parentPath
|
|
380
|
+
while (current) {
|
|
381
|
+
const binding = thisBinding(current)
|
|
382
|
+
if (binding === 'program') {
|
|
383
|
+
return true
|
|
384
|
+
}
|
|
385
|
+
if (binding === 'captured' && child.key !== 'key') {
|
|
386
|
+
return false
|
|
387
|
+
}
|
|
388
|
+
child = current
|
|
389
|
+
current = current.parentPath
|
|
390
|
+
}
|
|
391
|
+
return false
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function thisBinding(boundary: NodePath): 'captured' | 'program' | null {
|
|
395
|
+
if (boundary.isProgram()) {
|
|
396
|
+
return 'program'
|
|
397
|
+
}
|
|
398
|
+
if (
|
|
399
|
+
(boundary.isFunction() && !boundary.isArrowFunctionExpression()) ||
|
|
400
|
+
boundary.isClassProperty() ||
|
|
401
|
+
boundary.isClassPrivateProperty() ||
|
|
402
|
+
boundary.isStaticBlock()
|
|
403
|
+
) {
|
|
404
|
+
return 'captured'
|
|
405
|
+
}
|
|
406
|
+
return null
|
|
407
|
+
}
|
|
408
|
+
|
|
241
409
|
function isBareDeleteArgument(path: NodePath<t.Identifier>): boolean {
|
|
242
410
|
const parent = path.parentPath
|
|
243
411
|
return (
|
|
@@ -291,11 +459,12 @@ interface AccessorObjectSpec {
|
|
|
291
459
|
setterParam: string
|
|
292
460
|
settable: Set<string>
|
|
293
461
|
strict: boolean
|
|
462
|
+
thisProperty: string | null
|
|
294
463
|
typeofProperties: Map<string, string>
|
|
295
464
|
}
|
|
296
465
|
|
|
297
466
|
function buildAccessorObject(spec: AccessorObjectSpec): t.ObjectExpression {
|
|
298
|
-
const properties: t.ObjectMethod[] = []
|
|
467
|
+
const properties: (t.ObjectMethod | t.ObjectProperty)[] = []
|
|
299
468
|
for (const [name, property] of spec.readProperties) {
|
|
300
469
|
properties.push(
|
|
301
470
|
t.objectMethod(
|
|
@@ -336,5 +505,11 @@ function buildAccessorObject(spec: AccessorObjectSpec): t.ObjectExpression {
|
|
|
336
505
|
),
|
|
337
506
|
)
|
|
338
507
|
}
|
|
508
|
+
// This is a data property. Its `this` value evaluates in the output script's
|
|
509
|
+
// top-level scope, where `this` is the global object. A getter would bind
|
|
510
|
+
// `this` to the accessor object instead.
|
|
511
|
+
if (spec.thisProperty !== null) {
|
|
512
|
+
properties.push(t.objectProperty(t.stringLiteral(spec.thisProperty), t.thisExpression()))
|
|
513
|
+
}
|
|
339
514
|
return t.objectExpression(properties)
|
|
340
515
|
}
|