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.
- package/dist/transforms/_generated/manifest.js +5 -0
- package/dist/transforms/_generated/registry.js +2 -0
- package/dist/transforms/recommended-transform-order.d.ts +1 -1
- package/dist/transforms/recommended-transform-order.js +1 -0
- package/dist/transforms/rename-add-event-listener-parameters/has-event-handler-usage.d.ts +2 -0
- package/dist/transforms/rename-add-event-listener-parameters/has-event-handler-usage.js +42 -0
- package/dist/transforms/rename-add-event-listener-parameters/has-event-name-comparison.d.ts +2 -0
- package/dist/transforms/rename-add-event-listener-parameters/has-event-name-comparison.js +21 -0
- package/dist/transforms/rename-add-event-listener-parameters/is-add-event-listener-key.d.ts +3 -0
- package/dist/transforms/rename-add-event-listener-parameters/is-add-event-listener-key.js +8 -0
- package/dist/transforms/rename-add-event-listener-parameters/manifest.json +12 -0
- package/dist/transforms/rename-add-event-listener-parameters/rename-add-event-listener-parameters-transform.d.ts +2 -0
- package/dist/transforms/rename-add-event-listener-parameters/rename-add-event-listener-parameters-transform.js +91 -0
- package/package.json +1 -1
|
@@ -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,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,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,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,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.
|
|
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",
|