miniread 1.100.4 → 1.101.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.
@@ -320,6 +320,11 @@ const manifestData = {
320
320
  notes: "Measured with baseline none: 0.00%. Added to recommended for readability.",
321
321
  evaluations: { "legacy:evaluation": { "evaluatedAt": "2026-01-24T12:41:44.793Z", "changedLines": 0, "durationSeconds": 0, "stableNames": 0, "diffSizePercent": 100 }, "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-01-25T23:34:11.401Z", "changedLines": 0, "durationSeconds": 40.287627666, "stableNames": 1357 } },
322
322
  },
323
+ "rename-unix-timestamp-parameters": {
324
+ recommended: true,
325
+ notes: "Measured with baseline none: 100.00%. Added to recommended for readability.",
326
+ evaluations: { "claude-code-2.1.10:claude-code-2.1.11": { "diffSizePercent": 100, "evaluatedAt": "2026-02-07T12:52:07.764Z", "changedLines": 6, "durationSeconds": 201.341115137, "stableNames": 1358 } },
327
+ },
323
328
  "rename-url-parameters": {
324
329
  recommended: true,
325
330
  notes: "Measured with baseline none: 0.00%. Added to recommended for readability.",
@@ -443,6 +448,7 @@ export const recommendedTransformIds = [
443
448
  "rename-platform-win32-flags",
444
449
  "rename-comparison-flags-v2",
445
450
  "rename-date-now-start-times",
451
+ "rename-unix-timestamp-parameters",
446
452
  "rename-default-options-parameters-v3",
447
453
  "rename-deferred-resolve-parameters",
448
454
  "rename-deferred-resolve-parameters-v2",
@@ -68,6 +68,7 @@ import { renameToBufferResultsTransform } from "../rename-to-buffer-results/rena
68
68
  import { renameTypeofVariablesTransform } from "../rename-typeof-variables/rename-typeof-variables-transform.js";
69
69
  import { renameTypescriptHelperAliasesTransform } from "../rename-typescript-helper-aliases/rename-typescript-helper-aliases-transform.js";
70
70
  import { renameUint8arrayConcatVariablesTransform } from "../rename-uint8array-concat-variables/rename-uint8array-concat-variables-transform.js";
71
+ import { renameUnixTimestampParametersTransform } from "../rename-unix-timestamp-parameters/rename-unix-timestamp-parameters-transform.js";
71
72
  import { renameUrlParametersTransform } from "../rename-url-parameters/rename-url-parameters-transform.js";
72
73
  import { renameUrlVariablesTransform } from "../rename-url-variables/rename-url-variables-transform.js";
73
74
  import { renameUseReferenceGuardsV2Transform } from "../rename-use-reference-guards-v2/rename-use-reference-guards-v2-transform.js";
@@ -154,6 +155,7 @@ export const transformRegistry = {
154
155
  [renameTypeofVariablesTransform.id]: renameTypeofVariablesTransform,
155
156
  [renameTypescriptHelperAliasesTransform.id]: renameTypescriptHelperAliasesTransform,
156
157
  [renameUint8arrayConcatVariablesTransform.id]: renameUint8arrayConcatVariablesTransform,
158
+ [renameUnixTimestampParametersTransform.id]: renameUnixTimestampParametersTransform,
157
159
  [renameUrlParametersTransform.id]: renameUrlParametersTransform,
158
160
  [renameUrlVariablesTransform.id]: renameUrlVariablesTransform,
159
161
  [renameUseReferenceGuardsV2Transform.id]: renameUseReferenceGuardsV2Transform,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "recommended": {
3
- "diffSizePercent": 30.524057905280266,
4
- "notes": "Measured with baseline none: 30.52% of original diff."
3
+ "diffSizePercent": 30.450475921213833,
4
+ "notes": "Measured with baseline none: 30.45% 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-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"];
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-unix-timestamp-parameters", "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"];
@@ -39,6 +39,7 @@ export const recommendedTransformOrder = [
39
39
  // Run the specialized win32 transform before generic comparison-flag naming.
40
40
  "rename-comparison-flags-v2",
41
41
  "rename-date-now-start-times",
42
+ "rename-unix-timestamp-parameters",
42
43
  "rename-default-options-parameters-v3",
43
44
  "rename-deferred-resolve-parameters",
44
45
  "rename-deferred-resolve-parameters-v2",
@@ -67,8 +67,9 @@ export const renamePlatformWin32FlagsTransform = {
67
67
  let transformationsApplied = 0;
68
68
  for (const fileInfo of getFilesToProcess(context)) {
69
69
  const hasRawWin32Literal = fileInfo.content.includes(WIN32_LITERAL);
70
- if (!hasRawWin32Literal) {
71
- // Escaped string literals (e.g. "\u0077in32") do not contain "win32" in source text.
70
+ const hasRawPlatformIdentifier = fileInfo.content.includes("platform");
71
+ if (!hasRawWin32Literal || !hasRawPlatformIdentifier) {
72
+ // Escaped identifiers/literals may not contain the raw text.
72
73
  if (!fileInfo.content.includes(ESCAPE_CHARACTER))
73
74
  continue;
74
75
  if (!hasWin32StringLiteral(fileInfo.ast))
@@ -0,0 +1,13 @@
1
+ {
2
+ "recommended": true,
3
+ "evaluations": {
4
+ "claude-code-2.1.10:claude-code-2.1.11": {
5
+ "diffSizePercent": 100,
6
+ "evaluatedAt": "2026-02-07T12:52:07.764Z",
7
+ "changedLines": 6,
8
+ "durationSeconds": 201.341115137,
9
+ "stableNames": 1358
10
+ }
11
+ },
12
+ "notes": "Measured with baseline none: 100.00%. Added to recommended for readability."
13
+ }
@@ -0,0 +1,2 @@
1
+ import { type Transform } from "../../core/types.js";
2
+ export declare const renameUnixTimestampParametersTransform: Transform;
@@ -0,0 +1,152 @@
1
+ import { createRequire } from "node:module";
2
+ import { isStableRenamed, 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 = "timestampSeconds";
8
+ const isThousandLiteral = (node) => node.value === 1000;
9
+ const unwrapTransparentParent = (path) => {
10
+ let wrappedNode = path.node;
11
+ let parentPath = path.parentPath;
12
+ while (parentPath &&
13
+ (parentPath.isParenthesizedExpression() ||
14
+ parentPath.isTSAsExpression() ||
15
+ parentPath.isTSTypeAssertion() ||
16
+ parentPath.isTSNonNullExpression())) {
17
+ wrappedNode = parentPath.node;
18
+ parentPath = parentPath.parentPath;
19
+ }
20
+ return { wrappedNode, parentPath };
21
+ };
22
+ const getDateConstructorPath = (path) => {
23
+ if (!path.isNewExpression())
24
+ return undefined;
25
+ const callee = path.node.callee;
26
+ if (callee.type !== "Identifier")
27
+ return undefined;
28
+ if (callee.name !== "Date")
29
+ return undefined;
30
+ if (path.scope.hasBinding("Date", true))
31
+ return undefined;
32
+ return path;
33
+ };
34
+ const isDateSecondsReference = (referencePath) => {
35
+ const { wrappedNode, parentPath } = unwrapTransparentParent(referencePath);
36
+ if (!parentPath?.isBinaryExpression({ operator: "*" }))
37
+ return false;
38
+ const binary = parentPath.node;
39
+ const matchesLeft = binary.left === wrappedNode;
40
+ const matchesRight = binary.right === wrappedNode;
41
+ if (!matchesLeft && !matchesRight)
42
+ return false;
43
+ const otherSide = matchesLeft ? binary.right : binary.left;
44
+ if (otherSide.type !== "NumericLiteral")
45
+ return false;
46
+ if (!isThousandLiteral(otherSide))
47
+ return false;
48
+ const { wrappedNode: wrappedBinary, parentPath: binaryParent } = unwrapTransparentParent(parentPath);
49
+ if (!binaryParent)
50
+ return false;
51
+ const dateConstructorPath = getDateConstructorPath(binaryParent);
52
+ if (!dateConstructorPath)
53
+ return false;
54
+ const newExpression = dateConstructorPath.node;
55
+ if (newExpression.arguments.length !== 1)
56
+ return false;
57
+ if (newExpression.arguments[0] !== wrappedBinary)
58
+ return false;
59
+ return true;
60
+ };
61
+ const isTruthinessCheck = (referencePath) => {
62
+ // Keep this intentionally narrow: only direct if/ternary guard tests are
63
+ // considered "harmless" non-Date uses for this transform.
64
+ const { wrappedNode, parentPath } = unwrapTransparentParent(referencePath);
65
+ if (!parentPath)
66
+ return false;
67
+ if (parentPath.isIfStatement({ test: wrappedNode }))
68
+ return true;
69
+ if (parentPath.isConditionalExpression({ test: wrappedNode }))
70
+ return true;
71
+ if (parentPath.isUnaryExpression({ operator: "!" })) {
72
+ if (parentPath.node.argument !== wrappedNode)
73
+ return false;
74
+ const { wrappedNode: wrappedUnary, parentPath: unaryParent } = unwrapTransparentParent(parentPath);
75
+ if (!unaryParent)
76
+ return false;
77
+ if (unaryParent.isIfStatement({ test: wrappedUnary }))
78
+ return true;
79
+ if (unaryParent.isConditionalExpression({ test: wrappedUnary }))
80
+ return true;
81
+ }
82
+ return false;
83
+ };
84
+ const isTimestampSecondsParameter = (path, parameterName) => {
85
+ const binding = path.scope.getBinding(parameterName);
86
+ if (!binding)
87
+ return false;
88
+ if (!binding.constant)
89
+ return false;
90
+ if (binding.referencePaths.length === 0)
91
+ return false;
92
+ let hasDateConstructorUsage = false;
93
+ for (const referencePath of binding.referencePaths) {
94
+ if (!referencePath.isIdentifier())
95
+ return false;
96
+ if (isDateSecondsReference(referencePath)) {
97
+ hasDateConstructorUsage = true;
98
+ continue;
99
+ }
100
+ if (isTruthinessCheck(referencePath))
101
+ continue;
102
+ return false;
103
+ }
104
+ return hasDateConstructorUsage;
105
+ };
106
+ const getParameterName = (path) => {
107
+ if (path.isIdentifier())
108
+ return path.node.name;
109
+ if (!path.isAssignmentPattern())
110
+ return undefined;
111
+ const leftPath = path.get("left");
112
+ if (!leftPath.isIdentifier())
113
+ return undefined;
114
+ return leftPath.node.name;
115
+ };
116
+ export const renameUnixTimestampParametersTransform = {
117
+ id: "rename-unix-timestamp-parameters",
118
+ description: "Renames parameters used only for new Date(timestampSeconds * 1000) constructions to timestampSeconds-based names",
119
+ scope: "file",
120
+ parallelizable: true,
121
+ transform(context) {
122
+ let nodesVisited = 0;
123
+ let transformationsApplied = 0;
124
+ for (const fileInfo of getFilesToProcess(context)) {
125
+ const group = new RenameGroup();
126
+ traverse(fileInfo.ast, {
127
+ Function(path) {
128
+ nodesVisited++;
129
+ const parameters = path.get("params");
130
+ for (const parameterPath of parameters) {
131
+ const parameterName = getParameterName(parameterPath);
132
+ if (!parameterName)
133
+ continue;
134
+ if (parameterName === BASE_NAME)
135
+ continue;
136
+ if (isStableRenamed(parameterName))
137
+ continue;
138
+ if (!isTimestampSecondsParameter(path, parameterName))
139
+ continue;
140
+ group.add({
141
+ scope: path.scope,
142
+ currentName: parameterName,
143
+ baseName: BASE_NAME,
144
+ });
145
+ }
146
+ },
147
+ });
148
+ transformationsApplied += group.apply();
149
+ }
150
+ return Promise.resolve({ nodesVisited, transformationsApplied });
151
+ },
152
+ };
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.100.4",
5
+ "version": "1.101.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",