@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.
- package/README.en.md +68 -15
- package/README.md +68 -15
- package/dist/chunk-AX53IY63.cjs +89 -0
- package/dist/chunk-AX53IY63.cjs.map +1 -0
- package/dist/chunk-HKLXL3NW.cjs +42 -0
- package/dist/chunk-HKLXL3NW.cjs.map +1 -0
- package/dist/chunk-PKGWV2JC.cjs +81 -0
- package/dist/chunk-PKGWV2JC.cjs.map +1 -0
- package/dist/chunk-QMFPUYJO.js +30 -0
- package/dist/chunk-QMFPUYJO.js.map +1 -0
- package/dist/chunk-V4E73HMQ.js +85 -0
- package/dist/chunk-V4E73HMQ.js.map +1 -0
- package/dist/chunk-XF6C4EG2.js +76 -0
- package/dist/chunk-XF6C4EG2.js.map +1 -0
- package/dist/decorators.cjs +33 -0
- package/dist/decorators.cjs.map +1 -0
- package/dist/decorators.js +4 -0
- package/dist/decorators.js.map +1 -0
- package/dist/index.cjs +92 -375
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +101 -73
- package/dist/index.d.ts +101 -73
- package/dist/index.js +30 -363
- package/dist/index.js.map +1 -1
- package/dist/legacy-dto.cjs +26 -0
- package/dist/legacy-dto.cjs.map +1 -0
- package/dist/legacy-dto.js +5 -0
- package/dist/legacy-dto.js.map +1 -0
- package/dist/validate.cjs +20 -0
- package/dist/validate.cjs.map +1 -0
- package/dist/validate.js +3 -0
- package/dist/validate.js.map +1 -0
- package/package.json +20 -11
- package/skills/querykit-class-validator/SKILL.md +124 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { __decorateClass, validateFilter, validateSort, formatMessage } from './chunk-QMFPUYJO.js';
|
|
2
|
+
import { ValidatorConstraint, registerDecorator } from 'class-validator';
|
|
3
|
+
import { DEFAULT_MAX_OFFSET } from '@querykitjs/core';
|
|
4
|
+
import { offsetOf } from '@querykitjs/core/internal';
|
|
5
|
+
|
|
6
|
+
var optionsOf = (args, fallbackPath) => {
|
|
7
|
+
let given = args?.constraints?.[0] ?? {};
|
|
8
|
+
return { rootPath: args?.property ?? fallbackPath, ...given };
|
|
9
|
+
}, firstMessage = (issues, options, args, fallback) => {
|
|
10
|
+
let first = issues[0];
|
|
11
|
+
return first ? options.messageStyle === "key" ? first.key : first.message : `${args?.property ?? "value"} ${fallback}`;
|
|
12
|
+
}, IsQueryFilterConstraint = class {
|
|
13
|
+
validate(value, args) {
|
|
14
|
+
return validateFilter(value, optionsOf(args, "filter")).length === 0;
|
|
15
|
+
}
|
|
16
|
+
defaultMessage(args) {
|
|
17
|
+
let options = optionsOf(args, "filter");
|
|
18
|
+
return firstMessage(validateFilter(args?.value, options), options, args, "is not a valid querykit filter");
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
IsQueryFilterConstraint = __decorateClass([
|
|
22
|
+
ValidatorConstraint({ name: "isQueryFilter", async: false })
|
|
23
|
+
], IsQueryFilterConstraint);
|
|
24
|
+
var IsQuerySortConstraint = class {
|
|
25
|
+
validate(value, args) {
|
|
26
|
+
return validateSort(value, optionsOf(args, "sort")).length === 0;
|
|
27
|
+
}
|
|
28
|
+
defaultMessage(args) {
|
|
29
|
+
let options = optionsOf(args, "sort");
|
|
30
|
+
return firstMessage(validateSort(args?.value, options), options, args, "is not a valid querykit sort");
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
IsQuerySortConstraint = __decorateClass([
|
|
34
|
+
ValidatorConstraint({ name: "isQuerySort", async: false })
|
|
35
|
+
], IsQuerySortConstraint);
|
|
36
|
+
var maxOffsetOf = (args) => args?.constraints?.[0]?.maxOffset ?? DEFAULT_MAX_OFFSET, IsWithinMaxOffsetConstraint = class {
|
|
37
|
+
validate(value, args) {
|
|
38
|
+
if (typeof value != "number") return true;
|
|
39
|
+
let perPage = args?.object?.perPage;
|
|
40
|
+
return (args?.constraints?.[0]?.mode === "page" ? offsetOf(value, typeof perPage == "number" ? perPage : void 0) : value) <= maxOffsetOf(args);
|
|
41
|
+
}
|
|
42
|
+
defaultMessage(args) {
|
|
43
|
+
return formatMessage("querykit.limit.exceeded", { path: args?.property ?? "offset", limit: "maxOffset", max: maxOffsetOf(args) });
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
IsWithinMaxOffsetConstraint = __decorateClass([
|
|
47
|
+
ValidatorConstraint({ name: "isWithinMaxOffset", async: false })
|
|
48
|
+
], IsWithinMaxOffsetConstraint);
|
|
49
|
+
function IsWithinMaxOffset(options, validationOptions) {
|
|
50
|
+
return (target, propertyName) => {
|
|
51
|
+
registerDecorator({
|
|
52
|
+
target: target.constructor,
|
|
53
|
+
propertyName,
|
|
54
|
+
options: validationOptions,
|
|
55
|
+
constraints: [options],
|
|
56
|
+
validator: IsWithinMaxOffsetConstraint
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function IsQueryFilter(options, validationOptions) {
|
|
61
|
+
return (target, propertyName) => {
|
|
62
|
+
registerDecorator({
|
|
63
|
+
target: target.constructor,
|
|
64
|
+
propertyName,
|
|
65
|
+
options: validationOptions,
|
|
66
|
+
constraints: [options],
|
|
67
|
+
validator: IsQueryFilterConstraint
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function IsQuerySort(options, validationOptions) {
|
|
72
|
+
return (target, propertyName) => {
|
|
73
|
+
registerDecorator({
|
|
74
|
+
target: target.constructor,
|
|
75
|
+
propertyName,
|
|
76
|
+
options: validationOptions,
|
|
77
|
+
constraints: [options],
|
|
78
|
+
validator: IsQuerySortConstraint
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { IsQueryFilter, IsQueryFilterConstraint, IsQuerySort, IsQuerySortConstraint, IsWithinMaxOffset, IsWithinMaxOffsetConstraint };
|
|
84
|
+
//# sourceMappingURL=chunk-V4E73HMQ.js.map
|
|
85
|
+
//# sourceMappingURL=chunk-V4E73HMQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { IsQueryFilter, IsQuerySort, IsWithinMaxOffset } from './chunk-V4E73HMQ.js';
|
|
2
|
+
import { __decorateClass } from './chunk-QMFPUYJO.js';
|
|
3
|
+
import { Type } from 'class-transformer';
|
|
4
|
+
import { IsOptional, IsInt, IsPositive, Max, IsBoolean, Min, IsString, IsIn } from 'class-validator';
|
|
5
|
+
import { DEFAULT_MAX_PER_PAGE, DEFAULT_MAX_LIMIT } from '@querykitjs/core';
|
|
6
|
+
|
|
7
|
+
var BaseParamsDto = class {
|
|
8
|
+
};
|
|
9
|
+
__decorateClass([
|
|
10
|
+
IsOptional(),
|
|
11
|
+
IsQueryFilter()
|
|
12
|
+
], BaseParamsDto.prototype, "filter", 2), __decorateClass([
|
|
13
|
+
IsOptional(),
|
|
14
|
+
IsQuerySort()
|
|
15
|
+
], BaseParamsDto.prototype, "sort", 2);
|
|
16
|
+
var OffsetParamsDto = class extends BaseParamsDto {
|
|
17
|
+
};
|
|
18
|
+
__decorateClass([
|
|
19
|
+
IsOptional(),
|
|
20
|
+
Type(() => Number),
|
|
21
|
+
IsInt(),
|
|
22
|
+
IsPositive(),
|
|
23
|
+
IsWithinMaxOffset({ mode: "page" })
|
|
24
|
+
], OffsetParamsDto.prototype, "page", 2), __decorateClass([
|
|
25
|
+
IsOptional(),
|
|
26
|
+
Type(() => Number),
|
|
27
|
+
IsInt(),
|
|
28
|
+
IsPositive(),
|
|
29
|
+
Max(DEFAULT_MAX_PER_PAGE)
|
|
30
|
+
], OffsetParamsDto.prototype, "perPage", 2), __decorateClass([
|
|
31
|
+
IsOptional(),
|
|
32
|
+
IsBoolean()
|
|
33
|
+
], OffsetParamsDto.prototype, "withTotal", 2);
|
|
34
|
+
var InfiniteParamsDto = class extends BaseParamsDto {
|
|
35
|
+
};
|
|
36
|
+
__decorateClass([
|
|
37
|
+
IsOptional(),
|
|
38
|
+
Type(() => Number),
|
|
39
|
+
IsInt(),
|
|
40
|
+
IsPositive(),
|
|
41
|
+
Max(DEFAULT_MAX_LIMIT)
|
|
42
|
+
], InfiniteParamsDto.prototype, "limit", 2), __decorateClass([
|
|
43
|
+
IsOptional(),
|
|
44
|
+
Type(() => Number),
|
|
45
|
+
IsInt(),
|
|
46
|
+
Min(0),
|
|
47
|
+
IsWithinMaxOffset({ mode: "offset" })
|
|
48
|
+
], InfiniteParamsDto.prototype, "offset", 2);
|
|
49
|
+
var CursorParamsDto = class {
|
|
50
|
+
};
|
|
51
|
+
__decorateClass([
|
|
52
|
+
IsOptional(),
|
|
53
|
+
IsQueryFilter()
|
|
54
|
+
], CursorParamsDto.prototype, "filter", 2), __decorateClass([
|
|
55
|
+
IsOptional(),
|
|
56
|
+
Type(() => Number),
|
|
57
|
+
IsInt(),
|
|
58
|
+
IsPositive(),
|
|
59
|
+
Max(DEFAULT_MAX_LIMIT)
|
|
60
|
+
], CursorParamsDto.prototype, "limit", 2), __decorateClass([
|
|
61
|
+
IsOptional(),
|
|
62
|
+
IsString()
|
|
63
|
+
], CursorParamsDto.prototype, "cursor", 2), __decorateClass([
|
|
64
|
+
IsOptional(),
|
|
65
|
+
IsString()
|
|
66
|
+
], CursorParamsDto.prototype, "cursorKey", 2), __decorateClass([
|
|
67
|
+
IsOptional(),
|
|
68
|
+
IsIn(["asc", "desc"])
|
|
69
|
+
], CursorParamsDto.prototype, "order", 2), __decorateClass([
|
|
70
|
+
IsOptional(),
|
|
71
|
+
IsIn(["forward", "backward"])
|
|
72
|
+
], CursorParamsDto.prototype, "direction", 2);
|
|
73
|
+
|
|
74
|
+
export { BaseParamsDto, CursorParamsDto, InfiniteParamsDto, OffsetParamsDto };
|
|
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":"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","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"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkAX53IY63_cjs = require('./chunk-AX53IY63.cjs');
|
|
4
|
+
require('./chunk-HKLXL3NW.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "IsQueryFilter", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunkAX53IY63_cjs.IsQueryFilter; }
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "IsQueryFilterConstraint", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return chunkAX53IY63_cjs.IsQueryFilterConstraint; }
|
|
15
|
+
});
|
|
16
|
+
Object.defineProperty(exports, "IsQuerySort", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return chunkAX53IY63_cjs.IsQuerySort; }
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(exports, "IsQuerySortConstraint", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function () { return chunkAX53IY63_cjs.IsQuerySortConstraint; }
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "IsWithinMaxOffset", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () { return chunkAX53IY63_cjs.IsWithinMaxOffset; }
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(exports, "IsWithinMaxOffsetConstraint", {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
get: function () { return chunkAX53IY63_cjs.IsWithinMaxOffsetConstraint; }
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=decorators.cjs.map
|
|
33
|
+
//# sourceMappingURL=decorators.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"decorators.cjs"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { IsQueryFilter, IsQueryFilterConstraint, IsQuerySort, IsQuerySortConstraint, IsWithinMaxOffset, IsWithinMaxOffsetConstraint } from './chunk-V4E73HMQ.js';
|
|
2
|
+
import './chunk-QMFPUYJO.js';
|
|
3
|
+
//# sourceMappingURL=decorators.js.map
|
|
4
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"decorators.js"}
|