@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.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/build/dts/core/campaign-state.d.ts +38 -0
  3. package/build/dts/core/campaign-state.d.ts.map +1 -0
  4. package/build/dts/core/campaigns.d.ts +196 -0
  5. package/build/dts/core/campaigns.d.ts.map +1 -0
  6. package/build/dts/core/ledger.d.ts +173 -0
  7. package/build/dts/core/ledger.d.ts.map +1 -0
  8. package/build/dts/core/phases.d.ts +26 -0
  9. package/build/dts/core/phases.d.ts.map +1 -0
  10. package/build/dts/core/sectors.d.ts +52 -0
  11. package/build/dts/core/sectors.d.ts.map +1 -0
  12. package/build/dts/domain/config.d.ts +985 -0
  13. package/build/dts/domain/config.d.ts.map +1 -0
  14. package/build/dts/domain/report.d.ts +16 -0
  15. package/build/dts/domain/report.d.ts.map +1 -0
  16. package/build/dts/host/campaigns.d.ts +195 -0
  17. package/build/dts/host/campaigns.d.ts.map +1 -0
  18. package/build/dts/host/diff.d.ts +31 -0
  19. package/build/dts/host/diff.d.ts.map +1 -0
  20. package/build/dts/index.d.ts +17 -0
  21. package/build/dts/index.d.ts.map +1 -0
  22. package/build/dts/infrastructure/campaign-functions.d.ts +7 -0
  23. package/build/dts/infrastructure/campaign-functions.d.ts.map +1 -0
  24. package/build/dts/infrastructure/report-source-fake.d.ts +4 -0
  25. package/build/dts/infrastructure/report-source-fake.d.ts.map +1 -0
  26. package/build/dts/infrastructure/report-source-live.d.ts +3 -0
  27. package/build/dts/infrastructure/report-source-live.d.ts.map +1 -0
  28. package/build/dts/load/decode.d.ts +7 -0
  29. package/build/dts/load/decode.d.ts.map +1 -0
  30. package/build/dts/load/extension.d.ts +25 -0
  31. package/build/dts/load/extension.d.ts.map +1 -0
  32. package/build/dts/manifest/lower.d.ts +14 -0
  33. package/build/dts/manifest/lower.d.ts.map +1 -0
  34. package/build/dts/manifest/spec.d.ts +515 -0
  35. package/build/dts/manifest/spec.d.ts.map +1 -0
  36. package/build/dts/ports/campaign-predicate.d.ts +23 -0
  37. package/build/dts/ports/campaign-predicate.d.ts.map +1 -0
  38. package/build/dts/ports/report-source.d.ts +14 -0
  39. package/build/dts/ports/report-source.d.ts.map +1 -0
  40. package/build/dts/testing.d.ts +2 -0
  41. package/build/dts/testing.d.ts.map +1 -0
  42. package/build/esm/core/campaign-state.js +140 -0
  43. package/build/esm/core/campaign-state.js.map +1 -0
  44. package/build/esm/core/campaigns.js +954 -0
  45. package/build/esm/core/campaigns.js.map +1 -0
  46. package/build/esm/core/ledger.js +519 -0
  47. package/build/esm/core/ledger.js.map +1 -0
  48. package/build/esm/core/phases.js +87 -0
  49. package/build/esm/core/phases.js.map +1 -0
  50. package/build/esm/core/sectors.js +313 -0
  51. package/build/esm/core/sectors.js.map +1 -0
  52. package/build/esm/domain/config.js +245 -0
  53. package/build/esm/domain/config.js.map +1 -0
  54. package/build/esm/domain/report.js +168 -0
  55. package/build/esm/domain/report.js.map +1 -0
  56. package/build/esm/host/campaigns.js +1159 -0
  57. package/build/esm/host/campaigns.js.map +1 -0
  58. package/build/esm/host/diff.js +156 -0
  59. package/build/esm/host/diff.js.map +1 -0
  60. package/build/esm/index.js +27 -0
  61. package/build/esm/index.js.map +1 -0
  62. package/build/esm/infrastructure/campaign-functions.js +67 -0
  63. package/build/esm/infrastructure/campaign-functions.js.map +1 -0
  64. package/build/esm/infrastructure/report-source-fake.js +6 -0
  65. package/build/esm/infrastructure/report-source-fake.js.map +1 -0
  66. package/build/esm/infrastructure/report-source-live.js +165 -0
  67. package/build/esm/infrastructure/report-source-live.js.map +1 -0
  68. package/build/esm/load/decode.js +60 -0
  69. package/build/esm/load/decode.js.map +1 -0
  70. package/build/esm/load/extension.js +326 -0
  71. package/build/esm/load/extension.js.map +1 -0
  72. package/build/esm/manifest/lower.js +488 -0
  73. package/build/esm/manifest/lower.js.map +1 -0
  74. package/build/esm/manifest/spec.js +296 -0
  75. package/build/esm/manifest/spec.js.map +1 -0
  76. package/build/esm/ports/campaign-predicate.js +2 -0
  77. package/build/esm/ports/campaign-predicate.js.map +1 -0
  78. package/build/esm/ports/report-source.js +7 -0
  79. package/build/esm/ports/report-source.js.map +1 -0
  80. package/build/esm/testing.js +5 -0
  81. package/build/esm/testing.js.map +1 -0
  82. package/package.json +65 -0
  83. package/src/core/campaign-state.ts +227 -0
  84. package/src/core/campaigns.ts +1319 -0
  85. package/src/core/ledger.ts +675 -0
  86. package/src/core/phases.ts +138 -0
  87. package/src/core/sectors.ts +399 -0
  88. package/src/domain/config.ts +314 -0
  89. package/src/domain/report.ts +203 -0
  90. package/src/host/campaigns.ts +1664 -0
  91. package/src/host/diff.ts +203 -0
  92. package/src/index.ts +256 -0
  93. package/src/infrastructure/campaign-functions.ts +99 -0
  94. package/src/infrastructure/report-source-fake.ts +10 -0
  95. package/src/infrastructure/report-source-live.ts +193 -0
  96. package/src/load/decode.ts +81 -0
  97. package/src/load/extension.ts +466 -0
  98. package/src/manifest/lower.ts +615 -0
  99. package/src/manifest/spec.ts +364 -0
  100. package/src/ports/campaign-predicate.ts +29 -0
  101. package/src/ports/report-source.ts +35 -0
  102. package/src/testing.ts +4 -0
@@ -0,0 +1,87 @@
1
+ // A phase is a named, ordered group of objectives: defined when it names
2
+ // one (or is attested, or carries an end state), open when it has only an
3
+ // intent — and then it is last. A sector's phase is derived, never
4
+ // declared: the first phase, in order, with residue for that sector. What
5
+ // derivation cannot say is where a sector has been, and windows need that,
6
+ // so the per-sector ledger records the furthest phase ever reached.
7
+ // The index a sector past every phase stands at.
8
+ export const donePhaseOf = (rule) => rule.phases.length;
9
+ // The phase the legacy stands at: the first, so the first phase's
10
+ // objectives count for what no sector has claimed, and it is not a sink.
11
+ export const LEGACY_PHASE = 0;
12
+ export const isOpenPhase = (phase) => phase.objectives.length === 0 && !phase.attested;
13
+ export const isDefinedPhase = (phase) => !isOpenPhase(phase);
14
+ export const UNPLACED = { reached: -1, attested: new Set() };
15
+ export const windowOf = (rule, objective) => {
16
+ const from = rule.phases.findIndex((phase) => phase.objectives.includes(objective.id));
17
+ const until = objective.until === null
18
+ ? Number.POSITIVE_INFINITY
19
+ : rule.phases.findIndex((phase) => phase.id === objective.until);
20
+ return { from, until: until === -1 ? Number.POSITIVE_INFINITY : until };
21
+ };
22
+ // A window a sector has passed never reopens for it: when a later plan edit
23
+ // sends the sector back down the ladder, the transitional shapes it has
24
+ // already been through are not demanded again.
25
+ export const isShut = (rule, objective, position) => {
26
+ const { until } = windowOf(rule, objective);
27
+ return Number.isFinite(until) && until <= position.reached;
28
+ };
29
+ export const inWindow = (rule, objective, phase, position) => {
30
+ if (isShut(rule, objective, position))
31
+ return false;
32
+ const { from, until } = windowOf(rule, objective);
33
+ return phase >= from && phase < until;
34
+ };
35
+ export const objectivesInWindow = (rule, phase, position) => rule.objectives.filter((objective) => inWindow(rule, objective, phase, position));
36
+ // The first phase, in order, with residue for the sector: an objective it
37
+ // names with a holdout in the sector (and a window not shut), an attested
38
+ // phase not yet attested for it, or the open phase, which always has
39
+ // residue. A sector past the last phase is done.
40
+ export const derivePhase = (rule, counts, position) => {
41
+ for (const [index, phase] of rule.phases.entries()) {
42
+ if (isOpenPhase(phase))
43
+ return index;
44
+ if (phase.attested && !position.attested.has(phase.id))
45
+ return index;
46
+ const residue = phase.objectives.some((objectiveId) => {
47
+ const objective = rule.objectives.find((one) => one.id === objectiveId);
48
+ return (objective !== undefined && !isShut(rule, objective, position) && counts(objectiveId) > 0);
49
+ });
50
+ if (residue)
51
+ return index;
52
+ }
53
+ return donePhaseOf(rule);
54
+ };
55
+ // What a touched sector owes: the phase's own word, else the campaign's,
56
+ // else `advise` for an open phase and `ratchet` for a defined one.
57
+ export const onTouchOf = (rule, phase) => {
58
+ const at = rule.phases[phase];
59
+ return (at?.onTouch ?? rule.onTouch ?? (at !== undefined && isOpenPhase(at) ? "advise" : "ratchet"));
60
+ };
61
+ // Forward means no dimension is worse and at least one is better; back the
62
+ // reverse; anything else is mixed and is reported as such, never resolved
63
+ // by a sum.
64
+ export const compareResidue = (before, after) => {
65
+ let better = false;
66
+ let worse = false;
67
+ for (const key of new Set([...Object.keys(before), ...Object.keys(after)])) {
68
+ const from = before[key] ?? 0;
69
+ const to = after[key] ?? 0;
70
+ if (to < from)
71
+ better = true;
72
+ if (to > from)
73
+ worse = true;
74
+ }
75
+ if (better && worse)
76
+ return "mixed";
77
+ if (better)
78
+ return "forward";
79
+ if (worse)
80
+ return "back";
81
+ return "neutral";
82
+ };
83
+ // The dimensions that went back, by name.
84
+ export const worsened = (before, after) => Object.keys(after)
85
+ .filter((key) => (after[key] ?? 0) > (before[key] ?? 0))
86
+ .sort();
87
+ //# sourceMappingURL=phases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phases.js","sourceRoot":"","sources":["../../../src/core/phases.ts"],"names":[],"mappings":"AAGA,yEAAyE;AACzE,0EAA0E;AAC1E,mEAAmE;AACnE,0EAA0E;AAC1E,2EAA2E;AAC3E,oEAAoE;AAEpE,iDAAiD;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAsB,EAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAElF,kEAAkE;AAClE,yEAAyE;AACzE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAW,EAAE,CACvD,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAEnD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAgB,EAAW,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AASjF,MAAM,CAAC,MAAM,QAAQ,GAAmB,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAU7E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAsB,EAAE,SAA4B,EAAU,EAAE;IACvF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,KAAK,GACT,SAAS,CAAC,KAAK,KAAK,IAAI;QACtB,CAAC,CAAC,MAAM,CAAC,iBAAiB;QAC1B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AAC1E,CAAC,CAAC;AAEF,4EAA4E;AAC5E,wEAAwE;AACxE,+CAA+C;AAC/C,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,IAAsB,EACtB,SAA4B,EAC5B,QAAwB,EACf,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAsB,EACtB,SAA4B,EAC5B,KAAa,EACb,QAAwB,EACf,EAAE;IACX,IAAI,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClD,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,IAAsB,EACtB,KAAa,EACb,QAAwB,EACU,EAAE,CACpC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEpF,0EAA0E;AAC1E,0EAA0E;AAC1E,qEAAqE;AACrE,iDAAiD;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,IAAsB,EACtB,MAAuC,EACvC,QAAwB,EAChB,EAAE;IACV,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACnD,IAAI,WAAW,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACrE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;YACpD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;YACxE,OAAO,CACL,SAAS,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CACzF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,yEAAyE;AACzE,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAsB,EAAE,KAAa,EAAW,EAAE;IAC1E,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CACL,EAAE,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAC5F,CAAC;AACJ,CAAC,CAAC;AAOF,2EAA2E;AAC3E,0EAA0E;AAC1E,YAAY;AACZ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAe,EAAE,KAAc,EAAa,EAAE;IAC3E,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,EAAE,GAAG,IAAI;YAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,IAAI,EAAE,GAAG,IAAI;YAAE,KAAK,GAAG,IAAI,CAAC;IAC9B,CAAC;IACD,IAAI,MAAM,IAAI,KAAK;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,KAAK;QAAE,OAAO,MAAM,CAAC;IACzB,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAe,EAAE,KAAc,EAAyB,EAAE,CACjF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;KACf,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;KACvD,IAAI,EAAE,CAAC"}
@@ -0,0 +1,313 @@
1
+ // A sector is the thing that moves through a campaign's phases as one,
2
+ // whatever its size — a bounded context, a component folder, a single file.
3
+ // It is never listed in the manifest: the code births it, through the
4
+ // campaign's perimeter, and this module is where that reading happens.
5
+ // Given the files in a campaign's scope (and, for a `match` perimeter, what
6
+ // the perimeter's detector finds in each), it says which sector every file
7
+ // is in, what the sector's roots are, and which files no sector claims —
8
+ // the legacy, which stands at the first phase and is not a sink.
9
+ //
10
+ // Holdouts are keyed relative to the sector's root, so a lift from one host
11
+ // to another moves nothing in the ledger. The root is the marker's folder,
12
+ // the matched glob, the file's own folder, or the repository for the
13
+ // implicit sector and the legacy.
14
+ // The one sector a campaign with no perimeter has: the whole scope.
15
+ export const IMPLICIT_SECTOR = "scope";
16
+ // What no sector has claimed.
17
+ export const LEGACY_SECTOR = "legacy";
18
+ const MARKER_EXPORT = /export\s+const\s+sector(?:\s*:[^=]*)?\s*=\s*\{/;
19
+ // Reads the exported `sector` object out of a marker's text, tolerating the
20
+ // object literal as a person writes it — unquoted keys, single quotes, a
21
+ // trailing comma, `as const`. Nothing is executed. `null` when the file
22
+ // exports no such object; a throw when it does and the object cannot be read.
23
+ export const parseSectorMarker = (text) => {
24
+ const at = MARKER_EXPORT.exec(text);
25
+ if (at === null)
26
+ return null;
27
+ const start = at.index + at[0].length - 1;
28
+ let depth = 0;
29
+ let end = -1;
30
+ for (let i = start; i < text.length; i += 1) {
31
+ const char = text[i];
32
+ if (char === "{")
33
+ depth += 1;
34
+ else if (char === "}") {
35
+ depth -= 1;
36
+ if (depth === 0) {
37
+ end = i;
38
+ break;
39
+ }
40
+ }
41
+ }
42
+ if (end === -1)
43
+ throw new Error("the `sector` object's braces do not balance");
44
+ const literal = text
45
+ .slice(start, end + 1)
46
+ .replace(/'([^'\\]*(?:\\.[^'\\]*)*)'/g, (_match, inner) => JSON.stringify(inner))
47
+ .replace(/([{,]\s*)([A-Za-z_$][\w$]*)\s*:/g, '$1"$2":')
48
+ .replace(/,\s*([}\]])/g, "$1");
49
+ let parsed;
50
+ try {
51
+ parsed = JSON.parse(literal);
52
+ }
53
+ catch (cause) {
54
+ throw new Error(`the \`sector\` object is not a plain literal: ${String(cause)}`);
55
+ }
56
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
57
+ throw new Error("the `sector` export is not an object");
58
+ }
59
+ const record = parsed;
60
+ const name = record.name;
61
+ const owns = record.owns;
62
+ if (name !== undefined && typeof name !== "string") {
63
+ throw new Error("the `sector` object's `name` is not a string");
64
+ }
65
+ if (owns !== undefined &&
66
+ (!Array.isArray(owns) || owns.some((one) => typeof one !== "string"))) {
67
+ throw new Error("the `sector` object's `owns` is not a list of globs");
68
+ }
69
+ return {
70
+ ...(name === undefined ? {} : { name }),
71
+ ...(owns === undefined ? {} : { owns: owns }),
72
+ };
73
+ };
74
+ const folderOf = (file) => {
75
+ const at = file.lastIndexOf("/");
76
+ return at === -1 ? "" : file.slice(0, at);
77
+ };
78
+ const basenameOf = (file) => file.slice(file.lastIndexOf("/") + 1);
79
+ // The path without its extension — a `file` sector's identity, so that
80
+ // `a.js → a.ts` is one sector before and after.
81
+ export const withoutExtension = (file) => {
82
+ const base = basenameOf(file);
83
+ const dot = base.lastIndexOf(".");
84
+ return dot <= 0 ? file : file.slice(0, file.length - (base.length - dot));
85
+ };
86
+ // The fixed prefix of a glob — everything before its first wildcard, cut
87
+ // at a folder boundary — which is the root the glob's files sit under.
88
+ export const fixedPrefixOf = (glob) => {
89
+ const wildcard = glob.search(/[*?[{]/);
90
+ const fixed = wildcard === -1 ? glob : glob.slice(0, wildcard);
91
+ const cut = fixed.lastIndexOf("/");
92
+ return cut === -1 ? "" : fixed.slice(0, cut);
93
+ };
94
+ const under = (root, file) => root === "" || file === root || file.startsWith(`${root}/`);
95
+ const indexOf = (rule, files, sectors, claims) => {
96
+ const seen = new Set(files);
97
+ const legacyOf = (file) => rule.legacy === null || rule.legacy.some((pattern) => pattern.test(file))
98
+ ? LEGACY_SECTOR
99
+ : null;
100
+ // A file the campaign never saw — outside its scope, or not a source
101
+ // file at all — is in no sector.
102
+ const sectorOf = (file) => {
103
+ if (!seen.has(file))
104
+ return null;
105
+ const claimed = claims.get(file);
106
+ if (claimed !== undefined && claimed.length > 0)
107
+ return claimed[0]?.sector ?? null;
108
+ return legacyOf(file);
109
+ };
110
+ const legacy = files.filter((file) => sectorOf(file) === LEGACY_SECTOR);
111
+ const drift = [...claims.entries()]
112
+ .filter(([, claimed]) => new Set(claimed.map((one) => one.sector)).size > 1)
113
+ .map(([file, claimed]) => ({
114
+ file,
115
+ sectors: [...new Set(claimed.map((one) => one.sector))].sort(),
116
+ }));
117
+ const sectorOfHit = (file, subject) => {
118
+ if (rule.perimeter?.kind !== "match")
119
+ return sectorOf(file);
120
+ const claimed = claims.get(file) ?? [];
121
+ if (subject !== null) {
122
+ const anchor = subject.split("#")[0] ?? subject;
123
+ const own = claimed.find((one) => sectors.get(one.sector)?.declaration?.anchor === anchor);
124
+ if (own !== undefined)
125
+ return own.sector;
126
+ }
127
+ if (claimed.length === 1)
128
+ return claimed[0]?.sector ?? null;
129
+ return legacyOf(file);
130
+ };
131
+ return { sectors, legacy, sectorOf, sectorOfHit, drift };
132
+ };
133
+ // The sectors of one campaign, read off its files through its perimeter.
134
+ export const discoverSectors = (rule, input) => {
135
+ const files = [...input.files].sort();
136
+ const sectors = new Map();
137
+ const claims = new Map();
138
+ const claim = (file, sector, root) => {
139
+ claims.set(file, [...(claims.get(file) ?? []), { sector, root }]);
140
+ };
141
+ const add = (sector) => {
142
+ const known = sectors.get(sector.name);
143
+ // A name declared by two markers is one sector with both roots.
144
+ sectors.set(sector.name, known === undefined
145
+ ? sector
146
+ : {
147
+ ...known,
148
+ roots: [...new Set([...known.roots, ...sector.roots])],
149
+ files: [...new Set([...known.files, ...sector.files])].sort(),
150
+ });
151
+ for (const file of sector.files)
152
+ claim(file, sector.name, rootOf(sector, file));
153
+ };
154
+ const perimeter = rule.perimeter;
155
+ if (perimeter === null) {
156
+ add({ name: IMPLICIT_SECTOR, roots: [""], files, marker: null, declaration: null });
157
+ return indexOf(rule, files, sectors, claims);
158
+ }
159
+ switch (perimeter.kind) {
160
+ case "file": {
161
+ for (const file of files) {
162
+ add({
163
+ name: withoutExtension(file),
164
+ roots: [folderOf(file)],
165
+ files: [file],
166
+ marker: null,
167
+ declaration: null,
168
+ });
169
+ }
170
+ break;
171
+ }
172
+ case "glob": {
173
+ const byName = new Map();
174
+ for (const file of files) {
175
+ for (const pattern of perimeter.glob) {
176
+ const found = pattern.exec(file);
177
+ if (found === null)
178
+ continue;
179
+ const name = found[0].replace(/\/$/, "");
180
+ byName.set(name, [...(byName.get(name) ?? []), file]);
181
+ break;
182
+ }
183
+ }
184
+ for (const [name, own] of byName) {
185
+ add({ name, roots: [name], files: own, marker: null, declaration: null });
186
+ }
187
+ break;
188
+ }
189
+ case "marker": {
190
+ const markers = files.filter((file) => perimeter.marker.some((one) => one.test(file)));
191
+ for (const marker of markers) {
192
+ const text = input.readText(marker) ?? "";
193
+ let read;
194
+ try {
195
+ read = parseSectorMarker(text);
196
+ }
197
+ catch (cause) {
198
+ throw new Error(`the sector marker ${marker} does not read: ${String(cause)}`);
199
+ }
200
+ const folder = folderOf(marker);
201
+ const name = read?.name ?? basenameOf(folder === "" ? "." : folder);
202
+ const owns = read?.owns ?? [];
203
+ const patterns = owns.map((glob) => input.globToRegExp(glob));
204
+ const roots = [folder, ...owns.map(fixedPrefixOf)].filter((root, at, all) => all.indexOf(root) === at);
205
+ const own = files.filter((file) => (owns.length === 0 && under(folder, file)) ||
206
+ patterns.some((pattern) => pattern.test(file)) ||
207
+ file === marker);
208
+ add({ name, roots, files: own, marker, declaration: null });
209
+ }
210
+ break;
211
+ }
212
+ case "match": {
213
+ const matches = input.perimeterMatches ?? (() => []);
214
+ for (const file of files) {
215
+ for (const anchor of matches(file)) {
216
+ add({
217
+ name: `${file}#${anchor}`,
218
+ roots: [folderOf(file)],
219
+ files: [file],
220
+ marker: null,
221
+ declaration: { file, anchor },
222
+ });
223
+ }
224
+ }
225
+ break;
226
+ }
227
+ case "nx": {
228
+ for (const project of input.projects ?? []) {
229
+ const own = files.filter((file) => under(project.root, file));
230
+ if (own.length === 0)
231
+ continue;
232
+ add({
233
+ name: project.name,
234
+ roots: [project.root],
235
+ files: own,
236
+ marker: null,
237
+ declaration: null,
238
+ });
239
+ }
240
+ break;
241
+ }
242
+ }
243
+ return indexOf(rule, files, sectors, claims);
244
+ };
245
+ // The root a file of the sector sits under: the first of the sector's
246
+ // roots that prefixes it, so an entry written relative to it survives the
247
+ // sector moving as one.
248
+ export const rootOf = (sector, file) => sector.roots.find((root) => under(root, file)) ?? "";
249
+ // A hit's ledger entry, relative to the sector's root: `file#subject`, with
250
+ // the file written from the root. A sector's own holdout (`holdout: sector`)
251
+ // is `~`, the sector itself.
252
+ export const SECTOR_HOLDOUT = "~";
253
+ export const entryOf = (violation, root) => {
254
+ const stripped = root === "" ? violation.file : violation.file.slice(root.length + 1);
255
+ const relative = stripped === "" ? violation.file : stripped;
256
+ return violation.subject === null ? relative : `${relative}#${violation.subject}`;
257
+ };
258
+ // The sector a name belongs to in an index, the legacy included as a
259
+ // synthetic sector rooted at the repository.
260
+ export const sectorNamed = (index, name) => name === LEGACY_SECTOR
261
+ ? { name, roots: [""], files: index.legacy, marker: null, declaration: null }
262
+ : (index.sectors.get(name) ?? null);
263
+ export const membershipOf = (rule, file, index, anchors) => {
264
+ const inScope = rule.scope.some((pattern) => pattern.test(file));
265
+ if (!inScope)
266
+ return () => null;
267
+ const legacy = () => rule.legacy === null || rule.legacy.some((pattern) => pattern.test(file))
268
+ ? { sector: LEGACY_SECTOR, root: "" }
269
+ : null;
270
+ const perimeter = rule.perimeter;
271
+ if (perimeter === null)
272
+ return () => ({ sector: IMPLICIT_SECTOR, root: "" });
273
+ switch (perimeter.kind) {
274
+ case "file": {
275
+ const placement = { sector: withoutExtension(file), root: folderOf(file) };
276
+ return () => placement;
277
+ }
278
+ case "glob": {
279
+ for (const pattern of perimeter.glob) {
280
+ const found = pattern.exec(file);
281
+ if (found === null)
282
+ continue;
283
+ const name = found[0].replace(/\/$/, "");
284
+ return () => ({ sector: name, root: name });
285
+ }
286
+ return legacy;
287
+ }
288
+ case "match": {
289
+ const own = anchors.map((anchor) => ({ sector: `${file}#${anchor}`, root: folderOf(file) }));
290
+ return (subject) => {
291
+ if (subject !== null) {
292
+ const anchor = subject.split("#")[0] ?? subject;
293
+ const found = own.find((one) => one.sector === `${file}#${anchor}`);
294
+ if (found !== undefined)
295
+ return found;
296
+ }
297
+ return own.length === 1 ? (own[0] ?? null) : legacy();
298
+ };
299
+ }
300
+ case "marker":
301
+ case "nx": {
302
+ if (index === null)
303
+ return legacy;
304
+ const name = index.sectorOf(file);
305
+ if (name === null)
306
+ return () => null;
307
+ const sector = sectorNamed(index, name);
308
+ const placement = { sector: name, root: sector === null ? "" : rootOf(sector, file) };
309
+ return () => placement;
310
+ }
311
+ }
312
+ };
313
+ //# sourceMappingURL=sectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sectors.js","sourceRoot":"","sources":["../../../src/core/sectors.ts"],"names":[],"mappings":"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"}