@bett3r-dev/blueprint-schema 1.6.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 (221) hide show
  1. package/README.md +7 -0
  2. package/build/cjs/apply-design.d.ts +22 -0
  3. package/build/cjs/apply-design.d.ts.map +1 -0
  4. package/build/cjs/apply-design.js +206 -0
  5. package/build/cjs/apply-design.js.map +1 -0
  6. package/build/cjs/apply-overrides.d.ts +11 -0
  7. package/build/cjs/apply-overrides.d.ts.map +1 -0
  8. package/build/cjs/apply-overrides.js +240 -0
  9. package/build/cjs/apply-overrides.js.map +1 -0
  10. package/build/cjs/convergence.d.ts +15 -0
  11. package/build/cjs/convergence.d.ts.map +1 -0
  12. package/build/cjs/convergence.js +28 -0
  13. package/build/cjs/convergence.js.map +1 -0
  14. package/build/cjs/design.d.ts +85 -0
  15. package/build/cjs/design.d.ts.map +1 -0
  16. package/build/cjs/design.js +51 -0
  17. package/build/cjs/design.js.map +1 -0
  18. package/build/cjs/diagnostics.d.ts +74 -0
  19. package/build/cjs/diagnostics.d.ts.map +1 -0
  20. package/build/cjs/diagnostics.js +16 -0
  21. package/build/cjs/diagnostics.js.map +1 -0
  22. package/build/cjs/edges.d.ts +17 -0
  23. package/build/cjs/edges.d.ts.map +1 -0
  24. package/build/cjs/edges.js +21 -0
  25. package/build/cjs/edges.js.map +1 -0
  26. package/build/cjs/entry-points.d.ts +17 -0
  27. package/build/cjs/entry-points.d.ts.map +1 -0
  28. package/build/cjs/entry-points.js +58 -0
  29. package/build/cjs/entry-points.js.map +1 -0
  30. package/build/cjs/find-orphan-nodes.d.ts +5 -0
  31. package/build/cjs/find-orphan-nodes.d.ts.map +1 -0
  32. package/build/cjs/find-orphan-nodes.js +14 -0
  33. package/build/cjs/find-orphan-nodes.js.map +1 -0
  34. package/build/cjs/flow-traversal.d.ts +24 -0
  35. package/build/cjs/flow-traversal.d.ts.map +1 -0
  36. package/build/cjs/flow-traversal.js +102 -0
  37. package/build/cjs/flow-traversal.js.map +1 -0
  38. package/build/cjs/graph.d.ts +19 -0
  39. package/build/cjs/graph.d.ts.map +1 -0
  40. package/build/cjs/graph.js +32 -0
  41. package/build/cjs/graph.js.map +1 -0
  42. package/build/cjs/handler-scope.d.ts +27 -0
  43. package/build/cjs/handler-scope.d.ts.map +1 -0
  44. package/build/cjs/handler-scope.js +54 -0
  45. package/build/cjs/handler-scope.js.map +1 -0
  46. package/build/cjs/index.d.ts +27 -0
  47. package/build/cjs/index.d.ts.map +1 -0
  48. package/build/cjs/index.js +43 -0
  49. package/build/cjs/index.js.map +1 -0
  50. package/build/cjs/map-links.d.ts +12 -0
  51. package/build/cjs/map-links.d.ts.map +1 -0
  52. package/build/cjs/map-links.js +59 -0
  53. package/build/cjs/map-links.js.map +1 -0
  54. package/build/cjs/map-structure.d.ts +110 -0
  55. package/build/cjs/map-structure.d.ts.map +1 -0
  56. package/build/cjs/map-structure.js +54 -0
  57. package/build/cjs/map-structure.js.map +1 -0
  58. package/build/cjs/map-vocabulary.d.ts +53 -0
  59. package/build/cjs/map-vocabulary.d.ts.map +1 -0
  60. package/build/cjs/map-vocabulary.js +156 -0
  61. package/build/cjs/map-vocabulary.js.map +1 -0
  62. package/build/cjs/nodes.d.ts +39 -0
  63. package/build/cjs/nodes.d.ts.map +1 -0
  64. package/build/cjs/nodes.js +31 -0
  65. package/build/cjs/nodes.js.map +1 -0
  66. package/build/cjs/op-chain.d.ts +18 -0
  67. package/build/cjs/op-chain.d.ts.map +1 -0
  68. package/build/cjs/op-chain.js +42 -0
  69. package/build/cjs/op-chain.js.map +1 -0
  70. package/build/cjs/ops.d.ts +158 -0
  71. package/build/cjs/ops.d.ts.map +1 -0
  72. package/build/cjs/ops.js +11 -0
  73. package/build/cjs/ops.js.map +1 -0
  74. package/build/cjs/organisation.d.ts +10 -0
  75. package/build/cjs/organisation.d.ts.map +1 -0
  76. package/build/cjs/organisation.js +21 -0
  77. package/build/cjs/organisation.js.map +1 -0
  78. package/build/cjs/overrides.d.ts +74 -0
  79. package/build/cjs/overrides.d.ts.map +1 -0
  80. package/build/cjs/overrides.js +20 -0
  81. package/build/cjs/overrides.js.map +1 -0
  82. package/build/cjs/reachability.d.ts +27 -0
  83. package/build/cjs/reachability.d.ts.map +1 -0
  84. package/build/cjs/reachability.js +218 -0
  85. package/build/cjs/reachability.js.map +1 -0
  86. package/build/cjs/reality-check.d.ts +42 -0
  87. package/build/cjs/reality-check.d.ts.map +1 -0
  88. package/build/cjs/reality-check.js +191 -0
  89. package/build/cjs/reality-check.js.map +1 -0
  90. package/build/cjs/replication.d.ts +7 -0
  91. package/build/cjs/replication.d.ts.map +1 -0
  92. package/build/cjs/replication.js +19 -0
  93. package/build/cjs/replication.js.map +1 -0
  94. package/build/cjs/retention.d.ts +11 -0
  95. package/build/cjs/retention.d.ts.map +1 -0
  96. package/build/cjs/retention.js +22 -0
  97. package/build/cjs/retention.js.map +1 -0
  98. package/build/cjs/session.d.ts +45 -0
  99. package/build/cjs/session.d.ts.map +1 -0
  100. package/build/cjs/session.js +55 -0
  101. package/build/cjs/session.js.map +1 -0
  102. package/build/cjs/topology.d.ts +12 -0
  103. package/build/cjs/topology.d.ts.map +1 -0
  104. package/build/cjs/topology.js +48 -0
  105. package/build/cjs/topology.js.map +1 -0
  106. package/build/cjs/validate-design.d.ts +22 -0
  107. package/build/cjs/validate-design.d.ts.map +1 -0
  108. package/build/cjs/validate-design.js +576 -0
  109. package/build/cjs/validate-design.js.map +1 -0
  110. package/build/esm/apply-design.d.ts +22 -0
  111. package/build/esm/apply-design.d.ts.map +1 -0
  112. package/build/esm/apply-design.js +202 -0
  113. package/build/esm/apply-design.js.map +1 -0
  114. package/build/esm/apply-overrides.d.ts +11 -0
  115. package/build/esm/apply-overrides.d.ts.map +1 -0
  116. package/build/esm/apply-overrides.js +235 -0
  117. package/build/esm/apply-overrides.js.map +1 -0
  118. package/build/esm/convergence.d.ts +15 -0
  119. package/build/esm/convergence.d.ts.map +1 -0
  120. package/build/esm/convergence.js +25 -0
  121. package/build/esm/convergence.js.map +1 -0
  122. package/build/esm/design.d.ts +85 -0
  123. package/build/esm/design.d.ts.map +1 -0
  124. package/build/esm/design.js +43 -0
  125. package/build/esm/design.js.map +1 -0
  126. package/build/esm/diagnostics.d.ts +74 -0
  127. package/build/esm/diagnostics.d.ts.map +1 -0
  128. package/build/esm/diagnostics.js +13 -0
  129. package/build/esm/diagnostics.js.map +1 -0
  130. package/build/esm/edges.d.ts +17 -0
  131. package/build/esm/edges.d.ts.map +1 -0
  132. package/build/esm/edges.js +18 -0
  133. package/build/esm/edges.js.map +1 -0
  134. package/build/esm/entry-points.d.ts +17 -0
  135. package/build/esm/entry-points.d.ts.map +1 -0
  136. package/build/esm/entry-points.js +52 -0
  137. package/build/esm/entry-points.js.map +1 -0
  138. package/build/esm/find-orphan-nodes.d.ts +5 -0
  139. package/build/esm/find-orphan-nodes.d.ts.map +1 -0
  140. package/build/esm/find-orphan-nodes.js +11 -0
  141. package/build/esm/find-orphan-nodes.js.map +1 -0
  142. package/build/esm/flow-traversal.d.ts +24 -0
  143. package/build/esm/flow-traversal.d.ts.map +1 -0
  144. package/build/esm/flow-traversal.js +96 -0
  145. package/build/esm/flow-traversal.js.map +1 -0
  146. package/build/esm/graph.d.ts +19 -0
  147. package/build/esm/graph.d.ts.map +1 -0
  148. package/build/esm/graph.js +26 -0
  149. package/build/esm/graph.js.map +1 -0
  150. package/build/esm/handler-scope.d.ts +27 -0
  151. package/build/esm/handler-scope.d.ts.map +1 -0
  152. package/build/esm/handler-scope.js +49 -0
  153. package/build/esm/handler-scope.js.map +1 -0
  154. package/build/esm/index.d.ts +27 -0
  155. package/build/esm/index.d.ts.map +1 -0
  156. package/build/esm/index.js +27 -0
  157. package/build/esm/index.js.map +1 -0
  158. package/build/esm/map-links.d.ts +12 -0
  159. package/build/esm/map-links.d.ts.map +1 -0
  160. package/build/esm/map-links.js +56 -0
  161. package/build/esm/map-links.js.map +1 -0
  162. package/build/esm/map-structure.d.ts +110 -0
  163. package/build/esm/map-structure.d.ts.map +1 -0
  164. package/build/esm/map-structure.js +46 -0
  165. package/build/esm/map-structure.js.map +1 -0
  166. package/build/esm/map-vocabulary.d.ts +53 -0
  167. package/build/esm/map-vocabulary.d.ts.map +1 -0
  168. package/build/esm/map-vocabulary.js +146 -0
  169. package/build/esm/map-vocabulary.js.map +1 -0
  170. package/build/esm/nodes.d.ts +39 -0
  171. package/build/esm/nodes.d.ts.map +1 -0
  172. package/build/esm/nodes.js +28 -0
  173. package/build/esm/nodes.js.map +1 -0
  174. package/build/esm/op-chain.d.ts +18 -0
  175. package/build/esm/op-chain.d.ts.map +1 -0
  176. package/build/esm/op-chain.js +36 -0
  177. package/build/esm/op-chain.js.map +1 -0
  178. package/build/esm/ops.d.ts +158 -0
  179. package/build/esm/ops.d.ts.map +1 -0
  180. package/build/esm/ops.js +7 -0
  181. package/build/esm/ops.js.map +1 -0
  182. package/build/esm/organisation.d.ts +10 -0
  183. package/build/esm/organisation.d.ts.map +1 -0
  184. package/build/esm/organisation.js +16 -0
  185. package/build/esm/organisation.js.map +1 -0
  186. package/build/esm/overrides.d.ts +74 -0
  187. package/build/esm/overrides.d.ts.map +1 -0
  188. package/build/esm/overrides.js +15 -0
  189. package/build/esm/overrides.js.map +1 -0
  190. package/build/esm/package.json +1 -0
  191. package/build/esm/reachability.d.ts +27 -0
  192. package/build/esm/reachability.d.ts.map +1 -0
  193. package/build/esm/reachability.js +212 -0
  194. package/build/esm/reachability.js.map +1 -0
  195. package/build/esm/reality-check.d.ts +42 -0
  196. package/build/esm/reality-check.d.ts.map +1 -0
  197. package/build/esm/reality-check.js +185 -0
  198. package/build/esm/reality-check.js.map +1 -0
  199. package/build/esm/replication.d.ts +7 -0
  200. package/build/esm/replication.d.ts.map +1 -0
  201. package/build/esm/replication.js +15 -0
  202. package/build/esm/replication.js.map +1 -0
  203. package/build/esm/retention.d.ts +11 -0
  204. package/build/esm/retention.d.ts.map +1 -0
  205. package/build/esm/retention.js +17 -0
  206. package/build/esm/retention.js.map +1 -0
  207. package/build/esm/session.d.ts +45 -0
  208. package/build/esm/session.d.ts.map +1 -0
  209. package/build/esm/session.js +49 -0
  210. package/build/esm/session.js.map +1 -0
  211. package/build/esm/topology.d.ts +12 -0
  212. package/build/esm/topology.d.ts.map +1 -0
  213. package/build/esm/topology.js +43 -0
  214. package/build/esm/topology.js.map +1 -0
  215. package/build/esm/validate-design.d.ts +22 -0
  216. package/build/esm/validate-design.d.ts.map +1 -0
  217. package/build/esm/validate-design.js +572 -0
  218. package/build/esm/validate-design.js.map +1 -0
  219. package/build/tsconfig.tsbuildinfo +1 -0
  220. package/package.json +37 -0
  221. package/schema/map.schema.json +44 -0
@@ -0,0 +1,27 @@
1
+ import { HandlerScopeIssue } from './diagnostics.js';
2
+ import { EdgeKind } from './edges.js';
3
+ import { BlueprintNode, NodeType } from './nodes.js';
4
+ export type HandlerAttachment = {
5
+ discriminator: NodeType;
6
+ via: EdgeKind;
7
+ };
8
+ export declare const HANDLER_ATTACHMENTS: Readonly<Partial<Record<NodeType, HandlerAttachment>>>;
9
+ export type HandlerScopeRejection = {
10
+ handlerId: string;
11
+ issue: HandlerScopeIssue;
12
+ };
13
+ export type HandlerScopeResult = {
14
+ handlers: string[] | undefined;
15
+ rejected: HandlerScopeRejection[];
16
+ };
17
+ export type HandlerScopeIndex = {
18
+ nodesById: ReadonlyMap<string, BlueprintNode>;
19
+ attachments: ReadonlySet<string>;
20
+ };
21
+ export declare function buildHandlerScopeIndex(nodes: Iterable<BlueprintNode>, edges: Iterable<{
22
+ from: string;
23
+ to: string;
24
+ kind: EdgeKind;
25
+ }>): HandlerScopeIndex;
26
+ export declare function resolveHandlerScope(source: string, declared: readonly string[] | undefined, index: HandlerScopeIndex): HandlerScopeResult;
27
+ //# sourceMappingURL=handler-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-scope.d.ts","sourceRoot":"","sources":["../../src/handler-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,EAAE,QAAQ,CAAC;IACxB,GAAG,EAAE,QAAQ,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAKtF,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClC,CAAC;AAKF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC9B,KAAK,EAAE,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,GAC5D,iBAAiB,CAenB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACvC,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CA4BpB"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HANDLER_ATTACHMENTS = void 0;
4
+ exports.buildHandlerScopeIndex = buildHandlerScopeIndex;
5
+ exports.resolveHandlerScope = resolveHandlerScope;
6
+ exports.HANDLER_ATTACHMENTS = {
7
+ aggregate: { discriminator: 'command', via: 'handled-by' },
8
+ system: { discriminator: 'command', via: 'handled-by' },
9
+ policy: { discriminator: 'event', via: 'triggers' },
10
+ 'read-model': { discriminator: 'event', via: 'projected-to' }
11
+ };
12
+ const attachmentKey = (artifactId, messageId) => `${artifactId}|${messageId}`;
13
+ function buildHandlerScopeIndex(nodes, edges) {
14
+ const nodesById = new Map();
15
+ for (const node of nodes) {
16
+ nodesById.set(node.id, node);
17
+ }
18
+ const attachments = new Set();
19
+ for (const edge of edges) {
20
+ if (edge.kind !== 'handled-by' && edge.kind !== 'triggers' && edge.kind !== 'projected-to') {
21
+ continue;
22
+ }
23
+ attachments.add(attachmentKey(edge.to, edge.from));
24
+ }
25
+ return { nodesById, attachments };
26
+ }
27
+ function resolveHandlerScope(source, declared, index) {
28
+ if (declared === undefined || declared.length === 0) {
29
+ return { handlers: undefined, rejected: [] };
30
+ }
31
+ const sourceType = index.nodesById.get(source)?.type;
32
+ const attachment = sourceType === undefined ? undefined : exports.HANDLER_ATTACHMENTS[sourceType];
33
+ const handlers = [];
34
+ const rejected = [];
35
+ for (const handlerId of declared) {
36
+ const node = index.nodesById.get(handlerId);
37
+ if (node === undefined) {
38
+ rejected.push({ handlerId, issue: 'unresolved' });
39
+ continue;
40
+ }
41
+ if (attachment === undefined || node.type !== attachment.discriminator) {
42
+ rejected.push({ handlerId, issue: 'wrong-type' });
43
+ continue;
44
+ }
45
+ if (!index.attachments.has(attachmentKey(source, handlerId))) {
46
+ rejected.push({ handlerId, issue: 'unconnected' });
47
+ continue;
48
+ }
49
+ if (!handlers.includes(handlerId))
50
+ handlers.push(handlerId);
51
+ }
52
+ return { handlers: handlers.length > 0 ? handlers : undefined, rejected };
53
+ }
54
+ //# sourceMappingURL=handler-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-scope.js","sourceRoot":"","sources":["../../src/handler-scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export * from './nodes.js';
2
+ export * from './edges.js';
3
+ export * from './graph.js';
4
+ export * from './topology.js';
5
+ export * from './handler-scope.js';
6
+ export * from './flow-traversal.js';
7
+ export * from './reachability.js';
8
+ export * from './entry-points.js';
9
+ export * from './diagnostics.js';
10
+ export * from './overrides.js';
11
+ export * from './find-orphan-nodes.js';
12
+ export * from './apply-overrides.js';
13
+ export * from './design.js';
14
+ export * from './ops.js';
15
+ export * from './op-chain.js';
16
+ export * from './validate-design.js';
17
+ export * from './apply-design.js';
18
+ export * from './reality-check.js';
19
+ export * from './convergence.js';
20
+ export * from './replication.js';
21
+ export * from './session.js';
22
+ export * from './organisation.js';
23
+ export * from './retention.js';
24
+ export * from './map-vocabulary.js';
25
+ export * from './map-structure.js';
26
+ export * from './map-links.js';
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./nodes.js"), exports);
18
+ __exportStar(require("./edges.js"), exports);
19
+ __exportStar(require("./graph.js"), exports);
20
+ __exportStar(require("./topology.js"), exports);
21
+ __exportStar(require("./handler-scope.js"), exports);
22
+ __exportStar(require("./flow-traversal.js"), exports);
23
+ __exportStar(require("./reachability.js"), exports);
24
+ __exportStar(require("./entry-points.js"), exports);
25
+ __exportStar(require("./diagnostics.js"), exports);
26
+ __exportStar(require("./overrides.js"), exports);
27
+ __exportStar(require("./find-orphan-nodes.js"), exports);
28
+ __exportStar(require("./apply-overrides.js"), exports);
29
+ __exportStar(require("./design.js"), exports);
30
+ __exportStar(require("./ops.js"), exports);
31
+ __exportStar(require("./op-chain.js"), exports);
32
+ __exportStar(require("./validate-design.js"), exports);
33
+ __exportStar(require("./apply-design.js"), exports);
34
+ __exportStar(require("./reality-check.js"), exports);
35
+ __exportStar(require("./convergence.js"), exports);
36
+ __exportStar(require("./replication.js"), exports);
37
+ __exportStar(require("./session.js"), exports);
38
+ __exportStar(require("./organisation.js"), exports);
39
+ __exportStar(require("./retention.js"), exports);
40
+ __exportStar(require("./map-vocabulary.js"), exports);
41
+ __exportStar(require("./map-structure.js"), exports);
42
+ __exportStar(require("./map-links.js"), exports);
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,6CAA2B;AAC3B,6CAA2B;AAC3B,gDAA8B;AAC9B,qDAAmC;AACnC,sDAAoC;AACpC,oDAAkC;AAClC,oDAAkC;AAClC,mDAAiC;AACjC,iDAA+B;AAC/B,yDAAuC;AACvC,uDAAqC;AACrC,8CAA4B;AAC5B,2CAAyB;AACzB,gDAA8B;AAC9B,uDAAqC;AACrC,oDAAkC;AAClC,qDAAmC;AACnC,mDAAiC;AACjC,mDAAiC;AACjC,+CAA6B;AAC7B,oDAAkC;AAClC,iDAA+B;AAC/B,sDAAoC;AACpC,qDAAmC;AACnC,iDAA+B"}
@@ -0,0 +1,12 @@
1
+ import type { DesignFile } from './design.js';
2
+ import type { BlueprintGraph } from './graph.js';
3
+ import type { MapEntryId, MapFile, MapLink } from './map-structure.js';
4
+ export type MapLinkReport = {
5
+ unlinked: string[];
6
+ orphaned: string[];
7
+ orphanedBy: Record<MapEntryId, string[]>;
8
+ dangling: MapLink[];
9
+ removed: MapLink[];
10
+ };
11
+ export declare function joinMapLinks(merged: BlueprintGraph, design: DesignFile, map: MapFile): MapLinkReport;
12
+ //# sourceMappingURL=map-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-links.d.ts","sourceRoot":"","sources":["../../src/map-links.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC;CACpB,CAAC;AAgBF,wBAAgB,YAAY,CAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAI,aAAa,CA2CtG"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.joinMapLinks = joinMapLinks;
4
+ const apply_design_js_1 = require("./apply-design.js");
5
+ function byString(a, b) {
6
+ return a < b ? -1 : a > b ? 1 : 0;
7
+ }
8
+ function universeOf(merged, design) {
9
+ const ids = new Set();
10
+ for (const node of design.propose?.nodes ?? [])
11
+ ids.add((0, apply_design_js_1.proposedNodeId)(node));
12
+ for (const entry of design.modify ?? [])
13
+ ids.add(entry.id);
14
+ for (const node of merged.nodes) {
15
+ if (node.status === 'removed')
16
+ ids.delete(node.id);
17
+ }
18
+ return ids;
19
+ }
20
+ function joinMapLinks(merged, design, map) {
21
+ const universe = universeOf(merged, design);
22
+ const nodeIds = new Set(merged.nodes.map(node => node.id));
23
+ const removedIds = new Set(merged.nodes.filter(node => node.status === 'removed').map(node => node.id));
24
+ const mapNodes = new Map(map.nodes.map(node => [node.id, node]));
25
+ const deliverablesOf = new Map();
26
+ for (const link of map.links) {
27
+ deliverablesOf.set(link.esId, [...(deliverablesOf.get(link.esId) ?? []), link.deliverableId]);
28
+ }
29
+ const isDead = (deliverableId) => {
30
+ const node = mapNodes.get(deliverableId);
31
+ return node === undefined || node.struck !== undefined;
32
+ };
33
+ const unlinked = [];
34
+ const orphaned = [];
35
+ const orphanedBy = {};
36
+ for (const id of [...universe].sort(byString)) {
37
+ const deliverables = deliverablesOf.get(id);
38
+ if (deliverables === undefined) {
39
+ unlinked.push(id);
40
+ continue;
41
+ }
42
+ if (!deliverables.every(isDead))
43
+ continue;
44
+ orphaned.push(id);
45
+ for (const deliverableId of deliverables) {
46
+ (orphanedBy[deliverableId] ??= []).push(id);
47
+ }
48
+ }
49
+ const dangling = map.links
50
+ .filter(link => !nodeIds.has(link.esId) || !mapNodes.has(link.deliverableId))
51
+ .map(link => ({ esId: link.esId, deliverableId: link.deliverableId }))
52
+ .sort((a, b) => byString(a.esId, b.esId) || byString(a.deliverableId, b.deliverableId));
53
+ const removed = map.links
54
+ .filter(link => mapNodes.has(link.deliverableId) && removedIds.has(link.esId))
55
+ .map(link => ({ esId: link.esId, deliverableId: link.deliverableId }))
56
+ .sort((a, b) => byString(a.esId, b.esId) || byString(a.deliverableId, b.deliverableId));
57
+ return { unlinked, orphaned, orphanedBy, dangling, removed };
58
+ }
59
+ //# sourceMappingURL=map-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-links.js","sourceRoot":"","sources":["../../src/map-links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import { type DecidedSource, type MapNodeLevel, type MapShape } from './map-vocabulary.js';
2
+ export type MapStructureVersion = 1;
3
+ export declare const MAP_STRUCTURE_VERSION: MapStructureVersion;
4
+ export declare const LEGACY_MAP_STRUCTURE_VERSIONS: readonly number[];
5
+ export type MapEntryId = string;
6
+ export type MapOptionId = string;
7
+ export type MapNode = {
8
+ id: MapEntryId;
9
+ level: MapNodeLevel;
10
+ title: string;
11
+ parents: MapEntryId[];
12
+ struck?: {
13
+ reason: string;
14
+ };
15
+ };
16
+ export type MapForkStatus = {
17
+ kind: 'open';
18
+ } | {
19
+ kind: 'decided';
20
+ source: DecidedSource;
21
+ option: MapOptionId;
22
+ } | {
23
+ kind: 'moot';
24
+ reason: string;
25
+ };
26
+ export declare function isMapForkStatus(value: unknown): value is MapForkStatus;
27
+ export type MapOptionWalk = {
28
+ scenario: string;
29
+ text: string;
30
+ };
31
+ export type MapOption = {
32
+ id: MapOptionId;
33
+ label: string;
34
+ walks: MapOptionWalk[];
35
+ rejectedBecause?: string;
36
+ evidence?: string[];
37
+ };
38
+ export type MapForkCard = {
39
+ problem: string;
40
+ useCases: string[];
41
+ options: MapOption[];
42
+ recommendation: {
43
+ option: MapOptionId;
44
+ why: string;
45
+ };
46
+ ifOverturned: string;
47
+ };
48
+ export type MapFork = {
49
+ id: MapEntryId;
50
+ title: string;
51
+ card?: MapForkCard;
52
+ anchor?: MapEntryId;
53
+ restsOn: MapEntryId[];
54
+ status: MapForkStatus;
55
+ testable?: false;
56
+ };
57
+ export type MapEntry = MapNode | MapFork;
58
+ export type MapLink = {
59
+ esId: string;
60
+ deliverableId: MapEntryId;
61
+ };
62
+ export type MapFile = {
63
+ structureVersion: MapStructureVersion;
64
+ shape?: MapShape;
65
+ grounded: boolean;
66
+ nodes: MapNode[];
67
+ forks: MapFork[];
68
+ links: MapLink[];
69
+ };
70
+ export type MapGroundOpPayload = {
71
+ shape: MapShape;
72
+ };
73
+ export type MapPostNodeEntry = Omit<MapNode, 'struck'>;
74
+ export type MapPostForkEntry = Omit<MapFork, 'status'> & {
75
+ level: 'fork';
76
+ };
77
+ export type MapPostEntry = MapPostNodeEntry | MapPostForkEntry;
78
+ export type MapPostOpPayload = MapPostEntry & {
79
+ prior?: MapEntry;
80
+ };
81
+ export type MapWithdrawal = {
82
+ entries: MapEntry[];
83
+ prior?: MapEntry[];
84
+ };
85
+ export type MapStrikeOpPayload = {
86
+ id: MapEntryId;
87
+ reason: string;
88
+ };
89
+ export type MapChooseOpPayload = {
90
+ fork: MapEntryId;
91
+ option: MapOptionId;
92
+ seenSeq: number;
93
+ source: DecidedSource;
94
+ prior?: MapForkStatus;
95
+ };
96
+ export type MapLinkOpPayload = MapLink & {
97
+ added?: false;
98
+ };
99
+ export declare const MAP_ID_PATTERN: RegExp;
100
+ export declare function isMapId(value: unknown): value is MapEntryId;
101
+ export declare function isMapFork(entry: MapEntry): entry is MapFork;
102
+ export declare function emptyMap(): MapFile;
103
+ export type MapReadStatus = 'ok' | 'migrated' | 'unreadable' | 'unsupported-structure-version';
104
+ export type MapRead = {
105
+ map: MapFile;
106
+ status: MapReadStatus;
107
+ error?: string;
108
+ };
109
+ export declare function readMapDocument(value: unknown): MapRead;
110
+ //# sourceMappingURL=map-structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-structure.d.ts","sourceRoot":"","sources":["../../src/map-structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAP_ID_PATTERN = exports.LEGACY_MAP_STRUCTURE_VERSIONS = exports.MAP_STRUCTURE_VERSION = void 0;
4
+ exports.isMapForkStatus = isMapForkStatus;
5
+ exports.isMapId = isMapId;
6
+ exports.isMapFork = isMapFork;
7
+ exports.emptyMap = emptyMap;
8
+ exports.readMapDocument = readMapDocument;
9
+ const map_vocabulary_js_1 = require("./map-vocabulary.js");
10
+ exports.MAP_STRUCTURE_VERSION = 1;
11
+ exports.LEGACY_MAP_STRUCTURE_VERSIONS = [0];
12
+ function isMapForkStatus(value) {
13
+ if (value === null || typeof value !== 'object')
14
+ return false;
15
+ const status = value;
16
+ switch (status.kind) {
17
+ case 'open': return true;
18
+ case 'decided': return (0, map_vocabulary_js_1.isDecidedSource)(status.source) && typeof status.option === 'string';
19
+ case 'moot': return typeof status.reason === 'string';
20
+ default: return false;
21
+ }
22
+ }
23
+ exports.MAP_ID_PATTERN = /^[A-Za-z0-9-]+$/;
24
+ function isMapId(value) {
25
+ return typeof value === 'string' && exports.MAP_ID_PATTERN.test(value);
26
+ }
27
+ function isMapFork(entry) {
28
+ return !('level' in entry);
29
+ }
30
+ function emptyMap() {
31
+ return { structureVersion: exports.MAP_STRUCTURE_VERSION, grounded: false, nodes: [], forks: [], links: [] };
32
+ }
33
+ function readMapDocument(value) {
34
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
35
+ return { map: emptyMap(), status: 'unreadable', error: 'the map document is not an object' };
36
+ }
37
+ const document = value;
38
+ const observed = document.structureVersion;
39
+ if (observed === exports.MAP_STRUCTURE_VERSION)
40
+ return { map: document, status: 'ok' };
41
+ if (observed === undefined || exports.LEGACY_MAP_STRUCTURE_VERSIONS.includes(observed)) {
42
+ return {
43
+ map: { ...document, structureVersion: exports.MAP_STRUCTURE_VERSION },
44
+ status: 'migrated'
45
+ };
46
+ }
47
+ return {
48
+ map: emptyMap(),
49
+ status: 'unsupported-structure-version',
50
+ error: `the map document has structureVersion ${JSON.stringify(observed)}; this build reads `
51
+ + `${[...exports.LEGACY_MAP_STRUCTURE_VERSIONS, exports.MAP_STRUCTURE_VERSION].join(', ')}`
52
+ };
53
+ }
54
+ //# sourceMappingURL=map-structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-structure.js","sourceRoot":"","sources":["../../src/map-structure.ts"],"names":[],"mappings":";;;AAyBA,0CASC;AAqFD,0BAEC;AAED,8BAEC;AAED,4BAEC;AAcD,0CAuBC;AAtKD,2DAA4G;AAI/F,QAAA,qBAAqB,GAAwB,CAAC,CAAC;AAE/C,QAAA,6BAA6B,GAAsB,CAAE,CAAC,CAAE,CAAC;AAmBtE,SAAgB,eAAe,CAAE,KAAc;IAC7C,IAAK,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAG,OAAO,KAAK,CAAC;IAChE,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,QAAS,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC;QACzB,KAAK,SAAS,CAAC,CAAC,OAAO,IAAA,mCAAe,EAAE,MAAM,CAAC,MAAM,CAAE,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;QAC7F,KAAK,MAAM,CAAC,CAAC,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;QACtD,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC;IACxB,CAAC;AACH,CAAC;AAmFY,QAAA,cAAc,GAAG,iBAAiB,CAAC;AAEhD,SAAgB,OAAO,CAAE,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,sBAAc,CAAC,IAAI,CAAE,KAAK,CAAE,CAAC;AACnE,CAAC;AAED,SAAgB,SAAS,CAAE,KAAe;IACxC,OAAO,CAAC,CAAE,OAAO,IAAI,KAAK,CAAE,CAAC;AAC/B,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,EAAE,gBAAgB,EAAE,6BAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACvG,CAAC;AAcD,SAAgB,eAAe,CAAE,KAAc;IAC7C,IAAK,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAE,KAAK,CAAE,EAAC,CAAC;QAC1E,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,QAAQ,GAAG,KAA0D,CAAC;IAC5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC;IAE3C,IAAK,QAAQ,KAAK,6BAAqB;QAAG,OAAO,EAAE,GAAG,EAAE,QAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAE5F,IAAK,QAAQ,KAAK,SAAS,IAAI,qCAA6B,CAAC,QAAQ,CAAE,QAAkB,CAAE,EAAC,CAAC;QAC3F,OAAO;YACL,GAAG,EAAE,EAAE,GAAK,QAAqB,EAAE,gBAAgB,EAAE,6BAAqB,EAAE;YAC5E,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,EAAE,QAAQ,EAAE;QACf,MAAM,EAAE,+BAA+B;QACvC,KAAK,EAAE,yCAA0C,IAAI,CAAC,SAAS,CAAE,QAAQ,CAAG,qBAAqB;cAC7F,GAAI,CAAE,GAAG,qCAA6B,EAAE,6BAAqB,CAAE,CAAC,IAAI,CAAE,IAAI,CAAG,EAAE;KACpF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ export type MapSchemaVersion = 2;
2
+ export declare const MAP_SCHEMA_VERSION: MapSchemaVersion;
3
+ export type ForkStatusKind = 'open' | 'decided' | 'moot';
4
+ export declare const FORK_STATUS_KINDS: readonly ForkStatusKind[];
5
+ export declare function isForkStatusKind(value: unknown): value is ForkStatusKind;
6
+ export type DecidedSource = 'owner' | 'recommendation' | 'code';
7
+ export declare const DECIDED_SOURCES: readonly DecidedSource[];
8
+ export declare function isDecidedSource(value: unknown): value is DecidedSource;
9
+ export type MapNodeLevel = 'goal' | 'mapActor' | 'impact' | 'deliverable';
10
+ export declare const MAP_NODE_LEVELS: readonly MapNodeLevel[];
11
+ export declare function isMapNodeLevel(value: unknown): value is MapNodeLevel;
12
+ export type MapShape = 'impact' | 'decision';
13
+ export declare const MAP_SHAPES: readonly MapShape[];
14
+ export declare function isMapShape(value: unknown): value is MapShape;
15
+ export type MapSchemaVocabulary = {
16
+ type: 'string';
17
+ description: string;
18
+ enum: readonly string[];
19
+ };
20
+ export type MapSchemaDocument = {
21
+ $schema: string;
22
+ title: string;
23
+ description: string;
24
+ schemaVersion: MapSchemaVersion;
25
+ $defs: {
26
+ forkStatusKind: MapSchemaVocabulary;
27
+ decidedSource: MapSchemaVocabulary;
28
+ mapNodeLevel: MapSchemaVocabulary;
29
+ mapShape: MapSchemaVocabulary;
30
+ };
31
+ };
32
+ export declare function mapSchemaDocument(): MapSchemaDocument;
33
+ export declare function serialiseMapSchema(): string;
34
+ export type MapVocabularyName = 'forkStatusKind' | 'decidedSource' | 'mapNodeLevel' | 'mapShape';
35
+ export type MapVocabularyViolation = {
36
+ vocabulary: MapVocabularyName;
37
+ path: string;
38
+ value: unknown;
39
+ allowed: readonly string[];
40
+ message: string;
41
+ };
42
+ export type MapVocabularyUnreadable = {
43
+ path: string;
44
+ value: unknown;
45
+ message: string;
46
+ };
47
+ export type MapVocabularyValidation = {
48
+ ok: boolean;
49
+ violations: readonly MapVocabularyViolation[];
50
+ unreadable: readonly MapVocabularyUnreadable[];
51
+ };
52
+ export declare function validateMapVocabulary(document: unknown): MapVocabularyValidation;
53
+ //# sourceMappingURL=map-vocabulary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-vocabulary.d.ts","sourceRoot":"","sources":["../../src/map-vocabulary.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAEjC,eAAO,MAAM,kBAAkB,EAAE,gBAAoB,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EAEtD,CAAC;AAEF,wBAAgB,gBAAgB,CAAE,KAAK,EAAE,OAAO,GAAI,KAAK,IAAI,cAAc,CAE1E;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAEhE,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAEnD,CAAC;AAEF,wBAAgB,eAAe,CAAE,KAAK,EAAE,OAAO,GAAI,KAAK,IAAI,aAAa,CAExE;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE1E,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EAKhD,CAAC;AAEJ,wBAAgB,cAAc,CAAE,KAAK,EAAE,OAAO,GAAI,KAAK,IAAI,YAAY,CAEtE;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE7C,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAA8C,CAAC;AAEzF,wBAAgB,UAAU,CAAE,KAAK,EAAE,OAAO,GAAI,KAAK,IAAI,QAAQ,CAE9D;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,gBAAgB,CAAC;IAChC,KAAK,EAAE;QACL,cAAc,EAAE,mBAAmB,CAAC;QACpC,aAAa,EAAE,mBAAmB,CAAC;QACnC,YAAY,EAAE,mBAAmB,CAAC;QAClC,QAAQ,EAAE,mBAAmB,CAAC;KAC/B,CAAC;CACH,CAAC;AAEF,wBAAgB,iBAAiB,IAAI,iBAAiB,CAgCrD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,eAAe,GAAG,cAAc,GAAG,UAAU,CAAC;AAEjG,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC9C,UAAU,EAAE,SAAS,uBAAuB,EAAE,CAAC;CAChD,CAAC;AA8BF,wBAAgB,qBAAqB,CAAE,QAAQ,EAAE,OAAO,GAAI,uBAAuB,CAyElF"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAP_SHAPES = exports.MAP_NODE_LEVELS = exports.DECIDED_SOURCES = exports.FORK_STATUS_KINDS = exports.MAP_SCHEMA_VERSION = void 0;
4
+ exports.isForkStatusKind = isForkStatusKind;
5
+ exports.isDecidedSource = isDecidedSource;
6
+ exports.isMapNodeLevel = isMapNodeLevel;
7
+ exports.isMapShape = isMapShape;
8
+ exports.mapSchemaDocument = mapSchemaDocument;
9
+ exports.serialiseMapSchema = serialiseMapSchema;
10
+ exports.validateMapVocabulary = validateMapVocabulary;
11
+ exports.MAP_SCHEMA_VERSION = 2;
12
+ exports.FORK_STATUS_KINDS = Object.freeze(['open', 'decided', 'moot']);
13
+ function isForkStatusKind(value) {
14
+ return typeof value === 'string' && exports.FORK_STATUS_KINDS.includes(value);
15
+ }
16
+ exports.DECIDED_SOURCES = Object.freeze(['owner', 'recommendation', 'code']);
17
+ function isDecidedSource(value) {
18
+ return typeof value === 'string' && exports.DECIDED_SOURCES.includes(value);
19
+ }
20
+ exports.MAP_NODE_LEVELS = Object.freeze([
21
+ 'goal',
22
+ 'mapActor',
23
+ 'impact',
24
+ 'deliverable'
25
+ ]);
26
+ function isMapNodeLevel(value) {
27
+ return typeof value === 'string' && exports.MAP_NODE_LEVELS.includes(value);
28
+ }
29
+ exports.MAP_SHAPES = Object.freeze(['impact', 'decision']);
30
+ function isMapShape(value) {
31
+ return typeof value === 'string' && exports.MAP_SHAPES.includes(value);
32
+ }
33
+ function mapSchemaDocument() {
34
+ return {
35
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
36
+ title: 'BLUEPRINT map vocabulary',
37
+ description: 'The closed sets an BLUEPRINT impact map is written in. Emitted from '
38
+ + '@bett3r-dev/blueprint-schema; do not hand-edit, and do not extend a set '
39
+ + 'in a consumer.',
40
+ schemaVersion: exports.MAP_SCHEMA_VERSION,
41
+ $defs: {
42
+ forkStatusKind: {
43
+ type: 'string',
44
+ description: 'Where a fork stands.',
45
+ enum: [...exports.FORK_STATUS_KINDS]
46
+ },
47
+ decidedSource: {
48
+ type: 'string',
49
+ description: 'Who settled a decided fork.',
50
+ enum: [...exports.DECIDED_SOURCES]
51
+ },
52
+ mapNodeLevel: {
53
+ type: 'string',
54
+ description: 'A node\'s level in the impact map; the who-level is spelled mapActor.',
55
+ enum: [...exports.MAP_NODE_LEVELS]
56
+ },
57
+ mapShape: {
58
+ type: 'string',
59
+ description: 'How a map is drawn: impact columns or a decision tree.',
60
+ enum: [...exports.MAP_SHAPES]
61
+ }
62
+ }
63
+ };
64
+ }
65
+ function serialiseMapSchema() {
66
+ return JSON.stringify(mapSchemaDocument(), null, 2) + '\n';
67
+ }
68
+ const ALLOWED_BY_VOCABULARY = {
69
+ forkStatusKind: exports.FORK_STATUS_KINDS,
70
+ decidedSource: exports.DECIDED_SOURCES,
71
+ mapNodeLevel: exports.MAP_NODE_LEVELS,
72
+ mapShape: exports.MAP_SHAPES
73
+ };
74
+ function isRecord(value) {
75
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
76
+ }
77
+ function violation(vocabulary, path, value) {
78
+ const allowed = ALLOWED_BY_VOCABULARY[vocabulary];
79
+ return {
80
+ vocabulary,
81
+ path,
82
+ value,
83
+ allowed,
84
+ message: `${path}: ${JSON.stringify(value)} is not a ${vocabulary}; `
85
+ + `allowed: ${allowed.join(', ')}`
86
+ };
87
+ }
88
+ function validateMapVocabulary(document) {
89
+ const violations = [];
90
+ const unreadable = [];
91
+ const note = (path, value, expected) => {
92
+ unreadable.push({
93
+ path,
94
+ value,
95
+ message: `${path === '' ? '<document>' : path}: expected ${expected}, `
96
+ + `found ${value === undefined ? 'undefined' : JSON.stringify(value)}; `
97
+ + 'not checked'
98
+ });
99
+ };
100
+ if (!isRecord(document)) {
101
+ note('', document, 'an object');
102
+ return { ok: false, violations, unreadable };
103
+ }
104
+ if (document.shape !== undefined && !isMapShape(document.shape)) {
105
+ violations.push(violation('mapShape', 'shape', document.shape));
106
+ }
107
+ const collection = (key) => {
108
+ const value = document[key];
109
+ if (value === undefined)
110
+ return [];
111
+ if (!Array.isArray(value)) {
112
+ note(key, value, 'an array');
113
+ return [];
114
+ }
115
+ return value;
116
+ };
117
+ collection('nodes').forEach((node, index) => {
118
+ if (!isRecord(node)) {
119
+ note(`nodes[${index}]`, node, 'an object');
120
+ return;
121
+ }
122
+ const level = node.level;
123
+ if (!isMapNodeLevel(level)) {
124
+ violations.push(violation('mapNodeLevel', `nodes[${index}].level`, level));
125
+ }
126
+ });
127
+ collection('forks').forEach((fork, index) => {
128
+ if (!isRecord(fork)) {
129
+ note(`forks[${index}]`, fork, 'an object');
130
+ return;
131
+ }
132
+ const rawStatus = fork.status;
133
+ if (rawStatus !== undefined && !isRecord(rawStatus)) {
134
+ note(`forks[${index}].status`, rawStatus, 'an object');
135
+ return;
136
+ }
137
+ const status = isRecord(rawStatus) ? rawStatus : {};
138
+ const kind = status.kind;
139
+ if (!isForkStatusKind(kind)) {
140
+ violations.push(violation('forkStatusKind', `forks[${index}].status.kind`, kind));
141
+ return;
142
+ }
143
+ if (kind !== 'decided')
144
+ return;
145
+ const source = status.source;
146
+ if (!isDecidedSource(source)) {
147
+ violations.push(violation('decidedSource', `forks[${index}].status.source`, source));
148
+ }
149
+ });
150
+ return {
151
+ ok: violations.length === 0 && unreadable.length === 0,
152
+ violations,
153
+ unreadable
154
+ };
155
+ }
156
+ //# sourceMappingURL=map-vocabulary.js.map