spec-controller 0.1.0-alpha.5 → 0.1.0-alpha.50
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 +34 -6
- 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 +60 -0
- package/dist/cli-allocate/cli.js.map +1 -0
- package/dist/cli-allocate/readHistory.d.ts +15 -0
- package/dist/cli-allocate/readHistory.d.ts.map +1 -0
- package/dist/cli-allocate/readHistory.js +108 -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 +22 -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 +34 -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 +22 -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 +26 -0
- package/dist/cli-allocate/stderr.js.map +1 -0
- package/dist/cli-allocate/unreadable.d.ts +11 -0
- package/dist/cli-allocate/unreadable.d.ts.map +1 -0
- package/dist/cli-allocate/unreadable.js +30 -0
- package/dist/cli-allocate/unreadable.js.map +1 -0
- package/dist/cli-args.d.ts +12 -70
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +158 -81
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-balance/cli.d.ts +1 -81
- package/dist/cli-balance/cli.d.ts.map +1 -1
- package/dist/cli-balance/cli.js +71 -357
- package/dist/cli-balance/cli.js.map +1 -1
- package/dist/cli-balance/emit/format.d.ts +16 -38
- package/dist/cli-balance/emit/format.d.ts.map +1 -1
- package/dist/cli-balance/emit/format.js +31 -58
- package/dist/cli-balance/emit/format.js.map +1 -1
- package/dist/cli-balance/emit/writer.d.ts +2 -32
- package/dist/cli-balance/emit/writer.d.ts.map +1 -1
- package/dist/cli-balance/emit/writer.js +50 -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 +53 -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 +14 -0
- package/dist/cli-balance/unreadableInputs.d.ts.map +1 -0
- package/dist/cli-balance/unreadableInputs.js +80 -0
- package/dist/cli-balance/unreadableInputs.js.map +1 -0
- package/dist/cli-registry.d.ts +12 -70
- package/dist/cli-registry.d.ts.map +1 -1
- package/dist/cli-registry.js +37 -97
- 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 +62 -55
- 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 +103 -50
- package/dist/host.js.map +1 -1
- package/dist/ingest/ciSourcePaths.d.ts +0 -38
- package/dist/ingest/ciSourcePaths.d.ts.map +1 -1
- package/dist/ingest/ciSourcePaths.js +0 -38
- 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 +0 -80
- 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 +57 -214
- 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 +28 -108
- 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 +113 -0
- package/dist/ingest/inputShapes.js.map +1 -0
- package/dist/outputLocation.d.ts +27 -0
- package/dist/outputLocation.d.ts.map +1 -0
- package/dist/outputLocation.js +135 -0
- package/dist/outputLocation.js.map +1 -0
- package/dist/run-management/keptRun.d.ts +5 -105
- package/dist/run-management/keptRun.d.ts.map +1 -1
- package/dist/run-management/keptRun.js +16 -82
- 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 +0 -88
- 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 +28 -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,105 +1,33 @@
|
|
|
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
2
|
import { 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
|
-
|
|
27
|
-
|
|
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
|
+
if (featureLine < 0)
|
|
9
|
+
return null;
|
|
10
|
+
return headerTagsAbove(lines, featureLine).find(isHeaderCode) ?? null;
|
|
50
11
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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("@")))
|
|
12
|
+
const NON_CODE_TAGS = ["unit", "integration", "e2e", "performance", "smoke"];
|
|
13
|
+
function isHeaderCode(bare) {
|
|
14
|
+
return !bare.startsWith("SCN-") && !NON_CODE_TAGS.includes(bare) && CODE_PATTERN.test(bare);
|
|
15
|
+
}
|
|
16
|
+
function headerTagsAbove(lines, featureLine) {
|
|
17
|
+
const tags = [];
|
|
18
|
+
for (let j = featureLine - 1; j >= 0; j--) {
|
|
19
|
+
const prev = lines[j].trim();
|
|
20
|
+
if (prev === "")
|
|
66
21
|
continue;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
codes.push(bare);
|
|
71
|
-
}
|
|
22
|
+
if (!prev.startsWith("@"))
|
|
23
|
+
break;
|
|
24
|
+
tags.push(...prev.split(/\s+/).filter((t) => t.startsWith("@")).map((t) => t.slice(1)));
|
|
72
25
|
}
|
|
73
|
-
return
|
|
26
|
+
return tags;
|
|
74
27
|
}
|
|
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
28
|
function featuresDir() {
|
|
83
29
|
return join(process.cwd(), "features");
|
|
84
30
|
}
|
|
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
31
|
function corpusFileNames(dir) {
|
|
104
32
|
try {
|
|
105
33
|
return readdirSync(dir);
|
|
@@ -110,30 +38,23 @@ function corpusFileNames(dir) {
|
|
|
110
38
|
throw err;
|
|
111
39
|
}
|
|
112
40
|
}
|
|
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
|
-
*/
|
|
41
|
+
function readFeatureSource(path) {
|
|
42
|
+
try {
|
|
43
|
+
return readFileSync(path, "utf8");
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const errno = err;
|
|
47
|
+
errno.path ??= path;
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
130
51
|
export function discoverFeatures(dir = featuresDir()) {
|
|
131
52
|
const files = corpusFileNames(dir)
|
|
132
53
|
.filter((name) => name.endsWith(".feature"))
|
|
133
54
|
.sort()
|
|
134
55
|
.map((name) => {
|
|
135
56
|
const path = join(dir, name);
|
|
136
|
-
return { name, path, source:
|
|
57
|
+
return { name, path, source: readFeatureSource(path) };
|
|
137
58
|
});
|
|
138
59
|
const parseErrors = files.flatMap(({ path, source }) => parseErrorsIn(path, source));
|
|
139
60
|
if (parseErrors.length > 0)
|
|
@@ -142,7 +63,6 @@ export function discoverFeatures(dir = featuresDir()) {
|
|
|
142
63
|
slug: name.replace(/\.feature$/, ""),
|
|
143
64
|
path,
|
|
144
65
|
featureCode: extractFeatureCode(source),
|
|
145
|
-
scenarioCodes: parseScenarioCodes(source),
|
|
146
66
|
}));
|
|
147
67
|
}
|
|
148
68
|
//# 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":"AAAA,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,CASpF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export const VITEST_REPORT = {
|
|
2
|
+
fields: {
|
|
3
|
+
testResults: {
|
|
4
|
+
list: {
|
|
5
|
+
fields: {
|
|
6
|
+
name: "string",
|
|
7
|
+
status: "string",
|
|
8
|
+
message: "string",
|
|
9
|
+
assertionResults: { list: { fields: { fullName: "string", title: "string", status: "string" } } },
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
required: ["testResults"],
|
|
15
|
+
};
|
|
16
|
+
export const CUCUMBER_REPORT = {
|
|
17
|
+
list: {
|
|
18
|
+
fields: {
|
|
19
|
+
uri: "string",
|
|
20
|
+
name: "string",
|
|
21
|
+
elements: {
|
|
22
|
+
list: {
|
|
23
|
+
fields: {
|
|
24
|
+
tags: { list: { fields: { name: "string" } } },
|
|
25
|
+
steps: { list: { fields: { keyword: "string", name: "string", result: { fields: { status: "string" } } } } },
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export const CI_STEP_RECORD = {
|
|
33
|
+
entries: { fields: { outcome: "string" } },
|
|
34
|
+
keys: /^SCN-[A-Z0-9]{2,5}-\d+$/,
|
|
35
|
+
};
|
|
36
|
+
export const PACKAGE_MANIFEST = { fields: { scripts: { entries: "string" } } };
|
|
37
|
+
export const SAVED_RECONCILIATION = {
|
|
38
|
+
fields: {
|
|
39
|
+
runProvenance: { fields: {} },
|
|
40
|
+
summary: { fields: {} },
|
|
41
|
+
ledger: { fields: { scenarioReconciliations: { list: "anything" } }, required: ["scenarioReconciliations"] },
|
|
42
|
+
scenarioCodeErrors: { list: "anything" },
|
|
43
|
+
scenarioCodePopulation: { fields: {} },
|
|
44
|
+
evidenceObligations: { fields: {} },
|
|
45
|
+
metadata: { fields: {} },
|
|
46
|
+
},
|
|
47
|
+
required: ["runProvenance", "summary", "ledger"],
|
|
48
|
+
};
|
|
49
|
+
function kindOf(value) {
|
|
50
|
+
if (value === null)
|
|
51
|
+
return "null";
|
|
52
|
+
if (Array.isArray(value))
|
|
53
|
+
return "a list";
|
|
54
|
+
if (typeof value === "object")
|
|
55
|
+
return "an object";
|
|
56
|
+
return `a ${typeof value}`;
|
|
57
|
+
}
|
|
58
|
+
function expectedKindOf(shape) {
|
|
59
|
+
if (typeof shape === "string")
|
|
60
|
+
return `a ${shape}`;
|
|
61
|
+
return "list" in shape ? "a list" : "an object";
|
|
62
|
+
}
|
|
63
|
+
function pathOf(where, key) {
|
|
64
|
+
return where === "" ? key : `${where}.${key}`;
|
|
65
|
+
}
|
|
66
|
+
export function shapeFaultIn(value, shape, where = "") {
|
|
67
|
+
if (shape === "anything")
|
|
68
|
+
return null;
|
|
69
|
+
const found = kindOf(value);
|
|
70
|
+
const expected = expectedKindOf(shape);
|
|
71
|
+
if (found !== expected)
|
|
72
|
+
return `${where === "" ? "the top level" : where} is ${found}, not ${expected}`;
|
|
73
|
+
if (typeof shape === "string")
|
|
74
|
+
return null;
|
|
75
|
+
if ("list" in shape)
|
|
76
|
+
return listFault(value, shape.list, where);
|
|
77
|
+
if ("entries" in shape)
|
|
78
|
+
return entriesFault(value, shape, where);
|
|
79
|
+
return fieldsFault(value, shape, where);
|
|
80
|
+
}
|
|
81
|
+
function listFault(items, item, where) {
|
|
82
|
+
for (const [index, value] of items.entries()) {
|
|
83
|
+
const fault = shapeFaultIn(value, item, `${where}[${index}]`);
|
|
84
|
+
if (fault !== null)
|
|
85
|
+
return fault;
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
function fieldsFault(record, shape, where) {
|
|
90
|
+
for (const [key, field] of Object.entries(shape.fields)) {
|
|
91
|
+
const path = pathOf(where, key);
|
|
92
|
+
if (record[key] === undefined) {
|
|
93
|
+
if (shape.required?.includes(key) === true)
|
|
94
|
+
return `${path} is missing`;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const fault = shapeFaultIn(record[key], field, path);
|
|
98
|
+
if (fault !== null)
|
|
99
|
+
return fault;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
function entriesFault(record, shape, where) {
|
|
104
|
+
for (const [key, value] of Object.entries(record)) {
|
|
105
|
+
if (shape.keys !== undefined && !shape.keys.test(key))
|
|
106
|
+
continue;
|
|
107
|
+
const fault = shapeFaultIn(value, shape.entries, pathOf(where, key));
|
|
108
|
+
if (fault !== null)
|
|
109
|
+
return fault;
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
//# 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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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare class UsageRefusal extends Error {
|
|
2
|
+
readonly name = "UsageRefusal";
|
|
3
|
+
readonly exitCode = 2;
|
|
4
|
+
}
|
|
5
|
+
export declare function unwritableRefusal(subject: string, path: string, err: unknown): string;
|
|
6
|
+
export declare function writeOrRefuse(subject: string, path: string, write: () => void): void;
|
|
7
|
+
export declare function refuse(message: string): never;
|
|
8
|
+
export declare function settlingRefusal<T>(run: () => T, refused: T): T;
|
|
9
|
+
export interface RegularFileIdentity {
|
|
10
|
+
readonly dev: bigint;
|
|
11
|
+
readonly ino: bigint;
|
|
12
|
+
}
|
|
13
|
+
export interface ReadInput {
|
|
14
|
+
readonly subject: string;
|
|
15
|
+
readonly path: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ProbedDestination {
|
|
18
|
+
readonly identity: RegularFileIdentity | undefined;
|
|
19
|
+
readonly created: string | undefined;
|
|
20
|
+
}
|
|
21
|
+
export declare function probeDestination(path: string): ProbedDestination;
|
|
22
|
+
export declare function firstSharingFile(file: string, others: readonly string[]): string | undefined;
|
|
23
|
+
export declare function regularFileIdentity(path: string): RegularFileIdentity | undefined;
|
|
24
|
+
export declare function inputAt(path: string, inputs: readonly ReadInput[]): ReadInput | undefined;
|
|
25
|
+
export declare function stdoutIdentity(): RegularFileIdentity | undefined;
|
|
26
|
+
export declare function namesStdout(path: string): boolean;
|
|
27
|
+
//# sourceMappingURL=outputLocation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outputLocation.d.ts","sourceRoot":"","sources":["../src/outputLocation.ts"],"names":[],"mappings":"AAKA,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAkB,IAAI,kBAAkB;IACxC,QAAQ,CAAC,QAAQ,KAAmB;CACrC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAGrF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI,CAMpF;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAG7C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAQ9D;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAQhE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAS5F;AAgBD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAMjF;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,GAAG,SAAS,CAIzF;AAED,wBAAgB,cAAc,IAAI,mBAAmB,GAAG,SAAS,CAMhE;AAkBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOjD"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { closeSync, constants, fstatSync, lstatSync, openSync, readlinkSync, realpathSync, statSync, unlinkSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve, sep } from "node:path";
|
|
3
|
+
const USAGE_EXIT_CODE = 2;
|
|
4
|
+
export class UsageRefusal extends Error {
|
|
5
|
+
name = "UsageRefusal";
|
|
6
|
+
exitCode = USAGE_EXIT_CODE;
|
|
7
|
+
}
|
|
8
|
+
export function unwritableRefusal(subject, path, err) {
|
|
9
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
10
|
+
return `${subject}: ${path} (${reason})`;
|
|
11
|
+
}
|
|
12
|
+
export function writeOrRefuse(subject, path, write) {
|
|
13
|
+
try {
|
|
14
|
+
write();
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
refuse(unwritableRefusal(subject, path, err));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function refuse(message) {
|
|
21
|
+
process.stderr.write(message + "\n");
|
|
22
|
+
throw new UsageRefusal(message);
|
|
23
|
+
}
|
|
24
|
+
export function settlingRefusal(run, refused) {
|
|
25
|
+
try {
|
|
26
|
+
return run();
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
if (!(err instanceof UsageRefusal))
|
|
30
|
+
throw err;
|
|
31
|
+
process.exitCode = err.exitCode;
|
|
32
|
+
return refused;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function probeDestination(path) {
|
|
36
|
+
try {
|
|
37
|
+
return { identity: identityOf(openSync(path, constants.O_WRONLY)), created: undefined };
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (err.code !== "ENOENT")
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
const identity = identityOf(openSync(path, constants.O_WRONLY | constants.O_CREAT));
|
|
44
|
+
return { identity, created: realpathSync(path) };
|
|
45
|
+
}
|
|
46
|
+
export function firstSharingFile(file, others) {
|
|
47
|
+
const created = [];
|
|
48
|
+
try {
|
|
49
|
+
const identity = identityOrNone(file, created);
|
|
50
|
+
if (identity === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
return others.find((other) => sameIdentity(identityOrNone(other, created), identity));
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
for (const path of created)
|
|
56
|
+
unlinkSync(path);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function identityOrNone(path, created) {
|
|
60
|
+
try {
|
|
61
|
+
const probed = probeDestination(path);
|
|
62
|
+
if (probed.created !== undefined)
|
|
63
|
+
created.push(probed.created);
|
|
64
|
+
return probed.identity;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function sameIdentity(a, b) {
|
|
71
|
+
return a !== undefined && a.dev === b.dev && a.ino === b.ino;
|
|
72
|
+
}
|
|
73
|
+
export function regularFileIdentity(path) {
|
|
74
|
+
try {
|
|
75
|
+
return regularIdentity(statSync(path, { bigint: true }));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export function inputAt(path, inputs) {
|
|
82
|
+
const identity = regularFileIdentity(path);
|
|
83
|
+
if (identity === undefined)
|
|
84
|
+
return undefined;
|
|
85
|
+
return inputs.find((input) => sameIdentity(regularFileIdentity(input.path), identity));
|
|
86
|
+
}
|
|
87
|
+
export function stdoutIdentity() {
|
|
88
|
+
try {
|
|
89
|
+
return regularIdentity(fstatSync(1, { bigint: true }));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function identityOf(fd) {
|
|
96
|
+
try {
|
|
97
|
+
return regularIdentity(fstatSync(fd, { bigint: true }));
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
closeSync(fd);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function regularIdentity(stats) {
|
|
104
|
+
return stats.isFile() ? { dev: stats.dev, ino: stats.ino } : undefined;
|
|
105
|
+
}
|
|
106
|
+
const STDOUT_SPELLINGS = new Set(["/dev/stdout", "/dev/fd/1", "/proc/self/fd/1", "/proc/thread-self/fd/1", `/proc/${process.pid}/fd/1`]);
|
|
107
|
+
const MAX_LINKS_FOLLOWED = 40;
|
|
108
|
+
export function namesStdout(path) {
|
|
109
|
+
let current = resolve(path);
|
|
110
|
+
for (let followed = 0; current !== undefined && followed <= MAX_LINKS_FOLLOWED; followed++) {
|
|
111
|
+
if (STDOUT_SPELLINGS.has(current))
|
|
112
|
+
return true;
|
|
113
|
+
current = withFirstLinkFollowed(current);
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
function withFirstLinkFollowed(path) {
|
|
118
|
+
const parts = path.split(sep).filter((part) => part !== "");
|
|
119
|
+
for (let length = 1; length <= parts.length; length++) {
|
|
120
|
+
const prefix = sep + parts.slice(0, length).join(sep);
|
|
121
|
+
const target = linkTarget(prefix);
|
|
122
|
+
if (target !== undefined)
|
|
123
|
+
return resolve(dirname(prefix), target, ...parts.slice(length));
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
function linkTarget(path) {
|
|
128
|
+
try {
|
|
129
|
+
return lstatSync(path).isSymbolicLink() ? readlinkSync(path) : undefined;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=outputLocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outputLocation.js","sourceRoot":"","sources":["../src/outputLocation.ts"],"names":[],"mappings":"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"}
|