contentbase 0.4.0 → 0.4.1
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/dist/adapters/node-fs.d.ts +17 -0
- package/dist/adapters/node-fs.d.ts.map +1 -0
- package/dist/adapters/node-fs.js +71 -0
- package/dist/adapters/node-fs.js.map +1 -0
- package/dist/ast-query.d.ts +44 -0
- package/dist/ast-query.d.ts.map +1 -0
- package/dist/ast-query.js +95 -0
- package/dist/ast-query.js.map +1 -0
- package/dist/base-model.d.ts +8 -0
- package/dist/base-model.d.ts.map +1 -0
- package/dist/base-model.js +12 -0
- package/dist/base-model.js.map +1 -0
- package/dist/cli/commands/action.d.ts +2 -0
- package/dist/cli/commands/action.d.ts.map +1 -0
- package/dist/cli/commands/action.js +73 -0
- package/dist/cli/commands/action.js.map +1 -0
- package/dist/cli/commands/api/endpoints/actions.d.ts +13 -0
- package/dist/cli/commands/api/endpoints/actions.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/actions.js +28 -0
- package/dist/cli/commands/api/endpoints/actions.js.map +1 -0
- package/dist/cli/commands/api/endpoints/doc.d.ts +5 -0
- package/dist/cli/commands/api/endpoints/doc.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/doc.js +186 -0
- package/dist/cli/commands/api/endpoints/doc.js.map +1 -0
- package/dist/cli/commands/api/endpoints/docs-index.d.ts +8 -0
- package/dist/cli/commands/api/endpoints/docs-index.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/docs-index.js +23 -0
- package/dist/cli/commands/api/endpoints/docs-index.js.map +1 -0
- package/dist/cli/commands/api/endpoints/document.d.ts +47 -0
- package/dist/cli/commands/api/endpoints/document.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/document.js +146 -0
- package/dist/cli/commands/api/endpoints/document.js.map +1 -0
- package/dist/cli/commands/api/endpoints/documents.d.ts +35 -0
- package/dist/cli/commands/api/endpoints/documents.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/documents.js +56 -0
- package/dist/cli/commands/api/endpoints/documents.js.map +1 -0
- package/dist/cli/commands/api/endpoints/index.d.ts +22 -0
- package/dist/cli/commands/api/endpoints/index.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/index.js +38 -0
- package/dist/cli/commands/api/endpoints/index.js.map +1 -0
- package/dist/cli/commands/api/endpoints/inspect.d.ts +10 -0
- package/dist/cli/commands/api/endpoints/inspect.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/inspect.js +15 -0
- package/dist/cli/commands/api/endpoints/inspect.js.map +1 -0
- package/dist/cli/commands/api/endpoints/models.d.ts +5 -0
- package/dist/cli/commands/api/endpoints/models.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/models.js +9 -0
- package/dist/cli/commands/api/endpoints/models.js.map +1 -0
- package/dist/cli/commands/api/endpoints/query.d.ts +40 -0
- package/dist/cli/commands/api/endpoints/query.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/query.js +106 -0
- package/dist/cli/commands/api/endpoints/query.js.map +1 -0
- package/dist/cli/commands/api/endpoints/root.d.ts +5 -0
- package/dist/cli/commands/api/endpoints/root.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/root.js +7 -0
- package/dist/cli/commands/api/endpoints/root.js.map +1 -0
- package/dist/cli/commands/api/endpoints/search-reindex.d.ts +10 -0
- package/dist/cli/commands/api/endpoints/search-reindex.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/search-reindex.js +38 -0
- package/dist/cli/commands/api/endpoints/search-reindex.js.map +1 -0
- package/dist/cli/commands/api/endpoints/search-status.d.ts +7 -0
- package/dist/cli/commands/api/endpoints/search-status.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/search-status.js +33 -0
- package/dist/cli/commands/api/endpoints/search-status.js.map +1 -0
- package/dist/cli/commands/api/endpoints/search.d.ts +24 -0
- package/dist/cli/commands/api/endpoints/search.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/search.js +61 -0
- package/dist/cli/commands/api/endpoints/search.js.map +1 -0
- package/dist/cli/commands/api/endpoints/semantic-search.d.ts +28 -0
- package/dist/cli/commands/api/endpoints/semantic-search.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/semantic-search.js +76 -0
- package/dist/cli/commands/api/endpoints/semantic-search.js.map +1 -0
- package/dist/cli/commands/api/endpoints/text-search.d.ts +17 -0
- package/dist/cli/commands/api/endpoints/text-search.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/text-search.js +55 -0
- package/dist/cli/commands/api/endpoints/text-search.js.map +1 -0
- package/dist/cli/commands/api/endpoints/validate.d.ts +12 -0
- package/dist/cli/commands/api/endpoints/validate.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/validate.js +27 -0
- package/dist/cli/commands/api/endpoints/validate.js.map +1 -0
- package/dist/cli/commands/api/helpers.d.ts +8 -0
- package/dist/cli/commands/api/helpers.d.ts.map +1 -0
- package/dist/cli/commands/api/helpers.js +89 -0
- package/dist/cli/commands/api/helpers.js.map +1 -0
- package/dist/cli/commands/console.d.ts +2 -0
- package/dist/cli/commands/console.d.ts.map +1 -0
- package/dist/cli/commands/console.js +117 -0
- package/dist/cli/commands/console.js.map +1 -0
- package/dist/cli/commands/create.d.ts +2 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +185 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/embed.d.ts +2 -0
- package/dist/cli/commands/embed.d.ts.map +1 -0
- package/dist/cli/commands/embed.js +231 -0
- package/dist/cli/commands/embed.js.map +1 -0
- package/dist/cli/commands/export.d.ts +2 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +55 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/extract.d.ts +2 -0
- package/dist/cli/commands/extract.d.ts.map +1 -0
- package/dist/cli/commands/extract.js +149 -0
- package/dist/cli/commands/extract.js.map +1 -0
- package/dist/cli/commands/help.d.ts +2 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +58 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/index.d.ts +18 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +19 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +82 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +2 -0
- package/dist/cli/commands/inspect.d.ts.map +1 -0
- package/dist/cli/commands/inspect.js +53 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +2 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +92 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/search.d.ts +2 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +212 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +2 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +298 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/summary.d.ts +2 -0
- package/dist/cli/commands/summary.d.ts.map +1 -0
- package/dist/cli/commands/summary.js +58 -0
- package/dist/cli/commands/summary.js.map +1 -0
- package/dist/cli/commands/teach.d.ts +2 -0
- package/dist/cli/commands/teach.d.ts.map +1 -0
- package/dist/cli/commands/teach.js +80 -0
- package/dist/cli/commands/teach.js.map +1 -0
- package/dist/cli/commands/text-search.d.ts +2 -0
- package/dist/cli/commands/text-search.d.ts.map +1 -0
- package/dist/cli/commands/text-search.js +125 -0
- package/dist/cli/commands/text-search.js.map +1 -0
- package/dist/cli/commands/update.d.ts +2 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +167 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +2 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +129 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +84 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/load-collection.d.ts +7 -0
- package/dist/cli/load-collection.d.ts.map +1 -0
- package/dist/cli/load-collection.js +201 -0
- package/dist/cli/load-collection.js.map +1 -0
- package/dist/cli/registry.d.ts +17 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +16 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cnotes +0 -0
- package/dist/collection.d.ts +145 -0
- package/dist/collection.d.ts.map +1 -0
- package/dist/collection.js +684 -0
- package/dist/collection.js.map +1 -0
- package/dist/define-model.d.ts +45 -0
- package/dist/define-model.d.ts.map +1 -0
- package/dist/define-model.js +106 -0
- package/dist/define-model.js.map +1 -0
- package/dist/document.d.ts +119 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +418 -0
- package/dist/document.js.map +1 -0
- package/dist/extract-sections.d.ts +46 -0
- package/dist/extract-sections.d.ts.map +1 -0
- package/dist/extract-sections.js +153 -0
- package/dist/extract-sections.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/helpers.d.ts +14 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +7 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/model-info.d.ts +2 -0
- package/dist/mcp/model-info.d.ts.map +1 -0
- package/dist/mcp/model-info.js +94 -0
- package/dist/mcp/model-info.js.map +1 -0
- package/dist/mcp/prompts.d.ts +2 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +180 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/readme.d.ts +2 -0
- package/dist/mcp/readme.d.ts.map +1 -0
- package/dist/mcp/readme.js +71 -0
- package/dist/mcp/readme.js.map +1 -0
- package/dist/mcp/resources.d.ts +2 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +85 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +18 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +83 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/mutation.d.ts +2 -0
- package/dist/mcp/tools/mutation.d.ts.map +1 -0
- package/dist/mcp/tools/mutation.js +155 -0
- package/dist/mcp/tools/mutation.js.map +1 -0
- package/dist/mcp/tools/query.d.ts +2 -0
- package/dist/mcp/tools/query.d.ts.map +1 -0
- package/dist/mcp/tools/query.js +130 -0
- package/dist/mcp/tools/query.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +2 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +168 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/model-instance.d.ts +11 -0
- package/dist/model-instance.d.ts.map +1 -0
- package/dist/model-instance.js +208 -0
- package/dist/model-instance.js.map +1 -0
- package/dist/node-shortcuts.d.ts +25 -0
- package/dist/node-shortcuts.d.ts.map +1 -0
- package/dist/node-shortcuts.js +67 -0
- package/dist/node-shortcuts.js.map +1 -0
- package/dist/parse.d.ts +45 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +98 -0
- package/dist/parse.js.map +1 -0
- package/dist/query/collection-query.d.ts +39 -0
- package/dist/query/collection-query.d.ts.map +1 -0
- package/dist/query/collection-query.js +184 -0
- package/dist/query/collection-query.js.map +1 -0
- package/dist/query/index.d.ts +8 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +5 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/operators.d.ts +3 -0
- package/dist/query/operators.d.ts.map +1 -0
- package/dist/query/operators.js +18 -0
- package/dist/query/operators.js.map +1 -0
- package/dist/query/query-builder.d.ts +34 -0
- package/dist/query/query-builder.d.ts.map +1 -0
- package/dist/query/query-builder.js +84 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-dsl.d.ts +36 -0
- package/dist/query/query-dsl.d.ts.map +1 -0
- package/dist/query/query-dsl.js +195 -0
- package/dist/query/query-dsl.js.map +1 -0
- package/dist/relationships/belongs-to.d.ts +9 -0
- package/dist/relationships/belongs-to.d.ts.map +1 -0
- package/dist/relationships/belongs-to.js +34 -0
- package/dist/relationships/belongs-to.js.map +1 -0
- package/dist/relationships/has-many.d.ts +23 -0
- package/dist/relationships/has-many.d.ts.map +1 -0
- package/dist/relationships/has-many.js +136 -0
- package/dist/relationships/has-many.js.map +1 -0
- package/dist/relationships/index.d.ts +26 -0
- package/dist/relationships/index.d.ts.map +1 -0
- package/dist/relationships/index.js +32 -0
- package/dist/relationships/index.js.map +1 -0
- package/dist/relationships/types.d.ts +2 -0
- package/dist/relationships/types.d.ts.map +1 -0
- package/dist/relationships/types.js +2 -0
- package/dist/relationships/types.js.map +1 -0
- package/dist/search/document-inputs.d.ts +30 -0
- package/dist/search/document-inputs.d.ts.map +1 -0
- package/dist/search/document-inputs.js +52 -0
- package/dist/search/document-inputs.js.map +1 -0
- package/dist/search/luca-semantic-search.d.ts +27 -0
- package/dist/search/luca-semantic-search.d.ts.map +1 -0
- package/dist/search/luca-semantic-search.js +56 -0
- package/dist/search/luca-semantic-search.js.map +1 -0
- package/dist/section.d.ts +21 -0
- package/dist/section.d.ts.map +1 -0
- package/dist/section.js +21 -0
- package/dist/section.js.map +1 -0
- package/dist/types.d.ts +185 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/inflect.d.ts +6 -0
- package/dist/utils/inflect.d.ts.map +1 -0
- package/dist/utils/inflect.js +75 -0
- package/dist/utils/inflect.js.map +1 -0
- package/dist/utils/match-pattern.d.ts +25 -0
- package/dist/utils/match-pattern.d.ts.map +1 -0
- package/dist/utils/match-pattern.js +52 -0
- package/dist/utils/match-pattern.js.map +1 -0
- package/dist/utils/normalize-headings.d.ts +8 -0
- package/dist/utils/normalize-headings.d.ts.map +1 -0
- package/dist/utils/normalize-headings.js +19 -0
- package/dist/utils/normalize-headings.js.map +1 -0
- package/dist/utils/parse-table.d.ts +7 -0
- package/dist/utils/parse-table.d.ts.map +1 -0
- package/dist/utils/parse-table.js +17 -0
- package/dist/utils/parse-table.js.map +1 -0
- package/dist/utils/read-directory.d.ts +5 -0
- package/dist/utils/read-directory.d.ts.map +1 -0
- package/dist/utils/read-directory.js +29 -0
- package/dist/utils/read-directory.js.map +1 -0
- package/dist/utils/stringify-ast.d.ts +6 -0
- package/dist/utils/stringify-ast.d.ts.map +1 -0
- package/dist/utils/stringify-ast.js +8 -0
- package/dist/utils/stringify-ast.js.map +1 -0
- package/dist/utils/strip-markdown.d.ts +11 -0
- package/dist/utils/strip-markdown.d.ts.map +1 -0
- package/dist/utils/strip-markdown.js +48 -0
- package/dist/utils/strip-markdown.js.map +1 -0
- package/dist/validator.d.ts +10 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +55 -0
- package/dist/validator.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { matchPatterns } from "../utils/match-pattern";
|
|
2
|
+
export class BelongsToRelationship {
|
|
3
|
+
#document;
|
|
4
|
+
#collection;
|
|
5
|
+
#definition;
|
|
6
|
+
#factory;
|
|
7
|
+
#sourceDef;
|
|
8
|
+
constructor(document, collection, definition, factory, sourceDef) {
|
|
9
|
+
this.#document = document;
|
|
10
|
+
this.#collection = collection;
|
|
11
|
+
this.#definition = definition;
|
|
12
|
+
this.#factory = factory;
|
|
13
|
+
this.#sourceDef = sourceDef;
|
|
14
|
+
}
|
|
15
|
+
fetch() {
|
|
16
|
+
const targetDef = this.#definition.target();
|
|
17
|
+
// Merge pattern-inferred meta with raw frontmatter, same as createModelInstance does
|
|
18
|
+
const patternMeta = this.#sourceDef.pattern
|
|
19
|
+
? matchPatterns(this.#sourceDef.pattern, this.#document.id) ?? {}
|
|
20
|
+
: {};
|
|
21
|
+
const mergedMeta = { ...(this.#sourceDef.defaults ?? {}), ...patternMeta, ...this.#document.meta };
|
|
22
|
+
const foreignKeyValue = this.#definition.foreignKey({
|
|
23
|
+
id: this.#document.id,
|
|
24
|
+
meta: mergedMeta,
|
|
25
|
+
});
|
|
26
|
+
const relatedId = `${targetDef.prefix}/${foreignKeyValue}`;
|
|
27
|
+
if (!this.#collection.items.has(relatedId)) {
|
|
28
|
+
throw new Error(`Could not find ${targetDef.name} with id "${relatedId}"`);
|
|
29
|
+
}
|
|
30
|
+
const doc = this.#collection.document(relatedId);
|
|
31
|
+
return this.#factory(doc, targetDef, this.#collection);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=belongs-to.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"belongs-to.js","sourceRoot":"","sources":["../../src/relationships/belongs-to.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAWvD,MAAM,OAAO,qBAAqB;IAIhC,SAAS,CAAW;IACpB,WAAW,CAAa;IACxB,WAAW,CAA+B;IAC1C,QAAQ,CAAuB;IAC/B,UAAU,CAA2C;IAErD,YACE,QAAkB,EAClB,UAAsB,EACtB,UAAwC,EACxC,OAA6B,EAC7B,SAAmD;QAEnD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,KAAK;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC5C,qFAAqF;QACrF,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;YACzC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;YACjE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,UAAU,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACnG,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAClD,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;YACrB,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,GAAG,SAAS,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;QAE3D,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,CAAC,IAAI,aAAa,SAAS,GAAG,CAC1D,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Document } from "../document";
|
|
2
|
+
import type { Collection } from "../collection";
|
|
3
|
+
import type { HasManyDefinition, ModelDefinition, InferModelInstance, HasManyAccessor, ModelInstanceFactory } from "../types";
|
|
4
|
+
export declare class HasManyRelationship<TTarget extends ModelDefinition<any, any, any, any, any>> implements HasManyAccessor<TTarget> {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(document: Document, collection: Collection, definition: HasManyDefinition<TTarget>, factory: ModelInstanceFactory);
|
|
7
|
+
/**
|
|
8
|
+
* Extract child nodes from the document AST.
|
|
9
|
+
*
|
|
10
|
+
* Algorithm (matching the original):
|
|
11
|
+
* 1. Find the parent heading by text (e.g., "Stories")
|
|
12
|
+
* 2. Extract the section under that heading
|
|
13
|
+
* 3. Filter for child headings at depth = parentHeading.depth + 1
|
|
14
|
+
* 4. For each child heading, extract its sub-section
|
|
15
|
+
* 5. Compute an ID from the parent title and child slug
|
|
16
|
+
*/
|
|
17
|
+
private extractChildNodes;
|
|
18
|
+
fetchAll(): InferModelInstance<TTarget>[];
|
|
19
|
+
first(): InferModelInstance<TTarget> | undefined;
|
|
20
|
+
last(): InferModelInstance<TTarget> | undefined;
|
|
21
|
+
create(): Promise<InferModelInstance<TTarget>[]>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=has-many.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"has-many.d.ts","sourceRoot":"","sources":["../../src/relationships/has-many.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAUlB,qBAAa,mBAAmB,CAC9B,OAAO,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CACxD,YAAW,eAAe,CAAC,OAAO,CAAC;;gBAQjC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,EACtC,OAAO,EAAE,oBAAoB;IAQ/B;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IAkDzB,QAAQ,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE;IAmEzC,KAAK,IAAI,kBAAkB,CAAC,OAAO,CAAC,GAAG,SAAS;IAIhD,IAAI,IAAI,kBAAkB,CAAC,OAAO,CAAC,GAAG,SAAS;IAKzC,MAAM,IAAI,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;CAKvD"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { toString } from "mdast-util-to-string";
|
|
2
|
+
import { kebabCase } from "../utils/inflect";
|
|
3
|
+
import { matchPatterns } from "../utils/match-pattern";
|
|
4
|
+
export class HasManyRelationship {
|
|
5
|
+
#document;
|
|
6
|
+
#collection;
|
|
7
|
+
#definition;
|
|
8
|
+
#factory;
|
|
9
|
+
constructor(document, collection, definition, factory) {
|
|
10
|
+
this.#document = document;
|
|
11
|
+
this.#collection = collection;
|
|
12
|
+
this.#definition = definition;
|
|
13
|
+
this.#factory = factory;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Extract child nodes from the document AST.
|
|
17
|
+
*
|
|
18
|
+
* Algorithm (matching the original):
|
|
19
|
+
* 1. Find the parent heading by text (e.g., "Stories")
|
|
20
|
+
* 2. Extract the section under that heading
|
|
21
|
+
* 3. Filter for child headings at depth = parentHeading.depth + 1
|
|
22
|
+
* 4. For each child heading, extract its sub-section
|
|
23
|
+
* 5. Compute an ID from the parent title and child slug
|
|
24
|
+
*/
|
|
25
|
+
extractChildNodes() {
|
|
26
|
+
const { astQuery } = this.#document;
|
|
27
|
+
if (!this.#definition.heading)
|
|
28
|
+
return [];
|
|
29
|
+
const parentHeading = astQuery.findHeadingByText(this.#definition.heading);
|
|
30
|
+
if (!parentHeading)
|
|
31
|
+
return [];
|
|
32
|
+
const sectionNodes = this.#document
|
|
33
|
+
.extractSection(parentHeading)
|
|
34
|
+
.slice(1);
|
|
35
|
+
const childDepth = parentHeading.depth + 1;
|
|
36
|
+
// Get all child headings at the expected depth
|
|
37
|
+
const childHeadings = sectionNodes.filter((n) => n.type === "heading" && n.depth === childDepth);
|
|
38
|
+
return childHeadings.map((heading) => {
|
|
39
|
+
// For each child heading, find its sub-section
|
|
40
|
+
// (from this heading to the next heading at the same depth, or end of parent section)
|
|
41
|
+
const headingIdx = sectionNodes.indexOf(heading);
|
|
42
|
+
const nextIdx = sectionNodes.findIndex((n, i) => i > headingIdx && n.type === "heading" && n.depth === childDepth);
|
|
43
|
+
const section = nextIdx === -1
|
|
44
|
+
? sectionNodes.slice(headingIdx)
|
|
45
|
+
: sectionNodes.slice(headingIdx, nextIdx);
|
|
46
|
+
const title = toString(heading);
|
|
47
|
+
const slug = kebabCase(title.toLowerCase());
|
|
48
|
+
const targetDef = this.#definition.target();
|
|
49
|
+
const id = this.#definition.id
|
|
50
|
+
? this.#definition.id(slug)
|
|
51
|
+
: `${targetDef.prefix}/${kebabCase(this.#document.title.toLowerCase())}/${slug}`;
|
|
52
|
+
return {
|
|
53
|
+
title,
|
|
54
|
+
id,
|
|
55
|
+
section,
|
|
56
|
+
ast: {
|
|
57
|
+
type: "root",
|
|
58
|
+
children: section,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
fetchAll() {
|
|
64
|
+
const targetDef = this.#definition.target();
|
|
65
|
+
// Foreign key mode: query for target documents where meta[foreignKey] matches this document's slug
|
|
66
|
+
// Used when foreignKey is explicitly set, or when no heading is specified (convention-based)
|
|
67
|
+
if (this.#definition.foreignKey || !this.#definition.heading) {
|
|
68
|
+
return this.#fetchByForeignKey(targetDef);
|
|
69
|
+
}
|
|
70
|
+
// Heading mode: extract child nodes from parent document AST
|
|
71
|
+
const childNodes = this.extractChildNodes();
|
|
72
|
+
return childNodes.map(({ id, ast }) => {
|
|
73
|
+
// If the document already exists in the collection, use it
|
|
74
|
+
if (this.#collection.items.has(id)) {
|
|
75
|
+
const doc = this.#collection.document(id);
|
|
76
|
+
return this.#factory(doc, targetDef, this.#collection);
|
|
77
|
+
}
|
|
78
|
+
// Otherwise create an in-memory document from the extracted AST
|
|
79
|
+
const doc = this.#collection.createDocument({
|
|
80
|
+
id,
|
|
81
|
+
meta: this.#definition.meta ? this.#definition.meta({}) : {},
|
|
82
|
+
ast: ast,
|
|
83
|
+
});
|
|
84
|
+
return this.#factory(doc, targetDef, this.#collection);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
#fetchByForeignKey(targetDef) {
|
|
88
|
+
// If foreignKey is explicitly set, use it. Otherwise infer from the parent document's model.
|
|
89
|
+
// Convention: look for meta[lowercase(parentModelName)] on target documents.
|
|
90
|
+
// e.g. Project hasMany Plans → looks for meta.project on Plan documents.
|
|
91
|
+
const fk = this.#definition.foreignKey || this.#inferForeignKey();
|
|
92
|
+
const slug = this.#document.slug;
|
|
93
|
+
const parentPrefix = this.#document.id.split("/")[0];
|
|
94
|
+
const idSegment = this.#document.id.slice(parentPrefix.length + 1);
|
|
95
|
+
const prefix = targetDef.prefix;
|
|
96
|
+
const results = [];
|
|
97
|
+
for (const pathId of this.#collection.available) {
|
|
98
|
+
if (!pathId.startsWith(prefix + "/"))
|
|
99
|
+
continue;
|
|
100
|
+
const doc = this.#collection.document(pathId);
|
|
101
|
+
// Check raw frontmatter first, then fall back to pattern-inferred meta
|
|
102
|
+
let fkValue = doc.meta[fk];
|
|
103
|
+
if (fkValue === undefined && targetDef.pattern) {
|
|
104
|
+
const patternMeta = matchPatterns(targetDef.pattern, pathId);
|
|
105
|
+
if (patternMeta)
|
|
106
|
+
fkValue = patternMeta[fk];
|
|
107
|
+
}
|
|
108
|
+
if (fkValue === slug || fkValue === idSegment) {
|
|
109
|
+
results.push(this.#factory(doc, targetDef, this.#collection));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return results;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Infer the foreign key name from the parent document's prefix.
|
|
116
|
+
* e.g. if the parent is in "projects/", the FK is "project" (singularized, lowercased).
|
|
117
|
+
*/
|
|
118
|
+
#inferForeignKey() {
|
|
119
|
+
const parentPrefix = this.#document.id.split("/")[0];
|
|
120
|
+
// Simple singularize: strip trailing "s"
|
|
121
|
+
return parentPrefix.replace(/s$/, "");
|
|
122
|
+
}
|
|
123
|
+
first() {
|
|
124
|
+
return this.fetchAll()[0];
|
|
125
|
+
}
|
|
126
|
+
last() {
|
|
127
|
+
const all = this.fetchAll();
|
|
128
|
+
return all[all.length - 1];
|
|
129
|
+
}
|
|
130
|
+
async create() {
|
|
131
|
+
const models = this.fetchAll();
|
|
132
|
+
await Promise.all(models.map((m) => m.save()));
|
|
133
|
+
return models;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=has-many.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"has-many.js","sourceRoot":"","sources":["../../src/relationships/has-many.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { HasManyDefinition, BelongsToDefinition, ModelDefinition, DocumentRef } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Declare a hasMany relationship.
|
|
4
|
+
*
|
|
5
|
+
* Two modes:
|
|
6
|
+
* - `heading`: Children are extracted from sub-headings under a parent heading in the document.
|
|
7
|
+
* - `foreignKey`: Children are found by querying target documents where meta[foreignKey] matches this document's slug.
|
|
8
|
+
*
|
|
9
|
+
* The target parameter is a thunk (() => ModelDef) to allow circular references.
|
|
10
|
+
*/
|
|
11
|
+
export declare function hasMany<TTarget extends ModelDefinition<any, any, any, any, any>>(target: () => TTarget, options: {
|
|
12
|
+
heading?: string;
|
|
13
|
+
foreignKey?: string;
|
|
14
|
+
meta?: (self: any) => Record<string, unknown>;
|
|
15
|
+
id?: (slug: string) => string;
|
|
16
|
+
}): HasManyDefinition<TTarget>;
|
|
17
|
+
/**
|
|
18
|
+
* Declare a belongsTo relationship.
|
|
19
|
+
* The foreign key function receives a DocumentRef (with id and meta)
|
|
20
|
+
* and returns the id fragment of the parent.
|
|
21
|
+
*/
|
|
22
|
+
export declare function belongsTo<TTarget extends ModelDefinition<any, any, any, any, any>>(target: () => TTarget, options: {
|
|
23
|
+
foreignKey: (doc: DocumentRef) => string;
|
|
24
|
+
}): BelongsToDefinition<TTarget>;
|
|
25
|
+
export type { HasManyDefinition, BelongsToDefinition, RelationshipDefinition, } from "../types";
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/relationships/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACZ,MAAM,UAAU,CAAC;AAElB;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACrB,OAAO,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAExD,MAAM,EAAE,MAAM,OAAO,EACrB,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/B,GACA,iBAAiB,CAAC,OAAO,CAAC,CAS5B;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAExD,MAAM,EAAE,MAAM,OAAO,EACrB,OAAO,EAAE;IACP,UAAU,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC;CAC1C,GACA,mBAAmB,CAAC,OAAO,CAAC,CAM9B;AAED,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declare a hasMany relationship.
|
|
3
|
+
*
|
|
4
|
+
* Two modes:
|
|
5
|
+
* - `heading`: Children are extracted from sub-headings under a parent heading in the document.
|
|
6
|
+
* - `foreignKey`: Children are found by querying target documents where meta[foreignKey] matches this document's slug.
|
|
7
|
+
*
|
|
8
|
+
* The target parameter is a thunk (() => ModelDef) to allow circular references.
|
|
9
|
+
*/
|
|
10
|
+
export function hasMany(target, options) {
|
|
11
|
+
return {
|
|
12
|
+
type: "hasMany",
|
|
13
|
+
target,
|
|
14
|
+
heading: options.heading,
|
|
15
|
+
foreignKey: options.foreignKey,
|
|
16
|
+
meta: options.meta,
|
|
17
|
+
id: options.id,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Declare a belongsTo relationship.
|
|
22
|
+
* The foreign key function receives a DocumentRef (with id and meta)
|
|
23
|
+
* and returns the id fragment of the parent.
|
|
24
|
+
*/
|
|
25
|
+
export function belongsTo(target, options) {
|
|
26
|
+
return {
|
|
27
|
+
type: "belongsTo",
|
|
28
|
+
target,
|
|
29
|
+
foreignKey: options.foreignKey,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/relationships/index.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CAGrB,MAAqB,EACrB,OAKC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,EAAE,EAAE,OAAO,CAAC,EAAE;KACf,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAGvB,MAAqB,EACrB,OAEC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,MAAM;QACN,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/relationships/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/relationships/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface SearchDocumentSection {
|
|
2
|
+
heading: string;
|
|
3
|
+
headingPath: string;
|
|
4
|
+
content: string;
|
|
5
|
+
level: number;
|
|
6
|
+
}
|
|
7
|
+
export interface SearchDocumentInput {
|
|
8
|
+
pathId: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
title?: string;
|
|
11
|
+
slug?: string;
|
|
12
|
+
meta?: Record<string, unknown>;
|
|
13
|
+
content: string;
|
|
14
|
+
sections?: SearchDocumentSection[];
|
|
15
|
+
}
|
|
16
|
+
export interface SearchCollectionLike {
|
|
17
|
+
available: string[];
|
|
18
|
+
document(pathId: string): {
|
|
19
|
+
title?: string;
|
|
20
|
+
slug?: string;
|
|
21
|
+
meta?: Record<string, unknown>;
|
|
22
|
+
content: string;
|
|
23
|
+
};
|
|
24
|
+
findModelDefinition?(pathId: string): {
|
|
25
|
+
name?: string;
|
|
26
|
+
} | undefined;
|
|
27
|
+
}
|
|
28
|
+
export declare function collectDocumentInputs(collection: SearchCollectionLike): SearchDocumentInput[];
|
|
29
|
+
export declare function collectH2Sections(content: string): SearchDocumentSection[];
|
|
30
|
+
//# sourceMappingURL=document-inputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-inputs.d.ts","sourceRoot":"","sources":["../../src/search/document-inputs.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG;QACxB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC9B,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,mBAAmB,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;CACpE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,oBAAoB,GAAG,mBAAmB,EAAE,CAoB7F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAkC1E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export function collectDocumentInputs(collection) {
|
|
2
|
+
const inputs = [];
|
|
3
|
+
for (const pathId of collection.available) {
|
|
4
|
+
const doc = collection.document(pathId);
|
|
5
|
+
const modelDef = collection.findModelDefinition?.(pathId);
|
|
6
|
+
const sections = collectH2Sections(doc.content);
|
|
7
|
+
inputs.push({
|
|
8
|
+
pathId,
|
|
9
|
+
model: modelDef?.name ?? undefined,
|
|
10
|
+
title: doc.title,
|
|
11
|
+
slug: doc.slug,
|
|
12
|
+
meta: doc.meta,
|
|
13
|
+
content: doc.content,
|
|
14
|
+
sections: sections.length > 0 ? sections : undefined,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return inputs;
|
|
18
|
+
}
|
|
19
|
+
export function collectH2Sections(content) {
|
|
20
|
+
const sections = [];
|
|
21
|
+
const lines = content.split('\n');
|
|
22
|
+
let currentHeading = null;
|
|
23
|
+
let currentContent = [];
|
|
24
|
+
for (const line of lines) {
|
|
25
|
+
const h2Match = line.match(/^## (.+)/);
|
|
26
|
+
if (h2Match) {
|
|
27
|
+
if (currentHeading) {
|
|
28
|
+
sections.push({
|
|
29
|
+
heading: currentHeading,
|
|
30
|
+
headingPath: currentHeading,
|
|
31
|
+
content: currentContent.join('\n').trim(),
|
|
32
|
+
level: 2,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
currentHeading = h2Match[1].trim();
|
|
36
|
+
currentContent = [];
|
|
37
|
+
}
|
|
38
|
+
else if (currentHeading) {
|
|
39
|
+
currentContent.push(line);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (currentHeading) {
|
|
43
|
+
sections.push({
|
|
44
|
+
heading: currentHeading,
|
|
45
|
+
headingPath: currentHeading,
|
|
46
|
+
content: currentContent.join('\n').trim(),
|
|
47
|
+
level: 2,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return sections;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=document-inputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-inputs.js","sourceRoot":"","sources":["../../src/search/document-inputs.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,qBAAqB,CAAC,UAAgC;IACpE,MAAM,MAAM,GAA0B,EAAE,CAAA;IAExC,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAAC,CAAA;QACzD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAE/C,MAAM,CAAC,IAAI,CAAC;YACV,MAAM;YACN,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,SAAS;YAClC,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACrD,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,QAAQ,GAA4B,EAAE,CAAA;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,cAAc,GAAkB,IAAI,CAAA;IACxC,IAAI,cAAc,GAAa,EAAE,CAAA;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,cAAc,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE,cAAc;oBACvB,WAAW,EAAE,cAAc;oBAC3B,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;oBACzC,KAAK,EAAE,CAAC;iBACT,CAAC,CAAA;YACJ,CAAC;YACD,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAClC,cAAc,GAAG,EAAE,CAAA;QACrB,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,cAAc;YACvB,WAAW,EAAE,cAAc;YAC3B,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;YACzC,KAAK,EAAE,CAAC;SACT,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type EmbeddingProvider = 'local' | 'openai';
|
|
2
|
+
export type ChunkStrategy = 'section' | 'fixed' | 'document';
|
|
3
|
+
export interface SemanticSearchConfig {
|
|
4
|
+
dbPath: string;
|
|
5
|
+
embeddingProvider: EmbeddingProvider;
|
|
6
|
+
embeddingModel: string;
|
|
7
|
+
chunkStrategy: ChunkStrategy;
|
|
8
|
+
chunkSize: number;
|
|
9
|
+
chunkOverlap: number;
|
|
10
|
+
}
|
|
11
|
+
export interface SemanticSearchOptions extends Partial<SemanticSearchConfig> {
|
|
12
|
+
}
|
|
13
|
+
export declare const DEFAULT_SEMANTIC_SEARCH_OPTIONS: {
|
|
14
|
+
embeddingProvider: EmbeddingProvider;
|
|
15
|
+
embeddingModel: string;
|
|
16
|
+
chunkStrategy: ChunkStrategy;
|
|
17
|
+
chunkSize: number;
|
|
18
|
+
chunkOverlap: number;
|
|
19
|
+
};
|
|
20
|
+
export declare function getSearchDbPath(rootPath: string): string;
|
|
21
|
+
export declare function hasSearchIndex(rootPath: string): boolean;
|
|
22
|
+
export declare function buildSemanticSearchConfig(rootPath: string, options?: SemanticSearchOptions): SemanticSearchConfig;
|
|
23
|
+
export declare function loadSemanticSearchClass(): Promise<any>;
|
|
24
|
+
export declare function ensureSemanticSearchAttached(container: any, SemanticSearchClass?: any): Promise<any>;
|
|
25
|
+
export declare function createSemanticSearch(container: any, rootPath: string, options?: SemanticSearchOptions): Promise<any>;
|
|
26
|
+
export declare function getInitializedSemanticSearch(container: any, rootPath: string, options?: SemanticSearchOptions): Promise<any>;
|
|
27
|
+
//# sourceMappingURL=luca-semantic-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"luca-semantic-search.d.ts","sourceRoot":"","sources":["../../src/search/luca-semantic-search.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,QAAQ,CAAA;AAClD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAA;AAE5D,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,qBAAsB,SAAQ,OAAO,CAAC,oBAAoB,CAAC;CAAG;AAE/E,eAAO,MAAM,+BAA+B;uBACX,iBAAiB;;mBAEpB,aAAa;;;CAG1C,CAAA;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAUxD;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,oBAAoB,CASrH;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,CAG5D;AAED,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,GAAG,EAAE,mBAAmB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAM1G;AAED,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,CAG9H;AAED,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,CAItI"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export const DEFAULT_SEMANTIC_SEARCH_OPTIONS = {
|
|
4
|
+
embeddingProvider: 'openai',
|
|
5
|
+
embeddingModel: 'text-embedding-3-small',
|
|
6
|
+
chunkStrategy: 'section',
|
|
7
|
+
chunkSize: 900,
|
|
8
|
+
chunkOverlap: 0.15,
|
|
9
|
+
};
|
|
10
|
+
export function getSearchDbPath(rootPath) {
|
|
11
|
+
return path.join(rootPath, '.contentbase/search.sqlite');
|
|
12
|
+
}
|
|
13
|
+
export function hasSearchIndex(rootPath) {
|
|
14
|
+
const dbDir = path.join(rootPath, '.contentbase');
|
|
15
|
+
if (!existsSync(dbDir))
|
|
16
|
+
return false;
|
|
17
|
+
try {
|
|
18
|
+
const files = readdirSync(dbDir);
|
|
19
|
+
return files.some((file) => file.startsWith('search.') && file.endsWith('.sqlite'));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function buildSemanticSearchConfig(rootPath, options = {}) {
|
|
26
|
+
return {
|
|
27
|
+
dbPath: options.dbPath ?? getSearchDbPath(rootPath),
|
|
28
|
+
embeddingProvider: options.embeddingProvider ?? DEFAULT_SEMANTIC_SEARCH_OPTIONS.embeddingProvider,
|
|
29
|
+
embeddingModel: options.embeddingModel ?? DEFAULT_SEMANTIC_SEARCH_OPTIONS.embeddingModel,
|
|
30
|
+
chunkStrategy: options.chunkStrategy ?? DEFAULT_SEMANTIC_SEARCH_OPTIONS.chunkStrategy,
|
|
31
|
+
chunkSize: options.chunkSize ?? DEFAULT_SEMANTIC_SEARCH_OPTIONS.chunkSize,
|
|
32
|
+
chunkOverlap: options.chunkOverlap ?? DEFAULT_SEMANTIC_SEARCH_OPTIONS.chunkOverlap,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function loadSemanticSearchClass() {
|
|
36
|
+
const { SemanticSearch } = await import('luca/agi');
|
|
37
|
+
return SemanticSearch;
|
|
38
|
+
}
|
|
39
|
+
export async function ensureSemanticSearchAttached(container, SemanticSearchClass) {
|
|
40
|
+
const SemanticSearch = SemanticSearchClass ?? await loadSemanticSearchClass();
|
|
41
|
+
if (!container.features.available.includes('semanticSearch')) {
|
|
42
|
+
;
|
|
43
|
+
SemanticSearch.attach(container);
|
|
44
|
+
}
|
|
45
|
+
return SemanticSearch;
|
|
46
|
+
}
|
|
47
|
+
export async function createSemanticSearch(container, rootPath, options = {}) {
|
|
48
|
+
await ensureSemanticSearchAttached(container);
|
|
49
|
+
return container.feature('semanticSearch', buildSemanticSearchConfig(rootPath, options));
|
|
50
|
+
}
|
|
51
|
+
export async function getInitializedSemanticSearch(container, rootPath, options = {}) {
|
|
52
|
+
const semanticSearch = await createSemanticSearch(container, rootPath, options);
|
|
53
|
+
await semanticSearch.initDb();
|
|
54
|
+
return semanticSearch;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=luca-semantic-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"luca-semantic-search.js","sourceRoot":"","sources":["../../src/search/luca-semantic-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,IAAI,MAAM,WAAW,CAAA;AAgB5B,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,iBAAiB,EAAE,QAA6B;IAChD,cAAc,EAAE,wBAAwB;IACxC,aAAa,EAAE,SAA0B;IACzC,SAAS,EAAE,GAAG;IACd,YAAY,EAAE,IAAI;CACnB,CAAA;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;IACjD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAEpC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAa,CAAA;QAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,UAAiC,EAAE;IAC7F,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC;QACnD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,+BAA+B,CAAC,iBAAiB;QACjG,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,+BAA+B,CAAC,cAAc;QACxF,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,+BAA+B,CAAC,aAAa;QACrF,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,+BAA+B,CAAC,SAAS;QACzE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,+BAA+B,CAAC,YAAY;KACnF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;IACnD,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,SAAc,EAAE,mBAAyB;IAC1F,MAAM,cAAc,GAAG,mBAAmB,IAAI,MAAM,uBAAuB,EAAE,CAAA;IAC7E,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7D,CAAC;QAAC,cAAsB,CAAC,MAAM,CAAC,SAAgB,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAc,EAAE,QAAgB,EAAE,UAAiC,EAAE;IAC9G,MAAM,4BAA4B,CAAC,SAAS,CAAC,CAAA;IAC7C,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;AAC1F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,SAAc,EAAE,QAAgB,EAAE,UAAiC,EAAE;IACtH,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC/E,MAAM,cAAc,CAAC,MAAM,EAAE,CAAA;IAC7B,OAAO,cAAc,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { AstQuery } from "./ast-query";
|
|
3
|
+
import type { SectionDefinition } from "./types";
|
|
4
|
+
/**
|
|
5
|
+
* Helper function to create a SectionDefinition with proper type inference.
|
|
6
|
+
* The generic T is inferred from the extract function's return type.
|
|
7
|
+
*
|
|
8
|
+
* Without this helper, TypeScript would widen the return type of extract to `unknown`.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* section("Acceptance Criteria", {
|
|
12
|
+
* extract: (query) => query.selectAll("listItem").map(toString),
|
|
13
|
+
* schema: z.array(z.string()).min(1),
|
|
14
|
+
* })
|
|
15
|
+
*/
|
|
16
|
+
export declare function section<T>(heading: string, options: {
|
|
17
|
+
extract: (query: AstQuery) => T;
|
|
18
|
+
schema?: z.ZodType<T>;
|
|
19
|
+
alternatives?: string[];
|
|
20
|
+
}): SectionDefinition<T>;
|
|
21
|
+
//# sourceMappingURL=section.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../src/section.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,CAAC,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,GACA,iBAAiB,CAAC,CAAC,CAAC,CAOtB"}
|
package/dist/section.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper function to create a SectionDefinition with proper type inference.
|
|
3
|
+
* The generic T is inferred from the extract function's return type.
|
|
4
|
+
*
|
|
5
|
+
* Without this helper, TypeScript would widen the return type of extract to `unknown`.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* section("Acceptance Criteria", {
|
|
9
|
+
* extract: (query) => query.selectAll("listItem").map(toString),
|
|
10
|
+
* schema: z.array(z.string()).min(1),
|
|
11
|
+
* })
|
|
12
|
+
*/
|
|
13
|
+
export function section(heading, options) {
|
|
14
|
+
return {
|
|
15
|
+
heading,
|
|
16
|
+
alternatives: options.alternatives,
|
|
17
|
+
extract: options.extract,
|
|
18
|
+
schema: options.schema,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section.js","sourceRoot":"","sources":["../src/section.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO,CACrB,OAAe,EACf,OAIC;IAED,OAAO;QACL,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC"}
|