spec-controller 0.1.0-alpha.9 → 0.1.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/README.md +18 -11
- package/dist/cli-allocate/cli.d.ts +2 -0
- package/dist/cli-allocate/cli.d.ts.map +1 -0
- package/dist/cli-allocate/cli.js +61 -0
- package/dist/cli-allocate/cli.js.map +1 -0
- package/dist/cli-allocate/readHistory.d.ts +14 -0
- package/dist/cli-allocate/readHistory.d.ts.map +1 -0
- package/dist/cli-allocate/readHistory.js +109 -0
- package/dist/cli-allocate/readHistory.js.map +1 -0
- package/dist/cli-allocate/readParts.d.ts +2 -0
- package/dist/cli-allocate/readParts.d.ts.map +1 -0
- package/dist/cli-allocate/readParts.js +23 -0
- package/dist/cli-allocate/readParts.js.map +1 -0
- package/dist/cli-allocate/readTree.d.ts +5 -0
- package/dist/cli-allocate/readTree.d.ts.map +1 -0
- package/dist/cli-allocate/readTree.js +74 -0
- package/dist/cli-allocate/readTree.js.map +1 -0
- package/dist/cli-allocate/refStore.d.ts +2 -0
- package/dist/cli-allocate/refStore.d.ts.map +1 -0
- package/dist/cli-allocate/refStore.js +35 -0
- package/dist/cli-allocate/refStore.js.map +1 -0
- package/dist/cli-allocate/request.d.ts +9 -0
- package/dist/cli-allocate/request.d.ts.map +1 -0
- package/dist/cli-allocate/request.js +23 -0
- package/dist/cli-allocate/request.js.map +1 -0
- package/dist/cli-allocate/stderr.d.ts +7 -0
- package/dist/cli-allocate/stderr.d.ts.map +1 -0
- package/dist/cli-allocate/stderr.js +32 -0
- package/dist/cli-allocate/stderr.js.map +1 -0
- package/dist/cli-allocate/unreadable.d.ts +13 -0
- package/dist/cli-allocate/unreadable.d.ts.map +1 -0
- package/dist/cli-allocate/unreadable.js +37 -0
- package/dist/cli-allocate/unreadable.js.map +1 -0
- package/dist/cli-args.d.ts +15 -70
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +167 -85
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-balance/cli.d.ts +1 -82
- package/dist/cli-balance/cli.d.ts.map +1 -1
- package/dist/cli-balance/cli.js +86 -397
- package/dist/cli-balance/cli.js.map +1 -1
- package/dist/cli-balance/emit/format.d.ts +18 -39
- package/dist/cli-balance/emit/format.d.ts.map +1 -1
- package/dist/cli-balance/emit/format.js +32 -63
- package/dist/cli-balance/emit/format.js.map +1 -1
- package/dist/cli-balance/emit/writer.d.ts +2 -34
- package/dist/cli-balance/emit/writer.d.ts.map +1 -1
- package/dist/cli-balance/emit/writer.js +62 -37
- package/dist/cli-balance/emit/writer.js.map +1 -1
- package/dist/cli-balance/exitStatus.d.ts +2 -0
- package/dist/cli-balance/exitStatus.d.ts.map +1 -0
- package/dist/cli-balance/exitStatus.js +5 -0
- package/dist/cli-balance/exitStatus.js.map +1 -0
- package/dist/cli-balance/inputsRead.d.ts +11 -0
- package/dist/cli-balance/inputsRead.d.ts.map +1 -0
- package/dist/cli-balance/inputsRead.js +54 -0
- package/dist/cli-balance/inputsRead.js.map +1 -0
- package/dist/cli-balance/reRender.d.ts +8 -0
- package/dist/cli-balance/reRender.d.ts.map +1 -0
- package/dist/cli-balance/reRender.js +21 -0
- package/dist/cli-balance/reRender.js.map +1 -0
- package/dist/cli-balance/unreadableInputs.d.ts +15 -0
- package/dist/cli-balance/unreadableInputs.d.ts.map +1 -0
- package/dist/cli-balance/unreadableInputs.js +100 -0
- package/dist/cli-balance/unreadableInputs.js.map +1 -0
- package/dist/cli-registry.d.ts +16 -71
- package/dist/cli-registry.d.ts.map +1 -1
- package/dist/cli-registry.js +71 -136
- package/dist/cli-registry.js.map +1 -1
- package/dist/cli.d.ts +0 -21
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -85
- package/dist/cli.js.map +1 -1
- package/dist/deferralTags.d.ts +0 -14
- package/dist/deferralTags.d.ts.map +1 -1
- package/dist/deferralTags.js +0 -14
- package/dist/deferralTags.js.map +1 -1
- package/dist/host.d.ts +10 -41
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +99 -50
- package/dist/host.js.map +1 -1
- package/dist/ingest/ciSourcePaths.d.ts +0 -39
- package/dist/ingest/ciSourcePaths.d.ts.map +1 -1
- package/dist/ingest/ciSourcePaths.js +1 -39
- package/dist/ingest/ciSourcePaths.js.map +1 -1
- package/dist/ingest/gherkinValidation.d.ts +0 -80
- package/dist/ingest/gherkinValidation.d.ts.map +1 -1
- package/dist/ingest/gherkinValidation.js +3 -82
- package/dist/ingest/gherkinValidation.js.map +1 -1
- package/dist/ingest/ingestQualityChecks.d.ts +8 -93
- package/dist/ingest/ingestQualityChecks.d.ts.map +1 -1
- package/dist/ingest/ingestQualityChecks.js +61 -224
- package/dist/ingest/ingestQualityChecks.js.map +1 -1
- package/dist/ingest/ingestScenarios.d.ts +0 -45
- package/dist/ingest/ingestScenarios.d.ts.map +1 -1
- package/dist/ingest/ingestScenarios.js +24 -110
- package/dist/ingest/ingestScenarios.js.map +1 -1
- package/dist/ingest/inputShapes.d.ts +16 -0
- package/dist/ingest/inputShapes.d.ts.map +1 -0
- package/dist/ingest/inputShapes.js +114 -0
- package/dist/ingest/inputShapes.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +93 -0
- package/dist/main.js.map +1 -0
- package/dist/messages.d.ts +223 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +319 -0
- package/dist/messages.js.map +1 -0
- package/dist/outputLocation.d.ts +23 -0
- package/dist/outputLocation.d.ts.map +1 -0
- package/dist/outputLocation.js +139 -0
- package/dist/outputLocation.js.map +1 -0
- package/dist/run-management/keptRun.d.ts +8 -109
- package/dist/run-management/keptRun.d.ts.map +1 -1
- package/dist/run-management/keptRun.js +49 -89
- package/dist/run-management/keptRun.js.map +1 -1
- package/dist/run-management/resolveRunInputs.d.ts +0 -67
- package/dist/run-management/resolveRunInputs.d.ts.map +1 -1
- package/dist/run-management/resolveRunInputs.js +13 -117
- package/dist/run-management/resolveRunInputs.js.map +1 -1
- package/dist/storedRun.d.ts +6 -0
- package/dist/storedRun.d.ts.map +1 -0
- package/dist/storedRun.js +27 -0
- package/dist/storedRun.js.map +1 -0
- package/package.json +2 -2
- package/dist/corpus/cli.d.ts +0 -34
- package/dist/corpus/cli.d.ts.map +0 -1
- package/dist/corpus/cli.js +0 -125
- package/dist/corpus/cli.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli-balance/cli.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli-balance/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,47 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The output PLAN — the pure app-layer parse+validate of the `--format <fmt>[:<path>]`
|
|
3
|
-
* grammar (the three-layer split). Given the raw
|
|
4
|
-
* `--format` specs (in argv order; empty when no flag was passed), `planOutput` returns
|
|
5
|
-
* either an `OutputPlan` — an ordered list of `{ fmt, dest }` outputs — or a typed error.
|
|
6
|
-
*
|
|
7
|
-
* PURE: no IO. The plan describes WHAT to emit and WHERE; the writer (`writer.ts`) is the
|
|
8
|
-
* only layer that performs the IO. This split lets `planOutput` be proven in isolation
|
|
9
|
-
* (`@unit`, no subprocess) while the writer's real stdout/file effect is the `@integration`
|
|
10
|
-
* arm — the anti-watermelon rule (each integration arm asserts the real IO, never a
|
|
11
|
-
* planOutput re-run).
|
|
12
|
-
*
|
|
13
|
-
* FMT-001 (`@SCN-FMT-001`) establishes the skeleton: no flag — and an explicit `md` —
|
|
14
|
-
* plan a single markdown output bound for stdout. Later sub-issues extend `planOutput`
|
|
15
|
-
* with json (FMT-002), file dests (`<fmt>:<path>`, FMT-002/003), the at-most-one-to-stdout
|
|
16
|
-
* invariant (FMT-005), the legacy-`--json` rejection (FMT-006), and unknown-format
|
|
17
|
-
* rejection (FMT-007) — each landing on the `OutputPlan` type + typed `PlanResult` error
|
|
18
|
-
* surface designed here.
|
|
19
|
-
*
|
|
20
|
-
* Parent: @SCN-FMT-001 — the output-dispatch rework.
|
|
21
|
-
*/
|
|
22
|
-
/** A supported output format. FMT-001 plans `md`; `json` is wired in FMT-002. */
|
|
23
1
|
export type OutputFormat = "md" | "json";
|
|
24
|
-
|
|
25
|
-
export type OutputDest = {
|
|
2
|
+
type OutputDest = {
|
|
26
3
|
readonly kind: "stdout";
|
|
27
4
|
} | {
|
|
28
5
|
readonly kind: "file";
|
|
29
6
|
readonly path: string;
|
|
30
7
|
};
|
|
31
|
-
/** One planned output: a format routed to a destination. */
|
|
32
8
|
export interface PlannedOutput {
|
|
33
9
|
readonly fmt: OutputFormat;
|
|
34
10
|
readonly dest: OutputDest;
|
|
35
11
|
}
|
|
36
|
-
/** The plan: the ordered outputs a single invocation will emit. */
|
|
37
12
|
export interface OutputPlan {
|
|
38
13
|
readonly outputs: readonly PlannedOutput[];
|
|
39
14
|
}
|
|
40
|
-
/**
|
|
41
|
-
* The result of planning — either the plan, or a typed error carrying the operator-facing
|
|
42
|
-
* message (later sub-issues raise these for the stdout-collision, legacy-flag, and
|
|
43
|
-
* unknown-format cases). A discriminated union so the CLI branches on `ok`.
|
|
44
|
-
*/
|
|
45
15
|
export type PlanResult = {
|
|
46
16
|
readonly ok: true;
|
|
47
17
|
readonly plan: OutputPlan;
|
|
@@ -49,12 +19,21 @@ export type PlanResult = {
|
|
|
49
19
|
readonly ok: false;
|
|
50
20
|
readonly error: string;
|
|
51
21
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
22
|
+
export declare function planOutput(formatSpecs: readonly string[], namesStdout: (path: string) => boolean): PlanResult;
|
|
23
|
+
export interface FileIdentity {
|
|
24
|
+
readonly dev: bigint;
|
|
25
|
+
readonly ino: bigint;
|
|
26
|
+
}
|
|
27
|
+
export interface IdentifiedOutput {
|
|
28
|
+
readonly output: PlannedOutput;
|
|
29
|
+
readonly identity: FileIdentity | undefined;
|
|
30
|
+
}
|
|
31
|
+
export declare function sharedFileRefusal(outputs: readonly IdentifiedOutput[]): string | undefined;
|
|
32
|
+
export interface IdentifiedInput {
|
|
33
|
+
readonly subject: string;
|
|
34
|
+
readonly path: string;
|
|
35
|
+
readonly identity: FileIdentity | undefined;
|
|
36
|
+
}
|
|
37
|
+
export declare function inputOverwriteRefusal(outputs: readonly IdentifiedOutput[], inputs: readonly IdentifiedInput[]): string | undefined;
|
|
38
|
+
export {};
|
|
60
39
|
//# sourceMappingURL=format.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/cli-balance/emit/format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/cli-balance/emit/format.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,CAAC;AAQzC,KAAK,UAAU,GACX;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;CAC5C;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,UAAU,CACxB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACrC,UAAU,CA6BZ;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;CAC7C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,GAAG,SAAS,CAS1F;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;CAC7C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,GAAG,SAAS,CASlI"}
|
|
@@ -1,90 +1,59 @@
|
|
|
1
|
-
|
|
2
|
-
* The output PLAN — the pure app-layer parse+validate of the `--format <fmt>[:<path>]`
|
|
3
|
-
* grammar (the three-layer split). Given the raw
|
|
4
|
-
* `--format` specs (in argv order; empty when no flag was passed), `planOutput` returns
|
|
5
|
-
* either an `OutputPlan` — an ordered list of `{ fmt, dest }` outputs — or a typed error.
|
|
6
|
-
*
|
|
7
|
-
* PURE: no IO. The plan describes WHAT to emit and WHERE; the writer (`writer.ts`) is the
|
|
8
|
-
* only layer that performs the IO. This split lets `planOutput` be proven in isolation
|
|
9
|
-
* (`@unit`, no subprocess) while the writer's real stdout/file effect is the `@integration`
|
|
10
|
-
* arm — the anti-watermelon rule (each integration arm asserts the real IO, never a
|
|
11
|
-
* planOutput re-run).
|
|
12
|
-
*
|
|
13
|
-
* FMT-001 (`@SCN-FMT-001`) establishes the skeleton: no flag — and an explicit `md` —
|
|
14
|
-
* plan a single markdown output bound for stdout. Later sub-issues extend `planOutput`
|
|
15
|
-
* with json (FMT-002), file dests (`<fmt>:<path>`, FMT-002/003), the at-most-one-to-stdout
|
|
16
|
-
* invariant (FMT-005), the legacy-`--json` rejection (FMT-006), and unknown-format
|
|
17
|
-
* rejection (FMT-007) — each landing on the `OutputPlan` type + typed `PlanResult` error
|
|
18
|
-
* surface designed here.
|
|
19
|
-
*
|
|
20
|
-
* Parent: @SCN-FMT-001 — the output-dispatch rework.
|
|
21
|
-
*/
|
|
22
|
-
/**
|
|
23
|
-
* The formats `planOutput` accepts; any other `--format` token is rejected (FMT-007 /
|
|
24
|
-
* @SCN-FMT-007). The single source of truth the unknown-format guard checks against AND
|
|
25
|
-
* lists in its hint, so a future format (html, sarif) is added in exactly one place.
|
|
26
|
-
*/
|
|
1
|
+
import { APP_MESSAGES, AppMessage } from "../../messages.js";
|
|
27
2
|
const SUPPORTED_FORMATS = ["md", "json"];
|
|
28
|
-
/** Runtime narrowing of a parsed `--format` token to a supported `OutputFormat`. */
|
|
29
3
|
function isSupportedFormat(fmt) {
|
|
30
4
|
return SUPPORTED_FORMATS.includes(fmt);
|
|
31
5
|
}
|
|
32
|
-
|
|
33
|
-
* Parse + validate the `--format` specs into an `OutputPlan` (or a typed error).
|
|
34
|
-
*
|
|
35
|
-
* FMT-001: no specs (no `--format` flag) defaults to a single `md`; an explicit `md`
|
|
36
|
-
* plans the same. Each planned output is markdown bound for stdout — the default human
|
|
37
|
-
* report, like vitest/cucumber.
|
|
38
|
-
*/
|
|
39
|
-
export function planOutput(formatSpecs) {
|
|
40
|
-
// No --format flag defaults to a single "md" spec — the default human report.
|
|
6
|
+
export function planOutput(formatSpecs, namesStdout) {
|
|
41
7
|
const specs = formatSpecs.length === 0 ? ["md"] : formatSpecs;
|
|
42
8
|
const outputs = specs.map((spec) => {
|
|
43
|
-
// Grammar: "<fmt>[:<path>]". Split on the FIRST colon — the fmt is everything before
|
|
44
|
-
// it; a ":<path>" tail routes that format to the file at <path> (FMT-002/003), where
|
|
45
|
-
// the path is everything after the first colon (so a path may itself contain colons).
|
|
46
|
-
// No colon keeps the bare-fmt → stdout default (FMT-001). The at-most-one-to-stdout /
|
|
47
|
-
// unknown-format validation (FMT-005/007) lands on this same parse and the typed
|
|
48
|
-
// PlanResult error surface.
|
|
49
9
|
const colon = spec.indexOf(":");
|
|
50
10
|
const fmt = (colon === -1 ? spec : spec.slice(0, colon));
|
|
51
11
|
const dest = colon === -1 ? { kind: "stdout" } : { kind: "file", path: spec.slice(colon + 1) };
|
|
52
12
|
return { fmt, dest };
|
|
53
13
|
});
|
|
54
|
-
// The unknown-format guard (FMT-007 / @SCN-FMT-007): a
|
|
55
|
-
// --format naming an unsupported format (e.g. `xml`, or a typo) is rejected fast on the
|
|
56
|
-
// shared typed PlanResult error surface (the same surface FMT-005/006 use) — rather than
|
|
57
|
-
// silently rendering as markdown (the writer's default render branch) and exiting 0. The
|
|
58
|
-
// error LISTS the supported formats so the operator knows what to use — basic public-CLI
|
|
59
|
-
// robustness. Checked BEFORE the stdout-collision count so an unroutable format is
|
|
60
|
-
// reported as such (an unknown format can't meaningfully collide on stdout).
|
|
61
14
|
const unknown = outputs.filter((o) => !isSupportedFormat(o.fmt));
|
|
62
15
|
if (unknown.length > 0) {
|
|
63
16
|
const bad = [...new Set(unknown.map((o) => o.fmt))].join(", ");
|
|
64
17
|
return {
|
|
65
18
|
ok: false,
|
|
66
|
-
error:
|
|
67
|
-
`(e.g. --format md, --format json:report.json).`,
|
|
19
|
+
error: APP_MESSAGES[AppMessage.UnknownFormat](bad, SUPPORTED_FORMATS.join(", ")),
|
|
68
20
|
};
|
|
69
21
|
}
|
|
70
|
-
|
|
71
|
-
// ONE output may route to stdout, so a captured stdout never carries two interleaved
|
|
72
|
-
// documents. This is a COUNT check on the stdout-destined outputs (≤ 1) — NOT a
|
|
73
|
-
// "distinct formats > 1" check — so `--format md --format md` (the same format twice,
|
|
74
|
-
// both stdout) is rejected just as `--format md --format json` is; a distinct-formats
|
|
75
|
-
// check would wrongly pass the former. Rejected with a typed error on the shared
|
|
76
|
-
// PlanResult surface (the same surface FMT-006/007 raise), carrying the hint to give one
|
|
77
|
-
// of the colliding outputs a `:<path>` so it writes to a file instead.
|
|
78
|
-
const stdoutBound = outputs.filter((o) => o.dest.kind === "stdout");
|
|
22
|
+
const stdoutBound = outputs.filter((o) => o.dest.kind === "stdout" || namesStdout(o.dest.path));
|
|
79
23
|
if (stdoutBound.length > 1) {
|
|
80
24
|
const fmts = stdoutBound.map((o) => o.fmt).join(", ");
|
|
81
25
|
return {
|
|
82
26
|
ok: false,
|
|
83
|
-
error:
|
|
84
|
-
`Give one of them a :<path> to write it to a file instead ` +
|
|
85
|
-
`(e.g. --format json:report.json).`,
|
|
27
|
+
error: APP_MESSAGES[AppMessage.MoreThanOneToStdout](fmts),
|
|
86
28
|
};
|
|
87
29
|
}
|
|
88
30
|
return { ok: true, plan: { outputs } };
|
|
89
31
|
}
|
|
32
|
+
export function sharedFileRefusal(outputs) {
|
|
33
|
+
const onFiles = outputs.filter((o) => o.identity !== undefined);
|
|
34
|
+
for (const [index, first] of onFiles.entries()) {
|
|
35
|
+
const second = onFiles.slice(index + 1).find((o) => sameFile(o.identity, first.identity));
|
|
36
|
+
if (second !== undefined) {
|
|
37
|
+
return APP_MESSAGES[AppMessage.OutputsShareFile](asGiven(first.output), asGiven(second.output));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
export function inputOverwriteRefusal(outputs, inputs) {
|
|
43
|
+
for (const { output, identity } of outputs) {
|
|
44
|
+
if (identity === undefined)
|
|
45
|
+
continue;
|
|
46
|
+
const read = inputs.find((input) => input.identity !== undefined && sameFile(input.identity, identity));
|
|
47
|
+
if (read !== undefined) {
|
|
48
|
+
return APP_MESSAGES[AppMessage.OutputOverwritesInput](asGiven(output), read.subject, read.path);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
function sameFile(a, b) {
|
|
54
|
+
return a.dev === b.dev && a.ino === b.ino;
|
|
55
|
+
}
|
|
56
|
+
function asGiven(output) {
|
|
57
|
+
return output.dest.kind === "stdout" ? APP_MESSAGES[AppMessage.FormatOnStandardOutput](output.fmt) : `${output.fmt}:${output.dest.path}`;
|
|
58
|
+
}
|
|
90
59
|
//# sourceMappingURL=format.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli-balance/emit/format.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli-balance/emit/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The output WRITER — the impure app-layer that realises an `OutputPlan` (the
|
|
3
|
-
* three-layer split). For each planned output it renders
|
|
4
|
-
* the payload via the PURE renderers (`renderMarkdown` / `renderJson` in `src/render/`)
|
|
5
|
-
* and performs the IO: stdout, or a file.
|
|
6
|
-
*
|
|
7
|
-
* This is the ONLY layer that performs IO — the renderers stay pure (`model → string`)
|
|
8
|
-
* and `planOutput` stays pure (parse+validate). So the writer carries the `@integration`
|
|
9
|
-
* evidence: its real stdout/file effect is asserted directly (the anti-watermelon rule),
|
|
10
|
-
* never a re-run of the `planOutput` `@unit`.
|
|
11
|
-
*
|
|
12
|
-
* FMT-001 (`@SCN-FMT-001`) writes markdown to stdout. The `json` format (FMT-002) and the
|
|
13
|
-
* file destination (FMT-002/003) are wired on the same `render` + `dest` switch below as
|
|
14
|
-
* later sub-issues plan them.
|
|
15
|
-
*
|
|
16
|
-
* Parent: @SCN-FMT-001 — the output-dispatch rework.
|
|
17
|
-
*/
|
|
18
1
|
import type { FeatureNames } from "@3f-consulting/spec-controller-core";
|
|
19
|
-
import type
|
|
2
|
+
import { type FileIdentity, type IdentifiedInput, type OutputPlan } from "./format.js";
|
|
20
3
|
import type { RunContext } from "@3f-consulting/spec-controller-core";
|
|
21
4
|
import type { EvidenceObligations } from "@3f-consulting/spec-controller-core";
|
|
22
5
|
import type { EvidenceReconciliation } from "@3f-consulting/spec-controller-core";
|
|
23
|
-
/**
|
|
24
|
-
* The reconciliation payloads the writer renders — the balance plus its sibling reads
|
|
25
|
-
* (ctx / evidenceObligations / featureNames), exactly the arguments the pure renderers take. Threaded
|
|
26
|
-
* from `cli.ts` (built once, rendered per planned output). `withRuntimeObservations` and
|
|
27
|
-
* `withStaticChecks` are the GATES for the two observation axes (Test volume + the evidence grid;
|
|
28
|
-
* the Static checks cut): the renderers fold BOTH off the Ledger themselves (3F-2103 / 3F-2118 —
|
|
29
|
-
* the parallel censuses are retired), so the writer threads only whether each axis is in play,
|
|
30
|
-
* never a census object.
|
|
31
|
-
*/
|
|
32
6
|
export interface OutputPayloads {
|
|
33
7
|
readonly balance: EvidenceReconciliation;
|
|
34
8
|
readonly ctx: RunContext;
|
|
35
9
|
readonly evidenceObligations?: EvidenceObligations;
|
|
36
|
-
readonly withRuntimeObservations?: boolean;
|
|
37
|
-
readonly withStaticChecks?: boolean;
|
|
38
10
|
readonly featureNames?: FeatureNames;
|
|
39
11
|
}
|
|
40
|
-
|
|
41
|
-
* Realise the plan: render each planned output and write it to its destination. The only
|
|
42
|
-
* IO in the pipeline. FMT-001 exercises the markdown→stdout path.
|
|
43
|
-
*/
|
|
44
|
-
export declare function writeOutputs(plan: OutputPlan, payloads: OutputPayloads): void;
|
|
12
|
+
export declare function writeOutputs(plan: OutputPlan, payloads: OutputPayloads, stdoutFile: () => FileIdentity | undefined, inputs: readonly IdentifiedInput[], ownRunDir?: string): void;
|
|
45
13
|
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/cli-balance/emit/writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/cli-balance/emit/writer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAA4C,KAAK,YAAY,EAAE,KAAK,eAAe,EAA4C,KAAK,UAAU,EAAsB,MAAM,aAAa,CAAC;AAC/L,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAKlF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IACnD,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;CACtC;AAQD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,cAAc,EACxB,UAAU,EAAE,MAAM,YAAY,GAAG,SAAS,EAC1C,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAKN"}
|
|
@@ -1,48 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
* The output WRITER — the impure app-layer that realises an `OutputPlan` (the
|
|
3
|
-
* three-layer split). For each planned output it renders
|
|
4
|
-
* the payload via the PURE renderers (`renderMarkdown` / `renderJson` in `src/render/`)
|
|
5
|
-
* and performs the IO: stdout, or a file.
|
|
6
|
-
*
|
|
7
|
-
* This is the ONLY layer that performs IO — the renderers stay pure (`model → string`)
|
|
8
|
-
* and `planOutput` stays pure (parse+validate). So the writer carries the `@integration`
|
|
9
|
-
* evidence: its real stdout/file effect is asserted directly (the anti-watermelon rule),
|
|
10
|
-
* never a re-run of the `planOutput` `@unit`.
|
|
11
|
-
*
|
|
12
|
-
* FMT-001 (`@SCN-FMT-001`) writes markdown to stdout. The `json` format (FMT-002) and the
|
|
13
|
-
* file destination (FMT-002/003) are wired on the same `render` + `dest` switch below as
|
|
14
|
-
* later sub-issues plan them.
|
|
15
|
-
*
|
|
16
|
-
* Parent: @SCN-FMT-001 — the output-dispatch rework.
|
|
17
|
-
*/
|
|
18
|
-
import { writeFileSync } from "node:fs";
|
|
1
|
+
import { unlinkSync, writeFileSync } from "node:fs";
|
|
19
2
|
import { renderMarkdown } from "@3f-consulting/spec-controller-core";
|
|
20
3
|
import { renderJson } from "@3f-consulting/spec-controller-core";
|
|
21
|
-
|
|
4
|
+
import { inputOverwriteRefusal, sharedFileRefusal } from "./format.js";
|
|
5
|
+
import { probeDestination, refuse, unwritableRefusal, writeOrRefuse } from "../../outputLocation.js";
|
|
6
|
+
import { APP_MESSAGES, AppMessage } from "../../messages.js";
|
|
7
|
+
import { earlierStoredRunDirOf } from "../../run-management/keptRun.js";
|
|
22
8
|
function render(fmt, p) {
|
|
23
|
-
// The axis gates moved onto the concept's factory (3F-2233) — by the time a payload reaches a
|
|
24
|
-
// renderer the totals are already folded, so there is nothing left here to switch on.
|
|
25
9
|
return fmt === "json"
|
|
26
10
|
? renderJson(p.balance, p.ctx, p.evidenceObligations, p.featureNames)
|
|
27
11
|
: renderMarkdown(p.balance, p.ctx, p.evidenceObligations, p.featureNames);
|
|
28
12
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
for (const output of
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
13
|
+
export function writeOutputs(plan, payloads, stdoutFile, inputs, ownRunDir) {
|
|
14
|
+
const emissions = plan.outputs.map((output) => ({ output, text: render(output.fmt, payloads) + "\n" }));
|
|
15
|
+
const refusal = vetDestinations(plan.outputs, stdoutFile, inputs) ?? earlierStoredRunRefusal(plan.outputs, ownRunDir);
|
|
16
|
+
if (refusal !== undefined)
|
|
17
|
+
refuse(refusal);
|
|
18
|
+
for (const { output, text } of emissions)
|
|
19
|
+
emit(output, text);
|
|
20
|
+
}
|
|
21
|
+
function vetDestinations(outputs, stdoutFile, inputs) {
|
|
22
|
+
const created = [];
|
|
23
|
+
try {
|
|
24
|
+
const identified = [];
|
|
25
|
+
for (const output of outputs) {
|
|
26
|
+
const probe = identify(output, stdoutFile, created);
|
|
27
|
+
if (typeof probe === "string")
|
|
28
|
+
return probe;
|
|
29
|
+
identified.push({ output, identity: probe });
|
|
45
30
|
}
|
|
31
|
+
return sharedFileRefusal(identified) ?? inputOverwriteRefusal(identified, inputs);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
for (const path of created)
|
|
35
|
+
unlinkSync(path);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function earlierStoredRunRefusal(outputs, ownRunDir) {
|
|
39
|
+
for (const { dest } of outputs) {
|
|
40
|
+
if (dest.kind === "stdout")
|
|
41
|
+
continue;
|
|
42
|
+
const runDir = earlierStoredRunDirOf(dest.path, ownRunDir);
|
|
43
|
+
if (runDir !== undefined)
|
|
44
|
+
return APP_MESSAGES[AppMessage.OutputOverwritesStoredRun](dest.path, runDir);
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
function identify(output, stdoutFile, created) {
|
|
49
|
+
const dest = output.dest;
|
|
50
|
+
if (dest.kind === "stdout")
|
|
51
|
+
return stdoutFile();
|
|
52
|
+
try {
|
|
53
|
+
const probed = probeDestination(dest.path);
|
|
54
|
+
if (probed.created !== undefined)
|
|
55
|
+
created.push(probed.created);
|
|
56
|
+
return probed.identity;
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return unwritableRefusal(refusalSubject(output), dest.path, err);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function refusalSubject(output) {
|
|
63
|
+
return APP_MESSAGES[AppMessage.ReportNotWritten](output.fmt);
|
|
64
|
+
}
|
|
65
|
+
function emit(output, text) {
|
|
66
|
+
const dest = output.dest;
|
|
67
|
+
if (dest.kind === "stdout") {
|
|
68
|
+
process.stdout.write(text);
|
|
69
|
+
return;
|
|
46
70
|
}
|
|
71
|
+
writeOrRefuse(refusalSubject(output), dest.path, () => writeFileSync(dest.path, text));
|
|
47
72
|
}
|
|
48
73
|
//# sourceMappingURL=writer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/cli-balance/emit/writer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/cli-balance/emit/writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAA0H,MAAM,aAAa,CAAC;AAI/L,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AASxE,SAAS,MAAM,CAAC,GAAiB,EAAE,CAAiB;IAClD,OAAO,GAAG,KAAK,MAAM;QACnB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,YAAY,CAAC;QACrE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAgB,EAChB,QAAwB,EACxB,UAA0C,EAC1C,MAAkC,EAClC,SAAkB;IAElB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IACxG,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACtH,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3C,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS;QAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,eAAe,CACtB,OAAiC,EACjC,UAA0C,EAC1C,MAAkC;IAElC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,UAAU,GAAuB,EAAE,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5C,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,iBAAiB,CAAC,UAAU,CAAC,IAAI,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,IAAI,IAAI,OAAO;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAiC,EAAE,SAA6B;IAC/F,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACrC,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3D,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,YAAY,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,MAAqB,EAAE,UAA0C,EAAE,OAAiB;IACpG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,UAAU,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,iBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAqB;IAC3C,OAAO,YAAY,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,IAAI,CAAC,MAAqB,EAAE,IAAY;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exitStatus.d.ts","sourceRoot":"","sources":["../../src/cli-balance/exitStatus.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAEjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exitStatus.js","sourceRoot":"","sources":["../../src/cli-balance/exitStatus.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAE3D,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,QAAiB;IACvD,OAAO,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ReadInput } from "../outputLocation.js";
|
|
2
|
+
import type { IdentifiedInput } from "./emit/format.js";
|
|
3
|
+
export interface InputReader {
|
|
4
|
+
exists(path: string): boolean;
|
|
5
|
+
featureFiles(dir: string): string[];
|
|
6
|
+
workflowFiles(path: string): string[];
|
|
7
|
+
}
|
|
8
|
+
export declare const NODE_INPUT_READER: InputReader;
|
|
9
|
+
export declare function inputsReadBy(args: Record<string, string>, reader: InputReader): ReadInput[];
|
|
10
|
+
export declare function identifiedInputs(inputs: readonly ReadInput[]): IdentifiedInput[];
|
|
11
|
+
//# sourceMappingURL=inputsRead.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputsRead.d.ts","sourceRoot":"","sources":["../../src/cli-balance/inputsRead.ts"],"names":[],"mappings":"AAKA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKxD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACvC;AAED,eAAO,MAAM,iBAAiB,EAAE,WAmB/B,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,CAG3F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,eAAe,EAAE,CAEhF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { ciSourcePathsOf } from "../ingest/ciSourcePaths.js";
|
|
4
|
+
import { DEFAULT_CI_PATH } from "../ingest/ingestQualityChecks.js";
|
|
5
|
+
import { APP_MESSAGES, AppMessage } from "../messages.js";
|
|
6
|
+
import { regularFileIdentity } from "../outputLocation.js";
|
|
7
|
+
import { jsonInputsOf } from "./unreadableInputs.js";
|
|
8
|
+
const DEFAULT_FEATURES_DIR = "features";
|
|
9
|
+
export const NODE_INPUT_READER = {
|
|
10
|
+
exists: existsSync,
|
|
11
|
+
featureFiles: (dir) => {
|
|
12
|
+
try {
|
|
13
|
+
return readdirSync(dir)
|
|
14
|
+
.filter((name) => name.endsWith(".feature"))
|
|
15
|
+
.sort()
|
|
16
|
+
.map((name) => join(dir, name));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
workflowFiles: (path) => {
|
|
23
|
+
try {
|
|
24
|
+
return ciSourcePathsOf(path);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
export function inputsReadBy(args, reader) {
|
|
32
|
+
const reports = jsonInputsOf(args, reader.exists).map(({ subject, path }) => ({ subject: lowerFirst(subject), path }));
|
|
33
|
+
return [...reports, ...featureInputs(args["features"], reader), ...workflowInputs(args["ci"], reader)];
|
|
34
|
+
}
|
|
35
|
+
export function identifiedInputs(inputs) {
|
|
36
|
+
return inputs.map((input) => ({ ...input, identity: regularFileIdentity(input.path) }));
|
|
37
|
+
}
|
|
38
|
+
function featureInputs(dir, reader) {
|
|
39
|
+
const subject = APP_MESSAGES[dir === undefined ? AppMessage.DefaultCorpusFeatureFile : AppMessage.FlaggedCorpusFeatureFile]();
|
|
40
|
+
return reader.featureFiles(dir ?? DEFAULT_FEATURES_DIR).map((path) => ({ subject, path }));
|
|
41
|
+
}
|
|
42
|
+
function workflowInputs(ci, reader) {
|
|
43
|
+
const files = reader.workflowFiles(ci ?? DEFAULT_CI_PATH);
|
|
44
|
+
return files.map((path) => ({ subject: workflowSubject(ci, path), path }));
|
|
45
|
+
}
|
|
46
|
+
function workflowSubject(ci, path) {
|
|
47
|
+
if (ci === undefined)
|
|
48
|
+
return APP_MESSAGES[AppMessage.DefaultCiWorkflow]();
|
|
49
|
+
return APP_MESSAGES[path === ci ? AppMessage.FlaggedCiWorkflow : AppMessage.FlaggedCiFolderWorkflow]();
|
|
50
|
+
}
|
|
51
|
+
function lowerFirst(text) {
|
|
52
|
+
return text.charAt(0).toLowerCase() + text.slice(1);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=inputsRead.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputsRead.js","sourceRoot":"","sources":["../../src/cli-balance/inputsRead.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { VerdictCode } from "@3f-consulting/spec-controller-core";
|
|
2
|
+
export interface ReRendered {
|
|
3
|
+
readonly markdown: string;
|
|
4
|
+
readonly code: VerdictCode;
|
|
5
|
+
}
|
|
6
|
+
export declare function reRender(savedJson: string, strictGiven: boolean): ReRendered;
|
|
7
|
+
export declare function checkReRenderFlags(args: Record<string, string>): string | null;
|
|
8
|
+
//# sourceMappingURL=reRender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reRender.d.ts","sourceRoot":"","sources":["../../src/cli-balance/reRender.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAGpF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC5B;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,UAAU,CAQ5E;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAK9E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { renderReport, verdictCode } from "@3f-consulting/spec-controller-core";
|
|
2
|
+
import { APP_MESSAGES, AppMessage } from "../messages.js";
|
|
3
|
+
export function reRender(savedJson, strictGiven) {
|
|
4
|
+
const saved = JSON.parse(savedJson);
|
|
5
|
+
const strict = saved.runProvenance.strict === true || strictGiven;
|
|
6
|
+
const report = { ...saved, runProvenance: { ...saved.runProvenance, strict } };
|
|
7
|
+
return {
|
|
8
|
+
markdown: renderReport(report),
|
|
9
|
+
code: verdictCode({ ledger: report.ledger, scenarioCodeErrors: report.scenarioCodeErrors, strict }),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const READ_BY_A_RE_RENDER = new Set(["render-from-json", "strict", "exit-zero"]);
|
|
13
|
+
export function checkReRenderFlags(args) {
|
|
14
|
+
if (args["render-from-json"] === undefined)
|
|
15
|
+
return null;
|
|
16
|
+
const ignored = Object.keys(args).find((key) => !READ_BY_A_RE_RENDER.has(key));
|
|
17
|
+
if (ignored === undefined)
|
|
18
|
+
return null;
|
|
19
|
+
return APP_MESSAGES[AppMessage.ReRenderReadsOnly](`--${ignored}`);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=reRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reRender.js","sourceRoot":"","sources":["../../src/cli-balance/reRender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEhF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAO1D,MAAM,UAAU,QAAQ,CAAC,SAAiB,EAAE,WAAoB;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAgB,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,IAAI,IAAI,WAAW,CAAC;IAClE,MAAM,MAAM,GAAgB,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;IAC5F,OAAO;QACL,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC;QAC9B,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;KACpG,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAEtG,MAAM,UAAU,kBAAkB,CAAC,IAA4B;IAC7D,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,YAAY,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;AACpE,CAAC"}
|