diff --git a/scripts/build.sh b/scripts/build.sh index b3f5df54..18d94cd5 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -57,11 +57,10 @@ if [ "$QUICK_BUILD" != "1" ]; then "$(yarn bin)/nearleyc" src/grammars/bracketexpr.ne > \ src/grammars/.bracketexpr.generated.ts - # Generate runtime metadata via typedoc. src/lib/metadata.ts loads the - # JSON and exposes the ProgramMetadata/FileMetadata/Type surface used at - # runtime; the .metadata.generated.ts shim below routes the public - # @src/.metadata.generated import path to that loader. - "$(yarn bin)/typedoc" --json src/.metadata.generated.json --mode file \ + # Generate runtime metadata via typedoc. The generated TypeScript shim + # routes the public @src/.metadata.generated import to the JSON loader. + "$(yarn bin)/typedoc" --json src/.metadata.generated.json --mode modules \ + --excludeExternals \ --exclude 'src/.excmds_*.generated.ts' --ignoreCompilerErrors \ src/excmds.ts src/lib/config.ts node scripts/minify_json.js src/.metadata.generated.json diff --git a/src/lib/metadata.ts b/src/lib/metadata.ts index 8809a978..55c6b0bf 100644 --- a/src/lib/metadata.ts +++ b/src/lib/metadata.ts @@ -22,15 +22,12 @@ const fileBuckets: Record< string, { functions: Record; classes: Record } > = { - "src/excmds.ts": { functions: {}, classes: {} }, - "src/lib/config.ts": { functions: {}, classes: {} }, + excmds: { functions: {}, classes: {} }, + "lib/config": { functions: {}, classes: {} }, } -function inTargetFile(node: Node): string | undefined { - for (const src of node.sources || []) { - if (fileBuckets[src.fileName]) return src.fileName - } - return undefined +function moduleName(node: Node): string { + return (node.name || "").replace(/^"|"$/g, "").replace(/\\/g, "/") } function walk(node: Node) { @@ -39,22 +36,25 @@ function walk(node: Node) { for (const v of node) walk(v) return } - if (node.kindString === "Function") { - const f = inTargetFile(node) - if (f) fileBuckets[f].functions[node.name] = node - } else if (node.kindString === "Class") { - const f = inTargetFile(node) - if (f) fileBuckets[f].classes[node.name] = node + if (node.kindString === "Module") { + const bucket = fileBuckets[moduleName(node)] + for (const child of bucket ? node.children || [] : []) { + if (child.kindString === "Function") { + bucket.functions[child.name] = child + } else if (child.kindString === "Class") { + bucket.classes[child.name] = child + } + } } if (node.children) walk(node.children) } walk(metadataJson) export const excmdsFunctions: Record = - fileBuckets["src/excmds.ts"].functions + fileBuckets.excmds.functions const defaultConfig: Node | undefined = - fileBuckets["src/lib/config.ts"].classes["default_config"] + fileBuckets["lib/config"].classes["default_config"] export const defaultConfigMembers: Record = (() => { const out: Record = {}