@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,86 @@
1
+ import { resolveEffectiveMembers } from "../resolve/resolve-effective-members.js";
2
+ function diag(code, message, file, line = 1, column = 1) {
3
+ return { severity: "error", code, message, source: { file, line, column } };
4
+ }
5
+ function walkCompositionInstances(nodes, visit) {
6
+ for (const node of nodes) {
7
+ if (node.kind === "blockInstance") {
8
+ visit(node.instance);
9
+ for (const agg of node.instance.aggregationCompositions ?? []) {
10
+ walkCompositionInstances(agg.composition.children, visit);
11
+ }
12
+ }
13
+ else {
14
+ walkCompositionInstances(node.children, visit);
15
+ }
16
+ }
17
+ }
18
+ function detectPresetCycleOnInstance(instance, chain, idsInDocument, file, diagnostics) {
19
+ if (!instance.basePresets) {
20
+ return;
21
+ }
22
+ const ref = instance.basePresets;
23
+ const id = ref.includes("::") ? ref.split("::").pop() : ref;
24
+ if (chain.includes(id)) {
25
+ diagnostics.push(diag("BML_PRESET_CYCLE", `Preset inheritance cycle: ${[...chain, id].join(" → ")}`, file, instance.source?.line, instance.source?.column));
26
+ return;
27
+ }
28
+ if (!idsInDocument.has(id)) {
29
+ return;
30
+ }
31
+ chain.push(id);
32
+ }
33
+ function collectPresetIds(block) {
34
+ const ids = new Set();
35
+ const visit = (instance) => {
36
+ const id = instance.id?.kind === "literal" && typeof instance.id.value === "string"
37
+ ? instance.id.value
38
+ : undefined;
39
+ if (id) {
40
+ ids.add(id);
41
+ }
42
+ };
43
+ for (const template of block.compositions) {
44
+ walkCompositionInstances(template.children, visit);
45
+ }
46
+ for (const sub of block.subBlocks) {
47
+ for (const id of collectPresetIds(sub)) {
48
+ ids.add(id);
49
+ }
50
+ }
51
+ return ids;
52
+ }
53
+ function validatePresetProperties(block, registry, file, diagnostics) {
54
+ const effective = resolveEffectiveMembers(block, registry);
55
+ const names = new Set(effective.map((m) => m.name));
56
+ for (const member of block.members) {
57
+ if (member.kind !== "property" || !member.suggestions?.length) {
58
+ continue;
59
+ }
60
+ for (const suggestion of member.suggestions) {
61
+ const propName = suggestion.memberValues["name"];
62
+ if (propName?.kind === "literal" &&
63
+ typeof propName.value === "string" &&
64
+ !names.has(propName.value)) {
65
+ diagnostics.push(diag("BML_UNKNOWN_PROPERTY", `Preset property ${propName.value} is not a member of ${block.type}`, file, suggestion.source?.line, suggestion.source?.column));
66
+ }
67
+ }
68
+ }
69
+ for (const sub of block.subBlocks) {
70
+ validatePresetProperties(sub, registry, file, diagnostics);
71
+ }
72
+ }
73
+ export function validatePresets(document, registry) {
74
+ const diagnostics = [];
75
+ const file = document.source.filePath ?? "<memory>";
76
+ const presetIds = collectPresetIds(document.block);
77
+ const visit = (instance) => {
78
+ detectPresetCycleOnInstance(instance, [], presetIds, file, diagnostics);
79
+ };
80
+ for (const template of document.block.compositions) {
81
+ walkCompositionInstances(template.children, visit);
82
+ }
83
+ validatePresetProperties(document.block, registry, file, diagnostics);
84
+ return diagnostics;
85
+ }
86
+ //# sourceMappingURL=validate-presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-presets.js","sourceRoot":"","sources":["../../src/validate/validate-presets.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 validateReadOnly(document: BomDocument, registry: TypeRegistry): Diagnostic[];
4
+ //# sourceMappingURL=validate-readonly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-readonly.d.ts","sourceRoot":"","sources":["../../src/validate/validate-readonly.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAEX,UAAU,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA8FjE,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAQd"}
@@ -0,0 +1,64 @@
1
+ import { resolveEffectiveMembers } from "../resolve/resolve-effective-members.js";
2
+ function diag(code, message, file, line = 1, column = 1) {
3
+ return { severity: "error", code, message, source: { file, line, column } };
4
+ }
5
+ function readOnlyMemberNames(typeFqn, registry) {
6
+ const doc = registry.get(typeFqn);
7
+ if (!doc) {
8
+ return new Set();
9
+ }
10
+ return new Set(resolveEffectiveMembers(doc.block, registry)
11
+ .filter((m) => m.readOnly)
12
+ .map((m) => m.name));
13
+ }
14
+ function validateInstanceReadOnly(instance, registry, file, diagnostics) {
15
+ const readOnly = readOnlyMemberNames(instance.typeFqn, registry);
16
+ for (const name of Object.keys(instance.memberValues)) {
17
+ if (readOnly.has(name)) {
18
+ diagnostics.push(diag("BML_READONLY_MEMBER_WRITE", `readOnly member ${name} must not be set on block instance`, file, instance.source?.line, instance.source?.column));
19
+ }
20
+ }
21
+ for (const agg of instance.aggregationCompositions ?? []) {
22
+ for (const child of agg.composition.children) {
23
+ if (child.kind === "blockInstance") {
24
+ validateInstanceReadOnly(child.instance, registry, file, diagnostics);
25
+ }
26
+ }
27
+ }
28
+ }
29
+ function walkCompositionReadOnly(nodes, registry, file, diagnostics) {
30
+ for (const node of nodes) {
31
+ if (node.kind === "blockInstance") {
32
+ validateInstanceReadOnly(node.instance, registry, file, diagnostics);
33
+ for (const agg of node.instance.aggregationCompositions ?? []) {
34
+ walkCompositionReadOnly(agg.composition.children, registry, file, diagnostics);
35
+ }
36
+ }
37
+ else {
38
+ walkCompositionReadOnly(node.children, registry, file, diagnostics);
39
+ }
40
+ }
41
+ }
42
+ function validateBlockConstraintInstances(block, registry, file, diagnostics) {
43
+ for (const inst of block.constraints ?? []) {
44
+ validateInstanceReadOnly(inst, registry, file, diagnostics);
45
+ }
46
+ for (const member of block.members) {
47
+ for (const inst of member.constraints ?? []) {
48
+ validateInstanceReadOnly(inst, registry, file, diagnostics);
49
+ }
50
+ }
51
+ for (const sub of block.subBlocks) {
52
+ validateBlockConstraintInstances(sub, registry, file, diagnostics);
53
+ }
54
+ }
55
+ export function validateReadOnly(document, registry) {
56
+ const diagnostics = [];
57
+ const file = document.source.filePath ?? "<memory>";
58
+ for (const template of document.block.compositions) {
59
+ walkCompositionReadOnly(template.children, registry, file, diagnostics);
60
+ }
61
+ validateBlockConstraintInstances(document.block, registry, file, diagnostics);
62
+ return diagnostics;
63
+ }
64
+ //# sourceMappingURL=validate-readonly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-readonly.js","sourceRoot":"","sources":["../../src/validate/validate-readonly.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { BomDocument, Diagnostic, LiteralValue, MemberValue, PropertyDefinition } from "@blockml/bom";
2
+ import type { TypeRegistry } from "../registry/type-registry.js";
3
+ export declare function validateTypes(document: BomDocument, registry: TypeRegistry): Diagnostic[];
4
+ export declare function getLiteralNumericValue(val: MemberValue | undefined): number | undefined;
5
+ export declare function getPropertyNumericValue(prop: PropertyDefinition): number | undefined;
6
+ export declare function isLiteralValue(val: MemberValue | undefined): val is LiteralValue;
7
+ //# sourceMappingURL=validate-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-types.d.ts","sourceRoot":"","sources":["../../src/validate/validate-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EACX,UAAU,EAEV,YAAY,EAEZ,WAAW,EACX,kBAAkB,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAqMjE,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAYd;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEvF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAYpF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,GAAG,IAAI,YAAY,CAEhF"}
@@ -0,0 +1,130 @@
1
+ import { parseExpression } from "../expression/parse-expression.js";
2
+ import { memberIdentityKey, resolveEffectiveMembers, } from "../resolve/resolve-effective-members.js";
3
+ function diag(code, message, file, line = 1, column = 1) {
4
+ return { severity: "error", code, message, source: { file, line, column } };
5
+ }
6
+ function literalNumber(val) {
7
+ if (!val || val.kind !== "literal") {
8
+ return undefined;
9
+ }
10
+ return typeof val.value === "number" ? val.value : undefined;
11
+ }
12
+ function validateBlockDefinition(block, registry, file, diagnostics) {
13
+ if (block.baseType && !registry.has(block.baseType)) {
14
+ diagnostics.push(diag("BML_UNKNOWN_BASE_TYPE", `Unknown baseType: ${block.baseType}`, file, block.source?.line, block.source?.column));
15
+ }
16
+ for (const ref of block.contracts ?? []) {
17
+ if (!registry.has(ref.value)) {
18
+ diagnostics.push(diag("BML_UNKNOWN_CONTRACT", `Unknown contract: ${ref.value}`, file, block.source?.line, block.source?.column));
19
+ }
20
+ }
21
+ const effective = resolveEffectiveMembers(block, registry);
22
+ const seen = new Set();
23
+ for (const member of effective) {
24
+ const key = memberIdentityKey(member);
25
+ if (seen.has(key)) {
26
+ diagnostics.push(diag("BML_MEMBER_COLLISION", `Duplicate effective member identity: ${key}`, file, member.source?.line, member.source?.column));
27
+ }
28
+ seen.add(key);
29
+ }
30
+ for (const member of block.members) {
31
+ const skipOverrideCheck = member.kind === "aggregation" &&
32
+ (member.composition !== undefined || member.default === true);
33
+ if (member.override) {
34
+ const parentBlock = block.baseType ? registry.get(block.baseType)?.block : undefined;
35
+ const parentMembers = parentBlock
36
+ ? resolveEffectiveMembers(parentBlock, registry)
37
+ : [];
38
+ const hasParent = parentMembers.some((m) => memberIdentityKey(m) === memberIdentityKey(member) && m.kind === member.kind);
39
+ if (block.baseType && registry.has(block.baseType) && !hasParent) {
40
+ diagnostics.push(diag("BML_OVERRIDE_WITHOUT_PARENT", `override without parent member: ${member.name}`, file, member.source?.line, member.source?.column));
41
+ }
42
+ }
43
+ else if (block.baseType && registry.has(block.baseType) && !skipOverrideCheck) {
44
+ const parentBlock = registry.get(block.baseType)?.block;
45
+ const parentDirect = parentBlock?.members ?? [];
46
+ const hasParent = parentDirect.some((m) => memberIdentityKey(m) === memberIdentityKey(member) && m.kind === member.kind);
47
+ if (hasParent && !member.override) {
48
+ diagnostics.push(diag("BML_OVERRIDE_REQUIRED", `override required for redeclared member: ${member.name}`, file, member.source?.line, member.source?.column));
49
+ }
50
+ }
51
+ if (member.kind === "property") {
52
+ validatePropertyExpressions(member, file, diagnostics);
53
+ }
54
+ }
55
+ for (const sub of block.subBlocks) {
56
+ validateBlockDefinition(sub, registry, file, diagnostics);
57
+ }
58
+ }
59
+ function validatePropertyExpressions(prop, file, diagnostics) {
60
+ const checkVal = (val, label) => {
61
+ if (!val || val.kind !== "expression") {
62
+ return;
63
+ }
64
+ const expr = val;
65
+ const parsed = parseExpression(expr.raw);
66
+ if (!parsed.ok) {
67
+ diagnostics.push(diag("BML_EXPRESSION_PARSE_ERROR", `${label}: ${parsed.error.message}`, file, expr.source?.line, expr.source?.column));
68
+ }
69
+ };
70
+ checkVal(prop.value, prop.name);
71
+ for (const entry of prop.values ?? []) {
72
+ checkVal(entry.value, prop.name);
73
+ }
74
+ }
75
+ function validateInstanceExpressions(instance, file, diagnostics) {
76
+ for (const [name, val] of Object.entries(instance.memberValues)) {
77
+ if (val.kind === "expression") {
78
+ const parsed = parseExpression(val.raw);
79
+ if (!parsed.ok) {
80
+ diagnostics.push(diag("BML_EXPRESSION_PARSE_ERROR", `${name}: ${parsed.error.message}`, file, val.source?.line, val.source?.column));
81
+ }
82
+ }
83
+ }
84
+ }
85
+ function walkCompositions(block, file, diagnostics) {
86
+ for (const template of block.compositions) {
87
+ for (const child of template.children) {
88
+ if (child.kind === "blockInstance") {
89
+ validateInstanceExpressions(child.instance, file, diagnostics);
90
+ }
91
+ else {
92
+ for (const nested of child.children) {
93
+ if (nested.kind === "blockInstance") {
94
+ validateInstanceExpressions(nested.instance, file, diagnostics);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ export function validateTypes(document, registry) {
102
+ const diagnostics = [];
103
+ const file = document.source.filePath ?? "<memory>";
104
+ if (document.block.type && !registry.has(document.block.type)) {
105
+ registry.register(document);
106
+ }
107
+ validateBlockDefinition(document.block, registry, file, diagnostics);
108
+ walkCompositions(document.block, file, diagnostics);
109
+ return diagnostics;
110
+ }
111
+ export function getLiteralNumericValue(val) {
112
+ return literalNumber(val);
113
+ }
114
+ export function getPropertyNumericValue(prop) {
115
+ const fromValue = literalNumber(prop.value);
116
+ if (fromValue !== undefined) {
117
+ return fromValue;
118
+ }
119
+ for (const entry of prop.values ?? []) {
120
+ const n = literalNumber(entry.value);
121
+ if (n !== undefined) {
122
+ return n;
123
+ }
124
+ }
125
+ return undefined;
126
+ }
127
+ export function isLiteralValue(val) {
128
+ return val?.kind === "literal";
129
+ }
130
+ //# sourceMappingURL=validate-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-types.js","sourceRoot":"","sources":["../../src/validate/validate-types.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 validateVersions(document: BomDocument, registry: TypeRegistry): Diagnostic[];
4
+ //# sourceMappingURL=validate-versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-versions.d.ts","sourceRoot":"","sources":["../../src/validate/validate-versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EACX,UAAU,EAEX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAqHjE,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAUd"}
@@ -0,0 +1,69 @@
1
+ function diag(code, message, file, line = 1, column = 1) {
2
+ return { severity: "error", code, message, source: { file, line, column } };
3
+ }
4
+ function isFrameworkConventionBlock(typeFqn) {
5
+ return (typeFqn.startsWith("org.blockml.bml.") || typeFqn.startsWith("com.machineblocks.bml."));
6
+ }
7
+ function requiresExplicitVersion(block) {
8
+ if (!block.type || block.version) {
9
+ return false;
10
+ }
11
+ if (isFrameworkConventionBlock(block.type)) {
12
+ return false;
13
+ }
14
+ return true;
15
+ }
16
+ function literalString(val) {
17
+ if (!val || val.kind !== "literal") {
18
+ return undefined;
19
+ }
20
+ return String(val.value);
21
+ }
22
+ function checkVersionPin(instance, registry, file, diagnostics) {
23
+ const pin = literalString(instance.version);
24
+ if (!pin) {
25
+ return;
26
+ }
27
+ const doc = registry.get(instance.typeFqn);
28
+ if (!doc) {
29
+ diagnostics.push(diag("BML_UNKNOWN_VERSION", `Unknown type for version pin: ${instance.typeFqn}@${pin}`, file, instance.source?.line, instance.source?.column));
30
+ return;
31
+ }
32
+ if (doc.block.version && doc.block.version !== pin) {
33
+ diagnostics.push(diag("BML_UNKNOWN_VERSION", `Version pin ${pin} does not match ${instance.typeFqn} (${doc.block.version})`, file, instance.source?.line, instance.source?.column));
34
+ }
35
+ }
36
+ function walkCompositionInstances(block, registry, file, diagnostics) {
37
+ for (const template of block.compositions) {
38
+ const walkNodes = (nodes) => {
39
+ for (const node of nodes) {
40
+ if (node.kind === "blockInstance") {
41
+ checkVersionPin(node.instance, registry, file, diagnostics);
42
+ }
43
+ else {
44
+ walkNodes(node.children);
45
+ }
46
+ }
47
+ };
48
+ walkNodes(template.children);
49
+ }
50
+ }
51
+ function validateBlockVersions(block, registry, file, diagnostics, isDocumentRoot) {
52
+ if (isDocumentRoot && requiresExplicitVersion(block)) {
53
+ diagnostics.push(diag("BML_MISSING_VERSION", `Missing version on block ${block.type}`, file, block.source?.line, block.source?.column));
54
+ }
55
+ walkCompositionInstances(block, registry, file, diagnostics);
56
+ for (const sub of block.subBlocks) {
57
+ validateBlockVersions(sub, registry, file, diagnostics, false);
58
+ }
59
+ }
60
+ export function validateVersions(document, registry) {
61
+ const diagnostics = [];
62
+ const file = document.source.filePath ?? "<memory>";
63
+ if (document.block.type && !registry.has(document.block.type)) {
64
+ registry.register(document);
65
+ }
66
+ validateBlockVersions(document.block, registry, file, diagnostics, true);
67
+ return diagnostics;
68
+ }
69
+ //# sourceMappingURL=validate-versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-versions.js","sourceRoot":"","sources":["../../src/validate/validate-versions.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 validateVisibility(document: BomDocument, registry: TypeRegistry): Diagnostic[];
4
+ //# sourceMappingURL=validate-visibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-visibility.d.ts","sourceRoot":"","sources":["../../src/validate/validate-visibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAEX,UAAU,EAEX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA4DjE,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAKd"}
@@ -0,0 +1,33 @@
1
+ import { resolveEffectiveMembers } from "../resolve/resolve-effective-members.js";
2
+ function diag(code, message, file, line = 1, column = 1) {
3
+ return { severity: "error", code, message, source: { file, line, column } };
4
+ }
5
+ function visibilityKey(member) {
6
+ const vis = member.visibility ?? "public";
7
+ return `${member.name}:${vis}`;
8
+ }
9
+ function validateBlockVisibility(block, registry, file, diagnostics) {
10
+ const effective = resolveEffectiveMembers(block, registry);
11
+ const seen = new Map();
12
+ for (const member of effective) {
13
+ const key = visibilityKey(member);
14
+ if (seen.has(key)) {
15
+ diagnostics.push(diag("BML_DUPLICATE_MEMBER_VISIBILITY_VARIANT", `Duplicate member visibility variant: ${key}`, file, member.source?.line, member.source?.column));
16
+ continue;
17
+ }
18
+ seen.set(key, member);
19
+ if (member.visibility === "private" && member.override) {
20
+ diagnostics.push(diag("BML_VISIBILITY_PRIVATE_OVERRIDE", `Private member ${member.name} cannot override`, file, member.source?.line, member.source?.column));
21
+ }
22
+ }
23
+ for (const sub of block.subBlocks) {
24
+ validateBlockVisibility(sub, registry, file, diagnostics);
25
+ }
26
+ }
27
+ export function validateVisibility(document, registry) {
28
+ const diagnostics = [];
29
+ const file = document.source.filePath ?? "<memory>";
30
+ validateBlockVisibility(document.block, registry, file, diagnostics);
31
+ return diagnostics;
32
+ }
33
+ //# sourceMappingURL=validate-visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-visibility.js","sourceRoot":"","sources":["../../src/validate/validate-visibility.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAElF,SAAS,IAAI,CACX,IAAY,EACZ,OAAe,EACf,IAAY,EACZ,IAAI,GAAG,CAAC,EACR,MAAM,GAAG,CAAC;IAEV,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,MAAwB;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC;IAC1C,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAAsB,EACtB,QAAsB,EACtB,IAAY,EACZ,WAAyB;IAEzB,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,GAAG,EAA4B,CAAC;IACjD,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,WAAW,CAAC,IAAI,CACd,IAAI,CACF,yCAAyC,EACzC,wCAAwC,GAAG,EAAE,EAC7C,IAAI,EACJ,MAAM,CAAC,MAAM,EAAE,IAAI,EACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CACtB,CACF,CAAC;YACF,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEtB,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvD,WAAW,CAAC,IAAI,CACd,IAAI,CACF,iCAAiC,EACjC,kBAAkB,MAAM,CAAC,IAAI,kBAAkB,EAC/C,IAAI,EACJ,MAAM,CAAC,MAAM,EAAE,IAAI,EACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CACtB,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAClC,uBAAuB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAqB,EACrB,QAAsB;IAEtB,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,UAAU,CAAC;IACpD,uBAAuB,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACrE,OAAO,WAAW,CAAC;AACrB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@blockml/framework",
3
+ "version": "0.1.0",
4
+ "description": "BlockML framework — TypeRegistry, fork/resolve, parseExpression, validateTypes",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/pks5/blockml-toolchain.git",
9
+ "directory": "packages/framework"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "type": "module",
15
+ "sideEffects": false,
16
+ "blockml": {
17
+ "library": "./blocks/org/blockml/bml/framework/Library.bml"
18
+ },
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "blocks"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsc --build",
31
+ "prepublishOnly": "npm run build",
32
+ "test": "vitest run packages/framework/test"
33
+ },
34
+ "dependencies": {
35
+ "@blockml/bom": "^0.1.0",
36
+ "@blockml/core": "^1.0.3",
37
+ "@blockml/parser": "^0.1.0"
38
+ },
39
+ "engines": {
40
+ "node": ">=20"
41
+ }
42
+ }