@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.
- package/blocks/org/blockml/bml/framework/FrameworkType.bml +4 -1
- package/blocks/org/blockml/bml/framework/Library.bml +7 -3
- package/blocks/org/blockml/bml/framework/README.bml +1 -1
- package/blocks/org/blockml/bml/framework/capability/BootstrapTypeRegistry.bml +5 -1
- package/blocks/org/blockml/bml/framework/capability/CollectBaseTypeChain.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/DefaultBootstrapPaths.bml +6 -3
- package/blocks/org/blockml/bml/framework/capability/ForkBom.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/GetExportedFqns.bml +22 -3
- package/blocks/org/blockml/bml/framework/capability/GetPropertyNumericValue.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/IsLiteralValue.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/MemberIdentityKey.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/ParseExpression.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/ResolveContracts.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/ResolveEffectiveMembers.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/ResolveLibrarySeeds.bml +57 -0
- package/blocks/org/blockml/bml/framework/capability/RootFqnByFilePath.bml +18 -1
- package/blocks/org/blockml/bml/framework/capability/RootFqns.bml +23 -3
- package/blocks/org/blockml/bml/framework/capability/TypeRegistry.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/ValidateConstraints.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/ValidateEmbeddedBlocks.bml +22 -3
- package/blocks/org/blockml/bml/framework/capability/ValidateInstances.bml +23 -7
- package/blocks/org/blockml/bml/framework/capability/ValidatePresets.bml +24 -5
- package/blocks/org/blockml/bml/framework/capability/ValidateReadOnly.bml +24 -5
- package/blocks/org/blockml/bml/framework/capability/ValidateTypes.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/ValidateVersions.bml +4 -1
- package/blocks/org/blockml/bml/framework/capability/ValidateVisibility.bml +24 -5
- package/blocks/org/blockml/bml/framework/config/FrameworkDiagnosticCodes.bml +5 -2
- package/blocks/org/blockml/bml/framework/documentation/ArchitectureOverview.bml +3 -0
- package/blocks/org/blockml/bml/framework/documentation/ConstraintValidation.bml +5 -8
- package/blocks/org/blockml/bml/framework/documentation/Diagnostics.bml +3 -0
- package/blocks/org/blockml/bml/framework/documentation/EffectiveMembers.bml +3 -0
- package/blocks/org/blockml/bml/framework/documentation/ExpressionParsing.bml +3 -0
- package/blocks/org/blockml/bml/framework/documentation/Introduction.bml +3 -0
- package/blocks/org/blockml/bml/framework/documentation/LayerSeparation.bml +3 -0
- package/blocks/org/blockml/bml/framework/documentation/PackageOwnership.bml +3 -0
- package/blocks/org/blockml/bml/framework/documentation/PublicApi.bml +7 -8
- package/blocks/org/blockml/bml/framework/documentation/ScopeExclusions.bml +3 -0
- package/blocks/org/blockml/bml/framework/documentation/TypeRegistryBootstrap.bml +26 -8
- package/blocks/org/blockml/bml/framework/expression/ArrayExpressionNode.bml +4 -1
- package/blocks/org/blockml/bml/framework/expression/BinaryExpressionNode.bml +4 -1
- package/blocks/org/blockml/bml/framework/expression/CallExpressionNode.bml +4 -1
- package/blocks/org/blockml/bml/framework/expression/ExpressionNode.bml +4 -1
- package/blocks/org/blockml/bml/framework/expression/LiteralExpressionNode.bml +7 -4
- package/blocks/org/blockml/bml/framework/expression/ObjectExpressionEntry.bml +50 -0
- package/blocks/org/blockml/bml/framework/expression/ObjectExpressionNode.bml +7 -4
- package/blocks/org/blockml/bml/framework/expression/ParseExpressionError.bml +4 -1
- package/blocks/org/blockml/bml/framework/expression/ParseExpressionOutcome.bml +4 -1
- package/blocks/org/blockml/bml/framework/expression/ParseExpressionResult.bml +4 -1
- package/blocks/org/blockml/bml/framework/expression/PropertyExpressionNode.bml +4 -1
- package/blocks/org/blockml/bml/framework/registry/BootstrapOptions.bml +4 -1
- package/blocks/org/blockml/bml/framework/registry/BootstrapResult.bml +8 -5
- package/blocks/org/blockml/bml/framework/registry/BootstrapTrace.bml +59 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/registry/bootstrap.d.ts +17 -0
- package/dist/registry/bootstrap.d.ts.map +1 -1
- package/dist/registry/bootstrap.js +231 -9
- package/dist/registry/bootstrap.js.map +1 -1
- package/dist/registry/library-bootstrap.d.ts +3 -1
- package/dist/registry/library-bootstrap.d.ts.map +1 -1
- package/dist/registry/library-bootstrap.js +76 -12
- package/dist/registry/library-bootstrap.js.map +1 -1
- 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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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":"
|
|
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 {
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
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;
|
|
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 =
|
|
60
|
+
const marker = `/${DEFAULT_SRC_DIR}/`;
|
|
33
61
|
const idx = normalized.indexOf(marker);
|
|
34
62
|
if (idx >= 0) {
|
|
35
|
-
return normalized.slice(0, idx +
|
|
63
|
+
return normalized.slice(0, idx + `/${DEFAULT_SRC_DIR}`.length);
|
|
36
64
|
}
|
|
37
|
-
return dirname(
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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");
|