@querykitjs/class-validator 2.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,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkKXCJO556_cjs = require('./chunk-KXCJO556.cjs');
3
+ var chunkHKLXL3NW_cjs = require('./chunk-HKLXL3NW.cjs');
4
4
  var classValidator = require('class-validator');
5
5
  var core = require('@querykitjs/core');
6
6
  var internal = require('@querykitjs/core/internal');
@@ -13,26 +13,26 @@ var optionsOf = (args, fallbackPath) => {
13
13
  return first ? options.messageStyle === "key" ? first.key : first.message : `${args?.property ?? "value"} ${fallback}`;
14
14
  }; exports.IsQueryFilterConstraint = class IsQueryFilterConstraint {
15
15
  validate(value, args) {
16
- return chunkKXCJO556_cjs.validateFilter(value, optionsOf(args, "filter")).length === 0;
16
+ return chunkHKLXL3NW_cjs.validateFilter(value, optionsOf(args, "filter")).length === 0;
17
17
  }
18
18
  defaultMessage(args) {
19
19
  let options = optionsOf(args, "filter");
20
- return firstMessage(chunkKXCJO556_cjs.validateFilter(args?.value, options), options, args, "is not a valid querykit filter");
20
+ return firstMessage(chunkHKLXL3NW_cjs.validateFilter(args?.value, options), options, args, "is not a valid querykit filter");
21
21
  }
22
22
  };
23
- exports.IsQueryFilterConstraint = chunkKXCJO556_cjs.__decorateClass([
23
+ exports.IsQueryFilterConstraint = chunkHKLXL3NW_cjs.__decorateClass([
24
24
  classValidator.ValidatorConstraint({ name: "isQueryFilter", async: false })
25
25
  ], exports.IsQueryFilterConstraint);
26
26
  exports.IsQuerySortConstraint = class IsQuerySortConstraint {
27
27
  validate(value, args) {
28
- return chunkKXCJO556_cjs.validateSort(value, optionsOf(args, "sort")).length === 0;
28
+ return chunkHKLXL3NW_cjs.validateSort(value, optionsOf(args, "sort")).length === 0;
29
29
  }
30
30
  defaultMessage(args) {
31
31
  let options = optionsOf(args, "sort");
32
- return firstMessage(chunkKXCJO556_cjs.validateSort(args?.value, options), options, args, "is not a valid querykit sort");
32
+ return firstMessage(chunkHKLXL3NW_cjs.validateSort(args?.value, options), options, args, "is not a valid querykit sort");
33
33
  }
34
34
  };
35
- exports.IsQuerySortConstraint = chunkKXCJO556_cjs.__decorateClass([
35
+ exports.IsQuerySortConstraint = chunkHKLXL3NW_cjs.__decorateClass([
36
36
  classValidator.ValidatorConstraint({ name: "isQuerySort", async: false })
37
37
  ], exports.IsQuerySortConstraint);
38
38
  var maxOffsetOf = (args) => args?.constraints?.[0]?.maxOffset ?? core.DEFAULT_MAX_OFFSET; exports.IsWithinMaxOffsetConstraint = class IsWithinMaxOffsetConstraint {
@@ -42,10 +42,10 @@ var maxOffsetOf = (args) => args?.constraints?.[0]?.maxOffset ?? core.DEFAULT_MA
42
42
  return (args?.constraints?.[0]?.mode === "page" ? internal.offsetOf(value, typeof perPage == "number" ? perPage : void 0) : value) <= maxOffsetOf(args);
43
43
  }
44
44
  defaultMessage(args) {
45
- return chunkKXCJO556_cjs.formatMessage("querykit.limit.exceeded", { path: args?.property ?? "offset", limit: "maxOffset", max: maxOffsetOf(args) });
45
+ return chunkHKLXL3NW_cjs.formatMessage("querykit.limit.exceeded", { path: args?.property ?? "offset", limit: "maxOffset", max: maxOffsetOf(args) });
46
46
  }
47
47
  };
48
- exports.IsWithinMaxOffsetConstraint = chunkKXCJO556_cjs.__decorateClass([
48
+ exports.IsWithinMaxOffsetConstraint = chunkHKLXL3NW_cjs.__decorateClass([
49
49
  classValidator.ValidatorConstraint({ name: "isWithinMaxOffset", async: false })
50
50
  ], exports.IsWithinMaxOffsetConstraint);
51
51
  function IsWithinMaxOffset(options, validationOptions) {
@@ -85,5 +85,5 @@ function IsQuerySort(options, validationOptions) {
85
85
  exports.IsQueryFilter = IsQueryFilter;
86
86
  exports.IsQuerySort = IsQuerySort;
87
87
  exports.IsWithinMaxOffset = IsWithinMaxOffset;
88
- //# sourceMappingURL=chunk-X7HMP7H7.cjs.map
89
- //# sourceMappingURL=chunk-X7HMP7H7.cjs.map
88
+ //# sourceMappingURL=chunk-AX53IY63.cjs.map
89
+ //# sourceMappingURL=chunk-AX53IY63.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/decorators.ts"],"names":["IsQueryFilterConstraint","validateFilter","__decorateClass","ValidatorConstraint","IsQuerySortConstraint","validateSort","DEFAULT_MAX_OFFSET","IsWithinMaxOffsetConstraint","offsetOf","formatMessage","registerDecorator"],"mappings":"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","file":"chunk-X7HMP7H7.cjs","sourcesContent":["/**\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 { DEFAULT_MAX_OFFSET } from \"@querykitjs/core\";\nimport { offsetOf } from \"@querykitjs/core/internal\";\nimport { formatMessage } from \"./messages\";\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/** `@IsWithinMaxOffset()` opsiyalari. */\nexport interface IsWithinMaxOffsetOptions {\n /**\n * `\"page\"` — property `page`, offset `(page - 1) × perPage` (o'sha obyektning `perPage`i,\n * yo'q bo'lsa core `DEFAULT_PER_PAGE`); `\"offset\"` — property qiymatining o'zi (infinite).\n */\n mode: \"page\" | \"offset\";\n /** Default — core `DEFAULT_MAX_OFFSET` (10 000). `Infinity` tekshiruvni o'chiradi. */\n maxOffset?: number;\n}\n\nconst maxOffsetOf = (args: ValidationArguments | undefined): number =>\n (args?.constraints?.[0] as IsWithinMaxOffsetOptions | undefined)?.maxOffset ?? DEFAULT_MAX_OFFSET;\n\n/** `@IsWithinMaxOffset()` ortidagi konstraint. Raqam bo'lmagan qiymatni `@IsInt()` rad etadi, bu yerda o'tadi. */\n@ValidatorConstraint({ name: \"isWithinMaxOffset\", async: false })\nexport class IsWithinMaxOffsetConstraint implements ValidatorConstraintInterface {\n validate(value: unknown, args?: ValidationArguments): boolean {\n if (typeof value !== \"number\") return true;\n const perPage = (args?.object as { perPage?: unknown } | undefined)?.perPage;\n const isPage = (args?.constraints?.[0] as IsWithinMaxOffsetOptions | undefined)?.mode === \"page\";\n return (isPage ? offsetOf(value, typeof perPage === \"number\" ? perPage : undefined) : value) <= maxOffsetOf(args);\n }\n\n defaultMessage(args?: ValidationArguments): string {\n return formatMessage(\"querykit.limit.exceeded\", { path: args?.property ?? \"offset\", limit: \"maxOffset\", max: maxOffsetOf(args) });\n }\n}\n\n/* ------------------------------- decorators ------------------------------- */\n\n/**\n * Sahifa chuqurligini cheklaydi: `page` uchun `(page - 1) × perPage`, infinite `offset` uchun\n * qiymatning o'zi `maxOffset`dan oshmasin. Chuqurroq sahifalar — cursor paginatsiya.\n *\n * @example\n * ```ts\n * class ListDto {\n * @IsOptional() @Type(() => Number) @IsInt() @IsPositive() @IsWithinMaxOffset({ mode: \"page\" })\n * page?: number;\n * }\n * ```\n */\nexport function IsWithinMaxOffset(options: IsWithinMaxOffsetOptions, 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: IsWithinMaxOffsetConstraint,\n });\n };\n}\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"]}
1
+ {"version":3,"sources":["../src/decorators.ts"],"names":["IsQueryFilterConstraint","validateFilter","__decorateClass","ValidatorConstraint","IsQuerySortConstraint","validateSort","DEFAULT_MAX_OFFSET","IsWithinMaxOffsetConstraint","offsetOf","formatMessage","registerDecorator"],"mappings":"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","file":"chunk-AX53IY63.cjs","sourcesContent":["/**\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 { DEFAULT_MAX_OFFSET } from \"@querykitjs/core\";\nimport { offsetOf } from \"@querykitjs/core/internal\";\nimport { formatMessage } from \"./messages\";\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/** `@IsWithinMaxOffset()` opsiyalari. */\nexport interface IsWithinMaxOffsetOptions {\n /**\n * `\"page\"` — property `page`, offset `(page - 1) × perPage` (o'sha obyektning `perPage`i,\n * yo'q bo'lsa core `DEFAULT_PER_PAGE`); `\"offset\"` — property qiymatining o'zi (infinite).\n */\n mode: \"page\" | \"offset\";\n /** Default — core `DEFAULT_MAX_OFFSET` (10 000). `Infinity` tekshiruvni o'chiradi. */\n maxOffset?: number;\n}\n\nconst maxOffsetOf = (args: ValidationArguments | undefined): number =>\n (args?.constraints?.[0] as IsWithinMaxOffsetOptions | undefined)?.maxOffset ?? DEFAULT_MAX_OFFSET;\n\n/** `@IsWithinMaxOffset()` ortidagi konstraint. Raqam bo'lmagan qiymatni `@IsInt()` rad etadi, bu yerda o'tadi. */\n@ValidatorConstraint({ name: \"isWithinMaxOffset\", async: false })\nexport class IsWithinMaxOffsetConstraint implements ValidatorConstraintInterface {\n validate(value: unknown, args?: ValidationArguments): boolean {\n if (typeof value !== \"number\") return true;\n const perPage = (args?.object as { perPage?: unknown } | undefined)?.perPage;\n const isPage = (args?.constraints?.[0] as IsWithinMaxOffsetOptions | undefined)?.mode === \"page\";\n return (isPage ? offsetOf(value, typeof perPage === \"number\" ? perPage : undefined) : value) <= maxOffsetOf(args);\n }\n\n defaultMessage(args?: ValidationArguments): string {\n return formatMessage(\"querykit.limit.exceeded\", { path: args?.property ?? \"offset\", limit: \"maxOffset\", max: maxOffsetOf(args) });\n }\n}\n\n/* ------------------------------- decorators ------------------------------- */\n\n/**\n * Sahifa chuqurligini cheklaydi: `page` uchun `(page - 1) × perPage`, infinite `offset` uchun\n * qiymatning o'zi `maxOffset`dan oshmasin. Chuqurroq sahifalar — cursor paginatsiya.\n *\n * @example\n * ```ts\n * class ListDto {\n * @IsOptional() @Type(() => Number) @IsInt() @IsPositive() @IsWithinMaxOffset({ mode: \"page\" })\n * page?: number;\n * }\n * ```\n */\nexport function IsWithinMaxOffset(options: IsWithinMaxOffsetOptions, 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: IsWithinMaxOffsetConstraint,\n });\n };\n}\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"]}
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ var core = require('@querykitjs/core');
4
+ var internal = require('@querykitjs/core/internal');
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
+ var __decorateClass = (decorators, target, key, kind) => {
9
+ for (var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target, i = decorators.length - 1, decorator; i >= 0; i--)
10
+ (decorator = decorators[i]) && (result = (kind ? decorator(target, key, result) : decorator(result)) || result);
11
+ return kind && result && __defProp(target, key, result), result;
12
+ };
13
+ function localizeIssue(issue, catalog) {
14
+ return internal.formatMessage(issue.key, issue.args, catalog);
15
+ }
16
+
17
+ // src/validate.ts
18
+ var joinPath = (root, path) => path.reduce((joined, part) => typeof part == "number" ? `${joined}[${part}]` : `${joined}.${part}`, root), toValidationIssue = (root) => (found) => {
19
+ let path = joinPath(root, found.path), args = { path, ...found.args };
20
+ return { path, key: found.key, message: internal.formatMessage(found.key, args), args };
21
+ };
22
+ function validateFilter(value, options = {}) {
23
+ return internal.checkFilter(value, options).map(toValidationIssue(options.rootPath ?? "filter"));
24
+ }
25
+ function validateSort(value, options = {}) {
26
+ return internal.checkSort(value, options).map(toValidationIssue(options.rootPath ?? "sort"));
27
+ }
28
+
29
+ Object.defineProperty(exports, "DEFAULT_MAX_FILTER_DEPTH", {
30
+ enumerable: true,
31
+ get: function () { return core.DEFAULT_MAX_FILTER_DEPTH; }
32
+ });
33
+ Object.defineProperty(exports, "formatMessage", {
34
+ enumerable: true,
35
+ get: function () { return internal.formatMessage; }
36
+ });
37
+ exports.__decorateClass = __decorateClass;
38
+ exports.localizeIssue = localizeIssue;
39
+ exports.validateFilter = validateFilter;
40
+ exports.validateSort = validateSort;
41
+ //# sourceMappingURL=chunk-HKLXL3NW.cjs.map
42
+ //# sourceMappingURL=chunk-HKLXL3NW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/messages.ts","../src/validate.ts"],"names":["formatMessage","checkFilter","checkSort"],"mappings":";;;;;;;;;;;;AAuBO,SAAS,aAAA,CAAc,OAAuD,OAAA,EAAyC;AAC5H,EAAA,OAAOA,sBAAA,CAAc,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,MAAM,OAAO,CAAA;AACrD;;;AC+CA,IAAM,QAAA,GAAW,CAAC,IAAA,EAAc,IAAA,KAC9B,IAAA,CAAK,MAAA,CAAe,CAAC,MAAA,EAAQ,IAAA,KAAU,OAAO,IAAA,IAAS,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAK,IAAI,CAAA,EAG/G,iBAAA,GACJ,CAAC,IAAA,KACD,CAAC,KAAA,KAA6E;AAC5E,EAAA,IAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA,EAChC,IAAA,GAAoB,EAAE,IAAA,EAAM,GAAG,KAAA,CAAM,IAAA,EAAK;AAChD,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,OAAA,EAASA,sBAAA,CAAc,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA,EAAG,IAAA,EAAK;AAC/E,CAAA;AAaK,SAAS,cAAA,CAAe,KAAA,EAAgB,OAAA,GAA8B,EAAC,EAAsB;AAClG,EAAA,OAAOC,oBAAA,CAAY,OAAO,OAAO,CAAA,CAAE,IAAI,iBAAA,CAAkB,OAAA,CAAQ,QAAA,IAAY,QAAQ,CAAC,CAAA;AACxF;AAKO,SAAS,YAAA,CAAa,KAAA,EAAgB,OAAA,GAA4B,EAAC,EAAsB;AAC9F,EAAA,OAAOC,kBAAA,CAAU,OAAO,OAAO,CAAA,CAAE,IAAI,iBAAA,CAAkB,OAAA,CAAQ,QAAA,IAAY,MAAM,CAAC,CAAA;AACpF","file":"chunk-HKLXL3NW.cjs","sourcesContent":["/**\n * Xabar formatlash. Kataloglar `locales.ts`da; `formatMessage` core'da\n * (boshqa validatorlar bilan bitta), bu yerda faqat `localizeIssue`.\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 { formatMessage, type MessageArgs, type QueryKitMessageCatalog, type QueryKitMessageKey } from \"@querykitjs/core/internal\";\n\n/** Kalitni matnga aylantirish va argument tipi — core'dan (`formatMessage(key, args, catalog)`, default inglizcha). */\nexport { formatMessage };\nexport type { MessageArgs };\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**. Tekshiruv mantiqi core\n * `checkFilter`/`checkSort` da (`@querykitjs/core/internal`) — boshqa validatorlar\n * bilan bitta; bu yerda faqat yo'l satri va xabar matni quriladi.\n * `class-validator` dekoratorlari (`decorators.ts`) faqat yupqa o'rov, shuning\n * uchun yadroni Nest'siz ham (Express, Hono, oddiy funksiya) ishlatish mumkin.\n */\nimport { DEFAULT_MAX_FILTER_DEPTH } from \"@querykitjs/core\";\nimport type { FilterOperator } from \"@querykitjs/core\";\nimport { checkFilter, checkSort, type LimitPath, type WireFilterIssueKey, type WireIssue, type WireSortIssueKey } from \"@querykitjs/core/internal\";\nimport { formatMessage, type MessageArgs } from \"./messages\";\nimport type { QueryKitMessageKey } from \"./locales\";\n\n/** Filter daraxti chuqurligi default limiti — core'dan (yagona manba, R7). */\nexport { DEFAULT_MAX_FILTER_DEPTH };\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 /** Ildizdan bargacha tugunlar soni (ildiz 1, har `and`/`or`/`not` va shart +1). Default — core `DEFAULT_MAX_FILTER_DEPTH` (5). */\n maxDepth?: number;\n /** Barcha guruhlardagi shartlar (barglar) soni. Default — core `DEFAULT_MAX_CONDITIONS` (30). */\n maxConditions?: number;\n /** Bitta massiv qiymatdagi elementlar (`in`, `notIn`, …). Default — core `DEFAULT_MAX_IN_ITEMS` (200). */\n maxInItems?: number;\n /** Bitta satr qiymatdagi belgilar (massiv ichida ham). Default — core `DEFAULT_MAX_STRING_LENGTH` (256). */\n maxStringLength?: 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 /** `sort` massividagi maydonlar soni. Default — core `DEFAULT_MAX_SORT_FIELDS` (3). */\n maxSortFields?: number;\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\n/** Core path → `filter.and[1].or[0].value`. */\nconst joinPath = (root: string, path: LimitPath): string =>\n path.reduce<string>((joined, part) => (typeof part === \"number\" ? `${joined}[${part}]` : `${joined}.${part}`), root);\n\n/** A core issue as this package reports it: a string path under `root`, an English message, `path` first in the args. */\nconst toValidationIssue =\n (root: string) =>\n (found: WireIssue<WireFilterIssueKey | WireSortIssueKey>): ValidationIssue => {\n const path = joinPath(root, found.path);\n const args: MessageArgs = { path, ...found.args };\n return { path, key: found.key, message: formatMessage(found.key, args), args };\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 return checkFilter(value, options).map(toValidationIssue(options.rootPath ?? \"filter\"));\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 return checkSort(value, options).map(toValidationIssue(options.rootPath ?? \"sort\"));\n}\n"]}
@@ -1,74 +1,74 @@
1
1
  'use strict';
2
2
 
3
- var chunkX7HMP7H7_cjs = require('./chunk-X7HMP7H7.cjs');
4
- var chunkKXCJO556_cjs = require('./chunk-KXCJO556.cjs');
3
+ var chunkAX53IY63_cjs = require('./chunk-AX53IY63.cjs');
4
+ var chunkHKLXL3NW_cjs = require('./chunk-HKLXL3NW.cjs');
5
5
  var classTransformer = require('class-transformer');
6
6
  var classValidator = require('class-validator');
7
7
  var core = require('@querykitjs/core');
8
8
 
9
9
  var BaseParamsDto = class {
10
10
  };
11
- chunkKXCJO556_cjs.__decorateClass([
11
+ chunkHKLXL3NW_cjs.__decorateClass([
12
12
  classValidator.IsOptional(),
13
- chunkX7HMP7H7_cjs.IsQueryFilter()
14
- ], BaseParamsDto.prototype, "filter", 2), chunkKXCJO556_cjs.__decorateClass([
13
+ chunkAX53IY63_cjs.IsQueryFilter()
14
+ ], BaseParamsDto.prototype, "filter", 2), chunkHKLXL3NW_cjs.__decorateClass([
15
15
  classValidator.IsOptional(),
16
- chunkX7HMP7H7_cjs.IsQuerySort()
16
+ chunkAX53IY63_cjs.IsQuerySort()
17
17
  ], BaseParamsDto.prototype, "sort", 2);
18
18
  var OffsetParamsDto = class extends BaseParamsDto {
19
19
  };
20
- chunkKXCJO556_cjs.__decorateClass([
20
+ chunkHKLXL3NW_cjs.__decorateClass([
21
21
  classValidator.IsOptional(),
22
22
  classTransformer.Type(() => Number),
23
23
  classValidator.IsInt(),
24
24
  classValidator.IsPositive(),
25
- chunkX7HMP7H7_cjs.IsWithinMaxOffset({ mode: "page" })
26
- ], OffsetParamsDto.prototype, "page", 2), chunkKXCJO556_cjs.__decorateClass([
25
+ chunkAX53IY63_cjs.IsWithinMaxOffset({ mode: "page" })
26
+ ], OffsetParamsDto.prototype, "page", 2), chunkHKLXL3NW_cjs.__decorateClass([
27
27
  classValidator.IsOptional(),
28
28
  classTransformer.Type(() => Number),
29
29
  classValidator.IsInt(),
30
30
  classValidator.IsPositive(),
31
31
  classValidator.Max(core.DEFAULT_MAX_PER_PAGE)
32
- ], OffsetParamsDto.prototype, "perPage", 2), chunkKXCJO556_cjs.__decorateClass([
32
+ ], OffsetParamsDto.prototype, "perPage", 2), chunkHKLXL3NW_cjs.__decorateClass([
33
33
  classValidator.IsOptional(),
34
34
  classValidator.IsBoolean()
35
35
  ], OffsetParamsDto.prototype, "withTotal", 2);
36
36
  var InfiniteParamsDto = class extends BaseParamsDto {
37
37
  };
38
- chunkKXCJO556_cjs.__decorateClass([
38
+ chunkHKLXL3NW_cjs.__decorateClass([
39
39
  classValidator.IsOptional(),
40
40
  classTransformer.Type(() => Number),
41
41
  classValidator.IsInt(),
42
42
  classValidator.IsPositive(),
43
43
  classValidator.Max(core.DEFAULT_MAX_LIMIT)
44
- ], InfiniteParamsDto.prototype, "limit", 2), chunkKXCJO556_cjs.__decorateClass([
44
+ ], InfiniteParamsDto.prototype, "limit", 2), chunkHKLXL3NW_cjs.__decorateClass([
45
45
  classValidator.IsOptional(),
46
46
  classTransformer.Type(() => Number),
47
47
  classValidator.IsInt(),
48
48
  classValidator.Min(0),
49
- chunkX7HMP7H7_cjs.IsWithinMaxOffset({ mode: "offset" })
49
+ chunkAX53IY63_cjs.IsWithinMaxOffset({ mode: "offset" })
50
50
  ], InfiniteParamsDto.prototype, "offset", 2);
51
51
  var CursorParamsDto = class {
52
52
  };
53
- chunkKXCJO556_cjs.__decorateClass([
53
+ chunkHKLXL3NW_cjs.__decorateClass([
54
54
  classValidator.IsOptional(),
55
- chunkX7HMP7H7_cjs.IsQueryFilter()
56
- ], CursorParamsDto.prototype, "filter", 2), chunkKXCJO556_cjs.__decorateClass([
55
+ chunkAX53IY63_cjs.IsQueryFilter()
56
+ ], CursorParamsDto.prototype, "filter", 2), chunkHKLXL3NW_cjs.__decorateClass([
57
57
  classValidator.IsOptional(),
58
58
  classTransformer.Type(() => Number),
59
59
  classValidator.IsInt(),
60
60
  classValidator.IsPositive(),
61
61
  classValidator.Max(core.DEFAULT_MAX_LIMIT)
62
- ], CursorParamsDto.prototype, "limit", 2), chunkKXCJO556_cjs.__decorateClass([
62
+ ], CursorParamsDto.prototype, "limit", 2), chunkHKLXL3NW_cjs.__decorateClass([
63
63
  classValidator.IsOptional(),
64
64
  classValidator.IsString()
65
- ], CursorParamsDto.prototype, "cursor", 2), chunkKXCJO556_cjs.__decorateClass([
65
+ ], CursorParamsDto.prototype, "cursor", 2), chunkHKLXL3NW_cjs.__decorateClass([
66
66
  classValidator.IsOptional(),
67
67
  classValidator.IsString()
68
- ], CursorParamsDto.prototype, "cursorKey", 2), chunkKXCJO556_cjs.__decorateClass([
68
+ ], CursorParamsDto.prototype, "cursorKey", 2), chunkHKLXL3NW_cjs.__decorateClass([
69
69
  classValidator.IsOptional(),
70
70
  classValidator.IsIn(["asc", "desc"])
71
- ], CursorParamsDto.prototype, "order", 2), chunkKXCJO556_cjs.__decorateClass([
71
+ ], CursorParamsDto.prototype, "order", 2), chunkHKLXL3NW_cjs.__decorateClass([
72
72
  classValidator.IsOptional(),
73
73
  classValidator.IsIn(["forward", "backward"])
74
74
  ], CursorParamsDto.prototype, "direction", 2);
@@ -77,5 +77,5 @@ exports.BaseParamsDto = BaseParamsDto;
77
77
  exports.CursorParamsDto = CursorParamsDto;
78
78
  exports.InfiniteParamsDto = InfiniteParamsDto;
79
79
  exports.OffsetParamsDto = OffsetParamsDto;
80
- //# sourceMappingURL=chunk-BZRPXHJC.cjs.map
81
- //# sourceMappingURL=chunk-BZRPXHJC.cjs.map
80
+ //# sourceMappingURL=chunk-PKGWV2JC.cjs.map
81
+ //# sourceMappingURL=chunk-PKGWV2JC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/legacy-dto.ts"],"names":["__decorateClass","IsOptional","IsQueryFilter","IsQuerySort","Type","IsInt","IsPositive","IsWithinMaxOffset","Max","DEFAULT_MAX_PER_PAGE","IsBoolean","DEFAULT_MAX_LIMIT","Min","IsString","IsIn"],"mappings":"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","file":"chunk-PKGWV2JC.cjs","sourcesContent":["/**\n * Static param DTOs (deprecated) — `class ListUsersDto extends OffsetParamsDto`.\n * Kept in their own module: their decorators register class-validator metadata\n * when the module loads, so a bundle that does not import them drops the whole module.\n * New code uses the `make*ParamsDto` factories (`./dto`).\n */\nimport { Type } from \"class-transformer\";\nimport { IsIn, IsInt, IsOptional, IsPositive, IsString, Max, Min, IsBoolean } 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, IsWithinMaxOffset } from \"./decorators\";\n\n/**\n * Paginatsiyasiz umumiy params — `filter` + `sort`.\n *\n * @deprecated Use `makeOffsetParamsDto` / `makeInfiniteParamsDto` / `makeCursorParamsDto` (safe defaults). Removed in the next major.\n */\nexport class BaseParamsDto {\n @IsOptional()\n @IsQueryFilter()\n filter?: Filter;\n\n @IsOptional()\n @IsQuerySort()\n sort?: Sort;\n}\n\n/**\n * Offset (sahifali) params — `page` + `perPage` (`perPage` ≤ core cap).\n *\n * @deprecated Use `makeOffsetParamsDto` (safe defaults). Removed in the next major.\n */\nexport class OffsetParamsDto extends BaseParamsDto {\n /* `page`ning o'zida cap yo'q — chegara `(page - 1) × perPage` ≤ `DEFAULT_MAX_OFFSET`\n * (`@querykitjs/zod` factory'lari ham aynan shunday). */\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @IsPositive()\n @IsWithinMaxOffset({ mode: \"page\" })\n page?: number;\n\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @IsPositive()\n @Max(DEFAULT_MAX_PER_PAGE)\n perPage?: number;\n\n /** `false` — no count; the meta totals are `null`. */\n @IsOptional()\n @IsBoolean()\n withTotal?: boolean;\n}\n\n/**\n * Infinite-scroll params — `limit` + `offset`.\n *\n * @deprecated Use `makeInfiniteParamsDto` (safe defaults). Removed in the next major.\n */\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 @IsWithinMaxOffset({ mode: \"offset\" })\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 *\n * @deprecated Use `makeCursorParamsDto` (safe defaults). Removed in the next major.\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"]}
@@ -0,0 +1,30 @@
1
+ export { DEFAULT_MAX_FILTER_DEPTH } from '@querykitjs/core';
2
+ import { formatMessage, checkFilter, checkSort } from '@querykitjs/core/internal';
3
+ export { formatMessage } from '@querykitjs/core/internal';
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __decorateClass = (decorators, target, key, kind) => {
8
+ for (var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target, i = decorators.length - 1, decorator; i >= 0; i--)
9
+ (decorator = decorators[i]) && (result = (kind ? decorator(target, key, result) : decorator(result)) || result);
10
+ return kind && result && __defProp(target, key, result), result;
11
+ };
12
+ function localizeIssue(issue, catalog) {
13
+ return formatMessage(issue.key, issue.args, catalog);
14
+ }
15
+
16
+ // src/validate.ts
17
+ var joinPath = (root, path) => path.reduce((joined, part) => typeof part == "number" ? `${joined}[${part}]` : `${joined}.${part}`, root), toValidationIssue = (root) => (found) => {
18
+ let path = joinPath(root, found.path), args = { path, ...found.args };
19
+ return { path, key: found.key, message: formatMessage(found.key, args), args };
20
+ };
21
+ function validateFilter(value, options = {}) {
22
+ return checkFilter(value, options).map(toValidationIssue(options.rootPath ?? "filter"));
23
+ }
24
+ function validateSort(value, options = {}) {
25
+ return checkSort(value, options).map(toValidationIssue(options.rootPath ?? "sort"));
26
+ }
27
+
28
+ export { __decorateClass, localizeIssue, validateFilter, validateSort };
29
+ //# sourceMappingURL=chunk-QMFPUYJO.js.map
30
+ //# sourceMappingURL=chunk-QMFPUYJO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/messages.ts","../src/validate.ts"],"names":[],"mappings":";;;;;;;;;;;AAuBO,SAAS,aAAA,CAAc,OAAuD,OAAA,EAAyC;AAC5H,EAAA,OAAO,aAAA,CAAc,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,MAAM,OAAO,CAAA;AACrD;;;AC+CA,IAAM,QAAA,GAAW,CAAC,IAAA,EAAc,IAAA,KAC9B,IAAA,CAAK,MAAA,CAAe,CAAC,MAAA,EAAQ,IAAA,KAAU,OAAO,IAAA,IAAS,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAK,IAAI,CAAA,EAG/G,iBAAA,GACJ,CAAC,IAAA,KACD,CAAC,KAAA,KAA6E;AAC5E,EAAA,IAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA,EAChC,IAAA,GAAoB,EAAE,IAAA,EAAM,GAAG,KAAA,CAAM,IAAA,EAAK;AAChD,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,OAAA,EAAS,aAAA,CAAc,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA,EAAG,IAAA,EAAK;AAC/E,CAAA;AAaK,SAAS,cAAA,CAAe,KAAA,EAAgB,OAAA,GAA8B,EAAC,EAAsB;AAClG,EAAA,OAAO,WAAA,CAAY,OAAO,OAAO,CAAA,CAAE,IAAI,iBAAA,CAAkB,OAAA,CAAQ,QAAA,IAAY,QAAQ,CAAC,CAAA;AACxF;AAKO,SAAS,YAAA,CAAa,KAAA,EAAgB,OAAA,GAA4B,EAAC,EAAsB;AAC9F,EAAA,OAAO,SAAA,CAAU,OAAO,OAAO,CAAA,CAAE,IAAI,iBAAA,CAAkB,OAAA,CAAQ,QAAA,IAAY,MAAM,CAAC,CAAA;AACpF","file":"chunk-QMFPUYJO.js","sourcesContent":["/**\n * Xabar formatlash. Kataloglar `locales.ts`da; `formatMessage` core'da\n * (boshqa validatorlar bilan bitta), bu yerda faqat `localizeIssue`.\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 { formatMessage, type MessageArgs, type QueryKitMessageCatalog, type QueryKitMessageKey } from \"@querykitjs/core/internal\";\n\n/** Kalitni matnga aylantirish va argument tipi — core'dan (`formatMessage(key, args, catalog)`, default inglizcha). */\nexport { formatMessage };\nexport type { MessageArgs };\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**. Tekshiruv mantiqi core\n * `checkFilter`/`checkSort` da (`@querykitjs/core/internal`) — boshqa validatorlar\n * bilan bitta; bu yerda faqat yo'l satri va xabar matni quriladi.\n * `class-validator` dekoratorlari (`decorators.ts`) faqat yupqa o'rov, shuning\n * uchun yadroni Nest'siz ham (Express, Hono, oddiy funksiya) ishlatish mumkin.\n */\nimport { DEFAULT_MAX_FILTER_DEPTH } from \"@querykitjs/core\";\nimport type { FilterOperator } from \"@querykitjs/core\";\nimport { checkFilter, checkSort, type LimitPath, type WireFilterIssueKey, type WireIssue, type WireSortIssueKey } from \"@querykitjs/core/internal\";\nimport { formatMessage, type MessageArgs } from \"./messages\";\nimport type { QueryKitMessageKey } from \"./locales\";\n\n/** Filter daraxti chuqurligi default limiti — core'dan (yagona manba, R7). */\nexport { DEFAULT_MAX_FILTER_DEPTH };\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 /** Ildizdan bargacha tugunlar soni (ildiz 1, har `and`/`or`/`not` va shart +1). Default — core `DEFAULT_MAX_FILTER_DEPTH` (5). */\n maxDepth?: number;\n /** Barcha guruhlardagi shartlar (barglar) soni. Default — core `DEFAULT_MAX_CONDITIONS` (30). */\n maxConditions?: number;\n /** Bitta massiv qiymatdagi elementlar (`in`, `notIn`, …). Default — core `DEFAULT_MAX_IN_ITEMS` (200). */\n maxInItems?: number;\n /** Bitta satr qiymatdagi belgilar (massiv ichida ham). Default — core `DEFAULT_MAX_STRING_LENGTH` (256). */\n maxStringLength?: 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 /** `sort` massividagi maydonlar soni. Default — core `DEFAULT_MAX_SORT_FIELDS` (3). */\n maxSortFields?: number;\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\n/** Core path → `filter.and[1].or[0].value`. */\nconst joinPath = (root: string, path: LimitPath): string =>\n path.reduce<string>((joined, part) => (typeof part === \"number\" ? `${joined}[${part}]` : `${joined}.${part}`), root);\n\n/** A core issue as this package reports it: a string path under `root`, an English message, `path` first in the args. */\nconst toValidationIssue =\n (root: string) =>\n (found: WireIssue<WireFilterIssueKey | WireSortIssueKey>): ValidationIssue => {\n const path = joinPath(root, found.path);\n const args: MessageArgs = { path, ...found.args };\n return { path, key: found.key, message: formatMessage(found.key, args), args };\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 return checkFilter(value, options).map(toValidationIssue(options.rootPath ?? \"filter\"));\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 return checkSort(value, options).map(toValidationIssue(options.rootPath ?? \"sort\"));\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { __decorateClass, validateFilter, validateSort, formatMessage } from './chunk-KT5JRG6S.js';
1
+ import { __decorateClass, validateFilter, validateSort, formatMessage } from './chunk-QMFPUYJO.js';
2
2
  import { ValidatorConstraint, registerDecorator } from 'class-validator';
3
3
  import { DEFAULT_MAX_OFFSET } from '@querykitjs/core';
4
4
  import { offsetOf } from '@querykitjs/core/internal';
@@ -81,5 +81,5 @@ function IsQuerySort(options, validationOptions) {
81
81
  }
82
82
 
83
83
  export { IsQueryFilter, IsQueryFilterConstraint, IsQuerySort, IsQuerySortConstraint, IsWithinMaxOffset, IsWithinMaxOffsetConstraint };
84
- //# sourceMappingURL=chunk-UICYH7OH.js.map
85
- //# sourceMappingURL=chunk-UICYH7OH.js.map
84
+ //# sourceMappingURL=chunk-V4E73HMQ.js.map
85
+ //# sourceMappingURL=chunk-V4E73HMQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/decorators.ts"],"names":[],"mappings":"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","file":"chunk-UICYH7OH.js","sourcesContent":["/**\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 { DEFAULT_MAX_OFFSET } from \"@querykitjs/core\";\nimport { offsetOf } from \"@querykitjs/core/internal\";\nimport { formatMessage } from \"./messages\";\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/** `@IsWithinMaxOffset()` opsiyalari. */\nexport interface IsWithinMaxOffsetOptions {\n /**\n * `\"page\"` — property `page`, offset `(page - 1) × perPage` (o'sha obyektning `perPage`i,\n * yo'q bo'lsa core `DEFAULT_PER_PAGE`); `\"offset\"` — property qiymatining o'zi (infinite).\n */\n mode: \"page\" | \"offset\";\n /** Default — core `DEFAULT_MAX_OFFSET` (10 000). `Infinity` tekshiruvni o'chiradi. */\n maxOffset?: number;\n}\n\nconst maxOffsetOf = (args: ValidationArguments | undefined): number =>\n (args?.constraints?.[0] as IsWithinMaxOffsetOptions | undefined)?.maxOffset ?? DEFAULT_MAX_OFFSET;\n\n/** `@IsWithinMaxOffset()` ortidagi konstraint. Raqam bo'lmagan qiymatni `@IsInt()` rad etadi, bu yerda o'tadi. */\n@ValidatorConstraint({ name: \"isWithinMaxOffset\", async: false })\nexport class IsWithinMaxOffsetConstraint implements ValidatorConstraintInterface {\n validate(value: unknown, args?: ValidationArguments): boolean {\n if (typeof value !== \"number\") return true;\n const perPage = (args?.object as { perPage?: unknown } | undefined)?.perPage;\n const isPage = (args?.constraints?.[0] as IsWithinMaxOffsetOptions | undefined)?.mode === \"page\";\n return (isPage ? offsetOf(value, typeof perPage === \"number\" ? perPage : undefined) : value) <= maxOffsetOf(args);\n }\n\n defaultMessage(args?: ValidationArguments): string {\n return formatMessage(\"querykit.limit.exceeded\", { path: args?.property ?? \"offset\", limit: \"maxOffset\", max: maxOffsetOf(args) });\n }\n}\n\n/* ------------------------------- decorators ------------------------------- */\n\n/**\n * Sahifa chuqurligini cheklaydi: `page` uchun `(page - 1) × perPage`, infinite `offset` uchun\n * qiymatning o'zi `maxOffset`dan oshmasin. Chuqurroq sahifalar — cursor paginatsiya.\n *\n * @example\n * ```ts\n * class ListDto {\n * @IsOptional() @Type(() => Number) @IsInt() @IsPositive() @IsWithinMaxOffset({ mode: \"page\" })\n * page?: number;\n * }\n * ```\n */\nexport function IsWithinMaxOffset(options: IsWithinMaxOffsetOptions, 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: IsWithinMaxOffsetConstraint,\n });\n };\n}\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"]}
1
+ {"version":3,"sources":["../src/decorators.ts"],"names":[],"mappings":"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","file":"chunk-V4E73HMQ.js","sourcesContent":["/**\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 { DEFAULT_MAX_OFFSET } from \"@querykitjs/core\";\nimport { offsetOf } from \"@querykitjs/core/internal\";\nimport { formatMessage } from \"./messages\";\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/** `@IsWithinMaxOffset()` opsiyalari. */\nexport interface IsWithinMaxOffsetOptions {\n /**\n * `\"page\"` — property `page`, offset `(page - 1) × perPage` (o'sha obyektning `perPage`i,\n * yo'q bo'lsa core `DEFAULT_PER_PAGE`); `\"offset\"` — property qiymatining o'zi (infinite).\n */\n mode: \"page\" | \"offset\";\n /** Default — core `DEFAULT_MAX_OFFSET` (10 000). `Infinity` tekshiruvni o'chiradi. */\n maxOffset?: number;\n}\n\nconst maxOffsetOf = (args: ValidationArguments | undefined): number =>\n (args?.constraints?.[0] as IsWithinMaxOffsetOptions | undefined)?.maxOffset ?? DEFAULT_MAX_OFFSET;\n\n/** `@IsWithinMaxOffset()` ortidagi konstraint. Raqam bo'lmagan qiymatni `@IsInt()` rad etadi, bu yerda o'tadi. */\n@ValidatorConstraint({ name: \"isWithinMaxOffset\", async: false })\nexport class IsWithinMaxOffsetConstraint implements ValidatorConstraintInterface {\n validate(value: unknown, args?: ValidationArguments): boolean {\n if (typeof value !== \"number\") return true;\n const perPage = (args?.object as { perPage?: unknown } | undefined)?.perPage;\n const isPage = (args?.constraints?.[0] as IsWithinMaxOffsetOptions | undefined)?.mode === \"page\";\n return (isPage ? offsetOf(value, typeof perPage === \"number\" ? perPage : undefined) : value) <= maxOffsetOf(args);\n }\n\n defaultMessage(args?: ValidationArguments): string {\n return formatMessage(\"querykit.limit.exceeded\", { path: args?.property ?? \"offset\", limit: \"maxOffset\", max: maxOffsetOf(args) });\n }\n}\n\n/* ------------------------------- decorators ------------------------------- */\n\n/**\n * Sahifa chuqurligini cheklaydi: `page` uchun `(page - 1) × perPage`, infinite `offset` uchun\n * qiymatning o'zi `maxOffset`dan oshmasin. Chuqurroq sahifalar — cursor paginatsiya.\n *\n * @example\n * ```ts\n * class ListDto {\n * @IsOptional() @Type(() => Number) @IsInt() @IsPositive() @IsWithinMaxOffset({ mode: \"page\" })\n * page?: number;\n * }\n * ```\n */\nexport function IsWithinMaxOffset(options: IsWithinMaxOffsetOptions, 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: IsWithinMaxOffsetConstraint,\n });\n };\n}\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"]}
@@ -1,5 +1,5 @@
1
- import { IsQueryFilter, IsQuerySort, IsWithinMaxOffset } from './chunk-UICYH7OH.js';
2
- import { __decorateClass } from './chunk-KT5JRG6S.js';
1
+ import { IsQueryFilter, IsQuerySort, IsWithinMaxOffset } from './chunk-V4E73HMQ.js';
2
+ import { __decorateClass } from './chunk-QMFPUYJO.js';
3
3
  import { Type } from 'class-transformer';
4
4
  import { IsOptional, IsInt, IsPositive, Max, IsBoolean, Min, IsString, IsIn } from 'class-validator';
5
5
  import { DEFAULT_MAX_PER_PAGE, DEFAULT_MAX_LIMIT } from '@querykitjs/core';
@@ -72,5 +72,5 @@ __decorateClass([
72
72
  ], CursorParamsDto.prototype, "direction", 2);
73
73
 
74
74
  export { BaseParamsDto, CursorParamsDto, InfiniteParamsDto, OffsetParamsDto };
75
- //# sourceMappingURL=chunk-F3KZNLYZ.js.map
76
- //# sourceMappingURL=chunk-F3KZNLYZ.js.map
75
+ //# sourceMappingURL=chunk-XF6C4EG2.js.map
76
+ //# sourceMappingURL=chunk-XF6C4EG2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/legacy-dto.ts"],"names":[],"mappings":";;;;;;AAiBO,IAAM,gBAAN,MAAoB;AAQ3B;AALE,eAAA,CAAA;AAAA,EAFC,UAAA,EAAW;AAAA,EACX,aAAA;AAAc,CAAA,EAFJ,cAGX,SAAA,EAAA,QAAA,EAAA,CAAA,CAAA,EAIA,eAAA,CAAA;AAAA,EAFC,UAAA,EAAW;AAAA,EACX,WAAA;AAAY,CAAA,EANF,aAAA,CAOX,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AAQK,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAqBnD;AAbE,eAAA,CAAA;AAAA,EALC,UAAA,EAAW;AAAA,EACX,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,EACjB,KAAA,EAAM;AAAA,EACN,UAAA,EAAW;AAAA,EACX,iBAAA,CAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAPxB,gBAQX,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA,EAOA,eAAA,CAAA;AAAA,EALC,UAAA,EAAW;AAAA,EACX,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,EACjB,KAAA,EAAM;AAAA,EACN,UAAA,EAAW;AAAA,EACX,IAAI,oBAAoB;AAAA,CAAA,EAdd,gBAeX,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA,EAKA,eAAA,CAAA;AAAA,EAFC,UAAA,EAAW;AAAA,EACX,SAAA;AAAU,CAAA,EAnBA,eAAA,CAoBX,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAQK,IAAM,iBAAA,GAAN,cAAgC,aAAA,CAAc;AAcrD;AARE,eAAA,CAAA;AAAA,EALC,UAAA,EAAW;AAAA,EACX,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,EACjB,KAAA,EAAM;AAAA,EACN,UAAA,EAAW;AAAA,EACX,IAAI,iBAAiB;AAAA,CAAA,EALX,kBAMX,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA,EAOA,eAAA,CAAA;AAAA,EALC,UAAA,EAAW;AAAA,EACX,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,EACjB,KAAA,EAAM;AAAA,EACN,IAAI,CAAC,CAAA;AAAA,EACL,iBAAA,CAAkB,EAAE,IAAA,EAAM,QAAA,EAAU;AAAA,CAAA,EAZ1B,iBAAA,CAaX,SAAA,EAAA,QAAA,EAAA,CAAA,CAAA;AAUK,IAAM,kBAAN,MAAsB;AA2B7B;AAxBE,eAAA,CAAA;AAAA,EAFC,UAAA,EAAW;AAAA,EACX,aAAA;AAAc,CAAA,EAFJ,gBAGX,SAAA,EAAA,QAAA,EAAA,CAAA,CAAA,EAOA,eAAA,CAAA;AAAA,EALC,UAAA,EAAW;AAAA,EACX,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,EACjB,KAAA,EAAM;AAAA,EACN,UAAA,EAAW;AAAA,EACX,IAAI,iBAAiB;AAAA,CAAA,EATX,gBAUX,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA,EAIA,eAAA,CAAA;AAAA,EAFC,UAAA,EAAW;AAAA,EACX,QAAA;AAAS,CAAA,EAbC,gBAcX,SAAA,EAAA,QAAA,EAAA,CAAA,CAAA,EAIA,eAAA,CAAA;AAAA,EAFC,UAAA,EAAW;AAAA,EACX,QAAA;AAAS,CAAA,EAjBC,gBAkBX,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA,EAIA,eAAA,CAAA;AAAA,EAFC,UAAA,EAAW;AAAA,EACX,IAAA,CAAK,CAAC,KAAA,EAAO,MAAM,CAAC;AAAA,CAAA,EArBV,gBAsBX,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA,EAIA,eAAA,CAAA;AAAA,EAFC,UAAA,EAAW;AAAA,EACX,IAAA,CAAK,CAAC,SAAA,EAAW,UAAU,CAAC;AAAA,CAAA,EAzBlB,eAAA,CA0BX,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA","file":"chunk-XF6C4EG2.js","sourcesContent":["/**\n * Static param DTOs (deprecated) — `class ListUsersDto extends OffsetParamsDto`.\n * Kept in their own module: their decorators register class-validator metadata\n * when the module loads, so a bundle that does not import them drops the whole module.\n * New code uses the `make*ParamsDto` factories (`./dto`).\n */\nimport { Type } from \"class-transformer\";\nimport { IsIn, IsInt, IsOptional, IsPositive, IsString, Max, Min, IsBoolean } 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, IsWithinMaxOffset } from \"./decorators\";\n\n/**\n * Paginatsiyasiz umumiy params — `filter` + `sort`.\n *\n * @deprecated Use `makeOffsetParamsDto` / `makeInfiniteParamsDto` / `makeCursorParamsDto` (safe defaults). Removed in the next major.\n */\nexport class BaseParamsDto {\n @IsOptional()\n @IsQueryFilter()\n filter?: Filter;\n\n @IsOptional()\n @IsQuerySort()\n sort?: Sort;\n}\n\n/**\n * Offset (sahifali) params — `page` + `perPage` (`perPage` ≤ core cap).\n *\n * @deprecated Use `makeOffsetParamsDto` (safe defaults). Removed in the next major.\n */\nexport class OffsetParamsDto extends BaseParamsDto {\n /* `page`ning o'zida cap yo'q — chegara `(page - 1) × perPage` ≤ `DEFAULT_MAX_OFFSET`\n * (`@querykitjs/zod` factory'lari ham aynan shunday). */\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @IsPositive()\n @IsWithinMaxOffset({ mode: \"page\" })\n page?: number;\n\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @IsPositive()\n @Max(DEFAULT_MAX_PER_PAGE)\n perPage?: number;\n\n /** `false` — no count; the meta totals are `null`. */\n @IsOptional()\n @IsBoolean()\n withTotal?: boolean;\n}\n\n/**\n * Infinite-scroll params — `limit` + `offset`.\n *\n * @deprecated Use `makeInfiniteParamsDto` (safe defaults). Removed in the next major.\n */\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 @IsWithinMaxOffset({ mode: \"offset\" })\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 *\n * @deprecated Use `makeCursorParamsDto` (safe defaults). Removed in the next major.\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"]}
@@ -1,33 +1,33 @@
1
1
  'use strict';
2
2
 
3
- var chunkX7HMP7H7_cjs = require('./chunk-X7HMP7H7.cjs');
4
- require('./chunk-KXCJO556.cjs');
3
+ var chunkAX53IY63_cjs = require('./chunk-AX53IY63.cjs');
4
+ require('./chunk-HKLXL3NW.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "IsQueryFilter", {
9
9
  enumerable: true,
10
- get: function () { return chunkX7HMP7H7_cjs.IsQueryFilter; }
10
+ get: function () { return chunkAX53IY63_cjs.IsQueryFilter; }
11
11
  });
12
12
  Object.defineProperty(exports, "IsQueryFilterConstraint", {
13
13
  enumerable: true,
14
- get: function () { return chunkX7HMP7H7_cjs.IsQueryFilterConstraint; }
14
+ get: function () { return chunkAX53IY63_cjs.IsQueryFilterConstraint; }
15
15
  });
16
16
  Object.defineProperty(exports, "IsQuerySort", {
17
17
  enumerable: true,
18
- get: function () { return chunkX7HMP7H7_cjs.IsQuerySort; }
18
+ get: function () { return chunkAX53IY63_cjs.IsQuerySort; }
19
19
  });
20
20
  Object.defineProperty(exports, "IsQuerySortConstraint", {
21
21
  enumerable: true,
22
- get: function () { return chunkX7HMP7H7_cjs.IsQuerySortConstraint; }
22
+ get: function () { return chunkAX53IY63_cjs.IsQuerySortConstraint; }
23
23
  });
24
24
  Object.defineProperty(exports, "IsWithinMaxOffset", {
25
25
  enumerable: true,
26
- get: function () { return chunkX7HMP7H7_cjs.IsWithinMaxOffset; }
26
+ get: function () { return chunkAX53IY63_cjs.IsWithinMaxOffset; }
27
27
  });
28
28
  Object.defineProperty(exports, "IsWithinMaxOffsetConstraint", {
29
29
  enumerable: true,
30
- get: function () { return chunkX7HMP7H7_cjs.IsWithinMaxOffsetConstraint; }
30
+ get: function () { return chunkAX53IY63_cjs.IsWithinMaxOffsetConstraint; }
31
31
  });
32
32
  //# sourceMappingURL=decorators.cjs.map
33
33
  //# sourceMappingURL=decorators.cjs.map
@@ -1,4 +1,4 @@
1
- export { IsQueryFilter, IsQueryFilterConstraint, IsQuerySort, IsQuerySortConstraint, IsWithinMaxOffset, IsWithinMaxOffsetConstraint } from './chunk-UICYH7OH.js';
2
- import './chunk-KT5JRG6S.js';
1
+ export { IsQueryFilter, IsQueryFilterConstraint, IsQuerySort, IsQuerySortConstraint, IsWithinMaxOffset, IsWithinMaxOffsetConstraint } from './chunk-V4E73HMQ.js';
2
+ import './chunk-QMFPUYJO.js';
3
3
  //# sourceMappingURL=decorators.js.map
4
4
  //# sourceMappingURL=decorators.js.map