liwi-mongo 10.5.0 → 12.0.0

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/CHANGELOG.md CHANGED
@@ -1,8 +1,47 @@
1
- # Change Log
1
+ # Changelog
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 12.0.0 (2024-03-30)
7
+
8
+
9
+ ### ⚠ BREAKING CHANGES
10
+
11
+ * update dev deps incuding babel which changes supported built files for browser
12
+
13
+ ### Features
14
+
15
+ * **deps:** update dependency mongodb to v6 ([#298](https://github.com/liwijs/liwi/issues/298)) ([96c5838](https://github.com/liwijs/liwi/commit/96c5838d006cbefaf96f466bfc802888795ce7e1))
16
+ * **deps:** update nightingale to v15 (major) ([#404](https://github.com/liwijs/liwi/issues/404)) ([f4e3338](https://github.com/liwijs/liwi/commit/f4e33387072b727a08ee095d9f01e41d9d4e7a1e))
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * **liwi-mongo:** properly implement forEach ([2fb838b](https://github.com/liwijs/liwi/commit/2fb838b4b81ccb109946a9d0203485488085f632))
22
+
23
+
24
+ ### Miscellaneous Chores
25
+
26
+ * update dev deps incuding babel which changes supported built files for browser ([462bf2e](https://github.com/liwijs/liwi/commit/462bf2e0bb3a6b8c9304106bc447bd248e3a61c7))
27
+
28
+ Version bump for dependency: liwi-store
29
+ Version bump for dependency: liwi-subscribe-store
30
+
31
+
32
+ ## [11.0.0](https://github.com/liwijs/liwi/compare/v10.5.0...v11.0.0) (2023-07-29)
33
+
34
+
35
+ ### ⚠ BREAKING CHANGES
36
+
37
+ * drop node 16
38
+
39
+ ### Code Refactoring
40
+
41
+ * update to node 18 ([e2dcbf8](https://github.com/liwijs/liwi/commit/e2dcbf8f5f6f32da6daa583fe352a453231c0c40))
42
+
43
+
44
+
6
45
  ## [10.5.0](https://github.com/liwijs/liwi/compare/v10.4.0...v10.5.0) (2023-07-28)
7
46
 
8
47
 
@@ -1 +1 @@
1
- {"version":3,"file":"MongoConnection.d.ts","sourceRoot":"","sources":["../../src/MongoConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,OAAO,MAAM,SAAS,CAAC;AAK9B,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,kBAAkB;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAElC,WAAW,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE3C,gBAAgB,CAAC,EAAE,OAAO,CAAC;gBAGf,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAqChD,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,GAAG,IAAI;IAkDzE,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;IAIvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
1
+ {"version":3,"file":"MongoConnection.d.ts","sourceRoot":"","sources":["../../src/MongoConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,OAAO,MAAM,SAAS,CAAC;AAK9B,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,kBAAkB;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAElC,WAAW,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE3C,gBAAgB,CAAC,EAAE,OAAO,CAAC;gBAGf,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAqChD,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,GAAG,IAAI;IAmDzE,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;IAIvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
@@ -9,6 +9,7 @@ export default class MongoCursor<Model extends MongoBaseModel<KeyValue>, Result
9
9
  constructor(store: MongoStore<Model, KeyValue>, cursor: FindCursor<Result>);
10
10
  advance(count: number): void;
11
11
  next(): Promise<KeyValue | undefined>;
12
+ forEach(callback: (result: Result) => Promise<void> | void): Promise<void>;
12
13
  limit(newLimit: number): Promise<this>;
13
14
  result(): Promise<Result>;
14
15
  close(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"MongoCursor.d.ts","sourceRoot":"","sources":["../../src/MongoCursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,OAAO,OAAO,WAAW,CAC9B,KAAK,SAAS,cAAc,CAAC,QAAQ,CAAC,EACtC,MAAM,SAAS,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,EACrC,QAAQ,SAAS,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,CAC/C,SAAQ,mBAAmB,CAC3B,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,EAC3B,QAAQ,EACR,KAAK,EACL,MAAM,CACP;IAGC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,OAAO,CAAC,OAAO,CAAC,CAAgB;gBAEpB,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;IAK1E,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5B,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAQrC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAKzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAG7B"}
1
+ {"version":3,"file":"MongoCursor.d.ts","sourceRoot":"","sources":["../../src/MongoCursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,OAAO,OAAO,WAAW,CAC9B,KAAK,SAAS,cAAc,CAAC,QAAQ,CAAC,EACtC,MAAM,SAAS,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,EACrC,QAAQ,SAAS,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,CAC/C,SAAQ,mBAAmB,CAC3B,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,EAC3B,QAAQ,EACR,KAAK,EACL,MAAM,CACP;IAGC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,OAAO,CAAC,OAAO,CAAC,CAAgB;gBAEpB,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;IAK1E,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5B,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAQtB,OAAO,CACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACjD,OAAO,CAAC,IAAI,CAAC;IAMhB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7B,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAKlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAG7B"}
@@ -21,6 +21,11 @@ class MongoCursor extends AbstractStoreCursor {
21
21
  return this.key;
22
22
  });
23
23
  }
24
+ async forEach(callback) {
25
+ for await (const result of this.cursor) {
26
+ await callback(result);
27
+ }
28
+ }
24
29
  limit(newLimit) {
25
30
  this.cursor.limit(newLimit);
26
31
  return Promise.resolve(this);
@@ -41,6 +46,7 @@ class MongoCursor extends AbstractStoreCursor {
41
46
  }
42
47
 
43
48
  /* eslint-disable complexity, max-lines */
49
+
44
50
  const identityTransformer$1 = model => model;
45
51
  class MongoQueryCollection extends AbstractSubscribableStoreQuery {
46
52
  constructor(store, options, transformer = identityTransformer$1) {
@@ -325,6 +331,7 @@ class MongoQuerySingleItem extends AbstractSubscribableStoreQuery {
325
331
  }
326
332
 
327
333
  /* eslint-disable max-lines */
334
+
328
335
  class MongoStore {
329
336
  keyPath = '_id';
330
337
  constructor(connection, collectionName) {
@@ -335,8 +342,8 @@ class MongoStore {
335
342
  this._collection = connection.getConnection().then(client => {
336
343
  this._collection = client.db().collection(collectionName);
337
344
  return this._collection;
338
- }, err => {
339
- this._collection = Promise.reject(err);
345
+ }, error => {
346
+ this._collection = Promise.reject(error);
340
347
  return this._collection;
341
348
  });
342
349
  }
@@ -437,7 +444,6 @@ class MongoStore {
437
444
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
438
445
  collection.updateMany(criteria, partialUpdate)).then(() => undefined); // TODO return updated object
439
446
  }
440
-
441
447
  deleteByKey(key, criteria) {
442
448
  return this.collection.then(collection => collection.deleteOne({
443
449
  _id: key,
@@ -542,21 +548,23 @@ class MongoConnection extends AbstractConnection {
542
548
  this._connecting = undefined;
543
549
  this.getConnection = () => Promise.resolve(this._connection);
544
550
  return connection;
545
- }).catch(err => {
551
+ }).catch(error => {
546
552
  logger.info('not connected', {
547
553
  connectionStringRedacted
548
554
  });
549
- console.error(err.message || err);
555
+ console.error(error.message || error);
550
556
  // throw err;
551
557
  process.nextTick(() => {
552
- // eslint-disable-next-line unicorn/no-process-exit
558
+ // eslint-disable-next-line unicorn/no-process-exit, n/no-process-exit
553
559
  process.exit(1);
554
560
  });
555
- throw err;
561
+ throw error;
556
562
  });
557
563
  this.getConnection = () => Promise.resolve(connectPromise);
558
564
  this._connecting = this.getConnection();
559
565
  }
566
+
567
+ // eslint-disable-next-line @typescript-eslint/class-methods-use-this
560
568
  getConnection() {
561
569
  throw new Error('call connect()');
562
570
  }
@@ -577,4 +585,4 @@ function createMongoSubscribeStore(mongoStore) {
577
585
  }
578
586
 
579
587
  export { MongoConnection, MongoStore, createMongoSubscribeStore };
580
- //# sourceMappingURL=index-node16.mjs.map
588
+ //# sourceMappingURL=index-node18.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-node18.mjs","sources":["../src/MongoCursor.ts","../src/MongoQueryCollection.ts","../src/MongoQuerySingleItem.ts","../src/MongoStore.ts","../src/MongoConnection.ts","../src/createMongoSubscribeStore.ts"],"sourcesContent":["import { AbstractStoreCursor } from 'liwi-store';\nimport type { AllowedKeyValue } from 'liwi-store';\nimport type { FindCursor } from 'mongodb';\nimport type { MongoBaseModel } from './MongoBaseModel';\nimport type MongoStore from './MongoStore';\n\nexport default class MongoCursor<\n Model extends MongoBaseModel<KeyValue>,\n Result extends Partial<Model> = Model,\n KeyValue extends AllowedKeyValue = Model['_id'],\n> extends AbstractStoreCursor<\n MongoStore<Model, KeyValue>,\n KeyValue,\n Model,\n Result\n> {\n // key in AbstractCursor\n\n private readonly cursor: FindCursor<Result>;\n\n private _result?: Result | null;\n\n constructor(store: MongoStore<Model, KeyValue>, cursor: FindCursor<Result>) {\n super(store);\n this.cursor = cursor;\n }\n\n advance(count: number): void {\n this.cursor.skip(count);\n }\n\n next(): Promise<KeyValue | undefined> {\n return this.cursor.next().then((value) => {\n this._result = value;\n this.key = value?._id;\n return this.key;\n });\n }\n\n override async forEach(\n callback: (result: Result) => Promise<void> | void,\n ): Promise<void> {\n for await (const result of this.cursor) {\n await callback(result);\n }\n }\n\n limit(newLimit: number): Promise<this> {\n this.cursor.limit(newLimit);\n return Promise.resolve(this);\n }\n\n override result(): Promise<Result> {\n if (!this._result) throw new Error('Cannot call result() before next()');\n return Promise.resolve(this._result);\n }\n\n close(): Promise<void> {\n if (this.cursor) {\n this.cursor.close();\n }\n\n return Promise.resolve();\n }\n\n toArray(): Promise<Result[]> {\n return this.cursor.toArray();\n }\n}\n","/* eslint-disable complexity, max-lines */\nimport type {\n QuerySubscription,\n SubscribeCallback,\n QueryResult,\n QueryParams,\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport mingo from 'mingo';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoCursor from './MongoCursor';\nimport type MongoStore from './MongoStore';\n\nconst identityTransformer = <\n Model extends MongoBaseModel<any>,\n Transformed = Model,\n>(\n model: Model,\n): Transformed => model as unknown as Transformed;\n\ntype TestCriteria = (obj: any) => boolean;\n\nexport default class MongoQueryCollection<\n Model extends MongoBaseModel<KeyValue>,\n Params extends QueryParams<Params> = never,\n KeyValue extends AllowedKeyValue = Model['_id'],\n Item extends Record<MongoKeyPath, KeyValue> = Model,\n> extends AbstractSubscribableStoreQuery<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n Params,\n Item[]\n> {\n private readonly store: MongoStore<Model, KeyValue>;\n\n private readonly options: QueryOptions<Model>;\n\n private testCriteria?: TestCriteria;\n\n private readonly transformer: Transformer<Model, Item>;\n\n constructor(\n store: MongoStore<Model, KeyValue>,\n options: QueryOptions<Model>,\n transformer: Transformer<Model, Item> = identityTransformer,\n ) {\n super();\n this.store = store;\n this.options = options;\n this.transformer = transformer;\n }\n\n createTestCriteria(): TestCriteria {\n if (!this.testCriteria) {\n if (!this.options.criteria) {\n return () => true;\n }\n\n // criteria not supported by mingo: updates will not work\n if ('$text' in this.options.criteria) {\n return () => false;\n }\n\n const mingoQuery = new mingo.Query(this.options.criteria);\n this.testCriteria = mingoQuery.test.bind(mingoQuery);\n }\n return this.testCriteria;\n }\n\n async fetch<T>(onFulfilled: (result: QueryResult<Item[]>) => T): Promise<T> {\n const [result, count] = await Promise.all([\n this.createMongoCursor().then((cursor) => cursor.toArray()),\n this.store.count(this.options.criteria),\n ]);\n\n return onFulfilled({\n result: result.map(this.transformer),\n meta: { total: count },\n info: {\n sort: this.options.sort,\n limit: this.options.limit,\n keyPath: this.store.keyPath,\n },\n });\n }\n\n _subscribe(\n callback: SubscribeCallback<KeyValue, Item[]>,\n _includeInitial: boolean,\n ): QuerySubscription {\n const store = super.getSubscribeStore();\n const testCriteria: TestCriteria = this.createTestCriteria();\n\n const promise: Promise<void> = _includeInitial\n ? this.fetch(({ result, meta, info }: QueryResult<Item[]>) => {\n callback(null, [\n {\n type: 'initial',\n initial: result,\n queryInfo: info,\n meta,\n },\n ]);\n })\n : Promise.resolve();\n\n const unsubscribe = store.subscribe((action: Actions<Model>) => {\n const changes: Changes<KeyValue, Item[]> = [];\n switch (action.type) {\n case 'inserted': {\n const filtered = action.next.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'inserted',\n result: filtered.map(this.transformer),\n });\n }\n break;\n }\n case 'deleted': {\n const filtered = action.prev.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'deleted',\n keys: filtered.map((object) => object[this.store.keyPath]),\n });\n }\n break;\n }\n case 'updated': {\n const {\n deleted,\n updated,\n inserted,\n }: {\n deleted: KeyValue[];\n updated: Item[];\n inserted: Item[];\n } = { deleted: [], updated: [], inserted: [] };\n\n action.changes.forEach(([prevObject, nextObject]: [Model, Model]) => {\n if (testCriteria(prevObject)) {\n if (!testCriteria(nextObject)) {\n deleted.push(prevObject[this.store.keyPath]);\n } else {\n updated.push(this.transformer(nextObject));\n }\n } else if (testCriteria(nextObject)) {\n inserted.push(this.transformer(nextObject));\n }\n });\n\n if (deleted.length > 0) {\n changes.push({ type: 'deleted', keys: deleted });\n }\n if (updated.length > 0) {\n changes.push({ type: 'updated', result: updated });\n }\n if (inserted.length > 0) {\n changes.push({ type: 'inserted', result: inserted });\n }\n\n break;\n }\n default:\n throw new Error('Unsupported type');\n }\n\n if (changes.length === 0) return;\n\n callback(null, changes);\n });\n // let _feed;\n // const promise = this.queryCallback(this.store.query(), this.store.r)\n // .changes({\n // includeInitial: _includeInitial,\n // includeStates: true,\n // includeTypes: true,\n // includeOffsets: true,\n // })\n // .then((feed) => {\n // if (args.length === 0) {\n // _feed = feed;\n // delete this._promise;\n // }\n //\n // feed.each(callback);\n // return feed;\n // });\n //\n // if (args.length === 0) this._promise = promise;\n\n return {\n stop: unsubscribe,\n cancel: unsubscribe,\n then: <T, U>(\n onFulfilled: () => Promise<T> | T,\n onRejected?: (error: any) => Promise<U> | U,\n ): Promise<T | U> => promise.then(onFulfilled, onRejected),\n };\n }\n\n private async createMongoCursor(): Promise<\n MongoCursor<Model, Model, KeyValue>\n > {\n const cursor = await this.store.cursor(\n this.options.criteria,\n this.options.sort,\n );\n\n if (this.options.skip) {\n cursor.advance(this.options.skip);\n }\n\n if (this.options.limit) {\n await cursor.limit(this.options.limit);\n }\n\n return cursor;\n }\n}\n","import type {\n QuerySubscription,\n SubscribeCallback,\n QueryResult,\n QueryParams,\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport mingo from 'mingo';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoCursor from './MongoCursor';\nimport type MongoStore from './MongoStore';\n\nconst identityTransformer = <\n Model extends MongoBaseModel<any>,\n Transformed = Model,\n>(\n model: Model,\n): Transformed => model as unknown as Transformed;\n\ntype TestCriteria = (obj: any) => boolean;\n\nexport default class MongoQuerySingleItem<\n Model extends MongoBaseModel<KeyValue>,\n Params extends QueryParams<Params> = never,\n Result extends Record<MongoKeyPath, KeyValue> | null = Model | null,\n KeyValue extends AllowedKeyValue = Model['_id'],\n> extends AbstractSubscribableStoreQuery<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n Params,\n Result\n> {\n private readonly store: MongoStore<Model, KeyValue>;\n\n private readonly options: QueryOptions<Model>;\n\n private testCriteria?: TestCriteria;\n\n private readonly transformer: Transformer<Model, Result>;\n\n constructor(\n store: MongoStore<Model, KeyValue>,\n options: QueryOptions<Model>,\n transformer: Transformer<Model, Result> = identityTransformer,\n ) {\n super();\n this.store = store;\n this.options = options;\n this.transformer = transformer;\n }\n\n createMingoTestCriteria(): TestCriteria {\n if (!this.testCriteria) {\n if (!this.options.criteria) {\n return () => true;\n }\n\n const mingoQuery = new mingo.Query(this.options.criteria);\n this.testCriteria = mingoQuery.test.bind(mingoQuery);\n }\n\n return this.testCriteria;\n }\n\n async fetch<T>(onFulfilled: (result: QueryResult<Result>) => T): Promise<T> {\n const cursor = await this.createMongoCursor();\n await cursor.limit(1);\n return cursor.toArray().then((result: Model[]) => {\n const item: Result =\n result.length === 0 ? (null as Result) : this.transformer(result[0]);\n return onFulfilled({\n result: item,\n meta: { total: result === null ? 0 : 1 },\n info: {\n limit: 1,\n keyPath: this.store.keyPath,\n },\n });\n });\n }\n\n _subscribe(\n callback: SubscribeCallback<KeyValue, Result>,\n _includeInitial: boolean,\n ): QuerySubscription {\n const store = super.getSubscribeStore();\n const testCriteria: TestCriteria = this.createMingoTestCriteria();\n\n const promise: Promise<void> = _includeInitial\n ? this.fetch(({ result, meta, info }: QueryResult<Result>) => {\n callback(null, [\n {\n type: 'initial',\n initial: result,\n queryInfo: info,\n meta,\n },\n ]);\n })\n : Promise.resolve();\n\n const unsubscribe = store.subscribe(async (action: Actions<Model>) => {\n const changes: Changes<KeyValue, Result> = [];\n switch (action.type) {\n case 'inserted': {\n const filtered = action.next.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'updated',\n result: this.transformer(filtered[0]),\n });\n }\n break;\n }\n case 'deleted': {\n const filtered = action.prev.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'deleted',\n keys: filtered.map((object) => object[this.store.keyPath]),\n });\n }\n break;\n }\n case 'updated': {\n const filtered = action.changes.filter(([prev, next]) =>\n testCriteria(prev),\n );\n if (filtered.length > 0) {\n if (this.options.sort) {\n const { result } = await this.fetch((res) => res);\n changes.push({\n type: 'updated',\n result,\n });\n } else if (filtered.length !== 1) {\n throw new Error(\n 'should not match more than 1, use sort if you can have multiple match',\n );\n } else {\n const [, next] = filtered[0];\n changes.push({\n type: 'updated',\n result: testCriteria(next) ? this.transformer(next) : null!,\n });\n }\n } else if (filtered.length === 0) {\n }\n break;\n }\n default:\n throw new Error('Unsupported type');\n }\n\n if (changes.length === 0) return;\n\n callback(null, changes);\n });\n\n return {\n stop: unsubscribe,\n cancel: unsubscribe,\n then: <T, U>(\n onFulfilled: () => Promise<T> | T,\n onRejected?: (error: any) => Promise<U> | U,\n ): Promise<T | U> => promise.then(onFulfilled, onRejected),\n };\n }\n\n private async createMongoCursor(): Promise<\n MongoCursor<Model, Model, KeyValue>\n > {\n const cursor = await this.store.cursor(\n this.options.criteria,\n this.options.sort,\n );\n\n if (this.options.limit) {\n await cursor.limit(this.options.limit);\n }\n\n return cursor;\n }\n}\n","/* eslint-disable max-lines */\nimport type {\n UpsertResult,\n SubscribableStore,\n QueryParams,\n UpsertPartialObject,\n Criteria,\n Sort,\n Update,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n OptionalBaseModelKeysForInsert,\n} from 'liwi-store';\nimport type {\n Collection,\n Filter,\n FindCursor,\n MongoClient,\n UpdateFilter,\n} from 'mongodb';\nimport mongodb from 'mongodb';\nimport type {\n MongoBaseModel,\n MongoKeyPath,\n MongoInsertType,\n} from './MongoBaseModel';\nimport type MongoConnection from './MongoConnection';\nimport MongoCursor from './MongoCursor';\nimport MongoQueryCollection from './MongoQueryCollection';\nimport MongoQuerySingleItem from './MongoQuerySingleItem';\n\nexport interface MongoUpsertResult<\n KeyValue extends AllowedKeyValue,\n Model extends MongoBaseModel<KeyValue>,\n> extends UpsertResult<Model> {\n object: Model;\n inserted: boolean;\n}\n\nexport default class MongoStore<\n Model extends MongoBaseModel<KeyValue>,\n KeyValue extends AllowedKeyValue = Model[MongoKeyPath],\n> implements\n SubscribableStore<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model>,\n MongoConnection\n >\n{\n readonly keyPath: MongoKeyPath = '_id';\n\n readonly connection: MongoConnection;\n\n private _collection: Collection<Model> | Promise<Collection<Model>>;\n\n constructor(connection: MongoConnection, collectionName: string) {\n this.connection = connection;\n\n if (!collectionName) {\n throw new Error(`Invalid collectionName: \"${collectionName}\"`);\n }\n\n this._collection = connection.getConnection().then(\n (client: MongoClient) => {\n this._collection = client.db().collection(collectionName);\n return this._collection;\n },\n (error: Error) => {\n this._collection = Promise.reject(error);\n return this._collection;\n },\n );\n }\n\n get collection(): Promise<Collection<Model>> {\n if (this.connection.connectionFailed) {\n return Promise.reject(new Error('MongoDB connection failed'));\n }\n\n return Promise.resolve(this._collection);\n }\n\n createQuerySingleItem<\n Result extends Record<MongoKeyPath, KeyValue> = Model,\n Params extends QueryParams<Params> = never,\n >(\n options: QueryOptions<Model>,\n transformer?: Transformer<Model, Result>,\n ): MongoQuerySingleItem<Model, Params, Result, KeyValue> {\n return new MongoQuerySingleItem<Model, Params, Result, KeyValue>(\n this,\n options,\n transformer,\n );\n }\n\n createQueryCollection<\n Item extends Record<MongoKeyPath, KeyValue> = Model,\n Params extends QueryParams<Params> = never,\n >(\n options: QueryOptions<Model>,\n transformer?: Transformer<Model, Item>,\n ): MongoQueryCollection<Model, Params, Model['_id'], Item> {\n return new MongoQueryCollection<Model, Params, KeyValue, Item>(\n this,\n options,\n transformer,\n );\n }\n\n async insertOne(object: MongoInsertType<Model>): Promise<Model> {\n if (!object._id) {\n object._id = new mongodb.ObjectId().toString() as Model['_id'];\n }\n\n if (!object.created) object.created = new Date();\n if (!object.updated) object.updated = new Date();\n\n const collection = await this.collection;\n const { acknowledged: isAcknowledged } = await collection.insertOne(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n object as any,\n );\n if (!isAcknowledged) {\n throw new Error('Fail to insert');\n }\n\n return object as Model;\n }\n\n async replaceOne(object: Model): Promise<Model> {\n if (!object.updated) object.updated = new Date();\n\n const collection = await this.collection;\n await collection.replaceOne({ _id: object._id } as Filter<Model>, object);\n return object;\n }\n\n async upsertOne<\n K extends Exclude<\n keyof Model,\n MongoKeyPath | OptionalBaseModelKeysForInsert\n >,\n >(\n object: UpsertPartialObject<MongoKeyPath, KeyValue, Model, K>,\n setOnInsertPartialObject?: Update<Model>['$setOnInsert'],\n ): Promise<Model> {\n const result = await this.upsertOneWithInfo(\n object,\n setOnInsertPartialObject,\n );\n return result.object;\n }\n\n async upsertOneWithInfo<\n K extends Exclude<\n keyof Model,\n MongoKeyPath | OptionalBaseModelKeysForInsert\n >,\n >(\n object: UpsertPartialObject<MongoKeyPath, KeyValue, Model, K>,\n setOnInsertPartialObject?: Update<Model>['$setOnInsert'],\n ): Promise<MongoUpsertResult<KeyValue, Model>> {\n const $setOnInsert: Update<Model>['$setOnInsert'] = {\n // @ts-expect-error -- created is Date as set in BaseModel\n created: object.created || new Date(),\n ...setOnInsertPartialObject,\n };\n\n if (!object.updated) {\n (object as MongoBaseModel).updated = new Date();\n }\n\n const $set: Partial<typeof object> = { ...object };\n delete $set.created;\n\n const collection = await this.collection;\n\n const { upsertedCount } = await collection.updateOne(\n { _id: object._id } as Filter<Model>,\n { $set, $setOnInsert } as UpdateFilter<Model>,\n { upsert: true },\n );\n\n if (upsertedCount) {\n Object.assign(object, $setOnInsert);\n }\n\n return { object: object as unknown as Model, inserted: !!upsertedCount };\n }\n\n replaceSeveral(objects: Model[]): Promise<Model[]> {\n return Promise.all(objects.map((object: Model) => this.replaceOne(object)));\n }\n\n async partialUpdateByKey(\n key: KeyValue,\n partialUpdate: Update<Model>,\n criteria?: Criteria<Model>,\n ): Promise<Model> {\n const collection = await this.collection;\n const commandResult = await collection.updateOne(\n { _id: key, ...criteria } as Filter<Model>,\n partialUpdate as UpdateFilter<Model>,\n );\n if (!commandResult.acknowledged) {\n console.error(commandResult);\n throw new Error('Update failed');\n }\n const object = await this.findByKey(key);\n return object!;\n }\n\n partialUpdateOne(\n object: Model,\n partialUpdate: Update<Model>,\n ): Promise<Model> {\n return this.partialUpdateByKey(object._id, partialUpdate);\n }\n\n partialUpdateMany(\n criteria: Criteria<Model>,\n partialUpdate: Update<Model>,\n ): Promise<void> {\n return this.collection\n .then((collection) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n collection.updateMany(criteria as Filter<Model>, partialUpdate as any),\n )\n .then((res) => undefined); // TODO return updated object\n }\n\n deleteByKey(key: KeyValue, criteria?: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) =>\n collection.deleteOne({ _id: key, ...criteria } as Filter<Model>),\n )\n .then(() => undefined);\n }\n\n deleteOne(object: Model): Promise<void> {\n return this.deleteByKey(object._id);\n }\n\n deleteMany(selector: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) => collection.deleteMany(selector as Filter<Model>))\n .then(() => undefined);\n }\n\n async count(filter?: Criteria<Model>): Promise<number> {\n const collection = await this.collection;\n return filter\n ? collection.countDocuments(filter as Filter<Model>)\n : collection.countDocuments();\n }\n\n async cursor<Result extends Partial<Model> = Model>(\n filter?: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<MongoCursor<Model, Result, KeyValue>> {\n const collection = await this.collection;\n const findCursor = filter\n ? collection.find<Result>(filter as Filter<Model>)\n : (collection.find() as unknown as FindCursor<Result>);\n if (sort) findCursor.sort(sort);\n return new MongoCursor<Model, Result, KeyValue>(this, findCursor);\n }\n\n async findByKey(\n key: KeyValue,\n criteria?: Criteria<Model>,\n ): Promise<Model | undefined> {\n const collection = await this.collection;\n const result = await collection.findOne<Model>({\n _id: key,\n ...criteria,\n } as Filter<Model>);\n return result || undefined;\n }\n\n findAll(criteria?: Criteria<Model>, sort?: Sort<Model>): Promise<Model[]> {\n return this.cursor<Model>(criteria, sort).then((cursor) =>\n cursor.toArray(),\n );\n }\n\n async findOne(\n filter: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<Model | undefined> {\n const collection = await this.collection;\n const result = await collection.findOne<Model>(filter as Filter<Model>, {\n sort,\n });\n return result || undefined;\n }\n}\n","import { AbstractConnection } from 'liwi-store';\nimport mongodb from 'mongodb';\nimport { Logger } from 'nightingale-logger';\n\nconst logger = new Logger('liwi:mongo:MongoConnection');\n\nexport default class MongoConnection extends AbstractConnection {\n _connection?: mongodb.MongoClient;\n\n _connecting?: Promise<mongodb.MongoClient>;\n\n connectionFailed?: boolean;\n\n // TODO interface\n constructor(config: Map<string, number | string>) {\n super();\n\n if (!config.has('host')) {\n config.set('host', 'localhost');\n }\n if (!config.has('port')) {\n config.set('port', '27017');\n }\n if (!config.has('database')) {\n throw new Error('Missing config database');\n }\n\n const buildConnectionString = (redactCredentials: boolean): string =>\n `mongodb://${\n config.has('user')\n ? `${\n redactCredentials\n ? `${(config.get('user') as string).slice(0, 2)}[redacted]`\n : (config.get('user') as string)\n }:${\n redactCredentials\n ? '[redacted]'\n : (config.get('password') as string)\n }@`\n : ''\n }` +\n `${config.get('host') as string}:${config.get('port') as string}/${\n config.get('database') as string\n }`;\n\n const connectionString = buildConnectionString(false);\n const connectionStringRedacted = buildConnectionString(true);\n\n this.connect(connectionString, connectionStringRedacted);\n }\n\n connect(connectionString: string, connectionStringRedacted: string): void {\n logger.info('connecting', { connectionStringRedacted });\n\n const connectPromise = mongodb.MongoClient.connect(connectionString)\n .then((connection) => {\n logger.info('connected', { connectionStringRedacted });\n connection.on('close', () => {\n logger.warn('close', { connectionStringRedacted });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection closed');\n };\n });\n connection.on('timeout', () => {\n logger.warn('timeout', { connectionStringRedacted });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection timeout');\n };\n });\n connection.on('reconnect', () => {\n logger.warn('reconnect', { connectionStringRedacted });\n this.connectionFailed = false;\n this.getConnection = () => Promise.resolve(this._connection!);\n });\n connection.on('error', (err) => {\n logger.warn('error', { connectionStringRedacted, err });\n });\n\n this._connection = connection;\n this._connecting = undefined;\n this.getConnection = () => Promise.resolve(this._connection!);\n return connection;\n })\n .catch((error) => {\n logger.info('not connected', { connectionStringRedacted });\n console.error(error.message || error);\n // throw err;\n process.nextTick(() => {\n // eslint-disable-next-line unicorn/no-process-exit, n/no-process-exit\n process.exit(1);\n });\n\n throw error;\n });\n\n this.getConnection = () => Promise.resolve(connectPromise);\n this._connecting = this.getConnection();\n }\n\n // eslint-disable-next-line @typescript-eslint/class-methods-use-this\n getConnection(): Promise<mongodb.MongoClient> {\n throw new Error('call connect()');\n }\n\n async close(): Promise<void> {\n this.getConnection = () => Promise.reject(new Error('Connection closed'));\n if (this._connection) {\n await this._connection.close();\n this._connection = undefined;\n } else if (this._connecting) {\n await this._connecting;\n await this.close();\n }\n }\n}\n","import type { AllowedKeyValue } from 'liwi-store';\nimport { SubscribeStore } from 'liwi-subscribe-store';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoConnection from './MongoConnection';\nimport type MongoStore from './MongoStore';\n\nexport default function createMongoSubscribeStore<\n Model extends MongoBaseModel<KeyValue>,\n KeyValue extends AllowedKeyValue = Model[MongoKeyPath],\n>(\n mongoStore: MongoStore<Model, KeyValue>,\n): SubscribeStore<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n MongoConnection,\n MongoStore<Model, KeyValue>\n> {\n return new SubscribeStore(mongoStore);\n}\n"],"names":["MongoCursor","AbstractStoreCursor","constructor","store","cursor","advance","count","skip","next","then","value","_result","key","_id","forEach","callback","result","limit","newLimit","Promise","resolve","Error","close","toArray","identityTransformer","model","MongoQueryCollection","AbstractSubscribableStoreQuery","options","transformer","createTestCriteria","testCriteria","criteria","mingoQuery","mingo","Query","test","bind","fetch","onFulfilled","all","createMongoCursor","map","meta","total","info","sort","keyPath","_subscribe","_includeInitial","getSubscribeStore","promise","type","initial","queryInfo","unsubscribe","subscribe","action","changes","filtered","filter","length","push","prev","keys","object","deleted","updated","inserted","prevObject","nextObject","stop","cancel","onRejected","MongoQuerySingleItem","createMingoTestCriteria","item","res","MongoStore","connection","collectionName","_collection","getConnection","client","db","collection","error","reject","connectionFailed","createQuerySingleItem","createQueryCollection","insertOne","mongodb","ObjectId","toString","created","Date","acknowledged","isAcknowledged","replaceOne","upsertOne","setOnInsertPartialObject","upsertOneWithInfo","$setOnInsert","$set","upsertedCount","updateOne","upsert","Object","assign","replaceSeveral","objects","partialUpdateByKey","partialUpdate","commandResult","console","findByKey","partialUpdateOne","partialUpdateMany","updateMany","undefined","deleteByKey","deleteOne","deleteMany","selector","countDocuments","findCursor","find","findOne","findAll","logger","Logger","MongoConnection","AbstractConnection","config","has","set","buildConnectionString","redactCredentials","get","slice","connectionString","connectionStringRedacted","connect","connectPromise","MongoClient","on","warn","_connection","err","_connecting","catch","message","process","nextTick","exit","createMongoSubscribeStore","mongoStore","SubscribeStore"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "liwi-mongo",
3
- "version": "10.5.0",
3
+ "version": "12.0.0",
4
4
  "description": "mongo implementation for liwi",
5
5
  "keywords": [],
6
6
  "author": "Christophe Hurpeau <christophe@hurpeau.com> (https://christophe.hurpeau.com)",
@@ -13,20 +13,24 @@
13
13
  "homepage": "https://github.com/liwijs/liwi",
14
14
  "type": "module",
15
15
  "engines": {
16
- "node": ">=16.0.0"
16
+ "node": ">=18.12.0"
17
17
  },
18
- "main": "./dist/index-node16.mjs",
18
+ "sideEffects": false,
19
+ "main": "./dist/index-node18.mjs",
19
20
  "types": "./dist/definitions/index.d.ts",
20
21
  "exports": {
21
22
  "./package.json": "./package.json",
22
23
  ".": {
23
24
  "types": "./dist/definitions/index.d.ts",
24
25
  "node": {
25
- "import": "./dist/index-node16.mjs"
26
+ "import": "./dist/index-node18.mjs"
26
27
  }
27
28
  }
28
29
  },
29
- "sideEffects": false,
30
+ "files": [
31
+ "src",
32
+ "dist"
33
+ ],
30
34
  "scripts": {
31
35
  "build": "yarn clean:build && rollup --config rollup.config.mjs && yarn run build:definitions",
32
36
  "build:definitions": "tsc -p tsconfig.json",
@@ -36,29 +40,28 @@
36
40
  "lint:eslint": "yarn ../.. run eslint --report-unused-disable-directives --resolve-plugins-relative-to . --quiet packages/liwi-mongo",
37
41
  "watch": "yarn clean:build && rollup --config rollup.config.mjs --watch"
38
42
  },
39
- "prettier": "@pob/root/prettier-config",
40
43
  "pob": {
41
44
  "babelEnvs": [
42
45
  {
43
46
  "target": "node",
44
- "version": "16"
47
+ "version": "18"
45
48
  }
46
49
  ],
47
50
  "entries": [
48
51
  "index"
49
52
  ]
50
53
  },
54
+ "prettier": "@pob/root/prettier-config",
51
55
  "dependencies": {
52
- "liwi-store": "10.4.0",
53
- "liwi-subscribe-store": "10.4.0",
56
+ "liwi-store": "12.0.0",
57
+ "liwi-subscribe-store": "12.0.0",
54
58
  "mingo": "^6.2.7",
55
- "mongodb": "^5.0.0",
56
- "nightingale-logger": "^14.0.0"
59
+ "mongodb": "^6.0.0",
60
+ "nightingale-logger": "^15.0.0"
57
61
  },
58
62
  "devDependencies": {
59
- "@babel/core": "7.21.3",
60
- "pob-babel": "35.6.2",
61
- "typescript": "4.9.5"
62
- },
63
- "gitHead": "d038eba45f0206edf8ccb5aee154e34a2df56fce"
64
- }
63
+ "@babel/core": "7.24.3",
64
+ "pob-babel": "38.0.3",
65
+ "typescript": "5.3.3"
66
+ }
67
+ }
@@ -2,6 +2,7 @@
2
2
  "root": true,
3
3
  "parser": "@typescript-eslint/parser",
4
4
  "parserOptions": {
5
+ "EXPERIMENTAL_useProjectService": true,
5
6
  "project": "packages/liwi-mongo/tsconfig.json"
6
7
  },
7
8
  "plugins": ["@typescript-eslint"],
@@ -83,22 +83,23 @@ export default class MongoConnection extends AbstractConnection {
83
83
  this.getConnection = () => Promise.resolve(this._connection!);
84
84
  return connection;
85
85
  })
86
- .catch((err) => {
86
+ .catch((error) => {
87
87
  logger.info('not connected', { connectionStringRedacted });
88
- console.error(err.message || err);
88
+ console.error(error.message || error);
89
89
  // throw err;
90
90
  process.nextTick(() => {
91
- // eslint-disable-next-line unicorn/no-process-exit
91
+ // eslint-disable-next-line unicorn/no-process-exit, n/no-process-exit
92
92
  process.exit(1);
93
93
  });
94
94
 
95
- throw err;
95
+ throw error;
96
96
  });
97
97
 
98
98
  this.getConnection = () => Promise.resolve(connectPromise);
99
99
  this._connecting = this.getConnection();
100
100
  }
101
101
 
102
+ // eslint-disable-next-line @typescript-eslint/class-methods-use-this
102
103
  getConnection(): Promise<mongodb.MongoClient> {
103
104
  throw new Error('call connect()');
104
105
  }
@@ -37,12 +37,20 @@ export default class MongoCursor<
37
37
  });
38
38
  }
39
39
 
40
+ override async forEach(
41
+ callback: (result: Result) => Promise<void> | void,
42
+ ): Promise<void> {
43
+ for await (const result of this.cursor) {
44
+ await callback(result);
45
+ }
46
+ }
47
+
40
48
  limit(newLimit: number): Promise<this> {
41
49
  this.cursor.limit(newLimit);
42
50
  return Promise.resolve(this);
43
51
  }
44
52
 
45
- result(): Promise<Result> {
53
+ override result(): Promise<Result> {
46
54
  if (!this._result) throw new Error('Cannot call result() before next()');
47
55
  return Promise.resolve(this._result);
48
56
  }
package/src/MongoStore.ts CHANGED
@@ -68,8 +68,8 @@ export default class MongoStore<
68
68
  this._collection = client.db().collection(collectionName);
69
69
  return this._collection;
70
70
  },
71
- (err: any) => {
72
- this._collection = Promise.reject(err);
71
+ (error: Error) => {
72
+ this._collection = Promise.reject(error);
73
73
  return this._collection;
74
74
  },
75
75
  );
package/.editorconfig DELETED
@@ -1,13 +0,0 @@
1
- # EditorConfig helps developers define and maintain consistent
2
- # coding styles between different editors and IDEs
3
- # http://editorconfig.org
4
-
5
- root = true
6
-
7
- [*]
8
- indent_style = space
9
- indent_size = 2
10
- end_of_line = lf
11
- charset = utf-8
12
- trim_trailing_whitespace = true
13
- insert_final_newline = true
package/.eslintrc.json DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "root": true,
3
- "extends": ["@pob/eslint-config/root-module"],
4
- "ignorePatterns": ["*.d.ts", "/dist"]
5
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-node16.mjs","sources":["../src/MongoCursor.ts","../src/MongoQueryCollection.ts","../src/MongoQuerySingleItem.ts","../src/MongoStore.ts","../src/MongoConnection.ts","../src/createMongoSubscribeStore.ts"],"sourcesContent":["import { AbstractStoreCursor } from 'liwi-store';\nimport type { AllowedKeyValue } from 'liwi-store';\nimport type { FindCursor } from 'mongodb';\nimport type { MongoBaseModel } from './MongoBaseModel';\nimport type MongoStore from './MongoStore';\n\nexport default class MongoCursor<\n Model extends MongoBaseModel<KeyValue>,\n Result extends Partial<Model> = Model,\n KeyValue extends AllowedKeyValue = Model['_id'],\n> extends AbstractStoreCursor<\n MongoStore<Model, KeyValue>,\n KeyValue,\n Model,\n Result\n> {\n // key in AbstractCursor\n\n private readonly cursor: FindCursor<Result>;\n\n private _result?: Result | null;\n\n constructor(store: MongoStore<Model, KeyValue>, cursor: FindCursor<Result>) {\n super(store);\n this.cursor = cursor;\n }\n\n advance(count: number): void {\n this.cursor.skip(count);\n }\n\n next(): Promise<KeyValue | undefined> {\n return this.cursor.next().then((value) => {\n this._result = value;\n this.key = value?._id;\n return this.key;\n });\n }\n\n limit(newLimit: number): Promise<this> {\n this.cursor.limit(newLimit);\n return Promise.resolve(this);\n }\n\n result(): Promise<Result> {\n if (!this._result) throw new Error('Cannot call result() before next()');\n return Promise.resolve(this._result);\n }\n\n close(): Promise<void> {\n if (this.cursor) {\n this.cursor.close();\n }\n\n return Promise.resolve();\n }\n\n toArray(): Promise<Result[]> {\n return this.cursor.toArray();\n }\n}\n","/* eslint-disable complexity, max-lines */\nimport type {\n QuerySubscription,\n SubscribeCallback,\n QueryResult,\n QueryParams,\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport mingo from 'mingo';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoCursor from './MongoCursor';\nimport type MongoStore from './MongoStore';\n\nconst identityTransformer = <\n Model extends MongoBaseModel<any>,\n Transformed = Model,\n>(\n model: Model,\n): Transformed => model as unknown as Transformed;\n\ntype TestCriteria = (obj: any) => boolean;\n\nexport default class MongoQueryCollection<\n Model extends MongoBaseModel<KeyValue>,\n Params extends QueryParams<Params> = never,\n KeyValue extends AllowedKeyValue = Model['_id'],\n Item extends Record<MongoKeyPath, KeyValue> = Model,\n> extends AbstractSubscribableStoreQuery<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n Params,\n Item[]\n> {\n private readonly store: MongoStore<Model, KeyValue>;\n\n private readonly options: QueryOptions<Model>;\n\n private testCriteria?: TestCriteria;\n\n private readonly transformer: Transformer<Model, Item>;\n\n constructor(\n store: MongoStore<Model, KeyValue>,\n options: QueryOptions<Model>,\n transformer: Transformer<Model, Item> = identityTransformer,\n ) {\n super();\n this.store = store;\n this.options = options;\n this.transformer = transformer;\n }\n\n createTestCriteria(): TestCriteria {\n if (!this.testCriteria) {\n if (!this.options.criteria) {\n return () => true;\n }\n\n // criteria not supported by mingo: updates will not work\n if ('$text' in this.options.criteria) {\n return () => false;\n }\n\n const mingoQuery = new mingo.Query(this.options.criteria);\n this.testCriteria = mingoQuery.test.bind(mingoQuery);\n }\n return this.testCriteria;\n }\n\n async fetch<T>(onFulfilled: (result: QueryResult<Item[]>) => T): Promise<T> {\n const [result, count] = await Promise.all([\n this.createMongoCursor().then((cursor) => cursor.toArray()),\n this.store.count(this.options.criteria),\n ]);\n\n return onFulfilled({\n result: result.map(this.transformer),\n meta: { total: count },\n info: {\n sort: this.options.sort,\n limit: this.options.limit,\n keyPath: this.store.keyPath,\n },\n });\n }\n\n _subscribe(\n callback: SubscribeCallback<KeyValue, Item[]>,\n _includeInitial: boolean,\n ): QuerySubscription {\n const store = super.getSubscribeStore();\n const testCriteria: TestCriteria = this.createTestCriteria();\n\n const promise: Promise<void> = _includeInitial\n ? this.fetch(({ result, meta, info }: QueryResult<Item[]>) => {\n callback(null, [\n {\n type: 'initial',\n initial: result,\n queryInfo: info,\n meta,\n },\n ]);\n })\n : Promise.resolve();\n\n const unsubscribe = store.subscribe((action: Actions<Model>) => {\n const changes: Changes<KeyValue, Item[]> = [];\n switch (action.type) {\n case 'inserted': {\n const filtered = action.next.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'inserted',\n result: filtered.map(this.transformer),\n });\n }\n break;\n }\n case 'deleted': {\n const filtered = action.prev.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'deleted',\n keys: filtered.map((object) => object[this.store.keyPath]),\n });\n }\n break;\n }\n case 'updated': {\n const {\n deleted,\n updated,\n inserted,\n }: {\n deleted: KeyValue[];\n updated: Item[];\n inserted: Item[];\n } = { deleted: [], updated: [], inserted: [] };\n\n action.changes.forEach(([prevObject, nextObject]: [Model, Model]) => {\n if (testCriteria(prevObject)) {\n if (!testCriteria(nextObject)) {\n deleted.push(prevObject[this.store.keyPath]);\n } else {\n updated.push(this.transformer(nextObject));\n }\n } else if (testCriteria(nextObject)) {\n inserted.push(this.transformer(nextObject));\n }\n });\n\n if (deleted.length > 0) {\n changes.push({ type: 'deleted', keys: deleted });\n }\n if (updated.length > 0) {\n changes.push({ type: 'updated', result: updated });\n }\n if (inserted.length > 0) {\n changes.push({ type: 'inserted', result: inserted });\n }\n\n break;\n }\n default:\n throw new Error('Unsupported type');\n }\n\n if (changes.length === 0) return;\n\n callback(null, changes);\n });\n // let _feed;\n // const promise = this.queryCallback(this.store.query(), this.store.r)\n // .changes({\n // includeInitial: _includeInitial,\n // includeStates: true,\n // includeTypes: true,\n // includeOffsets: true,\n // })\n // .then((feed) => {\n // if (args.length === 0) {\n // _feed = feed;\n // delete this._promise;\n // }\n //\n // feed.each(callback);\n // return feed;\n // });\n //\n // if (args.length === 0) this._promise = promise;\n\n return {\n stop: unsubscribe,\n cancel: unsubscribe,\n then: <T, U>(\n onFulfilled: () => Promise<T> | T,\n onRejected?: (error: any) => Promise<U> | U,\n ): Promise<T | U> => promise.then(onFulfilled, onRejected),\n };\n }\n\n private async createMongoCursor(): Promise<\n MongoCursor<Model, Model, KeyValue>\n > {\n const cursor = await this.store.cursor(\n this.options.criteria,\n this.options.sort,\n );\n\n if (this.options.skip) {\n cursor.advance(this.options.skip);\n }\n\n if (this.options.limit) {\n await cursor.limit(this.options.limit);\n }\n\n return cursor;\n }\n}\n","import type {\n QuerySubscription,\n SubscribeCallback,\n QueryResult,\n QueryParams,\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport mingo from 'mingo';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoCursor from './MongoCursor';\nimport type MongoStore from './MongoStore';\n\nconst identityTransformer = <\n Model extends MongoBaseModel<any>,\n Transformed = Model,\n>(\n model: Model,\n): Transformed => model as unknown as Transformed;\n\ntype TestCriteria = (obj: any) => boolean;\n\nexport default class MongoQuerySingleItem<\n Model extends MongoBaseModel<KeyValue>,\n Params extends QueryParams<Params> = never,\n Result extends Record<MongoKeyPath, KeyValue> | null = Model | null,\n KeyValue extends AllowedKeyValue = Model['_id'],\n> extends AbstractSubscribableStoreQuery<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n Params,\n Result\n> {\n private readonly store: MongoStore<Model, KeyValue>;\n\n private readonly options: QueryOptions<Model>;\n\n private testCriteria?: TestCriteria;\n\n private readonly transformer: Transformer<Model, Result>;\n\n constructor(\n store: MongoStore<Model, KeyValue>,\n options: QueryOptions<Model>,\n transformer: Transformer<Model, Result> = identityTransformer,\n ) {\n super();\n this.store = store;\n this.options = options;\n this.transformer = transformer;\n }\n\n createMingoTestCriteria(): TestCriteria {\n if (!this.testCriteria) {\n if (!this.options.criteria) {\n return () => true;\n }\n\n const mingoQuery = new mingo.Query(this.options.criteria);\n this.testCriteria = mingoQuery.test.bind(mingoQuery);\n }\n\n return this.testCriteria;\n }\n\n async fetch<T>(onFulfilled: (result: QueryResult<Result>) => T): Promise<T> {\n const cursor = await this.createMongoCursor();\n await cursor.limit(1);\n return cursor.toArray().then((result: Model[]) => {\n const item: Result =\n result.length === 0 ? (null as Result) : this.transformer(result[0]);\n return onFulfilled({\n result: item,\n meta: { total: result === null ? 0 : 1 },\n info: {\n limit: 1,\n keyPath: this.store.keyPath,\n },\n });\n });\n }\n\n _subscribe(\n callback: SubscribeCallback<KeyValue, Result>,\n _includeInitial: boolean,\n ): QuerySubscription {\n const store = super.getSubscribeStore();\n const testCriteria: TestCriteria = this.createMingoTestCriteria();\n\n const promise: Promise<void> = _includeInitial\n ? this.fetch(({ result, meta, info }: QueryResult<Result>) => {\n callback(null, [\n {\n type: 'initial',\n initial: result,\n queryInfo: info,\n meta,\n },\n ]);\n })\n : Promise.resolve();\n\n const unsubscribe = store.subscribe(async (action: Actions<Model>) => {\n const changes: Changes<KeyValue, Result> = [];\n switch (action.type) {\n case 'inserted': {\n const filtered = action.next.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'updated',\n result: this.transformer(filtered[0]),\n });\n }\n break;\n }\n case 'deleted': {\n const filtered = action.prev.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'deleted',\n keys: filtered.map((object) => object[this.store.keyPath]),\n });\n }\n break;\n }\n case 'updated': {\n const filtered = action.changes.filter(([prev, next]) =>\n testCriteria(prev),\n );\n if (filtered.length > 0) {\n if (this.options.sort) {\n const { result } = await this.fetch((res) => res);\n changes.push({\n type: 'updated',\n result,\n });\n } else if (filtered.length !== 1) {\n throw new Error(\n 'should not match more than 1, use sort if you can have multiple match',\n );\n } else {\n const [, next] = filtered[0];\n changes.push({\n type: 'updated',\n result: testCriteria(next) ? this.transformer(next) : null!,\n });\n }\n } else if (filtered.length === 0) {\n }\n break;\n }\n default:\n throw new Error('Unsupported type');\n }\n\n if (changes.length === 0) return;\n\n callback(null, changes);\n });\n\n return {\n stop: unsubscribe,\n cancel: unsubscribe,\n then: <T, U>(\n onFulfilled: () => Promise<T> | T,\n onRejected?: (error: any) => Promise<U> | U,\n ): Promise<T | U> => promise.then(onFulfilled, onRejected),\n };\n }\n\n private async createMongoCursor(): Promise<\n MongoCursor<Model, Model, KeyValue>\n > {\n const cursor = await this.store.cursor(\n this.options.criteria,\n this.options.sort,\n );\n\n if (this.options.limit) {\n await cursor.limit(this.options.limit);\n }\n\n return cursor;\n }\n}\n","/* eslint-disable max-lines */\nimport type {\n UpsertResult,\n SubscribableStore,\n QueryParams,\n UpsertPartialObject,\n Criteria,\n Sort,\n Update,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n OptionalBaseModelKeysForInsert,\n} from 'liwi-store';\nimport type {\n Collection,\n Filter,\n FindCursor,\n MongoClient,\n UpdateFilter,\n} from 'mongodb';\nimport mongodb from 'mongodb';\nimport type {\n MongoBaseModel,\n MongoKeyPath,\n MongoInsertType,\n} from './MongoBaseModel';\nimport type MongoConnection from './MongoConnection';\nimport MongoCursor from './MongoCursor';\nimport MongoQueryCollection from './MongoQueryCollection';\nimport MongoQuerySingleItem from './MongoQuerySingleItem';\n\nexport interface MongoUpsertResult<\n KeyValue extends AllowedKeyValue,\n Model extends MongoBaseModel<KeyValue>,\n> extends UpsertResult<Model> {\n object: Model;\n inserted: boolean;\n}\n\nexport default class MongoStore<\n Model extends MongoBaseModel<KeyValue>,\n KeyValue extends AllowedKeyValue = Model[MongoKeyPath],\n> implements\n SubscribableStore<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model>,\n MongoConnection\n >\n{\n readonly keyPath: MongoKeyPath = '_id';\n\n readonly connection: MongoConnection;\n\n private _collection: Collection<Model> | Promise<Collection<Model>>;\n\n constructor(connection: MongoConnection, collectionName: string) {\n this.connection = connection;\n\n if (!collectionName) {\n throw new Error(`Invalid collectionName: \"${collectionName}\"`);\n }\n\n this._collection = connection.getConnection().then(\n (client: MongoClient) => {\n this._collection = client.db().collection(collectionName);\n return this._collection;\n },\n (err: any) => {\n this._collection = Promise.reject(err);\n return this._collection;\n },\n );\n }\n\n get collection(): Promise<Collection<Model>> {\n if (this.connection.connectionFailed) {\n return Promise.reject(new Error('MongoDB connection failed'));\n }\n\n return Promise.resolve(this._collection);\n }\n\n createQuerySingleItem<\n Result extends Record<MongoKeyPath, KeyValue> = Model,\n Params extends QueryParams<Params> = never,\n >(\n options: QueryOptions<Model>,\n transformer?: Transformer<Model, Result>,\n ): MongoQuerySingleItem<Model, Params, Result, KeyValue> {\n return new MongoQuerySingleItem<Model, Params, Result, KeyValue>(\n this,\n options,\n transformer,\n );\n }\n\n createQueryCollection<\n Item extends Record<MongoKeyPath, KeyValue> = Model,\n Params extends QueryParams<Params> = never,\n >(\n options: QueryOptions<Model>,\n transformer?: Transformer<Model, Item>,\n ): MongoQueryCollection<Model, Params, Model['_id'], Item> {\n return new MongoQueryCollection<Model, Params, KeyValue, Item>(\n this,\n options,\n transformer,\n );\n }\n\n async insertOne(object: MongoInsertType<Model>): Promise<Model> {\n if (!object._id) {\n object._id = new mongodb.ObjectId().toString() as Model['_id'];\n }\n\n if (!object.created) object.created = new Date();\n if (!object.updated) object.updated = new Date();\n\n const collection = await this.collection;\n const { acknowledged: isAcknowledged } = await collection.insertOne(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n object as any,\n );\n if (!isAcknowledged) {\n throw new Error('Fail to insert');\n }\n\n return object as Model;\n }\n\n async replaceOne(object: Model): Promise<Model> {\n if (!object.updated) object.updated = new Date();\n\n const collection = await this.collection;\n await collection.replaceOne({ _id: object._id } as Filter<Model>, object);\n return object;\n }\n\n async upsertOne<\n K extends Exclude<\n keyof Model,\n MongoKeyPath | OptionalBaseModelKeysForInsert\n >,\n >(\n object: UpsertPartialObject<MongoKeyPath, KeyValue, Model, K>,\n setOnInsertPartialObject?: Update<Model>['$setOnInsert'],\n ): Promise<Model> {\n const result = await this.upsertOneWithInfo(\n object,\n setOnInsertPartialObject,\n );\n return result.object;\n }\n\n async upsertOneWithInfo<\n K extends Exclude<\n keyof Model,\n MongoKeyPath | OptionalBaseModelKeysForInsert\n >,\n >(\n object: UpsertPartialObject<MongoKeyPath, KeyValue, Model, K>,\n setOnInsertPartialObject?: Update<Model>['$setOnInsert'],\n ): Promise<MongoUpsertResult<KeyValue, Model>> {\n const $setOnInsert: Update<Model>['$setOnInsert'] = {\n // @ts-expect-error -- created is Date as set in BaseModel\n created: object.created || new Date(),\n ...setOnInsertPartialObject,\n };\n\n if (!object.updated) {\n (object as MongoBaseModel).updated = new Date();\n }\n\n const $set: Partial<typeof object> = { ...object };\n delete $set.created;\n\n const collection = await this.collection;\n\n const { upsertedCount } = await collection.updateOne(\n { _id: object._id } as Filter<Model>,\n { $set, $setOnInsert } as UpdateFilter<Model>,\n { upsert: true },\n );\n\n if (upsertedCount) {\n Object.assign(object, $setOnInsert);\n }\n\n return { object: object as unknown as Model, inserted: !!upsertedCount };\n }\n\n replaceSeveral(objects: Model[]): Promise<Model[]> {\n return Promise.all(objects.map((object: Model) => this.replaceOne(object)));\n }\n\n async partialUpdateByKey(\n key: KeyValue,\n partialUpdate: Update<Model>,\n criteria?: Criteria<Model>,\n ): Promise<Model> {\n const collection = await this.collection;\n const commandResult = await collection.updateOne(\n { _id: key, ...criteria } as Filter<Model>,\n partialUpdate as UpdateFilter<Model>,\n );\n if (!commandResult.acknowledged) {\n console.error(commandResult);\n throw new Error('Update failed');\n }\n const object = await this.findByKey(key);\n return object!;\n }\n\n partialUpdateOne(\n object: Model,\n partialUpdate: Update<Model>,\n ): Promise<Model> {\n return this.partialUpdateByKey(object._id, partialUpdate);\n }\n\n partialUpdateMany(\n criteria: Criteria<Model>,\n partialUpdate: Update<Model>,\n ): Promise<void> {\n return this.collection\n .then((collection) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n collection.updateMany(criteria as Filter<Model>, partialUpdate as any),\n )\n .then((res) => undefined); // TODO return updated object\n }\n\n deleteByKey(key: KeyValue, criteria?: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) =>\n collection.deleteOne({ _id: key, ...criteria } as Filter<Model>),\n )\n .then(() => undefined);\n }\n\n deleteOne(object: Model): Promise<void> {\n return this.deleteByKey(object._id);\n }\n\n deleteMany(selector: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) => collection.deleteMany(selector as Filter<Model>))\n .then(() => undefined);\n }\n\n async count(filter?: Criteria<Model>): Promise<number> {\n const collection = await this.collection;\n return filter\n ? collection.countDocuments(filter as Filter<Model>)\n : collection.countDocuments();\n }\n\n async cursor<Result extends Partial<Model> = Model>(\n filter?: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<MongoCursor<Model, Result, KeyValue>> {\n const collection = await this.collection;\n const findCursor = filter\n ? collection.find<Result>(filter as Filter<Model>)\n : (collection.find() as unknown as FindCursor<Result>);\n if (sort) findCursor.sort(sort);\n return new MongoCursor<Model, Result, KeyValue>(this, findCursor);\n }\n\n async findByKey(\n key: KeyValue,\n criteria?: Criteria<Model>,\n ): Promise<Model | undefined> {\n const collection = await this.collection;\n const result = await collection.findOne<Model>({\n _id: key,\n ...criteria,\n } as Filter<Model>);\n return result || undefined;\n }\n\n findAll(criteria?: Criteria<Model>, sort?: Sort<Model>): Promise<Model[]> {\n return this.cursor<Model>(criteria, sort).then((cursor) =>\n cursor.toArray(),\n );\n }\n\n async findOne(\n filter: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<Model | undefined> {\n const collection = await this.collection;\n const result = await collection.findOne<Model>(filter as Filter<Model>, {\n sort,\n });\n return result || undefined;\n }\n}\n","import { AbstractConnection } from 'liwi-store';\nimport mongodb from 'mongodb';\nimport { Logger } from 'nightingale-logger';\n\nconst logger = new Logger('liwi:mongo:MongoConnection');\n\nexport default class MongoConnection extends AbstractConnection {\n _connection?: mongodb.MongoClient;\n\n _connecting?: Promise<mongodb.MongoClient>;\n\n connectionFailed?: boolean;\n\n // TODO interface\n constructor(config: Map<string, number | string>) {\n super();\n\n if (!config.has('host')) {\n config.set('host', 'localhost');\n }\n if (!config.has('port')) {\n config.set('port', '27017');\n }\n if (!config.has('database')) {\n throw new Error('Missing config database');\n }\n\n const buildConnectionString = (redactCredentials: boolean): string =>\n `mongodb://${\n config.has('user')\n ? `${\n redactCredentials\n ? `${(config.get('user') as string).slice(0, 2)}[redacted]`\n : (config.get('user') as string)\n }:${\n redactCredentials\n ? '[redacted]'\n : (config.get('password') as string)\n }@`\n : ''\n }` +\n `${config.get('host') as string}:${config.get('port') as string}/${\n config.get('database') as string\n }`;\n\n const connectionString = buildConnectionString(false);\n const connectionStringRedacted = buildConnectionString(true);\n\n this.connect(connectionString, connectionStringRedacted);\n }\n\n connect(connectionString: string, connectionStringRedacted: string): void {\n logger.info('connecting', { connectionStringRedacted });\n\n const connectPromise = mongodb.MongoClient.connect(connectionString)\n .then((connection) => {\n logger.info('connected', { connectionStringRedacted });\n connection.on('close', () => {\n logger.warn('close', { connectionStringRedacted });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection closed');\n };\n });\n connection.on('timeout', () => {\n logger.warn('timeout', { connectionStringRedacted });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection timeout');\n };\n });\n connection.on('reconnect', () => {\n logger.warn('reconnect', { connectionStringRedacted });\n this.connectionFailed = false;\n this.getConnection = () => Promise.resolve(this._connection!);\n });\n connection.on('error', (err) => {\n logger.warn('error', { connectionStringRedacted, err });\n });\n\n this._connection = connection;\n this._connecting = undefined;\n this.getConnection = () => Promise.resolve(this._connection!);\n return connection;\n })\n .catch((err) => {\n logger.info('not connected', { connectionStringRedacted });\n console.error(err.message || err);\n // throw err;\n process.nextTick(() => {\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1);\n });\n\n throw err;\n });\n\n this.getConnection = () => Promise.resolve(connectPromise);\n this._connecting = this.getConnection();\n }\n\n getConnection(): Promise<mongodb.MongoClient> {\n throw new Error('call connect()');\n }\n\n async close(): Promise<void> {\n this.getConnection = () => Promise.reject(new Error('Connection closed'));\n if (this._connection) {\n await this._connection.close();\n this._connection = undefined;\n } else if (this._connecting) {\n await this._connecting;\n await this.close();\n }\n }\n}\n","import type { AllowedKeyValue } from 'liwi-store';\nimport { SubscribeStore } from 'liwi-subscribe-store';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoConnection from './MongoConnection';\nimport type MongoStore from './MongoStore';\n\nexport default function createMongoSubscribeStore<\n Model extends MongoBaseModel<KeyValue>,\n KeyValue extends AllowedKeyValue = Model[MongoKeyPath],\n>(\n mongoStore: MongoStore<Model, KeyValue>,\n): SubscribeStore<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n MongoConnection,\n MongoStore<Model, KeyValue>\n> {\n return new SubscribeStore(mongoStore);\n}\n"],"names":["MongoCursor","AbstractStoreCursor","constructor","store","cursor","advance","count","skip","next","then","value","_result","key","_id","limit","newLimit","Promise","resolve","result","Error","close","toArray","identityTransformer","model","MongoQueryCollection","AbstractSubscribableStoreQuery","options","transformer","createTestCriteria","testCriteria","criteria","mingoQuery","mingo","Query","test","bind","fetch","onFulfilled","all","createMongoCursor","map","meta","total","info","sort","keyPath","_subscribe","callback","_includeInitial","getSubscribeStore","promise","type","initial","queryInfo","unsubscribe","subscribe","action","changes","filtered","filter","length","push","prev","keys","object","deleted","updated","inserted","forEach","prevObject","nextObject","stop","cancel","onRejected","MongoQuerySingleItem","createMingoTestCriteria","item","res","MongoStore","connection","collectionName","_collection","getConnection","client","db","collection","err","reject","connectionFailed","createQuerySingleItem","createQueryCollection","insertOne","mongodb","ObjectId","toString","created","Date","acknowledged","isAcknowledged","replaceOne","upsertOne","setOnInsertPartialObject","upsertOneWithInfo","$setOnInsert","$set","upsertedCount","updateOne","upsert","Object","assign","replaceSeveral","objects","partialUpdateByKey","partialUpdate","commandResult","console","error","findByKey","partialUpdateOne","partialUpdateMany","updateMany","undefined","deleteByKey","deleteOne","deleteMany","selector","countDocuments","findCursor","find","findOne","findAll","logger","Logger","MongoConnection","AbstractConnection","config","has","set","buildConnectionString","redactCredentials","get","slice","connectionString","connectionStringRedacted","connect","connectPromise","MongoClient","on","warn","_connection","_connecting","catch","message","process","nextTick","exit","createMongoSubscribeStore","mongoStore","SubscribeStore"],"mappings":"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"}