miniread 1.82.0 → 1.83.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.
@@ -38,6 +38,10 @@ const manifestData = {
38
38
  notes: "Added manually; improves readability by reducing nesting.",
39
39
  evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-01-25T23:01:41.815Z", "changedLines": 5208, "durationSeconds": 58.302647375, "stableNames": 1357 } },
40
40
  },
41
+ "rename-add-event-listener-parameters": {
42
+ recommended: true,
43
+ evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-02-06T17:38:36.844Z", "changedLines": 8, "durationSeconds": 179.627881234, "stableNames": 1359 } },
44
+ },
41
45
  "rename-arguments-length-flags": {
42
46
  recommended: true,
43
47
  notes: "Measured with baseline none: 0.00%. Added to recommended for readability.",
@@ -475,6 +479,7 @@ export const recommendedTransformIds = [
475
479
  "rename-error-first-callback-parameters-v2",
476
480
  "rename-error-variables",
477
481
  "rename-event-parameters",
482
+ "rename-add-event-listener-parameters",
478
483
  "rename-http-server-parameters",
479
484
  "rename-fs-sync-variables",
480
485
  "rename-http-method-parameters",
@@ -7,6 +7,7 @@ import { expandSpecialNumberLiteralsTransform } from "../expand-special-number-l
7
7
  import { expandTypeofUndefinedComparisonsTransform } from "../expand-typeof-undefined-comparisons/expand-typeof-undefined-comparisons-transform.js";
8
8
  import { expandUndefinedLiteralsTransform } from "../expand-undefined-literals/expand-undefined-literals-transform.js";
9
9
  import { removeRedundantElseTransform } from "../remove-redundant-else/remove-redundant-else-transform.js";
10
+ import { renameAddEventListenerParametersTransform } from "../rename-add-event-listener-parameters/rename-add-event-listener-parameters-transform.js";
10
11
  import { renameArgumentsLengthFlagsTransform } from "../rename-arguments-length-flags/rename-arguments-length-flags-transform.js";
11
12
  import { renameAsapWrappersTransform } from "../rename-asap-wrappers/rename-asap-wrappers-transform.js";
12
13
  import { renameAwaiterHelperFunctionsTransform } from "../rename-awaiter-helper-functions/rename-awaiter-helper-functions-transform.js";
@@ -95,6 +96,7 @@ export const transformRegistry = {
95
96
  [expandTypeofUndefinedComparisonsTransform.id]: expandTypeofUndefinedComparisonsTransform,
96
97
  [expandUndefinedLiteralsTransform.id]: expandUndefinedLiteralsTransform,
97
98
  [removeRedundantElseTransform.id]: removeRedundantElseTransform,
99
+ [renameAddEventListenerParametersTransform.id]: renameAddEventListenerParametersTransform,
98
100
  [renameArgumentsLengthFlagsTransform.id]: renameArgumentsLengthFlagsTransform,
99
101
  [renameAsapWrappersTransform.id]: renameAsapWrappersTransform,
100
102
  [renameAwaiterHelperFunctionsTransform.id]: renameAwaiterHelperFunctionsTransform,
@@ -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-date-now-start-times", "rename-default-options-parameters-v2", "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-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-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-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-date-now-start-times", "rename-default-options-parameters-v2", "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-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-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"];
@@ -49,6 +49,7 @@ export const recommendedTransformOrder = [
49
49
  "rename-error-first-callback-parameters-v2",
50
50
  "rename-error-variables",
51
51
  "rename-event-parameters",
52
+ "rename-add-event-listener-parameters",
52
53
  "rename-http-server-parameters",
53
54
  // Runs after stabilize-top-level-bindings: in the recommended preset, top-level `fs` bindings
54
55
  // are already stable-hashed. This transform gives remaining non-stable `fs` helpers stable
@@ -0,0 +1,2 @@
1
+ import type { Binding } from "@babel/traverse";
2
+ export declare const hasEventHandlerUsage: (binding: Binding) => boolean;
@@ -0,0 +1,42 @@
1
+ const isHandleEventAccess = (node) => {
2
+ if (!node.computed && node.property.type === "Identifier") {
3
+ return node.property.name === "handleEvent";
4
+ }
5
+ if (node.computed && node.property.type === "StringLiteral") {
6
+ return node.property.value === "handleEvent";
7
+ }
8
+ return false;
9
+ };
10
+ const isWriteSideHandleEventAccess = (memberPath) => {
11
+ const parent = memberPath.parentPath;
12
+ if (parent.isAssignmentExpression()) {
13
+ return parent.node.left === memberPath.node;
14
+ }
15
+ if (parent.isUpdateExpression()) {
16
+ return parent.node.argument === memberPath.node;
17
+ }
18
+ return false;
19
+ };
20
+ export const hasEventHandlerUsage = (binding) => {
21
+ return binding.referencePaths.some((referencePath) => {
22
+ const parent = referencePath.parentPath;
23
+ if (!parent)
24
+ return false;
25
+ if ((parent.isCallExpression() || parent.isOptionalCallExpression()) &&
26
+ referencePath.key === "callee")
27
+ return true;
28
+ if ((parent.isMemberExpression() || parent.isOptionalMemberExpression()) &&
29
+ referencePath.key === "object") {
30
+ if (isWriteSideHandleEventAccess(parent))
31
+ return false;
32
+ const property = parent.node.property;
33
+ if (property.type !== "Identifier" && property.type !== "StringLiteral")
34
+ return false;
35
+ return isHandleEventAccess({
36
+ property,
37
+ computed: parent.node.computed,
38
+ });
39
+ }
40
+ return false;
41
+ });
42
+ };
@@ -0,0 +1,2 @@
1
+ import type { Binding } from "@babel/traverse";
2
+ export declare const hasEventNameComparison: (binding: Binding) => boolean;
@@ -0,0 +1,21 @@
1
+ export const hasEventNameComparison = (binding) => {
2
+ return binding.referencePaths.some((referencePath) => {
3
+ const parent = referencePath.parentPath;
4
+ if (!parent)
5
+ return false;
6
+ if (parent.isBinaryExpression()) {
7
+ const { left, right, operator } = parent.node;
8
+ if (operator !== "===" && operator !== "==")
9
+ return false;
10
+ if (left === referencePath.node)
11
+ return right.type === "StringLiteral";
12
+ if (right === referencePath.node)
13
+ return left.type === "StringLiteral";
14
+ return false;
15
+ }
16
+ if (parent.isSwitchStatement() && referencePath.key === "discriminant") {
17
+ return parent.node.cases.some((caseClause) => caseClause.test?.type === "StringLiteral");
18
+ }
19
+ return false;
20
+ });
21
+ };
@@ -0,0 +1,3 @@
1
+ import type { NodePath } from "@babel/traverse";
2
+ import type { ObjectMethod, ObjectProperty } from "@babel/types";
3
+ export declare const isAddEventListenerKey: (path: NodePath<ObjectMethod | ObjectProperty>) => boolean;
@@ -0,0 +1,8 @@
1
+ export const isAddEventListenerKey = (path) => {
2
+ const { key, computed } = path.node;
3
+ if (key.type === "Identifier")
4
+ return !computed && key.name === "addEventListener";
5
+ if (key.type === "StringLiteral")
6
+ return key.value === "addEventListener";
7
+ return false;
8
+ };
@@ -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-06T17:38:36.844Z",
7
+ "changedLines": 8,
8
+ "durationSeconds": 179.627881234,
9
+ "stableNames": 1359
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,2 @@
1
+ import { type Transform } from "../../core/types.js";
2
+ export declare const renameAddEventListenerParametersTransform: Transform;
@@ -0,0 +1,91 @@
1
+ import { createRequire } from "node:module";
2
+ import { RenameGroup, isStableRenamed } from "../../core/stable-naming.js";
3
+ import { getFilesToProcess, } from "../../core/types.js";
4
+ import { hasEventHandlerUsage } from "./has-event-handler-usage.js";
5
+ import { hasEventNameComparison } from "./has-event-name-comparison.js";
6
+ import { isAddEventListenerKey } from "./is-add-event-listener-key.js";
7
+ const require = createRequire(import.meta.url);
8
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
9
+ const traverse = require("@babel/traverse").default;
10
+ const EVENT_NAME_BASE = "eventName";
11
+ const EVENT_HANDLER_BASE = "eventHandler";
12
+ const collectAddEventListenerRename = (path, group) => {
13
+ if (path.node.params.length !== 2)
14
+ return;
15
+ const [eventNameParameter, handlerParameter] = path.node.params;
16
+ if (eventNameParameter?.type !== "Identifier")
17
+ return;
18
+ if (handlerParameter?.type !== "Identifier")
19
+ return;
20
+ const eventName = eventNameParameter.name;
21
+ const handlerName = handlerParameter.name;
22
+ if (eventName === handlerName)
23
+ return;
24
+ const shouldRenameEventName = !isStableRenamed(eventName);
25
+ const shouldRenameHandlerName = !isStableRenamed(handlerName);
26
+ if (!shouldRenameEventName && !shouldRenameHandlerName)
27
+ return;
28
+ const eventBinding = path.scope.getBinding(eventName);
29
+ if (!eventBinding)
30
+ return;
31
+ if (!eventBinding.constant)
32
+ return;
33
+ const handlerBinding = path.scope.getBinding(handlerName);
34
+ if (!handlerBinding)
35
+ return;
36
+ if (!handlerBinding.constant)
37
+ return;
38
+ if (!hasEventNameComparison(eventBinding))
39
+ return;
40
+ if (!hasEventHandlerUsage(handlerBinding))
41
+ return;
42
+ if (shouldRenameEventName) {
43
+ group.add({
44
+ scope: path.scope,
45
+ currentName: eventName,
46
+ baseName: EVENT_NAME_BASE,
47
+ });
48
+ }
49
+ if (shouldRenameHandlerName) {
50
+ group.add({
51
+ scope: path.scope,
52
+ currentName: handlerName,
53
+ baseName: EVENT_HANDLER_BASE,
54
+ });
55
+ }
56
+ };
57
+ export const renameAddEventListenerParametersTransform = {
58
+ id: "rename-add-event-listener-parameters",
59
+ description: "Renames addEventListener parameters to eventName/eventHandler when usage is high-confidence",
60
+ scope: "file",
61
+ parallelizable: true,
62
+ transform(context) {
63
+ let nodesVisited = 0;
64
+ let transformationsApplied = 0;
65
+ for (const fileInfo of getFilesToProcess(context)) {
66
+ const group = new RenameGroup();
67
+ traverse(fileInfo.ast, {
68
+ ObjectMethod(path) {
69
+ nodesVisited++;
70
+ if (!isAddEventListenerKey(path))
71
+ return;
72
+ collectAddEventListenerRename(path, group);
73
+ },
74
+ ObjectProperty(path) {
75
+ nodesVisited++;
76
+ if (!isAddEventListenerKey(path))
77
+ return;
78
+ const valuePath = path.get("value");
79
+ if (valuePath.isFunctionExpression()) {
80
+ collectAddEventListenerRename(valuePath, group);
81
+ }
82
+ else if (valuePath.isArrowFunctionExpression()) {
83
+ collectAddEventListenerRename(valuePath, group);
84
+ }
85
+ },
86
+ });
87
+ transformationsApplied += group.apply();
88
+ }
89
+ return Promise.resolve({ nodesVisited, transformationsApplied });
90
+ },
91
+ };
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.82.0",
5
+ "version": "1.83.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",