@thisisagile/easy-mongo 17.26.1 → 17.26.3
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/AtlasSearchGateway.mjs +59 -0
- package/dist/AtlasSearchGateway.mjs.map +1 -0
- package/dist/Collection.mjs +57 -0
- package/dist/Collection.mjs.map +1 -0
- package/dist/Lucene.mjs +8 -0
- package/dist/Lucene.mjs.map +1 -0
- package/dist/MongoGateway.mjs +9 -0
- package/dist/MongoGateway.mjs.map +1 -0
- package/dist/MongoProvider.mjs +8 -0
- package/dist/MongoProvider.mjs.map +1 -0
- package/dist/Stages.mjs +18 -0
- package/dist/Stages.mjs.map +1 -0
- package/dist/Utils.mjs +7 -0
- package/dist/Utils.mjs.map +1 -0
- package/dist/chunk-GFBKWYDV.mjs +65 -0
- package/dist/chunk-GFBKWYDV.mjs.map +1 -0
- package/dist/chunk-J3OXGWPD.mjs +129 -0
- package/dist/chunk-J3OXGWPD.mjs.map +1 -0
- package/dist/chunk-MZE7UWQC.mjs +13 -0
- package/dist/chunk-MZE7UWQC.mjs.map +1 -0
- package/dist/chunk-P372VCR6.mjs +157 -0
- package/dist/chunk-P372VCR6.mjs.map +1 -0
- package/dist/chunk-WEJO6T5Q.mjs +155 -0
- package/dist/chunk-WEJO6T5Q.mjs.map +1 -0
- package/dist/index.mjs +7 -587
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -14
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import {
|
|
2
|
+
lucene
|
|
3
|
+
} from "./chunk-J3OXGWPD.mjs";
|
|
4
|
+
import {
|
|
5
|
+
MongoGateway
|
|
6
|
+
} from "./chunk-GFBKWYDV.mjs";
|
|
7
|
+
import {
|
|
8
|
+
stages
|
|
9
|
+
} from "./chunk-WEJO6T5Q.mjs";
|
|
10
|
+
import "./chunk-MZE7UWQC.mjs";
|
|
11
|
+
|
|
12
|
+
// src/AtlasSearchGateway.ts
|
|
13
|
+
import { asNumber, entries, text, toPageList, tuple2 } from "@thisisagile/easy";
|
|
14
|
+
var { skip, take } = stages.skip;
|
|
15
|
+
var { replaceWith } = stages.replaceWith;
|
|
16
|
+
var { searchWithDef, searchMeta, facets } = lucene;
|
|
17
|
+
var toFilters = (facets2) => entries(facets2).map(([k, fs]) => ({
|
|
18
|
+
label: text(k).title.toString(),
|
|
19
|
+
field: k,
|
|
20
|
+
values: fs.map((f) => toValue(f))
|
|
21
|
+
}));
|
|
22
|
+
var toValue = (f) => ({ label: f._id ?? "unknown", value: f._id ?? "unknown", count: f.count });
|
|
23
|
+
var AtlasSearchGateway = class extends MongoGateway {
|
|
24
|
+
constructor(collection, searchDef, sortDef = {}, provider = collection.provider) {
|
|
25
|
+
super(collection, provider);
|
|
26
|
+
this.searchDef = searchDef;
|
|
27
|
+
this.sortDef = sortDef;
|
|
28
|
+
}
|
|
29
|
+
query(query, additionalStages = []) {
|
|
30
|
+
return tuple2(
|
|
31
|
+
this.aggregate(
|
|
32
|
+
searchWithDef(query, this.searchDef),
|
|
33
|
+
skip({ skip: query?.skip ?? 0 }),
|
|
34
|
+
take({ take: query?.take ?? 250 }),
|
|
35
|
+
...additionalStages
|
|
36
|
+
),
|
|
37
|
+
this.aggregate(
|
|
38
|
+
searchMeta(query, this.searchDef),
|
|
39
|
+
replaceWith({
|
|
40
|
+
total: "$count.total",
|
|
41
|
+
facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {})
|
|
42
|
+
})
|
|
43
|
+
)
|
|
44
|
+
).then(([data, meta]) => ({ data, meta: meta.first() })).then(
|
|
45
|
+
({ data, meta }) => toPageList(data, {
|
|
46
|
+
total: asNumber(meta?.total, 0),
|
|
47
|
+
skip: asNumber(query?.skip, 0),
|
|
48
|
+
take: asNumber(query?.take, 250),
|
|
49
|
+
sorts: Object.keys(this.sortDef),
|
|
50
|
+
filters: toFilters(meta.facets)
|
|
51
|
+
})
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
export {
|
|
56
|
+
AtlasSearchGateway,
|
|
57
|
+
toFilters
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=AtlasSearchGateway.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/AtlasSearchGateway.ts"],"sourcesContent":["import { stages } from './Stages';\nimport { MongoGateway } from './MongoGateway';\nimport { Collection } from './Collection';\nimport { MongoProvider } from './MongoProvider';\nimport { lucene, SearchDefinition } from './Lucene';\nimport { asNumber, entries, Filter, Json, PageList, text, toPageList, tuple2 } from '@thisisagile/easy';\nimport { Filter as MongoFilter} from '../src/MongoProvider';\n\nconst { skip, take } = stages.skip;\nconst { replaceWith } = stages.replaceWith;\nconst { searchWithDef, searchMeta, facets } = lucene;\n\ntype FacetResult = { _id: string; count: number };\ntype Value = { label: string; value: string; count: number };\nexport const toFilters = (facets: unknown): Filter[] =>\n entries(facets as Record<string, unknown>).map(([k, fs]) => ({\n label: text(k).title.toString(),\n field: k,\n values: (fs as []).map((f: FacetResult) => toValue(f)),\n }));\n\nconst toValue = (f: FacetResult): Value => ({ label: f._id ?? 'unknown', value: f._id ?? 'unknown', count: f.count });\n\nexport class AtlasSearchGateway extends MongoGateway {\n constructor(\n collection: Collection,\n readonly searchDef: SearchDefinition,\n readonly sortDef: Record<string, Record<string, 1 | -1>> = {},\n provider: MongoProvider = collection.provider\n ) {\n super(collection, provider);\n }\n\n query(query: Record<keyof typeof this.searchDef, string | number>, additionalStages: MongoFilter[] = []): Promise<PageList<Json>> {\n return tuple2(\n this.aggregate(\n searchWithDef(query, this.searchDef),\n skip({ skip: (query?.skip as number) ?? 0 }),\n take({ take: (query?.take as number) ?? 250 }),\n ...additionalStages\n ),\n this.aggregate(\n searchMeta(query, this.searchDef),\n replaceWith({\n total: '$count.total',\n facets: Object.keys(facets(this.searchDef)).reduce((acc, k) => ({ ...acc, [k]: `$facet.${k}.buckets` }), {}),\n })\n )\n )\n .then(([data, meta]) => ({ data, meta: meta.first() }))\n .then(({ data, meta }) =>\n toPageList<Json>(data, {\n total: asNumber(meta?.total, 0),\n skip: asNumber(query?.skip, 0),\n take: asNumber(query?.take, 250),\n sorts: Object.keys(this.sortDef),\n filters: toFilters(meta.facets),\n })\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAKA,SAAS,UAAU,SAAiC,MAAM,YAAY,cAAc;AAGpF,IAAM,EAAE,MAAM,KAAK,IAAI,OAAO;AAC9B,IAAM,EAAE,YAAY,IAAI,OAAO;AAC/B,IAAM,EAAE,eAAe,YAAY,OAAO,IAAI;AAIvC,IAAM,YAAY,CAACA,YACxB,QAAQA,OAAiC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO;AAAA,EAC3D,OAAO,KAAK,CAAC,EAAE,MAAM,SAAS;AAAA,EAC9B,OAAO;AAAA,EACP,QAAS,GAAU,IAAI,CAAC,MAAmB,QAAQ,CAAC,CAAC;AACvD,EAAE;AAEJ,IAAM,UAAU,CAAC,OAA2B,EAAE,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,OAAO,WAAW,OAAO,EAAE,MAAM;AAE5G,IAAM,qBAAN,cAAiC,aAAa;AAAA,EACnD,YACE,YACS,WACA,UAAkD,CAAC,GAC5D,WAA0B,WAAW,UACrC;AACA,UAAM,YAAY,QAAQ;AAJjB;AACA;AAAA,EAIX;AAAA,EAEA,MAAM,OAA6D,mBAAkC,CAAC,GAA4B;AAChI,WAAO;AAAA,MACL,KAAK;AAAA,QACH,cAAc,OAAO,KAAK,SAAS;AAAA,QACnC,KAAK,EAAE,MAAO,OAAO,QAAmB,EAAE,CAAC;AAAA,QAC3C,KAAK,EAAE,MAAO,OAAO,QAAmB,IAAI,CAAC;AAAA,QAC7C,GAAG;AAAA,MACL;AAAA,MACA,KAAK;AAAA,QACH,WAAW,OAAO,KAAK,SAAS;AAAA,QAChC,YAAY;AAAA,UACV,OAAO;AAAA,UACP,QAAQ,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,CAAC,KAAK,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;AAAA,QAC7G,CAAC;AAAA,MACH;AAAA,IACF,EACG,KAAK,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,MAAM,KAAK,MAAM,EAAE,EAAE,EACrD;AAAA,MAAK,CAAC,EAAE,MAAM,KAAK,MAClB,WAAiB,MAAM;AAAA,QACrB,OAAO,SAAS,MAAM,OAAO,CAAC;AAAA,QAC9B,MAAM,SAAS,OAAO,MAAM,CAAC;AAAA,QAC7B,MAAM,SAAS,OAAO,MAAM,GAAG;AAAA,QAC/B,OAAO,OAAO,KAAK,KAAK,OAAO;AAAA,QAC/B,SAAS,UAAU,KAAK,MAAM;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACJ;AACF;","names":["facets"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MongoProvider
|
|
3
|
+
} from "./chunk-P372VCR6.mjs";
|
|
4
|
+
import {
|
|
5
|
+
toMongoType
|
|
6
|
+
} from "./chunk-MZE7UWQC.mjs";
|
|
7
|
+
|
|
8
|
+
// src/Collection.ts
|
|
9
|
+
import {
|
|
10
|
+
asString,
|
|
11
|
+
Database,
|
|
12
|
+
Field,
|
|
13
|
+
LogicalCondition,
|
|
14
|
+
Mapper,
|
|
15
|
+
mappings,
|
|
16
|
+
ofGet,
|
|
17
|
+
toCondition,
|
|
18
|
+
toUuid
|
|
19
|
+
} from "@thisisagile/easy";
|
|
20
|
+
var Collection = class extends Mapper {
|
|
21
|
+
map = {
|
|
22
|
+
...mappings,
|
|
23
|
+
field: (name, options) => new Field(name, options)
|
|
24
|
+
};
|
|
25
|
+
id = this.map.field("id", { dflt: toUuid });
|
|
26
|
+
constructor(options = { startFrom: "source" }) {
|
|
27
|
+
super(options);
|
|
28
|
+
}
|
|
29
|
+
get db() {
|
|
30
|
+
return Database.Default;
|
|
31
|
+
}
|
|
32
|
+
get provider() {
|
|
33
|
+
return new MongoProvider(this);
|
|
34
|
+
}
|
|
35
|
+
where = (...conditions) => new LogicalCondition(
|
|
36
|
+
"and",
|
|
37
|
+
conditions.map((c) => ofGet(c, this))
|
|
38
|
+
).toJSON();
|
|
39
|
+
match = (condition) => ({ $match: ofGet(condition, this).toJSON() });
|
|
40
|
+
group = (...conditions) => new LogicalCondition(
|
|
41
|
+
"group",
|
|
42
|
+
conditions.map((c) => ofGet(c, this))
|
|
43
|
+
).toJSON();
|
|
44
|
+
google = (value) => toCondition("$text", "search", value);
|
|
45
|
+
search = (key) => this.map.field(asString(key));
|
|
46
|
+
sort = (...conditions) => conditions.reduce((cs, c) => {
|
|
47
|
+
cs[c.key] = c.value;
|
|
48
|
+
return cs;
|
|
49
|
+
}, {});
|
|
50
|
+
out(to = {}) {
|
|
51
|
+
return toMongoType(super.out(to));
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
export {
|
|
55
|
+
Collection
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=Collection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Collection.ts"],"sourcesContent":["import {\n asString,\n Condition,\n Database,\n Field,\n Get,\n Json,\n LogicalCondition,\n MapOptions,\n Mapper,\n mappings,\n ofGet,\n PropertyOptions,\n Sort,\n SortDirection,\n Text,\n toCondition,\n toUuid,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\nimport { MongoProvider } from './MongoProvider';\n\nexport class Collection extends Mapper {\n protected readonly map = {\n ...mappings,\n field: <T = unknown>(name: string, options?: PropertyOptions<T>): Field => new Field(name, options),\n };\n readonly id = this.map.field('id', { dflt: toUuid });\n\n constructor(options: MapOptions = { startFrom: 'source' }) {\n super(options);\n }\n\n get db(): Database {\n return Database.Default;\n }\n\n get provider(): MongoProvider {\n return new MongoProvider(this);\n }\n\n where = (...conditions: Get<Condition, this>[]): Json =>\n new LogicalCondition(\n 'and',\n conditions.map(c => ofGet(c, this))\n ).toJSON();\n\n match = (condition: Get<Condition | LogicalCondition, this>): Json => ({ $match: ofGet(condition, this).toJSON() });\n\n group = (...conditions: Get<Condition, this>[]): Json =>\n new LogicalCondition(\n 'group',\n conditions.map(c => ofGet(c, this))\n ).toJSON();\n\n google = (value: unknown): Condition => toCondition('$text', 'search', value);\n\n search = (key: Text): Field => this.map.field(asString(key));\n\n sort = (...conditions: Sort[]): Record<string, SortDirection> =>\n conditions.reduce((cs: any, c) => {\n cs[c.key] = c.value;\n return cs;\n }, {});\n\n out(to: Json = {}): Json {\n return toMongoType(super.out(to));\n }\n}\n"],"mappings":";;;;;;;;AAAA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EAGA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAKA;AAAA,EACA;AAAA,OACK;AAIA,IAAM,aAAN,cAAyB,OAAO;AAAA,EAClB,MAAM;AAAA,IACvB,GAAG;AAAA,IACH,OAAO,CAAc,MAAc,YAAwC,IAAI,MAAM,MAAM,OAAO;AAAA,EACpG;AAAA,EACS,KAAK,KAAK,IAAI,MAAM,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EAEnD,YAAY,UAAsB,EAAE,WAAW,SAAS,GAAG;AACzD,UAAM,OAAO;AAAA,EACf;AAAA,EAEA,IAAI,KAAe;AACjB,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,IAAI,WAA0B;AAC5B,WAAO,IAAI,cAAc,IAAI;AAAA,EAC/B;AAAA,EAEA,QAAQ,IAAI,eACV,IAAI;AAAA,IACF;AAAA,IACA,WAAW,IAAI,OAAK,MAAM,GAAG,IAAI,CAAC;AAAA,EACpC,EAAE,OAAO;AAAA,EAEX,QAAQ,CAAC,eAA8D,EAAE,QAAQ,MAAM,WAAW,IAAI,EAAE,OAAO,EAAE;AAAA,EAEjH,QAAQ,IAAI,eACV,IAAI;AAAA,IACF;AAAA,IACA,WAAW,IAAI,OAAK,MAAM,GAAG,IAAI,CAAC;AAAA,EACpC,EAAE,OAAO;AAAA,EAEX,SAAS,CAAC,UAA8B,YAAY,SAAS,UAAU,KAAK;AAAA,EAE5E,SAAS,CAAC,QAAqB,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC;AAAA,EAE3D,OAAO,IAAI,eACT,WAAW,OAAO,CAAC,IAAS,MAAM;AAChC,OAAG,EAAE,GAAG,IAAI,EAAE;AACd,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAAA,EAEP,IAAI,KAAW,CAAC,GAAS;AACvB,WAAO,YAAY,MAAM,IAAI,EAAE,CAAC;AAAA,EAClC;AACF;","names":[]}
|
package/dist/Lucene.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/Stages.mjs
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FilterBuilder,
|
|
3
|
+
IncludeBuilder,
|
|
4
|
+
SortBuilder,
|
|
5
|
+
asc,
|
|
6
|
+
desc,
|
|
7
|
+
stages
|
|
8
|
+
} from "./chunk-WEJO6T5Q.mjs";
|
|
9
|
+
import "./chunk-MZE7UWQC.mjs";
|
|
10
|
+
export {
|
|
11
|
+
FilterBuilder,
|
|
12
|
+
IncludeBuilder,
|
|
13
|
+
SortBuilder,
|
|
14
|
+
asc,
|
|
15
|
+
desc,
|
|
16
|
+
stages
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=Stages.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/Utils.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
stages
|
|
3
|
+
} from "./chunk-WEJO6T5Q.mjs";
|
|
4
|
+
|
|
5
|
+
// src/MongoGateway.ts
|
|
6
|
+
import {
|
|
7
|
+
asJson,
|
|
8
|
+
ifDefined,
|
|
9
|
+
isDefined,
|
|
10
|
+
isPresent,
|
|
11
|
+
toArray
|
|
12
|
+
} from "@thisisagile/easy";
|
|
13
|
+
var MongoGateway = class {
|
|
14
|
+
constructor(collection, provider = collection.provider) {
|
|
15
|
+
this.collection = collection;
|
|
16
|
+
this.provider = provider;
|
|
17
|
+
}
|
|
18
|
+
all(options) {
|
|
19
|
+
return this.provider.all(options).then((js) => js.map((j) => this.collection.in(j)));
|
|
20
|
+
}
|
|
21
|
+
byId(id) {
|
|
22
|
+
return this.provider.byId(id).then((j) => ifDefined(j, this.collection.in(j)));
|
|
23
|
+
}
|
|
24
|
+
by(key, value, options) {
|
|
25
|
+
return this.provider.by(key, value, options).then((js) => js.map((j) => this.collection.in(j)));
|
|
26
|
+
}
|
|
27
|
+
byIds(...ids) {
|
|
28
|
+
return this.find(this.collection.id.isIn(...ids));
|
|
29
|
+
}
|
|
30
|
+
find(q, options) {
|
|
31
|
+
return this.provider.find(asJson(q), options).then((js) => js.map((j) => this.collection.in(j)));
|
|
32
|
+
}
|
|
33
|
+
search(q, options) {
|
|
34
|
+
return this.find(this.collection.google(q), options);
|
|
35
|
+
}
|
|
36
|
+
filter(options) {
|
|
37
|
+
return this.all(options);
|
|
38
|
+
}
|
|
39
|
+
exists(id) {
|
|
40
|
+
return this.provider.byId(id).then((i) => isDefined(i));
|
|
41
|
+
}
|
|
42
|
+
aggregate(...filters) {
|
|
43
|
+
return this.provider.aggregate(toArray(...filters).filter(isPresent));
|
|
44
|
+
}
|
|
45
|
+
count(...filters) {
|
|
46
|
+
return this.aggregate(...filters, { $count: "total" }).then((d) => d.first()?.total ?? 0);
|
|
47
|
+
}
|
|
48
|
+
match(f) {
|
|
49
|
+
return this.aggregate(stages.match.match(f));
|
|
50
|
+
}
|
|
51
|
+
add(item) {
|
|
52
|
+
return this.provider.add(this.collection.out(item)).then((j) => this.collection.in(j));
|
|
53
|
+
}
|
|
54
|
+
update(item) {
|
|
55
|
+
return this.provider.update(this.collection.out(item)).then((j) => this.collection.in(j));
|
|
56
|
+
}
|
|
57
|
+
remove(id) {
|
|
58
|
+
return this.provider.remove(id);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
MongoGateway
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=chunk-GFBKWYDV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/MongoGateway.ts"],"sourcesContent":["import { Filter, FindOptions, MongoProvider } from './MongoProvider';\nimport {\n asJson,\n Condition,\n Gateway,\n Id,\n ifDefined,\n isDefined,\n isPresent,\n Json,\n JsonValue,\n List,\n LogicalCondition,\n Optional,\n PageList,\n toArray,\n} from '@thisisagile/easy';\nimport { Collection } from './Collection';\nimport { stages } from './Stages';\n\nexport class MongoGateway implements Gateway<FindOptions> {\n constructor(readonly collection: Collection, readonly provider: MongoProvider = collection.provider) {}\n\n all(options?: FindOptions): Promise<PageList<Json>> {\n return this.provider.all(options).then(js => js.map(j => this.collection.in(j)));\n }\n\n byId(id: Id): Promise<Json | undefined> {\n return this.provider.byId(id).then(j => ifDefined(j, this.collection.in(j)));\n }\n\n by(key: string, value: JsonValue, options?: FindOptions): Promise<PageList<Json>> {\n return this.provider.by(key, value, options).then(js => js.map(j => this.collection.in(j)));\n }\n\n byIds(...ids: Id[]): Promise<List<Json>> {\n return this.find(this.collection.id.isIn(...ids));\n }\n\n find(q: JsonValue | Condition | LogicalCondition, options?: FindOptions): Promise<PageList<Json>> {\n return this.provider.find(asJson(q), options).then(js => js.map(j => this.collection.in(j)));\n }\n\n search(q: JsonValue, options?: FindOptions): Promise<PageList<Json>> {\n return this.find(this.collection.google(q), options);\n }\n\n filter(options?: FindOptions): Promise<PageList<Json>> {\n return this.all(options);\n }\n\n exists(id: Id): Promise<boolean> {\n return this.provider.byId(id).then(i => isDefined(i));\n }\n\n aggregate(...filters: Optional<Filter>[]): Promise<PageList<Json>> {\n return this.provider.aggregate(toArray(...filters).filter(isPresent) as Filter[]);\n }\n\n count(...filters: Optional<Filter>[]): Promise<number> {\n return this.aggregate(...filters, { $count: 'total' }).then(d => (d.first()?.total as number) ?? 0);\n }\n\n match(f: Filter): Promise<PageList<Json>> {\n return this.aggregate(stages.match.match(f));\n }\n\n add(item: Json): Promise<Json> {\n return this.provider.add(this.collection.out(item)).then(j => this.collection.in(j));\n }\n\n update(item: Json): Promise<Json> {\n return this.provider.update(this.collection.out(item)).then(j => this.collection.in(j));\n }\n\n remove(id: Id): Promise<boolean> {\n return this.provider.remove(id);\n }\n}\n"],"mappings":";;;;;AACA;AAAA,EACE;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EAOA;AAAA,OACK;AAIA,IAAM,eAAN,MAAmD;AAAA,EACxD,YAAqB,YAAiC,WAA0B,WAAW,UAAU;AAAhF;AAAiC;AAAA,EAAgD;AAAA,EAEtG,IAAI,SAAgD;AAClD,WAAO,KAAK,SAAS,IAAI,OAAO,EAAE,KAAK,QAAM,GAAG,IAAI,OAAK,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC;AAAA,EACjF;AAAA,EAEA,KAAK,IAAmC;AACtC,WAAO,KAAK,SAAS,KAAK,EAAE,EAAE,KAAK,OAAK,UAAU,GAAG,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC;AAAA,EAC7E;AAAA,EAEA,GAAG,KAAa,OAAkB,SAAgD;AAChF,WAAO,KAAK,SAAS,GAAG,KAAK,OAAO,OAAO,EAAE,KAAK,QAAM,GAAG,IAAI,OAAK,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC;AAAA,EAC5F;AAAA,EAEA,SAAS,KAAgC;AACvC,WAAO,KAAK,KAAK,KAAK,WAAW,GAAG,KAAK,GAAG,GAAG,CAAC;AAAA,EAClD;AAAA,EAEA,KAAK,GAA6C,SAAgD;AAChG,WAAO,KAAK,SAAS,KAAK,OAAO,CAAC,GAAG,OAAO,EAAE,KAAK,QAAM,GAAG,IAAI,OAAK,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC;AAAA,EAC7F;AAAA,EAEA,OAAO,GAAc,SAAgD;AACnE,WAAO,KAAK,KAAK,KAAK,WAAW,OAAO,CAAC,GAAG,OAAO;AAAA,EACrD;AAAA,EAEA,OAAO,SAAgD;AACrD,WAAO,KAAK,IAAI,OAAO;AAAA,EACzB;AAAA,EAEA,OAAO,IAA0B;AAC/B,WAAO,KAAK,SAAS,KAAK,EAAE,EAAE,KAAK,OAAK,UAAU,CAAC,CAAC;AAAA,EACtD;AAAA,EAEA,aAAa,SAAsD;AACjE,WAAO,KAAK,SAAS,UAAU,QAAQ,GAAG,OAAO,EAAE,OAAO,SAAS,CAAa;AAAA,EAClF;AAAA,EAEA,SAAS,SAA8C;AACrD,WAAO,KAAK,UAAU,GAAG,SAAS,EAAE,QAAQ,QAAQ,CAAC,EAAE,KAAK,OAAM,EAAE,MAAM,GAAG,SAAoB,CAAC;AAAA,EACpG;AAAA,EAEA,MAAM,GAAoC;AACxC,WAAO,KAAK,UAAU,OAAO,MAAM,MAAM,CAAC,CAAC;AAAA,EAC7C;AAAA,EAEA,IAAI,MAA2B;AAC7B,WAAO,KAAK,SAAS,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,EAAE,KAAK,OAAK,KAAK,WAAW,GAAG,CAAC,CAAC;AAAA,EACrF;AAAA,EAEA,OAAO,MAA2B;AAChC,WAAO,KAAK,SAAS,OAAO,KAAK,WAAW,IAAI,IAAI,CAAC,EAAE,KAAK,OAAK,KAAK,WAAW,GAAG,CAAC,CAAC;AAAA,EACxF;AAAA,EAEA,OAAO,IAA0B;AAC/B,WAAO,KAAK,SAAS,OAAO,EAAE;AAAA,EAChC;AACF;","names":[]}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import {
|
|
2
|
+
toMongoType
|
|
3
|
+
} from "./chunk-MZE7UWQC.mjs";
|
|
4
|
+
|
|
5
|
+
// src/Lucene.ts
|
|
6
|
+
import {
|
|
7
|
+
entries,
|
|
8
|
+
ifDefined,
|
|
9
|
+
ifNotEmpty,
|
|
10
|
+
ifTrue,
|
|
11
|
+
isDefined,
|
|
12
|
+
isEmptyObject,
|
|
13
|
+
isFunction,
|
|
14
|
+
on,
|
|
15
|
+
toArray,
|
|
16
|
+
toList
|
|
17
|
+
} from "@thisisagile/easy";
|
|
18
|
+
var should = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.should);
|
|
19
|
+
var must = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.must);
|
|
20
|
+
var mustNot = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.mustNot);
|
|
21
|
+
var filter = (query, def) => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.filter);
|
|
22
|
+
var lucene = {
|
|
23
|
+
clause: (c) => entries(c).reduce((res, [k, v]) => res.add(isFunction(v) ? v(k) : v), toList()),
|
|
24
|
+
clauses: (cs) => toArray(cs).flatMap((c) => lucene.clause(c)),
|
|
25
|
+
compound: (query, def, wildcard = true) => ifNotEmpty(
|
|
26
|
+
entries({
|
|
27
|
+
should: should(query, def),
|
|
28
|
+
filter: filter(query, def),
|
|
29
|
+
mustNot: mustNot(query, def),
|
|
30
|
+
must: must(query, def)
|
|
31
|
+
}).filter(([_, v]) => v.length > 0),
|
|
32
|
+
(e) => e.reduce((res, [k, v]) => on(res, (r) => r[k] = lucene.clauses(v)), should(query, def).length > 0 ? { minimumShouldMatch: 1 } : {}),
|
|
33
|
+
() => ifTrue(wildcard, () => ({
|
|
34
|
+
should: lucene.clauses([{ wildcard: lucene.wildcard() }]),
|
|
35
|
+
minimumShouldMatch: 0
|
|
36
|
+
}))
|
|
37
|
+
),
|
|
38
|
+
search: (c, index) => ({
|
|
39
|
+
$search: {
|
|
40
|
+
...ifDefined(index, { index }),
|
|
41
|
+
compound: entries(c).reduce((res, [k, v]) => on(res, (r) => r[k] = lucene.clauses(v)), {})
|
|
42
|
+
}
|
|
43
|
+
}),
|
|
44
|
+
searchWithDef: (query, options, count = "total", index) => {
|
|
45
|
+
const sort = entries(query).mapDefined(([k, v]) => options[k]?.(v, query)?.sort).first();
|
|
46
|
+
return {
|
|
47
|
+
$search: {
|
|
48
|
+
...ifDefined(index, { index }),
|
|
49
|
+
compound: lucene.compound(query, options),
|
|
50
|
+
...ifDefined(sort, { sort }),
|
|
51
|
+
count: { type: count }
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
searchMeta: (query, def, count = "total", index) => ({
|
|
56
|
+
$searchMeta: {
|
|
57
|
+
...ifDefined(index, { index }),
|
|
58
|
+
...ifTrue(
|
|
59
|
+
!isEmptyObject(lucene.facets(def)),
|
|
60
|
+
{
|
|
61
|
+
facet: {
|
|
62
|
+
operator: {
|
|
63
|
+
compound: lucene.compound(query, def)
|
|
64
|
+
},
|
|
65
|
+
facets: lucene.facets(def)
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
{ compound: lucene.compound(query, def) }
|
|
69
|
+
),
|
|
70
|
+
count: { type: count }
|
|
71
|
+
}
|
|
72
|
+
}),
|
|
73
|
+
exists: () => (path) => ({ exists: { path } }),
|
|
74
|
+
text: (value, fuzzy) => (path) => ifDefined(value, (v) => ({
|
|
75
|
+
text: {
|
|
76
|
+
path: path === "wildcard" ? { wildcard: "*" } : path,
|
|
77
|
+
query: v,
|
|
78
|
+
...ifDefined(fuzzy, { fuzzy })
|
|
79
|
+
}
|
|
80
|
+
})),
|
|
81
|
+
wildcard: (value, allowAnalyzedField = true) => (path) => ({
|
|
82
|
+
wildcard: {
|
|
83
|
+
path: path === "wildcard" ? { wildcard: "*" } : path,
|
|
84
|
+
query: ifDefined(value, value, "*"),
|
|
85
|
+
allowAnalyzedField
|
|
86
|
+
}
|
|
87
|
+
}),
|
|
88
|
+
lt: (value) => (path) => ifDefined(value, (lt) => ({ range: { path, lt } })),
|
|
89
|
+
lte: (value) => (path) => ifDefined(value, (lte) => ({ range: { path, lte } })),
|
|
90
|
+
gt: (value) => (path) => ifDefined(value, (gt) => ({ range: { path, gt } })),
|
|
91
|
+
gte: (value) => (path) => ifDefined(value, (gte) => ({ range: { path, gte } })),
|
|
92
|
+
after: (date) => lucene.gte(toMongoType(date)),
|
|
93
|
+
before: (date) => lucene.lt(toMongoType(date)),
|
|
94
|
+
between: (after, before, includeLimit) => (path) => {
|
|
95
|
+
const upperLimit = includeLimit ? { lte: toMongoType(before) } : { lt: toMongoType(before) };
|
|
96
|
+
return {
|
|
97
|
+
range: {
|
|
98
|
+
path,
|
|
99
|
+
gte: toMongoType(after),
|
|
100
|
+
...upperLimit
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
facets: (def) => entries(def).filter(([k, v]) => isDefined(v(k)?.facet)).map(([k, v]) => ({ [k]: v(k)?.facet })).reduce((acc, v) => ({ ...acc, ...v }), {}),
|
|
105
|
+
facet: {
|
|
106
|
+
string: (path, numBuckets = 1e3) => ({
|
|
107
|
+
type: "string",
|
|
108
|
+
path,
|
|
109
|
+
numBuckets
|
|
110
|
+
}),
|
|
111
|
+
number: (path, boundaries, alt) => ({
|
|
112
|
+
type: "number",
|
|
113
|
+
path,
|
|
114
|
+
boundaries,
|
|
115
|
+
...ifDefined(alt, (a) => ({ default: a }))
|
|
116
|
+
}),
|
|
117
|
+
date: (path, boundaries, alt) => ({
|
|
118
|
+
type: "date",
|
|
119
|
+
path,
|
|
120
|
+
boundaries: boundaries.mapDefined((b) => b.toDate()),
|
|
121
|
+
...ifDefined(alt, (a) => ({ default: a }))
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export {
|
|
127
|
+
lucene
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=chunk-J3OXGWPD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Lucene.ts"],"sourcesContent":["import {\n DateTime,\n entries,\n Func,\n ifDefined,\n ifNotEmpty,\n ifTrue,\n isDefined,\n isEmptyObject,\n isFunction,\n List,\n on,\n OneOrMore,\n Optional,\n RequireAtLeastOne,\n toArray,\n toList,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\n\ntype FuzzyOptions = {\n maxEdits: number;\n prefixLength: number;\n maxExpansions: number;\n};\n\nexport type Facet =\n | { path: string; type: 'string'; numBuckets: number }\n | { path: string; type: 'number'; boundaries: number[]; default?: string }\n | { path: string; type: 'date'; boundaries: Date[]; default?: string };\n\nexport type Operator = Func<Optional<object>, string>;\nexport type Clause = object | Operator;\nexport type Clauses = Record<string, Clause>;\nexport type SearchDefinition = Record<\n string,\n (\n v: string | number,\n q?: Record<string, string | number>\n ) => RequireAtLeastOne<{\n should?: Clauses;\n filter?: Clauses;\n must?: Clauses;\n mustNot?: Clauses;\n sort?: Record<string, 1 | -1>;\n facet?: Facet;\n }>\n>;\n\ntype Compound = {\n must: OneOrMore<Clauses>;\n should: OneOrMore<Clauses>;\n mustNot: OneOrMore<Clauses>;\n filter: OneOrMore<Clauses>;\n};\n\nconst should = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.should);\nconst must = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.must);\nconst mustNot = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] =>\n entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.mustNot);\nconst filter = (query: Record<string, string | number>, def: SearchDefinition): Clauses[] => entries(query).mapDefined(([k, v]) => def[k]?.(v, query)?.filter);\n\nexport const lucene = {\n clause: (c: Clauses) => entries(c).reduce((res, [k, v]) => res.add(isFunction(v) ? v(k) : v), toList()),\n clauses: (cs: OneOrMore<Clauses>) => toArray(cs).flatMap(c => lucene.clause(c)),\n compound: (query: Record<string, string | number>, def: SearchDefinition, wildcard = true): Partial<Compound> =>\n ifNotEmpty(\n entries({\n should: should(query, def),\n filter: filter(query, def),\n mustNot: mustNot(query, def),\n must: must(query, def),\n }).filter(([_, v]) => v.length > 0),\n e => e.reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), should(query, def).length > 0 ? { minimumShouldMatch: 1 } : ({} as any)),\n () =>\n ifTrue(wildcard, () => ({\n should: lucene.clauses([{ wildcard: lucene.wildcard() }]),\n minimumShouldMatch: 0,\n }))\n ),\n search: (c: Partial<Compound>, index?: string) => ({\n $search: {\n ...ifDefined(index, { index }),\n compound: entries(c).reduce((res, [k, v]) => on(res, r => (r[k] = lucene.clauses(v))), {} as any),\n },\n }),\n searchWithDef: (query: Record<string, string | number>, options: SearchDefinition, count: 'total' | 'lowerBound' = 'total', index?: string) => {\n const sort = entries(query)\n .mapDefined(([k, v]) => options[k]?.(v, query)?.sort)\n .first();\n return {\n $search: {\n ...ifDefined(index, { index }),\n compound: lucene.compound(query, options),\n ...ifDefined(sort, { sort }),\n count: { type: count },\n },\n };\n },\n searchMeta: (query: Record<string, string | number>, def: SearchDefinition, count: 'total' | 'lowerBound' = 'total', index?: string) => ({\n $searchMeta: {\n ...ifDefined(index, { index }),\n ...ifTrue(\n !isEmptyObject(lucene.facets(def)),\n {\n facet: {\n operator: {\n compound: lucene.compound(query, def),\n },\n facets: lucene.facets(def),\n },\n },\n { compound: lucene.compound(query, def) }\n ),\n count: { type: count },\n },\n }),\n exists: (): Operator => (path: string) => ({ exists: { path } }),\n text:\n (value?: OneOrMore<unknown>, fuzzy?: Partial<FuzzyOptions>): Operator =>\n (path: string) =>\n ifDefined(value, v => ({\n text: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: v,\n ...ifDefined(fuzzy, { fuzzy }),\n },\n })),\n wildcard:\n (value?: OneOrMore<unknown>, allowAnalyzedField = true): Operator =>\n (path: string) => ({\n wildcard: {\n path: path === 'wildcard' ? { wildcard: '*' } : path,\n query: ifDefined(value, value, '*'),\n allowAnalyzedField,\n },\n }),\n lt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lt => ({ range: { path, lt } })),\n lte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, lte => ({ range: { path, lte } })),\n gt:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gt => ({ range: { path, gt } })),\n gte:\n (value: unknown): Operator =>\n (path: string) =>\n ifDefined(value, gte => ({ range: { path, gte } })),\n after: (date: unknown): Operator => lucene.gte(toMongoType(date)),\n before: (date: unknown): Operator => lucene.lt(toMongoType(date)),\n between:\n (after: unknown, before: unknown, includeLimit?: boolean): Operator =>\n (path: string) => {\n const upperLimit = includeLimit ? { lte: toMongoType(before) } : { lt: toMongoType(before) };\n return {\n range: {\n path,\n gte: toMongoType(after),\n ...upperLimit,\n },\n };\n },\n facets: (def: SearchDefinition) =>\n entries(def)\n .filter(([k, v]) => isDefined(v(k)?.facet))\n .map(([k, v]) => ({ [k]: v(k)?.facet }))\n .reduce((acc, v) => ({ ...acc, ...v }), {}),\n facet: {\n string: (path: string, numBuckets = 1000): Facet => ({\n type: 'string',\n path,\n numBuckets,\n }),\n number: (path: string, boundaries: List<number>, alt?: string): Facet => ({\n type: 'number',\n path,\n boundaries,\n ...ifDefined(alt, a => ({ default: a })),\n }),\n date: (path: string, boundaries: List<DateTime>, alt?: string): Facet => ({\n type: 'date',\n path,\n boundaries: boundaries.mapDefined(b => b.toDate()),\n ...ifDefined(alt, a => ({ default: a })),\n }),\n },\n};\n"],"mappings":";;;;;AAAA;AAAA,EAEE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAIA;AAAA,EACA;AAAA,OACK;AAuCP,IAAM,SAAS,CAAC,OAAwC,QAAqC,QAAQ,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM;AAC7J,IAAM,OAAO,CAAC,OAAwC,QAAqC,QAAQ,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI;AACzJ,IAAM,UAAU,CAAC,OAAwC,QACvD,QAAQ,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,OAAO;AACnE,IAAM,SAAS,CAAC,OAAwC,QAAqC,QAAQ,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM;AAEtJ,IAAM,SAAS;AAAA,EACpB,QAAQ,CAAC,MAAe,QAAQ,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;AAAA,EACtG,SAAS,CAAC,OAA2B,QAAQ,EAAE,EAAE,QAAQ,OAAK,OAAO,OAAO,CAAC,CAAC;AAAA,EAC9E,UAAU,CAAC,OAAwC,KAAuB,WAAW,SACnF;AAAA,IACE,QAAQ;AAAA,MACN,QAAQ,OAAO,OAAO,GAAG;AAAA,MACzB,QAAQ,OAAO,OAAO,GAAG;AAAA,MACzB,SAAS,QAAQ,OAAO,GAAG;AAAA,MAC3B,MAAM,KAAK,OAAO,GAAG;AAAA,IACvB,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAClC,OAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,OAAM,EAAE,CAAC,IAAI,OAAO,QAAQ,CAAC,CAAE,GAAG,OAAO,OAAO,GAAG,EAAE,SAAS,IAAI,EAAE,oBAAoB,EAAE,IAAK,CAAC,CAAS;AAAA,IAChJ,MACE,OAAO,UAAU,OAAO;AAAA,MACtB,QAAQ,OAAO,QAAQ,CAAC,EAAE,UAAU,OAAO,SAAS,EAAE,CAAC,CAAC;AAAA,MACxD,oBAAoB;AAAA,IACtB,EAAE;AAAA,EACN;AAAA,EACF,QAAQ,CAAC,GAAsB,WAAoB;AAAA,IACjD,SAAS;AAAA,MACP,GAAG,UAAU,OAAO,EAAE,MAAM,CAAC;AAAA,MAC7B,UAAU,QAAQ,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,OAAM,EAAE,CAAC,IAAI,OAAO,QAAQ,CAAC,CAAE,GAAG,CAAC,CAAQ;AAAA,IAClG;AAAA,EACF;AAAA,EACA,eAAe,CAAC,OAAwC,SAA2B,QAAgC,SAAS,UAAmB;AAC7I,UAAM,OAAO,QAAQ,KAAK,EACvB,WAAW,CAAC,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,EACnD,MAAM;AACT,WAAO;AAAA,MACL,SAAS;AAAA,QACP,GAAG,UAAU,OAAO,EAAE,MAAM,CAAC;AAAA,QAC7B,UAAU,OAAO,SAAS,OAAO,OAAO;AAAA,QACxC,GAAG,UAAU,MAAM,EAAE,KAAK,CAAC;AAAA,QAC3B,OAAO,EAAE,MAAM,MAAM;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,CAAC,OAAwC,KAAuB,QAAgC,SAAS,WAAoB;AAAA,IACvI,aAAa;AAAA,MACX,GAAG,UAAU,OAAO,EAAE,MAAM,CAAC;AAAA,MAC7B,GAAG;AAAA,QACD,CAAC,cAAc,OAAO,OAAO,GAAG,CAAC;AAAA,QACjC;AAAA,UACE,OAAO;AAAA,YACL,UAAU;AAAA,cACR,UAAU,OAAO,SAAS,OAAO,GAAG;AAAA,YACtC;AAAA,YACA,QAAQ,OAAO,OAAO,GAAG;AAAA,UAC3B;AAAA,QACF;AAAA,QACA,EAAE,UAAU,OAAO,SAAS,OAAO,GAAG,EAAE;AAAA,MAC1C;AAAA,MACA,OAAO,EAAE,MAAM,MAAM;AAAA,IACvB;AAAA,EACF;AAAA,EACA,QAAQ,MAAgB,CAAC,UAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE;AAAA,EAC9D,MACE,CAAC,OAA4B,UAC7B,CAAC,SACC,UAAU,OAAO,QAAM;AAAA,IACrB,MAAM;AAAA,MACJ,MAAM,SAAS,aAAa,EAAE,UAAU,IAAI,IAAI;AAAA,MAChD,OAAO;AAAA,MACP,GAAG,UAAU,OAAO,EAAE,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF,EAAE;AAAA,EACN,UACE,CAAC,OAA4B,qBAAqB,SAClD,CAAC,UAAkB;AAAA,IACjB,UAAU;AAAA,MACR,MAAM,SAAS,aAAa,EAAE,UAAU,IAAI,IAAI;AAAA,MAChD,OAAO,UAAU,OAAO,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EACF,IACE,CAAC,UACD,CAAC,SACC,UAAU,OAAO,SAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,EAAE;AAAA,EACpD,KACE,CAAC,UACD,CAAC,SACC,UAAU,OAAO,UAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE;AAAA,EACtD,IACE,CAAC,UACD,CAAC,SACC,UAAU,OAAO,SAAO,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,EAAE;AAAA,EACpD,KACE,CAAC,UACD,CAAC,SACC,UAAU,OAAO,UAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE;AAAA,EACtD,OAAO,CAAC,SAA4B,OAAO,IAAI,YAAY,IAAI,CAAC;AAAA,EAChE,QAAQ,CAAC,SAA4B,OAAO,GAAG,YAAY,IAAI,CAAC;AAAA,EAChE,SACE,CAAC,OAAgB,QAAiB,iBAClC,CAAC,SAAiB;AAChB,UAAM,aAAa,eAAe,EAAE,KAAK,YAAY,MAAM,EAAE,IAAI,EAAE,IAAI,YAAY,MAAM,EAAE;AAC3F,WAAO;AAAA,MACL,OAAO;AAAA,QACL;AAAA,QACA,KAAK,YAAY,KAAK;AAAA,QACtB,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EACF,QAAQ,CAAC,QACP,QAAQ,GAAG,EACR,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,EACzC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,EACtC,OAAO,CAAC,KAAK,OAAO,EAAE,GAAG,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC;AAAA,EAC9C,OAAO;AAAA,IACL,QAAQ,CAAC,MAAc,aAAa,SAAiB;AAAA,MACnD,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,MAAc,YAA0B,SAAyB;AAAA,MACxE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,GAAG,UAAU,KAAK,QAAM,EAAE,SAAS,EAAE,EAAE;AAAA,IACzC;AAAA,IACA,MAAM,CAAC,MAAc,YAA4B,SAAyB;AAAA,MACxE,MAAM;AAAA,MACN;AAAA,MACA,YAAY,WAAW,WAAW,OAAK,EAAE,OAAO,CAAC;AAAA,MACjD,GAAG,UAAU,KAAK,QAAM,EAAE,SAAS,EAAE,EAAE;AAAA,IACzC;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/Utils.ts
|
|
2
|
+
import { choose, DateTime, isArray, isDate, isDateTime, isIsoDateString, isObject, meta } from "@thisisagile/easy";
|
|
3
|
+
var toMongoType = (input) => choose(input).type(isIsoDateString, (i) => new DateTime(i).toDate()).type(isDateTime, (i) => i.toDate()).type(isArray, (a) => a.map((i) => toMongoType(i))).type(isDate, (d) => d).type(
|
|
4
|
+
isObject,
|
|
5
|
+
(o) => Object.fromEntries(
|
|
6
|
+
meta(o).entries().map(([k, i]) => [k, toMongoType(i)])
|
|
7
|
+
)
|
|
8
|
+
).else(input);
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
toMongoType
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=chunk-MZE7UWQC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Utils.ts"],"sourcesContent":["import { choose, DateTime, isArray, isDate, isDateTime, isIsoDateString, isObject, Json, meta } from '@thisisagile/easy';\n\nexport const toMongoType = (input: unknown): Json =>\n choose(input)\n .type(isIsoDateString, i => new DateTime(i).toDate() as any)\n .type(isDateTime, i => i.toDate() as any)\n .type(isArray, a => a.map((i: any) => toMongoType(i)))\n .type(isDate, d => d)\n .type(isObject, o =>\n Object.fromEntries(\n meta(o)\n .entries()\n .map(([k, i]) => [k, toMongoType(i)])\n )\n )\n .else(input);\n"],"mappings":";AAAA,SAAS,QAAQ,UAAU,SAAS,QAAQ,YAAY,iBAAiB,UAAgB,YAAY;AAE9F,IAAM,cAAc,CAAC,UAC1B,OAAO,KAAK,EACT,KAAK,iBAAiB,OAAK,IAAI,SAAS,CAAC,EAAE,OAAO,CAAQ,EAC1D,KAAK,YAAY,OAAK,EAAE,OAAO,CAAQ,EACvC,KAAK,SAAS,OAAK,EAAE,IAAI,CAAC,MAAW,YAAY,CAAC,CAAC,CAAC,EACpD,KAAK,QAAQ,OAAK,CAAC,EACnB;AAAA,EAAK;AAAA,EAAU,OACd,OAAO;AAAA,IACL,KAAK,CAAC,EACH,QAAQ,EACR,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,EACxC;AACF,EACC,KAAK,KAAK;","names":[]}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import {
|
|
2
|
+
toMongoType
|
|
3
|
+
} from "./chunk-MZE7UWQC.mjs";
|
|
4
|
+
|
|
5
|
+
// src/MongoProvider.ts
|
|
6
|
+
import {
|
|
7
|
+
asJson,
|
|
8
|
+
asNumber,
|
|
9
|
+
asString,
|
|
10
|
+
choose,
|
|
11
|
+
entries,
|
|
12
|
+
Exception,
|
|
13
|
+
ifTrue,
|
|
14
|
+
isArray,
|
|
15
|
+
isDefined,
|
|
16
|
+
isField,
|
|
17
|
+
isSortCondition,
|
|
18
|
+
json,
|
|
19
|
+
toArray,
|
|
20
|
+
toPageList,
|
|
21
|
+
tuple2,
|
|
22
|
+
tuple3,
|
|
23
|
+
use,
|
|
24
|
+
when
|
|
25
|
+
} from "@thisisagile/easy";
|
|
26
|
+
import {
|
|
27
|
+
MongoClient
|
|
28
|
+
} from "mongodb";
|
|
29
|
+
var omitId = (j) => json.delete(j, "_id");
|
|
30
|
+
function omitOptions(obj) {
|
|
31
|
+
const { maxTimeMS, ...rest } = obj ?? {};
|
|
32
|
+
return rest;
|
|
33
|
+
}
|
|
34
|
+
var MongoProvider = class _MongoProvider {
|
|
35
|
+
constructor(coll) {
|
|
36
|
+
this.coll = coll;
|
|
37
|
+
}
|
|
38
|
+
static clients = {};
|
|
39
|
+
static destroyAll() {
|
|
40
|
+
return Promise.all(entries(_MongoProvider.clients).map(([u, c]) => c.then((c2) => c2.close()).then(() => delete _MongoProvider.clients[u]))).then(
|
|
41
|
+
() => void 0
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
static connect(u, db) {
|
|
45
|
+
return MongoClient.connect(u, {
|
|
46
|
+
auth: {
|
|
47
|
+
username: asString(db.options?.user),
|
|
48
|
+
password: asString(db.options?.password)
|
|
49
|
+
},
|
|
50
|
+
...db.options?.maxPoolSize && { maxPoolSize: db.options?.maxPoolSize },
|
|
51
|
+
...db.options?.minPoolSize && { minPoolSize: db.options?.minPoolSize },
|
|
52
|
+
...db.options?.maxIdleTimeMS && { maxIdleTimeMS: db.options?.maxIdleTimeMS },
|
|
53
|
+
...db.options?.socketTimeoutMS && { socketTimeoutMS: db.options?.socketTimeoutMS }
|
|
54
|
+
}).then((c) => {
|
|
55
|
+
c.on("error", () => delete _MongoProvider.clients[u]);
|
|
56
|
+
c.on("close", () => delete _MongoProvider.clients[u]);
|
|
57
|
+
return c;
|
|
58
|
+
}).catch((err) => {
|
|
59
|
+
delete _MongoProvider.clients[u];
|
|
60
|
+
return Promise.reject(err);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
cluster() {
|
|
64
|
+
return use(
|
|
65
|
+
this.coll.db,
|
|
66
|
+
(db) => when(db.options?.cluster).not.isDefined.reject(Exception.IsNotValid.because("Missing cluster in database options.")).then((c) => _MongoProvider.clients[c] ?? (_MongoProvider.clients[c] = _MongoProvider.connect(c, db)))
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
collection() {
|
|
70
|
+
return this.cluster().then((c) => c.db(this.coll.db.name)).then((db) => db.collection(asString(this.coll)));
|
|
71
|
+
}
|
|
72
|
+
toMongoJson(query) {
|
|
73
|
+
return toMongoType(asJson(query));
|
|
74
|
+
}
|
|
75
|
+
withTimeout(options) {
|
|
76
|
+
return { ...options, maxTimeMS: options?.maxTimeMS ?? this.coll.db?.options?.queryTimeoutMS ?? 3e4 };
|
|
77
|
+
}
|
|
78
|
+
find(query, options) {
|
|
79
|
+
return tuple3(this.collection(), this.toMongoJson(query), this.toFindOptions(options)).then(
|
|
80
|
+
([c, q, o]) => tuple2(
|
|
81
|
+
c.find(q, o),
|
|
82
|
+
ifTrue(o.total, () => c.countDocuments(q, { maxTimeMS: this.withTimeout(options).maxTimeMS }))
|
|
83
|
+
)
|
|
84
|
+
).then(([res, total]) => this.toArray(res, { ...omitOptions(options), total }));
|
|
85
|
+
}
|
|
86
|
+
all(options) {
|
|
87
|
+
return this.find({}, options);
|
|
88
|
+
}
|
|
89
|
+
byId(id, options) {
|
|
90
|
+
return this.collection().then((c) => c.findOne(this.toMongoJson({ id }), this.toFindOptions(options)));
|
|
91
|
+
}
|
|
92
|
+
by(key, value, options) {
|
|
93
|
+
return this.find({ [key]: value }, options);
|
|
94
|
+
}
|
|
95
|
+
group(qs, options) {
|
|
96
|
+
return this.aggregate(qs, options);
|
|
97
|
+
}
|
|
98
|
+
aggregate(qs, options) {
|
|
99
|
+
return this.collection().then(
|
|
100
|
+
(c) => c.aggregate(
|
|
101
|
+
qs.map((q) => this.toMongoJson(q)),
|
|
102
|
+
this.withTimeout(options)
|
|
103
|
+
)
|
|
104
|
+
).then((res) => this.toArray(res));
|
|
105
|
+
}
|
|
106
|
+
add(item) {
|
|
107
|
+
return this.collection().then((c) => c.insertOne(omitId(item))).then(() => omitId(item));
|
|
108
|
+
}
|
|
109
|
+
update(item) {
|
|
110
|
+
return this.collection().then((c) => c.updateOne(this.toMongoJson({ id: item.id }), { $set: omitId(item) })).then(() => this.byId(item.id));
|
|
111
|
+
}
|
|
112
|
+
remove(id) {
|
|
113
|
+
return this.collection().then((c) => c.deleteOne(this.toMongoJson({ id }))).then((d) => d.acknowledged);
|
|
114
|
+
}
|
|
115
|
+
count(query, options) {
|
|
116
|
+
return this.collection().then((c) => c.countDocuments(this.toMongoJson(query ?? {}), this.withTimeout(options)));
|
|
117
|
+
}
|
|
118
|
+
createIndex(indexes, options) {
|
|
119
|
+
return this.collection().then((c) => c.createIndex(this.toIndexSpecification(indexes), this.toCreateIndexesOptions(options)));
|
|
120
|
+
}
|
|
121
|
+
createPartialIndex(indexes, filter, options) {
|
|
122
|
+
return this.createIndex(indexes, { ...options, filter });
|
|
123
|
+
}
|
|
124
|
+
createTextIndex(indexes, options) {
|
|
125
|
+
const ii = toArray(indexes).reduce((i, f) => ({ ...i, [asString(f)]: "text" }), {});
|
|
126
|
+
return this.createIndex(ii, { unique: false, ...options });
|
|
127
|
+
}
|
|
128
|
+
toFindOptions(options) {
|
|
129
|
+
return {
|
|
130
|
+
limit: asNumber(options?.take ?? 250),
|
|
131
|
+
...options?.skip && { skip: asNumber(options?.skip) },
|
|
132
|
+
...options?.sorts && { sort: options?.sorts } || options?.sort && { sort: this.coll.sort(...options?.sort ?? []) },
|
|
133
|
+
total: isDefined(options?.skip) || isDefined(options?.take),
|
|
134
|
+
projection: options?.projection ?? { _id: 0 },
|
|
135
|
+
maxTimeMS: this.withTimeout(options).maxTimeMS
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
toIndexSpecification(index) {
|
|
139
|
+
return choose(index).type(isField, (f) => f.property).type(isSortCondition, (s) => s.toJSON()).type(isArray, (aa) => aa.map((a) => this.toIndexSpecification(a))).else((i) => i);
|
|
140
|
+
}
|
|
141
|
+
toCreateIndexesOptions(options) {
|
|
142
|
+
return {
|
|
143
|
+
unique: options?.unique ?? true,
|
|
144
|
+
...options?.languageOverride && { language_override: options.languageOverride },
|
|
145
|
+
...options?.languageDefault && { default_language: options.languageDefault },
|
|
146
|
+
...options?.filter && { partialFilterExpression: toMongoType(asJson(options.filter)) }
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
toArray(cursor, options) {
|
|
150
|
+
return cursor.toArray().then((r) => toPageList(r, options));
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export {
|
|
155
|
+
MongoProvider
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=chunk-P372VCR6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/MongoProvider.ts"],"sourcesContent":["import {\n asJson,\n asNumber,\n asString,\n choose,\n Condition,\n Database,\n entries,\n Exception,\n FetchOptions,\n Field,\n Id,\n ifTrue,\n isArray,\n isDefined,\n isField,\n isSortCondition,\n json,\n Json,\n JsonValue,\n LogicalCondition,\n OneOrMore,\n PageList,\n Sort,\n toArray,\n toPageList,\n tuple2,\n tuple3,\n use,\n when,\n} from '@thisisagile/easy';\nimport {\n AggregationCursor,\n Collection as MongoCollection,\n CreateIndexesOptions,\n Document,\n FindCursor,\n FindOptions as MongoFindOptions,\n IndexSpecification,\n MongoClient,\n StrictFilter as MongoFilter,\n} from 'mongodb';\nimport { Collection } from './Collection';\nimport { toMongoType } from './Utils';\n\nconst omitId = (j: Json): Json => json.delete(j, '_id');\n\nexport type Projection = Record<string, 0 | 1>;\nexport type FindOptions = FetchOptions & { projection?: Projection };\nexport type Filter<T = unknown> = MongoFilter<T>;\nexport type Query = Condition | LogicalCondition | Filter<any>;\n\nexport type IndexOptions = {\n unique?: boolean;\n filter?: Query;\n languageOverride?: string;\n languageDefault?: string;\n};\n\nexport type Indexes = OneOrMore<string | Field | Sort | Record<string, 1 | -1>>;\n\nexport type Options = { maxTimeMS?: number };\n\nfunction omitOptions(obj?: FindOptions & Options): Omit<FindOptions & Options, keyof Options> {\n const { maxTimeMS, ...rest } = obj ?? ({} as Options);\n return rest;\n}\n\nexport class MongoProvider {\n protected static readonly clients: { [key: string]: Promise<MongoClient> } = {};\n\n constructor(readonly coll: Collection) {}\n\n static destroyAll(): Promise<void> {\n return Promise.all(entries(MongoProvider.clients).map(([u, c]) => c.then(c => c.close()).then(() => delete MongoProvider.clients[u]))).then(\n () => undefined\n );\n }\n\n private static connect(u: string, db: Database) {\n return MongoClient.connect(u, {\n auth: {\n username: asString(db.options?.user),\n password: asString(db.options?.password),\n },\n ...(db.options?.maxPoolSize && { maxPoolSize: db.options?.maxPoolSize }),\n ...(db.options?.minPoolSize && { minPoolSize: db.options?.minPoolSize }),\n ...(db.options?.maxIdleTimeMS && { maxIdleTimeMS: db.options?.maxIdleTimeMS }),\n ...(db.options?.socketTimeoutMS && { socketTimeoutMS: db.options?.socketTimeoutMS }),\n })\n .then(c => {\n c.on('error', () => delete MongoProvider.clients[u]);\n c.on('close', () => delete MongoProvider.clients[u]);\n return c;\n })\n .catch(err => {\n delete MongoProvider.clients[u];\n return Promise.reject(err);\n });\n }\n\n cluster(): Promise<MongoClient> {\n return use(this.coll.db, db =>\n when(db.options?.cluster)\n .not.isDefined.reject(Exception.IsNotValid.because('Missing cluster in database options.'))\n .then(c => MongoProvider.clients[c] ?? (MongoProvider.clients[c] = MongoProvider.connect(c, db)))\n );\n }\n\n collection<T extends Document = Document>(): Promise<MongoCollection<T>> {\n return this.cluster()\n .then(c => c.db(this.coll.db.name))\n .then(db => db.collection<T>(asString(this.coll)));\n }\n\n toMongoJson(query: Query): Json {\n return toMongoType(asJson(query));\n }\n\n withTimeout(options?: Partial<FindOptions & Options>): Partial<FindOptions> & Options {\n return { ...options, maxTimeMS: options?.maxTimeMS ?? this.coll.db?.options?.queryTimeoutMS ?? 30000 };\n }\n\n find(query: Query, options?: FindOptions & Options): Promise<PageList<Json>> {\n return tuple3(this.collection(), this.toMongoJson(query), this.toFindOptions(options))\n .then(([c, q, o]) =>\n tuple2(\n c.find(q, o),\n ifTrue(o.total, () => c.countDocuments(q, { maxTimeMS: this.withTimeout(options).maxTimeMS }))\n )\n )\n .then(([res, total]) => this.toArray(res, { ...omitOptions(options), total }));\n }\n\n all(options?: FindOptions): Promise<PageList<Json>> {\n return this.find({}, options);\n }\n\n byId(id: Id, options?: FindOptions): Promise<Json> {\n return this.collection().then(c => c.findOne(this.toMongoJson({ id: id }), this.toFindOptions(options)) as Promise<Json>);\n }\n\n by(key: string, value: JsonValue, options?: FindOptions): Promise<PageList<Json>> {\n return this.find({ [key]: value }, options);\n }\n\n group(qs: Filter<any>[], options?: Options): Promise<PageList<Json>> {\n return this.aggregate(qs, options);\n }\n\n aggregate(qs: Filter<any>[], options?: Options): Promise<PageList<Json>> {\n return this.collection()\n .then(c =>\n c.aggregate(\n qs.map(q => this.toMongoJson(q)),\n this.withTimeout(options)\n )\n )\n .then(res => this.toArray(res));\n }\n\n add(item: Json): Promise<Json> {\n return this.collection()\n .then(c => c.insertOne(omitId(item)))\n .then(() => omitId(item));\n }\n\n update(item: Json): Promise<Json> {\n return this.collection()\n .then(c => c.updateOne(this.toMongoJson({ id: item.id }), { $set: omitId(item) }))\n .then(() => this.byId(item.id as Id));\n }\n\n remove(id: Id): Promise<boolean> {\n return this.collection()\n .then(c => c.deleteOne(this.toMongoJson({ id })))\n .then(d => d.acknowledged);\n }\n\n count(query?: Query, options?: Options): Promise<number> {\n return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {}), this.withTimeout(options)));\n }\n\n createIndex(indexes: Indexes, options?: IndexOptions): Promise<string> {\n return this.collection().then(c => c.createIndex(this.toIndexSpecification(indexes), this.toCreateIndexesOptions(options)));\n }\n\n createPartialIndex(indexes: Indexes, filter: Query, options?: Omit<IndexOptions, 'filter'>): Promise<string> {\n return this.createIndex(indexes, { ...options, filter });\n }\n\n createTextIndex(indexes: OneOrMore<Field | string>, options?: IndexOptions): Promise<string> {\n const ii = toArray(indexes).reduce((i, f) => ({ ...i, [asString(f)]: 'text' }), {});\n return this.createIndex(ii, { unique: false, ...options });\n }\n\n protected toFindOptions(options?: FindOptions): MongoFindOptions & { total: boolean } {\n return {\n limit: asNumber(options?.take ?? 250),\n ...(options?.skip && { skip: asNumber(options?.skip) }),\n ...((options?.sorts && { sort: options?.sorts }) || (options?.sort && { sort: this.coll.sort(...(options?.sort ?? [])) })),\n total: isDefined(options?.skip) || isDefined(options?.take),\n projection: options?.projection ?? { _id: 0 },\n maxTimeMS: this.withTimeout(options).maxTimeMS,\n };\n }\n\n protected toIndexSpecification(index: Indexes): IndexSpecification {\n return choose(index)\n .type(isField, f => f.property as IndexSpecification)\n .type(isSortCondition, s => s.toJSON() as IndexSpecification)\n .type(isArray, aa => aa.map(a => this.toIndexSpecification(a)) as IndexSpecification)\n .else(i => i as IndexSpecification);\n }\n\n protected toCreateIndexesOptions(options?: IndexOptions): CreateIndexesOptions {\n return {\n unique: options?.unique ?? true,\n ...(options?.languageOverride && { language_override: options.languageOverride }),\n ...(options?.languageDefault && { default_language: options.languageDefault }),\n ...(options?.filter && { partialFilterExpression: toMongoType(asJson(options.filter)) }),\n };\n }\n\n protected toArray(\n cursor: FindCursor<Document> | AggregationCursor<Document>,\n options?: { take?: number; skip?: number; total?: number }\n ): Promise<PageList<Json>> {\n return cursor.toArray().then(r => toPageList<Json>(r, options));\n }\n}\n"],"mappings":"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","names":["c"]}
|