@blockml/framework 0.7.1 → 0.8.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 (65) hide show
  1. package/blocks/org/blockml/bml/framework/FrameworkType.bml +4 -1
  2. package/blocks/org/blockml/bml/framework/Library.bml +7 -3
  3. package/blocks/org/blockml/bml/framework/README.bml +1 -1
  4. package/blocks/org/blockml/bml/framework/capability/BootstrapTypeRegistry.bml +5 -1
  5. package/blocks/org/blockml/bml/framework/capability/CollectBaseTypeChain.bml +4 -1
  6. package/blocks/org/blockml/bml/framework/capability/DefaultBootstrapPaths.bml +6 -3
  7. package/blocks/org/blockml/bml/framework/capability/ForkBom.bml +4 -1
  8. package/blocks/org/blockml/bml/framework/capability/GetExportedFqns.bml +22 -3
  9. package/blocks/org/blockml/bml/framework/capability/GetPropertyNumericValue.bml +4 -1
  10. package/blocks/org/blockml/bml/framework/capability/IsLiteralValue.bml +4 -1
  11. package/blocks/org/blockml/bml/framework/capability/MemberIdentityKey.bml +4 -1
  12. package/blocks/org/blockml/bml/framework/capability/ParseExpression.bml +4 -1
  13. package/blocks/org/blockml/bml/framework/capability/ResolveContracts.bml +4 -1
  14. package/blocks/org/blockml/bml/framework/capability/ResolveEffectiveMembers.bml +4 -1
  15. package/blocks/org/blockml/bml/framework/capability/ResolveLibrarySeeds.bml +57 -0
  16. package/blocks/org/blockml/bml/framework/capability/RootFqnByFilePath.bml +18 -1
  17. package/blocks/org/blockml/bml/framework/capability/RootFqns.bml +23 -3
  18. package/blocks/org/blockml/bml/framework/capability/TypeRegistry.bml +4 -1
  19. package/blocks/org/blockml/bml/framework/capability/ValidateConstraints.bml +4 -1
  20. package/blocks/org/blockml/bml/framework/capability/ValidateEmbeddedBlocks.bml +22 -3
  21. package/blocks/org/blockml/bml/framework/capability/ValidateInstances.bml +23 -7
  22. package/blocks/org/blockml/bml/framework/capability/ValidatePresets.bml +24 -5
  23. package/blocks/org/blockml/bml/framework/capability/ValidateReadOnly.bml +24 -5
  24. package/blocks/org/blockml/bml/framework/capability/ValidateTypes.bml +4 -1
  25. package/blocks/org/blockml/bml/framework/capability/ValidateVersions.bml +4 -1
  26. package/blocks/org/blockml/bml/framework/capability/ValidateVisibility.bml +24 -5
  27. package/blocks/org/blockml/bml/framework/config/FrameworkDiagnosticCodes.bml +5 -2
  28. package/blocks/org/blockml/bml/framework/documentation/ArchitectureOverview.bml +3 -0
  29. package/blocks/org/blockml/bml/framework/documentation/ConstraintValidation.bml +5 -8
  30. package/blocks/org/blockml/bml/framework/documentation/Diagnostics.bml +3 -0
  31. package/blocks/org/blockml/bml/framework/documentation/EffectiveMembers.bml +3 -0
  32. package/blocks/org/blockml/bml/framework/documentation/ExpressionParsing.bml +3 -0
  33. package/blocks/org/blockml/bml/framework/documentation/Introduction.bml +3 -0
  34. package/blocks/org/blockml/bml/framework/documentation/LayerSeparation.bml +3 -0
  35. package/blocks/org/blockml/bml/framework/documentation/PackageOwnership.bml +3 -0
  36. package/blocks/org/blockml/bml/framework/documentation/PublicApi.bml +7 -8
  37. package/blocks/org/blockml/bml/framework/documentation/ScopeExclusions.bml +3 -0
  38. package/blocks/org/blockml/bml/framework/documentation/TypeRegistryBootstrap.bml +26 -8
  39. package/blocks/org/blockml/bml/framework/expression/ArrayExpressionNode.bml +4 -1
  40. package/blocks/org/blockml/bml/framework/expression/BinaryExpressionNode.bml +4 -1
  41. package/blocks/org/blockml/bml/framework/expression/CallExpressionNode.bml +4 -1
  42. package/blocks/org/blockml/bml/framework/expression/ExpressionNode.bml +4 -1
  43. package/blocks/org/blockml/bml/framework/expression/LiteralExpressionNode.bml +7 -4
  44. package/blocks/org/blockml/bml/framework/expression/ObjectExpressionEntry.bml +50 -0
  45. package/blocks/org/blockml/bml/framework/expression/ObjectExpressionNode.bml +7 -4
  46. package/blocks/org/blockml/bml/framework/expression/ParseExpressionError.bml +4 -1
  47. package/blocks/org/blockml/bml/framework/expression/ParseExpressionOutcome.bml +4 -1
  48. package/blocks/org/blockml/bml/framework/expression/ParseExpressionResult.bml +4 -1
  49. package/blocks/org/blockml/bml/framework/expression/PropertyExpressionNode.bml +4 -1
  50. package/blocks/org/blockml/bml/framework/registry/BootstrapOptions.bml +4 -1
  51. package/blocks/org/blockml/bml/framework/registry/BootstrapResult.bml +8 -5
  52. package/blocks/org/blockml/bml/framework/registry/BootstrapTrace.bml +59 -0
  53. package/dist/index.d.ts +1 -1
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/registry/bootstrap.d.ts +17 -0
  58. package/dist/registry/bootstrap.d.ts.map +1 -1
  59. package/dist/registry/bootstrap.js +231 -9
  60. package/dist/registry/bootstrap.js.map +1 -1
  61. package/dist/registry/library-bootstrap.d.ts +3 -1
  62. package/dist/registry/library-bootstrap.d.ts.map +1 -1
  63. package/dist/registry/library-bootstrap.js +76 -12
  64. package/dist/registry/library-bootstrap.js.map +1 -1
  65. package/package.json +4 -4
@@ -0,0 +1,59 @@
1
+ <!--
2
+ Framework — BootstrapTrace
3
+ FQN: org.blockml.bml.framework.registry.BootstrapTrace
4
+ -->
5
+ <block
6
+ xmlns="http://blockml.org/bml"
7
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
8
+ xsi:schemaLocation="http://blockml.org/bml https://blockml.org/schemas/bml.xsd
9
+ "
10
+ xmlns:blockml="org.blockml.bml"
11
+ xmlns:bom="org.blockml.bml.bom"
12
+ xmlns:bomapi="org.blockml.bml.bom.api"
13
+ xmlns:bomblock="org.blockml.bml.bom.block"
14
+ xmlns:bomcommon="org.blockml.bml.bom.common"
15
+ xmlns:bomcomp="org.blockml.bml.bom.composition"
16
+ xmlns:bomdoc="org.blockml.bml.bom.document"
17
+ xmlns:bommember="org.blockml.bml.bom.member"
18
+ xmlns:bomtype="org.blockml.bml.bom.type"
19
+ xmlns:bomvalue="org.blockml.bml.bom.value"
20
+ xmlns:core="org.blockml.bml.core"
21
+ xmlns:def="org.blockml.bml.definition"
22
+ xmlns:framework="org.blockml.bml.framework"
23
+ xmlns:fwcap="org.blockml.bml.framework.capability"
24
+ xmlns:fwconfig="org.blockml.bml.framework.config"
25
+ xmlns:fwdocumentation="org.blockml.bml.framework.documentation"
26
+ xmlns:fwexpression="org.blockml.bml.framework.expression"
27
+ xmlns:fwregistry="org.blockml.bml.framework.registry"
28
+ xmlns:parser="org.blockml.bml.compiler.parser"
29
+ xmlns:type="org.blockml.bml.type"
30
+ xmlns:bomdocumentation="org.blockml.bml.bom.documentation"
31
+ xmlns:pardocumentation="org.blockml.bml.compiler.parser.documentation"
32
+ xmlns:valdocumentation="org.blockml.bml.compiler.validator.documentation">
33
+
34
+ <name>BootstrapTrace</name>
35
+ <type>fwregistry:BootstrapTrace</type>
36
+ <baseType>framework:FrameworkType</baseType>
37
+ <is>Resolved bootstrap sources for tracing</is>
38
+
39
+ <documentation>corpusPaths — scanned corpus roots. seeds — libraryPaths used. searchRoots — discovery index (not a corpus dump). librariesVisited — graph order. skippedCoveredRoots — library trees skipped because they sit inside corpus srcDir.</documentation>
40
+
41
+ <properties>
42
+ <corpusPaths type="type:Text[]">
43
+ <documentation>corpusPaths. TS type: type:Text[]. (required)</documentation>
44
+ </corpusPaths>
45
+ <seeds type="type:Text[]">
46
+ <documentation>seeds. TS type: type:Text[]. (required)</documentation>
47
+ </seeds>
48
+ <searchRoots type="type:Text[]">
49
+ <documentation>searchRoots. TS type: type:Text[]. (required)</documentation>
50
+ </searchRoots>
51
+ <librariesVisited type="type:Text[]">
52
+ <documentation>librariesVisited. TS type: type:Text[]. (required)</documentation>
53
+ </librariesVisited>
54
+ <skippedCoveredRoots type="type:Text[]">
55
+ <documentation>skippedCoveredRoots. TS type: type:Text[]. (required)</documentation>
56
+ </skippedCoveredRoots>
57
+ </properties>
58
+
59
+ </block>
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { TypeRegistry } from "./registry/type-registry.js";
2
- export { bootstrapTypeRegistry, defaultBootstrapPaths, type BootstrapResult, type BootstrapOptions, } from "./registry/bootstrap.js";
2
+ export { bootstrapTypeRegistry, defaultBootstrapPaths, resolveLibrarySeeds, type BootstrapResult, type BootstrapOptions, type BootstrapTrace, } from "./registry/bootstrap.js";
3
3
  export { rootFqnByFilePath, rootFqns } from "./registry/root-fqn.js";
4
4
  export { getExportedFqns } from "./registry/library-exports.js";
5
5
  export { forkBom } from "./fork/fork-bom.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { TypeRegistry } from "./registry/type-registry.js";
2
- export { bootstrapTypeRegistry, defaultBootstrapPaths, } from "./registry/bootstrap.js";
2
+ export { bootstrapTypeRegistry, defaultBootstrapPaths, resolveLibrarySeeds, } from "./registry/bootstrap.js";
3
3
  export { rootFqnByFilePath, rootFqns } from "./registry/root-fqn.js";
4
4
  export { getExportedFqns } from "./registry/library-exports.js";
5
5
  export { forkBom } from "./fork/fork-bom.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,qBAAqB,GAGtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMnE,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GAIpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMnE,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
@@ -8,12 +8,29 @@ export interface BootstrapOptions {
8
8
  /** Working directory for relative paths. */
9
9
  rootDir?: string;
10
10
  }
11
+ /**
12
+ * Corpus fallback: BlockML packages among the nearest package.json production
13
+ * dependencies (dependencies + optionalDependencies), resolved via node_modules.
14
+ */
11
15
  export declare function defaultBootstrapPaths(rootDir?: string): string[];
16
+ /**
17
+ * Library graph seeds for this package: package.json blockml.library first,
18
+ * then extras (config.libraries or --libraries). Deduped by realpath.
19
+ */
20
+ export declare function resolveLibrarySeeds(rootDir?: string, extras?: string[]): string[];
21
+ export interface BootstrapTrace {
22
+ corpusPaths: string[];
23
+ seeds: string[];
24
+ searchRoots: string[];
25
+ librariesVisited: string[];
26
+ skippedCoveredRoots: string[];
27
+ }
12
28
  export interface BootstrapResult {
13
29
  registry: TypeRegistry;
14
30
  diagnostics: Diagnostic[];
15
31
  /** Present when bootstrap used libraryPaths mode. */
16
32
  exportsByLibrary?: Map<string, Set<string>>;
33
+ trace?: BootstrapTrace;
17
34
  }
18
35
  export declare function bootstrapTypeRegistry(optionsOrPaths?: BootstrapOptions | string[], rootDirArg?: string): BootstrapResult;
19
36
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/registry/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,SAAgB,GAAG,MAAM,EAAE,CAKvE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CAC7C;AAeD,wBAAgB,qBAAqB,CACnC,cAAc,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,EAC5C,UAAU,CAAC,EAAE,MAAM,GAClB,eAAe,CAoCjB"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/registry/bootstrap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqKD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,SAAgB,GAAG,MAAM,EAAE,CAwBvE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,SAAgB,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CA0B5F;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAeD,wBAAgB,qBAAqB,CACnC,cAAc,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,EAC5C,UAAU,CAAC,EAAE,MAAM,GAClB,eAAe,CA4DjB"}
@@ -1,11 +1,214 @@
1
- import { join } from "node:path";
1
+ import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
2
3
  import { TypeRegistry } from "./type-registry.js";
3
4
  import { bootstrapFromCorpusPaths, bootstrapFromLibraryPaths, } from "./library-bootstrap.js";
5
+ const CONFIG_FILE = "blockml.config.json";
6
+ const DEFAULT_SRC_DIR = "blocks";
7
+ function ancestorDirs(fromDir) {
8
+ const dirs = [];
9
+ let dir = resolve(fromDir);
10
+ for (;;) {
11
+ dirs.push(dir);
12
+ const parent = dirname(dir);
13
+ if (parent === dir) {
14
+ return dirs;
15
+ }
16
+ dir = parent;
17
+ }
18
+ }
19
+ function nearestPackageJsonDir(fromDir) {
20
+ for (const dir of ancestorDirs(fromDir)) {
21
+ if (existsSync(join(dir, "package.json"))) {
22
+ return dir;
23
+ }
24
+ }
25
+ return undefined;
26
+ }
27
+ function resolveInstalledPackageDir(packageName, fromDir) {
28
+ for (const dir of ancestorDirs(fromDir)) {
29
+ const candidate = join(dir, "node_modules", packageName);
30
+ if (existsSync(join(candidate, "package.json"))) {
31
+ return candidate;
32
+ }
33
+ }
34
+ return undefined;
35
+ }
36
+ function readJson(path) {
37
+ try {
38
+ return JSON.parse(readFileSync(path, "utf8"));
39
+ }
40
+ catch {
41
+ return undefined;
42
+ }
43
+ }
44
+ function canonicalPath(path) {
45
+ const abs = resolve(path);
46
+ try {
47
+ return realpathSync(abs);
48
+ }
49
+ catch {
50
+ return abs;
51
+ }
52
+ }
53
+ function resolveBootstrapPath(path, rootDir) {
54
+ return path.startsWith("/") || path.includes(":") ? path : join(rootDir, path);
55
+ }
56
+ /** srcDir for a package: blockml.config.json override, else default "blocks". */
57
+ function packageSrcDir(packageDir) {
58
+ const configPath = join(packageDir, CONFIG_FILE);
59
+ if (existsSync(configPath)) {
60
+ const cfg = readJson(configPath);
61
+ if (typeof cfg?.srcDir === "string" && cfg.srcDir.length > 0) {
62
+ return resolve(packageDir, cfg.srcDir);
63
+ }
64
+ }
65
+ return resolve(packageDir, DEFAULT_SRC_DIR);
66
+ }
67
+ /** Blocks/srcDir root when the package is a BlockML module; otherwise undefined. */
68
+ function blockmlPackageBlocksRoot(packageDir) {
69
+ const pkg = readJson(join(packageDir, "package.json"));
70
+ const library = pkg?.blockml?.library;
71
+ const hasLibrary = typeof library === "string" && library.length > 0;
72
+ const hasConfig = existsSync(join(packageDir, CONFIG_FILE));
73
+ if (!hasLibrary && !hasConfig) {
74
+ return undefined;
75
+ }
76
+ return packageSrcDir(packageDir);
77
+ }
78
+ function scanNodeModulesForBlockml(nodeModulesDir, out) {
79
+ let entries;
80
+ try {
81
+ entries = readdirSync(nodeModulesDir);
82
+ }
83
+ catch {
84
+ return;
85
+ }
86
+ for (const entry of entries) {
87
+ if (entry.startsWith(".")) {
88
+ continue;
89
+ }
90
+ const full = join(nodeModulesDir, entry);
91
+ if (entry.startsWith("@")) {
92
+ let scoped;
93
+ try {
94
+ scoped = readdirSync(full);
95
+ }
96
+ catch {
97
+ continue;
98
+ }
99
+ for (const name of scoped) {
100
+ const root = blockmlPackageBlocksRoot(join(full, name));
101
+ if (root) {
102
+ out.add(root);
103
+ }
104
+ }
105
+ continue;
106
+ }
107
+ const root = blockmlPackageBlocksRoot(full);
108
+ if (root) {
109
+ out.add(root);
110
+ }
111
+ }
112
+ }
113
+ function scanWorkspacePackages(packagesDir, out) {
114
+ let entries;
115
+ try {
116
+ entries = readdirSync(packagesDir);
117
+ }
118
+ catch {
119
+ return;
120
+ }
121
+ for (const entry of entries) {
122
+ const pkgDir = join(packagesDir, entry);
123
+ try {
124
+ if (!statSync(pkgDir).isDirectory()) {
125
+ continue;
126
+ }
127
+ }
128
+ catch {
129
+ continue;
130
+ }
131
+ const root = blockmlPackageBlocksRoot(pkgDir);
132
+ if (root) {
133
+ out.add(root);
134
+ }
135
+ }
136
+ }
137
+ /**
138
+ * Library.bml FQN index roots: every BlockML package under node_modules and
139
+ * workspace packages/ along the directory walk (not a corpus dump).
140
+ * Stops at the first ancestor that has node_modules (same idea as LSP resolveBootstrapRoot).
141
+ */
142
+ function discoverBlockmlSearchRoots(rootDir) {
143
+ const npm = new Set();
144
+ const workspace = new Set();
145
+ for (const dir of ancestorDirs(rootDir)) {
146
+ scanWorkspacePackages(join(dir, "packages"), workspace);
147
+ const nodeModulesDir = join(dir, "node_modules");
148
+ if (existsSync(nodeModulesDir)) {
149
+ scanNodeModulesForBlockml(nodeModulesDir, npm);
150
+ break;
151
+ }
152
+ }
153
+ const local = blockmlPackageBlocksRoot(resolve(rootDir));
154
+ const out = [...npm, ...workspace];
155
+ if (local && !out.includes(local)) {
156
+ out.push(local);
157
+ }
158
+ return out;
159
+ }
160
+ /**
161
+ * Corpus fallback: BlockML packages among the nearest package.json production
162
+ * dependencies (dependencies + optionalDependencies), resolved via node_modules.
163
+ */
4
164
  export function defaultBootstrapPaths(rootDir = process.cwd()) {
5
- return [
6
- join(rootDir, "node_modules/@blockml/core/blocks"),
7
- join(rootDir, "node_modules/@machineblocks/core/blocks"),
165
+ const pkgDir = nearestPackageJsonDir(rootDir) ?? resolve(rootDir);
166
+ const pkg = readJson(join(pkgDir, "package.json"));
167
+ const names = [
168
+ ...Object.keys(pkg?.dependencies ?? {}),
169
+ ...Object.keys(pkg?.optionalDependencies ?? {}),
8
170
  ];
171
+ const out = new Set();
172
+ for (const name of names) {
173
+ const installed = resolveInstalledPackageDir(name, rootDir);
174
+ if (!installed) {
175
+ continue;
176
+ }
177
+ const blocksRoot = blockmlPackageBlocksRoot(installed);
178
+ if (blocksRoot) {
179
+ out.add(blocksRoot);
180
+ }
181
+ }
182
+ return [...out];
183
+ }
184
+ /**
185
+ * Library graph seeds for this package: package.json blockml.library first,
186
+ * then extras (config.libraries or --libraries). Deduped by realpath.
187
+ */
188
+ export function resolveLibrarySeeds(rootDir = process.cwd(), extras = []) {
189
+ const ordered = [];
190
+ const pkg = readJson(join(rootDir, "package.json"));
191
+ const identity = pkg?.blockml?.library;
192
+ if (typeof identity === "string" && identity.length > 0) {
193
+ ordered.push(identity);
194
+ }
195
+ for (const extra of extras) {
196
+ if (typeof extra === "string" && extra.trim().length > 0) {
197
+ ordered.push(extra.trim());
198
+ }
199
+ }
200
+ const seen = new Set();
201
+ const out = [];
202
+ for (const seed of ordered) {
203
+ const abs = resolveBootstrapPath(seed, rootDir);
204
+ const key = canonicalPath(abs);
205
+ if (seen.has(key)) {
206
+ continue;
207
+ }
208
+ seen.add(key);
209
+ out.push(key);
210
+ }
211
+ return out;
9
212
  }
10
213
  function normalizeOptions(optionsOrPaths, rootDirArg) {
11
214
  if (Array.isArray(optionsOrPaths)) {
@@ -19,14 +222,15 @@ function normalizeOptions(optionsOrPaths, rootDirArg) {
19
222
  export function bootstrapTypeRegistry(optionsOrPaths, rootDirArg) {
20
223
  const options = normalizeOptions(optionsOrPaths, rootDirArg);
21
224
  const rootDir = options.rootDir ?? process.cwd();
225
+ const discovered = discoverBlockmlSearchRoots(rootDir).map((p) => resolveBootstrapPath(p, rootDir));
22
226
  const searchRoots = [
227
+ ...discovered,
23
228
  ...(options.paths ?? []),
24
229
  ...(options.libraryPaths ?? []),
25
- ...defaultBootstrapPaths(rootDir),
26
- join(rootDir, "packages"),
27
- ].map((p) => (p.startsWith("/") || p.includes(":") ? p : join(rootDir, p)));
230
+ ].map((p) => resolveBootstrapPath(p, rootDir));
28
231
  if (options.libraryPaths && options.libraryPaths.length > 0) {
29
- const result = bootstrapFromLibraryPaths(options.libraryPaths, searchRoots, rootDir);
232
+ const coveredRoots = (options.paths ?? []).map((p) => resolveBootstrapPath(p, rootDir));
233
+ const result = bootstrapFromLibraryPaths(options.libraryPaths, searchRoots, rootDir, coveredRoots);
30
234
  if (options.paths && options.paths.length > 0) {
31
235
  const corpus = bootstrapFromCorpusPaths(options.paths, rootDir);
32
236
  for (const fqn of corpus.registry.keys()) {
@@ -37,13 +241,31 @@ export function bootstrapTypeRegistry(optionsOrPaths, rootDirArg) {
37
241
  }
38
242
  result.diagnostics.push(...corpus.diagnostics);
39
243
  }
244
+ const seeds = options.libraryPaths.map((p) => canonicalPath(resolveBootstrapPath(p, rootDir)));
40
245
  return {
41
246
  registry: result.registry,
42
247
  diagnostics: result.diagnostics,
43
248
  exportsByLibrary: result.exportsByLibrary,
249
+ trace: {
250
+ corpusPaths: coveredRoots,
251
+ seeds,
252
+ searchRoots: discovered,
253
+ librariesVisited: result.librariesVisited,
254
+ skippedCoveredRoots: result.skippedCoveredRoots,
255
+ },
44
256
  };
45
257
  }
46
258
  const paths = options.paths && options.paths.length > 0 ? options.paths : defaultBootstrapPaths(rootDir);
47
- return bootstrapFromCorpusPaths(paths, rootDir);
259
+ const corpus = bootstrapFromCorpusPaths(paths, rootDir);
260
+ return {
261
+ ...corpus,
262
+ trace: {
263
+ corpusPaths: paths.map((p) => resolveBootstrapPath(p, rootDir)),
264
+ seeds: [],
265
+ searchRoots: discovered,
266
+ librariesVisited: [],
267
+ skippedCoveredRoots: [],
268
+ },
269
+ };
48
270
  }
49
271
  //# sourceMappingURL=bootstrap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/registry/bootstrap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/registry/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  import type { BomDocument, Diagnostic } from "@blockml/bom";
2
2
  import { TypeRegistry } from "./type-registry.js";
3
- export declare function bootstrapFromLibraryPaths(libraryPaths: string[], searchRoots: string[], rootDir: string): {
3
+ export declare function bootstrapFromLibraryPaths(libraryPaths: string[], searchRoots: string[], rootDir: string, coveredRoots?: string[]): {
4
4
  registry: TypeRegistry;
5
5
  diagnostics: Diagnostic[];
6
6
  exportsByLibrary: Map<string, Set<string>>;
7
+ librariesVisited: string[];
8
+ skippedCoveredRoots: string[];
7
9
  };
8
10
  export declare function bootstrapFromCorpusPaths(paths: string[], rootDir: string): {
9
11
  registry: TypeRegistry;
@@ -1 +1 @@
1
- {"version":3,"file":"library-bootstrap.d.ts","sourceRoot":"","sources":["../../src/registry/library-bootstrap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkC,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE5F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAsNlD,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EAAE,EACtB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,MAAM,GACd;IACD,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CAC5C,CAqBA;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CAevD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAI5E"}
1
+ {"version":3,"file":"library-bootstrap.d.ts","sourceRoot":"","sources":["../../src/registry/library-bootstrap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkC,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE5F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA4QlD,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EAAE,EACtB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,MAAM,EACf,YAAY,GAAE,MAAM,EAAO,GAC1B;IACD,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B,CAiCA;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CAevD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAI5E"}
@@ -1,5 +1,5 @@
1
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
- import { dirname, join, resolve } from "node:path";
1
+ import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
2
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
3
3
  import { parse } from "@blockml/parser";
4
4
  import { TypeRegistry } from "./type-registry.js";
5
5
  function collectBmlFiles(dir, out = []) {
@@ -27,14 +27,42 @@ function collectBmlFiles(dir, out = []) {
27
27
  }
28
28
  return out;
29
29
  }
30
+ const CONFIG_FILE = "blockml.config.json";
31
+ const DEFAULT_SRC_DIR = "blocks";
32
+ function packageSrcDir(packageDir) {
33
+ const configPath = join(packageDir, CONFIG_FILE);
34
+ if (existsSync(configPath)) {
35
+ try {
36
+ const cfg = JSON.parse(readFileSync(configPath, "utf8"));
37
+ if (typeof cfg.srcDir === "string" && cfg.srcDir.length > 0) {
38
+ return resolve(packageDir, cfg.srcDir);
39
+ }
40
+ }
41
+ catch {
42
+ // fall through to default
43
+ }
44
+ }
45
+ return resolve(packageDir, DEFAULT_SRC_DIR);
46
+ }
30
47
  function blocksRootFromLibraryPath(libraryPath) {
48
+ let dir = dirname(canonicalPath(libraryPath));
49
+ for (;;) {
50
+ if (existsSync(join(dir, "package.json"))) {
51
+ return packageSrcDir(dir);
52
+ }
53
+ const parent = dirname(dir);
54
+ if (parent === dir) {
55
+ break;
56
+ }
57
+ dir = parent;
58
+ }
31
59
  const normalized = libraryPath.replace(/\\/g, "/");
32
- const marker = "/blocks/";
60
+ const marker = `/${DEFAULT_SRC_DIR}/`;
33
61
  const idx = normalized.indexOf(marker);
34
62
  if (idx >= 0) {
35
- return normalized.slice(0, idx + "/blocks".length);
63
+ return normalized.slice(0, idx + `/${DEFAULT_SRC_DIR}`.length);
36
64
  }
37
- return dirname(dirname(libraryPath));
65
+ return dirname(libraryPath);
38
66
  }
39
67
  function aggregationInstances(block, name) {
40
68
  const agg = block.members.find((m) => m.kind === "aggregation" && m.name === name);
@@ -45,6 +73,15 @@ function aggregationInstances(block, name) {
45
73
  .filter((child) => child.kind === "blockInstance")
46
74
  .map((child) => child.instance);
47
75
  }
76
+ function canonicalPath(path) {
77
+ const abs = resolve(path);
78
+ try {
79
+ return realpathSync(abs);
80
+ }
81
+ catch {
82
+ return abs;
83
+ }
84
+ }
48
85
  function indexLibraryFiles(searchRoots) {
49
86
  const index = new Map();
50
87
  for (const root of searchRoots) {
@@ -57,7 +94,11 @@ function indexLibraryFiles(searchRoots) {
57
94
  const parsed = parse(source, { filePath: file, continueOnError: true });
58
95
  const type = parsed.document?.block.type;
59
96
  if (type) {
60
- index.set(type, file);
97
+ const files = index.get(type) ?? [];
98
+ if (!files.includes(file)) {
99
+ files.push(file);
100
+ index.set(type, files);
101
+ }
61
102
  }
62
103
  }
63
104
  catch {
@@ -80,7 +121,7 @@ function resolveLibraryGraph(seedPaths, searchRoots, rootDir, diagnostics) {
80
121
  const visited = new Set();
81
122
  const exportsByLibrary = new Map();
82
123
  const visit = (libraryPath) => {
83
- const abs = resolve(rootDir, libraryPath);
124
+ const abs = canonicalPath(resolve(rootDir, libraryPath));
84
125
  if (visited.has(abs)) {
85
126
  return;
86
127
  }
@@ -121,13 +162,18 @@ function resolveLibraryGraph(seedPaths, searchRoots, rootDir, diagnostics) {
121
162
  return;
122
163
  }
123
164
  const libType = parsed.document.block.type;
124
- libraryIndex.set(libType, abs);
165
+ const indexed = libraryIndex.get(libType) ?? [];
166
+ if (!indexed.includes(abs)) {
167
+ indexed.push(abs);
168
+ libraryIndex.set(libType, indexed);
169
+ }
125
170
  exportsByLibrary.set(abs, exportedBlockFqns(parsed.document.block));
126
171
  for (const dep of [
127
172
  ...aggregationInstances(parsed.document.block, "dependencies"),
128
173
  ...aggregationInstances(parsed.document.block, "subLibraries"),
129
174
  ]) {
130
- const depPath = libraryIndex.get(dep.typeFqn);
175
+ const candidates = libraryIndex.get(dep.typeFqn) ?? [];
176
+ const depPath = candidates.find((file) => canonicalPath(file) !== abs);
131
177
  if (!depPath) {
132
178
  diagnostics.push({
133
179
  severity: "error",
@@ -191,20 +237,38 @@ function registerFiles(registry, files, diagnostics) {
191
237
  }
192
238
  }
193
239
  }
194
- export function bootstrapFromLibraryPaths(libraryPaths, searchRoots, rootDir) {
240
+ function isPathInsideOrEqual(inner, outer) {
241
+ const a = canonicalPath(inner);
242
+ const b = canonicalPath(outer);
243
+ const rel = relative(b, a);
244
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
245
+ }
246
+ export function bootstrapFromLibraryPaths(libraryPaths, searchRoots, rootDir, coveredRoots = []) {
195
247
  const registry = new TypeRegistry();
196
248
  const diagnostics = [];
197
249
  const { orderedPaths, exportsByLibrary } = resolveLibraryGraph(libraryPaths, searchRoots, rootDir, diagnostics);
198
250
  checkNestingViolations(exportsByLibrary, diagnostics);
251
+ const absCovered = coveredRoots.map((root) => resolve(rootDir, root));
199
252
  const seenFiles = new Set();
253
+ const skippedCoveredRoots = [];
200
254
  for (const libraryPath of orderedPaths) {
201
255
  const blocksRoot = blocksRootFromLibraryPath(libraryPath);
256
+ if (absCovered.some((root) => isPathInsideOrEqual(blocksRoot, root))) {
257
+ skippedCoveredRoots.push(blocksRoot);
258
+ continue;
259
+ }
202
260
  for (const file of collectBmlFiles(blocksRoot)) {
203
261
  seenFiles.add(file);
204
262
  }
205
263
  }
206
264
  registerFiles(registry, [...seenFiles], diagnostics);
207
- return { registry, diagnostics, exportsByLibrary };
265
+ return {
266
+ registry,
267
+ diagnostics,
268
+ exportsByLibrary,
269
+ librariesVisited: orderedPaths,
270
+ skippedCoveredRoots,
271
+ };
208
272
  }
209
273
  export function bootstrapFromCorpusPaths(paths, rootDir) {
210
274
  const registry = new TypeRegistry();
@@ -221,7 +285,7 @@ export function bootstrapFromCorpusPaths(paths, rootDir) {
221
285
  return { registry, diagnostics };
222
286
  }
223
287
  export function findLibraryFileForType(typeFqn, searchRoots) {
224
- return indexLibraryFiles(searchRoots).get(typeFqn);
288
+ return indexLibraryFiles(searchRoots).get(typeFqn)?.[0];
225
289
  }
226
290
  export function parseLibraryDocument(libraryPath) {
227
291
  const source = readFileSync(libraryPath, "utf8");