@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,231 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { parse } from "@blockml/parser";
4
+ import { TypeRegistry } from "./type-registry.js";
5
+ function collectBmlFiles(dir, out = []) {
6
+ let entries;
7
+ try {
8
+ entries = readdirSync(dir);
9
+ }
10
+ catch {
11
+ return out;
12
+ }
13
+ for (const entry of entries) {
14
+ const full = join(dir, entry);
15
+ try {
16
+ const st = statSync(full);
17
+ if (st.isDirectory()) {
18
+ collectBmlFiles(full, out);
19
+ }
20
+ else if (entry.endsWith(".bml")) {
21
+ out.push(full);
22
+ }
23
+ }
24
+ catch {
25
+ continue;
26
+ }
27
+ }
28
+ return out;
29
+ }
30
+ function blocksRootFromLibraryPath(libraryPath) {
31
+ const normalized = libraryPath.replace(/\\/g, "/");
32
+ const marker = "/blocks/";
33
+ const idx = normalized.indexOf(marker);
34
+ if (idx >= 0) {
35
+ return normalized.slice(0, idx + "/blocks".length);
36
+ }
37
+ return dirname(dirname(libraryPath));
38
+ }
39
+ function aggregationInstances(block, name) {
40
+ const agg = block.members.find((m) => m.kind === "aggregation" && m.name === name);
41
+ if (!agg || agg.kind !== "aggregation" || !agg.composition) {
42
+ return [];
43
+ }
44
+ return agg.composition.children
45
+ .filter((child) => child.kind === "blockInstance")
46
+ .map((child) => child.instance);
47
+ }
48
+ function indexLibraryFiles(searchRoots) {
49
+ const index = new Map();
50
+ for (const root of searchRoots) {
51
+ for (const file of collectBmlFiles(root)) {
52
+ if (!file.endsWith("Library.bml")) {
53
+ continue;
54
+ }
55
+ try {
56
+ const source = readFileSync(file, "utf8");
57
+ const parsed = parse(source, { filePath: file, continueOnError: true });
58
+ const type = parsed.document?.block.type;
59
+ if (type) {
60
+ index.set(type, file);
61
+ }
62
+ }
63
+ catch {
64
+ continue;
65
+ }
66
+ }
67
+ }
68
+ return index;
69
+ }
70
+ function exportedBlockFqns(libraryBlock) {
71
+ const fqns = new Set();
72
+ for (const inst of aggregationInstances(libraryBlock, "blocks")) {
73
+ fqns.add(inst.typeFqn);
74
+ }
75
+ return fqns;
76
+ }
77
+ function resolveLibraryGraph(seedPaths, searchRoots, rootDir, diagnostics) {
78
+ const libraryIndex = indexLibraryFiles(searchRoots);
79
+ const ordered = [];
80
+ const visited = new Set();
81
+ const exportsByLibrary = new Map();
82
+ const visit = (libraryPath) => {
83
+ const abs = resolve(rootDir, libraryPath);
84
+ if (visited.has(abs)) {
85
+ return;
86
+ }
87
+ visited.add(abs);
88
+ if (!existsSync(abs)) {
89
+ diagnostics.push({
90
+ severity: "error",
91
+ code: "BML_LIBRARY_RESOLVE_ERROR",
92
+ message: `Library not found: ${abs}`,
93
+ source: { file: abs, line: 1, column: 1 },
94
+ });
95
+ return;
96
+ }
97
+ let source;
98
+ try {
99
+ source = readFileSync(abs, "utf8");
100
+ }
101
+ catch (e) {
102
+ diagnostics.push({
103
+ severity: "error",
104
+ code: "BML_LIBRARY_RESOLVE_ERROR",
105
+ message: e instanceof Error ? e.message : String(e),
106
+ source: { file: abs, line: 1, column: 1 },
107
+ });
108
+ return;
109
+ }
110
+ const parsed = parse(source, { filePath: abs, continueOnError: true });
111
+ for (const d of parsed.diagnostics) {
112
+ diagnostics.push(d);
113
+ }
114
+ if (!parsed.document?.block.type) {
115
+ diagnostics.push({
116
+ severity: "error",
117
+ code: "BML_LIBRARY_RESOLVE_ERROR",
118
+ message: `Invalid Library.bml (no root type): ${abs}`,
119
+ source: { file: abs, line: 1, column: 1 },
120
+ });
121
+ return;
122
+ }
123
+ const libType = parsed.document.block.type;
124
+ libraryIndex.set(libType, abs);
125
+ exportsByLibrary.set(abs, exportedBlockFqns(parsed.document.block));
126
+ for (const dep of [
127
+ ...aggregationInstances(parsed.document.block, "dependencies"),
128
+ ...aggregationInstances(parsed.document.block, "subLibraries"),
129
+ ]) {
130
+ const depPath = libraryIndex.get(dep.typeFqn);
131
+ if (!depPath) {
132
+ diagnostics.push({
133
+ severity: "error",
134
+ code: "BML_LIBRARY_RESOLVE_ERROR",
135
+ message: `Unresolved library dependency: ${dep.typeFqn}`,
136
+ source: { file: abs, line: dep.source?.line ?? 1, column: dep.source?.column ?? 1 },
137
+ });
138
+ continue;
139
+ }
140
+ visit(depPath);
141
+ }
142
+ ordered.push(abs);
143
+ };
144
+ for (const seed of seedPaths) {
145
+ visit(seed);
146
+ }
147
+ return { orderedPaths: ordered, exportsByLibrary };
148
+ }
149
+ function checkNestingViolations(exportsByLibrary, diagnostics) {
150
+ const paths = [...exportsByLibrary.keys()];
151
+ for (let i = 0; i < paths.length; i++) {
152
+ const outerPath = paths[i];
153
+ const outerExports = exportsByLibrary.get(outerPath);
154
+ for (let j = i + 1; j < paths.length; j++) {
155
+ const innerPath = paths[j];
156
+ const innerExports = exportsByLibrary.get(innerPath);
157
+ for (const fqn of outerExports) {
158
+ if (innerExports.has(fqn)) {
159
+ diagnostics.push({
160
+ severity: "error",
161
+ code: "BML_LIBRARY_NESTING_VIOLATION",
162
+ message: `Library ${outerPath} re-exports block ${fqn} also exported by nested library ${innerPath}`,
163
+ source: { file: outerPath, line: 1, column: 1 },
164
+ });
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ function registerFiles(registry, files, diagnostics) {
171
+ for (const filePath of files) {
172
+ let source;
173
+ try {
174
+ source = readFileSync(filePath, "utf8");
175
+ }
176
+ catch (e) {
177
+ diagnostics.push({
178
+ severity: "warning",
179
+ code: "BML_BOOTSTRAP_READ_ERROR",
180
+ message: e instanceof Error ? e.message : String(e),
181
+ source: { file: filePath, line: 1, column: 1 },
182
+ });
183
+ continue;
184
+ }
185
+ const result = parse(source, { filePath, continueOnError: true });
186
+ for (const d of result.diagnostics) {
187
+ diagnostics.push(d);
188
+ }
189
+ if (result.document?.block.type) {
190
+ registry.register(result.document);
191
+ }
192
+ }
193
+ }
194
+ export function bootstrapFromLibraryPaths(libraryPaths, searchRoots, rootDir) {
195
+ const registry = new TypeRegistry();
196
+ const diagnostics = [];
197
+ const { orderedPaths, exportsByLibrary } = resolveLibraryGraph(libraryPaths, searchRoots, rootDir, diagnostics);
198
+ checkNestingViolations(exportsByLibrary, diagnostics);
199
+ const seenFiles = new Set();
200
+ for (const libraryPath of orderedPaths) {
201
+ const blocksRoot = blocksRootFromLibraryPath(libraryPath);
202
+ for (const file of collectBmlFiles(blocksRoot)) {
203
+ seenFiles.add(file);
204
+ }
205
+ }
206
+ registerFiles(registry, [...seenFiles], diagnostics);
207
+ return { registry, diagnostics, exportsByLibrary };
208
+ }
209
+ export function bootstrapFromCorpusPaths(paths, rootDir) {
210
+ const registry = new TypeRegistry();
211
+ const diagnostics = [];
212
+ const files = new Set();
213
+ const resolvedPaths = paths.length > 0 ? paths : [];
214
+ for (const base of resolvedPaths) {
215
+ const resolved = resolve(rootDir, base);
216
+ for (const file of collectBmlFiles(resolved)) {
217
+ files.add(file);
218
+ }
219
+ }
220
+ registerFiles(registry, [...files], diagnostics);
221
+ return { registry, diagnostics };
222
+ }
223
+ export function findLibraryFileForType(typeFqn, searchRoots) {
224
+ return indexLibraryFiles(searchRoots).get(typeFqn);
225
+ }
226
+ export function parseLibraryDocument(libraryPath) {
227
+ const source = readFileSync(libraryPath, "utf8");
228
+ const parsed = parse(source, { filePath: libraryPath, continueOnError: true });
229
+ return parsed.document;
230
+ }
231
+ //# sourceMappingURL=library-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-bootstrap.js","sourceRoot":"","sources":["../../src/registry/library-bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { BootstrapResult } from "./bootstrap.js";
2
+ /** Exported block FQNs for a library path from a library-mode bootstrap. */
3
+ export declare function getExportedFqns(libraryPath: string, bootstrap: BootstrapResult, rootDir?: string): Set<string> | undefined;
4
+ //# sourceMappingURL=library-exports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-exports.d.ts","sourceRoot":"","sources":["../../src/registry/library-exports.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,4EAA4E;AAC5E,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,eAAe,EAC1B,OAAO,SAAgB,GACtB,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAMzB"}
@@ -0,0 +1,10 @@
1
+ import { resolve } from "node:path";
2
+ /** Exported block FQNs for a library path from a library-mode bootstrap. */
3
+ export function getExportedFqns(libraryPath, bootstrap, rootDir = process.cwd()) {
4
+ if (!bootstrap.exportsByLibrary) {
5
+ return undefined;
6
+ }
7
+ const abs = resolve(rootDir, libraryPath);
8
+ return bootstrap.exportsByLibrary.get(abs);
9
+ }
10
+ //# sourceMappingURL=library-exports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-exports.js","sourceRoot":"","sources":["../../src/registry/library-exports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,SAA0B,EAC1B,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;IAEvB,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1C,OAAO,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { TypeRegistry } from "./type-registry.js";
2
+ /** Root FQN per file: registry key not prefixed by another key from the same file. */
3
+ export declare function rootFqnByFilePath(registry: TypeRegistry): Map<string, string>;
4
+ export declare function rootFqns(registry: TypeRegistry): string[];
5
+ //# sourceMappingURL=root-fqn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-fqn.d.ts","sourceRoot":"","sources":["../../src/registry/root-fqn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA2B7E;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAEzD"}
@@ -0,0 +1,26 @@
1
+ /** Root FQN per file: registry key not prefixed by another key from the same file. */
2
+ export function rootFqnByFilePath(registry) {
3
+ const byFile = new Map();
4
+ for (const fqn of registry.keys()) {
5
+ const doc = registry.get(fqn);
6
+ const filePath = doc?.source?.filePath;
7
+ if (!filePath || filePath.startsWith("<")) {
8
+ continue;
9
+ }
10
+ const list = byFile.get(filePath) ?? [];
11
+ list.push(fqn);
12
+ byFile.set(filePath, list);
13
+ }
14
+ const roots = new Map();
15
+ for (const [filePath, fqns] of byFile) {
16
+ const root = fqns.find((candidate) => !fqns.some((other) => other !== candidate && candidate.startsWith(`${other}.`)));
17
+ if (root) {
18
+ roots.set(filePath, root);
19
+ }
20
+ }
21
+ return roots;
22
+ }
23
+ export function rootFqns(registry) {
24
+ return [...rootFqnByFilePath(registry).values()].sort();
25
+ }
26
+ //# sourceMappingURL=root-fqn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-fqn.js","sourceRoot":"","sources":["../../src/registry/root-fqn.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,UAAU,iBAAiB,CAAC,QAAsB;IACtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE3C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC;QACvC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CACpB,CAAC,SAAS,EAAE,EAAE,CACZ,CAAC,IAAI,CAAC,IAAI,CACR,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC,CACpE,CACJ,CAAC;QACF,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAsB;IAC7C,OAAO,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { BomDocument } from "@blockml/bom";
2
+ export declare class TypeRegistry {
3
+ private readonly byFqn;
4
+ register(document: BomDocument): void;
5
+ private registerBlock;
6
+ get(fqn: string): BomDocument | undefined;
7
+ has(fqn: string): boolean;
8
+ keys(): string[];
9
+ size(): number;
10
+ }
11
+ //# sourceMappingURL=type-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-registry.d.ts","sourceRoot":"","sources":["../../src/registry/type-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,cAAc,CAAC;AAEjE,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IAExD,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAIrC,OAAO,CAAC,aAAa;IASrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,IAAI,IAAI,MAAM,EAAE;IAIhB,IAAI,IAAI,MAAM;CAGf"}
@@ -0,0 +1,27 @@
1
+ export class TypeRegistry {
2
+ byFqn = new Map();
3
+ register(document) {
4
+ this.registerBlock(document, document.block);
5
+ }
6
+ registerBlock(document, block) {
7
+ if (block.type) {
8
+ this.byFqn.set(block.type, { ...document, block });
9
+ }
10
+ for (const sub of block.subBlocks) {
11
+ this.registerBlock(document, sub);
12
+ }
13
+ }
14
+ get(fqn) {
15
+ return this.byFqn.get(fqn);
16
+ }
17
+ has(fqn) {
18
+ return this.byFqn.has(fqn);
19
+ }
20
+ keys() {
21
+ return [...this.byFqn.keys()];
22
+ }
23
+ size() {
24
+ return this.byFqn.size;
25
+ }
26
+ }
27
+ //# sourceMappingURL=type-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-registry.js","sourceRoot":"","sources":["../../src/registry/type-registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IACN,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAExD,QAAQ,CAAC,QAAqB;QAC5B,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEO,aAAa,CAAC,QAAqB,EAAE,KAAsB;QACjE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import type { BlockDefinition, MemberDefinition, PropertyDefinition } from "@blockml/bom";
2
+ import type { TypeRegistry } from "../registry/type-registry.js";
3
+ export declare function memberIdentityKey(member: MemberDefinition): string;
4
+ export declare function collectBaseTypeChain(block: BlockDefinition, registry: TypeRegistry): BlockDefinition[];
5
+ /**
6
+ * Merge members from block.contracts[] in declaration order.
7
+ * Contract subBlocks/compositions/embeddedBlocks are ignored.
8
+ */
9
+ export declare function resolveContracts(block: BlockDefinition, registry: TypeRegistry): MemberDefinition[];
10
+ /**
11
+ * Merge members: baseType chain (ancestors) → contracts[] → local members.
12
+ */
13
+ export declare function resolveEffectiveMembers(block: BlockDefinition, registry: TypeRegistry): MemberDefinition[];
14
+ export declare function findLocalMember(block: BlockDefinition, member: MemberDefinition): MemberDefinition | undefined;
15
+ export declare function propertyForConstraintCheck(effective: PropertyDefinition, local: PropertyDefinition | undefined): PropertyDefinition;
16
+ //# sourceMappingURL=resolve-effective-members.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-effective-members.d.ts","sourceRoot":"","sources":["../../src/resolve/resolve-effective-members.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAGlE;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,YAAY,GACrB,eAAe,EAAE,CAoBnB;AA8CD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,YAAY,GACrB,gBAAgB,EAAE,CAapB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,YAAY,GACrB,gBAAgB,EAAE,CAapB;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,GACvB,gBAAgB,GAAG,SAAS,CAG9B;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,kBAAkB,EAC7B,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,kBAAkB,CAYpB"}
@@ -0,0 +1,104 @@
1
+ export function memberIdentityKey(member) {
2
+ const ns = member.namespace ?? "";
3
+ return `${ns}:${member.name}`;
4
+ }
5
+ export function collectBaseTypeChain(block, registry) {
6
+ const chain = [];
7
+ const visited = new Set();
8
+ let current = block;
9
+ while (current) {
10
+ chain.unshift(current);
11
+ const base = current.baseType;
12
+ if (!base || visited.has(base)) {
13
+ break;
14
+ }
15
+ visited.add(base);
16
+ const parent = registry.get(base)?.block;
17
+ if (!parent) {
18
+ break;
19
+ }
20
+ current = parent;
21
+ }
22
+ return chain;
23
+ }
24
+ function mergeMemberPartial(existing, incoming) {
25
+ const merged = { ...existing, ...incoming, name: incoming.name };
26
+ if (existing.kind === "property" && incoming.kind === "property") {
27
+ const existingConstraints = existing.constraints ?? [];
28
+ const incomingConstraints = incoming.constraints ?? [];
29
+ if (incomingConstraints.length > 0) {
30
+ merged.constraints = [
31
+ ...existingConstraints,
32
+ ...incomingConstraints,
33
+ ];
34
+ }
35
+ if (incoming.value !== undefined) {
36
+ merged.value = incoming.value;
37
+ }
38
+ if (incoming.values !== undefined && incoming.values.length > 0) {
39
+ merged.values = incoming.values;
40
+ }
41
+ }
42
+ return merged;
43
+ }
44
+ function mergeMemberLayer(effective, members, treatAsOverride) {
45
+ for (const member of members) {
46
+ const key = memberIdentityKey(member);
47
+ const existing = effective.get(key);
48
+ if (!existing) {
49
+ effective.set(key, member);
50
+ continue;
51
+ }
52
+ if (member.override || treatAsOverride) {
53
+ effective.set(key, mergeMemberPartial(existing, member));
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Merge members from block.contracts[] in declaration order.
59
+ * Contract subBlocks/compositions/embeddedBlocks are ignored.
60
+ */
61
+ export function resolveContracts(block, registry) {
62
+ const effective = new Map();
63
+ for (const ref of block.contracts ?? []) {
64
+ const contractFqn = ref.value;
65
+ const contractDoc = registry.get(contractFqn);
66
+ if (!contractDoc) {
67
+ continue;
68
+ }
69
+ mergeMemberLayer(effective, contractDoc.block.members, true);
70
+ }
71
+ return [...effective.values()];
72
+ }
73
+ /**
74
+ * Merge members: baseType chain (ancestors) → contracts[] → local members.
75
+ */
76
+ export function resolveEffectiveMembers(block, registry) {
77
+ const chain = collectBaseTypeChain(block, registry);
78
+ const ancestors = chain.slice(0, -1);
79
+ const effective = new Map();
80
+ for (const layer of ancestors) {
81
+ mergeMemberLayer(effective, layer.members, false);
82
+ }
83
+ mergeMemberLayer(effective, resolveContracts(block, registry), true);
84
+ mergeMemberLayer(effective, block.members, true);
85
+ return [...effective.values()];
86
+ }
87
+ export function findLocalMember(block, member) {
88
+ const key = memberIdentityKey(member);
89
+ return block.members.find((m) => memberIdentityKey(m) === key);
90
+ }
91
+ export function propertyForConstraintCheck(effective, local) {
92
+ if (!local) {
93
+ return effective;
94
+ }
95
+ const merged = { ...effective };
96
+ if (local.value !== undefined) {
97
+ merged.value = local.value;
98
+ }
99
+ if (local.values !== undefined && local.values.length > 0) {
100
+ merged.values = local.values;
101
+ }
102
+ return merged;
103
+ }
104
+ //# sourceMappingURL=resolve-effective-members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-effective-members.js","sourceRoot":"","sources":["../../src/resolve/resolve-effective-members.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 validateConstraints(document: BomDocument, registry: TypeRegistry): Diagnostic[];
4
+ //# sourceMappingURL=validate-constraints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-constraints.d.ts","sourceRoot":"","sources":["../../src/validate/validate-constraints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EACX,UAAU,EAGX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA6nBjE,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAKd"}