liwi-mongo 8.0.3 → 8.3.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.
@@ -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\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) ? 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","createMingoQuery","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.3",
3
+ "version": "8.3.0",
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.3",
64
- "liwi-subscribe-store": "^8.0.3",
65
- "liwi-types": "^8.0.1",
66
- "mingo": "^3.0.2",
67
- "mongodb": "^3.5.8",
68
- "nightingale-logger": "^11.0.1"
62
+ "@types/mongodb": "^3.6.10",
63
+ "liwi-store": "^8.3.0",
64
+ "liwi-subscribe-store": "^8.3.0",
65
+ "liwi-types": "^8.0.4",
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.3.0",
74
- "rollup": "2.36.2"
71
+ "@babel/core": "7.13.13",
72
+ "babel-preset-latest-node": "5.5.1",
73
+ "pob-babel": "28.5.0",
74
+ "rollup": "2.43.1"
75
75
  },
76
- "gitHead": "6e275e085e9de14a9703f33513d5536c395e6ce0"
76
+ "gitHead": "64b5639da845944ec6e6df98df3aac58819e1998"
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,
@@ -156,9 +155,7 @@ export default class MongoQuerySingleItem<
156
155
  const [, next] = filtered[0];
157
156
  changes.push({
158
157
  type: 'updated',
159
- result: (mingoQuery.test(next)
160
- ? this.transformer(next)
161
- : null) as Result,
158
+ result: mingoQuery.test(next) ? this.transformer(next) : null!,
162
159
  });
163
160
  }
164
161
  } 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(