@thisisagile/easy-mongo 15.24.0 → 15.24.2
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/MongoProvider.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ export declare class MongoProvider {
|
|
|
23
23
|
cluster(): Promise<MongoClient>;
|
|
24
24
|
collection<T extends Document = Document>(): Promise<MongoCollection<T>>;
|
|
25
25
|
private static connect;
|
|
26
|
-
static
|
|
26
|
+
static destroyAll(): Promise<void>;
|
|
27
27
|
toMongoJson(query: Query): Json;
|
|
28
28
|
find(query: Query, options?: FindOptions): Promise<PageList<Json>>;
|
|
29
29
|
all(options?: FindOptions): Promise<PageList<Json>>;
|
package/dist/MongoProvider.js
CHANGED
|
@@ -53,8 +53,8 @@ class MongoProvider {
|
|
|
53
53
|
return c;
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
|
-
static
|
|
57
|
-
|
|
56
|
+
static destroyAll() {
|
|
57
|
+
return Promise.all((0, import_easy.entries)(MongoProvider.clients).map(([u, c]) => c.close().then(() => delete MongoProvider.clients[u]))).then(() => void 0);
|
|
58
58
|
}
|
|
59
59
|
toMongoJson(query) {
|
|
60
60
|
return (0, import_Utils.toMongoType)((0, import_easy.asJson)(query));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/MongoProvider.ts"],"sourcesContent":["import {\n asJson,\n asNumber,\n asString,\n choose,\n Condition,\n Database,\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 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 class MongoProvider {\n protected static readonly clients: { [key: string]: MongoClient } = {};\n\n constructor(readonly coll: Collection) {}\n\n async cluster(): Promise<MongoClient> {\n const db = this.coll.db;\n const c = await when(db.options?.cluster).not.isDefined.reject(Exception.IsNotValid.because('Missing cluster in database options.'));\n return MongoProvider.clients[c] ?? (MongoProvider.clients[c] = await MongoProvider.connect(c, db));\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 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 }).then(c => {\n c.on('error', () => delete MongoProvider.clients[u]);\n c.on('close', () => delete MongoProvider.clients[u]);\n return c;\n });\n }\n\n static disconnect() {\n Object.values(MongoProvider.clients).forEach(c => void c.close());\n }\n\n toMongoJson(query: Query): Json {\n return toMongoType(asJson(query));\n }\n\n find(query: Query, options?: FindOptions): 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))\n )\n )\n .then(([res, total]) => this.toArray(res, { ...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>[]): Promise<PageList<Json>> {\n return this.aggregate(qs);\n }\n\n aggregate(qs: Filter<any>[]): Promise<PageList<Json>> {\n return this.collection()\n .then(c => c.aggregate(qs.map(q => this.toMongoJson(q))))\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): Promise<number> {\n return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {})));\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 };\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":[]}
|
|
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 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 class MongoProvider {\n protected static readonly clients: { [key: string]: MongoClient } = {};\n\n constructor(readonly coll: Collection) {}\n\n async cluster(): Promise<MongoClient> {\n const db = this.coll.db;\n const c = await when(db.options?.cluster).not.isDefined.reject(Exception.IsNotValid.because('Missing cluster in database options.'));\n return MongoProvider.clients[c] ?? (MongoProvider.clients[c] = await MongoProvider.connect(c, db));\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 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 }).then(c => {\n c.on('error', () => delete MongoProvider.clients[u]);\n c.on('close', () => delete MongoProvider.clients[u]);\n return c;\n });\n }\n\n static destroyAll(): Promise<void> {\n return Promise.all(entries(MongoProvider.clients).map(([u, c]) => c.close().then(() => delete MongoProvider.clients[u]))).then(() => undefined);\n }\n\n toMongoJson(query: Query): Json {\n return toMongoType(asJson(query));\n }\n\n find(query: Query, options?: FindOptions): 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))\n )\n )\n .then(([res, total]) => this.toArray(res, { ...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>[]): Promise<PageList<Json>> {\n return this.aggregate(qs);\n }\n\n aggregate(qs: Filter<any>[]): Promise<PageList<Json>> {\n return this.collection()\n .then(c => c.aggregate(qs.map(q => this.toMongoJson(q))))\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): Promise<number> {\n return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {})));\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 };\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":[]}
|
package/dist/MongoProvider.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
asNumber,
|
|
4
4
|
asString,
|
|
5
5
|
choose,
|
|
6
|
+
entries,
|
|
6
7
|
Exception,
|
|
7
8
|
ifTrue,
|
|
8
9
|
isArray,
|
|
@@ -49,8 +50,8 @@ class MongoProvider {
|
|
|
49
50
|
return c;
|
|
50
51
|
});
|
|
51
52
|
}
|
|
52
|
-
static
|
|
53
|
-
|
|
53
|
+
static destroyAll() {
|
|
54
|
+
return Promise.all(entries(MongoProvider.clients).map(([u, c]) => c.close().then(() => delete MongoProvider.clients[u]))).then(() => void 0);
|
|
54
55
|
}
|
|
55
56
|
toMongoJson(query) {
|
|
56
57
|
return toMongoType(asJson(query));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/MongoProvider.ts"],"sourcesContent":["import {\n asJson,\n asNumber,\n asString,\n choose,\n Condition,\n Database,\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 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 class MongoProvider {\n protected static readonly clients: { [key: string]: MongoClient } = {};\n\n constructor(readonly coll: Collection) {}\n\n async cluster(): Promise<MongoClient> {\n const db = this.coll.db;\n const c = await when(db.options?.cluster).not.isDefined.reject(Exception.IsNotValid.because('Missing cluster in database options.'));\n return MongoProvider.clients[c] ?? (MongoProvider.clients[c] = await MongoProvider.connect(c, db));\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 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 }).then(c => {\n c.on('error', () => delete MongoProvider.clients[u]);\n c.on('close', () => delete MongoProvider.clients[u]);\n return c;\n });\n }\n\n static disconnect() {\n Object.values(MongoProvider.clients).forEach(c => void c.close());\n }\n\n toMongoJson(query: Query): Json {\n return toMongoType(asJson(query));\n }\n\n find(query: Query, options?: FindOptions): 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))\n )\n )\n .then(([res, total]) => this.toArray(res, { ...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>[]): Promise<PageList<Json>> {\n return this.aggregate(qs);\n }\n\n aggregate(qs: Filter<any>[]): Promise<PageList<Json>> {\n return this.collection()\n .then(c => c.aggregate(qs.map(q => this.toMongoJson(q))))\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): Promise<number> {\n return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {})));\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 };\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":[]}
|
|
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 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 class MongoProvider {\n protected static readonly clients: { [key: string]: MongoClient } = {};\n\n constructor(readonly coll: Collection) {}\n\n async cluster(): Promise<MongoClient> {\n const db = this.coll.db;\n const c = await when(db.options?.cluster).not.isDefined.reject(Exception.IsNotValid.because('Missing cluster in database options.'));\n return MongoProvider.clients[c] ?? (MongoProvider.clients[c] = await MongoProvider.connect(c, db));\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 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 }).then(c => {\n c.on('error', () => delete MongoProvider.clients[u]);\n c.on('close', () => delete MongoProvider.clients[u]);\n return c;\n });\n }\n\n static destroyAll(): Promise<void> {\n return Promise.all(entries(MongoProvider.clients).map(([u, c]) => c.close().then(() => delete MongoProvider.clients[u]))).then(() => undefined);\n }\n\n toMongoJson(query: Query): Json {\n return toMongoType(asJson(query));\n }\n\n find(query: Query, options?: FindOptions): 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))\n )\n )\n .then(([res, total]) => this.toArray(res, { ...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>[]): Promise<PageList<Json>> {\n return this.aggregate(qs);\n }\n\n aggregate(qs: Filter<any>[]): Promise<PageList<Json>> {\n return this.collection()\n .then(c => c.aggregate(qs.map(q => this.toMongoJson(q))))\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): Promise<number> {\n return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {})));\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 };\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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thisisagile/easy-mongo",
|
|
3
|
-
"version": "15.24.
|
|
3
|
+
"version": "15.24.2",
|
|
4
4
|
"description": "Add support for MongoDB",
|
|
5
5
|
"author": "Sander Hoogendoorn",
|
|
6
6
|
"license": "MIT",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"access": "public"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@thisisagile/easy-test": "15.24.
|
|
36
|
+
"@thisisagile/easy-test": "15.24.2"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@thisisagile/easy": "^15.24.
|
|
39
|
+
"@thisisagile/easy": "^15.24.2",
|
|
40
40
|
"mongodb": "^5.6.0"
|
|
41
41
|
}
|
|
42
42
|
}
|
package/src/MongoProvider.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
choose,
|
|
6
6
|
Condition,
|
|
7
7
|
Database,
|
|
8
|
+
entries,
|
|
8
9
|
Exception,
|
|
9
10
|
FetchOptions,
|
|
10
11
|
Field,
|
|
@@ -90,8 +91,8 @@ export class MongoProvider {
|
|
|
90
91
|
});
|
|
91
92
|
}
|
|
92
93
|
|
|
93
|
-
static
|
|
94
|
-
|
|
94
|
+
static destroyAll(): Promise<void> {
|
|
95
|
+
return Promise.all(entries(MongoProvider.clients).map(([u, c]) => c.close().then(() => delete MongoProvider.clients[u]))).then(() => undefined);
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
toMongoJson(query: Query): Json {
|