webfuscator 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DISCLOSURE +9 -0
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/dist/analysis/constant.d.ts +11 -0
- package/dist/analysis/constant.d.ts.map +1 -0
- package/dist/analysis/constant.js +261 -0
- package/dist/analysis/constant.js.map +1 -0
- package/dist/analysis/document-order.d.ts +5 -0
- package/dist/analysis/document-order.d.ts.map +1 -0
- package/dist/analysis/document-order.js +124 -0
- package/dist/analysis/document-order.js.map +1 -0
- package/dist/analysis/inlineability.d.ts +13 -0
- package/dist/analysis/inlineability.d.ts.map +1 -0
- package/dist/analysis/inlineability.js +270 -0
- package/dist/analysis/inlineability.js.map +1 -0
- package/dist/analysis/purity.d.ts +5 -0
- package/dist/analysis/purity.d.ts.map +1 -0
- package/dist/analysis/purity.js +281 -0
- package/dist/analysis/purity.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/obfuscator.d.ts +4 -0
- package/dist/obfuscator.d.ts.map +1 -0
- package/dist/obfuscator.js +222 -0
- package/dist/obfuscator.js.map +1 -0
- package/dist/options.d.ts +73 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +2 -0
- package/dist/options.js.map +1 -0
- package/dist/preparation/dot-to-bracket.d.ts +16 -0
- package/dist/preparation/dot-to-bracket.d.ts.map +1 -0
- package/dist/preparation/dot-to-bracket.js +36 -0
- package/dist/preparation/dot-to-bracket.js.map +1 -0
- package/dist/preparation/expand-destructuring.d.ts +26 -0
- package/dist/preparation/expand-destructuring.d.ts.map +1 -0
- package/dist/preparation/expand-destructuring.js +154 -0
- package/dist/preparation/expand-destructuring.js.map +1 -0
- package/dist/preparation/expand-template-literals.d.ts +23 -0
- package/dist/preparation/expand-template-literals.d.ts.map +1 -0
- package/dist/preparation/expand-template-literals.js +78 -0
- package/dist/preparation/expand-template-literals.js.map +1 -0
- package/dist/preparation/rewrite-class-fields.d.ts +43 -0
- package/dist/preparation/rewrite-class-fields.d.ts.map +1 -0
- package/dist/preparation/rewrite-class-fields.js +270 -0
- package/dist/preparation/rewrite-class-fields.js.map +1 -0
- package/dist/preparation/split-sequence-expressions.d.ts +15 -0
- package/dist/preparation/split-sequence-expressions.d.ts.map +1 -0
- package/dist/preparation/split-sequence-expressions.js +36 -0
- package/dist/preparation/split-sequence-expressions.js.map +1 -0
- package/dist/preparation/split-variable-declarations.d.ts +20 -0
- package/dist/preparation/split-variable-declarations.d.ts.map +1 -0
- package/dist/preparation/split-variable-declarations.js +36 -0
- package/dist/preparation/split-variable-declarations.js.map +1 -0
- package/dist/preparation/stringify-object-keys.d.ts +21 -0
- package/dist/preparation/stringify-object-keys.d.ts.map +1 -0
- package/dist/preparation/stringify-object-keys.js +96 -0
- package/dist/preparation/stringify-object-keys.js.map +1 -0
- package/dist/preparation/wrap-single-statements.d.ts +24 -0
- package/dist/preparation/wrap-single-statements.d.ts.map +1 -0
- package/dist/preparation/wrap-single-statements.js +53 -0
- package/dist/preparation/wrap-single-statements.js.map +1 -0
- package/dist/transforms/arguments-to-parameters.d.ts +20 -0
- package/dist/transforms/arguments-to-parameters.d.ts.map +1 -0
- package/dist/transforms/arguments-to-parameters.js +162 -0
- package/dist/transforms/arguments-to-parameters.js.map +1 -0
- package/dist/transforms/arrow-to-function.d.ts +46 -0
- package/dist/transforms/arrow-to-function.d.ts.map +1 -0
- package/dist/transforms/arrow-to-function.js +203 -0
- package/dist/transforms/arrow-to-function.js.map +1 -0
- package/dist/transforms/collapse-single-use-temps.d.ts +16 -0
- package/dist/transforms/collapse-single-use-temps.d.ts.map +1 -0
- package/dist/transforms/collapse-single-use-temps.js +805 -0
- package/dist/transforms/collapse-single-use-temps.js.map +1 -0
- package/dist/transforms/const-let-to-var.d.ts +21 -0
- package/dist/transforms/const-let-to-var.d.ts.map +1 -0
- package/dist/transforms/const-let-to-var.js +217 -0
- package/dist/transforms/const-let-to-var.js.map +1 -0
- package/dist/transforms/const-to-let.d.ts +17 -0
- package/dist/transforms/const-to-let.d.ts.map +1 -0
- package/dist/transforms/const-to-let.js +33 -0
- package/dist/transforms/const-to-let.js.map +1 -0
- package/dist/transforms/do-while-to-while.d.ts +26 -0
- package/dist/transforms/do-while-to-while.d.ts.map +1 -0
- package/dist/transforms/do-while-to-while.js +54 -0
- package/dist/transforms/do-while-to-while.js.map +1 -0
- package/dist/transforms/drop-console.d.ts +27 -0
- package/dist/transforms/drop-console.d.ts.map +1 -0
- package/dist/transforms/drop-console.js +107 -0
- package/dist/transforms/drop-console.js.map +1 -0
- package/dist/transforms/drop-debugger.d.ts +18 -0
- package/dist/transforms/drop-debugger.d.ts.map +1 -0
- package/dist/transforms/drop-debugger.js +34 -0
- package/dist/transforms/drop-debugger.js.map +1 -0
- package/dist/transforms/expand-binary-assignment.d.ts +26 -0
- package/dist/transforms/expand-binary-assignment.d.ts.map +1 -0
- package/dist/transforms/expand-binary-assignment.js +78 -0
- package/dist/transforms/expand-binary-assignment.js.map +1 -0
- package/dist/transforms/expand-logical-assignment.d.ts +22 -0
- package/dist/transforms/expand-logical-assignment.d.ts.map +1 -0
- package/dist/transforms/expand-logical-assignment.js +73 -0
- package/dist/transforms/expand-logical-assignment.js.map +1 -0
- package/dist/transforms/extract-object-properties.d.ts +21 -0
- package/dist/transforms/extract-object-properties.d.ts.map +1 -0
- package/dist/transforms/extract-object-properties.js +340 -0
- package/dist/transforms/extract-object-properties.js.map +1 -0
- package/dist/transforms/fold-builtin-methods.d.ts +23 -0
- package/dist/transforms/fold-builtin-methods.d.ts.map +1 -0
- package/dist/transforms/fold-builtin-methods.js +839 -0
- package/dist/transforms/fold-builtin-methods.js.map +1 -0
- package/dist/transforms/fold-constants.d.ts +16 -0
- package/dist/transforms/fold-constants.d.ts.map +1 -0
- package/dist/transforms/fold-constants.js +421 -0
- package/dist/transforms/fold-constants.js.map +1 -0
- package/dist/transforms/for-to-while.d.ts +29 -0
- package/dist/transforms/for-to-while.d.ts.map +1 -0
- package/dist/transforms/for-to-while.js +91 -0
- package/dist/transforms/for-to-while.js.map +1 -0
- package/dist/transforms/function-declaration-to-expression.d.ts +28 -0
- package/dist/transforms/function-declaration-to-expression.d.ts.map +1 -0
- package/dist/transforms/function-declaration-to-expression.js +95 -0
- package/dist/transforms/function-declaration-to-expression.js.map +1 -0
- package/dist/transforms/inline-functions.d.ts +16 -0
- package/dist/transforms/inline-functions.d.ts.map +1 -0
- package/dist/transforms/inline-functions.js +896 -0
- package/dist/transforms/inline-functions.js.map +1 -0
- package/dist/transforms/logical-to-ternary.d.ts +20 -0
- package/dist/transforms/logical-to-ternary.d.ts.map +1 -0
- package/dist/transforms/logical-to-ternary.js +78 -0
- package/dist/transforms/logical-to-ternary.js.map +1 -0
- package/dist/transforms/mangle-properties.d.ts +27 -0
- package/dist/transforms/mangle-properties.d.ts.map +1 -0
- package/dist/transforms/mangle-properties.js +703 -0
- package/dist/transforms/mangle-properties.js.map +1 -0
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts +18 -0
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts.map +1 -0
- package/dist/transforms/nullish-coalescing-to-ternary.js +61 -0
- package/dist/transforms/nullish-coalescing-to-ternary.js.map +1 -0
- package/dist/transforms/numbers-to-strings.d.ts +19 -0
- package/dist/transforms/numbers-to-strings.d.ts.map +1 -0
- package/dist/transforms/numbers-to-strings.js +51 -0
- package/dist/transforms/numbers-to-strings.js.map +1 -0
- package/dist/transforms/object-method-to-property.d.ts +34 -0
- package/dist/transforms/object-method-to-property.d.ts.map +1 -0
- package/dist/transforms/object-method-to-property.js +78 -0
- package/dist/transforms/object-method-to-property.js.map +1 -0
- package/dist/transforms/optional-chaining-to-ternary.d.ts +19 -0
- package/dist/transforms/optional-chaining-to-ternary.d.ts.map +1 -0
- package/dist/transforms/optional-chaining-to-ternary.js +206 -0
- package/dist/transforms/optional-chaining-to-ternary.js.map +1 -0
- package/dist/transforms/pack-declarations-into-parameters.d.ts +22 -0
- package/dist/transforms/pack-declarations-into-parameters.d.ts.map +1 -0
- package/dist/transforms/pack-declarations-into-parameters.js +208 -0
- package/dist/transforms/pack-declarations-into-parameters.js.map +1 -0
- package/dist/transforms/remove-anonymous-function-names.d.ts +17 -0
- package/dist/transforms/remove-anonymous-function-names.d.ts.map +1 -0
- package/dist/transforms/remove-anonymous-function-names.js +72 -0
- package/dist/transforms/remove-anonymous-function-names.js.map +1 -0
- package/dist/transforms/remove-unreachable-code.d.ts +21 -0
- package/dist/transforms/remove-unreachable-code.d.ts.map +1 -0
- package/dist/transforms/remove-unreachable-code.js +103 -0
- package/dist/transforms/remove-unreachable-code.js.map +1 -0
- package/dist/transforms/remove-unused-code.d.ts +18 -0
- package/dist/transforms/remove-unused-code.d.ts.map +1 -0
- package/dist/transforms/remove-unused-code.js +249 -0
- package/dist/transforms/remove-unused-code.js.map +1 -0
- package/dist/transforms/rename-identifiers.d.ts +24 -0
- package/dist/transforms/rename-identifiers.d.ts.map +1 -0
- package/dist/transforms/rename-identifiers.js +264 -0
- package/dist/transforms/rename-identifiers.js.map +1 -0
- package/dist/transforms/specials-to-strings.d.ts +30 -0
- package/dist/transforms/specials-to-strings.d.ts.map +1 -0
- package/dist/transforms/specials-to-strings.js +101 -0
- package/dist/transforms/specials-to-strings.js.map +1 -0
- package/dist/transforms/switch-to-if.d.ts +28 -0
- package/dist/transforms/switch-to-if.d.ts.map +1 -0
- package/dist/transforms/switch-to-if.js +279 -0
- package/dist/transforms/switch-to-if.js.map +1 -0
- package/dist/transforms/ternary-to-if.d.ts +20 -0
- package/dist/transforms/ternary-to-if.d.ts.map +1 -0
- package/dist/transforms/ternary-to-if.js +315 -0
- package/dist/transforms/ternary-to-if.js.map +1 -0
- package/dist/transforms/update-to-assignment.d.ts +26 -0
- package/dist/transforms/update-to-assignment.d.ts.map +1 -0
- package/dist/transforms/update-to-assignment.js +120 -0
- package/dist/transforms/update-to-assignment.js.map +1 -0
- package/dist/transforms/yodify-conditions.d.ts +22 -0
- package/dist/transforms/yodify-conditions.d.ts.map +1 -0
- package/dist/transforms/yodify-conditions.js +91 -0
- package/dist/transforms/yodify-conditions.js.map +1 -0
- package/dist/utils/ast.d.ts +10 -0
- package/dist/utils/ast.d.ts.map +1 -0
- package/dist/utils/ast.js +112 -0
- package/dist/utils/ast.js.map +1 -0
- package/dist/utils/change-tracking.d.ts +8 -0
- package/dist/utils/change-tracking.d.ts.map +1 -0
- package/dist/utils/change-tracking.js +8 -0
- package/dist/utils/change-tracking.js.map +1 -0
- package/dist/utils/dom-properties.d.ts +2 -0
- package/dist/utils/dom-properties.d.ts.map +1 -0
- package/dist/utils/dom-properties.js +9252 -0
- package/dist/utils/dom-properties.js.map +1 -0
- package/dist/utils/evaluation-order.d.ts +4 -0
- package/dist/utils/evaluation-order.d.ts.map +1 -0
- package/dist/utils/evaluation-order.js +152 -0
- package/dist/utils/evaluation-order.js.map +1 -0
- package/dist/utils/literal.d.ts +5 -0
- package/dist/utils/literal.d.ts.map +1 -0
- package/dist/utils/literal.js +90 -0
- package/dist/utils/literal.js.map +1 -0
- package/dist/utils/logical-lowering.d.ts +4 -0
- package/dist/utils/logical-lowering.d.ts.map +1 -0
- package/dist/utils/logical-lowering.js +104 -0
- package/dist/utils/logical-lowering.js.map +1 -0
- package/dist/utils/loop-lowering.d.ts +23 -0
- package/dist/utils/loop-lowering.d.ts.map +1 -0
- package/dist/utils/loop-lowering.js +88 -0
- package/dist/utils/loop-lowering.js.map +1 -0
- package/dist/utils/paths.d.ts +9 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +90 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/random.d.ts +3 -0
- package/dist/utils/random.d.ts.map +1 -0
- package/dist/utils/random.js +22 -0
- package/dist/utils/random.js.map +1 -0
- package/dist/utils/string-generator.d.ts +37 -0
- package/dist/utils/string-generator.d.ts.map +1 -0
- package/dist/utils/string-generator.js +175 -0
- package/dist/utils/string-generator.js.map +1 -0
- package/package.json +76 -0
- package/src/analysis/constant.ts +310 -0
- package/src/analysis/document-order.ts +141 -0
- package/src/analysis/inlineability.ts +336 -0
- package/src/analysis/purity.ts +315 -0
- package/src/index.ts +2 -0
- package/src/obfuscator.ts +271 -0
- package/src/options.ts +114 -0
- package/src/preparation/dot-to-bracket.ts +41 -0
- package/src/preparation/expand-destructuring.ts +211 -0
- package/src/preparation/expand-template-literals.ts +92 -0
- package/src/preparation/rewrite-class-fields.ts +320 -0
- package/src/preparation/split-sequence-expressions.ts +40 -0
- package/src/preparation/split-variable-declarations.ts +39 -0
- package/src/preparation/stringify-object-keys.ts +107 -0
- package/src/preparation/wrap-single-statements.ts +63 -0
- package/src/transforms/arguments-to-parameters.ts +187 -0
- package/src/transforms/arrow-to-function.ts +225 -0
- package/src/transforms/collapse-single-use-temps.ts +957 -0
- package/src/transforms/const-let-to-var.ts +246 -0
- package/src/transforms/const-to-let.ts +38 -0
- package/src/transforms/do-while-to-while.ts +69 -0
- package/src/transforms/drop-console.ts +119 -0
- package/src/transforms/drop-debugger.ts +38 -0
- package/src/transforms/expand-binary-assignment.ts +94 -0
- package/src/transforms/expand-logical-assignment.ts +84 -0
- package/src/transforms/extract-object-properties.ts +404 -0
- package/src/transforms/fold-builtin-methods.ts +949 -0
- package/src/transforms/fold-constants.ts +462 -0
- package/src/transforms/for-to-while.ts +109 -0
- package/src/transforms/function-declaration-to-expression.ts +108 -0
- package/src/transforms/inline-functions.ts +1074 -0
- package/src/transforms/logical-to-ternary.ts +92 -0
- package/src/transforms/mangle-properties.ts +819 -0
- package/src/transforms/nullish-coalescing-to-ternary.ts +77 -0
- package/src/transforms/numbers-to-strings.ts +61 -0
- package/src/transforms/object-method-to-property.ts +86 -0
- package/src/transforms/optional-chaining-to-ternary.ts +225 -0
- package/src/transforms/pack-declarations-into-parameters.ts +233 -0
- package/src/transforms/remove-anonymous-function-names.ts +84 -0
- package/src/transforms/remove-unreachable-code.ts +115 -0
- package/src/transforms/remove-unused-code.ts +296 -0
- package/src/transforms/rename-identifiers.ts +289 -0
- package/src/transforms/specials-to-strings.ts +116 -0
- package/src/transforms/switch-to-if.ts +339 -0
- package/src/transforms/ternary-to-if.ts +387 -0
- package/src/transforms/update-to-assignment.ts +132 -0
- package/src/transforms/yodify-conditions.ts +103 -0
- package/src/utils/ast.ts +129 -0
- package/src/utils/change-tracking.ts +15 -0
- package/src/utils/dom-properties.ts +9252 -0
- package/src/utils/evaluation-order.ts +178 -0
- package/src/utils/literal.ts +96 -0
- package/src/utils/logical-lowering.ts +132 -0
- package/src/utils/loop-lowering.ts +109 -0
- package/src/utils/paths.ts +103 -0
- package/src/utils/random.ts +22 -0
- package/src/utils/string-generator.ts +206 -0
package/DISCLOSURE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
webfuscator transforms and obfuscates JavaScript source code. Its features
|
|
2
|
+
include identifier and property-name mangling, constant folding, dead-code
|
|
3
|
+
removal, and control-flow and literal rewrites.
|
|
4
|
+
|
|
5
|
+
These capabilities can make JavaScript harder to inspect and may have both
|
|
6
|
+
legitimate and harmful uses. The intended use is transforming software that
|
|
7
|
+
the user owns or is authorized to modify. This package is not intended to
|
|
8
|
+
create, conceal, distribute, or operate malware, or to interfere with systems
|
|
9
|
+
without authorization.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Esoware
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# webfuscator
|
|
2
|
+
|
|
3
|
+
`webfuscator` is a Babel-based JavaScript obfuscator. It parses source code, applies an ordered transform pipeline, and returns JavaScript.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Renames variables, functions, and labels
|
|
8
|
+
- Mangles selected property names
|
|
9
|
+
- Inlines functions and folds constants
|
|
10
|
+
- Rewrites loops, conditionals, and switch statements
|
|
11
|
+
- Turns numbers and other literals into string-based expressions
|
|
12
|
+
- Removes dead code
|
|
13
|
+
- Generates short, hexadecimal, random, keyword-like, or numbered names
|
|
14
|
+
- Seeds built-in randomization for reproducible output
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
npm install webfuscator
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
import { obfuscate } from 'webfuscator'
|
|
26
|
+
|
|
27
|
+
const code = obfuscate(source, {
|
|
28
|
+
stringGeneratorMode: 'mangled', // Other modes: hexadecimal, randomized, zeroWidth, number
|
|
29
|
+
seed: 0,
|
|
30
|
+
transforms: { dropConsole: false }, // Disable individual transforms by name
|
|
31
|
+
})
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`obfuscate(code, options?)` takes source code as a string and returns transformed source code. The package includes TypeScript declarations, requires Node.js `^22.18.0 || >=24.11.0`, and supports ESM only.
|
|
35
|
+
|
|
36
|
+
### Property mangling
|
|
37
|
+
|
|
38
|
+
Property mangling is off by default. The transform cannot find property uses
|
|
39
|
+
outside its input, so unrestricted mangling can break callers. Use `regex` to
|
|
40
|
+
limit mangling to private application properties, such as names ending in `_`:
|
|
41
|
+
|
|
42
|
+
```js
|
|
43
|
+
const propertyCache = new Map()
|
|
44
|
+
|
|
45
|
+
const code = obfuscate(source, {
|
|
46
|
+
transforms: {
|
|
47
|
+
mangleProperties: {
|
|
48
|
+
regex: /_$/,
|
|
49
|
+
reserved: ['public_api_'],
|
|
50
|
+
cache: propertyCache,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The options match Terser's property mangler, with camel-case names:
|
|
57
|
+
|
|
58
|
+
- `regex` selects property names. `reserved` excludes names from that selection.
|
|
59
|
+
- `builtins` defaults to `false`, which protects Terser's JavaScript and DOM
|
|
60
|
+
property set. Setting it to `true` may rename runtime or browser APIs.
|
|
61
|
+
- `cache` is a mutable `Map<string, string>` that reuses mappings across separate
|
|
62
|
+
inputs. `onlyCache` limits mangling to keys already in that map.
|
|
63
|
+
- `nameGenerator(index)` receives a zero-based ordinal and returns the next name.
|
|
64
|
+
Without it, the transform uses its own `stringGeneratorMode` or the top-level
|
|
65
|
+
mode.
|
|
66
|
+
- `debug: true` emits names in the form `_$source$_`. A string value becomes the
|
|
67
|
+
suffix.
|
|
68
|
+
- `keepQuoted: true` reserves quoted property names everywhere. `'strict'` keeps
|
|
69
|
+
quoted occurrences unchanged but allows unquoted occurrences of the same name
|
|
70
|
+
to be mangled.
|
|
71
|
+
- `onlyAnnotated` limits mangling to names marked with
|
|
72
|
+
`/*@__MANGLE_PROP__*/`. `/*@__KEY__*/` marks a string literal as a use of the
|
|
73
|
+
selected property name. Either annotation may use `#` instead of `@`.
|
|
74
|
+
- `undeclared` includes unquoted member accesses rooted at identifiers that are
|
|
75
|
+
not declared in the input. Bracket-string accesses are considered either way.
|
|
76
|
+
|
|
77
|
+
## Issues and pull requests
|
|
78
|
+
|
|
79
|
+
Both are open. For bugs, include the input and options you used.
|
|
80
|
+
|
|
81
|
+
## License
|
|
82
|
+
|
|
83
|
+
[MIT](./LICENSE)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { NodePath, Scope } from '@babel/traverse';
|
|
2
|
+
import * as t from '@babel/types';
|
|
3
|
+
export type Evaluation = {
|
|
4
|
+
known: true;
|
|
5
|
+
value: unknown;
|
|
6
|
+
} | {
|
|
7
|
+
known: false;
|
|
8
|
+
};
|
|
9
|
+
export declare function isOpaque(value: unknown): boolean;
|
|
10
|
+
export declare function evaluateConstant(node: t.Node, scope?: Scope, referencePath?: NodePath): Evaluation;
|
|
11
|
+
//# sourceMappingURL=constant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../src/analysis/constant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,QAAQ,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAUjC,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAA;AAQ3E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEhD;AAuCD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,CAAC,CAAC,IAAI,EACZ,KAAK,CAAC,EAAE,KAAK,EACb,aAAa,CAAC,EAAE,QAAQ,GACvB,UAAU,CAEZ"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import * as t from '@babel/types';
|
|
2
|
+
import { declarationReaches, initializerReaches, readCrossesFunctionBoundary, } from '../analysis/document-order.js';
|
|
3
|
+
import { isSideEffectFree } from '../analysis/purity.js';
|
|
4
|
+
import { enclosingScopeHasDirectEval, isInsideWith } from '../utils/ast.js';
|
|
5
|
+
const UNKNOWN = { known: false };
|
|
6
|
+
// Regexp, function, and class values are known only to be truthy. Identity,
|
|
7
|
+
// contents, coercion, and `typeof` remain unknown.
|
|
8
|
+
const OPAQUE_TRUTHY = Symbol('opaque-truthy');
|
|
9
|
+
export function isOpaque(value) {
|
|
10
|
+
return value === OPAQUE_TRUTHY;
|
|
11
|
+
}
|
|
12
|
+
const EVALUATORS = {
|
|
13
|
+
NumericLiteral: (node) => ({ known: true, value: node.value }),
|
|
14
|
+
StringLiteral: (node) => ({ known: true, value: node.value }),
|
|
15
|
+
BooleanLiteral: (node) => ({ known: true, value: node.value }),
|
|
16
|
+
NullLiteral: () => ({ known: true, value: null }),
|
|
17
|
+
BigIntLiteral: (node) => {
|
|
18
|
+
try {
|
|
19
|
+
return { known: true, value: BigInt(node.value) };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return UNKNOWN;
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
RegExpLiteral: () => ({ known: true, value: OPAQUE_TRUTHY }),
|
|
26
|
+
TemplateLiteral: (node) => {
|
|
27
|
+
const template = node;
|
|
28
|
+
if (template.expressions.length > 0) {
|
|
29
|
+
return UNKNOWN;
|
|
30
|
+
}
|
|
31
|
+
const [quasi] = template.quasis;
|
|
32
|
+
return { known: true, value: quasi?.value.cooked ?? quasi?.value.raw ?? '' };
|
|
33
|
+
},
|
|
34
|
+
UnaryExpression: evaluateUnary,
|
|
35
|
+
BinaryExpression: evaluateBinary,
|
|
36
|
+
LogicalExpression: evaluateLogical,
|
|
37
|
+
ConditionalExpression: evaluateConditional,
|
|
38
|
+
Identifier: evaluateIdentifier,
|
|
39
|
+
};
|
|
40
|
+
export function evaluateConstant(node, scope, referencePath) {
|
|
41
|
+
return run(node, { scope, seen: new Set(), referencePath });
|
|
42
|
+
}
|
|
43
|
+
function run(node, env) {
|
|
44
|
+
const evaluator = EVALUATORS[node.type];
|
|
45
|
+
return evaluator ? evaluator(node, env) : UNKNOWN;
|
|
46
|
+
}
|
|
47
|
+
function evaluateUnary(node, env) {
|
|
48
|
+
const unary = node;
|
|
49
|
+
if (unary.operator === 'void') {
|
|
50
|
+
return isSideEffectFree(unary.argument, env.scope, env.referencePath)
|
|
51
|
+
? { known: true, value: undefined }
|
|
52
|
+
: UNKNOWN;
|
|
53
|
+
}
|
|
54
|
+
if (unary.operator === 'delete' || unary.operator === 'throw') {
|
|
55
|
+
return UNKNOWN;
|
|
56
|
+
}
|
|
57
|
+
const argument = run(unary.argument, env);
|
|
58
|
+
if (!argument.known) {
|
|
59
|
+
return UNKNOWN;
|
|
60
|
+
}
|
|
61
|
+
return applyUnary(unary.operator, argument.value);
|
|
62
|
+
}
|
|
63
|
+
function evaluateBinary(node, env) {
|
|
64
|
+
const binary = node;
|
|
65
|
+
if (binary.operator === 'in' || binary.operator === 'instanceof') {
|
|
66
|
+
return UNKNOWN;
|
|
67
|
+
}
|
|
68
|
+
if (!t.isExpression(binary.left)) {
|
|
69
|
+
return UNKNOWN;
|
|
70
|
+
}
|
|
71
|
+
const left = run(binary.left, env);
|
|
72
|
+
if (!left.known) {
|
|
73
|
+
return UNKNOWN;
|
|
74
|
+
}
|
|
75
|
+
const right = run(binary.right, env);
|
|
76
|
+
if (!right.known) {
|
|
77
|
+
return UNKNOWN;
|
|
78
|
+
}
|
|
79
|
+
return applyBinary(binary.operator, left.value, right.value);
|
|
80
|
+
}
|
|
81
|
+
function evaluateLogical(node, env) {
|
|
82
|
+
const logical = node;
|
|
83
|
+
const left = run(logical.left, env);
|
|
84
|
+
if (!left.known) {
|
|
85
|
+
return UNKNOWN;
|
|
86
|
+
}
|
|
87
|
+
if (logical.operator === '&&') {
|
|
88
|
+
return left.value ? run(logical.right, env) : left;
|
|
89
|
+
}
|
|
90
|
+
if (logical.operator === '||') {
|
|
91
|
+
return left.value ? left : run(logical.right, env);
|
|
92
|
+
}
|
|
93
|
+
if (logical.operator === '??') {
|
|
94
|
+
return left.value === null || left.value === undefined ? run(logical.right, env) : left;
|
|
95
|
+
}
|
|
96
|
+
return UNKNOWN;
|
|
97
|
+
}
|
|
98
|
+
function evaluateConditional(node, env) {
|
|
99
|
+
const conditional = node;
|
|
100
|
+
const test = run(conditional.test, env);
|
|
101
|
+
if (!test.known) {
|
|
102
|
+
return UNKNOWN;
|
|
103
|
+
}
|
|
104
|
+
return run(test.value ? conditional.consequent : conditional.alternate, env);
|
|
105
|
+
}
|
|
106
|
+
function evaluateIdentifier(node, env) {
|
|
107
|
+
const identifier = node;
|
|
108
|
+
if (!env.scope) {
|
|
109
|
+
return UNKNOWN;
|
|
110
|
+
}
|
|
111
|
+
// `with` and direct `eval` can redirect names outside Babel's scope table.
|
|
112
|
+
if (env.referencePath &&
|
|
113
|
+
(isInsideWith(env.referencePath) || enclosingScopeHasDirectEval(env.referencePath))) {
|
|
114
|
+
return UNKNOWN;
|
|
115
|
+
}
|
|
116
|
+
const binding = env.scope.getBinding(identifier.name);
|
|
117
|
+
// Only an unbound `undefined` names the immutable global property.
|
|
118
|
+
if (identifier.name === 'undefined') {
|
|
119
|
+
return binding ? UNKNOWN : { known: true, value: undefined };
|
|
120
|
+
}
|
|
121
|
+
if (!binding || env.seen.has(binding)) {
|
|
122
|
+
return UNKNOWN;
|
|
123
|
+
}
|
|
124
|
+
if (t.isFunctionDeclaration(binding.path.node)) {
|
|
125
|
+
return binding.constant ? { known: true, value: OPAQUE_TRUTHY } : UNKNOWN;
|
|
126
|
+
}
|
|
127
|
+
if (t.isClassDeclaration(binding.path.node)) {
|
|
128
|
+
if (!binding.constant) {
|
|
129
|
+
return UNKNOWN;
|
|
130
|
+
}
|
|
131
|
+
// A nested function can read the class before its declaration runs.
|
|
132
|
+
if (readCrossesFunctionBoundary(binding, env.referencePath)) {
|
|
133
|
+
return UNKNOWN;
|
|
134
|
+
}
|
|
135
|
+
return declarationReaches(binding.path, env.referencePath)
|
|
136
|
+
? { known: true, value: OPAQUE_TRUTHY }
|
|
137
|
+
: UNKNOWN;
|
|
138
|
+
}
|
|
139
|
+
if (binding.kind === 'var' || binding.kind === 'let' || binding.kind === 'const') {
|
|
140
|
+
const declarator = binding.path.node;
|
|
141
|
+
if (!t.isVariableDeclarator(declarator) || !declarator.init) {
|
|
142
|
+
return UNKNOWN;
|
|
143
|
+
}
|
|
144
|
+
if (!t.isIdentifier(declarator.id) || declarator.id.name !== identifier.name) {
|
|
145
|
+
return UNKNOWN;
|
|
146
|
+
}
|
|
147
|
+
// A nested function can read the binding before its initializer runs.
|
|
148
|
+
if (readCrossesFunctionBoundary(binding, env.referencePath)) {
|
|
149
|
+
return UNKNOWN;
|
|
150
|
+
}
|
|
151
|
+
// A preceding `var` initializer may still sit on an untaken branch.
|
|
152
|
+
if (!initializerReaches(binding.path, env.referencePath)) {
|
|
153
|
+
return UNKNOWN;
|
|
154
|
+
}
|
|
155
|
+
// Babel counts a looped `var` initializer as its own constant violation.
|
|
156
|
+
if (!binding.constant &&
|
|
157
|
+
!(binding.constantViolations.length === 1 &&
|
|
158
|
+
binding.constantViolations[0].node === declarator)) {
|
|
159
|
+
return UNKNOWN;
|
|
160
|
+
}
|
|
161
|
+
return run(declarator.init, {
|
|
162
|
+
scope: binding.scope,
|
|
163
|
+
seen: new Set([...env.seen, binding]),
|
|
164
|
+
referencePath: binding.path,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return UNKNOWN;
|
|
168
|
+
}
|
|
169
|
+
function applyUnary(op, value) {
|
|
170
|
+
if (isOpaque(value)) {
|
|
171
|
+
// Only truthiness is known for an opaque object.
|
|
172
|
+
return op === '!' ? { known: true, value: false } : UNKNOWN;
|
|
173
|
+
}
|
|
174
|
+
// `+bigint` throws TypeError; folding it would erase the throw.
|
|
175
|
+
if (op === '+' && typeof value === 'bigint') {
|
|
176
|
+
return UNKNOWN;
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
switch (op) {
|
|
180
|
+
case '!':
|
|
181
|
+
return { known: true, value: !value };
|
|
182
|
+
case '+':
|
|
183
|
+
return { known: true, value: Number(value) };
|
|
184
|
+
case '-':
|
|
185
|
+
return { known: true, value: -value };
|
|
186
|
+
case '~':
|
|
187
|
+
return { known: true, value: ~value };
|
|
188
|
+
case 'typeof':
|
|
189
|
+
return { known: true, value: typeof value };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return UNKNOWN;
|
|
194
|
+
}
|
|
195
|
+
return UNKNOWN;
|
|
196
|
+
}
|
|
197
|
+
function applyBinary(op, left, right) {
|
|
198
|
+
// Binary operators observe more than an opaque object's truthiness.
|
|
199
|
+
if (isOpaque(left) || isOpaque(right)) {
|
|
200
|
+
return UNKNOWN;
|
|
201
|
+
}
|
|
202
|
+
if (op === '===') {
|
|
203
|
+
return { known: true, value: left === right };
|
|
204
|
+
}
|
|
205
|
+
if (op === '!==') {
|
|
206
|
+
return { known: true, value: left !== right };
|
|
207
|
+
}
|
|
208
|
+
if (op === '==') {
|
|
209
|
+
return { known: true, value: looseEquals(left, right) };
|
|
210
|
+
}
|
|
211
|
+
if (op === '!=') {
|
|
212
|
+
return { known: true, value: !looseEquals(left, right) };
|
|
213
|
+
}
|
|
214
|
+
const a = left;
|
|
215
|
+
const b = right;
|
|
216
|
+
try {
|
|
217
|
+
switch (op) {
|
|
218
|
+
case '+':
|
|
219
|
+
return { known: true, value: a + b };
|
|
220
|
+
case '-':
|
|
221
|
+
return { known: true, value: a - b };
|
|
222
|
+
case '*':
|
|
223
|
+
return { known: true, value: a * b };
|
|
224
|
+
case '/':
|
|
225
|
+
return { known: true, value: a / b };
|
|
226
|
+
case '%':
|
|
227
|
+
return { known: true, value: a % b };
|
|
228
|
+
case '**':
|
|
229
|
+
return { known: true, value: a ** b };
|
|
230
|
+
case '&':
|
|
231
|
+
return { known: true, value: a & b };
|
|
232
|
+
case '|':
|
|
233
|
+
return { known: true, value: a | b };
|
|
234
|
+
case '^':
|
|
235
|
+
return { known: true, value: a ^ b };
|
|
236
|
+
case '<<':
|
|
237
|
+
return { known: true, value: a << b };
|
|
238
|
+
case '>>':
|
|
239
|
+
return { known: true, value: a >> b };
|
|
240
|
+
case '>>>':
|
|
241
|
+
return { known: true, value: a >>> b };
|
|
242
|
+
case '<':
|
|
243
|
+
return { known: true, value: a < b };
|
|
244
|
+
case '<=':
|
|
245
|
+
return { known: true, value: a <= b };
|
|
246
|
+
case '>':
|
|
247
|
+
return { known: true, value: a > b };
|
|
248
|
+
case '>=':
|
|
249
|
+
return { known: true, value: a >= b };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return UNKNOWN;
|
|
254
|
+
}
|
|
255
|
+
return UNKNOWN;
|
|
256
|
+
}
|
|
257
|
+
function looseEquals(left, right) {
|
|
258
|
+
// oxlint-disable-next-line eqeqeq
|
|
259
|
+
return left == right;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=constant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.js","sourceRoot":"","sources":["../../src/analysis/constant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Binding, NodePath } from '@babel/traverse';
|
|
2
|
+
export declare function declarationReaches(bindingPath: NodePath, referencePath: NodePath | undefined): boolean;
|
|
3
|
+
export declare function initializerReaches(bindingPath: NodePath, referencePath: NodePath | undefined): boolean;
|
|
4
|
+
export declare function readCrossesFunctionBoundary(binding: Binding, referencePath: NodePath | undefined): boolean;
|
|
5
|
+
//# sourceMappingURL=document-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-order.d.ts","sourceRoot":"","sources":["../../src/analysis/document-order.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAIxD,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,QAAQ,EACrB,aAAa,EAAE,QAAQ,GAAG,SAAS,GAClC,OAAO,CAQT;AA4CD,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,QAAQ,EACrB,aAAa,EAAE,QAAQ,GAAG,SAAS,GAClC,OAAO,CAwBT;AAGD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,QAAQ,GAAG,SAAS,GAClC,OAAO,CAgBT"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import * as t from '@babel/types';
|
|
2
|
+
// AST ancestry gives cloned and synthesized nodes an order when offsets cannot.
|
|
3
|
+
export function declarationReaches(bindingPath, referencePath) {
|
|
4
|
+
if (!referencePath) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
if (!bothPathsOrdered(bindingPath, referencePath)) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return precedesInAncestry(bindingPath, ancestry(referencePath));
|
|
11
|
+
}
|
|
12
|
+
// Detached paths and a path compared with itself prove no useful ordering.
|
|
13
|
+
function bothPathsOrdered(bindingPath, referencePath) {
|
|
14
|
+
return bindingPath !== referencePath && bindingPath.node != null && referencePath.node != null;
|
|
15
|
+
}
|
|
16
|
+
function precedesInAncestry(bindingPath, referenceAncestry) {
|
|
17
|
+
const bindingAncestry = ancestry(bindingPath);
|
|
18
|
+
let i = bindingAncestry.length - 1;
|
|
19
|
+
let j = referenceAncestry.length - 1;
|
|
20
|
+
while (i >= 0 && j >= 0 && bindingAncestry[i] === referenceAncestry[j]) {
|
|
21
|
+
i--;
|
|
22
|
+
j--;
|
|
23
|
+
}
|
|
24
|
+
if (i < 0) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
if (j < 0) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return siblingPrecedes(bindingAncestry[i], referenceAncestry[j]);
|
|
31
|
+
}
|
|
32
|
+
// A declaration inside one of these statements may not run before an outside
|
|
33
|
+
// reference, even when it appears first.
|
|
34
|
+
const CONDITIONAL_CONTAINERS = new Set([
|
|
35
|
+
'IfStatement',
|
|
36
|
+
'SwitchStatement',
|
|
37
|
+
'SwitchCase',
|
|
38
|
+
'ForStatement',
|
|
39
|
+
'ForInStatement',
|
|
40
|
+
'ForOfStatement',
|
|
41
|
+
'WhileStatement',
|
|
42
|
+
'DoWhileStatement',
|
|
43
|
+
'TryStatement',
|
|
44
|
+
'ConditionalExpression',
|
|
45
|
+
'LogicalExpression',
|
|
46
|
+
// A labeled block can exit before a later declaration.
|
|
47
|
+
'LabeledStatement',
|
|
48
|
+
]);
|
|
49
|
+
// No branch may separate the initializer from the reference while walking to
|
|
50
|
+
// their nearest shared ancestor.
|
|
51
|
+
export function initializerReaches(bindingPath, referencePath) {
|
|
52
|
+
if (!referencePath) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
if (!bothPathsOrdered(bindingPath, referencePath)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const referenceAncestry = ancestry(referencePath);
|
|
59
|
+
if (!precedesInAncestry(bindingPath, referenceAncestry)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const referenceAncestors = new Set(referenceAncestry);
|
|
63
|
+
let current = bindingPath.parentPath;
|
|
64
|
+
while (current && !referenceAncestors.has(current)) {
|
|
65
|
+
// A detached ancestor invalidates the remaining path chain.
|
|
66
|
+
if (!current.node) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (CONDITIONAL_CONTAINERS.has(current.node.type)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
current = current.parentPath;
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
// A nested function may run before the declaration, defeating document order.
|
|
77
|
+
export function readCrossesFunctionBoundary(binding, referencePath) {
|
|
78
|
+
if (!referencePath) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
const bindingBlock = binding.scope.block;
|
|
82
|
+
let current = referencePath.parentPath;
|
|
83
|
+
while (current) {
|
|
84
|
+
if (current.node === bindingBlock) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
if (current.isFunction()) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
current = current.parentPath;
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
function ancestry(path) {
|
|
95
|
+
const chain = [];
|
|
96
|
+
let current = path;
|
|
97
|
+
while (current) {
|
|
98
|
+
chain.push(current);
|
|
99
|
+
current = current.parentPath;
|
|
100
|
+
}
|
|
101
|
+
return chain;
|
|
102
|
+
}
|
|
103
|
+
function siblingPrecedes(left, right) {
|
|
104
|
+
if (left.listKey && left.listKey === right.listKey) {
|
|
105
|
+
return left.key < right.key;
|
|
106
|
+
}
|
|
107
|
+
const parent = left.parentPath?.node;
|
|
108
|
+
if (!parent) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
const slotLeft = (left.listKey ?? left.key);
|
|
112
|
+
const slotRight = (right.listKey ?? right.key);
|
|
113
|
+
const keys = t.VISITOR_KEYS[parent.type];
|
|
114
|
+
if (!keys) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
const indexLeft = keys.indexOf(slotLeft);
|
|
118
|
+
const indexRight = keys.indexOf(slotRight);
|
|
119
|
+
if (indexLeft === -1 || indexRight === -1) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
return indexLeft < indexRight;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=document-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-order.js","sourceRoot":"","sources":["../../src/analysis/document-order.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Binding, NodePath } from '@babel/traverse';
|
|
2
|
+
import * as t from '@babel/types';
|
|
3
|
+
import type { File } from '@babel/types';
|
|
4
|
+
export interface InlineCandidate {
|
|
5
|
+
name: string;
|
|
6
|
+
fnNode: t.Function;
|
|
7
|
+
fnPath: NodePath<t.Function>;
|
|
8
|
+
binding: Binding;
|
|
9
|
+
params: string[];
|
|
10
|
+
declarationPath: NodePath;
|
|
11
|
+
}
|
|
12
|
+
export declare function analyzeInlineability(ast: File): Map<string, InlineCandidate>;
|
|
13
|
+
//# sourceMappingURL=inlineability.d.ts.map
|
|
@@ -0,0 +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;AAKxC,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;AAGD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAuF5E"}
|