@3f-consulting/spec-controller-core 0.1.0-alpha.5 → 0.1.0-alpha.51
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 +6 -4
- package/dist/assemble/evidenceReconciliationFromSources.d.ts +5 -40
- package/dist/assemble/evidenceReconciliationFromSources.d.ts.map +1 -1
- package/dist/assemble/evidenceReconciliationFromSources.js +29 -324
- package/dist/assemble/evidenceReconciliationFromSources.js.map +1 -1
- package/dist/assemble/renderInput.d.ts +6 -72
- package/dist/assemble/renderInput.d.ts.map +1 -1
- package/dist/assemble/renderInput.js +3 -45
- package/dist/assemble/renderInput.js.map +1 -1
- package/dist/census/evidenceObligations.d.ts +10 -46
- package/dist/census/evidenceObligations.d.ts.map +1 -1
- package/dist/census/evidenceObligations.js +15 -25
- package/dist/census/evidenceObligations.js.map +1 -1
- package/dist/domain/evidenceOrder.d.ts +3 -0
- package/dist/domain/evidenceOrder.d.ts.map +1 -0
- package/dist/domain/evidenceOrder.js +15 -0
- package/dist/domain/evidenceOrder.js.map +1 -0
- package/dist/domain/evidenceReconciliation.d.ts +16 -386
- package/dist/domain/evidenceReconciliation.d.ts.map +1 -1
- package/dist/domain/evidenceReconciliation.js +79 -375
- package/dist/domain/evidenceReconciliation.js.map +1 -1
- package/dist/domain/featureCode.d.ts +4 -0
- package/dist/domain/featureCode.d.ts.map +1 -0
- package/dist/domain/featureCode.js +12 -0
- package/dist/domain/featureCode.js.map +1 -0
- package/dist/domain/journal.d.ts +7 -392
- package/dist/domain/journal.d.ts.map +1 -1
- package/dist/domain/journal.js +6 -118
- package/dist/domain/journal.js.map +1 -1
- package/dist/domain/ledger.d.ts +4 -328
- package/dist/domain/ledger.d.ts.map +1 -1
- package/dist/domain/ledger.js +11 -317
- package/dist/domain/ledger.js.map +1 -1
- package/dist/domain/outcome.d.ts +3 -0
- package/dist/domain/outcome.d.ts.map +1 -0
- package/dist/domain/outcome.js +2 -0
- package/dist/domain/outcome.js.map +1 -0
- package/dist/domain/posting.d.ts +5 -102
- package/dist/domain/posting.d.ts.map +1 -1
- package/dist/domain/posting.js +3 -55
- package/dist/domain/posting.js.map +1 -1
- package/dist/domain/qualityCheckFault.d.ts +1 -41
- package/dist/domain/qualityCheckFault.d.ts.map +1 -1
- package/dist/domain/qualityCheckFault.js +0 -24
- package/dist/domain/qualityCheckFault.js.map +1 -1
- package/dist/domain/qualityCheckFaultMessages.d.ts +0 -35
- package/dist/domain/qualityCheckFaultMessages.d.ts.map +1 -1
- package/dist/domain/qualityCheckFaultMessages.js +0 -28
- package/dist/domain/qualityCheckFaultMessages.js.map +1 -1
- package/dist/domain/qualityCheckReconciliation.d.ts +5 -278
- package/dist/domain/qualityCheckReconciliation.d.ts.map +1 -1
- package/dist/domain/qualityCheckReconciliation.js +53 -453
- package/dist/domain/qualityCheckReconciliation.js.map +1 -1
- package/dist/domain/qualityCheckReconciliationFault.d.ts +0 -19
- package/dist/domain/qualityCheckReconciliationFault.d.ts.map +1 -1
- package/dist/domain/qualityCheckReconciliationFault.js +0 -23
- package/dist/domain/qualityCheckReconciliationFault.js.map +1 -1
- package/dist/domain/scenarioCodeError.d.ts +16 -0
- package/dist/domain/scenarioCodeError.d.ts.map +1 -0
- package/dist/domain/scenarioCodeError.js +4 -0
- package/dist/domain/scenarioCodeError.js.map +1 -0
- package/dist/domain/scenarioReconciliation.d.ts +0 -205
- package/dist/domain/scenarioReconciliation.d.ts.map +1 -1
- package/dist/domain/scenarioReconciliation.js +1 -98
- package/dist/domain/scenarioReconciliation.js.map +1 -1
- package/dist/domain/scnAllocation.d.ts +27 -0
- package/dist/domain/scnAllocation.d.ts.map +1 -0
- package/dist/domain/scnAllocation.js +33 -0
- package/dist/domain/scnAllocation.js.map +1 -0
- package/dist/domain/verdictCode.d.ts +10 -0
- package/dist/domain/verdictCode.d.ts.map +1 -0
- package/dist/domain/verdictCode.js +16 -0
- package/dist/domain/verdictCode.js.map +1 -0
- package/dist/index.d.ts +12 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -86
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +3 -25
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +3 -93
- package/dist/internal.js.map +1 -1
- package/dist/lib/bareTerm.d.ts +0 -39
- package/dist/lib/bareTerm.d.ts.map +1 -1
- package/dist/lib/bareTerm.js +0 -39
- package/dist/lib/bareTerm.js.map +1 -1
- package/dist/lib/portablePath.d.ts.map +1 -1
- package/dist/lib/portablePath.js +0 -14
- package/dist/lib/portablePath.js.map +1 -1
- package/dist/lib/scnCitation.d.ts +0 -32
- package/dist/lib/scnCitation.d.ts.map +1 -1
- package/dist/lib/scnCitation.js +2 -42
- package/dist/lib/scnCitation.js.map +1 -1
- package/dist/model.d.ts +0 -23
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -23
- package/dist/model.js.map +1 -1
- package/dist/parse/checkScriptsRunInCI.d.ts +3 -151
- package/dist/parse/checkScriptsRunInCI.d.ts.map +1 -1
- package/dist/parse/checkScriptsRunInCI.js +5 -143
- package/dist/parse/checkScriptsRunInCI.js.map +1 -1
- package/dist/parse/ciStepRecord.d.ts +2 -117
- package/dist/parse/ciStepRecord.d.ts.map +1 -1
- package/dist/parse/ciStepRecord.js +12 -218
- package/dist/parse/ciStepRecord.js.map +1 -1
- package/dist/parse/commandRuns.d.ts +0 -39
- package/dist/parse/commandRuns.d.ts.map +1 -1
- package/dist/parse/commandRuns.js +0 -58
- package/dist/parse/commandRuns.js.map +1 -1
- package/dist/parse/cucumber.d.ts +0 -52
- package/dist/parse/cucumber.d.ts.map +1 -1
- package/dist/parse/cucumber.js +37 -143
- package/dist/parse/cucumber.js.map +1 -1
- package/dist/parse/discoveryScope.d.ts +0 -45
- package/dist/parse/discoveryScope.d.ts.map +1 -1
- package/dist/parse/discoveryScope.js +0 -55
- package/dist/parse/discoveryScope.js.map +1 -1
- package/dist/parse/fitnessCitations.d.ts +1 -72
- package/dist/parse/fitnessCitations.d.ts.map +1 -1
- package/dist/parse/fitnessCitations.js +3 -55
- package/dist/parse/fitnessCitations.js.map +1 -1
- package/dist/parse/reconcilerSteps.d.ts +0 -46
- package/dist/parse/reconcilerSteps.d.ts.map +1 -1
- package/dist/parse/reconcilerSteps.js +0 -63
- package/dist/parse/reconcilerSteps.js.map +1 -1
- package/dist/parse/runningStaticChecks.d.ts +2 -118
- package/dist/parse/runningStaticChecks.d.ts.map +1 -1
- package/dist/parse/runningStaticChecks.js +14 -273
- package/dist/parse/runningStaticChecks.js.map +1 -1
- package/dist/parse/scenarioCodeErrors.d.ts +12 -0
- package/dist/parse/scenarioCodeErrors.d.ts.map +1 -0
- package/dist/parse/scenarioCodeErrors.js +88 -0
- package/dist/parse/scenarioCodeErrors.js.map +1 -0
- package/dist/parse/scenarios.d.ts +3 -228
- package/dist/parse/scenarios.d.ts.map +1 -1
- package/dist/parse/scenarios.js +11 -447
- package/dist/parse/scenarios.js.map +1 -1
- package/dist/parse/stepAccounting.d.ts +0 -46
- package/dist/parse/stepAccounting.d.ts.map +1 -1
- package/dist/parse/stepAccounting.js +0 -54
- package/dist/parse/stepAccounting.js.map +1 -1
- package/dist/parse/stepExclusions.d.ts +0 -47
- package/dist/parse/stepExclusions.d.ts.map +1 -1
- package/dist/parse/stepExclusions.js +0 -45
- package/dist/parse/stepExclusions.js.map +1 -1
- package/dist/parse/stepNames.d.ts +0 -27
- package/dist/parse/stepNames.d.ts.map +1 -1
- package/dist/parse/stepNames.js +0 -27
- package/dist/parse/stepNames.js.map +1 -1
- package/dist/parse/targetCorpus.d.ts +1 -78
- package/dist/parse/targetCorpus.d.ts.map +1 -1
- package/dist/parse/targetCorpus.js +4 -46
- package/dist/parse/targetCorpus.js.map +1 -1
- package/dist/parse/targetManifest.d.ts +8 -146
- package/dist/parse/targetManifest.d.ts.map +1 -1
- package/dist/parse/targetManifest.js +47 -198
- package/dist/parse/targetManifest.js.map +1 -1
- package/dist/parse/vitest.d.ts +0 -60
- package/dist/parse/vitest.d.ts.map +1 -1
- package/dist/parse/vitest.js +1 -81
- package/dist/parse/vitest.js.map +1 -1
- package/dist/provenance/provenance.d.ts +2 -110
- package/dist/provenance/provenance.d.ts.map +1 -1
- package/dist/provenance/provenance.js +2 -58
- package/dist/provenance/provenance.js.map +1 -1
- package/dist/render/behaviouralRunners.d.ts +0 -29
- package/dist/render/behaviouralRunners.d.ts.map +1 -1
- package/dist/render/behaviouralRunners.js +0 -64
- package/dist/render/behaviouralRunners.js.map +1 -1
- package/dist/render/configurationNotRead.d.ts +3 -0
- package/dist/render/configurationNotRead.d.ts.map +1 -0
- package/dist/render/configurationNotRead.js +17 -0
- package/dist/render/configurationNotRead.js.map +1 -0
- package/dist/render/discoveryScope.d.ts +0 -37
- package/dist/render/discoveryScope.d.ts.map +1 -1
- package/dist/render/discoveryScope.js +0 -37
- package/dist/render/discoveryScope.js.map +1 -1
- package/dist/render/evidenceGrid.d.ts +1 -35
- package/dist/render/evidenceGrid.d.ts.map +1 -1
- package/dist/render/evidenceGrid.js +18 -100
- package/dist/render/evidenceGrid.js.map +1 -1
- package/dist/render/excludedSteps.d.ts +0 -26
- package/dist/render/excludedSteps.d.ts.map +1 -1
- package/dist/render/excludedSteps.js +0 -29
- package/dist/render/excludedSteps.js.map +1 -1
- package/dist/render/json.d.ts +0 -11
- package/dist/render/json.d.ts.map +1 -1
- package/dist/render/json.js +0 -11
- package/dist/render/json.js.map +1 -1
- package/dist/render/markdown.d.ts +0 -54
- package/dist/render/markdown.d.ts.map +1 -1
- package/dist/render/markdown.js +88 -426
- package/dist/render/markdown.js.map +1 -1
- package/dist/render/provenanceSection.d.ts +0 -22
- package/dist/render/provenanceSection.d.ts.map +1 -1
- package/dist/render/provenanceSection.js +0 -44
- package/dist/render/provenanceSection.js.map +1 -1
- package/dist/render/reconcilerSteps.d.ts +0 -25
- package/dist/render/reconcilerSteps.d.ts.map +1 -1
- package/dist/render/reconcilerSteps.js +0 -26
- package/dist/render/reconcilerSteps.js.map +1 -1
- package/dist/render/runVerdict.d.ts +0 -38
- package/dist/render/runVerdict.d.ts.map +1 -1
- package/dist/render/runVerdict.js +68 -127
- package/dist/render/runVerdict.js.map +1 -1
- package/dist/render/scenarioCodeErrorsSection.d.ts +3 -0
- package/dist/render/scenarioCodeErrorsSection.d.ts.map +1 -0
- package/dist/render/scenarioCodeErrorsSection.js +42 -0
- package/dist/render/scenarioCodeErrorsSection.js.map +1 -0
- package/dist/render/staticChecks.d.ts +0 -20
- package/dist/render/staticChecks.d.ts.map +1 -1
- package/dist/render/staticChecks.js +1 -59
- package/dist/render/staticChecks.js.map +1 -1
- package/dist/render/stepAccounting.d.ts +0 -36
- package/dist/render/stepAccounting.d.ts.map +1 -1
- package/dist/render/stepAccounting.js +0 -44
- package/dist/render/stepAccounting.js.map +1 -1
- package/dist/render/testVolume.d.ts +0 -25
- package/dist/render/testVolume.d.ts.map +1 -1
- package/dist/render/testVolume.js +0 -32
- package/dist/render/testVolume.js.map +1 -1
- package/package.json +4 -1
- package/dist/domain/checkCharacteristics.d.ts +0 -88
- package/dist/domain/checkCharacteristics.d.ts.map +0 -1
- package/dist/domain/checkCharacteristics.js +0 -109
- package/dist/domain/checkCharacteristics.js.map +0 -1
- package/dist/domain/fitnessChecks.d.ts +0 -79
- package/dist/domain/fitnessChecks.d.ts.map +0 -1
- package/dist/domain/fitnessChecks.js +0 -81
- package/dist/domain/fitnessChecks.js.map +0 -1
- package/dist/lib/featureCode.d.ts +0 -21
- package/dist/lib/featureCode.d.ts.map +0 -1
- package/dist/lib/featureCode.js +0 -24
- package/dist/lib/featureCode.js.map +0 -1
- package/dist/parse/corpusCodeFaults.d.ts +0 -76
- package/dist/parse/corpusCodeFaults.d.ts.map +0 -1
- package/dist/parse/corpusCodeFaults.js +0 -121
- package/dist/parse/corpusCodeFaults.js.map +0 -1
- package/dist/parse/corpusFaults.d.ts +0 -124
- package/dist/parse/corpusFaults.d.ts.map +0 -1
- package/dist/parse/corpusFaults.js +0 -72
- package/dist/parse/corpusFaults.js.map +0 -1
- package/dist/parse/corpusGrammarFaults.d.ts +0 -71
- package/dist/parse/corpusGrammarFaults.d.ts.map +0 -1
- package/dist/parse/corpusGrammarFaults.js +0 -292
- package/dist/parse/corpusGrammarFaults.js.map +0 -1
|
@@ -1,66 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE ACCOUNTING IDENTITY (@SCN-USG-018, 3F-3343) — how many steps of the target's pipeline this
|
|
3
|
-
* run read, what became of each of them, and the total those dispositions come to.
|
|
4
|
-
*
|
|
5
|
-
* WHY A COUNT EXISTS AT ALL, WHEN FOUR SECTIONS OF THE REPORT ALREADY NAME THE STEPS. This axis's
|
|
6
|
-
* first non-negotiable is that nothing seen is dropped: a step that reaches the reader leaves it
|
|
7
|
-
* as a candidate fitness check, as one of the runners the target named, as the reconciler, or as a
|
|
8
|
-
* step the consumer called a non-check, and there is no fifth outcome. That is a claim about code,
|
|
9
|
-
* and no reader can check it by reading. Every account beside this one names what a step BECAME —
|
|
10
|
-
* so a step that became nothing is missing from no list, and all four of them read exactly as they
|
|
11
|
-
* would have read had the step never existed. Only the population, counted against the
|
|
12
|
-
* dispositions, can see an absence like that.
|
|
13
|
-
*
|
|
14
|
-
* IT ASKS WHAT WOULD STOP BEING COUNTED, NOT WHAT WOULD FAIL. A removal-shaped fault — a filter
|
|
15
|
-
* dropping a step on a branch nobody enumerated — raises nothing for double-entry to miss the
|
|
16
|
-
* other half of. It posts no row, names no step and reds no assertion, because what it did was to
|
|
17
|
-
* not happen. This is the instrument for that shape of fault and it is the only one on the axis.
|
|
18
|
-
*
|
|
19
|
-
* THE SUM IS THIS READER'S, AND THAT IS THE POINT OF CARRYING IT. `accountedFor` is added up here
|
|
20
|
-
* and stated beside `stepsRead`, so the two totals can be compared rather than reconstructed. A
|
|
21
|
-
* report that printed the four dispositions and left the adding to whoever read it would be
|
|
22
|
-
* satisfied by any four figures at all — including four produced by a reader that had lost a step.
|
|
23
|
-
*
|
|
24
|
-
* EVERY DISPOSITION IS THE PRODUCT'S OWN RULE, ASKED, NEVER RESTATED HERE. The candidates come
|
|
25
|
-
* from `isCandidateStep`, the runners from `runsNamedRunner`, and the other two from the seams the
|
|
26
|
-
* composition already built (`parse/reconcilerSteps`, `parse/stepExclusions`). A count that
|
|
27
|
-
* re-derived any of them would be measuring its own arithmetic: it would go on agreeing with
|
|
28
|
-
* itself while the books beneath it posted something else, which is the one disagreement a reader
|
|
29
|
-
* of a total has no way to see. It is the SAME walk, too (`ciWorkflowSteps`), so the population
|
|
30
|
-
* being counted is the population the observers read.
|
|
31
|
-
*
|
|
32
|
-
* THE FOUR ARE DISJOINT BY CONSTRUCTION AND EXHAUSTIVE BY ASSERTION, which is the asymmetry the
|
|
33
|
-
* identity turns on. Each rule below carries the guards that keep a step out of a second
|
|
34
|
-
* disposition, so the count can never exceed the population by accident; nothing here makes them
|
|
35
|
-
* COVER the population, and whether they do is exactly what the two totals say out loud.
|
|
36
|
-
*
|
|
37
|
-
* THE PRECEDENCE IS THE COMPOSITION'S, NOT A PREFERENCE. The exclusion seam discovery is asked
|
|
38
|
-
* through puts the reconciler ahead of the consumer's own list, and a runner is a step the
|
|
39
|
-
* observer never reached the runner rule for if something had already taken it out of discovery.
|
|
40
|
-
* A step that is two things at once is counted under the first of them, so the report's dispositions
|
|
41
|
-
* add up to the pipeline rather than to more than it.
|
|
42
|
-
*
|
|
43
|
-
* NOT THE SCOPE CENSUS beside it (`parse/discoveryScope`, @SCN-USG-020), which counts the same
|
|
44
|
-
* population for a different question: that one says WHICH files and WHICH jobs the steps came
|
|
45
|
-
* from, this one says none of them went missing on the way. A reader satisfies either alone.
|
|
46
|
-
*/
|
|
47
1
|
import { ciWorkflowSteps } from "./checkScriptsRunInCI.js";
|
|
48
2
|
import { isCandidateStep, runsNamedRunner } from "./runningStaticChecks.js";
|
|
49
3
|
export function stepAccounting(ciSources, packageJson, runners, isReconciler, isNamedANonCheck) {
|
|
50
4
|
const steps = ciWorkflowSteps(ciSources);
|
|
51
|
-
// THE COMPOSED SEAM, REBUILT FROM ITS TWO HALVES RATHER THAN TAKEN WHOLE. The observer is asked
|
|
52
|
-
// one question per step and cannot tell the two facts apart; this reader has to, because "the
|
|
53
|
-
// reconciler" and "the consumer said so" are the two dispositions a report keeps separate.
|
|
54
5
|
const isExcludedFromDiscovery = (step) => isReconciler(step) || isNamedANonCheck(step);
|
|
55
6
|
const count = (holds) => steps.filter(holds).length;
|
|
56
7
|
const candidates = count((step) => isCandidateStep(step, packageJson, runners, isExcludedFromDiscovery));
|
|
57
8
|
const reconciler = count(isReconciler);
|
|
58
|
-
// NOT ALSO THE RECONCILER, so a consumer who wrote a `notChecks` entry naming a step this tool
|
|
59
|
-
// takes out of its own books does not have it counted twice — and the surplus does not read as
|
|
60
|
-
// a pipeline larger than the one that ran.
|
|
61
9
|
const excluded = count((step) => !isReconciler(step) && isNamedANonCheck(step));
|
|
62
|
-
// NOT ALREADY OUT OF DISCOVERY, for the same reason and in the observer's own order: the runner
|
|
63
|
-
// rule is a question about a step the reader is still looking at.
|
|
64
10
|
const runnerSteps = count((step) => !isExcludedFromDiscovery(step) && runsNamedRunner(step, packageJson, runners));
|
|
65
11
|
return {
|
|
66
12
|
stepsRead: steps.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepAccounting.js","sourceRoot":"","sources":["../../src/parse/stepAccounting.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stepAccounting.js","sourceRoot":"","sources":["../../src/parse/stepAccounting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgD,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG5E,MAAM,UAAU,cAAc,CAC5B,SAA4B,EAC5B,WAA+B,EAC/B,OAAgD,EAChD,YAA+C,EAC/C,gBAAmD;IAEnD,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,uBAAuB,GAAG,CAAC,IAAoB,EAAW,EAAE,CAChE,YAAY,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,KAAwC,EAAU,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAE/F,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAChC,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,CAAC,CACrE,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,KAAK,CACvB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CACxF,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,UAAU;QACV,OAAO,EAAE,WAAW;QACpB,UAAU;QACV,QAAQ;QACR,YAAY,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ;KAC/D,CAAC;AACJ,CAAC"}
|
|
@@ -1,54 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE CONSUMER'S OWN EXCLUSIONS (@SCN-USG-015, 3F-3343) — which steps of a target's pipeline its
|
|
3
|
-
* manifest names non-checks, and which of the entries that named them named nothing at all.
|
|
4
|
-
*
|
|
5
|
-
* THE THIRD EXCLUSION, AND THE ONLY ONE THAT IS A LIST SOMEBODY WRITES. The reconciler is excluded
|
|
6
|
-
* by construction and a behavioural runner by a rule over what the target named; this one is the
|
|
7
|
-
* consumer saying, about their own pipeline, that a step is not a check. It is a list of THEIR
|
|
8
|
-
* steps and never a list of check names of ours, which is the whole of what keeps it from being
|
|
9
|
-
* the prefix rule arriving one layer along.
|
|
10
|
-
*
|
|
11
|
-
* AN ENTRY IS `<workflow file>:<job id>:<step name>` AND IS MATCHED EXACTLY. One form and no
|
|
12
|
-
* grammar, and the form itself is stated once next door (`parse/stepNames`) because the report
|
|
13
|
-
* names a step that way in every section that names one at all. Fully qualified because a bare name is ambiguous in a real tree — `Typecheck` is a
|
|
14
|
-
* check in this repository's `ci.yml` and plumbing in its `release.yml`, and a bare-name entry
|
|
15
|
-
* would take out both, the second of them a check deleted from the report with nothing said. The
|
|
16
|
-
* job and the source are exactly what the walk was widened to carry (3F-3352), and this is what
|
|
17
|
-
* that was for.
|
|
18
|
-
*
|
|
19
|
-
* NO PREFIX AND NO WILDCARD FORM, argued rather than omitted. A consumer wanting a whole workflow
|
|
20
|
-
* out narrows `--ci`, a supported narrowing the corpus already pins (@SCN-USG-008), so a second
|
|
21
|
-
* way to say the same thing buys a grammar to specify, to test and to explain. Exact-only can be
|
|
22
|
-
* widened later and breaks nobody; starting wide cannot be narrowed once a manifest depends on it.
|
|
23
|
-
*
|
|
24
|
-
* THE PARTITION IS TOTAL, and that is this reader's shape rather than a convenience. Every entry
|
|
25
|
-
* the target wrote is either one that named a step or one that named none, and both halves are
|
|
26
|
-
* returned because both have to be SAID: the first is a step that leaves the report accounted for
|
|
27
|
-
* rather than vanished, and the second is a stale line the consumer wrote that hides nothing —
|
|
28
|
-
* a rename that has already happened, or one that is about to hide the wrong thing. An entry lost
|
|
29
|
-
* between the two halves would be an exclusion nothing anywhere accounts for.
|
|
30
|
-
*
|
|
31
|
-
* THE SEAM IS A FUNCTION, for the reason the citation seam beside it is (`runningStaticChecks`):
|
|
32
|
-
* what the discovery reader needs is one answer per step, not this module's two lists and the
|
|
33
|
-
* rule for turning them into one. Handing it the lists would put the qualification rule inside an
|
|
34
|
-
* observer that has no business restating it, and a second statement of that rule is a second
|
|
35
|
-
* chance for the two to disagree about which step an entry names.
|
|
36
|
-
*
|
|
37
|
-
* NO FILESYSTEM, AND THE NAMES ARE INJECTED. `ciSources` is an array of anonymous source strings
|
|
38
|
-
* — `ciSourcePaths.ts` is explicit that keeping the core that way is the point — so the mapping
|
|
39
|
-
* from a step's source index back to a workflow file is made at the CLI edge, where the paths were
|
|
40
|
-
* already resolved, and arrives here as data. A source this run was given no name for can be
|
|
41
|
-
* named by nobody, so no entry excludes it: the safe direction, and the one that stops two
|
|
42
|
-
* nameless sources answering for each other.
|
|
43
|
-
*/
|
|
44
1
|
import { type CiWorkflowStep } from "./checkScriptsRunInCI.js";
|
|
45
|
-
/** What a target's `notChecks` list yielded — the entries that named a step, and those that did not. */
|
|
46
2
|
export interface StepExclusions {
|
|
47
|
-
/** The entries that named a step this run read, in the order the manifest wrote them. */
|
|
48
3
|
readonly excluded: readonly string[];
|
|
49
|
-
/** The entries that named none, in the order the manifest wrote them. */
|
|
50
4
|
readonly unmatchedEntries: readonly string[];
|
|
51
|
-
/** Whether the consumer named this step a non-check. */
|
|
52
5
|
readonly isExcluded: (step: CiWorkflowStep) => boolean;
|
|
53
6
|
}
|
|
54
7
|
export declare function stepExclusions(ciSources: readonly string[], ciSourceNames: readonly string[], notChecks: readonly string[]): StepExclusions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepExclusions.d.ts","sourceRoot":"","sources":["../../src/parse/stepExclusions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stepExclusions.d.ts","sourceRoot":"","sources":["../../src/parse/stepExclusions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGhF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC;CACxD;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,cAAc,CAgBhB"}
|
|
@@ -1,51 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* THE CONSUMER'S OWN EXCLUSIONS (@SCN-USG-015, 3F-3343) — which steps of a target's pipeline its
|
|
3
|
-
* manifest names non-checks, and which of the entries that named them named nothing at all.
|
|
4
|
-
*
|
|
5
|
-
* THE THIRD EXCLUSION, AND THE ONLY ONE THAT IS A LIST SOMEBODY WRITES. The reconciler is excluded
|
|
6
|
-
* by construction and a behavioural runner by a rule over what the target named; this one is the
|
|
7
|
-
* consumer saying, about their own pipeline, that a step is not a check. It is a list of THEIR
|
|
8
|
-
* steps and never a list of check names of ours, which is the whole of what keeps it from being
|
|
9
|
-
* the prefix rule arriving one layer along.
|
|
10
|
-
*
|
|
11
|
-
* AN ENTRY IS `<workflow file>:<job id>:<step name>` AND IS MATCHED EXACTLY. One form and no
|
|
12
|
-
* grammar, and the form itself is stated once next door (`parse/stepNames`) because the report
|
|
13
|
-
* names a step that way in every section that names one at all. Fully qualified because a bare name is ambiguous in a real tree — `Typecheck` is a
|
|
14
|
-
* check in this repository's `ci.yml` and plumbing in its `release.yml`, and a bare-name entry
|
|
15
|
-
* would take out both, the second of them a check deleted from the report with nothing said. The
|
|
16
|
-
* job and the source are exactly what the walk was widened to carry (3F-3352), and this is what
|
|
17
|
-
* that was for.
|
|
18
|
-
*
|
|
19
|
-
* NO PREFIX AND NO WILDCARD FORM, argued rather than omitted. A consumer wanting a whole workflow
|
|
20
|
-
* out narrows `--ci`, a supported narrowing the corpus already pins (@SCN-USG-008), so a second
|
|
21
|
-
* way to say the same thing buys a grammar to specify, to test and to explain. Exact-only can be
|
|
22
|
-
* widened later and breaks nobody; starting wide cannot be narrowed once a manifest depends on it.
|
|
23
|
-
*
|
|
24
|
-
* THE PARTITION IS TOTAL, and that is this reader's shape rather than a convenience. Every entry
|
|
25
|
-
* the target wrote is either one that named a step or one that named none, and both halves are
|
|
26
|
-
* returned because both have to be SAID: the first is a step that leaves the report accounted for
|
|
27
|
-
* rather than vanished, and the second is a stale line the consumer wrote that hides nothing —
|
|
28
|
-
* a rename that has already happened, or one that is about to hide the wrong thing. An entry lost
|
|
29
|
-
* between the two halves would be an exclusion nothing anywhere accounts for.
|
|
30
|
-
*
|
|
31
|
-
* THE SEAM IS A FUNCTION, for the reason the citation seam beside it is (`runningStaticChecks`):
|
|
32
|
-
* what the discovery reader needs is one answer per step, not this module's two lists and the
|
|
33
|
-
* rule for turning them into one. Handing it the lists would put the qualification rule inside an
|
|
34
|
-
* observer that has no business restating it, and a second statement of that rule is a second
|
|
35
|
-
* chance for the two to disagree about which step an entry names.
|
|
36
|
-
*
|
|
37
|
-
* NO FILESYSTEM, AND THE NAMES ARE INJECTED. `ciSources` is an array of anonymous source strings
|
|
38
|
-
* — `ciSourcePaths.ts` is explicit that keeping the core that way is the point — so the mapping
|
|
39
|
-
* from a step's source index back to a workflow file is made at the CLI edge, where the paths were
|
|
40
|
-
* already resolved, and arrives here as data. A source this run was given no name for can be
|
|
41
|
-
* named by nobody, so no entry excludes it: the safe direction, and the one that stops two
|
|
42
|
-
* nameless sources answering for each other.
|
|
43
|
-
*/
|
|
44
1
|
import { ciWorkflowSteps } from "./checkScriptsRunInCI.js";
|
|
45
2
|
import { qualifiedStepName } from "./stepNames.js";
|
|
46
3
|
export function stepExclusions(ciSources, ciSourceNames, notChecks) {
|
|
47
|
-
// THE WALK, of which every other reader on this axis takes its own projection (3F-3352) — the
|
|
48
|
-
// same parse, so an entry can never name a step the discovery reader did not see.
|
|
49
4
|
const named = new Set(ciWorkflowSteps(ciSources).flatMap((step) => {
|
|
50
5
|
const name = qualifiedStepName(step, ciSourceNames);
|
|
51
6
|
return name === undefined ? [] : [name];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepExclusions.js","sourceRoot":"","sources":["../../src/parse/stepExclusions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stepExclusions.js","sourceRoot":"","sources":["../../src/parse/stepExclusions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAuB,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAQnD,MAAM,UAAU,cAAc,CAC5B,SAA4B,EAC5B,aAAgC,EAChC,SAA4B;IAE5B,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,eAAe,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACpD,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CACH,CAAC;IACF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,OAAO;QACL,QAAQ;QACR,gBAAgB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChE,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACpD,OAAO,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,30 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HOW A STEP IS NAMED BACK TO THE CONSUMER — `<workflow file>:<job id>:<step name>`, stated once.
|
|
3
|
-
*
|
|
4
|
-
* ONE STATEMENT OF THE FORM, because two readers now depend on it and they must not be free to
|
|
5
|
-
* disagree. A `notChecks` entry is written in this form and matched against it
|
|
6
|
-
* (`parse/stepExclusions`), and the report names a step in this form in every section that names
|
|
7
|
-
* one at all — the consumer's own exclusions, and the reconciler's own steps
|
|
8
|
-
* (`parse/reconcilerSteps`). A second spelling would mean a consumer copying a name off one
|
|
9
|
-
* section of the report and finding it matches nothing when they write it into the other.
|
|
10
|
-
*
|
|
11
|
-
* FULLY QUALIFIED, and that is what the walk was widened to carry (3F-3352). `Typecheck` is a
|
|
12
|
-
* check in this repository's `ci.yml` and plumbing in its `release.yml`, so a bare name is
|
|
13
|
-
* ambiguous in any real tree — as an entry it would take out both, and as a report line it would
|
|
14
|
-
* leave a reader unable to tell which of the two was meant.
|
|
15
|
-
*
|
|
16
|
-
* THE STEP'S OWN HALF IS GITHUB'S. Its `name:`, else the action it `uses:`, else the first
|
|
17
|
-
* non-blank line of its `run:` — the string GitHub itself shows in a run log, so a consumer
|
|
18
|
-
* reading a report line or writing an entry copies what is already in front of them.
|
|
19
|
-
*
|
|
20
|
-
* NO NAME FOR THE SOURCE MEANS NO QUALIFIED NAME. `ciSources` is an array of anonymous source
|
|
21
|
-
* strings and the core holds no filesystem — `ciSourcePaths.ts` is explicit that keeping it that
|
|
22
|
-
* way is the point — so the names arrive as data from the CLI edge. A source this run was given
|
|
23
|
-
* none for can be named by nobody, and what each caller does with that silence is its own: an
|
|
24
|
-
* entry excludes no such step (the safe direction), and the reconciler account falls back to the
|
|
25
|
-
* step's own identity rather than dropping a step it recognised.
|
|
26
|
-
*/
|
|
27
1
|
import type { CiWorkflowStep } from "./checkScriptsRunInCI.js";
|
|
28
|
-
/** The one string that names this step, or nothing for a step whose source has no name. */
|
|
29
2
|
export declare function qualifiedStepName(step: CiWorkflowStep, ciSourceNames: readonly string[]): string | undefined;
|
|
30
3
|
//# sourceMappingURL=stepNames.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepNames.d.ts","sourceRoot":"","sources":["../../src/parse/stepNames.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stepNames.d.ts","sourceRoot":"","sources":["../../src/parse/stepNames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,cAAc,EACpB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,MAAM,GAAG,SAAS,CAGpB"}
|
package/dist/parse/stepNames.js
CHANGED
|
@@ -1,30 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HOW A STEP IS NAMED BACK TO THE CONSUMER — `<workflow file>:<job id>:<step name>`, stated once.
|
|
3
|
-
*
|
|
4
|
-
* ONE STATEMENT OF THE FORM, because two readers now depend on it and they must not be free to
|
|
5
|
-
* disagree. A `notChecks` entry is written in this form and matched against it
|
|
6
|
-
* (`parse/stepExclusions`), and the report names a step in this form in every section that names
|
|
7
|
-
* one at all — the consumer's own exclusions, and the reconciler's own steps
|
|
8
|
-
* (`parse/reconcilerSteps`). A second spelling would mean a consumer copying a name off one
|
|
9
|
-
* section of the report and finding it matches nothing when they write it into the other.
|
|
10
|
-
*
|
|
11
|
-
* FULLY QUALIFIED, and that is what the walk was widened to carry (3F-3352). `Typecheck` is a
|
|
12
|
-
* check in this repository's `ci.yml` and plumbing in its `release.yml`, so a bare name is
|
|
13
|
-
* ambiguous in any real tree — as an entry it would take out both, and as a report line it would
|
|
14
|
-
* leave a reader unable to tell which of the two was meant.
|
|
15
|
-
*
|
|
16
|
-
* THE STEP'S OWN HALF IS GITHUB'S. Its `name:`, else the action it `uses:`, else the first
|
|
17
|
-
* non-blank line of its `run:` — the string GitHub itself shows in a run log, so a consumer
|
|
18
|
-
* reading a report line or writing an entry copies what is already in front of them.
|
|
19
|
-
*
|
|
20
|
-
* NO NAME FOR THE SOURCE MEANS NO QUALIFIED NAME. `ciSources` is an array of anonymous source
|
|
21
|
-
* strings and the core holds no filesystem — `ciSourcePaths.ts` is explicit that keeping it that
|
|
22
|
-
* way is the point — so the names arrive as data from the CLI edge. A source this run was given
|
|
23
|
-
* none for can be named by nobody, and what each caller does with that silence is its own: an
|
|
24
|
-
* entry excludes no such step (the safe direction), and the reconciler account falls back to the
|
|
25
|
-
* step's own identity rather than dropping a step it recognised.
|
|
26
|
-
*/
|
|
27
|
-
/** The one string that names this step, or nothing for a step whose source has no name. */
|
|
28
1
|
export function qualifiedStepName(step, ciSourceNames) {
|
|
29
2
|
const source = ciSourceNames[step.sourceIndex];
|
|
30
3
|
return source === undefined ? undefined : `${source}:${step.jobId}:${step.identity}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepNames.js","sourceRoot":"","sources":["../../src/parse/stepNames.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stepNames.js","sourceRoot":"","sources":["../../src/parse/stepNames.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAC/B,IAAoB,EACpB,aAAgC;IAEhC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;AACvF,CAAC"}
|
|
@@ -1,85 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The TARGET's feature corpus read into the readings one reconciliation needs — moved here from
|
|
3
|
-
* the app's ingest edge (3F-3088).
|
|
4
|
-
*
|
|
5
|
-
* WHY IT LIVES IN THE ENGINE. Every line of it is a pure function of sources somebody else already
|
|
6
|
-
* read off disk: the obligation rule is `parseScenarios`, core's own. Sitting at the app edge it
|
|
7
|
-
* was the reason a PUBLISHED module imported core's unpublished `/internal` subpath for five
|
|
8
|
-
* symbols — the fault 3F-3086 repairs. One line made it impure and it was the only one: the feature discovery, which now
|
|
9
|
-
* happens at the edge and arrives as `sources`.
|
|
10
|
-
*
|
|
11
|
-
* THE REGISTRY-KEYED READING THIS FILE ONCE ALSO PRODUCED — `checkHandles` and `citedScn`, the
|
|
12
|
-
* obligation-side observer's feed — RETIRED WITH THE REGISTRY ITSELF (3F-3161, @SCN-LNT-017, the
|
|
13
|
-
* last registry-`scn` scenario). Every check now either states its own row's code on its CI step
|
|
14
|
-
* (`citedRow`, below) or is a converted `@fitness` row read through `domain/fitnessChecks`
|
|
15
|
-
* directly; there is no second discovery left to key a handle set off.
|
|
16
|
-
*/
|
|
17
|
-
import type { FitnessCheckIndex, UnspecifiedFitnessRow } from "../domain/fitnessChecks.js";
|
|
18
1
|
import { type ScriptCitation } from "./fitnessCitations.js";
|
|
19
2
|
import type { Scenario } from "../model.js";
|
|
20
|
-
/**
|
|
21
|
-
* The target's feature corpus as ONE run reads it — the obligations it raises, the `@SCN` a run
|
|
22
|
-
* whose CI step states a code cites, the scenarios on the fitness axis no configured row names,
|
|
23
|
-
* and the configured rows the corpus carries no scenario for.
|
|
24
|
-
*
|
|
25
|
-
* THE READINGS ARE ONE, which is why they are produced together. All are derived from the same
|
|
26
|
-
* bytes and the same configured rows, and the fault they exist to foreclose is precisely their
|
|
27
|
-
* disagreeing: a citation resolved against a corpus the ledger was not built from names a row
|
|
28
|
-
* nobody wrote (@SCN-LNT-009). Returning them separately would leave a caller free to assemble
|
|
29
|
-
* them from different reads.
|
|
30
|
-
*
|
|
31
|
-
* EVERY INPUT IS THE TARGET'S (@SCN-LNT-005). `fitnessChecks` came from the target's manifest and
|
|
32
|
-
* the sources from the target's features directory, so a configured row means what that target
|
|
33
|
-
* says it means and the scenario carrying its `@SCN` is one that target wrote.
|
|
34
|
-
*/
|
|
35
3
|
export interface TargetCorpus {
|
|
36
|
-
/** The `@SCN`-carrying scenarios, with their evidence obligations raised. */
|
|
37
4
|
scenarios: Scenario[];
|
|
38
|
-
/**
|
|
39
|
-
* What a run whose CI step STATES a code cites — the configured row that code names, read for
|
|
40
|
-
* the characteristic a CI step cannot state (@SCN-LNT-031).
|
|
41
|
-
*
|
|
42
|
-
* NO CODE IS THE SAME ANSWER AS AN UNANSWERED ONE — `null`, the run cites nothing, and it posts
|
|
43
|
-
* to suspense. That is the state a consumer starts in, and this seam does not narrow it.
|
|
44
|
-
*/
|
|
45
5
|
citedRow: (citedScn: string | undefined) => ScriptCitation | null;
|
|
46
|
-
/**
|
|
47
|
-
* The scenarios ON the fitness axis that no configured row NAMES (@SCN-LNT-020) — the corpus's
|
|
48
|
-
* half-converted checks, in corpus order.
|
|
49
|
-
*
|
|
50
|
-
* It belongs with the other readings because it is the same one: the obligation rule raises
|
|
51
|
-
* nothing for such a scenario, and this says WHICH ones. Produced here, where the corpus walk and
|
|
52
|
-
* the configured rows are both in hand, so the naming and the raising cannot be taken from
|
|
53
|
-
* different reads — the same guarantee `citedRow` is composed here for.
|
|
54
|
-
*/
|
|
55
|
-
unconfiguredFitnessScenarios: readonly string[];
|
|
56
|
-
/**
|
|
57
|
-
* The CONFIGURED ROWS the corpus carries no scenario for (@SCN-LNT-027, 3F-3472) — the other
|
|
58
|
-
* direction of the same disagreement, in manifest order, each with the characteristic its debit
|
|
59
|
-
* is owed at.
|
|
60
|
-
*
|
|
61
|
-
* IT IS HERE FOR THE MIRROR'S REASON AND NOT A WEAKER ONE. The corpus walk and the configured
|
|
62
|
-
* rows are both in hand exactly once, so the rows this names and the obligations `scenarios`
|
|
63
|
-
* raises are taken from ONE read of each side. Computed at the composition from `corpus.scenarios`
|
|
64
|
-
* it would be a second walk, free to disagree with the walk the obligations came from — which is
|
|
65
|
-
* the fault this whole reading exists to foreclose.
|
|
66
|
-
*/
|
|
67
|
-
unspecifiedFitnessRows: readonly UnspecifiedFitnessRow[];
|
|
68
6
|
}
|
|
69
|
-
|
|
70
|
-
* THE SOURCES ARRIVE READ, AND THAT IS THE WHOLE OF WHAT MOVED. The edge discovers the target's
|
|
71
|
-
* feature files and reads them ONCE, so the reading a citing run needs is still taken from the same
|
|
72
|
-
* bytes. Two discoveries could disagree about the corpus, and a citation resolved against a corpus
|
|
73
|
-
* the ledger was not built from is exactly the phantom-row fault (@SCN-LNT-009); passing one array
|
|
74
|
-
* preserves that guarantee where a features directory would have re-opened the question inside the
|
|
75
|
-
* engine.
|
|
76
|
-
*/
|
|
77
|
-
export declare function readTargetCorpus(sources: readonly string[], deferralTags: readonly string[],
|
|
78
|
-
/**
|
|
79
|
-
* The target's CONFIGURED ROWS (@SCN-LNT-018) — the CONVERTED route's half of the debit side. It
|
|
80
|
-
* reaches `parseScenarios`, which raises the Evidence Obligations, and `citedRow`, which reads a
|
|
81
|
-
* row back for a run whose CI step states its code (@SCN-LNT-031) — the same rows on both sides,
|
|
82
|
-
* which is the whole reason this reading is composed here.
|
|
83
|
-
*/
|
|
84
|
-
fitnessChecks: FitnessCheckIndex): TargetCorpus;
|
|
7
|
+
export declare function readTargetCorpus(sources: readonly string[], deferralTags: readonly string[]): TargetCorpus;
|
|
85
8
|
//# sourceMappingURL=targetCorpus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targetCorpus.d.ts","sourceRoot":"","sources":["../../src/parse/targetCorpus.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"targetCorpus.d.ts","sourceRoot":"","sources":["../../src/parse/targetCorpus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,cAAc,GAAG,IAAI,CAAC;CACnE;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,YAAY,CAKd"}
|
|
@@ -1,51 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The TARGET's feature corpus read into the readings one reconciliation needs — moved here from
|
|
3
|
-
* the app's ingest edge (3F-3088).
|
|
4
|
-
*
|
|
5
|
-
* WHY IT LIVES IN THE ENGINE. Every line of it is a pure function of sources somebody else already
|
|
6
|
-
* read off disk: the obligation rule is `parseScenarios`, core's own. Sitting at the app edge it
|
|
7
|
-
* was the reason a PUBLISHED module imported core's unpublished `/internal` subpath for five
|
|
8
|
-
* symbols — the fault 3F-3086 repairs. One line made it impure and it was the only one: the feature discovery, which now
|
|
9
|
-
* happens at the edge and arrives as `sources`.
|
|
10
|
-
*
|
|
11
|
-
* THE REGISTRY-KEYED READING THIS FILE ONCE ALSO PRODUCED — `checkHandles` and `citedScn`, the
|
|
12
|
-
* obligation-side observer's feed — RETIRED WITH THE REGISTRY ITSELF (3F-3161, @SCN-LNT-017, the
|
|
13
|
-
* last registry-`scn` scenario). Every check now either states its own row's code on its CI step
|
|
14
|
-
* (`citedRow`, below) or is a converted `@fitness` row read through `domain/fitnessChecks`
|
|
15
|
-
* directly; there is no second discovery left to key a handle set off.
|
|
16
|
-
*/
|
|
17
1
|
import { citationOfCitedRow } from "./fitnessCitations.js";
|
|
18
|
-
import { parseScenarios,
|
|
19
|
-
|
|
20
|
-
* THE SOURCES ARRIVE READ, AND THAT IS THE WHOLE OF WHAT MOVED. The edge discovers the target's
|
|
21
|
-
* feature files and reads them ONCE, so the reading a citing run needs is still taken from the same
|
|
22
|
-
* bytes. Two discoveries could disagree about the corpus, and a citation resolved against a corpus
|
|
23
|
-
* the ledger was not built from is exactly the phantom-row fault (@SCN-LNT-009); passing one array
|
|
24
|
-
* preserves that guarantee where a features directory would have re-opened the question inside the
|
|
25
|
-
* engine.
|
|
26
|
-
*/
|
|
27
|
-
export function readTargetCorpus(sources, deferralTags,
|
|
28
|
-
/**
|
|
29
|
-
* The target's CONFIGURED ROWS (@SCN-LNT-018) — the CONVERTED route's half of the debit side. It
|
|
30
|
-
* reaches `parseScenarios`, which raises the Evidence Obligations, and `citedRow`, which reads a
|
|
31
|
-
* row back for a run whose CI step states its code (@SCN-LNT-031) — the same rows on both sides,
|
|
32
|
-
* which is the whole reason this reading is composed here.
|
|
33
|
-
*/
|
|
34
|
-
fitnessChecks) {
|
|
35
|
-
// NO BARE CHECK TAG RAISES AN OBLIGATION ON A TARGET'S CORPUS. The registered half of the
|
|
36
|
-
// union retired with the registry (3F-3161) and the measured half with the measured axis
|
|
37
|
-
// (3F-3516), so the bare-tag set handed to `parseScenarios` is empty: a fitness obligation is
|
|
38
|
-
// raised by the axis word and a configured row, and by nothing else.
|
|
39
|
-
const scenarios = sources.flatMap((source) => parseScenarios(source, deferralTags, [], fitnessChecks));
|
|
40
|
-
// THE TAGGED WALK THE TWO CORPUS-VS-MANIFEST READINGS SHARE. Kept as its own pass over the
|
|
41
|
-
// sources, and handed to BOTH of them — the disagreement each names is the other's direction, so
|
|
42
|
-
// taking them from one walk is what stops one reading seeing a scenario the other does not.
|
|
43
|
-
const tagged = sources.flatMap((source) => parseTaggedScenarios(source));
|
|
2
|
+
import { parseScenarios, } from "./scenarios.js";
|
|
3
|
+
export function readTargetCorpus(sources, deferralTags) {
|
|
44
4
|
return {
|
|
45
|
-
scenarios,
|
|
46
|
-
citedRow: (citedScn) => citationOfCitedRow(citedScn
|
|
47
|
-
unconfiguredFitnessScenarios: unconfiguredFitnessScenarios(tagged, fitnessChecks),
|
|
48
|
-
unspecifiedFitnessRows: unspecifiedFitnessRows(tagged, fitnessChecks),
|
|
5
|
+
scenarios: sources.flatMap((source) => parseScenarios(source, deferralTags)),
|
|
6
|
+
citedRow: (citedScn) => citationOfCitedRow(citedScn),
|
|
49
7
|
};
|
|
50
8
|
}
|
|
51
9
|
//# sourceMappingURL=targetCorpus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targetCorpus.js","sourceRoot":"","sources":["../../src/parse/targetCorpus.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"targetCorpus.js","sourceRoot":"","sources":["../../src/parse/targetCorpus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAuB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EACL,cAAc,GAEf,MAAM,gBAAgB,CAAC;AAQxB,MAAM,UAAU,gBAAgB,CAC9B,OAA0B,EAC1B,YAA+B;IAE/B,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC5E,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -1,166 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
* The TARGET's `specController.*` configuration, read into the rows and mints the
|
|
3
|
-
* reconciler takes — the `resolve*` family, moved here from the app's ingest edge (3F-3087).
|
|
4
|
-
*
|
|
5
|
-
* WHY THEY LIVE IN THE ENGINE. Every one of them is a pure function of a manifest object
|
|
6
|
-
* somebody else already read off disk, and every one of them is the ONE reading of the key it
|
|
7
|
-
* names — `fitnessChecksOf` and `bareTerm` are both core's, so the reader and the
|
|
8
|
-
* thing it reads through belonged on the same side of the package boundary. Sitting at the app
|
|
9
|
-
* edge they were the reason a PUBLISHED module imported core's unpublished `/internal` subpath,
|
|
10
|
-
* which is the fault 3F-3086 repairs; nothing about reading a parsed manifest ever needed the
|
|
11
|
-
* edge that produced it.
|
|
12
|
-
*
|
|
13
|
-
* WHAT THE EDGE STILL OWES THEM, AND WHY IT IS A PARAMETER. One of these readings depends on
|
|
14
|
-
* something the engine must not know: the deferral-tag STARTER SET is product policy the
|
|
15
|
-
* application layer single-sources (`DEFAULT_DEFERRAL_TAGS`). It arrives as an argument, as data,
|
|
16
|
-
* so the engine keeps knowing nothing about files (`lint:boundaries`' `core-imports-io` rule,
|
|
17
|
-
* which was @SCN-EPG-001's `io-import` arm until 3F-3437; and 3F-2841's pattern: a project-owned
|
|
18
|
-
* term arrives as an input).
|
|
19
|
-
*
|
|
20
|
-
* DEFENSIVE THROUGHOUT, AND THAT IS THE FAMILY'S STANCE RATHER THAN LOCAL CHOICES PER RESOLVER.
|
|
21
|
-
* Config is data from outside: a missing, non-object or array-shaped value resolves EMPTY, and a
|
|
22
|
-
* malformed entry is dropped by the reading function it is handed to rather than thrown. A check
|
|
23
|
-
* that throws on a typo produces no verdict at all.
|
|
24
|
-
*/
|
|
25
|
-
import { type FitnessCheckIndex } from "../domain/fitnessChecks.js";
|
|
26
|
-
/**
|
|
27
|
-
* The steps the TARGET names NON-CHECKS (@SCN-USG-015, 3F-3343) — `specController.notChecks`, read
|
|
28
|
-
* as the fully-qualified `<workflow file>:<job id>:<step name>` entries the target wrote.
|
|
29
|
-
*
|
|
30
|
-
* IT IS THE CONSUMER'S OWN LIST, and that is the whole reason it may exist at all. Not everything
|
|
31
|
-
* that is not a behavioural runner is a fitness check — a checkout, a dependency install, a deploy
|
|
32
|
-
* — and this axis's standing rule is that a list of check NAMES is the drift. A list of the
|
|
33
|
-
* consumer's own STEPS is the opposite thing: it is about their pipeline, it is written once, and
|
|
34
|
-
* nothing in this tree has an opinion about what is on it.
|
|
35
|
-
*
|
|
36
|
-
* The seventh of this family's `specController.*` resolvers, and defensive like the six above it:
|
|
37
|
-
* a missing or non-array value resolves EMPTY and a non-string entry is dropped rather than
|
|
38
|
-
* thrown. Deduplicated, as the configured-static-check list beside it is, so a target that wrote
|
|
39
|
-
* one line twice is reported one line — the account below is per ENTRY, and the same entry twice
|
|
40
|
-
* is one thing the consumer said.
|
|
41
|
-
*
|
|
42
|
-
* WHAT AN ENTRY MEANS IS NOT DECIDED HERE. This reader takes the list off the manifest; matching it
|
|
43
|
-
* against a pipeline, and saying which entries matched nothing, is `parse/stepExclusions`.
|
|
44
|
-
*/
|
|
1
|
+
import type { WrongKindEntry } from "../domain/evidenceReconciliation.js";
|
|
45
2
|
export declare function resolveNotChecks(packageJson: {
|
|
46
3
|
specController?: {
|
|
47
4
|
notChecks?: unknown;
|
|
48
5
|
};
|
|
49
6
|
}): readonly string[];
|
|
50
|
-
/**
|
|
51
|
-
* Resolve the recognised deferral-tag set for the target (@SCN-PND-021) — the app's single-sourced
|
|
52
|
-
* starter set EXTENDED by the target `package.json`'s `specController.deferralTags`. Config
|
|
53
|
-
* EXTENDS, never replaces: a project cannot un-recognise a built-in (`@wip` always defers).
|
|
54
|
-
* Configured tags are bare names, `@`-stripped, consistent with the starter set; non-string /
|
|
55
|
-
* non-array config is ignored defensively. `parseScenarios` then takes the union as its injected
|
|
56
|
-
* `deferralTags` param.
|
|
57
|
-
*
|
|
58
|
-
* THE STARTER SET ARRIVES AS AN ARGUMENT AND IS NOT THE ENGINE'S TO HOLD (3F-3087). Which
|
|
59
|
-
* community tags defer is product policy — an evolvable list of strings the application layer
|
|
60
|
-
* single-sources as `DEFAULT_DEFERRAL_TAGS` — and a core-held copy would be a second statement of
|
|
61
|
-
* it. So the union is computed here, where the config read is, and the policy is handed in.
|
|
62
|
-
*/
|
|
63
7
|
export declare function resolveDeferralTags(packageJson: {
|
|
64
8
|
specController?: {
|
|
65
9
|
deferralTags?: unknown;
|
|
66
10
|
};
|
|
67
|
-
},
|
|
68
|
-
/** The application layer's starter set — the built-ins a target's config may only extend. */
|
|
69
|
-
starterTags: readonly string[]): readonly string[];
|
|
70
|
-
/**
|
|
71
|
-
* The TARGET's CONFIGURED FITNESS ROWS (@SCN-LNT-018) — `specController.fitnessChecks`, read as
|
|
72
|
-
* `@SCN → the characteristic that scenario asserts` through the engine's own `fitnessChecksOf`.
|
|
73
|
-
*
|
|
74
|
-
* THE DEBIT SIDE OF A CONVERTED CHECK. A converted scenario carries `@fitness` and nothing about
|
|
75
|
-
* its subject, so the characteristic it owes comes from here — and from the row whose `scn` is that
|
|
76
|
-
* scenario's own, which is what removes the registry hop an unconverted static check needs.
|
|
77
|
-
*
|
|
78
|
-
* IT IS THE TARGET'S, for the reason the check registry and the ceilings are (@SCN-LNT-005): a
|
|
79
|
-
* characteristic means what the target says it means, and a row resolved from this tool's own
|
|
80
|
-
* manifest would put an obligation on a target's books under a word it never wrote.
|
|
81
|
-
*
|
|
82
|
-
* The fifth of this family's `specController.*` resolvers, and defensive like the four above it: a
|
|
83
|
-
* missing or wrongly-shaped config resolves EMPTY, and a malformed row is dropped by
|
|
84
|
-
* `fitnessChecksOf` rather than thrown. There is no starter set: a target that has converted
|
|
85
|
-
* nothing owes nothing on this route, which is what keeps the reading inert on an unswept corpus.
|
|
86
|
-
*/
|
|
87
|
-
export declare function resolveFitnessChecks(packageJson: {
|
|
88
|
-
specController?: {
|
|
89
|
-
fitnessChecks?: unknown;
|
|
90
|
-
};
|
|
91
|
-
}): FitnessCheckIndex;
|
|
92
|
-
/**
|
|
93
|
-
* WHAT A TARGET'S RUNNER BLOCK YIELDED — the entries keyed by a canon tier, and the keys that are
|
|
94
|
-
* not one (@SCN-USG-019).
|
|
95
|
-
*
|
|
96
|
-
* TWO HALVES RATHER THAN ONE RECORD, because the two are used for opposite things and neither may
|
|
97
|
-
* be reached for the other. `tiers` is what a recognition can be run against; `unrecognisedKeys` is
|
|
98
|
-
* what the report has to SAY, and it recognises nothing by construction — there is no tier for it
|
|
99
|
-
* to be the runner of. Returning one record and filtering downstream would leave every caller free
|
|
100
|
-
* to honour a key the block's closure rules out, which is the fault this partition forecloses.
|
|
101
|
-
*/
|
|
11
|
+
}, starterTags: readonly string[]): readonly string[];
|
|
102
12
|
export interface ResolvedRunners {
|
|
103
|
-
/** The runner named for each canon tier the block names one for — `null` where it says it has none. */
|
|
104
13
|
readonly tiers: Readonly<Record<string, string | null>>;
|
|
105
|
-
/** The block's keys that are not one of the four canon tiers, in the order the manifest wrote them. */
|
|
106
14
|
readonly unrecognisedKeys: readonly string[];
|
|
107
15
|
}
|
|
108
|
-
/**
|
|
109
|
-
* The TARGET's BEHAVIOURAL RUNNERS (@SCN-USG-011, 3F-3343) — `specController.runners`, read as
|
|
110
|
-
* `tier → the name of the binary that tier's suite runs under`.
|
|
111
|
-
*
|
|
112
|
-
* THE SMALL CLOSED THING, NAMED, so the open one can be inferred. The set of names a quality check
|
|
113
|
-
* might go by is unbounded and belongs to the consumer; the set of behavioural runners is one per
|
|
114
|
-
* tier tag and the tiers are canon. Naming the closed set and deriving the rest is the move the
|
|
115
|
-
* `@fitness` collapse already made one level in (3F-3139), and it cannot go stale by omission.
|
|
116
|
-
*
|
|
117
|
-
* IT IS THE TARGET'S, for the reason the check registry and the ceilings are (@SCN-LNT-005): which
|
|
118
|
-
* command runs a repository's unit suite is a fact about that repository, and a runner resolved
|
|
119
|
-
* from this tool's own manifest would answer for a pipeline this run never looked at.
|
|
120
|
-
*
|
|
121
|
-
* The sixth of this family's `specController.*` resolvers, and defensive like the five above it: a
|
|
122
|
-
* missing, non-object or array-shaped config resolves EMPTY, and an entry whose value is neither a
|
|
123
|
-
* runner's NAME nor `null` is dropped rather than thrown. A manifest naming no runners is not an
|
|
124
|
-
* error — it is a `new-client`, which is the state this axis is sold on.
|
|
125
|
-
*
|
|
126
|
-
* A NULL IS KEPT, AND IT IS THE THIRD STATE (@SCN-USG-016, 3F-3343). `"performance": null` is
|
|
127
|
-
* something the target SAID — we have no performance suite — and a tier the block omits is
|
|
128
|
-
* something it never said. Dropping the null folds the first into the second and loses a fact we
|
|
129
|
-
* were given, in the one direction nothing downstream can recover: after the fold, silence and a
|
|
130
|
-
* stated absence are indistinguishable. Nothing else in this reader's contract moves — a null
|
|
131
|
-
* recognises no step, exactly as a missing key recognises none — so the ONLY place the two can be
|
|
132
|
-
* told apart is this return value and the report rendered off it.
|
|
133
|
-
*
|
|
134
|
-
* THE KEY SET IS CLOSED, AND THE PARTITION IS THIS READER'S (@SCN-USG-019, 3F-3343). The block is
|
|
135
|
-
* keyed by TIER and the tiers are canon, which is exactly what makes the whole inversion possible:
|
|
136
|
-
* the closed set is named because it is enumerable, and the open one is inferred from what is left.
|
|
137
|
-
* A key outside the four is therefore not a runner for anything, and both obvious answers to it are
|
|
138
|
-
* wrong. HONOURING it is the smuggling the closure forbids — `"lint": "eslint"` is a consumer taking
|
|
139
|
-
* their own checks out of discovery one key at a time, and it reinstates the silence this axis
|
|
140
|
-
* exists to remove. DROPPING it silently is the same class of fault one layer along: the consumer
|
|
141
|
-
* wrote something, believes it took effect, and has no line anywhere to correct it from. So the key
|
|
142
|
-
* is partitioned out of the runners AND handed back to be named, and the run is not aborted over it.
|
|
143
|
-
*
|
|
144
|
-
* THE FOUR TIERS ARE READ, NEVER RESTATED. `RUNTIME_QUALITY_CHECKS` is the ledger's own enumeration
|
|
145
|
-
* of the runtime tiers; a second copy here would agree with it by coincidence, and a list of names
|
|
146
|
-
* is the drift this ticket is about.
|
|
147
|
-
*
|
|
148
|
-
* THE PARTITION IS ON THE KEY AND THE DEFENSIVE DROP IS ON THE VALUE, and the two are different
|
|
149
|
-
* questions kept apart. A canon tier whose value is neither a runner's NAME nor `null` is malformed
|
|
150
|
-
* config and is dropped, which is this family's stance about data from outside. A key that is not a
|
|
151
|
-
* tier at all is not malformed — there is no tier for any value of it to name a runner for — so its
|
|
152
|
-
* value is beside the point and the key is the fact worth reporting, whatever it was set to.
|
|
153
|
-
*/
|
|
154
16
|
export declare function resolveRunners(packageJson: {
|
|
155
17
|
specController?: {
|
|
156
18
|
runners?: unknown;
|
|
157
19
|
};
|
|
158
20
|
}): ResolvedRunners;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
export declare function
|
|
21
|
+
export interface ConfigurationNotRead {
|
|
22
|
+
readonly wrongKinds: readonly WrongKindEntry[];
|
|
23
|
+
readonly unknownKeys: readonly string[];
|
|
24
|
+
}
|
|
25
|
+
export declare function configurationNotRead(packageJson: {
|
|
164
26
|
specController?: unknown;
|
|
165
|
-
}):
|
|
27
|
+
}): ConfigurationNotRead;
|
|
166
28
|
//# sourceMappingURL=targetManifest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targetManifest.d.ts","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"targetManifest.d.ts","sourceRoot":"","sources":["../../src/parse/targetManifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAY1E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE;IAC5C,cAAc,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,GAAG,SAAS,MAAM,EAAE,CAIpB;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE;IACX,cAAc,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC7C,EACD,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,SAAS,MAAM,EAAE,CASnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE;IAC1C,cAAc,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACxC,GAAG,eAAe,CAWlB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAiCD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,oBAAoB,CAUpG"}
|