miniread 1.86.0 → 1.87.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.
@@ -268,6 +268,10 @@ const manifestData = {
268
268
  notes: "Supersedes rename-promise-executor-parameters with improved error-handler detection. Intentionally self-contained (helpers duplicated) per docs/workflow.md §3.6.",
269
269
  evaluations: { "legacy:evaluation": { "diffSizePercent": 100, "evaluatedAt": "2026-01-25T21:22:01.643Z", "changedLines": 1086, "durationSeconds": 0, "stableNames": 0 }, "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 99.99622028196697, "evaluatedAt": "2026-01-29T14:37:20.798Z", "changedLines": 1102, "durationSeconds": 50.116025500000006, "stableNames": 1359 } },
270
270
  },
271
+ "rename-queue-traversal-variables": {
272
+ recommended: true,
273
+ evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-02-06T21:04:31.256Z", "changedLines": 38, "durationSeconds": 223.94200929, "stableNames": 1359 } },
274
+ },
271
275
  "rename-range-parameters": {
272
276
  recommended: true,
273
277
  notes: "Renames range-style parameters when the count defaults to the start value and start resets to 0.",
@@ -505,6 +509,7 @@ export const recommendedTransformIds = [
505
509
  "rename-interval-ids",
506
510
  "rename-indexeddb-request-variables",
507
511
  "rename-loop-index-variables-v3",
512
+ "rename-queue-traversal-variables",
508
513
  "rename-loop-length-variables",
509
514
  "rename-document-fragment-variables",
510
515
  "rename-object-keys-variables",
@@ -55,6 +55,7 @@ import { renameProcessStdoutHandlersTransform } from "../rename-process-stdout-h
55
55
  import { renamePromiseCatchParametersTransform } from "../rename-promise-catch-parameters/rename-promise-catch-parameters-transform.js";
56
56
  import { renamePromiseExecutorParametersTransform } from "../rename-promise-executor-parameters/rename-promise-executor-parameters-transform.js";
57
57
  import { renamePromiseExecutorParametersV2Transform } from "../rename-promise-executor-parameters-v2/rename-promise-executor-parameters-v2-transform.js";
58
+ import { renameQueueTraversalVariablesTransform } from "../rename-queue-traversal-variables/rename-queue-traversal-variables-transform.js";
58
59
  import { renameRangeParametersTransform } from "../rename-range-parameters/rename-range-parameters-transform.js";
59
60
  import { renameReadFileLinesTransform } from "../rename-read-file-lines/rename-read-file-lines-transform.js";
60
61
  import { renameRegexBuildersTransform } from "../rename-regex-builders/rename-regex-builders-transform.js";
@@ -148,6 +149,7 @@ export const transformRegistry = {
148
149
  [renamePromiseCatchParametersTransform.id]: renamePromiseCatchParametersTransform,
149
150
  [renamePromiseExecutorParametersTransform.id]: renamePromiseExecutorParametersTransform,
150
151
  [renamePromiseExecutorParametersV2Transform.id]: renamePromiseExecutorParametersV2Transform,
152
+ [renameQueueTraversalVariablesTransform.id]: renameQueueTraversalVariablesTransform,
151
153
  [renameRangeParametersTransform.id]: renameRangeParametersTransform,
152
154
  [renameReadFileLinesTransform.id]: renameReadFileLinesTransform,
153
155
  [renameRegexBuildersTransform.id]: renameRegexBuildersTransform,
@@ -4,4 +4,4 @@
4
4
  * This lets us tune transform interactions intentionally instead of relying on
5
5
  * alphabetical ID sorting.
6
6
  */
7
- export declare const recommendedTransformOrder: readonly ["stabilize-top-level-bindings", "stabilize-nested-bindings", "stabilize-deferred-top-level-bindings", "stabilize-deferred-stable-rhs", "expand-boolean-literals", "expand-sequence-expressions-v5", "expand-special-number-literals", "expand-typeof-undefined-comparisons", "expand-undefined-literals", "remove-redundant-else", "rename-arguments-length-flags", "rename-asap-wrappers", "rename-awaiter-parameters", "rename-awaiter-helper-functions", "rename-buffer-variables", "rename-to-buffer-results", "rename-catch-parameters", "rename-promise-catch-parameters", "rename-char-code-at", "rename-charcode-variables-v2", "rename-client-aliases", "rename-comparison-flags", "rename-platform-win32-flags", "rename-date-now-start-times", "rename-default-options-parameters-v2", "rename-default-options-parameters-v3", "rename-deferred-resolve-parameters", "rename-deferred-resolve-parameters-v2", "rename-destructured-aliases", "rename-rest-parameters", "rename-rest-pop-callbacks", "rename-execfile-arguments", "rename-file-reader-variables", "rename-error-first-callback-parameters", "rename-error-first-callback-parameters-v2", "rename-error-variables", "rename-event-parameters", "rename-add-event-listener-parameters", "rename-http-server-parameters", "rename-fs-sync-variables", "rename-http-method-parameters", "rename-interval-ids", "rename-indexeddb-request-variables", "rename-loop-index-variables-v3", "rename-loop-length-variables", "rename-document-fragment-variables", "rename-object-keys-variables", "rename-object-keys-iterator-variables", "rename-object-keys-reducer-parameters", "rename-object-entries-parameters", "rename-parameters-to-match-properties-v2", "rename-invalid-parameter-arguments", "rename-promise-executor-parameters-v2", "rename-range-parameters", "rename-read-file-lines", "rename-regex-builders", "rename-regex-source-parameters", "rename-search-parameters-variables", "rename-setstate-updater-parameters", "rename-file-extension-variables", "rename-string-split-variables", "rename-this-aliases", "rename-timeout-promises", "rename-timeout-ids", "rename-typeof-variables", "rename-typescript-helper-aliases", "rename-uint8array-concat-variables", "rename-url-parameters", "rename-url-variables", "rename-use-reference-guards-v2", "rename-use-reference-sets", "rename-worker-handles", "rename-zod-check-parameters", "simplify-boolean-negations", "simplify-string-trim", "split-variable-declarations", "use-optional-chaining", "use-object-property-shorthand", "use-object-shorthand", "replace-dynamic-require-eval"];
7
+ export declare const recommendedTransformOrder: readonly ["stabilize-top-level-bindings", "stabilize-nested-bindings", "stabilize-deferred-top-level-bindings", "stabilize-deferred-stable-rhs", "expand-boolean-literals", "expand-sequence-expressions-v5", "expand-special-number-literals", "expand-typeof-undefined-comparisons", "expand-undefined-literals", "remove-redundant-else", "rename-arguments-length-flags", "rename-asap-wrappers", "rename-awaiter-parameters", "rename-awaiter-helper-functions", "rename-buffer-variables", "rename-to-buffer-results", "rename-catch-parameters", "rename-promise-catch-parameters", "rename-char-code-at", "rename-charcode-variables-v2", "rename-client-aliases", "rename-comparison-flags", "rename-platform-win32-flags", "rename-date-now-start-times", "rename-default-options-parameters-v2", "rename-default-options-parameters-v3", "rename-deferred-resolve-parameters", "rename-deferred-resolve-parameters-v2", "rename-destructured-aliases", "rename-rest-parameters", "rename-rest-pop-callbacks", "rename-execfile-arguments", "rename-file-reader-variables", "rename-error-first-callback-parameters", "rename-error-first-callback-parameters-v2", "rename-error-variables", "rename-event-parameters", "rename-add-event-listener-parameters", "rename-http-server-parameters", "rename-fs-sync-variables", "rename-http-method-parameters", "rename-interval-ids", "rename-indexeddb-request-variables", "rename-loop-index-variables-v3", "rename-queue-traversal-variables", "rename-loop-length-variables", "rename-document-fragment-variables", "rename-object-keys-variables", "rename-object-keys-iterator-variables", "rename-object-keys-reducer-parameters", "rename-object-entries-parameters", "rename-parameters-to-match-properties-v2", "rename-invalid-parameter-arguments", "rename-promise-executor-parameters-v2", "rename-range-parameters", "rename-read-file-lines", "rename-regex-builders", "rename-regex-source-parameters", "rename-search-parameters-variables", "rename-setstate-updater-parameters", "rename-file-extension-variables", "rename-string-split-variables", "rename-this-aliases", "rename-timeout-promises", "rename-timeout-ids", "rename-typeof-variables", "rename-typescript-helper-aliases", "rename-uint8array-concat-variables", "rename-url-parameters", "rename-url-variables", "rename-use-reference-guards-v2", "rename-use-reference-sets", "rename-worker-handles", "rename-zod-check-parameters", "simplify-boolean-negations", "simplify-string-trim", "split-variable-declarations", "use-optional-chaining", "use-object-property-shorthand", "use-object-shorthand", "replace-dynamic-require-eval"];
@@ -61,6 +61,7 @@ export const recommendedTransformOrder = [
61
61
  "rename-interval-ids",
62
62
  "rename-indexeddb-request-variables",
63
63
  "rename-loop-index-variables-v3",
64
+ "rename-queue-traversal-variables",
64
65
  "rename-loop-length-variables",
65
66
  "rename-document-fragment-variables",
66
67
  "rename-object-keys-variables",
@@ -0,0 +1,12 @@
1
+ {
2
+ "recommended": true,
3
+ "evaluations": {
4
+ "claude-code-2.1.10:claude-code-2.1.11": {
5
+ "diffSizePercent": 100,
6
+ "evaluatedAt": "2026-02-06T21:04:31.256Z",
7
+ "changedLines": 38,
8
+ "durationSeconds": 223.94200929,
9
+ "stableNames": 1359
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,14 @@
1
+ import type { NodePath } from "@babel/traverse";
2
+ import type { ForStatement } from "@babel/types";
3
+ type QueueTraversalLoop = {
4
+ arrayName: string;
5
+ indexName: string;
6
+ };
7
+ type QueueTraversalUsage = {
8
+ hasIndexAccess: boolean;
9
+ hasQueuePush: boolean;
10
+ };
11
+ declare const getQueueTraversalLoop: (path: NodePath<ForStatement>) => QueueTraversalLoop | undefined;
12
+ declare const getQueueTraversalUsage: (path: NodePath<ForStatement>, arrayName: string, indexName: string) => QueueTraversalUsage;
13
+ declare const shouldSkipRename: (currentName: string, targetBaseName: string) => boolean;
14
+ export { getQueueTraversalLoop, getQueueTraversalUsage, shouldSkipRename };
@@ -0,0 +1,131 @@
1
+ import { isStableRenamed } from "../../core/stable-naming.js";
2
+ const getQueueTraversalLoop = (path) => {
3
+ const init = path.node.init;
4
+ if (init?.type !== "VariableDeclaration")
5
+ return undefined;
6
+ if (init.kind === "const")
7
+ return undefined;
8
+ if (init.declarations.length !== 1)
9
+ return undefined;
10
+ const declarator = init.declarations[0];
11
+ if (declarator?.id.type !== "Identifier")
12
+ return undefined;
13
+ if (declarator.init?.type !== "NumericLiteral")
14
+ return undefined;
15
+ if (declarator.init.value !== 0)
16
+ return undefined;
17
+ const indexName = declarator.id.name;
18
+ const test = path.node.test;
19
+ if (test?.type !== "BinaryExpression")
20
+ return undefined;
21
+ if (test.operator !== "<")
22
+ return undefined;
23
+ if (test.left.type !== "Identifier")
24
+ return undefined;
25
+ if (test.left.name !== indexName)
26
+ return undefined;
27
+ const right = test.right;
28
+ if (right.type !== "MemberExpression")
29
+ return undefined;
30
+ if (right.optional)
31
+ return undefined;
32
+ if (right.object.type !== "Identifier")
33
+ return undefined;
34
+ if (right.property.type !== "Identifier")
35
+ return undefined;
36
+ if (right.property.name !== "length")
37
+ return undefined;
38
+ if (right.computed)
39
+ return undefined;
40
+ if (path.node.update !== null)
41
+ return undefined;
42
+ return {
43
+ arrayName: right.object.name,
44
+ indexName,
45
+ };
46
+ };
47
+ const isQueueIndexAccess = (path, arrayName, indexName, arrayBinding, indexBinding) => {
48
+ const member = path.node;
49
+ if (member.optional)
50
+ return false;
51
+ if (member.object.type !== "Identifier")
52
+ return false;
53
+ if (member.object.name !== arrayName)
54
+ return false;
55
+ if (!hasExpectedBinding(path, arrayName, arrayBinding))
56
+ return false;
57
+ if (!member.computed)
58
+ return false;
59
+ if (member.property.type !== "UpdateExpression")
60
+ return false;
61
+ const update = member.property;
62
+ if (!isPostIncrement(update, indexName))
63
+ return false;
64
+ if (!hasExpectedBinding(path, indexName, indexBinding))
65
+ return false;
66
+ return true;
67
+ };
68
+ const isPostIncrement = (update, indexName) => {
69
+ if (update.operator !== "++")
70
+ return false;
71
+ if (update.prefix)
72
+ return false;
73
+ if (update.argument.type !== "Identifier")
74
+ return false;
75
+ return update.argument.name === indexName;
76
+ };
77
+ const isQueuePushCall = (path, arrayName, arrayBinding) => {
78
+ const call = path.node;
79
+ if (call.callee.type !== "MemberExpression")
80
+ return false;
81
+ if (call.callee.optional)
82
+ return false;
83
+ if (call.callee.object.type !== "Identifier")
84
+ return false;
85
+ if (call.callee.object.name !== arrayName)
86
+ return false;
87
+ if (!hasExpectedBinding(path, arrayName, arrayBinding))
88
+ return false;
89
+ if (call.callee.property.type !== "Identifier")
90
+ return false;
91
+ if (call.callee.property.name !== "push")
92
+ return false;
93
+ if (call.callee.computed)
94
+ return false;
95
+ return true;
96
+ };
97
+ const getQueueTraversalUsage = (path, arrayName, indexName) => {
98
+ const arrayBinding = path.scope.getBinding(arrayName);
99
+ const indexBinding = path.scope.getBinding(indexName);
100
+ let hasIndexAccess = false;
101
+ let hasQueuePush = false;
102
+ path.get("body").traverse({
103
+ Function(innerPath) {
104
+ innerPath.skip();
105
+ },
106
+ MemberExpression(memberPath) {
107
+ if (hasIndexAccess)
108
+ return;
109
+ if (isQueueIndexAccess(memberPath, arrayName, indexName, arrayBinding, indexBinding)) {
110
+ hasIndexAccess = true;
111
+ }
112
+ },
113
+ CallExpression(callPath) {
114
+ if (hasQueuePush)
115
+ return;
116
+ if (isQueuePushCall(callPath, arrayName, arrayBinding)) {
117
+ hasQueuePush = true;
118
+ }
119
+ },
120
+ });
121
+ return { hasIndexAccess, hasQueuePush };
122
+ };
123
+ const hasExpectedBinding = (path, name, expectedBinding) => path.scope.getBinding(name) === expectedBinding;
124
+ const shouldSkipRename = (currentName, targetBaseName) => {
125
+ if (isStableRenamed(currentName))
126
+ return true;
127
+ if (currentName === targetBaseName)
128
+ return true;
129
+ return false;
130
+ };
131
+ export { getQueueTraversalLoop, getQueueTraversalUsage, shouldSkipRename };
@@ -0,0 +1,2 @@
1
+ import { type Transform } from "../../core/types.js";
2
+ export declare const renameQueueTraversalVariablesTransform: Transform;
@@ -0,0 +1,58 @@
1
+ import { createRequire } from "node:module";
2
+ import { RenameGroup } from "../../core/stable-naming.js";
3
+ import { getFilesToProcess, } from "../../core/types.js";
4
+ import { getQueueTraversalLoop, getQueueTraversalUsage, shouldSkipRename, } from "./queue-traversal-heuristics.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 QUEUE_BASE_NAME = "queue";
9
+ const QUEUE_INDEX_BASE_NAME = "queueIndex";
10
+ export const renameQueueTraversalVariablesTransform = {
11
+ id: "rename-queue-traversal-variables",
12
+ description: "Renames array/index variables used for queue-style traversal loops to $queue/$queueIndex (or readable variants when multiple)",
13
+ scope: "file",
14
+ parallelizable: true,
15
+ transform(context) {
16
+ let nodesVisited = 0;
17
+ let transformationsApplied = 0;
18
+ for (const fileInfo of getFilesToProcess(context)) {
19
+ const queueGroup = new RenameGroup();
20
+ const queueIndexGroup = new RenameGroup();
21
+ traverse(fileInfo.ast, {
22
+ ForStatement(path) {
23
+ nodesVisited++;
24
+ const loopInfo = getQueueTraversalLoop(path);
25
+ if (!loopInfo)
26
+ return;
27
+ const { arrayName, indexName } = loopInfo;
28
+ const queueUsage = getQueueTraversalUsage(path, arrayName, indexName);
29
+ if (!queueUsage.hasIndexAccess || !queueUsage.hasQueuePush)
30
+ return;
31
+ const arrayBinding = path.scope.getBinding(arrayName);
32
+ const indexBinding = path.scope.getBinding(indexName);
33
+ if (arrayBinding && !shouldSkipRename(arrayName, QUEUE_BASE_NAME)) {
34
+ queueGroup.add({
35
+ scope: arrayBinding.scope,
36
+ currentName: arrayName,
37
+ baseName: QUEUE_BASE_NAME,
38
+ });
39
+ }
40
+ if (indexBinding &&
41
+ !shouldSkipRename(indexName, QUEUE_INDEX_BASE_NAME)) {
42
+ queueIndexGroup.add({
43
+ scope: indexBinding.scope,
44
+ currentName: indexName,
45
+ baseName: QUEUE_INDEX_BASE_NAME,
46
+ });
47
+ }
48
+ },
49
+ });
50
+ transformationsApplied += queueGroup.apply();
51
+ transformationsApplied += queueIndexGroup.apply();
52
+ }
53
+ return Promise.resolve({
54
+ nodesVisited,
55
+ transformationsApplied,
56
+ });
57
+ },
58
+ };
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.86.0",
5
+ "version": "1.87.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",