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":"ingestQualityChecks.js","sourceRoot":"","sources":["../../src/ingest/ingestQualityChecks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ingestQualityChecks.js","sourceRoot":"","sources":["../../src/ingest/ingestQualityChecks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,53 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ingest the target's feature files — the IMPURE reader that walks features/ on disk
|
|
3
|
-
* and parses each file's feature code + scenario codes into DiscoveredFeature
|
|
4
|
-
* records (split out of the old spec/featureCodes.ts). The pure per-source
|
|
5
|
-
* parsers (extractFeatureCode / parseScenarioCodes) live here with their sole consumer;
|
|
6
|
-
* the `scnId → feature-code` grammar helper is engine-side (packages/core/src/lib/
|
|
7
|
-
* featureCode.ts); the duplicate-code lint is engine-side too since 3F-3313, as @SCN-STG-010 in
|
|
8
|
-
* parse/corpusFaults.ts, and no longer a private check under tests/checks/.
|
|
9
|
-
*
|
|
10
|
-
* The foundation, folded into the @LDG runtime spine.
|
|
11
|
-
*/
|
|
12
|
-
/** A feature file discovered on disk, with its `@<FFF>` header code (if any). */
|
|
13
1
|
export interface DiscoveredFeature {
|
|
14
|
-
/** The feature-file basename without the .feature extension. */
|
|
15
2
|
slug: string;
|
|
16
|
-
/** Absolute path to the feature file. */
|
|
17
3
|
path: string;
|
|
18
4
|
featureCode: string | null;
|
|
19
|
-
/** Every @SCN-<FFF>-<NNN> scenario code in the file, in order, duplicates kept. */
|
|
20
|
-
scenarioCodes: string[];
|
|
21
5
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Read the Feature-level @<FFF> header tag from a feature file's source — the
|
|
24
|
-
* first tag immediately preceding the `Feature:` keyword that is not an @SCN id
|
|
25
|
-
* or a recognised evidence/routing tag. Returns null if absent.
|
|
26
|
-
*/
|
|
27
6
|
export declare function extractFeatureCode(source: string): string | null;
|
|
28
|
-
/**
|
|
29
|
-
* Parse every @SCN-<FFF>-<NNN> scenario code in a feature file's source, in
|
|
30
|
-
* document order, duplicates preserved. Only genuine TAG LINES are scanned (a
|
|
31
|
-
* line whose first non-blank character is `@` and whose every whitespace-
|
|
32
|
-
* separated token is a tag) — prose that merely mentions a code is skipped.
|
|
33
|
-
*/
|
|
34
|
-
export declare function parseScenarioCodes(source: string): string[];
|
|
35
|
-
/**
|
|
36
|
-
* Discover every feature file on disk and its header code — REFUSING a corpus the Gherkin
|
|
37
|
-
* parser rejects (@SCN-GPG-001, 3F-2817).
|
|
38
|
-
*
|
|
39
|
-
* The refusal lives HERE, in the one reader every corpus consumer already goes through, so a
|
|
40
|
-
* consumer INHERITS it rather than restating it. It is not a second parser: it is the existing
|
|
41
|
-
* `parseErrorsIn` — cucumber's own — reached from the shared discovery instead of only from the
|
|
42
|
-
* balance CLI's edge. One answer to "what is a feature file".
|
|
43
|
-
*
|
|
44
|
-
* WHY THE WHOLE CORPUS, NOT THE FIRST BAD FILE. `featureCorpusParseErrors` reports every
|
|
45
|
-
* unreadable file and the balance CLI prints them all (@SCN-CLI-016). Refusing at the first
|
|
46
|
-
* failure would silently narrow that message, so every file is parsed and the refusal is raised
|
|
47
|
-
* once, carrying the lot in discovery order.
|
|
48
|
-
*
|
|
49
|
-
* And NO PARTIAL CORPUS is ever returned: a caller that could scan the readable half of a
|
|
50
|
-
* rejected tree would be back to reporting a verdict over a corpus it cannot read.
|
|
51
|
-
*/
|
|
52
7
|
export declare function discoverFeatures(dir?: string): DiscoveredFeature[];
|
|
53
8
|
//# sourceMappingURL=ingestScenarios.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingestScenarios.d.ts","sourceRoot":"","sources":["../../src/ingest/ingestScenarios.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ingestScenarios.d.ts","sourceRoot":"","sources":["../../src/ingest/ingestScenarios.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIhE;AAoCD,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,iBAAiB,EAAE,CAiBjF"}
|
|
@@ -1,105 +1,27 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ingest the target's feature files — the IMPURE reader that walks features/ on disk
|
|
3
|
-
* and parses each file's feature code + scenario codes into DiscoveredFeature
|
|
4
|
-
* records (split out of the old spec/featureCodes.ts). The pure per-source
|
|
5
|
-
* parsers (extractFeatureCode / parseScenarioCodes) live here with their sole consumer;
|
|
6
|
-
* the `scnId → feature-code` grammar helper is engine-side (packages/core/src/lib/
|
|
7
|
-
* featureCode.ts); the duplicate-code lint is engine-side too since 3F-3313, as @SCN-STG-010 in
|
|
8
|
-
* parse/corpusFaults.ts, and no longer a private check under tests/checks/.
|
|
9
|
-
*
|
|
10
|
-
* The foundation, folded into the @LDG runtime spine.
|
|
11
|
-
*/
|
|
12
1
|
import { readFileSync, readdirSync } from "node:fs";
|
|
13
|
-
import { join } from "node:path";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
14
3
|
import { MissingFeatureCorpusError, UnreadableFeatureCorpusError, parseErrorsIn, } from "./gherkinValidation.js";
|
|
15
|
-
/** A code is valid when it is 2–5 uppercase alphanumerics. */
|
|
16
4
|
const CODE_PATTERN = /^[A-Z0-9]{2,5}$/;
|
|
17
|
-
/**
|
|
18
|
-
* Read the Feature-level @<FFF> header tag from a feature file's source — the
|
|
19
|
-
* first tag immediately preceding the `Feature:` keyword that is not an @SCN id
|
|
20
|
-
* or a recognised evidence/routing tag. Returns null if absent.
|
|
21
|
-
*/
|
|
22
5
|
export function extractFeatureCode(source) {
|
|
23
6
|
const lines = source.split(/\r?\n/);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (line === "" || line.startsWith("#"))
|
|
27
|
-
continue;
|
|
28
|
-
if (line.startsWith("Feature:")) {
|
|
29
|
-
for (let j = i - 1; j >= 0; j--) {
|
|
30
|
-
const prev = lines[j].trim();
|
|
31
|
-
if (prev === "")
|
|
32
|
-
continue;
|
|
33
|
-
if (!prev.startsWith("@"))
|
|
34
|
-
break;
|
|
35
|
-
const tags = prev.split(/\s+/).filter((t) => t.startsWith("@"));
|
|
36
|
-
for (const tag of tags) {
|
|
37
|
-
const bare = tag.slice(1);
|
|
38
|
-
if (bare.startsWith("SCN-"))
|
|
39
|
-
continue;
|
|
40
|
-
if (["unit", "integration", "e2e", "performance", "smoke"].includes(bare))
|
|
41
|
-
continue;
|
|
42
|
-
if (CODE_PATTERN.test(bare))
|
|
43
|
-
return bare;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return null;
|
|
7
|
+
const featureLine = lines.findIndex((line) => line.trim().startsWith("Feature:"));
|
|
8
|
+
return headerTagsAbove(lines, featureLine).find((bare) => CODE_PATTERN.test(bare)) ?? null;
|
|
50
9
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
*/
|
|
57
|
-
export function parseScenarioCodes(source) {
|
|
58
|
-
const codes = [];
|
|
59
|
-
const codePattern = /^SCN-[A-Z0-9]+-\d+$/;
|
|
60
|
-
for (const rawLine of source.split(/\r?\n/)) {
|
|
61
|
-
const line = rawLine.trim();
|
|
62
|
-
if (!line.startsWith("@"))
|
|
63
|
-
continue;
|
|
64
|
-
const tokens = line.split(/\s+/);
|
|
65
|
-
if (!tokens.every((t) => t.startsWith("@")))
|
|
10
|
+
function headerTagsAbove(lines, featureLine) {
|
|
11
|
+
const tags = [];
|
|
12
|
+
for (let j = featureLine - 1; j >= 0; j--) {
|
|
13
|
+
const prev = lines[j].trim();
|
|
14
|
+
if (prev === "")
|
|
66
15
|
continue;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
codes.push(bare);
|
|
71
|
-
}
|
|
16
|
+
if (!prev.startsWith("@"))
|
|
17
|
+
break;
|
|
18
|
+
tags.push(...prev.split(/\s+/).filter((t) => t.startsWith("@")).map((t) => t.slice(1)));
|
|
72
19
|
}
|
|
73
|
-
return
|
|
20
|
+
return tags;
|
|
74
21
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Locate the default features/ directory — `./features` under the current
|
|
77
|
-
* working directory. This is the target repo's own features dir: the directory
|
|
78
|
-
* a user runs `spec-controller balance` from, and the workspace root when the
|
|
79
|
-
* feature-code lint runs in CI. Callers that reconcile a different tree pass an
|
|
80
|
-
* explicit `--features <dir>`, which overrides this default.
|
|
81
|
-
*/
|
|
82
22
|
function featuresDir() {
|
|
83
23
|
return join(process.cwd(), "features");
|
|
84
24
|
}
|
|
85
|
-
/**
|
|
86
|
-
* List the corpus directory, REFUSING an absent one by name rather than by `ENOENT` (@SCN-CLI-017,
|
|
87
|
-
* 3F-3345).
|
|
88
|
-
*
|
|
89
|
-
* Absence stays a REFUSAL AT THE READER — what changed is that it is typed, so a caller can decide.
|
|
90
|
-
* `balance` opts in to reporting on a target that has no corpus (most targets have no `features/`
|
|
91
|
-
* at all, and `new-client` is a supported adoption state); `tags` keeps refusing, unedited, because
|
|
92
|
-
* a `MissingFeatureCorpusError` is still an `Error` and still lands in its generic catch. Returning
|
|
93
|
-
* `[]` here instead would make that decision for both, and measured it turns two named refusals
|
|
94
|
-
* into `tags: OK …` at exit 0.
|
|
95
|
-
*
|
|
96
|
-
* ONLY `ENOENT`. A `features` path that exists but is a FILE, or one the process may not read, is
|
|
97
|
-
* a different fault and is not ours to reinterpret — it rethrows.
|
|
98
|
-
*
|
|
99
|
-
* A SUPPLIED `--features` never reaches here absent: `checkInputsExist` refuses it at the CLI edge
|
|
100
|
-
* with exit 2 (@SCN-CLI-002). Supplied-but-absent is the operator mistyping; absent-by-default is
|
|
101
|
-
* the target's honest shape.
|
|
102
|
-
*/
|
|
103
25
|
function corpusFileNames(dir) {
|
|
104
26
|
try {
|
|
105
27
|
return readdirSync(dir);
|
|
@@ -110,39 +32,31 @@ function corpusFileNames(dir) {
|
|
|
110
32
|
throw err;
|
|
111
33
|
}
|
|
112
34
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
* unreadable file and the balance CLI prints them all (@SCN-CLI-016). Refusing at the first
|
|
124
|
-
* failure would silently narrow that message, so every file is parsed and the refusal is raised
|
|
125
|
-
* once, carrying the lot in discovery order.
|
|
126
|
-
*
|
|
127
|
-
* And NO PARTIAL CORPUS is ever returned: a caller that could scan the readable half of a
|
|
128
|
-
* rejected tree would be back to reporting a verdict over a corpus it cannot read.
|
|
129
|
-
*/
|
|
35
|
+
function readFeatureSource(path) {
|
|
36
|
+
try {
|
|
37
|
+
return readFileSync(path, "utf8");
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const errno = err;
|
|
41
|
+
errno.path ??= path;
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
130
45
|
export function discoverFeatures(dir = featuresDir()) {
|
|
131
46
|
const files = corpusFileNames(dir)
|
|
132
47
|
.filter((name) => name.endsWith(".feature"))
|
|
133
48
|
.sort()
|
|
134
49
|
.map((name) => {
|
|
135
50
|
const path = join(dir, name);
|
|
136
|
-
return { name, path, source:
|
|
51
|
+
return { name, path, source: readFeatureSource(path) };
|
|
137
52
|
});
|
|
138
53
|
const parseErrors = files.flatMap(({ path, source }) => parseErrorsIn(path, source));
|
|
139
54
|
if (parseErrors.length > 0)
|
|
140
55
|
throw new UnreadableFeatureCorpusError(parseErrors);
|
|
141
56
|
return files.map(({ name, path, source }) => ({
|
|
142
|
-
slug: name.
|
|
57
|
+
slug: basename(name, ".feature"),
|
|
143
58
|
path,
|
|
144
59
|
featureCode: extractFeatureCode(source),
|
|
145
|
-
scenarioCodes: parseScenarioCodes(source),
|
|
146
60
|
}));
|
|
147
61
|
}
|
|
148
62
|
//# sourceMappingURL=ingestScenarios.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingestScenarios.js","sourceRoot":"","sources":["../../src/ingest/ingestScenarios.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ingestScenarios.js","sourceRoot":"","sources":["../../src/ingest/ingestScenarios.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type Shape = "string" | "number" | "boolean" | "anything" | {
|
|
2
|
+
readonly list: Shape;
|
|
3
|
+
} | {
|
|
4
|
+
readonly fields: Readonly<Record<string, Shape>>;
|
|
5
|
+
readonly required?: readonly string[];
|
|
6
|
+
} | {
|
|
7
|
+
readonly entries: Shape;
|
|
8
|
+
readonly keys?: RegExp;
|
|
9
|
+
};
|
|
10
|
+
export declare const VITEST_REPORT: Shape;
|
|
11
|
+
export declare const CUCUMBER_REPORT: Shape;
|
|
12
|
+
export declare const CI_STEP_RECORD: Shape;
|
|
13
|
+
export declare const PACKAGE_MANIFEST: Shape;
|
|
14
|
+
export declare const SAVED_RECONCILIATION: Shape;
|
|
15
|
+
export declare function shapeFaultIn(value: unknown, shape: Shape, where?: string): string | null;
|
|
16
|
+
//# sourceMappingURL=inputShapes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputShapes.d.ts","sourceRoot":"","sources":["../../src/ingest/inputShapes.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,GACb,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,UAAU,GACV;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC3F;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAKxD,eAAO,MAAM,aAAa,EAAE,KAc3B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAe7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAG5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAAsD,CAAC;AAEtF,eAAO,MAAM,oBAAoB,EAAE,KAWlC,CAAC;AAkBF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,SAAK,GAAG,MAAM,GAAG,IAAI,CAUpF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { APP_MESSAGES, AppMessage } from "../messages.js";
|
|
2
|
+
export const VITEST_REPORT = {
|
|
3
|
+
fields: {
|
|
4
|
+
testResults: {
|
|
5
|
+
list: {
|
|
6
|
+
fields: {
|
|
7
|
+
name: "string",
|
|
8
|
+
status: "string",
|
|
9
|
+
message: "string",
|
|
10
|
+
assertionResults: { list: { fields: { fullName: "string", title: "string", status: "string" } } },
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
required: ["testResults"],
|
|
16
|
+
};
|
|
17
|
+
export const CUCUMBER_REPORT = {
|
|
18
|
+
list: {
|
|
19
|
+
fields: {
|
|
20
|
+
uri: "string",
|
|
21
|
+
name: "string",
|
|
22
|
+
elements: {
|
|
23
|
+
list: {
|
|
24
|
+
fields: {
|
|
25
|
+
tags: { list: { fields: { name: "string" } } },
|
|
26
|
+
steps: { list: { fields: { keyword: "string", name: "string", result: { fields: { status: "string" } } } } },
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
export const CI_STEP_RECORD = {
|
|
34
|
+
entries: { fields: { outcome: "string" } },
|
|
35
|
+
keys: /^SCN-[A-Z0-9]{2,5}-\d+$/,
|
|
36
|
+
};
|
|
37
|
+
export const PACKAGE_MANIFEST = { fields: { scripts: { entries: "string" } } };
|
|
38
|
+
export const SAVED_RECONCILIATION = {
|
|
39
|
+
fields: {
|
|
40
|
+
runProvenance: { fields: {} },
|
|
41
|
+
summary: { fields: {} },
|
|
42
|
+
ledger: { fields: { scenarioReconciliations: { list: "anything" } }, required: ["scenarioReconciliations"] },
|
|
43
|
+
scenarioCodeErrors: { list: "anything" },
|
|
44
|
+
scenarioCodePopulation: { fields: {} },
|
|
45
|
+
evidenceObligations: { fields: {} },
|
|
46
|
+
metadata: { fields: {} },
|
|
47
|
+
},
|
|
48
|
+
required: ["runProvenance", "summary", "ledger"],
|
|
49
|
+
};
|
|
50
|
+
function kindOf(value) {
|
|
51
|
+
if (value === null)
|
|
52
|
+
return "null";
|
|
53
|
+
if (Array.isArray(value))
|
|
54
|
+
return APP_MESSAGES[AppMessage.ShapeKindList]();
|
|
55
|
+
if (typeof value === "object")
|
|
56
|
+
return APP_MESSAGES[AppMessage.ShapeKindObject]();
|
|
57
|
+
return APP_MESSAGES[AppMessage.ShapeKindOfType](typeof value);
|
|
58
|
+
}
|
|
59
|
+
function expectedKindOf(shape) {
|
|
60
|
+
if (typeof shape === "string")
|
|
61
|
+
return APP_MESSAGES[AppMessage.ShapeKindOfType](shape);
|
|
62
|
+
return "list" in shape ? APP_MESSAGES[AppMessage.ShapeKindList]() : APP_MESSAGES[AppMessage.ShapeKindObject]();
|
|
63
|
+
}
|
|
64
|
+
function pathOf(where, key) {
|
|
65
|
+
return where === "" ? key : `${where}.${key}`;
|
|
66
|
+
}
|
|
67
|
+
export function shapeFaultIn(value, shape, where = "") {
|
|
68
|
+
if (shape === "anything")
|
|
69
|
+
return null;
|
|
70
|
+
const found = kindOf(value);
|
|
71
|
+
const expected = expectedKindOf(shape);
|
|
72
|
+
if (found !== expected)
|
|
73
|
+
return APP_MESSAGES[AppMessage.ShapeWrongKind](where === "" ? APP_MESSAGES[AppMessage.ShapeTopLevel]() : where, found, expected);
|
|
74
|
+
if (typeof shape === "string")
|
|
75
|
+
return null;
|
|
76
|
+
if ("list" in shape)
|
|
77
|
+
return listFault(value, shape.list, where);
|
|
78
|
+
if ("entries" in shape)
|
|
79
|
+
return entriesFault(value, shape, where);
|
|
80
|
+
return fieldsFault(value, shape, where);
|
|
81
|
+
}
|
|
82
|
+
function listFault(items, item, where) {
|
|
83
|
+
for (const [index, value] of items.entries()) {
|
|
84
|
+
const fault = shapeFaultIn(value, item, `${where}[${index}]`);
|
|
85
|
+
if (fault !== null)
|
|
86
|
+
return fault;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
function fieldsFault(record, shape, where) {
|
|
91
|
+
for (const [key, field] of Object.entries(shape.fields)) {
|
|
92
|
+
const path = pathOf(where, key);
|
|
93
|
+
if (record[key] === undefined) {
|
|
94
|
+
if (shape.required?.includes(key) === true)
|
|
95
|
+
return APP_MESSAGES[AppMessage.ShapeFieldMissing](path);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const fault = shapeFaultIn(record[key], field, path);
|
|
99
|
+
if (fault !== null)
|
|
100
|
+
return fault;
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
function entriesFault(record, shape, where) {
|
|
105
|
+
for (const [key, value] of Object.entries(record)) {
|
|
106
|
+
if (shape.keys !== undefined && !shape.keys.test(key))
|
|
107
|
+
continue;
|
|
108
|
+
const fault = shapeFaultIn(value, shape.entries, pathOf(where, key));
|
|
109
|
+
if (fault !== null)
|
|
110
|
+
return fault;
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=inputShapes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputShapes.js","sourceRoot":"","sources":["../../src/ingest/inputShapes.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAuDA,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAW7C"}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { dirname } from "node:path";
|
|
2
|
+
import { runBalance } from "./cli-balance/cli.js";
|
|
3
|
+
import { inputsReadBy, NODE_INPUT_READER } from "./cli-balance/inputsRead.js";
|
|
4
|
+
import { parseArgs } from "./cli-args.js";
|
|
5
|
+
import { runAllocate } from "./cli-allocate/cli.js";
|
|
6
|
+
import { resolveSourceSha, resolveToolIdentity } from "./run-management/resolveRunInputs.js";
|
|
7
|
+
import { executeKeptRun, resolveRunId, } from "./run-management/keptRun.js";
|
|
8
|
+
import { parseHostInvocation, wrapCommandArgv, peekFlag, formatFilePaths, answerUnknownCommand, modifiersNotTakenRefusal, } from "./host.js";
|
|
9
|
+
import { cliRegistry, renderTopLevelHelp } from "./cli-registry.js";
|
|
10
|
+
import { dispatchesUnstored, storedReRenderRefusal, unstoredRunIdRefusal } from "./storedRun.js";
|
|
11
|
+
import { settlingRefusal } from "./outputLocation.js";
|
|
12
|
+
function runCommand(command, argv, ownRunDir) {
|
|
13
|
+
switch (command) {
|
|
14
|
+
case "balance":
|
|
15
|
+
return runBalance(argv, ownRunDir);
|
|
16
|
+
case "allocate":
|
|
17
|
+
runAllocate(argv);
|
|
18
|
+
return false;
|
|
19
|
+
default: {
|
|
20
|
+
const answer = answerUnknownCommand(command, renderTopLevelHelp(cliRegistry));
|
|
21
|
+
process.stderr.write(answer.stderr);
|
|
22
|
+
process.exitCode = answer.exitCode;
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function refuseLeadingFaults(inv) {
|
|
28
|
+
const refusal = leadingRefusal(inv);
|
|
29
|
+
if (refusal === undefined)
|
|
30
|
+
return false;
|
|
31
|
+
process.stderr.write(refusal + "\n");
|
|
32
|
+
process.exitCode = 2;
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
function leadingRefusal(inv) {
|
|
36
|
+
return inv.refusal ?? modifiersNotTakenRefusal(inv) ?? storedReRenderRefusal(inv) ?? unstoredRunIdRefusal(inv);
|
|
37
|
+
}
|
|
38
|
+
export function main(hostArgv) {
|
|
39
|
+
const inv = parseHostInvocation(hostArgv);
|
|
40
|
+
if (refuseLeadingFaults(inv))
|
|
41
|
+
return;
|
|
42
|
+
const command = inv.command;
|
|
43
|
+
if (command === undefined || asksForHelp(command)) {
|
|
44
|
+
process.stdout.write(renderTopLevelHelp(cliRegistry) + "\n");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
dispatch(inv, command);
|
|
48
|
+
}
|
|
49
|
+
function asksForHelp(command) {
|
|
50
|
+
return command === "help" || command === "--help" || command === "-h";
|
|
51
|
+
}
|
|
52
|
+
function dispatch(inv, command) {
|
|
53
|
+
if (dispatchesUnstored(inv) || inv.store === undefined) {
|
|
54
|
+
runCommand(command, inv.commandArgs);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
runKept(inv, command, inv.store);
|
|
58
|
+
}
|
|
59
|
+
function runKept(inv, command, storeRoot) {
|
|
60
|
+
const runId = resolveRunId({ runId: inv.runId, now: new Date() });
|
|
61
|
+
const target = peekFlag(inv.commandArgs, "target") ?? "unknown-target";
|
|
62
|
+
const sourceSha = sourceShaOf(inv.commandArgs);
|
|
63
|
+
const spec = {
|
|
64
|
+
storeRoot,
|
|
65
|
+
target,
|
|
66
|
+
runId,
|
|
67
|
+
formatPaths: formatFilePaths(inv.commandArgs),
|
|
68
|
+
inputs: inputsReadBy(parseArgs(inv.commandArgs), NODE_INPUT_READER),
|
|
69
|
+
};
|
|
70
|
+
const meta = manifestMeta(sourceSha);
|
|
71
|
+
const route = (formatSpecs, runDir) => runCommand(command, wrapCommandArgv(inv.commandArgs, [...formatSpecs]), runDir);
|
|
72
|
+
const plan = settlingRefusal(() => executeKeptRun(spec, meta, route), undefined);
|
|
73
|
+
if (plan !== undefined)
|
|
74
|
+
process.stdout.write(plan.runDir + "\n");
|
|
75
|
+
}
|
|
76
|
+
function sourceShaOf(commandArgs) {
|
|
77
|
+
const features = peekFlag(commandArgs, "features");
|
|
78
|
+
return (resolveSourceSha({
|
|
79
|
+
sourceSha: peekFlag(commandArgs, "source-sha"),
|
|
80
|
+
targetDir: features !== undefined ? dirname(features) : undefined,
|
|
81
|
+
}) ?? "unknown");
|
|
82
|
+
}
|
|
83
|
+
function manifestMeta(sourceSha) {
|
|
84
|
+
const toolIdentity = resolveToolIdentity();
|
|
85
|
+
return {
|
|
86
|
+
sourceSha,
|
|
87
|
+
toolSha: toolIdentity.toolSha ?? "unknown",
|
|
88
|
+
toolVersion: toolIdentity.toolVersion,
|
|
89
|
+
mode: "balance",
|
|
90
|
+
date: new Date().toISOString(),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|