liwi-mongo 8.0.4 → 8.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { ObjectID, MongoClient } from 'mongodb';
1
+ import mongodb from 'mongodb';
2
2
  import { AbstractStoreCursor, AbstractConnection } from 'liwi-store';
3
3
  import { AbstractSubscribableStoreQuery, SubscribeStore } from 'liwi-subscribe-store';
4
4
  import mingo from 'mingo';
@@ -53,10 +53,10 @@ class MongoCursor extends AbstractStoreCursor {
53
53
 
54
54
  /* eslint-disable complexity, max-lines */
55
55
 
56
- const identityTransformer = model => model;
56
+ const identityTransformer$1 = model => model;
57
57
 
58
58
  class MongoQueryCollection extends AbstractSubscribableStoreQuery {
59
- constructor(store, options, transformer = identityTransformer) {
59
+ constructor(store, options, transformer = identityTransformer$1) {
60
60
  super();
61
61
  this.store = store;
62
62
  this.options = options;
@@ -236,30 +236,27 @@ class MongoQueryCollection extends AbstractSubscribableStoreQuery {
236
236
 
237
237
  }
238
238
 
239
- /* eslint-disable complexity, max-lines */
240
-
241
- const identityTransformer$1 = model => model;
239
+ const identityTransformer = model => model;
242
240
 
243
241
  class MongoQuerySingleItem extends AbstractSubscribableStoreQuery {
244
- constructor(store, options, transformer = identityTransformer$1) {
242
+ constructor(store, options, transformer = identityTransformer) {
245
243
  super();
246
244
  this.store = store;
247
245
  this.options = options;
248
246
  this.transformer = transformer;
249
247
  }
250
248
 
251
- createMingoQuery() {
252
- if (!this.mingoQuery) {
249
+ createMingoTestCriteria() {
250
+ if (!this.testCriteria) {
253
251
  if (!this.options.criteria) {
254
- return {
255
- test: () => true
256
- };
252
+ return () => true;
257
253
  }
258
254
 
259
- this.mingoQuery = new mingo.Query(this.options.criteria);
255
+ const mingoQuery = new mingo.Query(this.options.criteria);
256
+ this.testCriteria = mingoQuery.test.bind(mingoQuery);
260
257
  }
261
258
 
262
- return this.mingoQuery;
259
+ return this.testCriteria;
263
260
  }
264
261
 
265
262
  async fetch(onFulfilled) {
@@ -282,7 +279,7 @@ class MongoQuerySingleItem extends AbstractSubscribableStoreQuery {
282
279
 
283
280
  _subscribe(callback, _includeInitial) {
284
281
  const store = super.getSubscribeStore();
285
- const mingoQuery = this.createMingoQuery();
282
+ const testCriteria = this.createMingoTestCriteria();
286
283
  const promise = _includeInitial ? this.fetch(({
287
284
  result,
288
285
  meta,
@@ -301,7 +298,7 @@ class MongoQuerySingleItem extends AbstractSubscribableStoreQuery {
301
298
  switch (action.type) {
302
299
  case 'inserted':
303
300
  {
304
- const filtered = action.next.filter(mingoQuery.test);
301
+ const filtered = action.next.filter(testCriteria);
305
302
 
306
303
  if (filtered.length > 0) {
307
304
  changes.push({
@@ -315,7 +312,7 @@ class MongoQuerySingleItem extends AbstractSubscribableStoreQuery {
315
312
 
316
313
  case 'deleted':
317
314
  {
318
- const filtered = action.prev.filter(mingoQuery.test);
315
+ const filtered = action.prev.filter(testCriteria);
319
316
 
320
317
  if (filtered.length > 0) {
321
318
  changes.push({
@@ -329,7 +326,7 @@ class MongoQuerySingleItem extends AbstractSubscribableStoreQuery {
329
326
 
330
327
  case 'updated':
331
328
  {
332
- const filtered = action.changes.filter(([prev, next]) => mingoQuery.test(prev));
329
+ const filtered = action.changes.filter(([prev, next]) => testCriteria(prev));
333
330
 
334
331
  if (filtered.length > 0) {
335
332
  if (this.options.sort) {
@@ -346,7 +343,7 @@ class MongoQuerySingleItem extends AbstractSubscribableStoreQuery {
346
343
  const [, next] = filtered[0];
347
344
  changes.push({
348
345
  type: 'updated',
349
- result: mingoQuery.test(next) ? this.transformer(next) : null
346
+ result: testCriteria(next) ? this.transformer(next) : null
350
347
  });
351
348
  }
352
349
  } else if (filtered.length === 0) ;
@@ -417,7 +414,7 @@ class MongoStore {
417
414
 
418
415
  async insertOne(object) {
419
416
  if (!object._id) {
420
- object._id = new ObjectID().toString();
417
+ object._id = new mongodb.ObjectID().toString();
421
418
  }
422
419
 
423
420
  if (!object.created) object.created = new Date();
@@ -573,7 +570,7 @@ class MongoConnection extends AbstractConnection {
573
570
  logger.info('connecting', {
574
571
  connectionString
575
572
  });
576
- const connectPromise = MongoClient.connect(connectionString, {
573
+ const connectPromise = mongodb.MongoClient.connect(connectionString, {
577
574
  useNewUrlParser: true
578
575
  }).then(connection => {
579
576
  logger.info('connected', {
@@ -1 +1 @@
1
- {"version":3,"file":"index-node12.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-types';\nimport type { Cursor } 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: Cursor;\n\n private _result?: Result;\n\n constructor(store: MongoStore<Model, KeyValue>, cursor: Cursor) {\n super(store);\n this.cursor = cursor;\n }\n\n advance(count: number): void {\n this.cursor.skip(count);\n }\n\n next(): Promise<any> {\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 count(applySkipLimit = false): Promise<number> {\n return this.cursor.count(applySkipLimit);\n }\n\n result(): Promise<Result> {\n if (!this._result) throw new Error('Cannot call result() before next()');\n return Promise.resolve(this._result as 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} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport type {\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-types';\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 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 cursor = await this.createMongoCursor();\n const [result, count] = await Promise.all([\n cursor.toArray(),\n cursor.count(),\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 { deleted, updated, inserted } = action.changes.reduce(\n (\n acc: {\n deleted: KeyValue[];\n updated: Item[];\n inserted: Item[];\n },\n [prevObject, nextObject]: [Model, Model],\n index: number,\n ) => {\n if (testCriteria(prevObject)) {\n if (!testCriteria(nextObject)) {\n acc.deleted.push(prevObject[this.store.keyPath]);\n } else {\n acc.updated.push(this.transformer(nextObject));\n }\n } else if (testCriteria(nextObject)) {\n acc.inserted.push(this.transformer(nextObject));\n }\n\n return acc;\n },\n { deleted: [], updated: [], inserted: [] },\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: () => T | Promise<T>,\n onRejected?: (error: any) => U | Promise<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","/* eslint-disable complexity, max-lines */\nimport type {\n QuerySubscription,\n SubscribeCallback,\n QueryResult,\n QueryParams,\n} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport type {\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-types';\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\ninterface TestCriteria {\n test: (obj: any) => boolean;\n}\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 mingoQuery?: 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 createMingoQuery(): TestCriteria {\n if (!this.mingoQuery) {\n if (!this.options.criteria) {\n return { test: () => true };\n }\n\n this.mingoQuery = new mingo.Query(this.options.criteria);\n }\n\n return this.mingoQuery;\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 mingoQuery: TestCriteria = this.createMingoQuery();\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(mingoQuery.test);\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(mingoQuery.test);\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 mingoQuery.test(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: (mingoQuery.test(next)\n ? this.transformer(next)\n : null) as Result,\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: () => T | Promise<T>,\n onRejected?: (error: any) => U | Promise<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} from 'liwi-store';\nimport type {\n Criteria,\n Sort,\n Update,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n OptionalBaseModelKeysForInsert,\n} from 'liwi-types';\nimport type { Collection, MongoClient } from 'mongodb';\nimport { ObjectID } 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 readonly keyPath: MongoKeyPath = '_id';\n\n readonly connection: MongoConnection;\n\n private _collection: Collection | Promise<Collection>;\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> {\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 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 { result } = await collection.insertOne(object);\n if (!result.ok || result.n !== 1) {\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 }, object);\n return object as Model;\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?: Pick<Model, K>,\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?: Pick<Model, K>,\n ): Promise<MongoUpsertResult<KeyValue, Model>> {\n const $setOnInsert = {\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 },\n { $set, $setOnInsert },\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: any,\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 },\n partialUpdate,\n );\n if (!commandResult.result.ok) {\n console.error(commandResult);\n throw new Error('Update failed');\n }\n const object = await this.findByKey(key);\n return object as Model;\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) => collection.updateMany(criteria, partialUpdate))\n .then((res) => undefined); // TODO return updated object\n }\n\n deleteByKey(key: any, criteria?: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) => collection.deleteOne({ _id: key, ...criteria }))\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))\n .then(() => undefined);\n }\n\n cursor<Result = Model>(\n criteria?: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<MongoCursor<Model, Result, KeyValue>> {\n return this.collection\n .then((collection) => collection.find(criteria))\n .then(sort && ((cursor) => cursor.sort(sort)))\n .then((cursor) => new MongoCursor(this, cursor));\n }\n\n findByKey(key: any, criteria?: Criteria<Model>): Promise<Model | undefined> {\n return this.collection\n .then((collection) => collection.findOne({ _id: key, ...criteria }))\n .then((result) => 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 findOne(\n criteria: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<Model | undefined> {\n return this.collection\n .then((collection) => collection.find(criteria))\n .then(sort && ((cursor) => cursor.sort(sort)))\n .then((cursor) => cursor.limit(1).next());\n }\n}\n","import { AbstractConnection } from 'liwi-store';\nimport { MongoClient } from 'mongodb';\nimport Logger from 'nightingale-logger';\n\nconst logger = new Logger('liwi:mongo:MongoConnection');\n\nexport default class MongoConnection extends AbstractConnection {\n _connection?: MongoClient;\n\n _connecting?: Promise<MongoClient>;\n\n connectionFailed?: boolean;\n\n // TODO interface\n constructor(config: Map<string, string | number>) {\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 connectionString =\n `mongodb://${\n config.has('user')\n ? `${config.get('user') as string}:${\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 this.connect(connectionString);\n }\n\n connect(connectionString: string): void {\n logger.info('connecting', { connectionString });\n\n const connectPromise = MongoClient.connect(connectionString, {\n useNewUrlParser: true,\n })\n .then((connection) => {\n logger.info('connected', { connectionString });\n connection.on('close', () => {\n logger.warn('close', { connectionString });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection closed');\n };\n });\n connection.on('timeout', () => {\n logger.warn('timeout', { connectionString });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection timeout');\n };\n });\n connection.on('reconnect', () => {\n logger.warn('reconnect', { connectionString });\n this.connectionFailed = false;\n this.getConnection = () =>\n Promise.resolve(this._connection as MongoClient);\n });\n connection.on('error', (err) => {\n logger.warn('error', { connectionString, err });\n });\n\n this._connection = connection;\n this._connecting = undefined;\n this.getConnection = () =>\n Promise.resolve(this._connection as MongoClient);\n return connection;\n })\n .catch((err) => {\n logger.info('not connected', { connectionString });\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<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 { SubscribeStore } from 'liwi-subscribe-store';\nimport type { AllowedKeyValue } from 'liwi-types';\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","applySkipLimit","result","Error","close","toArray","identityTransformer","model","MongoQueryCollection","AbstractSubscribableStoreQuery","options","transformer","createTestCriteria","testCriteria","criteria","mingoQuery","mingo","Query","test","bind","fetch","onFulfilled","createMongoCursor","all","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","reduce","acc","prevObject","nextObject","stop","cancel","onRejected","MongoQuerySingleItem","createMingoQuery","item","res","MongoStore","connection","collectionName","_collection","getConnection","client","db","collection","err","reject","connectionFailed","createQuerySingleItem","createQueryCollection","insertOne","ObjectID","toString","created","Date","ok","n","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","find","findOne","findAll","logger","Logger","MongoConnection","AbstractConnection","config","has","set","connectionString","get","connect","connectPromise","MongoClient","useNewUrlParser","on","warn","_connection","_connecting","catch","message","process","nextTick","exit","createMongoSubscribeStore","mongoStore","SubscribeStore"],"mappings":"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"}
1
+ {"version":3,"file":"index-node12.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-types';\nimport type { Cursor } 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: Cursor;\n\n private _result?: Result;\n\n constructor(store: MongoStore<Model, KeyValue>, cursor: Cursor) {\n super(store);\n this.cursor = cursor;\n }\n\n advance(count: number): void {\n this.cursor.skip(count);\n }\n\n next(): Promise<any> {\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 count(applySkipLimit = false): Promise<number> {\n return this.cursor.count(applySkipLimit);\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} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport type {\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-types';\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 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 cursor = await this.createMongoCursor();\n const [result, count] = await Promise.all([\n cursor.toArray(),\n cursor.count(),\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 { deleted, updated, inserted } = action.changes.reduce(\n (\n acc: {\n deleted: KeyValue[];\n updated: Item[];\n inserted: Item[];\n },\n [prevObject, nextObject]: [Model, Model],\n index: number,\n ) => {\n if (testCriteria(prevObject)) {\n if (!testCriteria(nextObject)) {\n acc.deleted.push(prevObject[this.store.keyPath]);\n } else {\n acc.updated.push(this.transformer(nextObject));\n }\n } else if (testCriteria(nextObject)) {\n acc.inserted.push(this.transformer(nextObject));\n }\n\n return acc;\n },\n { deleted: [], updated: [], inserted: [] },\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: () => T | Promise<T>,\n onRejected?: (error: any) => U | Promise<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} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport type {\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-types';\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: () => T | Promise<T>,\n onRejected?: (error: any) => U | Promise<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} from 'liwi-store';\nimport type {\n Criteria,\n Sort,\n Update,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n OptionalBaseModelKeysForInsert,\n} from 'liwi-types';\nimport type { Collection, MongoClient } 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 readonly keyPath: MongoKeyPath = '_id';\n\n readonly connection: MongoConnection;\n\n private _collection: Collection | Promise<Collection>;\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> {\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 { result } = await collection.insertOne(object);\n if (!result.ok || result.n !== 1) {\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 }, 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?: Pick<Model, K>,\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?: Pick<Model, K>,\n ): Promise<MongoUpsertResult<KeyValue, Model>> {\n const $setOnInsert = {\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 },\n { $set, $setOnInsert },\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: any,\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 },\n partialUpdate,\n );\n if (!commandResult.result.ok) {\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) => collection.updateMany(criteria, partialUpdate))\n .then((res) => undefined); // TODO return updated object\n }\n\n deleteByKey(key: any, criteria?: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) => collection.deleteOne({ _id: key, ...criteria }))\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))\n .then(() => undefined);\n }\n\n cursor<Result = Model>(\n criteria?: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<MongoCursor<Model, Result, KeyValue>> {\n return this.collection\n .then((collection) => collection.find(criteria))\n .then(sort && ((cursor) => cursor.sort(sort)))\n .then((cursor) => new MongoCursor(this, cursor));\n }\n\n findByKey(key: any, criteria?: Criteria<Model>): Promise<Model | undefined> {\n return this.collection\n .then((collection) => collection.findOne({ _id: key, ...criteria }))\n .then((result) => 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 findOne(\n criteria: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<Model | undefined> {\n return this.collection\n .then((collection) => collection.find(criteria))\n .then(sort && ((cursor) => cursor.sort(sort)))\n .then((cursor) => cursor.limit(1).next());\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, string | number>) {\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 connectionString =\n `mongodb://${\n config.has('user')\n ? `${config.get('user') as string}:${\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 this.connect(connectionString);\n }\n\n connect(connectionString: string): void {\n logger.info('connecting', { connectionString });\n\n const connectPromise = mongodb.MongoClient.connect(connectionString, {\n useNewUrlParser: true,\n })\n .then((connection) => {\n logger.info('connected', { connectionString });\n connection.on('close', () => {\n logger.warn('close', { connectionString });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection closed');\n };\n });\n connection.on('timeout', () => {\n logger.warn('timeout', { connectionString });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection timeout');\n };\n });\n connection.on('reconnect', () => {\n logger.warn('reconnect', { connectionString });\n this.connectionFailed = false;\n this.getConnection = () => Promise.resolve(this._connection!);\n });\n connection.on('error', (err) => {\n logger.warn('error', { connectionString, 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', { connectionString });\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 { SubscribeStore } from 'liwi-subscribe-store';\nimport type { AllowedKeyValue } from 'liwi-types';\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","applySkipLimit","result","Error","close","toArray","identityTransformer","model","MongoQueryCollection","AbstractSubscribableStoreQuery","options","transformer","createTestCriteria","testCriteria","criteria","mingoQuery","mingo","Query","test","bind","fetch","onFulfilled","createMongoCursor","all","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","reduce","acc","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","ok","n","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","find","findOne","findAll","logger","Logger","MongoConnection","AbstractConnection","config","has","set","connectionString","get","connect","connectPromise","MongoClient","useNewUrlParser","on","warn","_connection","_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": "8.0.4",
3
+ "version": "8.3.1",
4
4
  "description": "mongo implementation for liwi",
5
5
  "keywords": [],
6
6
  "author": "Christophe Hurpeau <christophe@hurpeau.com> (https://christophe.hurpeau.com)",
@@ -59,19 +59,19 @@
59
59
  ]
60
60
  },
61
61
  "dependencies": {
62
- "@types/mongodb": "^3.5.20",
63
- "liwi-store": "^8.0.4",
64
- "liwi-subscribe-store": "^8.0.4",
62
+ "@types/mongodb": "^3.6.10",
63
+ "liwi-store": "^8.3.1",
64
+ "liwi-subscribe-store": "^8.3.1",
65
65
  "liwi-types": "^8.0.4",
66
- "mingo": "^3.0.2",
67
- "mongodb": "^3.5.8",
68
- "nightingale-logger": "^11.0.5"
66
+ "mingo": "^4.1.2",
67
+ "mongodb": "^3.6.5",
68
+ "nightingale-logger": "^11.6.0"
69
69
  },
70
70
  "devDependencies": {
71
- "@babel/core": "7.12.10",
72
- "babel-preset-latest-node": "5.4.0",
73
- "pob-babel": "26.4.0",
74
- "rollup": "2.36.2"
71
+ "@babel/core": "7.13.13",
72
+ "babel-preset-latest-node": "5.5.1",
73
+ "pob-babel": "28.6.0",
74
+ "rollup": "2.43.1"
75
75
  },
76
- "gitHead": "bda07b8cceeb63874f8fcbd47c9a761187eb4f32"
76
+ "gitHead": "21f0cefc402ca0b8e1e5a115d8c6a57b09504b62"
77
77
  }
@@ -0,0 +1,3 @@
1
+ import createRollupConfig from 'pob-babel/createRollupConfig';
2
+
3
+ export default createRollupConfig({});
@@ -11,7 +11,6 @@
11
11
  ],
12
12
  "ignorePatterns": ["*.d.ts"],
13
13
  "rules": {
14
- "import/no-cycle": "off",
15
14
  "@typescript-eslint/no-floating-promises": "warn",
16
15
  "@typescript-eslint/no-unsafe-assignment": "warn",
17
16
  "@typescript-eslint/no-unsafe-member-access": "warn",
@@ -1,13 +1,13 @@
1
1
  import { AbstractConnection } from 'liwi-store';
2
- import { MongoClient } from 'mongodb';
2
+ import mongodb from 'mongodb';
3
3
  import Logger from 'nightingale-logger';
4
4
 
5
5
  const logger = new Logger('liwi:mongo:MongoConnection');
6
6
 
7
7
  export default class MongoConnection extends AbstractConnection {
8
- _connection?: MongoClient;
8
+ _connection?: mongodb.MongoClient;
9
9
 
10
- _connecting?: Promise<MongoClient>;
10
+ _connecting?: Promise<mongodb.MongoClient>;
11
11
 
12
12
  connectionFailed?: boolean;
13
13
 
@@ -43,7 +43,7 @@ export default class MongoConnection extends AbstractConnection {
43
43
  connect(connectionString: string): void {
44
44
  logger.info('connecting', { connectionString });
45
45
 
46
- const connectPromise = MongoClient.connect(connectionString, {
46
+ const connectPromise = mongodb.MongoClient.connect(connectionString, {
47
47
  useNewUrlParser: true,
48
48
  })
49
49
  .then((connection) => {
@@ -65,8 +65,7 @@ export default class MongoConnection extends AbstractConnection {
65
65
  connection.on('reconnect', () => {
66
66
  logger.warn('reconnect', { connectionString });
67
67
  this.connectionFailed = false;
68
- this.getConnection = () =>
69
- Promise.resolve(this._connection as MongoClient);
68
+ this.getConnection = () => Promise.resolve(this._connection!);
70
69
  });
71
70
  connection.on('error', (err) => {
72
71
  logger.warn('error', { connectionString, err });
@@ -74,8 +73,7 @@ export default class MongoConnection extends AbstractConnection {
74
73
 
75
74
  this._connection = connection;
76
75
  this._connecting = undefined;
77
- this.getConnection = () =>
78
- Promise.resolve(this._connection as MongoClient);
76
+ this.getConnection = () => Promise.resolve(this._connection!);
79
77
  return connection;
80
78
  })
81
79
  .catch((err) => {
@@ -94,7 +92,7 @@ export default class MongoConnection extends AbstractConnection {
94
92
  this._connecting = this.getConnection();
95
93
  }
96
94
 
97
- getConnection(): Promise<MongoClient> {
95
+ getConnection(): Promise<mongodb.MongoClient> {
98
96
  throw new Error('call connect()');
99
97
  }
100
98
 
@@ -48,7 +48,7 @@ export default class MongoCursor<
48
48
 
49
49
  result(): Promise<Result> {
50
50
  if (!this._result) throw new Error('Cannot call result() before next()');
51
- return Promise.resolve(this._result as Result);
51
+ return Promise.resolve(this._result);
52
52
  }
53
53
 
54
54
  close(): Promise<void> {
@@ -1,4 +1,3 @@
1
- /* eslint-disable complexity, max-lines */
2
1
  import type {
3
2
  QuerySubscription,
4
3
  SubscribeCallback,
@@ -29,9 +28,7 @@ const identityTransformer = <
29
28
  model: Model,
30
29
  ): Transformed => (model as unknown) as Transformed;
31
30
 
32
- interface TestCriteria {
33
- test: (obj: any) => boolean;
34
- }
31
+ type TestCriteria = (obj: any) => boolean;
35
32
 
36
33
  export default class MongoQuerySingleItem<
37
34
  Model extends MongoBaseModel<KeyValue>,
@@ -50,7 +47,7 @@ export default class MongoQuerySingleItem<
50
47
 
51
48
  private readonly options: QueryOptions<Model>;
52
49
 
53
- private mingoQuery?: TestCriteria;
50
+ private testCriteria?: TestCriteria;
54
51
 
55
52
  private readonly transformer: Transformer<Model, Result>;
56
53
 
@@ -65,16 +62,17 @@ export default class MongoQuerySingleItem<
65
62
  this.transformer = transformer;
66
63
  }
67
64
 
68
- createMingoQuery(): TestCriteria {
69
- if (!this.mingoQuery) {
65
+ createMingoTestCriteria(): TestCriteria {
66
+ if (!this.testCriteria) {
70
67
  if (!this.options.criteria) {
71
- return { test: () => true };
68
+ return () => true;
72
69
  }
73
70
 
74
- this.mingoQuery = new mingo.Query(this.options.criteria);
71
+ const mingoQuery = new mingo.Query(this.options.criteria);
72
+ this.testCriteria = mingoQuery.test.bind(mingoQuery);
75
73
  }
76
74
 
77
- return this.mingoQuery;
75
+ return this.testCriteria;
78
76
  }
79
77
 
80
78
  async fetch<T>(onFulfilled: (result: QueryResult<Result>) => T): Promise<T> {
@@ -99,7 +97,7 @@ export default class MongoQuerySingleItem<
99
97
  _includeInitial: boolean,
100
98
  ): QuerySubscription {
101
99
  const store = super.getSubscribeStore();
102
- const mingoQuery: TestCriteria = this.createMingoQuery();
100
+ const testCriteria: TestCriteria = this.createMingoTestCriteria();
103
101
 
104
102
  const promise: Promise<void> = _includeInitial
105
103
  ? this.fetch(({ result, meta, info }: QueryResult<Result>) => {
@@ -118,7 +116,7 @@ export default class MongoQuerySingleItem<
118
116
  const changes: Changes<KeyValue, Result> = [];
119
117
  switch (action.type) {
120
118
  case 'inserted': {
121
- const filtered = action.next.filter(mingoQuery.test);
119
+ const filtered = action.next.filter(testCriteria);
122
120
  if (filtered.length > 0) {
123
121
  changes.push({
124
122
  type: 'updated',
@@ -128,7 +126,7 @@ export default class MongoQuerySingleItem<
128
126
  break;
129
127
  }
130
128
  case 'deleted': {
131
- const filtered = action.prev.filter(mingoQuery.test);
129
+ const filtered = action.prev.filter(testCriteria);
132
130
  if (filtered.length > 0) {
133
131
  changes.push({
134
132
  type: 'deleted',
@@ -139,7 +137,7 @@ export default class MongoQuerySingleItem<
139
137
  }
140
138
  case 'updated': {
141
139
  const filtered = action.changes.filter(([prev, next]) =>
142
- mingoQuery.test(prev),
140
+ testCriteria(prev),
143
141
  );
144
142
  if (filtered.length > 0) {
145
143
  if (this.options.sort) {
@@ -156,9 +154,7 @@ export default class MongoQuerySingleItem<
156
154
  const [, next] = filtered[0];
157
155
  changes.push({
158
156
  type: 'updated',
159
- result: (mingoQuery.test(next)
160
- ? this.transformer(next)
161
- : null) as Result,
157
+ result: testCriteria(next) ? this.transformer(next) : null!,
162
158
  });
163
159
  }
164
160
  } else if (filtered.length === 0) {
package/src/MongoStore.ts CHANGED
@@ -15,7 +15,7 @@ import type {
15
15
  OptionalBaseModelKeysForInsert,
16
16
  } from 'liwi-types';
17
17
  import type { Collection, MongoClient } from 'mongodb';
18
- import { ObjectID } from 'mongodb';
18
+ import mongodb from 'mongodb';
19
19
  import type {
20
20
  MongoBaseModel,
21
21
  MongoKeyPath,
@@ -108,7 +108,7 @@ export default class MongoStore<
108
108
 
109
109
  async insertOne(object: MongoInsertType<Model>): Promise<Model> {
110
110
  if (!object._id) {
111
- object._id = new ObjectID().toString() as Model['_id'];
111
+ object._id = new mongodb.ObjectID().toString() as Model['_id'];
112
112
  }
113
113
 
114
114
  if (!object.created) object.created = new Date();
@@ -128,7 +128,7 @@ export default class MongoStore<
128
128
 
129
129
  const collection = await this.collection;
130
130
  await collection.replaceOne({ _id: object._id }, object);
131
- return object as Model;
131
+ return object;
132
132
  }
133
133
 
134
134
  async upsertOne<
@@ -202,7 +202,7 @@ export default class MongoStore<
202
202
  throw new Error('Update failed');
203
203
  }
204
204
  const object = await this.findByKey(key);
205
- return object as Model;
205
+ return object!;
206
206
  }
207
207
 
208
208
  partialUpdateOne(