@andrew_l/mongo-pagination 0.3.21 → 0.4.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.
Files changed (36) hide show
  1. package/dist/_chunks/QueryPaginator.d.mts +198 -0
  2. package/dist/_chunks/QueryPaginator.d.mts.map +1 -0
  3. package/dist/_chunks/withMongoosePagination.mjs +489 -0
  4. package/dist/_chunks/withMongoosePagination.mjs.map +1 -0
  5. package/dist/index.d.mts +13 -14
  6. package/dist/index.d.mts.map +1 -0
  7. package/dist/index.mjs +36 -46
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/mongoose-7.d.mts +9 -12
  10. package/dist/mongoose-7.d.mts.map +1 -0
  11. package/dist/mongoose-7.mjs +14 -27
  12. package/dist/mongoose-7.mjs.map +1 -1
  13. package/dist/mongoose-8.d.mts +9 -12
  14. package/dist/mongoose-8.d.mts.map +1 -0
  15. package/dist/mongoose-8.mjs +14 -27
  16. package/dist/mongoose-8.mjs.map +1 -1
  17. package/package.json +14 -11
  18. package/dist/index.cjs +0 -56
  19. package/dist/index.cjs.map +0 -1
  20. package/dist/index.d.cts +0 -150
  21. package/dist/index.d.ts +0 -150
  22. package/dist/mongoose-7.cjs +0 -36
  23. package/dist/mongoose-7.cjs.map +0 -1
  24. package/dist/mongoose-7.d.cts +0 -16
  25. package/dist/mongoose-7.d.ts +0 -16
  26. package/dist/mongoose-8.cjs +0 -36
  27. package/dist/mongoose-8.cjs.map +0 -1
  28. package/dist/mongoose-8.d.cts +0 -16
  29. package/dist/mongoose-8.d.ts +0 -16
  30. package/dist/shared/mongo-pagination.C762g8l8.mjs +0 -663
  31. package/dist/shared/mongo-pagination.C762g8l8.mjs.map +0 -1
  32. package/dist/shared/mongo-pagination.D7Mb8JCq.d.cts +0 -195
  33. package/dist/shared/mongo-pagination.D7Mb8JCq.d.mts +0 -195
  34. package/dist/shared/mongo-pagination.D7Mb8JCq.d.ts +0 -195
  35. package/dist/shared/mongo-pagination.DO2_rA5-.cjs +0 -676
  36. package/dist/shared/mongo-pagination.DO2_rA5-.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"mongo-pagination.C762g8l8.mjs","sources":["../../src/Token.ts","../../src/debug.ts","../../src/utils/object.ts","../../src/utils/sort.ts","../../src/utils/query.ts","../../src/QueryAdapterMongoose.ts","../../src/utils/streamFilter.ts","../../src/QueryPaginator.ts","../../src/withMongoosePagination.ts"],"sourcesContent":["import {\n CORE_TYPES,\n createExtension,\n defineStructure,\n} from '@andrew_l/tl-pack';\nimport { base62Fast, crc32 } from '@andrew_l/toolkit';\nimport { ObjectId } from 'mongodb';\n\nconst OBJECT_ID_TOKEN = 100;\n\nconst extensions = [\n createExtension(OBJECT_ID_TOKEN, {\n encode(value) {\n if (value?._bsontype?.toLowerCase() === 'objectid') {\n this.writeBytes(value.id);\n }\n },\n decode() {\n const bytes = this.readBytes();\n return new ObjectId(bytes);\n },\n }),\n];\n\nexport interface TokenOptions {\n /**\n * The schema version of the token.\n */\n schemaVersion: number;\n\n /**\n * The name of the model the token is related to.\n */\n modelName?: string;\n\n /**\n * The sorting direction used to building pagination query.\n */\n sortDirection?: Record<string, any>;\n\n /**\n * The values associated with sorting.\n * Used in conjunction with `sortDirection` to building range query.\n */\n sortValues?: Record<string, any>;\n\n /**\n * The payload of the token. Contains additional data or metadata (can be `null`).\n */\n payload: Record<string, any> | null;\n}\n\nconst TokenStructure = defineStructure({\n name: 'PaginationToken',\n version: 1,\n checksum: true,\n properties: {\n modelNameCrc: { type: CORE_TYPES.Int32, required: true },\n keys: { type: [String], required: true },\n sortDirection: { type: [null], required: true },\n sortValues: { type: [null], required: true },\n payload: { type: Object },\n },\n});\n\n/**\n * Represents a token with pagination and metadata information.\n * This class holds the token data, including sorting details, and any payload.\n */\nexport class Token {\n /**\n * The CRC of the model name, used for verify the model.\n */\n public modelNameCRC: number = 0;\n\n /**\n * The sorting direction used for pagination building pagination query.\n */\n public sortDirection: Record<string, any> = {};\n\n /**\n * The sorting values associated with the pagination.\n */\n public sortValues: Record<string, any> = {};\n\n /**\n * The payload of the token, which can contain any associated metadata or data (may be `null`).\n */\n public payload: Record<string, any> | null = null;\n\n constructor(options?: Partial<TokenOptions>) {\n if (options) {\n Object.assign(this, { ...options, modelName: undefined });\n\n if (options.modelName) {\n this.modelNameCRC = crc32(options.modelName);\n }\n }\n }\n\n /**\n * Retrieves the string representation of token.\n */\n public stringify(): string {\n return base62Fast.encode(this.buffer());\n }\n\n /**\n * Retrieves binary buffer representation of token.\n */\n public buffer(): Uint8Array {\n const struct = new TokenStructure({\n modelNameCrc: this.modelNameCRC,\n sortDirection: Object.values(this.sortDirection),\n sortValues: Object.values(this.sortValues),\n keys: Object.keys(this.sortValues),\n payload: this.payload,\n });\n\n return struct.toBuffer({ extensions });\n }\n\n /**\n * Encode token from provided value\n */\n static from(value: string | Buffer | Uint8Array): Token {\n const buffer =\n Buffer.isBuffer(value) || value instanceof Uint8Array\n ? value\n : base62Fast.decode(value);\n\n const struct = TokenStructure.fromBuffer(buffer);\n\n const token = new Token();\n\n token.modelNameCRC = struct.modelNameCrc;\n token.sortDirection = {};\n token.sortValues = {};\n token.payload = struct.payload ?? {};\n\n for (let idx = 0; idx < struct.keys.length; idx++) {\n token.sortValues[struct.keys[idx]] = struct.sortValues[idx];\n token.sortDirection[struct.keys[idx]] = struct.sortDirection[idx];\n }\n\n return token;\n }\n}\n\n/**\n * Parses a token from provided value.\n * @group Utils\n */\nexport function parseToken(value: string | Buffer): Token {\n return Token.from(value);\n}\n\n/**\n * Create a token with pagination and metadata information.\n * This holds the token data, including sorting details, and any payload.\n *\n * @group Utils\n */\nexport function createToken(options?: Partial<TokenOptions>): Token {\n return new Token(options);\n}\n","import d from 'debug';\n\nexport const debug = {\n init: d('mongo-pagination:init'),\n tweak: d('mongo-pagination:tweak'),\n exec: d('mongo-pagination:exec'),\n stream: d('mongo-pagination:query:stream'),\n};\n","import { intersection, isEmpty, isFunction, isObject } from '@andrew_l/toolkit';\n\nexport function isEmptyObject(obj: unknown): boolean {\n return !isObject(obj) || isEmpty(obj);\n}\n\n/**\n * Returns keys that existed in all provided objects.\n */\nexport function sameKeys(...args: object[]): string[] {\n return intersection(...args.map(v => Object.keys(v)));\n}\n\nexport function defineGetter(obj: object, key: string, getterFn: () => any) {\n // @ts-expect-error\n delete obj[key];\n\n Object.defineProperty(obj, key, {\n get: getterFn,\n enumerable: true,\n configurable: true,\n });\n}\n\nexport function isLastKeys(\n value: unknown,\n keys: string[],\n strictOrder?: boolean,\n) {\n const objKeys = isObject(value) ? Object.keys(value) : [];\n\n const lastKeys = objKeys.slice(-keys.length);\n\n if (lastKeys.length !== keys.length) {\n return false;\n }\n\n for (let idx = 0; idx < keys.length; idx++) {\n if (strictOrder) {\n if (lastKeys[idx] !== keys[idx]) {\n return false;\n }\n } else {\n if (!lastKeys.includes(keys[idx])) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nexport function toObject(value: any): any {\n return isFunction(value?.toObject) ? value?.toObject() : value;\n}\n","/**\n * Source: node-mongodb-native\n */\n\nimport {\n MongoInvalidArgumentError,\n type Sort,\n type SortDirection,\n} from 'mongodb';\n/** Below stricter types were created for sort that correspond with type that the cmd takes */\n\n/** @internal */\nexport type SortDirectionForCmd = 1 | -1 | { $meta: string };\n\n/** @internal */\nexport type SortForCmd = Map<string, SortDirectionForCmd>;\n\n/** @internal */\ntype SortPairForCmd = [string, SortDirectionForCmd];\n\n/** @internal */\nfunction prepareDirection(direction: any = 1): SortDirectionForCmd {\n const value = `${direction}`.toLowerCase();\n if (isMeta(direction)) return direction;\n switch (value) {\n case 'ascending':\n case 'asc':\n case '1':\n return 1;\n case 'descending':\n case 'desc':\n case '-1':\n return -1;\n default:\n throw new MongoInvalidArgumentError(\n `Invalid sort direction: ${JSON.stringify(direction)}`,\n );\n }\n}\n\n/** @internal */\nfunction isMeta(t: SortDirection): t is { $meta: string } {\n return (\n typeof t === 'object' &&\n t != null &&\n '$meta' in t &&\n typeof t.$meta === 'string'\n );\n}\n\n/** @internal */\nfunction isPair(t: Sort): t is [string, SortDirection] {\n if (Array.isArray(t) && t.length === 2) {\n try {\n prepareDirection(t[1]);\n return true;\n } catch {\n return false;\n }\n }\n return false;\n}\n\nfunction isDeep(t: Sort): t is [string, SortDirection][] {\n return Array.isArray(t) && Array.isArray(t[0]);\n}\n\nfunction isMap(t: Sort): t is Map<string, SortDirection> {\n return t instanceof Map && t.size > 0;\n}\n\n/** @internal */\nfunction pairToMap(v: [string, SortDirection]): SortForCmd {\n return new Map([[`${v[0]}`, prepareDirection([v[1]])]]);\n}\n\n/** @internal */\nfunction deepToMap(t: [string, SortDirection][]): SortForCmd {\n const sortEntries: SortPairForCmd[] = t.map(([k, v]) => [\n `${k}`,\n prepareDirection(v),\n ]);\n return new Map(sortEntries);\n}\n\n/** @internal */\nfunction stringsToMap(t: string[]): SortForCmd {\n const sortEntries: SortPairForCmd[] = t.map(key => [`${key}`, 1]);\n return new Map(sortEntries);\n}\n\n/** @internal */\nfunction objectToMap(t: { [key: string]: SortDirection }): SortForCmd {\n const sortEntries: SortPairForCmd[] = Object.entries(t).map(([k, v]) => [\n `${k}`,\n prepareDirection(v),\n ]);\n return new Map(sortEntries);\n}\n\n/** @internal */\nfunction mapToMap(t: Map<string, SortDirection>): SortForCmd {\n const sortEntries: SortPairForCmd[] = Array.from(t).map(([k, v]) => [\n `${k}`,\n prepareDirection(v),\n ]);\n return new Map(sortEntries);\n}\n\n/** converts a Sort type into a type that is valid for the server (SortForCmd) */\nexport function formatSort(\n sort: Sort | undefined,\n direction?: SortDirection,\n): SortForCmd | undefined {\n if (sort == null) return undefined;\n if (typeof sort === 'string')\n return new Map([[sort, prepareDirection(direction)]]);\n if (typeof sort !== 'object') {\n throw new MongoInvalidArgumentError(\n `Invalid sort format: ${JSON.stringify(sort)} Sort must be a valid object`,\n );\n }\n if (!Array.isArray(sort)) {\n return isMap(sort)\n ? mapToMap(sort)\n : Object.keys(sort).length\n ? objectToMap(sort)\n : undefined;\n }\n if (!sort.length) return undefined;\n if (isDeep(sort)) return deepToMap(sort);\n if (isPair(sort)) return pairToMap(sort);\n return stringsToMap(sort);\n}\n","import { deepClone, isNumber } from '@andrew_l/toolkit';\nimport { MongoInvalidArgumentError, type Sort } from 'mongodb';\nimport { debug } from '../debug';\nimport type { QueryAdapter } from '../QueryAdapter';\nimport type { Token } from '../Token';\nimport { isEmptyObject, isLastKeys, sameKeys } from './object';\nimport { type SortForCmd, formatSort } from './sort';\n\nconst DEF_LIMIT = 10;\n\n/**\n * Creates a range filter based on sorting direction and values.\n *\n * This function generates a range filter to be used in queries, typically for pagination,\n * based on the provided sorting direction (ascending or descending) and the sorting values (field names and values).\n *\n * @param sortDirection - The sorting direction, which could be ascending or descending.\n * @param sortValues - The sorting values, including field names and their respective values for sorting.\n * @returns A range filter object that can be used in MongoDB.\n *\n * @example\n * // Example usage\n * const sortDirection = { age: 1 };\n * const sortValues = { age: 30 };\n * const rangeFilter = createRangeFilter(sortDirection, sortValues);\n * console.log(rangeFilter);\n * // Output: { age: { $gt: 30 } }\n *\n * @group Utils\n */\nexport function createRangeFilter(\n sortDirection: Sort,\n sortValues: Record<string, any>,\n) {\n const sortCmd = formatSort(sortDirection) ?? ({} as SortForCmd);\n const keys: string[] = [];\n\n for (const [sortKey, sortValue] of sortCmd.entries()) {\n // skip unknown sort values\n if (sortValues[sortKey] === undefined) continue;\n\n // skip $meta sorting\n if (!isNumber(sortValue)) continue;\n\n keys.push(sortKey);\n }\n\n const op = (sortKey: string): string => {\n const direction = sortCmd.get(sortKey);\n return direction === 1 ? '$gt' : '$lt';\n };\n\n const val = (sortKey: string) => sortValues[sortKey];\n\n if (keys.length === 0) {\n return {};\n } else if (keys.length === 1) {\n const sortKey = keys[0];\n\n return {\n [sortKey]: {\n [op(sortKey)]: val(sortKey),\n },\n };\n }\n\n const $or = [];\n const keysAmount = keys.length;\n\n for (let i = 0; i < keysAmount; i++) {\n const sortKey = keys[i];\n\n if (i === 0) {\n $or.push({\n [sortKey]: { [op(sortKey)]: val(sortKey) },\n });\n } else {\n const filter: Record<string, any> = {};\n\n keys.slice(0, i).map(sortKey => {\n filter[sortKey] = { $eq: val(sortKey) };\n });\n\n const sortKey = keys[i];\n\n filter[sortKey] = {\n [op(sortKey)]: val(sortKey),\n };\n\n $or.push(filter);\n }\n }\n\n if ($or.length === 1) return $or[0];\n\n return { $or };\n}\n\n/**\n * Merges two MongoDB filters in the most effective way.\n *\n * This function combines two filters, prioritizing the most specific criteria\n * from both and ensuring the merged filter works efficiently for MongoDB queries.\n *\n * @param first - The first MongoDB filter object.\n * @param second - The second MongoDB filter object.\n * @returns The merged MongoDB filter object, combining both filters.\n *\n * @example\n * // Basic usage:\n * const filter1 = { status: 'active', age: { $gt: 18 } };\n * const filter2 = { age: { $lt: 60 }, country: 'USA' };\n *\n * const mergedFilter = mergeFilters(filter1, filter2);\n * console.log(mergedFilter);\n * // Output: { status: 'active', age: { $gt: 18, $lt: 60 }, country: 'USA' }\n *\n * @group Utils\n */\nexport function mergeFilters(\n first: Record<string, any>,\n second: Record<string, any>,\n): Record<string, any> {\n switch (true) {\n // Just return second\n case isEmptyObject(first):\n return deepClone(second);\n\n // Just return first\n case isEmptyObject(second):\n return deepClone(first);\n\n // Just assign when no conflicts\n case sameKeys(first, second).length === 0:\n return Object.assign(deepClone(first), deepClone(second));\n\n // Merge with $and way\n case Array.isArray(first.$and):\n first = deepClone(first);\n second = deepClone(second);\n\n if (Object.keys(second).length === 1 && second.$and) {\n first.$and.push(...second.$and);\n } else {\n first.$and.push(second);\n }\n\n return first;\n\n // Regular merge via $and wrapping\n default:\n return {\n $and: [deepClone(first), deepClone(second)],\n };\n }\n}\n\nexport interface TweakQueryOptions {\n query: QueryAdapter.QueryAdapter;\n paginationFields: string[];\n token?: Token;\n}\n\nexport function tweakQuery({\n paginationFields,\n token,\n query,\n}: TweakQueryOptions): string[] {\n let queryOptions = deepClone(query.getOptions());\n let queryFilter = deepClone(query.getFilter());\n\n paginationFields = deepClone(paginationFields);\n\n // transform original sort to plain object\n if (queryOptions.sort) {\n const sortMap = formatSort(queryOptions.sort);\n\n if (sortMap) {\n queryOptions.sort = Object.fromEntries(sortMap.entries());\n }\n }\n\n if (token) {\n // Replace sort way with previous options\n if (!isEmptyObject(token.sortDirection)) {\n debug.tweak(\n 'set from token [queryOptions.sort] = %o',\n token.sortDirection,\n );\n\n queryOptions.sort = token.sortDirection;\n }\n\n // Extend original filter with range conditions\n if (!isEmptyObject(token.sortValues)) {\n const rangeFilter = createRangeFilter(\n queryOptions.sort as Sort,\n token.sortValues,\n );\n\n debug.tweak(\n 'range conditions:\\n\\tsortDirection = %o\\n\\tsortValues = %o\\n\\tresult = %o',\n queryOptions.sort,\n token.sortValues,\n rangeFilter,\n );\n\n queryFilter = mergeFilters(queryFilter, rangeFilter);\n }\n }\n\n // Set default sort\n if (isEmptyObject(queryOptions.sort)) {\n queryOptions.sort = { _id: -1 };\n\n debug.tweak('set default [queryOptions.sort] = %o', queryOptions.sort);\n }\n\n // Set default pagination fields from query sort options\n if (!Array.isArray(paginationFields) || !paginationFields.length) {\n paginationFields = Object.keys(queryOptions.sort!);\n debug.tweak('set default [paginationFields] = %o', paginationFields);\n }\n\n // Pagination fields validation\n if (!isLastKeys(queryOptions.sort!, paginationFields)) {\n const expectedKeys = paginationFields.join(', ');\n\n throw new MongoInvalidArgumentError(\n `The query sort keys must ends with \"${expectedKeys}\".`,\n );\n }\n\n // Set default limit\n if (!queryOptions.limit) {\n queryOptions.limit = DEF_LIMIT + 1;\n debug.tweak('set default [queryOptions.limit] = %d', queryOptions.limit);\n } else {\n // Query one more element to see if there's another page\n queryOptions.limit = Math.max(queryOptions.limit || DEF_LIMIT, 1) + 1;\n }\n\n query.setOptions(queryOptions);\n query.setFilter(queryFilter);\n\n return paginationFields;\n}\n","import { cleanEmpty } from '@andrew_l/toolkit';\nimport type { Query } from 'mongoose';\nimport type { Readable } from 'node:stream';\nimport type { QueryAdapter } from './QueryAdapter';\n\ntype AnyQuery = Query<any, any>;\n\nexport class QueryAdapterMongoose<T = any>\n implements QueryAdapter.QueryAdapter<T>\n{\n constructor(private query: AnyQuery) {}\n\n getModelName(): string {\n return this.query.model.modelName;\n }\n\n getOptions(): QueryAdapter.Options {\n const options = this.query.getOptions();\n\n return {\n limit: options.limit,\n sort: options.sort,\n };\n }\n\n getFilter(): QueryAdapter.Filter {\n return this.query.getFilter();\n }\n\n setOptions({ limit, sort }: QueryAdapter.Options): void {\n this.query.setOptions(cleanEmpty({ limit, sort }));\n }\n\n setFilter(filter: QueryAdapter.Filter): void {\n this.query.setQuery(filter);\n }\n\n toArray(): Promise<T[]> {\n return this.query.exec();\n }\n\n stream(): Readable {\n return this.query.cursor();\n }\n}\n","import {\n Transform,\n type TransformCallback,\n type TransformOptions,\n} from 'node:stream';\n\ntype FilterFn<T> = (item: T, index: number) => boolean | Promise<boolean>;\n\nclass Filter<T = any> extends Transform {\n private _count = 0;\n\n constructor(\n private has: FilterFn<T>,\n options?: TransformOptions,\n ) {\n super({\n autoDestroy: true,\n objectMode: true,\n ...options,\n readableObjectMode: true,\n writableObjectMode: true,\n highWaterMark: 16,\n });\n\n this._count = -1;\n }\n\n _transform(chunk: T, encoding: BufferEncoding, next: TransformCallback) {\n const result = this.has(chunk, ++this._count);\n\n if (typeof result === 'boolean') {\n if (result) {\n return next(null, chunk);\n } else {\n return next();\n }\n }\n\n if ('then' in result) {\n return void result\n .then(r => {\n if (r) next(null, chunk);\n })\n .catch(next);\n }\n\n next();\n }\n}\n\nexport default function streamFilter<T = any>(\n fn: FilterFn<T>,\n options?: TransformOptions,\n) {\n return new Filter(fn, options);\n}\n","import Kareem from 'kareem';\nimport type internal from 'node:stream';\n\nimport { MongoInvalidArgumentError } from 'mongodb';\nimport { Token, createToken } from './Token';\n\nimport { debug } from './debug';\nimport { defineGetter, toObject } from './utils/object';\nimport { tweakQuery } from './utils/query';\nimport streamFilter from './utils/streamFilter';\n\nimport { crc32, pick, toError } from '@andrew_l/toolkit';\nimport type { QueryAdapter } from './QueryAdapter';\nimport { formatSort } from './utils/sort';\n\nexport interface QueryPaginatorOptions {\n /**\n * An optional list of fields used for building pagination query.\n */\n paginationFields?: string[];\n\n /**\n * The token to start the pagination from, if available.\n */\n next?: string | Buffer | null;\n\n /**\n * A callback function executed before the query is performed.\n */\n preQuery?: (this: QueryPaginator) => void;\n\n /**\n * A callback function executed after the query is performed.\n */\n postQuery?: (this: QueryPaginator) => void;\n\n /** @internal */\n debugQuery?: boolean;\n}\n\nexport interface QueryPaginatorMeta {\n /**\n * Indicates whether there is a next page available.\n */\n hasNext: boolean;\n\n /**\n * The token for the next page, or `null` if there is no next page.\n */\n next: string | null;\n}\n\nexport interface QueryPaginatorResult<T> {\n /**\n * The list of items for the current page.\n */\n items: T[];\n\n /**\n * Metadata providing information about pagination, such as whether more pages are available.\n */\n metadata: QueryPaginatorMeta;\n}\n\n/**\n * A generic class for handling query pagination.\n *\n * Look at `withMongoPagination` and `withMongoosePagination`\n *\n * @group Main\n */\nexport class QueryPaginator<T = any> {\n private hooks = new Kareem();\n private next: Token;\n private previous?: Token;\n private resHasNext = false;\n private resLastItem: any = null;\n private paginationFields: string[];\n private tweaked = false;\n private debugQuery = false;\n\n public getMetadata = () => this.metadata;\n\n constructor(\n private query: QueryAdapter.QueryAdapter,\n {\n paginationFields = [],\n postQuery,\n preQuery,\n next: previousToken,\n debugQuery = false,\n }: QueryPaginatorOptions = {},\n ) {\n this.paginationFields = paginationFields;\n this.debugQuery = debugQuery;\n\n this.next = createToken({\n modelName: query.getModelName(),\n sortDirection: {},\n sortValues: {},\n payload: {},\n });\n\n if (previousToken) {\n try {\n this.previous = Token.from(previousToken);\n this.paginationFields = Object.keys(this.previous.sortValues);\n\n debug.init('parse previous = %o', this.previous);\n debug.init(\n 'set from previous [paginationFields] = %o',\n this.paginationFields,\n );\n } catch (orignErr) {\n const err = new MongoInvalidArgumentError(\n 'Failed to parse next pagination cursor.',\n { cause: toError(orignErr) },\n );\n\n throw err;\n }\n\n // Compare the model name of next cursor\n const modelNameCRC = crc32(query.getModelName());\n\n debug.init(\n 'compare model name: previous = %d, query = %d',\n this.previous.modelNameCRC,\n modelNameCRC,\n );\n\n if (modelNameCRC !== this.previous.modelNameCRC) {\n throw new MongoInvalidArgumentError(\n 'The model name of next cursor token is not equal with query model name. Expected: ' +\n this.query.getModelName(),\n );\n }\n }\n\n if (preQuery) this.pre('query', preQuery);\n if (postQuery) this.post('query', postQuery);\n\n defineGetter(this.next, 'sortDirection', () => {\n const sortMap = formatSort(this.query.getOptions().sort);\n return sortMap ? Object.fromEntries(sortMap.entries()) : {};\n });\n\n defineGetter(this.next, 'sortValues', () => {\n if (!this.resLastItem) {\n return {};\n }\n\n return pick(this.resLastItem, this.paginationFields);\n });\n\n debug.init('with options = %o', arguments[1]);\n }\n\n /**\n * Retrieves metadata about the current state of pagination.\n */\n get metadata(): QueryPaginatorMeta {\n return {\n hasNext: this.hasNext,\n next: this.nextTokenString,\n };\n }\n\n /**\n * Indicates whether there is a next page available.\n */\n get hasNext(): boolean {\n return this.resHasNext;\n }\n\n /**\n * Retrieves the token for the next page.\n */\n get nextToken(): Token {\n return this.next;\n }\n\n /**\n * Retrieves the string representation of the next page token.\n * If there is no next page, returns `null`.\n */\n get nextTokenString(): string | null {\n if (!this.resHasNext) {\n return null;\n }\n\n return this.next.stringify();\n }\n\n /**\n * Retrieves the token for the previous page.\n */\n get prevToken(): Token | null {\n return this.previous || null;\n }\n\n /**\n * Retrieves the string representation of the previous page token.\n */\n get prevTokenString(): string | null {\n return this.previous ? this.previous.stringify() : null;\n }\n\n getQuery() {\n return this.query;\n }\n\n pre(hookName: string, fn: Function) {\n this.hooks.pre(hookName, fn);\n\n return this;\n }\n\n post(hookName: string, fn: Function) {\n this.hooks.post(hookName, fn);\n\n return this;\n }\n\n stream(): Promise<internal.Transform> {\n return new Promise((resolve, reject) => {\n this.hooks.execPre('query', this, [], (error: Error | null) => {\n if (error) return reject(error);\n\n try {\n this.maybeTweak();\n } catch (err) {\n return reject(err);\n }\n\n const limit = this.query.getOptions().limit;\n\n const filter = streamFilter<T>((item, index) => {\n // Remove the extra element that we added to 'peek' to see\n // if there were more entries.\n if (index + 1 === limit) {\n this.resHasNext = true;\n\n debug.stream(\n 'has next:\\n\\tcutoff_idx = %d\\n\\tnext = %j',\n index,\n this.next,\n );\n\n return false;\n } else {\n this.resLastItem = toObject(item);\n }\n\n return true;\n });\n\n const stream = this.query.stream().pipe(filter);\n\n resolve(stream);\n });\n });\n }\n\n /** @internal */\n maybeTweak() {\n if (!this.tweaked) {\n this.tweak();\n }\n\n return this;\n }\n\n /** @internal */\n tweak() {\n this.paginationFields = tweakQuery({\n query: this.query,\n paginationFields: this.paginationFields,\n token: this.previous,\n });\n\n this.tweaked = true;\n\n return this;\n }\n\n /** @internal */\n _handleResult(items: any[]): QueryPaginatorResult<any> {\n const limit = this.query.getOptions().limit!;\n\n if (items.length === limit) {\n // Remove the extra element that we added to 'peek' to see\n // if there were more entries.\n items.pop();\n\n this.resHasNext = true;\n }\n\n this.resLastItem = toObject(items.at(-1));\n\n if (this.resHasNext) {\n debug.exec(\n 'has next:\\n\\tcutoff_idx = %d\\n\\tnext = %j',\n limit - 1,\n this.next,\n );\n }\n\n const metadata = this.getMetadata();\n\n return { metadata, items };\n }\n\n /**\n * Executes the query and returns the results along with pagination metadata.\n */\n exec(): Promise<QueryPaginatorResult<T>> {\n return new Promise((resolve, reject) => {\n this.hooks.execPre('query', this, [], (preHookErr: any) => {\n if (preHookErr) {\n return reject(preHookErr);\n }\n\n if (this.debugQuery) {\n console.info('pre tweak', {\n queryFilter: this.query.getFilter(),\n getOptions: this.query.getOptions(),\n prevToken: this.prevToken,\n });\n }\n\n this.maybeTweak();\n\n if (this.debugQuery) {\n console.info('post tweak', {\n queryFilter: this.query.getFilter(),\n getOptions: this.query.getOptions(),\n prevToken: this.prevToken,\n });\n }\n\n this.query\n .toArray()\n .then(items => {\n const result = this._handleResult(items);\n\n this.hooks.execPost('query', this, [], (postHookErr: any) => {\n if (postHookErr) {\n return reject(postHookErr);\n }\n\n return resolve(result);\n });\n })\n .catch(reject);\n });\n });\n }\n\n then = ((onfulfilled, onrejected) =>\n this.exec().then(onfulfilled, onrejected)) as Promise<\n QueryPaginatorResult<T>\n >['then'];\n\n cath = (onrejected => this.exec().catch(onrejected)) as Promise<\n QueryPaginatorResult<T>\n >['catch'];\n\n finally = (onfinally => this.exec().finally(onfinally)) as Promise<\n QueryPaginatorResult<T>\n >['finally'];\n}\n","import type { Query } from 'mongoose';\nimport { QueryAdapterMongoose } from './QueryAdapterMongoose';\nimport { QueryPaginator, type QueryPaginatorOptions } from './QueryPaginator';\n\ntype AnyQuery = Query<any, any>;\n\ntype ExtractDocType<T> = T extends Query<infer X, any> ? X : never;\n\n/**\n * Enhances a Mongoose query with pagination capabilities.\n *\n * @param query - The Mongoose query to be paginated.\n * @param [options] - Optional configuration for pagination.\n *\n * @example\n * // Basic usage with a Mongoose query:\n * import { withMongoosePagination } from './pagination';\n * import mongoose from 'mongoose';\n *\n * async function paginateMongooseQuery() {\n * const User = mongoose.model('User', new mongoose.Schema({ name: String, status: String }));\n *\n * const query = User.find({ status: 'active' });\n *\n * const paginator = withMongoosePagination(query, {\n * paginationFields: ['_id'],\n * next: null,\n * });\n *\n * const result = await paginator.exec();\n * console.log(result.items); // Logs the items for the current page\n * console.log(result.metadata); // Logs pagination metadata\n * }\n *\n * @example\n * // Using custom preQuery and postQuery callbacks:\n * const paginator = withMongoosePagination(query, {\n * preQuery: function () {\n * console.log('Before executing the query');\n * },\n * postQuery: function () {\n * console.log('After executing the query');\n * },\n * });\n *\n * const result = await paginator.exec();\n * console.log(result.items); // Logs items for the current page\n * console.log(result.metadata); // Logs pagination metadata\n *\n * @group Main\n */\nexport function withMongoosePagination<T extends AnyQuery>(\n query: T,\n options?: QueryPaginatorOptions,\n): QueryPaginator<ExtractDocType<T>> {\n const adapter = new QueryAdapterMongoose(query);\n const pagin = new QueryPaginator(adapter, options);\n\n return pagin;\n}\n"],"names":["sortKey"],"mappings":";;;;;;;AAQA,MAAM,eAAA,GAAkB,GAAA;AAExB,MAAM,UAAA,GAAa;AAAA,EACjB,gBAAgB,eAAA,EAAiB;AAAA,IAC/B,OAAO,KAAA,EAAO;AACZ,MAAA,IAAI,KAAA,EAAO,SAAA,EAAW,WAAA,EAAY,KAAM,UAAA,EAAY;AAClD,QAAA,IAAA,CAAK,UAAA,CAAW,MAAM,EAAE,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AAAA,IACA,MAAA,GAAS;AACP,MAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC7B,MAAA,OAAO,IAAI,SAAS,KAAK,CAAA;AAAA,IAC3B;AAAA,GACD;AACH,CAAA;AA8BA,MAAM,iBAAiB,eAAA,CAAgB;AAAA,EACrC,IAAA,EAAM,iBAAA;AAAA,EACN,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,IAAA;AAAA,EACV,UAAA,EAAY;AAAA,IACV,cAAc,EAAE,IAAA,EAAM,UAAA,CAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,IACvD,MAAM,EAAE,IAAA,EAAM,CAAC,MAAM,CAAA,EAAG,UAAU,IAAA,EAAK;AAAA,IACvC,eAAe,EAAE,IAAA,EAAM,CAAC,IAAI,CAAA,EAAG,UAAU,IAAA,EAAK;AAAA,IAC9C,YAAY,EAAE,IAAA,EAAM,CAAC,IAAI,CAAA,EAAG,UAAU,IAAA,EAAK;AAAA,IAC3C,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA;AAAO;AAE5B,CAAC,CAAA;AAMM,MAAM,KAAA,CAAM;AAAA;AAAA;AAAA;AAAA,EAIV,YAAA,GAAuB,CAAA;AAAA;AAAA;AAAA;AAAA,EAKvB,gBAAqC,EAAC;AAAA;AAAA;AAAA;AAAA,EAKtC,aAAkC,EAAC;AAAA;AAAA;AAAA;AAAA,EAKnC,OAAA,GAAsC,IAAA;AAAA,EAE7C,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,OAAO,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,SAAA,EAAW,QAAW,CAAA;AAExD,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,SAAA,GAAoB;AACzB,IAAA,OAAO,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKO,MAAA,GAAqB;AAC1B,IAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe;AAAA,MAChC,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,aAAA,EAAe,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAAA,MAC/C,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,MACzC,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AAAA,MACjC,SAAS,IAAA,CAAK;AAAA,KACf,CAAA;AAED,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,EAAE,UAAA,EAAY,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAK,KAAA,EAA4C;AACtD,IAAA,MAAM,MAAA,GACJ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,iBAAiB,UAAA,GACvC,KAAA,GACA,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA;AAE7B,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,UAAA,CAAW,MAAM,CAAA;AAE/C,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,EAAM;AAExB,IAAA,KAAA,CAAM,eAAe,MAAA,CAAO,YAAA;AAC5B,IAAA,KAAA,CAAM,gBAAgB,EAAC;AACvB,IAAA,KAAA,CAAM,aAAa,EAAC;AACpB,IAAA,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,EAAC;AAEnC,IAAA,KAAA,IAAS,MAAM,CAAA,EAAG,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAA,EAAO;AACjD,MAAA,KAAA,CAAM,UAAA,CAAW,OAAO,IAAA,CAAK,GAAG,CAAC,CAAA,GAAI,MAAA,CAAO,WAAW,GAAG,CAAA;AAC1D,MAAA,KAAA,CAAM,aAAA,CAAc,OAAO,IAAA,CAAK,GAAG,CAAC,CAAA,GAAI,MAAA,CAAO,cAAc,GAAG,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAMO,SAAS,WAAW,KAAA,EAA+B;AACxD,EAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;AAQO,SAAS,YAAY,OAAA,EAAwC;AAClE,EAAA,OAAO,IAAI,MAAM,OAAO,CAAA;AAC1B;;ACnKO,MAAM,KAAA,GAAQ;AAAA,EACnB,IAAA,EAAM,EAAE,uBAAuB,CAAA;AAAA,EAC/B,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,EACjC,IAAA,EAAM,EAAE,uBAAuB,CAAA;AAAA,EAC/B,MAAA,EAAQ,EAAE,+BAA+B;AAC3C,CAAA;;ACLO,SAAS,cAAc,GAAA,EAAuB;AACnD,EAAA,OAAO,CAAC,QAAA,CAAS,GAAG,CAAA,IAAK,QAAQ,GAAG,CAAA;AACtC;AAKO,SAAS,YAAY,IAAA,EAA0B;AACpD,EAAA,OAAO,YAAA,CAAa,GAAG,IAAA,CAAK,GAAA,CAAI,OAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AACtD;AAEO,SAAS,YAAA,CAAa,GAAA,EAAa,GAAA,EAAa,QAAA,EAAqB;AAE1E,EAAA,OAAO,IAAI,GAAG,CAAA;AAEd,EAAA,MAAA,CAAO,cAAA,CAAe,KAAK,GAAA,EAAK;AAAA,IAC9B,GAAA,EAAK,QAAA;AAAA,IACL,UAAA,EAAY,IAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GACf,CAAA;AACH;AAEO,SAAS,UAAA,CACd,KAAA,EACA,IAAA,EACA,WAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAU,SAAS,KAAK,CAAA,GAAI,OAAO,IAAA,CAAK,KAAK,IAAI,EAAC;AAExD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAC,KAAK,MAAM,CAAA;AAE3C,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,QAAQ,GAAA,EAAA,EAAO;AAC1C,IAIO;AACL,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAiB;AACxC,EAAA,OAAO,WAAW,KAAA,EAAO,QAAQ,CAAA,GAAI,KAAA,EAAO,UAAS,GAAI,KAAA;AAC3D;;ACjCA,SAAS,gBAAA,CAAiB,YAAiB,CAAA,EAAwB;AACjE,EAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,SAAS,CAAA,CAAA,CAAG,WAAA,EAAY;AACzC,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG,OAAO,SAAA;AAC9B,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,WAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,GAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,YAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,OAAO,EAAA;AAAA,IACT;AACE,MAAA,MAAM,IAAI,yBAAA;AAAA,QACR,CAAA,wBAAA,EAA2B,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,OACtD;AAAA;AAEN;AAGA,SAAS,OAAO,CAAA,EAA0C;AACxD,EAAA,OACE,OAAO,MAAM,QAAA,IACb,CAAA,IAAK,QACL,OAAA,IAAW,CAAA,IACX,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA;AAEvB;AAGA,SAAS,OAAO,CAAA,EAAuC;AACrD,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACtC,IAAA,IAAI;AACF,MAAA,gBAAA,CAAiB,CAAA,CAAE,CAAC,CAAC,CAAA;AACrB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,OAAO,CAAA,EAAyC;AACvD,EAAA,OAAO,KAAA,CAAM,QAAQ,CAAC,CAAA,IAAK,MAAM,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAC,CAAA;AAC/C;AAEA,SAAS,MAAM,CAAA,EAA0C;AACvD,EAAA,OAAO,CAAA,YAAa,GAAA,IAAO,CAAA,CAAE,IAAA,GAAO,CAAA;AACtC;AAGA,SAAS,UAAU,CAAA,EAAwC;AACzD,EAAA,2BAAW,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA,CAAA,EAAI,gBAAA,CAAiB,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACxD;AAGA,SAAS,UAAU,CAAA,EAA0C;AAC3D,EAAA,MAAM,cAAgC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAAA,IACtD,GAAG,CAAC,CAAA,CAAA;AAAA,IACJ,iBAAiB,CAAC;AAAA,GACnB,CAAA;AACD,EAAA,OAAO,IAAI,IAAI,WAAW,CAAA;AAC5B;AAGA,SAAS,aAAa,CAAA,EAAyB;AAC7C,EAAA,MAAM,WAAA,GAAgC,EAAE,GAAA,CAAI,CAAA,GAAA,KAAO,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAC,CAAA;AAChE,EAAA,OAAO,IAAI,IAAI,WAAW,CAAA;AAC5B;AAGA,SAAS,YAAY,CAAA,EAAiD;AACpE,EAAA,MAAM,WAAA,GAAgC,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAAA,IACtE,GAAG,CAAC,CAAA,CAAA;AAAA,IACJ,iBAAiB,CAAC;AAAA,GACnB,CAAA;AACD,EAAA,OAAO,IAAI,IAAI,WAAW,CAAA;AAC5B;AAGA,SAAS,SAAS,CAAA,EAA2C;AAC3D,EAAA,MAAM,WAAA,GAAgC,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAAA,IAClE,GAAG,CAAC,CAAA,CAAA;AAAA,IACJ,iBAAiB,CAAC;AAAA,GACnB,CAAA;AACD,EAAA,OAAO,IAAI,IAAI,WAAW,CAAA;AAC5B;AAGO,SAAS,UAAA,CACd,MACA,SAAA,EACwB;AACxB,EAAA,IAAI,IAAA,IAAQ,MAAM,OAAO,MAAA;AACzB,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA;AAClB,IAAA,uBAAO,IAAI,IAAI,CAAC,CAAC,MAAM,gBAAA,CAAiB,SAAS,CAAC,CAAC,CAAC,CAAA;AACtD,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,yBAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,4BAAA;AAAA,KAC9C;AAAA,EACF;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,CAAA,GACb,QAAA,CAAS,IAAI,CAAA,GACb,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAChB,WAAA,CAAY,IAAI,CAAA,GAChB,MAAA;AAAA,EACR;AACA,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,MAAA;AACzB,EAAA,IAAI,MAAA,CAAO,IAAI,CAAA,EAAG,OAAO,UAAU,IAAI,CAAA;AACvC,EAAA,IAAI,MAAA,CAAO,IAAI,CAAA,EAAG,OAAO,UAAU,IAAI,CAAA;AACvC,EAAA,OAAO,aAAa,IAAI,CAAA;AAC1B;;AC7HA,MAAM,SAAA,GAAY,EAAA;AAsBX,SAAS,iBAAA,CACd,eACA,UAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,aAAa,CAAA,IAAM,EAAC;AAC/C,EAAA,MAAM,OAAiB,EAAC;AAExB,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,SAAS,CAAA,IAAK,OAAA,CAAQ,SAAQ,EAAG;AAEpD,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,KAAM,MAAA,EAAW;AAGvC,IAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,EAAG;AAE1B,IAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,EAAA,GAAK,CAAC,OAAA,KAA4B;AACtC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,OAAO,SAAA,KAAc,IAAI,KAAA,GAAQ,KAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,OAAA,KAAoB,UAAA,CAAW,OAAO,CAAA;AAEnD,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAC;AAAA,EACV,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,IAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AAEtB,IAAA,OAAO;AAAA,MACL,CAAC,OAAO,GAAG;AAAA,QACT,CAAC,EAAA,CAAG,OAAO,CAAC,GAAG,IAAI,OAAO;AAAA;AAC5B,KACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAM,EAAC;AACb,EAAA,MAAM,aAAa,IAAA,CAAK,MAAA;AAExB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AAEtB,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,CAAC,OAAO,GAAG,EAAE,CAAC,EAAA,CAAG,OAAO,CAAC,GAAG,GAAA,CAAI,OAAO,CAAA;AAAE,OAC1C,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,SAA8B,EAAC;AAErC,MAAA,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAAA,QAAAA,KAAW;AAC9B,QAAA,MAAA,CAAOA,QAAO,CAAA,GAAI,EAAE,GAAA,EAAK,GAAA,CAAIA,QAAO,CAAA,EAAE;AAAA,MACxC,CAAC,CAAA;AAED,MAAA,MAAMA,QAAAA,GAAU,KAAK,CAAC,CAAA;AAEtB,MAAA,MAAA,CAAOA,QAAO,CAAA,GAAI;AAAA,QAChB,CAAC,EAAA,CAAGA,QAAO,CAAC,GAAG,IAAIA,QAAO;AAAA,OAC5B;AAEA,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,IAAI,CAAC,CAAA;AAElC,EAAA,OAAO,EAAE,GAAA,EAAI;AACf;AAuBO,SAAS,YAAA,CACd,OACA,MAAA,EACqB;AACrB,EAAA,QAAQ,IAAA;AAAM;AAAA,IAEZ,KAAK,cAAc,KAAK,CAAA;AACtB,MAAA,OAAO,UAAU,MAAM,CAAA;AAAA;AAAA,IAGzB,KAAK,cAAc,MAAM,CAAA;AACvB,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA;AAAA,IAGxB,KAAK,QAAA,CAAS,KAAA,EAAO,MAAM,EAAE,MAAA,KAAW,CAAA;AACtC,MAAA,OAAO,OAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA;AAAA,IAG1D,KAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,KAAA,GAAQ,UAAU,KAAK,CAAA;AACvB,MAAA,MAAA,GAAS,UAAU,MAAM,CAAA;AAEzB,MAAA,IAAI,OAAO,IAAA,CAAK,MAAM,EAAE,MAAA,KAAW,CAAA,IAAK,OAAO,IAAA,EAAM;AACnD,QAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,MAAA,CAAO,IAAI,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,MACxB;AAEA,MAAA,OAAO,KAAA;AAAA;AAAA,IAGT;AACE,MAAA,OAAO;AAAA,QACL,MAAM,CAAC,SAAA,CAAU,KAAK,CAAA,EAAG,SAAA,CAAU,MAAM,CAAC;AAAA,OAC5C;AAAA;AAEN;AAQO,SAAS,UAAA,CAAW;AAAA,EACzB,gBAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,IAAI,YAAA,GAAe,SAAA,CAAU,KAAA,CAAM,UAAA,EAAY,CAAA;AAC/C,EAAA,IAAI,WAAA,GAAc,SAAA,CAAU,KAAA,CAAM,SAAA,EAAW,CAAA;AAE7C,EAAA,gBAAA,GAAmB,UAAU,gBAAgB,CAAA;AAG7C,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AAE5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,YAAA,CAAa,IAAA,GAAO,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,EAAO;AAET,IAAA,IAAI,CAAC,aAAA,CAAc,KAAA,CAAM,aAAa,CAAA,EAAG;AACvC,MAAA,KAAA,CAAM,KAAA;AAAA,QACJ,yCAAA;AAAA,QACA,KAAA,CAAM;AAAA,OACR;AAEA,MAAA,YAAA,CAAa,OAAO,KAAA,CAAM,aAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,CAAC,aAAA,CAAc,KAAA,CAAM,UAAU,CAAA,EAAG;AACpC,MAAA,MAAM,WAAA,GAAc,iBAAA;AAAA,QAClB,YAAA,CAAa,IAAA;AAAA,QACb,KAAA,CAAM;AAAA,OACR;AAEA,MAAA,KAAA,CAAM,KAAA;AAAA,QACJ,wEAAA;AAAA,QACA,YAAA,CAAa,IAAA;AAAA,QACb,KAAA,CAAM,UAAA;AAAA,QACN;AAAA,OACF;AAEA,MAAA,WAAA,GAAc,YAAA,CAAa,aAAa,WAAW,CAAA;AAAA,IACrD;AAAA,EACF;AAGA,EAAA,IAAI,aAAA,CAAc,YAAA,CAAa,IAAI,CAAA,EAAG;AACpC,IAAA,YAAA,CAAa,IAAA,GAAO,EAAE,GAAA,EAAK,EAAA,EAAG;AAE9B,IAAA,KAAA,CAAM,KAAA,CAAM,sCAAA,EAAwC,YAAA,CAAa,IAAI,CAAA;AAAA,EACvE;AAGA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,gBAAgB,CAAA,IAAK,CAAC,iBAAiB,MAAA,EAAQ;AAChE,IAAA,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,IAAK,CAAA;AACjD,IAAA,KAAA,CAAM,KAAA,CAAM,uCAAuC,gBAAgB,CAAA;AAAA,EACrE;AAGA,EAAA,IAAI,CAAC,UAAA,CAAW,YAAA,CAAa,IAAA,EAAO,gBAAgB,CAAA,EAAG;AACrD,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAE/C,IAAA,MAAM,IAAI,yBAAA;AAAA,MACR,uCAAuC,YAAY,CAAA,EAAA;AAAA,KACrD;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,IAAA,YAAA,CAAa,QAAQ,SAAA,GAAY,CAAA;AACjC,IAAA,KAAA,CAAM,KAAA,CAAM,uCAAA,EAAyC,YAAA,CAAa,KAAK,CAAA;AAAA,EACzE,CAAA,MAAO;AAEL,IAAA,YAAA,CAAa,QAAQ,IAAA,CAAK,GAAA,CAAI,aAAa,KAAA,IAAS,SAAA,EAAW,CAAC,CAAA,GAAI,CAAA;AAAA,EACtE;AAEA,EAAA,KAAA,CAAM,WAAW,YAAY,CAAA;AAC7B,EAAA,KAAA,CAAM,UAAU,WAAW,CAAA;AAE3B,EAAA,OAAO,gBAAA;AACT;;AC/OO,MAAM,oBAAA,CAEb;AAAA,EACE,YAAoB,KAAA,EAAiB;AAAjB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAkB;AAAA,EAEtC,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAM,KAAA,CAAM,SAAA;AAAA,EAC1B;AAAA,EAEA,UAAA,GAAmC;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,UAAA,EAAW;AAEtC,IAAA,OAAO;AAAA,MACL,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ;AAAA,KAChB;AAAA,EACF;AAAA,EAEA,SAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,MAAM,SAAA,EAAU;AAAA,EAC9B;AAAA,EAEA,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAK,EAA+B;AACtD,IAAA,IAAA,CAAK,MAAM,UAAA,CAAW,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAAA,EACnD;AAAA,EAEA,UAAU,MAAA,EAAmC;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,MAAM,CAAA;AAAA,EAC5B;AAAA,EAEA,OAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,EAAO;AAAA,EAC3B;AACF;;ACpCA,MAAM,eAAwB,SAAA,CAAU;AAAA,EAGtC,WAAA,CACU,KACR,OAAA,EACA;AACA,IAAA,KAAA,CAAM;AAAA,MACJ,WAAA,EAAa,IAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MACZ,GAAG,OAAA;AAAA,MACH,kBAAA,EAAoB,IAAA;AAAA,MACpB,kBAAA,EAAoB,IAAA;AAAA,MACpB,aAAA,EAAe;AAAA,KAChB,CAAA;AAVO,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAYR,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AAAA,EAChB;AAAA,EAhBQ,MAAA,GAAS,CAAA;AAAA,EAkBjB,UAAA,CAAW,KAAA,EAAU,QAAA,EAA0B,IAAA,EAAyB;AACtE,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAE,KAAK,MAAM,CAAA;AAE5C,IAAA,IAAI,OAAO,WAAW,SAAA,EAAW;AAC/B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAAA,IACF;AAEA,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,OAAO,KAAK,MAAA,CACT,IAAA,CAAK,CAAA,CAAA,KAAK;AACT,QAAA,IAAI,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,MACzB,CAAC,CAAA,CACA,KAAA,CAAM,IAAI,CAAA;AAAA,IACf;AAEA,IAAA,IAAA,EAAK;AAAA,EACP;AACF;AAEA,SAAwB,YAAA,CACtB,IACA,OAAA,EACA;AACA,EAAA,OAAO,IAAI,MAAA,CAAO,EAAA,EAAI,OAAO,CAAA;AAC/B;;ACgBO,MAAM,cAAA,CAAwB;AAAA,EAYnC,YACU,KAAA,EACR;AAAA,IACE,mBAAmB,EAAC;AAAA,IACpB,SAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA,EAAM,aAAA;AAAA,IACN,UAAA,GAAa;AAAA,GACf,GAA2B,EAAC,EAC5B;AARQ,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AASR,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAA;AACxB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAElB,IAAA,IAAA,CAAK,OAAO,WAAA,CAAY;AAAA,MACtB,SAAA,EAAW,MAAM,YAAA,EAAa;AAAA,MAC9B,eAAe,EAAC;AAAA,MAChB,YAAY,EAAC;AAAA,MACb,SAAS;AAAC,KACX,CAAA;AAED,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AACxC,QAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAS,UAAU,CAAA;AAE5D,QAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,EAAuB,IAAA,CAAK,QAAQ,CAAA;AAC/C,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,2CAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACP;AAAA,MACF,SAAS,QAAA,EAAU;AACjB,QAAA,MAAM,MAAM,IAAI,yBAAA;AAAA,UACd,yCAAA;AAAA,UACA,EAAE,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAAE,SAC7B;AAEA,QAAA,MAAM,GAAA;AAAA,MACR;AAGA,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,YAAA,EAAc,CAAA;AAE/C,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,+CAAA;AAAA,QACA,KAAK,QAAA,CAAS,YAAA;AAAA,QACd;AAAA,OACF;AAEA,MAAA,IAAI,YAAA,KAAiB,IAAA,CAAK,QAAA,CAAS,YAAA,EAAc;AAC/C,QAAA,MAAM,IAAI,yBAAA;AAAA,UACR,oFAAA,GACE,IAAA,CAAK,KAAA,CAAM,YAAA;AAAa,SAC5B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,QAAQ,CAAA;AACxC,IAAA,IAAI,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA;AAE3C,IAAA,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,eAAA,EAAiB,MAAM;AAC7C,MAAA,MAAM,UAAU,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,IAAI,CAAA;AACvD,MAAA,OAAO,UAAU,MAAA,CAAO,WAAA,CAAY,QAAQ,OAAA,EAAS,IAAI,EAAC;AAAA,IAC5D,CAAC,CAAA;AAED,IAAA,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,MAAM;AAC1C,MAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,gBAAgB,CAAA;AAAA,IACrD,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,IAAA,CAAK,mBAAA,EAAqB,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EAC9C;AAAA,EApFQ,KAAA,GAAQ,IAAI,MAAA,EAAO;AAAA,EACnB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,WAAA,GAAmB,IAAA;AAAA,EACnB,gBAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,UAAA,GAAa,KAAA;AAAA,EAEd,WAAA,GAAc,MAAM,IAAA,CAAK,QAAA;AAAA;AAAA;AAAA;AAAA,EAgFhC,IAAI,QAAA,GAA+B;AACjC,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,eAAA,GAAiC;AACnC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,KAAK,SAAA,EAAU;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAA0B;AAC5B,IAAA,OAAO,KAAK,QAAA,IAAY,IAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAA,GAAiC;AACnC,IAAA,OAAO,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,WAAU,GAAI,IAAA;AAAA,EACrD;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,GAAA,CAAI,UAAkB,EAAA,EAAc;AAClC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AAE3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAAK,UAAkB,EAAA,EAAc;AACnC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AAE5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAAsC;AACpC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,OAAA,EAAS,MAAM,EAAC,EAAG,CAAC,KAAA,KAAwB;AAC7D,QAAA,IAAI,KAAA,EAAO,OAAO,MAAA,CAAO,KAAK,CAAA;AAE9B,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,UAAA,EAAW;AAAA,QAClB,SAAS,GAAA,EAAK;AACZ,UAAA,OAAO,OAAO,GAAG,CAAA;AAAA,QACnB;AAEA,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,EAAW,CAAE,KAAA;AAEtC,QAAA,MAAM,MAAA,GAAS,YAAA,CAAgB,CAAC,IAAA,EAAM,KAAA,KAAU;AAG9C,UAAA,IAAI,KAAA,GAAQ,MAAM,KAAA,EAAO;AACvB,YAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAElB,YAAA,KAAA,CAAM,MAAA;AAAA,cACJ,yCAAA;AAAA,cACA,KAAA;AAAA,cACA,IAAA,CAAK;AAAA,aACP;AAEA,YAAA,OAAO,KAAA;AAAA,UACT,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,WAAA,GAAc,SAAS,IAAI,CAAA;AAAA,UAClC;AAEA,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAED,QAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,CAAE,KAAK,MAAM,CAAA;AAE9C,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,UAAA,GAAa;AACX,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAQ;AACN,IAAA,IAAA,CAAK,mBAAmB,UAAA,CAAW;AAAA,MACjC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAEf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,cAAc,KAAA,EAAyC;AACrD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,EAAW,CAAE,KAAA;AAEtC,IAAA,IAAI,KAAA,CAAM,WAAW,KAAA,EAAO;AAG1B,MAAA,KAAA,CAAM,GAAA,EAAI;AAEV,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,EAAA,CAAG,EAAE,CAAC,CAAA;AAExC,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,yCAAA;AAAA,QACA,KAAA,GAAQ,CAAA;AAAA,QACR,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAElC,IAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAyC;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,OAAA,EAAS,MAAM,EAAC,EAAG,CAAC,UAAA,KAAoB;AACzD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAO,OAAO,UAAU,CAAA;AAAA,QAC1B;AAEA,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,OAAA,CAAQ,KAAK,WAAA,EAAa;AAAA,YACxB,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AAAA,YAClC,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,UAAA,EAAW;AAAA,YAClC,WAAW,IAAA,CAAK;AAAA,WACjB,CAAA;AAAA,QACH;AAEA,QAAA,IAAA,CAAK,UAAA,EAAW;AAEhB,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,OAAA,CAAQ,KAAK,YAAA,EAAc;AAAA,YACzB,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AAAA,YAClC,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,UAAA,EAAW;AAAA,YAClC,WAAW,IAAA,CAAK;AAAA,WACjB,CAAA;AAAA,QACH;AAEA,QAAA,IAAA,CAAK,KAAA,CACF,OAAA,EAAQ,CACR,IAAA,CAAK,CAAA,KAAA,KAAS;AACb,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAEvC,UAAA,IAAA,CAAK,MAAM,QAAA,CAAS,OAAA,EAAS,MAAM,EAAC,EAAG,CAAC,WAAA,KAAqB;AAC3D,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,OAAO,OAAO,WAAW,CAAA;AAAA,YAC3B;AAEA,YAAA,OAAO,QAAQ,MAAM,CAAA;AAAA,UACvB,CAAC,CAAA;AAAA,QACH,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,CAAA;AAAA,MACjB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,IAAA,GAAQ,CAAC,WAAA,EAAa,UAAA,KACpB,KAAK,IAAA,EAAK,CAAE,IAAA,CAAK,WAAA,EAAa,UAAU,CAAA;AAAA,EAI1C,OAAQ,CAAA,UAAA,KAAc,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,UAAU,CAAA;AAAA,EAIlD,UAAW,CAAA,SAAA,KAAa,IAAA,CAAK,IAAA,EAAK,CAAE,QAAQ,SAAS,CAAA;AAGvD;;AChUO,SAAS,sBAAA,CACd,OACA,OAAA,EACmC;AACnC,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,KAAK,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAEjD,EAAA,OAAO,KAAA;AACT;;;;"}
@@ -1,195 +0,0 @@
1
- import internal, { Readable } from 'node:stream';
2
- import { Sort } from 'mongodb';
3
-
4
- interface TokenOptions {
5
- /**
6
- * The schema version of the token.
7
- */
8
- schemaVersion: number;
9
- /**
10
- * The name of the model the token is related to.
11
- */
12
- modelName?: string;
13
- /**
14
- * The sorting direction used to building pagination query.
15
- */
16
- sortDirection?: Record<string, any>;
17
- /**
18
- * The values associated with sorting.
19
- * Used in conjunction with `sortDirection` to building range query.
20
- */
21
- sortValues?: Record<string, any>;
22
- /**
23
- * The payload of the token. Contains additional data or metadata (can be `null`).
24
- */
25
- payload: Record<string, any> | null;
26
- }
27
- /**
28
- * Represents a token with pagination and metadata information.
29
- * This class holds the token data, including sorting details, and any payload.
30
- */
31
- declare class Token {
32
- /**
33
- * The CRC of the model name, used for verify the model.
34
- */
35
- modelNameCRC: number;
36
- /**
37
- * The sorting direction used for pagination building pagination query.
38
- */
39
- sortDirection: Record<string, any>;
40
- /**
41
- * The sorting values associated with the pagination.
42
- */
43
- sortValues: Record<string, any>;
44
- /**
45
- * The payload of the token, which can contain any associated metadata or data (may be `null`).
46
- */
47
- payload: Record<string, any> | null;
48
- constructor(options?: Partial<TokenOptions>);
49
- /**
50
- * Retrieves the string representation of token.
51
- */
52
- stringify(): string;
53
- /**
54
- * Retrieves binary buffer representation of token.
55
- */
56
- buffer(): Uint8Array;
57
- /**
58
- * Encode token from provided value
59
- */
60
- static from(value: string | Buffer | Uint8Array): Token;
61
- }
62
- /**
63
- * Parses a token from provided value.
64
- * @group Utils
65
- */
66
- declare function parseToken(value: string | Buffer): Token;
67
- /**
68
- * Create a token with pagination and metadata information.
69
- * This holds the token data, including sorting details, and any payload.
70
- *
71
- * @group Utils
72
- */
73
- declare function createToken(options?: Partial<TokenOptions>): Token;
74
-
75
- declare namespace QueryAdapter {
76
- type Options = {
77
- sort?: Sort;
78
- limit?: number;
79
- };
80
- type Filter = Record<string, any>;
81
- interface QueryAdapter<T = any> {
82
- getModelName(): string;
83
- getOptions(): Options;
84
- getFilter(): Filter;
85
- setOptions(options: Options): void;
86
- setFilter(filter: Filter): void;
87
- toArray(): Promise<T[]>;
88
- stream(): Readable;
89
- }
90
- }
91
-
92
- interface QueryPaginatorOptions {
93
- /**
94
- * An optional list of fields used for building pagination query.
95
- */
96
- paginationFields?: string[];
97
- /**
98
- * The token to start the pagination from, if available.
99
- */
100
- next?: string | Buffer | null;
101
- /**
102
- * A callback function executed before the query is performed.
103
- */
104
- preQuery?: (this: QueryPaginator) => void;
105
- /**
106
- * A callback function executed after the query is performed.
107
- */
108
- postQuery?: (this: QueryPaginator) => void;
109
- /** @internal */
110
- debugQuery?: boolean;
111
- }
112
- interface QueryPaginatorMeta {
113
- /**
114
- * Indicates whether there is a next page available.
115
- */
116
- hasNext: boolean;
117
- /**
118
- * The token for the next page, or `null` if there is no next page.
119
- */
120
- next: string | null;
121
- }
122
- interface QueryPaginatorResult<T> {
123
- /**
124
- * The list of items for the current page.
125
- */
126
- items: T[];
127
- /**
128
- * Metadata providing information about pagination, such as whether more pages are available.
129
- */
130
- metadata: QueryPaginatorMeta;
131
- }
132
- /**
133
- * A generic class for handling query pagination.
134
- *
135
- * Look at `withMongoPagination` and `withMongoosePagination`
136
- *
137
- * @group Main
138
- */
139
- declare class QueryPaginator<T = any> {
140
- private query;
141
- private hooks;
142
- private next;
143
- private previous?;
144
- private resHasNext;
145
- private resLastItem;
146
- private paginationFields;
147
- private tweaked;
148
- private debugQuery;
149
- getMetadata: () => QueryPaginatorMeta;
150
- constructor(query: QueryAdapter.QueryAdapter, { paginationFields, postQuery, preQuery, next: previousToken, debugQuery, }?: QueryPaginatorOptions);
151
- /**
152
- * Retrieves metadata about the current state of pagination.
153
- */
154
- get metadata(): QueryPaginatorMeta;
155
- /**
156
- * Indicates whether there is a next page available.
157
- */
158
- get hasNext(): boolean;
159
- /**
160
- * Retrieves the token for the next page.
161
- */
162
- get nextToken(): Token;
163
- /**
164
- * Retrieves the string representation of the next page token.
165
- * If there is no next page, returns `null`.
166
- */
167
- get nextTokenString(): string | null;
168
- /**
169
- * Retrieves the token for the previous page.
170
- */
171
- get prevToken(): Token | null;
172
- /**
173
- * Retrieves the string representation of the previous page token.
174
- */
175
- get prevTokenString(): string | null;
176
- getQuery(): QueryAdapter.QueryAdapter<any>;
177
- pre(hookName: string, fn: Function): this;
178
- post(hookName: string, fn: Function): this;
179
- stream(): Promise<internal.Transform>;
180
- /** @internal */
181
- maybeTweak(): this;
182
- /** @internal */
183
- tweak(): this;
184
- /** @internal */
185
- _handleResult(items: any[]): QueryPaginatorResult<any>;
186
- /**
187
- * Executes the query and returns the results along with pagination metadata.
188
- */
189
- exec(): Promise<QueryPaginatorResult<T>>;
190
- then: Promise<QueryPaginatorResult<T>>["then"];
191
- cath: Promise<QueryPaginatorResult<T>>["catch"];
192
- finally: Promise<QueryPaginatorResult<T>>["finally"];
193
- }
194
-
195
- export { QueryAdapter as Q, Token as T, type QueryPaginatorOptions as a, QueryPaginator as b, type QueryPaginatorMeta as c, type QueryPaginatorResult as d, createToken as e, type TokenOptions as f, parseToken as p };
@@ -1,195 +0,0 @@
1
- import internal, { Readable } from 'node:stream';
2
- import { Sort } from 'mongodb';
3
-
4
- interface TokenOptions {
5
- /**
6
- * The schema version of the token.
7
- */
8
- schemaVersion: number;
9
- /**
10
- * The name of the model the token is related to.
11
- */
12
- modelName?: string;
13
- /**
14
- * The sorting direction used to building pagination query.
15
- */
16
- sortDirection?: Record<string, any>;
17
- /**
18
- * The values associated with sorting.
19
- * Used in conjunction with `sortDirection` to building range query.
20
- */
21
- sortValues?: Record<string, any>;
22
- /**
23
- * The payload of the token. Contains additional data or metadata (can be `null`).
24
- */
25
- payload: Record<string, any> | null;
26
- }
27
- /**
28
- * Represents a token with pagination and metadata information.
29
- * This class holds the token data, including sorting details, and any payload.
30
- */
31
- declare class Token {
32
- /**
33
- * The CRC of the model name, used for verify the model.
34
- */
35
- modelNameCRC: number;
36
- /**
37
- * The sorting direction used for pagination building pagination query.
38
- */
39
- sortDirection: Record<string, any>;
40
- /**
41
- * The sorting values associated with the pagination.
42
- */
43
- sortValues: Record<string, any>;
44
- /**
45
- * The payload of the token, which can contain any associated metadata or data (may be `null`).
46
- */
47
- payload: Record<string, any> | null;
48
- constructor(options?: Partial<TokenOptions>);
49
- /**
50
- * Retrieves the string representation of token.
51
- */
52
- stringify(): string;
53
- /**
54
- * Retrieves binary buffer representation of token.
55
- */
56
- buffer(): Uint8Array;
57
- /**
58
- * Encode token from provided value
59
- */
60
- static from(value: string | Buffer | Uint8Array): Token;
61
- }
62
- /**
63
- * Parses a token from provided value.
64
- * @group Utils
65
- */
66
- declare function parseToken(value: string | Buffer): Token;
67
- /**
68
- * Create a token with pagination and metadata information.
69
- * This holds the token data, including sorting details, and any payload.
70
- *
71
- * @group Utils
72
- */
73
- declare function createToken(options?: Partial<TokenOptions>): Token;
74
-
75
- declare namespace QueryAdapter {
76
- type Options = {
77
- sort?: Sort;
78
- limit?: number;
79
- };
80
- type Filter = Record<string, any>;
81
- interface QueryAdapter<T = any> {
82
- getModelName(): string;
83
- getOptions(): Options;
84
- getFilter(): Filter;
85
- setOptions(options: Options): void;
86
- setFilter(filter: Filter): void;
87
- toArray(): Promise<T[]>;
88
- stream(): Readable;
89
- }
90
- }
91
-
92
- interface QueryPaginatorOptions {
93
- /**
94
- * An optional list of fields used for building pagination query.
95
- */
96
- paginationFields?: string[];
97
- /**
98
- * The token to start the pagination from, if available.
99
- */
100
- next?: string | Buffer | null;
101
- /**
102
- * A callback function executed before the query is performed.
103
- */
104
- preQuery?: (this: QueryPaginator) => void;
105
- /**
106
- * A callback function executed after the query is performed.
107
- */
108
- postQuery?: (this: QueryPaginator) => void;
109
- /** @internal */
110
- debugQuery?: boolean;
111
- }
112
- interface QueryPaginatorMeta {
113
- /**
114
- * Indicates whether there is a next page available.
115
- */
116
- hasNext: boolean;
117
- /**
118
- * The token for the next page, or `null` if there is no next page.
119
- */
120
- next: string | null;
121
- }
122
- interface QueryPaginatorResult<T> {
123
- /**
124
- * The list of items for the current page.
125
- */
126
- items: T[];
127
- /**
128
- * Metadata providing information about pagination, such as whether more pages are available.
129
- */
130
- metadata: QueryPaginatorMeta;
131
- }
132
- /**
133
- * A generic class for handling query pagination.
134
- *
135
- * Look at `withMongoPagination` and `withMongoosePagination`
136
- *
137
- * @group Main
138
- */
139
- declare class QueryPaginator<T = any> {
140
- private query;
141
- private hooks;
142
- private next;
143
- private previous?;
144
- private resHasNext;
145
- private resLastItem;
146
- private paginationFields;
147
- private tweaked;
148
- private debugQuery;
149
- getMetadata: () => QueryPaginatorMeta;
150
- constructor(query: QueryAdapter.QueryAdapter, { paginationFields, postQuery, preQuery, next: previousToken, debugQuery, }?: QueryPaginatorOptions);
151
- /**
152
- * Retrieves metadata about the current state of pagination.
153
- */
154
- get metadata(): QueryPaginatorMeta;
155
- /**
156
- * Indicates whether there is a next page available.
157
- */
158
- get hasNext(): boolean;
159
- /**
160
- * Retrieves the token for the next page.
161
- */
162
- get nextToken(): Token;
163
- /**
164
- * Retrieves the string representation of the next page token.
165
- * If there is no next page, returns `null`.
166
- */
167
- get nextTokenString(): string | null;
168
- /**
169
- * Retrieves the token for the previous page.
170
- */
171
- get prevToken(): Token | null;
172
- /**
173
- * Retrieves the string representation of the previous page token.
174
- */
175
- get prevTokenString(): string | null;
176
- getQuery(): QueryAdapter.QueryAdapter<any>;
177
- pre(hookName: string, fn: Function): this;
178
- post(hookName: string, fn: Function): this;
179
- stream(): Promise<internal.Transform>;
180
- /** @internal */
181
- maybeTweak(): this;
182
- /** @internal */
183
- tweak(): this;
184
- /** @internal */
185
- _handleResult(items: any[]): QueryPaginatorResult<any>;
186
- /**
187
- * Executes the query and returns the results along with pagination metadata.
188
- */
189
- exec(): Promise<QueryPaginatorResult<T>>;
190
- then: Promise<QueryPaginatorResult<T>>["then"];
191
- cath: Promise<QueryPaginatorResult<T>>["catch"];
192
- finally: Promise<QueryPaginatorResult<T>>["finally"];
193
- }
194
-
195
- export { QueryAdapter as Q, Token as T, type QueryPaginatorOptions as a, QueryPaginator as b, type QueryPaginatorMeta as c, type QueryPaginatorResult as d, createToken as e, type TokenOptions as f, parseToken as p };