@goodbones/campaigns 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/LICENSE +21 -0
- package/build/dts/core/campaign-state.d.ts +38 -0
- package/build/dts/core/campaign-state.d.ts.map +1 -0
- package/build/dts/core/campaigns.d.ts +196 -0
- package/build/dts/core/campaigns.d.ts.map +1 -0
- package/build/dts/core/ledger.d.ts +173 -0
- package/build/dts/core/ledger.d.ts.map +1 -0
- package/build/dts/core/phases.d.ts +26 -0
- package/build/dts/core/phases.d.ts.map +1 -0
- package/build/dts/core/sectors.d.ts +52 -0
- package/build/dts/core/sectors.d.ts.map +1 -0
- package/build/dts/domain/config.d.ts +985 -0
- package/build/dts/domain/config.d.ts.map +1 -0
- package/build/dts/domain/report.d.ts +16 -0
- package/build/dts/domain/report.d.ts.map +1 -0
- package/build/dts/host/campaigns.d.ts +195 -0
- package/build/dts/host/campaigns.d.ts.map +1 -0
- package/build/dts/host/diff.d.ts +31 -0
- package/build/dts/host/diff.d.ts.map +1 -0
- package/build/dts/index.d.ts +17 -0
- package/build/dts/index.d.ts.map +1 -0
- package/build/dts/infrastructure/campaign-functions.d.ts +7 -0
- package/build/dts/infrastructure/campaign-functions.d.ts.map +1 -0
- package/build/dts/infrastructure/report-source-fake.d.ts +4 -0
- package/build/dts/infrastructure/report-source-fake.d.ts.map +1 -0
- package/build/dts/infrastructure/report-source-live.d.ts +3 -0
- package/build/dts/infrastructure/report-source-live.d.ts.map +1 -0
- package/build/dts/load/decode.d.ts +7 -0
- package/build/dts/load/decode.d.ts.map +1 -0
- package/build/dts/load/extension.d.ts +25 -0
- package/build/dts/load/extension.d.ts.map +1 -0
- package/build/dts/manifest/lower.d.ts +14 -0
- package/build/dts/manifest/lower.d.ts.map +1 -0
- package/build/dts/manifest/spec.d.ts +515 -0
- package/build/dts/manifest/spec.d.ts.map +1 -0
- package/build/dts/ports/campaign-predicate.d.ts +23 -0
- package/build/dts/ports/campaign-predicate.d.ts.map +1 -0
- package/build/dts/ports/report-source.d.ts +14 -0
- package/build/dts/ports/report-source.d.ts.map +1 -0
- package/build/dts/testing.d.ts +2 -0
- package/build/dts/testing.d.ts.map +1 -0
- package/build/esm/core/campaign-state.js +140 -0
- package/build/esm/core/campaign-state.js.map +1 -0
- package/build/esm/core/campaigns.js +954 -0
- package/build/esm/core/campaigns.js.map +1 -0
- package/build/esm/core/ledger.js +519 -0
- package/build/esm/core/ledger.js.map +1 -0
- package/build/esm/core/phases.js +87 -0
- package/build/esm/core/phases.js.map +1 -0
- package/build/esm/core/sectors.js +313 -0
- package/build/esm/core/sectors.js.map +1 -0
- package/build/esm/domain/config.js +245 -0
- package/build/esm/domain/config.js.map +1 -0
- package/build/esm/domain/report.js +168 -0
- package/build/esm/domain/report.js.map +1 -0
- package/build/esm/host/campaigns.js +1159 -0
- package/build/esm/host/campaigns.js.map +1 -0
- package/build/esm/host/diff.js +156 -0
- package/build/esm/host/diff.js.map +1 -0
- package/build/esm/index.js +27 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/infrastructure/campaign-functions.js +67 -0
- package/build/esm/infrastructure/campaign-functions.js.map +1 -0
- package/build/esm/infrastructure/report-source-fake.js +6 -0
- package/build/esm/infrastructure/report-source-fake.js.map +1 -0
- package/build/esm/infrastructure/report-source-live.js +165 -0
- package/build/esm/infrastructure/report-source-live.js.map +1 -0
- package/build/esm/load/decode.js +60 -0
- package/build/esm/load/decode.js.map +1 -0
- package/build/esm/load/extension.js +326 -0
- package/build/esm/load/extension.js.map +1 -0
- package/build/esm/manifest/lower.js +488 -0
- package/build/esm/manifest/lower.js.map +1 -0
- package/build/esm/manifest/spec.js +296 -0
- package/build/esm/manifest/spec.js.map +1 -0
- package/build/esm/ports/campaign-predicate.js +2 -0
- package/build/esm/ports/campaign-predicate.js.map +1 -0
- package/build/esm/ports/report-source.js +7 -0
- package/build/esm/ports/report-source.js.map +1 -0
- package/build/esm/testing.js +5 -0
- package/build/esm/testing.js.map +1 -0
- package/package.json +65 -0
- package/src/core/campaign-state.ts +227 -0
- package/src/core/campaigns.ts +1319 -0
- package/src/core/ledger.ts +675 -0
- package/src/core/phases.ts +138 -0
- package/src/core/sectors.ts +399 -0
- package/src/domain/config.ts +314 -0
- package/src/domain/report.ts +203 -0
- package/src/host/campaigns.ts +1664 -0
- package/src/host/diff.ts +203 -0
- package/src/index.ts +256 -0
- package/src/infrastructure/campaign-functions.ts +99 -0
- package/src/infrastructure/report-source-fake.ts +10 -0
- package/src/infrastructure/report-source-live.ts +193 -0
- package/src/load/decode.ts +81 -0
- package/src/load/extension.ts +466 -0
- package/src/manifest/lower.ts +615 -0
- package/src/manifest/spec.ts +364 -0
- package/src/ports/campaign-predicate.ts +29 -0
- package/src/ports/report-source.ts +35 -0
- package/src/testing.ts +4 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { anchored, CONVENTIONS, decodeManifestTree, expandAliases, globsOf, globToRegexSource, lowerManifest, prefixed, } from "@goodbones/core";
|
|
2
|
+
import * as Result from "effect/Result";
|
|
3
|
+
import { durationMs, } from "./spec.js";
|
|
4
|
+
// The campaigns family's lowering: what a reader wrote under `campaigns`,
|
|
5
|
+
// with its globs resolved the way every other family's are, its phases
|
|
6
|
+
// checked for the shapes the design refuses, and an `endState` expanded into
|
|
7
|
+
// one synthetic objective per family.
|
|
8
|
+
//
|
|
9
|
+
// It reaches into @goodbones/core for the glob primitives the core's own
|
|
10
|
+
// lowering uses — `globToRegexSource`, `anchored`, `prefixed`, `expandAliases`
|
|
11
|
+
// and the naming `CONVENTIONS` — because a campaign's `scope` must resolve to
|
|
12
|
+
// exactly the pattern an `imports` rule's would. Writing a second glob
|
|
13
|
+
// compiler here is how the two would drift.
|
|
14
|
+
// The keys of a `syntax` term that belong to the engine's rule; `where` is
|
|
15
|
+
// the one that does not.
|
|
16
|
+
const SYNTAX_RULE_KEYS = [
|
|
17
|
+
"pattern",
|
|
18
|
+
"kind",
|
|
19
|
+
"regex",
|
|
20
|
+
"nthChild",
|
|
21
|
+
"inside",
|
|
22
|
+
"has",
|
|
23
|
+
"precedes",
|
|
24
|
+
"follows",
|
|
25
|
+
"all",
|
|
26
|
+
"any",
|
|
27
|
+
"not",
|
|
28
|
+
];
|
|
29
|
+
const syntaxRuleOf = (term) => Object.fromEntries(SYNTAX_RULE_KEYS.flatMap((key) => (term[key] === undefined ? [] : [[key, term[key]]])));
|
|
30
|
+
// The leaf terms a path alone cannot exercise: each reads the file's text,
|
|
31
|
+
// its syntax, or its facts, so a probe for a detector holding one must carry
|
|
32
|
+
// a `source`.
|
|
33
|
+
const TERMS_NEEDING_SOURCE = ["content", "syntax", "exports", "members", "fn"];
|
|
34
|
+
const leafTermsOf = (detector) => {
|
|
35
|
+
if ("all" in detector)
|
|
36
|
+
return detector.all.flatMap(leafTermsOf);
|
|
37
|
+
if ("any" in detector)
|
|
38
|
+
return detector.any.flatMap(leafTermsOf);
|
|
39
|
+
if ("not" in detector)
|
|
40
|
+
return leafTermsOf(detector.not);
|
|
41
|
+
return Object.keys(detector);
|
|
42
|
+
};
|
|
43
|
+
// The families an `endState` tree can expand into — one synthetic objective
|
|
44
|
+
// per family the lowered tree actually produces rules for.
|
|
45
|
+
const END_STATE_FAMILIES = ["imports", "exports", "members", "surface", "structure"];
|
|
46
|
+
// The id a family's synthetic objective carries, `end-state-<family>`, and
|
|
47
|
+
// its ledger file's name.
|
|
48
|
+
export const endStateObjectiveId = (family) => `end-state-${family}`;
|
|
49
|
+
// The abstract root an `endState` is compiled and probed at, once, before
|
|
50
|
+
// any sector exists to lower it for.
|
|
51
|
+
export const END_STATE_ROOT = "~";
|
|
52
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
53
|
+
// A sector-relative tree lowered for one sector: every `~/` becomes the
|
|
54
|
+
// sector's root, and an allow entry `{ sector, via }` — another sector,
|
|
55
|
+
// through its port — becomes that sector's `via` path for each sector the
|
|
56
|
+
// name selects. The result is an ordinary manifest fragment, lowered by the
|
|
57
|
+
// same pass as the repository's own tree.
|
|
58
|
+
export const lowerEndState = (tree, root, sectors, resolve, languages, aliases = {}) => {
|
|
59
|
+
const rebase = (glob) => glob === "~" || glob === "~/"
|
|
60
|
+
? `${root}/`
|
|
61
|
+
: glob.startsWith("~/")
|
|
62
|
+
? `${root}/${glob.slice(2)}`
|
|
63
|
+
: glob;
|
|
64
|
+
const walk = (value, key) => {
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
return value.flatMap((item) => {
|
|
67
|
+
if (key === "allow" && isRecord(item) && typeof item.via === "string") {
|
|
68
|
+
const named = item.sector;
|
|
69
|
+
// `~/ports/` names a folder: everything under it.
|
|
70
|
+
const via = (item.via.startsWith("~/") ? item.via.slice(2) : String(item.via)).replace(/\/$/, "/**");
|
|
71
|
+
return sectors
|
|
72
|
+
.filter((one) => named === "*" || named === undefined || one.name === named)
|
|
73
|
+
.filter((one) => one.root !== root)
|
|
74
|
+
.map((one) => `${one.root}/${via}`);
|
|
75
|
+
}
|
|
76
|
+
return [walk(item, key)];
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (isRecord(value)) {
|
|
80
|
+
return Object.fromEntries(Object.entries(value).map(([childKey, child]) => [
|
|
81
|
+
key === "children" || key === "" ? rebaseKey(childKey) : childKey,
|
|
82
|
+
walk(child, childKey),
|
|
83
|
+
]));
|
|
84
|
+
}
|
|
85
|
+
return typeof value === "string" ? rebase(value) : value;
|
|
86
|
+
};
|
|
87
|
+
const rebaseKey = (key) => (key === "~/" ? `${root}/` : key);
|
|
88
|
+
const rebased = decodeManifestTree(walk(tree, ""));
|
|
89
|
+
if (Result.isFailure(rebased)) {
|
|
90
|
+
throw new Error(`the endState does not decode as a tree:\n${rebased.failure}`);
|
|
91
|
+
}
|
|
92
|
+
const manifest = { resolve, aliases, tree: rebased.success };
|
|
93
|
+
return lowerManifest(manifest, languages, {});
|
|
94
|
+
};
|
|
95
|
+
// Which families a tree yields at all, decided once at the abstract root.
|
|
96
|
+
const endStateFamiliesOf = (tree, resolve, languages) => {
|
|
97
|
+
const lowered = lowerEndState(tree, END_STATE_ROOT, [], resolve, languages);
|
|
98
|
+
const structure = lowered.structure.roots.length +
|
|
99
|
+
lowered.structure.folders.length +
|
|
100
|
+
lowered.structure.parity.length +
|
|
101
|
+
lowered.structure.naming.length;
|
|
102
|
+
return END_STATE_FAMILIES.filter((family) => family === "structure" ? structure > 0 : lowered[family].length > 0);
|
|
103
|
+
};
|
|
104
|
+
// A stable digest of a phase's definition — its position, its objectives
|
|
105
|
+
// and their detectors — so a change to a defined phase is visible against
|
|
106
|
+
// what the plan file recorded. FNV-1a over the canonical JSON.
|
|
107
|
+
const digest = (value) => {
|
|
108
|
+
const canonical = (one) => Array.isArray(one)
|
|
109
|
+
? one.map(canonical)
|
|
110
|
+
: isRecord(one)
|
|
111
|
+
? Object.fromEntries(Object.keys(one)
|
|
112
|
+
.sort()
|
|
113
|
+
.map((key) => [key, canonical(one[key])]))
|
|
114
|
+
: one;
|
|
115
|
+
const text = JSON.stringify(canonical(value));
|
|
116
|
+
let hash = 0x811c9dc5;
|
|
117
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
118
|
+
hash ^= text.charCodeAt(i);
|
|
119
|
+
hash = Math.imul(hash, 0x01000193);
|
|
120
|
+
}
|
|
121
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
122
|
+
};
|
|
123
|
+
// A campaign lowered: its globs resolved — `scope`, `legacy`, a perimeter's
|
|
124
|
+
// glob or marker, and inside each objective a path-shaped `resolves` the way
|
|
125
|
+
// graph rules resolve theirs, `exports`/`members` names the way `surface`
|
|
126
|
+
// and `members` rules do, the rest carried as written — its phases checked
|
|
127
|
+
// for the shapes the design refuses, and an `endState` expanded into one
|
|
128
|
+
// synthetic objective per family. The `fn` string is kept verbatim for the
|
|
129
|
+
// loader, which holds the function it names.
|
|
130
|
+
const lowerCampaign = (id, campaign, aliases, resolve, languages) => {
|
|
131
|
+
const asPath = (glob) => prefixed(globToRegexSource(expandAliases(glob, aliases), {}, { declaring: false, nextGroup: 1 })
|
|
132
|
+
.source);
|
|
133
|
+
const asName = (globs) => globsOf(globs).map((one) => anchored(globToRegexSource(one, {}, { declaring: false, nextGroup: 1 }).source));
|
|
134
|
+
const asWhole = (globs) => globsOf(globs).map((one) => anchored(globToRegexSource(expandAliases(one, aliases), {}, { declaring: false, nextGroup: 1 })
|
|
135
|
+
.source));
|
|
136
|
+
const refuse = (detail) => {
|
|
137
|
+
throw new Error(`campaign "${id}" ${detail}`);
|
|
138
|
+
};
|
|
139
|
+
const lower = (detector, objective) => {
|
|
140
|
+
if ("all" in detector)
|
|
141
|
+
return { all: detector.all.map((one) => lower(one, objective)) };
|
|
142
|
+
if ("any" in detector)
|
|
143
|
+
return { any: detector.any.map((one) => lower(one, objective)) };
|
|
144
|
+
if ("not" in detector)
|
|
145
|
+
return { not: lower(detector.not, objective) };
|
|
146
|
+
if ("path" in detector) {
|
|
147
|
+
const { convention, ...rest } = detector.path;
|
|
148
|
+
const conventionSource = convention === undefined
|
|
149
|
+
? undefined
|
|
150
|
+
: typeof convention === "string"
|
|
151
|
+
? CONVENTIONS[convention]?.source
|
|
152
|
+
: convention.regex;
|
|
153
|
+
if (convention !== undefined && conventionSource === undefined) {
|
|
154
|
+
refuse(`(${objective}) names an unknown convention "${String(convention)}".`);
|
|
155
|
+
}
|
|
156
|
+
if (conventionSource !== undefined && rest.subject === undefined) {
|
|
157
|
+
refuse(`(${objective}) states a path convention with no \`subject\`: say which ` +
|
|
158
|
+
`capture group of \`file\` holds the name the convention is about.`);
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
path: {
|
|
162
|
+
file: globsOf(rest.file),
|
|
163
|
+
...(rest.fileNot === undefined ? {} : { fileNot: globsOf(rest.fileNot) }),
|
|
164
|
+
...(rest.subject === undefined ? {} : { subject: rest.subject }),
|
|
165
|
+
...(conventionSource === undefined ? {} : { convention: conventionSource }),
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if ("imports" in detector) {
|
|
170
|
+
const { resolves, symbols } = detector.imports;
|
|
171
|
+
return {
|
|
172
|
+
imports: {
|
|
173
|
+
resolves: typeof resolves === "string" ? asPath(resolves) : resolves,
|
|
174
|
+
...(symbols === undefined ? {} : { symbols: [...symbols] }),
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
if ("exports" in detector) {
|
|
179
|
+
const term = detector.exports;
|
|
180
|
+
return {
|
|
181
|
+
exports: {
|
|
182
|
+
...(term.name === undefined ? {} : { name: asName(term.name) }),
|
|
183
|
+
...(term.kinds === undefined ? {} : { kinds: [...term.kinds] }),
|
|
184
|
+
...(term.declares === undefined ? {} : { declares: [...term.declares] }),
|
|
185
|
+
...(term.reexport === undefined ? {} : { reexport: term.reexport }),
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
if ("members" in detector) {
|
|
190
|
+
const term = detector.members;
|
|
191
|
+
return {
|
|
192
|
+
members: {
|
|
193
|
+
subject: term.subject,
|
|
194
|
+
...(term.name === undefined ? {} : { name: asName(term.name) }),
|
|
195
|
+
...(term.in === undefined ? {} : { in: asName(term.in) }),
|
|
196
|
+
...(term.declares === undefined ? {} : { declares: [...term.declares] }),
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
if ("requires" in detector)
|
|
201
|
+
return { requires: [...detector.requires] };
|
|
202
|
+
if ("content" in detector)
|
|
203
|
+
return { content: { regex: detector.content.regex } };
|
|
204
|
+
if ("report" in detector) {
|
|
205
|
+
// Exactly one of `command` and `file`, and a pattern for `regex`: the
|
|
206
|
+
// manifest schema refused anything else at decode.
|
|
207
|
+
const term = detector.report;
|
|
208
|
+
return {
|
|
209
|
+
report: {
|
|
210
|
+
...(term.command === undefined ? {} : { command: globsOf(term.command) }),
|
|
211
|
+
...(term.file === undefined ? {} : { file: globsOf(term.file) }),
|
|
212
|
+
format: term.format,
|
|
213
|
+
...(term.pattern === undefined ? {} : { pattern: term.pattern }),
|
|
214
|
+
...(term.codes === undefined ? {} : { codes: [...term.codes] }),
|
|
215
|
+
...(term.codesNot === undefined ? {} : { codesNot: [...term.codesNot] }),
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
if ("syntax" in detector) {
|
|
220
|
+
const { where } = detector.syntax;
|
|
221
|
+
const narrowed = where === undefined
|
|
222
|
+
? {}
|
|
223
|
+
: {
|
|
224
|
+
where: Object.fromEntries(Object.entries(where).map(([capture, narrowing]) => [
|
|
225
|
+
capture,
|
|
226
|
+
{
|
|
227
|
+
...(narrowing.regex === undefined ? {} : { regex: narrowing.regex }),
|
|
228
|
+
...(narrowing.binding === undefined
|
|
229
|
+
? {}
|
|
230
|
+
: {
|
|
231
|
+
binding: {
|
|
232
|
+
resolves: typeof narrowing.binding.resolves === "string"
|
|
233
|
+
? asPath(narrowing.binding.resolves)
|
|
234
|
+
: narrowing.binding.resolves,
|
|
235
|
+
...(narrowing.binding.member === undefined
|
|
236
|
+
? {}
|
|
237
|
+
: { member: [...narrowing.binding.member] }),
|
|
238
|
+
},
|
|
239
|
+
}),
|
|
240
|
+
},
|
|
241
|
+
])),
|
|
242
|
+
};
|
|
243
|
+
return { syntax: { rule: syntaxRuleOf(detector.syntax), ...narrowed } };
|
|
244
|
+
}
|
|
245
|
+
return { fn: detector.fn };
|
|
246
|
+
};
|
|
247
|
+
// A probe without a source proves only the path; a detector that reads
|
|
248
|
+
// the file needs the file. Refused here, with the term named, rather than
|
|
249
|
+
// at load as a probe that mysteriously never fires.
|
|
250
|
+
const checkProbes = (what, detector, probes) => {
|
|
251
|
+
const leaves = leafTermsOf(detector);
|
|
252
|
+
const needsSource = TERMS_NEEDING_SOURCE.filter((term) => leaves.includes(term));
|
|
253
|
+
const all = [...(probes?.fires ?? []), ...(probes?.ignores ?? [])];
|
|
254
|
+
const sourceless = all.find((probe) => probe.source === undefined);
|
|
255
|
+
if (needsSource.length > 0 && sourceless !== undefined) {
|
|
256
|
+
refuse(`(${what}) has a probe (${sourceless.path}) with no \`source\`, and its ` +
|
|
257
|
+
`detector holds a ${needsSource.map((term) => `\`${term}\``).join(", ")} term, which ` +
|
|
258
|
+
`a path alone cannot exercise. Give every probe a source.`);
|
|
259
|
+
}
|
|
260
|
+
return { fires: [...(probes?.fires ?? [])], ignores: [...(probes?.ignores ?? [])] };
|
|
261
|
+
};
|
|
262
|
+
const scopeSpec = campaign.scope ?? "**";
|
|
263
|
+
const scopeGlobs = typeof scopeSpec === "string" || Array.isArray(scopeSpec)
|
|
264
|
+
? globsOf(scopeSpec)
|
|
265
|
+
: globsOf(scopeSpec.path);
|
|
266
|
+
const extensions = typeof scopeSpec === "string" || Array.isArray(scopeSpec)
|
|
267
|
+
? []
|
|
268
|
+
: [...(scopeSpec.extensions ?? [])];
|
|
269
|
+
const objectives = Object.entries(campaign.objectives).map(([objectiveId, spec]) => {
|
|
270
|
+
const name = `campaign/${id}/${objectiveId}`;
|
|
271
|
+
const message = spec.how ?? campaign.how ?? `${objectiveId} (${id})`;
|
|
272
|
+
const why = spec.why ?? campaign.why;
|
|
273
|
+
const base = {
|
|
274
|
+
name,
|
|
275
|
+
id: objectiveId,
|
|
276
|
+
campaign: id,
|
|
277
|
+
message,
|
|
278
|
+
...(why === undefined ? {} : { why }),
|
|
279
|
+
holdout: spec.holdout,
|
|
280
|
+
...(spec.until === undefined ? {} : { until: spec.until }),
|
|
281
|
+
};
|
|
282
|
+
if (spec.match !== undefined) {
|
|
283
|
+
return {
|
|
284
|
+
...base,
|
|
285
|
+
match: lower(spec.match, objectiveId),
|
|
286
|
+
probes: checkProbes(objectiveId, spec.match, spec.probes),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const term = spec.sector ?? refuse(`(${objectiveId}) has neither \`match\` nor \`sector\`.`);
|
|
290
|
+
const sector = "has" in term
|
|
291
|
+
? { has: lower(term.has, objectiveId) }
|
|
292
|
+
: "oneRoot" in term
|
|
293
|
+
? { oneRoot: true }
|
|
294
|
+
: { oneHost: globsOf(term.oneHost).map(asPath) };
|
|
295
|
+
return {
|
|
296
|
+
...base,
|
|
297
|
+
sector,
|
|
298
|
+
probes: "has" in term
|
|
299
|
+
? checkProbes(objectiveId, term.has, spec.probes)
|
|
300
|
+
: {
|
|
301
|
+
fires: [...(spec.probes?.fires ?? [])],
|
|
302
|
+
ignores: [...(spec.probes?.ignores ?? [])],
|
|
303
|
+
},
|
|
304
|
+
};
|
|
305
|
+
});
|
|
306
|
+
// The perimeter, its globs resolved. A `match` perimeter is proven like
|
|
307
|
+
// an objective; the loader adds the end-shape check, which needs the
|
|
308
|
+
// objectives evaluated on the probe.
|
|
309
|
+
const perimeterSpec = campaign.perimeter;
|
|
310
|
+
const perimeter = perimeterSpec === undefined
|
|
311
|
+
? undefined
|
|
312
|
+
: perimeterSpec === "file"
|
|
313
|
+
? { kind: "file" }
|
|
314
|
+
: perimeterSpec === "nx"
|
|
315
|
+
? { kind: "nx" }
|
|
316
|
+
: "glob" in perimeterSpec
|
|
317
|
+
? { kind: "glob", glob: globsOf(perimeterSpec.glob).map(asPath) }
|
|
318
|
+
: "marker" in perimeterSpec
|
|
319
|
+
? {
|
|
320
|
+
kind: "marker",
|
|
321
|
+
marker: asWhole(perimeterSpec.marker),
|
|
322
|
+
...(perimeterSpec.probes === undefined
|
|
323
|
+
? {}
|
|
324
|
+
: {
|
|
325
|
+
probes: {
|
|
326
|
+
fires: globsOf(perimeterSpec.probes.fires ?? []),
|
|
327
|
+
ignores: globsOf(perimeterSpec.probes.ignores ?? []),
|
|
328
|
+
},
|
|
329
|
+
}),
|
|
330
|
+
}
|
|
331
|
+
: {
|
|
332
|
+
kind: "match",
|
|
333
|
+
match: lower(perimeterSpec.match, "perimeter"),
|
|
334
|
+
unit: perimeterSpec.holdout ?? "declaration",
|
|
335
|
+
probes: checkProbes("perimeter", perimeterSpec.match, perimeterSpec.probes),
|
|
336
|
+
};
|
|
337
|
+
if (perimeter?.kind === "match" && perimeter.probes.fires.length === 0) {
|
|
338
|
+
refuse(`has a \`match\` perimeter with no \`probes.fires\`. A perimeter is the sector's identity ` +
|
|
339
|
+
`across every phase, so it is proven on a sector in its end shape as well as its first.`);
|
|
340
|
+
}
|
|
341
|
+
// The phases. An `endState` written on the campaign belongs to the last
|
|
342
|
+
// phase; a campaign with none and an end state gets one phase, `end`.
|
|
343
|
+
const phaseSpecs = [...(campaign.phases ?? [])];
|
|
344
|
+
if (campaign.endState !== undefined) {
|
|
345
|
+
const last = phaseSpecs.at(-1);
|
|
346
|
+
if (last === undefined)
|
|
347
|
+
phaseSpecs.push({ id: "end", endState: campaign.endState });
|
|
348
|
+
else if (last.endState !== undefined) {
|
|
349
|
+
refuse(`writes an \`endState\` on the campaign and on its last phase; write one.`);
|
|
350
|
+
}
|
|
351
|
+
else
|
|
352
|
+
phaseSpecs[phaseSpecs.length - 1] = { ...last, endState: campaign.endState };
|
|
353
|
+
}
|
|
354
|
+
const objectiveIds = new Set(objectives.map((one) => one.id));
|
|
355
|
+
const namedBy = new Map();
|
|
356
|
+
const phases = [];
|
|
357
|
+
phaseSpecs.forEach((phase, index) => {
|
|
358
|
+
if (phases.some((one) => one.id === phase.id)) {
|
|
359
|
+
refuse(`names the phase "${phase.id}" twice.`);
|
|
360
|
+
}
|
|
361
|
+
for (const objectiveId of phase.objectives ?? []) {
|
|
362
|
+
if (!objectiveIds.has(objectiveId)) {
|
|
363
|
+
refuse(`phase "${phase.id}" names an objective "${objectiveId}" the campaign does not declare.`);
|
|
364
|
+
}
|
|
365
|
+
const already = namedBy.get(objectiveId);
|
|
366
|
+
if (already !== undefined) {
|
|
367
|
+
refuse(`names the objective "${objectiveId}" in two phases ("${already}" and "${phase.id}"); ` +
|
|
368
|
+
`an objective belongs to at most one.`);
|
|
369
|
+
}
|
|
370
|
+
namedBy.set(objectiveId, phase.id);
|
|
371
|
+
}
|
|
372
|
+
const expanded = [...(phase.objectives ?? [])];
|
|
373
|
+
if (phase.endState !== undefined) {
|
|
374
|
+
const families = endStateFamiliesOf(phase.endState, resolve, languages);
|
|
375
|
+
if (families.length === 0) {
|
|
376
|
+
refuse(`phase "${phase.id}" carries an \`endState\` that lowers to no rule at all.`);
|
|
377
|
+
}
|
|
378
|
+
for (const family of families) {
|
|
379
|
+
const objectiveId = endStateObjectiveId(family);
|
|
380
|
+
if (objectiveIds.has(objectiveId)) {
|
|
381
|
+
refuse(`declares an objective "${objectiveId}", which its endState needs for itself.`);
|
|
382
|
+
}
|
|
383
|
+
objectiveIds.add(objectiveId);
|
|
384
|
+
namedBy.set(objectiveId, phase.id);
|
|
385
|
+
expanded.push(objectiveId);
|
|
386
|
+
objectives.push({
|
|
387
|
+
name: `campaign/${id}/${objectiveId}`,
|
|
388
|
+
id: objectiveId,
|
|
389
|
+
campaign: id,
|
|
390
|
+
message: campaign.how ??
|
|
391
|
+
`The sector's end state, as phase "${phase.id}" writes it: a ${family} violation against the sector-relative tree.`,
|
|
392
|
+
holdout: "declaration",
|
|
393
|
+
endState: { phase: phase.id, family },
|
|
394
|
+
probes: { fires: [], ignores: [] },
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
const defined = expanded.length > 0 || phase.attested === true;
|
|
399
|
+
if (!defined && phase.intent === undefined) {
|
|
400
|
+
refuse(`phase "${phase.id}" names no objective and states no \`intent\`. An open phase is a ` +
|
|
401
|
+
`stated intent; a defined one names at least one objective (or is attested).`);
|
|
402
|
+
}
|
|
403
|
+
if (!defined && index !== phaseSpecs.length - 1) {
|
|
404
|
+
refuse(`phase "${phase.id}" is open (it names no objective) and is not last. A plan that has ` +
|
|
405
|
+
`not been written cannot sit in the middle of one that has.`);
|
|
406
|
+
}
|
|
407
|
+
phases.push({
|
|
408
|
+
id: phase.id,
|
|
409
|
+
...(phase.intent === undefined ? {} : { intent: phase.intent }),
|
|
410
|
+
objectives: expanded,
|
|
411
|
+
attested: phase.attested === true,
|
|
412
|
+
...(phase.onTouch === undefined ? {} : { onTouch: phase.onTouch }),
|
|
413
|
+
...(phase.endState === undefined ? {} : { endState: phase.endState }),
|
|
414
|
+
concessions: [...(phase.concessions ?? [])],
|
|
415
|
+
hash: "",
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
// A window: from the phase that names the objective until the phase
|
|
419
|
+
// `until` names, exclusive. Refused when `until` names no phase, or one
|
|
420
|
+
// at or before the naming phase — the two ways a remove or a reorder
|
|
421
|
+
// leaves a window empty.
|
|
422
|
+
for (const objective of objectives) {
|
|
423
|
+
if (objective.until === undefined)
|
|
424
|
+
continue;
|
|
425
|
+
const to = phases.findIndex((one) => one.id === objective.until);
|
|
426
|
+
if (to === -1) {
|
|
427
|
+
refuse(`objective "${objective.id}" runs \`until: ${objective.until}\`, and no phase has that id.`);
|
|
428
|
+
}
|
|
429
|
+
const from = phases.findIndex((one) => one.id === namedBy.get(objective.id));
|
|
430
|
+
if (from !== -1 && to <= from) {
|
|
431
|
+
refuse(`objective "${objective.id}" is named by phase "${phases[from]?.id ?? ""}" and runs ` +
|
|
432
|
+
`\`until: ${objective.until}\`, which is not after it; the window is empty.`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
const hashed = phases.map((phase, index) => ({
|
|
436
|
+
...phase,
|
|
437
|
+
hash: digest({
|
|
438
|
+
index,
|
|
439
|
+
id: phase.id,
|
|
440
|
+
attested: phase.attested,
|
|
441
|
+
endState: phase.endState ?? null,
|
|
442
|
+
objectives: phase.objectives.map((objectiveId) => {
|
|
443
|
+
const objective = objectives.find((one) => one.id === objectiveId);
|
|
444
|
+
return {
|
|
445
|
+
id: objectiveId,
|
|
446
|
+
holdout: objective?.holdout,
|
|
447
|
+
match: objective?.match ?? null,
|
|
448
|
+
sector: objective?.sector ?? null,
|
|
449
|
+
until: objective?.until ?? null,
|
|
450
|
+
};
|
|
451
|
+
}),
|
|
452
|
+
}),
|
|
453
|
+
}));
|
|
454
|
+
// The end is the last phase, so a change to it is a change to that
|
|
455
|
+
// phase's hash already; a campaign with no phases has an end that is
|
|
456
|
+
// every objective, digested as a phase of its own would be.
|
|
457
|
+
if (perimeter?.kind === "marker" && hashed.some((phase) => phase.endState !== undefined)) {
|
|
458
|
+
// A marker may list the globs it owns, so its sectors may have several
|
|
459
|
+
// roots — and a sector-relative tree needs one. Refused at lowering,
|
|
460
|
+
// where the two are in view together; `one-root` as an earlier phase's
|
|
461
|
+
// objective is how a campaign gets there.
|
|
462
|
+
refuse(`carries an \`endState\` over a \`marker\` perimeter. A marker may list the globs it owns, ` +
|
|
463
|
+
`so a sector may have several roots, and a sector-relative tree needs one: use a ` +
|
|
464
|
+
`\`glob\`, \`file\` or \`nx\` perimeter, or reach one root first with a \`oneRoot\` objective.`);
|
|
465
|
+
}
|
|
466
|
+
return {
|
|
467
|
+
name: `campaign/${id}`,
|
|
468
|
+
id,
|
|
469
|
+
...(campaign.title === undefined ? {} : { title: campaign.title }),
|
|
470
|
+
...(campaign.why === undefined ? {} : { why: campaign.why }),
|
|
471
|
+
...(campaign.owner === undefined ? {} : { owner: campaign.owner }),
|
|
472
|
+
scope: scopeGlobs.map(asPath),
|
|
473
|
+
extensions,
|
|
474
|
+
...(campaign.legacy === undefined ? {} : { legacy: globsOf(campaign.legacy).map(asPath) }),
|
|
475
|
+
...(perimeter === undefined ? {} : { perimeter }),
|
|
476
|
+
...(campaign.onTouch === undefined ? {} : { onTouch: campaign.onTouch }),
|
|
477
|
+
phases: hashed,
|
|
478
|
+
objectives,
|
|
479
|
+
...(campaign.staleAfter === undefined ? {} : { staleAfter: durationMs(campaign.staleAfter) }),
|
|
480
|
+
onComplete: campaign.onComplete ?? "keep",
|
|
481
|
+
};
|
|
482
|
+
};
|
|
483
|
+
// Every campaign in the manifest, lowered. The one entry point the loader
|
|
484
|
+
// extension calls: the core hands over what it decoded of the rest of the
|
|
485
|
+
// manifest (`aliases`, `resolve`) and the language packs it was composed
|
|
486
|
+
// with, and gets back the rules the evaluators compile.
|
|
487
|
+
export const lowerCampaigns = (spec, config, languages) => Object.entries(spec.campaigns ?? {}).map(([id, campaign]) => lowerCampaign(id, campaign, config.aliases ?? {}, config.resolve, languages));
|
|
488
|
+
//# sourceMappingURL=lower.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lower.js","sourceRoot":"","sources":["../../../src/manifest/lower.ts"],"names":[],"mappings":"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"}
|