miniread 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/core/normalize-code.d.ts +17 -0
  2. package/dist/core/normalize-code.js +35 -0
  3. package/dist/core/stable-naming.d.ts +61 -0
  4. package/dist/core/stable-naming.js +121 -0
  5. package/dist/scripts/evaluate/check-expected-evaluations.js +2 -0
  6. package/dist/scripts/evaluate/check-recommended-snapshot.d.ts +11 -0
  7. package/dist/scripts/evaluate/check-recommended-snapshot.js +53 -0
  8. package/dist/scripts/evaluate/check-snapshots.d.ts +1 -0
  9. package/dist/scripts/evaluate/check-snapshots.js +21 -2
  10. package/dist/scripts/evaluate/transform-content.d.ts +5 -0
  11. package/dist/scripts/evaluate/transform-content.js +23 -13
  12. package/dist/transforms/rename-catch-parameters/rename-catch-parameters-transform.js +15 -38
  13. package/dist/transforms/rename-destructured-aliases/rename-destructured-aliases-transform.js +13 -12
  14. package/dist/transforms/rename-event-parameters/process-event-handler-function.d.ts +2 -3
  15. package/dist/transforms/rename-event-parameters/process-event-handler-function.js +13 -9
  16. package/dist/transforms/rename-event-parameters/rename-event-parameters-transform.d.ts +1 -1
  17. package/dist/transforms/rename-event-parameters/rename-event-parameters-transform.js +10 -7
  18. package/dist/transforms/rename-loop-index-variables/rename-loop-index-variables-transform.js +19 -13
  19. package/dist/transforms/rename-promise-executor-parameters/rename-promise-executor-parameters-transform.js +12 -5
  20. package/dist/transforms/rename-timeout-ids/rename-timeout-ids-transform.d.ts +1 -1
  21. package/dist/transforms/rename-timeout-ids/rename-timeout-ids-transform.js +10 -11
  22. package/dist/transforms/rename-use-reference-guards/rename-use-reference-guards-transform.js +10 -11
  23. package/dist/transforms/rename-use-reference-guards-v2/rename-use-reference-guards-v2-transform.d.ts +1 -1
  24. package/dist/transforms/rename-use-reference-guards-v2/rename-use-reference-guards-v2-transform.js +14 -12
  25. package/dist/transforms/transform-registry.js +0 -10
  26. package/package.json +1 -1
  27. package/transform-manifest.json +3 -53
  28. package/dist/transforms/expand-return-sequence/expand-return-sequence-transform.d.ts +0 -2
  29. package/dist/transforms/expand-return-sequence/expand-return-sequence-transform.js +0 -91
  30. package/dist/transforms/expand-sequence-expressions/expand-expression-statement-sequence.d.ts +0 -3
  31. package/dist/transforms/expand-sequence-expressions/expand-expression-statement-sequence.js +0 -57
  32. package/dist/transforms/expand-sequence-expressions/expand-sequence-expressions-transform.d.ts +0 -2
  33. package/dist/transforms/expand-sequence-expressions/expand-sequence-expressions-transform.js +0 -34
  34. package/dist/transforms/expand-sequence-expressions/expand-variable-declaration-sequence.d.ts +0 -3
  35. package/dist/transforms/expand-sequence-expressions/expand-variable-declaration-sequence.js +0 -93
  36. package/dist/transforms/expand-sequence-expressions-v2/expand-expression-statement-sequence.d.ts +0 -3
  37. package/dist/transforms/expand-sequence-expressions-v2/expand-expression-statement-sequence.js +0 -55
  38. package/dist/transforms/expand-sequence-expressions-v2/expand-return-sequence.d.ts +0 -3
  39. package/dist/transforms/expand-sequence-expressions-v2/expand-return-sequence.js +0 -86
  40. package/dist/transforms/expand-sequence-expressions-v2/expand-sequence-expressions-v2-transform.d.ts +0 -2
  41. package/dist/transforms/expand-sequence-expressions-v2/expand-sequence-expressions-v2-transform.js +0 -41
  42. package/dist/transforms/expand-sequence-expressions-v2/expand-variable-declaration-sequence.d.ts +0 -3
  43. package/dist/transforms/expand-sequence-expressions-v2/expand-variable-declaration-sequence.js +0 -93
  44. package/dist/transforms/expand-sequence-expressions-v3/expand-expression-statement-sequence.d.ts +0 -3
  45. package/dist/transforms/expand-sequence-expressions-v3/expand-expression-statement-sequence.js +0 -64
  46. package/dist/transforms/expand-sequence-expressions-v3/expand-return-sequence.d.ts +0 -3
  47. package/dist/transforms/expand-sequence-expressions-v3/expand-return-sequence.js +0 -91
  48. package/dist/transforms/expand-sequence-expressions-v3/expand-sequence-expressions-v3-transform.d.ts +0 -2
  49. package/dist/transforms/expand-sequence-expressions-v3/expand-sequence-expressions-v3-transform.js +0 -48
  50. package/dist/transforms/expand-sequence-expressions-v3/expand-throw-sequence.d.ts +0 -3
  51. package/dist/transforms/expand-sequence-expressions-v3/expand-throw-sequence.js +0 -101
  52. package/dist/transforms/expand-sequence-expressions-v3/expand-variable-declaration-sequence.d.ts +0 -3
  53. package/dist/transforms/expand-sequence-expressions-v3/expand-variable-declaration-sequence.js +0 -99
  54. package/dist/transforms/expand-throw-sequence/expand-throw-sequence-transform.d.ts +0 -2
  55. package/dist/transforms/expand-throw-sequence/expand-throw-sequence-transform.js +0 -117
  56. package/dist/transforms/rename-binding/get-target-name.d.ts +0 -4
  57. package/dist/transforms/rename-binding/get-target-name.js +0 -25
  58. package/dist/transforms/rename-binding/is-valid-binding-identifier.d.ts +0 -1
  59. package/dist/transforms/rename-binding/is-valid-binding-identifier.js +0 -10
  60. package/dist/transforms/rename-use-reference-guards/get-target-name.d.ts +0 -2
  61. package/dist/transforms/rename-use-reference-guards/get-target-name.js +0 -23
  62. package/dist/transforms/rename-use-reference-guards/is-valid-binding-identifier.d.ts +0 -1
  63. package/dist/transforms/rename-use-reference-guards/is-valid-binding-identifier.js +0 -10
  64. package/dist/transforms/rename-use-reference-guards-v2/get-target-name.d.ts +0 -2
  65. package/dist/transforms/rename-use-reference-guards-v2/get-target-name.js +0 -23
  66. package/dist/transforms/rename-use-reference-guards-v2/is-valid-binding-identifier.d.ts +0 -1
  67. package/dist/transforms/rename-use-reference-guards-v2/is-valid-binding-identifier.js +0 -10
@@ -1,4 +1,6 @@
1
1
  import { createRequire } from "node:module";
2
+ import { RenameGroup } from "../../core/stable-naming.js";
3
+ import { getFilesToProcess, } from "../../core/types.js";
2
4
  import { processEventHandlerFunction } from "./process-event-handler-function.js";
3
5
  const require = createRequire(import.meta.url);
4
6
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
@@ -9,28 +11,29 @@ export const renameEventParametersTransform = {
9
11
  scope: "file",
10
12
  parallelizable: true,
11
13
  transform(context) {
12
- const { projectGraph } = context;
13
14
  let nodesVisited = 0;
14
- const stats = { transformationsApplied: 0 };
15
- for (const [, fileInfo] of projectGraph.files) {
15
+ let transformationsApplied = 0;
16
+ for (const fileInfo of getFilesToProcess(context)) {
17
+ const group = new RenameGroup();
16
18
  traverse(fileInfo.ast, {
17
19
  FunctionDeclaration(path) {
18
20
  nodesVisited++;
19
- processEventHandlerFunction(path, stats);
21
+ processEventHandlerFunction(path, group);
20
22
  },
21
23
  FunctionExpression(path) {
22
24
  nodesVisited++;
23
- processEventHandlerFunction(path, stats);
25
+ processEventHandlerFunction(path, group);
24
26
  },
25
27
  ArrowFunctionExpression(path) {
26
28
  nodesVisited++;
27
- processEventHandlerFunction(path, stats);
29
+ processEventHandlerFunction(path, group);
28
30
  },
29
31
  });
32
+ transformationsApplied += group.apply();
30
33
  }
31
34
  return Promise.resolve({
32
35
  nodesVisited,
33
- transformationsApplied: stats.transformationsApplied,
36
+ transformationsApplied,
34
37
  });
35
38
  },
36
39
  };
@@ -1,4 +1,5 @@
1
1
  import { createRequire } from "node:module";
2
+ import { isStableRenamed, RenameGroup } from "../../core/stable-naming.js";
2
3
  import { getFilesToProcess, } from "../../core/types.js";
3
4
  const require = createRequire(import.meta.url);
4
5
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
@@ -15,10 +16,11 @@ const getRenamedAncestorLoopCount = (path, renamedLoops) => {
15
16
  }
16
17
  return count;
17
18
  };
18
- const getTargetIndexName = (renamedAncestorLoopCount) => {
19
+ const BASE_NAME = "index";
20
+ const getTargetIndexBaseName = (renamedAncestorLoopCount) => {
19
21
  if (renamedAncestorLoopCount === 0)
20
- return "index";
21
- return `index${renamedAncestorLoopCount + 1}`;
22
+ return BASE_NAME;
23
+ return `${BASE_NAME}${renamedAncestorLoopCount + 1}`;
22
24
  };
23
25
  const getLoopCounterNameIfEligible = (path) => {
24
26
  const init = path.node.init;
@@ -91,31 +93,35 @@ const getLoopCounterNameIfEligible = (path) => {
91
93
  };
92
94
  export const renameLoopIndexVariablesTransform = {
93
95
  id: "rename-loop-index-variables",
94
- description: "Renames numeric for-loop counters to index/index2/... based on nesting depth",
96
+ description: "Renames numeric for-loop counters to $index/$index2/... based on nesting depth",
95
97
  scope: "file",
96
98
  parallelizable: true,
97
99
  transform(context) {
98
100
  let nodesVisited = 0;
99
101
  let transformationsApplied = 0;
100
102
  for (const fileInfo of getFilesToProcess(context)) {
101
- const renamedLoops = new WeakMap();
103
+ const group = new RenameGroup();
104
+ const eligibleLoops = new WeakMap();
102
105
  traverse(fileInfo.ast, {
103
106
  ForStatement(path) {
104
107
  nodesVisited++;
105
108
  const loopCounterName = getLoopCounterNameIfEligible(path);
106
109
  if (!loopCounterName)
107
110
  return;
108
- const renamedAncestorLoopCount = getRenamedAncestorLoopCount(path, renamedLoops);
109
- const targetName = getTargetIndexName(renamedAncestorLoopCount);
110
- if (loopCounterName === targetName)
111
+ // Skip already-stable names
112
+ if (isStableRenamed(loopCounterName))
111
113
  return;
112
- if (path.scope.hasBinding(targetName))
113
- return;
114
- path.scope.rename(loopCounterName, targetName);
115
- renamedLoops.set(path.node, targetName);
116
- transformationsApplied++;
114
+ const renamedAncestorLoopCount = getRenamedAncestorLoopCount(path, eligibleLoops);
115
+ const baseName = getTargetIndexBaseName(renamedAncestorLoopCount);
116
+ eligibleLoops.set(path.node, baseName);
117
+ group.add({
118
+ scope: path.scope,
119
+ currentName: loopCounterName,
120
+ baseName,
121
+ });
117
122
  },
118
123
  });
124
+ transformationsApplied += group.apply();
119
125
  }
120
126
  return Promise.resolve({
121
127
  nodesVisited,
@@ -1,13 +1,15 @@
1
1
  import { createRequire } from "node:module";
2
+ import { isStableRenamed } from "../../core/stable-naming.js";
2
3
  import { getFilesToProcess, } from "../../core/types.js";
3
4
  import { getExecutorFunctionIfEligible, isAssignedToOnHandlerProperty, isDirectCallOfBinding, wouldShadowReferencedOuterBinding, } from "./promise-executor-heuristics.js";
4
5
  import { canRenameBindingSafely, renameBindingIfSafe, } from "./rename-binding-if-safe.js";
6
+ const STABLE_PREFIX = "$";
5
7
  const require = createRequire(import.meta.url);
6
8
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
7
9
  const traverse = require("@babel/traverse").default;
8
10
  export const renamePromiseExecutorParametersTransform = {
9
11
  id: "rename-promise-executor-parameters",
10
- description: "Renames promise-like executor parameters in `new X(executor)` to resolve/reject when usage is high-confidence",
12
+ description: "Renames promise-like executor parameters in `new X(executor)` to $resolve/$reject when usage is high-confidence",
11
13
  scope: "file",
12
14
  parallelizable: true,
13
15
  transform(context) {
@@ -22,6 +24,11 @@ export const renamePromiseExecutorParametersTransform = {
22
24
  return;
23
25
  const [resolveParameter, rejectParameter] = executorPath.node
24
26
  .params;
27
+ // Skip already-stable names
28
+ if (isStableRenamed(resolveParameter.name))
29
+ return;
30
+ if (isStableRenamed(rejectParameter.name))
31
+ return;
25
32
  const bindingScope = executorPath.scope;
26
33
  const resolveBinding = bindingScope.getBinding(resolveParameter.name);
27
34
  const rejectBinding = bindingScope.getBinding(rejectParameter.name);
@@ -41,10 +48,10 @@ export const renamePromiseExecutorParametersTransform = {
41
48
  isAssignedToOnHandlerProperty(referencePath));
42
49
  if (!rejectIsOnlyCalledOrHandlerAssigned)
43
50
  return;
44
- const resolveWouldShadow = wouldShadowReferencedOuterBinding(executorPath, "resolve");
45
- const rejectWouldShadow = wouldShadowReferencedOuterBinding(executorPath, "reject");
46
- const targetResolveName = "resolve";
47
- const targetRejectName = "reject";
51
+ const targetResolveName = `${STABLE_PREFIX}resolve`;
52
+ const targetRejectName = `${STABLE_PREFIX}reject`;
53
+ const resolveWouldShadow = wouldShadowReferencedOuterBinding(executorPath, targetResolveName);
54
+ const rejectWouldShadow = wouldShadowReferencedOuterBinding(executorPath, targetRejectName);
48
55
  const wantsResolveRename = resolveParameter.name !== targetResolveName;
49
56
  const wantsRejectRename = rejectParameter.name !== targetRejectName;
50
57
  const canRenameResolve = !wantsResolveRename ||
@@ -1,2 +1,2 @@
1
- import type { Transform } from "../../core/types.js";
1
+ import { type Transform } from "../../core/types.js";
2
2
  export declare const renameTimeoutIdsTransform: Transform;
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from "node:module";
2
- import { getFilesToProcess } from "../../core/types.js";
3
- import { getTargetName } from "../rename-binding/get-target-name.js";
2
+ import { isStableRenamed, RenameGroup } from "../../core/stable-naming.js";
3
+ import { getFilesToProcess, } from "../../core/types.js";
4
4
  const require = createRequire(import.meta.url);
5
5
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
6
6
  const traverse = require("@babel/traverse").default;
@@ -40,20 +40,22 @@ const isClearTimeoutCallArgument = (referencePath, bindingName) => {
40
40
  };
41
41
  export const renameTimeoutIdsTransform = {
42
42
  id: "rename-timeout-ids",
43
- description: "Renames setTimeout handle variables to timeoutId/timeoutId2/... when usage is only clearTimeout(...)",
43
+ description: "Renames setTimeout handle variables to $timeoutId/$timeoutId2/... or timeoutId/timeoutId2/... when usage is only clearTimeout(...)",
44
44
  scope: "file",
45
45
  parallelizable: true,
46
46
  transform(context) {
47
47
  let nodesVisited = 0;
48
48
  let transformationsApplied = 0;
49
49
  for (const fileInfo of getFilesToProcess(context)) {
50
+ const group = new RenameGroup();
50
51
  traverse(fileInfo.ast, {
51
52
  VariableDeclarator(path) {
52
53
  nodesVisited++;
53
54
  const id = path.node.id;
54
55
  if (id.type !== "Identifier")
55
56
  return;
56
- if (id.name.length > 2)
57
+ // Skip already-stable names
58
+ if (isStableRenamed(id.name))
57
59
  return;
58
60
  const init = path.node.init;
59
61
  if (init?.type !== "CallExpression")
@@ -69,17 +71,14 @@ export const renameTimeoutIdsTransform = {
69
71
  return;
70
72
  if (!binding.referencePaths.every((referencePath) => isClearTimeoutCallArgument(referencePath, id.name)))
71
73
  return;
72
- const targetName = getTargetName(path.scope, binding, {
74
+ group.add({
75
+ scope: path.scope,
76
+ currentName: id.name,
73
77
  baseName: BASE_NAME,
74
78
  });
75
- if (!targetName)
76
- return;
77
- if (id.name === targetName)
78
- return;
79
- path.scope.rename(id.name, targetName);
80
- transformationsApplied++;
81
79
  },
82
80
  });
81
+ transformationsApplied += group.apply();
83
82
  }
84
83
  return Promise.resolve({ nodesVisited, transformationsApplied });
85
84
  },
@@ -1,28 +1,28 @@
1
1
  import { createRequire } from "node:module";
2
+ import { RenameGroup } from "../../core/stable-naming.js";
2
3
  import { getFilesToProcess, } from "../../core/types.js";
3
4
  import { getReferenceUsage } from "./get-reference-usage.js";
4
- import { getTargetName } from "./get-target-name.js";
5
5
  import { isUseReferenceFalseInitializer } from "./is-use-reference-false-initializer.js";
6
6
  const require = createRequire(import.meta.url);
7
7
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
8
8
  const traverse = require("@babel/traverse").default;
9
+ const BASE_NAME = "hasRunRef";
9
10
  const renameUseReferenceGuardsTransform = {
10
11
  id: "rename-use-reference-guards",
11
- description: "Renames boolean useRef(false) guard variables to hasRunRef/hasRunRef2/...",
12
+ description: "Renames boolean useRef(false) guard variables to $hasRunRef/$hasRunRef2/... or hasRunRef/hasRunRef2/...",
12
13
  scope: "file",
13
14
  parallelizable: true,
14
15
  transform(context) {
15
16
  let nodesVisited = 0;
16
17
  let transformationsApplied = 0;
17
18
  for (const fileInfo of getFilesToProcess(context)) {
19
+ const group = new RenameGroup();
18
20
  traverse(fileInfo.ast, {
19
21
  VariableDeclarator(path) {
20
22
  nodesVisited++;
21
23
  const id = path.node.id;
22
24
  if (id.type !== "Identifier")
23
25
  return;
24
- if (id.name.length > 2)
25
- return;
26
26
  if (!isUseReferenceFalseInitializer(path.node))
27
27
  return;
28
28
  const binding = path.scope.getBinding(id.name);
@@ -36,15 +36,14 @@ const renameUseReferenceGuardsTransform = {
36
36
  !usage.hasTrueWrite ||
37
37
  usage.hasFalseWrite)
38
38
  return;
39
- const targetName = getTargetName(path.scope, binding);
40
- if (!targetName)
41
- return;
42
- if (id.name === targetName)
43
- return;
44
- path.scope.rename(id.name, targetName);
45
- transformationsApplied++;
39
+ group.add({
40
+ scope: path.scope,
41
+ currentName: id.name,
42
+ baseName: BASE_NAME,
43
+ });
46
44
  },
47
45
  });
46
+ transformationsApplied += group.apply();
48
47
  }
49
48
  return Promise.resolve({
50
49
  nodesVisited,
@@ -1,3 +1,3 @@
1
- import type { Transform } from "../../core/types.js";
1
+ import { type Transform } from "../../core/types.js";
2
2
  declare const renameUseReferenceGuardsV2Transform: Transform;
3
3
  export { renameUseReferenceGuardsV2Transform };
@@ -1,27 +1,29 @@
1
1
  import { createRequire } from "node:module";
2
+ import { isStableRenamed, RenameGroup } from "../../core/stable-naming.js";
3
+ import { getFilesToProcess, } from "../../core/types.js";
2
4
  import { getReferenceUsage } from "./get-reference-usage.js";
3
- import { getTargetName } from "./get-target-name.js";
4
5
  import { isUseReferenceFalseInitializer } from "./is-use-reference-false-initializer.js";
5
6
  const require = createRequire(import.meta.url);
6
7
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
7
8
  const traverse = require("@babel/traverse").default;
9
+ const BASE_NAME = "hasRunRef";
8
10
  const renameUseReferenceGuardsV2Transform = {
9
11
  id: "rename-use-reference-guards-v2",
10
- description: "Renames boolean useRef(false) guard variables (including reset-to-false guards) to hasRunRef/hasRunRef2/...",
12
+ description: "Renames boolean useRef(false) guard variables (including reset-to-false guards) to $hasRunRef/$hasRunRef2/... or hasRunRef/hasRunRef2/...",
11
13
  scope: "file",
12
14
  parallelizable: true,
13
15
  transform(context) {
14
- const { projectGraph } = context;
15
16
  let nodesVisited = 0;
16
17
  let transformationsApplied = 0;
17
- for (const [, fileInfo] of projectGraph.files) {
18
+ for (const fileInfo of getFilesToProcess(context)) {
19
+ const group = new RenameGroup();
18
20
  traverse(fileInfo.ast, {
19
21
  VariableDeclarator(path) {
20
22
  nodesVisited++;
21
23
  const id = path.node.id;
22
24
  if (id.type !== "Identifier")
23
25
  return;
24
- if (id.name.length > 2)
26
+ if (isStableRenamed(id.name))
25
27
  return;
26
28
  if (!isUseReferenceFalseInitializer(path.node))
27
29
  return;
@@ -31,17 +33,17 @@ const renameUseReferenceGuardsV2Transform = {
31
33
  if (!binding.constant)
32
34
  return;
33
35
  const usage = getReferenceUsage(binding);
36
+ // Unlike v1, this version also accepts guards that reset to false
34
37
  if (!usage.isSafe || !usage.hasRead || !usage.hasTrueWrite)
35
38
  return;
36
- const targetName = getTargetName(path.scope, binding);
37
- if (!targetName)
38
- return;
39
- if (id.name === targetName)
40
- return;
41
- path.scope.rename(id.name, targetName);
42
- transformationsApplied++;
39
+ group.add({
40
+ scope: path.scope,
41
+ currentName: id.name,
42
+ baseName: BASE_NAME,
43
+ });
43
44
  },
44
45
  });
46
+ transformationsApplied += group.apply();
45
47
  }
46
48
  return Promise.resolve({
47
49
  nodesVisited,
@@ -1,11 +1,6 @@
1
1
  import { expandBooleanLiteralsTransform } from "./expand-boolean-literals/expand-boolean-literals-transform.js";
2
- import { expandReturnSequenceTransform } from "./expand-return-sequence/expand-return-sequence-transform.js";
3
- import { expandSequenceExpressionsTransform } from "./expand-sequence-expressions/expand-sequence-expressions-transform.js";
4
- import { expandSequenceExpressionsV2Transform } from "./expand-sequence-expressions-v2/expand-sequence-expressions-v2-transform.js";
5
2
  import { expandSpecialNumberLiteralsTransform } from "./expand-special-number-literals/expand-special-number-literals-transform.js";
6
- import { expandSequenceExpressionsV3Transform } from "./expand-sequence-expressions-v3/expand-sequence-expressions-v3-transform.js";
7
3
  import { expandSequenceExpressionsV4Transform } from "./expand-sequence-expressions-v4/expand-sequence-expressions-v4-transform.js";
8
- import { expandThrowSequenceTransform } from "./expand-throw-sequence/expand-throw-sequence-transform.js";
9
4
  import { expandUndefinedLiteralsTransform } from "./expand-undefined-literals/expand-undefined-literals-transform.js";
10
5
  import { renameCatchParametersTransform } from "./rename-catch-parameters/rename-catch-parameters-transform.js";
11
6
  import { renameDestructuredAliasesTransform } from "./rename-destructured-aliases/rename-destructured-aliases-transform.js";
@@ -18,13 +13,8 @@ import { renameUseReferenceGuardsV2Transform } from "./rename-use-reference-guar
18
13
  import { splitVariableDeclarationsTransform } from "./split-variable-declarations/split-variable-declarations-transform.js";
19
14
  export const transformRegistry = {
20
15
  [expandBooleanLiteralsTransform.id]: expandBooleanLiteralsTransform,
21
- [expandReturnSequenceTransform.id]: expandReturnSequenceTransform,
22
- [expandSequenceExpressionsTransform.id]: expandSequenceExpressionsTransform,
23
- [expandSequenceExpressionsV2Transform.id]: expandSequenceExpressionsV2Transform,
24
- [expandSequenceExpressionsV3Transform.id]: expandSequenceExpressionsV3Transform,
25
16
  [expandSpecialNumberLiteralsTransform.id]: expandSpecialNumberLiteralsTransform,
26
17
  [expandSequenceExpressionsV4Transform.id]: expandSequenceExpressionsV4Transform,
27
- [expandThrowSequenceTransform.id]: expandThrowSequenceTransform,
28
18
  [expandUndefinedLiteralsTransform.id]: expandUndefinedLiteralsTransform,
29
19
  [renameCatchParametersTransform.id]: renameCatchParametersTransform,
30
20
  [renameDestructuredAliasesTransform.id]: renameDestructuredAliasesTransform,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "miniread",
3
3
  "author": "Łukasz Jerciński",
4
4
  "license": "MIT",
5
- "version": "1.6.0",
5
+ "version": "1.7.0",
6
6
  "description": "Transform minified JavaScript/TypeScript into a more readable form using deterministic AST-based transforms.",
7
7
  "repository": {
8
8
  "type": "git",
@@ -59,46 +59,6 @@
59
59
  "evaluatedAt": "2026-01-22T12:49:10.952Z",
60
60
  "notes": "Auto-added by evaluation script. Measured with baseline none: 0.09%."
61
61
  },
62
- {
63
- "id": "expand-return-sequence",
64
- "description": "Expands return sequences like `return a(), b();`",
65
- "scope": "file",
66
- "parallelizable": true,
67
- "diffReductionImpact": -0.0012834789830316051,
68
- "recommended": false,
69
- "evaluatedAt": "2026-01-22T15:19:04.615Z",
70
- "notes": "Auto-added by evaluation script. Measured with baseline none: -0.13%. Superseded by expand-sequence-expressions-v2 in the recommended preset."
71
- },
72
- {
73
- "id": "expand-sequence-expressions",
74
- "description": "Expands comma operator sequences in statements and variable initializers",
75
- "scope": "file",
76
- "parallelizable": true,
77
- "diffReductionImpact": -0.01282535248485317,
78
- "recommended": false,
79
- "evaluatedAt": "2026-01-22T17:15:48.528Z",
80
- "notes": "Auto-added by evaluation script. Measured with baseline none: -1.28%. Enabled for readability even when line diffs increase. Kept separate from expand-return-sequence to avoid modifying existing transforms and to allow independent enabling."
81
- },
82
- {
83
- "id": "expand-sequence-expressions-v2",
84
- "description": "Expands comma operator sequences in returns, statements, and variable initializers",
85
- "scope": "file",
86
- "parallelizable": true,
87
- "diffReductionImpact": -0.014316453068081048,
88
- "recommended": false,
89
- "evaluatedAt": "2026-01-22T18:22:48.609Z",
90
- "notes": "Superseded by expand-sequence-expressions-v3."
91
- },
92
- {
93
- "id": "expand-sequence-expressions-v3",
94
- "description": "Expands comma operator sequences in returns, throws, statements, and variable initializers",
95
- "scope": "file",
96
- "parallelizable": true,
97
- "diffReductionImpact": -0.014391951831788763,
98
- "recommended": false,
99
- "evaluatedAt": "2026-01-23T08:21:23.662Z",
100
- "notes": "Supersedes expand-sequence-expressions-v2 in the recommended preset. Measured with baseline none: -1.44%. Enabled for readability even when line diffs increase."
101
- },
102
62
  {
103
63
  "id": "expand-sequence-expressions-v4",
104
64
  "description": "Expands comma operator sequences in returns, throws, statements (including control-flow bodies), and variable initializers",
@@ -107,7 +67,7 @@
107
67
  "diffReductionImpact": -0.01730809158000035,
108
68
  "recommended": true,
109
69
  "evaluatedAt": "2026-01-23T10:57:45.082Z",
110
- "notes": "Measured with baseline none: -1.73%. Supersedes expand-sequence-expressions-v3 and includes control-flow-body expansion."
70
+ "notes": "Measured with baseline none: -1.73%. Supersedes all prior sequence expression transforms."
111
71
  },
112
72
  {
113
73
  "id": "rename-use-reference-guards",
@@ -135,9 +95,9 @@
135
95
  "scope": "file",
136
96
  "parallelizable": true,
137
97
  "diffReductionImpact": 0.00003774938185385768,
138
- "recommended": false,
98
+ "recommended": true,
139
99
  "evaluatedAt": "2026-01-23T10:29:23.279Z",
140
- "notes": "Measured with baseline none: 0.00%. Not enabled by default (readability-only)."
100
+ "notes": "Measured with baseline none: 0.00%. Added to recommended for readability."
141
101
  },
142
102
  {
143
103
  "id": "split-variable-declarations",
@@ -149,16 +109,6 @@
149
109
  "evaluatedAt": "2026-01-23T05:45:27.981Z",
150
110
  "notes": "Auto-added by evaluation script. Measured with baseline none: -0.28%. Enabled in the recommended preset for readability and to normalize variable declarations even when line diffs increase."
151
111
  },
152
- {
153
- "id": "expand-throw-sequence",
154
- "description": "Expands throw sequences like `throw (a(), b)`",
155
- "scope": "file",
156
- "parallelizable": true,
157
- "diffReductionImpact": -0.00007549876370771536,
158
- "recommended": false,
159
- "evaluatedAt": "2026-01-23T07:48:29.356Z",
160
- "notes": "Largely superseded by expand-sequence-expressions-v3 (which also expands throw sequences), but kept for isolated runs and comparison."
161
- },
162
112
  {
163
113
  "id": "rename-promise-executor-parameters",
164
114
  "description": "Renames promise-like executor parameters in `new X(executor)` to resolve/reject when usage is high-confidence",
@@ -1,2 +0,0 @@
1
- import { type Transform } from "../../core/types.js";
2
- export declare const expandReturnSequenceTransform: Transform;
@@ -1,91 +0,0 @@
1
- import { createRequire } from "node:module";
2
- import { getFilesToProcess, } from "../../core/types.js";
3
- const require = createRequire(import.meta.url);
4
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
5
- const traverse = require("@babel/traverse").default;
6
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
7
- const t = require("@babel/types");
8
- const isSupportedParent = (path) => {
9
- return path.parentPath.isBlockStatement() || path.parentPath.isSwitchCase();
10
- };
11
- const getSequenceExpressions = (node) => {
12
- const argument = node.argument;
13
- if (!argument)
14
- return;
15
- if (argument.type !== "SequenceExpression")
16
- return;
17
- if (argument.expressions.length < 2)
18
- return;
19
- return argument.expressions;
20
- };
21
- const createExpressionStatement = (expression) => {
22
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
23
- return t.expressionStatement(expression);
24
- };
25
- const createReturnStatement = (expression) => {
26
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
27
- return t.returnStatement(expression);
28
- };
29
- const isDirectiveProloguePosition = (path) => {
30
- if (!path.parentPath.isBlockStatement())
31
- return false;
32
- const siblings = path.parentPath.get("body");
33
- if (!Array.isArray(siblings))
34
- return false;
35
- const index = siblings.findIndex((sibling) => sibling.node === path.node);
36
- if (index === -1)
37
- return false;
38
- for (let bodyIndex = 0; bodyIndex < index; bodyIndex++) {
39
- const sibling = siblings[bodyIndex];
40
- if (!sibling)
41
- return false;
42
- if (!sibling.isExpressionStatement())
43
- return false;
44
- if (sibling.node.expression.type !== "StringLiteral")
45
- return false;
46
- }
47
- return true;
48
- };
49
- export const expandReturnSequenceTransform = {
50
- id: "expand-return-sequence",
51
- description: "Expands return sequences like `return a(), b();`",
52
- scope: "file",
53
- parallelizable: true,
54
- transform(context) {
55
- let nodesVisited = 0;
56
- let transformationsApplied = 0;
57
- for (const fileInfo of getFilesToProcess(context)) {
58
- traverse(fileInfo.ast, {
59
- ReturnStatement(path) {
60
- nodesVisited++;
61
- if (!isSupportedParent(path))
62
- return;
63
- const expressions = getSequenceExpressions(path.node);
64
- if (!expressions)
65
- return;
66
- const leadingExpressions = expressions.slice(0, -1);
67
- const lastExpression = expressions.at(-1);
68
- if (!lastExpression)
69
- return;
70
- const firstExpression = leadingExpressions[0];
71
- if (firstExpression?.type === "StringLiteral" &&
72
- isDirectiveProloguePosition(path)) {
73
- return;
74
- }
75
- const statements = leadingExpressions.map((expression) => createExpressionStatement(
76
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
77
- t.cloneNode(expression, true)));
78
- statements.push(createReturnStatement(
79
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
80
- t.cloneNode(lastExpression, true)));
81
- path.replaceWithMultiple(statements);
82
- transformationsApplied++;
83
- },
84
- });
85
- }
86
- return Promise.resolve({
87
- nodesVisited,
88
- transformationsApplied,
89
- });
90
- },
91
- };
@@ -1,3 +0,0 @@
1
- import type { NodePath } from "@babel/traverse";
2
- import type { ExpressionStatement } from "@babel/types";
3
- export declare const tryExpandExpressionStatementSequence: (path: NodePath<ExpressionStatement>) => boolean;
@@ -1,57 +0,0 @@
1
- import { createRequire } from "node:module";
2
- const require = createRequire(import.meta.url);
3
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
4
- const t = require("@babel/types");
5
- const isSupportedStatementContainer = (path) => {
6
- const parentPath = path.parentPath;
7
- if (!parentPath)
8
- return false;
9
- return (parentPath.isProgram() ||
10
- parentPath.isBlockStatement() ||
11
- parentPath.isSwitchCase());
12
- };
13
- const isDirectiveProloguePosition = (path) => {
14
- const parentPath = path.parentPath;
15
- if (!parentPath)
16
- return false;
17
- if (!parentPath.isProgram() && !parentPath.isBlockStatement())
18
- return false;
19
- const siblings = parentPath.get("body");
20
- if (!Array.isArray(siblings))
21
- return false;
22
- const index = siblings.findIndex((sibling) => sibling.node === path.node);
23
- if (index === -1)
24
- return false;
25
- for (let bodyIndex = 0; bodyIndex < index; bodyIndex++) {
26
- const sibling = siblings[bodyIndex];
27
- if (!sibling)
28
- return false;
29
- if (!sibling.isExpressionStatement())
30
- return false;
31
- if (sibling.node.expression.type !== "StringLiteral")
32
- return false;
33
- }
34
- return true;
35
- };
36
- export const tryExpandExpressionStatementSequence = (path) => {
37
- if (!isSupportedStatementContainer(path))
38
- return false;
39
- const expression = path.node.expression;
40
- if (expression.type !== "SequenceExpression")
41
- return false;
42
- if (expression.expressions.length < 2)
43
- return false;
44
- const firstExpression = expression.expressions[0];
45
- if (firstExpression?.type === "StringLiteral" &&
46
- isDirectiveProloguePosition(path)) {
47
- return false;
48
- }
49
- const statements = expression.expressions.map((expr) => {
50
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
51
- return t.expressionStatement(
52
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
53
- t.cloneNode(expr, true));
54
- });
55
- path.replaceWithMultiple(statements);
56
- return true;
57
- };
@@ -1,2 +0,0 @@
1
- import { type Transform } from "../../core/types.js";
2
- export declare const expandSequenceExpressionsTransform: Transform;