@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,572 @@
1
+ import { EDGE_KIND_SOURCES, EDGE_KINDS } from './edges.js';
2
+ import { buildHandlerScopeIndex, resolveHandlerScope } from './handler-scope.js';
3
+ import { MODIFIABLE_NODE_FIELDS, isCommentIdAnchor, isEdgeRefAnchor } from './design.js';
4
+ import { manualNodeId } from './apply-overrides.js';
5
+ import { nodeId } from './graph.js';
6
+ import { NODE_TYPES } from './nodes.js';
7
+ import { BLUEPRINT_OVERRIDES_FILENAME } from './overrides.js';
8
+ import { isAllowedEdge } from './topology.js';
9
+ export const DESIGN_ISSUE_CLASS = {
10
+ UNSUPPORTED_SCHEMA_VERSION: 'malformed',
11
+ MALFORMED_ENTRY: 'malformed',
12
+ UNKNOWN_NODE_TYPE: 'malformed',
13
+ UNKNOWN_EDGE_KIND: 'malformed',
14
+ UNMODIFIABLE_FIELD: 'malformed',
15
+ DUPLICATE_COMMENT_ID: 'malformed',
16
+ TOPOLOGY_VIOLATION: 'incoherent',
17
+ DUPLICATE_IDENTITY: 'incoherent',
18
+ EDGE_TARGETS_REMOVED: 'incoherent',
19
+ UNRESOLVED_TARGET: 'incoherent',
20
+ UNRESOLVED_EDGE_ENDPOINT: 'incoherent',
21
+ INVALID_EDGE_HANDLER: 'incoherent'
22
+ };
23
+ function splitByClass(issues) {
24
+ const malformed = [];
25
+ const incoherent = [];
26
+ for (const issue of issues) {
27
+ (DESIGN_ISSUE_CLASS[issue.code] === 'malformed' ? malformed : incoherent).push(issue);
28
+ }
29
+ return { malformed, incoherent };
30
+ }
31
+ function isFilledString(value) {
32
+ return typeof value === 'string' && value.trim().length > 0;
33
+ }
34
+ function checkAttribution(entry, path, issues) {
35
+ if (entry.author !== 'human' && entry.author !== 'ai') {
36
+ issues.push({
37
+ code: 'MALFORMED_ENTRY',
38
+ path,
39
+ message: `${path}.author must be 'human' or 'ai', got ${JSON.stringify(entry.author)}`
40
+ });
41
+ }
42
+ if (!isFilledString(entry.ts)) {
43
+ issues.push({
44
+ code: 'MALFORMED_ENTRY',
45
+ path,
46
+ message: `${path}.ts must be a non-empty ISO-8601 timestamp`
47
+ });
48
+ }
49
+ }
50
+ function checkProposedNode(node, path, issues) {
51
+ if (!NODE_TYPES.includes(node.type)) {
52
+ issues.push({
53
+ code: 'UNKNOWN_NODE_TYPE',
54
+ path,
55
+ message: `${path}.type ${JSON.stringify(node.type)} is not an BLUEPRINT node type`
56
+ });
57
+ }
58
+ if (!isFilledString(node.label)) {
59
+ issues.push({
60
+ code: 'MALFORMED_ENTRY',
61
+ path,
62
+ message: `${path}.label must be a non-empty string`
63
+ });
64
+ }
65
+ if (!isFilledString(node.subdomain)) {
66
+ issues.push({
67
+ code: 'MALFORMED_ENTRY',
68
+ path,
69
+ message: `${path}.subdomain must be a non-empty string`
70
+ });
71
+ }
72
+ checkAttribution(node, path, issues);
73
+ }
74
+ function checkModifyEntry(entry, path, issues) {
75
+ checkAttribution(entry, path, issues);
76
+ if (!isFilledString(entry.id)) {
77
+ issues.push({
78
+ code: 'MALFORMED_ENTRY',
79
+ path,
80
+ message: `${path}.id must be the id of the element to modify`
81
+ });
82
+ }
83
+ const set = entry.set;
84
+ if (typeof set !== 'object' || set === null || Array.isArray(set)) {
85
+ issues.push({
86
+ code: 'MALFORMED_ENTRY',
87
+ path,
88
+ message: `${path}.set must be an object of fields to overwrite`
89
+ });
90
+ return;
91
+ }
92
+ const fields = Object.keys(set);
93
+ if (fields.length === 0) {
94
+ issues.push({
95
+ code: 'MALFORMED_ENTRY',
96
+ path,
97
+ message: `${path}.set must change at least one field`
98
+ });
99
+ }
100
+ for (const field of fields) {
101
+ if (MODIFIABLE_NODE_FIELDS.includes(field))
102
+ continue;
103
+ issues.push({
104
+ code: 'UNMODIFIABLE_FIELD',
105
+ path,
106
+ message: `${path}.set may not change ${JSON.stringify(field)} — modifiable fields are `
107
+ + `${MODIFIABLE_NODE_FIELDS.join(', ')}; changing an element's type or id is `
108
+ + 'a remove + a propose, never a modify'
109
+ });
110
+ }
111
+ const values = set;
112
+ for (const field of ['label', 'subdomain', 'resourceKey']) {
113
+ if (values[field] !== undefined && !isFilledString(values[field])) {
114
+ issues.push({
115
+ code: 'MALFORMED_ENTRY',
116
+ path,
117
+ message: `${path}.set.${field} must be a non-empty string`
118
+ });
119
+ }
120
+ }
121
+ if (values.queries !== undefined && !Array.isArray(values.queries)) {
122
+ issues.push({
123
+ code: 'MALFORMED_ENTRY',
124
+ path,
125
+ message: `${path}.set.queries must be an array of read-model queries`
126
+ });
127
+ }
128
+ }
129
+ function checkRemoveEntry(entry, path, issues) {
130
+ checkAttribution(entry, path, issues);
131
+ if (entry.kind === 'node') {
132
+ if (!isFilledString(entry.id)) {
133
+ issues.push({
134
+ code: 'MALFORMED_ENTRY',
135
+ path,
136
+ message: `${path}.id must be the id of the node to remove`
137
+ });
138
+ }
139
+ return;
140
+ }
141
+ if (entry.kind === 'edge') {
142
+ if (!isFilledString(entry.from) || !isFilledString(entry.to)) {
143
+ issues.push({
144
+ code: 'MALFORMED_ENTRY',
145
+ path,
146
+ message: `${path} must name both endpoints of the edge to remove`
147
+ });
148
+ }
149
+ if (!EDGE_KINDS.includes(entry.edgeKind)) {
150
+ issues.push({
151
+ code: 'UNKNOWN_EDGE_KIND',
152
+ path,
153
+ message: `${path}.edgeKind ${JSON.stringify(entry.edgeKind)} is not an BLUEPRINT edge kind`
154
+ });
155
+ }
156
+ return;
157
+ }
158
+ issues.push({
159
+ code: 'MALFORMED_ENTRY',
160
+ path,
161
+ message: `${path}.kind must be 'node' or 'edge', got `
162
+ + `${JSON.stringify(entry.kind)}`
163
+ });
164
+ }
165
+ function checkComment(entry, path, issues) {
166
+ checkAttribution(entry, path, issues);
167
+ if (!isFilledString(entry.id)) {
168
+ issues.push({
169
+ code: 'MALFORMED_ENTRY',
170
+ path,
171
+ message: `${path}.id must be a non-empty comment id`
172
+ });
173
+ }
174
+ if (!isFilledString(entry.text)) {
175
+ issues.push({
176
+ code: 'MALFORMED_ENTRY',
177
+ path,
178
+ message: `${path}.text must be a non-empty remark`
179
+ });
180
+ }
181
+ if (typeof entry.resolved !== 'boolean') {
182
+ issues.push({
183
+ code: 'MALFORMED_ENTRY',
184
+ path,
185
+ message: `${path}.resolved must be a boolean — either actor may set it`
186
+ });
187
+ }
188
+ if (entry.mentions !== undefined
189
+ && (!Array.isArray(entry.mentions) || !entry.mentions.every(isFilledString))) {
190
+ issues.push({
191
+ code: 'MALFORMED_ENTRY',
192
+ path,
193
+ message: `${path}.mentions must be a list of member ids when present`
194
+ });
195
+ }
196
+ const { anchor } = entry;
197
+ if (anchor === null || anchor === undefined || typeof anchor === 'string')
198
+ return;
199
+ if (isCommentIdAnchor(anchor))
200
+ return;
201
+ if (!isEdgeRefAnchor(anchor)) {
202
+ issues.push({
203
+ code: 'MALFORMED_ENTRY',
204
+ path,
205
+ message: `${path}.anchor must be a node id, an edge ref { from, to, kind }, `
206
+ + 'a comment ref { commentId }, or null'
207
+ });
208
+ return;
209
+ }
210
+ if (!EDGE_KINDS.includes(anchor.kind)) {
211
+ issues.push({
212
+ code: 'UNKNOWN_EDGE_KIND',
213
+ path,
214
+ message: `${path}.anchor.kind ${JSON.stringify(anchor.kind)} is not an BLUEPRINT edge kind`
215
+ });
216
+ }
217
+ }
218
+ function locate(persisted, incoming, prefix) {
219
+ return [
220
+ ...persisted.map((entry, index) => ({
221
+ entry, path: `${prefix}[${index}]`, incoming: false
222
+ })),
223
+ ...incoming.map((entry, index) => ({
224
+ entry, path: `${prefix}[${persisted.length + index}]`, incoming: true
225
+ }))
226
+ ];
227
+ }
228
+ function reportIdentityCollision(entry, held, identity, issues) {
229
+ const designVsDesign = entry.path !== undefined && held.path !== undefined;
230
+ const blamed = entry.path !== undefined && (designVsDesign || entry.incoming === true)
231
+ ? entry
232
+ : held.path !== undefined && (designVsDesign || held.incoming === true)
233
+ ? held
234
+ : undefined;
235
+ if (blamed?.path === undefined)
236
+ return;
237
+ const other = blamed === entry ? held : entry;
238
+ issues.push({
239
+ code: 'DUPLICATE_IDENTITY',
240
+ path: blamed.path,
241
+ message: `${blamed.path} would give two elements the display identity "${identity}" `
242
+ + `(${blamed.subdomain}/${blamed.type}/${blamed.label}) — ${other.owner} already has it`
243
+ });
244
+ }
245
+ function buildNamespace(proposedNodes, modifies, graph, issues) {
246
+ const namespace = new Map();
247
+ for (const node of graph?.nodes ?? []) {
248
+ namespace.set(node.id, {
249
+ type: node.type,
250
+ label: node.label,
251
+ subdomain: node.subdomain,
252
+ owner: node.origin !== undefined && node.origin !== 'extracted'
253
+ ? BLUEPRINT_OVERRIDES_FILENAME
254
+ : 'the effective graph'
255
+ });
256
+ }
257
+ for (const { entry: proposed, path, incoming } of proposedNodes) {
258
+ if (!NODE_TYPES.includes(proposed.type))
259
+ continue;
260
+ if (!isFilledString(proposed.label) || !isFilledString(proposed.subdomain))
261
+ continue;
262
+ const id = nodeId(proposed.subdomain, proposed.type, proposed.label);
263
+ const taken = namespace.get(id);
264
+ if (taken) {
265
+ if (taken.path !== undefined || incoming) {
266
+ issues.push({
267
+ code: 'DUPLICATE_IDENTITY',
268
+ path,
269
+ message: `${path} proposes ${proposed.subdomain}/${proposed.type}/`
270
+ + `${proposed.label}, whose identity "${id}" is already claimed by `
271
+ + `${taken.path ?? taken.owner} — reality keeps the id; drop the propose or rename it`
272
+ });
273
+ }
274
+ continue;
275
+ }
276
+ namespace.set(id, {
277
+ type: proposed.type,
278
+ label: proposed.label,
279
+ subdomain: proposed.subdomain,
280
+ path,
281
+ incoming,
282
+ owner: path
283
+ });
284
+ }
285
+ for (const { entry, path, incoming } of modifies) {
286
+ const target = namespace.get(entry.id);
287
+ if (!target)
288
+ continue;
289
+ const set = (entry.set ?? {});
290
+ if (isFilledString(set.label))
291
+ target.label = set.label;
292
+ if (isFilledString(set.subdomain))
293
+ target.subdomain = set.subdomain;
294
+ target.path = path;
295
+ target.incoming = target.incoming === true || incoming;
296
+ }
297
+ const identityOwner = new Map();
298
+ for (const entry of namespace.values()) {
299
+ const identity = nodeId(entry.subdomain, entry.type, entry.label);
300
+ const held = identityOwner.get(identity);
301
+ if (!held) {
302
+ identityOwner.set(identity, entry);
303
+ continue;
304
+ }
305
+ reportIdentityCollision(entry, held, identity, issues);
306
+ }
307
+ return namespace;
308
+ }
309
+ function commentAnchorNamespace(namespace, overrides) {
310
+ const declared = overrides?.add?.nodes ?? [];
311
+ if (declared.length === 0)
312
+ return namespace;
313
+ const widened = new Map(namespace);
314
+ for (const manual of declared) {
315
+ if (manual === null || typeof manual !== 'object')
316
+ continue;
317
+ const id = manualNodeId(manual);
318
+ if (widened.has(id))
319
+ continue;
320
+ widened.set(id, {
321
+ type: manual.type,
322
+ label: manual.label,
323
+ subdomain: manual.subdomain,
324
+ owner: BLUEPRINT_OVERRIDES_FILENAME
325
+ });
326
+ }
327
+ return widened;
328
+ }
329
+ function checkTarget(id, located, namespace, issues) {
330
+ if (!located.incoming)
331
+ return;
332
+ if (!isFilledString(id) || namespace.has(id))
333
+ return;
334
+ issues.push({
335
+ code: 'UNRESOLVED_TARGET',
336
+ path: located.path,
337
+ message: `${located.path} targets unknown node id ${JSON.stringify(id)}`
338
+ });
339
+ }
340
+ function edgeKeyOf(edge) {
341
+ return `${edge.from}|${edge.kind}|${edge.to}`;
342
+ }
343
+ function buildScopeContext(namespace, edges, graph) {
344
+ const nodes = [];
345
+ for (const [id, entry] of namespace) {
346
+ nodes.push({ id, type: entry.type, label: entry.label, subdomain: entry.subdomain });
347
+ }
348
+ const realityKeys = new Set((graph?.edges ?? []).map(edgeKeyOf));
349
+ const folded = (graph?.edges ?? [])
350
+ .map(edge => ({ from: edge.from, to: edge.to, kind: edge.kind }));
351
+ const keys = new Set(realityKeys);
352
+ for (const { entry } of edges) {
353
+ if (!EDGE_KINDS.includes(entry.kind))
354
+ continue;
355
+ if (!namespace.has(entry.from) || !namespace.has(entry.to))
356
+ continue;
357
+ const key = edgeKeyOf(entry);
358
+ if (keys.has(key))
359
+ continue;
360
+ keys.add(key);
361
+ folded.push({ from: entry.from, to: entry.to, kind: entry.kind });
362
+ }
363
+ return { index: buildHandlerScopeIndex(nodes, folded), realityKeys };
364
+ }
365
+ function handlerRejectionReason(issue, sourceType) {
366
+ if (issue === 'unresolved')
367
+ return 'does not exist';
368
+ if (issue === 'unconnected')
369
+ return 'is not one of its handlers';
370
+ return sourceType !== undefined
371
+ ? `is not the message type a ${sourceType} discriminates on`
372
+ : 'is not a message type anything discriminates on';
373
+ }
374
+ function checkProposedEdgeScope(located, scope, namespace, issues) {
375
+ const { entry: edge, path } = located;
376
+ if (!located.incoming)
377
+ return;
378
+ const declared = edge.handlers;
379
+ if (declared === undefined || declared.length === 0)
380
+ return;
381
+ if (scope.realityKeys.has(edgeKeyOf(edge))) {
382
+ issues.push({
383
+ code: 'INVALID_EDGE_HANDLER',
384
+ path,
385
+ message: `${path} scopes ${edge.from} -[${edge.kind}]-> ${edge.to}, a coupling that `
386
+ + 'already exists, so the design merge would discard the whole entry and the scope with '
387
+ + `it. The design layer cannot re-scope a coupling reality already draws — correct it in ${BLUEPRINT_OVERRIDES_FILENAME} or in the code the extractor reads`
388
+ });
389
+ return;
390
+ }
391
+ const sourceType = namespace.get(edge.from)?.type;
392
+ const { rejected } = resolveHandlerScope(edge.from, declared, scope.index);
393
+ for (const { handlerId, issue } of rejected) {
394
+ issues.push({
395
+ code: 'INVALID_EDGE_HANDLER',
396
+ path,
397
+ message: `${path} scopes ${edge.from} -[${edge.kind}]-> ${edge.to} to `
398
+ + `${JSON.stringify(handlerId)}, which ${handlerRejectionReason(issue, sourceType)}`
399
+ });
400
+ }
401
+ }
402
+ function checkProposedEdge(located, namespace, removedIds, scope, issues) {
403
+ const { entry: edge, path } = located;
404
+ checkAttribution(edge, path, issues);
405
+ if (edge.handlers !== undefined
406
+ && (!Array.isArray(edge.handlers) || !edge.handlers.every(isFilledString))) {
407
+ issues.push({
408
+ code: 'MALFORMED_ENTRY',
409
+ path,
410
+ message: `${path}.handlers must be an array of node ids`
411
+ });
412
+ return;
413
+ }
414
+ if (edge.kindSource !== undefined && !EDGE_KIND_SOURCES.includes(edge.kindSource)) {
415
+ issues.push({
416
+ code: 'MALFORMED_ENTRY',
417
+ path,
418
+ message: `${path}.kindSource ${JSON.stringify(edge.kindSource)} must be `
419
+ + `${EDGE_KIND_SOURCES.map(source => JSON.stringify(source)).join(' or ')}`
420
+ });
421
+ return;
422
+ }
423
+ if (!EDGE_KINDS.includes(edge.kind)) {
424
+ issues.push({
425
+ code: 'UNKNOWN_EDGE_KIND',
426
+ path,
427
+ message: `${path}.kind ${JSON.stringify(edge.kind)} is not an BLUEPRINT edge kind`
428
+ });
429
+ return;
430
+ }
431
+ const fromType = isFilledString(edge.from) ? namespace.get(edge.from)?.type : undefined;
432
+ const toType = isFilledString(edge.to) ? namespace.get(edge.to)?.type : undefined;
433
+ if (fromType === undefined || toType === undefined) {
434
+ if (located.incoming) {
435
+ const missing = fromType === undefined ? edge.from : edge.to;
436
+ issues.push({
437
+ code: 'UNRESOLVED_EDGE_ENDPOINT',
438
+ path,
439
+ message: `${path} references unknown node id ${JSON.stringify(missing)}`
440
+ });
441
+ }
442
+ return;
443
+ }
444
+ const removed = removedIds.has(edge.from)
445
+ ? edge.from
446
+ : removedIds.has(edge.to)
447
+ ? edge.to
448
+ : (edge.handlers ?? []).find(handlerId => removedIds.has(handlerId));
449
+ if (removed !== undefined) {
450
+ issues.push({
451
+ code: 'EDGE_TARGETS_REMOVED',
452
+ path,
453
+ message: `${path} proposes an edge on ${JSON.stringify(removed)}, which this design removes`
454
+ });
455
+ return;
456
+ }
457
+ if (!isAllowedEdge(fromType, edge.kind, toType)) {
458
+ issues.push({
459
+ code: 'TOPOLOGY_VIOLATION',
460
+ path,
461
+ message: `${path}: ${fromType} -[${edge.kind}]-> ${toType} is not a legal BLUEPRINT triple`
462
+ });
463
+ return;
464
+ }
465
+ if (scope !== undefined)
466
+ checkProposedEdgeScope(located, scope, namespace, issues);
467
+ }
468
+ export function validateDesign(design, context = {}) {
469
+ const issues = [];
470
+ if (design.schemaVersion !== 1) {
471
+ issues.push({
472
+ code: 'UNSUPPORTED_SCHEMA_VERSION',
473
+ path: 'schemaVersion',
474
+ message: `design.json has schemaVersion ${JSON.stringify(design.schemaVersion)}; expected 1`
475
+ });
476
+ return splitByClass(issues);
477
+ }
478
+ const incoming = context.incoming ?? {};
479
+ const nodes = locate(design.propose?.nodes ?? [], incoming.propose?.nodes ?? [], 'propose.nodes');
480
+ const edges = locate(design.propose?.edges ?? [], incoming.propose?.edges ?? [], 'propose.edges');
481
+ const modifies = locate(design.modify ?? [], incoming.modify ?? [], 'modify');
482
+ const removes = locate(design.remove ?? [], incoming.remove ?? [], 'remove');
483
+ const comments = locate(design.comments ?? [], incoming.comments ?? [], 'comments');
484
+ for (const { entry, path } of nodes)
485
+ checkProposedNode(entry, path, issues);
486
+ for (const { entry, path } of modifies)
487
+ checkModifyEntry(entry, path, issues);
488
+ for (const { entry, path } of removes)
489
+ checkRemoveEntry(entry, path, issues);
490
+ for (const { entry, path } of comments)
491
+ checkComment(entry, path, issues);
492
+ const commentIds = new Set();
493
+ for (const { entry, path } of comments) {
494
+ if (!isFilledString(entry.id))
495
+ continue;
496
+ if (commentIds.has(entry.id)) {
497
+ issues.push({
498
+ code: 'DUPLICATE_COMMENT_ID',
499
+ path,
500
+ message: `${path} reuses comment id ${JSON.stringify(entry.id)}; a resolve `
501
+ + 'names a comment by id, so ids must be unique in the document'
502
+ });
503
+ continue;
504
+ }
505
+ commentIds.add(entry.id);
506
+ }
507
+ const namespace = buildNamespace(nodes, modifies, context.graph, issues);
508
+ for (const located of modifies) {
509
+ checkTarget(located.entry.id, located, namespace, issues);
510
+ }
511
+ for (const located of removes) {
512
+ const { entry } = located;
513
+ if (entry.kind === 'node') {
514
+ checkTarget(entry.id, located, namespace, issues);
515
+ continue;
516
+ }
517
+ if (entry.kind !== 'edge')
518
+ continue;
519
+ checkTarget(entry.from, located, namespace, issues);
520
+ checkTarget(entry.to, located, namespace, issues);
521
+ }
522
+ const removedIds = new Set(removes
523
+ .filter((located) => located.entry.kind === 'node')
524
+ .map(located => located.entry.id));
525
+ const scope = edges.some(located => located.entry.handlers !== undefined)
526
+ ? buildScopeContext(namespace, edges, context.graph)
527
+ : undefined;
528
+ for (const located of edges) {
529
+ checkProposedEdge(located, namespace, removedIds, scope, issues);
530
+ }
531
+ const anchorable = commentAnchorNamespace(namespace, context.overrides);
532
+ const commentsById = new Map(comments.map(located => [located.entry.id, located.entry]));
533
+ for (const located of comments) {
534
+ const { anchor } = located.entry;
535
+ if (anchor === null || anchor === undefined)
536
+ continue;
537
+ if (typeof anchor === 'string') {
538
+ if (context.mapIds?.has(anchor) === true)
539
+ continue;
540
+ checkTarget(anchor, located, anchorable, issues);
541
+ continue;
542
+ }
543
+ if (isCommentIdAnchor(anchor)) {
544
+ if (!located.incoming)
545
+ continue;
546
+ const target = commentsById.get(anchor.commentId);
547
+ if (target === undefined) {
548
+ issues.push({
549
+ code: 'UNRESOLVED_TARGET',
550
+ path: located.path,
551
+ message: `${located.path} replies to unknown comment id ${JSON.stringify(anchor.commentId)}`
552
+ });
553
+ continue;
554
+ }
555
+ if (isCommentIdAnchor(target.anchor)) {
556
+ issues.push({
557
+ code: 'UNRESOLVED_TARGET',
558
+ path: located.path,
559
+ message: `${located.path} replies to comment ${JSON.stringify(anchor.commentId)}, `
560
+ + 'which is itself a reply — replies may not nest'
561
+ });
562
+ }
563
+ continue;
564
+ }
565
+ if (!isEdgeRefAnchor(anchor))
566
+ continue;
567
+ checkTarget(anchor.from, located, anchorable, issues);
568
+ checkTarget(anchor.to, located, anchorable, issues);
569
+ }
570
+ return splitByClass(issues);
571
+ }
572
+ //# sourceMappingURL=validate-design.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-design.js","sourceRoot":"","sources":["../../src/validate-design.ts"],"names":[],"mappings":"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"}