webfuscator 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DISCLOSURE +9 -0
- package/README.md +67 -0
- package/dist/analysis/constant.d.ts.map +1 -1
- package/dist/analysis/constant.js +10 -26
- package/dist/analysis/constant.js.map +1 -1
- package/dist/analysis/inlineability.d.ts.map +1 -1
- package/dist/analysis/inlineability.js +4 -12
- package/dist/analysis/inlineability.js.map +1 -1
- package/dist/analysis/purity.d.ts +3 -3
- package/dist/analysis/purity.d.ts.map +1 -1
- package/dist/analysis/purity.js +28 -75
- package/dist/analysis/purity.js.map +1 -1
- package/dist/preparation/expand-destructuring.d.ts +2 -3
- package/dist/preparation/expand-destructuring.d.ts.map +1 -1
- package/dist/preparation/expand-destructuring.js +2 -8
- package/dist/preparation/expand-destructuring.js.map +1 -1
- package/dist/transforms/arguments-to-parameters.d.ts +5 -4
- package/dist/transforms/arguments-to-parameters.d.ts.map +1 -1
- package/dist/transforms/arguments-to-parameters.js +5 -4
- package/dist/transforms/arguments-to-parameters.js.map +1 -1
- package/dist/transforms/arrow-to-function.d.ts +4 -3
- package/dist/transforms/arrow-to-function.d.ts.map +1 -1
- package/dist/transforms/arrow-to-function.js +6 -8
- package/dist/transforms/arrow-to-function.js.map +1 -1
- package/dist/transforms/collapse-single-use-temps.d.ts +2 -1
- package/dist/transforms/collapse-single-use-temps.d.ts.map +1 -1
- package/dist/transforms/collapse-single-use-temps.js +12 -20
- package/dist/transforms/collapse-single-use-temps.js.map +1 -1
- package/dist/transforms/conceal-strings.d.ts +1 -2
- package/dist/transforms/conceal-strings.d.ts.map +1 -1
- package/dist/transforms/conceal-strings.js +2 -7
- package/dist/transforms/conceal-strings.js.map +1 -1
- package/dist/transforms/const-let-to-var.d.ts +4 -3
- package/dist/transforms/const-let-to-var.d.ts.map +1 -1
- package/dist/transforms/const-let-to-var.js +8 -94
- package/dist/transforms/const-let-to-var.js.map +1 -1
- package/dist/transforms/const-to-let.d.ts +1 -2
- package/dist/transforms/const-to-let.d.ts.map +1 -1
- package/dist/transforms/const-to-let.js +1 -6
- package/dist/transforms/const-to-let.js.map +1 -1
- package/dist/transforms/drop-console.d.ts.map +1 -1
- package/dist/transforms/drop-console.js +3 -5
- package/dist/transforms/drop-console.js.map +1 -1
- package/dist/transforms/expand-binary-assignment.d.ts.map +1 -1
- package/dist/transforms/expand-binary-assignment.js +0 -5
- package/dist/transforms/expand-binary-assignment.js.map +1 -1
- package/dist/transforms/expand-logical-assignment.d.ts.map +1 -1
- package/dist/transforms/expand-logical-assignment.js +0 -5
- package/dist/transforms/expand-logical-assignment.js.map +1 -1
- package/dist/transforms/extract-object-properties.js +5 -12
- package/dist/transforms/extract-object-properties.js.map +1 -1
- package/dist/transforms/fold-builtin-methods.js +3 -11
- package/dist/transforms/fold-builtin-methods.js.map +1 -1
- package/dist/transforms/fold-constants.js +2 -2
- package/dist/transforms/fold-constants.js.map +1 -1
- package/dist/transforms/function-declaration-to-expression.d.ts +5 -6
- package/dist/transforms/function-declaration-to-expression.d.ts.map +1 -1
- package/dist/transforms/function-declaration-to-expression.js +5 -6
- package/dist/transforms/function-declaration-to-expression.js.map +1 -1
- package/dist/transforms/hoist-variables.d.ts +1 -2
- package/dist/transforms/hoist-variables.d.ts.map +1 -1
- package/dist/transforms/hoist-variables.js +2 -11
- package/dist/transforms/hoist-variables.js.map +1 -1
- package/dist/transforms/inline-functions.js +11 -39
- package/dist/transforms/inline-functions.js.map +1 -1
- package/dist/transforms/logical-to-ternary.d.ts +1 -1
- package/dist/transforms/logical-to-ternary.js +5 -9
- package/dist/transforms/logical-to-ternary.js.map +1 -1
- package/dist/transforms/mangle-properties.d.ts +2 -5
- package/dist/transforms/mangle-properties.d.ts.map +1 -1
- package/dist/transforms/mangle-properties.js +2 -5
- package/dist/transforms/mangle-properties.js.map +1 -1
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts +4 -5
- package/dist/transforms/nullish-coalescing-to-ternary.d.ts.map +1 -1
- package/dist/transforms/nullish-coalescing-to-ternary.js +7 -12
- package/dist/transforms/nullish-coalescing-to-ternary.js.map +1 -1
- package/dist/transforms/object-method-to-property.d.ts +1 -1
- package/dist/transforms/object-method-to-property.js +1 -1
- package/dist/transforms/optional-chaining-to-ternary.d.ts +4 -3
- package/dist/transforms/optional-chaining-to-ternary.d.ts.map +1 -1
- package/dist/transforms/optional-chaining-to-ternary.js +9 -9
- package/dist/transforms/optional-chaining-to-ternary.js.map +1 -1
- package/dist/transforms/pack-declarations-into-parameters.d.ts.map +1 -1
- package/dist/transforms/pack-declarations-into-parameters.js +4 -16
- package/dist/transforms/pack-declarations-into-parameters.js.map +1 -1
- package/dist/transforms/pack.d.ts +4 -11
- package/dist/transforms/pack.d.ts.map +1 -1
- package/dist/transforms/pack.js +4 -17
- package/dist/transforms/pack.js.map +1 -1
- package/dist/transforms/remove-anonymous-function-names.d.ts +2 -4
- package/dist/transforms/remove-anonymous-function-names.d.ts.map +1 -1
- package/dist/transforms/remove-anonymous-function-names.js +2 -40
- package/dist/transforms/remove-anonymous-function-names.js.map +1 -1
- package/dist/transforms/remove-unreachable-code.js +2 -21
- package/dist/transforms/remove-unreachable-code.js.map +1 -1
- package/dist/transforms/remove-unused-code.d.ts.map +1 -1
- package/dist/transforms/remove-unused-code.js +5 -10
- package/dist/transforms/remove-unused-code.js.map +1 -1
- package/dist/transforms/rename-identifiers.d.ts +3 -3
- package/dist/transforms/rename-identifiers.d.ts.map +1 -1
- package/dist/transforms/rename-identifiers.js +4 -20
- package/dist/transforms/rename-identifiers.js.map +1 -1
- package/dist/transforms/reorder-function-declarations.d.ts +1 -2
- package/dist/transforms/reorder-function-declarations.d.ts.map +1 -1
- package/dist/transforms/reorder-function-declarations.js +2 -4
- package/dist/transforms/reorder-function-declarations.js.map +1 -1
- package/dist/transforms/specials-to-strings.d.ts.map +1 -1
- package/dist/transforms/specials-to-strings.js +2 -4
- package/dist/transforms/specials-to-strings.js.map +1 -1
- package/dist/transforms/switch-to-if.js +5 -15
- package/dist/transforms/switch-to-if.js.map +1 -1
- package/dist/transforms/ternary-to-if.d.ts.map +1 -1
- package/dist/transforms/ternary-to-if.js +5 -9
- package/dist/transforms/ternary-to-if.js.map +1 -1
- package/dist/transforms/update-to-assignment.d.ts.map +1 -1
- package/dist/transforms/update-to-assignment.js +6 -8
- package/dist/transforms/update-to-assignment.js.map +1 -1
- package/dist/transforms/yodify-conditions.d.ts +3 -4
- package/dist/transforms/yodify-conditions.d.ts.map +1 -1
- package/dist/transforms/yodify-conditions.js +3 -4
- package/dist/transforms/yodify-conditions.js.map +1 -1
- package/dist/utils/ast.d.ts +0 -1
- package/dist/utils/ast.d.ts.map +1 -1
- package/dist/utils/ast.js +0 -26
- package/dist/utils/ast.js.map +1 -1
- package/dist/utils/evaluation-order.js +1 -1
- package/dist/utils/evaluation-order.js.map +1 -1
- package/dist/utils/logical-lowering.d.ts.map +1 -1
- package/dist/utils/logical-lowering.js +7 -9
- package/dist/utils/logical-lowering.js.map +1 -1
- package/dist/utils/nullish.d.ts +4 -0
- package/dist/utils/nullish.d.ts.map +1 -0
- package/dist/utils/nullish.js +8 -0
- package/dist/utils/nullish.js.map +1 -0
- package/dist/utils/paths.d.ts +0 -2
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +0 -28
- package/dist/utils/paths.js.map +1 -1
- package/package.json +16 -10
- package/src/analysis/constant.ts +12 -30
- package/src/analysis/inlineability.ts +4 -12
- package/src/analysis/purity.ts +29 -92
- package/src/preparation/expand-destructuring.ts +2 -10
- package/src/transforms/arguments-to-parameters.ts +5 -4
- package/src/transforms/arrow-to-function.ts +6 -8
- package/src/transforms/collapse-single-use-temps.ts +12 -23
- package/src/transforms/conceal-strings.ts +3 -8
- package/src/transforms/const-let-to-var.ts +9 -100
- package/src/transforms/const-to-let.ts +1 -6
- package/src/transforms/drop-console.ts +3 -5
- package/src/transforms/expand-binary-assignment.ts +0 -5
- package/src/transforms/expand-logical-assignment.ts +0 -5
- package/src/transforms/extract-object-properties.ts +5 -14
- package/src/transforms/fold-builtin-methods.ts +3 -12
- package/src/transforms/fold-constants.ts +2 -2
- package/src/transforms/function-declaration-to-expression.ts +5 -6
- package/src/transforms/hoist-variables.ts +2 -12
- package/src/transforms/inline-functions.ts +16 -46
- package/src/transforms/logical-to-ternary.ts +5 -10
- package/src/transforms/mangle-properties.ts +2 -5
- package/src/transforms/nullish-coalescing-to-ternary.ts +7 -13
- package/src/transforms/object-method-to-property.ts +1 -1
- package/src/transforms/optional-chaining-to-ternary.ts +9 -9
- package/src/transforms/pack-declarations-into-parameters.ts +10 -16
- package/src/transforms/pack.ts +4 -17
- package/src/transforms/remove-anonymous-function-names.ts +3 -46
- package/src/transforms/remove-unreachable-code.ts +2 -22
- package/src/transforms/remove-unused-code.ts +5 -10
- package/src/transforms/rename-identifiers.ts +4 -20
- package/src/transforms/reorder-function-declarations.ts +2 -4
- package/src/transforms/specials-to-strings.ts +2 -4
- package/src/transforms/switch-to-if.ts +5 -22
- package/src/transforms/ternary-to-if.ts +5 -9
- package/src/transforms/update-to-assignment.ts +6 -8
- package/src/transforms/yodify-conditions.ts +3 -4
- package/src/utils/ast.ts +0 -29
- package/src/utils/evaluation-order.ts +1 -1
- package/src/utils/logical-lowering.ts +7 -11
- package/src/utils/nullish.ts +23 -0
- package/src/utils/paths.ts +0 -32
|
@@ -7,10 +7,9 @@ import type { ChangeState } from '../utils/change-tracking'
|
|
|
7
7
|
import { isLiteralShaped } from '../utils/literal'
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* Moves a
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Unary operations over literals also count when their coercion cannot act.
|
|
10
|
+
* Moves a right operand made from literals and unary operators to the left of a
|
|
11
|
+
* comparison when swapping does not change coercion order. Relational operators
|
|
12
|
+
* are flipped after swapping.
|
|
14
13
|
*
|
|
15
14
|
* @example
|
|
16
15
|
* // ◀️ before
|
package/src/utils/ast.ts
CHANGED
|
@@ -69,32 +69,3 @@ export function isNonComputedKey(path: NodePath): boolean {
|
|
|
69
69
|
'key' in parent && parent.key === path.node && 'computed' in parent && parent.computed === false
|
|
70
70
|
)
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
// `with` can shadow names outside Babel's scope table.
|
|
74
|
-
export function isInsideWith(path: NodePath): boolean {
|
|
75
|
-
if (!programHasWith(path.scope.getProgramParent().block)) {
|
|
76
|
-
return false
|
|
77
|
-
}
|
|
78
|
-
return path.findParent((ancestor) => ancestor.isWithStatement()) !== null
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Cache the program-wide scan because `isInsideWith` runs for many identifiers.
|
|
82
|
-
// Transforms never add `with`, so a cached miss remains valid.
|
|
83
|
-
const programWith = new WeakMap<t.Node, boolean>()
|
|
84
|
-
|
|
85
|
-
function programHasWith(programNode: t.Node): boolean {
|
|
86
|
-
const cached = programWith.get(programNode)
|
|
87
|
-
if (cached !== undefined) {
|
|
88
|
-
return cached
|
|
89
|
-
}
|
|
90
|
-
let found = false
|
|
91
|
-
t.traverseFast(programNode, (node) => {
|
|
92
|
-
if (!t.isWithStatement(node)) {
|
|
93
|
-
return
|
|
94
|
-
}
|
|
95
|
-
found = true
|
|
96
|
-
return t.traverseFast.stop
|
|
97
|
-
})
|
|
98
|
-
programWith.set(programNode, found)
|
|
99
|
-
return found
|
|
100
|
-
}
|
|
@@ -133,7 +133,7 @@ function precedingSiblings<T extends NodePath>(
|
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
function isPurePath(path: NodePath): boolean {
|
|
136
|
-
return isPure(path.node, path.scope
|
|
136
|
+
return isPure(path.node, path.scope)
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
function impure(paths: (NodePath | null | undefined)[]): boolean {
|
|
@@ -9,7 +9,7 @@ import { isStandaloneDeclaration } from './paths'
|
|
|
9
9
|
// x = L;
|
|
10
10
|
// if (<fallbackTest(x)>) x = R;
|
|
11
11
|
//
|
|
12
|
-
// `fallbackTest` selects
|
|
12
|
+
// `fallbackTest` selects the short-circuit condition. The parent must accept a
|
|
13
13
|
// multi-statement replacement.
|
|
14
14
|
export function lowerLogicalWriteStatement(
|
|
15
15
|
path: NodePath<t.LogicalExpression>,
|
|
@@ -29,21 +29,20 @@ export function lowerLogicalWriteStatement(
|
|
|
29
29
|
const declStmt = parent.parentPath
|
|
30
30
|
if (
|
|
31
31
|
!declStmt?.isVariableDeclaration() ||
|
|
32
|
-
// The split would emit illegal `const x;` and then write it.
|
|
33
|
-
declStmt.node.kind === 'const' ||
|
|
34
32
|
declStmt.node.declarations.length !== 1 ||
|
|
35
33
|
!isStandaloneDeclaration(declStmt)
|
|
36
34
|
) {
|
|
37
35
|
return false
|
|
38
36
|
}
|
|
39
37
|
const target = parent.node.id
|
|
40
|
-
//
|
|
41
|
-
// side
|
|
42
|
-
if (rightCanObserveTarget(node.right, target.name)) {
|
|
38
|
+
// A `var` initializer can observe its previous value while evaluating the
|
|
39
|
+
// right side. Reads before lexical initialization are intentionally ignored.
|
|
40
|
+
if (declStmt.node.kind === 'var' && rightCanObserveTarget(node.right, target.name)) {
|
|
43
41
|
return false
|
|
44
42
|
}
|
|
43
|
+
const declarationKind = declStmt.node.kind === 'const' ? 'let' : declStmt.node.kind
|
|
45
44
|
declStmt.replaceWithMultiple([
|
|
46
|
-
t.variableDeclaration(
|
|
45
|
+
t.variableDeclaration(declarationKind, [
|
|
47
46
|
t.variableDeclarator(t.cloneNode(target), node.left),
|
|
48
47
|
]),
|
|
49
48
|
guardedReassignment(target, fallbackTest, node.right),
|
|
@@ -68,10 +67,7 @@ export function lowerLogicalWriteStatement(
|
|
|
68
67
|
return false
|
|
69
68
|
}
|
|
70
69
|
// Writing first would change `x = 0 || x` before the right side reads `x`.
|
|
71
|
-
if (
|
|
72
|
-
!isSideEffectFree(node.right, path.scope, path) ||
|
|
73
|
-
referencesName(node.right, target.name)
|
|
74
|
-
) {
|
|
70
|
+
if (!isSideEffectFree(node.right, path.scope) || referencesName(node.right, target.name)) {
|
|
75
71
|
return false
|
|
76
72
|
}
|
|
77
73
|
exprStmt.replaceWithMultiple([
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as t from '@babel/types'
|
|
2
|
+
|
|
3
|
+
export function buildNullishCheck(
|
|
4
|
+
firstRead: t.Expression,
|
|
5
|
+
secondRead: t.Expression,
|
|
6
|
+
): t.ConditionalExpression {
|
|
7
|
+
return t.conditionalExpression(
|
|
8
|
+
t.binaryExpression('===', firstRead, t.nullLiteral()),
|
|
9
|
+
t.booleanLiteral(true),
|
|
10
|
+
t.binaryExpression('===', secondRead, t.unaryExpression('void', t.numericLiteral(0))),
|
|
11
|
+
)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function buildNonNullishCheck(
|
|
15
|
+
firstRead: t.Expression,
|
|
16
|
+
secondRead: t.Expression,
|
|
17
|
+
): t.ConditionalExpression {
|
|
18
|
+
return t.conditionalExpression(
|
|
19
|
+
t.binaryExpression('!==', firstRead, t.nullLiteral()),
|
|
20
|
+
t.binaryExpression('!==', secondRead, t.unaryExpression('void', t.numericLiteral(0))),
|
|
21
|
+
t.booleanLiteral(false),
|
|
22
|
+
)
|
|
23
|
+
}
|
package/src/utils/paths.ts
CHANGED
|
@@ -69,35 +69,3 @@ export function isInStrictContext(path: NodePath): boolean {
|
|
|
69
69
|
function hasUseStrictDirective(directives: readonly t.Directive[]): boolean {
|
|
70
70
|
return directives.some((directive) => directive.value.value === 'use strict')
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
// ECMA-262 B.3.3 gives sloppy block-level functions a `var` alias that Babel
|
|
74
|
-
// omits from the enclosing scope. Renaming, moving, or removing one can expose it.
|
|
75
|
-
export function hasAnnexBFunctionAlias(path: NodePath): boolean {
|
|
76
|
-
if (!path.isFunctionDeclaration()) {
|
|
77
|
-
return false
|
|
78
|
-
}
|
|
79
|
-
const parent = path.parentPath
|
|
80
|
-
if (!parent || parent.isProgram()) {
|
|
81
|
-
return false
|
|
82
|
-
}
|
|
83
|
-
if (
|
|
84
|
-
parent.isBlockStatement() &&
|
|
85
|
-
parent.key === 'body' &&
|
|
86
|
-
parent.parentPath != null &&
|
|
87
|
-
parent.parentPath.isFunction()
|
|
88
|
-
) {
|
|
89
|
-
return false
|
|
90
|
-
}
|
|
91
|
-
return !isInStrictContext(parent)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// A later write to `const` must keep throwing after transformation.
|
|
95
|
-
export function hasConstantViolation(path: NodePath<t.VariableDeclaration>): boolean {
|
|
96
|
-
for (const name of Object.keys(path.getBindingIdentifiers())) {
|
|
97
|
-
const binding = path.scope.getBinding(name)
|
|
98
|
-
if (binding && binding.constantViolations.length > 0) {
|
|
99
|
-
return true
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return false
|
|
103
|
-
}
|