@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.
@@ -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":[]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ lucene
3
+ } from "./chunk-J3OXGWPD.mjs";
4
+ import "./chunk-MZE7UWQC.mjs";
5
+ export {
6
+ lucene
7
+ };
8
+ //# sourceMappingURL=Lucene.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,9 @@
1
+ import {
2
+ MongoGateway
3
+ } from "./chunk-GFBKWYDV.mjs";
4
+ import "./chunk-WEJO6T5Q.mjs";
5
+ import "./chunk-MZE7UWQC.mjs";
6
+ export {
7
+ MongoGateway
8
+ };
9
+ //# sourceMappingURL=MongoGateway.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ MongoProvider
3
+ } from "./chunk-P372VCR6.mjs";
4
+ import "./chunk-MZE7UWQC.mjs";
5
+ export {
6
+ MongoProvider
7
+ };
8
+ //# sourceMappingURL=MongoProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -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,7 @@
1
+ import {
2
+ toMongoType
3
+ } from "./chunk-MZE7UWQC.mjs";
4
+ export {
5
+ toMongoType
6
+ };
7
+ //# sourceMappingURL=Utils.mjs.map
@@ -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":"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","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"]}