@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.
- package/README.md +7 -0
- package/build/cjs/apply-design.d.ts +22 -0
- package/build/cjs/apply-design.d.ts.map +1 -0
- package/build/cjs/apply-design.js +206 -0
- package/build/cjs/apply-design.js.map +1 -0
- package/build/cjs/apply-overrides.d.ts +11 -0
- package/build/cjs/apply-overrides.d.ts.map +1 -0
- package/build/cjs/apply-overrides.js +240 -0
- package/build/cjs/apply-overrides.js.map +1 -0
- package/build/cjs/convergence.d.ts +15 -0
- package/build/cjs/convergence.d.ts.map +1 -0
- package/build/cjs/convergence.js +28 -0
- package/build/cjs/convergence.js.map +1 -0
- package/build/cjs/design.d.ts +85 -0
- package/build/cjs/design.d.ts.map +1 -0
- package/build/cjs/design.js +51 -0
- package/build/cjs/design.js.map +1 -0
- package/build/cjs/diagnostics.d.ts +74 -0
- package/build/cjs/diagnostics.d.ts.map +1 -0
- package/build/cjs/diagnostics.js +16 -0
- package/build/cjs/diagnostics.js.map +1 -0
- package/build/cjs/edges.d.ts +17 -0
- package/build/cjs/edges.d.ts.map +1 -0
- package/build/cjs/edges.js +21 -0
- package/build/cjs/edges.js.map +1 -0
- package/build/cjs/entry-points.d.ts +17 -0
- package/build/cjs/entry-points.d.ts.map +1 -0
- package/build/cjs/entry-points.js +58 -0
- package/build/cjs/entry-points.js.map +1 -0
- package/build/cjs/find-orphan-nodes.d.ts +5 -0
- package/build/cjs/find-orphan-nodes.d.ts.map +1 -0
- package/build/cjs/find-orphan-nodes.js +14 -0
- package/build/cjs/find-orphan-nodes.js.map +1 -0
- package/build/cjs/flow-traversal.d.ts +24 -0
- package/build/cjs/flow-traversal.d.ts.map +1 -0
- package/build/cjs/flow-traversal.js +102 -0
- package/build/cjs/flow-traversal.js.map +1 -0
- package/build/cjs/graph.d.ts +19 -0
- package/build/cjs/graph.d.ts.map +1 -0
- package/build/cjs/graph.js +32 -0
- package/build/cjs/graph.js.map +1 -0
- package/build/cjs/handler-scope.d.ts +27 -0
- package/build/cjs/handler-scope.d.ts.map +1 -0
- package/build/cjs/handler-scope.js +54 -0
- package/build/cjs/handler-scope.js.map +1 -0
- package/build/cjs/index.d.ts +27 -0
- package/build/cjs/index.d.ts.map +1 -0
- package/build/cjs/index.js +43 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/map-links.d.ts +12 -0
- package/build/cjs/map-links.d.ts.map +1 -0
- package/build/cjs/map-links.js +59 -0
- package/build/cjs/map-links.js.map +1 -0
- package/build/cjs/map-structure.d.ts +110 -0
- package/build/cjs/map-structure.d.ts.map +1 -0
- package/build/cjs/map-structure.js +54 -0
- package/build/cjs/map-structure.js.map +1 -0
- package/build/cjs/map-vocabulary.d.ts +53 -0
- package/build/cjs/map-vocabulary.d.ts.map +1 -0
- package/build/cjs/map-vocabulary.js +156 -0
- package/build/cjs/map-vocabulary.js.map +1 -0
- package/build/cjs/nodes.d.ts +39 -0
- package/build/cjs/nodes.d.ts.map +1 -0
- package/build/cjs/nodes.js +31 -0
- package/build/cjs/nodes.js.map +1 -0
- package/build/cjs/op-chain.d.ts +18 -0
- package/build/cjs/op-chain.d.ts.map +1 -0
- package/build/cjs/op-chain.js +42 -0
- package/build/cjs/op-chain.js.map +1 -0
- package/build/cjs/ops.d.ts +158 -0
- package/build/cjs/ops.d.ts.map +1 -0
- package/build/cjs/ops.js +11 -0
- package/build/cjs/ops.js.map +1 -0
- package/build/cjs/organisation.d.ts +10 -0
- package/build/cjs/organisation.d.ts.map +1 -0
- package/build/cjs/organisation.js +21 -0
- package/build/cjs/organisation.js.map +1 -0
- package/build/cjs/overrides.d.ts +74 -0
- package/build/cjs/overrides.d.ts.map +1 -0
- package/build/cjs/overrides.js +20 -0
- package/build/cjs/overrides.js.map +1 -0
- package/build/cjs/reachability.d.ts +27 -0
- package/build/cjs/reachability.d.ts.map +1 -0
- package/build/cjs/reachability.js +218 -0
- package/build/cjs/reachability.js.map +1 -0
- package/build/cjs/reality-check.d.ts +42 -0
- package/build/cjs/reality-check.d.ts.map +1 -0
- package/build/cjs/reality-check.js +191 -0
- package/build/cjs/reality-check.js.map +1 -0
- package/build/cjs/replication.d.ts +7 -0
- package/build/cjs/replication.d.ts.map +1 -0
- package/build/cjs/replication.js +19 -0
- package/build/cjs/replication.js.map +1 -0
- package/build/cjs/retention.d.ts +11 -0
- package/build/cjs/retention.d.ts.map +1 -0
- package/build/cjs/retention.js +22 -0
- package/build/cjs/retention.js.map +1 -0
- package/build/cjs/session.d.ts +45 -0
- package/build/cjs/session.d.ts.map +1 -0
- package/build/cjs/session.js +55 -0
- package/build/cjs/session.js.map +1 -0
- package/build/cjs/topology.d.ts +12 -0
- package/build/cjs/topology.d.ts.map +1 -0
- package/build/cjs/topology.js +48 -0
- package/build/cjs/topology.js.map +1 -0
- package/build/cjs/validate-design.d.ts +22 -0
- package/build/cjs/validate-design.d.ts.map +1 -0
- package/build/cjs/validate-design.js +576 -0
- package/build/cjs/validate-design.js.map +1 -0
- package/build/esm/apply-design.d.ts +22 -0
- package/build/esm/apply-design.d.ts.map +1 -0
- package/build/esm/apply-design.js +202 -0
- package/build/esm/apply-design.js.map +1 -0
- package/build/esm/apply-overrides.d.ts +11 -0
- package/build/esm/apply-overrides.d.ts.map +1 -0
- package/build/esm/apply-overrides.js +235 -0
- package/build/esm/apply-overrides.js.map +1 -0
- package/build/esm/convergence.d.ts +15 -0
- package/build/esm/convergence.d.ts.map +1 -0
- package/build/esm/convergence.js +25 -0
- package/build/esm/convergence.js.map +1 -0
- package/build/esm/design.d.ts +85 -0
- package/build/esm/design.d.ts.map +1 -0
- package/build/esm/design.js +43 -0
- package/build/esm/design.js.map +1 -0
- package/build/esm/diagnostics.d.ts +74 -0
- package/build/esm/diagnostics.d.ts.map +1 -0
- package/build/esm/diagnostics.js +13 -0
- package/build/esm/diagnostics.js.map +1 -0
- package/build/esm/edges.d.ts +17 -0
- package/build/esm/edges.d.ts.map +1 -0
- package/build/esm/edges.js +18 -0
- package/build/esm/edges.js.map +1 -0
- package/build/esm/entry-points.d.ts +17 -0
- package/build/esm/entry-points.d.ts.map +1 -0
- package/build/esm/entry-points.js +52 -0
- package/build/esm/entry-points.js.map +1 -0
- package/build/esm/find-orphan-nodes.d.ts +5 -0
- package/build/esm/find-orphan-nodes.d.ts.map +1 -0
- package/build/esm/find-orphan-nodes.js +11 -0
- package/build/esm/find-orphan-nodes.js.map +1 -0
- package/build/esm/flow-traversal.d.ts +24 -0
- package/build/esm/flow-traversal.d.ts.map +1 -0
- package/build/esm/flow-traversal.js +96 -0
- package/build/esm/flow-traversal.js.map +1 -0
- package/build/esm/graph.d.ts +19 -0
- package/build/esm/graph.d.ts.map +1 -0
- package/build/esm/graph.js +26 -0
- package/build/esm/graph.js.map +1 -0
- package/build/esm/handler-scope.d.ts +27 -0
- package/build/esm/handler-scope.d.ts.map +1 -0
- package/build/esm/handler-scope.js +49 -0
- package/build/esm/handler-scope.js.map +1 -0
- package/build/esm/index.d.ts +27 -0
- package/build/esm/index.d.ts.map +1 -0
- package/build/esm/index.js +27 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/map-links.d.ts +12 -0
- package/build/esm/map-links.d.ts.map +1 -0
- package/build/esm/map-links.js +56 -0
- package/build/esm/map-links.js.map +1 -0
- package/build/esm/map-structure.d.ts +110 -0
- package/build/esm/map-structure.d.ts.map +1 -0
- package/build/esm/map-structure.js +46 -0
- package/build/esm/map-structure.js.map +1 -0
- package/build/esm/map-vocabulary.d.ts +53 -0
- package/build/esm/map-vocabulary.d.ts.map +1 -0
- package/build/esm/map-vocabulary.js +146 -0
- package/build/esm/map-vocabulary.js.map +1 -0
- package/build/esm/nodes.d.ts +39 -0
- package/build/esm/nodes.d.ts.map +1 -0
- package/build/esm/nodes.js +28 -0
- package/build/esm/nodes.js.map +1 -0
- package/build/esm/op-chain.d.ts +18 -0
- package/build/esm/op-chain.d.ts.map +1 -0
- package/build/esm/op-chain.js +36 -0
- package/build/esm/op-chain.js.map +1 -0
- package/build/esm/ops.d.ts +158 -0
- package/build/esm/ops.d.ts.map +1 -0
- package/build/esm/ops.js +7 -0
- package/build/esm/ops.js.map +1 -0
- package/build/esm/organisation.d.ts +10 -0
- package/build/esm/organisation.d.ts.map +1 -0
- package/build/esm/organisation.js +16 -0
- package/build/esm/organisation.js.map +1 -0
- package/build/esm/overrides.d.ts +74 -0
- package/build/esm/overrides.d.ts.map +1 -0
- package/build/esm/overrides.js +15 -0
- package/build/esm/overrides.js.map +1 -0
- package/build/esm/package.json +1 -0
- package/build/esm/reachability.d.ts +27 -0
- package/build/esm/reachability.d.ts.map +1 -0
- package/build/esm/reachability.js +212 -0
- package/build/esm/reachability.js.map +1 -0
- package/build/esm/reality-check.d.ts +42 -0
- package/build/esm/reality-check.d.ts.map +1 -0
- package/build/esm/reality-check.js +185 -0
- package/build/esm/reality-check.js.map +1 -0
- package/build/esm/replication.d.ts +7 -0
- package/build/esm/replication.d.ts.map +1 -0
- package/build/esm/replication.js +15 -0
- package/build/esm/replication.js.map +1 -0
- package/build/esm/retention.d.ts +11 -0
- package/build/esm/retention.d.ts.map +1 -0
- package/build/esm/retention.js +17 -0
- package/build/esm/retention.js.map +1 -0
- package/build/esm/session.d.ts +45 -0
- package/build/esm/session.d.ts.map +1 -0
- package/build/esm/session.js +49 -0
- package/build/esm/session.js.map +1 -0
- package/build/esm/topology.d.ts +12 -0
- package/build/esm/topology.d.ts.map +1 -0
- package/build/esm/topology.js +43 -0
- package/build/esm/topology.js.map +1 -0
- package/build/esm/validate-design.d.ts +22 -0
- package/build/esm/validate-design.d.ts.map +1 -0
- package/build/esm/validate-design.js +572 -0
- package/build/esm/validate-design.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +37 -0
- package/schema/map.schema.json +44 -0
|
@@ -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.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","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,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,56 @@
|
|
|
1
|
+
import { proposedNodeId } from './apply-design.js';
|
|
2
|
+
function byString(a, b) {
|
|
3
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
4
|
+
}
|
|
5
|
+
function universeOf(merged, design) {
|
|
6
|
+
const ids = new Set();
|
|
7
|
+
for (const node of design.propose?.nodes ?? [])
|
|
8
|
+
ids.add(proposedNodeId(node));
|
|
9
|
+
for (const entry of design.modify ?? [])
|
|
10
|
+
ids.add(entry.id);
|
|
11
|
+
for (const node of merged.nodes) {
|
|
12
|
+
if (node.status === 'removed')
|
|
13
|
+
ids.delete(node.id);
|
|
14
|
+
}
|
|
15
|
+
return ids;
|
|
16
|
+
}
|
|
17
|
+
export function joinMapLinks(merged, design, map) {
|
|
18
|
+
const universe = universeOf(merged, design);
|
|
19
|
+
const nodeIds = new Set(merged.nodes.map(node => node.id));
|
|
20
|
+
const removedIds = new Set(merged.nodes.filter(node => node.status === 'removed').map(node => node.id));
|
|
21
|
+
const mapNodes = new Map(map.nodes.map(node => [node.id, node]));
|
|
22
|
+
const deliverablesOf = new Map();
|
|
23
|
+
for (const link of map.links) {
|
|
24
|
+
deliverablesOf.set(link.esId, [...(deliverablesOf.get(link.esId) ?? []), link.deliverableId]);
|
|
25
|
+
}
|
|
26
|
+
const isDead = (deliverableId) => {
|
|
27
|
+
const node = mapNodes.get(deliverableId);
|
|
28
|
+
return node === undefined || node.struck !== undefined;
|
|
29
|
+
};
|
|
30
|
+
const unlinked = [];
|
|
31
|
+
const orphaned = [];
|
|
32
|
+
const orphanedBy = {};
|
|
33
|
+
for (const id of [...universe].sort(byString)) {
|
|
34
|
+
const deliverables = deliverablesOf.get(id);
|
|
35
|
+
if (deliverables === undefined) {
|
|
36
|
+
unlinked.push(id);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (!deliverables.every(isDead))
|
|
40
|
+
continue;
|
|
41
|
+
orphaned.push(id);
|
|
42
|
+
for (const deliverableId of deliverables) {
|
|
43
|
+
(orphanedBy[deliverableId] ??= []).push(id);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const dangling = map.links
|
|
47
|
+
.filter(link => !nodeIds.has(link.esId) || !mapNodes.has(link.deliverableId))
|
|
48
|
+
.map(link => ({ esId: link.esId, deliverableId: link.deliverableId }))
|
|
49
|
+
.sort((a, b) => byString(a.esId, b.esId) || byString(a.deliverableId, b.deliverableId));
|
|
50
|
+
const removed = map.links
|
|
51
|
+
.filter(link => mapNodes.has(link.deliverableId) && removedIds.has(link.esId))
|
|
52
|
+
.map(link => ({ esId: link.esId, deliverableId: link.deliverableId }))
|
|
53
|
+
.sort((a, b) => byString(a.esId, b.esId) || byString(a.deliverableId, b.deliverableId));
|
|
54
|
+
return { unlinked, orphaned, orphanedBy, dangling, removed };
|
|
55
|
+
}
|
|
56
|
+
//# 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,46 @@
|
|
|
1
|
+
import { isDecidedSource } from './map-vocabulary.js';
|
|
2
|
+
export const MAP_STRUCTURE_VERSION = 1;
|
|
3
|
+
export const LEGACY_MAP_STRUCTURE_VERSIONS = [0];
|
|
4
|
+
export function isMapForkStatus(value) {
|
|
5
|
+
if (value === null || typeof value !== 'object')
|
|
6
|
+
return false;
|
|
7
|
+
const status = value;
|
|
8
|
+
switch (status.kind) {
|
|
9
|
+
case 'open': return true;
|
|
10
|
+
case 'decided': return isDecidedSource(status.source) && typeof status.option === 'string';
|
|
11
|
+
case 'moot': return typeof status.reason === 'string';
|
|
12
|
+
default: return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export const MAP_ID_PATTERN = /^[A-Za-z0-9-]+$/;
|
|
16
|
+
export function isMapId(value) {
|
|
17
|
+
return typeof value === 'string' && MAP_ID_PATTERN.test(value);
|
|
18
|
+
}
|
|
19
|
+
export function isMapFork(entry) {
|
|
20
|
+
return !('level' in entry);
|
|
21
|
+
}
|
|
22
|
+
export function emptyMap() {
|
|
23
|
+
return { structureVersion: MAP_STRUCTURE_VERSION, grounded: false, nodes: [], forks: [], links: [] };
|
|
24
|
+
}
|
|
25
|
+
export function readMapDocument(value) {
|
|
26
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
27
|
+
return { map: emptyMap(), status: 'unreadable', error: 'the map document is not an object' };
|
|
28
|
+
}
|
|
29
|
+
const document = value;
|
|
30
|
+
const observed = document.structureVersion;
|
|
31
|
+
if (observed === MAP_STRUCTURE_VERSION)
|
|
32
|
+
return { map: document, status: 'ok' };
|
|
33
|
+
if (observed === undefined || LEGACY_MAP_STRUCTURE_VERSIONS.includes(observed)) {
|
|
34
|
+
return {
|
|
35
|
+
map: { ...document, structureVersion: MAP_STRUCTURE_VERSION },
|
|
36
|
+
status: 'migrated'
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
map: emptyMap(),
|
|
41
|
+
status: 'unsupported-structure-version',
|
|
42
|
+
error: `the map document has structureVersion ${JSON.stringify(observed)}; this build reads `
|
|
43
|
+
+ `${[...LEGACY_MAP_STRUCTURE_VERSIONS, MAP_STRUCTURE_VERSION].join(', ')}`
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=map-structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-structure.js","sourceRoot":"","sources":["../../src/map-structure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwD,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAI5G,MAAM,CAAC,MAAM,qBAAqB,GAAwB,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,6BAA6B,GAAsB,CAAE,CAAC,CAAE,CAAC;AAmBtE,MAAM,UAAU,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,eAAe,CAAE,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;AAmFD,MAAM,CAAC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAEhD,MAAM,UAAU,OAAO,CAAE,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAE,KAAK,CAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,SAAS,CAAE,KAAe;IACxC,OAAO,CAAC,CAAE,OAAO,IAAI,KAAK,CAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACvG,CAAC;AAcD,MAAM,UAAU,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,qBAAqB;QAAG,OAAO,EAAE,GAAG,EAAE,QAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAE5F,IAAK,QAAQ,KAAK,SAAS,IAAI,6BAA6B,CAAC,QAAQ,CAAE,QAAkB,CAAE,EAAC,CAAC;QAC3F,OAAO;YACL,GAAG,EAAE,EAAE,GAAK,QAAqB,EAAE,gBAAgB,EAAE,qBAAqB,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,6BAA6B,EAAE,qBAAqB,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,146 @@
|
|
|
1
|
+
export const MAP_SCHEMA_VERSION = 2;
|
|
2
|
+
export const FORK_STATUS_KINDS = Object.freeze(['open', 'decided', 'moot']);
|
|
3
|
+
export function isForkStatusKind(value) {
|
|
4
|
+
return typeof value === 'string' && FORK_STATUS_KINDS.includes(value);
|
|
5
|
+
}
|
|
6
|
+
export const DECIDED_SOURCES = Object.freeze(['owner', 'recommendation', 'code']);
|
|
7
|
+
export function isDecidedSource(value) {
|
|
8
|
+
return typeof value === 'string' && DECIDED_SOURCES.includes(value);
|
|
9
|
+
}
|
|
10
|
+
export const MAP_NODE_LEVELS = Object.freeze([
|
|
11
|
+
'goal',
|
|
12
|
+
'mapActor',
|
|
13
|
+
'impact',
|
|
14
|
+
'deliverable'
|
|
15
|
+
]);
|
|
16
|
+
export function isMapNodeLevel(value) {
|
|
17
|
+
return typeof value === 'string' && MAP_NODE_LEVELS.includes(value);
|
|
18
|
+
}
|
|
19
|
+
export const MAP_SHAPES = Object.freeze(['impact', 'decision']);
|
|
20
|
+
export function isMapShape(value) {
|
|
21
|
+
return typeof value === 'string' && MAP_SHAPES.includes(value);
|
|
22
|
+
}
|
|
23
|
+
export function mapSchemaDocument() {
|
|
24
|
+
return {
|
|
25
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
26
|
+
title: 'BLUEPRINT map vocabulary',
|
|
27
|
+
description: 'The closed sets an BLUEPRINT impact map is written in. Emitted from '
|
|
28
|
+
+ '@bett3r-dev/blueprint-schema; do not hand-edit, and do not extend a set '
|
|
29
|
+
+ 'in a consumer.',
|
|
30
|
+
schemaVersion: MAP_SCHEMA_VERSION,
|
|
31
|
+
$defs: {
|
|
32
|
+
forkStatusKind: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: 'Where a fork stands.',
|
|
35
|
+
enum: [...FORK_STATUS_KINDS]
|
|
36
|
+
},
|
|
37
|
+
decidedSource: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'Who settled a decided fork.',
|
|
40
|
+
enum: [...DECIDED_SOURCES]
|
|
41
|
+
},
|
|
42
|
+
mapNodeLevel: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
description: 'A node\'s level in the impact map; the who-level is spelled mapActor.',
|
|
45
|
+
enum: [...MAP_NODE_LEVELS]
|
|
46
|
+
},
|
|
47
|
+
mapShape: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
description: 'How a map is drawn: impact columns or a decision tree.',
|
|
50
|
+
enum: [...MAP_SHAPES]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function serialiseMapSchema() {
|
|
56
|
+
return JSON.stringify(mapSchemaDocument(), null, 2) + '\n';
|
|
57
|
+
}
|
|
58
|
+
const ALLOWED_BY_VOCABULARY = {
|
|
59
|
+
forkStatusKind: FORK_STATUS_KINDS,
|
|
60
|
+
decidedSource: DECIDED_SOURCES,
|
|
61
|
+
mapNodeLevel: MAP_NODE_LEVELS,
|
|
62
|
+
mapShape: MAP_SHAPES
|
|
63
|
+
};
|
|
64
|
+
function isRecord(value) {
|
|
65
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
66
|
+
}
|
|
67
|
+
function violation(vocabulary, path, value) {
|
|
68
|
+
const allowed = ALLOWED_BY_VOCABULARY[vocabulary];
|
|
69
|
+
return {
|
|
70
|
+
vocabulary,
|
|
71
|
+
path,
|
|
72
|
+
value,
|
|
73
|
+
allowed,
|
|
74
|
+
message: `${path}: ${JSON.stringify(value)} is not a ${vocabulary}; `
|
|
75
|
+
+ `allowed: ${allowed.join(', ')}`
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function validateMapVocabulary(document) {
|
|
79
|
+
const violations = [];
|
|
80
|
+
const unreadable = [];
|
|
81
|
+
const note = (path, value, expected) => {
|
|
82
|
+
unreadable.push({
|
|
83
|
+
path,
|
|
84
|
+
value,
|
|
85
|
+
message: `${path === '' ? '<document>' : path}: expected ${expected}, `
|
|
86
|
+
+ `found ${value === undefined ? 'undefined' : JSON.stringify(value)}; `
|
|
87
|
+
+ 'not checked'
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
if (!isRecord(document)) {
|
|
91
|
+
note('', document, 'an object');
|
|
92
|
+
return { ok: false, violations, unreadable };
|
|
93
|
+
}
|
|
94
|
+
if (document.shape !== undefined && !isMapShape(document.shape)) {
|
|
95
|
+
violations.push(violation('mapShape', 'shape', document.shape));
|
|
96
|
+
}
|
|
97
|
+
const collection = (key) => {
|
|
98
|
+
const value = document[key];
|
|
99
|
+
if (value === undefined)
|
|
100
|
+
return [];
|
|
101
|
+
if (!Array.isArray(value)) {
|
|
102
|
+
note(key, value, 'an array');
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
return value;
|
|
106
|
+
};
|
|
107
|
+
collection('nodes').forEach((node, index) => {
|
|
108
|
+
if (!isRecord(node)) {
|
|
109
|
+
note(`nodes[${index}]`, node, 'an object');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const level = node.level;
|
|
113
|
+
if (!isMapNodeLevel(level)) {
|
|
114
|
+
violations.push(violation('mapNodeLevel', `nodes[${index}].level`, level));
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
collection('forks').forEach((fork, index) => {
|
|
118
|
+
if (!isRecord(fork)) {
|
|
119
|
+
note(`forks[${index}]`, fork, 'an object');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const rawStatus = fork.status;
|
|
123
|
+
if (rawStatus !== undefined && !isRecord(rawStatus)) {
|
|
124
|
+
note(`forks[${index}].status`, rawStatus, 'an object');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const status = isRecord(rawStatus) ? rawStatus : {};
|
|
128
|
+
const kind = status.kind;
|
|
129
|
+
if (!isForkStatusKind(kind)) {
|
|
130
|
+
violations.push(violation('forkStatusKind', `forks[${index}].status.kind`, kind));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (kind !== 'decided')
|
|
134
|
+
return;
|
|
135
|
+
const source = status.source;
|
|
136
|
+
if (!isDecidedSource(source)) {
|
|
137
|
+
violations.push(violation('decidedSource', `forks[${index}].status.source`, source));
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
return {
|
|
141
|
+
ok: violations.length === 0 && unreadable.length === 0,
|
|
142
|
+
violations,
|
|
143
|
+
unreadable
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=map-vocabulary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-vocabulary.js","sourceRoot":"","sources":["../../src/map-vocabulary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type NodeSource = {
|
|
2
|
+
file: string;
|
|
3
|
+
line: number;
|
|
4
|
+
};
|
|
5
|
+
export type NodeMeta = {
|
|
6
|
+
source: NodeSource;
|
|
7
|
+
};
|
|
8
|
+
export type Origin = 'extracted' | 'manual' | 'human' | 'ai' | 'derived';
|
|
9
|
+
export type DesignAuthor = 'human' | 'ai';
|
|
10
|
+
export type DesignStatus = 'proposed' | 'modified' | 'removed' | 'satisfied';
|
|
11
|
+
export type UiKind = 'end-user' | 'back-office';
|
|
12
|
+
export type NodeType = 'aggregate' | 'system' | 'command' | 'event' | 'policy' | 'read-model' | 'external-system' | 'datastore' | 'cache' | 'ui' | 'postgres-view';
|
|
13
|
+
export declare const NODE_TYPES: readonly NodeType[];
|
|
14
|
+
export declare const NODE_ABBREV: Record<NodeType, string>;
|
|
15
|
+
export declare const NODE_TYPE_BY_ABBREV: Readonly<Record<string, NodeType>>;
|
|
16
|
+
export type ReadModelQuery = {
|
|
17
|
+
route: string;
|
|
18
|
+
source: NodeSource;
|
|
19
|
+
};
|
|
20
|
+
export type ReadModelSearchIndex = {
|
|
21
|
+
engine: string;
|
|
22
|
+
source: NodeSource;
|
|
23
|
+
};
|
|
24
|
+
export type BlueprintNode = {
|
|
25
|
+
id: string;
|
|
26
|
+
type: NodeType;
|
|
27
|
+
label: string;
|
|
28
|
+
subdomain: string;
|
|
29
|
+
resourceKey?: string;
|
|
30
|
+
queries?: ReadModelQuery[];
|
|
31
|
+
searchIndexes?: ReadModelSearchIndex[];
|
|
32
|
+
meta?: NodeMeta;
|
|
33
|
+
uiKind?: UiKind;
|
|
34
|
+
origin?: Origin;
|
|
35
|
+
status?: DesignStatus;
|
|
36
|
+
previousLabel?: string;
|
|
37
|
+
note?: string;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/nodes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,IAAI,CAAC;AAE1C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AAE7E,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAChB,WAAW,GACX,QAAQ,GACR,SAAS,GACT,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,iBAAiB,GACjB,WAAW,GACX,OAAO,GACP,IAAI,GACJ,eAAe,CAAC;AAEpB,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAYhC,CAAC;AAEX,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAYhD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAElE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACvC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const NODE_TYPES = [
|
|
2
|
+
'aggregate',
|
|
3
|
+
'system',
|
|
4
|
+
'command',
|
|
5
|
+
'event',
|
|
6
|
+
'policy',
|
|
7
|
+
'read-model',
|
|
8
|
+
'external-system',
|
|
9
|
+
'datastore',
|
|
10
|
+
'cache',
|
|
11
|
+
'ui',
|
|
12
|
+
'postgres-view'
|
|
13
|
+
];
|
|
14
|
+
export const NODE_ABBREV = {
|
|
15
|
+
'aggregate': 'agg',
|
|
16
|
+
'system': 'sys',
|
|
17
|
+
'command': 'cmd',
|
|
18
|
+
'event': 'evt',
|
|
19
|
+
'policy': 'pol',
|
|
20
|
+
'read-model': 'rm',
|
|
21
|
+
'external-system': 'ext',
|
|
22
|
+
'datastore': 'tbl',
|
|
23
|
+
'cache': 'cache',
|
|
24
|
+
'ui': 'ui',
|
|
25
|
+
'postgres-view': 'view'
|
|
26
|
+
};
|
|
27
|
+
export const NODE_TYPE_BY_ABBREV = Object.fromEntries(NODE_TYPES.map(type => [NODE_ABBREV[type], type]));
|
|
28
|
+
//# sourceMappingURL=nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/nodes.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAC,MAAM,UAAU,GAAwB;IAC7C,WAAW;IACX,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,iBAAiB;IACjB,WAAW;IACX,OAAO;IACP,IAAI;IACJ,eAAe;CACP,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAA6B;IACnD,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,IAAI;IAClB,iBAAiB,EAAE,KAAK;IACxB,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,IAAI;IACV,eAAe,EAAE,MAAM;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAuC,MAAM,CAAC,WAAW,CACvF,UAAU,CAAC,GAAG,CAAE,IAAI,CAAC,EAAE,CAAC,CAAE,WAAW,CAAE,IAAI,CAAE,EAAE,IAAI,CAAE,CAAE,CACxD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Op } from './ops.js';
|
|
2
|
+
export declare const OP_CHAIN_DOMAIN = "blueprint-ops-chain";
|
|
3
|
+
export declare const OP_CHAIN_VERSION = "v1";
|
|
4
|
+
export declare const OP_CHAIN_GENESIS = "b369ef2317f5bd6bd22ddd3ebce94632849a553fa19d0b756a23745546627639";
|
|
5
|
+
export type ChainedOp = Op & {
|
|
6
|
+
prevHash: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function isChainedOp(op: Op): op is ChainedOp;
|
|
9
|
+
export declare function canonicalJson(value: unknown): string;
|
|
10
|
+
export declare function opChainPreimage(op: ChainedOp): string;
|
|
11
|
+
export type ChainBreakOpPayload = {
|
|
12
|
+
firstBrokenSeq: number;
|
|
13
|
+
opsAfterBreak: number;
|
|
14
|
+
reason: 'prev-hash-mismatch' | 'prev-hash-missing';
|
|
15
|
+
chainStartSeq?: number;
|
|
16
|
+
unattributedThroughSeq?: number;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=op-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"op-chain.d.ts","sourceRoot":"","sources":["../../src/op-chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,eAAO,MAAM,eAAe,wBAAwB,CAAC;AAErD,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,eAAO,MAAM,gBAAgB,qEACuC,CAAC;AAErE,MAAM,MAAM,SAAS,GAAG,EAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,wBAAgB,WAAW,CAAE,EAAE,EAAE,EAAE,GAAI,EAAE,IAAI,SAAS,CAErD;AAED,wBAAgB,aAAa,CAAE,KAAK,EAAE,OAAO,GAAI,MAAM,CAEtD;AAWD,wBAAgB,eAAe,CAAE,EAAE,EAAE,SAAS,GAAI,MAAM,CAcvD;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,oBAAoB,GAAG,mBAAmB,CAAC;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const OP_CHAIN_DOMAIN = 'blueprint-ops-chain';
|
|
2
|
+
export const OP_CHAIN_VERSION = 'v1';
|
|
3
|
+
export const OP_CHAIN_GENESIS = 'b369ef2317f5bd6bd22ddd3ebce94632849a553fa19d0b756a23745546627639';
|
|
4
|
+
export function isChainedOp(op) {
|
|
5
|
+
return typeof op.prevHash === 'string' && op.prevHash.length > 0;
|
|
6
|
+
}
|
|
7
|
+
export function canonicalJson(value) {
|
|
8
|
+
return JSON.stringify(sortDeep(value));
|
|
9
|
+
}
|
|
10
|
+
function sortDeep(value) {
|
|
11
|
+
if (Array.isArray(value))
|
|
12
|
+
return value.map(sortDeep);
|
|
13
|
+
if (value === null || typeof value !== 'object')
|
|
14
|
+
return value;
|
|
15
|
+
const source = value;
|
|
16
|
+
const sorted = {};
|
|
17
|
+
for (const key of Object.keys(source).sort())
|
|
18
|
+
sorted[key] = sortDeep(source[key]);
|
|
19
|
+
return sorted;
|
|
20
|
+
}
|
|
21
|
+
export function opChainPreimage(op) {
|
|
22
|
+
return [
|
|
23
|
+
OP_CHAIN_DOMAIN,
|
|
24
|
+
OP_CHAIN_VERSION,
|
|
25
|
+
op.prevHash,
|
|
26
|
+
String(op.seq),
|
|
27
|
+
op.ts,
|
|
28
|
+
op.author,
|
|
29
|
+
op.class,
|
|
30
|
+
op.verb,
|
|
31
|
+
op.writerSha,
|
|
32
|
+
op.writerId,
|
|
33
|
+
canonicalJson(op.payload)
|
|
34
|
+
].join('\0');
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=op-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"op-chain.js","sourceRoot":"","sources":["../../src/op-chain.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC,MAAM,CAAC,MAAM,gBAAgB,GAC3B,kEAAkE,CAAC;AAIrE,MAAM,UAAU,WAAW,CAAE,EAAM;IACjC,OAAO,OAAO,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,aAAa,CAAE,KAAc;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAE,QAAQ,CAAE,KAAK,CAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,QAAQ,CAAE,KAAc;IAC/B,IAAK,KAAK,CAAC,OAAO,CAAE,KAAK,CAAE;QAAE,OAAO,KAAK,CAAC,GAAG,CAAE,QAAQ,CAAE,CAAC;IAC1D,IAAK,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAG,OAAO,KAAK,CAAC;IAChE,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAE,MAAM,CAAE,CAAC,IAAI,EAAE;QAAE,MAAM,CAAE,GAAG,CAAE,GAAG,QAAQ,CAAE,MAAM,CAAE,GAAG,CAAE,CAAC,CAAC;IAC1F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAE,EAAa;IAC5C,OAAO;QACL,eAAe;QACf,gBAAgB;QAChB,EAAE,CAAC,QAAQ;QACX,MAAM,CAAE,EAAE,CAAC,GAAG,CAAE;QAChB,EAAE,CAAC,EAAE;QACL,EAAE,CAAC,MAAM;QACT,EAAE,CAAC,KAAK;QACR,EAAE,CAAC,IAAI;QACP,EAAE,CAAC,SAAS;QACZ,EAAE,CAAC,QAAQ;QACX,aAAa,CAAE,EAAE,CAAC,OAAO,CAAE;KAC5B,CAAC,IAAI,CAAE,IAAI,CAAE,CAAC;AACjB,CAAC"}
|