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.
Files changed (180) hide show
  1. package/DISCLOSURE +9 -0
  2. package/README.md +67 -0
  3. package/dist/analysis/constant.d.ts.map +1 -1
  4. package/dist/analysis/constant.js +10 -26
  5. package/dist/analysis/constant.js.map +1 -1
  6. package/dist/analysis/inlineability.d.ts.map +1 -1
  7. package/dist/analysis/inlineability.js +4 -12
  8. package/dist/analysis/inlineability.js.map +1 -1
  9. package/dist/analysis/purity.d.ts +3 -3
  10. package/dist/analysis/purity.d.ts.map +1 -1
  11. package/dist/analysis/purity.js +28 -75
  12. package/dist/analysis/purity.js.map +1 -1
  13. package/dist/preparation/expand-destructuring.d.ts +2 -3
  14. package/dist/preparation/expand-destructuring.d.ts.map +1 -1
  15. package/dist/preparation/expand-destructuring.js +2 -8
  16. package/dist/preparation/expand-destructuring.js.map +1 -1
  17. package/dist/transforms/arguments-to-parameters.d.ts +5 -4
  18. package/dist/transforms/arguments-to-parameters.d.ts.map +1 -1
  19. package/dist/transforms/arguments-to-parameters.js +5 -4
  20. package/dist/transforms/arguments-to-parameters.js.map +1 -1
  21. package/dist/transforms/arrow-to-function.d.ts +4 -3
  22. package/dist/transforms/arrow-to-function.d.ts.map +1 -1
  23. package/dist/transforms/arrow-to-function.js +6 -8
  24. package/dist/transforms/arrow-to-function.js.map +1 -1
  25. package/dist/transforms/collapse-single-use-temps.d.ts +2 -1
  26. package/dist/transforms/collapse-single-use-temps.d.ts.map +1 -1
  27. package/dist/transforms/collapse-single-use-temps.js +12 -20
  28. package/dist/transforms/collapse-single-use-temps.js.map +1 -1
  29. package/dist/transforms/conceal-strings.d.ts +1 -2
  30. package/dist/transforms/conceal-strings.d.ts.map +1 -1
  31. package/dist/transforms/conceal-strings.js +2 -7
  32. package/dist/transforms/conceal-strings.js.map +1 -1
  33. package/dist/transforms/const-let-to-var.d.ts +4 -3
  34. package/dist/transforms/const-let-to-var.d.ts.map +1 -1
  35. package/dist/transforms/const-let-to-var.js +8 -94
  36. package/dist/transforms/const-let-to-var.js.map +1 -1
  37. package/dist/transforms/const-to-let.d.ts +1 -2
  38. package/dist/transforms/const-to-let.d.ts.map +1 -1
  39. package/dist/transforms/const-to-let.js +1 -6
  40. package/dist/transforms/const-to-let.js.map +1 -1
  41. package/dist/transforms/drop-console.d.ts.map +1 -1
  42. package/dist/transforms/drop-console.js +3 -5
  43. package/dist/transforms/drop-console.js.map +1 -1
  44. package/dist/transforms/expand-binary-assignment.d.ts.map +1 -1
  45. package/dist/transforms/expand-binary-assignment.js +0 -5
  46. package/dist/transforms/expand-binary-assignment.js.map +1 -1
  47. package/dist/transforms/expand-logical-assignment.d.ts.map +1 -1
  48. package/dist/transforms/expand-logical-assignment.js +0 -5
  49. package/dist/transforms/expand-logical-assignment.js.map +1 -1
  50. package/dist/transforms/extract-object-properties.js +5 -12
  51. package/dist/transforms/extract-object-properties.js.map +1 -1
  52. package/dist/transforms/fold-builtin-methods.js +3 -11
  53. package/dist/transforms/fold-builtin-methods.js.map +1 -1
  54. package/dist/transforms/fold-constants.js +2 -2
  55. package/dist/transforms/fold-constants.js.map +1 -1
  56. package/dist/transforms/function-declaration-to-expression.d.ts +5 -6
  57. package/dist/transforms/function-declaration-to-expression.d.ts.map +1 -1
  58. package/dist/transforms/function-declaration-to-expression.js +5 -6
  59. package/dist/transforms/function-declaration-to-expression.js.map +1 -1
  60. package/dist/transforms/hoist-variables.d.ts +1 -2
  61. package/dist/transforms/hoist-variables.d.ts.map +1 -1
  62. package/dist/transforms/hoist-variables.js +2 -11
  63. package/dist/transforms/hoist-variables.js.map +1 -1
  64. package/dist/transforms/inline-functions.js +11 -39
  65. package/dist/transforms/inline-functions.js.map +1 -1
  66. package/dist/transforms/logical-to-ternary.d.ts +1 -1
  67. package/dist/transforms/logical-to-ternary.js +5 -9
  68. package/dist/transforms/logical-to-ternary.js.map +1 -1
  69. package/dist/transforms/mangle-properties.d.ts +2 -5
  70. package/dist/transforms/mangle-properties.d.ts.map +1 -1
  71. package/dist/transforms/mangle-properties.js +2 -5
  72. package/dist/transforms/mangle-properties.js.map +1 -1
  73. package/dist/transforms/nullish-coalescing-to-ternary.d.ts +4 -5
  74. package/dist/transforms/nullish-coalescing-to-ternary.d.ts.map +1 -1
  75. package/dist/transforms/nullish-coalescing-to-ternary.js +7 -12
  76. package/dist/transforms/nullish-coalescing-to-ternary.js.map +1 -1
  77. package/dist/transforms/object-method-to-property.d.ts +1 -1
  78. package/dist/transforms/object-method-to-property.js +1 -1
  79. package/dist/transforms/optional-chaining-to-ternary.d.ts +4 -3
  80. package/dist/transforms/optional-chaining-to-ternary.d.ts.map +1 -1
  81. package/dist/transforms/optional-chaining-to-ternary.js +9 -9
  82. package/dist/transforms/optional-chaining-to-ternary.js.map +1 -1
  83. package/dist/transforms/pack-declarations-into-parameters.d.ts.map +1 -1
  84. package/dist/transforms/pack-declarations-into-parameters.js +4 -16
  85. package/dist/transforms/pack-declarations-into-parameters.js.map +1 -1
  86. package/dist/transforms/pack.d.ts +4 -11
  87. package/dist/transforms/pack.d.ts.map +1 -1
  88. package/dist/transforms/pack.js +4 -17
  89. package/dist/transforms/pack.js.map +1 -1
  90. package/dist/transforms/remove-anonymous-function-names.d.ts +2 -4
  91. package/dist/transforms/remove-anonymous-function-names.d.ts.map +1 -1
  92. package/dist/transforms/remove-anonymous-function-names.js +2 -40
  93. package/dist/transforms/remove-anonymous-function-names.js.map +1 -1
  94. package/dist/transforms/remove-unreachable-code.js +2 -21
  95. package/dist/transforms/remove-unreachable-code.js.map +1 -1
  96. package/dist/transforms/remove-unused-code.d.ts.map +1 -1
  97. package/dist/transforms/remove-unused-code.js +5 -10
  98. package/dist/transforms/remove-unused-code.js.map +1 -1
  99. package/dist/transforms/rename-identifiers.d.ts +3 -3
  100. package/dist/transforms/rename-identifiers.d.ts.map +1 -1
  101. package/dist/transforms/rename-identifiers.js +4 -20
  102. package/dist/transforms/rename-identifiers.js.map +1 -1
  103. package/dist/transforms/reorder-function-declarations.d.ts +1 -2
  104. package/dist/transforms/reorder-function-declarations.d.ts.map +1 -1
  105. package/dist/transforms/reorder-function-declarations.js +2 -4
  106. package/dist/transforms/reorder-function-declarations.js.map +1 -1
  107. package/dist/transforms/specials-to-strings.d.ts.map +1 -1
  108. package/dist/transforms/specials-to-strings.js +2 -4
  109. package/dist/transforms/specials-to-strings.js.map +1 -1
  110. package/dist/transforms/switch-to-if.js +5 -15
  111. package/dist/transforms/switch-to-if.js.map +1 -1
  112. package/dist/transforms/ternary-to-if.d.ts.map +1 -1
  113. package/dist/transforms/ternary-to-if.js +5 -9
  114. package/dist/transforms/ternary-to-if.js.map +1 -1
  115. package/dist/transforms/update-to-assignment.d.ts.map +1 -1
  116. package/dist/transforms/update-to-assignment.js +6 -8
  117. package/dist/transforms/update-to-assignment.js.map +1 -1
  118. package/dist/transforms/yodify-conditions.d.ts +3 -4
  119. package/dist/transforms/yodify-conditions.d.ts.map +1 -1
  120. package/dist/transforms/yodify-conditions.js +3 -4
  121. package/dist/transforms/yodify-conditions.js.map +1 -1
  122. package/dist/utils/ast.d.ts +0 -1
  123. package/dist/utils/ast.d.ts.map +1 -1
  124. package/dist/utils/ast.js +0 -26
  125. package/dist/utils/ast.js.map +1 -1
  126. package/dist/utils/evaluation-order.js +1 -1
  127. package/dist/utils/evaluation-order.js.map +1 -1
  128. package/dist/utils/logical-lowering.d.ts.map +1 -1
  129. package/dist/utils/logical-lowering.js +7 -9
  130. package/dist/utils/logical-lowering.js.map +1 -1
  131. package/dist/utils/nullish.d.ts +4 -0
  132. package/dist/utils/nullish.d.ts.map +1 -0
  133. package/dist/utils/nullish.js +8 -0
  134. package/dist/utils/nullish.js.map +1 -0
  135. package/dist/utils/paths.d.ts +0 -2
  136. package/dist/utils/paths.d.ts.map +1 -1
  137. package/dist/utils/paths.js +0 -28
  138. package/dist/utils/paths.js.map +1 -1
  139. package/package.json +16 -10
  140. package/src/analysis/constant.ts +12 -30
  141. package/src/analysis/inlineability.ts +4 -12
  142. package/src/analysis/purity.ts +29 -92
  143. package/src/preparation/expand-destructuring.ts +2 -10
  144. package/src/transforms/arguments-to-parameters.ts +5 -4
  145. package/src/transforms/arrow-to-function.ts +6 -8
  146. package/src/transforms/collapse-single-use-temps.ts +12 -23
  147. package/src/transforms/conceal-strings.ts +3 -8
  148. package/src/transforms/const-let-to-var.ts +9 -100
  149. package/src/transforms/const-to-let.ts +1 -6
  150. package/src/transforms/drop-console.ts +3 -5
  151. package/src/transforms/expand-binary-assignment.ts +0 -5
  152. package/src/transforms/expand-logical-assignment.ts +0 -5
  153. package/src/transforms/extract-object-properties.ts +5 -14
  154. package/src/transforms/fold-builtin-methods.ts +3 -12
  155. package/src/transforms/fold-constants.ts +2 -2
  156. package/src/transforms/function-declaration-to-expression.ts +5 -6
  157. package/src/transforms/hoist-variables.ts +2 -12
  158. package/src/transforms/inline-functions.ts +16 -46
  159. package/src/transforms/logical-to-ternary.ts +5 -10
  160. package/src/transforms/mangle-properties.ts +2 -5
  161. package/src/transforms/nullish-coalescing-to-ternary.ts +7 -13
  162. package/src/transforms/object-method-to-property.ts +1 -1
  163. package/src/transforms/optional-chaining-to-ternary.ts +9 -9
  164. package/src/transforms/pack-declarations-into-parameters.ts +10 -16
  165. package/src/transforms/pack.ts +4 -17
  166. package/src/transforms/remove-anonymous-function-names.ts +3 -46
  167. package/src/transforms/remove-unreachable-code.ts +2 -22
  168. package/src/transforms/remove-unused-code.ts +5 -10
  169. package/src/transforms/rename-identifiers.ts +4 -20
  170. package/src/transforms/reorder-function-declarations.ts +2 -4
  171. package/src/transforms/specials-to-strings.ts +2 -4
  172. package/src/transforms/switch-to-if.ts +5 -22
  173. package/src/transforms/ternary-to-if.ts +5 -9
  174. package/src/transforms/update-to-assignment.ts +6 -8
  175. package/src/transforms/yodify-conditions.ts +3 -4
  176. package/src/utils/ast.ts +0 -29
  177. package/src/utils/evaluation-order.ts +1 -1
  178. package/src/utils/logical-lowering.ts +7 -11
  179. package/src/utils/nullish.ts +23 -0
  180. 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 safe literal-shaped right operand to the left of a comparison.
11
- * Relational operators are flipped after swapping.
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, path)
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 `!x`, `x`, or `x == null`. The parent must accept a
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
- // The split writes `x` before evaluating the right side. Refuse any right
41
- // side that could observe the new value or the ended TDZ.
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(declStmt.node.kind, [
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
+ }
@@ -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
- }