@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.
- package/blocks/org/blockml/bml/framework/FrameworkType.bml +44 -0
- package/blocks/org/blockml/bml/framework/Library.bml +127 -0
- package/blocks/org/blockml/bml/framework/README.bml +71 -0
- package/blocks/org/blockml/bml/framework/capability/BootstrapTypeRegistry.bml +53 -0
- package/blocks/org/blockml/bml/framework/capability/CollectBaseTypeChain.bml +50 -0
- package/blocks/org/blockml/bml/framework/capability/DefaultBootstrapPaths.bml +47 -0
- package/blocks/org/blockml/bml/framework/capability/ForkBom.bml +51 -0
- package/blocks/org/blockml/bml/framework/capability/GetExportedFqns.bml +37 -0
- package/blocks/org/blockml/bml/framework/capability/GetPropertyNumericValue.bml +47 -0
- package/blocks/org/blockml/bml/framework/capability/IsLiteralValue.bml +47 -0
- package/blocks/org/blockml/bml/framework/capability/MemberIdentityKey.bml +47 -0
- package/blocks/org/blockml/bml/framework/capability/ParseExpression.bml +51 -0
- package/blocks/org/blockml/bml/framework/capability/ResolveContracts.bml +55 -0
- package/blocks/org/blockml/bml/framework/capability/ResolveEffectiveMembers.bml +56 -0
- package/blocks/org/blockml/bml/framework/capability/RootFqnByFilePath.bml +33 -0
- package/blocks/org/blockml/bml/framework/capability/RootFqns.bml +30 -0
- package/blocks/org/blockml/bml/framework/capability/TypeRegistry.bml +43 -0
- package/blocks/org/blockml/bml/framework/capability/ValidateConstraints.bml +54 -0
- package/blocks/org/blockml/bml/framework/capability/ValidateEmbeddedBlocks.bml +31 -0
- package/blocks/org/blockml/bml/framework/capability/ValidateInstances.bml +34 -0
- package/blocks/org/blockml/bml/framework/capability/ValidatePresets.bml +34 -0
- package/blocks/org/blockml/bml/framework/capability/ValidateReadOnly.bml +34 -0
- package/blocks/org/blockml/bml/framework/capability/ValidateTypes.bml +55 -0
- package/blocks/org/blockml/bml/framework/capability/ValidateVersions.bml +54 -0
- package/blocks/org/blockml/bml/framework/capability/ValidateVisibility.bml +34 -0
- package/blocks/org/blockml/bml/framework/config/FrameworkDiagnosticCodes.bml +44 -0
- package/blocks/org/blockml/bml/framework/documentation/ArchitectureOverview.bml +60 -0
- package/blocks/org/blockml/bml/framework/documentation/ConstraintValidation.bml +59 -0
- package/blocks/org/blockml/bml/framework/documentation/Diagnostics.bml +68 -0
- package/blocks/org/blockml/bml/framework/documentation/EffectiveMembers.bml +61 -0
- package/blocks/org/blockml/bml/framework/documentation/ExpressionParsing.bml +53 -0
- package/blocks/org/blockml/bml/framework/documentation/Introduction.bml +56 -0
- package/blocks/org/blockml/bml/framework/documentation/LayerSeparation.bml +59 -0
- package/blocks/org/blockml/bml/framework/documentation/PackageOwnership.bml +56 -0
- package/blocks/org/blockml/bml/framework/documentation/PublicApi.bml +72 -0
- package/blocks/org/blockml/bml/framework/documentation/ScopeExclusions.bml +52 -0
- package/blocks/org/blockml/bml/framework/documentation/TypeRegistryBootstrap.bml +64 -0
- package/blocks/org/blockml/bml/framework/expression/ArrayExpressionNode.bml +48 -0
- package/blocks/org/blockml/bml/framework/expression/BinaryExpressionNode.bml +54 -0
- package/blocks/org/blockml/bml/framework/expression/CallExpressionNode.bml +51 -0
- package/blocks/org/blockml/bml/framework/expression/ExpressionNode.bml +44 -0
- package/blocks/org/blockml/bml/framework/expression/LiteralExpressionNode.bml +48 -0
- package/blocks/org/blockml/bml/framework/expression/ObjectExpressionNode.bml +48 -0
- package/blocks/org/blockml/bml/framework/expression/ParseExpressionError.bml +47 -0
- package/blocks/org/blockml/bml/framework/expression/ParseExpressionOutcome.bml +50 -0
- package/blocks/org/blockml/bml/framework/expression/ParseExpressionResult.bml +47 -0
- package/blocks/org/blockml/bml/framework/expression/PropertyExpressionNode.bml +48 -0
- package/blocks/org/blockml/bml/framework/registry/BootstrapOptions.bml +50 -0
- package/blocks/org/blockml/bml/framework/registry/BootstrapResult.bml +53 -0
- package/dist/expression/parse-expression.d.ts +3 -0
- package/dist/expression/parse-expression.d.ts.map +1 -0
- package/dist/expression/parse-expression.js +192 -0
- package/dist/expression/parse-expression.js.map +1 -0
- package/dist/expression/types.d.ts +44 -0
- package/dist/expression/types.d.ts.map +1 -0
- package/dist/expression/types.js +2 -0
- package/dist/expression/types.js.map +1 -0
- package/dist/fork/fork-bom.d.ts +4 -0
- package/dist/fork/fork-bom.d.ts.map +1 -0
- package/dist/fork/fork-bom.js +5 -0
- package/dist/fork/fork-bom.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/bootstrap.d.ts +19 -0
- package/dist/registry/bootstrap.d.ts.map +1 -0
- package/dist/registry/bootstrap.js +49 -0
- package/dist/registry/bootstrap.js.map +1 -0
- package/dist/registry/library-bootstrap.d.ts +14 -0
- package/dist/registry/library-bootstrap.d.ts.map +1 -0
- package/dist/registry/library-bootstrap.js +231 -0
- package/dist/registry/library-bootstrap.js.map +1 -0
- package/dist/registry/library-exports.d.ts +4 -0
- package/dist/registry/library-exports.d.ts.map +1 -0
- package/dist/registry/library-exports.js +10 -0
- package/dist/registry/library-exports.js.map +1 -0
- package/dist/registry/root-fqn.d.ts +5 -0
- package/dist/registry/root-fqn.d.ts.map +1 -0
- package/dist/registry/root-fqn.js +26 -0
- package/dist/registry/root-fqn.js.map +1 -0
- package/dist/registry/type-registry.d.ts +11 -0
- package/dist/registry/type-registry.d.ts.map +1 -0
- package/dist/registry/type-registry.js +27 -0
- package/dist/registry/type-registry.js.map +1 -0
- package/dist/resolve/resolve-effective-members.d.ts +16 -0
- package/dist/resolve/resolve-effective-members.d.ts.map +1 -0
- package/dist/resolve/resolve-effective-members.js +104 -0
- package/dist/resolve/resolve-effective-members.js.map +1 -0
- package/dist/validate/validate-constraints.d.ts +4 -0
- package/dist/validate/validate-constraints.d.ts.map +1 -0
- package/dist/validate/validate-constraints.js +388 -0
- package/dist/validate/validate-constraints.js.map +1 -0
- package/dist/validate/validate-embedded-blocks.d.ts +3 -0
- package/dist/validate/validate-embedded-blocks.d.ts.map +1 -0
- package/dist/validate/validate-embedded-blocks.js +44 -0
- package/dist/validate/validate-embedded-blocks.js.map +1 -0
- package/dist/validate/validate-instances.d.ts +4 -0
- package/dist/validate/validate-instances.d.ts.map +1 -0
- package/dist/validate/validate-instances.js +107 -0
- package/dist/validate/validate-instances.js.map +1 -0
- package/dist/validate/validate-presets.d.ts +4 -0
- package/dist/validate/validate-presets.d.ts.map +1 -0
- package/dist/validate/validate-presets.js +86 -0
- package/dist/validate/validate-presets.js.map +1 -0
- package/dist/validate/validate-readonly.d.ts +4 -0
- package/dist/validate/validate-readonly.d.ts.map +1 -0
- package/dist/validate/validate-readonly.js +64 -0
- package/dist/validate/validate-readonly.js.map +1 -0
- package/dist/validate/validate-types.d.ts +7 -0
- package/dist/validate/validate-types.d.ts.map +1 -0
- package/dist/validate/validate-types.js +130 -0
- package/dist/validate/validate-types.js.map +1 -0
- package/dist/validate/validate-versions.d.ts +4 -0
- package/dist/validate/validate-versions.d.ts.map +1 -0
- package/dist/validate/validate-versions.js +69 -0
- package/dist/validate/validate-versions.js.map +1 -0
- package/dist/validate/validate-visibility.d.ts +4 -0
- package/dist/validate/validate-visibility.d.ts.map +1 -0
- package/dist/validate/validate-visibility.js +33 -0
- package/dist/validate/validate-visibility.js.map +1 -0
- 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
|
+
}
|