miniread 1.102.0 → 1.102.1
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/cli/config.d.ts +1 -6
- package/dist/cli/config.js +24 -72
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/scripts/evaluate/check-expected-evaluations.d.ts +0 -6
- package/dist/scripts/evaluate/check-expected-evaluations.js +4 -25
- package/dist/scripts/evaluate/check-snapshots.d.ts +0 -3
- package/dist/scripts/evaluate/check-snapshots.js +4 -6
- package/dist/scripts/evaluate/create-output-slug.d.ts +0 -2
- package/dist/scripts/evaluate/create-output-slug.js +2 -20
- package/dist/scripts/evaluate/parse-evaluate-cli-options.js +7 -40
- package/dist/scripts/evaluate/run-check-mode.d.ts +0 -1
- package/dist/scripts/evaluate/run-check-mode.js +7 -37
- package/dist/scripts/evaluate/run-evaluate-cli.js +0 -3
- package/dist/scripts/evaluate/transform-manifest.d.ts +0 -1
- package/dist/scripts/evaluate/transform-manifest.js +11 -21
- package/dist/scripts/snapshot/run-testcase-transform.js +9 -11
- package/dist/transforms/_generated/catalog.d.ts +7 -0
- package/dist/transforms/_generated/catalog.js +606 -0
- package/dist/transforms/manifest-schema.d.ts +27 -0
- package/dist/transforms/manifest-schema.js +25 -0
- package/dist/transforms/preset-stats.json +2 -2
- package/dist/transforms/transform-catalog.d.ts +35 -0
- package/dist/transforms/transform-catalog.js +86 -0
- package/dist/transforms/transform-selection.d.ts +19 -0
- package/dist/transforms/transform-selection.js +62 -0
- package/dist/transforms-by-id/expand-boolean-literals/expand-boolean-literals-transform.js +93 -7
- package/dist/transforms-by-id/expand-boolean-literals/manifest.json +6 -5
- package/dist/transforms-by-id/expand-sequence-expressions-v5/manifest.json +3 -2
- package/dist/transforms-by-id/expand-special-number-literals/manifest.json +3 -2
- package/dist/transforms-by-id/expand-typeof-undefined-comparisons/manifest.json +3 -2
- package/dist/transforms-by-id/expand-undefined-literals/manifest.json +3 -2
- package/dist/transforms-by-id/remove-redundant-else/manifest.json +3 -2
- package/dist/transforms-by-id/rename-add-event-listener-parameters/manifest.json +4 -3
- package/dist/transforms-by-id/rename-add-event-listener-parameters/rename-add-event-listener-parameters-transform.js +9 -6
- package/dist/transforms-by-id/rename-arguments-length-flags/manifest.json +3 -2
- package/dist/transforms-by-id/rename-asap-wrappers/manifest.json +3 -2
- package/dist/transforms-by-id/rename-awaiter-helper-functions/manifest.json +1 -0
- package/dist/transforms-by-id/rename-awaiter-parameters/manifest.json +3 -2
- package/dist/transforms-by-id/rename-buffer-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-catch-parameters/manifest.json +3 -2
- package/dist/transforms-by-id/rename-char-code-at/manifest.json +3 -2
- package/dist/transforms-by-id/rename-charcode-variables-v2/manifest.json +3 -2
- package/dist/transforms-by-id/rename-client-aliases/manifest.json +3 -2
- package/dist/transforms-by-id/rename-comparison-flags/manifest.json +2 -2
- package/dist/transforms-by-id/rename-comparison-flags-v2/manifest.json +3 -2
- package/dist/transforms-by-id/rename-date-now-start-times/manifest.json +3 -2
- package/dist/transforms-by-id/rename-default-options-parameters-v3/manifest.json +1 -0
- package/dist/transforms-by-id/rename-deferred-resolve-parameters/manifest.json +3 -2
- package/dist/transforms-by-id/rename-deferred-resolve-parameters-v2/manifest.json +3 -2
- package/dist/transforms-by-id/rename-destructured-aliases/manifest.json +3 -2
- package/dist/transforms-by-id/rename-document-fragment-variables/manifest.json +1 -0
- package/dist/transforms-by-id/rename-error-first-callback-parameters/manifest.json +3 -2
- package/dist/transforms-by-id/rename-error-first-callback-parameters-v2/manifest.json +3 -2
- package/dist/transforms-by-id/rename-error-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-event-parameters/manifest.json +3 -2
- package/dist/transforms-by-id/rename-execfile-arguments/manifest.json +1 -0
- package/dist/transforms-by-id/rename-file-extension-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-file-reader-variables/manifest.json +1 -0
- package/dist/transforms-by-id/rename-fs-sync-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-http-method-parameters/manifest.json +1 -0
- package/dist/transforms-by-id/rename-http-server-parameters/manifest.json +1 -0
- package/dist/transforms-by-id/rename-indexeddb-request-variables/manifest.json +1 -0
- package/dist/transforms-by-id/rename-interval-ids/manifest.json +1 -0
- package/dist/transforms-by-id/rename-invalid-parameter-arguments/manifest.json +1 -0
- package/dist/transforms-by-id/rename-loop-index-variables-v3/manifest.json +3 -2
- package/dist/transforms-by-id/rename-loop-length-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-map-by-id-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-object-entries-parameters/manifest.json +1 -0
- package/dist/transforms-by-id/rename-object-keys-iterator-variables/manifest.json +1 -0
- package/dist/transforms-by-id/rename-object-keys-reducer-parameters/manifest.json +1 -0
- package/dist/transforms-by-id/rename-object-keys-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-object-property-value-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-parameters-to-match-properties-v2/manifest.json +3 -2
- package/dist/transforms-by-id/rename-platform-win32-flags/manifest.json +1 -0
- package/dist/transforms-by-id/rename-process-stdout-handlers/manifest.json +2 -2
- package/dist/transforms-by-id/rename-promise-catch-parameters/manifest.json +1 -0
- package/dist/transforms-by-id/rename-promise-executor-parameters-v2/manifest.json +1 -0
- package/dist/transforms-by-id/rename-queue-traversal-variables/manifest.json +1 -0
- package/dist/transforms-by-id/rename-range-parameters/get-explicit-start-count-method-usage.d.ts +10 -0
- package/dist/transforms-by-id/rename-range-parameters/get-explicit-start-count-method-usage.js +45 -0
- package/dist/transforms-by-id/rename-range-parameters/get-range-parameter-default-assignments.d.ts +1 -0
- package/dist/transforms-by-id/rename-range-parameters/get-range-parameter-default-assignments.js +8 -2
- package/dist/transforms-by-id/rename-range-parameters/get-range-parameter-names.js +101 -32
- package/dist/transforms-by-id/rename-range-parameters/has-explicit-start-count-range-usage.d.ts +3 -0
- package/dist/transforms-by-id/rename-range-parameters/has-explicit-start-count-range-usage.js +41 -0
- package/dist/transforms-by-id/rename-range-parameters/has-start-count-loop-boundary-usage.d.ts +5 -0
- package/dist/transforms-by-id/rename-range-parameters/has-start-count-loop-boundary-usage.js +62 -0
- package/dist/transforms-by-id/rename-range-parameters/has-start-count-sum.js +2 -23
- package/dist/transforms-by-id/rename-range-parameters/is-identifier-for-binding.d.ts +5 -0
- package/dist/transforms-by-id/rename-range-parameters/is-identifier-for-binding.js +4 -0
- package/dist/transforms-by-id/rename-range-parameters/is-start-count-sum-expression.d.ts +5 -0
- package/dist/transforms-by-id/rename-range-parameters/is-start-count-sum-expression.js +12 -0
- package/dist/transforms-by-id/rename-range-parameters/manifest.json +4 -3
- package/dist/transforms-by-id/rename-read-file-lines/manifest.json +3 -2
- package/dist/transforms-by-id/rename-regex-builders/manifest.json +3 -2
- package/dist/transforms-by-id/rename-regex-source-parameters/manifest.json +1 -0
- package/dist/transforms-by-id/rename-replace-child-parameters/manifest.json +2 -2
- package/dist/transforms-by-id/rename-rest-parameters/manifest.json +1 -0
- package/dist/transforms-by-id/rename-rest-pop-callbacks/manifest.json +1 -0
- package/dist/transforms-by-id/rename-search-parameters-variables/manifest.json +1 -0
- package/dist/transforms-by-id/rename-setstate-updater-parameters/manifest.json +3 -2
- package/dist/transforms-by-id/rename-string-split-variables-v2/manifest.json +3 -2
- package/dist/transforms-by-id/rename-this-aliases/manifest.json +3 -2
- package/dist/transforms-by-id/rename-timeout-ids/manifest.json +3 -2
- package/dist/transforms-by-id/rename-timeout-promises/manifest.json +1 -0
- package/dist/transforms-by-id/rename-to-buffer-results/manifest.json +1 -0
- package/dist/transforms-by-id/rename-typeof-variables/manifest.json +1 -0
- package/dist/transforms-by-id/rename-typescript-helper-aliases/manifest.json +1 -0
- package/dist/transforms-by-id/rename-uint8array-concat-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/evaluate-timestamp-seconds-parameter.d.ts +4 -0
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/evaluate-timestamp-seconds-parameter.js +36 -0
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/manifest.json +6 -5
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/rename-unix-timestamp-parameters-transform.js +1 -108
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/timestamp-parameter-guards.d.ts +5 -0
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/timestamp-parameter-guards.js +74 -0
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/timestamp-seconds-reference.d.ts +3 -0
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/timestamp-seconds-reference.js +55 -0
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/unwrap-timestamp-nodes.d.ts +10 -0
- package/dist/transforms-by-id/rename-unix-timestamp-parameters/unwrap-timestamp-nodes.js +54 -0
- package/dist/transforms-by-id/rename-url-parameters/manifest.json +3 -2
- package/dist/transforms-by-id/rename-url-variables/manifest.json +3 -2
- package/dist/transforms-by-id/rename-use-reference-guards-v2/manifest.json +3 -2
- package/dist/transforms-by-id/rename-use-reference-sets/manifest.json +1 -0
- package/dist/transforms-by-id/rename-worker-handles/manifest.json +1 -0
- package/dist/transforms-by-id/rename-zod-check-parameters/manifest.json +3 -2
- package/dist/transforms-by-id/replace-dynamic-require-eval/manifest.json +1 -0
- package/dist/transforms-by-id/simplify-boolean-negations/manifest.json +3 -2
- package/dist/transforms-by-id/simplify-string-trim/manifest.json +1 -0
- package/dist/transforms-by-id/split-variable-declarations/is-safe-to-split-variable-declaration.js +8 -6
- package/dist/transforms-by-id/split-variable-declarations/manifest.json +6 -5
- package/dist/transforms-by-id/stabilize-deferred-stable-rhs/manifest.json +1 -0
- package/dist/transforms-by-id/stabilize-deferred-top-level-bindings/manifest.json +1 -0
- package/dist/transforms-by-id/stabilize-nested-bindings/manifest.json +3 -2
- package/dist/transforms-by-id/stabilize-top-level-bindings/manifest.json +1 -0
- package/dist/transforms-by-id/use-object-property-shorthand/manifest.json +3 -2
- package/dist/transforms-by-id/use-object-shorthand/manifest.json +3 -2
- package/dist/transforms-by-id/use-optional-chaining/manifest.json +1 -0
- package/package.json +3 -2
- package/dist/transforms/_generated/manifest.d.ts +0 -22
- package/dist/transforms/_generated/manifest.js +0 -510
- package/dist/transforms/_generated/registry.d.ts +0 -3
- package/dist/transforms/_generated/registry.js +0 -177
- package/dist/transforms/recommended-transform-order.d.ts +0 -7
- package/dist/transforms/recommended-transform-order.js +0 -104
- package/dist/transforms/transform-presets.d.ts +0 -3
- package/dist/transforms/transform-presets.js +0 -4
- package/dist/transforms/transform-registry.d.ts +0 -1
- package/dist/transforms/transform-registry.js +0 -1
- package/dist/transforms-by-id/rename-range-parameters/get-first-non-directive-statement.d.ts +0 -2
- package/dist/transforms-by-id/rename-range-parameters/get-first-non-directive-statement.js +0 -16
- package/dist/transforms-by-id/rename-range-parameters/has-count-non-positive-guard.d.ts +0 -3
- package/dist/transforms-by-id/rename-range-parameters/has-count-non-positive-guard.js +0 -49
package/dist/cli/config.d.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import type { Transform } from "../core/types.js";
|
|
2
|
-
type TransformSummary
|
|
3
|
-
id: string;
|
|
4
|
-
description: string;
|
|
5
|
-
scope: Transform["scope"];
|
|
6
|
-
parallelizable: boolean;
|
|
7
|
-
};
|
|
2
|
+
import { type TransformSummary } from "../transforms/transform-catalog.js";
|
|
8
3
|
export declare const getTransformSummaries: () => TransformSummary[];
|
|
9
4
|
type GetTransformsResult = {
|
|
10
5
|
ok: true;
|
package/dist/cli/config.js
CHANGED
|
@@ -1,85 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { allTransformIds, transformRegistry, } from "../transforms/transform-registry.js";
|
|
1
|
+
import { expandTransformSelectors, listTransformSummaries, resolveTransformsByIds, } from "../transforms/transform-catalog.js";
|
|
3
2
|
export const getTransformSummaries = () => {
|
|
4
|
-
|
|
5
|
-
for (const id of allTransformIds) {
|
|
6
|
-
const transform = transformRegistry[id];
|
|
7
|
-
if (!transform)
|
|
8
|
-
continue;
|
|
9
|
-
summaries.push({
|
|
10
|
-
id,
|
|
11
|
-
description: transform.description,
|
|
12
|
-
scope: transform.scope,
|
|
13
|
-
parallelizable: transform.parallelizable,
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
return summaries;
|
|
17
|
-
};
|
|
18
|
-
const getTransformsForPreset = (preset) => {
|
|
19
|
-
if (preset === "recommended" || preset === "default") {
|
|
20
|
-
return [...transformPresets.recommended];
|
|
21
|
-
}
|
|
22
|
-
if (preset === "all") {
|
|
23
|
-
return [...allTransformIds];
|
|
24
|
-
}
|
|
25
|
-
return;
|
|
3
|
+
return listTransformSummaries();
|
|
26
4
|
};
|
|
27
5
|
export const getTransformsToRun = (transformList) => {
|
|
28
6
|
// undefined = run recommended transforms (default behavior)
|
|
29
7
|
if (transformList === undefined) {
|
|
30
|
-
const requestedIds =
|
|
31
|
-
|
|
8
|
+
const requestedIds = expandTransformSelectors({
|
|
9
|
+
value: transformList,
|
|
10
|
+
defaultPreset: "recommended",
|
|
11
|
+
});
|
|
12
|
+
if (requestedIds.length === 0) {
|
|
32
13
|
return { ok: false, error: "No recommended transforms are configured." };
|
|
33
14
|
}
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
if (!
|
|
38
|
-
return { ok: false, error:
|
|
39
|
-
|
|
15
|
+
const resolveResult = resolveTransformsByIds(requestedIds);
|
|
16
|
+
if (!resolveResult.ok) {
|
|
17
|
+
const unknownTransformId = resolveResult.unknownTransformIds[0];
|
|
18
|
+
if (!unknownTransformId) {
|
|
19
|
+
return { ok: false, error: "Unknown transform: <missing-id>" };
|
|
20
|
+
}
|
|
21
|
+
return { ok: false, error: `Unknown transform: ${unknownTransformId}` };
|
|
40
22
|
}
|
|
41
|
-
return { ok: true, transforms };
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const expandedIds = [];
|
|
50
|
-
const unknownIds = [];
|
|
51
|
-
for (const id of requestedIds) {
|
|
52
|
-
if (!id || id === "none")
|
|
53
|
-
continue;
|
|
54
|
-
const presetTransforms = getTransformsForPreset(id);
|
|
55
|
-
if (presetTransforms) {
|
|
56
|
-
expandedIds.push(...presetTransforms);
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
expandedIds.push(id);
|
|
60
|
-
}
|
|
61
|
-
const uniqueIds = [];
|
|
62
|
-
const seen = new Set();
|
|
63
|
-
for (const id of expandedIds) {
|
|
64
|
-
if (seen.has(id))
|
|
65
|
-
continue;
|
|
66
|
-
seen.add(id);
|
|
67
|
-
uniqueIds.push(id);
|
|
68
|
-
}
|
|
69
|
-
const transforms = [];
|
|
70
|
-
for (const id of uniqueIds) {
|
|
71
|
-
const transform = transformRegistry[id];
|
|
72
|
-
if (!transform) {
|
|
73
|
-
unknownIds.push(id);
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
transforms.push(transform);
|
|
77
|
-
}
|
|
78
|
-
if (unknownIds.length > 0) {
|
|
23
|
+
return { ok: true, transforms: resolveResult.transforms };
|
|
24
|
+
}
|
|
25
|
+
const requestedIds = expandTransformSelectors({
|
|
26
|
+
value: transformList,
|
|
27
|
+
defaultPreset: "none",
|
|
28
|
+
});
|
|
29
|
+
const resolveResult = resolveTransformsByIds(requestedIds);
|
|
30
|
+
if (!resolveResult.ok) {
|
|
79
31
|
return {
|
|
80
32
|
ok: false,
|
|
81
|
-
error: `Unknown transform(s): ${
|
|
33
|
+
error: `Unknown transform(s): ${resolveResult.unknownTransformIds.join(", ")}. Use --list-transforms to see available transforms.`,
|
|
82
34
|
};
|
|
83
35
|
}
|
|
84
|
-
return { ok: true, transforms };
|
|
36
|
+
return { ok: true, transforms: resolveResult.transforms };
|
|
85
37
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ export type { Transform, TransformContext, TransformScope, ProjectGraph, SourceF
|
|
|
2
2
|
export { appPaths } from "./core/paths.js";
|
|
3
3
|
export type { AppPaths } from "./core/paths.js";
|
|
4
4
|
export { buildProjectGraph } from "./core/project-graph.js";
|
|
5
|
-
export { allTransformIds, transformRegistry, } from "./transforms/transform-
|
|
5
|
+
export { allTransformIds, transformRegistry, } from "./transforms/transform-catalog.js";
|
|
6
6
|
export { runTransforms } from "./cli/runner.js";
|
|
7
7
|
export type { RunnerOptions, RunnerResult } from "./cli/runner.js";
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
export { appPaths } from "./core/paths.js";
|
|
3
3
|
export { buildProjectGraph } from "./core/project-graph.js";
|
|
4
4
|
// Transform registry
|
|
5
|
-
export { allTransformIds, transformRegistry, } from "./transforms/transform-
|
|
5
|
+
export { allTransformIds, transformRegistry, } from "./transforms/transform-catalog.js";
|
|
6
6
|
// Runner (for programmatic use)
|
|
7
7
|
export { runTransforms } from "./cli/runner.js";
|
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
import type { SnapshotIssue } from "./check-snapshots.js";
|
|
2
|
-
type MissingManifestEntry = {
|
|
3
|
-
transformId: string;
|
|
4
|
-
path: string;
|
|
5
|
-
};
|
|
6
2
|
type CheckExpectedEvaluationsResult = {
|
|
7
3
|
transformIds: string[];
|
|
8
|
-
missingManifestEntries: MissingManifestEntry[];
|
|
9
4
|
snapshotIssues: SnapshotIssue[];
|
|
10
5
|
allPresent: boolean;
|
|
11
6
|
};
|
|
12
7
|
type CheckExpectedEvaluationsOptions = {
|
|
13
|
-
transformsDirectory: string;
|
|
14
8
|
testCasesDirectory: string;
|
|
15
9
|
};
|
|
16
10
|
export declare const checkExpectedEvaluations: (options: CheckExpectedEvaluationsOptions) => Promise<CheckExpectedEvaluationsResult>;
|
|
@@ -1,37 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { allTransformIds } from "../../transforms/transform-registry.js";
|
|
4
|
-
import { transformRegistry } from "../../transforms/transform-registry.js";
|
|
5
|
-
import { transformPresets } from "../../transforms/transform-presets.js";
|
|
1
|
+
import { allTransformIds } from "../../transforms/transform-catalog.js";
|
|
6
2
|
import { checkAllSnapshots } from "./check-snapshots.js";
|
|
7
3
|
export const checkExpectedEvaluations = async (options) => {
|
|
8
|
-
const {
|
|
9
|
-
const transformIds = allTransformIds
|
|
10
|
-
const missingManifestEntries = [];
|
|
11
|
-
// Check that each transform has a manifest.json file
|
|
12
|
-
for (const transformId of transformIds) {
|
|
13
|
-
const manifestPath = path.join(transformsDirectory, transformId, "manifest.json");
|
|
14
|
-
try {
|
|
15
|
-
await fs.access(manifestPath);
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
missingManifestEntries.push({
|
|
19
|
-
transformId,
|
|
20
|
-
path: manifestPath,
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
}
|
|
4
|
+
const { testCasesDirectory } = options;
|
|
5
|
+
const transformIds = [...allTransformIds];
|
|
24
6
|
// Check test-cases matrix with smart snapshot detection
|
|
25
7
|
const snapshotIssues = await checkAllSnapshots({
|
|
26
8
|
testCasesDirectory,
|
|
27
9
|
transformIds,
|
|
28
|
-
transformRegistry,
|
|
29
|
-
recommendedTransformIds: transformPresets.recommended,
|
|
30
10
|
});
|
|
31
|
-
const allPresent =
|
|
11
|
+
const allPresent = snapshotIssues.length === 0;
|
|
32
12
|
return {
|
|
33
13
|
transformIds,
|
|
34
|
-
missingManifestEntries,
|
|
35
14
|
snapshotIssues,
|
|
36
15
|
allPresent,
|
|
37
16
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Transform } from "../../core/types.js";
|
|
2
1
|
export type SnapshotIssue = {
|
|
3
2
|
transformId: string;
|
|
4
3
|
testCase: string;
|
|
@@ -8,8 +7,6 @@ export type SnapshotIssue = {
|
|
|
8
7
|
type CheckAllSnapshotsOptions = {
|
|
9
8
|
testCasesDirectory: string;
|
|
10
9
|
transformIds: string[];
|
|
11
|
-
transformRegistry: Record<string, Transform>;
|
|
12
|
-
recommendedTransformIds: string[];
|
|
13
10
|
};
|
|
14
11
|
export declare const checkAllSnapshots: (options: CheckAllSnapshotsOptions) => Promise<SnapshotIssue[]>;
|
|
15
12
|
export {};
|
|
@@ -2,6 +2,7 @@ import * as fs from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import * as prettier from "prettier";
|
|
4
4
|
import { normalizeCode } from "../../core/normalize-code.js";
|
|
5
|
+
import { getRecommendedTransforms, getTransformById, } from "../../transforms/transform-catalog.js";
|
|
5
6
|
import { transformContent } from "./transform-content.js";
|
|
6
7
|
import { checkRecommendedSnapshot } from "./check-recommended-snapshot.js";
|
|
7
8
|
const formatCode = async (code) => {
|
|
@@ -86,13 +87,10 @@ const getTestCaseNames = async (testCasesDirectory) => {
|
|
|
86
87
|
return testCaseNames.toSorted();
|
|
87
88
|
};
|
|
88
89
|
export const checkAllSnapshots = async (options) => {
|
|
89
|
-
const { testCasesDirectory, transformIds
|
|
90
|
+
const { testCasesDirectory, transformIds } = options;
|
|
90
91
|
const snapshotIssues = [];
|
|
91
92
|
const testCaseNames = await getTestCaseNames(testCasesDirectory);
|
|
92
|
-
|
|
93
|
-
const recommendedTransforms = recommendedTransformIds
|
|
94
|
-
.map((id) => transformRegistry[id])
|
|
95
|
-
.filter((t) => t !== undefined);
|
|
93
|
+
const recommendedTransforms = getRecommendedTransforms();
|
|
96
94
|
for (const testCaseName of testCaseNames) {
|
|
97
95
|
const basePath = path.join(testCasesDirectory, testCaseName, "base.js");
|
|
98
96
|
const baseContent = await fs.readFile(basePath, "utf8");
|
|
@@ -107,7 +105,7 @@ export const checkAllSnapshots = async (options) => {
|
|
|
107
105
|
snapshotPath,
|
|
108
106
|
transformId,
|
|
109
107
|
testCaseName,
|
|
110
|
-
transform:
|
|
108
|
+
transform: getTransformById(transformId),
|
|
111
109
|
});
|
|
112
110
|
if (issue) {
|
|
113
111
|
snapshotIssues.push(issue);
|
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
|
+
import { getTransformSelectionSlugSource } from "../../transforms/transform-catalog.js";
|
|
2
3
|
import { sanitizeFileComponent } from "./sanitize.js";
|
|
3
|
-
const isSameOrderedList = (a, b) => {
|
|
4
|
-
if (a.length !== b.length)
|
|
5
|
-
return false;
|
|
6
|
-
for (const [index, value] of a.entries()) {
|
|
7
|
-
const other = b[index];
|
|
8
|
-
if (other === undefined)
|
|
9
|
-
return false;
|
|
10
|
-
if (value !== other)
|
|
11
|
-
return false;
|
|
12
|
-
}
|
|
13
|
-
return true;
|
|
14
|
-
};
|
|
15
4
|
const createRawTransformSlug = (options) => {
|
|
16
|
-
|
|
17
|
-
if (transforms.length === 0)
|
|
18
|
-
return "none";
|
|
19
|
-
if (isSameOrderedList(transforms, recommendedTransforms))
|
|
20
|
-
return "recommended";
|
|
21
|
-
if (isSameOrderedList(transforms, allTransformIds))
|
|
22
|
-
return "all";
|
|
23
|
-
return transforms.join("-");
|
|
5
|
+
return getTransformSelectionSlugSource(options.transforms);
|
|
24
6
|
};
|
|
25
7
|
export const createOutputSlug = (options) => {
|
|
26
8
|
const sanitized = sanitizeFileComponent(createRawTransformSlug(options));
|
|
@@ -1,36 +1,11 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {
|
|
3
|
-
import { allTransformIds } from "../../transforms/transform-registry.js";
|
|
2
|
+
import { expandTransformSelectors } from "../../transforms/transform-catalog.js";
|
|
4
3
|
import { createOutputSlug } from "./create-output-slug.js";
|
|
5
4
|
const parseTransformList = (value) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
.map((id) => id.trim())
|
|
11
|
-
.filter(Boolean)
|
|
12
|
-
.filter((id) => id !== "none");
|
|
13
|
-
const expandedIds = [];
|
|
14
|
-
for (const id of ids) {
|
|
15
|
-
if (id === "recommended" || id === "default") {
|
|
16
|
-
expandedIds.push(...transformPresets.recommended);
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
if (id === "all") {
|
|
20
|
-
expandedIds.push(...allTransformIds);
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
expandedIds.push(id);
|
|
24
|
-
}
|
|
25
|
-
const uniqueIds = [];
|
|
26
|
-
const seen = new Set();
|
|
27
|
-
for (const id of expandedIds) {
|
|
28
|
-
if (seen.has(id))
|
|
29
|
-
continue;
|
|
30
|
-
seen.add(id);
|
|
31
|
-
uniqueIds.push(id);
|
|
32
|
-
}
|
|
33
|
-
return uniqueIds;
|
|
5
|
+
return expandTransformSelectors({
|
|
6
|
+
value,
|
|
7
|
+
defaultPreset: "none",
|
|
8
|
+
});
|
|
34
9
|
};
|
|
35
10
|
const containsPathSeparator = (value) => {
|
|
36
11
|
return value.includes("/") || value.includes("\\");
|
|
@@ -65,16 +40,8 @@ export const parseEvaluateCliOptions = (options) => {
|
|
|
65
40
|
const verbose = rawOptions.verbose ?? false;
|
|
66
41
|
const overwrite = rawOptions.overwrite ?? false;
|
|
67
42
|
const formatCode = rawOptions.formatCode;
|
|
68
|
-
const baselineSlug = createOutputSlug({
|
|
69
|
-
|
|
70
|
-
recommendedTransforms: transformPresets.recommended,
|
|
71
|
-
allTransformIds,
|
|
72
|
-
});
|
|
73
|
-
const testSlug = createOutputSlug({
|
|
74
|
-
transforms: testTransforms,
|
|
75
|
-
recommendedTransforms: transformPresets.recommended,
|
|
76
|
-
allTransformIds,
|
|
77
|
-
});
|
|
43
|
+
const baselineSlug = createOutputSlug({ transforms: baselineTransforms });
|
|
44
|
+
const testSlug = createOutputSlug({ transforms: testTransforms });
|
|
78
45
|
const sourcesDirectory = path.resolve(cwd, rawOptions.sources);
|
|
79
46
|
const evaluationDirectory = path.resolve(cwd, rawOptions.evaluationDir);
|
|
80
47
|
const transformsDirectory = path.resolve(cwd, "src/transforms-by-id");
|
|
@@ -1,29 +1,20 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { checkExpectedEvaluations } from "./check-expected-evaluations.js";
|
|
3
3
|
export const runCheckMode = async (options) => {
|
|
4
|
-
const {
|
|
4
|
+
const { rootDirectory, format } = options;
|
|
5
5
|
const checkResult = await checkExpectedEvaluations({
|
|
6
|
-
transformsDirectory,
|
|
7
6
|
testCasesDirectory: path.join(rootDirectory, "test-cases"),
|
|
8
7
|
});
|
|
9
8
|
if (format === "json") {
|
|
10
9
|
console.log(JSON.stringify(checkResult, undefined, 2));
|
|
11
10
|
}
|
|
12
11
|
else {
|
|
13
|
-
const allIssues =
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
})),
|
|
20
|
-
...checkResult.snapshotIssues.map((item) => ({
|
|
21
|
-
type: item.issue,
|
|
22
|
-
transformId: item.transformId,
|
|
23
|
-
testCase: item.testCase,
|
|
24
|
-
path: item.snapshotPath,
|
|
25
|
-
})),
|
|
26
|
-
];
|
|
12
|
+
const allIssues = checkResult.snapshotIssues.map((item) => ({
|
|
13
|
+
type: item.issue,
|
|
14
|
+
transformId: item.transformId,
|
|
15
|
+
testCase: item.testCase,
|
|
16
|
+
path: item.snapshotPath,
|
|
17
|
+
}));
|
|
27
18
|
if (allIssues.length > 0) {
|
|
28
19
|
console.log("type\ttransform_id\ttest_case\tpath");
|
|
29
20
|
for (const item of allIssues) {
|
|
@@ -32,27 +23,6 @@ export const runCheckMode = async (options) => {
|
|
|
32
23
|
}
|
|
33
24
|
}
|
|
34
25
|
let exitCode = 0;
|
|
35
|
-
if (checkResult.missingManifestEntries.length > 0) {
|
|
36
|
-
console.error(`\n[MISSING MANIFEST FILES] ${checkResult.missingManifestEntries.length} transform(s) missing manifest.json:`);
|
|
37
|
-
for (const item of checkResult.missingManifestEntries) {
|
|
38
|
-
console.error(` - ${item.transformId}`);
|
|
39
|
-
}
|
|
40
|
-
console.error(`\n To fix: Create a manifest.json file in each transform directory with the following structure:`);
|
|
41
|
-
console.error(` {`);
|
|
42
|
-
console.error(` "recommended": true,`);
|
|
43
|
-
console.error(` "notes": "Description of the transform's impact",`);
|
|
44
|
-
console.error(` "evaluations": {`);
|
|
45
|
-
console.error(` "source-v1.0.0:source-v1.0.1": {`);
|
|
46
|
-
console.error(` "diffSizePercent": 100,`);
|
|
47
|
-
console.error(` "evaluatedAt": "2026-01-25T00:00:00.000Z",`);
|
|
48
|
-
console.error(` "changedLines": 0,`);
|
|
49
|
-
console.error(` "durationSeconds": 0,`);
|
|
50
|
-
console.error(` "stableNames": 0`);
|
|
51
|
-
console.error(` }`);
|
|
52
|
-
console.error(` }`);
|
|
53
|
-
console.error(` }`);
|
|
54
|
-
exitCode = 1;
|
|
55
|
-
}
|
|
56
26
|
const missingSnapshots = checkResult.snapshotIssues.filter((issue) => issue.issue === "missing-required");
|
|
57
27
|
const unnecessarySnapshots = checkResult.snapshotIssues.filter((issue) => issue.issue === "unnecessary");
|
|
58
28
|
const outdatedSnapshots = checkResult.snapshotIssues.filter((issue) => issue.issue === "outdated");
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as fs from "node:fs/promises";
|
|
2
2
|
import packageJson from "../../../package.json" with { type: "json" };
|
|
3
|
-
import { transformPresets } from "../../transforms/transform-presets.js";
|
|
4
3
|
import { createEvaluateCommand } from "./create-evaluate-command.js";
|
|
5
4
|
import { parseEvaluateCliOptions, } from "./parse-evaluate-cli-options.js";
|
|
6
5
|
import { resolveEvaluateDependencies } from "./resolve-evaluate-dependencies.js";
|
|
@@ -36,7 +35,6 @@ export const runEvaluateCli = async (argv) => {
|
|
|
36
35
|
};
|
|
37
36
|
if (parsedOptions.checkMode) {
|
|
38
37
|
return runCheckMode({
|
|
39
|
-
transformsDirectory: parsedOptions.transformsDirectory,
|
|
40
38
|
rootDirectory: process.cwd(),
|
|
41
39
|
format: parsedOptions.format,
|
|
42
40
|
});
|
|
@@ -111,7 +109,6 @@ export const runEvaluateCli = async (argv) => {
|
|
|
111
109
|
baselineTransforms: parsedOptions.baselineTransforms,
|
|
112
110
|
testTransforms: parsedOptions.testTransforms,
|
|
113
111
|
diffSizeRatios: results.map((r) => r.diffSizeRatio),
|
|
114
|
-
recommendedTransformIds: transformPresets.recommended,
|
|
115
112
|
transformChangedLines: results.map((r) => r.transformChangedLines),
|
|
116
113
|
evaluatedPairs: results.map((r) => r.pair),
|
|
117
114
|
durationSeconds: results.map((r) => r.durationSeconds),
|
|
@@ -9,7 +9,6 @@ type UpdateTransformManifestOptions = {
|
|
|
9
9
|
testTransforms: string[];
|
|
10
10
|
/** Diff size ratios (test/baseline) per evaluation pair. */
|
|
11
11
|
diffSizeRatios: number[];
|
|
12
|
-
recommendedTransformIds: string[];
|
|
13
12
|
/** Changed lines per evaluation pair (added + removed). */
|
|
14
13
|
transformChangedLines?: (number | undefined)[];
|
|
15
14
|
/** Source pairs used in the evaluation. */
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import * as fs from "node:fs/promises";
|
|
2
1
|
import path from "node:path";
|
|
3
2
|
import { buildEvaluationStats } from "./build-evaluation-stats.js";
|
|
4
3
|
import { haveSameIds, normalizeTransformIds, uniqueIds, } from "./transform-id-set.js";
|
|
5
4
|
import { writeJsonFileAtomic } from "./write-text-file-atomic.js";
|
|
6
5
|
import presetStats from "../../transforms/preset-stats.json" with { type: "json" };
|
|
6
|
+
import { getTransformCatalogEntry, recommendedTransformIds, } from "../../transforms/transform-catalog.js";
|
|
7
7
|
const average = (values) => {
|
|
8
8
|
if (values.length === 0)
|
|
9
9
|
return 0;
|
|
@@ -13,20 +13,8 @@ const average = (values) => {
|
|
|
13
13
|
}
|
|
14
14
|
return total / values.length;
|
|
15
15
|
};
|
|
16
|
-
const loadManifest = async (manifestPath) => {
|
|
17
|
-
try {
|
|
18
|
-
const content = await fs.readFile(manifestPath, "utf8");
|
|
19
|
-
return JSON.parse(content);
|
|
20
|
-
}
|
|
21
|
-
catch (error) {
|
|
22
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
23
|
-
return undefined;
|
|
24
|
-
}
|
|
25
|
-
throw error;
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
16
|
export const updateTransformManifestFromEvaluation = async (options) => {
|
|
29
|
-
const { transformsDirectory, presetStatsPath, baselineTransforms, testTransforms, diffSizeRatios,
|
|
17
|
+
const { transformsDirectory, presetStatsPath, baselineTransforms, testTransforms, diffSizeRatios, transformChangedLines, evaluatedPairs, durationSeconds, stableNames, } = options;
|
|
30
18
|
const baselineIds = normalizeTransformIds(baselineTransforms);
|
|
31
19
|
const testIds = normalizeTransformIds(testTransforms);
|
|
32
20
|
const isBaselineNone = baselineIds.length === 0 ||
|
|
@@ -38,8 +26,8 @@ export const updateTransformManifestFromEvaluation = async (options) => {
|
|
|
38
26
|
const transformId = testIds[0];
|
|
39
27
|
if (transformId) {
|
|
40
28
|
const manifestPath = path.join(transformsDirectory, transformId, "manifest.json");
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
29
|
+
const catalogEntry = getTransformCatalogEntry(transformId);
|
|
30
|
+
if (catalogEntry) {
|
|
43
31
|
const newEvaluations = buildEvaluationStats({
|
|
44
32
|
evaluatedPairs,
|
|
45
33
|
diffSizeRatios,
|
|
@@ -48,14 +36,16 @@ export const updateTransformManifestFromEvaluation = async (options) => {
|
|
|
48
36
|
stableNames,
|
|
49
37
|
});
|
|
50
38
|
const mergedEvaluations = {
|
|
51
|
-
...manifest.evaluations,
|
|
39
|
+
...catalogEntry.manifest.evaluations,
|
|
52
40
|
...newEvaluations,
|
|
53
41
|
};
|
|
54
|
-
const evaluationsChanged = JSON.stringify(manifest.evaluations) !==
|
|
42
|
+
const evaluationsChanged = JSON.stringify(catalogEntry.manifest.evaluations) !==
|
|
55
43
|
JSON.stringify(mergedEvaluations);
|
|
56
44
|
if (evaluationsChanged) {
|
|
57
|
-
|
|
58
|
-
|
|
45
|
+
await writeJsonFileAtomic(manifestPath, {
|
|
46
|
+
...catalogEntry.manifest,
|
|
47
|
+
evaluations: mergedEvaluations,
|
|
48
|
+
}, {
|
|
59
49
|
overwrite: true,
|
|
60
50
|
});
|
|
61
51
|
messages.push(`Updated ${transformId}/manifest.json`);
|
|
@@ -63,7 +53,7 @@ export const updateTransformManifestFromEvaluation = async (options) => {
|
|
|
63
53
|
}
|
|
64
54
|
}
|
|
65
55
|
else {
|
|
66
|
-
messages.push(`Skipping update for ${transformId}:
|
|
56
|
+
messages.push(`Skipping update for ${transformId}: transform ID is not in the registry.`);
|
|
67
57
|
}
|
|
68
58
|
}
|
|
69
59
|
}
|
|
@@ -2,24 +2,22 @@ import { createRequire } from "node:module";
|
|
|
2
2
|
import * as fs from "node:fs/promises";
|
|
3
3
|
import { buildProjectGraph } from "../../core/project-graph.js";
|
|
4
4
|
import { getDefaultTransformOptions } from "../../core/default-transform-options.js";
|
|
5
|
-
import {
|
|
6
|
-
import { transformRegistry } from "../../transforms/transform-registry.js";
|
|
5
|
+
import { expandTransformSelectors, resolveTransformsByIds, } from "../../transforms/transform-catalog.js";
|
|
7
6
|
import { formatCode } from "./format-code.js";
|
|
8
7
|
const require = createRequire(import.meta.url);
|
|
9
8
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
10
9
|
const generate = require("@babel/generator").default;
|
|
11
10
|
const runTransform = async (inputPath, transformId) => {
|
|
12
11
|
const content = await fs.readFile(inputPath, "utf8");
|
|
13
|
-
const transformIds =
|
|
14
|
-
|
|
15
|
-
:
|
|
16
|
-
const transforms = transformIds.map((id) => {
|
|
17
|
-
const transform = transformRegistry[id];
|
|
18
|
-
if (!transform) {
|
|
19
|
-
throw new Error(`Unknown transform: ${id}. Run 'miniread --list-transforms' to see available transforms.`);
|
|
20
|
-
}
|
|
21
|
-
return transform;
|
|
12
|
+
const transformIds = expandTransformSelectors({
|
|
13
|
+
value: transformId,
|
|
14
|
+
defaultPreset: "none",
|
|
22
15
|
});
|
|
16
|
+
const resolveResult = resolveTransformsByIds(transformIds);
|
|
17
|
+
if (!resolveResult.ok) {
|
|
18
|
+
throw new Error(`Unknown transform: ${resolveResult.unknownTransformIds.join(", ")}. Run 'miniread --list-transforms' to see available transforms.`);
|
|
19
|
+
}
|
|
20
|
+
const transforms = resolveResult.transforms;
|
|
23
21
|
const projectGraph = buildProjectGraph([{ path: inputPath, content }]);
|
|
24
22
|
const options = getDefaultTransformOptions();
|
|
25
23
|
for (const transform of transforms) {
|