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.
- package/.eslintrc.json +1 -1
- package/CHANGELOG.md +46 -0
- package/dist/MongoConnection.d.ts +4 -4
- package/dist/MongoConnection.d.ts.map +1 -1
- package/dist/MongoQuerySingleItem.d.ts +3 -5
- package/dist/MongoQuerySingleItem.d.ts.map +1 -1
- package/dist/index-node12-dev.cjs.js +27 -26
- package/dist/index-node12-dev.cjs.js.map +1 -1
- package/dist/index-node12-dev.mjs +18 -21
- package/dist/index-node12-dev.mjs.map +1 -1
- package/dist/index-node12.cjs.js +27 -26
- package/dist/index-node12.cjs.js.map +1 -1
- package/dist/index-node12.mjs +18 -21
- package/dist/index-node12.mjs.map +1 -1
- package/package.json +12 -12
- package/rollup.config.mjs +3 -0
- package/src/.eslintrc.json +0 -1
- package/src/MongoConnection.ts +7 -9
- package/src/MongoCursor.ts +1 -1
- package/src/MongoQuerySingleItem.ts +13 -17
- package/src/MongoStore.ts +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-node12-dev.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":";;;;;;AAMe,MAAMA,WAAN,SAILC,mBAJK,CASb;AACA;AAMAC,EAAAA,WAAW,CAACC,KAAD,EAAqCC,MAArC,EAAqD;AAC9D,UAAMD,KAAN;AACA,SAAKC,MAAL,GAAcA,MAAd;AACD;;AAEDC,EAAAA,OAAO,CAACC,KAAD,EAAsB;AAC3B,SAAKF,MAAL,CAAYG,IAAZ,CAAiBD,KAAjB;AACD;;AAEDE,EAAAA,IAAI,GAAiB;AACnB,WAAO,KAAKJ,MAAL,CAAYI,IAAZ,GAAmBC,IAAnB,CAAyBC,KAAD,IAAW;AACxC,WAAKC,OAAL,GAAeD,KAAf;AACA,WAAKE,GAAL,GAAWF,KAAX,aAAWA,KAAX,uBAAWA,KAAK,CAAEG,GAAlB;AACA,aAAO,KAAKD,GAAZ;AACD,KAJM,CAAP;AAKD;;AAEDE,EAAAA,KAAK,CAACC,QAAD,EAAkC;AACrC,SAAKX,MAAL,CAAYU,KAAZ,CAAkBC,QAAlB;AACA,WAAOC,OAAO,CAACC,OAAR,CAAgB,IAAhB,CAAP;AACD;;AAEDX,EAAAA,KAAK,CAACY,cAAc,GAAG,KAAlB,EAA0C;AAC7C,WAAO,KAAKd,MAAL,CAAYE,KAAZ,CAAkBY,cAAlB,CAAP;AACD;;AAEDC,EAAAA,MAAM,GAAoB;AACxB,QAAI,CAAC,KAAKR,OAAV,EAAmB,MAAM,IAAIS,KAAJ,CAAU,oCAAV,CAAN;AACnB,WAAOJ,OAAO,CAACC,OAAR,CAAgB,KAAKN,OAArB,CAAP;AACD;;AAEDU,EAAAA,KAAK,GAAkB;AACrB,QAAI,KAAKjB,MAAT,EAAiB;AACf,WAAKA,MAAL,CAAYiB,KAAZ;AACD;;AAED,WAAOL,OAAO,CAACC,OAAR,EAAP;AACD;;AAEDK,EAAAA,OAAO,GAAsB;AAC3B,WAAO,KAAKlB,MAAL,CAAYkB,OAAZ,EAAP;AACD;;AAhDD;;ACfF;AAQA;AAgBA,MAAMC,mBAAmB,GAIvBC,KAJ0B,IAKTA,KALnB;;AASA,AAAe,MAAMC,oBAAN,SAKLC,8BALK,CAYb;AASAxB,EAAAA,WAAW,CACTC,KADS,EAETwB,OAFS,EAGTC,WAAqC,GAAGL,mBAH/B,EAIT;AACA;AACA,SAAKpB,KAAL,GAAaA,KAAb;AACA,SAAKwB,OAAL,GAAeA,OAAf;AACA,SAAKC,WAAL,GAAmBA,WAAnB;AACD;;AAEDC,EAAAA,kBAAkB,GAAiB;AACjC,QAAI,CAAC,KAAKC,YAAV,EAAwB;AACtB,UAAI,CAAC,KAAKH,OAAL,CAAaI,QAAlB,EAA4B;AAC1B,eAAO,MAAM,IAAb;AACD;;AAED,YAAMC,UAAU,GAAG,IAAIC,KAAK,CAACC,KAAV,CAAgB,KAAKP,OAAL,CAAaI,QAA7B,CAAnB;AACA,WAAKD,YAAL,GAAoBE,UAAU,CAACG,IAAX,CAAgBC,IAAhB,CAAqBJ,UAArB,CAApB;AACD;;AACD,WAAO,KAAKF,YAAZ;AACD;;AAED,QAAMO,KAAN,CAAeC,WAAf,EAA4E;AAC1E,UAAMlC,MAAM,GAAG,MAAM,KAAKmC,iBAAL,EAArB;AACA,UAAM,CAACpB,MAAD,EAASb,KAAT,IAAkB,MAAMU,OAAO,CAACwB,GAAR,CAAY,CACxCpC,MAAM,CAACkB,OAAP,EADwC,EAExClB,MAAM,CAACE,KAAP,EAFwC,CAAZ,CAA9B;AAKA,WAAOgC,WAAW,CAAC;AACjBnB,MAAAA,MAAM,EAAEA,MAAM,CAACsB,GAAP,CAAW,KAAKb,WAAhB,CADS;AAEjBc,MAAAA,IAAI,EAAE;AAAEC,QAAAA,KAAK,EAAErC;AAAT,OAFW;AAGjBsC,MAAAA,IAAI,EAAE;AACJC,QAAAA,IAAI,EAAE,KAAKlB,OAAL,CAAakB,IADf;AAEJ/B,QAAAA,KAAK,EAAE,KAAKa,OAAL,CAAab,KAFhB;AAGJgC,QAAAA,OAAO,EAAE,KAAK3C,KAAL,CAAW2C;AAHhB;AAHW,KAAD,CAAlB;AASD;;AAEDC,EAAAA,UAAU,CACRC,QADQ,EAERC,eAFQ,EAGW;AACnB,UAAM9C,KAAK,GAAG,MAAM+C,iBAAN,EAAd;AACA,UAAMpB,YAA0B,GAAG,KAAKD,kBAAL,EAAnC;AAEA,UAAMsB,OAAsB,GAAGF,eAAe,GAC1C,KAAKZ,KAAL,CAAW,CAAC;AAAElB,MAAAA,MAAF;AAAUuB,MAAAA,IAAV;AAAgBE,MAAAA;AAAhB,KAAD,KAAiD;AAC1DI,MAAAA,QAAQ,CAAC,IAAD,EAAO,CACb;AACEI,QAAAA,IAAI,EAAE,SADR;AAEEC,QAAAA,OAAO,EAAElC,MAFX;AAGEmC,QAAAA,SAAS,EAAEV,IAHb;AAIEF,QAAAA;AAJF,OADa,CAAP,CAAR;AAQD,KATD,CAD0C,GAW1C1B,OAAO,CAACC,OAAR,EAXJ;AAaA,UAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAN,CAAiBC,MAAD,IAA4B;AAC9D,YAAMC,OAAkC,GAAG,EAA3C;;AACA,cAAQD,MAAM,CAACL,IAAf;AACE,aAAK,UAAL;AAAiB;AACf,kBAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAP,CAAYoD,MAAZ,CAAmB9B,YAAnB,CAAjB;;AACA,gBAAI6B,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,UADK;AAEXjC,gBAAAA,MAAM,EAAEwC,QAAQ,CAAClB,GAAT,CAAa,KAAKb,WAAlB;AAFG,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAM+B,QAAQ,GAAGF,MAAM,CAACM,IAAP,CAAYH,MAAZ,CAAmB9B,YAAnB,CAAjB;;AACA,gBAAI6B,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,SADK;AAEXY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAT,CAAcwB,MAAD,IAAYA,MAAM,CAAC,KAAK9D,KAAL,CAAW2C,OAAZ,CAA/B;AAFK,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAM;AAAEoB,cAAAA,OAAF;AAAWC,cAAAA,OAAX;AAAoBC,cAAAA;AAApB,gBAAiCX,MAAM,CAACC,OAAP,CAAeW,MAAf,CACrC,CACEC,GADF,EAME,CAACC,UAAD,EAAaC,UAAb,CANF,KAQK;AACH,kBAAI1C,YAAY,CAACyC,UAAD,CAAhB,EAA8B;AAC5B,oBAAI,CAACzC,YAAY,CAAC0C,UAAD,CAAjB,EAA+B;AAC7BF,kBAAAA,GAAG,CAACJ,OAAJ,CAAYJ,IAAZ,CAAiBS,UAAU,CAAC,KAAKpE,KAAL,CAAW2C,OAAZ,CAA3B;AACD,iBAFD,MAEO;AACLwB,kBAAAA,GAAG,CAACH,OAAJ,CAAYL,IAAZ,CAAiB,KAAKlC,WAAL,CAAiB4C,UAAjB,CAAjB;AACD;AACF,eAND,MAMO,IAAI1C,YAAY,CAAC0C,UAAD,CAAhB,EAA8B;AACnCF,gBAAAA,GAAG,CAACF,QAAJ,CAAaN,IAAb,CAAkB,KAAKlC,WAAL,CAAiB4C,UAAjB,CAAlB;AACD;;AAED,qBAAOF,GAAP;AACD,aArBoC,EAsBrC;AAAEJ,cAAAA,OAAO,EAAE,EAAX;AAAeC,cAAAA,OAAO,EAAE,EAAxB;AAA4BC,cAAAA,QAAQ,EAAE;AAAtC,aAtBqC,CAAvC;;AAyBA,gBAAIF,OAAO,CAACL,MAAR,GAAiB,CAArB,EAAwB;AACtBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AAAEV,gBAAAA,IAAI,EAAE,SAAR;AAAmBY,gBAAAA,IAAI,EAAEE;AAAzB,eAAb;AACD;;AACD,gBAAIC,OAAO,CAACN,MAAR,GAAiB,CAArB,EAAwB;AACtBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AAAEV,gBAAAA,IAAI,EAAE,SAAR;AAAmBjC,gBAAAA,MAAM,EAAEgD;AAA3B,eAAb;AACD;;AACD,gBAAIC,QAAQ,CAACP,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AAAEV,gBAAAA,IAAI,EAAE,UAAR;AAAoBjC,gBAAAA,MAAM,EAAEiD;AAA5B,eAAb;AACD;;AAED;AACD;;AACD;AACE,gBAAM,IAAIhD,KAAJ,CAAU,kBAAV,CAAN;AA5DJ;;AA+DA,UAAIsC,OAAO,CAACG,MAAR,KAAmB,CAAvB,EAA0B;AAE1Bb,MAAAA,QAAQ,CAAC,IAAD,EAAOU,OAAP,CAAR;AACD,KApEmB,CAApB,CAjBmB;AAuFnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAO;AACLe,MAAAA,IAAI,EAAElB,WADD;AAELmB,MAAAA,MAAM,EAAEnB,WAFH;AAGL9C,MAAAA,IAAI,EAAE,CACJ6B,WADI,EAEJqC,UAFI,KAGexB,OAAO,CAAC1C,IAAR,CAAa6B,WAAb,EAA0BqC,UAA1B;AANhB,KAAP;AAQD;;AAED,QAAcpC,iBAAd,GAEE;AACA,UAAMnC,MAAM,GAAG,MAAM,KAAKD,KAAL,CAAWC,MAAX,CACnB,KAAKuB,OAAL,CAAaI,QADM,EAEnB,KAAKJ,OAAL,CAAakB,IAFM,CAArB;;AAKA,QAAI,KAAKlB,OAAL,CAAapB,IAAjB,EAAuB;AACrBH,MAAAA,MAAM,CAACC,OAAP,CAAe,KAAKsB,OAAL,CAAapB,IAA5B;AACD;;AAED,QAAI,KAAKoB,OAAL,CAAab,KAAjB,EAAwB;AACtB,YAAMV,MAAM,CAACU,KAAP,CAAa,KAAKa,OAAL,CAAab,KAA1B,CAAN;AACD;;AAED,WAAOV,MAAP;AACD;;AA1LD;;AC7CF;AAQA;AAgBA,MAAMmB,qBAAmB,GAIvBC,KAJ0B,IAKTA,KALnB;;AAWA,AAAe,MAAMoD,oBAAN,SAKLlD,8BALK,CAYb;AASAxB,EAAAA,WAAW,CACTC,KADS,EAETwB,OAFS,EAGTC,WAAuC,GAAGL,qBAHjC,EAIT;AACA;AACA,SAAKpB,KAAL,GAAaA,KAAb;AACA,SAAKwB,OAAL,GAAeA,OAAf;AACA,SAAKC,WAAL,GAAmBA,WAAnB;AACD;;AAEDiD,EAAAA,gBAAgB,GAAiB;AAC/B,QAAI,CAAC,KAAK7C,UAAV,EAAsB;AACpB,UAAI,CAAC,KAAKL,OAAL,CAAaI,QAAlB,EAA4B;AAC1B,eAAO;AAAEI,UAAAA,IAAI,EAAE,MAAM;AAAd,SAAP;AACD;;AAED,WAAKH,UAAL,GAAkB,IAAIC,KAAK,CAACC,KAAV,CAAgB,KAAKP,OAAL,CAAaI,QAA7B,CAAlB;AACD;;AAED,WAAO,KAAKC,UAAZ;AACD;;AAED,QAAMK,KAAN,CAAeC,WAAf,EAA4E;AAC1E,UAAMlC,MAAM,GAAG,MAAM,KAAKmC,iBAAL,EAArB;AACA,UAAMnC,MAAM,CAACU,KAAP,CAAa,CAAb,CAAN;AACA,WAAOV,MAAM,CAACkB,OAAP,GAAiBb,IAAjB,CAAuBU,MAAD,IAAqB;AAChD,YAAM2D,IAAY,GAChB3D,MAAM,CAAC0C,MAAP,KAAkB,CAAlB,GAAuB,IAAvB,GAAyC,KAAKjC,WAAL,CAAiBT,MAAM,CAAC,CAAD,CAAvB,CAD3C;AAEA,aAAOmB,WAAW,CAAC;AACjBnB,QAAAA,MAAM,EAAE2D,IADS;AAEjBpC,QAAAA,IAAI,EAAE;AAAEC,UAAAA,KAAK,EAAExB,MAAM,KAAK,IAAX,GAAkB,CAAlB,GAAsB;AAA/B,SAFW;AAGjByB,QAAAA,IAAI,EAAE;AACJ9B,UAAAA,KAAK,EAAE,CADH;AAEJgC,UAAAA,OAAO,EAAE,KAAK3C,KAAL,CAAW2C;AAFhB;AAHW,OAAD,CAAlB;AAQD,KAXM,CAAP;AAYD;;AAEDC,EAAAA,UAAU,CACRC,QADQ,EAERC,eAFQ,EAGW;AACnB,UAAM9C,KAAK,GAAG,MAAM+C,iBAAN,EAAd;AACA,UAAMlB,UAAwB,GAAG,KAAK6C,gBAAL,EAAjC;AAEA,UAAM1B,OAAsB,GAAGF,eAAe,GAC1C,KAAKZ,KAAL,CAAW,CAAC;AAAElB,MAAAA,MAAF;AAAUuB,MAAAA,IAAV;AAAgBE,MAAAA;AAAhB,KAAD,KAAiD;AAC1DI,MAAAA,QAAQ,CAAC,IAAD,EAAO,CACb;AACEI,QAAAA,IAAI,EAAE,SADR;AAEEC,QAAAA,OAAO,EAAElC,MAFX;AAGEmC,QAAAA,SAAS,EAAEV,IAHb;AAIEF,QAAAA;AAJF,OADa,CAAP,CAAR;AAQD,KATD,CAD0C,GAW1C1B,OAAO,CAACC,OAAR,EAXJ;AAaA,UAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAN,CAAgB,MAAOC,MAAP,IAAkC;AACpE,YAAMC,OAAkC,GAAG,EAA3C;;AACA,cAAQD,MAAM,CAACL,IAAf;AACE,aAAK,UAAL;AAAiB;AACf,kBAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAP,CAAYoD,MAAZ,CAAmB5B,UAAU,CAACG,IAA9B,CAAjB;;AACA,gBAAIwB,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,SADK;AAEXjC,gBAAAA,MAAM,EAAE,KAAKS,WAAL,CAAiB+B,QAAQ,CAAC,CAAD,CAAzB;AAFG,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAMA,QAAQ,GAAGF,MAAM,CAACM,IAAP,CAAYH,MAAZ,CAAmB5B,UAAU,CAACG,IAA9B,CAAjB;;AACA,gBAAIwB,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,SADK;AAEXY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAT,CAAcwB,MAAD,IAAYA,MAAM,CAAC,KAAK9D,KAAL,CAAW2C,OAAZ,CAA/B;AAFK,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAMa,QAAQ,GAAGF,MAAM,CAACC,OAAP,CAAeE,MAAf,CAAsB,CAAC,CAACG,IAAD,EAAOvD,IAAP,CAAD,KACrCwB,UAAU,CAACG,IAAX,CAAgB4B,IAAhB,CADe,CAAjB;;AAGA,gBAAIJ,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvB,kBAAI,KAAKlC,OAAL,CAAakB,IAAjB,EAAuB;AACrB,sBAAM;AAAE1B,kBAAAA;AAAF,oBAAa,MAAM,KAAKkB,KAAL,CAAY0C,GAAD,IAASA,GAApB,CAAzB;AACArB,gBAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,kBAAAA,IAAI,EAAE,SADK;AAEXjC,kBAAAA;AAFW,iBAAb;AAID,eAND,MAMO,IAAIwC,QAAQ,CAACE,MAAT,KAAoB,CAAxB,EAA2B;AAChC,sBAAM,IAAIzC,KAAJ,CACJ,uEADI,CAAN;AAGD,eAJM,MAIA;AACL,sBAAM,GAAGZ,IAAH,IAAWmD,QAAQ,CAAC,CAAD,CAAzB;AACAD,gBAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,kBAAAA,IAAI,EAAE,SADK;AAEXjC,kBAAAA,MAAM,EAAGa,UAAU,CAACG,IAAX,CAAgB3B,IAAhB,IACL,KAAKoB,WAAL,CAAiBpB,IAAjB,CADK,GAEL;AAJO,iBAAb;AAMD;AACF,aApBD,MAoBO,IAAImD,QAAQ,CAACE,MAAT,KAAoB,CAAxB,EAA2B;;AAElC;AACD;;AACD;AACE,gBAAM,IAAIzC,KAAJ,CAAU,kBAAV,CAAN;AAlDJ;;AAqDA,UAAIsC,OAAO,CAACG,MAAR,KAAmB,CAAvB,EAA0B;AAE1Bb,MAAAA,QAAQ,CAAC,IAAD,EAAOU,OAAP,CAAR;AACD,KA1DmB,CAApB;AA4DA,WAAO;AACLe,MAAAA,IAAI,EAAElB,WADD;AAELmB,MAAAA,MAAM,EAAEnB,WAFH;AAGL9C,MAAAA,IAAI,EAAE,CACJ6B,WADI,EAEJqC,UAFI,KAGexB,OAAO,CAAC1C,IAAR,CAAa6B,WAAb,EAA0BqC,UAA1B;AANhB,KAAP;AAQD;;AAED,QAAcpC,iBAAd,GAEE;AACA,UAAMnC,MAAM,GAAG,MAAM,KAAKD,KAAL,CAAWC,MAAX,CACnB,KAAKuB,OAAL,CAAaI,QADM,EAEnB,KAAKJ,OAAL,CAAakB,IAFM,CAArB;;AAKA,QAAI,KAAKlB,OAAL,CAAab,KAAjB,EAAwB;AACtB,YAAMV,MAAM,CAACU,KAAP,CAAa,KAAKa,OAAL,CAAab,KAA1B,CAAN;AACD;;AAED,WAAOV,MAAP;AACD;;AAxJD;;AC/CF;AAiBA,AAmBe,MAAM4E,UAAN,CAUT;AAOJ9E,EAAAA,WAAW,CAAC+E,UAAD,EAA8BC,cAA9B,EAAsD;AAAA,SANxDpC,OAMwD,GANhC,KAMgC;AAC/D,SAAKmC,UAAL,GAAkBA,UAAlB;;AAEA,QAAI,CAACC,cAAL,EAAqB;AACnB,YAAM,IAAI9D,KAAJ,CAAW,4BAA2B8D,cAAe,GAArD,CAAN;AACD;;AAED,SAAKC,WAAL,GAAmBF,UAAU,CAACG,aAAX,GAA2B3E,IAA3B,CAChB4E,MAAD,IAAyB;AACvB,WAAKF,WAAL,GAAmBE,MAAM,CAACC,EAAP,GAAYC,UAAZ,CAAuBL,cAAvB,CAAnB;AACA,aAAO,KAAKC,WAAZ;AACD,KAJgB,EAKhBK,GAAD,IAAc;AACZ,WAAKL,WAAL,GAAmBnE,OAAO,CAACyE,MAAR,CAAeD,GAAf,CAAnB;AACA,aAAO,KAAKL,WAAZ;AACD,KARgB,CAAnB;AAUD;;AAED,MAAII,UAAJ,GAAsC;AACpC,QAAI,KAAKN,UAAL,CAAgBS,gBAApB,EAAsC;AACpC,aAAO1E,OAAO,CAACyE,MAAR,CAAe,IAAIrE,KAAJ,CAAU,2BAAV,CAAf,CAAP;AACD;;AAED,WAAOJ,OAAO,CAACC,OAAR,CAAgB,KAAKkE,WAArB,CAAP;AACD;;AAEDQ,EAAAA,qBAAqB,CAInBhE,OAJmB,EAKnBC,WALmB,EAMoC;AACvD,WAAO,IAAIgD,oBAAJ,CACL,IADK,EAELjD,OAFK,EAGLC,WAHK,CAAP;AAKD;;AAEDgE,EAAAA,qBAAqB,CAInBjE,OAJmB,EAKnBC,WALmB,EAMsC;AACzD,WAAO,IAAIH,oBAAJ,CACL,IADK,EAELE,OAFK,EAGLC,WAHK,CAAP;AAKD;;AAED,QAAMiE,SAAN,CAAgB5B,MAAhB,EAAgE;AAC9D,QAAI,CAACA,MAAM,CAACpD,GAAZ,EAAiB;AACfoD,MAAAA,MAAM,CAACpD,GAAP,GAAa,IAAIiF,QAAJ,GAAeC,QAAf,EAAb;AACD;;AAED,QAAI,CAAC9B,MAAM,CAAC+B,OAAZ,EAAqB/B,MAAM,CAAC+B,OAAP,GAAiB,IAAIC,IAAJ,EAAjB;AACrB,QAAI,CAAChC,MAAM,CAACE,OAAZ,EAAqBF,MAAM,CAACE,OAAP,GAAiB,IAAI8B,IAAJ,EAAjB;AAErB,UAAMV,UAAU,GAAG,MAAM,KAAKA,UAA9B;AACA,UAAM;AAAEpE,MAAAA;AAAF,QAAa,MAAMoE,UAAU,CAACM,SAAX,CAAqB5B,MAArB,CAAzB;;AACA,QAAI,CAAC9C,MAAM,CAAC+E,EAAR,IAAc/E,MAAM,CAACgF,CAAP,KAAa,CAA/B,EAAkC;AAChC,YAAM,IAAI/E,KAAJ,CAAU,gBAAV,CAAN;AACD;;AAED,WAAO6C,MAAP;AACD;;AAED,QAAMmC,UAAN,CAAiBnC,MAAjB,EAAgD;AAC9C,QAAI,CAACA,MAAM,CAACE,OAAZ,EAAqBF,MAAM,CAACE,OAAP,GAAiB,IAAI8B,IAAJ,EAAjB;AAErB,UAAMV,UAAU,GAAG,MAAM,KAAKA,UAA9B;AACA,UAAMA,UAAU,CAACa,UAAX,CAAsB;AAAEvF,MAAAA,GAAG,EAAEoD,MAAM,CAACpD;AAAd,KAAtB,EAA2CoD,MAA3C,CAAN;AACA,WAAOA,MAAP;AACD;;AAED,QAAMoC,SAAN,CAMEpC,MANF,EAOEqC,wBAPF,EAQkB;AAChB,UAAMnF,MAAM,GAAG,MAAM,KAAKoF,iBAAL,CACnBtC,MADmB,EAEnBqC,wBAFmB,CAArB;AAIA,WAAOnF,MAAM,CAAC8C,MAAd;AACD;;AAED,QAAMsC,iBAAN,CAMEtC,MANF,EAOEqC,wBAPF,EAQ+C;AAC7C,UAAME,YAAY,GAAG;AACnBR,MAAAA,OAAO,EAAE/B,MAAM,CAAC+B,OAAP,IAAkB,IAAIC,IAAJ,EADR;AAEnB,SAAGK;AAFgB,KAArB;;AAKA,QAAI,CAACrC,MAAM,CAACE,OAAZ,EAAqB;AAClBF,MAAAA,MAAD,CAA2BE,OAA3B,GAAqC,IAAI8B,IAAJ,EAArC;AACD;;AAED,UAAMQ,IAA4B,GAAG,EAAE,GAAGxC;AAAL,KAArC;AACA,WAAOwC,IAAI,CAACT,OAAZ;AAEA,UAAMT,UAAU,GAAG,MAAM,KAAKA,UAA9B;AAEA,UAAM;AAAEmB,MAAAA;AAAF,QAAoB,MAAMnB,UAAU,CAACoB,SAAX,CAC9B;AAAE9F,MAAAA,GAAG,EAAEoD,MAAM,CAACpD;AAAd,KAD8B,EAE9B;AAAE4F,MAAAA,IAAF;AAAQD,MAAAA;AAAR,KAF8B,EAG9B;AAAEI,MAAAA,MAAM,EAAE;AAAV,KAH8B,CAAhC;;AAMA,QAAIF,aAAJ,EAAmB;AACjBG,MAAAA,MAAM,CAACC,MAAP,CAAc7C,MAAd,EAAsBuC,YAAtB;AACD;;AAED,WAAO;AAAEvC,MAAAA,MAAM,EAAGA,MAAX;AAAwCG,MAAAA,QAAQ,EAAE,CAAC,CAACsC;AAApD,KAAP;AACD;;AAEDK,EAAAA,cAAc,CAACC,OAAD,EAAqC;AACjD,WAAOhG,OAAO,CAACwB,GAAR,CAAYwE,OAAO,CAACvE,GAAR,CAAawB,MAAD,IAAmB,KAAKmC,UAAL,CAAgBnC,MAAhB,CAA/B,CAAZ,CAAP;AACD;;AAED,QAAMgD,kBAAN,CACErG,GADF,EAEEsG,aAFF,EAGEnF,QAHF,EAIkB;AAChB,UAAMwD,UAAU,GAAG,MAAM,KAAKA,UAA9B;AACA,UAAM4B,aAAa,GAAG,MAAM5B,UAAU,CAACoB,SAAX,CAC1B;AAAE9F,MAAAA,GAAG,EAAED,GAAP;AAAY,SAAGmB;AAAf,KAD0B,EAE1BmF,aAF0B,CAA5B;;AAIA,QAAI,CAACC,aAAa,CAAChG,MAAd,CAAqB+E,EAA1B,EAA8B;AAC5BkB,MAAAA,OAAO,CAACC,KAAR,CAAcF,aAAd;AACA,YAAM,IAAI/F,KAAJ,CAAU,eAAV,CAAN;AACD;;AACD,UAAM6C,MAAM,GAAG,MAAM,KAAKqD,SAAL,CAAe1G,GAAf,CAArB;AACA,WAAOqD,MAAP;AACD;;AAEDsD,EAAAA,gBAAgB,CACdtD,MADc,EAEdiD,aAFc,EAGE;AAChB,WAAO,KAAKD,kBAAL,CAAwBhD,MAAM,CAACpD,GAA/B,EAAoCqG,aAApC,CAAP;AACD;;AAEDM,EAAAA,iBAAiB,CACfzF,QADe,EAEfmF,aAFe,EAGA;AACf,WAAO,KAAK3B,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACkC,UAAX,CAAsB1F,QAAtB,EAAgCmF,aAAhC,CADjB,EAEJzG,IAFI,CAEC,MAASiH,SAFV,CAAP,CADe;AAIhB;;AAEDC,EAAAA,WAAW,CAAC/G,GAAD,EAAWmB,QAAX,EAAsD;AAC/D,WAAO,KAAKwD,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACqC,SAAX,CAAqB;AAAE/G,MAAAA,GAAG,EAAED,GAAP;AAAY,SAAGmB;AAAf,KAArB,CADjB,EAEJtB,IAFI,CAEC,MAAMiH,SAFP,CAAP;AAGD;;AAEDE,EAAAA,SAAS,CAAC3D,MAAD,EAA+B;AACtC,WAAO,KAAK0D,WAAL,CAAiB1D,MAAM,CAACpD,GAAxB,CAAP;AACD;;AAEDgH,EAAAA,UAAU,CAACC,QAAD,EAA2C;AACnD,WAAO,KAAKvC,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACsC,UAAX,CAAsBC,QAAtB,CADjB,EAEJrH,IAFI,CAEC,MAAMiH,SAFP,CAAP;AAGD;;AAEDtH,EAAAA,MAAM,CACJ2B,QADI,EAEJc,IAFI,EAG2C;AAC/C,WAAO,KAAK0C,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACwC,IAAX,CAAgBhG,QAAhB,CADjB,EAEJtB,IAFI,CAECoC,IAAI,KAAMzC,MAAD,IAAYA,MAAM,CAACyC,IAAP,CAAYA,IAAZ,CAAjB,CAFL,EAGJpC,IAHI,CAGEL,MAAD,IAAY,IAAIJ,WAAJ,CAAgB,IAAhB,EAAsBI,MAAtB,CAHb,CAAP;AAID;;AAEDkH,EAAAA,SAAS,CAAC1G,GAAD,EAAWmB,QAAX,EAAmE;AAC1E,WAAO,KAAKwD,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACyC,OAAX,CAAmB;AAAEnH,MAAAA,GAAG,EAAED,GAAP;AAAY,SAAGmB;AAAf,KAAnB,CADjB,EAEJtB,IAFI,CAEEU,MAAD,IAAYA,MAAM,IAAIuG,SAFvB,CAAP;AAGD;;AAEDO,EAAAA,OAAO,CAAClG,QAAD,EAA6Bc,IAA7B,EAAmE;AACxE,WAAO,KAAKzC,MAAL,CAAmB2B,QAAnB,EAA6Bc,IAA7B,EAAmCpC,IAAnC,CAAyCL,MAAD,IAC7CA,MAAM,CAACkB,OAAP,EADK,CAAP;AAGD;;AAED0G,EAAAA,OAAO,CACLjG,QADK,EAELc,IAFK,EAGuB;AAC5B,WAAO,KAAK0C,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACwC,IAAX,CAAgBhG,QAAhB,CADjB,EAEJtB,IAFI,CAECoC,IAAI,KAAMzC,MAAD,IAAYA,MAAM,CAACyC,IAAP,CAAYA,IAAZ,CAAjB,CAFL,EAGJpC,IAHI,CAGEL,MAAD,IAAYA,MAAM,CAACU,KAAP,CAAa,CAAb,EAAgBN,IAAhB,EAHb,CAAP;AAID;;AA/NG;;AC1CN,MAAM0H,MAAM,GAAG,IAAIC,MAAJ,CAAW,4BAAX,CAAf;AAEA,AAAe,MAAMC,eAAN,SAA8BC,kBAA9B,CAAiD;AAO9D;AACAnI,EAAAA,WAAW,CAACoI,MAAD,EAAuC;AAChD;;AAEA,QAAI,CAACA,MAAM,CAACC,GAAP,CAAW,MAAX,CAAL,EAAyB;AACvBD,MAAAA,MAAM,CAACE,GAAP,CAAW,MAAX,EAAmB,WAAnB;AACD;;AACD,QAAI,CAACF,MAAM,CAACC,GAAP,CAAW,MAAX,CAAL,EAAyB;AACvBD,MAAAA,MAAM,CAACE,GAAP,CAAW,MAAX,EAAmB,OAAnB;AACD;;AACD,QAAI,CAACF,MAAM,CAACC,GAAP,CAAW,UAAX,CAAL,EAA6B;AAC3B,YAAM,IAAInH,KAAJ,CAAU,yBAAV,CAAN;AACD;;AAED,UAAMqH,gBAAgB,GACnB,aACCH,MAAM,CAACC,GAAP,CAAW,MAAX,IACK,GAAED,MAAM,CAACI,GAAP,CAAW,MAAX,CAA6B,IAC9BJ,MAAM,CAACI,GAAP,CAAW,UAAX,CACD,GAHL,GAII,EACL,EAND,GAOC,GAAEJ,MAAM,CAACI,GAAP,CAAW,MAAX,CAA6B,IAAGJ,MAAM,CAACI,GAAP,CAAW,MAAX,CAA6B,IAC9DJ,MAAM,CAACI,GAAP,CAAW,UAAX,CACD,EAVH;AAYA,SAAKC,OAAL,CAAaF,gBAAb;AACD;;AAEDE,EAAAA,OAAO,CAACF,gBAAD,EAAiC;AACtCP,IAAAA,MAAM,CAACtF,IAAP,CAAY,YAAZ,EAA0B;AAAE6F,MAAAA;AAAF,KAA1B;AAEA,UAAMG,cAAc,GAAGC,WAAW,CAACF,OAAZ,CAAoBF,gBAApB,EAAsC;AAC3DK,MAAAA,eAAe,EAAE;AAD0C,KAAtC,EAGpBrI,IAHoB,CAGdwE,UAAD,IAAgB;AACpBiD,MAAAA,MAAM,CAACtF,IAAP,CAAY,WAAZ,EAAyB;AAAE6F,QAAAA;AAAF,OAAzB;AACAxD,MAAAA,UAAU,CAAC8D,EAAX,CAAc,OAAd,EAAuB,MAAM;AAC3Bb,QAAAA,MAAM,CAACc,IAAP,CAAY,OAAZ,EAAqB;AAAEP,UAAAA;AAAF,SAArB;AACA,aAAK/C,gBAAL,GAAwB,IAAxB;;AACA,aAAKN,aAAL,GAAqB,MAAM;AACzB,gBAAM,IAAIhE,KAAJ,CAAU,2BAAV,CAAN;AACD,SAFD;AAGD,OAND;AAOA6D,MAAAA,UAAU,CAAC8D,EAAX,CAAc,SAAd,EAAyB,MAAM;AAC7Bb,QAAAA,MAAM,CAACc,IAAP,CAAY,SAAZ,EAAuB;AAAEP,UAAAA;AAAF,SAAvB;AACA,aAAK/C,gBAAL,GAAwB,IAAxB;;AACA,aAAKN,aAAL,GAAqB,MAAM;AACzB,gBAAM,IAAIhE,KAAJ,CAAU,4BAAV,CAAN;AACD,SAFD;AAGD,OAND;AAOA6D,MAAAA,UAAU,CAAC8D,EAAX,CAAc,WAAd,EAA2B,MAAM;AAC/Bb,QAAAA,MAAM,CAACc,IAAP,CAAY,WAAZ,EAAyB;AAAEP,UAAAA;AAAF,SAAzB;AACA,aAAK/C,gBAAL,GAAwB,KAAxB;;AACA,aAAKN,aAAL,GAAqB,MACnBpE,OAAO,CAACC,OAAR,CAAgB,KAAKgI,WAArB,CADF;AAED,OALD;AAMAhE,MAAAA,UAAU,CAAC8D,EAAX,CAAc,OAAd,EAAwBvD,GAAD,IAAS;AAC9B0C,QAAAA,MAAM,CAACc,IAAP,CAAY,OAAZ,EAAqB;AAAEP,UAAAA,gBAAF;AAAoBjD,UAAAA;AAApB,SAArB;AACD,OAFD;AAIA,WAAKyD,WAAL,GAAmBhE,UAAnB;AACA,WAAKiE,WAAL,GAAmBxB,SAAnB;;AACA,WAAKtC,aAAL,GAAqB,MACnBpE,OAAO,CAACC,OAAR,CAAgB,KAAKgI,WAArB,CADF;;AAEA,aAAOhE,UAAP;AACD,KAlCoB,EAmCpBkE,KAnCoB,CAmCb3D,GAAD,IAAS;AACd0C,MAAAA,MAAM,CAACtF,IAAP,CAAY,eAAZ,EAA6B;AAAE6F,QAAAA;AAAF,OAA7B;AACArB,MAAAA,OAAO,CAACC,KAAR,CAAc7B,GAAG,CAAC4D,OAAJ,IAAe5D,GAA7B,EAFc;;AAId6D,MAAAA,OAAO,CAACC,QAAR,CAAiB,MAAM;AACrB;AACAD,QAAAA,OAAO,CAACE,IAAR,CAAa,CAAb;AACD,OAHD;AAKA,YAAM/D,GAAN;AACD,KA7CoB,CAAvB;;AA+CA,SAAKJ,aAAL,GAAqB,MAAMpE,OAAO,CAACC,OAAR,CAAgB2H,cAAhB,CAA3B;;AACA,SAAKM,WAAL,GAAmB,KAAK9D,aAAL,EAAnB;AACD;;AAEDA,EAAAA,aAAa,GAAyB;AACpC,UAAM,IAAIhE,KAAJ,CAAU,gBAAV,CAAN;AACD;;AAED,QAAMC,KAAN,GAA6B;AAC3B,SAAK+D,aAAL,GAAqB,MAAMpE,OAAO,CAACyE,MAAR,CAAe,IAAIrE,KAAJ,CAAU,mBAAV,CAAf,CAA3B;;AACA,QAAI,KAAK6H,WAAT,EAAsB;AACpB,YAAM,KAAKA,WAAL,CAAiB5H,KAAjB,EAAN;AACA,WAAK4H,WAAL,GAAmBvB,SAAnB;AACD,KAHD,MAGO,IAAI,KAAKwB,WAAT,EAAsB;AAC3B,YAAM,KAAKA,WAAX;AACA,YAAM,KAAK7H,KAAL,EAAN;AACD;AACF;;AAvG6D;;ACIjD,SAASmI,yBAAT,CAIbC,UAJa,EAYb;AACA,SAAO,IAAIC,cAAJ,CAAmBD,UAAnB,CAAP;AACD;;;;"}
|
|
1
|
+
{"version":3,"file":"index-node12-dev.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":";;;;;;AAMe,MAAMA,WAAN,SAILC,mBAJK,CASb;AACA;AAMAC,EAAAA,WAAW,CAACC,KAAD,EAAqCC,MAArC,EAAqD;AAC9D,UAAMD,KAAN;AACA,SAAKC,MAAL,GAAcA,MAAd;AACD;;AAEDC,EAAAA,OAAO,CAACC,KAAD,EAAsB;AAC3B,SAAKF,MAAL,CAAYG,IAAZ,CAAiBD,KAAjB;AACD;;AAEDE,EAAAA,IAAI,GAAiB;AACnB,WAAO,KAAKJ,MAAL,CAAYI,IAAZ,GAAmBC,IAAnB,CAAyBC,KAAD,IAAW;AACxC,WAAKC,OAAL,GAAeD,KAAf;AACA,WAAKE,GAAL,GAAWF,KAAX,aAAWA,KAAX,uBAAWA,KAAK,CAAEG,GAAlB;AACA,aAAO,KAAKD,GAAZ;AACD,KAJM,CAAP;AAKD;;AAEDE,EAAAA,KAAK,CAACC,QAAD,EAAkC;AACrC,SAAKX,MAAL,CAAYU,KAAZ,CAAkBC,QAAlB;AACA,WAAOC,OAAO,CAACC,OAAR,CAAgB,IAAhB,CAAP;AACD;;AAEDX,EAAAA,KAAK,CAACY,cAAc,GAAG,KAAlB,EAA0C;AAC7C,WAAO,KAAKd,MAAL,CAAYE,KAAZ,CAAkBY,cAAlB,CAAP;AACD;;AAEDC,EAAAA,MAAM,GAAoB;AACxB,QAAI,CAAC,KAAKR,OAAV,EAAmB,MAAM,IAAIS,KAAJ,CAAU,oCAAV,CAAN;AACnB,WAAOJ,OAAO,CAACC,OAAR,CAAgB,KAAKN,OAArB,CAAP;AACD;;AAEDU,EAAAA,KAAK,GAAkB;AACrB,QAAI,KAAKjB,MAAT,EAAiB;AACf,WAAKA,MAAL,CAAYiB,KAAZ;AACD;;AAED,WAAOL,OAAO,CAACC,OAAR,EAAP;AACD;;AAEDK,EAAAA,OAAO,GAAsB;AAC3B,WAAO,KAAKlB,MAAL,CAAYkB,OAAZ,EAAP;AACD;;AAhDD;;ACfF;;AAwBA,MAAMC,qBAAmB,GAIvBC,KAJ0B,IAKTA,KALnB;;AASe,MAAMC,oBAAN,SAKLC,8BALK,CAYb;AASAxB,EAAAA,WAAW,CACTC,KADS,EAETwB,OAFS,EAGTC,WAAqC,GAAGL,qBAH/B,EAIT;AACA;AACA,SAAKpB,KAAL,GAAaA,KAAb;AACA,SAAKwB,OAAL,GAAeA,OAAf;AACA,SAAKC,WAAL,GAAmBA,WAAnB;AACD;;AAEDC,EAAAA,kBAAkB,GAAiB;AACjC,QAAI,CAAC,KAAKC,YAAV,EAAwB;AACtB,UAAI,CAAC,KAAKH,OAAL,CAAaI,QAAlB,EAA4B;AAC1B,eAAO,MAAM,IAAb;AACD;;AAED,YAAMC,UAAU,GAAG,IAAIC,KAAK,CAACC,KAAV,CAAgB,KAAKP,OAAL,CAAaI,QAA7B,CAAnB;AACA,WAAKD,YAAL,GAAoBE,UAAU,CAACG,IAAX,CAAgBC,IAAhB,CAAqBJ,UAArB,CAApB;AACD;;AACD,WAAO,KAAKF,YAAZ;AACD;;AAEU,QAALO,KAAK,CAAIC,WAAJ,EAAiE;AAC1E,UAAMlC,MAAM,GAAG,MAAM,KAAKmC,iBAAL,EAArB;AACA,UAAM,CAACpB,MAAD,EAASb,KAAT,IAAkB,MAAMU,OAAO,CAACwB,GAAR,CAAY,CACxCpC,MAAM,CAACkB,OAAP,EADwC,EAExClB,MAAM,CAACE,KAAP,EAFwC,CAAZ,CAA9B;AAKA,WAAOgC,WAAW,CAAC;AACjBnB,MAAAA,MAAM,EAAEA,MAAM,CAACsB,GAAP,CAAW,KAAKb,WAAhB,CADS;AAEjBc,MAAAA,IAAI,EAAE;AAAEC,QAAAA,KAAK,EAAErC;AAAT,OAFW;AAGjBsC,MAAAA,IAAI,EAAE;AACJC,QAAAA,IAAI,EAAE,KAAKlB,OAAL,CAAakB,IADf;AAEJ/B,QAAAA,KAAK,EAAE,KAAKa,OAAL,CAAab,KAFhB;AAGJgC,QAAAA,OAAO,EAAE,KAAK3C,KAAL,CAAW2C;AAHhB;AAHW,KAAD,CAAlB;AASD;;AAEDC,EAAAA,UAAU,CACRC,QADQ,EAERC,eAFQ,EAGW;AACnB,UAAM9C,KAAK,GAAG,MAAM+C,iBAAN,EAAd;AACA,UAAMpB,YAA0B,GAAG,KAAKD,kBAAL,EAAnC;AAEA,UAAMsB,OAAsB,GAAGF,eAAe,GAC1C,KAAKZ,KAAL,CAAW,CAAC;AAAElB,MAAAA,MAAF;AAAUuB,MAAAA,IAAV;AAAgBE,MAAAA;AAAhB,KAAD,KAAiD;AAC1DI,MAAAA,QAAQ,CAAC,IAAD,EAAO,CACb;AACEI,QAAAA,IAAI,EAAE,SADR;AAEEC,QAAAA,OAAO,EAAElC,MAFX;AAGEmC,QAAAA,SAAS,EAAEV,IAHb;AAIEF,QAAAA;AAJF,OADa,CAAP,CAAR;AAQD,KATD,CAD0C,GAW1C1B,OAAO,CAACC,OAAR,EAXJ;AAaA,UAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAN,CAAiBC,MAAD,IAA4B;AAC9D,YAAMC,OAAkC,GAAG,EAA3C;;AACA,cAAQD,MAAM,CAACL,IAAf;AACE,aAAK,UAAL;AAAiB;AACf,kBAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAP,CAAYoD,MAAZ,CAAmB9B,YAAnB,CAAjB;;AACA,gBAAI6B,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,UADK;AAEXjC,gBAAAA,MAAM,EAAEwC,QAAQ,CAAClB,GAAT,CAAa,KAAKb,WAAlB;AAFG,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAM+B,QAAQ,GAAGF,MAAM,CAACM,IAAP,CAAYH,MAAZ,CAAmB9B,YAAnB,CAAjB;;AACA,gBAAI6B,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,SADK;AAEXY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAT,CAAcwB,MAAD,IAAYA,MAAM,CAAC,KAAK9D,KAAL,CAAW2C,OAAZ,CAA/B;AAFK,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAM;AAAEoB,cAAAA,OAAF;AAAWC,cAAAA,OAAX;AAAoBC,cAAAA;AAApB,gBAAiCX,MAAM,CAACC,OAAP,CAAeW,MAAf,CACrC,CACEC,GADF,EAME,CAACC,UAAD,EAAaC,UAAb,CANF,KAQK;AACH,kBAAI1C,YAAY,CAACyC,UAAD,CAAhB,EAA8B;AAC5B,oBAAI,CAACzC,YAAY,CAAC0C,UAAD,CAAjB,EAA+B;AAC7BF,kBAAAA,GAAG,CAACJ,OAAJ,CAAYJ,IAAZ,CAAiBS,UAAU,CAAC,KAAKpE,KAAL,CAAW2C,OAAZ,CAA3B;AACD,iBAFD,MAEO;AACLwB,kBAAAA,GAAG,CAACH,OAAJ,CAAYL,IAAZ,CAAiB,KAAKlC,WAAL,CAAiB4C,UAAjB,CAAjB;AACD;AACF,eAND,MAMO,IAAI1C,YAAY,CAAC0C,UAAD,CAAhB,EAA8B;AACnCF,gBAAAA,GAAG,CAACF,QAAJ,CAAaN,IAAb,CAAkB,KAAKlC,WAAL,CAAiB4C,UAAjB,CAAlB;AACD;;AAED,qBAAOF,GAAP;AACD,aArBoC,EAsBrC;AAAEJ,cAAAA,OAAO,EAAE,EAAX;AAAeC,cAAAA,OAAO,EAAE,EAAxB;AAA4BC,cAAAA,QAAQ,EAAE;AAAtC,aAtBqC,CAAvC;;AAyBA,gBAAIF,OAAO,CAACL,MAAR,GAAiB,CAArB,EAAwB;AACtBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AAAEV,gBAAAA,IAAI,EAAE,SAAR;AAAmBY,gBAAAA,IAAI,EAAEE;AAAzB,eAAb;AACD;;AACD,gBAAIC,OAAO,CAACN,MAAR,GAAiB,CAArB,EAAwB;AACtBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AAAEV,gBAAAA,IAAI,EAAE,SAAR;AAAmBjC,gBAAAA,MAAM,EAAEgD;AAA3B,eAAb;AACD;;AACD,gBAAIC,QAAQ,CAACP,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AAAEV,gBAAAA,IAAI,EAAE,UAAR;AAAoBjC,gBAAAA,MAAM,EAAEiD;AAA5B,eAAb;AACD;;AAED;AACD;;AACD;AACE,gBAAM,IAAIhD,KAAJ,CAAU,kBAAV,CAAN;AA5DJ;;AA+DA,UAAIsC,OAAO,CAACG,MAAR,KAAmB,CAAvB,EAA0B;AAE1Bb,MAAAA,QAAQ,CAAC,IAAD,EAAOU,OAAP,CAAR;AACD,KApEmB,CAApB,CAjBmB;AAuFnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAO;AACLe,MAAAA,IAAI,EAAElB,WADD;AAELmB,MAAAA,MAAM,EAAEnB,WAFH;AAGL9C,MAAAA,IAAI,EAAE,CACJ6B,WADI,EAEJqC,UAFI,KAGexB,OAAO,CAAC1C,IAAR,CAAa6B,WAAb,EAA0BqC,UAA1B;AANhB,KAAP;AAQD;;AAE8B,QAAjBpC,iBAAiB,GAE7B;AACA,UAAMnC,MAAM,GAAG,MAAM,KAAKD,KAAL,CAAWC,MAAX,CACnB,KAAKuB,OAAL,CAAaI,QADM,EAEnB,KAAKJ,OAAL,CAAakB,IAFM,CAArB;;AAKA,QAAI,KAAKlB,OAAL,CAAapB,IAAjB,EAAuB;AACrBH,MAAAA,MAAM,CAACC,OAAP,CAAe,KAAKsB,OAAL,CAAapB,IAA5B;AACD;;AAED,QAAI,KAAKoB,OAAL,CAAab,KAAjB,EAAwB;AACtB,YAAMV,MAAM,CAACU,KAAP,CAAa,KAAKa,OAAL,CAAab,KAA1B,CAAN;AACD;;AAED,WAAOV,MAAP;AACD;;AA1LD;;ACtBF,MAAMmB,mBAAmB,GAIvBC,KAJ0B,IAKTA,KALnB;;AASe,MAAMoD,oBAAN,SAKLlD,8BALK,CAYb;AASAxB,EAAAA,WAAW,CACTC,KADS,EAETwB,OAFS,EAGTC,WAAuC,GAAGL,mBAHjC,EAIT;AACA;AACA,SAAKpB,KAAL,GAAaA,KAAb;AACA,SAAKwB,OAAL,GAAeA,OAAf;AACA,SAAKC,WAAL,GAAmBA,WAAnB;AACD;;AAEDiD,EAAAA,uBAAuB,GAAiB;AACtC,QAAI,CAAC,KAAK/C,YAAV,EAAwB;AACtB,UAAI,CAAC,KAAKH,OAAL,CAAaI,QAAlB,EAA4B;AAC1B,eAAO,MAAM,IAAb;AACD;;AAED,YAAMC,UAAU,GAAG,IAAIC,KAAK,CAACC,KAAV,CAAgB,KAAKP,OAAL,CAAaI,QAA7B,CAAnB;AACA,WAAKD,YAAL,GAAoBE,UAAU,CAACG,IAAX,CAAgBC,IAAhB,CAAqBJ,UAArB,CAApB;AACD;;AAED,WAAO,KAAKF,YAAZ;AACD;;AAEU,QAALO,KAAK,CAAIC,WAAJ,EAAiE;AAC1E,UAAMlC,MAAM,GAAG,MAAM,KAAKmC,iBAAL,EAArB;AACA,UAAMnC,MAAM,CAACU,KAAP,CAAa,CAAb,CAAN;AACA,WAAOV,MAAM,CAACkB,OAAP,GAAiBb,IAAjB,CAAuBU,MAAD,IAAqB;AAChD,YAAM2D,IAAY,GAChB3D,MAAM,CAAC0C,MAAP,KAAkB,CAAlB,GAAuB,IAAvB,GAAyC,KAAKjC,WAAL,CAAiBT,MAAM,CAAC,CAAD,CAAvB,CAD3C;AAEA,aAAOmB,WAAW,CAAC;AACjBnB,QAAAA,MAAM,EAAE2D,IADS;AAEjBpC,QAAAA,IAAI,EAAE;AAAEC,UAAAA,KAAK,EAAExB,MAAM,KAAK,IAAX,GAAkB,CAAlB,GAAsB;AAA/B,SAFW;AAGjByB,QAAAA,IAAI,EAAE;AACJ9B,UAAAA,KAAK,EAAE,CADH;AAEJgC,UAAAA,OAAO,EAAE,KAAK3C,KAAL,CAAW2C;AAFhB;AAHW,OAAD,CAAlB;AAQD,KAXM,CAAP;AAYD;;AAEDC,EAAAA,UAAU,CACRC,QADQ,EAERC,eAFQ,EAGW;AACnB,UAAM9C,KAAK,GAAG,MAAM+C,iBAAN,EAAd;AACA,UAAMpB,YAA0B,GAAG,KAAK+C,uBAAL,EAAnC;AAEA,UAAM1B,OAAsB,GAAGF,eAAe,GAC1C,KAAKZ,KAAL,CAAW,CAAC;AAAElB,MAAAA,MAAF;AAAUuB,MAAAA,IAAV;AAAgBE,MAAAA;AAAhB,KAAD,KAAiD;AAC1DI,MAAAA,QAAQ,CAAC,IAAD,EAAO,CACb;AACEI,QAAAA,IAAI,EAAE,SADR;AAEEC,QAAAA,OAAO,EAAElC,MAFX;AAGEmC,QAAAA,SAAS,EAAEV,IAHb;AAIEF,QAAAA;AAJF,OADa,CAAP,CAAR;AAQD,KATD,CAD0C,GAW1C1B,OAAO,CAACC,OAAR,EAXJ;AAaA,UAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAN,CAAgB,MAAOC,MAAP,IAAkC;AACpE,YAAMC,OAAkC,GAAG,EAA3C;;AACA,cAAQD,MAAM,CAACL,IAAf;AACE,aAAK,UAAL;AAAiB;AACf,kBAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAP,CAAYoD,MAAZ,CAAmB9B,YAAnB,CAAjB;;AACA,gBAAI6B,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,SADK;AAEXjC,gBAAAA,MAAM,EAAE,KAAKS,WAAL,CAAiB+B,QAAQ,CAAC,CAAD,CAAzB;AAFG,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAMA,QAAQ,GAAGF,MAAM,CAACM,IAAP,CAAYH,MAAZ,CAAmB9B,YAAnB,CAAjB;;AACA,gBAAI6B,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,SADK;AAEXY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAT,CAAcwB,MAAD,IAAYA,MAAM,CAAC,KAAK9D,KAAL,CAAW2C,OAAZ,CAA/B;AAFK,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAMa,QAAQ,GAAGF,MAAM,CAACC,OAAP,CAAeE,MAAf,CAAsB,CAAC,CAACG,IAAD,EAAOvD,IAAP,CAAD,KACrCsB,YAAY,CAACiC,IAAD,CADG,CAAjB;;AAGA,gBAAIJ,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvB,kBAAI,KAAKlC,OAAL,CAAakB,IAAjB,EAAuB;AACrB,sBAAM;AAAE1B,kBAAAA;AAAF,oBAAa,MAAM,KAAKkB,KAAL,CAAY0C,GAAD,IAASA,GAApB,CAAzB;AACArB,gBAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,kBAAAA,IAAI,EAAE,SADK;AAEXjC,kBAAAA;AAFW,iBAAb;AAID,eAND,MAMO,IAAIwC,QAAQ,CAACE,MAAT,KAAoB,CAAxB,EAA2B;AAChC,sBAAM,IAAIzC,KAAJ,CACJ,uEADI,CAAN;AAGD,eAJM,MAIA;AACL,sBAAM,GAAGZ,IAAH,IAAWmD,QAAQ,CAAC,CAAD,CAAzB;AACAD,gBAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,kBAAAA,IAAI,EAAE,SADK;AAEXjC,kBAAAA,MAAM,EAAEW,YAAY,CAACtB,IAAD,CAAZ,GAAqB,KAAKoB,WAAL,CAAiBpB,IAAjB,CAArB,GAA8C;AAF3C,iBAAb;AAID;AACF,aAlBD,MAkBO,IAAImD,QAAQ,CAACE,MAAT,KAAoB,CAAxB,EAA2B;;AAElC;AACD;;AACD;AACE,gBAAM,IAAIzC,KAAJ,CAAU,kBAAV,CAAN;AAhDJ;;AAmDA,UAAIsC,OAAO,CAACG,MAAR,KAAmB,CAAvB,EAA0B;AAE1Bb,MAAAA,QAAQ,CAAC,IAAD,EAAOU,OAAP,CAAR;AACD,KAxDmB,CAApB;AA0DA,WAAO;AACLe,MAAAA,IAAI,EAAElB,WADD;AAELmB,MAAAA,MAAM,EAAEnB,WAFH;AAGL9C,MAAAA,IAAI,EAAE,CACJ6B,WADI,EAEJqC,UAFI,KAGexB,OAAO,CAAC1C,IAAR,CAAa6B,WAAb,EAA0BqC,UAA1B;AANhB,KAAP;AAQD;;AAE8B,QAAjBpC,iBAAiB,GAE7B;AACA,UAAMnC,MAAM,GAAG,MAAM,KAAKD,KAAL,CAAWC,MAAX,CACnB,KAAKuB,OAAL,CAAaI,QADM,EAEnB,KAAKJ,OAAL,CAAakB,IAFM,CAArB;;AAKA,QAAI,KAAKlB,OAAL,CAAab,KAAjB,EAAwB;AACtB,YAAMV,MAAM,CAACU,KAAP,CAAa,KAAKa,OAAL,CAAab,KAA1B,CAAN;AACD;;AAED,WAAOV,MAAP;AACD;;AAvJD;;AC5CF;AAoCe,MAAM4E,UAAN,CAUT;AAOJ9E,EAAAA,WAAW,CAAC+E,UAAD,EAA8BC,cAA9B,EAAsD;AAAA,SANxDpC,OAMwD,GANhC,KAMgC;AAC/D,SAAKmC,UAAL,GAAkBA,UAAlB;;AAEA,QAAI,CAACC,cAAL,EAAqB;AACnB,YAAM,IAAI9D,KAAJ,CAAW,4BAA2B8D,cAAe,GAArD,CAAN;AACD;;AAED,SAAKC,WAAL,GAAmBF,UAAU,CAACG,aAAX,GAA2B3E,IAA3B,CAChB4E,MAAD,IAAyB;AACvB,WAAKF,WAAL,GAAmBE,MAAM,CAACC,EAAP,GAAYC,UAAZ,CAAuBL,cAAvB,CAAnB;AACA,aAAO,KAAKC,WAAZ;AACD,KAJgB,EAKhBK,GAAD,IAAc;AACZ,WAAKL,WAAL,GAAmBnE,OAAO,CAACyE,MAAR,CAAeD,GAAf,CAAnB;AACA,aAAO,KAAKL,WAAZ;AACD,KARgB,CAAnB;AAUD;;AAEa,MAAVI,UAAU,GAAwB;AACpC,QAAI,KAAKN,UAAL,CAAgBS,gBAApB,EAAsC;AACpC,aAAO1E,OAAO,CAACyE,MAAR,CAAe,IAAIrE,KAAJ,CAAU,2BAAV,CAAf,CAAP;AACD;;AAED,WAAOJ,OAAO,CAACC,OAAR,CAAgB,KAAKkE,WAArB,CAAP;AACD;;AAEDQ,EAAAA,qBAAqB,CAInBhE,OAJmB,EAKnBC,WALmB,EAMoC;AACvD,WAAO,IAAIgD,oBAAJ,CACL,IADK,EAELjD,OAFK,EAGLC,WAHK,CAAP;AAKD;;AAEDgE,EAAAA,qBAAqB,CAInBjE,OAJmB,EAKnBC,WALmB,EAMsC;AACzD,WAAO,IAAIH,oBAAJ,CACL,IADK,EAELE,OAFK,EAGLC,WAHK,CAAP;AAKD;;AAEc,QAATiE,SAAS,CAAC5B,MAAD,EAAiD;AAC9D,QAAI,CAACA,MAAM,CAACpD,GAAZ,EAAiB;AACfoD,MAAAA,MAAM,CAACpD,GAAP,GAAa,IAAIiF,OAAO,CAACC,QAAZ,GAAuBC,QAAvB,EAAb;AACD;;AAED,QAAI,CAAC/B,MAAM,CAACgC,OAAZ,EAAqBhC,MAAM,CAACgC,OAAP,GAAiB,IAAIC,IAAJ,EAAjB;AACrB,QAAI,CAACjC,MAAM,CAACE,OAAZ,EAAqBF,MAAM,CAACE,OAAP,GAAiB,IAAI+B,IAAJ,EAAjB;AAErB,UAAMX,UAAU,GAAG,MAAM,KAAKA,UAA9B;AACA,UAAM;AAAEpE,MAAAA;AAAF,QAAa,MAAMoE,UAAU,CAACM,SAAX,CAAqB5B,MAArB,CAAzB;;AACA,QAAI,CAAC9C,MAAM,CAACgF,EAAR,IAAchF,MAAM,CAACiF,CAAP,KAAa,CAA/B,EAAkC;AAChC,YAAM,IAAIhF,KAAJ,CAAU,gBAAV,CAAN;AACD;;AAED,WAAO6C,MAAP;AACD;;AAEe,QAAVoC,UAAU,CAACpC,MAAD,EAAgC;AAC9C,QAAI,CAACA,MAAM,CAACE,OAAZ,EAAqBF,MAAM,CAACE,OAAP,GAAiB,IAAI+B,IAAJ,EAAjB;AAErB,UAAMX,UAAU,GAAG,MAAM,KAAKA,UAA9B;AACA,UAAMA,UAAU,CAACc,UAAX,CAAsB;AAAExF,MAAAA,GAAG,EAAEoD,MAAM,CAACpD;AAAd,KAAtB,EAA2CoD,MAA3C,CAAN;AACA,WAAOA,MAAP;AACD;;AAEc,QAATqC,SAAS,CAMbrC,MANa,EAObsC,wBAPa,EAQG;AAChB,UAAMpF,MAAM,GAAG,MAAM,KAAKqF,iBAAL,CACnBvC,MADmB,EAEnBsC,wBAFmB,CAArB;AAIA,WAAOpF,MAAM,CAAC8C,MAAd;AACD;;AAEsB,QAAjBuC,iBAAiB,CAMrBvC,MANqB,EAOrBsC,wBAPqB,EAQwB;AAC7C,UAAME,YAAY,GAAG;AACnBR,MAAAA,OAAO,EAAEhC,MAAM,CAACgC,OAAP,IAAkB,IAAIC,IAAJ,EADR;AAEnB,SAAGK;AAFgB,KAArB;;AAKA,QAAI,CAACtC,MAAM,CAACE,OAAZ,EAAqB;AAClBF,MAAAA,MAAD,CAA2BE,OAA3B,GAAqC,IAAI+B,IAAJ,EAArC;AACD;;AAED,UAAMQ,IAA4B,GAAG,EAAE,GAAGzC;AAAL,KAArC;AACA,WAAOyC,IAAI,CAACT,OAAZ;AAEA,UAAMV,UAAU,GAAG,MAAM,KAAKA,UAA9B;AAEA,UAAM;AAAEoB,MAAAA;AAAF,QAAoB,MAAMpB,UAAU,CAACqB,SAAX,CAC9B;AAAE/F,MAAAA,GAAG,EAAEoD,MAAM,CAACpD;AAAd,KAD8B,EAE9B;AAAE6F,MAAAA,IAAF;AAAQD,MAAAA;AAAR,KAF8B,EAG9B;AAAEI,MAAAA,MAAM,EAAE;AAAV,KAH8B,CAAhC;;AAMA,QAAIF,aAAJ,EAAmB;AACjBG,MAAAA,MAAM,CAACC,MAAP,CAAc9C,MAAd,EAAsBwC,YAAtB;AACD;;AAED,WAAO;AAAExC,MAAAA,MAAM,EAAGA,MAAX;AAAwCG,MAAAA,QAAQ,EAAE,CAAC,CAACuC;AAApD,KAAP;AACD;;AAEDK,EAAAA,cAAc,CAACC,OAAD,EAAqC;AACjD,WAAOjG,OAAO,CAACwB,GAAR,CAAYyE,OAAO,CAACxE,GAAR,CAAawB,MAAD,IAAmB,KAAKoC,UAAL,CAAgBpC,MAAhB,CAA/B,CAAZ,CAAP;AACD;;AAEuB,QAAlBiD,kBAAkB,CACtBtG,GADsB,EAEtBuG,aAFsB,EAGtBpF,QAHsB,EAIN;AAChB,UAAMwD,UAAU,GAAG,MAAM,KAAKA,UAA9B;AACA,UAAM6B,aAAa,GAAG,MAAM7B,UAAU,CAACqB,SAAX,CAC1B;AAAE/F,MAAAA,GAAG,EAAED,GAAP;AAAY,SAAGmB;AAAf,KAD0B,EAE1BoF,aAF0B,CAA5B;;AAIA,QAAI,CAACC,aAAa,CAACjG,MAAd,CAAqBgF,EAA1B,EAA8B;AAC5BkB,MAAAA,OAAO,CAACC,KAAR,CAAcF,aAAd;AACA,YAAM,IAAIhG,KAAJ,CAAU,eAAV,CAAN;AACD;;AACD,UAAM6C,MAAM,GAAG,MAAM,KAAKsD,SAAL,CAAe3G,GAAf,CAArB;AACA,WAAOqD,MAAP;AACD;;AAEDuD,EAAAA,gBAAgB,CACdvD,MADc,EAEdkD,aAFc,EAGE;AAChB,WAAO,KAAKD,kBAAL,CAAwBjD,MAAM,CAACpD,GAA/B,EAAoCsG,aAApC,CAAP;AACD;;AAEDM,EAAAA,iBAAiB,CACf1F,QADe,EAEfoF,aAFe,EAGA;AACf,WAAO,KAAK5B,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACmC,UAAX,CAAsB3F,QAAtB,EAAgCoF,aAAhC,CADjB,EAEJ1G,IAFI,CAEC,MAASkH,SAFV,CAAP,CADe;AAIhB;;AAEDC,EAAAA,WAAW,CAAChH,GAAD,EAAWmB,QAAX,EAAsD;AAC/D,WAAO,KAAKwD,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACsC,SAAX,CAAqB;AAAEhH,MAAAA,GAAG,EAAED,GAAP;AAAY,SAAGmB;AAAf,KAArB,CADjB,EAEJtB,IAFI,CAEC,MAAMkH,SAFP,CAAP;AAGD;;AAEDE,EAAAA,SAAS,CAAC5D,MAAD,EAA+B;AACtC,WAAO,KAAK2D,WAAL,CAAiB3D,MAAM,CAACpD,GAAxB,CAAP;AACD;;AAEDiH,EAAAA,UAAU,CAACC,QAAD,EAA2C;AACnD,WAAO,KAAKxC,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACuC,UAAX,CAAsBC,QAAtB,CADjB,EAEJtH,IAFI,CAEC,MAAMkH,SAFP,CAAP;AAGD;;AAEDvH,EAAAA,MAAM,CACJ2B,QADI,EAEJc,IAFI,EAG2C;AAC/C,WAAO,KAAK0C,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACyC,IAAX,CAAgBjG,QAAhB,CADjB,EAEJtB,IAFI,CAECoC,IAAI,KAAMzC,MAAD,IAAYA,MAAM,CAACyC,IAAP,CAAYA,IAAZ,CAAjB,CAFL,EAGJpC,IAHI,CAGEL,MAAD,IAAY,IAAIJ,WAAJ,CAAgB,IAAhB,EAAsBI,MAAtB,CAHb,CAAP;AAID;;AAEDmH,EAAAA,SAAS,CAAC3G,GAAD,EAAWmB,QAAX,EAAmE;AAC1E,WAAO,KAAKwD,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAAC0C,OAAX,CAAmB;AAAEpH,MAAAA,GAAG,EAAED,GAAP;AAAY,SAAGmB;AAAf,KAAnB,CADjB,EAEJtB,IAFI,CAEEU,MAAD,IAAYA,MAAM,IAAIwG,SAFvB,CAAP;AAGD;;AAEDO,EAAAA,OAAO,CAACnG,QAAD,EAA6Bc,IAA7B,EAAmE;AACxE,WAAO,KAAKzC,MAAL,CAAmB2B,QAAnB,EAA6Bc,IAA7B,EAAmCpC,IAAnC,CAAyCL,MAAD,IAC7CA,MAAM,CAACkB,OAAP,EADK,CAAP;AAGD;;AAED2G,EAAAA,OAAO,CACLlG,QADK,EAELc,IAFK,EAGuB;AAC5B,WAAO,KAAK0C,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACyC,IAAX,CAAgBjG,QAAhB,CADjB,EAEJtB,IAFI,CAECoC,IAAI,KAAMzC,MAAD,IAAYA,MAAM,CAACyC,IAAP,CAAYA,IAAZ,CAAjB,CAFL,EAGJpC,IAHI,CAGEL,MAAD,IAAYA,MAAM,CAACU,KAAP,CAAa,CAAb,EAAgBN,IAAhB,EAHb,CAAP;AAID;;AA/NG;;AC1CN,MAAM2H,MAAM,GAAG,IAAIC,MAAJ,CAAW,4BAAX,CAAf;AAEe,MAAMC,eAAN,SAA8BC,kBAA9B,CAAiD;AAO9D;AACApI,EAAAA,WAAW,CAACqI,MAAD,EAAuC;AAChD;;AAEA,QAAI,CAACA,MAAM,CAACC,GAAP,CAAW,MAAX,CAAL,EAAyB;AACvBD,MAAAA,MAAM,CAACE,GAAP,CAAW,MAAX,EAAmB,WAAnB;AACD;;AACD,QAAI,CAACF,MAAM,CAACC,GAAP,CAAW,MAAX,CAAL,EAAyB;AACvBD,MAAAA,MAAM,CAACE,GAAP,CAAW,MAAX,EAAmB,OAAnB;AACD;;AACD,QAAI,CAACF,MAAM,CAACC,GAAP,CAAW,UAAX,CAAL,EAA6B;AAC3B,YAAM,IAAIpH,KAAJ,CAAU,yBAAV,CAAN;AACD;;AAED,UAAMsH,gBAAgB,GACnB,aACCH,MAAM,CAACC,GAAP,CAAW,MAAX,IACK,GAAED,MAAM,CAACI,GAAP,CAAW,MAAX,CAA6B,IAC9BJ,MAAM,CAACI,GAAP,CAAW,UAAX,CACD,GAHL,GAII,EACL,EAND,GAOC,GAAEJ,MAAM,CAACI,GAAP,CAAW,MAAX,CAA6B,IAAGJ,MAAM,CAACI,GAAP,CAAW,MAAX,CAA6B,IAC9DJ,MAAM,CAACI,GAAP,CAAW,UAAX,CACD,EAVH;AAYA,SAAKC,OAAL,CAAaF,gBAAb;AACD;;AAEDE,EAAAA,OAAO,CAACF,gBAAD,EAAiC;AACtCP,IAAAA,MAAM,CAACvF,IAAP,CAAY,YAAZ,EAA0B;AAAE8F,MAAAA;AAAF,KAA1B;AAEA,UAAMG,cAAc,GAAG/C,OAAO,CAACgD,WAAR,CAAoBF,OAApB,CAA4BF,gBAA5B,EAA8C;AACnEK,MAAAA,eAAe,EAAE;AADkD,KAA9C,EAGpBtI,IAHoB,CAGdwE,UAAD,IAAgB;AACpBkD,MAAAA,MAAM,CAACvF,IAAP,CAAY,WAAZ,EAAyB;AAAE8F,QAAAA;AAAF,OAAzB;AACAzD,MAAAA,UAAU,CAAC+D,EAAX,CAAc,OAAd,EAAuB,MAAM;AAC3Bb,QAAAA,MAAM,CAACc,IAAP,CAAY,OAAZ,EAAqB;AAAEP,UAAAA;AAAF,SAArB;AACA,aAAKhD,gBAAL,GAAwB,IAAxB;;AACA,aAAKN,aAAL,GAAqB,MAAM;AACzB,gBAAM,IAAIhE,KAAJ,CAAU,2BAAV,CAAN;AACD,SAFD;AAGD,OAND;AAOA6D,MAAAA,UAAU,CAAC+D,EAAX,CAAc,SAAd,EAAyB,MAAM;AAC7Bb,QAAAA,MAAM,CAACc,IAAP,CAAY,SAAZ,EAAuB;AAAEP,UAAAA;AAAF,SAAvB;AACA,aAAKhD,gBAAL,GAAwB,IAAxB;;AACA,aAAKN,aAAL,GAAqB,MAAM;AACzB,gBAAM,IAAIhE,KAAJ,CAAU,4BAAV,CAAN;AACD,SAFD;AAGD,OAND;AAOA6D,MAAAA,UAAU,CAAC+D,EAAX,CAAc,WAAd,EAA2B,MAAM;AAC/Bb,QAAAA,MAAM,CAACc,IAAP,CAAY,WAAZ,EAAyB;AAAEP,UAAAA;AAAF,SAAzB;AACA,aAAKhD,gBAAL,GAAwB,KAAxB;;AACA,aAAKN,aAAL,GAAqB,MAAMpE,OAAO,CAACC,OAAR,CAAgB,KAAKiI,WAArB,CAA3B;AACD,OAJD;AAKAjE,MAAAA,UAAU,CAAC+D,EAAX,CAAc,OAAd,EAAwBxD,GAAD,IAAS;AAC9B2C,QAAAA,MAAM,CAACc,IAAP,CAAY,OAAZ,EAAqB;AAAEP,UAAAA,gBAAF;AAAoBlD,UAAAA;AAApB,SAArB;AACD,OAFD;AAIA,WAAK0D,WAAL,GAAmBjE,UAAnB;AACA,WAAKkE,WAAL,GAAmBxB,SAAnB;;AACA,WAAKvC,aAAL,GAAqB,MAAMpE,OAAO,CAACC,OAAR,CAAgB,KAAKiI,WAArB,CAA3B;;AACA,aAAOjE,UAAP;AACD,KAhCoB,EAiCpBmE,KAjCoB,CAiCb5D,GAAD,IAAS;AACd2C,MAAAA,MAAM,CAACvF,IAAP,CAAY,eAAZ,EAA6B;AAAE8F,QAAAA;AAAF,OAA7B;AACArB,MAAAA,OAAO,CAACC,KAAR,CAAc9B,GAAG,CAAC6D,OAAJ,IAAe7D,GAA7B,EAFc;;AAId8D,MAAAA,OAAO,CAACC,QAAR,CAAiB,MAAM;AACrB;AACAD,QAAAA,OAAO,CAACE,IAAR,CAAa,CAAb;AACD,OAHD;AAKA,YAAMhE,GAAN;AACD,KA3CoB,CAAvB;;AA6CA,SAAKJ,aAAL,GAAqB,MAAMpE,OAAO,CAACC,OAAR,CAAgB4H,cAAhB,CAA3B;;AACA,SAAKM,WAAL,GAAmB,KAAK/D,aAAL,EAAnB;AACD;;AAEDA,EAAAA,aAAa,GAAiC;AAC5C,UAAM,IAAIhE,KAAJ,CAAU,gBAAV,CAAN;AACD;;AAEU,QAALC,KAAK,GAAkB;AAC3B,SAAK+D,aAAL,GAAqB,MAAMpE,OAAO,CAACyE,MAAR,CAAe,IAAIrE,KAAJ,CAAU,mBAAV,CAAf,CAA3B;;AACA,QAAI,KAAK8H,WAAT,EAAsB;AACpB,YAAM,KAAKA,WAAL,CAAiB7H,KAAjB,EAAN;AACA,WAAK6H,WAAL,GAAmBvB,SAAnB;AACD,KAHD,MAGO,IAAI,KAAKwB,WAAT,EAAsB;AAC3B,YAAM,KAAKA,WAAX;AACA,YAAM,KAAK9H,KAAL,EAAN;AACD;AACF;;AArG6D;;ACIjD,SAASoI,yBAAT,CAIbC,UAJa,EAYb;AACA,SAAO,IAAIC,cAAJ,CAAmBD,UAAnB,CAAP;AACD;;;;"}
|
package/dist/index-node12.cjs.js
CHANGED
|
@@ -2,13 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|
6
|
-
|
|
7
5
|
const mongodb = require('mongodb');
|
|
8
6
|
const liwiStore = require('liwi-store');
|
|
9
7
|
const liwiSubscribeStore = require('liwi-subscribe-store');
|
|
10
|
-
const mingo =
|
|
11
|
-
const Logger =
|
|
8
|
+
const mingo = require('mingo');
|
|
9
|
+
const Logger = require('nightingale-logger');
|
|
10
|
+
|
|
11
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e["default"] : e; }
|
|
12
|
+
|
|
13
|
+
const mongodb__default = /*#__PURE__*/_interopDefaultLegacy(mongodb);
|
|
14
|
+
const mingo__default = /*#__PURE__*/_interopDefaultLegacy(mingo);
|
|
15
|
+
const Logger__default = /*#__PURE__*/_interopDefaultLegacy(Logger);
|
|
12
16
|
|
|
13
17
|
class MongoCursor extends liwiStore.AbstractStoreCursor {
|
|
14
18
|
// key in AbstractCursor
|
|
@@ -59,10 +63,10 @@ class MongoCursor extends liwiStore.AbstractStoreCursor {
|
|
|
59
63
|
|
|
60
64
|
/* eslint-disable complexity, max-lines */
|
|
61
65
|
|
|
62
|
-
const identityTransformer = model => model;
|
|
66
|
+
const identityTransformer$1 = model => model;
|
|
63
67
|
|
|
64
68
|
class MongoQueryCollection extends liwiSubscribeStore.AbstractSubscribableStoreQuery {
|
|
65
|
-
constructor(store, options, transformer = identityTransformer) {
|
|
69
|
+
constructor(store, options, transformer = identityTransformer$1) {
|
|
66
70
|
super();
|
|
67
71
|
this.store = store;
|
|
68
72
|
this.options = options;
|
|
@@ -75,7 +79,7 @@ class MongoQueryCollection extends liwiSubscribeStore.AbstractSubscribableStoreQ
|
|
|
75
79
|
return () => true;
|
|
76
80
|
}
|
|
77
81
|
|
|
78
|
-
const mingoQuery = new
|
|
82
|
+
const mingoQuery = new mingo__default.Query(this.options.criteria);
|
|
79
83
|
this.testCriteria = mingoQuery.test.bind(mingoQuery);
|
|
80
84
|
}
|
|
81
85
|
|
|
@@ -242,30 +246,27 @@ class MongoQueryCollection extends liwiSubscribeStore.AbstractSubscribableStoreQ
|
|
|
242
246
|
|
|
243
247
|
}
|
|
244
248
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
const identityTransformer$1 = model => model;
|
|
249
|
+
const identityTransformer = model => model;
|
|
248
250
|
|
|
249
251
|
class MongoQuerySingleItem extends liwiSubscribeStore.AbstractSubscribableStoreQuery {
|
|
250
|
-
constructor(store, options, transformer = identityTransformer
|
|
252
|
+
constructor(store, options, transformer = identityTransformer) {
|
|
251
253
|
super();
|
|
252
254
|
this.store = store;
|
|
253
255
|
this.options = options;
|
|
254
256
|
this.transformer = transformer;
|
|
255
257
|
}
|
|
256
258
|
|
|
257
|
-
|
|
258
|
-
if (!this.
|
|
259
|
+
createMingoTestCriteria() {
|
|
260
|
+
if (!this.testCriteria) {
|
|
259
261
|
if (!this.options.criteria) {
|
|
260
|
-
return
|
|
261
|
-
test: () => true
|
|
262
|
-
};
|
|
262
|
+
return () => true;
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
-
|
|
265
|
+
const mingoQuery = new mingo__default.Query(this.options.criteria);
|
|
266
|
+
this.testCriteria = mingoQuery.test.bind(mingoQuery);
|
|
266
267
|
}
|
|
267
268
|
|
|
268
|
-
return this.
|
|
269
|
+
return this.testCriteria;
|
|
269
270
|
}
|
|
270
271
|
|
|
271
272
|
async fetch(onFulfilled) {
|
|
@@ -288,7 +289,7 @@ class MongoQuerySingleItem extends liwiSubscribeStore.AbstractSubscribableStoreQ
|
|
|
288
289
|
|
|
289
290
|
_subscribe(callback, _includeInitial) {
|
|
290
291
|
const store = super.getSubscribeStore();
|
|
291
|
-
const
|
|
292
|
+
const testCriteria = this.createMingoTestCriteria();
|
|
292
293
|
const promise = _includeInitial ? this.fetch(({
|
|
293
294
|
result,
|
|
294
295
|
meta,
|
|
@@ -307,7 +308,7 @@ class MongoQuerySingleItem extends liwiSubscribeStore.AbstractSubscribableStoreQ
|
|
|
307
308
|
switch (action.type) {
|
|
308
309
|
case 'inserted':
|
|
309
310
|
{
|
|
310
|
-
const filtered = action.next.filter(
|
|
311
|
+
const filtered = action.next.filter(testCriteria);
|
|
311
312
|
|
|
312
313
|
if (filtered.length > 0) {
|
|
313
314
|
changes.push({
|
|
@@ -321,7 +322,7 @@ class MongoQuerySingleItem extends liwiSubscribeStore.AbstractSubscribableStoreQ
|
|
|
321
322
|
|
|
322
323
|
case 'deleted':
|
|
323
324
|
{
|
|
324
|
-
const filtered = action.prev.filter(
|
|
325
|
+
const filtered = action.prev.filter(testCriteria);
|
|
325
326
|
|
|
326
327
|
if (filtered.length > 0) {
|
|
327
328
|
changes.push({
|
|
@@ -335,7 +336,7 @@ class MongoQuerySingleItem extends liwiSubscribeStore.AbstractSubscribableStoreQ
|
|
|
335
336
|
|
|
336
337
|
case 'updated':
|
|
337
338
|
{
|
|
338
|
-
const filtered = action.changes.filter(([prev, next]) =>
|
|
339
|
+
const filtered = action.changes.filter(([prev, next]) => testCriteria(prev));
|
|
339
340
|
|
|
340
341
|
if (filtered.length > 0) {
|
|
341
342
|
if (this.options.sort) {
|
|
@@ -352,7 +353,7 @@ class MongoQuerySingleItem extends liwiSubscribeStore.AbstractSubscribableStoreQ
|
|
|
352
353
|
const [, next] = filtered[0];
|
|
353
354
|
changes.push({
|
|
354
355
|
type: 'updated',
|
|
355
|
-
result:
|
|
356
|
+
result: testCriteria(next) ? this.transformer(next) : null
|
|
356
357
|
});
|
|
357
358
|
}
|
|
358
359
|
} else if (filtered.length === 0) ;
|
|
@@ -423,7 +424,7 @@ class MongoStore {
|
|
|
423
424
|
|
|
424
425
|
async insertOne(object) {
|
|
425
426
|
if (!object._id) {
|
|
426
|
-
object._id = new
|
|
427
|
+
object._id = new mongodb__default.ObjectID().toString();
|
|
427
428
|
}
|
|
428
429
|
|
|
429
430
|
if (!object.created) object.created = new Date();
|
|
@@ -553,7 +554,7 @@ class MongoStore {
|
|
|
553
554
|
|
|
554
555
|
}
|
|
555
556
|
|
|
556
|
-
const logger = new
|
|
557
|
+
const logger = new Logger__default('liwi:mongo:MongoConnection');
|
|
557
558
|
class MongoConnection extends liwiStore.AbstractConnection {
|
|
558
559
|
// TODO interface
|
|
559
560
|
constructor(config) {
|
|
@@ -579,7 +580,7 @@ class MongoConnection extends liwiStore.AbstractConnection {
|
|
|
579
580
|
logger.info('connecting', {
|
|
580
581
|
connectionString
|
|
581
582
|
});
|
|
582
|
-
const connectPromise =
|
|
583
|
+
const connectPromise = mongodb__default.MongoClient.connect(connectionString, {
|
|
583
584
|
useNewUrlParser: true
|
|
584
585
|
}).then(connection => {
|
|
585
586
|
logger.info('connected', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-node12.cjs.js","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":";;;;;;;;;;;;AAMe,MAAMA,WAAN,SAILC,6BAJK,CASb;AACA;AAMAC,EAAAA,WAAW,CAACC,KAAD,EAAqCC,MAArC,EAAqD;AAC9D,UAAMD,KAAN;AACA,SAAKC,MAAL,GAAcA,MAAd;AACD;;AAEDC,EAAAA,OAAO,CAACC,KAAD,EAAsB;AAC3B,SAAKF,MAAL,CAAYG,IAAZ,CAAiBD,KAAjB;AACD;;AAEDE,EAAAA,IAAI,GAAiB;AACnB,WAAO,KAAKJ,MAAL,CAAYI,IAAZ,GAAmBC,IAAnB,CAAyBC,KAAD,IAAW;AACxC,WAAKC,OAAL,GAAeD,KAAf;AACA,WAAKE,GAAL,GAAWF,KAAX,aAAWA,KAAX,uBAAWA,KAAK,CAAEG,GAAlB;AACA,aAAO,KAAKD,GAAZ;AACD,KAJM,CAAP;AAKD;;AAEDE,EAAAA,KAAK,CAACC,QAAD,EAAkC;AACrC,SAAKX,MAAL,CAAYU,KAAZ,CAAkBC,QAAlB;AACA,WAAOC,OAAO,CAACC,OAAR,CAAgB,IAAhB,CAAP;AACD;;AAEDX,EAAAA,KAAK,CAACY,cAAc,GAAG,KAAlB,EAA0C;AAC7C,WAAO,KAAKd,MAAL,CAAYE,KAAZ,CAAkBY,cAAlB,CAAP;AACD;;AAEDC,EAAAA,MAAM,GAAoB;AACxB,QAAI,CAAC,KAAKR,OAAV,EAAmB,MAAM,IAAIS,KAAJ,CAAU,oCAAV,CAAN;AACnB,WAAOJ,OAAO,CAACC,OAAR,CAAgB,KAAKN,OAArB,CAAP;AACD;;AAEDU,EAAAA,KAAK,GAAkB;AACrB,QAAI,KAAKjB,MAAT,EAAiB;AACf,WAAKA,MAAL,CAAYiB,KAAZ;AACD;;AAED,WAAOL,OAAO,CAACC,OAAR,EAAP;AACD;;AAEDK,EAAAA,OAAO,GAAsB;AAC3B,WAAO,KAAKlB,MAAL,CAAYkB,OAAZ,EAAP;AACD;;AAhDD;;ACfF;AAQA;AAgBA,MAAMC,mBAAmB,GAIvBC,KAJ0B,IAKTA,KALnB;;AASA,AAAe,MAAMC,oBAAN,SAKLC,iDALK,CAYb;AASAxB,EAAAA,WAAW,CACTC,KADS,EAETwB,OAFS,EAGTC,WAAqC,GAAGL,mBAH/B,EAIT;AACA;AACA,SAAKpB,KAAL,GAAaA,KAAb;AACA,SAAKwB,OAAL,GAAeA,OAAf;AACA,SAAKC,WAAL,GAAmBA,WAAnB;AACD;;AAEDC,EAAAA,kBAAkB,GAAiB;AACjC,QAAI,CAAC,KAAKC,YAAV,EAAwB;AACtB,UAAI,CAAC,KAAKH,OAAL,CAAaI,QAAlB,EAA4B;AAC1B,eAAO,MAAM,IAAb;AACD;;AAED,YAAMC,UAAU,GAAG,IAAIC,KAAK,CAACC,KAAV,CAAgB,KAAKP,OAAL,CAAaI,QAA7B,CAAnB;AACA,WAAKD,YAAL,GAAoBE,UAAU,CAACG,IAAX,CAAgBC,IAAhB,CAAqBJ,UAArB,CAApB;AACD;;AACD,WAAO,KAAKF,YAAZ;AACD;;AAED,QAAMO,KAAN,CAAeC,WAAf,EAA4E;AAC1E,UAAMlC,MAAM,GAAG,MAAM,KAAKmC,iBAAL,EAArB;AACA,UAAM,CAACpB,MAAD,EAASb,KAAT,IAAkB,MAAMU,OAAO,CAACwB,GAAR,CAAY,CACxCpC,MAAM,CAACkB,OAAP,EADwC,EAExClB,MAAM,CAACE,KAAP,EAFwC,CAAZ,CAA9B;AAKA,WAAOgC,WAAW,CAAC;AACjBnB,MAAAA,MAAM,EAAEA,MAAM,CAACsB,GAAP,CAAW,KAAKb,WAAhB,CADS;AAEjBc,MAAAA,IAAI,EAAE;AAAEC,QAAAA,KAAK,EAAErC;AAAT,OAFW;AAGjBsC,MAAAA,IAAI,EAAE;AACJC,QAAAA,IAAI,EAAE,KAAKlB,OAAL,CAAakB,IADf;AAEJ/B,QAAAA,KAAK,EAAE,KAAKa,OAAL,CAAab,KAFhB;AAGJgC,QAAAA,OAAO,EAAE,KAAK3C,KAAL,CAAW2C;AAHhB;AAHW,KAAD,CAAlB;AASD;;AAEDC,EAAAA,UAAU,CACRC,QADQ,EAERC,eAFQ,EAGW;AACnB,UAAM9C,KAAK,GAAG,MAAM+C,iBAAN,EAAd;AACA,UAAMpB,YAA0B,GAAG,KAAKD,kBAAL,EAAnC;AAEA,UAAMsB,OAAsB,GAAGF,eAAe,GAC1C,KAAKZ,KAAL,CAAW,CAAC;AAAElB,MAAAA,MAAF;AAAUuB,MAAAA,IAAV;AAAgBE,MAAAA;AAAhB,KAAD,KAAiD;AAC1DI,MAAAA,QAAQ,CAAC,IAAD,EAAO,CACb;AACEI,QAAAA,IAAI,EAAE,SADR;AAEEC,QAAAA,OAAO,EAAElC,MAFX;AAGEmC,QAAAA,SAAS,EAAEV,IAHb;AAIEF,QAAAA;AAJF,OADa,CAAP,CAAR;AAQD,KATD,CAD0C,GAW1C1B,OAAO,CAACC,OAAR,EAXJ;AAaA,UAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAN,CAAiBC,MAAD,IAA4B;AAC9D,YAAMC,OAAkC,GAAG,EAA3C;;AACA,cAAQD,MAAM,CAACL,IAAf;AACE,aAAK,UAAL;AAAiB;AACf,kBAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAP,CAAYoD,MAAZ,CAAmB9B,YAAnB,CAAjB;;AACA,gBAAI6B,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,UADK;AAEXjC,gBAAAA,MAAM,EAAEwC,QAAQ,CAAClB,GAAT,CAAa,KAAKb,WAAlB;AAFG,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAM+B,QAAQ,GAAGF,MAAM,CAACM,IAAP,CAAYH,MAAZ,CAAmB9B,YAAnB,CAAjB;;AACA,gBAAI6B,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,SADK;AAEXY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAT,CAAcwB,MAAD,IAAYA,MAAM,CAAC,KAAK9D,KAAL,CAAW2C,OAAZ,CAA/B;AAFK,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAM;AAAEoB,cAAAA,OAAF;AAAWC,cAAAA,OAAX;AAAoBC,cAAAA;AAApB,gBAAiCX,MAAM,CAACC,OAAP,CAAeW,MAAf,CACrC,CACEC,GADF,EAME,CAACC,UAAD,EAAaC,UAAb,CANF,KAQK;AACH,kBAAI1C,YAAY,CAACyC,UAAD,CAAhB,EAA8B;AAC5B,oBAAI,CAACzC,YAAY,CAAC0C,UAAD,CAAjB,EAA+B;AAC7BF,kBAAAA,GAAG,CAACJ,OAAJ,CAAYJ,IAAZ,CAAiBS,UAAU,CAAC,KAAKpE,KAAL,CAAW2C,OAAZ,CAA3B;AACD,iBAFD,MAEO;AACLwB,kBAAAA,GAAG,CAACH,OAAJ,CAAYL,IAAZ,CAAiB,KAAKlC,WAAL,CAAiB4C,UAAjB,CAAjB;AACD;AACF,eAND,MAMO,IAAI1C,YAAY,CAAC0C,UAAD,CAAhB,EAA8B;AACnCF,gBAAAA,GAAG,CAACF,QAAJ,CAAaN,IAAb,CAAkB,KAAKlC,WAAL,CAAiB4C,UAAjB,CAAlB;AACD;;AAED,qBAAOF,GAAP;AACD,aArBoC,EAsBrC;AAAEJ,cAAAA,OAAO,EAAE,EAAX;AAAeC,cAAAA,OAAO,EAAE,EAAxB;AAA4BC,cAAAA,QAAQ,EAAE;AAAtC,aAtBqC,CAAvC;;AAyBA,gBAAIF,OAAO,CAACL,MAAR,GAAiB,CAArB,EAAwB;AACtBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AAAEV,gBAAAA,IAAI,EAAE,SAAR;AAAmBY,gBAAAA,IAAI,EAAEE;AAAzB,eAAb;AACD;;AACD,gBAAIC,OAAO,CAACN,MAAR,GAAiB,CAArB,EAAwB;AACtBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AAAEV,gBAAAA,IAAI,EAAE,SAAR;AAAmBjC,gBAAAA,MAAM,EAAEgD;AAA3B,eAAb;AACD;;AACD,gBAAIC,QAAQ,CAACP,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AAAEV,gBAAAA,IAAI,EAAE,UAAR;AAAoBjC,gBAAAA,MAAM,EAAEiD;AAA5B,eAAb;AACD;;AAED;AACD;;AACD;AACE,gBAAM,IAAIhD,KAAJ,CAAU,kBAAV,CAAN;AA5DJ;;AA+DA,UAAIsC,OAAO,CAACG,MAAR,KAAmB,CAAvB,EAA0B;AAE1Bb,MAAAA,QAAQ,CAAC,IAAD,EAAOU,OAAP,CAAR;AACD,KApEmB,CAApB,CAjBmB;AAuFnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAO;AACLe,MAAAA,IAAI,EAAElB,WADD;AAELmB,MAAAA,MAAM,EAAEnB,WAFH;AAGL9C,MAAAA,IAAI,EAAE,CACJ6B,WADI,EAEJqC,UAFI,KAGexB,OAAO,CAAC1C,IAAR,CAAa6B,WAAb,EAA0BqC,UAA1B;AANhB,KAAP;AAQD;;AAED,QAAcpC,iBAAd,GAEE;AACA,UAAMnC,MAAM,GAAG,MAAM,KAAKD,KAAL,CAAWC,MAAX,CACnB,KAAKuB,OAAL,CAAaI,QADM,EAEnB,KAAKJ,OAAL,CAAakB,IAFM,CAArB;;AAKA,QAAI,KAAKlB,OAAL,CAAapB,IAAjB,EAAuB;AACrBH,MAAAA,MAAM,CAACC,OAAP,CAAe,KAAKsB,OAAL,CAAapB,IAA5B;AACD;;AAED,QAAI,KAAKoB,OAAL,CAAab,KAAjB,EAAwB;AACtB,YAAMV,MAAM,CAACU,KAAP,CAAa,KAAKa,OAAL,CAAab,KAA1B,CAAN;AACD;;AAED,WAAOV,MAAP;AACD;;AA1LD;;AC7CF;AAQA;AAgBA,MAAMmB,qBAAmB,GAIvBC,KAJ0B,IAKTA,KALnB;;AAWA,AAAe,MAAMoD,oBAAN,SAKLlD,iDALK,CAYb;AASAxB,EAAAA,WAAW,CACTC,KADS,EAETwB,OAFS,EAGTC,WAAuC,GAAGL,qBAHjC,EAIT;AACA;AACA,SAAKpB,KAAL,GAAaA,KAAb;AACA,SAAKwB,OAAL,GAAeA,OAAf;AACA,SAAKC,WAAL,GAAmBA,WAAnB;AACD;;AAEDiD,EAAAA,gBAAgB,GAAiB;AAC/B,QAAI,CAAC,KAAK7C,UAAV,EAAsB;AACpB,UAAI,CAAC,KAAKL,OAAL,CAAaI,QAAlB,EAA4B;AAC1B,eAAO;AAAEI,UAAAA,IAAI,EAAE,MAAM;AAAd,SAAP;AACD;;AAED,WAAKH,UAAL,GAAkB,IAAIC,KAAK,CAACC,KAAV,CAAgB,KAAKP,OAAL,CAAaI,QAA7B,CAAlB;AACD;;AAED,WAAO,KAAKC,UAAZ;AACD;;AAED,QAAMK,KAAN,CAAeC,WAAf,EAA4E;AAC1E,UAAMlC,MAAM,GAAG,MAAM,KAAKmC,iBAAL,EAArB;AACA,UAAMnC,MAAM,CAACU,KAAP,CAAa,CAAb,CAAN;AACA,WAAOV,MAAM,CAACkB,OAAP,GAAiBb,IAAjB,CAAuBU,MAAD,IAAqB;AAChD,YAAM2D,IAAY,GAChB3D,MAAM,CAAC0C,MAAP,KAAkB,CAAlB,GAAuB,IAAvB,GAAyC,KAAKjC,WAAL,CAAiBT,MAAM,CAAC,CAAD,CAAvB,CAD3C;AAEA,aAAOmB,WAAW,CAAC;AACjBnB,QAAAA,MAAM,EAAE2D,IADS;AAEjBpC,QAAAA,IAAI,EAAE;AAAEC,UAAAA,KAAK,EAAExB,MAAM,KAAK,IAAX,GAAkB,CAAlB,GAAsB;AAA/B,SAFW;AAGjByB,QAAAA,IAAI,EAAE;AACJ9B,UAAAA,KAAK,EAAE,CADH;AAEJgC,UAAAA,OAAO,EAAE,KAAK3C,KAAL,CAAW2C;AAFhB;AAHW,OAAD,CAAlB;AAQD,KAXM,CAAP;AAYD;;AAEDC,EAAAA,UAAU,CACRC,QADQ,EAERC,eAFQ,EAGW;AACnB,UAAM9C,KAAK,GAAG,MAAM+C,iBAAN,EAAd;AACA,UAAMlB,UAAwB,GAAG,KAAK6C,gBAAL,EAAjC;AAEA,UAAM1B,OAAsB,GAAGF,eAAe,GAC1C,KAAKZ,KAAL,CAAW,CAAC;AAAElB,MAAAA,MAAF;AAAUuB,MAAAA,IAAV;AAAgBE,MAAAA;AAAhB,KAAD,KAAiD;AAC1DI,MAAAA,QAAQ,CAAC,IAAD,EAAO,CACb;AACEI,QAAAA,IAAI,EAAE,SADR;AAEEC,QAAAA,OAAO,EAAElC,MAFX;AAGEmC,QAAAA,SAAS,EAAEV,IAHb;AAIEF,QAAAA;AAJF,OADa,CAAP,CAAR;AAQD,KATD,CAD0C,GAW1C1B,OAAO,CAACC,OAAR,EAXJ;AAaA,UAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAN,CAAgB,MAAOC,MAAP,IAAkC;AACpE,YAAMC,OAAkC,GAAG,EAA3C;;AACA,cAAQD,MAAM,CAACL,IAAf;AACE,aAAK,UAAL;AAAiB;AACf,kBAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAP,CAAYoD,MAAZ,CAAmB5B,UAAU,CAACG,IAA9B,CAAjB;;AACA,gBAAIwB,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,SADK;AAEXjC,gBAAAA,MAAM,EAAE,KAAKS,WAAL,CAAiB+B,QAAQ,CAAC,CAAD,CAAzB;AAFG,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAMA,QAAQ,GAAGF,MAAM,CAACM,IAAP,CAAYH,MAAZ,CAAmB5B,UAAU,CAACG,IAA9B,CAAjB;;AACA,gBAAIwB,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvBH,cAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,gBAAAA,IAAI,EAAE,SADK;AAEXY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAT,CAAcwB,MAAD,IAAYA,MAAM,CAAC,KAAK9D,KAAL,CAAW2C,OAAZ,CAA/B;AAFK,eAAb;AAID;;AACD;AACD;;AACD,aAAK,SAAL;AAAgB;AACd,kBAAMa,QAAQ,GAAGF,MAAM,CAACC,OAAP,CAAeE,MAAf,CAAsB,CAAC,CAACG,IAAD,EAAOvD,IAAP,CAAD,KACrCwB,UAAU,CAACG,IAAX,CAAgB4B,IAAhB,CADe,CAAjB;;AAGA,gBAAIJ,QAAQ,CAACE,MAAT,GAAkB,CAAtB,EAAyB;AACvB,kBAAI,KAAKlC,OAAL,CAAakB,IAAjB,EAAuB;AACrB,sBAAM;AAAE1B,kBAAAA;AAAF,oBAAa,MAAM,KAAKkB,KAAL,CAAY0C,GAAD,IAASA,GAApB,CAAzB;AACArB,gBAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,kBAAAA,IAAI,EAAE,SADK;AAEXjC,kBAAAA;AAFW,iBAAb;AAID,eAND,MAMO,IAAIwC,QAAQ,CAACE,MAAT,KAAoB,CAAxB,EAA2B;AAChC,sBAAM,IAAIzC,KAAJ,CACJ,uEADI,CAAN;AAGD,eAJM,MAIA;AACL,sBAAM,GAAGZ,IAAH,IAAWmD,QAAQ,CAAC,CAAD,CAAzB;AACAD,gBAAAA,OAAO,CAACI,IAAR,CAAa;AACXV,kBAAAA,IAAI,EAAE,SADK;AAEXjC,kBAAAA,MAAM,EAAGa,UAAU,CAACG,IAAX,CAAgB3B,IAAhB,IACL,KAAKoB,WAAL,CAAiBpB,IAAjB,CADK,GAEL;AAJO,iBAAb;AAMD;AACF,aApBD,MAoBO,IAAImD,QAAQ,CAACE,MAAT,KAAoB,CAAxB,EAA2B;;AAElC;AACD;;AACD;AACE,gBAAM,IAAIzC,KAAJ,CAAU,kBAAV,CAAN;AAlDJ;;AAqDA,UAAIsC,OAAO,CAACG,MAAR,KAAmB,CAAvB,EAA0B;AAE1Bb,MAAAA,QAAQ,CAAC,IAAD,EAAOU,OAAP,CAAR;AACD,KA1DmB,CAApB;AA4DA,WAAO;AACLe,MAAAA,IAAI,EAAElB,WADD;AAELmB,MAAAA,MAAM,EAAEnB,WAFH;AAGL9C,MAAAA,IAAI,EAAE,CACJ6B,WADI,EAEJqC,UAFI,KAGexB,OAAO,CAAC1C,IAAR,CAAa6B,WAAb,EAA0BqC,UAA1B;AANhB,KAAP;AAQD;;AAED,QAAcpC,iBAAd,GAEE;AACA,UAAMnC,MAAM,GAAG,MAAM,KAAKD,KAAL,CAAWC,MAAX,CACnB,KAAKuB,OAAL,CAAaI,QADM,EAEnB,KAAKJ,OAAL,CAAakB,IAFM,CAArB;;AAKA,QAAI,KAAKlB,OAAL,CAAab,KAAjB,EAAwB;AACtB,YAAMV,MAAM,CAACU,KAAP,CAAa,KAAKa,OAAL,CAAab,KAA1B,CAAN;AACD;;AAED,WAAOV,MAAP;AACD;;AAxJD;;AC/CF;AAiBA,AAmBe,MAAM4E,UAAN,CAUT;AAOJ9E,EAAAA,WAAW,CAAC+E,UAAD,EAA8BC,cAA9B,EAAsD;AAAA,SANxDpC,OAMwD,GANhC,KAMgC;AAC/D,SAAKmC,UAAL,GAAkBA,UAAlB;;AAEA,QAAI,CAACC,cAAL,EAAqB;AACnB,YAAM,IAAI9D,KAAJ,CAAW,4BAA2B8D,cAAe,GAArD,CAAN;AACD;;AAED,SAAKC,WAAL,GAAmBF,UAAU,CAACG,aAAX,GAA2B3E,IAA3B,CAChB4E,MAAD,IAAyB;AACvB,WAAKF,WAAL,GAAmBE,MAAM,CAACC,EAAP,GAAYC,UAAZ,CAAuBL,cAAvB,CAAnB;AACA,aAAO,KAAKC,WAAZ;AACD,KAJgB,EAKhBK,GAAD,IAAc;AACZ,WAAKL,WAAL,GAAmBnE,OAAO,CAACyE,MAAR,CAAeD,GAAf,CAAnB;AACA,aAAO,KAAKL,WAAZ;AACD,KARgB,CAAnB;AAUD;;AAED,MAAII,UAAJ,GAAsC;AACpC,QAAI,KAAKN,UAAL,CAAgBS,gBAApB,EAAsC;AACpC,aAAO1E,OAAO,CAACyE,MAAR,CAAe,IAAIrE,KAAJ,CAAU,2BAAV,CAAf,CAAP;AACD;;AAED,WAAOJ,OAAO,CAACC,OAAR,CAAgB,KAAKkE,WAArB,CAAP;AACD;;AAEDQ,EAAAA,qBAAqB,CAInBhE,OAJmB,EAKnBC,WALmB,EAMoC;AACvD,WAAO,IAAIgD,oBAAJ,CACL,IADK,EAELjD,OAFK,EAGLC,WAHK,CAAP;AAKD;;AAEDgE,EAAAA,qBAAqB,CAInBjE,OAJmB,EAKnBC,WALmB,EAMsC;AACzD,WAAO,IAAIH,oBAAJ,CACL,IADK,EAELE,OAFK,EAGLC,WAHK,CAAP;AAKD;;AAED,QAAMiE,SAAN,CAAgB5B,MAAhB,EAAgE;AAC9D,QAAI,CAACA,MAAM,CAACpD,GAAZ,EAAiB;AACfoD,MAAAA,MAAM,CAACpD,GAAP,GAAa,IAAIiF,gBAAJ,GAAeC,QAAf,EAAb;AACD;;AAED,QAAI,CAAC9B,MAAM,CAAC+B,OAAZ,EAAqB/B,MAAM,CAAC+B,OAAP,GAAiB,IAAIC,IAAJ,EAAjB;AACrB,QAAI,CAAChC,MAAM,CAACE,OAAZ,EAAqBF,MAAM,CAACE,OAAP,GAAiB,IAAI8B,IAAJ,EAAjB;AAErB,UAAMV,UAAU,GAAG,MAAM,KAAKA,UAA9B;AACA,UAAM;AAAEpE,MAAAA;AAAF,QAAa,MAAMoE,UAAU,CAACM,SAAX,CAAqB5B,MAArB,CAAzB;;AACA,QAAI,CAAC9C,MAAM,CAAC+E,EAAR,IAAc/E,MAAM,CAACgF,CAAP,KAAa,CAA/B,EAAkC;AAChC,YAAM,IAAI/E,KAAJ,CAAU,gBAAV,CAAN;AACD;;AAED,WAAO6C,MAAP;AACD;;AAED,QAAMmC,UAAN,CAAiBnC,MAAjB,EAAgD;AAC9C,QAAI,CAACA,MAAM,CAACE,OAAZ,EAAqBF,MAAM,CAACE,OAAP,GAAiB,IAAI8B,IAAJ,EAAjB;AAErB,UAAMV,UAAU,GAAG,MAAM,KAAKA,UAA9B;AACA,UAAMA,UAAU,CAACa,UAAX,CAAsB;AAAEvF,MAAAA,GAAG,EAAEoD,MAAM,CAACpD;AAAd,KAAtB,EAA2CoD,MAA3C,CAAN;AACA,WAAOA,MAAP;AACD;;AAED,QAAMoC,SAAN,CAMEpC,MANF,EAOEqC,wBAPF,EAQkB;AAChB,UAAMnF,MAAM,GAAG,MAAM,KAAKoF,iBAAL,CACnBtC,MADmB,EAEnBqC,wBAFmB,CAArB;AAIA,WAAOnF,MAAM,CAAC8C,MAAd;AACD;;AAED,QAAMsC,iBAAN,CAMEtC,MANF,EAOEqC,wBAPF,EAQ+C;AAC7C,UAAME,YAAY,GAAG;AACnBR,MAAAA,OAAO,EAAE/B,MAAM,CAAC+B,OAAP,IAAkB,IAAIC,IAAJ,EADR;AAEnB,SAAGK;AAFgB,KAArB;;AAKA,QAAI,CAACrC,MAAM,CAACE,OAAZ,EAAqB;AAClBF,MAAAA,MAAD,CAA2BE,OAA3B,GAAqC,IAAI8B,IAAJ,EAArC;AACD;;AAED,UAAMQ,IAA4B,GAAG,EAAE,GAAGxC;AAAL,KAArC;AACA,WAAOwC,IAAI,CAACT,OAAZ;AAEA,UAAMT,UAAU,GAAG,MAAM,KAAKA,UAA9B;AAEA,UAAM;AAAEmB,MAAAA;AAAF,QAAoB,MAAMnB,UAAU,CAACoB,SAAX,CAC9B;AAAE9F,MAAAA,GAAG,EAAEoD,MAAM,CAACpD;AAAd,KAD8B,EAE9B;AAAE4F,MAAAA,IAAF;AAAQD,MAAAA;AAAR,KAF8B,EAG9B;AAAEI,MAAAA,MAAM,EAAE;AAAV,KAH8B,CAAhC;;AAMA,QAAIF,aAAJ,EAAmB;AACjBG,MAAAA,MAAM,CAACC,MAAP,CAAc7C,MAAd,EAAsBuC,YAAtB;AACD;;AAED,WAAO;AAAEvC,MAAAA,MAAM,EAAGA,MAAX;AAAwCG,MAAAA,QAAQ,EAAE,CAAC,CAACsC;AAApD,KAAP;AACD;;AAEDK,EAAAA,cAAc,CAACC,OAAD,EAAqC;AACjD,WAAOhG,OAAO,CAACwB,GAAR,CAAYwE,OAAO,CAACvE,GAAR,CAAawB,MAAD,IAAmB,KAAKmC,UAAL,CAAgBnC,MAAhB,CAA/B,CAAZ,CAAP;AACD;;AAED,QAAMgD,kBAAN,CACErG,GADF,EAEEsG,aAFF,EAGEnF,QAHF,EAIkB;AAChB,UAAMwD,UAAU,GAAG,MAAM,KAAKA,UAA9B;AACA,UAAM4B,aAAa,GAAG,MAAM5B,UAAU,CAACoB,SAAX,CAC1B;AAAE9F,MAAAA,GAAG,EAAED,GAAP;AAAY,SAAGmB;AAAf,KAD0B,EAE1BmF,aAF0B,CAA5B;;AAIA,QAAI,CAACC,aAAa,CAAChG,MAAd,CAAqB+E,EAA1B,EAA8B;AAC5BkB,MAAAA,OAAO,CAACC,KAAR,CAAcF,aAAd;AACA,YAAM,IAAI/F,KAAJ,CAAU,eAAV,CAAN;AACD;;AACD,UAAM6C,MAAM,GAAG,MAAM,KAAKqD,SAAL,CAAe1G,GAAf,CAArB;AACA,WAAOqD,MAAP;AACD;;AAEDsD,EAAAA,gBAAgB,CACdtD,MADc,EAEdiD,aAFc,EAGE;AAChB,WAAO,KAAKD,kBAAL,CAAwBhD,MAAM,CAACpD,GAA/B,EAAoCqG,aAApC,CAAP;AACD;;AAEDM,EAAAA,iBAAiB,CACfzF,QADe,EAEfmF,aAFe,EAGA;AACf,WAAO,KAAK3B,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACkC,UAAX,CAAsB1F,QAAtB,EAAgCmF,aAAhC,CADjB,EAEJzG,IAFI,CAEC,MAASiH,SAFV,CAAP,CADe;AAIhB;;AAEDC,EAAAA,WAAW,CAAC/G,GAAD,EAAWmB,QAAX,EAAsD;AAC/D,WAAO,KAAKwD,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACqC,SAAX,CAAqB;AAAE/G,MAAAA,GAAG,EAAED,GAAP;AAAY,SAAGmB;AAAf,KAArB,CADjB,EAEJtB,IAFI,CAEC,MAAMiH,SAFP,CAAP;AAGD;;AAEDE,EAAAA,SAAS,CAAC3D,MAAD,EAA+B;AACtC,WAAO,KAAK0D,WAAL,CAAiB1D,MAAM,CAACpD,GAAxB,CAAP;AACD;;AAEDgH,EAAAA,UAAU,CAACC,QAAD,EAA2C;AACnD,WAAO,KAAKvC,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACsC,UAAX,CAAsBC,QAAtB,CADjB,EAEJrH,IAFI,CAEC,MAAMiH,SAFP,CAAP;AAGD;;AAEDtH,EAAAA,MAAM,CACJ2B,QADI,EAEJc,IAFI,EAG2C;AAC/C,WAAO,KAAK0C,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACwC,IAAX,CAAgBhG,QAAhB,CADjB,EAEJtB,IAFI,CAECoC,IAAI,KAAMzC,MAAD,IAAYA,MAAM,CAACyC,IAAP,CAAYA,IAAZ,CAAjB,CAFL,EAGJpC,IAHI,CAGEL,MAAD,IAAY,IAAIJ,WAAJ,CAAgB,IAAhB,EAAsBI,MAAtB,CAHb,CAAP;AAID;;AAEDkH,EAAAA,SAAS,CAAC1G,GAAD,EAAWmB,QAAX,EAAmE;AAC1E,WAAO,KAAKwD,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACyC,OAAX,CAAmB;AAAEnH,MAAAA,GAAG,EAAED,GAAP;AAAY,SAAGmB;AAAf,KAAnB,CADjB,EAEJtB,IAFI,CAEEU,MAAD,IAAYA,MAAM,IAAIuG,SAFvB,CAAP;AAGD;;AAEDO,EAAAA,OAAO,CAAClG,QAAD,EAA6Bc,IAA7B,EAAmE;AACxE,WAAO,KAAKzC,MAAL,CAAmB2B,QAAnB,EAA6Bc,IAA7B,EAAmCpC,IAAnC,CAAyCL,MAAD,IAC7CA,MAAM,CAACkB,OAAP,EADK,CAAP;AAGD;;AAED0G,EAAAA,OAAO,CACLjG,QADK,EAELc,IAFK,EAGuB;AAC5B,WAAO,KAAK0C,UAAL,CACJ9E,IADI,CACE8E,UAAD,IAAgBA,UAAU,CAACwC,IAAX,CAAgBhG,QAAhB,CADjB,EAEJtB,IAFI,CAECoC,IAAI,KAAMzC,MAAD,IAAYA,MAAM,CAACyC,IAAP,CAAYA,IAAZ,CAAjB,CAFL,EAGJpC,IAHI,CAGEL,MAAD,IAAYA,MAAM,CAACU,KAAP,CAAa,CAAb,EAAgBN,IAAhB,EAHb,CAAP;AAID;;AA/NG;;AC1CN,MAAM0H,MAAM,GAAG,IAAIC,MAAJ,CAAW,4BAAX,CAAf;AAEA,AAAe,MAAMC,eAAN,SAA8BC,4BAA9B,CAAiD;AAO9D;AACAnI,EAAAA,WAAW,CAACoI,MAAD,EAAuC;AAChD;;AAEA,QAAI,CAACA,MAAM,CAACC,GAAP,CAAW,MAAX,CAAL,EAAyB;AACvBD,MAAAA,MAAM,CAACE,GAAP,CAAW,MAAX,EAAmB,WAAnB;AACD;;AACD,QAAI,CAACF,MAAM,CAACC,GAAP,CAAW,MAAX,CAAL,EAAyB;AACvBD,MAAAA,MAAM,CAACE,GAAP,CAAW,MAAX,EAAmB,OAAnB;AACD;;AACD,QAAI,CAACF,MAAM,CAACC,GAAP,CAAW,UAAX,CAAL,EAA6B;AAC3B,YAAM,IAAInH,KAAJ,CAAU,yBAAV,CAAN;AACD;;AAED,UAAMqH,gBAAgB,GACnB,aACCH,MAAM,CAACC,GAAP,CAAW,MAAX,IACK,GAAED,MAAM,CAACI,GAAP,CAAW,MAAX,CAA6B,IAC9BJ,MAAM,CAACI,GAAP,CAAW,UAAX,CACD,GAHL,GAII,EACL,EAND,GAOC,GAAEJ,MAAM,CAACI,GAAP,CAAW,MAAX,CAA6B,IAAGJ,MAAM,CAACI,GAAP,CAAW,MAAX,CAA6B,IAC9DJ,MAAM,CAACI,GAAP,CAAW,UAAX,CACD,EAVH;AAYA,SAAKC,OAAL,CAAaF,gBAAb;AACD;;AAEDE,EAAAA,OAAO,CAACF,gBAAD,EAAiC;AACtCP,IAAAA,MAAM,CAACtF,IAAP,CAAY,YAAZ,EAA0B;AAAE6F,MAAAA;AAAF,KAA1B;AAEA,UAAMG,cAAc,GAAGC,mBAAW,CAACF,OAAZ,CAAoBF,gBAApB,EAAsC;AAC3DK,MAAAA,eAAe,EAAE;AAD0C,KAAtC,EAGpBrI,IAHoB,CAGdwE,UAAD,IAAgB;AACpBiD,MAAAA,MAAM,CAACtF,IAAP,CAAY,WAAZ,EAAyB;AAAE6F,QAAAA;AAAF,OAAzB;AACAxD,MAAAA,UAAU,CAAC8D,EAAX,CAAc,OAAd,EAAuB,MAAM;AAC3Bb,QAAAA,MAAM,CAACc,IAAP,CAAY,OAAZ,EAAqB;AAAEP,UAAAA;AAAF,SAArB;AACA,aAAK/C,gBAAL,GAAwB,IAAxB;;AACA,aAAKN,aAAL,GAAqB,MAAM;AACzB,gBAAM,IAAIhE,KAAJ,CAAU,2BAAV,CAAN;AACD,SAFD;AAGD,OAND;AAOA6D,MAAAA,UAAU,CAAC8D,EAAX,CAAc,SAAd,EAAyB,MAAM;AAC7Bb,QAAAA,MAAM,CAACc,IAAP,CAAY,SAAZ,EAAuB;AAAEP,UAAAA;AAAF,SAAvB;AACA,aAAK/C,gBAAL,GAAwB,IAAxB;;AACA,aAAKN,aAAL,GAAqB,MAAM;AACzB,gBAAM,IAAIhE,KAAJ,CAAU,4BAAV,CAAN;AACD,SAFD;AAGD,OAND;AAOA6D,MAAAA,UAAU,CAAC8D,EAAX,CAAc,WAAd,EAA2B,MAAM;AAC/Bb,QAAAA,MAAM,CAACc,IAAP,CAAY,WAAZ,EAAyB;AAAEP,UAAAA;AAAF,SAAzB;AACA,aAAK/C,gBAAL,GAAwB,KAAxB;;AACA,aAAKN,aAAL,GAAqB,MACnBpE,OAAO,CAACC,OAAR,CAAgB,KAAKgI,WAArB,CADF;AAED,OALD;AAMAhE,MAAAA,UAAU,CAAC8D,EAAX,CAAc,OAAd,EAAwBvD,GAAD,IAAS;AAC9B0C,QAAAA,MAAM,CAACc,IAAP,CAAY,OAAZ,EAAqB;AAAEP,UAAAA,gBAAF;AAAoBjD,UAAAA;AAApB,SAArB;AACD,OAFD;AAIA,WAAKyD,WAAL,GAAmBhE,UAAnB;AACA,WAAKiE,WAAL,GAAmBxB,SAAnB;;AACA,WAAKtC,aAAL,GAAqB,MACnBpE,OAAO,CAACC,OAAR,CAAgB,KAAKgI,WAArB,CADF;;AAEA,aAAOhE,UAAP;AACD,KAlCoB,EAmCpBkE,KAnCoB,CAmCb3D,GAAD,IAAS;AACd0C,MAAAA,MAAM,CAACtF,IAAP,CAAY,eAAZ,EAA6B;AAAE6F,QAAAA;AAAF,OAA7B;AACArB,MAAAA,OAAO,CAACC,KAAR,CAAc7B,GAAG,CAAC4D,OAAJ,IAAe5D,GAA7B,EAFc;;AAId6D,MAAAA,OAAO,CAACC,QAAR,CAAiB,MAAM;AACrB;AACAD,QAAAA,OAAO,CAACE,IAAR,CAAa,CAAb;AACD,OAHD;AAKA,YAAM/D,GAAN;AACD,KA7CoB,CAAvB;;AA+CA,SAAKJ,aAAL,GAAqB,MAAMpE,OAAO,CAACC,OAAR,CAAgB2H,cAAhB,CAA3B;;AACA,SAAKM,WAAL,GAAmB,KAAK9D,aAAL,EAAnB;AACD;;AAEDA,EAAAA,aAAa,GAAyB;AACpC,UAAM,IAAIhE,KAAJ,CAAU,gBAAV,CAAN;AACD;;AAED,QAAMC,KAAN,GAA6B;AAC3B,SAAK+D,aAAL,GAAqB,MAAMpE,OAAO,CAACyE,MAAR,CAAe,IAAIrE,KAAJ,CAAU,mBAAV,CAAf,CAA3B;;AACA,QAAI,KAAK6H,WAAT,EAAsB;AACpB,YAAM,KAAKA,WAAL,CAAiB5H,KAAjB,EAAN;AACA,WAAK4H,WAAL,GAAmBvB,SAAnB;AACD,KAHD,MAGO,IAAI,KAAKwB,WAAT,EAAsB;AAC3B,YAAM,KAAKA,WAAX;AACA,YAAM,KAAK7H,KAAL,EAAN;AACD;AACF;;AAvG6D;;ACIjD,SAASmI,yBAAT,CAIbC,UAJa,EAYb;AACA,SAAO,IAAIC,iCAAJ,CAAmBD,UAAnB,CAAP;AACD;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index-node12.cjs.js","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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"}
|