liwi-mongo 10.1.3 → 10.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/definitions/MongoStore.d.ts.map +1 -1
- package/dist/index-node16.mjs +1 -0
- package/dist/index-node16.mjs.map +1 -1
- package/package.json +7 -7
- package/src/MongoStore.ts +13 -11
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [10.3.0](https://github.com/liwijs/liwi/compare/v10.2.0...v10.3.0) (2023-01-31)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package liwi-mongo
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# [10.2.0](https://github.com/liwijs/liwi/compare/v10.1.3...v10.2.0) (2023-01-31)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
* update mongo ([96f189d](https://github.com/liwijs/liwi/commit/96f189da0f43582f8703998596208b2a5c2ed528))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
## [10.1.3](https://github.com/liwijs/liwi/compare/v10.1.2...v10.1.3) (2023-01-29)
|
|
7
26
|
|
|
8
27
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoStore.d.ts","sourceRoot":"","sources":["../../src/MongoStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,WAAW,EACX,eAAe,EACf,8BAA8B,EAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,UAAU,
|
|
1
|
+
{"version":3,"file":"MongoStore.d.ts","sourceRoot":"","sources":["../../src/MongoStore.ts"],"names":[],"mappings":"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"}
|
package/dist/index-node16.mjs
CHANGED
|
@@ -383,6 +383,7 @@ class MongoStore {
|
|
|
383
383
|
}
|
|
384
384
|
async upsertOneWithInfo(object, setOnInsertPartialObject) {
|
|
385
385
|
const $setOnInsert = {
|
|
386
|
+
// @ts-expect-error -- created is Date as set in BaseModel
|
|
386
387
|
created: object.created || new Date(),
|
|
387
388
|
...setOnInsertPartialObject
|
|
388
389
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-node16.mjs","sources":["../src/MongoCursor.ts","../src/MongoQueryCollection.ts","../src/MongoQuerySingleItem.ts","../src/MongoStore.ts","../src/MongoConnection.ts","../src/createMongoSubscribeStore.ts"],"sourcesContent":["import { AbstractStoreCursor } from 'liwi-store';\nimport type { AllowedKeyValue } from 'liwi-store';\nimport type { FindCursor } from 'mongodb';\nimport type { MongoBaseModel } from './MongoBaseModel';\nimport type MongoStore from './MongoStore';\n\nexport default class MongoCursor<\n Model extends MongoBaseModel<KeyValue>,\n Result extends Partial<Model> = Model,\n KeyValue extends AllowedKeyValue = Model['_id'],\n> extends AbstractStoreCursor<\n MongoStore<Model, KeyValue>,\n KeyValue,\n Model,\n Result\n> {\n // key in AbstractCursor\n\n private readonly cursor: FindCursor<Result>;\n\n private _result?: Result | null;\n\n constructor(store: MongoStore<Model, KeyValue>, cursor: FindCursor<Result>) {\n super(store);\n this.cursor = cursor;\n }\n\n advance(count: number): void {\n this.cursor.skip(count);\n }\n\n next(): Promise<KeyValue | undefined> {\n return this.cursor.next().then((value) => {\n this._result = value;\n this.key = value?._id;\n return this.key;\n });\n }\n\n limit(newLimit: number): Promise<this> {\n this.cursor.limit(newLimit);\n return Promise.resolve(this);\n }\n\n result(): Promise<Result> {\n if (!this._result) throw new Error('Cannot call result() before next()');\n return Promise.resolve(this._result);\n }\n\n close(): Promise<void> {\n if (this.cursor) {\n this.cursor.close();\n }\n\n return Promise.resolve();\n }\n\n toArray(): Promise<Result[]> {\n return this.cursor.toArray();\n }\n}\n","/* eslint-disable complexity, max-lines */\nimport type {\n QuerySubscription,\n SubscribeCallback,\n QueryResult,\n QueryParams,\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport mingo from 'mingo';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoCursor from './MongoCursor';\nimport type MongoStore from './MongoStore';\n\nconst identityTransformer = <\n Model extends MongoBaseModel<any>,\n Transformed = Model,\n>(\n model: Model,\n): Transformed => model as unknown as Transformed;\n\ntype TestCriteria = (obj: any) => boolean;\n\nexport default class MongoQueryCollection<\n Model extends MongoBaseModel<KeyValue>,\n Params extends QueryParams<Params> = never,\n KeyValue extends AllowedKeyValue = Model['_id'],\n Item extends Record<MongoKeyPath, KeyValue> = Model,\n> extends AbstractSubscribableStoreQuery<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n Params,\n Item[]\n> {\n private readonly store: MongoStore<Model, KeyValue>;\n\n private readonly options: QueryOptions<Model>;\n\n private testCriteria?: TestCriteria;\n\n private readonly transformer: Transformer<Model, Item>;\n\n constructor(\n store: MongoStore<Model, KeyValue>,\n options: QueryOptions<Model>,\n transformer: Transformer<Model, Item> = identityTransformer,\n ) {\n super();\n this.store = store;\n this.options = options;\n this.transformer = transformer;\n }\n\n createTestCriteria(): TestCriteria {\n if (!this.testCriteria) {\n if (!this.options.criteria) {\n return () => true;\n }\n\n // criteria not supported by mingo: updates will not work\n if (this.options.criteria.$text) {\n return () => false;\n }\n\n const mingoQuery = new mingo.Query(this.options.criteria);\n this.testCriteria = mingoQuery.test.bind(mingoQuery);\n }\n return this.testCriteria;\n }\n\n async fetch<T>(onFulfilled: (result: QueryResult<Item[]>) => T): Promise<T> {\n const [result, count] = await Promise.all([\n this.createMongoCursor().then((cursor) => cursor.toArray()),\n this.store.count(this.options.criteria),\n ]);\n\n return onFulfilled({\n result: result.map(this.transformer),\n meta: { total: count },\n info: {\n sort: this.options.sort,\n limit: this.options.limit,\n keyPath: this.store.keyPath,\n },\n });\n }\n\n _subscribe(\n callback: SubscribeCallback<KeyValue, Item[]>,\n _includeInitial: boolean,\n ): QuerySubscription {\n const store = super.getSubscribeStore();\n const testCriteria: TestCriteria = this.createTestCriteria();\n\n const promise: Promise<void> = _includeInitial\n ? this.fetch(({ result, meta, info }: QueryResult<Item[]>) => {\n callback(null, [\n {\n type: 'initial',\n initial: result,\n queryInfo: info,\n meta,\n },\n ]);\n })\n : Promise.resolve();\n\n const unsubscribe = store.subscribe((action: Actions<Model>) => {\n const changes: Changes<KeyValue, Item[]> = [];\n switch (action.type) {\n case 'inserted': {\n const filtered = action.next.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'inserted',\n result: filtered.map(this.transformer),\n });\n }\n break;\n }\n case 'deleted': {\n const filtered = action.prev.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'deleted',\n keys: filtered.map((object) => object[this.store.keyPath]),\n });\n }\n break;\n }\n case 'updated': {\n const {\n deleted,\n updated,\n inserted,\n }: {\n deleted: KeyValue[];\n updated: Item[];\n inserted: Item[];\n } = { deleted: [], updated: [], inserted: [] };\n\n action.changes.forEach(([prevObject, nextObject]: [Model, Model]) => {\n if (testCriteria(prevObject)) {\n if (!testCriteria(nextObject)) {\n deleted.push(prevObject[this.store.keyPath]);\n } else {\n updated.push(this.transformer(nextObject));\n }\n } else if (testCriteria(nextObject)) {\n inserted.push(this.transformer(nextObject));\n }\n });\n\n if (deleted.length > 0) {\n changes.push({ type: 'deleted', keys: deleted });\n }\n if (updated.length > 0) {\n changes.push({ type: 'updated', result: updated });\n }\n if (inserted.length > 0) {\n changes.push({ type: 'inserted', result: inserted });\n }\n\n break;\n }\n default:\n throw new Error('Unsupported type');\n }\n\n if (changes.length === 0) return;\n\n callback(null, changes);\n });\n // let _feed;\n // const promise = this.queryCallback(this.store.query(), this.store.r)\n // .changes({\n // includeInitial: _includeInitial,\n // includeStates: true,\n // includeTypes: true,\n // includeOffsets: true,\n // })\n // .then((feed) => {\n // if (args.length === 0) {\n // _feed = feed;\n // delete this._promise;\n // }\n //\n // feed.each(callback);\n // return feed;\n // });\n //\n // if (args.length === 0) this._promise = promise;\n\n return {\n stop: unsubscribe,\n cancel: unsubscribe,\n then: <T, U>(\n onFulfilled: () => 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 Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport mingo from 'mingo';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoCursor from './MongoCursor';\nimport type MongoStore from './MongoStore';\n\nconst identityTransformer = <\n Model extends MongoBaseModel<any>,\n Transformed = Model,\n>(\n model: Model,\n): Transformed => model as unknown as Transformed;\n\ntype TestCriteria = (obj: any) => boolean;\n\nexport default class MongoQuerySingleItem<\n Model extends MongoBaseModel<KeyValue>,\n Params extends QueryParams<Params> = never,\n Result extends Record<MongoKeyPath, KeyValue> | null = Model | null,\n KeyValue extends AllowedKeyValue = Model['_id'],\n> extends AbstractSubscribableStoreQuery<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n Params,\n Result\n> {\n private readonly store: MongoStore<Model, KeyValue>;\n\n private readonly options: QueryOptions<Model>;\n\n private testCriteria?: TestCriteria;\n\n private readonly transformer: Transformer<Model, Result>;\n\n constructor(\n store: MongoStore<Model, KeyValue>,\n options: QueryOptions<Model>,\n transformer: Transformer<Model, Result> = identityTransformer,\n ) {\n super();\n this.store = store;\n this.options = options;\n this.transformer = transformer;\n }\n\n createMingoTestCriteria(): TestCriteria {\n if (!this.testCriteria) {\n if (!this.options.criteria) {\n return () => true;\n }\n\n const mingoQuery = new mingo.Query(this.options.criteria);\n this.testCriteria = mingoQuery.test.bind(mingoQuery);\n }\n\n return this.testCriteria;\n }\n\n async fetch<T>(onFulfilled: (result: QueryResult<Result>) => T): Promise<T> {\n const cursor = await this.createMongoCursor();\n await cursor.limit(1);\n return cursor.toArray().then((result: Model[]) => {\n const item: Result =\n result.length === 0 ? (null as Result) : this.transformer(result[0]);\n return onFulfilled({\n result: item,\n meta: { total: result === null ? 0 : 1 },\n info: {\n limit: 1,\n keyPath: this.store.keyPath,\n },\n });\n });\n }\n\n _subscribe(\n callback: SubscribeCallback<KeyValue, Result>,\n _includeInitial: boolean,\n ): QuerySubscription {\n const store = super.getSubscribeStore();\n const testCriteria: TestCriteria = this.createMingoTestCriteria();\n\n const promise: Promise<void> = _includeInitial\n ? this.fetch(({ result, meta, info }: QueryResult<Result>) => {\n callback(null, [\n {\n type: 'initial',\n initial: result,\n queryInfo: info,\n meta,\n },\n ]);\n })\n : Promise.resolve();\n\n const unsubscribe = store.subscribe(async (action: Actions<Model>) => {\n const changes: Changes<KeyValue, Result> = [];\n switch (action.type) {\n case 'inserted': {\n const filtered = action.next.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'updated',\n result: this.transformer(filtered[0]),\n });\n }\n break;\n }\n case 'deleted': {\n const filtered = action.prev.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'deleted',\n keys: filtered.map((object) => object[this.store.keyPath]),\n });\n }\n break;\n }\n case 'updated': {\n const filtered = action.changes.filter(([prev, next]) =>\n testCriteria(prev),\n );\n if (filtered.length > 0) {\n if (this.options.sort) {\n const { result } = await this.fetch((res) => res);\n changes.push({\n type: 'updated',\n result,\n });\n } else if (filtered.length !== 1) {\n throw new Error(\n 'should not match more than 1, use sort if you can have multiple match',\n );\n } else {\n const [, next] = filtered[0];\n changes.push({\n type: 'updated',\n result: testCriteria(next) ? this.transformer(next) : null!,\n });\n }\n } else if (filtered.length === 0) {\n }\n break;\n }\n default:\n throw new Error('Unsupported type');\n }\n\n if (changes.length === 0) return;\n\n callback(null, changes);\n });\n\n return {\n stop: unsubscribe,\n cancel: unsubscribe,\n then: <T, U>(\n onFulfilled: () => 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 Criteria,\n Sort,\n Update,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n OptionalBaseModelKeysForInsert,\n} from 'liwi-store';\nimport type {\n Collection,\n FindCursor,\n MongoClient,\n UpdateFilter,\n} from 'mongodb';\nimport mongodb from 'mongodb';\nimport type {\n MongoBaseModel,\n MongoKeyPath,\n MongoInsertType,\n} from './MongoBaseModel';\nimport type MongoConnection from './MongoConnection';\nimport MongoCursor from './MongoCursor';\nimport MongoQueryCollection from './MongoQueryCollection';\nimport MongoQuerySingleItem from './MongoQuerySingleItem';\n\nexport interface MongoUpsertResult<\n KeyValue extends AllowedKeyValue,\n Model extends MongoBaseModel<KeyValue>,\n> extends UpsertResult<Model> {\n object: Model;\n inserted: boolean;\n}\n\nexport default class MongoStore<\n Model extends MongoBaseModel<KeyValue>,\n KeyValue extends AllowedKeyValue = Model[MongoKeyPath],\n> implements\n SubscribableStore<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model>,\n MongoConnection\n >\n{\n readonly keyPath: MongoKeyPath = '_id';\n\n readonly connection: MongoConnection;\n\n private _collection: Collection<Model> | Promise<Collection<Model>>;\n\n constructor(connection: MongoConnection, collectionName: string) {\n this.connection = connection;\n\n if (!collectionName) {\n throw new Error(`Invalid collectionName: \"${collectionName}\"`);\n }\n\n this._collection = connection.getConnection().then(\n (client: MongoClient) => {\n this._collection = client.db().collection(collectionName);\n return this._collection;\n },\n (err: any) => {\n this._collection = Promise.reject(err);\n return this._collection;\n },\n );\n }\n\n get collection(): Promise<Collection<Model>> {\n if (this.connection.connectionFailed) {\n return Promise.reject(new Error('MongoDB connection failed'));\n }\n\n return Promise.resolve(this._collection);\n }\n\n createQuerySingleItem<\n Result extends Record<MongoKeyPath, KeyValue> = Model,\n Params extends QueryParams<Params> = never,\n >(\n options: QueryOptions<Model>,\n transformer?: Transformer<Model, Result>,\n ): MongoQuerySingleItem<Model, Params, Result, KeyValue> {\n return new MongoQuerySingleItem<Model, Params, Result, KeyValue>(\n this,\n options,\n transformer,\n );\n }\n\n createQueryCollection<\n Item extends Record<MongoKeyPath, KeyValue> = Model,\n Params extends QueryParams<Params> = never,\n >(\n options: QueryOptions<Model>,\n transformer?: Transformer<Model, Item>,\n ): MongoQueryCollection<Model, Params, Model['_id'], Item> {\n return new MongoQueryCollection<Model, Params, KeyValue, Item>(\n this,\n options,\n transformer,\n );\n }\n\n async insertOne(object: MongoInsertType<Model>): Promise<Model> {\n if (!object._id) {\n object._id = new mongodb.ObjectId().toString() as Model['_id'];\n }\n\n if (!object.created) object.created = new Date();\n if (!object.updated) object.updated = new Date();\n\n const collection = await this.collection;\n const { acknowledged: isAcknowledged } = await collection.insertOne(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n object as any,\n );\n if (!isAcknowledged) {\n throw new Error('Fail to insert');\n }\n\n return object as Model;\n }\n\n async replaceOne(object: Model): Promise<Model> {\n if (!object.updated) object.updated = new Date();\n\n const collection = await this.collection;\n await collection.replaceOne({ _id: object._id } as Criteria<Model>, object);\n return object;\n }\n\n async upsertOne<\n K extends Exclude<\n keyof Model,\n MongoKeyPath | OptionalBaseModelKeysForInsert\n >,\n >(\n object: UpsertPartialObject<MongoKeyPath, KeyValue, Model, K>,\n setOnInsertPartialObject?: Update<Model>['$setOnInsert'],\n ): Promise<Model> {\n const result = await this.upsertOneWithInfo(\n object,\n setOnInsertPartialObject,\n );\n return result.object;\n }\n\n async upsertOneWithInfo<\n K extends Exclude<\n keyof Model,\n MongoKeyPath | OptionalBaseModelKeysForInsert\n >,\n >(\n object: UpsertPartialObject<MongoKeyPath, KeyValue, Model, K>,\n setOnInsertPartialObject?: Update<Model>['$setOnInsert'],\n ): Promise<MongoUpsertResult<KeyValue, Model>> {\n const $setOnInsert = {\n created: object.created || new Date(),\n ...setOnInsertPartialObject,\n };\n\n if (!object.updated) {\n (object as MongoBaseModel).updated = new Date();\n }\n\n const $set: Partial<typeof object> = { ...object };\n delete $set.created;\n\n const collection = await this.collection;\n\n const { upsertedCount } = await collection.updateOne(\n { _id: object._id } as Criteria<Model>,\n { $set, $setOnInsert } as UpdateFilter<Model>,\n { upsert: true },\n );\n\n if (upsertedCount) {\n Object.assign(object, $setOnInsert);\n }\n\n return { object: object as unknown as Model, inserted: !!upsertedCount };\n }\n\n replaceSeveral(objects: Model[]): Promise<Model[]> {\n return Promise.all(objects.map((object: Model) => this.replaceOne(object)));\n }\n\n async partialUpdateByKey(\n key: KeyValue,\n partialUpdate: Update<Model>,\n criteria?: Criteria<Model>,\n ): Promise<Model> {\n const collection = await this.collection;\n const commandResult = await collection.updateOne(\n { _id: key, ...criteria } as Criteria<Model>,\n partialUpdate as UpdateFilter<Model>,\n );\n if (!commandResult.acknowledged) {\n console.error(commandResult);\n throw new Error('Update failed');\n }\n const object = await this.findByKey(key);\n return object!;\n }\n\n partialUpdateOne(\n object: Model,\n partialUpdate: Update<Model>,\n ): Promise<Model> {\n return this.partialUpdateByKey(object._id, partialUpdate);\n }\n\n partialUpdateMany(\n criteria: Criteria<Model>,\n partialUpdate: Update<Model>,\n ): Promise<void> {\n return this.collection\n .then((collection) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n collection.updateMany(criteria, partialUpdate as any),\n )\n .then((res) => undefined); // TODO return updated object\n }\n\n deleteByKey(key: KeyValue, criteria?: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) =>\n collection.deleteOne({ _id: key, ...criteria } as Criteria<Model>),\n )\n .then(() => undefined);\n }\n\n deleteOne(object: Model): Promise<void> {\n return this.deleteByKey(object._id);\n }\n\n deleteMany(selector: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) => collection.deleteMany(selector))\n .then(() => undefined);\n }\n\n async count(filter?: Criteria<Model>): Promise<number> {\n const collection = await this.collection;\n return filter\n ? collection.countDocuments(filter)\n : collection.countDocuments();\n }\n\n async cursor<Result extends Partial<Model> = Model>(\n filter?: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<MongoCursor<Model, Result, KeyValue>> {\n const collection = await this.collection;\n const findCursor = filter\n ? collection.find<Result>(filter)\n : (collection.find() as unknown as FindCursor<Result>);\n if (sort) findCursor.sort(sort);\n return new MongoCursor<Model, Result, KeyValue>(this, findCursor);\n }\n\n async findByKey(\n key: KeyValue,\n criteria?: Criteria<Model>,\n ): Promise<Model | undefined> {\n const collection = await this.collection;\n const result = await collection.findOne<Model>({\n _id: key,\n ...criteria,\n } as Criteria<Model>);\n return result || undefined;\n }\n\n findAll(criteria?: Criteria<Model>, sort?: Sort<Model>): Promise<Model[]> {\n return this.cursor<Model>(criteria, sort).then((cursor) =>\n cursor.toArray(),\n );\n }\n\n async findOne(\n filter: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<Model | undefined> {\n const collection = await this.collection;\n const result = await collection.findOne<Model>(filter, {\n sort,\n });\n return result || undefined;\n }\n}\n","import { AbstractConnection } from 'liwi-store';\nimport mongodb from 'mongodb';\nimport { Logger } from 'nightingale-logger';\n\nconst logger = new Logger('liwi:mongo:MongoConnection');\n\nexport default class MongoConnection extends AbstractConnection {\n _connection?: mongodb.MongoClient;\n\n _connecting?: Promise<mongodb.MongoClient>;\n\n connectionFailed?: boolean;\n\n // TODO interface\n constructor(config: Map<string, 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 buildConnectionString = (redactCredentials: boolean): string =>\n `mongodb://${\n config.has('user')\n ? `${\n redactCredentials\n ? `${(config.get('user') as string).slice(0, 2)}[redacted]`\n : (config.get('user') as string)\n }:${\n redactCredentials\n ? '[redacted]'\n : (config.get('password') as string)\n }@`\n : ''\n }` +\n `${config.get('host') as string}:${config.get('port') as string}/${\n config.get('database') as string\n }`;\n\n const connectionString = buildConnectionString(false);\n const connectionStringRedacted = buildConnectionString(true);\n\n this.connect(connectionString, connectionStringRedacted);\n }\n\n connect(connectionString: string, connectionStringRedacted: string): void {\n logger.info('connecting', { connectionStringRedacted });\n\n const connectPromise = mongodb.MongoClient.connect(connectionString)\n .then((connection) => {\n logger.info('connected', { connectionStringRedacted });\n connection.on('close', () => {\n logger.warn('close', { connectionStringRedacted });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection closed');\n };\n });\n connection.on('timeout', () => {\n logger.warn('timeout', { connectionStringRedacted });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection timeout');\n };\n });\n connection.on('reconnect', () => {\n logger.warn('reconnect', { connectionStringRedacted });\n this.connectionFailed = false;\n this.getConnection = () => Promise.resolve(this._connection!);\n });\n connection.on('error', (err) => {\n logger.warn('error', { connectionStringRedacted, err });\n });\n\n this._connection = connection;\n this._connecting = undefined;\n this.getConnection = () => Promise.resolve(this._connection!);\n return connection;\n })\n .catch((err) => {\n logger.info('not connected', { connectionStringRedacted });\n console.error(err.message || err);\n // throw err;\n process.nextTick(() => {\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1);\n });\n\n throw err;\n });\n\n this.getConnection = () => Promise.resolve(connectPromise);\n this._connecting = this.getConnection();\n }\n\n getConnection(): Promise<mongodb.MongoClient> {\n throw new Error('call connect()');\n }\n\n async close(): Promise<void> {\n this.getConnection = () => Promise.reject(new Error('Connection closed'));\n if (this._connection) {\n await this._connection.close();\n this._connection = undefined;\n } else if (this._connecting) {\n await this._connecting;\n await this.close();\n }\n }\n}\n","import type { AllowedKeyValue } from 'liwi-store';\nimport { SubscribeStore } from 'liwi-subscribe-store';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoConnection from './MongoConnection';\nimport type MongoStore from './MongoStore';\n\nexport default function createMongoSubscribeStore<\n Model extends MongoBaseModel<KeyValue>,\n KeyValue extends AllowedKeyValue = Model[MongoKeyPath],\n>(\n mongoStore: MongoStore<Model, KeyValue>,\n): SubscribeStore<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n MongoConnection,\n MongoStore<Model, KeyValue>\n> {\n return new SubscribeStore(mongoStore);\n}\n"],"names":["MongoCursor","AbstractStoreCursor","constructor","store","cursor","advance","count","skip","next","then","value","_result","key","_id","limit","newLimit","Promise","resolve","result","Error","close","toArray","identityTransformer","model","MongoQueryCollection","AbstractSubscribableStoreQuery","options","transformer","createTestCriteria","testCriteria","criteria","$text","mingoQuery","mingo","Query","test","bind","fetch","onFulfilled","all","createMongoCursor","map","meta","total","info","sort","keyPath","_subscribe","callback","_includeInitial","getSubscribeStore","promise","type","initial","queryInfo","unsubscribe","subscribe","action","changes","filtered","filter","length","push","prev","keys","object","deleted","updated","inserted","forEach","prevObject","nextObject","stop","cancel","onRejected","MongoQuerySingleItem","createMingoTestCriteria","item","res","MongoStore","connection","collectionName","_collection","getConnection","client","db","collection","err","reject","connectionFailed","createQuerySingleItem","createQueryCollection","insertOne","mongodb","ObjectId","toString","created","Date","acknowledged","isAcknowledged","replaceOne","upsertOne","setOnInsertPartialObject","upsertOneWithInfo","$setOnInsert","$set","upsertedCount","updateOne","upsert","Object","assign","replaceSeveral","objects","partialUpdateByKey","partialUpdate","commandResult","console","error","findByKey","partialUpdateOne","partialUpdateMany","updateMany","undefined","deleteByKey","deleteOne","deleteMany","selector","countDocuments","findCursor","find","findOne","findAll","logger","Logger","MongoConnection","AbstractConnection","config","has","set","buildConnectionString","redactCredentials","get","slice","connectionString","connectionStringRedacted","connect","connectPromise","MongoClient","on","warn","_connection","_connecting","catch","message","process","nextTick","exit","createMongoSubscribeStore","mongoStore","SubscribeStore"],"mappings":";;;;;;AAMe,MAAMA,WAAW,SAItBC,mBAAmB,CAK3B;AACA;;AAMAC,EAAAA,WAAW,CAACC,KAAkC,EAAEC,MAA0B,EAAE;IAC1E,KAAK,CAACD,KAAK,CAAC,CAAA;IACZ,IAAI,CAACC,MAAM,GAAGA,MAAM,CAAA;AACtB,GAAA;EAEAC,OAAO,CAACC,KAAa,EAAQ;AAC3B,IAAA,IAAI,CAACF,MAAM,CAACG,IAAI,CAACD,KAAK,CAAC,CAAA;AACzB,GAAA;AAEAE,EAAAA,IAAI,GAAkC;IACpC,OAAO,IAAI,CAACJ,MAAM,CAACI,IAAI,EAAE,CAACC,IAAI,CAAEC,KAAK,IAAK;MACxC,IAAI,CAACC,OAAO,GAAGD,KAAK,CAAA;AACpB,MAAA,IAAI,CAACE,GAAG,GAAGF,KAAK,EAAEG,GAAG,CAAA;MACrB,OAAO,IAAI,CAACD,GAAG,CAAA;AACjB,KAAC,CAAC,CAAA;AACJ,GAAA;EAEAE,KAAK,CAACC,QAAgB,EAAiB;AACrC,IAAA,IAAI,CAACX,MAAM,CAACU,KAAK,CAACC,QAAQ,CAAC,CAAA;AAC3B,IAAA,OAAOC,OAAO,CAACC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC9B,GAAA;AAEAC,EAAAA,MAAM,GAAoB;IACxB,IAAI,CAAC,IAAI,CAACP,OAAO,EAAE,MAAM,IAAIQ,KAAK,CAAC,oCAAoC,CAAC,CAAA;AACxE,IAAA,OAAOH,OAAO,CAACC,OAAO,CAAC,IAAI,CAACN,OAAO,CAAC,CAAA;AACtC,GAAA;AAEAS,EAAAA,KAAK,GAAkB;IACrB,IAAI,IAAI,CAAChB,MAAM,EAAE;AACf,MAAA,IAAI,CAACA,MAAM,CAACgB,KAAK,EAAE,CAAA;AACrB,KAAA;IAEA,OAAOJ,OAAO,CAACC,OAAO,EAAE,CAAA;AAC1B,GAAA;AAEAI,EAAAA,OAAO,GAAsB;AAC3B,IAAA,OAAO,IAAI,CAACjB,MAAM,CAACiB,OAAO,EAAE,CAAA;AAC9B,GAAA;AACF;;AC5DA;AAsBA,MAAMC,qBAAmB,GAIvBC,KAAY,IACIA,KAA+B,CAAA;AAIlC,MAAMC,oBAAoB,SAK/BC,8BAA8B,CAOtC;EASAvB,WAAW,CACTC,KAAkC,EAClCuB,OAA4B,EAC5BC,WAAqC,GAAGL,qBAAmB,EAC3D;AACA,IAAA,KAAK,EAAE,CAAA;IACP,IAAI,CAACnB,KAAK,GAAGA,KAAK,CAAA;IAClB,IAAI,CAACuB,OAAO,GAAGA,OAAO,CAAA;IACtB,IAAI,CAACC,WAAW,GAAGA,WAAW,CAAA;AAChC,GAAA;AAEAC,EAAAA,kBAAkB,GAAiB;AACjC,IAAA,IAAI,CAAC,IAAI,CAACC,YAAY,EAAE;AACtB,MAAA,IAAI,CAAC,IAAI,CAACH,OAAO,CAACI,QAAQ,EAAE;AAC1B,QAAA,OAAO,MAAM,IAAI,CAAA;AACnB,OAAA;;AAEA;AACA,MAAA,IAAI,IAAI,CAACJ,OAAO,CAACI,QAAQ,CAACC,KAAK,EAAE;AAC/B,QAAA,OAAO,MAAM,KAAK,CAAA;AACpB,OAAA;AAEA,MAAA,MAAMC,UAAU,GAAG,IAAIC,KAAK,CAACC,KAAK,CAAC,IAAI,CAACR,OAAO,CAACI,QAAQ,CAAC,CAAA;MACzD,IAAI,CAACD,YAAY,GAAGG,UAAU,CAACG,IAAI,CAACC,IAAI,CAACJ,UAAU,CAAC,CAAA;AACtD,KAAA;IACA,OAAO,IAAI,CAACH,YAAY,CAAA;AAC1B,GAAA;EAEA,MAAMQ,KAAK,CAAIC,WAA+C,EAAc;AAC1E,IAAA,MAAM,CAACpB,MAAM,EAAEZ,KAAK,CAAC,GAAG,MAAMU,OAAO,CAACuB,GAAG,CAAC,CACxC,IAAI,CAACC,iBAAiB,EAAE,CAAC/B,IAAI,CAAEL,MAAM,IAAKA,MAAM,CAACiB,OAAO,EAAE,CAAC,EAC3D,IAAI,CAAClB,KAAK,CAACG,KAAK,CAAC,IAAI,CAACoB,OAAO,CAACI,QAAQ,CAAC,CACxC,CAAC,CAAA;AAEF,IAAA,OAAOQ,WAAW,CAAC;MACjBpB,MAAM,EAAEA,MAAM,CAACuB,GAAG,CAAC,IAAI,CAACd,WAAW,CAAC;AACpCe,MAAAA,IAAI,EAAE;AAAEC,QAAAA,KAAK,EAAErC,KAAAA;OAAO;AACtBsC,MAAAA,IAAI,EAAE;AACJC,QAAAA,IAAI,EAAE,IAAI,CAACnB,OAAO,CAACmB,IAAI;AACvB/B,QAAAA,KAAK,EAAE,IAAI,CAACY,OAAO,CAACZ,KAAK;AACzBgC,QAAAA,OAAO,EAAE,IAAI,CAAC3C,KAAK,CAAC2C,OAAAA;AACtB,OAAA;AACF,KAAC,CAAC,CAAA;AACJ,GAAA;AAEAC,EAAAA,UAAU,CACRC,QAA6C,EAC7CC,eAAwB,EACL;AACnB,IAAA,MAAM9C,KAAK,GAAG,KAAK,CAAC+C,iBAAiB,EAAE,CAAA;AACvC,IAAA,MAAMrB,YAA0B,GAAG,IAAI,CAACD,kBAAkB,EAAE,CAAA;IAE5D,MAAMuB,OAAsB,GAAGF,eAAe,GAC1C,IAAI,CAACZ,KAAK,CAAC,CAAC;MAAEnB,MAAM;MAAEwB,IAAI;AAAEE,MAAAA,IAAAA;AAA0B,KAAC,KAAK;MAC1DI,QAAQ,CAAC,IAAI,EAAE,CACb;AACEI,QAAAA,IAAI,EAAE,SAAS;AACfC,QAAAA,OAAO,EAAEnC,MAAM;AACfoC,QAAAA,SAAS,EAAEV,IAAI;AACfF,QAAAA,IAAAA;AACF,OAAC,CACF,CAAC,CAAA;AACJ,KAAC,CAAC,GACF1B,OAAO,CAACC,OAAO,EAAE,CAAA;AAErB,IAAA,MAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAS,CAAEC,MAAsB,IAAK;MAC9D,MAAMC,OAAkC,GAAG,EAAE,CAAA;MAC7C,QAAQD,MAAM,CAACL,IAAI;AACjB,QAAA,KAAK,UAAU;AAAE,UAAA;YACf,MAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAI,CAACoD,MAAM,CAAC/B,YAAY,CAAC,CAAA;AACjD,YAAA,IAAI8B,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AACXV,gBAAAA,IAAI,EAAE,UAAU;AAChBlC,gBAAAA,MAAM,EAAEyC,QAAQ,CAAClB,GAAG,CAAC,IAAI,CAACd,WAAW,CAAA;AACvC,eAAC,CAAC,CAAA;AACJ,aAAA;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA,KAAK,SAAS;AAAE,UAAA;YACd,MAAMgC,QAAQ,GAAGF,MAAM,CAACM,IAAI,CAACH,MAAM,CAAC/B,YAAY,CAAC,CAAA;AACjD,YAAA,IAAI8B,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AACXV,gBAAAA,IAAI,EAAE,SAAS;AACfY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAG,CAAEwB,MAAM,IAAKA,MAAM,CAAC,IAAI,CAAC9D,KAAK,CAAC2C,OAAO,CAAC,CAAA;AAC3D,eAAC,CAAC,CAAA;AACJ,aAAA;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA,KAAK,SAAS;AAAE,UAAA;YACd,MAAM;cACJoB,OAAO;cACPC,OAAO;AACPC,cAAAA,QAAAA;AAKF,aAAC,GAAG;AAAEF,cAAAA,OAAO,EAAE,EAAE;AAAEC,cAAAA,OAAO,EAAE,EAAE;AAAEC,cAAAA,QAAQ,EAAE,EAAA;aAAI,CAAA;YAE9CX,MAAM,CAACC,OAAO,CAACW,OAAO,CAAC,CAAC,CAACC,UAAU,EAAEC,UAAU,CAAiB,KAAK;AACnE,cAAA,IAAI1C,YAAY,CAACyC,UAAU,CAAC,EAAE;AAC5B,gBAAA,IAAI,CAACzC,YAAY,CAAC0C,UAAU,CAAC,EAAE;kBAC7BL,OAAO,CAACJ,IAAI,CAACQ,UAAU,CAAC,IAAI,CAACnE,KAAK,CAAC2C,OAAO,CAAC,CAAC,CAAA;AAC9C,iBAAC,MAAM;kBACLqB,OAAO,CAACL,IAAI,CAAC,IAAI,CAACnC,WAAW,CAAC4C,UAAU,CAAC,CAAC,CAAA;AAC5C,iBAAA;AACF,eAAC,MAAM,IAAI1C,YAAY,CAAC0C,UAAU,CAAC,EAAE;gBACnCH,QAAQ,CAACN,IAAI,CAAC,IAAI,CAACnC,WAAW,CAAC4C,UAAU,CAAC,CAAC,CAAA;AAC7C,eAAA;AACF,aAAC,CAAC,CAAA;AAEF,YAAA,IAAIL,OAAO,CAACL,MAAM,GAAG,CAAC,EAAE;cACtBH,OAAO,CAACI,IAAI,CAAC;AAAEV,gBAAAA,IAAI,EAAE,SAAS;AAAEY,gBAAAA,IAAI,EAAEE,OAAAA;AAAQ,eAAC,CAAC,CAAA;AAClD,aAAA;AACA,YAAA,IAAIC,OAAO,CAACN,MAAM,GAAG,CAAC,EAAE;cACtBH,OAAO,CAACI,IAAI,CAAC;AAAEV,gBAAAA,IAAI,EAAE,SAAS;AAAElC,gBAAAA,MAAM,EAAEiD,OAAAA;AAAQ,eAAC,CAAC,CAAA;AACpD,aAAA;AACA,YAAA,IAAIC,QAAQ,CAACP,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AAAEV,gBAAAA,IAAI,EAAE,UAAU;AAAElC,gBAAAA,MAAM,EAAEkD,QAAAA;AAAS,eAAC,CAAC,CAAA;AACtD,aAAA;AAEA,YAAA,MAAA;AACF,WAAA;AACA,QAAA;AACE,UAAA,MAAM,IAAIjD,KAAK,CAAC,kBAAkB,CAAC,CAAA;AAAC,OAAA;AAGxC,MAAA,IAAIuC,OAAO,CAACG,MAAM,KAAK,CAAC,EAAE,OAAA;AAE1Bb,MAAAA,QAAQ,CAAC,IAAI,EAAEU,OAAO,CAAC,CAAA;AACzB,KAAC,CAAC,CAAA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;IAEA,OAAO;AACLc,MAAAA,IAAI,EAAEjB,WAAW;AACjBkB,MAAAA,MAAM,EAAElB,WAAW;AACnB9C,MAAAA,IAAI,EAAE,CACJ6B,WAAiC,EACjCoC,UAA2C,KACxBvB,OAAO,CAAC1C,IAAI,CAAC6B,WAAW,EAAEoC,UAAU,CAAA;KAC1D,CAAA;AACH,GAAA;AAEA,EAAA,MAAclC,iBAAiB,GAE7B;IACA,MAAMpC,MAAM,GAAG,MAAM,IAAI,CAACD,KAAK,CAACC,MAAM,CACpC,IAAI,CAACsB,OAAO,CAACI,QAAQ,EACrB,IAAI,CAACJ,OAAO,CAACmB,IAAI,CAClB,CAAA;AAED,IAAA,IAAI,IAAI,CAACnB,OAAO,CAACnB,IAAI,EAAE;MACrBH,MAAM,CAACC,OAAO,CAAC,IAAI,CAACqB,OAAO,CAACnB,IAAI,CAAC,CAAA;AACnC,KAAA;AAEA,IAAA,IAAI,IAAI,CAACmB,OAAO,CAACZ,KAAK,EAAE;MACtB,MAAMV,MAAM,CAACU,KAAK,CAAC,IAAI,CAACY,OAAO,CAACZ,KAAK,CAAC,CAAA;AACxC,KAAA;AAEA,IAAA,OAAOV,MAAM,CAAA;AACf,GAAA;AACF;;AClNA,MAAMkB,mBAAmB,GAIvBC,KAAY,IACIA,KAA+B,CAAA;AAIlC,MAAMoD,oBAAoB,SAK/BlD,8BAA8B,CAOtC;EASAvB,WAAW,CACTC,KAAkC,EAClCuB,OAA4B,EAC5BC,WAAuC,GAAGL,mBAAmB,EAC7D;AACA,IAAA,KAAK,EAAE,CAAA;IACP,IAAI,CAACnB,KAAK,GAAGA,KAAK,CAAA;IAClB,IAAI,CAACuB,OAAO,GAAGA,OAAO,CAAA;IACtB,IAAI,CAACC,WAAW,GAAGA,WAAW,CAAA;AAChC,GAAA;AAEAiD,EAAAA,uBAAuB,GAAiB;AACtC,IAAA,IAAI,CAAC,IAAI,CAAC/C,YAAY,EAAE;AACtB,MAAA,IAAI,CAAC,IAAI,CAACH,OAAO,CAACI,QAAQ,EAAE;AAC1B,QAAA,OAAO,MAAM,IAAI,CAAA;AACnB,OAAA;AAEA,MAAA,MAAME,UAAU,GAAG,IAAIC,KAAK,CAACC,KAAK,CAAC,IAAI,CAACR,OAAO,CAACI,QAAQ,CAAC,CAAA;MACzD,IAAI,CAACD,YAAY,GAAGG,UAAU,CAACG,IAAI,CAACC,IAAI,CAACJ,UAAU,CAAC,CAAA;AACtD,KAAA;IAEA,OAAO,IAAI,CAACH,YAAY,CAAA;AAC1B,GAAA;EAEA,MAAMQ,KAAK,CAAIC,WAA+C,EAAc;AAC1E,IAAA,MAAMlC,MAAM,GAAG,MAAM,IAAI,CAACoC,iBAAiB,EAAE,CAAA;AAC7C,IAAA,MAAMpC,MAAM,CAACU,KAAK,CAAC,CAAC,CAAC,CAAA;IACrB,OAAOV,MAAM,CAACiB,OAAO,EAAE,CAACZ,IAAI,CAAES,MAAe,IAAK;AAChD,MAAA,MAAM2D,IAAY,GAChB3D,MAAM,CAAC2C,MAAM,KAAK,CAAC,GAAI,IAAI,GAAc,IAAI,CAAClC,WAAW,CAACT,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACtE,MAAA,OAAOoB,WAAW,CAAC;AACjBpB,QAAAA,MAAM,EAAE2D,IAAI;AACZnC,QAAAA,IAAI,EAAE;AAAEC,UAAAA,KAAK,EAAEzB,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG,CAAA;SAAG;AACxC0B,QAAAA,IAAI,EAAE;AACJ9B,UAAAA,KAAK,EAAE,CAAC;AACRgC,UAAAA,OAAO,EAAE,IAAI,CAAC3C,KAAK,CAAC2C,OAAAA;AACtB,SAAA;AACF,OAAC,CAAC,CAAA;AACJ,KAAC,CAAC,CAAA;AACJ,GAAA;AAEAC,EAAAA,UAAU,CACRC,QAA6C,EAC7CC,eAAwB,EACL;AACnB,IAAA,MAAM9C,KAAK,GAAG,KAAK,CAAC+C,iBAAiB,EAAE,CAAA;AACvC,IAAA,MAAMrB,YAA0B,GAAG,IAAI,CAAC+C,uBAAuB,EAAE,CAAA;IAEjE,MAAMzB,OAAsB,GAAGF,eAAe,GAC1C,IAAI,CAACZ,KAAK,CAAC,CAAC;MAAEnB,MAAM;MAAEwB,IAAI;AAAEE,MAAAA,IAAAA;AAA0B,KAAC,KAAK;MAC1DI,QAAQ,CAAC,IAAI,EAAE,CACb;AACEI,QAAAA,IAAI,EAAE,SAAS;AACfC,QAAAA,OAAO,EAAEnC,MAAM;AACfoC,QAAAA,SAAS,EAAEV,IAAI;AACfF,QAAAA,IAAAA;AACF,OAAC,CACF,CAAC,CAAA;AACJ,KAAC,CAAC,GACF1B,OAAO,CAACC,OAAO,EAAE,CAAA;IAErB,MAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAS,CAAC,MAAOC,MAAsB,IAAK;MACpE,MAAMC,OAAkC,GAAG,EAAE,CAAA;MAC7C,QAAQD,MAAM,CAACL,IAAI;AACjB,QAAA,KAAK,UAAU;AAAE,UAAA;YACf,MAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAI,CAACoD,MAAM,CAAC/B,YAAY,CAAC,CAAA;AACjD,YAAA,IAAI8B,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AACXV,gBAAAA,IAAI,EAAE,SAAS;gBACflC,MAAM,EAAE,IAAI,CAACS,WAAW,CAACgC,QAAQ,CAAC,CAAC,CAAC,CAAA;AACtC,eAAC,CAAC,CAAA;AACJ,aAAA;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA,KAAK,SAAS;AAAE,UAAA;YACd,MAAMA,QAAQ,GAAGF,MAAM,CAACM,IAAI,CAACH,MAAM,CAAC/B,YAAY,CAAC,CAAA;AACjD,YAAA,IAAI8B,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AACXV,gBAAAA,IAAI,EAAE,SAAS;AACfY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAG,CAAEwB,MAAM,IAAKA,MAAM,CAAC,IAAI,CAAC9D,KAAK,CAAC2C,OAAO,CAAC,CAAA;AAC3D,eAAC,CAAC,CAAA;AACJ,aAAA;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA,KAAK,SAAS;AAAE,UAAA;AACd,YAAA,MAAMa,QAAQ,GAAGF,MAAM,CAACC,OAAO,CAACE,MAAM,CAAC,CAAC,CAACG,IAAI,EAAEvD,IAAI,CAAC,KAClDqB,YAAY,CAACkC,IAAI,CAAC,CACnB,CAAA;AACD,YAAA,IAAIJ,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;AACvB,cAAA,IAAI,IAAI,CAACnC,OAAO,CAACmB,IAAI,EAAE;gBACrB,MAAM;AAAE3B,kBAAAA,MAAAA;iBAAQ,GAAG,MAAM,IAAI,CAACmB,KAAK,CAAEyC,GAAG,IAAKA,GAAG,CAAC,CAAA;gBACjDpB,OAAO,CAACI,IAAI,CAAC;AACXV,kBAAAA,IAAI,EAAE,SAAS;AACflC,kBAAAA,MAAAA;AACF,iBAAC,CAAC,CAAA;AACJ,eAAC,MAAM,IAAIyC,QAAQ,CAACE,MAAM,KAAK,CAAC,EAAE;AAChC,gBAAA,MAAM,IAAI1C,KAAK,CACb,uEAAuE,CACxE,CAAA;AACH,eAAC,MAAM;AACL,gBAAA,MAAM,GAAGX,IAAI,CAAC,GAAGmD,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAC5BD,OAAO,CAACI,IAAI,CAAC;AACXV,kBAAAA,IAAI,EAAE,SAAS;AACflC,kBAAAA,MAAM,EAAEW,YAAY,CAACrB,IAAI,CAAC,GAAG,IAAI,CAACmB,WAAW,CAACnB,IAAI,CAAC,GAAG,IAAA;AACxD,iBAAC,CAAC,CAAA;AACJ,eAAA;aACD,MAAM,IAAImD,QAAQ,CAACE,MAAM,KAAK,CAAC,EAAE,CAClC;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA;AACE,UAAA,MAAM,IAAI1C,KAAK,CAAC,kBAAkB,CAAC,CAAA;AAAC,OAAA;AAGxC,MAAA,IAAIuC,OAAO,CAACG,MAAM,KAAK,CAAC,EAAE,OAAA;AAE1Bb,MAAAA,QAAQ,CAAC,IAAI,EAAEU,OAAO,CAAC,CAAA;AACzB,KAAC,CAAC,CAAA;IAEF,OAAO;AACLc,MAAAA,IAAI,EAAEjB,WAAW;AACjBkB,MAAAA,MAAM,EAAElB,WAAW;AACnB9C,MAAAA,IAAI,EAAE,CACJ6B,WAAiC,EACjCoC,UAA2C,KACxBvB,OAAO,CAAC1C,IAAI,CAAC6B,WAAW,EAAEoC,UAAU,CAAA;KAC1D,CAAA;AACH,GAAA;AAEA,EAAA,MAAclC,iBAAiB,GAE7B;IACA,MAAMpC,MAAM,GAAG,MAAM,IAAI,CAACD,KAAK,CAACC,MAAM,CACpC,IAAI,CAACsB,OAAO,CAACI,QAAQ,EACrB,IAAI,CAACJ,OAAO,CAACmB,IAAI,CAClB,CAAA;AAED,IAAA,IAAI,IAAI,CAACnB,OAAO,CAACZ,KAAK,EAAE;MACtB,MAAMV,MAAM,CAACU,KAAK,CAAC,IAAI,CAACY,OAAO,CAACZ,KAAK,CAAC,CAAA;AACxC,KAAA;AAEA,IAAA,OAAOV,MAAM,CAAA;AACf,GAAA;AACF;;AClMA;AAuCe,MAAM2E,UAAU,CAW/B;AACWjC,EAAAA,OAAO,GAAiB,KAAK,CAAA;AAMtC5C,EAAAA,WAAW,CAAC8E,UAA2B,EAAEC,cAAsB,EAAE;IAC/D,IAAI,CAACD,UAAU,GAAGA,UAAU,CAAA;IAE5B,IAAI,CAACC,cAAc,EAAE;AACnB,MAAA,MAAM,IAAI9D,KAAK,CAAE,CAA2B8D,yBAAAA,EAAAA,cAAe,GAAE,CAAC,CAAA;AAChE,KAAA;IAEA,IAAI,CAACC,WAAW,GAAGF,UAAU,CAACG,aAAa,EAAE,CAAC1E,IAAI,CAC/C2E,MAAmB,IAAK;MACvB,IAAI,CAACF,WAAW,GAAGE,MAAM,CAACC,EAAE,EAAE,CAACC,UAAU,CAACL,cAAc,CAAC,CAAA;MACzD,OAAO,IAAI,CAACC,WAAW,CAAA;KACxB,EACAK,GAAQ,IAAK;MACZ,IAAI,CAACL,WAAW,GAAGlE,OAAO,CAACwE,MAAM,CAACD,GAAG,CAAC,CAAA;MACtC,OAAO,IAAI,CAACL,WAAW,CAAA;AACzB,KAAC,CACF,CAAA;AACH,GAAA;AAEA,EAAA,IAAII,UAAU,GAA+B;AAC3C,IAAA,IAAI,IAAI,CAACN,UAAU,CAACS,gBAAgB,EAAE;MACpC,OAAOzE,OAAO,CAACwE,MAAM,CAAC,IAAIrE,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAA;AAC/D,KAAA;AAEA,IAAA,OAAOH,OAAO,CAACC,OAAO,CAAC,IAAI,CAACiE,WAAW,CAAC,CAAA;AAC1C,GAAA;AAEAQ,EAAAA,qBAAqB,CAInBhE,OAA4B,EAC5BC,WAAwC,EACe;IACvD,OAAO,IAAIgD,oBAAoB,CAC7B,IAAI,EACJjD,OAAO,EACPC,WAAW,CACZ,CAAA;AACH,GAAA;AAEAgE,EAAAA,qBAAqB,CAInBjE,OAA4B,EAC5BC,WAAsC,EACmB;IACzD,OAAO,IAAIH,oBAAoB,CAC7B,IAAI,EACJE,OAAO,EACPC,WAAW,CACZ,CAAA;AACH,GAAA;EAEA,MAAMiE,SAAS,CAAC3B,MAA8B,EAAkB;AAC9D,IAAA,IAAI,CAACA,MAAM,CAACpD,GAAG,EAAE;MACfoD,MAAM,CAACpD,GAAG,GAAG,IAAIgF,OAAO,CAACC,QAAQ,EAAE,CAACC,QAAQ,EAAkB,CAAA;AAChE,KAAA;IAEA,IAAI,CAAC9B,MAAM,CAAC+B,OAAO,EAAE/B,MAAM,CAAC+B,OAAO,GAAG,IAAIC,IAAI,EAAE,CAAA;IAChD,IAAI,CAAChC,MAAM,CAACE,OAAO,EAAEF,MAAM,CAACE,OAAO,GAAG,IAAI8B,IAAI,EAAE,CAAA;AAEhD,IAAA,MAAMX,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;IACxC,MAAM;AAAEY,MAAAA,YAAY,EAAEC,cAAAA;AAAe,KAAC,GAAG,MAAMb,UAAU,CAACM,SAAS;AACjE;AACA3B,IAAAA,MAAM,CACP,CAAA;IACD,IAAI,CAACkC,cAAc,EAAE;AACnB,MAAA,MAAM,IAAIhF,KAAK,CAAC,gBAAgB,CAAC,CAAA;AACnC,KAAA;AAEA,IAAA,OAAO8C,MAAM,CAAA;AACf,GAAA;EAEA,MAAMmC,UAAU,CAACnC,MAAa,EAAkB;IAC9C,IAAI,CAACA,MAAM,CAACE,OAAO,EAAEF,MAAM,CAACE,OAAO,GAAG,IAAI8B,IAAI,EAAE,CAAA;AAEhD,IAAA,MAAMX,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;IACxC,MAAMA,UAAU,CAACc,UAAU,CAAC;MAAEvF,GAAG,EAAEoD,MAAM,CAACpD,GAAAA;KAAK,EAAqBoD,MAAM,CAAC,CAAA;AAC3E,IAAA,OAAOA,MAAM,CAAA;AACf,GAAA;AAEA,EAAA,MAAMoC,SAAS,CAMbpC,MAA6D,EAC7DqC,wBAAwD,EACxC;IAChB,MAAMpF,MAAM,GAAG,MAAM,IAAI,CAACqF,iBAAiB,CACzCtC,MAAM,EACNqC,wBAAwB,CACzB,CAAA;IACD,OAAOpF,MAAM,CAAC+C,MAAM,CAAA;AACtB,GAAA;AAEA,EAAA,MAAMsC,iBAAiB,CAMrBtC,MAA6D,EAC7DqC,wBAAwD,EACX;AAC7C,IAAA,MAAME,YAAY,GAAG;AACnBR,MAAAA,OAAO,EAAE/B,MAAM,CAAC+B,OAAO,IAAI,IAAIC,IAAI,EAAE;MACrC,GAAGK,wBAAAA;KACJ,CAAA;AAED,IAAA,IAAI,CAACrC,MAAM,CAACE,OAAO,EAAE;AAClBF,MAAAA,MAAM,CAAoBE,OAAO,GAAG,IAAI8B,IAAI,EAAE,CAAA;AACjD,KAAA;AAEA,IAAA,MAAMQ,IAA4B,GAAG;MAAE,GAAGxC,MAAAA;KAAQ,CAAA;IAClD,OAAOwC,IAAI,CAACT,OAAO,CAAA;AAEnB,IAAA,MAAMV,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;IAExC,MAAM;AAAEoB,MAAAA,aAAAA;AAAc,KAAC,GAAG,MAAMpB,UAAU,CAACqB,SAAS,CAClD;MAAE9F,GAAG,EAAEoD,MAAM,CAACpD,GAAAA;AAAI,KAAC,EACnB;MAAE4F,IAAI;AAAED,MAAAA,YAAAA;AAAa,KAAC,EACtB;AAAEI,MAAAA,MAAM,EAAE,IAAA;AAAK,KAAC,CACjB,CAAA;AAED,IAAA,IAAIF,aAAa,EAAE;AACjBG,MAAAA,MAAM,CAACC,MAAM,CAAC7C,MAAM,EAAEuC,YAAY,CAAC,CAAA;AACrC,KAAA;IAEA,OAAO;AAAEvC,MAAAA,MAAM,EAAEA,MAA0B;MAAEG,QAAQ,EAAE,CAAC,CAACsC,aAAAA;KAAe,CAAA;AAC1E,GAAA;EAEAK,cAAc,CAACC,OAAgB,EAAoB;AACjD,IAAA,OAAOhG,OAAO,CAACuB,GAAG,CAACyE,OAAO,CAACvE,GAAG,CAAEwB,MAAa,IAAK,IAAI,CAACmC,UAAU,CAACnC,MAAM,CAAC,CAAC,CAAC,CAAA;AAC7E,GAAA;AAEA,EAAA,MAAMgD,kBAAkB,CACtBrG,GAAa,EACbsG,aAA4B,EAC5BpF,QAA0B,EACV;AAChB,IAAA,MAAMwD,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;AACxC,IAAA,MAAM6B,aAAa,GAAG,MAAM7B,UAAU,CAACqB,SAAS,CAC9C;AAAE9F,MAAAA,GAAG,EAAED,GAAG;MAAE,GAAGkB,QAAAA;KAAU,EACzBoF,aAAa,CACd,CAAA;AACD,IAAA,IAAI,CAACC,aAAa,CAACjB,YAAY,EAAE;AAC/BkB,MAAAA,OAAO,CAACC,KAAK,CAACF,aAAa,CAAC,CAAA;AAC5B,MAAA,MAAM,IAAIhG,KAAK,CAAC,eAAe,CAAC,CAAA;AAClC,KAAA;IACA,MAAM8C,MAAM,GAAG,MAAM,IAAI,CAACqD,SAAS,CAAC1G,GAAG,CAAC,CAAA;AACxC,IAAA,OAAOqD,MAAM,CAAA;AACf,GAAA;AAEAsD,EAAAA,gBAAgB,CACdtD,MAAa,EACbiD,aAA4B,EACZ;IAChB,OAAO,IAAI,CAACD,kBAAkB,CAAChD,MAAM,CAACpD,GAAG,EAAEqG,aAAa,CAAC,CAAA;AAC3D,GAAA;AAEAM,EAAAA,iBAAiB,CACf1F,QAAyB,EACzBoF,aAA4B,EACb;AACf,IAAA,OAAO,IAAI,CAAC5B,UAAU,CACnB7E,IAAI,CAAE6E,UAAU;AACf;AACAA,IAAAA,UAAU,CAACmC,UAAU,CAAC3F,QAAQ,EAAEoF,aAAa,CAAQ,CACtD,CACAzG,IAAI,CAAC,MAASiH,SAAS,CAAC,CAAC;AAC9B,GAAA;;AAEAC,EAAAA,WAAW,CAAC/G,GAAa,EAAEkB,QAA0B,EAAiB;IACpE,OAAO,IAAI,CAACwD,UAAU,CACnB7E,IAAI,CAAE6E,UAAU,IACfA,UAAU,CAACsC,SAAS,CAAC;AAAE/G,MAAAA,GAAG,EAAED,GAAG;MAAE,GAAGkB,QAAAA;AAAS,KAAC,CAAoB,CACnE,CACArB,IAAI,CAAC,MAAMiH,SAAS,CAAC,CAAA;AAC1B,GAAA;EAEAE,SAAS,CAAC3D,MAAa,EAAiB;AACtC,IAAA,OAAO,IAAI,CAAC0D,WAAW,CAAC1D,MAAM,CAACpD,GAAG,CAAC,CAAA;AACrC,GAAA;EAEAgH,UAAU,CAACC,QAAyB,EAAiB;IACnD,OAAO,IAAI,CAACxC,UAAU,CACnB7E,IAAI,CAAE6E,UAAU,IAAKA,UAAU,CAACuC,UAAU,CAACC,QAAQ,CAAC,CAAC,CACrDrH,IAAI,CAAC,MAAMiH,SAAS,CAAC,CAAA;AAC1B,GAAA;EAEA,MAAMpH,KAAK,CAACsD,MAAwB,EAAmB;AACrD,IAAA,MAAM0B,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;AACxC,IAAA,OAAO1B,MAAM,GACT0B,UAAU,CAACyC,cAAc,CAACnE,MAAM,CAAC,GACjC0B,UAAU,CAACyC,cAAc,EAAE,CAAA;AACjC,GAAA;AAEA,EAAA,MAAM3H,MAAM,CACVwD,MAAwB,EACxBf,IAAkB,EAC6B;AAC/C,IAAA,MAAMyC,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;AACxC,IAAA,MAAM0C,UAAU,GAAGpE,MAAM,GACrB0B,UAAU,CAAC2C,IAAI,CAASrE,MAAM,CAAC,GAC9B0B,UAAU,CAAC2C,IAAI,EAAoC,CAAA;AACxD,IAAA,IAAIpF,IAAI,EAAEmF,UAAU,CAACnF,IAAI,CAACA,IAAI,CAAC,CAAA;AAC/B,IAAA,OAAO,IAAI7C,WAAW,CAA0B,IAAI,EAAEgI,UAAU,CAAC,CAAA;AACnE,GAAA;AAEA,EAAA,MAAMV,SAAS,CACb1G,GAAa,EACbkB,QAA0B,EACE;AAC5B,IAAA,MAAMwD,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;AACxC,IAAA,MAAMpE,MAAM,GAAG,MAAMoE,UAAU,CAAC4C,OAAO,CAAQ;AAC7CrH,MAAAA,GAAG,EAAED,GAAG;MACR,GAAGkB,QAAAA;AACL,KAAC,CAAoB,CAAA;IACrB,OAAOZ,MAAM,IAAIwG,SAAS,CAAA;AAC5B,GAAA;AAEAS,EAAAA,OAAO,CAACrG,QAA0B,EAAEe,IAAkB,EAAoB;AACxE,IAAA,OAAO,IAAI,CAACzC,MAAM,CAAQ0B,QAAQ,EAAEe,IAAI,CAAC,CAACpC,IAAI,CAAEL,MAAM,IACpDA,MAAM,CAACiB,OAAO,EAAE,CACjB,CAAA;AACH,GAAA;AAEA,EAAA,MAAM6G,OAAO,CACXtE,MAAuB,EACvBf,IAAkB,EACU;AAC5B,IAAA,MAAMyC,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;IACxC,MAAMpE,MAAM,GAAG,MAAMoE,UAAU,CAAC4C,OAAO,CAAQtE,MAAM,EAAE;AACrDf,MAAAA,IAAAA;AACF,KAAC,CAAC,CAAA;IACF,OAAO3B,MAAM,IAAIwG,SAAS,CAAA;AAC5B,GAAA;AACF;;ACtSA,MAAMU,MAAM,GAAG,IAAIC,MAAM,CAAC,4BAA4B,CAAC,CAAA;AAExC,MAAMC,eAAe,SAASC,kBAAkB,CAAC;AAO9D;EACArI,WAAW,CAACsI,MAAoC,EAAE;AAChD,IAAA,KAAK,EAAE,CAAA;AAEP,IAAA,IAAI,CAACA,MAAM,CAACC,GAAG,CAAC,MAAM,CAAC,EAAE;AACvBD,MAAAA,MAAM,CAACE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AACjC,KAAA;AACA,IAAA,IAAI,CAACF,MAAM,CAACC,GAAG,CAAC,MAAM,CAAC,EAAE;AACvBD,MAAAA,MAAM,CAACE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC7B,KAAA;AACA,IAAA,IAAI,CAACF,MAAM,CAACC,GAAG,CAAC,UAAU,CAAC,EAAE;AAC3B,MAAA,MAAM,IAAItH,KAAK,CAAC,yBAAyB,CAAC,CAAA;AAC5C,KAAA;AAEA,IAAA,MAAMwH,qBAAqB,GAAIC,iBAA0B,IACtD,aACCJ,MAAM,CAACC,GAAG,CAAC,MAAM,CAAC,GACb,CACCG,EAAAA,iBAAiB,GACZ,CAAGJ,EAAAA,MAAM,CAACK,GAAG,CAAC,MAAM,CAAC,CAAYC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAE,YAAW,GACxDN,MAAM,CAACK,GAAG,CAAC,MAAM,CACvB,CACCD,CAAAA,EAAAA,iBAAiB,GACb,YAAY,GACXJ,MAAM,CAACK,GAAG,CAAC,UAAU,CAC3B,GAAE,GACH,EACL,CAAC,CAAA,GACD,GAAEL,MAAM,CAACK,GAAG,CAAC,MAAM,CAAY,CAAA,CAAA,EAAGL,MAAM,CAACK,GAAG,CAAC,MAAM,CAAY,CAAA,CAAA,EAC9DL,MAAM,CAACK,GAAG,CAAC,UAAU,CACtB,CAAC,CAAA,CAAA;AAEJ,IAAA,MAAME,gBAAgB,GAAGJ,qBAAqB,CAAC,KAAK,CAAC,CAAA;AACrD,IAAA,MAAMK,wBAAwB,GAAGL,qBAAqB,CAAC,IAAI,CAAC,CAAA;AAE5D,IAAA,IAAI,CAACM,OAAO,CAACF,gBAAgB,EAAEC,wBAAwB,CAAC,CAAA;AAC1D,GAAA;AAEAC,EAAAA,OAAO,CAACF,gBAAwB,EAAEC,wBAAgC,EAAQ;AACxEZ,IAAAA,MAAM,CAACxF,IAAI,CAAC,YAAY,EAAE;AAAEoG,MAAAA,wBAAAA;AAAyB,KAAC,CAAC,CAAA;AAEvD,IAAA,MAAME,cAAc,GAAGrD,OAAO,CAACsD,WAAW,CAACF,OAAO,CAACF,gBAAgB,CAAC,CACjEtI,IAAI,CAAEuE,UAAU,IAAK;AACpBoD,MAAAA,MAAM,CAACxF,IAAI,CAAC,WAAW,EAAE;AAAEoG,QAAAA,wBAAAA;AAAyB,OAAC,CAAC,CAAA;AACtDhE,MAAAA,UAAU,CAACoE,EAAE,CAAC,OAAO,EAAE,MAAM;AAC3BhB,QAAAA,MAAM,CAACiB,IAAI,CAAC,OAAO,EAAE;AAAEL,UAAAA,wBAAAA;AAAyB,SAAC,CAAC,CAAA;QAClD,IAAI,CAACvD,gBAAgB,GAAG,IAAI,CAAA;QAC5B,IAAI,CAACN,aAAa,GAAG,MAAM;AACzB,UAAA,MAAM,IAAIhE,KAAK,CAAC,2BAA2B,CAAC,CAAA;SAC7C,CAAA;AACH,OAAC,CAAC,CAAA;AACF6D,MAAAA,UAAU,CAACoE,EAAE,CAAC,SAAS,EAAE,MAAM;AAC7BhB,QAAAA,MAAM,CAACiB,IAAI,CAAC,SAAS,EAAE;AAAEL,UAAAA,wBAAAA;AAAyB,SAAC,CAAC,CAAA;QACpD,IAAI,CAACvD,gBAAgB,GAAG,IAAI,CAAA;QAC5B,IAAI,CAACN,aAAa,GAAG,MAAM;AACzB,UAAA,MAAM,IAAIhE,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAC9C,CAAA;AACH,OAAC,CAAC,CAAA;AACF6D,MAAAA,UAAU,CAACoE,EAAE,CAAC,WAAW,EAAE,MAAM;AAC/BhB,QAAAA,MAAM,CAACiB,IAAI,CAAC,WAAW,EAAE;AAAEL,UAAAA,wBAAAA;AAAyB,SAAC,CAAC,CAAA;QACtD,IAAI,CAACvD,gBAAgB,GAAG,KAAK,CAAA;QAC7B,IAAI,CAACN,aAAa,GAAG,MAAMnE,OAAO,CAACC,OAAO,CAAC,IAAI,CAACqI,WAAW,CAAE,CAAA;AAC/D,OAAC,CAAC,CAAA;AACFtE,MAAAA,UAAU,CAACoE,EAAE,CAAC,OAAO,EAAG7D,GAAG,IAAK;AAC9B6C,QAAAA,MAAM,CAACiB,IAAI,CAAC,OAAO,EAAE;UAAEL,wBAAwB;AAAEzD,UAAAA,GAAAA;AAAI,SAAC,CAAC,CAAA;AACzD,OAAC,CAAC,CAAA;MAEF,IAAI,CAAC+D,WAAW,GAAGtE,UAAU,CAAA;MAC7B,IAAI,CAACuE,WAAW,GAAG7B,SAAS,CAAA;MAC5B,IAAI,CAACvC,aAAa,GAAG,MAAMnE,OAAO,CAACC,OAAO,CAAC,IAAI,CAACqI,WAAW,CAAE,CAAA;AAC7D,MAAA,OAAOtE,UAAU,CAAA;AACnB,KAAC,CAAC,CACDwE,KAAK,CAAEjE,GAAG,IAAK;AACd6C,MAAAA,MAAM,CAACxF,IAAI,CAAC,eAAe,EAAE;AAAEoG,QAAAA,wBAAAA;AAAyB,OAAC,CAAC,CAAA;MAC1D5B,OAAO,CAACC,KAAK,CAAC9B,GAAG,CAACkE,OAAO,IAAIlE,GAAG,CAAC,CAAA;AACjC;MACAmE,OAAO,CAACC,QAAQ,CAAC,MAAM;AACrB;AACAD,QAAAA,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,OAAC,CAAC,CAAA;AAEF,MAAA,MAAMrE,GAAG,CAAA;AACX,KAAC,CAAC,CAAA;IAEJ,IAAI,CAACJ,aAAa,GAAG,MAAMnE,OAAO,CAACC,OAAO,CAACiI,cAAc,CAAC,CAAA;AAC1D,IAAA,IAAI,CAACK,WAAW,GAAG,IAAI,CAACpE,aAAa,EAAE,CAAA;AACzC,GAAA;AAEAA,EAAAA,aAAa,GAAiC;AAC5C,IAAA,MAAM,IAAIhE,KAAK,CAAC,gBAAgB,CAAC,CAAA;AACnC,GAAA;AAEA,EAAA,MAAMC,KAAK,GAAkB;AAC3B,IAAA,IAAI,CAAC+D,aAAa,GAAG,MAAMnE,OAAO,CAACwE,MAAM,CAAC,IAAIrE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,IAAI,IAAI,CAACmI,WAAW,EAAE;AACpB,MAAA,MAAM,IAAI,CAACA,WAAW,CAAClI,KAAK,EAAE,CAAA;MAC9B,IAAI,CAACkI,WAAW,GAAG5B,SAAS,CAAA;AAC9B,KAAC,MAAM,IAAI,IAAI,CAAC6B,WAAW,EAAE;MAC3B,MAAM,IAAI,CAACA,WAAW,CAAA;MACtB,MAAM,IAAI,CAACnI,KAAK,EAAE,CAAA;AACpB,KAAA;AACF,GAAA;AACF;;ACzGe,SAASyI,yBAAyB,CAI/CC,UAAuC,EAQvC;AACA,EAAA,OAAO,IAAIC,cAAc,CAACD,UAAU,CAAC,CAAA;AACvC;;;;"}
|
|
1
|
+
{"version":3,"file":"index-node16.mjs","sources":["../src/MongoCursor.ts","../src/MongoQueryCollection.ts","../src/MongoQuerySingleItem.ts","../src/MongoStore.ts","../src/MongoConnection.ts","../src/createMongoSubscribeStore.ts"],"sourcesContent":["import { AbstractStoreCursor } from 'liwi-store';\nimport type { AllowedKeyValue } from 'liwi-store';\nimport type { FindCursor } from 'mongodb';\nimport type { MongoBaseModel } from './MongoBaseModel';\nimport type MongoStore from './MongoStore';\n\nexport default class MongoCursor<\n Model extends MongoBaseModel<KeyValue>,\n Result extends Partial<Model> = Model,\n KeyValue extends AllowedKeyValue = Model['_id'],\n> extends AbstractStoreCursor<\n MongoStore<Model, KeyValue>,\n KeyValue,\n Model,\n Result\n> {\n // key in AbstractCursor\n\n private readonly cursor: FindCursor<Result>;\n\n private _result?: Result | null;\n\n constructor(store: MongoStore<Model, KeyValue>, cursor: FindCursor<Result>) {\n super(store);\n this.cursor = cursor;\n }\n\n advance(count: number): void {\n this.cursor.skip(count);\n }\n\n next(): Promise<KeyValue | undefined> {\n return this.cursor.next().then((value) => {\n this._result = value;\n this.key = value?._id;\n return this.key;\n });\n }\n\n limit(newLimit: number): Promise<this> {\n this.cursor.limit(newLimit);\n return Promise.resolve(this);\n }\n\n result(): Promise<Result> {\n if (!this._result) throw new Error('Cannot call result() before next()');\n return Promise.resolve(this._result);\n }\n\n close(): Promise<void> {\n if (this.cursor) {\n this.cursor.close();\n }\n\n return Promise.resolve();\n }\n\n toArray(): Promise<Result[]> {\n return this.cursor.toArray();\n }\n}\n","/* eslint-disable complexity, max-lines */\nimport type {\n QuerySubscription,\n SubscribeCallback,\n QueryResult,\n QueryParams,\n Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport mingo from 'mingo';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoCursor from './MongoCursor';\nimport type MongoStore from './MongoStore';\n\nconst identityTransformer = <\n Model extends MongoBaseModel<any>,\n Transformed = Model,\n>(\n model: Model,\n): Transformed => model as unknown as Transformed;\n\ntype TestCriteria = (obj: any) => boolean;\n\nexport default class MongoQueryCollection<\n Model extends MongoBaseModel<KeyValue>,\n Params extends QueryParams<Params> = never,\n KeyValue extends AllowedKeyValue = Model['_id'],\n Item extends Record<MongoKeyPath, KeyValue> = Model,\n> extends AbstractSubscribableStoreQuery<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n Params,\n Item[]\n> {\n private readonly store: MongoStore<Model, KeyValue>;\n\n private readonly options: QueryOptions<Model>;\n\n private testCriteria?: TestCriteria;\n\n private readonly transformer: Transformer<Model, Item>;\n\n constructor(\n store: MongoStore<Model, KeyValue>,\n options: QueryOptions<Model>,\n transformer: Transformer<Model, Item> = identityTransformer,\n ) {\n super();\n this.store = store;\n this.options = options;\n this.transformer = transformer;\n }\n\n createTestCriteria(): TestCriteria {\n if (!this.testCriteria) {\n if (!this.options.criteria) {\n return () => true;\n }\n\n // criteria not supported by mingo: updates will not work\n if (this.options.criteria.$text) {\n return () => false;\n }\n\n const mingoQuery = new mingo.Query(this.options.criteria);\n this.testCriteria = mingoQuery.test.bind(mingoQuery);\n }\n return this.testCriteria;\n }\n\n async fetch<T>(onFulfilled: (result: QueryResult<Item[]>) => T): Promise<T> {\n const [result, count] = await Promise.all([\n this.createMongoCursor().then((cursor) => cursor.toArray()),\n this.store.count(this.options.criteria),\n ]);\n\n return onFulfilled({\n result: result.map(this.transformer),\n meta: { total: count },\n info: {\n sort: this.options.sort,\n limit: this.options.limit,\n keyPath: this.store.keyPath,\n },\n });\n }\n\n _subscribe(\n callback: SubscribeCallback<KeyValue, Item[]>,\n _includeInitial: boolean,\n ): QuerySubscription {\n const store = super.getSubscribeStore();\n const testCriteria: TestCriteria = this.createTestCriteria();\n\n const promise: Promise<void> = _includeInitial\n ? this.fetch(({ result, meta, info }: QueryResult<Item[]>) => {\n callback(null, [\n {\n type: 'initial',\n initial: result,\n queryInfo: info,\n meta,\n },\n ]);\n })\n : Promise.resolve();\n\n const unsubscribe = store.subscribe((action: Actions<Model>) => {\n const changes: Changes<KeyValue, Item[]> = [];\n switch (action.type) {\n case 'inserted': {\n const filtered = action.next.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'inserted',\n result: filtered.map(this.transformer),\n });\n }\n break;\n }\n case 'deleted': {\n const filtered = action.prev.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'deleted',\n keys: filtered.map((object) => object[this.store.keyPath]),\n });\n }\n break;\n }\n case 'updated': {\n const {\n deleted,\n updated,\n inserted,\n }: {\n deleted: KeyValue[];\n updated: Item[];\n inserted: Item[];\n } = { deleted: [], updated: [], inserted: [] };\n\n action.changes.forEach(([prevObject, nextObject]: [Model, Model]) => {\n if (testCriteria(prevObject)) {\n if (!testCriteria(nextObject)) {\n deleted.push(prevObject[this.store.keyPath]);\n } else {\n updated.push(this.transformer(nextObject));\n }\n } else if (testCriteria(nextObject)) {\n inserted.push(this.transformer(nextObject));\n }\n });\n\n if (deleted.length > 0) {\n changes.push({ type: 'deleted', keys: deleted });\n }\n if (updated.length > 0) {\n changes.push({ type: 'updated', result: updated });\n }\n if (inserted.length > 0) {\n changes.push({ type: 'inserted', result: inserted });\n }\n\n break;\n }\n default:\n throw new Error('Unsupported type');\n }\n\n if (changes.length === 0) return;\n\n callback(null, changes);\n });\n // let _feed;\n // const promise = this.queryCallback(this.store.query(), this.store.r)\n // .changes({\n // includeInitial: _includeInitial,\n // includeStates: true,\n // includeTypes: true,\n // includeOffsets: true,\n // })\n // .then((feed) => {\n // if (args.length === 0) {\n // _feed = feed;\n // delete this._promise;\n // }\n //\n // feed.each(callback);\n // return feed;\n // });\n //\n // if (args.length === 0) this._promise = promise;\n\n return {\n stop: unsubscribe,\n cancel: unsubscribe,\n then: <T, U>(\n onFulfilled: () => 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 Changes,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n} from 'liwi-store';\nimport type { Actions } from 'liwi-subscribe-store';\nimport { AbstractSubscribableStoreQuery } from 'liwi-subscribe-store';\nimport mingo from 'mingo';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoCursor from './MongoCursor';\nimport type MongoStore from './MongoStore';\n\nconst identityTransformer = <\n Model extends MongoBaseModel<any>,\n Transformed = Model,\n>(\n model: Model,\n): Transformed => model as unknown as Transformed;\n\ntype TestCriteria = (obj: any) => boolean;\n\nexport default class MongoQuerySingleItem<\n Model extends MongoBaseModel<KeyValue>,\n Params extends QueryParams<Params> = never,\n Result extends Record<MongoKeyPath, KeyValue> | null = Model | null,\n KeyValue extends AllowedKeyValue = Model['_id'],\n> extends AbstractSubscribableStoreQuery<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n Params,\n Result\n> {\n private readonly store: MongoStore<Model, KeyValue>;\n\n private readonly options: QueryOptions<Model>;\n\n private testCriteria?: TestCriteria;\n\n private readonly transformer: Transformer<Model, Result>;\n\n constructor(\n store: MongoStore<Model, KeyValue>,\n options: QueryOptions<Model>,\n transformer: Transformer<Model, Result> = identityTransformer,\n ) {\n super();\n this.store = store;\n this.options = options;\n this.transformer = transformer;\n }\n\n createMingoTestCriteria(): TestCriteria {\n if (!this.testCriteria) {\n if (!this.options.criteria) {\n return () => true;\n }\n\n const mingoQuery = new mingo.Query(this.options.criteria);\n this.testCriteria = mingoQuery.test.bind(mingoQuery);\n }\n\n return this.testCriteria;\n }\n\n async fetch<T>(onFulfilled: (result: QueryResult<Result>) => T): Promise<T> {\n const cursor = await this.createMongoCursor();\n await cursor.limit(1);\n return cursor.toArray().then((result: Model[]) => {\n const item: Result =\n result.length === 0 ? (null as Result) : this.transformer(result[0]);\n return onFulfilled({\n result: item,\n meta: { total: result === null ? 0 : 1 },\n info: {\n limit: 1,\n keyPath: this.store.keyPath,\n },\n });\n });\n }\n\n _subscribe(\n callback: SubscribeCallback<KeyValue, Result>,\n _includeInitial: boolean,\n ): QuerySubscription {\n const store = super.getSubscribeStore();\n const testCriteria: TestCriteria = this.createMingoTestCriteria();\n\n const promise: Promise<void> = _includeInitial\n ? this.fetch(({ result, meta, info }: QueryResult<Result>) => {\n callback(null, [\n {\n type: 'initial',\n initial: result,\n queryInfo: info,\n meta,\n },\n ]);\n })\n : Promise.resolve();\n\n const unsubscribe = store.subscribe(async (action: Actions<Model>) => {\n const changes: Changes<KeyValue, Result> = [];\n switch (action.type) {\n case 'inserted': {\n const filtered = action.next.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'updated',\n result: this.transformer(filtered[0]),\n });\n }\n break;\n }\n case 'deleted': {\n const filtered = action.prev.filter(testCriteria);\n if (filtered.length > 0) {\n changes.push({\n type: 'deleted',\n keys: filtered.map((object) => object[this.store.keyPath]),\n });\n }\n break;\n }\n case 'updated': {\n const filtered = action.changes.filter(([prev, next]) =>\n testCriteria(prev),\n );\n if (filtered.length > 0) {\n if (this.options.sort) {\n const { result } = await this.fetch((res) => res);\n changes.push({\n type: 'updated',\n result,\n });\n } else if (filtered.length !== 1) {\n throw new Error(\n 'should not match more than 1, use sort if you can have multiple match',\n );\n } else {\n const [, next] = filtered[0];\n changes.push({\n type: 'updated',\n result: testCriteria(next) ? this.transformer(next) : null!,\n });\n }\n } else if (filtered.length === 0) {\n }\n break;\n }\n default:\n throw new Error('Unsupported type');\n }\n\n if (changes.length === 0) return;\n\n callback(null, changes);\n });\n\n return {\n stop: unsubscribe,\n cancel: unsubscribe,\n then: <T, U>(\n onFulfilled: () => 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 Criteria,\n Sort,\n Update,\n QueryOptions,\n Transformer,\n AllowedKeyValue,\n OptionalBaseModelKeysForInsert,\n} from 'liwi-store';\nimport type {\n Collection,\n Filter,\n FindCursor,\n MongoClient,\n UpdateFilter,\n} from 'mongodb';\nimport mongodb from 'mongodb';\nimport type {\n MongoBaseModel,\n MongoKeyPath,\n MongoInsertType,\n} from './MongoBaseModel';\nimport type MongoConnection from './MongoConnection';\nimport MongoCursor from './MongoCursor';\nimport MongoQueryCollection from './MongoQueryCollection';\nimport MongoQuerySingleItem from './MongoQuerySingleItem';\n\nexport interface MongoUpsertResult<\n KeyValue extends AllowedKeyValue,\n Model extends MongoBaseModel<KeyValue>,\n> extends UpsertResult<Model> {\n object: Model;\n inserted: boolean;\n}\n\nexport default class MongoStore<\n Model extends MongoBaseModel<KeyValue>,\n KeyValue extends AllowedKeyValue = Model[MongoKeyPath],\n> implements\n SubscribableStore<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model>,\n MongoConnection\n >\n{\n readonly keyPath: MongoKeyPath = '_id';\n\n readonly connection: MongoConnection;\n\n private _collection: Collection<Model> | Promise<Collection<Model>>;\n\n constructor(connection: MongoConnection, collectionName: string) {\n this.connection = connection;\n\n if (!collectionName) {\n throw new Error(`Invalid collectionName: \"${collectionName}\"`);\n }\n\n this._collection = connection.getConnection().then(\n (client: MongoClient) => {\n this._collection = client.db().collection(collectionName);\n return this._collection;\n },\n (err: any) => {\n this._collection = Promise.reject(err);\n return this._collection;\n },\n );\n }\n\n get collection(): Promise<Collection<Model>> {\n if (this.connection.connectionFailed) {\n return Promise.reject(new Error('MongoDB connection failed'));\n }\n\n return Promise.resolve(this._collection);\n }\n\n createQuerySingleItem<\n Result extends Record<MongoKeyPath, KeyValue> = Model,\n Params extends QueryParams<Params> = never,\n >(\n options: QueryOptions<Model>,\n transformer?: Transformer<Model, Result>,\n ): MongoQuerySingleItem<Model, Params, Result, KeyValue> {\n return new MongoQuerySingleItem<Model, Params, Result, KeyValue>(\n this,\n options,\n transformer,\n );\n }\n\n createQueryCollection<\n Item extends Record<MongoKeyPath, KeyValue> = Model,\n Params extends QueryParams<Params> = never,\n >(\n options: QueryOptions<Model>,\n transformer?: Transformer<Model, Item>,\n ): MongoQueryCollection<Model, Params, Model['_id'], Item> {\n return new MongoQueryCollection<Model, Params, KeyValue, Item>(\n this,\n options,\n transformer,\n );\n }\n\n async insertOne(object: MongoInsertType<Model>): Promise<Model> {\n if (!object._id) {\n object._id = new mongodb.ObjectId().toString() as Model['_id'];\n }\n\n if (!object.created) object.created = new Date();\n if (!object.updated) object.updated = new Date();\n\n const collection = await this.collection;\n const { acknowledged: isAcknowledged } = await collection.insertOne(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n object as any,\n );\n if (!isAcknowledged) {\n throw new Error('Fail to insert');\n }\n\n return object as Model;\n }\n\n async replaceOne(object: Model): Promise<Model> {\n if (!object.updated) object.updated = new Date();\n\n const collection = await this.collection;\n await collection.replaceOne({ _id: object._id } as Filter<Model>, object);\n return object;\n }\n\n async upsertOne<\n K extends Exclude<\n keyof Model,\n MongoKeyPath | OptionalBaseModelKeysForInsert\n >,\n >(\n object: UpsertPartialObject<MongoKeyPath, KeyValue, Model, K>,\n setOnInsertPartialObject?: Update<Model>['$setOnInsert'],\n ): Promise<Model> {\n const result = await this.upsertOneWithInfo(\n object,\n setOnInsertPartialObject,\n );\n return result.object;\n }\n\n async upsertOneWithInfo<\n K extends Exclude<\n keyof Model,\n MongoKeyPath | OptionalBaseModelKeysForInsert\n >,\n >(\n object: UpsertPartialObject<MongoKeyPath, KeyValue, Model, K>,\n setOnInsertPartialObject?: Update<Model>['$setOnInsert'],\n ): Promise<MongoUpsertResult<KeyValue, Model>> {\n const $setOnInsert: Update<Model>['$setOnInsert'] = {\n // @ts-expect-error -- created is Date as set in BaseModel\n created: object.created || new Date(),\n ...setOnInsertPartialObject,\n };\n\n if (!object.updated) {\n (object as MongoBaseModel).updated = new Date();\n }\n\n const $set: Partial<typeof object> = { ...object };\n delete $set.created;\n\n const collection = await this.collection;\n\n const { upsertedCount } = await collection.updateOne(\n { _id: object._id } as Filter<Model>,\n { $set, $setOnInsert } as UpdateFilter<Model>,\n { upsert: true },\n );\n\n if (upsertedCount) {\n Object.assign(object, $setOnInsert);\n }\n\n return { object: object as unknown as Model, inserted: !!upsertedCount };\n }\n\n replaceSeveral(objects: Model[]): Promise<Model[]> {\n return Promise.all(objects.map((object: Model) => this.replaceOne(object)));\n }\n\n async partialUpdateByKey(\n key: KeyValue,\n partialUpdate: Update<Model>,\n criteria?: Criteria<Model>,\n ): Promise<Model> {\n const collection = await this.collection;\n const commandResult = await collection.updateOne(\n { _id: key, ...criteria } as Filter<Model>,\n partialUpdate as UpdateFilter<Model>,\n );\n if (!commandResult.acknowledged) {\n console.error(commandResult);\n throw new Error('Update failed');\n }\n const object = await this.findByKey(key);\n return object!;\n }\n\n partialUpdateOne(\n object: Model,\n partialUpdate: Update<Model>,\n ): Promise<Model> {\n return this.partialUpdateByKey(object._id, partialUpdate);\n }\n\n partialUpdateMany(\n criteria: Criteria<Model>,\n partialUpdate: Update<Model>,\n ): Promise<void> {\n return this.collection\n .then((collection) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n collection.updateMany(criteria as Filter<Model>, partialUpdate as any),\n )\n .then((res) => undefined); // TODO return updated object\n }\n\n deleteByKey(key: KeyValue, criteria?: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) =>\n collection.deleteOne({ _id: key, ...criteria } as Filter<Model>),\n )\n .then(() => undefined);\n }\n\n deleteOne(object: Model): Promise<void> {\n return this.deleteByKey(object._id);\n }\n\n deleteMany(selector: Criteria<Model>): Promise<void> {\n return this.collection\n .then((collection) => collection.deleteMany(selector as Filter<Model>))\n .then(() => undefined);\n }\n\n async count(filter?: Criteria<Model>): Promise<number> {\n const collection = await this.collection;\n return filter\n ? collection.countDocuments(filter as Filter<Model>)\n : collection.countDocuments();\n }\n\n async cursor<Result extends Partial<Model> = Model>(\n filter?: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<MongoCursor<Model, Result, KeyValue>> {\n const collection = await this.collection;\n const findCursor = filter\n ? collection.find<Result>(filter as Filter<Model>)\n : (collection.find() as unknown as FindCursor<Result>);\n if (sort) findCursor.sort(sort);\n return new MongoCursor<Model, Result, KeyValue>(this, findCursor);\n }\n\n async findByKey(\n key: KeyValue,\n criteria?: Criteria<Model>,\n ): Promise<Model | undefined> {\n const collection = await this.collection;\n const result = await collection.findOne<Model>({\n _id: key,\n ...criteria,\n } as Filter<Model>);\n return result || undefined;\n }\n\n findAll(criteria?: Criteria<Model>, sort?: Sort<Model>): Promise<Model[]> {\n return this.cursor<Model>(criteria, sort).then((cursor) =>\n cursor.toArray(),\n );\n }\n\n async findOne(\n filter: Criteria<Model>,\n sort?: Sort<Model>,\n ): Promise<Model | undefined> {\n const collection = await this.collection;\n const result = await collection.findOne<Model>(filter as Filter<Model>, {\n sort,\n });\n return result || undefined;\n }\n}\n","import { AbstractConnection } from 'liwi-store';\nimport mongodb from 'mongodb';\nimport { Logger } from 'nightingale-logger';\n\nconst logger = new Logger('liwi:mongo:MongoConnection');\n\nexport default class MongoConnection extends AbstractConnection {\n _connection?: mongodb.MongoClient;\n\n _connecting?: Promise<mongodb.MongoClient>;\n\n connectionFailed?: boolean;\n\n // TODO interface\n constructor(config: Map<string, 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 buildConnectionString = (redactCredentials: boolean): string =>\n `mongodb://${\n config.has('user')\n ? `${\n redactCredentials\n ? `${(config.get('user') as string).slice(0, 2)}[redacted]`\n : (config.get('user') as string)\n }:${\n redactCredentials\n ? '[redacted]'\n : (config.get('password') as string)\n }@`\n : ''\n }` +\n `${config.get('host') as string}:${config.get('port') as string}/${\n config.get('database') as string\n }`;\n\n const connectionString = buildConnectionString(false);\n const connectionStringRedacted = buildConnectionString(true);\n\n this.connect(connectionString, connectionStringRedacted);\n }\n\n connect(connectionString: string, connectionStringRedacted: string): void {\n logger.info('connecting', { connectionStringRedacted });\n\n const connectPromise = mongodb.MongoClient.connect(connectionString)\n .then((connection) => {\n logger.info('connected', { connectionStringRedacted });\n connection.on('close', () => {\n logger.warn('close', { connectionStringRedacted });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection closed');\n };\n });\n connection.on('timeout', () => {\n logger.warn('timeout', { connectionStringRedacted });\n this.connectionFailed = true;\n this.getConnection = () => {\n throw new Error('MongoDB connection timeout');\n };\n });\n connection.on('reconnect', () => {\n logger.warn('reconnect', { connectionStringRedacted });\n this.connectionFailed = false;\n this.getConnection = () => Promise.resolve(this._connection!);\n });\n connection.on('error', (err) => {\n logger.warn('error', { connectionStringRedacted, err });\n });\n\n this._connection = connection;\n this._connecting = undefined;\n this.getConnection = () => Promise.resolve(this._connection!);\n return connection;\n })\n .catch((err) => {\n logger.info('not connected', { connectionStringRedacted });\n console.error(err.message || err);\n // throw err;\n process.nextTick(() => {\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1);\n });\n\n throw err;\n });\n\n this.getConnection = () => Promise.resolve(connectPromise);\n this._connecting = this.getConnection();\n }\n\n getConnection(): Promise<mongodb.MongoClient> {\n throw new Error('call connect()');\n }\n\n async close(): Promise<void> {\n this.getConnection = () => Promise.reject(new Error('Connection closed'));\n if (this._connection) {\n await this._connection.close();\n this._connection = undefined;\n } else if (this._connecting) {\n await this._connecting;\n await this.close();\n }\n }\n}\n","import type { AllowedKeyValue } from 'liwi-store';\nimport { SubscribeStore } from 'liwi-subscribe-store';\nimport type {\n MongoBaseModel,\n MongoInsertType,\n MongoKeyPath,\n} from './MongoBaseModel';\nimport type MongoConnection from './MongoConnection';\nimport type MongoStore from './MongoStore';\n\nexport default function createMongoSubscribeStore<\n Model extends MongoBaseModel<KeyValue>,\n KeyValue extends AllowedKeyValue = Model[MongoKeyPath],\n>(\n mongoStore: MongoStore<Model, KeyValue>,\n): SubscribeStore<\n MongoKeyPath,\n KeyValue,\n Model,\n MongoInsertType<Model, KeyValue>,\n MongoConnection,\n MongoStore<Model, KeyValue>\n> {\n return new SubscribeStore(mongoStore);\n}\n"],"names":["MongoCursor","AbstractStoreCursor","constructor","store","cursor","advance","count","skip","next","then","value","_result","key","_id","limit","newLimit","Promise","resolve","result","Error","close","toArray","identityTransformer","model","MongoQueryCollection","AbstractSubscribableStoreQuery","options","transformer","createTestCriteria","testCriteria","criteria","$text","mingoQuery","mingo","Query","test","bind","fetch","onFulfilled","all","createMongoCursor","map","meta","total","info","sort","keyPath","_subscribe","callback","_includeInitial","getSubscribeStore","promise","type","initial","queryInfo","unsubscribe","subscribe","action","changes","filtered","filter","length","push","prev","keys","object","deleted","updated","inserted","forEach","prevObject","nextObject","stop","cancel","onRejected","MongoQuerySingleItem","createMingoTestCriteria","item","res","MongoStore","connection","collectionName","_collection","getConnection","client","db","collection","err","reject","connectionFailed","createQuerySingleItem","createQueryCollection","insertOne","mongodb","ObjectId","toString","created","Date","acknowledged","isAcknowledged","replaceOne","upsertOne","setOnInsertPartialObject","upsertOneWithInfo","$setOnInsert","$set","upsertedCount","updateOne","upsert","Object","assign","replaceSeveral","objects","partialUpdateByKey","partialUpdate","commandResult","console","error","findByKey","partialUpdateOne","partialUpdateMany","updateMany","undefined","deleteByKey","deleteOne","deleteMany","selector","countDocuments","findCursor","find","findOne","findAll","logger","Logger","MongoConnection","AbstractConnection","config","has","set","buildConnectionString","redactCredentials","get","slice","connectionString","connectionStringRedacted","connect","connectPromise","MongoClient","on","warn","_connection","_connecting","catch","message","process","nextTick","exit","createMongoSubscribeStore","mongoStore","SubscribeStore"],"mappings":";;;;;;AAMe,MAAMA,WAAW,SAItBC,mBAAmB,CAK3B;AACA;;AAMAC,EAAAA,WAAW,CAACC,KAAkC,EAAEC,MAA0B,EAAE;IAC1E,KAAK,CAACD,KAAK,CAAC,CAAA;IACZ,IAAI,CAACC,MAAM,GAAGA,MAAM,CAAA;AACtB,GAAA;EAEAC,OAAO,CAACC,KAAa,EAAQ;AAC3B,IAAA,IAAI,CAACF,MAAM,CAACG,IAAI,CAACD,KAAK,CAAC,CAAA;AACzB,GAAA;AAEAE,EAAAA,IAAI,GAAkC;IACpC,OAAO,IAAI,CAACJ,MAAM,CAACI,IAAI,EAAE,CAACC,IAAI,CAAEC,KAAK,IAAK;MACxC,IAAI,CAACC,OAAO,GAAGD,KAAK,CAAA;AACpB,MAAA,IAAI,CAACE,GAAG,GAAGF,KAAK,EAAEG,GAAG,CAAA;MACrB,OAAO,IAAI,CAACD,GAAG,CAAA;AACjB,KAAC,CAAC,CAAA;AACJ,GAAA;EAEAE,KAAK,CAACC,QAAgB,EAAiB;AACrC,IAAA,IAAI,CAACX,MAAM,CAACU,KAAK,CAACC,QAAQ,CAAC,CAAA;AAC3B,IAAA,OAAOC,OAAO,CAACC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC9B,GAAA;AAEAC,EAAAA,MAAM,GAAoB;IACxB,IAAI,CAAC,IAAI,CAACP,OAAO,EAAE,MAAM,IAAIQ,KAAK,CAAC,oCAAoC,CAAC,CAAA;AACxE,IAAA,OAAOH,OAAO,CAACC,OAAO,CAAC,IAAI,CAACN,OAAO,CAAC,CAAA;AACtC,GAAA;AAEAS,EAAAA,KAAK,GAAkB;IACrB,IAAI,IAAI,CAAChB,MAAM,EAAE;AACf,MAAA,IAAI,CAACA,MAAM,CAACgB,KAAK,EAAE,CAAA;AACrB,KAAA;IAEA,OAAOJ,OAAO,CAACC,OAAO,EAAE,CAAA;AAC1B,GAAA;AAEAI,EAAAA,OAAO,GAAsB;AAC3B,IAAA,OAAO,IAAI,CAACjB,MAAM,CAACiB,OAAO,EAAE,CAAA;AAC9B,GAAA;AACF;;AC5DA;AAsBA,MAAMC,qBAAmB,GAIvBC,KAAY,IACIA,KAA+B,CAAA;AAIlC,MAAMC,oBAAoB,SAK/BC,8BAA8B,CAOtC;EASAvB,WAAW,CACTC,KAAkC,EAClCuB,OAA4B,EAC5BC,WAAqC,GAAGL,qBAAmB,EAC3D;AACA,IAAA,KAAK,EAAE,CAAA;IACP,IAAI,CAACnB,KAAK,GAAGA,KAAK,CAAA;IAClB,IAAI,CAACuB,OAAO,GAAGA,OAAO,CAAA;IACtB,IAAI,CAACC,WAAW,GAAGA,WAAW,CAAA;AAChC,GAAA;AAEAC,EAAAA,kBAAkB,GAAiB;AACjC,IAAA,IAAI,CAAC,IAAI,CAACC,YAAY,EAAE;AACtB,MAAA,IAAI,CAAC,IAAI,CAACH,OAAO,CAACI,QAAQ,EAAE;AAC1B,QAAA,OAAO,MAAM,IAAI,CAAA;AACnB,OAAA;;AAEA;AACA,MAAA,IAAI,IAAI,CAACJ,OAAO,CAACI,QAAQ,CAACC,KAAK,EAAE;AAC/B,QAAA,OAAO,MAAM,KAAK,CAAA;AACpB,OAAA;AAEA,MAAA,MAAMC,UAAU,GAAG,IAAIC,KAAK,CAACC,KAAK,CAAC,IAAI,CAACR,OAAO,CAACI,QAAQ,CAAC,CAAA;MACzD,IAAI,CAACD,YAAY,GAAGG,UAAU,CAACG,IAAI,CAACC,IAAI,CAACJ,UAAU,CAAC,CAAA;AACtD,KAAA;IACA,OAAO,IAAI,CAACH,YAAY,CAAA;AAC1B,GAAA;EAEA,MAAMQ,KAAK,CAAIC,WAA+C,EAAc;AAC1E,IAAA,MAAM,CAACpB,MAAM,EAAEZ,KAAK,CAAC,GAAG,MAAMU,OAAO,CAACuB,GAAG,CAAC,CACxC,IAAI,CAACC,iBAAiB,EAAE,CAAC/B,IAAI,CAAEL,MAAM,IAAKA,MAAM,CAACiB,OAAO,EAAE,CAAC,EAC3D,IAAI,CAAClB,KAAK,CAACG,KAAK,CAAC,IAAI,CAACoB,OAAO,CAACI,QAAQ,CAAC,CACxC,CAAC,CAAA;AAEF,IAAA,OAAOQ,WAAW,CAAC;MACjBpB,MAAM,EAAEA,MAAM,CAACuB,GAAG,CAAC,IAAI,CAACd,WAAW,CAAC;AACpCe,MAAAA,IAAI,EAAE;AAAEC,QAAAA,KAAK,EAAErC,KAAAA;OAAO;AACtBsC,MAAAA,IAAI,EAAE;AACJC,QAAAA,IAAI,EAAE,IAAI,CAACnB,OAAO,CAACmB,IAAI;AACvB/B,QAAAA,KAAK,EAAE,IAAI,CAACY,OAAO,CAACZ,KAAK;AACzBgC,QAAAA,OAAO,EAAE,IAAI,CAAC3C,KAAK,CAAC2C,OAAAA;AACtB,OAAA;AACF,KAAC,CAAC,CAAA;AACJ,GAAA;AAEAC,EAAAA,UAAU,CACRC,QAA6C,EAC7CC,eAAwB,EACL;AACnB,IAAA,MAAM9C,KAAK,GAAG,KAAK,CAAC+C,iBAAiB,EAAE,CAAA;AACvC,IAAA,MAAMrB,YAA0B,GAAG,IAAI,CAACD,kBAAkB,EAAE,CAAA;IAE5D,MAAMuB,OAAsB,GAAGF,eAAe,GAC1C,IAAI,CAACZ,KAAK,CAAC,CAAC;MAAEnB,MAAM;MAAEwB,IAAI;AAAEE,MAAAA,IAAAA;AAA0B,KAAC,KAAK;MAC1DI,QAAQ,CAAC,IAAI,EAAE,CACb;AACEI,QAAAA,IAAI,EAAE,SAAS;AACfC,QAAAA,OAAO,EAAEnC,MAAM;AACfoC,QAAAA,SAAS,EAAEV,IAAI;AACfF,QAAAA,IAAAA;AACF,OAAC,CACF,CAAC,CAAA;AACJ,KAAC,CAAC,GACF1B,OAAO,CAACC,OAAO,EAAE,CAAA;AAErB,IAAA,MAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAS,CAAEC,MAAsB,IAAK;MAC9D,MAAMC,OAAkC,GAAG,EAAE,CAAA;MAC7C,QAAQD,MAAM,CAACL,IAAI;AACjB,QAAA,KAAK,UAAU;AAAE,UAAA;YACf,MAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAI,CAACoD,MAAM,CAAC/B,YAAY,CAAC,CAAA;AACjD,YAAA,IAAI8B,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AACXV,gBAAAA,IAAI,EAAE,UAAU;AAChBlC,gBAAAA,MAAM,EAAEyC,QAAQ,CAAClB,GAAG,CAAC,IAAI,CAACd,WAAW,CAAA;AACvC,eAAC,CAAC,CAAA;AACJ,aAAA;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA,KAAK,SAAS;AAAE,UAAA;YACd,MAAMgC,QAAQ,GAAGF,MAAM,CAACM,IAAI,CAACH,MAAM,CAAC/B,YAAY,CAAC,CAAA;AACjD,YAAA,IAAI8B,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AACXV,gBAAAA,IAAI,EAAE,SAAS;AACfY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAG,CAAEwB,MAAM,IAAKA,MAAM,CAAC,IAAI,CAAC9D,KAAK,CAAC2C,OAAO,CAAC,CAAA;AAC3D,eAAC,CAAC,CAAA;AACJ,aAAA;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA,KAAK,SAAS;AAAE,UAAA;YACd,MAAM;cACJoB,OAAO;cACPC,OAAO;AACPC,cAAAA,QAAAA;AAKF,aAAC,GAAG;AAAEF,cAAAA,OAAO,EAAE,EAAE;AAAEC,cAAAA,OAAO,EAAE,EAAE;AAAEC,cAAAA,QAAQ,EAAE,EAAA;aAAI,CAAA;YAE9CX,MAAM,CAACC,OAAO,CAACW,OAAO,CAAC,CAAC,CAACC,UAAU,EAAEC,UAAU,CAAiB,KAAK;AACnE,cAAA,IAAI1C,YAAY,CAACyC,UAAU,CAAC,EAAE;AAC5B,gBAAA,IAAI,CAACzC,YAAY,CAAC0C,UAAU,CAAC,EAAE;kBAC7BL,OAAO,CAACJ,IAAI,CAACQ,UAAU,CAAC,IAAI,CAACnE,KAAK,CAAC2C,OAAO,CAAC,CAAC,CAAA;AAC9C,iBAAC,MAAM;kBACLqB,OAAO,CAACL,IAAI,CAAC,IAAI,CAACnC,WAAW,CAAC4C,UAAU,CAAC,CAAC,CAAA;AAC5C,iBAAA;AACF,eAAC,MAAM,IAAI1C,YAAY,CAAC0C,UAAU,CAAC,EAAE;gBACnCH,QAAQ,CAACN,IAAI,CAAC,IAAI,CAACnC,WAAW,CAAC4C,UAAU,CAAC,CAAC,CAAA;AAC7C,eAAA;AACF,aAAC,CAAC,CAAA;AAEF,YAAA,IAAIL,OAAO,CAACL,MAAM,GAAG,CAAC,EAAE;cACtBH,OAAO,CAACI,IAAI,CAAC;AAAEV,gBAAAA,IAAI,EAAE,SAAS;AAAEY,gBAAAA,IAAI,EAAEE,OAAAA;AAAQ,eAAC,CAAC,CAAA;AAClD,aAAA;AACA,YAAA,IAAIC,OAAO,CAACN,MAAM,GAAG,CAAC,EAAE;cACtBH,OAAO,CAACI,IAAI,CAAC;AAAEV,gBAAAA,IAAI,EAAE,SAAS;AAAElC,gBAAAA,MAAM,EAAEiD,OAAAA;AAAQ,eAAC,CAAC,CAAA;AACpD,aAAA;AACA,YAAA,IAAIC,QAAQ,CAACP,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AAAEV,gBAAAA,IAAI,EAAE,UAAU;AAAElC,gBAAAA,MAAM,EAAEkD,QAAAA;AAAS,eAAC,CAAC,CAAA;AACtD,aAAA;AAEA,YAAA,MAAA;AACF,WAAA;AACA,QAAA;AACE,UAAA,MAAM,IAAIjD,KAAK,CAAC,kBAAkB,CAAC,CAAA;AAAC,OAAA;AAGxC,MAAA,IAAIuC,OAAO,CAACG,MAAM,KAAK,CAAC,EAAE,OAAA;AAE1Bb,MAAAA,QAAQ,CAAC,IAAI,EAAEU,OAAO,CAAC,CAAA;AACzB,KAAC,CAAC,CAAA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;IAEA,OAAO;AACLc,MAAAA,IAAI,EAAEjB,WAAW;AACjBkB,MAAAA,MAAM,EAAElB,WAAW;AACnB9C,MAAAA,IAAI,EAAE,CACJ6B,WAAiC,EACjCoC,UAA2C,KACxBvB,OAAO,CAAC1C,IAAI,CAAC6B,WAAW,EAAEoC,UAAU,CAAA;KAC1D,CAAA;AACH,GAAA;AAEA,EAAA,MAAclC,iBAAiB,GAE7B;IACA,MAAMpC,MAAM,GAAG,MAAM,IAAI,CAACD,KAAK,CAACC,MAAM,CACpC,IAAI,CAACsB,OAAO,CAACI,QAAQ,EACrB,IAAI,CAACJ,OAAO,CAACmB,IAAI,CAClB,CAAA;AAED,IAAA,IAAI,IAAI,CAACnB,OAAO,CAACnB,IAAI,EAAE;MACrBH,MAAM,CAACC,OAAO,CAAC,IAAI,CAACqB,OAAO,CAACnB,IAAI,CAAC,CAAA;AACnC,KAAA;AAEA,IAAA,IAAI,IAAI,CAACmB,OAAO,CAACZ,KAAK,EAAE;MACtB,MAAMV,MAAM,CAACU,KAAK,CAAC,IAAI,CAACY,OAAO,CAACZ,KAAK,CAAC,CAAA;AACxC,KAAA;AAEA,IAAA,OAAOV,MAAM,CAAA;AACf,GAAA;AACF;;AClNA,MAAMkB,mBAAmB,GAIvBC,KAAY,IACIA,KAA+B,CAAA;AAIlC,MAAMoD,oBAAoB,SAK/BlD,8BAA8B,CAOtC;EASAvB,WAAW,CACTC,KAAkC,EAClCuB,OAA4B,EAC5BC,WAAuC,GAAGL,mBAAmB,EAC7D;AACA,IAAA,KAAK,EAAE,CAAA;IACP,IAAI,CAACnB,KAAK,GAAGA,KAAK,CAAA;IAClB,IAAI,CAACuB,OAAO,GAAGA,OAAO,CAAA;IACtB,IAAI,CAACC,WAAW,GAAGA,WAAW,CAAA;AAChC,GAAA;AAEAiD,EAAAA,uBAAuB,GAAiB;AACtC,IAAA,IAAI,CAAC,IAAI,CAAC/C,YAAY,EAAE;AACtB,MAAA,IAAI,CAAC,IAAI,CAACH,OAAO,CAACI,QAAQ,EAAE;AAC1B,QAAA,OAAO,MAAM,IAAI,CAAA;AACnB,OAAA;AAEA,MAAA,MAAME,UAAU,GAAG,IAAIC,KAAK,CAACC,KAAK,CAAC,IAAI,CAACR,OAAO,CAACI,QAAQ,CAAC,CAAA;MACzD,IAAI,CAACD,YAAY,GAAGG,UAAU,CAACG,IAAI,CAACC,IAAI,CAACJ,UAAU,CAAC,CAAA;AACtD,KAAA;IAEA,OAAO,IAAI,CAACH,YAAY,CAAA;AAC1B,GAAA;EAEA,MAAMQ,KAAK,CAAIC,WAA+C,EAAc;AAC1E,IAAA,MAAMlC,MAAM,GAAG,MAAM,IAAI,CAACoC,iBAAiB,EAAE,CAAA;AAC7C,IAAA,MAAMpC,MAAM,CAACU,KAAK,CAAC,CAAC,CAAC,CAAA;IACrB,OAAOV,MAAM,CAACiB,OAAO,EAAE,CAACZ,IAAI,CAAES,MAAe,IAAK;AAChD,MAAA,MAAM2D,IAAY,GAChB3D,MAAM,CAAC2C,MAAM,KAAK,CAAC,GAAI,IAAI,GAAc,IAAI,CAAClC,WAAW,CAACT,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACtE,MAAA,OAAOoB,WAAW,CAAC;AACjBpB,QAAAA,MAAM,EAAE2D,IAAI;AACZnC,QAAAA,IAAI,EAAE;AAAEC,UAAAA,KAAK,EAAEzB,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG,CAAA;SAAG;AACxC0B,QAAAA,IAAI,EAAE;AACJ9B,UAAAA,KAAK,EAAE,CAAC;AACRgC,UAAAA,OAAO,EAAE,IAAI,CAAC3C,KAAK,CAAC2C,OAAAA;AACtB,SAAA;AACF,OAAC,CAAC,CAAA;AACJ,KAAC,CAAC,CAAA;AACJ,GAAA;AAEAC,EAAAA,UAAU,CACRC,QAA6C,EAC7CC,eAAwB,EACL;AACnB,IAAA,MAAM9C,KAAK,GAAG,KAAK,CAAC+C,iBAAiB,EAAE,CAAA;AACvC,IAAA,MAAMrB,YAA0B,GAAG,IAAI,CAAC+C,uBAAuB,EAAE,CAAA;IAEjE,MAAMzB,OAAsB,GAAGF,eAAe,GAC1C,IAAI,CAACZ,KAAK,CAAC,CAAC;MAAEnB,MAAM;MAAEwB,IAAI;AAAEE,MAAAA,IAAAA;AAA0B,KAAC,KAAK;MAC1DI,QAAQ,CAAC,IAAI,EAAE,CACb;AACEI,QAAAA,IAAI,EAAE,SAAS;AACfC,QAAAA,OAAO,EAAEnC,MAAM;AACfoC,QAAAA,SAAS,EAAEV,IAAI;AACfF,QAAAA,IAAAA;AACF,OAAC,CACF,CAAC,CAAA;AACJ,KAAC,CAAC,GACF1B,OAAO,CAACC,OAAO,EAAE,CAAA;IAErB,MAAMsC,WAAW,GAAGpD,KAAK,CAACqD,SAAS,CAAC,MAAOC,MAAsB,IAAK;MACpE,MAAMC,OAAkC,GAAG,EAAE,CAAA;MAC7C,QAAQD,MAAM,CAACL,IAAI;AACjB,QAAA,KAAK,UAAU;AAAE,UAAA;YACf,MAAMO,QAAQ,GAAGF,MAAM,CAACjD,IAAI,CAACoD,MAAM,CAAC/B,YAAY,CAAC,CAAA;AACjD,YAAA,IAAI8B,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AACXV,gBAAAA,IAAI,EAAE,SAAS;gBACflC,MAAM,EAAE,IAAI,CAACS,WAAW,CAACgC,QAAQ,CAAC,CAAC,CAAC,CAAA;AACtC,eAAC,CAAC,CAAA;AACJ,aAAA;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA,KAAK,SAAS;AAAE,UAAA;YACd,MAAMA,QAAQ,GAAGF,MAAM,CAACM,IAAI,CAACH,MAAM,CAAC/B,YAAY,CAAC,CAAA;AACjD,YAAA,IAAI8B,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;cACvBH,OAAO,CAACI,IAAI,CAAC;AACXV,gBAAAA,IAAI,EAAE,SAAS;AACfY,gBAAAA,IAAI,EAAEL,QAAQ,CAAClB,GAAG,CAAEwB,MAAM,IAAKA,MAAM,CAAC,IAAI,CAAC9D,KAAK,CAAC2C,OAAO,CAAC,CAAA;AAC3D,eAAC,CAAC,CAAA;AACJ,aAAA;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA,KAAK,SAAS;AAAE,UAAA;AACd,YAAA,MAAMa,QAAQ,GAAGF,MAAM,CAACC,OAAO,CAACE,MAAM,CAAC,CAAC,CAACG,IAAI,EAAEvD,IAAI,CAAC,KAClDqB,YAAY,CAACkC,IAAI,CAAC,CACnB,CAAA;AACD,YAAA,IAAIJ,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;AACvB,cAAA,IAAI,IAAI,CAACnC,OAAO,CAACmB,IAAI,EAAE;gBACrB,MAAM;AAAE3B,kBAAAA,MAAAA;iBAAQ,GAAG,MAAM,IAAI,CAACmB,KAAK,CAAEyC,GAAG,IAAKA,GAAG,CAAC,CAAA;gBACjDpB,OAAO,CAACI,IAAI,CAAC;AACXV,kBAAAA,IAAI,EAAE,SAAS;AACflC,kBAAAA,MAAAA;AACF,iBAAC,CAAC,CAAA;AACJ,eAAC,MAAM,IAAIyC,QAAQ,CAACE,MAAM,KAAK,CAAC,EAAE;AAChC,gBAAA,MAAM,IAAI1C,KAAK,CACb,uEAAuE,CACxE,CAAA;AACH,eAAC,MAAM;AACL,gBAAA,MAAM,GAAGX,IAAI,CAAC,GAAGmD,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAC5BD,OAAO,CAACI,IAAI,CAAC;AACXV,kBAAAA,IAAI,EAAE,SAAS;AACflC,kBAAAA,MAAM,EAAEW,YAAY,CAACrB,IAAI,CAAC,GAAG,IAAI,CAACmB,WAAW,CAACnB,IAAI,CAAC,GAAG,IAAA;AACxD,iBAAC,CAAC,CAAA;AACJ,eAAA;aACD,MAAM,IAAImD,QAAQ,CAACE,MAAM,KAAK,CAAC,EAAE,CAClC;AACA,YAAA,MAAA;AACF,WAAA;AACA,QAAA;AACE,UAAA,MAAM,IAAI1C,KAAK,CAAC,kBAAkB,CAAC,CAAA;AAAC,OAAA;AAGxC,MAAA,IAAIuC,OAAO,CAACG,MAAM,KAAK,CAAC,EAAE,OAAA;AAE1Bb,MAAAA,QAAQ,CAAC,IAAI,EAAEU,OAAO,CAAC,CAAA;AACzB,KAAC,CAAC,CAAA;IAEF,OAAO;AACLc,MAAAA,IAAI,EAAEjB,WAAW;AACjBkB,MAAAA,MAAM,EAAElB,WAAW;AACnB9C,MAAAA,IAAI,EAAE,CACJ6B,WAAiC,EACjCoC,UAA2C,KACxBvB,OAAO,CAAC1C,IAAI,CAAC6B,WAAW,EAAEoC,UAAU,CAAA;KAC1D,CAAA;AACH,GAAA;AAEA,EAAA,MAAclC,iBAAiB,GAE7B;IACA,MAAMpC,MAAM,GAAG,MAAM,IAAI,CAACD,KAAK,CAACC,MAAM,CACpC,IAAI,CAACsB,OAAO,CAACI,QAAQ,EACrB,IAAI,CAACJ,OAAO,CAACmB,IAAI,CAClB,CAAA;AAED,IAAA,IAAI,IAAI,CAACnB,OAAO,CAACZ,KAAK,EAAE;MACtB,MAAMV,MAAM,CAACU,KAAK,CAAC,IAAI,CAACY,OAAO,CAACZ,KAAK,CAAC,CAAA;AACxC,KAAA;AAEA,IAAA,OAAOV,MAAM,CAAA;AACf,GAAA;AACF;;AClMA;AAwCe,MAAM2E,UAAU,CAW/B;AACWjC,EAAAA,OAAO,GAAiB,KAAK,CAAA;AAMtC5C,EAAAA,WAAW,CAAC8E,UAA2B,EAAEC,cAAsB,EAAE;IAC/D,IAAI,CAACD,UAAU,GAAGA,UAAU,CAAA;IAE5B,IAAI,CAACC,cAAc,EAAE;AACnB,MAAA,MAAM,IAAI9D,KAAK,CAAE,CAA2B8D,yBAAAA,EAAAA,cAAe,GAAE,CAAC,CAAA;AAChE,KAAA;IAEA,IAAI,CAACC,WAAW,GAAGF,UAAU,CAACG,aAAa,EAAE,CAAC1E,IAAI,CAC/C2E,MAAmB,IAAK;MACvB,IAAI,CAACF,WAAW,GAAGE,MAAM,CAACC,EAAE,EAAE,CAACC,UAAU,CAACL,cAAc,CAAC,CAAA;MACzD,OAAO,IAAI,CAACC,WAAW,CAAA;KACxB,EACAK,GAAQ,IAAK;MACZ,IAAI,CAACL,WAAW,GAAGlE,OAAO,CAACwE,MAAM,CAACD,GAAG,CAAC,CAAA;MACtC,OAAO,IAAI,CAACL,WAAW,CAAA;AACzB,KAAC,CACF,CAAA;AACH,GAAA;AAEA,EAAA,IAAII,UAAU,GAA+B;AAC3C,IAAA,IAAI,IAAI,CAACN,UAAU,CAACS,gBAAgB,EAAE;MACpC,OAAOzE,OAAO,CAACwE,MAAM,CAAC,IAAIrE,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAA;AAC/D,KAAA;AAEA,IAAA,OAAOH,OAAO,CAACC,OAAO,CAAC,IAAI,CAACiE,WAAW,CAAC,CAAA;AAC1C,GAAA;AAEAQ,EAAAA,qBAAqB,CAInBhE,OAA4B,EAC5BC,WAAwC,EACe;IACvD,OAAO,IAAIgD,oBAAoB,CAC7B,IAAI,EACJjD,OAAO,EACPC,WAAW,CACZ,CAAA;AACH,GAAA;AAEAgE,EAAAA,qBAAqB,CAInBjE,OAA4B,EAC5BC,WAAsC,EACmB;IACzD,OAAO,IAAIH,oBAAoB,CAC7B,IAAI,EACJE,OAAO,EACPC,WAAW,CACZ,CAAA;AACH,GAAA;EAEA,MAAMiE,SAAS,CAAC3B,MAA8B,EAAkB;AAC9D,IAAA,IAAI,CAACA,MAAM,CAACpD,GAAG,EAAE;MACfoD,MAAM,CAACpD,GAAG,GAAG,IAAIgF,OAAO,CAACC,QAAQ,EAAE,CAACC,QAAQ,EAAkB,CAAA;AAChE,KAAA;IAEA,IAAI,CAAC9B,MAAM,CAAC+B,OAAO,EAAE/B,MAAM,CAAC+B,OAAO,GAAG,IAAIC,IAAI,EAAE,CAAA;IAChD,IAAI,CAAChC,MAAM,CAACE,OAAO,EAAEF,MAAM,CAACE,OAAO,GAAG,IAAI8B,IAAI,EAAE,CAAA;AAEhD,IAAA,MAAMX,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;IACxC,MAAM;AAAEY,MAAAA,YAAY,EAAEC,cAAAA;AAAe,KAAC,GAAG,MAAMb,UAAU,CAACM,SAAS;AACjE;AACA3B,IAAAA,MAAM,CACP,CAAA;IACD,IAAI,CAACkC,cAAc,EAAE;AACnB,MAAA,MAAM,IAAIhF,KAAK,CAAC,gBAAgB,CAAC,CAAA;AACnC,KAAA;AAEA,IAAA,OAAO8C,MAAM,CAAA;AACf,GAAA;EAEA,MAAMmC,UAAU,CAACnC,MAAa,EAAkB;IAC9C,IAAI,CAACA,MAAM,CAACE,OAAO,EAAEF,MAAM,CAACE,OAAO,GAAG,IAAI8B,IAAI,EAAE,CAAA;AAEhD,IAAA,MAAMX,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;IACxC,MAAMA,UAAU,CAACc,UAAU,CAAC;MAAEvF,GAAG,EAAEoD,MAAM,CAACpD,GAAAA;KAAK,EAAmBoD,MAAM,CAAC,CAAA;AACzE,IAAA,OAAOA,MAAM,CAAA;AACf,GAAA;AAEA,EAAA,MAAMoC,SAAS,CAMbpC,MAA6D,EAC7DqC,wBAAwD,EACxC;IAChB,MAAMpF,MAAM,GAAG,MAAM,IAAI,CAACqF,iBAAiB,CACzCtC,MAAM,EACNqC,wBAAwB,CACzB,CAAA;IACD,OAAOpF,MAAM,CAAC+C,MAAM,CAAA;AACtB,GAAA;AAEA,EAAA,MAAMsC,iBAAiB,CAMrBtC,MAA6D,EAC7DqC,wBAAwD,EACX;AAC7C,IAAA,MAAME,YAA2C,GAAG;AAClD;AACAR,MAAAA,OAAO,EAAE/B,MAAM,CAAC+B,OAAO,IAAI,IAAIC,IAAI,EAAE;MACrC,GAAGK,wBAAAA;KACJ,CAAA;AAED,IAAA,IAAI,CAACrC,MAAM,CAACE,OAAO,EAAE;AAClBF,MAAAA,MAAM,CAAoBE,OAAO,GAAG,IAAI8B,IAAI,EAAE,CAAA;AACjD,KAAA;AAEA,IAAA,MAAMQ,IAA4B,GAAG;MAAE,GAAGxC,MAAAA;KAAQ,CAAA;IAClD,OAAOwC,IAAI,CAACT,OAAO,CAAA;AAEnB,IAAA,MAAMV,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;IAExC,MAAM;AAAEoB,MAAAA,aAAAA;AAAc,KAAC,GAAG,MAAMpB,UAAU,CAACqB,SAAS,CAClD;MAAE9F,GAAG,EAAEoD,MAAM,CAACpD,GAAAA;AAAI,KAAC,EACnB;MAAE4F,IAAI;AAAED,MAAAA,YAAAA;AAAa,KAAC,EACtB;AAAEI,MAAAA,MAAM,EAAE,IAAA;AAAK,KAAC,CACjB,CAAA;AAED,IAAA,IAAIF,aAAa,EAAE;AACjBG,MAAAA,MAAM,CAACC,MAAM,CAAC7C,MAAM,EAAEuC,YAAY,CAAC,CAAA;AACrC,KAAA;IAEA,OAAO;AAAEvC,MAAAA,MAAM,EAAEA,MAA0B;MAAEG,QAAQ,EAAE,CAAC,CAACsC,aAAAA;KAAe,CAAA;AAC1E,GAAA;EAEAK,cAAc,CAACC,OAAgB,EAAoB;AACjD,IAAA,OAAOhG,OAAO,CAACuB,GAAG,CAACyE,OAAO,CAACvE,GAAG,CAAEwB,MAAa,IAAK,IAAI,CAACmC,UAAU,CAACnC,MAAM,CAAC,CAAC,CAAC,CAAA;AAC7E,GAAA;AAEA,EAAA,MAAMgD,kBAAkB,CACtBrG,GAAa,EACbsG,aAA4B,EAC5BpF,QAA0B,EACV;AAChB,IAAA,MAAMwD,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;AACxC,IAAA,MAAM6B,aAAa,GAAG,MAAM7B,UAAU,CAACqB,SAAS,CAC9C;AAAE9F,MAAAA,GAAG,EAAED,GAAG;MAAE,GAAGkB,QAAAA;KAAU,EACzBoF,aAAa,CACd,CAAA;AACD,IAAA,IAAI,CAACC,aAAa,CAACjB,YAAY,EAAE;AAC/BkB,MAAAA,OAAO,CAACC,KAAK,CAACF,aAAa,CAAC,CAAA;AAC5B,MAAA,MAAM,IAAIhG,KAAK,CAAC,eAAe,CAAC,CAAA;AAClC,KAAA;IACA,MAAM8C,MAAM,GAAG,MAAM,IAAI,CAACqD,SAAS,CAAC1G,GAAG,CAAC,CAAA;AACxC,IAAA,OAAOqD,MAAM,CAAA;AACf,GAAA;AAEAsD,EAAAA,gBAAgB,CACdtD,MAAa,EACbiD,aAA4B,EACZ;IAChB,OAAO,IAAI,CAACD,kBAAkB,CAAChD,MAAM,CAACpD,GAAG,EAAEqG,aAAa,CAAC,CAAA;AAC3D,GAAA;AAEAM,EAAAA,iBAAiB,CACf1F,QAAyB,EACzBoF,aAA4B,EACb;AACf,IAAA,OAAO,IAAI,CAAC5B,UAAU,CACnB7E,IAAI,CAAE6E,UAAU;AACf;AACAA,IAAAA,UAAU,CAACmC,UAAU,CAAC3F,QAAQ,EAAmBoF,aAAa,CAAQ,CACvE,CACAzG,IAAI,CAAC,MAASiH,SAAS,CAAC,CAAC;AAC9B,GAAA;;AAEAC,EAAAA,WAAW,CAAC/G,GAAa,EAAEkB,QAA0B,EAAiB;IACpE,OAAO,IAAI,CAACwD,UAAU,CACnB7E,IAAI,CAAE6E,UAAU,IACfA,UAAU,CAACsC,SAAS,CAAC;AAAE/G,MAAAA,GAAG,EAAED,GAAG;MAAE,GAAGkB,QAAAA;AAAS,KAAC,CAAkB,CACjE,CACArB,IAAI,CAAC,MAAMiH,SAAS,CAAC,CAAA;AAC1B,GAAA;EAEAE,SAAS,CAAC3D,MAAa,EAAiB;AACtC,IAAA,OAAO,IAAI,CAAC0D,WAAW,CAAC1D,MAAM,CAACpD,GAAG,CAAC,CAAA;AACrC,GAAA;EAEAgH,UAAU,CAACC,QAAyB,EAAiB;IACnD,OAAO,IAAI,CAACxC,UAAU,CACnB7E,IAAI,CAAE6E,UAAU,IAAKA,UAAU,CAACuC,UAAU,CAACC,QAAQ,CAAkB,CAAC,CACtErH,IAAI,CAAC,MAAMiH,SAAS,CAAC,CAAA;AAC1B,GAAA;EAEA,MAAMpH,KAAK,CAACsD,MAAwB,EAAmB;AACrD,IAAA,MAAM0B,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;AACxC,IAAA,OAAO1B,MAAM,GACT0B,UAAU,CAACyC,cAAc,CAACnE,MAAM,CAAkB,GAClD0B,UAAU,CAACyC,cAAc,EAAE,CAAA;AACjC,GAAA;AAEA,EAAA,MAAM3H,MAAM,CACVwD,MAAwB,EACxBf,IAAkB,EAC6B;AAC/C,IAAA,MAAMyC,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;AACxC,IAAA,MAAM0C,UAAU,GAAGpE,MAAM,GACrB0B,UAAU,CAAC2C,IAAI,CAASrE,MAAM,CAAkB,GAC/C0B,UAAU,CAAC2C,IAAI,EAAoC,CAAA;AACxD,IAAA,IAAIpF,IAAI,EAAEmF,UAAU,CAACnF,IAAI,CAACA,IAAI,CAAC,CAAA;AAC/B,IAAA,OAAO,IAAI7C,WAAW,CAA0B,IAAI,EAAEgI,UAAU,CAAC,CAAA;AACnE,GAAA;AAEA,EAAA,MAAMV,SAAS,CACb1G,GAAa,EACbkB,QAA0B,EACE;AAC5B,IAAA,MAAMwD,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;AACxC,IAAA,MAAMpE,MAAM,GAAG,MAAMoE,UAAU,CAAC4C,OAAO,CAAQ;AAC7CrH,MAAAA,GAAG,EAAED,GAAG;MACR,GAAGkB,QAAAA;AACL,KAAC,CAAkB,CAAA;IACnB,OAAOZ,MAAM,IAAIwG,SAAS,CAAA;AAC5B,GAAA;AAEAS,EAAAA,OAAO,CAACrG,QAA0B,EAAEe,IAAkB,EAAoB;AACxE,IAAA,OAAO,IAAI,CAACzC,MAAM,CAAQ0B,QAAQ,EAAEe,IAAI,CAAC,CAACpC,IAAI,CAAEL,MAAM,IACpDA,MAAM,CAACiB,OAAO,EAAE,CACjB,CAAA;AACH,GAAA;AAEA,EAAA,MAAM6G,OAAO,CACXtE,MAAuB,EACvBf,IAAkB,EACU;AAC5B,IAAA,MAAMyC,UAAU,GAAG,MAAM,IAAI,CAACA,UAAU,CAAA;IACxC,MAAMpE,MAAM,GAAG,MAAMoE,UAAU,CAAC4C,OAAO,CAAQtE,MAAM,EAAmB;AACtEf,MAAAA,IAAAA;AACF,KAAC,CAAC,CAAA;IACF,OAAO3B,MAAM,IAAIwG,SAAS,CAAA;AAC5B,GAAA;AACF;;ACxSA,MAAMU,MAAM,GAAG,IAAIC,MAAM,CAAC,4BAA4B,CAAC,CAAA;AAExC,MAAMC,eAAe,SAASC,kBAAkB,CAAC;AAO9D;EACArI,WAAW,CAACsI,MAAoC,EAAE;AAChD,IAAA,KAAK,EAAE,CAAA;AAEP,IAAA,IAAI,CAACA,MAAM,CAACC,GAAG,CAAC,MAAM,CAAC,EAAE;AACvBD,MAAAA,MAAM,CAACE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AACjC,KAAA;AACA,IAAA,IAAI,CAACF,MAAM,CAACC,GAAG,CAAC,MAAM,CAAC,EAAE;AACvBD,MAAAA,MAAM,CAACE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC7B,KAAA;AACA,IAAA,IAAI,CAACF,MAAM,CAACC,GAAG,CAAC,UAAU,CAAC,EAAE;AAC3B,MAAA,MAAM,IAAItH,KAAK,CAAC,yBAAyB,CAAC,CAAA;AAC5C,KAAA;AAEA,IAAA,MAAMwH,qBAAqB,GAAIC,iBAA0B,IACtD,aACCJ,MAAM,CAACC,GAAG,CAAC,MAAM,CAAC,GACb,CACCG,EAAAA,iBAAiB,GACZ,CAAGJ,EAAAA,MAAM,CAACK,GAAG,CAAC,MAAM,CAAC,CAAYC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAE,YAAW,GACxDN,MAAM,CAACK,GAAG,CAAC,MAAM,CACvB,CACCD,CAAAA,EAAAA,iBAAiB,GACb,YAAY,GACXJ,MAAM,CAACK,GAAG,CAAC,UAAU,CAC3B,GAAE,GACH,EACL,CAAC,CAAA,GACD,GAAEL,MAAM,CAACK,GAAG,CAAC,MAAM,CAAY,CAAA,CAAA,EAAGL,MAAM,CAACK,GAAG,CAAC,MAAM,CAAY,CAAA,CAAA,EAC9DL,MAAM,CAACK,GAAG,CAAC,UAAU,CACtB,CAAC,CAAA,CAAA;AAEJ,IAAA,MAAME,gBAAgB,GAAGJ,qBAAqB,CAAC,KAAK,CAAC,CAAA;AACrD,IAAA,MAAMK,wBAAwB,GAAGL,qBAAqB,CAAC,IAAI,CAAC,CAAA;AAE5D,IAAA,IAAI,CAACM,OAAO,CAACF,gBAAgB,EAAEC,wBAAwB,CAAC,CAAA;AAC1D,GAAA;AAEAC,EAAAA,OAAO,CAACF,gBAAwB,EAAEC,wBAAgC,EAAQ;AACxEZ,IAAAA,MAAM,CAACxF,IAAI,CAAC,YAAY,EAAE;AAAEoG,MAAAA,wBAAAA;AAAyB,KAAC,CAAC,CAAA;AAEvD,IAAA,MAAME,cAAc,GAAGrD,OAAO,CAACsD,WAAW,CAACF,OAAO,CAACF,gBAAgB,CAAC,CACjEtI,IAAI,CAAEuE,UAAU,IAAK;AACpBoD,MAAAA,MAAM,CAACxF,IAAI,CAAC,WAAW,EAAE;AAAEoG,QAAAA,wBAAAA;AAAyB,OAAC,CAAC,CAAA;AACtDhE,MAAAA,UAAU,CAACoE,EAAE,CAAC,OAAO,EAAE,MAAM;AAC3BhB,QAAAA,MAAM,CAACiB,IAAI,CAAC,OAAO,EAAE;AAAEL,UAAAA,wBAAAA;AAAyB,SAAC,CAAC,CAAA;QAClD,IAAI,CAACvD,gBAAgB,GAAG,IAAI,CAAA;QAC5B,IAAI,CAACN,aAAa,GAAG,MAAM;AACzB,UAAA,MAAM,IAAIhE,KAAK,CAAC,2BAA2B,CAAC,CAAA;SAC7C,CAAA;AACH,OAAC,CAAC,CAAA;AACF6D,MAAAA,UAAU,CAACoE,EAAE,CAAC,SAAS,EAAE,MAAM;AAC7BhB,QAAAA,MAAM,CAACiB,IAAI,CAAC,SAAS,EAAE;AAAEL,UAAAA,wBAAAA;AAAyB,SAAC,CAAC,CAAA;QACpD,IAAI,CAACvD,gBAAgB,GAAG,IAAI,CAAA;QAC5B,IAAI,CAACN,aAAa,GAAG,MAAM;AACzB,UAAA,MAAM,IAAIhE,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAC9C,CAAA;AACH,OAAC,CAAC,CAAA;AACF6D,MAAAA,UAAU,CAACoE,EAAE,CAAC,WAAW,EAAE,MAAM;AAC/BhB,QAAAA,MAAM,CAACiB,IAAI,CAAC,WAAW,EAAE;AAAEL,UAAAA,wBAAAA;AAAyB,SAAC,CAAC,CAAA;QACtD,IAAI,CAACvD,gBAAgB,GAAG,KAAK,CAAA;QAC7B,IAAI,CAACN,aAAa,GAAG,MAAMnE,OAAO,CAACC,OAAO,CAAC,IAAI,CAACqI,WAAW,CAAE,CAAA;AAC/D,OAAC,CAAC,CAAA;AACFtE,MAAAA,UAAU,CAACoE,EAAE,CAAC,OAAO,EAAG7D,GAAG,IAAK;AAC9B6C,QAAAA,MAAM,CAACiB,IAAI,CAAC,OAAO,EAAE;UAAEL,wBAAwB;AAAEzD,UAAAA,GAAAA;AAAI,SAAC,CAAC,CAAA;AACzD,OAAC,CAAC,CAAA;MAEF,IAAI,CAAC+D,WAAW,GAAGtE,UAAU,CAAA;MAC7B,IAAI,CAACuE,WAAW,GAAG7B,SAAS,CAAA;MAC5B,IAAI,CAACvC,aAAa,GAAG,MAAMnE,OAAO,CAACC,OAAO,CAAC,IAAI,CAACqI,WAAW,CAAE,CAAA;AAC7D,MAAA,OAAOtE,UAAU,CAAA;AACnB,KAAC,CAAC,CACDwE,KAAK,CAAEjE,GAAG,IAAK;AACd6C,MAAAA,MAAM,CAACxF,IAAI,CAAC,eAAe,EAAE;AAAEoG,QAAAA,wBAAAA;AAAyB,OAAC,CAAC,CAAA;MAC1D5B,OAAO,CAACC,KAAK,CAAC9B,GAAG,CAACkE,OAAO,IAAIlE,GAAG,CAAC,CAAA;AACjC;MACAmE,OAAO,CAACC,QAAQ,CAAC,MAAM;AACrB;AACAD,QAAAA,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,OAAC,CAAC,CAAA;AAEF,MAAA,MAAMrE,GAAG,CAAA;AACX,KAAC,CAAC,CAAA;IAEJ,IAAI,CAACJ,aAAa,GAAG,MAAMnE,OAAO,CAACC,OAAO,CAACiI,cAAc,CAAC,CAAA;AAC1D,IAAA,IAAI,CAACK,WAAW,GAAG,IAAI,CAACpE,aAAa,EAAE,CAAA;AACzC,GAAA;AAEAA,EAAAA,aAAa,GAAiC;AAC5C,IAAA,MAAM,IAAIhE,KAAK,CAAC,gBAAgB,CAAC,CAAA;AACnC,GAAA;AAEA,EAAA,MAAMC,KAAK,GAAkB;AAC3B,IAAA,IAAI,CAAC+D,aAAa,GAAG,MAAMnE,OAAO,CAACwE,MAAM,CAAC,IAAIrE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACzE,IAAI,IAAI,CAACmI,WAAW,EAAE;AACpB,MAAA,MAAM,IAAI,CAACA,WAAW,CAAClI,KAAK,EAAE,CAAA;MAC9B,IAAI,CAACkI,WAAW,GAAG5B,SAAS,CAAA;AAC9B,KAAC,MAAM,IAAI,IAAI,CAAC6B,WAAW,EAAE;MAC3B,MAAM,IAAI,CAACA,WAAW,CAAA;MACtB,MAAM,IAAI,CAACnI,KAAK,EAAE,CAAA;AACpB,KAAA;AACF,GAAA;AACF;;ACzGe,SAASyI,yBAAyB,CAI/CC,UAAuC,EAQvC;AACA,EAAA,OAAO,IAAIC,cAAc,CAACD,UAAU,CAAC,CAAA;AACvC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "liwi-mongo",
|
|
3
|
-
"version": "10.
|
|
3
|
+
"version": "10.3.0",
|
|
4
4
|
"description": "mongo implementation for liwi",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"author": "Christophe Hurpeau <christophe@hurpeau.com> (https://christophe.hurpeau.com)",
|
|
@@ -48,16 +48,16 @@
|
|
|
48
48
|
]
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"liwi-store": "10.
|
|
52
|
-
"liwi-subscribe-store": "10.
|
|
53
|
-
"mingo": "^6.
|
|
54
|
-
"mongodb": "^4.
|
|
51
|
+
"liwi-store": "10.3.0",
|
|
52
|
+
"liwi-subscribe-store": "10.3.0",
|
|
53
|
+
"mingo": "^6.2.7",
|
|
54
|
+
"mongodb": "^4.13.0",
|
|
55
55
|
"nightingale-logger": "^13.0.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@babel/core": "7.20.12",
|
|
59
59
|
"pob-babel": "35.4.0",
|
|
60
|
-
"typescript": "4.9.
|
|
60
|
+
"typescript": "4.9.5"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "5272e0aea5248e0268aecdf8d55248ef596037c0"
|
|
63
63
|
}
|
package/src/MongoStore.ts
CHANGED
|
@@ -14,6 +14,7 @@ import type {
|
|
|
14
14
|
} from 'liwi-store';
|
|
15
15
|
import type {
|
|
16
16
|
Collection,
|
|
17
|
+
Filter,
|
|
17
18
|
FindCursor,
|
|
18
19
|
MongoClient,
|
|
19
20
|
UpdateFilter,
|
|
@@ -134,7 +135,7 @@ export default class MongoStore<
|
|
|
134
135
|
if (!object.updated) object.updated = new Date();
|
|
135
136
|
|
|
136
137
|
const collection = await this.collection;
|
|
137
|
-
await collection.replaceOne({ _id: object._id } as
|
|
138
|
+
await collection.replaceOne({ _id: object._id } as Filter<Model>, object);
|
|
138
139
|
return object;
|
|
139
140
|
}
|
|
140
141
|
|
|
@@ -163,7 +164,8 @@ export default class MongoStore<
|
|
|
163
164
|
object: UpsertPartialObject<MongoKeyPath, KeyValue, Model, K>,
|
|
164
165
|
setOnInsertPartialObject?: Update<Model>['$setOnInsert'],
|
|
165
166
|
): Promise<MongoUpsertResult<KeyValue, Model>> {
|
|
166
|
-
const $setOnInsert = {
|
|
167
|
+
const $setOnInsert: Update<Model>['$setOnInsert'] = {
|
|
168
|
+
// @ts-expect-error -- created is Date as set in BaseModel
|
|
167
169
|
created: object.created || new Date(),
|
|
168
170
|
...setOnInsertPartialObject,
|
|
169
171
|
};
|
|
@@ -178,7 +180,7 @@ export default class MongoStore<
|
|
|
178
180
|
const collection = await this.collection;
|
|
179
181
|
|
|
180
182
|
const { upsertedCount } = await collection.updateOne(
|
|
181
|
-
{ _id: object._id } as
|
|
183
|
+
{ _id: object._id } as Filter<Model>,
|
|
182
184
|
{ $set, $setOnInsert } as UpdateFilter<Model>,
|
|
183
185
|
{ upsert: true },
|
|
184
186
|
);
|
|
@@ -201,7 +203,7 @@ export default class MongoStore<
|
|
|
201
203
|
): Promise<Model> {
|
|
202
204
|
const collection = await this.collection;
|
|
203
205
|
const commandResult = await collection.updateOne(
|
|
204
|
-
{ _id: key, ...criteria } as
|
|
206
|
+
{ _id: key, ...criteria } as Filter<Model>,
|
|
205
207
|
partialUpdate as UpdateFilter<Model>,
|
|
206
208
|
);
|
|
207
209
|
if (!commandResult.acknowledged) {
|
|
@@ -226,7 +228,7 @@ export default class MongoStore<
|
|
|
226
228
|
return this.collection
|
|
227
229
|
.then((collection) =>
|
|
228
230
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
229
|
-
collection.updateMany(criteria
|
|
231
|
+
collection.updateMany(criteria as Filter<Model>, partialUpdate as any),
|
|
230
232
|
)
|
|
231
233
|
.then((res) => undefined); // TODO return updated object
|
|
232
234
|
}
|
|
@@ -234,7 +236,7 @@ export default class MongoStore<
|
|
|
234
236
|
deleteByKey(key: KeyValue, criteria?: Criteria<Model>): Promise<void> {
|
|
235
237
|
return this.collection
|
|
236
238
|
.then((collection) =>
|
|
237
|
-
collection.deleteOne({ _id: key, ...criteria } as
|
|
239
|
+
collection.deleteOne({ _id: key, ...criteria } as Filter<Model>),
|
|
238
240
|
)
|
|
239
241
|
.then(() => undefined);
|
|
240
242
|
}
|
|
@@ -245,14 +247,14 @@ export default class MongoStore<
|
|
|
245
247
|
|
|
246
248
|
deleteMany(selector: Criteria<Model>): Promise<void> {
|
|
247
249
|
return this.collection
|
|
248
|
-
.then((collection) => collection.deleteMany(selector))
|
|
250
|
+
.then((collection) => collection.deleteMany(selector as Filter<Model>))
|
|
249
251
|
.then(() => undefined);
|
|
250
252
|
}
|
|
251
253
|
|
|
252
254
|
async count(filter?: Criteria<Model>): Promise<number> {
|
|
253
255
|
const collection = await this.collection;
|
|
254
256
|
return filter
|
|
255
|
-
? collection.countDocuments(filter)
|
|
257
|
+
? collection.countDocuments(filter as Filter<Model>)
|
|
256
258
|
: collection.countDocuments();
|
|
257
259
|
}
|
|
258
260
|
|
|
@@ -262,7 +264,7 @@ export default class MongoStore<
|
|
|
262
264
|
): Promise<MongoCursor<Model, Result, KeyValue>> {
|
|
263
265
|
const collection = await this.collection;
|
|
264
266
|
const findCursor = filter
|
|
265
|
-
? collection.find<Result>(filter)
|
|
267
|
+
? collection.find<Result>(filter as Filter<Model>)
|
|
266
268
|
: (collection.find() as unknown as FindCursor<Result>);
|
|
267
269
|
if (sort) findCursor.sort(sort);
|
|
268
270
|
return new MongoCursor<Model, Result, KeyValue>(this, findCursor);
|
|
@@ -276,7 +278,7 @@ export default class MongoStore<
|
|
|
276
278
|
const result = await collection.findOne<Model>({
|
|
277
279
|
_id: key,
|
|
278
280
|
...criteria,
|
|
279
|
-
} as
|
|
281
|
+
} as Filter<Model>);
|
|
280
282
|
return result || undefined;
|
|
281
283
|
}
|
|
282
284
|
|
|
@@ -291,7 +293,7 @@ export default class MongoStore<
|
|
|
291
293
|
sort?: Sort<Model>,
|
|
292
294
|
): Promise<Model | undefined> {
|
|
293
295
|
const collection = await this.collection;
|
|
294
|
-
const result = await collection.findOne<Model>(filter
|
|
296
|
+
const result = await collection.findOne<Model>(filter as Filter<Model>, {
|
|
295
297
|
sort,
|
|
296
298
|
});
|
|
297
299
|
return result || undefined;
|