miniread 1.50.0 → 1.51.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/rename-error-first-callback-parameters/manifest.json +20 -0
- package/dist/transforms/rename-error-first-callback-parameters/rename-error-first-callback-parameters-transform.d.ts +2 -0
- package/dist/transforms/rename-error-first-callback-parameters/rename-error-first-callback-parameters-transform.js +117 -0
- package/package.json +1 -1
|
@@ -103,6 +103,11 @@ const manifestData = {
|
|
|
103
103
|
notes: "Auto-added by evaluation script. Measured with baseline none: 0.09%.",
|
|
104
104
|
evaluations: { "legacy:evaluation": { "evaluatedAt": "2026-01-25T19:59:48.188Z", "changedLines": 38927, "durationSeconds": 0, "stableNames": 0, "diffSizePercent": 97.80020410477378 }, "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 97.80020410477378, "evaluatedAt": "2026-01-25T23:15:44.243Z", "changedLines": 38927, "durationSeconds": 76.61873741599999, "stableNames": 4505 } },
|
|
105
105
|
},
|
|
106
|
+
"rename-error-first-callback-parameters": {
|
|
107
|
+
recommended: true,
|
|
108
|
+
notes: "Measured with baseline none: 0.00%.",
|
|
109
|
+
evaluations: { "legacy:evaluation": { "evaluatedAt": "2026-01-25T21:27:50.901Z", "changedLines": 448, "durationSeconds": 0, "stableNames": 0, "diffSizePercent": 100 }, "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-01-27T06:34:23.332Z", "changedLines": 440, "durationSeconds": 50.931335125000004, "stableNames": 1360 } },
|
|
110
|
+
},
|
|
106
111
|
"rename-error-variables": {
|
|
107
112
|
recommended: true,
|
|
108
113
|
notes: "Auto-added by evaluation script.",
|
|
@@ -20,6 +20,7 @@ import { renameDateNowStartTimesTransform } from "../rename-date-now-start-times
|
|
|
20
20
|
import { renameDefaultOptionsParametersTransform } from "../rename-default-options-parameters/rename-default-options-parameters-transform.js";
|
|
21
21
|
import { renameDeferredResolveParametersTransform } from "../rename-deferred-resolve-parameters/rename-deferred-resolve-parameters-transform.js";
|
|
22
22
|
import { renameDestructuredAliasesTransform } from "../rename-destructured-aliases/rename-destructured-aliases-transform.js";
|
|
23
|
+
import { renameErrorFirstCallbackParametersTransform } from "../rename-error-first-callback-parameters/rename-error-first-callback-parameters-transform.js";
|
|
23
24
|
import { renameErrorVariablesTransform } from "../rename-error-variables/rename-error-variables-transform.js";
|
|
24
25
|
import { renameEventParametersTransform } from "../rename-event-parameters/rename-event-parameters-transform.js";
|
|
25
26
|
import { renameLoopIndexVariablesTransform } from "../rename-loop-index-variables/rename-loop-index-variables-transform.js";
|
|
@@ -75,6 +76,7 @@ export const transformRegistry = {
|
|
|
75
76
|
[renameDefaultOptionsParametersTransform.id]: renameDefaultOptionsParametersTransform,
|
|
76
77
|
[renameDeferredResolveParametersTransform.id]: renameDeferredResolveParametersTransform,
|
|
77
78
|
[renameDestructuredAliasesTransform.id]: renameDestructuredAliasesTransform,
|
|
79
|
+
[renameErrorFirstCallbackParametersTransform.id]: renameErrorFirstCallbackParametersTransform,
|
|
78
80
|
[renameErrorVariablesTransform.id]: renameErrorVariablesTransform,
|
|
79
81
|
[renameEventParametersTransform.id]: renameEventParametersTransform,
|
|
80
82
|
[renameLoopIndexVariablesTransform.id]: renameLoopIndexVariablesTransform,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"recommended": true,
|
|
3
|
+
"evaluations": {
|
|
4
|
+
"legacy:evaluation": {
|
|
5
|
+
"evaluatedAt": "2026-01-25T21:27:50.901Z",
|
|
6
|
+
"changedLines": 448,
|
|
7
|
+
"durationSeconds": 0,
|
|
8
|
+
"stableNames": 0,
|
|
9
|
+
"diffSizePercent": 100
|
|
10
|
+
},
|
|
11
|
+
"claude-code-2.1.10:claude-code-2.1.11": {
|
|
12
|
+
"diffSizePercent": 100,
|
|
13
|
+
"evaluatedAt": "2026-01-27T06:34:23.332Z",
|
|
14
|
+
"changedLines": 440,
|
|
15
|
+
"durationSeconds": 50.931335125000004,
|
|
16
|
+
"stableNames": 1360
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"notes": "Measured with baseline none: 0.00%."
|
|
20
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { RenameGroup } from "../../core/stable-naming.js";
|
|
3
|
+
import { getFilesToProcess, } from "../../core/types.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
|
+
const BASE_NAME = "error";
|
|
8
|
+
const getReturnCallExpression = (statement) => {
|
|
9
|
+
if (statement.type === "ReturnStatement") {
|
|
10
|
+
return statement.argument?.type === "CallExpression"
|
|
11
|
+
? statement.argument
|
|
12
|
+
: undefined;
|
|
13
|
+
}
|
|
14
|
+
if (statement.type !== "BlockStatement")
|
|
15
|
+
return undefined;
|
|
16
|
+
if (statement.body.length !== 1)
|
|
17
|
+
return undefined;
|
|
18
|
+
const firstStatement = statement.body[0];
|
|
19
|
+
if (firstStatement?.type !== "ReturnStatement")
|
|
20
|
+
return undefined;
|
|
21
|
+
return firstStatement.argument?.type === "CallExpression"
|
|
22
|
+
? firstStatement.argument
|
|
23
|
+
: undefined;
|
|
24
|
+
};
|
|
25
|
+
const getErrorFirstIfStatement = (path) => {
|
|
26
|
+
const body = path.node.body;
|
|
27
|
+
if (body.type !== "BlockStatement")
|
|
28
|
+
return undefined;
|
|
29
|
+
// Avoid false positives like `function f(x) { if (x) return cb(x); }` where the
|
|
30
|
+
// guard is the only statement and the function has no "success path" code.
|
|
31
|
+
if (body.body.length < 2)
|
|
32
|
+
return undefined;
|
|
33
|
+
const firstStatement = body.body[0];
|
|
34
|
+
if (firstStatement?.type !== "IfStatement")
|
|
35
|
+
return undefined;
|
|
36
|
+
if (firstStatement.alternate)
|
|
37
|
+
return undefined;
|
|
38
|
+
return firstStatement;
|
|
39
|
+
};
|
|
40
|
+
const matchesErrorFirstGuard = (path) => {
|
|
41
|
+
const firstParameter = path.node.params[0];
|
|
42
|
+
if (firstParameter?.type !== "Identifier")
|
|
43
|
+
return undefined;
|
|
44
|
+
const firstBinding = path.scope.getBinding(firstParameter.name);
|
|
45
|
+
if (!firstBinding)
|
|
46
|
+
return undefined;
|
|
47
|
+
if (firstBinding.kind !== "param")
|
|
48
|
+
return undefined;
|
|
49
|
+
if (firstBinding.referencePaths.length !== 2)
|
|
50
|
+
return undefined;
|
|
51
|
+
const ifStatement = getErrorFirstIfStatement(path);
|
|
52
|
+
if (!ifStatement)
|
|
53
|
+
return undefined;
|
|
54
|
+
if (ifStatement.test.type !== "Identifier")
|
|
55
|
+
return undefined;
|
|
56
|
+
if (ifStatement.test.name !== firstParameter.name)
|
|
57
|
+
return undefined;
|
|
58
|
+
const returnCall = getReturnCallExpression(ifStatement.consequent);
|
|
59
|
+
if (!returnCall)
|
|
60
|
+
return undefined;
|
|
61
|
+
if (returnCall.callee.type !== "Identifier")
|
|
62
|
+
return undefined;
|
|
63
|
+
const callbackBinding = path.scope.getBinding(returnCall.callee.name);
|
|
64
|
+
if (!callbackBinding)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (callbackBinding.kind !== "param")
|
|
67
|
+
return undefined;
|
|
68
|
+
const callbackOwner = callbackBinding.scope.path.node;
|
|
69
|
+
if (callbackOwner.type !== "FunctionDeclaration" &&
|
|
70
|
+
callbackOwner.type !== "FunctionExpression" &&
|
|
71
|
+
callbackOwner.type !== "ArrowFunctionExpression") {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const callbackOwnerParameters = callbackOwner.params;
|
|
75
|
+
const lastCallbackOwnerParameter = callbackOwnerParameters.at(-1);
|
|
76
|
+
if (lastCallbackOwnerParameter?.type !== "Identifier")
|
|
77
|
+
return undefined;
|
|
78
|
+
if (lastCallbackOwnerParameter.name !== returnCall.callee.name)
|
|
79
|
+
return undefined;
|
|
80
|
+
const firstArgument = returnCall.arguments[0];
|
|
81
|
+
if (firstArgument?.type !== "Identifier")
|
|
82
|
+
return undefined;
|
|
83
|
+
if (firstArgument.name !== firstParameter.name)
|
|
84
|
+
return undefined;
|
|
85
|
+
return firstParameter.name;
|
|
86
|
+
};
|
|
87
|
+
export const renameErrorFirstCallbackParametersTransform = {
|
|
88
|
+
id: "rename-error-first-callback-parameters",
|
|
89
|
+
description: "Renames error-first callback parameters used in leading `if (err) return cb(err)` guards to $error/$error2/...",
|
|
90
|
+
scope: "file",
|
|
91
|
+
parallelizable: true,
|
|
92
|
+
transform(context) {
|
|
93
|
+
let nodesVisited = 0;
|
|
94
|
+
let transformationsApplied = 0;
|
|
95
|
+
for (const fileInfo of getFilesToProcess(context)) {
|
|
96
|
+
const group = new RenameGroup();
|
|
97
|
+
traverse(fileInfo.ast, {
|
|
98
|
+
Function(path) {
|
|
99
|
+
nodesVisited++;
|
|
100
|
+
const currentName = matchesErrorFirstGuard(path);
|
|
101
|
+
if (!currentName)
|
|
102
|
+
return;
|
|
103
|
+
group.add({
|
|
104
|
+
scope: path.scope,
|
|
105
|
+
currentName,
|
|
106
|
+
baseName: BASE_NAME,
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
transformationsApplied += group.apply();
|
|
111
|
+
}
|
|
112
|
+
return Promise.resolve({
|
|
113
|
+
nodesVisited,
|
|
114
|
+
transformationsApplied,
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
};
|
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.51.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",
|