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,184 @@
|
|
|
1
|
+
import { QueryBuilder } from "./query-builder";
|
|
2
|
+
import { operators } from "./operators";
|
|
3
|
+
import { createModelInstance } from "../model-instance";
|
|
4
|
+
export class CollectionQuery {
|
|
5
|
+
#collection;
|
|
6
|
+
#definition;
|
|
7
|
+
#queryBuilder;
|
|
8
|
+
#sorts = [];
|
|
9
|
+
#limit;
|
|
10
|
+
#offset;
|
|
11
|
+
#include = [];
|
|
12
|
+
constructor(collection, definition) {
|
|
13
|
+
this.#collection = collection;
|
|
14
|
+
this.#definition = definition;
|
|
15
|
+
this.#queryBuilder = new QueryBuilder();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Include related models in query results.
|
|
19
|
+
* Named relationships will be eagerly resolved and included in toJSON() output.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* await collection.query(Project).include("plans").fetchAll()
|
|
23
|
+
* await collection.query(Project).include("plans", "goal").fetchAll()
|
|
24
|
+
*/
|
|
25
|
+
include(...names) {
|
|
26
|
+
this.#include.push(...names);
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/** Returns the serialize options based on include() calls */
|
|
30
|
+
get serializeOptions() {
|
|
31
|
+
const opts = {};
|
|
32
|
+
if (this.#include.length > 0)
|
|
33
|
+
opts.related = this.#include;
|
|
34
|
+
return opts;
|
|
35
|
+
}
|
|
36
|
+
where(pathOrObject, operatorOrValue, value) {
|
|
37
|
+
this.#queryBuilder.where(pathOrObject, operatorOrValue, value);
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
whereIn(path, values) {
|
|
41
|
+
this.#queryBuilder.whereIn(path, values);
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
whereNotIn(path, values) {
|
|
45
|
+
this.#queryBuilder.whereNotIn(path, values);
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
whereGt(path, value) {
|
|
49
|
+
this.#queryBuilder.whereGt(path, value);
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
whereLt(path, value) {
|
|
53
|
+
this.#queryBuilder.whereLt(path, value);
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
whereGte(path, value) {
|
|
57
|
+
this.#queryBuilder.whereGte(path, value);
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
whereLte(path, value) {
|
|
61
|
+
this.#queryBuilder.whereLte(path, value);
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
whereContains(path, value) {
|
|
65
|
+
this.#queryBuilder.whereContains(path, value);
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
whereStartsWith(path, value) {
|
|
69
|
+
this.#queryBuilder.whereStartsWith(path, value);
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
whereEndsWith(path, value) {
|
|
73
|
+
this.#queryBuilder.whereEndsWith(path, value);
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
whereRegex(path, pattern) {
|
|
77
|
+
this.#queryBuilder.whereRegex(path, pattern);
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
whereExists(path) {
|
|
81
|
+
this.#queryBuilder.whereExists(path);
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
whereNotExists(path) {
|
|
85
|
+
this.#queryBuilder.whereNotExists(path);
|
|
86
|
+
return this;
|
|
87
|
+
}
|
|
88
|
+
scope(name) {
|
|
89
|
+
const scopeFn = this.#definition.scopes?.[name];
|
|
90
|
+
if (!scopeFn) {
|
|
91
|
+
throw new Error(`Unknown scope "${name}" on model "${this.#definition.name}"`);
|
|
92
|
+
}
|
|
93
|
+
return scopeFn(this);
|
|
94
|
+
}
|
|
95
|
+
sort(path, direction = "asc") {
|
|
96
|
+
this.#sorts.push({ path, direction });
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
limit(n) {
|
|
100
|
+
this.#limit = n;
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
offset(n) {
|
|
104
|
+
this.#offset = n;
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
107
|
+
async fetchAll() {
|
|
108
|
+
const collection = this.#collection;
|
|
109
|
+
if (!collection.loaded)
|
|
110
|
+
await collection.load();
|
|
111
|
+
const definition = this.#definition;
|
|
112
|
+
const conditions = this.#queryBuilder.conditions;
|
|
113
|
+
let results = [];
|
|
114
|
+
for (const pathId of collection.available) {
|
|
115
|
+
// Delegate all matching logic to collection (handles _model meta, prefix, Base fallback)
|
|
116
|
+
const matchedDef = collection.findModelDefinition(pathId);
|
|
117
|
+
if (matchedDef?.name !== definition.name)
|
|
118
|
+
continue;
|
|
119
|
+
const doc = collection.document(pathId);
|
|
120
|
+
const instance = createModelInstance(doc, definition, collection);
|
|
121
|
+
// Apply query conditions
|
|
122
|
+
const passesAll = conditions.every((cond) => {
|
|
123
|
+
const actual = getNestedValue(instance, cond.path);
|
|
124
|
+
return operators[cond.operator](actual, cond.value);
|
|
125
|
+
});
|
|
126
|
+
if (passesAll) {
|
|
127
|
+
results.push(instance);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (this.#sorts.length > 0) {
|
|
131
|
+
results.sort((a, b) => {
|
|
132
|
+
for (const { path, direction } of this.#sorts) {
|
|
133
|
+
const aVal = getNestedValue(a, path);
|
|
134
|
+
const bVal = getNestedValue(b, path);
|
|
135
|
+
if (aVal === bVal)
|
|
136
|
+
continue;
|
|
137
|
+
if (aVal == null)
|
|
138
|
+
return direction === "asc" ? 1 : -1;
|
|
139
|
+
if (bVal == null)
|
|
140
|
+
return direction === "asc" ? -1 : 1;
|
|
141
|
+
const cmp = aVal < bVal ? -1 : 1;
|
|
142
|
+
return direction === "asc" ? cmp : -cmp;
|
|
143
|
+
}
|
|
144
|
+
return 0;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Apply pagination
|
|
148
|
+
if (this.#offset && this.#offset > 0) {
|
|
149
|
+
results = results.slice(this.#offset);
|
|
150
|
+
}
|
|
151
|
+
if (this.#limit !== undefined && this.#limit >= 0) {
|
|
152
|
+
results = results.slice(0, this.#limit);
|
|
153
|
+
}
|
|
154
|
+
// Bind serialize options from include() so toJSON() includes relationships
|
|
155
|
+
if (this.#include.length > 0) {
|
|
156
|
+
const opts = this.serializeOptions;
|
|
157
|
+
for (const instance of results) {
|
|
158
|
+
const original = instance.toJSON;
|
|
159
|
+
instance.toJSON = (overrides) => {
|
|
160
|
+
const merged = { ...opts, ...overrides };
|
|
161
|
+
if (opts.related && overrides?.related) {
|
|
162
|
+
merged.related = [...new Set([...opts.related, ...overrides.related])];
|
|
163
|
+
}
|
|
164
|
+
return original(merged);
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return results;
|
|
169
|
+
}
|
|
170
|
+
async first() {
|
|
171
|
+
return (await this.fetchAll())[0];
|
|
172
|
+
}
|
|
173
|
+
async last() {
|
|
174
|
+
const all = await this.fetchAll();
|
|
175
|
+
return all[all.length - 1];
|
|
176
|
+
}
|
|
177
|
+
async count() {
|
|
178
|
+
return (await this.fetchAll()).length;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function getNestedValue(obj, path) {
|
|
182
|
+
return path.split(".").reduce((acc, key) => acc?.[key], obj);
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=collection-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-query.js","sourceRoot":"","sources":["../../src/query/collection-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { CollectionQuery } from "./collection-query";
|
|
2
|
+
export { QueryBuilder } from "./query-builder";
|
|
3
|
+
export { operators } from "./operators";
|
|
4
|
+
export type { Operator } from "./operators";
|
|
5
|
+
export type { Condition } from "./query-builder";
|
|
6
|
+
export { queryDSLSchema, parseWhereClause, parseSortClause, executeQueryDSL, } from "./query-dsl";
|
|
7
|
+
export type { QueryDSL } from "./query-dsl";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CollectionQuery } from "./collection-query";
|
|
2
|
+
export { QueryBuilder } from "./query-builder";
|
|
3
|
+
export { operators } from "./operators";
|
|
4
|
+
export { queryDSLSchema, parseWhereClause, parseSortClause, executeQueryDSL, } from "./query-dsl";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type Operator = "eq" | "neq" | "in" | "notIn" | "gt" | "lt" | "gte" | "lte" | "contains" | "startsWith" | "endsWith" | "regex" | "exists";
|
|
2
|
+
export declare const operators: Record<Operator, (actual: any, expected: any) => boolean>;
|
|
3
|
+
//# sourceMappingURL=operators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../src/query/operators.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,OAAO,GACP,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,KAAK,GACL,UAAU,GACV,YAAY,GACZ,UAAU,GACV,OAAO,GACP,QAAQ,CAAC;AAEb,eAAO,MAAM,SAAS,EAAE,MAAM,CAC5B,QAAQ,EACR,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,KAAK,OAAO,CAmBxC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const operators = {
|
|
2
|
+
eq: (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b),
|
|
3
|
+
neq: (a, b) => !operators.eq(a, b),
|
|
4
|
+
in: (a, b) => Array.isArray(b) && b.includes(a),
|
|
5
|
+
notIn: (a, b) => Array.isArray(b) && !b.includes(a),
|
|
6
|
+
gt: (a, b) => a > b,
|
|
7
|
+
lt: (a, b) => a < b,
|
|
8
|
+
gte: (a, b) => a >= b,
|
|
9
|
+
lte: (a, b) => a <= b,
|
|
10
|
+
contains: (a, b) => typeof a === "string" && a.includes(b),
|
|
11
|
+
startsWith: (a, b) => typeof a === "string" && a.startsWith(b),
|
|
12
|
+
endsWith: (a, b) => typeof a === "string" && a.endsWith(b),
|
|
13
|
+
regex: (a, b) => b instanceof RegExp
|
|
14
|
+
? b.test(String(a))
|
|
15
|
+
: new RegExp(b).test(String(a)),
|
|
16
|
+
exists: (a, b) => b ? a !== undefined && a !== null : a === undefined || a === null,
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=operators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators.js","sourceRoot":"","sources":["../../src/query/operators.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,SAAS,GAGlB;IACF,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAChE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAClC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC;IACnB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC;IACnB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;IACrB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9D,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACd,CAAC,YAAY,MAAM;QACjB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACf,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;CACpE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Operator } from "./operators";
|
|
2
|
+
export interface Condition {
|
|
3
|
+
path: string;
|
|
4
|
+
operator: Operator;
|
|
5
|
+
value: unknown;
|
|
6
|
+
}
|
|
7
|
+
export declare class QueryBuilder {
|
|
8
|
+
#private;
|
|
9
|
+
get conditions(): Condition[];
|
|
10
|
+
/**
|
|
11
|
+
* Add a where condition.
|
|
12
|
+
*
|
|
13
|
+
* Three call signatures:
|
|
14
|
+
* where({ "meta.status": "active" }) -- object shorthand, implicit eq
|
|
15
|
+
* where("meta.status", "active") -- two args, implicit eq
|
|
16
|
+
* where("meta.priority", "gt", 5) -- three args, explicit operator
|
|
17
|
+
*
|
|
18
|
+
* Always returns `this` for chaining (fixes bug in original).
|
|
19
|
+
*/
|
|
20
|
+
where(pathOrObject: string | Record<string, unknown>, operatorOrValue?: Operator | unknown, value?: unknown): this;
|
|
21
|
+
whereIn(path: string, values: unknown[]): this;
|
|
22
|
+
whereNotIn(path: string, values: unknown[]): this;
|
|
23
|
+
whereGt(path: string, value: unknown): this;
|
|
24
|
+
whereLt(path: string, value: unknown): this;
|
|
25
|
+
whereGte(path: string, value: unknown): this;
|
|
26
|
+
whereLte(path: string, value: unknown): this;
|
|
27
|
+
whereContains(path: string, value: string): this;
|
|
28
|
+
whereStartsWith(path: string, value: string): this;
|
|
29
|
+
whereEndsWith(path: string, value: string): this;
|
|
30
|
+
whereRegex(path: string, pattern: RegExp | string): this;
|
|
31
|
+
whereExists(path: string): this;
|
|
32
|
+
whereNotExists(path: string): this;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=query-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../src/query/query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,YAAY;;IAGvB,IAAI,UAAU,IAAI,SAAS,EAAE,CAE5B;IAED;;;;;;;;;OASG;IACH,KAAK,CACH,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9C,eAAe,CAAC,EAAE,QAAQ,GAAG,OAAO,EACpC,KAAK,CAAC,EAAE,OAAO,GACd,IAAI;IA0BP,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI;IAS9C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI;IAKjD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI3C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI3C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI5C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI5C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhD,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIlD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIxD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAGnC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export class QueryBuilder {
|
|
2
|
+
#conditions = [];
|
|
3
|
+
get conditions() {
|
|
4
|
+
return [...this.#conditions];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Add a where condition.
|
|
8
|
+
*
|
|
9
|
+
* Three call signatures:
|
|
10
|
+
* where({ "meta.status": "active" }) -- object shorthand, implicit eq
|
|
11
|
+
* where("meta.status", "active") -- two args, implicit eq
|
|
12
|
+
* where("meta.priority", "gt", 5) -- three args, explicit operator
|
|
13
|
+
*
|
|
14
|
+
* Always returns `this` for chaining (fixes bug in original).
|
|
15
|
+
*/
|
|
16
|
+
where(pathOrObject, operatorOrValue, value) {
|
|
17
|
+
if (typeof pathOrObject === "object" && pathOrObject !== null) {
|
|
18
|
+
for (const [k, v] of Object.entries(pathOrObject)) {
|
|
19
|
+
this.#conditions.push({ path: k, operator: "eq", value: v });
|
|
20
|
+
}
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
if (value === undefined) {
|
|
24
|
+
// Two-arg form: where("path", value) -- implicit eq
|
|
25
|
+
this.#conditions.push({
|
|
26
|
+
path: pathOrObject,
|
|
27
|
+
operator: "eq",
|
|
28
|
+
value: operatorOrValue,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// Three-arg form: where("path", operator, value)
|
|
33
|
+
this.#conditions.push({
|
|
34
|
+
path: pathOrObject,
|
|
35
|
+
operator: operatorOrValue,
|
|
36
|
+
value,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
whereIn(path, values) {
|
|
42
|
+
this.#conditions.push({
|
|
43
|
+
path,
|
|
44
|
+
operator: "in",
|
|
45
|
+
value: values.filter(Boolean),
|
|
46
|
+
});
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
whereNotIn(path, values) {
|
|
50
|
+
this.#conditions.push({ path, operator: "notIn", value: values });
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
whereGt(path, value) {
|
|
54
|
+
return this.where(path, "gt", value);
|
|
55
|
+
}
|
|
56
|
+
whereLt(path, value) {
|
|
57
|
+
return this.where(path, "lt", value);
|
|
58
|
+
}
|
|
59
|
+
whereGte(path, value) {
|
|
60
|
+
return this.where(path, "gte", value);
|
|
61
|
+
}
|
|
62
|
+
whereLte(path, value) {
|
|
63
|
+
return this.where(path, "lte", value);
|
|
64
|
+
}
|
|
65
|
+
whereContains(path, value) {
|
|
66
|
+
return this.where(path, "contains", value);
|
|
67
|
+
}
|
|
68
|
+
whereStartsWith(path, value) {
|
|
69
|
+
return this.where(path, "startsWith", value);
|
|
70
|
+
}
|
|
71
|
+
whereEndsWith(path, value) {
|
|
72
|
+
return this.where(path, "endsWith", value);
|
|
73
|
+
}
|
|
74
|
+
whereRegex(path, pattern) {
|
|
75
|
+
return this.where(path, "regex", pattern);
|
|
76
|
+
}
|
|
77
|
+
whereExists(path) {
|
|
78
|
+
return this.where(path, "exists", true);
|
|
79
|
+
}
|
|
80
|
+
whereNotExists(path) {
|
|
81
|
+
return this.where(path, "exists", false);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../src/query/query-builder.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,YAAY;IACvB,WAAW,GAAgB,EAAE,CAAC;IAE9B,IAAI,UAAU;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CACH,YAA8C,EAC9C,eAAoC,EACpC,KAAe;QAEf,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC9D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,oDAAoD;YACpD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,eAAe;aACvB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,eAA2B;gBACrC,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,MAAiB;QACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACpB,IAAI;YACJ,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,IAAY,EAAE,MAAiB;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,KAAc;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,KAAc;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,KAAc;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,KAAc;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,KAAa;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,KAAa;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,KAAa;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU,CAAC,IAAY,EAAE,OAAwB;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Collection } from "../collection";
|
|
3
|
+
import type { Condition } from "./query-builder";
|
|
4
|
+
export declare const queryDSLSchema: z.ZodObject<{
|
|
5
|
+
model: z.ZodString;
|
|
6
|
+
where: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>>;
|
|
7
|
+
sort: z.ZodOptional<z.ZodUnion<readonly [z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
8
|
+
asc: "asc";
|
|
9
|
+
desc: "desc";
|
|
10
|
+
}>>, z.ZodArray<z.ZodObject<{
|
|
11
|
+
path: z.ZodString;
|
|
12
|
+
direction: z.ZodDefault<z.ZodEnum<{
|
|
13
|
+
asc: "asc";
|
|
14
|
+
desc: "desc";
|
|
15
|
+
}>>;
|
|
16
|
+
}, z.core.$strip>>]>>;
|
|
17
|
+
select: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
18
|
+
related: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
19
|
+
scopes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
20
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
method: z.ZodDefault<z.ZodEnum<{
|
|
23
|
+
fetchAll: "fetchAll";
|
|
24
|
+
first: "first";
|
|
25
|
+
last: "last";
|
|
26
|
+
count: "count";
|
|
27
|
+
}>>;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
export type QueryDSL = z.infer<typeof queryDSLSchema>;
|
|
30
|
+
export declare function parseWhereClause(where: Record<string, unknown>): Condition[];
|
|
31
|
+
export declare function parseSortClause(sort: unknown): Array<{
|
|
32
|
+
path: string;
|
|
33
|
+
direction: "asc" | "desc";
|
|
34
|
+
}>;
|
|
35
|
+
export declare function executeQueryDSL(collection: Collection, dsl: QueryDSL): Promise<Record<string, unknown> | Record<string, unknown>[] | null>;
|
|
36
|
+
//# sourceMappingURL=query-dsl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-dsl.d.ts","sourceRoot":"","sources":["../../src/query/query-dsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAwEjD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;iBAYzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAMtD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,SAAS,EAAE,CA+Cb;AAMD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,GACZ,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAAC,CAapD;AA6BD,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,QAAQ,uEA+Dd"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveModelDef } from "../cli/commands/api/helpers.js";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Operator mapping: $dsl → internal
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
const OPERATOR_MAP = {
|
|
7
|
+
$eq: "eq",
|
|
8
|
+
$neq: "neq",
|
|
9
|
+
$in: "in",
|
|
10
|
+
$notIn: "notIn",
|
|
11
|
+
$gt: "gt",
|
|
12
|
+
$lt: "lt",
|
|
13
|
+
$gte: "gte",
|
|
14
|
+
$lte: "lte",
|
|
15
|
+
$contains: "contains",
|
|
16
|
+
$startsWith: "startsWith",
|
|
17
|
+
$endsWith: "endsWith",
|
|
18
|
+
$regex: "regex",
|
|
19
|
+
$exists: "exists",
|
|
20
|
+
};
|
|
21
|
+
const VALID_OPERATORS = new Set(Object.keys(OPERATOR_MAP));
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Security helpers
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
const FORBIDDEN_PATH_SEGMENTS = new Set([
|
|
26
|
+
"__proto__",
|
|
27
|
+
"constructor",
|
|
28
|
+
"prototype",
|
|
29
|
+
]);
|
|
30
|
+
const MAX_REGEX_LENGTH = 200;
|
|
31
|
+
function validatePath(path) {
|
|
32
|
+
const segments = path.split(".");
|
|
33
|
+
for (const seg of segments) {
|
|
34
|
+
if (FORBIDDEN_PATH_SEGMENTS.has(seg)) {
|
|
35
|
+
throw new Error(`Forbidden path segment "${seg}" in "${path}"`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Zod schema
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
const whereValueSchema = z.union([
|
|
43
|
+
z.string(),
|
|
44
|
+
z.number(),
|
|
45
|
+
z.boolean(),
|
|
46
|
+
z.null(),
|
|
47
|
+
z.array(z.unknown()),
|
|
48
|
+
z.record(z.string(), z.unknown()),
|
|
49
|
+
]);
|
|
50
|
+
const sortSchema = z.union([
|
|
51
|
+
z.record(z.string(), z.enum(["asc", "desc"])),
|
|
52
|
+
z.array(z.object({
|
|
53
|
+
path: z.string(),
|
|
54
|
+
direction: z.enum(["asc", "desc"]).default("asc"),
|
|
55
|
+
})),
|
|
56
|
+
]);
|
|
57
|
+
export const queryDSLSchema = z.object({
|
|
58
|
+
model: z.string(),
|
|
59
|
+
where: z.record(z.string(), whereValueSchema).optional(),
|
|
60
|
+
sort: sortSchema.optional(),
|
|
61
|
+
select: z.array(z.string()).optional(),
|
|
62
|
+
related: z.array(z.string()).optional(),
|
|
63
|
+
scopes: z.array(z.string()).optional(),
|
|
64
|
+
limit: z.number().int().min(0).optional(),
|
|
65
|
+
offset: z.number().int().min(0).optional(),
|
|
66
|
+
method: z
|
|
67
|
+
.enum(["fetchAll", "first", "last", "count"])
|
|
68
|
+
.default("fetchAll"),
|
|
69
|
+
});
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
// Parser: where object → Condition[]
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
export function parseWhereClause(where) {
|
|
74
|
+
const conditions = [];
|
|
75
|
+
for (const [path, value] of Object.entries(where)) {
|
|
76
|
+
validatePath(path);
|
|
77
|
+
if (value === null ||
|
|
78
|
+
typeof value === "string" ||
|
|
79
|
+
typeof value === "number" ||
|
|
80
|
+
typeof value === "boolean") {
|
|
81
|
+
// Literal → implicit $eq
|
|
82
|
+
conditions.push({ path, operator: "eq", value });
|
|
83
|
+
}
|
|
84
|
+
else if (Array.isArray(value)) {
|
|
85
|
+
// Array → implicit $in
|
|
86
|
+
conditions.push({ path, operator: "in", value });
|
|
87
|
+
}
|
|
88
|
+
else if (typeof value === "object" && value !== null) {
|
|
89
|
+
// Operator object: { "$gt": 5, "$lte": 10 }
|
|
90
|
+
for (const [opKey, opValue] of Object.entries(value)) {
|
|
91
|
+
if (!VALID_OPERATORS.has(opKey)) {
|
|
92
|
+
throw new Error(`Unknown operator: ${opKey}. Valid: ${[...VALID_OPERATORS].join(", ")}`);
|
|
93
|
+
}
|
|
94
|
+
const operator = OPERATOR_MAP[opKey];
|
|
95
|
+
// Regex length guard
|
|
96
|
+
if (operator === "regex" &&
|
|
97
|
+
typeof opValue === "string" &&
|
|
98
|
+
opValue.length > MAX_REGEX_LENGTH) {
|
|
99
|
+
throw new Error(`Regex pattern exceeds maximum length of ${MAX_REGEX_LENGTH} characters`);
|
|
100
|
+
}
|
|
101
|
+
conditions.push({ path, operator, value: opValue });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return conditions;
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// Parser: sort clause → SortSpec[]
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
export function parseSortClause(sort) {
|
|
111
|
+
if (Array.isArray(sort)) {
|
|
112
|
+
return sort;
|
|
113
|
+
}
|
|
114
|
+
if (typeof sort === "object" && sort !== null) {
|
|
115
|
+
return Object.entries(sort).map(([path, direction]) => ({
|
|
116
|
+
path,
|
|
117
|
+
direction: direction,
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// Select helper
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
function applySelect(instance, select, related) {
|
|
126
|
+
const json = instance.toJSON({ related });
|
|
127
|
+
if (!select || select.length === 0)
|
|
128
|
+
return json;
|
|
129
|
+
const filtered = {};
|
|
130
|
+
for (const key of select) {
|
|
131
|
+
if (key in json) {
|
|
132
|
+
filtered[key] = json[key];
|
|
133
|
+
}
|
|
134
|
+
else if (key.startsWith("meta.") && json.meta) {
|
|
135
|
+
filtered[key] = json.meta[key.slice(5)];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return filtered;
|
|
139
|
+
}
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// Executor
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
export async function executeQueryDSL(collection, dsl) {
|
|
144
|
+
const def = resolveModelDef(collection, dsl.model);
|
|
145
|
+
if (!def) {
|
|
146
|
+
throw new Error(`Unknown model: ${dsl.model}`);
|
|
147
|
+
}
|
|
148
|
+
let q = collection.query(def);
|
|
149
|
+
// Apply scopes first
|
|
150
|
+
if (dsl.scopes) {
|
|
151
|
+
for (const name of dsl.scopes) {
|
|
152
|
+
q = q.scope(name);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Apply where conditions
|
|
156
|
+
if (dsl.where) {
|
|
157
|
+
const conditions = parseWhereClause(dsl.where);
|
|
158
|
+
for (const cond of conditions) {
|
|
159
|
+
q = q.where(cond.path, cond.operator, cond.value);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Apply sorts
|
|
163
|
+
if (dsl.sort) {
|
|
164
|
+
const sorts = parseSortClause(dsl.sort);
|
|
165
|
+
for (const { path, direction } of sorts) {
|
|
166
|
+
q = q.sort(path, direction);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Apply pagination
|
|
170
|
+
if (dsl.limit !== undefined) {
|
|
171
|
+
q = q.limit(dsl.limit);
|
|
172
|
+
}
|
|
173
|
+
if (dsl.offset !== undefined) {
|
|
174
|
+
q = q.offset(dsl.offset);
|
|
175
|
+
}
|
|
176
|
+
// Execute based on method
|
|
177
|
+
switch (dsl.method) {
|
|
178
|
+
case "count":
|
|
179
|
+
return { count: await q.count() };
|
|
180
|
+
case "first": {
|
|
181
|
+
const result = await q.first();
|
|
182
|
+
return result ? applySelect(result, dsl.select, dsl.related) : null;
|
|
183
|
+
}
|
|
184
|
+
case "last": {
|
|
185
|
+
const result = await q.last();
|
|
186
|
+
return result ? applySelect(result, dsl.select, dsl.related) : null;
|
|
187
|
+
}
|
|
188
|
+
case "fetchAll":
|
|
189
|
+
default: {
|
|
190
|
+
const results = await q.fetchAll();
|
|
191
|
+
return results.map((instance) => applySelect(instance, dsl.select, dsl.related));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=query-dsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-dsl.js","sourceRoot":"","sources":["../../src/query/query-dsl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Document } from "../document";
|
|
2
|
+
import type { Collection } from "../collection";
|
|
3
|
+
import type { BelongsToDefinition, ModelDefinition, InferModelInstance, BelongsToAccessor, ModelInstanceFactory } from "../types";
|
|
4
|
+
export declare class BelongsToRelationship<TTarget extends ModelDefinition<any, any, any, any, any>> implements BelongsToAccessor<TTarget> {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(document: Document, collection: Collection, definition: BelongsToDefinition<TTarget>, factory: ModelInstanceFactory, sourceDef: ModelDefinition<any, any, any, any, any>);
|
|
7
|
+
fetch(): InferModelInstance<TTarget>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=belongs-to.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"belongs-to.d.ts","sourceRoot":"","sources":["../../src/relationships/belongs-to.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAElB,qBAAa,qBAAqB,CAChC,OAAO,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CACxD,YAAW,iBAAiB,CAAC,OAAO,CAAC;;gBASnC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,mBAAmB,CAAC,OAAO,CAAC,EACxC,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IASrD,KAAK,IAAI,kBAAkB,CAAC,OAAO,CAAC;CAuBrC"}
|