miniread 1.0.0 → 1.2.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 (98) hide show
  1. package/README.md +2 -2
  2. package/dist/scripts/evaluate/check-expected-evaluations.d.ts +17 -0
  3. package/dist/scripts/evaluate/check-expected-evaluations.js +35 -0
  4. package/dist/scripts/evaluate/check-snapshots.d.ts +14 -0
  5. package/dist/scripts/evaluate/check-snapshots.js +111 -0
  6. package/dist/scripts/evaluate/clone-metrics-report.d.ts +2 -0
  7. package/dist/scripts/evaluate/clone-metrics-report.js +6 -0
  8. package/dist/scripts/evaluate/create-evaluate-command.js +5 -20
  9. package/dist/scripts/evaluate/evaluate-help-text.d.ts +1 -0
  10. package/dist/scripts/evaluate/evaluate-help-text.js +21 -0
  11. package/dist/scripts/evaluate/pair-evaluator.d.ts +1 -0
  12. package/dist/scripts/evaluate/pair-evaluator.js +14 -3
  13. package/dist/scripts/evaluate/parse-evaluate-cli-options.d.ts +2 -0
  14. package/dist/scripts/evaluate/parse-evaluate-cli-options.js +3 -1
  15. package/dist/scripts/evaluate/parse-transform-manifest.d.ts +2 -2
  16. package/dist/scripts/evaluate/parse-transform-manifest.js +2 -2
  17. package/dist/scripts/evaluate/relative-patch-path.d.ts +7 -0
  18. package/dist/scripts/evaluate/relative-patch-path.js +22 -0
  19. package/dist/scripts/evaluate/run-check-mode.d.ts +8 -0
  20. package/dist/scripts/evaluate/run-check-mode.js +116 -0
  21. package/dist/scripts/evaluate/run-evaluate-cli.js +11 -3
  22. package/dist/scripts/evaluate/run-evaluations.js +1 -0
  23. package/dist/scripts/evaluate/transform-content.d.ts +14 -0
  24. package/dist/scripts/evaluate/transform-content.js +31 -0
  25. package/dist/scripts/evaluate/transform-manifest.d.ts +0 -2
  26. package/dist/scripts/evaluate/transform-manifest.js +16 -35
  27. package/dist/transforms/expand-return-sequence/expand-return-sequence-transform.d.ts +2 -0
  28. package/dist/transforms/expand-return-sequence/expand-return-sequence-transform.js +91 -0
  29. package/dist/transforms/expand-sequence-expressions/expand-expression-statement-sequence.d.ts +3 -0
  30. package/dist/transforms/expand-sequence-expressions/expand-expression-statement-sequence.js +57 -0
  31. package/dist/transforms/expand-sequence-expressions/expand-sequence-expressions-transform.d.ts +2 -0
  32. package/dist/transforms/expand-sequence-expressions/expand-sequence-expressions-transform.js +34 -0
  33. package/dist/transforms/expand-sequence-expressions/expand-variable-declaration-sequence.d.ts +3 -0
  34. package/dist/transforms/expand-sequence-expressions/expand-variable-declaration-sequence.js +93 -0
  35. package/dist/transforms/expand-sequence-expressions-v2/expand-expression-statement-sequence.d.ts +3 -0
  36. package/dist/transforms/expand-sequence-expressions-v2/expand-expression-statement-sequence.js +55 -0
  37. package/dist/transforms/expand-sequence-expressions-v2/expand-return-sequence.d.ts +3 -0
  38. package/dist/transforms/expand-sequence-expressions-v2/expand-return-sequence.js +86 -0
  39. package/dist/transforms/expand-sequence-expressions-v2/expand-sequence-expressions-v2-transform.d.ts +2 -0
  40. package/dist/transforms/expand-sequence-expressions-v2/expand-sequence-expressions-v2-transform.js +41 -0
  41. package/dist/transforms/expand-sequence-expressions-v2/expand-variable-declaration-sequence.d.ts +3 -0
  42. package/dist/transforms/expand-sequence-expressions-v2/expand-variable-declaration-sequence.js +93 -0
  43. package/dist/transforms/expand-sequence-expressions-v3/expand-expression-statement-sequence.d.ts +3 -0
  44. package/dist/transforms/expand-sequence-expressions-v3/expand-expression-statement-sequence.js +64 -0
  45. package/dist/transforms/expand-sequence-expressions-v3/expand-return-sequence.d.ts +3 -0
  46. package/dist/transforms/expand-sequence-expressions-v3/expand-return-sequence.js +91 -0
  47. package/dist/transforms/expand-sequence-expressions-v3/expand-sequence-expressions-v3-transform.d.ts +2 -0
  48. package/dist/transforms/expand-sequence-expressions-v3/expand-sequence-expressions-v3-transform.js +48 -0
  49. package/dist/transforms/expand-sequence-expressions-v3/expand-throw-sequence.d.ts +3 -0
  50. package/dist/transforms/expand-sequence-expressions-v3/expand-throw-sequence.js +101 -0
  51. package/dist/transforms/expand-sequence-expressions-v3/expand-variable-declaration-sequence.d.ts +3 -0
  52. package/dist/transforms/expand-sequence-expressions-v3/expand-variable-declaration-sequence.js +99 -0
  53. package/dist/transforms/expand-throw-sequence/expand-throw-sequence-transform.d.ts +2 -0
  54. package/dist/transforms/expand-throw-sequence/expand-throw-sequence-transform.js +117 -0
  55. package/dist/transforms/rename-binding/get-target-name.d.ts +4 -0
  56. package/dist/transforms/rename-binding/get-target-name.js +25 -0
  57. package/dist/transforms/rename-binding/is-valid-binding-identifier.d.ts +1 -0
  58. package/dist/transforms/rename-binding/is-valid-binding-identifier.js +10 -0
  59. package/dist/transforms/rename-destructured-aliases/binding-context.d.ts +7 -0
  60. package/dist/transforms/rename-destructured-aliases/binding-context.js +83 -0
  61. package/dist/transforms/rename-destructured-aliases/rename-destructured-aliases-transform.d.ts +2 -0
  62. package/dist/transforms/rename-destructured-aliases/rename-destructured-aliases-transform.js +118 -0
  63. package/dist/transforms/rename-promise-executor-parameters/is-valid-binding-identifier.d.ts +1 -0
  64. package/dist/transforms/rename-promise-executor-parameters/is-valid-binding-identifier.js +10 -0
  65. package/dist/transforms/rename-promise-executor-parameters/promise-executor-heuristics.d.ts +6 -0
  66. package/dist/transforms/rename-promise-executor-parameters/promise-executor-heuristics.js +88 -0
  67. package/dist/transforms/rename-promise-executor-parameters/rename-binding-if-safe.d.ts +3 -0
  68. package/dist/transforms/rename-promise-executor-parameters/rename-binding-if-safe.js +40 -0
  69. package/dist/transforms/rename-promise-executor-parameters/rename-promise-executor-parameters-transform.d.ts +2 -0
  70. package/dist/transforms/rename-promise-executor-parameters/rename-promise-executor-parameters-transform.js +76 -0
  71. package/dist/transforms/rename-timeout-ids/rename-timeout-ids-transform.d.ts +2 -0
  72. package/dist/transforms/rename-timeout-ids/rename-timeout-ids-transform.js +86 -0
  73. package/dist/transforms/rename-use-reference-guards/get-member-expression-for-reference.d.ts +3 -0
  74. package/dist/transforms/rename-use-reference-guards/get-member-expression-for-reference.js +10 -0
  75. package/dist/transforms/rename-use-reference-guards/get-reference-usage.d.ts +9 -0
  76. package/dist/transforms/rename-use-reference-guards/get-reference-usage.js +47 -0
  77. package/dist/transforms/rename-use-reference-guards/get-target-name.d.ts +2 -0
  78. package/dist/transforms/rename-use-reference-guards/get-target-name.js +23 -0
  79. package/dist/transforms/rename-use-reference-guards/is-use-reference-false-initializer.d.ts +2 -0
  80. package/dist/transforms/rename-use-reference-guards/is-use-reference-false-initializer.js +25 -0
  81. package/dist/transforms/rename-use-reference-guards/is-valid-binding-identifier.d.ts +1 -0
  82. package/dist/transforms/rename-use-reference-guards/is-valid-binding-identifier.js +10 -0
  83. package/dist/transforms/rename-use-reference-guards/rename-use-reference-guards-transform.d.ts +3 -0
  84. package/dist/transforms/rename-use-reference-guards/rename-use-reference-guards-transform.js +55 -0
  85. package/dist/transforms/split-variable-declarations/create-variable-declaration.d.ts +2 -0
  86. package/dist/transforms/split-variable-declarations/create-variable-declaration.js +28 -0
  87. package/dist/transforms/split-variable-declarations/is-safe-to-split-variable-declaration.d.ts +3 -0
  88. package/dist/transforms/split-variable-declarations/is-safe-to-split-variable-declaration.js +52 -0
  89. package/dist/transforms/split-variable-declarations/split-variable-declarations-transform.d.ts +2 -0
  90. package/dist/transforms/split-variable-declarations/split-variable-declarations-transform.js +81 -0
  91. package/dist/transforms/transform-presets.js +2 -2
  92. package/dist/transforms/transform-registry.js +20 -4
  93. package/package.json +29 -23
  94. package/transform-manifest.json +110 -30
  95. package/dist/transforms/add-prefix/add-prefix-transform.d.ts +0 -2
  96. package/dist/transforms/add-prefix/add-prefix-transform.js +0 -40
  97. package/dist/transforms/add-suffix/add-suffix-transform.d.ts +0 -2
  98. package/dist/transforms/add-suffix/add-suffix-transform.js +0 -40
@@ -0,0 +1,23 @@
1
+ import { isValidBindingIdentifier } from "./is-valid-binding-identifier.js";
2
+ const BASE_NAME = "hasRunRef";
3
+ // Cap retries to avoid pathological loops while handling large bundles.
4
+ const MAX_CANDIDATES = 1000;
5
+ export const getTargetName = (bindingScope, binding) => {
6
+ const programScope = bindingScope.getProgramParent();
7
+ for (let index = 0; index < MAX_CANDIDATES; index++) {
8
+ const candidate = index === 0 ? BASE_NAME : `${BASE_NAME}${index + 1}`;
9
+ if (!isValidBindingIdentifier(candidate))
10
+ continue;
11
+ // Avoid shadowing bindings in parent scopes.
12
+ if (bindingScope.hasBinding(candidate))
13
+ continue;
14
+ if (Object.hasOwn(programScope.globals, candidate))
15
+ continue;
16
+ const wouldBeShadowed = binding.referencePaths.some((referencePath) => referencePath.scope !== bindingScope &&
17
+ referencePath.scope.hasBinding(candidate));
18
+ if (wouldBeShadowed)
19
+ continue;
20
+ return candidate;
21
+ }
22
+ return;
23
+ };
@@ -0,0 +1,2 @@
1
+ import type { VariableDeclarator } from "@babel/types";
2
+ export declare const isUseReferenceFalseInitializer: (declarator: VariableDeclarator) => boolean;
@@ -0,0 +1,25 @@
1
+ export const isUseReferenceFalseInitializer = (declarator) => {
2
+ const init = declarator.init;
3
+ if (!init)
4
+ return false;
5
+ if (init.type !== "CallExpression")
6
+ return false;
7
+ if (init.arguments.length !== 1)
8
+ return false;
9
+ const argument = init.arguments[0];
10
+ if (argument?.type !== "BooleanLiteral")
11
+ return false;
12
+ if (argument.value)
13
+ return false;
14
+ const callee = init.callee;
15
+ if (callee.type === "Identifier") {
16
+ return callee.name === "useRef";
17
+ }
18
+ if (callee.type !== "MemberExpression")
19
+ return false;
20
+ if (callee.computed)
21
+ return false;
22
+ if (callee.property.type !== "Identifier")
23
+ return false;
24
+ return callee.property.name === "useRef";
25
+ };
@@ -0,0 +1 @@
1
+ export declare const isValidBindingIdentifier: (name: string) => boolean;
@@ -0,0 +1,10 @@
1
+ import { isIdentifierName, isKeyword, isStrictBindReservedWord, } from "@babel/helper-validator-identifier";
2
+ export const isValidBindingIdentifier = (name) => {
3
+ if (!isIdentifierName(name))
4
+ return false;
5
+ if (isKeyword(name))
6
+ return false;
7
+ if (isStrictBindReservedWord(name, true))
8
+ return false;
9
+ return true;
10
+ };
@@ -0,0 +1,3 @@
1
+ import type { Transform } from "../../core/types.js";
2
+ declare const renameUseReferenceGuardsTransform: Transform;
3
+ export { renameUseReferenceGuardsTransform };
@@ -0,0 +1,55 @@
1
+ import { createRequire } from "node:module";
2
+ import { getReferenceUsage } from "./get-reference-usage.js";
3
+ import { getTargetName } from "./get-target-name.js";
4
+ import { isUseReferenceFalseInitializer } from "./is-use-reference-false-initializer.js";
5
+ const require = createRequire(import.meta.url);
6
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
7
+ const traverse = require("@babel/traverse").default;
8
+ const renameUseReferenceGuardsTransform = {
9
+ id: "rename-use-reference-guards",
10
+ description: "Renames boolean useRef(false) guard variables to hasRunRef/hasRunRef2/...",
11
+ scope: "file",
12
+ parallelizable: true,
13
+ transform(context) {
14
+ const { projectGraph } = context;
15
+ let nodesVisited = 0;
16
+ let transformationsApplied = 0;
17
+ for (const [, fileInfo] of projectGraph.files) {
18
+ traverse(fileInfo.ast, {
19
+ VariableDeclarator(path) {
20
+ nodesVisited++;
21
+ const id = path.node.id;
22
+ if (id.type !== "Identifier")
23
+ return;
24
+ if (id.name.length > 2)
25
+ return;
26
+ if (!isUseReferenceFalseInitializer(path.node))
27
+ return;
28
+ const binding = path.scope.getBinding(id.name);
29
+ if (!binding)
30
+ return;
31
+ if (!binding.constant)
32
+ return;
33
+ const usage = getReferenceUsage(binding);
34
+ if (!usage.isSafe ||
35
+ !usage.hasRead ||
36
+ !usage.hasTrueWrite ||
37
+ usage.hasFalseWrite)
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++;
46
+ },
47
+ });
48
+ }
49
+ return Promise.resolve({
50
+ nodesVisited,
51
+ transformationsApplied,
52
+ });
53
+ },
54
+ };
55
+ export { renameUseReferenceGuardsTransform };
@@ -0,0 +1,2 @@
1
+ import type { VariableDeclaration } from "@babel/types";
2
+ export declare const createVariableDeclarationFromDeclarator: (kind: VariableDeclaration["kind"], declarator: VariableDeclaration["declarations"][number], declare: VariableDeclaration["declare"]) => VariableDeclaration;
@@ -0,0 +1,28 @@
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
+ export const createVariableDeclarationFromDeclarator = (kind, declarator, declare) => {
6
+ const clonedDeclarator =
7
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
8
+ t.cloneNode(declarator, true);
9
+ const originalDeclarator = declarator;
10
+ const commentableClone = clonedDeclarator;
11
+ if (originalDeclarator.leadingComments) {
12
+ commentableClone.leadingComments = originalDeclarator.leadingComments;
13
+ }
14
+ if (originalDeclarator.innerComments) {
15
+ commentableClone.innerComments = originalDeclarator.innerComments;
16
+ }
17
+ if (originalDeclarator.trailingComments) {
18
+ commentableClone.trailingComments = originalDeclarator.trailingComments;
19
+ }
20
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
21
+ const declaration = t.variableDeclaration(kind, [
22
+ clonedDeclarator,
23
+ ]);
24
+ if (declare) {
25
+ declaration.declare = declare;
26
+ }
27
+ return declaration;
28
+ };
@@ -0,0 +1,3 @@
1
+ import type { NodePath } from "@babel/traverse";
2
+ import type { VariableDeclaration } from "@babel/types";
3
+ export declare const isSafeToSplitVariableDeclaration: (path: NodePath<VariableDeclaration>) => boolean;
@@ -0,0 +1,52 @@
1
+ const getDeclaratorsIfSimpleIdentifiers = (path) => {
2
+ const declaratorPaths = path.get("declarations");
3
+ if (!Array.isArray(declaratorPaths))
4
+ return [];
5
+ const declarators = [];
6
+ for (const declaratorPath of declaratorPaths) {
7
+ if (!declaratorPath.isVariableDeclarator())
8
+ return [];
9
+ const idPath = declaratorPath.get("id");
10
+ if (!idPath.isIdentifier())
11
+ return [];
12
+ declarators.push({ declaratorPath, name: idPath.node.name });
13
+ }
14
+ return declarators;
15
+ };
16
+ const initializerReferencesAnyName = (initPath, names) => {
17
+ let found = false;
18
+ initPath.traverse({
19
+ Identifier(identifierPath) {
20
+ if (!identifierPath.isReferencedIdentifier())
21
+ return;
22
+ if (!names.has(identifierPath.node.name))
23
+ return;
24
+ found = true;
25
+ identifierPath.stop();
26
+ },
27
+ });
28
+ return found;
29
+ };
30
+ export const isSafeToSplitVariableDeclaration = (path) => {
31
+ const { kind } = path.node;
32
+ if (kind === "var")
33
+ return true;
34
+ const declarators = getDeclaratorsIfSimpleIdentifiers(path);
35
+ if (declarators.length < 2)
36
+ return false;
37
+ for (let index = 0; index < declarators.length - 1; index++) {
38
+ const declarator = declarators[index];
39
+ if (!declarator)
40
+ continue;
41
+ const laterNames = new Set(declarators.slice(index + 1).map((item) => item.name));
42
+ if (laterNames.size === 0)
43
+ continue;
44
+ const initPath = declarator.declaratorPath.get("init");
45
+ if (!initPath.node)
46
+ continue;
47
+ if (initializerReferencesAnyName(initPath, laterNames)) {
48
+ return false;
49
+ }
50
+ }
51
+ return true;
52
+ };
@@ -0,0 +1,2 @@
1
+ import type { Transform } from "../../core/types.js";
2
+ export declare const splitVariableDeclarationsTransform: Transform;
@@ -0,0 +1,81 @@
1
+ import { createRequire } from "node:module";
2
+ import { createVariableDeclarationFromDeclarator } from "./create-variable-declaration.js";
3
+ import { isSafeToSplitVariableDeclaration } from "./is-safe-to-split-variable-declaration.js";
4
+ const require = createRequire(import.meta.url);
5
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
6
+ const traverse = require("@babel/traverse").default;
7
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
8
+ const t = require("@babel/types");
9
+ const isSupportedStatementContainer = (path) => {
10
+ const parentPath = path.parentPath;
11
+ if (!parentPath)
12
+ return false;
13
+ return (parentPath.isProgram() ||
14
+ parentPath.isBlockStatement() ||
15
+ parentPath.isSwitchCase());
16
+ };
17
+ const transferSplitComments = (original, first, last) => {
18
+ if (first && original.leadingComments) {
19
+ first.leadingComments = original.leadingComments;
20
+ }
21
+ if (first && original.innerComments) {
22
+ first.innerComments = original.innerComments;
23
+ }
24
+ if (last && original.trailingComments) {
25
+ last.trailingComments = original.trailingComments;
26
+ }
27
+ };
28
+ export const splitVariableDeclarationsTransform = {
29
+ id: "split-variable-declarations",
30
+ description: "Splits multi-declarator variable declarations into separate statements (statement position and exports)",
31
+ scope: "file",
32
+ parallelizable: true,
33
+ transform(context) {
34
+ const { projectGraph } = context;
35
+ let nodesVisited = 0;
36
+ let transformationsApplied = 0;
37
+ for (const [, fileInfo] of projectGraph.files) {
38
+ traverse(fileInfo.ast, {
39
+ ExportNamedDeclaration(path) {
40
+ nodesVisited++;
41
+ const declarationPath = path.get("declaration");
42
+ if (!declarationPath.isVariableDeclaration())
43
+ return;
44
+ if (declarationPath.node.declarations.length < 2)
45
+ return;
46
+ if (!isSafeToSplitVariableDeclaration(declarationPath))
47
+ return;
48
+ const declaration = declarationPath.node;
49
+ const statements = declaration.declarations.map((declarator) => {
50
+ const newDeclaration = createVariableDeclarationFromDeclarator(declaration.kind, declarator, declaration.declare);
51
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
52
+ const exportDeclaration = t.exportNamedDeclaration(newDeclaration, []);
53
+ exportDeclaration.exportKind =
54
+ path.node.exportKind;
55
+ return exportDeclaration;
56
+ });
57
+ transferSplitComments(path.node, statements.at(0), statements.at(-1));
58
+ path.replaceWithMultiple(statements);
59
+ path.skip();
60
+ transformationsApplied++;
61
+ },
62
+ VariableDeclaration(path) {
63
+ nodesVisited++;
64
+ if (!isSupportedStatementContainer(path))
65
+ return;
66
+ const declaration = path.node;
67
+ if (declaration.declarations.length < 2)
68
+ return;
69
+ if (!isSafeToSplitVariableDeclaration(path))
70
+ return;
71
+ const statements = declaration.declarations.map((declarator) => createVariableDeclarationFromDeclarator(declaration.kind, declarator, declaration.declare));
72
+ transferSplitComments(declaration, statements.at(0), statements.at(-1));
73
+ path.replaceWithMultiple(statements);
74
+ path.skip();
75
+ transformationsApplied++;
76
+ },
77
+ });
78
+ }
79
+ return Promise.resolve({ nodesVisited, transformationsApplied });
80
+ },
81
+ };
@@ -3,7 +3,7 @@ import * as z from "zod";
3
3
  const TransformManifestEntry = z
4
4
  .object({
5
5
  id: z.string().min(1),
6
- enabledByDefault: z.boolean(),
6
+ recommended: z.boolean(),
7
7
  })
8
8
  .loose();
9
9
  const TransformManifest = z
@@ -14,6 +14,6 @@ const TransformManifest = z
14
14
  const transformManifest = TransformManifest.parse(transformManifestJson);
15
15
  export const transformPresets = {
16
16
  recommended: transformManifest.transforms
17
- .filter((transform) => transform.enabledByDefault)
17
+ .filter((transform) => transform.recommended)
18
18
  .map((transform) => transform.id),
19
19
  };
@@ -1,15 +1,31 @@
1
- import { addPrefixTransform } from "./add-prefix/add-prefix-transform.js";
2
- import { addSuffixTransform } from "./add-suffix/add-suffix-transform.js";
3
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
+ import { expandSequenceExpressionsV3Transform } from "./expand-sequence-expressions-v3/expand-sequence-expressions-v3-transform.js";
6
+ import { expandThrowSequenceTransform } from "./expand-throw-sequence/expand-throw-sequence-transform.js";
4
7
  import { expandUndefinedLiteralsTransform } from "./expand-undefined-literals/expand-undefined-literals-transform.js";
5
8
  import { renameCatchParametersTransform } from "./rename-catch-parameters/rename-catch-parameters-transform.js";
9
+ import { renameDestructuredAliasesTransform } from "./rename-destructured-aliases/rename-destructured-aliases-transform.js";
6
10
  import { renameLoopIndexVariablesTransform } from "./rename-loop-index-variables/rename-loop-index-variables-transform.js";
11
+ import { renamePromiseExecutorParametersTransform } from "./rename-promise-executor-parameters/rename-promise-executor-parameters-transform.js";
12
+ import { renameTimeoutIdsTransform } from "./rename-timeout-ids/rename-timeout-ids-transform.js";
13
+ import { renameUseReferenceGuardsTransform } from "./rename-use-reference-guards/rename-use-reference-guards-transform.js";
14
+ import { splitVariableDeclarationsTransform } from "./split-variable-declarations/split-variable-declarations-transform.js";
7
15
  export const transformRegistry = {
8
- [addPrefixTransform.id]: addPrefixTransform,
9
- [addSuffixTransform.id]: addSuffixTransform,
10
16
  [expandBooleanLiteralsTransform.id]: expandBooleanLiteralsTransform,
17
+ [expandReturnSequenceTransform.id]: expandReturnSequenceTransform,
18
+ [expandSequenceExpressionsTransform.id]: expandSequenceExpressionsTransform,
19
+ [expandSequenceExpressionsV2Transform.id]: expandSequenceExpressionsV2Transform,
20
+ [expandSequenceExpressionsV3Transform.id]: expandSequenceExpressionsV3Transform,
21
+ [expandThrowSequenceTransform.id]: expandThrowSequenceTransform,
11
22
  [expandUndefinedLiteralsTransform.id]: expandUndefinedLiteralsTransform,
12
23
  [renameCatchParametersTransform.id]: renameCatchParametersTransform,
24
+ [renameDestructuredAliasesTransform.id]: renameDestructuredAliasesTransform,
13
25
  [renameLoopIndexVariablesTransform.id]: renameLoopIndexVariablesTransform,
26
+ [renamePromiseExecutorParametersTransform.id]: renamePromiseExecutorParametersTransform,
27
+ [renameTimeoutIdsTransform.id]: renameTimeoutIdsTransform,
28
+ [renameUseReferenceGuardsTransform.id]: renameUseReferenceGuardsTransform,
29
+ [splitVariableDeclarationsTransform.id]: splitVariableDeclarationsTransform,
14
30
  };
15
31
  export const allTransformIds = Object.keys(transformRegistry);
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.0.0",
5
+ "version": "1.2.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",
@@ -33,12 +33,34 @@
33
33
  "README.md",
34
34
  "LICENSE"
35
35
  ],
36
+ "scripts": {
37
+ "prepare": "git config core.hooksPath .githooks",
38
+ "prepublishOnly": "pnpm run rebuild",
39
+ "build": "tsc -p tsconfig.app.json",
40
+ "check": "pnpm -s run rebuild && node bin/miniread-evaluate -- --check",
41
+ "clean": "rm -rf dist *.tsbuildinfo",
42
+ "format": "prettier --write .",
43
+ "format:check": "prettier --check .",
44
+ "fta": "fta-check",
45
+ "knip": "knip",
46
+ "lint": "eslint",
47
+ "miniread": "pnpm -s run rebuild && node bin/miniread",
48
+ "miniread-evaluate": "pnpm -s run rebuild && node bin/miniread-evaluate",
49
+ "miniread-sample": "pnpm -s run rebuild && node bin/miniread-sample",
50
+ "rebuild": "pnpm run clean && pnpm run build",
51
+ "test": "vitest run",
52
+ "test:coverage": "vitest run --coverage",
53
+ "test:watch": "vitest",
54
+ "typecheck": "tsc -b --noEmit"
55
+ },
36
56
  "keywords": [],
57
+ "packageManager": "pnpm@10.28.1",
37
58
  "engines": {
38
59
  "node": ">=22.14.0"
39
60
  },
40
61
  "dependencies": {
41
62
  "@babel/generator": "^7.28.6",
63
+ "@babel/helper-validator-identifier": "^7.28.5",
42
64
  "@babel/parser": "^7.28.6",
43
65
  "@babel/traverse": "^7.28.6",
44
66
  "@babel/types": "^7.28.6",
@@ -46,14 +68,15 @@
46
68
  "commander": "^14.0.2",
47
69
  "env-paths": "^3.0.0",
48
70
  "p-queue": "^9.1.0",
49
- "zod": "^4.3.5"
71
+ "zod": "^4.3.6"
50
72
  },
51
73
  "devDependencies": {
52
74
  "@total-typescript/ts-reset": "^0.6.1",
53
75
  "@types/babel__generator": "^7.27.0",
76
+ "@types/babel__helper-validator-identifier": "^7.15.2",
54
77
  "@types/babel__traverse": "^7.28.0",
55
- "@types/node": "^25.0.9",
56
- "@vitest/coverage-v8": "^4.0.17",
78
+ "@types/node": "^25.0.10",
79
+ "@vitest/coverage-v8": "^4.0.18",
57
80
  "eslint": "^9.39.2",
58
81
  "eslint-config-axkit": "^1.1.0",
59
82
  "fta-check": "^1.5.1",
@@ -62,23 +85,6 @@
62
85
  "prettier": "3.8.0",
63
86
  "semantic-release": "^25.0.2",
64
87
  "typescript": "^5.9.3",
65
- "vitest": "^4.0.17"
66
- },
67
- "scripts": {
68
- "build": "tsc -p tsconfig.app.json",
69
- "clean": "rm -rf dist *.tsbuildinfo",
70
- "format": "prettier --write .",
71
- "format:check": "prettier --check .",
72
- "fta": "fta-check",
73
- "knip": "knip",
74
- "lint": "eslint",
75
- "rebuild": "pnpm run clean && pnpm run build",
76
- "miniread": "pnpm -s run rebuild && node bin/miniread",
77
- "test": "vitest run",
78
- "test:coverage": "vitest run --coverage",
79
- "test:watch": "vitest",
80
- "miniread-evaluate": "pnpm -s run rebuild && node bin/miniread-evaluate",
81
- "miniread-sample": "pnpm -s run rebuild && node bin/miniread-sample",
82
- "typecheck": "tsc -b --noEmit"
88
+ "vitest": "^4.0.18"
83
89
  }
84
- }
90
+ }
@@ -1,70 +1,150 @@
1
1
  {
2
2
  "transforms": [
3
- {
4
- "id": "add-prefix",
5
- "description": "Adds 'renamed_' prefix to variable and function declarations",
6
- "iteration": 0,
7
- "scope": "file",
8
- "parallelizable": true,
9
- "diffReductionImpact": 0,
10
- "enabledByDefault": false,
11
- "notes": "Example transform for testing infrastructure"
12
- },
13
- {
14
- "id": "add-suffix",
15
- "description": "Adds '_end' suffix to variable and function declarations",
16
- "iteration": 0,
17
- "scope": "file",
18
- "parallelizable": true,
19
- "diffReductionImpact": 0,
20
- "enabledByDefault": false,
21
- "notes": "Example transform for testing infrastructure"
22
- },
23
3
  {
24
4
  "id": "expand-boolean-literals",
25
5
  "description": "Expands !0 to true and !1 to false",
26
- "iteration": 1,
27
6
  "scope": "file",
28
7
  "parallelizable": true,
29
8
  "diffReductionImpact": 0,
30
- "enabledByDefault": true,
9
+ "recommended": true,
10
+ "evaluatedAt": "2026-01-21T15:01:23.708Z",
31
11
  "notes": "Improves readability but does not reduce diffs (boolean literals are already deterministic)"
32
12
  },
33
13
  {
34
14
  "id": "expand-undefined-literals",
35
15
  "description": "Expands void 0 to undefined (when undefined is not shadowed)",
36
- "iteration": 2,
37
16
  "scope": "file",
38
17
  "parallelizable": true,
39
18
  "diffReductionImpact": 0,
40
- "enabledByDefault": true,
19
+ "recommended": true,
20
+ "evaluatedAt": "2026-01-21T16:27:42.316Z",
41
21
  "notes": "Auto-added by evaluation script."
42
22
  },
43
23
  {
44
24
  "id": "rename-loop-index-variables",
45
25
  "description": "Renames numeric for-loop counters to index/index2/... based on nesting depth",
46
- "iteration": 3,
47
26
  "scope": "file",
48
27
  "parallelizable": true,
49
28
  "diffReductionImpact": 0,
50
- "enabledByDefault": true,
29
+ "recommended": true,
30
+ "evaluatedAt": "2026-01-21T21:06:19.512Z",
51
31
  "notes": "Auto-added by evaluation script."
52
32
  },
53
33
  {
54
34
  "id": "rename-catch-parameters",
55
35
  "description": "Renames minified catch clause parameters to caughtError/caughtError2/...",
56
- "iteration": 4,
36
+ "scope": "file",
37
+ "parallelizable": true,
38
+ "diffReductionImpact": 0.0007738623280043599,
39
+ "recommended": true,
40
+ "evaluatedAt": "2026-01-23T07:48:59.087Z",
41
+ "notes": "Auto-added by evaluation script."
42
+ },
43
+ {
44
+ "id": "rename-destructured-aliases",
45
+ "description": "Renames destructuring aliases to match property names (e.g., { foo: x } → { foo })",
46
+ "scope": "file",
47
+ "parallelizable": true,
48
+ "diffReductionImpact": 0.000943734546346775,
49
+ "recommended": true,
50
+ "evaluatedAt": "2026-01-22T12:49:10.952Z",
51
+ "notes": "Auto-added by evaluation script. Measured with baseline none: 0.09%."
52
+ },
53
+ {
54
+ "id": "expand-return-sequence",
55
+ "description": "Expands return sequences like `return a(), b();`",
56
+ "scope": "file",
57
+ "parallelizable": true,
58
+ "diffReductionImpact": -0.0012834789830316051,
59
+ "recommended": false,
60
+ "evaluatedAt": "2026-01-22T15:19:04.615Z",
61
+ "notes": "Auto-added by evaluation script. Measured with baseline none: -0.13%. Superseded by expand-sequence-expressions-v2 in the recommended preset."
62
+ },
63
+ {
64
+ "id": "expand-sequence-expressions",
65
+ "description": "Expands comma operator sequences in statements and variable initializers",
66
+ "scope": "file",
67
+ "parallelizable": true,
68
+ "diffReductionImpact": -0.01282535248485317,
69
+ "recommended": false,
70
+ "evaluatedAt": "2026-01-22T17:15:48.528Z",
71
+ "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."
72
+ },
73
+ {
74
+ "id": "expand-sequence-expressions-v2",
75
+ "description": "Expands comma operator sequences in returns, statements, and variable initializers",
76
+ "scope": "file",
77
+ "parallelizable": true,
78
+ "diffReductionImpact": -0.014316453068081048,
79
+ "recommended": false,
80
+ "evaluatedAt": "2026-01-22T18:22:48.609Z",
81
+ "notes": "Superseded by expand-sequence-expressions-v3."
82
+ },
83
+ {
84
+ "id": "expand-sequence-expressions-v3",
85
+ "description": "Expands comma operator sequences in returns, throws, statements, and variable initializers",
86
+ "scope": "file",
87
+ "parallelizable": true,
88
+ "diffReductionImpact": -0.014391951831788763,
89
+ "recommended": true,
90
+ "evaluatedAt": "2026-01-23T08:21:23.662Z",
91
+ "notes": "Supersedes expand-sequence-expressions-v2 in the recommended preset. Measured with baseline none: -1.44%. Enabled for readability even when line diffs increase."
92
+ },
93
+ {
94
+ "id": "rename-use-reference-guards",
95
+ "description": "Renames boolean useRef(false) guard variables to hasRunRef/hasRunRef2/...",
57
96
  "scope": "file",
58
97
  "parallelizable": true,
59
98
  "diffReductionImpact": 0,
60
- "enabledByDefault": true,
99
+ "recommended": true,
100
+ "evaluatedAt": "2026-01-22T17:03:19.826Z",
101
+ "notes": "Auto-added by evaluation script."
102
+ },
103
+ {
104
+ "id": "rename-timeout-ids",
105
+ "description": "Renames setTimeout handle variables to timeoutId/timeoutId2/... when usage is only clearTimeout(...)",
106
+ "scope": "file",
107
+ "parallelizable": true,
108
+ "diffReductionImpact": 0.00003774938185385768,
109
+ "recommended": false,
110
+ "evaluatedAt": "2026-01-23T10:29:23.279Z",
111
+ "notes": "Measured with baseline none: 0.00%. Not enabled by default (readability-only)."
112
+ },
113
+ {
114
+ "id": "split-variable-declarations",
115
+ "description": "Splits multi-declarator variable declarations into separate statements",
116
+ "scope": "file",
117
+ "parallelizable": true,
118
+ "diffReductionImpact": -0.0027651422207961573,
119
+ "recommended": true,
120
+ "evaluatedAt": "2026-01-23T05:45:27.981Z",
121
+ "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."
122
+ },
123
+ {
124
+ "id": "expand-throw-sequence",
125
+ "description": "Expands throw sequences like `throw (a(), b)`",
126
+ "scope": "file",
127
+ "parallelizable": true,
128
+ "diffReductionImpact": -0.00007549876370771536,
129
+ "recommended": false,
130
+ "evaluatedAt": "2026-01-23T07:48:29.356Z",
131
+ "notes": "Largely superseded by expand-sequence-expressions-v3 (which also expands throw sequences), but kept for isolated runs and comparison."
132
+ },
133
+ {
134
+ "id": "rename-promise-executor-parameters",
135
+ "description": "Renames promise-like executor parameters in `new X(executor)` to resolve/reject when usage is high-confidence",
136
+ "scope": "file",
137
+ "parallelizable": true,
138
+ "diffReductionImpact": 0,
139
+ "recommended": true,
140
+ "evaluatedAt": "2026-01-22T21:39:53.578Z",
61
141
  "notes": "Auto-added by evaluation script."
62
142
  }
63
143
  ],
64
144
  "presetStats": {
65
145
  "recommended": {
66
- "diffReductionImpact": 0,
67
- "notes": "Auto-updated by evaluation when running with baseline none and the recommended preset."
146
+ "diffReductionImpact": 0.00560578320530003,
147
+ "notes": "Measured with baseline none: 0.56%."
68
148
  }
69
149
  }
70
150
  }
@@ -1,2 +0,0 @@
1
- import type { Transform } from "../../core/types.js";
2
- export declare const addPrefixTransform: Transform;