@blockml/framework 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/blocks/org/blockml/bml/framework/FrameworkType.bml +44 -0
  2. package/blocks/org/blockml/bml/framework/Library.bml +127 -0
  3. package/blocks/org/blockml/bml/framework/README.bml +71 -0
  4. package/blocks/org/blockml/bml/framework/capability/BootstrapTypeRegistry.bml +53 -0
  5. package/blocks/org/blockml/bml/framework/capability/CollectBaseTypeChain.bml +50 -0
  6. package/blocks/org/blockml/bml/framework/capability/DefaultBootstrapPaths.bml +47 -0
  7. package/blocks/org/blockml/bml/framework/capability/ForkBom.bml +51 -0
  8. package/blocks/org/blockml/bml/framework/capability/GetExportedFqns.bml +37 -0
  9. package/blocks/org/blockml/bml/framework/capability/GetPropertyNumericValue.bml +47 -0
  10. package/blocks/org/blockml/bml/framework/capability/IsLiteralValue.bml +47 -0
  11. package/blocks/org/blockml/bml/framework/capability/MemberIdentityKey.bml +47 -0
  12. package/blocks/org/blockml/bml/framework/capability/ParseExpression.bml +51 -0
  13. package/blocks/org/blockml/bml/framework/capability/ResolveContracts.bml +55 -0
  14. package/blocks/org/blockml/bml/framework/capability/ResolveEffectiveMembers.bml +56 -0
  15. package/blocks/org/blockml/bml/framework/capability/RootFqnByFilePath.bml +33 -0
  16. package/blocks/org/blockml/bml/framework/capability/RootFqns.bml +30 -0
  17. package/blocks/org/blockml/bml/framework/capability/TypeRegistry.bml +43 -0
  18. package/blocks/org/blockml/bml/framework/capability/ValidateConstraints.bml +54 -0
  19. package/blocks/org/blockml/bml/framework/capability/ValidateEmbeddedBlocks.bml +31 -0
  20. package/blocks/org/blockml/bml/framework/capability/ValidateInstances.bml +34 -0
  21. package/blocks/org/blockml/bml/framework/capability/ValidatePresets.bml +34 -0
  22. package/blocks/org/blockml/bml/framework/capability/ValidateReadOnly.bml +34 -0
  23. package/blocks/org/blockml/bml/framework/capability/ValidateTypes.bml +55 -0
  24. package/blocks/org/blockml/bml/framework/capability/ValidateVersions.bml +54 -0
  25. package/blocks/org/blockml/bml/framework/capability/ValidateVisibility.bml +34 -0
  26. package/blocks/org/blockml/bml/framework/config/FrameworkDiagnosticCodes.bml +44 -0
  27. package/blocks/org/blockml/bml/framework/documentation/ArchitectureOverview.bml +60 -0
  28. package/blocks/org/blockml/bml/framework/documentation/ConstraintValidation.bml +59 -0
  29. package/blocks/org/blockml/bml/framework/documentation/Diagnostics.bml +68 -0
  30. package/blocks/org/blockml/bml/framework/documentation/EffectiveMembers.bml +61 -0
  31. package/blocks/org/blockml/bml/framework/documentation/ExpressionParsing.bml +53 -0
  32. package/blocks/org/blockml/bml/framework/documentation/Introduction.bml +56 -0
  33. package/blocks/org/blockml/bml/framework/documentation/LayerSeparation.bml +59 -0
  34. package/blocks/org/blockml/bml/framework/documentation/PackageOwnership.bml +56 -0
  35. package/blocks/org/blockml/bml/framework/documentation/PublicApi.bml +72 -0
  36. package/blocks/org/blockml/bml/framework/documentation/ScopeExclusions.bml +52 -0
  37. package/blocks/org/blockml/bml/framework/documentation/TypeRegistryBootstrap.bml +64 -0
  38. package/blocks/org/blockml/bml/framework/expression/ArrayExpressionNode.bml +48 -0
  39. package/blocks/org/blockml/bml/framework/expression/BinaryExpressionNode.bml +54 -0
  40. package/blocks/org/blockml/bml/framework/expression/CallExpressionNode.bml +51 -0
  41. package/blocks/org/blockml/bml/framework/expression/ExpressionNode.bml +44 -0
  42. package/blocks/org/blockml/bml/framework/expression/LiteralExpressionNode.bml +48 -0
  43. package/blocks/org/blockml/bml/framework/expression/ObjectExpressionNode.bml +48 -0
  44. package/blocks/org/blockml/bml/framework/expression/ParseExpressionError.bml +47 -0
  45. package/blocks/org/blockml/bml/framework/expression/ParseExpressionOutcome.bml +50 -0
  46. package/blocks/org/blockml/bml/framework/expression/ParseExpressionResult.bml +47 -0
  47. package/blocks/org/blockml/bml/framework/expression/PropertyExpressionNode.bml +48 -0
  48. package/blocks/org/blockml/bml/framework/registry/BootstrapOptions.bml +50 -0
  49. package/blocks/org/blockml/bml/framework/registry/BootstrapResult.bml +53 -0
  50. package/dist/expression/parse-expression.d.ts +3 -0
  51. package/dist/expression/parse-expression.d.ts.map +1 -0
  52. package/dist/expression/parse-expression.js +192 -0
  53. package/dist/expression/parse-expression.js.map +1 -0
  54. package/dist/expression/types.d.ts +44 -0
  55. package/dist/expression/types.d.ts.map +1 -0
  56. package/dist/expression/types.js +2 -0
  57. package/dist/expression/types.js.map +1 -0
  58. package/dist/fork/fork-bom.d.ts +4 -0
  59. package/dist/fork/fork-bom.d.ts.map +1 -0
  60. package/dist/fork/fork-bom.js +5 -0
  61. package/dist/fork/fork-bom.js.map +1 -0
  62. package/dist/index.d.ts +17 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +16 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/registry/bootstrap.d.ts +19 -0
  67. package/dist/registry/bootstrap.d.ts.map +1 -0
  68. package/dist/registry/bootstrap.js +49 -0
  69. package/dist/registry/bootstrap.js.map +1 -0
  70. package/dist/registry/library-bootstrap.d.ts +14 -0
  71. package/dist/registry/library-bootstrap.d.ts.map +1 -0
  72. package/dist/registry/library-bootstrap.js +231 -0
  73. package/dist/registry/library-bootstrap.js.map +1 -0
  74. package/dist/registry/library-exports.d.ts +4 -0
  75. package/dist/registry/library-exports.d.ts.map +1 -0
  76. package/dist/registry/library-exports.js +10 -0
  77. package/dist/registry/library-exports.js.map +1 -0
  78. package/dist/registry/root-fqn.d.ts +5 -0
  79. package/dist/registry/root-fqn.d.ts.map +1 -0
  80. package/dist/registry/root-fqn.js +26 -0
  81. package/dist/registry/root-fqn.js.map +1 -0
  82. package/dist/registry/type-registry.d.ts +11 -0
  83. package/dist/registry/type-registry.d.ts.map +1 -0
  84. package/dist/registry/type-registry.js +27 -0
  85. package/dist/registry/type-registry.js.map +1 -0
  86. package/dist/resolve/resolve-effective-members.d.ts +16 -0
  87. package/dist/resolve/resolve-effective-members.d.ts.map +1 -0
  88. package/dist/resolve/resolve-effective-members.js +104 -0
  89. package/dist/resolve/resolve-effective-members.js.map +1 -0
  90. package/dist/validate/validate-constraints.d.ts +4 -0
  91. package/dist/validate/validate-constraints.d.ts.map +1 -0
  92. package/dist/validate/validate-constraints.js +388 -0
  93. package/dist/validate/validate-constraints.js.map +1 -0
  94. package/dist/validate/validate-embedded-blocks.d.ts +3 -0
  95. package/dist/validate/validate-embedded-blocks.d.ts.map +1 -0
  96. package/dist/validate/validate-embedded-blocks.js +44 -0
  97. package/dist/validate/validate-embedded-blocks.js.map +1 -0
  98. package/dist/validate/validate-instances.d.ts +4 -0
  99. package/dist/validate/validate-instances.d.ts.map +1 -0
  100. package/dist/validate/validate-instances.js +107 -0
  101. package/dist/validate/validate-instances.js.map +1 -0
  102. package/dist/validate/validate-presets.d.ts +4 -0
  103. package/dist/validate/validate-presets.d.ts.map +1 -0
  104. package/dist/validate/validate-presets.js +86 -0
  105. package/dist/validate/validate-presets.js.map +1 -0
  106. package/dist/validate/validate-readonly.d.ts +4 -0
  107. package/dist/validate/validate-readonly.d.ts.map +1 -0
  108. package/dist/validate/validate-readonly.js +64 -0
  109. package/dist/validate/validate-readonly.js.map +1 -0
  110. package/dist/validate/validate-types.d.ts +7 -0
  111. package/dist/validate/validate-types.d.ts.map +1 -0
  112. package/dist/validate/validate-types.js +130 -0
  113. package/dist/validate/validate-types.js.map +1 -0
  114. package/dist/validate/validate-versions.d.ts +4 -0
  115. package/dist/validate/validate-versions.d.ts.map +1 -0
  116. package/dist/validate/validate-versions.js +69 -0
  117. package/dist/validate/validate-versions.js.map +1 -0
  118. package/dist/validate/validate-visibility.d.ts +4 -0
  119. package/dist/validate/validate-visibility.d.ts.map +1 -0
  120. package/dist/validate/validate-visibility.js +33 -0
  121. package/dist/validate/validate-visibility.js.map +1 -0
  122. package/package.json +42 -0
@@ -0,0 +1,388 @@
1
+ import { findLocalMember, propertyForConstraintCheck, resolveEffectiveMembers, } from "../resolve/resolve-effective-members.js";
2
+ import { getPropertyNumericValue, isLiteralValue, } from "./validate-types.js";
3
+ function diag(code, message, file, line = 1, column = 1, severity = "error") {
4
+ return { severity, code, message, source: { file, line, column } };
5
+ }
6
+ function constraintBranch(typeFqn) {
7
+ if (typeFqn.includes(".constraint.MinItems") ||
8
+ typeFqn.includes(".constraint.MaxItems") ||
9
+ typeFqn.includes(".constraint.AllowedChildType")) {
10
+ return "AggregationConstraint";
11
+ }
12
+ if (typeFqn.includes(".constraint.Min") ||
13
+ typeFqn.includes(".constraint.Max") ||
14
+ typeFqn.includes(".constraint.MinLength") ||
15
+ typeFqn.includes(".constraint.MaxLength") ||
16
+ typeFqn.includes(".constraint.Pattern") ||
17
+ typeFqn.includes(".constraint.ValuePresent")) {
18
+ return "ValueConstraint";
19
+ }
20
+ if (typeFqn.includes(".constraint.RequiresMember")) {
21
+ return "BlockConstraint";
22
+ }
23
+ if (typeFqn.includes(".constraint.MustBeReadOnly")) {
24
+ return "PropertyConstraint";
25
+ }
26
+ if (typeFqn.includes(".constraint.AllowedChildType")) {
27
+ return "AggregationConstraint";
28
+ }
29
+ if (typeFqn.includes(".constraint.NoSelfReference")) {
30
+ return "AssociationConstraint";
31
+ }
32
+ if (typeFqn.includes(".constraint.RequiresImplementation")) {
33
+ return "CapabilityConstraint";
34
+ }
35
+ if (typeFqn.endsWith(".constraint.Constraint") || typeFqn.includes(".constraint.")) {
36
+ if (typeFqn.includes("ValueConstraint")) {
37
+ return "ValueConstraint";
38
+ }
39
+ if (typeFqn.includes("BlockConstraint")) {
40
+ return "BlockConstraint";
41
+ }
42
+ if (typeFqn.includes("MemberConstraint")) {
43
+ return "PropertyConstraint";
44
+ }
45
+ }
46
+ return "Unknown";
47
+ }
48
+ function allowedBranchForContext(context) {
49
+ switch (context) {
50
+ case "block":
51
+ return new Set(["BlockConstraint"]);
52
+ case "property":
53
+ return new Set(["ValueConstraint", "PropertyConstraint"]);
54
+ case "aggregation":
55
+ return new Set(["AggregationConstraint"]);
56
+ case "association":
57
+ return new Set(["AssociationConstraint"]);
58
+ case "capability":
59
+ return new Set(["CapabilityConstraint"]);
60
+ }
61
+ }
62
+ function hasValidation(instance) {
63
+ const v = instance.memberValues["validation"];
64
+ return v !== undefined;
65
+ }
66
+ function validationSeverity(instance) {
67
+ const v = instance.memberValues["validation"];
68
+ if (!v || v.kind !== "literal") {
69
+ return null;
70
+ }
71
+ const val = String(v.value);
72
+ if (val.includes("Error") || val.includes("error")) {
73
+ return "error";
74
+ }
75
+ if (val.includes("Warning") || val.includes("warning")) {
76
+ return "warning";
77
+ }
78
+ if (val.includes("Information") || val.includes("information")) {
79
+ return "info";
80
+ }
81
+ return null;
82
+ }
83
+ function validationIsEnforced(instance) {
84
+ return validationSeverity(instance) !== null;
85
+ }
86
+ function constraintViolationCode(severity) {
87
+ if (severity === "warning") {
88
+ return "BML_CONSTRAINT_WARNING";
89
+ }
90
+ if (severity === "info") {
91
+ return "BML_CONSTRAINT_INFORMATION";
92
+ }
93
+ return "BML_CONSTRAINT_VIOLATION";
94
+ }
95
+ function pushConstraintViolation(instance, message, file, diagnostics, source) {
96
+ const severity = validationSeverity(instance);
97
+ if (!severity) {
98
+ return;
99
+ }
100
+ diagnostics.push(diag(constraintViolationCode(severity), message, file, source?.line ?? instance.source?.line, source?.column ?? instance.source?.column, severity));
101
+ }
102
+ function getPropertyStringValue(prop) {
103
+ const fromLiteral = (val) => {
104
+ if (val?.kind === "literal" && typeof val.value === "string") {
105
+ return val.value;
106
+ }
107
+ return undefined;
108
+ };
109
+ const direct = fromLiteral(prop.value);
110
+ if (direct !== undefined) {
111
+ return direct;
112
+ }
113
+ for (const entry of prop.values ?? []) {
114
+ const s = fromLiteral(entry.value);
115
+ if (s !== undefined) {
116
+ return s;
117
+ }
118
+ }
119
+ return undefined;
120
+ }
121
+ function constraintTypeArg(instance) {
122
+ const typeVal = instance.memberValues["type"];
123
+ if (typeVal?.kind === "literal") {
124
+ return String(typeVal.value);
125
+ }
126
+ return undefined;
127
+ }
128
+ function evaluateBlockConstraint(instance, block, registry, file, diagnostics) {
129
+ if (!validationIsEnforced(instance)) {
130
+ return;
131
+ }
132
+ if (instance.typeFqn.includes(".RequiresMember")) {
133
+ const nameVal = instance.memberValues["name"];
134
+ const memberName = nameVal && isLiteralValue(nameVal) ? String(nameVal.value) : undefined;
135
+ if (!memberName) {
136
+ return;
137
+ }
138
+ const effective = resolveEffectiveMembers(block, registry);
139
+ const found = effective.some((m) => m.name === memberName);
140
+ if (!found) {
141
+ pushConstraintViolation(instance, `RequiresMember: missing member ${memberName}`, file, diagnostics);
142
+ }
143
+ }
144
+ }
145
+ function hasAuthoredPropertyValue(prop) {
146
+ if (prop.value !== undefined) {
147
+ if (prop.value.kind === "literal") {
148
+ const v = prop.value.value;
149
+ return v !== null && v !== "";
150
+ }
151
+ return true;
152
+ }
153
+ for (const entry of prop.values ?? []) {
154
+ if (entry.value !== undefined) {
155
+ return true;
156
+ }
157
+ }
158
+ return false;
159
+ }
160
+ function evaluateValueConstraint(instance, prop, file, diagnostics) {
161
+ if (!validationIsEnforced(instance)) {
162
+ return;
163
+ }
164
+ const typeFqn = instance.typeFqn;
165
+ const limitVal = instance.memberValues["value"];
166
+ const limit = limitVal && isLiteralValue(limitVal) && typeof limitVal.value === "number"
167
+ ? limitVal.value
168
+ : Number(limitVal && isLiteralValue(limitVal) ? limitVal.value : NaN);
169
+ if (typeFqn.includes(".Min") && !typeFqn.includes("MinItems") && !typeFqn.includes("MinLength")) {
170
+ const actual = prop ? getPropertyNumericValue(prop) : undefined;
171
+ if (actual !== undefined && !Number.isNaN(limit) && actual < limit) {
172
+ pushConstraintViolation(instance, `Value ${actual} is less than minimum ${limit}`, file, diagnostics, prop?.source);
173
+ }
174
+ }
175
+ if (typeFqn.includes(".Max") && !typeFqn.includes("MaxItems") && !typeFqn.includes("MaxLength")) {
176
+ const actual = prop ? getPropertyNumericValue(prop) : undefined;
177
+ if (actual !== undefined && !Number.isNaN(limit) && actual > limit) {
178
+ pushConstraintViolation(instance, `Value ${actual} is greater than maximum ${limit}`, file, diagnostics, prop?.source);
179
+ }
180
+ }
181
+ if (typeFqn.includes(".MinLength")) {
182
+ const actual = prop ? getPropertyStringValue(prop) : undefined;
183
+ if (actual !== undefined && !Number.isNaN(limit) && actual.length < limit) {
184
+ pushConstraintViolation(instance, `String length ${actual.length} is less than minimum ${limit}`, file, diagnostics, prop?.source);
185
+ }
186
+ }
187
+ if (typeFqn.includes(".MaxLength")) {
188
+ const actual = prop ? getPropertyStringValue(prop) : undefined;
189
+ if (actual !== undefined && !Number.isNaN(limit) && actual.length > limit) {
190
+ pushConstraintViolation(instance, `String length ${actual.length} is greater than maximum ${limit}`, file, diagnostics, prop?.source);
191
+ }
192
+ }
193
+ if (typeFqn.includes(".Pattern")) {
194
+ const patternVal = instance.memberValues["pattern"] ?? instance.memberValues["value"];
195
+ const pattern = patternVal && isLiteralValue(patternVal) ? String(patternVal.value) : undefined;
196
+ const actual = prop ? getPropertyStringValue(prop) : undefined;
197
+ if (pattern && actual !== undefined) {
198
+ try {
199
+ if (!new RegExp(pattern).test(actual)) {
200
+ pushConstraintViolation(instance, `Value does not match pattern ${pattern}`, file, diagnostics, prop?.source);
201
+ }
202
+ }
203
+ catch {
204
+ // invalid pattern — skip runtime evaluation
205
+ }
206
+ }
207
+ }
208
+ if (typeFqn.includes(".ValuePresent")) {
209
+ if (prop && !hasAuthoredPropertyValue(prop)) {
210
+ pushConstraintViolation(instance, `ValuePresent constraint violated on ${prop.name}`, file, diagnostics, prop?.source);
211
+ }
212
+ }
213
+ }
214
+ function evaluatePropertyConstraint(instance, prop, file, diagnostics) {
215
+ if (!validationIsEnforced(instance) || !prop) {
216
+ return;
217
+ }
218
+ if (instance.typeFqn.includes(".MustBeReadOnly") && !prop.readOnly) {
219
+ pushConstraintViolation(instance, `Property ${prop.name} must be readOnly`, file, diagnostics, prop.source);
220
+ }
221
+ }
222
+ function evaluateAggregationConstraint(instance, member, file, diagnostics) {
223
+ if (!validationIsEnforced(instance) || member.kind !== "aggregation") {
224
+ return;
225
+ }
226
+ const children = member.composition?.children.filter((c) => c.kind === "blockInstance") ?? [];
227
+ const count = children.length;
228
+ if (instance.typeFqn.includes(".MinItems")) {
229
+ const minVal = instance.memberValues["value"];
230
+ const min = minVal && isLiteralValue(minVal) && typeof minVal.value === "number"
231
+ ? minVal.value
232
+ : Number(minVal && isLiteralValue(minVal) ? minVal.value : NaN);
233
+ if (!Number.isNaN(min) && count < min) {
234
+ pushConstraintViolation(instance, `Aggregation ${member.name} has ${count} children, minimum is ${min}`, file, diagnostics, member.source);
235
+ }
236
+ }
237
+ if (instance.typeFqn.includes(".MaxItems")) {
238
+ const maxVal = instance.memberValues["value"];
239
+ const max = maxVal && isLiteralValue(maxVal) && typeof maxVal.value === "number"
240
+ ? maxVal.value
241
+ : Number(maxVal && isLiteralValue(maxVal) ? maxVal.value : NaN);
242
+ if (!Number.isNaN(max) && count > max) {
243
+ pushConstraintViolation(instance, `Aggregation ${member.name} has ${count} children, maximum is ${max}`, file, diagnostics, member.source);
244
+ }
245
+ }
246
+ if (instance.typeFqn.includes(".AllowedChildType")) {
247
+ const allowed = constraintTypeArg(instance);
248
+ if (allowed) {
249
+ for (const child of children) {
250
+ if (child.kind !== "blockInstance") {
251
+ continue;
252
+ }
253
+ const childType = child.instance.typeFqn;
254
+ if (childType !== allowed && !childType.startsWith(`${allowed}.`)) {
255
+ pushConstraintViolation(instance, `Child type ${childType} is not allowed (expected ${allowed})`, file, diagnostics, child.instance.source);
256
+ }
257
+ }
258
+ }
259
+ }
260
+ }
261
+ function evaluateCapabilityConstraint(instance, member, file, diagnostics) {
262
+ if (!validationIsEnforced(instance) || member.kind !== "capability") {
263
+ return;
264
+ }
265
+ if (instance.typeFqn.includes(".RequiresImplementation")) {
266
+ const impl = member.implementation?.source?.trim();
267
+ if (!impl) {
268
+ pushConstraintViolation(instance, `Capability ${member.name} requires implementation`, file, diagnostics, member.source);
269
+ }
270
+ }
271
+ }
272
+ function validateConstraintInstances(instances, context, file, diagnostics, block, registry, prop, member) {
273
+ if (!instances?.length) {
274
+ return;
275
+ }
276
+ const allowed = allowedBranchForContext(context);
277
+ for (const inst of instances) {
278
+ const branch = constraintBranch(inst.typeFqn);
279
+ if (branch === "Unknown") {
280
+ diagnostics.push(diag("BML_CONSTRAINT_UNKNOWN", `Unknown constraint type: ${inst.typeFqn}`, file, inst.source?.line, inst.source?.column));
281
+ continue;
282
+ }
283
+ if (!allowed.has(branch)) {
284
+ diagnostics.push(diag("BML_CONSTRAINT_TARGET_MISMATCH", `${branch} not allowed on ${context}`, file, inst.source?.line, inst.source?.column));
285
+ continue;
286
+ }
287
+ if (branch === "ValueConstraint") {
288
+ evaluateValueConstraint(inst, prop, file, diagnostics);
289
+ }
290
+ if (branch === "PropertyConstraint") {
291
+ evaluatePropertyConstraint(inst, prop, file, diagnostics);
292
+ }
293
+ if (branch === "BlockConstraint" && block && registry) {
294
+ evaluateBlockConstraint(inst, block, registry, file, diagnostics);
295
+ }
296
+ if (branch === "AggregationConstraint" && member) {
297
+ evaluateAggregationConstraint(inst, member, file, diagnostics);
298
+ }
299
+ if (branch === "CapabilityConstraint" && member) {
300
+ evaluateCapabilityConstraint(inst, member, file, diagnostics);
301
+ }
302
+ }
303
+ }
304
+ function validateMemberConstraintPlacement(member, file, diagnostics) {
305
+ const context = member.kind === "property"
306
+ ? "property"
307
+ : member.kind === "aggregation"
308
+ ? "aggregation"
309
+ : member.kind === "association"
310
+ ? "association"
311
+ : "capability";
312
+ if (!member.constraints?.length) {
313
+ return;
314
+ }
315
+ const allowed = allowedBranchForContext(context);
316
+ for (const inst of member.constraints) {
317
+ const branch = constraintBranch(inst.typeFqn);
318
+ if (branch === "Unknown") {
319
+ diagnostics.push(diag("BML_CONSTRAINT_UNKNOWN", `Unknown constraint type: ${inst.typeFqn}`, file, inst.source?.line, inst.source?.column));
320
+ continue;
321
+ }
322
+ if (!allowed.has(branch)) {
323
+ diagnostics.push(diag("BML_CONSTRAINT_TARGET_MISMATCH", `${branch} not allowed on ${context}`, file, inst.source?.line, inst.source?.column));
324
+ }
325
+ }
326
+ }
327
+ function validateEffectiveMemberConstraints(block, registry, file, diagnostics) {
328
+ const effective = resolveEffectiveMembers(block, registry);
329
+ for (const member of effective) {
330
+ if (!member.constraints?.length) {
331
+ continue;
332
+ }
333
+ const local = findLocalMember(block, member);
334
+ if (member.kind === "property") {
335
+ const prop = propertyForConstraintCheck(member, local?.kind === "property" ? local : undefined);
336
+ for (const inst of member.constraints) {
337
+ const branch = constraintBranch(inst.typeFqn);
338
+ if (branch === "ValueConstraint") {
339
+ evaluateValueConstraint(inst, prop, file, diagnostics);
340
+ }
341
+ if (branch === "PropertyConstraint") {
342
+ evaluatePropertyConstraint(inst, prop, file, diagnostics);
343
+ }
344
+ }
345
+ }
346
+ if (member.kind === "aggregation") {
347
+ const agg = local?.kind === "aggregation" ? local : member;
348
+ for (const inst of member.constraints) {
349
+ evaluateAggregationConstraint(inst, agg, file, diagnostics);
350
+ }
351
+ }
352
+ if (member.kind === "capability") {
353
+ const cap = local?.kind === "capability" ? local : member;
354
+ for (const inst of member.constraints) {
355
+ evaluateCapabilityConstraint(inst, cap, file, diagnostics);
356
+ }
357
+ }
358
+ }
359
+ }
360
+ function validateMemberConstraints(member, file, diagnostics) {
361
+ validateMemberConstraintPlacement(member, file, diagnostics);
362
+ const context = member.kind === "property"
363
+ ? "property"
364
+ : member.kind === "aggregation"
365
+ ? "aggregation"
366
+ : member.kind === "association"
367
+ ? "association"
368
+ : "capability";
369
+ const prop = member.kind === "property" ? member : undefined;
370
+ validateConstraintInstances(member.constraints, context, file, diagnostics, undefined, undefined, prop, member);
371
+ }
372
+ function validateBlockConstraints(block, registry, file, diagnostics) {
373
+ validateConstraintInstances(block.constraints, "block", file, diagnostics, block, registry);
374
+ for (const member of block.members) {
375
+ validateMemberConstraints(member, file, diagnostics);
376
+ }
377
+ validateEffectiveMemberConstraints(block, registry, file, diagnostics);
378
+ for (const sub of block.subBlocks) {
379
+ validateBlockConstraints(sub, registry, file, diagnostics);
380
+ }
381
+ }
382
+ export function validateConstraints(document, registry) {
383
+ const diagnostics = [];
384
+ const file = document.source.filePath ?? "<memory>";
385
+ validateBlockConstraints(document.block, registry, file, diagnostics);
386
+ return diagnostics;
387
+ }
388
+ //# sourceMappingURL=validate-constraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-constraints.js","sourceRoot":"","sources":["../../src/validate/validate-constraints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BomDocument, Diagnostic } from "@blockml/bom";
2
+ export declare function validateEmbeddedBlocks(document: BomDocument): Diagnostic[];
3
+ //# sourceMappingURL=validate-embedded-blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-embedded-blocks.d.ts","sourceRoot":"","sources":["../../src/validate/validate-embedded-blocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA0F7E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,GAAG,UAAU,EAAE,CAS1E"}
@@ -0,0 +1,44 @@
1
+ function diag(code, message, file, line = 1, column = 1) {
2
+ return { severity: "error", code, message, source: { file, line, column } };
3
+ }
4
+ function expectedSubBlockType(parentType, subName) {
5
+ return `${parentType}.${subName}`;
6
+ }
7
+ function validateSubBlocks(block, file, diagnostics) {
8
+ for (const sub of block.subBlocks) {
9
+ if (sub.embeddedBlocks.length > 0) {
10
+ diagnostics.push(diag("BML_EMBEDDED_BLOCKS_ON_SUBBLOCK", `Sub-block ${sub.name} must not declare embeddedBlocks`, file, sub.source?.line, sub.source?.column));
11
+ }
12
+ const expected = expectedSubBlockType(block.type, sub.name);
13
+ if (sub.type && sub.type !== expected) {
14
+ diagnostics.push(diag("BML_SUBBLOCK_TYPE_MISMATCH", `Sub-block ${sub.name} type ${sub.type} does not match expected ${expected}`, file, sub.source?.line, sub.source?.column));
15
+ }
16
+ validateSubBlocks(sub, file, diagnostics);
17
+ }
18
+ }
19
+ function validateEmbeddedBlocksOnRoot(block, file, diagnostics) {
20
+ if (block.embeddedBlocks.length === 0) {
21
+ return;
22
+ }
23
+ const seen = new Set();
24
+ for (const embed of block.embeddedBlocks) {
25
+ if (embed.embeddedBlocks.length > 0) {
26
+ diagnostics.push(diag("BML_NESTED_EMBEDDED_BLOCKS", `Embedded block ${embed.type} must not declare nested embeddedBlocks`, file, embed.source?.line, embed.source?.column));
27
+ }
28
+ if (embed.type) {
29
+ if (seen.has(embed.type)) {
30
+ diagnostics.push(diag("BML_DUPLICATE_EMBEDDED_BLOCK", `Duplicate embedded block FQN: ${embed.type}`, file, embed.source?.line, embed.source?.column));
31
+ }
32
+ seen.add(embed.type);
33
+ }
34
+ }
35
+ }
36
+ export function validateEmbeddedBlocks(document) {
37
+ const diagnostics = [];
38
+ const file = document.source.filePath ?? "<memory>";
39
+ const root = document.block;
40
+ validateEmbeddedBlocksOnRoot(root, file, diagnostics);
41
+ validateSubBlocks(root, file, diagnostics);
42
+ return diagnostics;
43
+ }
44
+ //# sourceMappingURL=validate-embedded-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-embedded-blocks.js","sourceRoot":"","sources":["../../src/validate/validate-embedded-blocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { BomDocument, Diagnostic } from "@blockml/bom";
2
+ import type { TypeRegistry } from "../registry/type-registry.js";
3
+ export declare function validateInstances(document: BomDocument, _registry: TypeRegistry): Diagnostic[];
4
+ //# sourceMappingURL=validate-instances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-instances.d.ts","sourceRoot":"","sources":["../../src/validate/validate-instances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAGX,UAAU,EAEX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAqKjE,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,YAAY,GACtB,UAAU,EAAE,CAQd"}
@@ -0,0 +1,107 @@
1
+ function diag(code, message, file, line = 1, column = 1) {
2
+ return { severity: "error", code, message, source: { file, line, column } };
3
+ }
4
+ function literalString(val) {
5
+ if (!val || val.kind !== "literal") {
6
+ return undefined;
7
+ }
8
+ return typeof val.value === "string" ? val.value : String(val.value);
9
+ }
10
+ function instanceId(instance) {
11
+ return literalString(instance.id);
12
+ }
13
+ function collectIdsInComposition(nodes, ids, file) {
14
+ for (const node of nodes) {
15
+ if (node.kind === "blockInstance") {
16
+ const id = instanceId(node.instance);
17
+ if (id) {
18
+ const loc = { file };
19
+ if (node.instance.source?.line !== undefined) {
20
+ loc.line = node.instance.source.line;
21
+ }
22
+ if (node.instance.source?.column !== undefined) {
23
+ loc.column = node.instance.source.column;
24
+ }
25
+ ids.set(id, loc);
26
+ }
27
+ for (const agg of node.instance.aggregationCompositions ?? []) {
28
+ collectIdsInComposition(agg.composition.children, ids, file);
29
+ }
30
+ }
31
+ else {
32
+ collectIdsInComposition(node.children, ids, file);
33
+ }
34
+ }
35
+ }
36
+ function collectDocumentInstanceIds(block, file) {
37
+ const ids = new Map();
38
+ for (const template of block.compositions) {
39
+ collectIdsInComposition(template.children, ids, file);
40
+ }
41
+ for (const sub of block.subBlocks) {
42
+ const subIds = collectDocumentInstanceIds(sub, file);
43
+ for (const [id, loc] of subIds) {
44
+ ids.set(id, loc);
45
+ }
46
+ }
47
+ return ids;
48
+ }
49
+ function resolveInstanceRef(token, ids) {
50
+ if (token.includes("::")) {
51
+ const id = token.split("::").pop();
52
+ return id !== undefined && ids.has(id);
53
+ }
54
+ return ids.has(token);
55
+ }
56
+ function validateInstanceRefs(instance, ids, file, diagnostics) {
57
+ if (instance.basePresets && !resolveInstanceRef(instance.basePresets, ids)) {
58
+ diagnostics.push(diag("BML_UNRESOLVABLE_INSTANCE_REF", `Unresolved basePresets reference: ${instance.basePresets}`, file, instance.source?.line, instance.source?.column));
59
+ }
60
+ for (const val of Object.values(instance.memberValues)) {
61
+ if (val.kind !== "literal") {
62
+ continue;
63
+ }
64
+ const text = typeof val.value === "string" ? val.value : undefined;
65
+ if (text && text.includes("::") && !resolveInstanceRef(text, ids)) {
66
+ diagnostics.push(diag("BML_UNRESOLVABLE_INSTANCE_REF", `Unresolved instance reference: ${text}`, file, instance.source?.line, instance.source?.column));
67
+ }
68
+ }
69
+ for (const agg of instance.aggregationCompositions ?? []) {
70
+ for (const child of agg.composition.children) {
71
+ if (child.kind === "blockInstance") {
72
+ validateInstanceRefs(child.instance, ids, file, diagnostics);
73
+ }
74
+ }
75
+ }
76
+ }
77
+ function validateCompositionNodes(nodes, ids, file, diagnostics) {
78
+ for (const node of nodes) {
79
+ if (node.kind === "blockInstance") {
80
+ const hasEach = node.directives?.some((d) => d.type === "each");
81
+ if (hasEach && !instanceId(node.instance)) {
82
+ diagnostics.push(diag("BML_MISSING_ID", "bml:each requires explicit bml:id on the block instance", file, node.source?.line ?? node.instance.source?.line, node.source?.column ?? node.instance.source?.column));
83
+ }
84
+ validateInstanceRefs(node.instance, ids, file, diagnostics);
85
+ for (const agg of node.instance.aggregationCompositions ?? []) {
86
+ validateCompositionNodes(agg.composition.children, ids, file, diagnostics);
87
+ }
88
+ }
89
+ else {
90
+ const hasEach = node.directives?.some((d) => d.type === "each");
91
+ if (hasEach) {
92
+ diagnostics.push(diag("BML_MISSING_ID", "bml:each requires explicit bml:id on the container element", file, node.source?.line, node.source?.column));
93
+ }
94
+ validateCompositionNodes(node.children, ids, file, diagnostics);
95
+ }
96
+ }
97
+ }
98
+ export function validateInstances(document, _registry) {
99
+ const diagnostics = [];
100
+ const file = document.source.filePath ?? "<memory>";
101
+ const ids = collectDocumentInstanceIds(document.block, file);
102
+ for (const template of document.block.compositions) {
103
+ validateCompositionNodes(template.children, ids, file, diagnostics);
104
+ }
105
+ return diagnostics;
106
+ }
107
+ //# sourceMappingURL=validate-instances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-instances.js","sourceRoot":"","sources":["../../src/validate/validate-instances.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { BomDocument, Diagnostic } from "@blockml/bom";
2
+ import type { TypeRegistry } from "../registry/type-registry.js";
3
+ export declare function validatePresets(document: BomDocument, registry: TypeRegistry): Diagnostic[];
4
+ //# sourceMappingURL=validate-presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-presets.d.ts","sourceRoot":"","sources":["../../src/validate/validate-presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAEX,UAAU,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAuHjE,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAcd"}