@querykitjs/class-validator 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/locales.ts","../src/messages.ts","../src/validate.ts","../src/decorators.ts","../src/dto.ts"],"names":["issue","FILTER_OPERATORS","IsQueryFilterConstraint","ValidatorConstraint","IsQuerySortConstraint","registerDecorator","IsOptional","Type","IsInt","IsPositive","Max","DEFAULT_MAX_PER_PAGE","DEFAULT_MAX_LIMIT","Min","IsString","IsIn","IsBoolean","IsObject"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Xabar kataloglari — **yagona manba**. Har bir til bir xil kalitlar to'plamini\n * to'ldiradi; kalitlarning o'zi shu yerdagi inglizcha katalogdan chiqadi.\n *\n * Paket xatoni kalit bilan qaytargani uchun tillar soni cheklanmagan: tarjima\n * har doim iste'molchi tomonida (`nestjs-i18n` `I18nValidationPipe` yoki oddiy\n * `formatMessage(key, args, catalog)`). Bu yerdagi uchta katalog shunchaki eng\n * ko'p kerak bo'ladiganini qutidan beradi — hech biri majburiy emas.\n *\n * `QueryKitMessageCatalog` ataylab qat'iy (`Record<QueryKitMessageKey, string>`):\n * inglizchaga yangi kalit qo'shilsa, qolgan kataloglar **compile-time**da yorilib\n * beradi va eskirib qololmaydi.\n */\n\n/**\n * Inglizcha katalog — kalitlarning kanonik ro'yxati va default fallback.\n * `{placeholder}` lar `formatMessage` bilan to'ldiriladi.\n */\nexport const QUERYKIT_MESSAGES_EN = {\n \"querykit.filter.invalid_node\": \"{path} must be a filter condition or an and/or/not group\",\n \"querykit.filter.missing_key\": \"{path} is missing the required `key` string\",\n \"querykit.filter.unknown_key\": \"{path}: `{key}` is not an allowed filter key\",\n \"querykit.filter.invalid_operator\": \"{path}: `{operation}` is not a supported filter operator\",\n \"querykit.filter.invalid_value\": \"{path} must be a string, number, boolean, null, or an array of those\",\n \"querykit.filter.invalid_group\": \"{path} must be an array of filter nodes\",\n \"querykit.filter.max_depth\": \"{path} exceeds the maximum filter depth of {max}\",\n \"querykit.filter.value_requires_array\": \"{path}: `{operation}` requires an array value\",\n \"querykit.filter.value_requires_tuple\": \"{path}: `{operation}` requires exactly two values\",\n \"querykit.filter.value_forbidden\": \"{path}: `{operation}` must not carry a value\",\n \"querykit.sort.not_array\": \"{path} must be an array of { key, direction } items\",\n \"querykit.sort.invalid_item\": \"{path} must be an object with a `key` string\",\n \"querykit.sort.missing_key\": \"{path} is missing the required `key` string\",\n \"querykit.sort.unknown_key\": \"{path}: `{key}` is not an allowed sort key\",\n \"querykit.sort.invalid_direction\": \"{path}: direction must be `asc` or `desc`\",\n} as const satisfies Record<string, string>;\n\n/**\n * Har bir validatsiya xatosining i18n kaliti. Union inglizcha katalogdan chiqadi —\n * yangi xabar qo'shilsa tip o'zi kengayadi, qo'lda ro'yxat yuritilmaydi.\n */\nexport type QueryKitMessageKey = keyof typeof QUERYKIT_MESSAGES_EN;\n\n/** Bitta tilning to'liq katalogi — barcha kalitlar majburiy. */\nexport type QueryKitMessageCatalog = Record<QueryKitMessageKey, string>;\n\n/** O'zbekcha katalog. Placeholder nomlari inglizchasi bilan bir xil. */\nexport const QUERYKIT_MESSAGES_UZ: QueryKitMessageCatalog = {\n \"querykit.filter.invalid_node\": \"{path} filter sharti yoki and/or/not guruhi bo'lishi kerak\",\n \"querykit.filter.missing_key\": \"{path} da majburiy `key` (string) yo'q\",\n \"querykit.filter.unknown_key\": \"{path}: `{key}` ruxsat etilgan filter kaliti emas\",\n \"querykit.filter.invalid_operator\": \"{path}: `{operation}` qo'llab-quvvatlanadigan filter operatori emas\",\n \"querykit.filter.invalid_value\": \"{path} string, raqam, boolean, null yoki shularning massivi bo'lishi kerak\",\n \"querykit.filter.invalid_group\": \"{path} filter tugunlari massivi bo'lishi kerak\",\n \"querykit.filter.max_depth\": \"{path} ruxsat etilgan filter chuqurligidan ({max}) oshib ketdi\",\n \"querykit.filter.value_requires_array\": \"{path}: `{operation}` massiv qiymat talab qiladi\",\n \"querykit.filter.value_requires_tuple\": \"{path}: `{operation}` aynan ikkita qiymat talab qiladi\",\n \"querykit.filter.value_forbidden\": \"{path}: `{operation}` qiymat qabul qilmaydi\",\n \"querykit.sort.not_array\": \"{path} `{ key, direction }` elementlaridan iborat massiv bo'lishi kerak\",\n \"querykit.sort.invalid_item\": \"{path} `key` (string) maydoniga ega obyekt bo'lishi kerak\",\n \"querykit.sort.missing_key\": \"{path} da majburiy `key` (string) yo'q\",\n \"querykit.sort.unknown_key\": \"{path}: `{key}` ruxsat etilgan sort kaliti emas\",\n \"querykit.sort.invalid_direction\": \"{path}: direction `asc` yoki `desc` bo'lishi kerak\",\n};\n\n/** Ruscha katalog. */\nexport const QUERYKIT_MESSAGES_RU: QueryKitMessageCatalog = {\n \"querykit.filter.invalid_node\": \"{path} должен быть условием фильтра или группой and/or/not\",\n \"querykit.filter.missing_key\": \"в {path} отсутствует обязательное поле `key` (строка)\",\n \"querykit.filter.unknown_key\": \"{path}: `{key}` — недопустимый ключ фильтра\",\n \"querykit.filter.invalid_operator\": \"{path}: `{operation}` — неподдерживаемый оператор фильтра\",\n \"querykit.filter.invalid_value\": \"{path} должен быть строкой, числом, boolean, null или массивом из них\",\n \"querykit.filter.invalid_group\": \"{path} должен быть массивом узлов фильтра\",\n \"querykit.filter.max_depth\": \"{path} превышает максимальную глубину фильтра ({max})\",\n \"querykit.filter.value_requires_array\": \"{path}: `{operation}` требует значение-массив\",\n \"querykit.filter.value_requires_tuple\": \"{path}: `{operation}` требует ровно два значения\",\n \"querykit.filter.value_forbidden\": \"{path}: `{operation}` не должен содержать значение\",\n \"querykit.sort.not_array\": \"{path} должен быть массивом элементов `{ key, direction }`\",\n \"querykit.sort.invalid_item\": \"{path} должен быть объектом с полем `key` (строка)\",\n \"querykit.sort.missing_key\": \"в {path} отсутствует обязательное поле `key` (строка)\",\n \"querykit.sort.unknown_key\": \"{path}: `{key}` — недопустимый ключ сортировки\",\n \"querykit.sort.invalid_direction\": \"{path}: direction должен быть `asc` или `desc`\",\n};\n\n/**\n * Til kodi → katalog. Qutidagi tillar; iste'molchi o'z katalogini shu shaklda\n * qo'shib, `formatMessage`ga uzata oladi.\n */\nexport const QUERYKIT_LOCALES = {\n en: QUERYKIT_MESSAGES_EN,\n uz: QUERYKIT_MESSAGES_UZ,\n ru: QUERYKIT_MESSAGES_RU,\n} as const satisfies Record<string, QueryKitMessageCatalog>;\n\n/** Qutidan chiqadigan til kodlari. */\nexport type QueryKitLocale = keyof typeof QUERYKIT_LOCALES;\n","/**\n * Xabar formatlash. Kataloglarning o'zi `locales.ts`da — bu fayl faqat\n * `{placeholder}` interpolatsiyasini biladi va hech qanday tilga bog'lanmagan.\n *\n * Har bir {@link ValidationIssue} uchta narsani olib yuradi: `key` (tarjima\n * kaliti), `message` (tayyor matn) va `args` (interpolatsiya qiymatlari). Shu\n * sababli paket i18n'ga **majburlamaydi**, lekin unga to'liq mos.\n */\nimport { QUERYKIT_MESSAGES_EN, type QueryKitMessageCatalog, type QueryKitMessageKey } from \"./locales\";\n\n/** Shablon interpolatsiyasi argumentlari — `I18nValidationPipe`ga ham shu shaklda uzatiladi. */\nexport type MessageArgs = Record<string, string | number>;\n\nconst PLACEHOLDER = /\\{(\\w+)\\}/g;\n\n/**\n * Kalitni matnga aylantiradi: katalogdan shablon olinadi va `{placeholder}` lar\n * `args` bilan almashtiriladi. Mos argument topilmasa placeholder o'z holicha\n * qoladi — xabar hech qachon bo'sh chiqmaydi.\n *\n * @param catalog Til katalogi. Default — inglizcha; `QUERYKIT_MESSAGES_UZ`,\n * `QUERYKIT_MESSAGES_RU` yoki o'zingizniki uzatilishi mumkin.\n *\n * @example\n * ```ts\n * formatMessage(issue.key, issue.args, QUERYKIT_MESSAGES_UZ);\n * ```\n */\nexport function formatMessage(key: QueryKitMessageKey, args: MessageArgs = {}, catalog: QueryKitMessageCatalog = QUERYKIT_MESSAGES_EN): string {\n return catalog[key].replace(PLACEHOLDER, (match, name: string) => {\n const value = args[name];\n return value === undefined ? match : String(value);\n });\n}\n\n/**\n * Issue'ni tanlangan tilda qayta formatlaydi — `message` inglizcha yozilgan\n * bo'lsa ham, javobni boshqa tilda berish uchun.\n *\n * @example\n * ```ts\n * issues.map(issue => localizeIssue(issue, QUERYKIT_MESSAGES_RU));\n * ```\n */\nexport function localizeIssue(issue: { key: QueryKitMessageKey; args: MessageArgs }, catalog: QueryKitMessageCatalog): string {\n return formatMessage(issue.key, issue.args, catalog);\n}\n","/**\n * Sof TS validatsiya yadrosi — **framework-agnostik**. Butun rekursiya va qaror\n * mantiqi shu yerda; `class-validator` dekoratorlari (`decorators.ts`) faqat\n * yupqa o'rov. Shu sababli yadroni Nest'siz ham (Express, Hono, oddiy funksiya)\n * ishlatish mumkin va uni test qilish uchun dekorator mashinasi kerak emas.\n *\n * Kontrakt manbasi — `@querykitjs/core`: operatorlar `FILTER_OPERATORS`dan,\n * daraxt shakli esa `Filter`/`FilterNode`/`FieldCondition` tiplaridan.\n */\nimport { FILTER_OPERATORS } from \"@querykitjs/core\";\nimport type { FilterOperator } from \"@querykitjs/core\";\nimport { formatMessage, type MessageArgs } from \"./messages\";\nimport type { QueryKitMessageKey } from \"./locales\";\n\n/** Filter daraxti chuqurligi default limiti — cheklovsiz rekursiya DoS yuzasi. */\nexport const DEFAULT_MAX_FILTER_DEPTH = 5;\n\nexport interface QueryFilterOptions {\n /**\n * Berilsa — faqat shu kalitlarga ruxsat; noma'lum kalit **rad etiladi**.\n * Backend adapterlari noma'lum kalitni jimgina tashlaydi, bu qatlam esa\n * qat'iyroq: mijoz mavjud bo'lmagan maydon bo'yicha filtr yubora olmaydi.\n * Berilmasa — istalgan string kalit o'tadi (`@querykitjs/zod` bilan parity).\n */\n allowedKeys?: readonly string[];\n /** Ruxsat etilgan operatorlar. Default — core `FILTER_OPERATORS`ning hammasi. */\n allowedOperators?: readonly FilterOperator[];\n /** `and`/`or`/`not` tugunlarining chuqurlik limiti. Default — {@link DEFAULT_MAX_FILTER_DEPTH}. */\n maxDepth?: number;\n /**\n * Operator↔qiymat shakli tekshiruvi (opt-in): `in`/`notIn` massiv talab qiladi,\n * `between`/`notBetween` — aynan ikki element, `isNull`/`isNotNull` — qiymatsiz.\n * Default `false`, ya'ni `@querykitjs/zod` bilan bir xil qat'iylik.\n */\n strictValue?: boolean;\n /**\n * `path`ning ildizi. Default `\"filter\"`. Dekorator buni DTO property nomiga\n * qo'yadi, ya'ni `where` deb nomlangan maydon xatosi `filter.operation` emas,\n * `where.operation` deb chiqadi.\n */\n rootPath?: string;\n}\n\nexport interface QuerySortOptions {\n /** Berilsa — faqat shu kalitlar bo'yicha saralashga ruxsat. */\n allowedKeys?: readonly string[];\n /** `path`ning ildizi. Default `\"sort\"`. Qarang: {@link QueryFilterOptions.rootPath}. */\n rootPath?: string;\n}\n\n/** Bitta validatsiya xatosi. */\nexport interface ValidationIssue {\n /** Xato joyi, masalan `filter.and[1].or[0].value`. */\n path: string;\n /** i18n kaliti — iste'molchi tarjima faylida shu kalit qidiriladi. */\n key: QueryKitMessageKey;\n /** Tayyor inglizcha matn — tarjimasiz ham o'qiladi. */\n message: string;\n /** Interpolatsiya argumentlari (`path` har doim bor) — `I18nValidationPipe` uchun. */\n args: MessageArgs;\n}\n\n/* ------------------------------- internals -------------------------------- */\n\nconst ALL_OPERATORS: ReadonlySet<string> = new Set<string>(FILTER_OPERATORS);\n\n/* `strictValue` uchun operator tasnifi. */\nconst ARRAY_OPERATORS: ReadonlySet<string> = new Set([\"in\", \"notIn\"]);\nconst TUPLE_OPERATORS: ReadonlySet<string> = new Set([\"between\", \"notBetween\"]);\nconst NULLARY_OPERATORS: ReadonlySet<string> = new Set([\"isNull\", \"isNotNull\"]);\n\ntype UnknownRecord = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is UnknownRecord => typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * Wire skalyari — `Date`siz (JSON'da sana ISO string bo'ladi) va `NaN`/`Infinity`siz\n * (ikkalasi ham JSON'da mavjud emas va SQL/Mongo'ga tushsa xato beradi).\n */\nconst isScalar = (value: unknown): boolean =>\n value === null || typeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value));\n\nconst isFilterValue = (value: unknown): boolean => (Array.isArray(value) ? value.every(isScalar) : isScalar(value));\n\n/** Xabarga qo'yish uchun xavfsiz matn — kirish ishonchsiz, `String()` yiqilishi mumkin. */\nconst label = (value: unknown): string => {\n try {\n return String(value);\n } catch {\n return Object.prototype.toString.call(value);\n }\n};\n\nconst issue = (key: QueryKitMessageKey, path: string, extra: MessageArgs = {}): ValidationIssue => {\n const args: MessageArgs = { path, ...extra };\n return { path, key, message: formatMessage(key, args), args };\n};\n\ninterface FilterContext {\n issues: ValidationIssue[];\n allowedKeys?: ReadonlySet<string>;\n operators: ReadonlySet<string>;\n maxDepth: number;\n strictValue: boolean;\n}\n\n/**\n * Bitta maydon sharti. Noma'lum propertylar (masalan legacy `type`) **e'tiborsiz**\n * qoldiriladi — `@querykitjs/zod` ham ularni rad etmay, jimgina tashlaydi.\n */\nfunction checkCondition(node: unknown, path: string, ctx: FilterContext): void {\n if (!isRecord(node)) {\n ctx.issues.push(issue(\"querykit.filter.invalid_node\", path));\n return;\n }\n\n const { key, operation, value } = node;\n\n if (typeof key !== \"string\") {\n ctx.issues.push(issue(\"querykit.filter.missing_key\", path));\n return;\n }\n if (ctx.allowedKeys && !ctx.allowedKeys.has(key)) {\n ctx.issues.push(issue(\"querykit.filter.unknown_key\", path, { key }));\n }\n\n let operator: string | undefined;\n if (operation !== undefined) {\n if (typeof operation === \"string\" && ctx.operators.has(operation)) {\n operator = operation;\n } else {\n ctx.issues.push(issue(\"querykit.filter.invalid_operator\", `${path}.operation`, { operation: label(operation) }));\n }\n }\n\n if (value !== undefined && !isFilterValue(value)) {\n ctx.issues.push(issue(\"querykit.filter.invalid_value\", `${path}.value`));\n }\n\n if (ctx.strictValue && operator !== undefined) {\n checkValueShape(operator, value, path, ctx);\n }\n}\n\n/** `strictValue` shoxobchasi — operator qanday qiymat shaklini talab qilishi. */\nfunction checkValueShape(operator: string, value: unknown, path: string, ctx: FilterContext): void {\n const valuePath = `${path}.value`;\n\n if (ARRAY_OPERATORS.has(operator)) {\n if (!Array.isArray(value)) {\n ctx.issues.push(issue(\"querykit.filter.value_requires_array\", valuePath, { operation: operator }));\n }\n return;\n }\n if (TUPLE_OPERATORS.has(operator)) {\n if (!Array.isArray(value) || value.length !== 2) {\n ctx.issues.push(issue(\"querykit.filter.value_requires_tuple\", valuePath, { operation: operator }));\n }\n return;\n }\n if (NULLARY_OPERATORS.has(operator) && value !== undefined) {\n ctx.issues.push(issue(\"querykit.filter.value_forbidden\", valuePath, { operation: operator }));\n }\n}\n\nfunction walkGroup(group: unknown, depth: number, path: string, ctx: FilterContext): void {\n if (!Array.isArray(group)) {\n ctx.issues.push(issue(\"querykit.filter.invalid_group\", path));\n return;\n }\n group.forEach((child, index) => walkNode(child, depth + 1, `${path}[${index}]`, ctx));\n}\n\nfunction walkNode(node: unknown, depth: number, path: string, ctx: FilterContext): void {\n if (depth > ctx.maxDepth) {\n ctx.issues.push(issue(\"querykit.filter.max_depth\", path, { max: ctx.maxDepth }));\n return;\n }\n if (!isRecord(node)) {\n ctx.issues.push(issue(\"querykit.filter.invalid_node\", path));\n return;\n }\n\n /* Diskriminatsiya zod union tartibini aynan takrorlaydi: u yerda\n * `fieldConditionSchema` birinchi turadi, ya'ni `key` olib yurgan har qanday\n * obyekt shart deb o'qiladi va ortiqcha propertylar tashlanadi. */\n if (\"key\" in node) {\n checkCondition(node, path, ctx);\n return;\n }\n if (\"and\" in node) {\n walkGroup(node.and, depth, `${path}.and`, ctx);\n return;\n }\n if (\"or\" in node) {\n walkGroup(node.or, depth, `${path}.or`, ctx);\n return;\n }\n if (\"not\" in node) {\n walkNode(node.not, depth + 1, `${path}.not`, ctx);\n return;\n }\n\n ctx.issues.push(issue(\"querykit.filter.missing_key\", path));\n}\n\n/* -------------------------------- public ---------------------------------- */\n\n/**\n * Filter daraxtini core kontraktiga tekshiradi. Bo'sh massiv = valid.\n *\n * @example\n * ```ts\n * const issues = validateFilter(body.filter, { allowedKeys: [\"id\", \"name\"] });\n * if (issues.length) throw new BadRequestException(issues);\n * ```\n */\nexport function validateFilter(value: unknown, options: QueryFilterOptions = {}): ValidationIssue[] {\n if (value === undefined) return [];\n\n const root = options.rootPath ?? \"filter\";\n const ctx: FilterContext = {\n issues: [],\n allowedKeys: options.allowedKeys ? new Set(options.allowedKeys) : undefined,\n operators: options.allowedOperators ? new Set<string>(options.allowedOperators) : ALL_OPERATORS,\n maxDepth: options.maxDepth ?? DEFAULT_MAX_FILTER_DEPTH,\n strictValue: options.strictValue ?? false,\n };\n\n if (Array.isArray(value)) {\n /* Flat massiv = implicit AND. Core uni `FieldCondition[]` deb tiplaydi —\n * ya'ni elementlari faqat shart, nested guruh emas (zod'da ham shunday). */\n value.forEach((item, index) => checkCondition(item, `${root}[${index}]`, ctx));\n return ctx.issues;\n }\n\n walkNode(value, 1, root, ctx);\n return ctx.issues;\n}\n\n/**\n * Sort massivini core kontraktiga tekshiradi (`{ key, direction }[]`). Bo'sh massiv = valid.\n */\nexport function validateSort(value: unknown, options: QuerySortOptions = {}): ValidationIssue[] {\n if (value === undefined) return [];\n\n const root = options.rootPath ?? \"sort\";\n if (!Array.isArray(value)) return [issue(\"querykit.sort.not_array\", root)];\n\n const allowedKeys = options.allowedKeys ? new Set(options.allowedKeys) : undefined;\n const issues: ValidationIssue[] = [];\n\n value.forEach((item, index) => {\n const path = `${root}[${index}]`;\n\n if (!isRecord(item)) {\n issues.push(issue(\"querykit.sort.invalid_item\", path));\n return;\n }\n\n const { key, direction } = item;\n\n if (typeof key !== \"string\") {\n issues.push(issue(\"querykit.sort.missing_key\", path));\n return;\n }\n if (allowedKeys && !allowedKeys.has(key)) {\n issues.push(issue(\"querykit.sort.unknown_key\", path, { key }));\n }\n if (direction !== undefined && direction !== \"asc\" && direction !== \"desc\") {\n issues.push(issue(\"querykit.sort.invalid_direction\", `${path}.direction`));\n }\n });\n\n return issues;\n}\n","/**\n * `class-validator` o'rovi. Butun mantiq `validate.ts`da — bu yerda faqat\n * konstraint klasslari va ularni property'ga bog'laydigan dekorator factory'lari.\n *\n * Rekursiya `validateFilter` ichida bo'lgani uchun nested DTO klassi ham,\n * `@ValidateNested` ham kerak emas: butun `and`/`or`/`not` daraxti bitta\n * dekorator bilan tekshiriladi.\n */\nimport { registerDecorator, ValidatorConstraint } from \"class-validator\";\nimport type { ValidationArguments, ValidationOptions, ValidatorConstraintInterface } from \"class-validator\";\nimport { validateFilter, validateSort, type QueryFilterOptions, type QuerySortOptions, type ValidationIssue } from \"./validate\";\n\n/** Dekorator darajasidagi qo'shimcha — yadro buni o'qimaydi. */\nexport interface MessageStyleOptions {\n /**\n * Xato matni qanday shaklda qaytsin:\n * - `\"text\"` (default) — tayyor inglizcha jumla, i18n'siz app ham o'qiydi;\n * - `\"key\"` — `querykit.filter.*` kaliti, `nestjs-i18n`ning `I18nValidationPipe`i\n * uni so'rovning tiliga tarjima qiladi.\n */\n messageStyle?: \"text\" | \"key\";\n}\n\nexport type IsQueryFilterOptions = QueryFilterOptions & MessageStyleOptions;\nexport type IsQuerySortOptions = QuerySortOptions & MessageStyleOptions;\n\n/* -------------------------------- helpers --------------------------------- */\n\nconst optionsOf = <TOptions extends MessageStyleOptions>(args: ValidationArguments | undefined, fallbackPath: string): TOptions => {\n const given = (args?.constraints?.[0] ?? {}) as TOptions;\n /* Xato yo'li DTO property nomidan boshlansin: `where` deb nomlangan maydon\n * `filter.operation` emas, `where.operation` deb chiqadi. */\n return { rootPath: args?.property ?? fallbackPath, ...given };\n};\n\nconst firstMessage = (issues: ValidationIssue[], options: MessageStyleOptions, args: ValidationArguments | undefined, fallback: string): string => {\n const first = issues[0];\n if (!first) return `${args?.property ?? \"value\"} ${fallback}`;\n return options.messageStyle === \"key\" ? first.key : first.message;\n};\n\n/* ------------------------------- constraints ------------------------------ */\n/* DIQQAT: class-validator konstraint instansiyasini bir marta yaratib, barcha\n * so'rovlar uchun qayta ishlatadi. Shu sababli issue'lar `this`da HECH QACHON\n * keshlanmaydi — parallel so'rovlarda xabarlar aralashib ketardi. `defaultMessage`\n * `validateFilter`ni qayta chaqiradi: u sof, holatsiz va arzon. */\n\n/** `@IsQueryFilter()` ortidagi konstraint — test va qayta ishlatish uchun ochiq. */\n@ValidatorConstraint({ name: \"isQueryFilter\", async: false })\nexport class IsQueryFilterConstraint implements ValidatorConstraintInterface {\n validate(value: unknown, args?: ValidationArguments): boolean {\n return validateFilter(value, optionsOf<IsQueryFilterOptions>(args, \"filter\")).length === 0;\n }\n\n defaultMessage(args?: ValidationArguments): string {\n const options = optionsOf<IsQueryFilterOptions>(args, \"filter\");\n return firstMessage(validateFilter(args?.value, options), options, args, \"is not a valid querykit filter\");\n }\n}\n\n/** `@IsQuerySort()` ortidagi konstraint. */\n@ValidatorConstraint({ name: \"isQuerySort\", async: false })\nexport class IsQuerySortConstraint implements ValidatorConstraintInterface {\n validate(value: unknown, args?: ValidationArguments): boolean {\n return validateSort(value, optionsOf<IsQuerySortOptions>(args, \"sort\")).length === 0;\n }\n\n defaultMessage(args?: ValidationArguments): string {\n const options = optionsOf<IsQuerySortOptions>(args, \"sort\");\n return firstMessage(validateSort(args?.value, options), options, args, \"is not a valid querykit sort\");\n }\n}\n\n/* ------------------------------- decorators ------------------------------- */\n\n/**\n * Property'ni querykit `Filter` kontraktiga tekshiradi: flat massiv (implicit AND),\n * nested `and`/`or`/`not` daraxti va core `FILTER_OPERATORS`ning to'liq to'plami.\n *\n * `undefined` qiymatni **rad etmaydi** — maydonni ixtiyoriy qilish uchun\n * `@IsOptional()` bilan birga ishlating (DTO'lardagi kabi).\n *\n * @example\n * ```ts\n * class ListUsersDto extends OffsetParamsDto {\n * @IsOptional()\n * @IsQueryFilter({ allowedKeys: [\"id\", \"name\", \"createdAt\"] })\n * declare filter?: Filter;\n * }\n * ```\n */\nexport function IsQueryFilter(options?: IsQueryFilterOptions, validationOptions?: ValidationOptions): PropertyDecorator {\n return (target, propertyName) => {\n registerDecorator({\n target: target.constructor,\n propertyName: propertyName as string,\n options: validationOptions,\n constraints: [options],\n validator: IsQueryFilterConstraint,\n });\n };\n}\n\n/**\n * Property'ni querykit `Sort` kontraktiga tekshiradi — `{ key, direction }[]`.\n * Qarang: {@link IsQueryFilter}.\n */\nexport function IsQuerySort(options?: IsQuerySortOptions, validationOptions?: ValidationOptions): PropertyDecorator {\n return (target, propertyName) => {\n registerDecorator({\n target: target.constructor,\n propertyName: propertyName as string,\n options: validationOptions,\n constraints: [options],\n validator: IsQuerySortConstraint,\n });\n };\n}\n","/**\n * Param DTO'lari — uchala paginatsiya uchun (offset / infinite / cursor).\n *\n * Ikki yo'l bilan ishlatiladi (ikkalasi ham bitta `validateFilter` yadrosiga\n * tayanadi):\n *\n * 1. **Subclass** — `class ListUsersDto extends OffsetParamsDto` va kerak bo'lsa\n * `filter`ni `@IsQueryFilter({ allowedKeys })` bilan qayta e'lon qilish;\n * 2. **Factory** — `makeOffsetParamsDto({ allowedKeys })`, boilerplatesiz.\n *\n * **Xavfsiz default:** `columns` / `with` / `withDeleted` hech qaysi DTO'da\n * e'lon qilinmagan, ya'ni `ValidationPipe({ whitelist: true })` ularni o'chiradi;\n * `perPage` / `limit` esa core'ning `DEFAULT_MAX_PER_PAGE` / `DEFAULT_MAX_LIMIT`\n * chegarasi bilan cheklangan. Ochish faqat factory'ning `allow` opsiyasi orqali.\n */\nimport { Type } from \"class-transformer\";\nimport { IsBoolean, IsIn, IsInt, IsObject, IsOptional, IsPositive, IsString, Max, Min } from \"class-validator\";\nimport { DEFAULT_MAX_LIMIT, DEFAULT_MAX_PER_PAGE } from \"@querykitjs/core\";\nimport type { Filter, Sort, SortDirection } from \"@querykitjs/core\";\nimport { IsQueryFilter, IsQuerySort, type IsQueryFilterOptions, type IsQuerySortOptions } from \"./decorators\";\n\n/* ------------------------------ static DTOs ------------------------------- */\n\n/** Paginatsiyasiz umumiy params — `filter` + `sort`. */\nexport class BaseParamsDto {\n @IsOptional()\n @IsQueryFilter()\n filter?: Filter;\n\n @IsOptional()\n @IsQuerySort()\n sort?: Sort;\n}\n\n/** Offset (sahifali) params — `page` + `perPage` (`perPage` ≤ core cap). */\nexport class OffsetParamsDto extends BaseParamsDto {\n /* `page`da cap yo'q — sahifa raqami emas, sahifa **o'lchami** DoS yuzasi\n * (`@querykitjs/zod` factory'lari ham aynan shunday). */\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @IsPositive()\n page?: number;\n\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @IsPositive()\n @Max(DEFAULT_MAX_PER_PAGE)\n perPage?: number;\n}\n\n/** Infinite-scroll params — `limit` + `offset`. */\nexport class InfiniteParamsDto extends BaseParamsDto {\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @IsPositive()\n @Max(DEFAULT_MAX_LIMIT)\n limit?: number;\n\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @Min(0)\n offset?: number;\n}\n\n/**\n * Cursor (keyset) params. `sort` **yo'q**: tartib `order` + `direction` bilan\n * boshqariladi. Shu sababli `BaseParamsDto`dan meros olinmaydi — aks holda\n * `sort` kontraktga qarshi ravishda meros bo'lib qolardi.\n */\nexport class CursorParamsDto {\n @IsOptional()\n @IsQueryFilter()\n filter?: Filter;\n\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @IsPositive()\n @Max(DEFAULT_MAX_LIMIT)\n limit?: number;\n\n @IsOptional()\n @IsString()\n cursor?: string | null;\n\n @IsOptional()\n @IsString()\n cursorKey?: string;\n\n @IsOptional()\n @IsIn([\"asc\", \"desc\"])\n order?: SortDirection;\n\n @IsOptional()\n @IsIn([\"forward\", \"backward\"])\n direction?: \"forward\" | \"backward\";\n}\n\n/* -------------------------------- factories ------------------------------- */\n\n/** Server'ga tegishli, default'da clientdan qabul qilinmaydigan maydonlar. */\nexport type ServerOwnedField = \"columns\" | \"with\" | \"withDeleted\";\n\n/** `allow` bilan ochiladigan maydonlarning shakli. */\nexport interface ServerOwnedParams {\n columns?: Record<string, boolean>;\n with?: Record<string, unknown>;\n withDeleted?: boolean;\n}\n\nexport interface ParamsDtoOptions {\n /** `filter` uchun to'liq opsiyalar — `allowedKeys`, `allowedOperators`, `maxDepth`, `strictValue`, `messageStyle`. */\n filter?: IsQueryFilterOptions;\n /** `sort` uchun opsiyalar — `allowedKeys`, `messageStyle`. */\n sort?: IsQuerySortOptions;\n /**\n * `filter` va `sort` uchun umumiy allowlist qisqartmasi — odatda ikkalasi bir xil.\n * Aniq berilgan `filter.allowedKeys` / `sort.allowedKeys` bundan **ustun**.\n */\n allowedKeys?: readonly string[];\n /** `perPage` yuqori chegarasi. Default — core `DEFAULT_MAX_PER_PAGE` (200). `Infinity` — cap yo'q (⚠️ DoS). */\n maxPerPage?: number;\n /** `limit` yuqori chegarasi. Default — core `DEFAULT_MAX_LIMIT` (200). */\n maxLimit?: number;\n /** Server-owned maydonlarni **ataylab** ochish. Default — bo'sh. */\n allow?: readonly ServerOwnedField[];\n}\n\n/* Dinamik klasslar static klasslardan meros OLMAYDI: meros bo'lsa ota-klassning\n * default `@IsQueryFilter()` dekoratori ham qo'shilib, filter ikki marta —\n * bir marta opsiyalar bilan, bir marta ularsiz — tekshirilardi. Shuningdek\n * static klasslar prototipiga hech qachon imperativ dekorator qo'yilmaydi:\n * u global ifloslanish bo'lardi. */\n\nconst applyNumber = (proto: object, property: string, bounds: { positive?: boolean; min?: number; max?: number }): void => {\n IsOptional()(proto, property);\n Type(() => Number)(proto, property);\n IsInt()(proto, property);\n if (bounds.positive) IsPositive()(proto, property);\n if (bounds.min !== undefined) Min(bounds.min)(proto, property);\n /* `Infinity` cap'ni butunlay o'chiradi — cheksiz `@Max` konstrainti qo'yishdan\n * ko'ra uni umuman qo'ymagan ma'qul (xato xabari ham chalg'itmaydi). */\n if (bounds.max !== undefined && Number.isFinite(bounds.max)) Max(bounds.max)(proto, property);\n};\n\nconst applyServerOwned = (proto: object, field: ServerOwnedField): void => {\n IsOptional()(proto, field);\n if (field === \"withDeleted\") IsBoolean()(proto, field);\n else IsObject()(proto, field);\n};\n\nconst applyFilterAndSort = (proto: object, options: ParamsDtoOptions, withSort: boolean): void => {\n IsOptional()(proto, \"filter\");\n IsQueryFilter({ ...options.filter, allowedKeys: options.filter?.allowedKeys ?? options.allowedKeys })(proto, \"filter\");\n\n if (withSort) {\n IsOptional()(proto, \"sort\");\n IsQuerySort({ ...options.sort, allowedKeys: options.sort?.allowedKeys ?? options.allowedKeys })(proto, \"sort\");\n }\n\n for (const field of options.allow ?? []) applyServerOwned(proto, field);\n};\n\n/** Nest xato loglarida `class_1` emas, tushunarli nom chiqsin. */\nconst nameClass = <T extends abstract new (...args: never[]) => unknown>(cls: T, name: string): T => {\n Object.defineProperty(cls, \"name\", { value: name, configurable: true });\n return cls;\n};\n\n/**\n * Offset (sahifali) params DTO'si — `allowedKeys` va cap'lar bilan.\n *\n * @example\n * ```ts\n * const ListBuyersDto = makeOffsetParamsDto({ allowedKeys: [\"buyerName\", \"createdAt\"] });\n * type ListBuyersDto = InstanceType<typeof ListBuyersDto>;\n *\n * @Post(\"list\")\n * list(@Body() params: ListBuyersDto) {\n * return this.buyersRepository.findList(params);\n * }\n * ```\n */\nexport function makeOffsetParamsDto(options: ParamsDtoOptions = {}) {\n class OffsetParams implements ServerOwnedParams {\n filter?: Filter;\n sort?: Sort;\n page?: number;\n perPage?: number;\n columns?: Record<string, boolean>;\n with?: Record<string, unknown>;\n withDeleted?: boolean;\n }\n\n applyFilterAndSort(OffsetParams.prototype, options, true);\n applyNumber(OffsetParams.prototype, \"page\", { positive: true });\n applyNumber(OffsetParams.prototype, \"perPage\", { positive: true, max: options.maxPerPage ?? DEFAULT_MAX_PER_PAGE });\n\n return nameClass(OffsetParams, \"OffsetParamsDto\");\n}\n\n/** Infinite-scroll params DTO'si. Qarang: {@link makeOffsetParamsDto}. */\nexport function makeInfiniteParamsDto(options: ParamsDtoOptions = {}) {\n class InfiniteParams implements ServerOwnedParams {\n filter?: Filter;\n sort?: Sort;\n limit?: number;\n offset?: number;\n columns?: Record<string, boolean>;\n with?: Record<string, unknown>;\n withDeleted?: boolean;\n }\n\n applyFilterAndSort(InfiniteParams.prototype, options, true);\n applyNumber(InfiniteParams.prototype, \"limit\", { positive: true, max: options.maxLimit ?? DEFAULT_MAX_LIMIT });\n applyNumber(InfiniteParams.prototype, \"offset\", { min: 0 });\n\n return nameClass(InfiniteParams, \"InfiniteParamsDto\");\n}\n\n/** Cursor (keyset) params DTO'si — `sort` yo'q. Qarang: {@link makeOffsetParamsDto}. */\nexport function makeCursorParamsDto(options: ParamsDtoOptions = {}) {\n class CursorParams implements ServerOwnedParams {\n filter?: Filter;\n limit?: number;\n cursor?: string | null;\n cursorKey?: string;\n order?: SortDirection;\n direction?: \"forward\" | \"backward\";\n columns?: Record<string, boolean>;\n with?: Record<string, unknown>;\n withDeleted?: boolean;\n }\n\n const proto = CursorParams.prototype;\n applyFilterAndSort(proto, options, false);\n applyNumber(proto, \"limit\", { positive: true, max: options.maxLimit ?? DEFAULT_MAX_LIMIT });\n\n IsOptional()(proto, \"cursor\");\n IsString()(proto, \"cursor\");\n IsOptional()(proto, \"cursorKey\");\n IsString()(proto, \"cursorKey\");\n IsOptional()(proto, \"order\");\n IsIn([\"asc\", \"desc\"])(proto, \"order\");\n IsOptional()(proto, \"direction\");\n IsIn([\"forward\", \"backward\"])(proto, \"direction\");\n\n return nameClass(CursorParams, \"CursorParamsDto\");\n}\n"]}
1
+ {"version":3,"sources":["../src/locales.ts","../src/dto.ts"],"names":["QUERYKIT_MESSAGES_EN","IsOptional","Type","IsInt","IsPositive","Min","Max","IsBoolean","IsObject","IsQueryFilter","IsQuerySort","resolveLimits","IsWithinMaxOffset","DEFAULT_MAX_PER_PAGE","DEFAULT_MAX_LIMIT","IsString","IsIn"],"mappings":";;;;;;;;;;AAwBO,IAAM,oBAAA,GAA+C;AAAA,EAC1D,8BAAA,EAAgC,4DAAA;AAAA,EAChC,6BAAA,EAA+B,wCAAA;AAAA,EAC/B,6BAAA,EAA+B,mDAAA;AAAA,EAC/B,kCAAA,EAAoC,qEAAA;AAAA,EACpC,+BAAA,EAAiC,4EAAA;AAAA,EACjC,+BAAA,EAAiC,gDAAA;AAAA,EACjC,2BAAA,EAA6B,yCAAA;AAAA,EAC7B,sCAAA,EAAwC,kDAAA;AAAA,EACxC,sCAAA,EAAwC,wDAAA;AAAA,EACxC,iCAAA,EAAmC,6CAAA;AAAA,EACnC,yBAAA,EAA2B,yEAAA;AAAA,EAC3B,4BAAA,EAA8B,2DAAA;AAAA,EAC9B,2BAAA,EAA6B,wCAAA;AAAA,EAC7B,2BAAA,EAA6B,iDAAA;AAAA,EAC7B,iCAAA,EAAmC,oDAAA;AAAA,EACnC,yBAAA,EAA2B;AAC7B,CAAA,CAAA,CAGa,oBAAA,GAA+C;AAAA,EAC1D,8BAAA,EAAgC,2OAAA;AAAA,EAChC,6BAAA,EAA+B,iOAAA;AAAA,EAC/B,6BAAA,EAA+B,qKAAA;AAAA,EAC/B,kCAAA,EAAoC,2NAAA;AAAA,EACpC,+BAAA,EAAiC,0QAAA;AAAA,EACjC,+BAAA,EAAiC,iMAAA;AAAA,EACjC,2BAAA,EAA6B,+GAAA;AAAA,EAC7B,sCAAA,EAAwC,wJAAA;AAAA,EACxC,sCAAA,EAAwC,qKAAA;AAAA,EACxC,iCAAA,EAAmC,iLAAA;AAAA,EACnC,yBAAA,EAA2B,mMAAA;AAAA,EAC3B,4BAAA,EAA8B,0MAAA;AAAA,EAC9B,2BAAA,EAA6B,iOAAA;AAAA,EAC7B,2BAAA,EAA6B,uLAAA;AAAA,EAC7B,iCAAA,EAAmC,iHAAA;AAAA,EACnC,yBAAA,EAA2B;AAC7B,CAAA,CAAA,CAMa,gBAAA,GAAmB;AAAA,EAC9B,EAAA,EAAIA,6BAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI;AACN;ACNA,IAAM,WAAA,GAAc,CAAC,KAAA,EAAe,QAAA,EAAkB,MAAA,KAAqE;AACzH,EAAAC,yBAAA,EAAW,CAAE,OAAO,QAAQ,CAAA,EAC5BC,sBAAK,MAAM,MAAM,EAAE,KAAA,EAAO,QAAQ,GAClCC,oBAAA,EAAM,CAAE,OAAO,QAAQ,CAAA,EACnB,OAAO,QAAA,IAAUC,yBAAA,EAAW,CAAE,KAAA,EAAO,QAAQ,CAAA,EAC7C,OAAO,GAAA,KAAQ,MAAA,IAAWC,mBAAI,MAAA,CAAO,GAAG,EAAE,KAAA,EAAO,QAAQ,GAGzD,MAAA,CAAO,GAAA,KAAQ,UAAa,MAAA,CAAO,QAAA,CAAS,OAAO,GAAG,CAAA,IAAGC,mBAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,EAAO,QAAQ,CAAA;AAC9F,CAAA,EAEM,gBAAA,GAAmB,CAAC,KAAA,EAAe,KAAA,KAAkC;AACzE,EAAAL,yBAAA,EAAW,CAAE,KAAA,EAAO,KAAK,CAAA,EACrB,UAAU,aAAA,GAAeM,wBAAA,EAAU,CAAE,KAAA,EAAO,KAAK,CAAA,GAChDC,uBAAA,EAAS,CAAE,OAAO,KAAK,CAAA;AAC9B,CAAA,EAEM,kBAAA,GAAqB,CAAC,KAAA,EAAe,OAAA,EAA2B,QAAqB,QAAA,KAA4B;AAErH,EAAAP,yBAAA,EAAW,CAAE,OAAO,QAAQ,CAAA,EAC5BQ,gCAAc,EAAE,GAAG,QAAQ,GAAG,OAAA,CAAQ,QAAQ,WAAA,EAAa,OAAA,CAAQ,QAAQ,WAAA,IAAe,OAAA,CAAQ,aAAa,CAAA,CAAE,OAAO,QAAQ,CAAA,EAE5H,aACFR,yBAAA,EAAW,CAAE,OAAO,MAAM,CAAA,EAC1BS,8BAAY,EAAE,GAAG,QAAQ,GAAG,OAAA,CAAQ,MAAM,WAAA,EAAa,OAAA,CAAQ,MAAM,WAAA,IAAe,OAAA,CAAQ,aAAa,CAAA,CAAE,OAAO,MAAM,CAAA,CAAA;AAG1H,EAAA,KAAA,IAAW,SAAS,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,gBAAA,CAAiB,OAAO,KAAK,CAAA;AACxE,CAAA,EAGM,SAAA,GAAY,CAAuD,GAAA,EAAQ,IAAA,MAC/E,OAAO,cAAA,CAAe,GAAA,EAAK,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,CAAA,EAC/D,GAAA,CAAA;AAiBF,SAAS,mBAAA,CAAoB,OAAA,GAA4B,EAAC,EAAG;AAAA,EAClE,MAAM,YAAA,CAA0C;AAAA;AAWhD,EAAA,IAAM,MAAA,GAASC,kBAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,OAAA,kBAAA,CAAmB,YAAA,CAAa,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,IAAI,GAChE,WAAA,CAAY,YAAA,CAAa,SAAA,EAAW,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAM,CAAA,EAC9DC,mCAAA,CAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,CAAA,CAAE,YAAA,CAAa,SAAA,EAAW,MAAM,GAC/F,WAAA,CAAY,YAAA,CAAa,SAAA,EAAW,SAAA,EAAW,EAAE,QAAA,EAAU,IAAA,EAAM,GAAA,EAAK,OAAA,CAAQ,UAAA,IAAcC,yBAAA,EAAsB,CAAA,EAClHZ,yBAAA,GAAa,YAAA,CAAa,SAAA,EAAW,WAAW,CAAA,EAChDM,wBAAA,EAAU,CAAE,YAAA,CAAa,SAAA,EAAW,WAAW,CAAA,EAExC,SAAA,CAAU,YAAA,EAAc,iBAAiB,CAAA;AAClD;AAGO,SAAS,qBAAA,CAAsB,OAAA,GAA4B,EAAC,EAAG;AAAA,EACpE,MAAM,cAAA,CAA4C;AAAA;AAUlD,EAAA,IAAM,MAAA,GAASI,kBAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,OAAA,kBAAA,CAAmB,eAAe,SAAA,EAAW,OAAA,EAAS,QAAQ,IAAI,CAAA,EAClE,YAAY,cAAA,CAAe,SAAA,EAAW,SAAS,EAAE,QAAA,EAAU,MAAM,GAAA,EAAK,OAAA,CAAQ,YAAYG,sBAAA,EAAmB,GAC7G,WAAA,CAAY,cAAA,CAAe,WAAW,QAAA,EAAU,EAAE,KAAK,CAAA,EAAG,GAC1DF,mCAAA,CAAkB,EAAE,MAAM,QAAA,EAAU,SAAA,EAAW,OAAO,SAAA,EAAW,EAAE,cAAA,CAAe,SAAA,EAAW,QAAQ,CAAA,EAE9F,SAAA,CAAU,gBAAgB,mBAAmB,CAAA;AACtD;AAGO,SAAS,mBAAA,CAAoB,OAAA,GAA4B,EAAC,EAAG;AAAA,EAClE,MAAM,YAAA,CAA0C;AAAA;AAYhD,EAAA,IAAM,QAAQ,YAAA,CAAa,SAAA;AAC3B,EAAA,OAAA,kBAAA,CAAmB,KAAA,EAAO,OAAA,EAASD,kBAAA,CAAc,OAAA,CAAQ,MAAM,CAAA,EAAG,KAAK,CAAA,EACvE,WAAA,CAAY,KAAA,EAAO,OAAA,EAAS,EAAE,QAAA,EAAU,MAAM,GAAA,EAAK,OAAA,CAAQ,QAAA,IAAYG,sBAAA,EAAmB,CAAA,EAE1Fb,yBAAA,EAAW,CAAE,OAAO,QAAQ,CAAA,EAC5Bc,uBAAA,EAAS,CAAE,OAAO,QAAQ,CAAA,EAC1Bd,yBAAA,EAAW,CAAE,OAAO,WAAW,CAAA,EAC/Bc,uBAAA,EAAS,CAAE,KAAA,EAAO,WAAW,CAAA,EAC7Bd,yBAAA,GAAa,KAAA,EAAO,OAAO,CAAA,EAC3Be,mBAAA,CAAK,CAAC,KAAA,EAAO,MAAM,CAAC,EAAE,KAAA,EAAO,OAAO,CAAA,EACpCf,yBAAA,EAAW,CAAE,KAAA,EAAO,WAAW,CAAA,EAC/Be,oBAAK,CAAC,SAAA,EAAW,UAAU,CAAC,EAAE,KAAA,EAAO,WAAW,CAAA,EAEzC,SAAA,CAAU,cAAc,iBAAiB,CAAA;AAClD","file":"index.cjs","sourcesContent":["/**\n * Xabar kataloglari — **yagona manba**. Har bir til bir xil kalitlar to'plamini\n * to'ldiradi; kalitlarning o'zi shu yerdagi inglizcha katalogdan chiqadi.\n *\n * Paket xatoni kalit bilan qaytargani uchun tillar soni cheklanmagan: tarjima\n * har doim iste'molchi tomonida (`nestjs-i18n` `I18nValidationPipe` yoki oddiy\n * `formatMessage(key, args, catalog)`). Bu yerdagi uchta katalog shunchaki eng\n * ko'p kerak bo'ladiganini qutidan beradi — hech biri majburiy emas.\n *\n * `QueryKitMessageCatalog` ataylab qat'iy (`Record<QueryKitMessageKey, string>`):\n * inglizchaga yangi kalit qo'shilsa, qolgan kataloglar **compile-time**da yorilib\n * beradi va eskirib qololmaydi.\n */\n\nimport { QUERYKIT_MESSAGES_EN, type QueryKitMessageCatalog } from \"@querykitjs/core/internal\";\n\n/**\n * Inglizcha katalog (kalitlarning kanonik ro'yxati), `QueryKitMessageKey` va\n * `QueryKitMessageCatalog` — core'dan (boshqa validatorlar bilan bitta matn).\n */\nexport { QUERYKIT_MESSAGES_EN };\nexport type { QueryKitMessageCatalog, QueryKitMessageKey } from \"@querykitjs/core/internal\";\n\n/** O'zbekcha katalog. Placeholder nomlari inglizchasi bilan bir xil. */\nexport const QUERYKIT_MESSAGES_UZ: QueryKitMessageCatalog = {\n \"querykit.filter.invalid_node\": \"{path} filter sharti yoki and/or/not guruhi bo'lishi kerak\",\n \"querykit.filter.missing_key\": \"{path} da majburiy `key` (string) yo'q\",\n \"querykit.filter.unknown_key\": \"{path}: `{key}` ruxsat etilgan filter kaliti emas\",\n \"querykit.filter.invalid_operator\": \"{path}: `{operation}` qo'llab-quvvatlanadigan filter operatori emas\",\n \"querykit.filter.invalid_value\": \"{path} string, raqam, boolean, null yoki shularning massivi bo'lishi kerak\",\n \"querykit.filter.invalid_group\": \"{path} filter tugunlari massivi bo'lishi kerak\",\n \"querykit.filter.max_depth\": \"{path} limitdan oshdi: maxDepth ({max})\",\n \"querykit.filter.value_requires_array\": \"{path}: `{operation}` massiv qiymat talab qiladi\",\n \"querykit.filter.value_requires_tuple\": \"{path}: `{operation}` aynan ikkita qiymat talab qiladi\",\n \"querykit.filter.value_forbidden\": \"{path}: `{operation}` qiymat qabul qilmaydi\",\n \"querykit.sort.not_array\": \"{path} `{ key, direction }` elementlaridan iborat massiv bo'lishi kerak\",\n \"querykit.sort.invalid_item\": \"{path} `key` (string) maydoniga ega obyekt bo'lishi kerak\",\n \"querykit.sort.missing_key\": \"{path} da majburiy `key` (string) yo'q\",\n \"querykit.sort.unknown_key\": \"{path}: `{key}` ruxsat etilgan sort kaliti emas\",\n \"querykit.sort.invalid_direction\": \"{path}: direction `asc` yoki `desc` bo'lishi kerak\",\n \"querykit.limit.exceeded\": \"{path} limitdan oshdi: {limit} ({max})\",\n};\n\n/** Ruscha katalog. */\nexport const QUERYKIT_MESSAGES_RU: QueryKitMessageCatalog = {\n \"querykit.filter.invalid_node\": \"{path} должен быть условием фильтра или группой and/or/not\",\n \"querykit.filter.missing_key\": \"в {path} отсутствует обязательное поле `key` (строка)\",\n \"querykit.filter.unknown_key\": \"{path}: `{key}` — недопустимый ключ фильтра\",\n \"querykit.filter.invalid_operator\": \"{path}: `{operation}` — неподдерживаемый оператор фильтра\",\n \"querykit.filter.invalid_value\": \"{path} должен быть строкой, числом, boolean, null или массивом из них\",\n \"querykit.filter.invalid_group\": \"{path} должен быть массивом узлов фильтра\",\n \"querykit.filter.max_depth\": \"{path} превышает лимит maxDepth ({max})\",\n \"querykit.filter.value_requires_array\": \"{path}: `{operation}` требует значение-массив\",\n \"querykit.filter.value_requires_tuple\": \"{path}: `{operation}` требует ровно два значения\",\n \"querykit.filter.value_forbidden\": \"{path}: `{operation}` не должен содержать значение\",\n \"querykit.sort.not_array\": \"{path} должен быть массивом элементов `{ key, direction }`\",\n \"querykit.sort.invalid_item\": \"{path} должен быть объектом с полем `key` (строка)\",\n \"querykit.sort.missing_key\": \"в {path} отсутствует обязательное поле `key` (строка)\",\n \"querykit.sort.unknown_key\": \"{path}: `{key}` — недопустимый ключ сортировки\",\n \"querykit.sort.invalid_direction\": \"{path}: direction должен быть `asc` или `desc`\",\n \"querykit.limit.exceeded\": \"{path} превышает лимит {limit} ({max})\",\n};\n\n/**\n * Til kodi → katalog. Qutidagi tillar; iste'molchi o'z katalogini shu shaklda\n * qo'shib, `formatMessage`ga uzata oladi.\n */\nexport const QUERYKIT_LOCALES = {\n en: QUERYKIT_MESSAGES_EN,\n uz: QUERYKIT_MESSAGES_UZ,\n ru: QUERYKIT_MESSAGES_RU,\n} as const satisfies Record<string, QueryKitMessageCatalog>;\n\n/** Qutidan chiqadigan til kodlari. */\nexport type QueryKitLocale = keyof typeof QUERYKIT_LOCALES;\n","/**\n * Param DTO'lari — uchala paginatsiya uchun (offset / infinite / cursor).\n *\n * Ikki yo'l bilan ishlatiladi (ikkalasi ham bitta `validateFilter` yadrosiga\n * tayanadi):\n *\n * 1. **Subclass** — `class ListUsersDto extends OffsetParamsDto` va kerak bo'lsa\n * `filter`ni `@IsQueryFilter({ allowedKeys })` bilan qayta e'lon qilish;\n * 2. **Factory** — `makeOffsetParamsDto({ allowedKeys })`, boilerplatesiz.\n *\n * **Xavfsiz default:** `columns` / `with` / `withDeleted` hech qaysi DTO'da\n * e'lon qilinmagan, ya'ni `ValidationPipe({ whitelist: true })` ularni o'chiradi;\n * `perPage` / `limit` esa core'ning `DEFAULT_MAX_PER_PAGE` / `DEFAULT_MAX_LIMIT`\n * chegarasi bilan cheklangan. Ochish faqat factory'ning `allow` opsiyasi orqali.\n * Har DTO core so'rov limitlarini ham qo'llaydi (filtr hajmi, sort soni, offset\n * chuqurligi); factory'da `limits` bilan o'zgartiriladi.\n */\nimport { Type } from \"class-transformer\";\nimport { IsBoolean, IsIn, IsInt, IsObject, IsOptional, IsPositive, IsString, Max, Min } from \"class-validator\";\nimport { DEFAULT_MAX_LIMIT, DEFAULT_MAX_PER_PAGE, resolveLimits } from \"@querykitjs/core\";\nimport type { Filter, QueryLimits, Sort, SortDirection } from \"@querykitjs/core\";\nimport { IsQueryFilter, IsQuerySort, IsWithinMaxOffset, type IsQueryFilterOptions, type IsQuerySortOptions } from \"./decorators\";\n\n/* -------------------------------- factories ------------------------------- */\n\n/** Server'ga tegishli, default'da clientdan qabul qilinmaydigan maydonlar. */\nexport type ServerOwnedField = \"columns\" | \"with\" | \"withDeleted\";\n\n/** `allow` bilan ochiladigan maydonlarning shakli. */\nexport interface ServerOwnedParams {\n columns?: Record<string, boolean>;\n with?: Record<string, unknown>;\n withDeleted?: boolean;\n}\n\nexport interface ParamsDtoOptions {\n /** `filter` uchun to'liq opsiyalar — `allowedKeys`, `allowedOperators`, `maxDepth`, `strictValue`, `messageStyle`. */\n filter?: IsQueryFilterOptions;\n /** `sort` uchun opsiyalar — `allowedKeys`, `messageStyle`. */\n sort?: IsQuerySortOptions;\n /**\n * `filter` va `sort` uchun umumiy allowlist qisqartmasi — odatda ikkalasi bir xil.\n * Aniq berilgan `filter.allowedKeys` / `sort.allowedKeys` bundan **ustun**.\n */\n allowedKeys?: readonly string[];\n /** `perPage` yuqori chegarasi. Default — core `DEFAULT_MAX_PER_PAGE` (200). `Infinity` — cap yo'q (⚠️ DoS). */\n maxPerPage?: number;\n /** `limit` yuqori chegarasi. Default — core `DEFAULT_MAX_LIMIT` (200). */\n maxLimit?: number;\n /**\n * So'rov limitlari; berilmaganlari core default'ida (`DEFAULT_QUERY_LIMITS`). Aniq\n * berilgan `filter.maxDepth`, `sort.maxSortFields`, … bundan **ustun**.\n * `Infinity` limitni o'chiradi (⚠️ DoS yuzasi).\n */\n limits?: Partial<QueryLimits>;\n /** Server-owned maydonlarni **ataylab** ochish. Default — bo'sh. */\n allow?: readonly ServerOwnedField[];\n}\n\n/* Dinamik klasslar static klasslardan meros OLMAYDI: meros bo'lsa ota-klassning\n * default `@IsQueryFilter()` dekoratori ham qo'shilib, filter ikki marta —\n * bir marta opsiyalar bilan, bir marta ularsiz — tekshirilardi. Shuningdek\n * static klasslar prototipiga hech qachon imperativ dekorator qo'yilmaydi:\n * u global ifloslanish bo'lardi. */\n\nconst applyNumber = (proto: object, property: string, bounds: { positive?: boolean; min?: number; max?: number }): void => {\n IsOptional()(proto, property);\n Type(() => Number)(proto, property);\n IsInt()(proto, property);\n if (bounds.positive) IsPositive()(proto, property);\n if (bounds.min !== undefined) Min(bounds.min)(proto, property);\n /* `Infinity` cap'ni butunlay o'chiradi — cheksiz `@Max` konstrainti qo'yishdan\n * ko'ra uni umuman qo'ymagan ma'qul (xato xabari ham chalg'itmaydi). */\n if (bounds.max !== undefined && Number.isFinite(bounds.max)) Max(bounds.max)(proto, property);\n};\n\nconst applyServerOwned = (proto: object, field: ServerOwnedField): void => {\n IsOptional()(proto, field);\n if (field === \"withDeleted\") IsBoolean()(proto, field);\n else IsObject()(proto, field);\n};\n\nconst applyFilterAndSort = (proto: object, options: ParamsDtoOptions, limits: QueryLimits, withSort: boolean): void => {\n /* `limits` first: a dedicated `filter.*` / `sort.*` option wins. Unrelated limit keys are ignored by the validators. */\n IsOptional()(proto, \"filter\");\n IsQueryFilter({ ...limits, ...options.filter, allowedKeys: options.filter?.allowedKeys ?? options.allowedKeys })(proto, \"filter\");\n\n if (withSort) {\n IsOptional()(proto, \"sort\");\n IsQuerySort({ ...limits, ...options.sort, allowedKeys: options.sort?.allowedKeys ?? options.allowedKeys })(proto, \"sort\");\n }\n\n for (const field of options.allow ?? []) applyServerOwned(proto, field);\n};\n\n/** Nest xato loglarida `class_1` emas, tushunarli nom chiqsin. */\nconst nameClass = <T extends abstract new (...args: never[]) => unknown>(cls: T, name: string): T => {\n Object.defineProperty(cls, \"name\", { value: name, configurable: true });\n return cls;\n};\n\n/**\n * Offset (sahifali) params DTO'si — `allowedKeys` va cap'lar bilan.\n *\n * @example\n * ```ts\n * const ListBuyersDto = makeOffsetParamsDto({ allowedKeys: [\"buyerName\", \"createdAt\"] });\n * type ListBuyersDto = InstanceType<typeof ListBuyersDto>;\n *\n * @Post(\"list\")\n * list(@Body() params: ListBuyersDto) {\n * return this.buyersRepository.findList(params);\n * }\n * ```\n */\nexport function makeOffsetParamsDto(options: ParamsDtoOptions = {}) {\n class OffsetParams implements ServerOwnedParams {\n filter?: Filter;\n sort?: Sort;\n page?: number;\n perPage?: number;\n withTotal?: boolean;\n columns?: Record<string, boolean>;\n with?: Record<string, unknown>;\n withDeleted?: boolean;\n }\n\n const limits = resolveLimits(options.limits);\n applyFilterAndSort(OffsetParams.prototype, options, limits, true);\n applyNumber(OffsetParams.prototype, \"page\", { positive: true });\n IsWithinMaxOffset({ mode: \"page\", maxOffset: limits.maxOffset })(OffsetParams.prototype, \"page\");\n applyNumber(OffsetParams.prototype, \"perPage\", { positive: true, max: options.maxPerPage ?? DEFAULT_MAX_PER_PAGE });\n IsOptional()(OffsetParams.prototype, \"withTotal\");\n IsBoolean()(OffsetParams.prototype, \"withTotal\");\n\n return nameClass(OffsetParams, \"OffsetParamsDto\");\n}\n\n/** Infinite-scroll params DTO'si. Qarang: {@link makeOffsetParamsDto}. */\nexport function makeInfiniteParamsDto(options: ParamsDtoOptions = {}) {\n class InfiniteParams implements ServerOwnedParams {\n filter?: Filter;\n sort?: Sort;\n limit?: number;\n offset?: number;\n columns?: Record<string, boolean>;\n with?: Record<string, unknown>;\n withDeleted?: boolean;\n }\n\n const limits = resolveLimits(options.limits);\n applyFilterAndSort(InfiniteParams.prototype, options, limits, true);\n applyNumber(InfiniteParams.prototype, \"limit\", { positive: true, max: options.maxLimit ?? DEFAULT_MAX_LIMIT });\n applyNumber(InfiniteParams.prototype, \"offset\", { min: 0 });\n IsWithinMaxOffset({ mode: \"offset\", maxOffset: limits.maxOffset })(InfiniteParams.prototype, \"offset\");\n\n return nameClass(InfiniteParams, \"InfiniteParamsDto\");\n}\n\n/** Cursor (keyset) params DTO'si — `sort` yo'q. Qarang: {@link makeOffsetParamsDto}. */\nexport function makeCursorParamsDto(options: ParamsDtoOptions = {}) {\n class CursorParams implements ServerOwnedParams {\n filter?: Filter;\n limit?: number;\n cursor?: string | null;\n cursorKey?: string;\n order?: SortDirection;\n direction?: \"forward\" | \"backward\";\n columns?: Record<string, boolean>;\n with?: Record<string, unknown>;\n withDeleted?: boolean;\n }\n\n const proto = CursorParams.prototype;\n applyFilterAndSort(proto, options, resolveLimits(options.limits), false);\n applyNumber(proto, \"limit\", { positive: true, max: options.maxLimit ?? DEFAULT_MAX_LIMIT });\n\n IsOptional()(proto, \"cursor\");\n IsString()(proto, \"cursor\");\n IsOptional()(proto, \"cursorKey\");\n IsString()(proto, \"cursorKey\");\n IsOptional()(proto, \"order\");\n IsIn([\"asc\", \"desc\"])(proto, \"order\");\n IsOptional()(proto, \"direction\");\n IsIn([\"forward\", \"backward\"])(proto, \"direction\");\n\n return nameClass(CursorParams, \"CursorParamsDto\");\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,32 @@
1
- import { FilterOperator, Filter, Sort, SortDirection } from '@querykitjs/core';
1
+ import { QueryKitMessageKey, MessageArgs, QueryKitMessageCatalog } from '@querykitjs/core/internal';
2
+ export { MessageArgs, QUERYKIT_MESSAGES_EN, QueryKitMessageCatalog, QueryKitMessageKey, formatMessage } from '@querykitjs/core/internal';
3
+ import { FilterOperator, Filter, Sort, SortDirection, QueryLimits } from '@querykitjs/core';
4
+ export { DEFAULT_MAX_FILTER_DEPTH } from '@querykitjs/core';
2
5
  import { ValidationOptions, ValidatorConstraintInterface, ValidationArguments } from 'class-validator';
3
6
 
7
+ /**
8
+ * Xabar formatlash. Kataloglar `locales.ts`da; `formatMessage` core'da
9
+ * (boshqa validatorlar bilan bitta), bu yerda faqat `localizeIssue`.
10
+ *
11
+ * Har bir {@link ValidationIssue} uchta narsani olib yuradi: `key` (tarjima
12
+ * kaliti), `message` (tayyor matn) va `args` (interpolatsiya qiymatlari). Shu
13
+ * sababli paket i18n'ga **majburlamaydi**, lekin unga to'liq mos.
14
+ */
15
+
16
+ /**
17
+ * Issue'ni tanlangan tilda qayta formatlaydi — `message` inglizcha yozilgan
18
+ * bo'lsa ham, javobni boshqa tilda berish uchun.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * issues.map(issue => localizeIssue(issue, QUERYKIT_MESSAGES_RU));
23
+ * ```
24
+ */
25
+ declare function localizeIssue(issue: {
26
+ key: QueryKitMessageKey;
27
+ args: MessageArgs;
28
+ }, catalog: QueryKitMessageCatalog): string;
29
+
4
30
  /**
5
31
  * Xabar kataloglari — **yagona manba**. Har bir til bir xil kalitlar to'plamini
6
32
  * to'ldiradi; kalitlarning o'zi shu yerdagi inglizcha katalogdan chiqadi.
@@ -14,34 +40,7 @@ import { ValidationOptions, ValidatorConstraintInterface, ValidationArguments }
14
40
  * inglizchaga yangi kalit qo'shilsa, qolgan kataloglar **compile-time**da yorilib
15
41
  * beradi va eskirib qololmaydi.
16
42
  */
17
- /**
18
- * Inglizcha katalog — kalitlarning kanonik ro'yxati va default fallback.
19
- * `{placeholder}` lar `formatMessage` bilan to'ldiriladi.
20
- */
21
- declare const QUERYKIT_MESSAGES_EN: {
22
- readonly "querykit.filter.invalid_node": "{path} must be a filter condition or an and/or/not group";
23
- readonly "querykit.filter.missing_key": "{path} is missing the required `key` string";
24
- readonly "querykit.filter.unknown_key": "{path}: `{key}` is not an allowed filter key";
25
- readonly "querykit.filter.invalid_operator": "{path}: `{operation}` is not a supported filter operator";
26
- readonly "querykit.filter.invalid_value": "{path} must be a string, number, boolean, null, or an array of those";
27
- readonly "querykit.filter.invalid_group": "{path} must be an array of filter nodes";
28
- readonly "querykit.filter.max_depth": "{path} exceeds the maximum filter depth of {max}";
29
- readonly "querykit.filter.value_requires_array": "{path}: `{operation}` requires an array value";
30
- readonly "querykit.filter.value_requires_tuple": "{path}: `{operation}` requires exactly two values";
31
- readonly "querykit.filter.value_forbidden": "{path}: `{operation}` must not carry a value";
32
- readonly "querykit.sort.not_array": "{path} must be an array of { key, direction } items";
33
- readonly "querykit.sort.invalid_item": "{path} must be an object with a `key` string";
34
- readonly "querykit.sort.missing_key": "{path} is missing the required `key` string";
35
- readonly "querykit.sort.unknown_key": "{path}: `{key}` is not an allowed sort key";
36
- readonly "querykit.sort.invalid_direction": "{path}: direction must be `asc` or `desc`";
37
- };
38
- /**
39
- * Har bir validatsiya xatosining i18n kaliti. Union inglizcha katalogdan chiqadi —
40
- * yangi xabar qo'shilsa tip o'zi kengayadi, qo'lda ro'yxat yuritilmaydi.
41
- */
42
- type QueryKitMessageKey = keyof typeof QUERYKIT_MESSAGES_EN;
43
- /** Bitta tilning to'liq katalogi — barcha kalitlar majburiy. */
44
- type QueryKitMessageCatalog = Record<QueryKitMessageKey, string>;
43
+
45
44
  /** O'zbekcha katalog. Placeholder nomlari inglizchasi bilan bir xil. */
46
45
  declare const QUERYKIT_MESSAGES_UZ: QueryKitMessageCatalog;
47
46
  /** Ruscha katalog. */
@@ -58,7 +57,7 @@ declare const QUERYKIT_LOCALES: {
58
57
  readonly "querykit.filter.invalid_operator": "{path}: `{operation}` is not a supported filter operator";
59
58
  readonly "querykit.filter.invalid_value": "{path} must be a string, number, boolean, null, or an array of those";
60
59
  readonly "querykit.filter.invalid_group": "{path} must be an array of filter nodes";
61
- readonly "querykit.filter.max_depth": "{path} exceeds the maximum filter depth of {max}";
60
+ readonly "querykit.filter.max_depth": "{path} exceeds maxDepth ({max})";
62
61
  readonly "querykit.filter.value_requires_array": "{path}: `{operation}` requires an array value";
63
62
  readonly "querykit.filter.value_requires_tuple": "{path}: `{operation}` requires exactly two values";
64
63
  readonly "querykit.filter.value_forbidden": "{path}: `{operation}` must not carry a value";
@@ -67,6 +66,7 @@ declare const QUERYKIT_LOCALES: {
67
66
  readonly "querykit.sort.missing_key": "{path} is missing the required `key` string";
68
67
  readonly "querykit.sort.unknown_key": "{path}: `{key}` is not an allowed sort key";
69
68
  readonly "querykit.sort.invalid_direction": "{path}: direction must be `asc` or `desc`";
69
+ readonly "querykit.limit.exceeded": "{path} exceeds {limit} ({max})";
70
70
  };
71
71
  readonly uz: QueryKitMessageCatalog;
72
72
  readonly ru: QueryKitMessageCatalog;
@@ -75,46 +75,13 @@ declare const QUERYKIT_LOCALES: {
75
75
  type QueryKitLocale = keyof typeof QUERYKIT_LOCALES;
76
76
 
77
77
  /**
78
- * Xabar formatlash. Kataloglarning o'zi `locales.ts`da — bu fayl faqat
79
- * `{placeholder}` interpolatsiyasini biladi va hech qanday tilga bog'lanmagan.
80
- *
81
- * Har bir {@link ValidationIssue} uchta narsani olib yuradi: `key` (tarjima
82
- * kaliti), `message` (tayyor matn) va `args` (interpolatsiya qiymatlari). Shu
83
- * sababli paket i18n'ga **majburlamaydi**, lekin unga to'liq mos.
84
- */
85
-
86
- /** Shablon interpolatsiyasi argumentlari — `I18nValidationPipe`ga ham shu shaklda uzatiladi. */
87
- type MessageArgs = Record<string, string | number>;
88
- /**
89
- * Kalitni matnga aylantiradi: katalogdan shablon olinadi va `{placeholder}` lar
90
- * `args` bilan almashtiriladi. Mos argument topilmasa placeholder o'z holicha
91
- * qoladi — xabar hech qachon bo'sh chiqmaydi.
92
- *
93
- * @param catalog Til katalogi. Default — inglizcha; `QUERYKIT_MESSAGES_UZ`,
94
- * `QUERYKIT_MESSAGES_RU` yoki o'zingizniki uzatilishi mumkin.
95
- *
96
- * @example
97
- * ```ts
98
- * formatMessage(issue.key, issue.args, QUERYKIT_MESSAGES_UZ);
99
- * ```
100
- */
101
- declare function formatMessage(key: QueryKitMessageKey, args?: MessageArgs, catalog?: QueryKitMessageCatalog): string;
102
- /**
103
- * Issue'ni tanlangan tilda qayta formatlaydi — `message` inglizcha yozilgan
104
- * bo'lsa ham, javobni boshqa tilda berish uchun.
105
- *
106
- * @example
107
- * ```ts
108
- * issues.map(issue => localizeIssue(issue, QUERYKIT_MESSAGES_RU));
109
- * ```
78
+ * Sof TS validatsiya yadrosi — **framework-agnostik**. Tekshiruv mantiqi core
79
+ * `checkFilter`/`checkSort` da (`@querykitjs/core/internal`) — boshqa validatorlar
80
+ * bilan bitta; bu yerda faqat yo'l satri va xabar matni quriladi.
81
+ * `class-validator` dekoratorlari (`decorators.ts`) faqat yupqa o'rov, shuning
82
+ * uchun yadroni Nest'siz ham (Express, Hono, oddiy funksiya) ishlatish mumkin.
110
83
  */
111
- declare function localizeIssue(issue: {
112
- key: QueryKitMessageKey;
113
- args: MessageArgs;
114
- }, catalog: QueryKitMessageCatalog): string;
115
84
 
116
- /** Filter daraxti chuqurligi default limiti — cheklovsiz rekursiya DoS yuzasi. */
117
- declare const DEFAULT_MAX_FILTER_DEPTH = 5;
118
85
  interface QueryFilterOptions {
119
86
  /**
120
87
  * Berilsa — faqat shu kalitlarga ruxsat; noma'lum kalit **rad etiladi**.
@@ -125,8 +92,14 @@ interface QueryFilterOptions {
125
92
  allowedKeys?: readonly string[];
126
93
  /** Ruxsat etilgan operatorlar. Default — core `FILTER_OPERATORS`ning hammasi. */
127
94
  allowedOperators?: readonly FilterOperator[];
128
- /** `and`/`or`/`not` tugunlarining chuqurlik limiti. Default — {@link DEFAULT_MAX_FILTER_DEPTH}. */
95
+ /** Ildizdan bargacha tugunlar soni (ildiz 1, har `and`/`or`/`not` va shart +1). Default — core `DEFAULT_MAX_FILTER_DEPTH` (5). */
129
96
  maxDepth?: number;
97
+ /** Barcha guruhlardagi shartlar (barglar) soni. Default — core `DEFAULT_MAX_CONDITIONS` (30). */
98
+ maxConditions?: number;
99
+ /** Bitta massiv qiymatdagi elementlar (`in`, `notIn`, …). Default — core `DEFAULT_MAX_IN_ITEMS` (200). */
100
+ maxInItems?: number;
101
+ /** Bitta satr qiymatdagi belgilar (massiv ichida ham). Default — core `DEFAULT_MAX_STRING_LENGTH` (256). */
102
+ maxStringLength?: number;
130
103
  /**
131
104
  * Operator↔qiymat shakli tekshiruvi (opt-in): `in`/`notIn` massiv talab qiladi,
132
105
  * `between`/`notBetween` — aynan ikki element, `isNull`/`isNotNull` — qiymatsiz.
@@ -143,6 +116,8 @@ interface QueryFilterOptions {
143
116
  interface QuerySortOptions {
144
117
  /** Berilsa — faqat shu kalitlar bo'yicha saralashga ruxsat. */
145
118
  allowedKeys?: readonly string[];
119
+ /** `sort` massividagi maydonlar soni. Default — core `DEFAULT_MAX_SORT_FIELDS` (3). */
120
+ maxSortFields?: number;
146
121
  /** `path`ning ildizi. Default `"sort"`. Qarang: {@link QueryFilterOptions.rootPath}. */
147
122
  rootPath?: string;
148
123
  }
@@ -194,6 +169,34 @@ declare class IsQuerySortConstraint implements ValidatorConstraintInterface {
194
169
  validate(value: unknown, args?: ValidationArguments): boolean;
195
170
  defaultMessage(args?: ValidationArguments): string;
196
171
  }
172
+ /** `@IsWithinMaxOffset()` opsiyalari. */
173
+ interface IsWithinMaxOffsetOptions {
174
+ /**
175
+ * `"page"` — property `page`, offset `(page - 1) × perPage` (o'sha obyektning `perPage`i,
176
+ * yo'q bo'lsa core `DEFAULT_PER_PAGE`); `"offset"` — property qiymatining o'zi (infinite).
177
+ */
178
+ mode: "page" | "offset";
179
+ /** Default — core `DEFAULT_MAX_OFFSET` (10 000). `Infinity` tekshiruvni o'chiradi. */
180
+ maxOffset?: number;
181
+ }
182
+ /** `@IsWithinMaxOffset()` ortidagi konstraint. Raqam bo'lmagan qiymatni `@IsInt()` rad etadi, bu yerda o'tadi. */
183
+ declare class IsWithinMaxOffsetConstraint implements ValidatorConstraintInterface {
184
+ validate(value: unknown, args?: ValidationArguments): boolean;
185
+ defaultMessage(args?: ValidationArguments): string;
186
+ }
187
+ /**
188
+ * Sahifa chuqurligini cheklaydi: `page` uchun `(page - 1) × perPage`, infinite `offset` uchun
189
+ * qiymatning o'zi `maxOffset`dan oshmasin. Chuqurroq sahifalar — cursor paginatsiya.
190
+ *
191
+ * @example
192
+ * ```ts
193
+ * class ListDto {
194
+ * @IsOptional() @Type(() => Number) @IsInt() @IsPositive() @IsWithinMaxOffset({ mode: "page" })
195
+ * page?: number;
196
+ * }
197
+ * ```
198
+ */
199
+ declare function IsWithinMaxOffset(options: IsWithinMaxOffsetOptions, validationOptions?: ValidationOptions): PropertyDecorator;
197
200
  /**
198
201
  * Property'ni querykit `Filter` kontraktiga tekshiradi: flat massiv (implicit AND),
199
202
  * nested `and`/`or`/`not` daraxti va core `FILTER_OPERATORS`ning to'liq to'plami.
@@ -217,17 +220,31 @@ declare function IsQueryFilter(options?: IsQueryFilterOptions, validationOptions
217
220
  */
218
221
  declare function IsQuerySort(options?: IsQuerySortOptions, validationOptions?: ValidationOptions): PropertyDecorator;
219
222
 
220
- /** Paginatsiyasiz umumiy params — `filter` + `sort`. */
223
+ /**
224
+ * Paginatsiyasiz umumiy params — `filter` + `sort`.
225
+ *
226
+ * @deprecated Use `makeOffsetParamsDto` / `makeInfiniteParamsDto` / `makeCursorParamsDto` (safe defaults). Removed in the next major.
227
+ */
221
228
  declare class BaseParamsDto {
222
229
  filter?: Filter;
223
230
  sort?: Sort;
224
231
  }
225
- /** Offset (sahifali) params — `page` + `perPage` (`perPage` ≤ core cap). */
232
+ /**
233
+ * Offset (sahifali) params — `page` + `perPage` (`perPage` ≤ core cap).
234
+ *
235
+ * @deprecated Use `makeOffsetParamsDto` (safe defaults). Removed in the next major.
236
+ */
226
237
  declare class OffsetParamsDto extends BaseParamsDto {
227
238
  page?: number;
228
239
  perPage?: number;
240
+ /** `false` — no count; the meta totals are `null`. */
241
+ withTotal?: boolean;
229
242
  }
230
- /** Infinite-scroll params — `limit` + `offset`. */
243
+ /**
244
+ * Infinite-scroll params — `limit` + `offset`.
245
+ *
246
+ * @deprecated Use `makeInfiniteParamsDto` (safe defaults). Removed in the next major.
247
+ */
231
248
  declare class InfiniteParamsDto extends BaseParamsDto {
232
249
  limit?: number;
233
250
  offset?: number;
@@ -236,6 +253,8 @@ declare class InfiniteParamsDto extends BaseParamsDto {
236
253
  * Cursor (keyset) params. `sort` **yo'q**: tartib `order` + `direction` bilan
237
254
  * boshqariladi. Shu sababli `BaseParamsDto`dan meros olinmaydi — aks holda
238
255
  * `sort` kontraktga qarshi ravishda meros bo'lib qolardi.
256
+ *
257
+ * @deprecated Use `makeCursorParamsDto` (safe defaults). Removed in the next major.
239
258
  */
240
259
  declare class CursorParamsDto {
241
260
  filter?: Filter;
@@ -245,6 +264,7 @@ declare class CursorParamsDto {
245
264
  order?: SortDirection;
246
265
  direction?: "forward" | "backward";
247
266
  }
267
+
248
268
  /** Server'ga tegishli, default'da clientdan qabul qilinmaydigan maydonlar. */
249
269
  type ServerOwnedField = "columns" | "with" | "withDeleted";
250
270
  /** `allow` bilan ochiladigan maydonlarning shakli. */
@@ -267,6 +287,12 @@ interface ParamsDtoOptions {
267
287
  maxPerPage?: number;
268
288
  /** `limit` yuqori chegarasi. Default — core `DEFAULT_MAX_LIMIT` (200). */
269
289
  maxLimit?: number;
290
+ /**
291
+ * So'rov limitlari; berilmaganlari core default'ida (`DEFAULT_QUERY_LIMITS`). Aniq
292
+ * berilgan `filter.maxDepth`, `sort.maxSortFields`, … bundan **ustun**.
293
+ * `Infinity` limitni o'chiradi (⚠️ DoS yuzasi).
294
+ */
295
+ limits?: Partial<QueryLimits>;
270
296
  /** Server-owned maydonlarni **ataylab** ochish. Default — bo'sh. */
271
297
  allow?: readonly ServerOwnedField[];
272
298
  }
@@ -290,6 +316,7 @@ declare function makeOffsetParamsDto(options?: ParamsDtoOptions): {
290
316
  sort?: Sort;
291
317
  page?: number;
292
318
  perPage?: number;
319
+ withTotal?: boolean;
293
320
  columns?: Record<string, boolean>;
294
321
  with?: Record<string, unknown>;
295
322
  withDeleted?: boolean;
@@ -322,4 +349,5 @@ declare function makeCursorParamsDto(options?: ParamsDtoOptions): {
322
349
  };
323
350
  };
324
351
 
325
- export { BaseParamsDto, CursorParamsDto, DEFAULT_MAX_FILTER_DEPTH, InfiniteParamsDto, IsQueryFilter, IsQueryFilterConstraint, type IsQueryFilterOptions, IsQuerySort, IsQuerySortConstraint, type IsQuerySortOptions, type MessageArgs, type MessageStyleOptions, OffsetParamsDto, type ParamsDtoOptions, QUERYKIT_LOCALES, QUERYKIT_MESSAGES_EN, QUERYKIT_MESSAGES_RU, QUERYKIT_MESSAGES_UZ, type QueryFilterOptions, type QueryKitLocale, type QueryKitMessageCatalog, type QueryKitMessageKey, type QuerySortOptions, type ServerOwnedField, type ServerOwnedParams, type ValidationIssue, formatMessage, localizeIssue, makeCursorParamsDto, makeInfiniteParamsDto, makeOffsetParamsDto, validateFilter, validateSort };
352
+ export { BaseParamsDto, CursorParamsDto, InfiniteParamsDto, IsQueryFilter, IsQueryFilterConstraint, IsQuerySort, IsQuerySortConstraint, IsWithinMaxOffset, IsWithinMaxOffsetConstraint, OffsetParamsDto, QUERYKIT_LOCALES, QUERYKIT_MESSAGES_RU, QUERYKIT_MESSAGES_UZ, localizeIssue, makeCursorParamsDto, makeInfiniteParamsDto, makeOffsetParamsDto, validateFilter, validateSort };
353
+ export type { IsQueryFilterOptions, IsQuerySortOptions, IsWithinMaxOffsetOptions, MessageStyleOptions, ParamsDtoOptions, QueryFilterOptions, QueryKitLocale, QuerySortOptions, ServerOwnedField, ServerOwnedParams, ValidationIssue };