miniread 1.99.0 → 1.100.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.
@@ -81,10 +81,16 @@ const manifestData = {
81
81
  evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-01-25T23:10:24.232Z", "changedLines": 68, "durationSeconds": 52.926377209, "stableNames": 1358 } },
82
82
  },
83
83
  "rename-comparison-flags": {
84
- recommended: true,
85
- notes: "Measured with baseline none: 0%. Improves readability by renaming minified variables like 'saA === \"darwin\"' to '$isDarwin'.",
84
+ recommended: false,
85
+ notes: "Measured with baseline none: 0%. Superseded by rename-comparison-flags-v2 in the recommended preset.",
86
+ supersededBy: "rename-comparison-flags-v2",
86
87
  evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-01-25T23:11:30.260Z", "changedLines": 190, "durationSeconds": 62.912611250000005, "stableNames": 1381 } },
87
88
  },
89
+ "rename-comparison-flags-v2": {
90
+ recommended: true,
91
+ notes: "Supersedes rename-comparison-flags in the recommended preset and extends comparison flag renaming to member expressions like 'client.config.type === \"sse\"'.",
92
+ evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 99.98869098105739, "evaluatedAt": "2026-02-06T13:05:37.982Z", "changedLines": 606, "durationSeconds": 214.411692843, "stableNames": 1418 } },
93
+ },
88
94
  "rename-date-now-start-times": {
89
95
  recommended: true,
90
96
  notes: "Measured with baseline none: 0.00%. Added to recommended for readability.",
@@ -225,7 +231,7 @@ const manifestData = {
225
231
  },
226
232
  "rename-promise-catch-parameters": {
227
233
  recommended: true,
228
- evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 99.9943454905287, "evaluatedAt": "2026-02-04T13:02:28.995Z", "changedLines": 462, "durationSeconds": 287.68950817700005, "stableNames": 1358 } },
234
+ evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 99.9943454905287, "evaluatedAt": "2026-02-07T12:43:19.520Z", "changedLines": 462, "durationSeconds": 209.10329718800003, "stableNames": 1358 } },
229
235
  },
230
236
  "rename-promise-executor-parameters-v2": {
231
237
  recommended: true,
@@ -434,8 +440,8 @@ export const recommendedTransformIds = [
434
440
  "rename-char-code-at",
435
441
  "rename-charcode-variables-v2",
436
442
  "rename-client-aliases",
437
- "rename-comparison-flags",
438
443
  "rename-platform-win32-flags",
444
+ "rename-comparison-flags-v2",
439
445
  "rename-date-now-start-times",
440
446
  "rename-default-options-parameters-v3",
441
447
  "rename-deferred-resolve-parameters",
@@ -17,6 +17,7 @@ import { renameCharCodeAtTransform } from "../rename-char-code-at/rename-char-co
17
17
  import { renameCharcodeVariablesV2Transform } from "../rename-charcode-variables-v2/rename-charcode-variables-v2-transform.js";
18
18
  import { renameClientAliasesTransform } from "../rename-client-aliases/rename-client-aliases-transform.js";
19
19
  import { renameComparisonFlagsTransform } from "../rename-comparison-flags/rename-comparison-flags-transform.js";
20
+ import { renameComparisonFlagsV2Transform } from "../rename-comparison-flags-v2/rename-comparison-flags-v2-transform.js";
20
21
  import { renameDateNowStartTimesTransform } from "../rename-date-now-start-times/rename-date-now-start-times-transform.js";
21
22
  import { renameDefaultOptionsParametersV3Transform } from "../rename-default-options-parameters-v3/rename-default-options-parameters-v3-transform.js";
22
23
  import { renameDeferredResolveParametersTransform } from "../rename-deferred-resolve-parameters/rename-deferred-resolve-parameters-transform.js";
@@ -102,6 +103,7 @@ export const transformRegistry = {
102
103
  [renameCharcodeVariablesV2Transform.id]: renameCharcodeVariablesV2Transform,
103
104
  [renameClientAliasesTransform.id]: renameClientAliasesTransform,
104
105
  [renameComparisonFlagsTransform.id]: renameComparisonFlagsTransform,
106
+ [renameComparisonFlagsV2Transform.id]: renameComparisonFlagsV2Transform,
105
107
  [renameDateNowStartTimesTransform.id]: renameDateNowStartTimesTransform,
106
108
  [renameDefaultOptionsParametersV3Transform.id]: renameDefaultOptionsParametersV3Transform,
107
109
  [renameDeferredResolveParametersTransform.id]: renameDeferredResolveParametersTransform,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "recommended": {
3
- "diffSizePercent": 30.529727482329815,
4
- "notes": "Measured with baseline none: 30.53% of original diff."
3
+ "diffSizePercent": 30.524057905280266,
4
+ "notes": "Measured with baseline none: 30.52% of original diff."
5
5
  }
6
6
  }
@@ -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-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-map-by-id-variables", "rename-object-property-value-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-v2", "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-platform-win32-flags", "rename-comparison-flags-v2", "rename-date-now-start-times", "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-map-by-id-variables", "rename-object-property-value-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-v2", "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"];
@@ -35,8 +35,9 @@ export const recommendedTransformOrder = [
35
35
  "rename-char-code-at",
36
36
  "rename-charcode-variables-v2",
37
37
  "rename-client-aliases",
38
- "rename-comparison-flags",
39
38
  "rename-platform-win32-flags",
39
+ // Run the specialized win32 transform before generic comparison-flag naming.
40
+ "rename-comparison-flags-v2",
40
41
  "rename-date-now-start-times",
41
42
  "rename-default-options-parameters-v3",
42
43
  "rename-deferred-resolve-parameters",
@@ -1,5 +1,6 @@
1
1
  {
2
- "recommended": true,
2
+ "recommended": false,
3
+ "supersededBy": "rename-comparison-flags-v2",
3
4
  "evaluations": {
4
5
  "claude-code-2.1.10:claude-code-2.1.11": {
5
6
  "diffSizePercent": 100,
@@ -9,5 +10,5 @@
9
10
  "stableNames": 1381
10
11
  }
11
12
  },
12
- "notes": "Measured with baseline none: 0%. Improves readability by renaming minified variables like 'saA === \"darwin\"' to '$isDarwin'."
13
+ "notes": "Measured with baseline none: 0%. Superseded by rename-comparison-flags-v2 in the recommended preset."
13
14
  }
@@ -0,0 +1,13 @@
1
+ {
2
+ "recommended": true,
3
+ "evaluations": {
4
+ "claude-code-2.1.10:claude-code-2.1.11": {
5
+ "diffSizePercent": 99.98869098105739,
6
+ "evaluatedAt": "2026-02-06T13:05:37.982Z",
7
+ "changedLines": 606,
8
+ "durationSeconds": 214.411692843,
9
+ "stableNames": 1418
10
+ }
11
+ },
12
+ "notes": "Supersedes rename-comparison-flags in the recommended preset and extends comparison flag renaming to member expressions like 'client.config.type === \"sse\"'."
13
+ }
@@ -0,0 +1,2 @@
1
+ import type { Transform } from "../../core/types.js";
2
+ export declare const renameComparisonFlagsV2Transform: Transform;
@@ -0,0 +1,109 @@
1
+ import { createRequire } from "node:module";
2
+ import { RenameGroup, isStableRenamed } 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
+ export const renameComparisonFlagsV2Transform = {
8
+ id: "rename-comparison-flags-v2",
9
+ description: "Rename boolean variables assigned from string comparisons (identifiers and member expressions)",
10
+ scope: "file",
11
+ parallelizable: true,
12
+ transform(context) {
13
+ let nodesVisited = 0;
14
+ let transformationsApplied = 0;
15
+ for (const fileInfo of getFilesToProcess(context)) {
16
+ const renameGroup = new RenameGroup();
17
+ traverse(fileInfo.ast, {
18
+ VariableDeclarator(path) {
19
+ nodesVisited++;
20
+ const { id, init } = path.node;
21
+ if (!init || id.type !== "Identifier") {
22
+ return;
23
+ }
24
+ if (init.type !== "BinaryExpression" ||
25
+ (init.operator !== "===" &&
26
+ init.operator !== "!==" &&
27
+ init.operator !== "==" &&
28
+ init.operator !== "!=")) {
29
+ return;
30
+ }
31
+ let stringValue;
32
+ let otherSide;
33
+ if (init.left.type === "StringLiteral") {
34
+ stringValue = init.left.value;
35
+ otherSide = init.right;
36
+ }
37
+ else if (init.right.type === "StringLiteral") {
38
+ stringValue = init.right.value;
39
+ otherSide = init.left;
40
+ }
41
+ if (!otherSide || stringValue === undefined) {
42
+ return;
43
+ }
44
+ const isSupportedComparisonSide =
45
+ // Also excludes constant string-vs-string comparisons (e.g. "a" === "b"),
46
+ // which are not variable flag checks.
47
+ otherSide.type === "Identifier" ||
48
+ ((otherSide.type === "MemberExpression" ||
49
+ otherSide.type === "OptionalMemberExpression") &&
50
+ // Keep this strict: bracket access (including ["type"]) is excluded.
51
+ // We only rename dot-property comparisons with obvious field semantics.
52
+ !otherSide.computed);
53
+ if (!isSupportedComparisonSide) {
54
+ return;
55
+ }
56
+ const currentName = id.name;
57
+ const binding = path.scope.getBinding(currentName);
58
+ // Prefer high-certainty names over wider coverage: non-constant flags
59
+ // can later hold unrelated values, making semantic renames misleading.
60
+ if (!binding?.constant) {
61
+ return;
62
+ }
63
+ if (isStableRenamed(currentName)) {
64
+ return;
65
+ }
66
+ const operator = init.operator;
67
+ // Keep name derivation aligned with rename-comparison-flags so v1/v2
68
+ // produce identical flag names for equivalent comparisons.
69
+ const parts = stringValue
70
+ .split(/[^\dA-Za-z]+/u)
71
+ .filter(Boolean);
72
+ const capitalizedValue = parts.length === 0
73
+ ? stringValue === ""
74
+ ? "EmptyString"
75
+ : "Flag"
76
+ : parts
77
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
78
+ .join("");
79
+ let baseName;
80
+ switch (operator) {
81
+ case "===": {
82
+ baseName = `is${capitalizedValue}`;
83
+ break;
84
+ }
85
+ case "!==": {
86
+ baseName = `isNot${capitalizedValue}`;
87
+ break;
88
+ }
89
+ case "==": {
90
+ baseName = `equals${capitalizedValue}`;
91
+ break;
92
+ }
93
+ case "!=": {
94
+ baseName = `notEquals${capitalizedValue}`;
95
+ break;
96
+ }
97
+ }
98
+ renameGroup.add({
99
+ scope: binding.scope,
100
+ currentName,
101
+ baseName,
102
+ });
103
+ },
104
+ });
105
+ transformationsApplied += renameGroup.apply();
106
+ }
107
+ return Promise.resolve({ nodesVisited, transformationsApplied });
108
+ },
109
+ };
@@ -1,5 +1,4 @@
1
1
  import { createRequire } from "node:module";
2
- import { collectExportedNames } from "../../core/collect-exported-names.js";
3
2
  import { isHashBasedStableName, RenameGroup, } from "../../core/stable-naming.js";
4
3
  import { getFilesToProcess, } from "../../core/types.js";
5
4
  import { applyHashStableWin32Renames, } from "./apply-hash-stable-win32-renames.js";
@@ -56,7 +55,6 @@ export const renamePlatformWin32FlagsTransform = {
56
55
  for (const fileInfo of getFilesToProcess(context)) {
57
56
  const group = new RenameGroup();
58
57
  const hashEntries = [];
59
- const exportedNames = collectExportedNames(fileInfo.ast.program);
60
58
  traverse(fileInfo.ast, {
61
59
  VariableDeclarator(path) {
62
60
  nodesVisited++;
@@ -84,10 +82,6 @@ export const renamePlatformWin32FlagsTransform = {
84
82
  // semantically named pattern where dead-code renames add little value.
85
83
  if (binding.referencePaths.length === 0)
86
84
  return;
87
- if (binding.scope.block.type === "Program" &&
88
- exportedNames.has(id.name)) {
89
- return;
90
- }
91
85
  if (isHashBasedStableName(id.name)) {
92
86
  hashEntries.push({
93
87
  baseName,
@@ -3,9 +3,9 @@
3
3
  "evaluations": {
4
4
  "claude-code-2.1.10:claude-code-2.1.11": {
5
5
  "diffSizePercent": 99.9943454905287,
6
- "evaluatedAt": "2026-02-04T13:02:28.995Z",
6
+ "evaluatedAt": "2026-02-07T12:43:19.520Z",
7
7
  "changedLines": 462,
8
- "durationSeconds": 287.68950817700005,
8
+ "durationSeconds": 209.10329718800003,
9
9
  "stableNames": 1358
10
10
  }
11
11
  }
@@ -17,36 +17,28 @@ const isCatchMemberExpression = (callee) => {
17
17
  return false;
18
18
  return property.name === "catch";
19
19
  };
20
- const getCatchCallbackPath = (path) => {
21
- if (!isCatchMemberExpression(path.node.callee))
20
+ const getCatchCallbackInfo = (path) => {
21
+ const { node } = path;
22
+ if (!isCatchMemberExpression(node.callee))
22
23
  return;
23
- if (path.node.arguments.length === 0)
24
+ if (node.arguments.length === 0)
24
25
  return;
25
- const argumentPaths = path.get("arguments");
26
- const callback = argumentPaths[0];
27
- if (!callback)
28
- return;
29
- if (!callback.isFunctionExpression() &&
30
- !callback.isArrowFunctionExpression()) {
26
+ const argument = node.arguments[0];
27
+ if (argument?.type !== "FunctionExpression" &&
28
+ argument?.type !== "ArrowFunctionExpression") {
31
29
  return;
32
30
  }
33
- if (callback.node.params.length !== 1)
31
+ if (argument.params.length !== 1)
34
32
  return;
35
- const parameter = callback.node.params[0];
33
+ const parameter = argument.params[0];
36
34
  if (parameter?.type !== "Identifier")
37
35
  return;
38
- return callback;
36
+ return {
37
+ callbackPath: path.get("arguments.0"),
38
+ parameter,
39
+ };
39
40
  };
40
- const getCatchParameter = (callbackPath) => {
41
- const parameter = callbackPath.node.params[0];
42
- if (parameter?.type !== "Identifier")
43
- return;
44
- return parameter;
45
- };
46
- const addCatchRename = (group, callbackPath) => {
47
- const parameter = getCatchParameter(callbackPath);
48
- if (!parameter)
49
- return;
41
+ const addCatchRename = (group, callbackPath, parameter) => {
50
42
  const currentName = parameter.name;
51
43
  if (isStableRenamed(currentName))
52
44
  return;
@@ -69,17 +61,17 @@ export const renamePromiseCatchParametersTransform = {
69
61
  traverse(fileInfo.ast, {
70
62
  CallExpression(path) {
71
63
  nodesVisited++;
72
- const callbackPath = getCatchCallbackPath(path);
73
- if (!callbackPath)
64
+ const callbackInfo = getCatchCallbackInfo(path);
65
+ if (!callbackInfo)
74
66
  return;
75
- addCatchRename(group, callbackPath);
67
+ addCatchRename(group, callbackInfo.callbackPath, callbackInfo.parameter);
76
68
  },
77
69
  OptionalCallExpression(path) {
78
70
  nodesVisited++;
79
- const callbackPath = getCatchCallbackPath(path);
80
- if (!callbackPath)
71
+ const callbackInfo = getCatchCallbackInfo(path);
72
+ if (!callbackInfo)
81
73
  return;
82
- addCatchRename(group, callbackPath);
74
+ addCatchRename(group, callbackInfo.callbackPath, callbackInfo.parameter);
83
75
  },
84
76
  });
85
77
  transformationsApplied += group.apply();
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.99.0",
5
+ "version": "1.100.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",