miniread 1.80.0 → 1.81.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-object-keys-reducer-parameters/manifest.json +12 -0
- package/dist/transforms/rename-object-keys-reducer-parameters/rename-object-keys-reducer-parameters-transform.d.ts +2 -0
- package/dist/transforms/rename-object-keys-reducer-parameters/rename-object-keys-reducer-parameters-transform.js +136 -0
- package/package.json +1 -1
|
@@ -207,6 +207,10 @@ const manifestData = {
|
|
|
207
207
|
recommended: true,
|
|
208
208
|
evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-02-04T12:47:49.357Z", "changedLines": 606, "durationSeconds": 152.335242224, "stableNames": 1359 } },
|
|
209
209
|
},
|
|
210
|
+
"rename-object-keys-reducer-parameters": {
|
|
211
|
+
recommended: true,
|
|
212
|
+
evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-02-06T14:50:58.548Z", "changedLines": 208, "durationSeconds": 170.10544662, "stableNames": 1358 } },
|
|
213
|
+
},
|
|
210
214
|
"rename-object-keys-variables": {
|
|
211
215
|
recommended: true,
|
|
212
216
|
notes: "Measured with baseline none: 0.01%. Added to recommended for readability.",
|
|
@@ -475,6 +479,7 @@ export const recommendedTransformIds = [
|
|
|
475
479
|
"rename-document-fragment-variables",
|
|
476
480
|
"rename-object-keys-variables",
|
|
477
481
|
"rename-object-keys-iterator-variables",
|
|
482
|
+
"rename-object-keys-reducer-parameters",
|
|
478
483
|
"rename-parameters-to-match-properties-v2",
|
|
479
484
|
"rename-invalid-parameter-arguments",
|
|
480
485
|
"rename-promise-executor-parameters-v2",
|
|
@@ -42,6 +42,7 @@ import { renameLoopIndexVariablesV2Transform } from "../rename-loop-index-variab
|
|
|
42
42
|
import { renameLoopIndexVariablesV3Transform } from "../rename-loop-index-variables-v3/rename-loop-index-variables-v3-transform.js";
|
|
43
43
|
import { renameLoopLengthVariablesTransform } from "../rename-loop-length-variables/rename-loop-length-variables-transform.js";
|
|
44
44
|
import { renameObjectKeysIteratorVariablesTransform } from "../rename-object-keys-iterator-variables/rename-object-keys-iterator-variables-transform.js";
|
|
45
|
+
import { renameObjectKeysReducerParametersTransform } from "../rename-object-keys-reducer-parameters/rename-object-keys-reducer-parameters-transform.js";
|
|
45
46
|
import { renameObjectKeysVariablesTransform } from "../rename-object-keys-variables/rename-object-keys-variables-transform.js";
|
|
46
47
|
import { renameParametersToMatchPropertiesTransform } from "../rename-parameters-to-match-properties/rename-parameters-to-match-properties-transform.js";
|
|
47
48
|
import { renameParametersToMatchPropertiesV2Transform } from "../rename-parameters-to-match-properties-v2/rename-parameters-to-match-properties-v2-transform.js";
|
|
@@ -128,6 +129,7 @@ export const transformRegistry = {
|
|
|
128
129
|
[renameLoopIndexVariablesV3Transform.id]: renameLoopIndexVariablesV3Transform,
|
|
129
130
|
[renameLoopLengthVariablesTransform.id]: renameLoopLengthVariablesTransform,
|
|
130
131
|
[renameObjectKeysIteratorVariablesTransform.id]: renameObjectKeysIteratorVariablesTransform,
|
|
132
|
+
[renameObjectKeysReducerParametersTransform.id]: renameObjectKeysReducerParametersTransform,
|
|
131
133
|
[renameObjectKeysVariablesTransform.id]: renameObjectKeysVariablesTransform,
|
|
132
134
|
[renameParametersToMatchPropertiesTransform.id]: renameParametersToMatchPropertiesTransform,
|
|
133
135
|
[renameParametersToMatchPropertiesV2Transform.id]: renameParametersToMatchPropertiesV2Transform,
|
|
@@ -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-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-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-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"];
|
|
@@ -61,6 +61,7 @@ export const recommendedTransformOrder = [
|
|
|
61
61
|
"rename-document-fragment-variables",
|
|
62
62
|
"rename-object-keys-variables",
|
|
63
63
|
"rename-object-keys-iterator-variables",
|
|
64
|
+
"rename-object-keys-reducer-parameters",
|
|
64
65
|
"rename-parameters-to-match-properties-v2",
|
|
65
66
|
"rename-invalid-parameter-arguments",
|
|
66
67
|
"rename-promise-executor-parameters-v2",
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { isStableRenamed, RenameGroup } from "../../core/stable-naming.js";
|
|
3
|
+
import { getFilesToProcess, } from "../../core/types.js";
|
|
4
|
+
import * as t from "@babel/types";
|
|
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 KEY_BASE_NAME = "key";
|
|
9
|
+
const RESULT_BASE_NAME = "result";
|
|
10
|
+
const isObjectKeysCall = (node) => {
|
|
11
|
+
if (node.arguments.length === 0)
|
|
12
|
+
return false;
|
|
13
|
+
if (!t.isMemberExpression(node.callee))
|
|
14
|
+
return false;
|
|
15
|
+
if (!t.isIdentifier(node.callee.object))
|
|
16
|
+
return false;
|
|
17
|
+
if (node.callee.object.name !== "Object")
|
|
18
|
+
return false;
|
|
19
|
+
if (node.callee.computed) {
|
|
20
|
+
if (t.isStringLiteral(node.callee.property)) {
|
|
21
|
+
return node.callee.property.value === "keys";
|
|
22
|
+
}
|
|
23
|
+
if (t.isTemplateLiteral(node.callee.property) &&
|
|
24
|
+
node.callee.property.expressions.length === 0) {
|
|
25
|
+
const quasi = node.callee.property.quasis[0];
|
|
26
|
+
return quasi?.value.cooked === "keys";
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return (t.isIdentifier(node.callee.property) && node.callee.property.name === "keys");
|
|
31
|
+
};
|
|
32
|
+
const isReduceCallOnObjectKeys = (node) => {
|
|
33
|
+
if (!t.isMemberExpression(node.callee))
|
|
34
|
+
return false;
|
|
35
|
+
if (node.callee.computed) {
|
|
36
|
+
if (!t.isCallExpression(node.callee.object))
|
|
37
|
+
return false;
|
|
38
|
+
if (!isObjectKeysCall(node.callee.object))
|
|
39
|
+
return false;
|
|
40
|
+
if (t.isStringLiteral(node.callee.property)) {
|
|
41
|
+
return node.callee.property.value === "reduce";
|
|
42
|
+
}
|
|
43
|
+
if (t.isTemplateLiteral(node.callee.property) &&
|
|
44
|
+
node.callee.property.expressions.length === 0) {
|
|
45
|
+
const quasi = node.callee.property.quasis[0];
|
|
46
|
+
return quasi?.value.cooked === "reduce";
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
if (!t.isIdentifier(node.callee.property))
|
|
51
|
+
return false;
|
|
52
|
+
if (node.callee.property.name !== "reduce")
|
|
53
|
+
return false;
|
|
54
|
+
return (t.isCallExpression(node.callee.object) &&
|
|
55
|
+
isObjectKeysCall(node.callee.object));
|
|
56
|
+
};
|
|
57
|
+
const shouldSkipForInitialValue = (node, scope) => {
|
|
58
|
+
if (t.isSpreadElement(node) || t.isArgumentPlaceholder(node))
|
|
59
|
+
return true;
|
|
60
|
+
if (t.isIdentifier(node)) {
|
|
61
|
+
return node.name === "undefined" && !scope.hasBinding("undefined", true);
|
|
62
|
+
}
|
|
63
|
+
return t.isUnaryExpression(node) && node.operator === "void";
|
|
64
|
+
};
|
|
65
|
+
const getIdentifierParameter = (parameters, index) => {
|
|
66
|
+
const parameter = parameters[index];
|
|
67
|
+
if (!parameter)
|
|
68
|
+
return undefined;
|
|
69
|
+
if (!t.isIdentifier(parameter))
|
|
70
|
+
return undefined;
|
|
71
|
+
return parameter;
|
|
72
|
+
};
|
|
73
|
+
export const renameObjectKeysReducerParametersTransform = {
|
|
74
|
+
id: "rename-object-keys-reducer-parameters",
|
|
75
|
+
description: "Renames Object.keys(...).reduce accumulator/key parameters to stable $result/$key (or readable result/key/key2) when safe and reduce has an explicit non-undefined initial value",
|
|
76
|
+
scope: "file",
|
|
77
|
+
parallelizable: true,
|
|
78
|
+
transform(context) {
|
|
79
|
+
let nodesVisited = 0;
|
|
80
|
+
let transformationsApplied = 0;
|
|
81
|
+
for (const fileInfo of getFilesToProcess(context)) {
|
|
82
|
+
const group = new RenameGroup();
|
|
83
|
+
traverse(fileInfo.ast, {
|
|
84
|
+
CallExpression(path) {
|
|
85
|
+
nodesVisited++;
|
|
86
|
+
if (!isReduceCallOnObjectKeys(path.node))
|
|
87
|
+
return;
|
|
88
|
+
if (path.scope.getBinding("Object"))
|
|
89
|
+
return;
|
|
90
|
+
if (path.node.arguments.length < 2)
|
|
91
|
+
return;
|
|
92
|
+
const initialValue = path.node.arguments[1];
|
|
93
|
+
if (!initialValue)
|
|
94
|
+
return;
|
|
95
|
+
if (shouldSkipForInitialValue(initialValue, path.scope))
|
|
96
|
+
return;
|
|
97
|
+
const callbackPath = path.get("arguments.0");
|
|
98
|
+
if (!callbackPath.isFunctionExpression() &&
|
|
99
|
+
!callbackPath.isArrowFunctionExpression()) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const accumulatorParameter = getIdentifierParameter(callbackPath.node.params, 0);
|
|
103
|
+
const keyParameter = getIdentifierParameter(callbackPath.node.params, 1);
|
|
104
|
+
if (!accumulatorParameter || !keyParameter)
|
|
105
|
+
return;
|
|
106
|
+
if (accumulatorParameter.name === keyParameter.name)
|
|
107
|
+
return;
|
|
108
|
+
if (!isStableRenamed(accumulatorParameter.name)) {
|
|
109
|
+
const currentName = accumulatorParameter.name;
|
|
110
|
+
const binding = callbackPath.scope.getBinding(currentName);
|
|
111
|
+
if (binding?.constant) {
|
|
112
|
+
group.add({
|
|
113
|
+
scope: binding.scope,
|
|
114
|
+
currentName,
|
|
115
|
+
baseName: RESULT_BASE_NAME,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (!isStableRenamed(keyParameter.name)) {
|
|
120
|
+
const currentName = keyParameter.name;
|
|
121
|
+
const binding = callbackPath.scope.getBinding(currentName);
|
|
122
|
+
if (binding?.constant) {
|
|
123
|
+
group.add({
|
|
124
|
+
scope: binding.scope,
|
|
125
|
+
currentName,
|
|
126
|
+
baseName: KEY_BASE_NAME,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
transformationsApplied += group.apply();
|
|
133
|
+
}
|
|
134
|
+
return Promise.resolve({ nodesVisited, transformationsApplied });
|
|
135
|
+
},
|
|
136
|
+
};
|
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.81.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",
|