zod-paginate 1.0.0 → 1.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/dist/main.d.ts +37 -10
- package/dist/main.js +55 -54
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/dist/main.d.ts
CHANGED
|
@@ -30,11 +30,19 @@ interface CursorPaginationConfig<T> {
|
|
|
30
30
|
paginationType: 'CURSOR';
|
|
31
31
|
cursorProperty: Path<T>;
|
|
32
32
|
}
|
|
33
|
-
declare const SortDirectionSchema: z.ZodEnum<{
|
|
33
|
+
export declare const SortDirectionSchema: z.ZodEnum<{
|
|
34
34
|
ASC: "ASC";
|
|
35
35
|
DESC: "DESC";
|
|
36
36
|
}>;
|
|
37
|
-
type SortDirection = z.infer<typeof SortDirectionSchema>;
|
|
37
|
+
export type SortDirection = z.infer<typeof SortDirectionSchema>;
|
|
38
|
+
export declare const SortItemSchema: z.ZodObject<{
|
|
39
|
+
property: z.ZodString;
|
|
40
|
+
direction: z.ZodEnum<{
|
|
41
|
+
ASC: "ASC";
|
|
42
|
+
DESC: "DESC";
|
|
43
|
+
}>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
export type SortItem = z.infer<typeof SortItemSchema>;
|
|
38
46
|
/**
|
|
39
47
|
* Supported operators.
|
|
40
48
|
* $eq: equality (for strings, numbers, dates)
|
|
@@ -46,7 +54,7 @@ type SortDirection = z.infer<typeof SortDirectionSchema>;
|
|
|
46
54
|
* $sw: case-insensitive starts-with match (for strings)
|
|
47
55
|
* $contains: checks if the field value contains the provided value (for strings)
|
|
48
56
|
*/
|
|
49
|
-
declare const OperatorSchema: z.ZodEnum<{
|
|
57
|
+
export declare const OperatorSchema: z.ZodEnum<{
|
|
50
58
|
$eq: "$eq";
|
|
51
59
|
$null: "$null";
|
|
52
60
|
$in: "$in";
|
|
@@ -59,14 +67,33 @@ declare const OperatorSchema: z.ZodEnum<{
|
|
|
59
67
|
$sw: "$sw";
|
|
60
68
|
$contains: "$contains";
|
|
61
69
|
}>;
|
|
62
|
-
type Operator = z.infer<typeof OperatorSchema>;
|
|
70
|
+
export type Operator = z.infer<typeof OperatorSchema>;
|
|
71
|
+
/**
|
|
72
|
+
* Logical combinators for grouping conditions. $and and $or can be used to combine multiple conditions within the same group.
|
|
73
|
+
*/
|
|
74
|
+
export declare const CombinatorSchema: z.ZodEnum<{
|
|
75
|
+
$and: "$and";
|
|
76
|
+
$or: "$or";
|
|
77
|
+
}>;
|
|
78
|
+
export type Combinator = z.infer<typeof CombinatorSchema>;
|
|
79
|
+
export declare const IntegerStringSchema: z.ZodString;
|
|
80
|
+
/**
|
|
81
|
+
* Regex for validating ISO date strings (YYYY-MM-DD).
|
|
82
|
+
*/
|
|
83
|
+
export declare const ISO_DATE_RE: RegExp;
|
|
84
|
+
/**
|
|
85
|
+
* Regex for validating ISO datetime strings (YYYY-MM-DDTHH:mm:ss.sssZ or with timezone offset).
|
|
86
|
+
*/
|
|
87
|
+
export declare const ISO_DATETIME_RE: RegExp;
|
|
88
|
+
export declare const NumericStringSchema: z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>;
|
|
89
|
+
export declare const NumOrDateSchema: z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>;
|
|
63
90
|
type FieldType = 'string' | 'number' | 'date' | 'any';
|
|
64
91
|
type FieldTypeFromValue<V> = V extends Date ? 'date' : V extends number ? 'number' : V extends string ? 'string' : 'any';
|
|
65
92
|
type CommonOps = '$eq' | '$null' | '$in' | '$contains';
|
|
66
93
|
type StringOnlyOps = '$ilike' | '$sw';
|
|
67
94
|
type ComparableOps = '$gt' | '$gte' | '$lt' | '$lte' | '$btw';
|
|
68
95
|
type OpsForFieldType<TKind extends FieldType> = TKind extends 'string' ? CommonOps | StringOnlyOps : TKind extends 'number' ? CommonOps | ComparableOps : TKind extends 'date' ? CommonOps | ComparableOps : Operator;
|
|
69
|
-
declare const ConditionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
96
|
+
export declare const ConditionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
70
97
|
group: z.ZodString;
|
|
71
98
|
combinator: z.ZodOptional<z.ZodEnum<{
|
|
72
99
|
$and: "$and";
|
|
@@ -131,21 +158,21 @@ declare const ConditionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
131
158
|
not: z.ZodOptional<z.ZodLiteral<true>>;
|
|
132
159
|
value: z.ZodTuple<[z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>], null>;
|
|
133
160
|
}, z.core.$strip>], "op">;
|
|
134
|
-
type Condition = z.infer<typeof ConditionSchema>;
|
|
135
|
-
interface WhereFilter {
|
|
161
|
+
export type Condition = z.infer<typeof ConditionSchema>;
|
|
162
|
+
export interface WhereFilter {
|
|
136
163
|
type: 'filter';
|
|
137
164
|
field: string;
|
|
138
165
|
condition: Condition;
|
|
139
166
|
}
|
|
140
|
-
interface WhereAnd {
|
|
167
|
+
export interface WhereAnd {
|
|
141
168
|
type: 'and';
|
|
142
169
|
items: WhereNode[];
|
|
143
170
|
}
|
|
144
|
-
interface WhereOr {
|
|
171
|
+
export interface WhereOr {
|
|
145
172
|
type: 'or';
|
|
146
173
|
items: WhereNode[];
|
|
147
174
|
}
|
|
148
|
-
type WhereNode = WhereFilter | WhereAnd | WhereOr;
|
|
175
|
+
export type WhereNode = WhereFilter | WhereAnd | WhereOr;
|
|
149
176
|
export type DataSchema = z.ZodObject<z.ZodRawShape>;
|
|
150
177
|
export type InferData<TSchema extends DataSchema> = z.infer<TSchema>;
|
|
151
178
|
export type AllowedPath<TSchema extends DataSchema> = Path<InferData<TSchema>>;
|
package/dist/main.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConditionSchema = exports.NumOrDateSchema = exports.NumericStringSchema = exports.ISO_DATETIME_RE = exports.ISO_DATE_RE = exports.IntegerStringSchema = exports.CombinatorSchema = exports.OperatorSchema = exports.SortItemSchema = exports.SortDirectionSchema = void 0;
|
|
3
4
|
exports.paginate = paginate;
|
|
4
5
|
const zod_1 = require("zod");
|
|
5
6
|
/* ---------------------------------- */
|
|
@@ -37,10 +38,10 @@ const SelectCsvSchema = zod_1.z
|
|
|
37
38
|
/* ---------------------------------- */
|
|
38
39
|
/* Sort */
|
|
39
40
|
/* ---------------------------------- */
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
exports.SortDirectionSchema = zod_1.z.enum(['ASC', 'DESC']);
|
|
42
|
+
exports.SortItemSchema = zod_1.z.object({
|
|
42
43
|
property: zod_1.z.string().min(1),
|
|
43
|
-
direction: SortDirectionSchema,
|
|
44
|
+
direction: exports.SortDirectionSchema,
|
|
44
45
|
});
|
|
45
46
|
/**
|
|
46
47
|
* Parse "field:ASC" into a SortItem.
|
|
@@ -49,8 +50,8 @@ const SortItemSchema = zod_1.z.object({
|
|
|
49
50
|
function parseSortItem(raw) {
|
|
50
51
|
const [propertyRaw, dirRaw] = raw.split(':');
|
|
51
52
|
const property = (propertyRaw ?? '').trim();
|
|
52
|
-
const direction = SortDirectionSchema.parse((dirRaw ?? '').trim());
|
|
53
|
-
return SortItemSchema.parse({ property, direction });
|
|
53
|
+
const direction = exports.SortDirectionSchema.parse((dirRaw ?? '').trim());
|
|
54
|
+
return exports.SortItemSchema.parse({ property, direction });
|
|
54
55
|
}
|
|
55
56
|
/* ---------------------------------- */
|
|
56
57
|
/* Conditions + grouping */
|
|
@@ -66,7 +67,7 @@ function parseSortItem(raw) {
|
|
|
66
67
|
* $sw: case-insensitive starts-with match (for strings)
|
|
67
68
|
* $contains: checks if the field value contains the provided value (for strings)
|
|
68
69
|
*/
|
|
69
|
-
|
|
70
|
+
exports.OperatorSchema = zod_1.z.enum([
|
|
70
71
|
'$eq',
|
|
71
72
|
'$null',
|
|
72
73
|
'$in',
|
|
@@ -82,64 +83,64 @@ const OperatorSchema = zod_1.z.enum([
|
|
|
82
83
|
/**
|
|
83
84
|
* Logical combinators for grouping conditions. $and and $or can be used to combine multiple conditions within the same group.
|
|
84
85
|
*/
|
|
85
|
-
|
|
86
|
+
exports.CombinatorSchema = zod_1.z.enum(['$and', '$or']);
|
|
86
87
|
const ROOT_GROUP_ID = '0';
|
|
87
|
-
|
|
88
|
+
exports.IntegerStringSchema = zod_1.z.string().regex(/^\d+$/, 'Must be an integer string');
|
|
88
89
|
/**
|
|
89
90
|
* Regex for validating ISO date strings (YYYY-MM-DD).
|
|
90
91
|
*/
|
|
91
|
-
|
|
92
|
+
exports.ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
92
93
|
/**
|
|
93
94
|
* Regex for validating ISO datetime strings (YYYY-MM-DDTHH:mm:ss.sssZ or with timezone offset).
|
|
94
95
|
*/
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
exports.ISO_DATETIME_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?(Z|[+-]\d{2}:\d{2})$/;
|
|
97
|
+
exports.NumericStringSchema = zod_1.z
|
|
97
98
|
.string()
|
|
98
99
|
.trim()
|
|
99
100
|
.regex(/^\d+$/, 'Must be a numeric string')
|
|
100
101
|
.transform((s) => Number(s));
|
|
101
|
-
|
|
102
|
-
|
|
102
|
+
exports.NumOrDateSchema = zod_1.z.union([zod_1.z.number(), zod_1.z.string()]);
|
|
103
|
+
exports.ConditionSchema = zod_1.z.discriminatedUnion('op', [
|
|
103
104
|
zod_1.z.object({
|
|
104
|
-
group: IntegerStringSchema,
|
|
105
|
-
combinator: CombinatorSchema.optional(),
|
|
105
|
+
group: exports.IntegerStringSchema,
|
|
106
|
+
combinator: exports.CombinatorSchema.optional(),
|
|
106
107
|
op: zod_1.z.literal('$null'),
|
|
107
108
|
not: zod_1.z.literal(true).optional(),
|
|
108
109
|
}),
|
|
109
110
|
zod_1.z.object({
|
|
110
|
-
group: IntegerStringSchema,
|
|
111
|
-
combinator: CombinatorSchema.optional(),
|
|
111
|
+
group: exports.IntegerStringSchema,
|
|
112
|
+
combinator: exports.CombinatorSchema.optional(),
|
|
112
113
|
op: zod_1.z.literal('$eq'),
|
|
113
114
|
not: zod_1.z.literal(true).optional(),
|
|
114
|
-
value: NumOrDateSchema,
|
|
115
|
+
value: exports.NumOrDateSchema,
|
|
115
116
|
}),
|
|
116
117
|
zod_1.z.object({
|
|
117
|
-
group: IntegerStringSchema,
|
|
118
|
-
combinator: CombinatorSchema.optional(),
|
|
118
|
+
group: exports.IntegerStringSchema,
|
|
119
|
+
combinator: exports.CombinatorSchema.optional(),
|
|
119
120
|
op: zod_1.z.enum(['$ilike', '$sw']),
|
|
120
121
|
not: zod_1.z.literal(true).optional(),
|
|
121
122
|
value: zod_1.z.string(),
|
|
122
123
|
}),
|
|
123
124
|
zod_1.z.object({
|
|
124
|
-
group: IntegerStringSchema,
|
|
125
|
-
combinator: CombinatorSchema.optional(),
|
|
125
|
+
group: exports.IntegerStringSchema,
|
|
126
|
+
combinator: exports.CombinatorSchema.optional(),
|
|
126
127
|
op: zod_1.z.enum(['$in', '$contains']),
|
|
127
128
|
not: zod_1.z.literal(true).optional(),
|
|
128
129
|
value: zod_1.z.array(zod_1.z.string()),
|
|
129
130
|
}),
|
|
130
131
|
zod_1.z.object({
|
|
131
|
-
group: IntegerStringSchema,
|
|
132
|
-
combinator: CombinatorSchema.optional(),
|
|
132
|
+
group: exports.IntegerStringSchema,
|
|
133
|
+
combinator: exports.CombinatorSchema.optional(),
|
|
133
134
|
op: zod_1.z.enum(['$gt', '$gte', '$lt', '$lte']),
|
|
134
135
|
not: zod_1.z.literal(true).optional(),
|
|
135
|
-
value: NumOrDateSchema,
|
|
136
|
+
value: exports.NumOrDateSchema,
|
|
136
137
|
}),
|
|
137
138
|
zod_1.z.object({
|
|
138
|
-
group: IntegerStringSchema,
|
|
139
|
-
combinator: CombinatorSchema.optional(),
|
|
139
|
+
group: exports.IntegerStringSchema,
|
|
140
|
+
combinator: exports.CombinatorSchema.optional(),
|
|
140
141
|
op: zod_1.z.literal('$btw'),
|
|
141
142
|
not: zod_1.z.literal(true).optional(),
|
|
142
|
-
value: zod_1.z.tuple([NumOrDateSchema, NumOrDateSchema]),
|
|
143
|
+
value: zod_1.z.tuple([exports.NumOrDateSchema, exports.NumOrDateSchema]),
|
|
143
144
|
}),
|
|
144
145
|
]);
|
|
145
146
|
function and(items) {
|
|
@@ -163,7 +164,7 @@ function fold(op, left, right) {
|
|
|
163
164
|
return and([left, right]);
|
|
164
165
|
}
|
|
165
166
|
const WhereNodeSchema = zod_1.z.lazy(() => zod_1.z.union([
|
|
166
|
-
zod_1.z.object({ type: zod_1.z.literal('filter'), field: zod_1.z.string(), condition: ConditionSchema }),
|
|
167
|
+
zod_1.z.object({ type: zod_1.z.literal('filter'), field: zod_1.z.string(), condition: exports.ConditionSchema }),
|
|
167
168
|
zod_1.z.object({ type: zod_1.z.literal('and'), items: zod_1.z.array(WhereNodeSchema) }),
|
|
168
169
|
zod_1.z.object({ type: zod_1.z.literal('or'), items: zod_1.z.array(WhereNodeSchema) }),
|
|
169
170
|
]));
|
|
@@ -178,7 +179,7 @@ function extractGroupDefs(q) {
|
|
|
178
179
|
continue;
|
|
179
180
|
const groupIdRaw = rest.slice(0, dotIdx).trim();
|
|
180
181
|
const prop = rest.slice(dotIdx + 1).trim();
|
|
181
|
-
const parsedId = IntegerStringSchema.safeParse(groupIdRaw);
|
|
182
|
+
const parsedId = exports.IntegerStringSchema.safeParse(groupIdRaw);
|
|
182
183
|
if (!parsedId.success)
|
|
183
184
|
continue;
|
|
184
185
|
const id = parsedId.data;
|
|
@@ -186,15 +187,15 @@ function extractGroupDefs(q) {
|
|
|
186
187
|
const valueStr = typeof first === 'string' ? first : '';
|
|
187
188
|
const current = defs[id] ?? {};
|
|
188
189
|
if (prop === 'parent') {
|
|
189
|
-
defs[id] = { ...current, parent: IntegerStringSchema.parse(valueStr.trim()) };
|
|
190
|
+
defs[id] = { ...current, parent: exports.IntegerStringSchema.parse(valueStr.trim()) };
|
|
190
191
|
continue;
|
|
191
192
|
}
|
|
192
193
|
if (prop === 'join') {
|
|
193
|
-
defs[id] = { ...current, join: CombinatorSchema.parse(valueStr.trim()) };
|
|
194
|
+
defs[id] = { ...current, join: exports.CombinatorSchema.parse(valueStr.trim()) };
|
|
194
195
|
continue;
|
|
195
196
|
}
|
|
196
197
|
if (prop === 'op') {
|
|
197
|
-
defs[id] = { ...current, op: CombinatorSchema.parse(valueStr.trim()) };
|
|
198
|
+
defs[id] = { ...current, op: exports.CombinatorSchema.parse(valueStr.trim()) };
|
|
198
199
|
continue;
|
|
199
200
|
}
|
|
200
201
|
}
|
|
@@ -209,7 +210,7 @@ function validateGroupDefs(defs) {
|
|
|
209
210
|
if (id === ROOT_GROUP_ID)
|
|
210
211
|
continue;
|
|
211
212
|
if (def.parent !== undefined)
|
|
212
|
-
IntegerStringSchema.parse(def.parent);
|
|
213
|
+
exports.IntegerStringSchema.parse(def.parent);
|
|
213
214
|
}
|
|
214
215
|
const visiting = new Set();
|
|
215
216
|
const visited = new Set();
|
|
@@ -346,7 +347,7 @@ function parseNumOrDateStrict(raw, ctx) {
|
|
|
346
347
|
throw new Error(`Invalid number for ${ctx}: "${raw}"`);
|
|
347
348
|
return n;
|
|
348
349
|
}
|
|
349
|
-
if (ISO_DATE_RE.test(s) || ISO_DATETIME_RE.test(s)) {
|
|
350
|
+
if (exports.ISO_DATE_RE.test(s) || exports.ISO_DATETIME_RE.test(s)) {
|
|
350
351
|
const t = Date.parse(s);
|
|
351
352
|
if (Number.isNaN(t))
|
|
352
353
|
throw new Error(`Invalid ISO date for ${ctx}: "${raw}"`);
|
|
@@ -368,7 +369,7 @@ function parseSingleCondition(raw) {
|
|
|
368
369
|
let group = ROOT_GROUP_ID;
|
|
369
370
|
let cursor = parts;
|
|
370
371
|
if (cursor[0] === '$g') {
|
|
371
|
-
group = IntegerStringSchema.parse((cursor[1] ?? '').trim());
|
|
372
|
+
group = exports.IntegerStringSchema.parse((cursor[1] ?? '').trim());
|
|
372
373
|
cursor = cursor.slice(2);
|
|
373
374
|
if (cursor.length === 0) {
|
|
374
375
|
throw new Error(`Invalid group prefix in "${raw}" (missing condition after "$g:<id>")`);
|
|
@@ -376,7 +377,7 @@ function parseSingleCondition(raw) {
|
|
|
376
377
|
}
|
|
377
378
|
let combinator;
|
|
378
379
|
if (cursor[0] === '$and' || cursor[0] === '$or') {
|
|
379
|
-
combinator = CombinatorSchema.parse(cursor[0]);
|
|
380
|
+
combinator = exports.CombinatorSchema.parse(cursor[0]);
|
|
380
381
|
cursor = cursor.slice(1);
|
|
381
382
|
if (cursor.length === 0) {
|
|
382
383
|
throw new Error(`Invalid combinator in "${raw}" (missing condition after "${combinator}")`);
|
|
@@ -390,16 +391,16 @@ function parseSingleCondition(raw) {
|
|
|
390
391
|
const rest = hasNot ? cursor.slice(2).join(':') : cursor.slice(1).join(':');
|
|
391
392
|
const not = hasNot ? true : undefined;
|
|
392
393
|
if (!head?.startsWith('$')) {
|
|
393
|
-
return ConditionSchema.parse({
|
|
394
|
+
return exports.ConditionSchema.parse({
|
|
394
395
|
group,
|
|
395
396
|
combinator,
|
|
396
397
|
op: '$eq',
|
|
397
398
|
value: cursor.join(':'),
|
|
398
399
|
});
|
|
399
400
|
}
|
|
400
|
-
const op = OperatorSchema.parse(head);
|
|
401
|
+
const op = exports.OperatorSchema.parse(head);
|
|
401
402
|
if (op === '$null')
|
|
402
|
-
return ConditionSchema.parse({ group, combinator, op: '$null', not });
|
|
403
|
+
return exports.ConditionSchema.parse({ group, combinator, op: '$null', not });
|
|
403
404
|
if (op === '$eq') {
|
|
404
405
|
let value;
|
|
405
406
|
try {
|
|
@@ -408,7 +409,7 @@ function parseSingleCondition(raw) {
|
|
|
408
409
|
catch {
|
|
409
410
|
value = rest;
|
|
410
411
|
}
|
|
411
|
-
return ConditionSchema.parse({ group, combinator, op: '$eq', not, value });
|
|
412
|
+
return exports.ConditionSchema.parse({ group, combinator, op: '$eq', not, value });
|
|
412
413
|
}
|
|
413
414
|
if (op === '$btw') {
|
|
414
415
|
const [aRaw, bRaw] = rest.split(',');
|
|
@@ -417,21 +418,21 @@ function parseSingleCondition(raw) {
|
|
|
417
418
|
const a = parseNumOrDateStrict(aRaw, '$btw');
|
|
418
419
|
const b = parseNumOrDateStrict(bRaw, '$btw');
|
|
419
420
|
assertSameKind(a, b, '$btw');
|
|
420
|
-
return ConditionSchema.parse({ group, combinator, op: '$btw', not, value: [a, b] });
|
|
421
|
+
return exports.ConditionSchema.parse({ group, combinator, op: '$btw', not, value: [a, b] });
|
|
421
422
|
}
|
|
422
423
|
if (op === '$in' || op === '$contains') {
|
|
423
424
|
const arr = rest
|
|
424
425
|
.split(',')
|
|
425
426
|
.map((s) => s.trim())
|
|
426
427
|
.filter(Boolean);
|
|
427
|
-
return ConditionSchema.parse({ group, combinator, op, not, value: arr });
|
|
428
|
+
return exports.ConditionSchema.parse({ group, combinator, op, not, value: arr });
|
|
428
429
|
}
|
|
429
430
|
if (op === '$gt' || op === '$gte' || op === '$lt' || op === '$lte') {
|
|
430
431
|
const v = parseNumOrDateStrict(rest, op);
|
|
431
|
-
return ConditionSchema.parse({ group, combinator, op, not, value: v });
|
|
432
|
+
return exports.ConditionSchema.parse({ group, combinator, op, not, value: v });
|
|
432
433
|
}
|
|
433
434
|
// $ilike | $sw
|
|
434
|
-
return ConditionSchema.parse({ group, combinator, op, not, value: rest });
|
|
435
|
+
return exports.ConditionSchema.parse({ group, combinator, op, not, value: rest });
|
|
435
436
|
}
|
|
436
437
|
/* ---------------------------------- */
|
|
437
438
|
/* Extract raw filters */
|
|
@@ -538,7 +539,7 @@ function computeSelect(select, config) {
|
|
|
538
539
|
function isISODateString(v) {
|
|
539
540
|
if (typeof v !== 'string')
|
|
540
541
|
return false;
|
|
541
|
-
if (!(ISO_DATE_RE.test(v) || ISO_DATETIME_RE.test(v)))
|
|
542
|
+
if (!(exports.ISO_DATE_RE.test(v) || exports.ISO_DATETIME_RE.test(v)))
|
|
542
543
|
return false;
|
|
543
544
|
return !Number.isNaN(Date.parse(v));
|
|
544
545
|
}
|
|
@@ -852,8 +853,8 @@ function paginate(config) {
|
|
|
852
853
|
allowedSortable.add(`${f}`);
|
|
853
854
|
const filterable = toFilterableRuntime(config.filterable);
|
|
854
855
|
const baseSchema = zod_1.z.object({
|
|
855
|
-
limit: NumericStringSchema.optional(),
|
|
856
|
-
page: NumericStringSchema.optional(),
|
|
856
|
+
limit: exports.NumericStringSchema.optional(),
|
|
857
|
+
page: exports.NumericStringSchema.optional(),
|
|
857
858
|
/**
|
|
858
859
|
* Query input is always a string if present.
|
|
859
860
|
* We will coerce it later in the final transform (CURSOR mode only).
|
|
@@ -861,11 +862,11 @@ function paginate(config) {
|
|
|
861
862
|
cursor: zod_1.z.string().min(1).optional(),
|
|
862
863
|
sortBy: StringOrStringArraySchema.optional(),
|
|
863
864
|
select: SelectCsvSchema.optional(),
|
|
864
|
-
rawFilters: zod_1.z.record(zod_1.z.string(), zod_1.z.array(ConditionSchema)),
|
|
865
|
+
rawFilters: zod_1.z.record(zod_1.z.string(), zod_1.z.array(exports.ConditionSchema)),
|
|
865
866
|
groupDefs: zod_1.z.record(zod_1.z.string(), zod_1.z.object({
|
|
866
|
-
parent: IntegerStringSchema.optional(),
|
|
867
|
-
join: CombinatorSchema.optional(),
|
|
868
|
-
op: CombinatorSchema.optional(),
|
|
867
|
+
parent: exports.IntegerStringSchema.optional(),
|
|
868
|
+
join: exports.CombinatorSchema.optional(),
|
|
869
|
+
op: exports.CombinatorSchema.optional(),
|
|
869
870
|
})),
|
|
870
871
|
});
|
|
871
872
|
const queryParamsSchema = zod_1.z
|
|
@@ -1102,7 +1103,7 @@ function paginate(config) {
|
|
|
1102
1103
|
sortBy: zod_1.z
|
|
1103
1104
|
.array(zod_1.z.object({
|
|
1104
1105
|
property: zod_1.z.string(),
|
|
1105
|
-
direction: SortDirectionSchema,
|
|
1106
|
+
direction: exports.SortDirectionSchema,
|
|
1106
1107
|
}))
|
|
1107
1108
|
.optional(),
|
|
1108
1109
|
filter: WhereNodeSchema.optional(),
|
|
@@ -1118,7 +1119,7 @@ function paginate(config) {
|
|
|
1118
1119
|
sortBy: zod_1.z
|
|
1119
1120
|
.array(zod_1.z.object({
|
|
1120
1121
|
property: zod_1.z.string(),
|
|
1121
|
-
direction: SortDirectionSchema,
|
|
1122
|
+
direction: exports.SortDirectionSchema,
|
|
1122
1123
|
}))
|
|
1123
1124
|
.optional(),
|
|
1124
1125
|
filter: WhereNodeSchema.optional(),
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\n\n/* ---------------------------------- */\n/* Querystring value types */\n/* ---------------------------------- */\n\ntype QueryStringValue = string | string[] | undefined;\ntype QueryStringRecord = Record<string, QueryStringValue>;\n\n/* ---------------------------------- */\n/* Typed field paths (dot notation) */\n/* ---------------------------------- */\n\n/**\n * Primitive types that we consider as leaves in the Path type. Arrays are also considered leaves, since we don't want to generate paths like \"arrayField.0.someProp\".\n */\ntype Primitive = string | number | boolean | bigint | symbol | null | undefined | Date;\n\n/**\n * Join two path segments K and P with a dot, if both are strings. Otherwise, return never.\n */\ntype Join<K, P> = K extends string ? (P extends string ? `${K}.${P}` : never) : never;\n\n/**\n * Generate dot notation paths for a given type T, up to a certain depth D (default 5).\n * For example, for { a: { b: string }, c: number }, we would generate \"a\", \"a.b\", and \"c\". We stop recursion at depth 0 to prevent infinite types.\n */\ntype Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n\n/**\n * Generate dot notation paths for a given type T. For example, for { a: { b: string }, c: number }, we would generate \"a\", \"a.b\", and \"c\".\n */\ntype Path<T, D extends number = 5> = D extends 0\n ? never\n : T extends Primitive\n ? never\n : T extends readonly unknown[]\n ? never\n : {\n [K in Extract<keyof T, string>]: T[K] extends Primitive | readonly unknown[]\n ? K\n : K | Join<K, Path<T[K], Prev[D]>>;\n }[Extract<keyof T, string>];\n\n/**\n * Given a type T and a dot notation path P, resolve the type at that path.\n * For example, for T = { a: { b: string }, c: number } and P = \"a.b\", we would get string.\n */\ntype PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? PathValue<T[K], Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never;\n\n/* ---------------------------------- */\n/* Pagination config */\n/* ---------------------------------- */\n\ninterface LimitOffsetPaginationConfig {\n paginationType: 'LIMIT_OFFSET';\n}\n\ninterface CursorPaginationConfig<T> {\n paginationType: 'CURSOR';\n cursorProperty: Path<T>;\n}\n\n/* ---------------------------------- */\n/* Common input normalizers */\n/* ---------------------------------- */\n\n/**\n * We often want to allow both single values and arrays in the querystring, e.g. \"select=field1,field2\" or \"select[]=field1&select[]=field2\".\n * This function normalizes both cases to a string array.\n */\nfunction toStringArrayFromQueryString(v: QueryStringValue): string[] {\n if (v === undefined) return [];\n if (Array.isArray(v)) return v;\n return [v];\n}\n\n/**\n * Zod schema for a querystring parameter that can be either a single string or an array of strings.\n * It normalizes the output to always be an array of strings.\n */\nconst StringOrStringArraySchema = z\n .union([z.string(), z.array(z.string())])\n .transform((v) => (typeof v === 'string' ? [v] : v));\n\n/**\n * Zod schema for the \"select\" parameter, which can be a comma-separated string or an array of strings.\n * It normalizes the output to an array of strings.\n */\nconst SelectCsvSchema = z\n .string()\n .transform((s) =>\n s\n .split(',')\n .map((x) => x.trim())\n .filter(Boolean),\n )\n .refine((arr) => arr.length > 0, { message: 'select cannot be empty' });\n\n/* ---------------------------------- */\n/* Sort */\n/* ---------------------------------- */\n\nconst SortDirectionSchema = z.enum(['ASC', 'DESC']);\ntype SortDirection = z.infer<typeof SortDirectionSchema>;\n\nconst SortItemSchema = z.object({\n property: z.string().min(1),\n direction: SortDirectionSchema,\n});\ntype SortItem = z.infer<typeof SortItemSchema>;\n\n/**\n * Parse \"field:ASC\" into a SortItem.\n * The input must have a colon separating the field and direction, and the direction must be either \"ASC\" or \"DESC\" (case-insensitive).\n * */\nfunction parseSortItem(raw: string): SortItem {\n const [propertyRaw, dirRaw] = raw.split(':');\n const property = (propertyRaw ?? '').trim();\n const direction = SortDirectionSchema.parse((dirRaw ?? '').trim());\n return SortItemSchema.parse({ property, direction });\n}\n\n/* ---------------------------------- */\n/* Conditions + grouping */\n/* ---------------------------------- */\n\n/**\n * Supported operators.\n * $eq: equality (for strings, numbers, dates)\n * $null: checks for null (ignores the value)\n * $in: checks if the field value is in the provided array (for strings, numbers, dates)\n * $gt, $gte, $lt, $lte: comparison operators (for numbers and dates)\n * $btw: checks if the field value is between two values (for numbers and dates)\n * $ilike: case-insensitive substring match (for strings)\n * $sw: case-insensitive starts-with match (for strings)\n * $contains: checks if the field value contains the provided value (for strings)\n */\nconst OperatorSchema = z.enum([\n '$eq',\n '$null',\n '$in',\n '$gt',\n '$gte',\n '$lt',\n '$lte',\n '$btw',\n '$ilike',\n '$sw',\n '$contains',\n]);\ntype Operator = z.infer<typeof OperatorSchema>;\n\n/**\n * Logical combinators for grouping conditions. $and and $or can be used to combine multiple conditions within the same group.\n */\nconst CombinatorSchema = z.enum(['$and', '$or']);\ntype Combinator = z.infer<typeof CombinatorSchema>;\n\nconst ROOT_GROUP_ID = '0';\nconst IntegerStringSchema = z.string().regex(/^\\d+$/, 'Must be an integer string');\n\n/**\n * Regex for validating ISO date strings (YYYY-MM-DD).\n */\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/**\n * Regex for validating ISO datetime strings (YYYY-MM-DDTHH:mm:ss.sssZ or with timezone offset).\n */\nconst ISO_DATETIME_RE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,6})?)?(Z|[+-]\\d{2}:\\d{2})$/;\n\nconst NumericStringSchema = z\n .string()\n .trim()\n .regex(/^\\d+$/, 'Must be a numeric string')\n .transform((s) => Number(s));\n\nconst NumOrDateSchema = z.union([z.number(), z.string()]);\n\ntype FieldType = 'string' | 'number' | 'date' | 'any';\n\ntype FieldTypeFromValue<V> = V extends Date\n ? 'date'\n : V extends number\n ? 'number'\n : V extends string\n ? 'string'\n : 'any';\n\ntype CommonOps = '$eq' | '$null' | '$in' | '$contains';\ntype StringOnlyOps = '$ilike' | '$sw';\ntype ComparableOps = '$gt' | '$gte' | '$lt' | '$lte' | '$btw';\n\ntype OpsForFieldType<TKind extends FieldType> = TKind extends 'string'\n ? CommonOps | StringOnlyOps\n : TKind extends 'number'\n ? CommonOps | ComparableOps\n : TKind extends 'date'\n ? CommonOps | ComparableOps\n : Operator;\n\nconst ConditionSchema = z.discriminatedUnion('op', [\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.literal('$null'),\n not: z.literal(true).optional(),\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.literal('$eq'),\n not: z.literal(true).optional(),\n value: NumOrDateSchema,\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.enum(['$ilike', '$sw']),\n not: z.literal(true).optional(),\n value: z.string(),\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.enum(['$in', '$contains']),\n not: z.literal(true).optional(),\n value: z.array(z.string()),\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.enum(['$gt', '$gte', '$lt', '$lte']),\n not: z.literal(true).optional(),\n value: NumOrDateSchema,\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.literal('$btw'),\n not: z.literal(true).optional(),\n value: z.tuple([NumOrDateSchema, NumOrDateSchema]),\n }),\n]);\n\ntype Condition = z.infer<typeof ConditionSchema>;\n\n/* ---------------------------------- */\n/* Filters AST */\n/* ---------------------------------- */\n\ninterface WhereFilter {\n type: 'filter';\n field: string;\n condition: Condition;\n}\ninterface WhereAnd {\n type: 'and';\n items: WhereNode[];\n}\ninterface WhereOr {\n type: 'or';\n items: WhereNode[];\n}\ntype WhereNode = WhereFilter | WhereAnd | WhereOr;\n\nfunction and(items: WhereNode[]): WhereNode {\n if (items.length === 1 && items[0]) return items[0];\n return { type: 'and', items };\n}\n\nfunction or(items: WhereNode[]): WhereNode {\n if (items.length === 1 && items[0]) return items[0];\n return { type: 'or', items };\n}\n\nfunction fold(op: Combinator | undefined, left: WhereNode, right: WhereNode): WhereNode {\n if (op === '$or') {\n if (left.type === 'or') return or([...left.items, right]);\n return or([left, right]);\n }\n if (left.type === 'and') return and([...left.items, right]);\n return and([left, right]);\n}\n\nconst WhereNodeSchema: z.ZodType<WhereNode> = z.lazy(() =>\n z.union([\n z.object({ type: z.literal('filter'), field: z.string(), condition: ConditionSchema }),\n z.object({ type: z.literal('and'), items: z.array(WhereNodeSchema) }),\n z.object({ type: z.literal('or'), items: z.array(WhereNodeSchema) }),\n ]),\n);\n\n/* ---------------------------------- */\n/* Group tree */\n/* ---------------------------------- */\n\ninterface GroupDef {\n parent?: string;\n join?: Combinator;\n op?: Combinator;\n}\ntype GroupDefs = Record<string, GroupDef>;\n\nfunction extractGroupDefs(q: Record<string, unknown>): GroupDefs {\n const defs: GroupDefs = {};\n\n for (const [k, v] of Object.entries(q)) {\n if (!k.startsWith('group.')) continue;\n\n const rest = k.slice('group.'.length);\n const dotIdx = rest.indexOf('.');\n if (dotIdx === -1) continue;\n\n const groupIdRaw = rest.slice(0, dotIdx).trim();\n const prop = rest.slice(dotIdx + 1).trim();\n\n const parsedId = IntegerStringSchema.safeParse(groupIdRaw);\n if (!parsedId.success) continue;\n const id = parsedId.data;\n\n const first = Array.isArray(v) ? v[0] : v;\n const valueStr = typeof first === 'string' ? first : '';\n\n const current = defs[id] ?? {};\n\n if (prop === 'parent') {\n defs[id] = { ...current, parent: IntegerStringSchema.parse(valueStr.trim()) };\n continue;\n }\n if (prop === 'join') {\n defs[id] = { ...current, join: CombinatorSchema.parse(valueStr.trim()) };\n continue;\n }\n if (prop === 'op') {\n defs[id] = { ...current, op: CombinatorSchema.parse(valueStr.trim()) };\n continue;\n }\n }\n\n return defs;\n}\n\nfunction validateGroupDefs(defs: GroupDefs): void {\n const root = defs[ROOT_GROUP_ID];\n if (root && (root.parent !== undefined || root.join !== undefined)) {\n throw new Error(\n `group.0 can only define \"op\". \"parent\" and \"join\" are not allowed on root group \"0\".`,\n );\n }\n\n for (const [id, def] of Object.entries(defs)) {\n if (id === ROOT_GROUP_ID) continue;\n if (def.parent !== undefined) IntegerStringSchema.parse(def.parent);\n }\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const visit = (id: string): void => {\n if (visited.has(id)) return;\n if (visiting.has(id)) throw new Error(`Group cycle detected at group \"${id}\".`);\n visiting.add(id);\n\n const parent = defs[id]?.parent;\n if (parent && parent !== ROOT_GROUP_ID) visit(parent);\n\n visiting.delete(id);\n visited.add(id);\n };\n\n for (const id of Object.keys(defs)) {\n if (id === ROOT_GROUP_ID) continue;\n visit(id);\n }\n}\n\nfunction buildGroupConditionExprs(rawFilters: Record<string, Condition[]>): Map<string, WhereNode> {\n const groupNodes = new Map<string, WhereFilter[]>();\n\n for (const [field, conditions] of Object.entries(rawFilters)) {\n for (const cond of conditions) {\n const groupId = cond.group;\n const list = groupNodes.get(groupId) ?? [];\n const isFirst = list.length === 0;\n\n if (isFirst && cond.combinator !== undefined) {\n throw new Error(\n `Invalid combinator \"${cond.combinator}\" on first condition of group \"${groupId}\". ` +\n `First condition in a group cannot define \"$and\" or \"$or\".`,\n );\n }\n\n list.push({ type: 'filter', field, condition: cond });\n groupNodes.set(groupId, list);\n }\n }\n\n const exprs = new Map<string, WhereNode>();\n for (const [groupId, nodes] of groupNodes.entries()) {\n if (nodes.length === 0) continue;\n if (!nodes[0]) continue;\n\n let current: WhereNode = nodes[0];\n for (let i = 1; i < nodes.length; i += 1) {\n const next = nodes[i];\n if (!next) break;\n current = fold(next.condition.combinator, current, next);\n }\n exprs.set(groupId, current);\n }\n\n return exprs;\n}\n\nfunction buildWhereAstWithGroups(\n rawFilters: Record<string, Condition[]>,\n groupDefs: GroupDefs,\n): WhereNode {\n const groupExprs = buildGroupConditionExprs(rawFilters);\n\n const allGroupIds = new Set<string>();\n for (const id of groupExprs.keys()) allGroupIds.add(id);\n for (const id of Object.keys(groupDefs)) allGroupIds.add(id);\n allGroupIds.add(ROOT_GROUP_ID);\n\n const effectiveParent = (id: string): string => {\n if (id === ROOT_GROUP_ID) return ROOT_GROUP_ID;\n return groupDefs[id]?.parent ?? ROOT_GROUP_ID;\n };\n\n const childrenByParent = new Map<string, string[]>();\n for (const id of allGroupIds) {\n if (id === ROOT_GROUP_ID) continue;\n const parentId = effectiveParent(id);\n const arr = childrenByParent.get(parentId) ?? [];\n arr.push(id);\n childrenByParent.set(parentId, arr);\n }\n\n const sortNumericIds = (ids: string[]): string[] => {\n const pairs = ids.map((s) => ({ s, n: Number(s) }));\n pairs.sort((a, b) => a.n - b.n);\n return pairs.map((p) => p.s);\n };\n\n const visiting = new Set<string>();\n const resolved = new Map<string, WhereNode>();\n\n const resolveGroup = (id: string): WhereNode => {\n const cached = resolved.get(id);\n if (cached) return cached;\n\n if (visiting.has(id)) throw new Error(`Group cycle detected while resolving group \"${id}\".`);\n visiting.add(id);\n\n const items: { expr: WhereNode; join?: Combinator }[] = [];\n\n const own = groupExprs.get(id);\n if (own) items.push({ expr: own });\n\n const children = sortNumericIds(childrenByParent.get(id) ?? []);\n const parentOp = groupDefs[id]?.op;\n\n for (const childId of children) {\n const childExpr = resolveGroup(childId);\n const childJoin = groupDefs[childId]?.join;\n items.push({ expr: childExpr, join: childJoin ?? parentOp });\n }\n\n if (items.length === 0 || !items[0]) {\n const empty: WhereNode = { type: 'and', items: [] };\n resolved.set(id, empty);\n visiting.delete(id);\n return empty;\n }\n\n if (items[0].join !== undefined) {\n throw new Error(\n `Invalid group join \"${items[0].join}\" for the first item inside group \"${id}\". ` +\n `A group cannot start with \"$and\" or \"$or\" because there is nothing to join with.`,\n );\n }\n\n let current = items[0].expr;\n for (let i = 1; i < items.length; i += 1) {\n const next = items[i];\n if (!next) break;\n current = fold(next.join, current, next.expr);\n }\n\n resolved.set(id, current);\n visiting.delete(id);\n return current;\n };\n\n validateGroupDefs(groupDefs);\n return resolveGroup(ROOT_GROUP_ID);\n}\n\n/* ---------------------------------- */\n/* DSL parsing */\n/* ---------------------------------- */\n\n/** Parse a string as either a finite number or an ISO date string. */\nfunction parseNumOrDateStrict(raw: string, ctx: string): number | string {\n const s = raw.trim();\n\n if (/^[+-]?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (!Number.isFinite(n)) throw new Error(`Invalid number for ${ctx}: \"${raw}\"`);\n return n;\n }\n\n if (ISO_DATE_RE.test(s) || ISO_DATETIME_RE.test(s)) {\n const t = Date.parse(s);\n if (Number.isNaN(t)) throw new Error(`Invalid ISO date for ${ctx}: \"${raw}\"`);\n return s;\n }\n\n throw new Error(`Expected number or ISO date for ${ctx}, got \"${raw}\"`);\n}\n\n/** Ensure $btw bounds are both numbers or both dates. */\nfunction assertSameKind(a: number | string, b: number | string, ctx: string): void {\n const ka = typeof a === 'number' ? 'number' : 'date';\n const kb = typeof b === 'number' ? 'number' : 'date';\n if (ka !== kb) {\n throw new Error(`$btw bounds must be same type (both number or both date) for ${ctx}`);\n }\n}\n\n/** Parse a single \"filter.<field>\" DSL string into a Condition. */\nfunction parseSingleCondition(raw: string): Condition {\n const parts = raw.split(':');\n\n let group = ROOT_GROUP_ID;\n let cursor = parts;\n\n if (cursor[0] === '$g') {\n group = IntegerStringSchema.parse((cursor[1] ?? '').trim());\n cursor = cursor.slice(2);\n if (cursor.length === 0) {\n throw new Error(`Invalid group prefix in \"${raw}\" (missing condition after \"$g:<id>\")`);\n }\n }\n\n let combinator: Combinator | undefined;\n if (cursor[0] === '$and' || cursor[0] === '$or') {\n combinator = CombinatorSchema.parse(cursor[0]);\n cursor = cursor.slice(1);\n if (cursor.length === 0) {\n throw new Error(`Invalid combinator in \"${raw}\" (missing condition after \"${combinator}\")`);\n }\n }\n\n const hasNot = cursor[0] === '$not';\n if (hasNot && !cursor[1]) {\n throw new Error(`Invalid \"$not\" usage in \"${raw}\" (missing operator after \"$not\")`);\n }\n\n const head = hasNot ? cursor[1] : cursor[0];\n const rest = hasNot ? cursor.slice(2).join(':') : cursor.slice(1).join(':');\n const not = hasNot ? true : undefined;\n\n if (!head?.startsWith('$')) {\n return ConditionSchema.parse({\n group,\n combinator,\n op: '$eq',\n value: cursor.join(':'),\n });\n }\n\n const op = OperatorSchema.parse(head);\n\n if (op === '$null') return ConditionSchema.parse({ group, combinator, op: '$null', not });\n\n if (op === '$eq') {\n let value: number | string;\n try {\n value = parseNumOrDateStrict(rest, '$eq');\n } catch {\n value = rest;\n }\n return ConditionSchema.parse({ group, combinator, op: '$eq', not, value });\n }\n\n if (op === '$btw') {\n const [aRaw, bRaw] = rest.split(',');\n if (!aRaw || !bRaw) throw new Error(`Invalid $btw \"${raw}\" (expected \"$btw:a,b\")`);\n const a = parseNumOrDateStrict(aRaw, '$btw');\n const b = parseNumOrDateStrict(bRaw, '$btw');\n assertSameKind(a, b, '$btw');\n return ConditionSchema.parse({ group, combinator, op: '$btw', not, value: [a, b] });\n }\n\n if (op === '$in' || op === '$contains') {\n const arr = rest\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n return ConditionSchema.parse({ group, combinator, op, not, value: arr });\n }\n\n if (op === '$gt' || op === '$gte' || op === '$lt' || op === '$lte') {\n const v = parseNumOrDateStrict(rest, op);\n return ConditionSchema.parse({ group, combinator, op, not, value: v });\n }\n\n // $ilike | $sw\n return ConditionSchema.parse({ group, combinator, op, not, value: rest });\n}\n\n/* ---------------------------------- */\n/* Extract raw filters */\n/* ---------------------------------- */\n\nfunction extractAndNormalizeRawFilters(q: QueryStringRecord): Record<string, Condition[]> {\n const result: Record<string, Condition[]> = {};\n\n for (const [k, v] of Object.entries(q)) {\n if (!k.startsWith('filter.')) continue;\n\n const field = k.slice('filter.'.length).trim();\n if (!field) continue;\n\n const rawList = toStringArrayFromQueryString(v);\n result[field] = rawList.filter(Boolean).map(parseSingleCondition);\n }\n\n return result;\n}\n\nfunction toQueryStringRecord(q: Record<string, unknown>): QueryStringRecord {\n const out: QueryStringRecord = {};\n for (const [k, v] of Object.entries(q)) {\n if (typeof v === 'string') {\n out[k] = v;\n continue;\n }\n if (Array.isArray(v) && v.every((x) => typeof x === 'string')) {\n out[k] = v;\n continue;\n }\n out[k] = undefined;\n }\n return out;\n}\n\n/* ---------------------------------- */\n/* Config based on dataSchema */\n/* ---------------------------------- */\n\nexport type DataSchema = z.ZodObject<z.ZodRawShape>;\nexport type InferData<TSchema extends DataSchema> = z.infer<TSchema>;\nexport type AllowedPath<TSchema extends DataSchema> = Path<InferData<TSchema>>;\n\ninterface FilterableFieldConfig<TKind extends FieldType> {\n type: TKind;\n ops: readonly OpsForFieldType<TKind>[];\n}\n\nexport interface CommonQueryConfigFromSchema<TSchema extends DataSchema> {\n dataSchema: TSchema;\n\n selectable?: readonly AllowedPath<TSchema>[];\n sortable?: readonly AllowedPath<TSchema>[];\n\n filterable?: Partial<{\n [P in AllowedPath<TSchema>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n\n defaultSortBy?: readonly { property: AllowedPath<TSchema>; direction: SortDirection }[];\n defaultLimit?: number;\n\n defaultSelect?: readonly (AllowedPath<TSchema> | '*')[];\n maxLimit?: number;\n}\n\nexport type QueryConfigFromSchema<TSchema extends DataSchema> =\n CommonQueryConfigFromSchema<TSchema> &\n (LimitOffsetPaginationConfig | CursorPaginationConfig<InferData<TSchema>>);\n\n/* ---------------------------------- */\n/* Runtime filterable map */\n/* ---------------------------------- */\n\ninterface FilterableRuntimeFieldConfig {\n type: FieldType;\n ops: readonly Operator[];\n}\n\nfunction toFilterableRuntime(\n filterable: Partial<Record<string, { type: FieldType; ops: readonly Operator[] }>> | undefined,\n): Record<string, FilterableRuntimeFieldConfig> {\n const out: Record<string, FilterableRuntimeFieldConfig> = {};\n if (!filterable) return out;\n\n for (const [k, v] of Object.entries(filterable)) {\n if (!v) continue;\n out[k] = { type: v.type, ops: [...v.ops] };\n }\n\n return out;\n}\n\n/* ---------------------------------- */\n/* Defaults helpers (typed, no \"as\") */\n/* ---------------------------------- */\n\n/**\n * Find a typed AllowedPath value from a string, by matching against a typed allowlist.\n * This avoids `as`: we return the existing typed value.\n */\nfunction pickFromAllowlist<TSchema extends DataSchema>(\n allowlist: readonly AllowedPath<TSchema>[] | undefined,\n value: string,\n): AllowedPath<TSchema> | undefined {\n if (!allowlist) return undefined;\n for (const item of allowlist) {\n if (`${item}` === value) return item;\n }\n return undefined;\n}\n\n/** Expand \"*\" to selectable; otherwise return the same list. */\nfunction expandSelect<TSchema extends DataSchema>(\n select: readonly string[] | undefined,\n config: QueryConfigFromSchema<TSchema>,\n): readonly AllowedPath<TSchema>[] | undefined {\n if (!select) return undefined;\n\n if (!select.includes('*')) {\n if (!config.selectable || config.selectable.length === 0) return undefined;\n\n const out: AllowedPath<TSchema>[] = [];\n for (const field of select) {\n const picked = pickFromAllowlist(config.selectable, field);\n if (picked) out.push(picked);\n }\n return out;\n }\n\n if (config.selectable && config.selectable.length > 0) return [...config.selectable];\n return undefined;\n}\n\nfunction computeLimit<TSchema extends DataSchema>(\n limit: number | undefined,\n config: QueryConfigFromSchema<TSchema>,\n): number | undefined {\n if (typeof limit === 'number') return limit;\n if (typeof config.defaultLimit === 'number') return config.defaultLimit;\n return undefined;\n}\n\nfunction computeSelect<TSchema extends DataSchema>(\n select: string[] | undefined,\n config: QueryConfigFromSchema<TSchema>,\n): AllowedPath<TSchema>[] | undefined {\n if (select) {\n const expanded = expandSelect(select, config);\n if (!expanded) return undefined;\n return [...expanded];\n }\n\n if (config.defaultSelect) {\n const expanded = expandSelect(\n config.defaultSelect.map((x) => `${x}`),\n config,\n );\n if (!expanded) return undefined;\n return [...expanded];\n }\n\n return undefined;\n}\n\n/* ---------------------------------- */\n/* Runtime value/type validation */\n/* ---------------------------------- */\n\nfunction isISODateString(v: unknown): boolean {\n if (typeof v !== 'string') return false;\n if (!(ISO_DATE_RE.test(v) || ISO_DATETIME_RE.test(v))) return false;\n return !Number.isNaN(Date.parse(v));\n}\n\nfunction isFiniteNumber(v: unknown): boolean {\n return typeof v === 'number' && Number.isFinite(v);\n}\n\nfunction validateConditionType(expected: FieldType, cond: Condition, field: string): string | null {\n if (expected === 'any') return null;\n if (cond.op === '$null') return null;\n\n if (cond.op === '$eq') {\n if (expected === 'number' && !isFiniteNumber(cond.value))\n return `Field \"${field}\" expects a number for \"$eq\"`;\n if (expected === 'date' && !isISODateString(cond.value))\n return `Field \"${field}\" expects an ISO date for \"$eq\"`;\n if (expected === 'string' && typeof cond.value !== 'string')\n return `Field \"${field}\" expects a string for \"$eq\"`;\n return null;\n }\n\n if (cond.op === '$ilike' || cond.op === '$sw') {\n if (expected !== 'string')\n return `Field \"${field}\" does not support \"${cond.op}\" (configured as ${expected})`;\n return null;\n }\n\n if (cond.op === '$in' || cond.op === '$contains') return null;\n\n if (cond.op === '$gt' || cond.op === '$gte' || cond.op === '$lt' || cond.op === '$lte') {\n if (expected === 'string')\n return `Field \"${field}\" does not support \"${cond.op}\" (configured as string)`;\n if (expected === 'number' && !isFiniteNumber(cond.value))\n return `Field \"${field}\" expects number for \"${cond.op}\"`;\n if (expected === 'date' && !isISODateString(cond.value))\n return `Field \"${field}\" expects ISO date for \"${cond.op}\"`;\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (cond.op === '$btw') {\n const [a, b] = cond.value;\n if (expected === 'string')\n return `Field \"${field}\" does not support \"$btw\" (configured as string)`;\n if (expected === 'number' && (!isFiniteNumber(a) || !isFiniteNumber(b)))\n return `Field \"${field}\" expects numbers for \"$btw\"`;\n if (expected === 'date' && (!isISODateString(a) || !isISODateString(b)))\n return `Field \"${field}\" expects ISO dates for \"$btw\"`;\n return null;\n }\n\n return null;\n}\n\n/* ---------------------------------- */\n/* Sort defaults (typed, no \"as\") */\n/* ---------------------------------- */\n\nexport interface SortItemTyped<TSchema extends DataSchema> {\n property: AllowedPath<TSchema>;\n direction: SortDirection;\n}\n\nfunction computeSortBy<TSchema extends DataSchema>(\n sortByRaw: string[] | undefined,\n config: QueryConfigFromSchema<TSchema>,\n): SortItemTyped<TSchema>[] | undefined {\n if (sortByRaw) {\n const cleaned = sortByRaw.map((s) => s.trim()).filter(Boolean);\n if (cleaned.length > 0) {\n const out: SortItemTyped<TSchema>[] = [];\n for (const raw of cleaned) {\n const parsed = parseSortItem(raw);\n\n const picked = pickFromAllowlist(config.sortable, parsed.property);\n if (!picked) continue;\n\n out.push({ property: picked, direction: parsed.direction });\n }\n return out.length > 0 ? out : undefined;\n }\n }\n\n if (config.defaultSortBy && config.defaultSortBy.length > 0) {\n return config.defaultSortBy.map((x) => ({ property: x.property, direction: x.direction }));\n }\n\n return undefined;\n}\n\n/* ---------------------------------- */\n/* QueryParams output (generic) */\n/* ---------------------------------- */\n\nexport interface LimitOffsetPaginationPayload<TSchema extends DataSchema> {\n type: 'LIMIT_OFFSET';\n limit?: number;\n page?: number;\n sortBy?: SortItemTyped<TSchema>[];\n select?: AllowedPath<TSchema>[];\n filters?: WhereNode;\n}\n\n/**\n * Cursor is always a string in the query input, BUT we coerce it at parse-time\n * to match the type of cursorProperty (number / string / ISO date string).\n */\nexport interface CursorPaginationPayload<TSchema extends DataSchema> {\n type: 'CURSOR';\n limit?: number;\n cursor?: number | string;\n cursorProperty: AllowedPath<TSchema>;\n sortBy?: SortItemTyped<TSchema>[];\n select?: AllowedPath<TSchema>[];\n filters?: WhereNode;\n}\n\nexport interface PaginationQueryParams<TSchema extends DataSchema> {\n pagination: LimitOffsetPaginationPayload<TSchema> | CursorPaginationPayload<TSchema>;\n}\n\n/* ---------------------------------- */\n/* Projection helpers (NO \"as\") */\n/* ---------------------------------- */\n\ntype MutableShape = Record<string, z.ZodType>;\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction getOwnProp(obj: Record<string, unknown>, key: string): unknown {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) return undefined;\n return obj[key];\n}\n\n/** Duck-typed Zod schema check. */\nfunction isZodSchema(v: unknown): v is z.ZodType {\n if (!isPlainObject(v)) return false;\n const parseFn = getOwnProp(v, 'parse');\n return typeof parseFn === 'function';\n}\n\n/** Duck-typed ZodObject check. */\nfunction isZodObjectSchema(v: unknown): v is z.ZodObject<z.ZodRawShape> {\n if (!isPlainObject(v)) return false;\n const parseFn = getOwnProp(v, 'parse');\n if (typeof parseFn !== 'function') return false;\n const shape = getOwnProp(v, 'shape');\n return isPlainObject(shape);\n}\n\nfunction getObjectShape(obj: z.ZodObject<z.ZodRawShape>): Readonly<Record<string, unknown>> {\n return obj.shape;\n}\n\nfunction getZodAtPath(obj: z.ZodObject<z.ZodRawShape>, path: string): z.ZodType {\n const parts = path.split('.').filter(Boolean);\n\n let current: unknown = obj;\n\n for (const p of parts) {\n if (!isZodObjectSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not inside a ZodObject`);\n }\n\n const shape = getObjectShape(current);\n const next = shape[p];\n\n if (!next) throw new Error(`dataSchema path \"${path}\" is invalid: missing key \"${p}\"`);\n if (!isZodSchema(next)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not a Zod schema`);\n }\n\n current = next;\n }\n\n if (!isZodSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: resolved value is not a Zod schema`);\n }\n\n return current;\n}\n\nfunction projectDataSchema(\n dataSchema: z.ZodObject<z.ZodRawShape>,\n selectedPaths: string[],\n): z.ZodObject<z.ZodRawShape> {\n const tree: Record<string, unknown> = {};\n\n const ensureTreeNode = (node: Record<string, unknown>, key: string): Record<string, unknown> => {\n const existing = node[key];\n\n if (existing === undefined) {\n const child: Record<string, unknown> = {};\n node[key] = child;\n return child;\n }\n\n if (isPlainObject(existing)) return existing;\n\n if (isZodSchema(existing)) {\n throw new Error(`Cannot project \"${key}\": \"${key}\" is selected as a leaf and as an object`);\n }\n\n throw new Error(`Cannot project \"${key}\": conflicting selection`);\n };\n\n for (const fullPath of selectedPaths) {\n const parts = fullPath.split('.').filter(Boolean);\n if (parts.length === 0) continue;\n\n let cursor = tree;\n\n for (let i = 0; i < parts.length; i += 1) {\n const key = parts[i];\n if (!key) continue;\n\n const isLeaf = i === parts.length - 1;\n\n if (isLeaf) {\n cursor[key] = getZodAtPath(dataSchema, fullPath);\n } else {\n cursor = ensureTreeNode(cursor, key);\n }\n }\n }\n\n const buildObjectFromTree = (node: Record<string, unknown>): z.ZodObject<z.ZodRawShape> => {\n const shape: MutableShape = {};\n\n for (const [k, v] of Object.entries(node)) {\n if (isZodSchema(v)) {\n shape[k] = v;\n continue;\n }\n if (isPlainObject(v)) {\n shape[k] = buildObjectFromTree(v);\n continue;\n }\n throw new Error(`Invalid projection tree at \"${k}\"`);\n }\n\n return z.object(shape);\n };\n\n return buildObjectFromTree(tree);\n}\n\nfunction callMethodIfReturnsZod(obj: unknown, methodName: string): z.ZodType | undefined {\n if (!isPlainObject(obj)) return undefined;\n\n const maybeFn = getOwnProp(obj, methodName);\n if (typeof maybeFn !== 'function') return undefined;\n\n const result = maybeFn.call(obj);\n if (isZodSchema(result)) return result;\n\n return undefined;\n}\n\nfunction getInnerSchemaFromDef(obj: unknown): z.ZodType | undefined {\n if (!isPlainObject(obj)) return undefined;\n\n const def = getOwnProp(obj, 'def') ?? getOwnProp(obj, '_def');\n if (!isPlainObject(def)) return undefined;\n\n const candidates = ['innerType', 'schema', 'type', 'in', 'out'];\n\n for (const key of candidates) {\n const v = getOwnProp(def, key);\n if (isZodSchema(v)) return v;\n }\n\n return undefined;\n}\n\nfunction unwrapSchema(schema: z.ZodType): z.ZodType {\n let current: unknown = schema;\n\n for (let i = 0; i < 30; i += 1) {\n const unwrapped = callMethodIfReturnsZod(current, 'unwrap');\n if (unwrapped) {\n current = unwrapped;\n continue;\n }\n\n const removedDefault = callMethodIfReturnsZod(current, 'removeDefault');\n if (removedDefault) {\n current = removedDefault;\n continue;\n }\n\n const innerType = callMethodIfReturnsZod(current, 'innerType');\n if (innerType) {\n current = innerType;\n continue;\n }\n\n const sourceType = callMethodIfReturnsZod(current, 'sourceType');\n if (sourceType) {\n current = sourceType;\n continue;\n }\n\n const innerFromDef = getInnerSchemaFromDef(current);\n if (innerFromDef) {\n current = innerFromDef;\n continue;\n }\n\n break;\n }\n\n if (isZodSchema(current)) return current;\n return schema;\n}\n\n/**\n * Robust constructor name getter that works with Zod objects (constructor is on the prototype).\n * No `as`, no unsafe casts.\n */\nfunction getConstructorName(v: unknown): string | undefined {\n if (typeof v !== 'object' || v === null) return undefined;\n\n const proto: unknown = Object.getPrototypeOf(v);\n if (typeof proto !== 'object' || proto === null) return undefined;\n\n const ctorUnknown: unknown = Reflect.get(proto, 'constructor');\n if (!(ctorUnknown instanceof Function)) return undefined;\n\n return ctorUnknown.name;\n}\n\n/* ---------------------------------- */\n/* Cursor: schema inference + coercion */\n/* ---------------------------------- */\n\n/**\n * Return the expected cursor schema for API responses:\n * - number field => cursor: number\n * - string field => cursor: string\n * - date field => cursor: ISO string OR Date (optional support)\n */\nfunction cursorSchemaFromProperty<TSchema extends DataSchema>(\n dataSchema: TSchema,\n cursorProperty: AllowedPath<TSchema>,\n): z.ZodType {\n const raw = getZodAtPath(dataSchema, `${cursorProperty}`);\n const s = unwrapSchema(raw);\n const ctorName = getConstructorName(s);\n\n if (ctorName === 'ZodNumber') return z.number();\n if (ctorName === 'ZodString') return z.string();\n if (ctorName === 'ZodDate') return z.union([z.string().refine(isISODateString), z.date()]);\n\n // Unsupported cursor field type\n return z.never();\n}\n\n/**\n * Coerce the query input cursor (always string) into the right type based on cursorProperty.\n * - number field => \"123\" -> 123\n * - string field => \"abc\" -> \"abc\"\n * - date field => \"2022-01-01\" -> \"2022-01-01\" (validated as ISO)\n */\nfunction coerceCursorFromProperty<TSchema extends DataSchema>(\n dataSchema: TSchema,\n cursorProperty: AllowedPath<TSchema>,\n rawCursor: string,\n): number | string {\n const schemaAtPath = unwrapSchema(getZodAtPath(dataSchema, `${cursorProperty}`));\n const ctorName = getConstructorName(schemaAtPath);\n\n if (ctorName === 'ZodNumber') {\n const s = rawCursor.trim();\n if (!/^[+-]?\\d+$/.test(s)) throw new Error(`cursor must be an integer string`);\n const n = Number(s);\n if (!Number.isFinite(n)) throw new Error(`cursor must be a finite number`);\n return n;\n }\n\n if (ctorName === 'ZodString') {\n return rawCursor;\n }\n\n if (ctorName === 'ZodDate') {\n const s = rawCursor.trim();\n if (!isISODateString(s)) throw new Error(`cursor must be an ISO date string`);\n return s;\n }\n\n throw new Error(`cursorProperty \"${cursorProperty}\" must be a string|number|date`);\n}\n\n/* ---------------------------------- */\n/* Factory */\n/* ---------------------------------- */\n\n/**\n * Generate Zod schemas and runtime validators for pagination query parameters, based on a config object.\n * @param config The configuration object defining the pagination behavior and allowed fields.\n * @returns An object containing:\n * - `queryParamsSchema`: A Zod schema for validating and parsing the raw query parameters.\n * - `validatorSchema`: A function that takes the already-parsed query parameters and returns a Zod schema for further validation (e.g. filters).\n */\nexport function paginate<TSchema extends DataSchema>(\n config: QueryConfigFromSchema<TSchema>,\n): {\n queryParamsSchema: z.ZodType<PaginationQueryParams<TSchema>>;\n validatorSchema: (parsed?: PaginationQueryParams<TSchema>) => z.ZodType;\n} {\n const allowedSelectable = new Set<string>();\n for (const f of config.selectable ?? []) allowedSelectable.add(`${f}`);\n\n const allowedSortable = new Set<string>();\n for (const f of config.sortable ?? []) allowedSortable.add(`${f}`);\n\n const filterable = toFilterableRuntime(config.filterable);\n\n const baseSchema = z.object({\n limit: NumericStringSchema.optional(),\n page: NumericStringSchema.optional(),\n\n /**\n * Query input is always a string if present.\n * We will coerce it later in the final transform (CURSOR mode only).\n */\n cursor: z.string().min(1).optional(),\n\n sortBy: StringOrStringArraySchema.optional(),\n select: SelectCsvSchema.optional(),\n\n rawFilters: z.record(z.string(), z.array(ConditionSchema)),\n groupDefs: z.record(\n z.string(),\n z.object({\n parent: IntegerStringSchema.optional(),\n join: CombinatorSchema.optional(),\n op: CombinatorSchema.optional(),\n }),\n ),\n });\n\n const queryParamsSchema: z.ZodType<PaginationQueryParams<TSchema>> = z\n .record(z.string(), z.unknown())\n .transform(\n (\n q,\n ): Record<string, unknown> & {\n rawFilters: Record<string, Condition[]>;\n groupDefs: GroupDefs;\n } => {\n const qs = toQueryStringRecord(q);\n\n return {\n ...q,\n rawFilters: extractAndNormalizeRawFilters(qs),\n groupDefs: extractGroupDefs(q),\n };\n },\n )\n .pipe(\n baseSchema\n .superRefine((val, ctx): void => {\n // Pagination mode constraints\n if (config.paginationType === 'LIMIT_OFFSET') {\n if (val.cursor !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['cursor'],\n message: `cursor is not allowed when paginationType is LIMIT_OFFSET`,\n });\n }\n }\n\n if (config.paginationType === 'CURSOR') {\n if (val.page !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['page'],\n message: `page is not allowed when paginationType is CURSOR`,\n });\n }\n\n if (`${config.cursorProperty}`.trim().length === 0) {\n ctx.addIssue({\n code: 'custom',\n path: [],\n message: `cursorProperty must be a non-empty string when paginationType is CURSOR`,\n });\n }\n\n // Validate that cursor (if provided) can be coerced for that cursorProperty\n if (val.cursor !== undefined) {\n try {\n void coerceCursorFromProperty(config.dataSchema, config.cursorProperty, val.cursor);\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Invalid cursor';\n ctx.addIssue({\n code: 'custom',\n path: ['cursor'],\n message,\n });\n }\n }\n }\n\n // limit / maxLimit\n if (\n typeof val.limit === 'number' &&\n typeof config.maxLimit === 'number' &&\n val.limit > config.maxLimit\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['limit'],\n message: `limit must be <= ${config.maxLimit}`,\n });\n }\n\n // select forbidden if no selectable configured\n if (val.select && (!config.selectable || config.selectable.length === 0)) {\n ctx.addIssue({\n code: 'custom',\n path: ['select'],\n message: `select is not allowed (no selectable fields configured)`,\n });\n }\n\n // select allowlist + \"*\" expandability\n const selectForValidation =\n val.select ??\n (config.defaultSelect ? config.defaultSelect.map((x) => `${x}`) : undefined);\n\n if (selectForValidation) {\n let index = 0;\n\n for (const field of selectForValidation) {\n if (field === '*') {\n index += 1;\n continue;\n }\n\n if (allowedSelectable.size > 0 && !allowedSelectable.has(field)) {\n ctx.addIssue({\n code: 'custom',\n path: ['select', index],\n message: `select field \"${field}\" is not allowed`,\n });\n }\n\n index += 1;\n }\n\n if (selectForValidation.includes('*')) {\n const expanded = expandSelect(selectForValidation, config);\n if (!expanded || expanded.length === 0) {\n ctx.addIssue({\n code: 'custom',\n path: ['select'],\n message: `select \"*\" cannot be expanded (missing selectable in config)`,\n });\n }\n }\n }\n\n // sort allowlist\n const sortItems = computeSortBy(val.sortBy, config);\n if (val.sortBy) {\n if (!config.sortable || config.sortable.length === 0) {\n ctx.addIssue({\n code: 'custom',\n path: ['sortBy'],\n message: `sortBy is not allowed (no sortable fields configured)`,\n });\n } else if (sortItems) {\n let index = 0;\n for (const item of sortItems) {\n if (!allowedSortable.has(`${item.property}`)) {\n ctx.addIssue({\n code: 'custom',\n path: ['sortBy', index],\n message: `sort property \"${item.property}\" is not allowed`,\n });\n }\n index += 1;\n }\n }\n }\n\n // filter allowlist + operator/type validation\n for (const [field, conditions] of Object.entries(val.rawFilters)) {\n const cfg = filterable[field];\n\n if (!cfg) {\n ctx.addIssue({\n code: 'custom',\n path: ['rawFilters', field],\n message: `filter field \"${field}\" is not allowed`,\n });\n continue;\n }\n\n const allowedOps = new Set(cfg.ops);\n\n let index = 0;\n for (const cond of conditions) {\n if (!allowedOps.has(cond.op)) {\n ctx.addIssue({\n code: 'custom',\n path: ['rawFilters', field, index, 'op'],\n message: `operator \"${cond.op}\" is not allowed for \"${field}\"`,\n });\n }\n\n const typeError = validateConditionType(cfg.type, cond, field);\n if (typeError) {\n ctx.addIssue({\n code: 'custom',\n path: ['rawFilters', field, index],\n message: typeError,\n });\n }\n\n index += 1;\n }\n }\n\n // group consistency\n const hasAnyFilter = Object.keys(val.rawFilters).length > 0;\n const hasAnyGroupDef = Object.keys(val.groupDefs).length > 0;\n\n if (hasAnyGroupDef && !hasAnyFilter) {\n ctx.addIssue({\n code: 'custom',\n path: ['groupDefs'],\n message: `group.* is not allowed without any filter.*`,\n });\n } else if (hasAnyFilter) {\n try {\n void buildWhereAstWithGroups(val.rawFilters, val.groupDefs);\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Invalid group configuration';\n ctx.addIssue({\n code: 'custom',\n path: ['groupDefs'],\n message,\n });\n }\n }\n })\n .transform((val): PaginationQueryParams<TSchema> => {\n const limit = computeLimit(val.limit, config);\n const sortBy = computeSortBy(val.sortBy, config);\n const select = computeSelect(val.select, config);\n\n const hasAnyFilter = Object.keys(val.rawFilters).length > 0;\n\n const maybeFilters = hasAnyFilter\n ? { filters: buildWhereAstWithGroups(val.rawFilters, val.groupDefs) }\n : {};\n\n if (config.paginationType === 'LIMIT_OFFSET') {\n return {\n pagination: {\n type: 'LIMIT_OFFSET',\n limit,\n page: val.page,\n sortBy,\n select,\n ...maybeFilters,\n },\n };\n }\n\n // CURSOR: coerce string cursor into number/string based on cursorProperty\n let cursor: number | string | undefined = undefined;\n if (val.cursor !== undefined) {\n cursor = coerceCursorFromProperty(config.dataSchema, config.cursorProperty, val.cursor);\n }\n\n return {\n pagination: {\n type: 'CURSOR',\n limit,\n cursor,\n cursorProperty: config.cursorProperty,\n sortBy,\n select,\n ...maybeFilters,\n },\n };\n }),\n );\n\n const validatorSchema = (parsed?: PaginationQueryParams<TSchema>): z.ZodType => {\n const effectiveSelect =\n parsed?.pagination.select ?? computeSelect(undefined, config) ?? undefined;\n\n const dataItemSchema =\n effectiveSelect && effectiveSelect.length > 0\n ? projectDataSchema(\n config.dataSchema,\n effectiveSelect.map((x) => `${x}`),\n )\n : config.dataSchema;\n\n const dataArraySchema = z.array(dataItemSchema);\n\n if (config.paginationType === 'LIMIT_OFFSET') {\n return z.object({\n data: dataArraySchema,\n pagination: z.object({\n itemsPerPage: z.number(),\n totalItems: z.number(),\n currentPage: z.number(),\n totalPages: z.number(),\n sortBy: z\n .array(\n z.object({\n property: z.string(),\n direction: SortDirectionSchema,\n }),\n )\n .optional(),\n filter: WhereNodeSchema.optional(),\n }),\n });\n }\n\n const cursorType = cursorSchemaFromProperty(config.dataSchema, config.cursorProperty);\n\n return z.object({\n data: dataArraySchema,\n pagination: z.object({\n itemsPerPage: z.number(),\n cursor: cursorType,\n sortBy: z\n .array(\n z.object({\n property: z.string(),\n direction: SortDirectionSchema,\n }),\n )\n .optional(),\n filter: WhereNodeSchema.optional(),\n }),\n });\n };\n\n return { queryParamsSchema, validatorSchema };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\n\n/* ---------------------------------- */\n/* Querystring value types */\n/* ---------------------------------- */\n\ntype QueryStringValue = string | string[] | undefined;\ntype QueryStringRecord = Record<string, QueryStringValue>;\n\n/* ---------------------------------- */\n/* Typed field paths (dot notation) */\n/* ---------------------------------- */\n\n/**\n * Primitive types that we consider as leaves in the Path type. Arrays are also considered leaves, since we don't want to generate paths like \"arrayField.0.someProp\".\n */\ntype Primitive = string | number | boolean | bigint | symbol | null | undefined | Date;\n\n/**\n * Join two path segments K and P with a dot, if both are strings. Otherwise, return never.\n */\ntype Join<K, P> = K extends string ? (P extends string ? `${K}.${P}` : never) : never;\n\n/**\n * Generate dot notation paths for a given type T, up to a certain depth D (default 5).\n * For example, for { a: { b: string }, c: number }, we would generate \"a\", \"a.b\", and \"c\". We stop recursion at depth 0 to prevent infinite types.\n */\ntype Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n\n/**\n * Generate dot notation paths for a given type T. For example, for { a: { b: string }, c: number }, we would generate \"a\", \"a.b\", and \"c\".\n */\ntype Path<T, D extends number = 5> = D extends 0\n ? never\n : T extends Primitive\n ? never\n : T extends readonly unknown[]\n ? never\n : {\n [K in Extract<keyof T, string>]: T[K] extends Primitive | readonly unknown[]\n ? K\n : K | Join<K, Path<T[K], Prev[D]>>;\n }[Extract<keyof T, string>];\n\n/**\n * Given a type T and a dot notation path P, resolve the type at that path.\n * For example, for T = { a: { b: string }, c: number } and P = \"a.b\", we would get string.\n */\ntype PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? PathValue<T[K], Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never;\n\n/* ---------------------------------- */\n/* Pagination config */\n/* ---------------------------------- */\n\ninterface LimitOffsetPaginationConfig {\n paginationType: 'LIMIT_OFFSET';\n}\n\ninterface CursorPaginationConfig<T> {\n paginationType: 'CURSOR';\n cursorProperty: Path<T>;\n}\n\n/* ---------------------------------- */\n/* Common input normalizers */\n/* ---------------------------------- */\n\n/**\n * We often want to allow both single values and arrays in the querystring, e.g. \"select=field1,field2\" or \"select[]=field1&select[]=field2\".\n * This function normalizes both cases to a string array.\n */\nfunction toStringArrayFromQueryString(v: QueryStringValue): string[] {\n if (v === undefined) return [];\n if (Array.isArray(v)) return v;\n return [v];\n}\n\n/**\n * Zod schema for a querystring parameter that can be either a single string or an array of strings.\n * It normalizes the output to always be an array of strings.\n */\nconst StringOrStringArraySchema = z\n .union([z.string(), z.array(z.string())])\n .transform((v) => (typeof v === 'string' ? [v] : v));\n\n/**\n * Zod schema for the \"select\" parameter, which can be a comma-separated string or an array of strings.\n * It normalizes the output to an array of strings.\n */\nconst SelectCsvSchema = z\n .string()\n .transform((s) =>\n s\n .split(',')\n .map((x) => x.trim())\n .filter(Boolean),\n )\n .refine((arr) => arr.length > 0, { message: 'select cannot be empty' });\n\n/* ---------------------------------- */\n/* Sort */\n/* ---------------------------------- */\n\nexport const SortDirectionSchema = z.enum(['ASC', 'DESC']);\nexport type SortDirection = z.infer<typeof SortDirectionSchema>;\n\nexport const SortItemSchema = z.object({\n property: z.string().min(1),\n direction: SortDirectionSchema,\n});\nexport type SortItem = z.infer<typeof SortItemSchema>;\n\n/**\n * Parse \"field:ASC\" into a SortItem.\n * The input must have a colon separating the field and direction, and the direction must be either \"ASC\" or \"DESC\" (case-insensitive).\n * */\nfunction parseSortItem(raw: string): SortItem {\n const [propertyRaw, dirRaw] = raw.split(':');\n const property = (propertyRaw ?? '').trim();\n const direction = SortDirectionSchema.parse((dirRaw ?? '').trim());\n return SortItemSchema.parse({ property, direction });\n}\n\n/* ---------------------------------- */\n/* Conditions + grouping */\n/* ---------------------------------- */\n\n/**\n * Supported operators.\n * $eq: equality (for strings, numbers, dates)\n * $null: checks for null (ignores the value)\n * $in: checks if the field value is in the provided array (for strings, numbers, dates)\n * $gt, $gte, $lt, $lte: comparison operators (for numbers and dates)\n * $btw: checks if the field value is between two values (for numbers and dates)\n * $ilike: case-insensitive substring match (for strings)\n * $sw: case-insensitive starts-with match (for strings)\n * $contains: checks if the field value contains the provided value (for strings)\n */\nexport const OperatorSchema = z.enum([\n '$eq',\n '$null',\n '$in',\n '$gt',\n '$gte',\n '$lt',\n '$lte',\n '$btw',\n '$ilike',\n '$sw',\n '$contains',\n]);\nexport type Operator = z.infer<typeof OperatorSchema>;\n\n/**\n * Logical combinators for grouping conditions. $and and $or can be used to combine multiple conditions within the same group.\n */\nexport const CombinatorSchema = z.enum(['$and', '$or']);\nexport type Combinator = z.infer<typeof CombinatorSchema>;\n\nconst ROOT_GROUP_ID = '0';\nexport const IntegerStringSchema = z.string().regex(/^\\d+$/, 'Must be an integer string');\n\n/**\n * Regex for validating ISO date strings (YYYY-MM-DD).\n */\nexport const ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/**\n * Regex for validating ISO datetime strings (YYYY-MM-DDTHH:mm:ss.sssZ or with timezone offset).\n */\nexport const ISO_DATETIME_RE =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,6})?)?(Z|[+-]\\d{2}:\\d{2})$/;\n\nexport const NumericStringSchema = z\n .string()\n .trim()\n .regex(/^\\d+$/, 'Must be a numeric string')\n .transform((s) => Number(s));\n\nexport const NumOrDateSchema = z.union([z.number(), z.string()]);\n\ntype FieldType = 'string' | 'number' | 'date' | 'any';\n\ntype FieldTypeFromValue<V> = V extends Date\n ? 'date'\n : V extends number\n ? 'number'\n : V extends string\n ? 'string'\n : 'any';\n\ntype CommonOps = '$eq' | '$null' | '$in' | '$contains';\ntype StringOnlyOps = '$ilike' | '$sw';\ntype ComparableOps = '$gt' | '$gte' | '$lt' | '$lte' | '$btw';\n\ntype OpsForFieldType<TKind extends FieldType> = TKind extends 'string'\n ? CommonOps | StringOnlyOps\n : TKind extends 'number'\n ? CommonOps | ComparableOps\n : TKind extends 'date'\n ? CommonOps | ComparableOps\n : Operator;\n\nexport const ConditionSchema = z.discriminatedUnion('op', [\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.literal('$null'),\n not: z.literal(true).optional(),\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.literal('$eq'),\n not: z.literal(true).optional(),\n value: NumOrDateSchema,\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.enum(['$ilike', '$sw']),\n not: z.literal(true).optional(),\n value: z.string(),\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.enum(['$in', '$contains']),\n not: z.literal(true).optional(),\n value: z.array(z.string()),\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.enum(['$gt', '$gte', '$lt', '$lte']),\n not: z.literal(true).optional(),\n value: NumOrDateSchema,\n }),\n\n z.object({\n group: IntegerStringSchema,\n combinator: CombinatorSchema.optional(),\n op: z.literal('$btw'),\n not: z.literal(true).optional(),\n value: z.tuple([NumOrDateSchema, NumOrDateSchema]),\n }),\n]);\n\nexport type Condition = z.infer<typeof ConditionSchema>;\n\n/* ---------------------------------- */\n/* Filters AST */\n/* ---------------------------------- */\n\nexport interface WhereFilter {\n type: 'filter';\n field: string;\n condition: Condition;\n}\nexport interface WhereAnd {\n type: 'and';\n items: WhereNode[];\n}\nexport interface WhereOr {\n type: 'or';\n items: WhereNode[];\n}\nexport type WhereNode = WhereFilter | WhereAnd | WhereOr;\n\nfunction and(items: WhereNode[]): WhereNode {\n if (items.length === 1 && items[0]) return items[0];\n return { type: 'and', items };\n}\n\nfunction or(items: WhereNode[]): WhereNode {\n if (items.length === 1 && items[0]) return items[0];\n return { type: 'or', items };\n}\n\nfunction fold(op: Combinator | undefined, left: WhereNode, right: WhereNode): WhereNode {\n if (op === '$or') {\n if (left.type === 'or') return or([...left.items, right]);\n return or([left, right]);\n }\n if (left.type === 'and') return and([...left.items, right]);\n return and([left, right]);\n}\n\nconst WhereNodeSchema: z.ZodType<WhereNode> = z.lazy(() =>\n z.union([\n z.object({ type: z.literal('filter'), field: z.string(), condition: ConditionSchema }),\n z.object({ type: z.literal('and'), items: z.array(WhereNodeSchema) }),\n z.object({ type: z.literal('or'), items: z.array(WhereNodeSchema) }),\n ]),\n);\n\n/* ---------------------------------- */\n/* Group tree */\n/* ---------------------------------- */\n\ninterface GroupDef {\n parent?: string;\n join?: Combinator;\n op?: Combinator;\n}\ntype GroupDefs = Record<string, GroupDef>;\n\nfunction extractGroupDefs(q: Record<string, unknown>): GroupDefs {\n const defs: GroupDefs = {};\n\n for (const [k, v] of Object.entries(q)) {\n if (!k.startsWith('group.')) continue;\n\n const rest = k.slice('group.'.length);\n const dotIdx = rest.indexOf('.');\n if (dotIdx === -1) continue;\n\n const groupIdRaw = rest.slice(0, dotIdx).trim();\n const prop = rest.slice(dotIdx + 1).trim();\n\n const parsedId = IntegerStringSchema.safeParse(groupIdRaw);\n if (!parsedId.success) continue;\n const id = parsedId.data;\n\n const first = Array.isArray(v) ? v[0] : v;\n const valueStr = typeof first === 'string' ? first : '';\n\n const current = defs[id] ?? {};\n\n if (prop === 'parent') {\n defs[id] = { ...current, parent: IntegerStringSchema.parse(valueStr.trim()) };\n continue;\n }\n if (prop === 'join') {\n defs[id] = { ...current, join: CombinatorSchema.parse(valueStr.trim()) };\n continue;\n }\n if (prop === 'op') {\n defs[id] = { ...current, op: CombinatorSchema.parse(valueStr.trim()) };\n continue;\n }\n }\n\n return defs;\n}\n\nfunction validateGroupDefs(defs: GroupDefs): void {\n const root = defs[ROOT_GROUP_ID];\n if (root && (root.parent !== undefined || root.join !== undefined)) {\n throw new Error(\n `group.0 can only define \"op\". \"parent\" and \"join\" are not allowed on root group \"0\".`,\n );\n }\n\n for (const [id, def] of Object.entries(defs)) {\n if (id === ROOT_GROUP_ID) continue;\n if (def.parent !== undefined) IntegerStringSchema.parse(def.parent);\n }\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const visit = (id: string): void => {\n if (visited.has(id)) return;\n if (visiting.has(id)) throw new Error(`Group cycle detected at group \"${id}\".`);\n visiting.add(id);\n\n const parent = defs[id]?.parent;\n if (parent && parent !== ROOT_GROUP_ID) visit(parent);\n\n visiting.delete(id);\n visited.add(id);\n };\n\n for (const id of Object.keys(defs)) {\n if (id === ROOT_GROUP_ID) continue;\n visit(id);\n }\n}\n\nfunction buildGroupConditionExprs(rawFilters: Record<string, Condition[]>): Map<string, WhereNode> {\n const groupNodes = new Map<string, WhereFilter[]>();\n\n for (const [field, conditions] of Object.entries(rawFilters)) {\n for (const cond of conditions) {\n const groupId = cond.group;\n const list = groupNodes.get(groupId) ?? [];\n const isFirst = list.length === 0;\n\n if (isFirst && cond.combinator !== undefined) {\n throw new Error(\n `Invalid combinator \"${cond.combinator}\" on first condition of group \"${groupId}\". ` +\n `First condition in a group cannot define \"$and\" or \"$or\".`,\n );\n }\n\n list.push({ type: 'filter', field, condition: cond });\n groupNodes.set(groupId, list);\n }\n }\n\n const exprs = new Map<string, WhereNode>();\n for (const [groupId, nodes] of groupNodes.entries()) {\n if (nodes.length === 0) continue;\n if (!nodes[0]) continue;\n\n let current: WhereNode = nodes[0];\n for (let i = 1; i < nodes.length; i += 1) {\n const next = nodes[i];\n if (!next) break;\n current = fold(next.condition.combinator, current, next);\n }\n exprs.set(groupId, current);\n }\n\n return exprs;\n}\n\nfunction buildWhereAstWithGroups(\n rawFilters: Record<string, Condition[]>,\n groupDefs: GroupDefs,\n): WhereNode {\n const groupExprs = buildGroupConditionExprs(rawFilters);\n\n const allGroupIds = new Set<string>();\n for (const id of groupExprs.keys()) allGroupIds.add(id);\n for (const id of Object.keys(groupDefs)) allGroupIds.add(id);\n allGroupIds.add(ROOT_GROUP_ID);\n\n const effectiveParent = (id: string): string => {\n if (id === ROOT_GROUP_ID) return ROOT_GROUP_ID;\n return groupDefs[id]?.parent ?? ROOT_GROUP_ID;\n };\n\n const childrenByParent = new Map<string, string[]>();\n for (const id of allGroupIds) {\n if (id === ROOT_GROUP_ID) continue;\n const parentId = effectiveParent(id);\n const arr = childrenByParent.get(parentId) ?? [];\n arr.push(id);\n childrenByParent.set(parentId, arr);\n }\n\n const sortNumericIds = (ids: string[]): string[] => {\n const pairs = ids.map((s) => ({ s, n: Number(s) }));\n pairs.sort((a, b) => a.n - b.n);\n return pairs.map((p) => p.s);\n };\n\n const visiting = new Set<string>();\n const resolved = new Map<string, WhereNode>();\n\n const resolveGroup = (id: string): WhereNode => {\n const cached = resolved.get(id);\n if (cached) return cached;\n\n if (visiting.has(id)) throw new Error(`Group cycle detected while resolving group \"${id}\".`);\n visiting.add(id);\n\n const items: { expr: WhereNode; join?: Combinator }[] = [];\n\n const own = groupExprs.get(id);\n if (own) items.push({ expr: own });\n\n const children = sortNumericIds(childrenByParent.get(id) ?? []);\n const parentOp = groupDefs[id]?.op;\n\n for (const childId of children) {\n const childExpr = resolveGroup(childId);\n const childJoin = groupDefs[childId]?.join;\n items.push({ expr: childExpr, join: childJoin ?? parentOp });\n }\n\n if (items.length === 0 || !items[0]) {\n const empty: WhereNode = { type: 'and', items: [] };\n resolved.set(id, empty);\n visiting.delete(id);\n return empty;\n }\n\n if (items[0].join !== undefined) {\n throw new Error(\n `Invalid group join \"${items[0].join}\" for the first item inside group \"${id}\". ` +\n `A group cannot start with \"$and\" or \"$or\" because there is nothing to join with.`,\n );\n }\n\n let current = items[0].expr;\n for (let i = 1; i < items.length; i += 1) {\n const next = items[i];\n if (!next) break;\n current = fold(next.join, current, next.expr);\n }\n\n resolved.set(id, current);\n visiting.delete(id);\n return current;\n };\n\n validateGroupDefs(groupDefs);\n return resolveGroup(ROOT_GROUP_ID);\n}\n\n/* ---------------------------------- */\n/* DSL parsing */\n/* ---------------------------------- */\n\n/** Parse a string as either a finite number or an ISO date string. */\nfunction parseNumOrDateStrict(raw: string, ctx: string): number | string {\n const s = raw.trim();\n\n if (/^[+-]?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (!Number.isFinite(n)) throw new Error(`Invalid number for ${ctx}: \"${raw}\"`);\n return n;\n }\n\n if (ISO_DATE_RE.test(s) || ISO_DATETIME_RE.test(s)) {\n const t = Date.parse(s);\n if (Number.isNaN(t)) throw new Error(`Invalid ISO date for ${ctx}: \"${raw}\"`);\n return s;\n }\n\n throw new Error(`Expected number or ISO date for ${ctx}, got \"${raw}\"`);\n}\n\n/** Ensure $btw bounds are both numbers or both dates. */\nfunction assertSameKind(a: number | string, b: number | string, ctx: string): void {\n const ka = typeof a === 'number' ? 'number' : 'date';\n const kb = typeof b === 'number' ? 'number' : 'date';\n if (ka !== kb) {\n throw new Error(`$btw bounds must be same type (both number or both date) for ${ctx}`);\n }\n}\n\n/** Parse a single \"filter.<field>\" DSL string into a Condition. */\nfunction parseSingleCondition(raw: string): Condition {\n const parts = raw.split(':');\n\n let group = ROOT_GROUP_ID;\n let cursor = parts;\n\n if (cursor[0] === '$g') {\n group = IntegerStringSchema.parse((cursor[1] ?? '').trim());\n cursor = cursor.slice(2);\n if (cursor.length === 0) {\n throw new Error(`Invalid group prefix in \"${raw}\" (missing condition after \"$g:<id>\")`);\n }\n }\n\n let combinator: Combinator | undefined;\n if (cursor[0] === '$and' || cursor[0] === '$or') {\n combinator = CombinatorSchema.parse(cursor[0]);\n cursor = cursor.slice(1);\n if (cursor.length === 0) {\n throw new Error(`Invalid combinator in \"${raw}\" (missing condition after \"${combinator}\")`);\n }\n }\n\n const hasNot = cursor[0] === '$not';\n if (hasNot && !cursor[1]) {\n throw new Error(`Invalid \"$not\" usage in \"${raw}\" (missing operator after \"$not\")`);\n }\n\n const head = hasNot ? cursor[1] : cursor[0];\n const rest = hasNot ? cursor.slice(2).join(':') : cursor.slice(1).join(':');\n const not = hasNot ? true : undefined;\n\n if (!head?.startsWith('$')) {\n return ConditionSchema.parse({\n group,\n combinator,\n op: '$eq',\n value: cursor.join(':'),\n });\n }\n\n const op = OperatorSchema.parse(head);\n\n if (op === '$null') return ConditionSchema.parse({ group, combinator, op: '$null', not });\n\n if (op === '$eq') {\n let value: number | string;\n try {\n value = parseNumOrDateStrict(rest, '$eq');\n } catch {\n value = rest;\n }\n return ConditionSchema.parse({ group, combinator, op: '$eq', not, value });\n }\n\n if (op === '$btw') {\n const [aRaw, bRaw] = rest.split(',');\n if (!aRaw || !bRaw) throw new Error(`Invalid $btw \"${raw}\" (expected \"$btw:a,b\")`);\n const a = parseNumOrDateStrict(aRaw, '$btw');\n const b = parseNumOrDateStrict(bRaw, '$btw');\n assertSameKind(a, b, '$btw');\n return ConditionSchema.parse({ group, combinator, op: '$btw', not, value: [a, b] });\n }\n\n if (op === '$in' || op === '$contains') {\n const arr = rest\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n return ConditionSchema.parse({ group, combinator, op, not, value: arr });\n }\n\n if (op === '$gt' || op === '$gte' || op === '$lt' || op === '$lte') {\n const v = parseNumOrDateStrict(rest, op);\n return ConditionSchema.parse({ group, combinator, op, not, value: v });\n }\n\n // $ilike | $sw\n return ConditionSchema.parse({ group, combinator, op, not, value: rest });\n}\n\n/* ---------------------------------- */\n/* Extract raw filters */\n/* ---------------------------------- */\n\nfunction extractAndNormalizeRawFilters(q: QueryStringRecord): Record<string, Condition[]> {\n const result: Record<string, Condition[]> = {};\n\n for (const [k, v] of Object.entries(q)) {\n if (!k.startsWith('filter.')) continue;\n\n const field = k.slice('filter.'.length).trim();\n if (!field) continue;\n\n const rawList = toStringArrayFromQueryString(v);\n result[field] = rawList.filter(Boolean).map(parseSingleCondition);\n }\n\n return result;\n}\n\nfunction toQueryStringRecord(q: Record<string, unknown>): QueryStringRecord {\n const out: QueryStringRecord = {};\n for (const [k, v] of Object.entries(q)) {\n if (typeof v === 'string') {\n out[k] = v;\n continue;\n }\n if (Array.isArray(v) && v.every((x) => typeof x === 'string')) {\n out[k] = v;\n continue;\n }\n out[k] = undefined;\n }\n return out;\n}\n\n/* ---------------------------------- */\n/* Config based on dataSchema */\n/* ---------------------------------- */\n\nexport type DataSchema = z.ZodObject<z.ZodRawShape>;\nexport type InferData<TSchema extends DataSchema> = z.infer<TSchema>;\nexport type AllowedPath<TSchema extends DataSchema> = Path<InferData<TSchema>>;\n\ninterface FilterableFieldConfig<TKind extends FieldType> {\n type: TKind;\n ops: readonly OpsForFieldType<TKind>[];\n}\n\nexport interface CommonQueryConfigFromSchema<TSchema extends DataSchema> {\n dataSchema: TSchema;\n\n selectable?: readonly AllowedPath<TSchema>[];\n sortable?: readonly AllowedPath<TSchema>[];\n\n filterable?: Partial<{\n [P in AllowedPath<TSchema>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n\n defaultSortBy?: readonly { property: AllowedPath<TSchema>; direction: SortDirection }[];\n defaultLimit?: number;\n\n defaultSelect?: readonly (AllowedPath<TSchema> | '*')[];\n maxLimit?: number;\n}\n\nexport type QueryConfigFromSchema<TSchema extends DataSchema> =\n CommonQueryConfigFromSchema<TSchema> &\n (LimitOffsetPaginationConfig | CursorPaginationConfig<InferData<TSchema>>);\n\n/* ---------------------------------- */\n/* Runtime filterable map */\n/* ---------------------------------- */\n\ninterface FilterableRuntimeFieldConfig {\n type: FieldType;\n ops: readonly Operator[];\n}\n\nfunction toFilterableRuntime(\n filterable: Partial<Record<string, { type: FieldType; ops: readonly Operator[] }>> | undefined,\n): Record<string, FilterableRuntimeFieldConfig> {\n const out: Record<string, FilterableRuntimeFieldConfig> = {};\n if (!filterable) return out;\n\n for (const [k, v] of Object.entries(filterable)) {\n if (!v) continue;\n out[k] = { type: v.type, ops: [...v.ops] };\n }\n\n return out;\n}\n\n/* ---------------------------------- */\n/* Defaults helpers (typed, no \"as\") */\n/* ---------------------------------- */\n\n/**\n * Find a typed AllowedPath value from a string, by matching against a typed allowlist.\n * This avoids `as`: we return the existing typed value.\n */\nfunction pickFromAllowlist<TSchema extends DataSchema>(\n allowlist: readonly AllowedPath<TSchema>[] | undefined,\n value: string,\n): AllowedPath<TSchema> | undefined {\n if (!allowlist) return undefined;\n for (const item of allowlist) {\n if (`${item}` === value) return item;\n }\n return undefined;\n}\n\n/** Expand \"*\" to selectable; otherwise return the same list. */\nfunction expandSelect<TSchema extends DataSchema>(\n select: readonly string[] | undefined,\n config: QueryConfigFromSchema<TSchema>,\n): readonly AllowedPath<TSchema>[] | undefined {\n if (!select) return undefined;\n\n if (!select.includes('*')) {\n if (!config.selectable || config.selectable.length === 0) return undefined;\n\n const out: AllowedPath<TSchema>[] = [];\n for (const field of select) {\n const picked = pickFromAllowlist(config.selectable, field);\n if (picked) out.push(picked);\n }\n return out;\n }\n\n if (config.selectable && config.selectable.length > 0) return [...config.selectable];\n return undefined;\n}\n\nfunction computeLimit<TSchema extends DataSchema>(\n limit: number | undefined,\n config: QueryConfigFromSchema<TSchema>,\n): number | undefined {\n if (typeof limit === 'number') return limit;\n if (typeof config.defaultLimit === 'number') return config.defaultLimit;\n return undefined;\n}\n\nfunction computeSelect<TSchema extends DataSchema>(\n select: string[] | undefined,\n config: QueryConfigFromSchema<TSchema>,\n): AllowedPath<TSchema>[] | undefined {\n if (select) {\n const expanded = expandSelect(select, config);\n if (!expanded) return undefined;\n return [...expanded];\n }\n\n if (config.defaultSelect) {\n const expanded = expandSelect(\n config.defaultSelect.map((x) => `${x}`),\n config,\n );\n if (!expanded) return undefined;\n return [...expanded];\n }\n\n return undefined;\n}\n\n/* ---------------------------------- */\n/* Runtime value/type validation */\n/* ---------------------------------- */\n\nfunction isISODateString(v: unknown): boolean {\n if (typeof v !== 'string') return false;\n if (!(ISO_DATE_RE.test(v) || ISO_DATETIME_RE.test(v))) return false;\n return !Number.isNaN(Date.parse(v));\n}\n\nfunction isFiniteNumber(v: unknown): boolean {\n return typeof v === 'number' && Number.isFinite(v);\n}\n\nfunction validateConditionType(expected: FieldType, cond: Condition, field: string): string | null {\n if (expected === 'any') return null;\n if (cond.op === '$null') return null;\n\n if (cond.op === '$eq') {\n if (expected === 'number' && !isFiniteNumber(cond.value))\n return `Field \"${field}\" expects a number for \"$eq\"`;\n if (expected === 'date' && !isISODateString(cond.value))\n return `Field \"${field}\" expects an ISO date for \"$eq\"`;\n if (expected === 'string' && typeof cond.value !== 'string')\n return `Field \"${field}\" expects a string for \"$eq\"`;\n return null;\n }\n\n if (cond.op === '$ilike' || cond.op === '$sw') {\n if (expected !== 'string')\n return `Field \"${field}\" does not support \"${cond.op}\" (configured as ${expected})`;\n return null;\n }\n\n if (cond.op === '$in' || cond.op === '$contains') return null;\n\n if (cond.op === '$gt' || cond.op === '$gte' || cond.op === '$lt' || cond.op === '$lte') {\n if (expected === 'string')\n return `Field \"${field}\" does not support \"${cond.op}\" (configured as string)`;\n if (expected === 'number' && !isFiniteNumber(cond.value))\n return `Field \"${field}\" expects number for \"${cond.op}\"`;\n if (expected === 'date' && !isISODateString(cond.value))\n return `Field \"${field}\" expects ISO date for \"${cond.op}\"`;\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (cond.op === '$btw') {\n const [a, b] = cond.value;\n if (expected === 'string')\n return `Field \"${field}\" does not support \"$btw\" (configured as string)`;\n if (expected === 'number' && (!isFiniteNumber(a) || !isFiniteNumber(b)))\n return `Field \"${field}\" expects numbers for \"$btw\"`;\n if (expected === 'date' && (!isISODateString(a) || !isISODateString(b)))\n return `Field \"${field}\" expects ISO dates for \"$btw\"`;\n return null;\n }\n\n return null;\n}\n\n/* ---------------------------------- */\n/* Sort defaults (typed, no \"as\") */\n/* ---------------------------------- */\n\nexport interface SortItemTyped<TSchema extends DataSchema> {\n property: AllowedPath<TSchema>;\n direction: SortDirection;\n}\n\nfunction computeSortBy<TSchema extends DataSchema>(\n sortByRaw: string[] | undefined,\n config: QueryConfigFromSchema<TSchema>,\n): SortItemTyped<TSchema>[] | undefined {\n if (sortByRaw) {\n const cleaned = sortByRaw.map((s) => s.trim()).filter(Boolean);\n if (cleaned.length > 0) {\n const out: SortItemTyped<TSchema>[] = [];\n for (const raw of cleaned) {\n const parsed = parseSortItem(raw);\n\n const picked = pickFromAllowlist(config.sortable, parsed.property);\n if (!picked) continue;\n\n out.push({ property: picked, direction: parsed.direction });\n }\n return out.length > 0 ? out : undefined;\n }\n }\n\n if (config.defaultSortBy && config.defaultSortBy.length > 0) {\n return config.defaultSortBy.map((x) => ({ property: x.property, direction: x.direction }));\n }\n\n return undefined;\n}\n\n/* ---------------------------------- */\n/* QueryParams output (generic) */\n/* ---------------------------------- */\n\nexport interface LimitOffsetPaginationPayload<TSchema extends DataSchema> {\n type: 'LIMIT_OFFSET';\n limit?: number;\n page?: number;\n sortBy?: SortItemTyped<TSchema>[];\n select?: AllowedPath<TSchema>[];\n filters?: WhereNode;\n}\n\n/**\n * Cursor is always a string in the query input, BUT we coerce it at parse-time\n * to match the type of cursorProperty (number / string / ISO date string).\n */\nexport interface CursorPaginationPayload<TSchema extends DataSchema> {\n type: 'CURSOR';\n limit?: number;\n cursor?: number | string;\n cursorProperty: AllowedPath<TSchema>;\n sortBy?: SortItemTyped<TSchema>[];\n select?: AllowedPath<TSchema>[];\n filters?: WhereNode;\n}\n\nexport interface PaginationQueryParams<TSchema extends DataSchema> {\n pagination: LimitOffsetPaginationPayload<TSchema> | CursorPaginationPayload<TSchema>;\n}\n\n/* ---------------------------------- */\n/* Projection helpers (NO \"as\") */\n/* ---------------------------------- */\n\ntype MutableShape = Record<string, z.ZodType>;\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction getOwnProp(obj: Record<string, unknown>, key: string): unknown {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) return undefined;\n return obj[key];\n}\n\n/** Duck-typed Zod schema check. */\nfunction isZodSchema(v: unknown): v is z.ZodType {\n if (!isPlainObject(v)) return false;\n const parseFn = getOwnProp(v, 'parse');\n return typeof parseFn === 'function';\n}\n\n/** Duck-typed ZodObject check. */\nfunction isZodObjectSchema(v: unknown): v is z.ZodObject<z.ZodRawShape> {\n if (!isPlainObject(v)) return false;\n const parseFn = getOwnProp(v, 'parse');\n if (typeof parseFn !== 'function') return false;\n const shape = getOwnProp(v, 'shape');\n return isPlainObject(shape);\n}\n\nfunction getObjectShape(obj: z.ZodObject<z.ZodRawShape>): Readonly<Record<string, unknown>> {\n return obj.shape;\n}\n\nfunction getZodAtPath(obj: z.ZodObject<z.ZodRawShape>, path: string): z.ZodType {\n const parts = path.split('.').filter(Boolean);\n\n let current: unknown = obj;\n\n for (const p of parts) {\n if (!isZodObjectSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not inside a ZodObject`);\n }\n\n const shape = getObjectShape(current);\n const next = shape[p];\n\n if (!next) throw new Error(`dataSchema path \"${path}\" is invalid: missing key \"${p}\"`);\n if (!isZodSchema(next)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not a Zod schema`);\n }\n\n current = next;\n }\n\n if (!isZodSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: resolved value is not a Zod schema`);\n }\n\n return current;\n}\n\nfunction projectDataSchema(\n dataSchema: z.ZodObject<z.ZodRawShape>,\n selectedPaths: string[],\n): z.ZodObject<z.ZodRawShape> {\n const tree: Record<string, unknown> = {};\n\n const ensureTreeNode = (node: Record<string, unknown>, key: string): Record<string, unknown> => {\n const existing = node[key];\n\n if (existing === undefined) {\n const child: Record<string, unknown> = {};\n node[key] = child;\n return child;\n }\n\n if (isPlainObject(existing)) return existing;\n\n if (isZodSchema(existing)) {\n throw new Error(`Cannot project \"${key}\": \"${key}\" is selected as a leaf and as an object`);\n }\n\n throw new Error(`Cannot project \"${key}\": conflicting selection`);\n };\n\n for (const fullPath of selectedPaths) {\n const parts = fullPath.split('.').filter(Boolean);\n if (parts.length === 0) continue;\n\n let cursor = tree;\n\n for (let i = 0; i < parts.length; i += 1) {\n const key = parts[i];\n if (!key) continue;\n\n const isLeaf = i === parts.length - 1;\n\n if (isLeaf) {\n cursor[key] = getZodAtPath(dataSchema, fullPath);\n } else {\n cursor = ensureTreeNode(cursor, key);\n }\n }\n }\n\n const buildObjectFromTree = (node: Record<string, unknown>): z.ZodObject<z.ZodRawShape> => {\n const shape: MutableShape = {};\n\n for (const [k, v] of Object.entries(node)) {\n if (isZodSchema(v)) {\n shape[k] = v;\n continue;\n }\n if (isPlainObject(v)) {\n shape[k] = buildObjectFromTree(v);\n continue;\n }\n throw new Error(`Invalid projection tree at \"${k}\"`);\n }\n\n return z.object(shape);\n };\n\n return buildObjectFromTree(tree);\n}\n\nfunction callMethodIfReturnsZod(obj: unknown, methodName: string): z.ZodType | undefined {\n if (!isPlainObject(obj)) return undefined;\n\n const maybeFn = getOwnProp(obj, methodName);\n if (typeof maybeFn !== 'function') return undefined;\n\n const result = maybeFn.call(obj);\n if (isZodSchema(result)) return result;\n\n return undefined;\n}\n\nfunction getInnerSchemaFromDef(obj: unknown): z.ZodType | undefined {\n if (!isPlainObject(obj)) return undefined;\n\n const def = getOwnProp(obj, 'def') ?? getOwnProp(obj, '_def');\n if (!isPlainObject(def)) return undefined;\n\n const candidates = ['innerType', 'schema', 'type', 'in', 'out'];\n\n for (const key of candidates) {\n const v = getOwnProp(def, key);\n if (isZodSchema(v)) return v;\n }\n\n return undefined;\n}\n\nfunction unwrapSchema(schema: z.ZodType): z.ZodType {\n let current: unknown = schema;\n\n for (let i = 0; i < 30; i += 1) {\n const unwrapped = callMethodIfReturnsZod(current, 'unwrap');\n if (unwrapped) {\n current = unwrapped;\n continue;\n }\n\n const removedDefault = callMethodIfReturnsZod(current, 'removeDefault');\n if (removedDefault) {\n current = removedDefault;\n continue;\n }\n\n const innerType = callMethodIfReturnsZod(current, 'innerType');\n if (innerType) {\n current = innerType;\n continue;\n }\n\n const sourceType = callMethodIfReturnsZod(current, 'sourceType');\n if (sourceType) {\n current = sourceType;\n continue;\n }\n\n const innerFromDef = getInnerSchemaFromDef(current);\n if (innerFromDef) {\n current = innerFromDef;\n continue;\n }\n\n break;\n }\n\n if (isZodSchema(current)) return current;\n return schema;\n}\n\n/**\n * Robust constructor name getter that works with Zod objects (constructor is on the prototype).\n * No `as`, no unsafe casts.\n */\nfunction getConstructorName(v: unknown): string | undefined {\n if (typeof v !== 'object' || v === null) return undefined;\n\n const proto: unknown = Object.getPrototypeOf(v);\n if (typeof proto !== 'object' || proto === null) return undefined;\n\n const ctorUnknown: unknown = Reflect.get(proto, 'constructor');\n if (!(ctorUnknown instanceof Function)) return undefined;\n\n return ctorUnknown.name;\n}\n\n/* ---------------------------------- */\n/* Cursor: schema inference + coercion */\n/* ---------------------------------- */\n\n/**\n * Return the expected cursor schema for API responses:\n * - number field => cursor: number\n * - string field => cursor: string\n * - date field => cursor: ISO string OR Date (optional support)\n */\nfunction cursorSchemaFromProperty<TSchema extends DataSchema>(\n dataSchema: TSchema,\n cursorProperty: AllowedPath<TSchema>,\n): z.ZodType {\n const raw = getZodAtPath(dataSchema, `${cursorProperty}`);\n const s = unwrapSchema(raw);\n const ctorName = getConstructorName(s);\n\n if (ctorName === 'ZodNumber') return z.number();\n if (ctorName === 'ZodString') return z.string();\n if (ctorName === 'ZodDate') return z.union([z.string().refine(isISODateString), z.date()]);\n\n // Unsupported cursor field type\n return z.never();\n}\n\n/**\n * Coerce the query input cursor (always string) into the right type based on cursorProperty.\n * - number field => \"123\" -> 123\n * - string field => \"abc\" -> \"abc\"\n * - date field => \"2022-01-01\" -> \"2022-01-01\" (validated as ISO)\n */\nfunction coerceCursorFromProperty<TSchema extends DataSchema>(\n dataSchema: TSchema,\n cursorProperty: AllowedPath<TSchema>,\n rawCursor: string,\n): number | string {\n const schemaAtPath = unwrapSchema(getZodAtPath(dataSchema, `${cursorProperty}`));\n const ctorName = getConstructorName(schemaAtPath);\n\n if (ctorName === 'ZodNumber') {\n const s = rawCursor.trim();\n if (!/^[+-]?\\d+$/.test(s)) throw new Error(`cursor must be an integer string`);\n const n = Number(s);\n if (!Number.isFinite(n)) throw new Error(`cursor must be a finite number`);\n return n;\n }\n\n if (ctorName === 'ZodString') {\n return rawCursor;\n }\n\n if (ctorName === 'ZodDate') {\n const s = rawCursor.trim();\n if (!isISODateString(s)) throw new Error(`cursor must be an ISO date string`);\n return s;\n }\n\n throw new Error(`cursorProperty \"${cursorProperty}\" must be a string|number|date`);\n}\n\n/* ---------------------------------- */\n/* Factory */\n/* ---------------------------------- */\n\n/**\n * Generate Zod schemas and runtime validators for pagination query parameters, based on a config object.\n * @param config The configuration object defining the pagination behavior and allowed fields.\n * @returns An object containing:\n * - `queryParamsSchema`: A Zod schema for validating and parsing the raw query parameters.\n * - `validatorSchema`: A function that takes the already-parsed query parameters and returns a Zod schema for further validation (e.g. filters).\n */\nexport function paginate<TSchema extends DataSchema>(\n config: QueryConfigFromSchema<TSchema>,\n): {\n queryParamsSchema: z.ZodType<PaginationQueryParams<TSchema>>;\n validatorSchema: (parsed?: PaginationQueryParams<TSchema>) => z.ZodType;\n} {\n const allowedSelectable = new Set<string>();\n for (const f of config.selectable ?? []) allowedSelectable.add(`${f}`);\n\n const allowedSortable = new Set<string>();\n for (const f of config.sortable ?? []) allowedSortable.add(`${f}`);\n\n const filterable = toFilterableRuntime(config.filterable);\n\n const baseSchema = z.object({\n limit: NumericStringSchema.optional(),\n page: NumericStringSchema.optional(),\n\n /**\n * Query input is always a string if present.\n * We will coerce it later in the final transform (CURSOR mode only).\n */\n cursor: z.string().min(1).optional(),\n\n sortBy: StringOrStringArraySchema.optional(),\n select: SelectCsvSchema.optional(),\n\n rawFilters: z.record(z.string(), z.array(ConditionSchema)),\n groupDefs: z.record(\n z.string(),\n z.object({\n parent: IntegerStringSchema.optional(),\n join: CombinatorSchema.optional(),\n op: CombinatorSchema.optional(),\n }),\n ),\n });\n\n const queryParamsSchema: z.ZodType<PaginationQueryParams<TSchema>> = z\n .record(z.string(), z.unknown())\n .transform(\n (\n q,\n ): Record<string, unknown> & {\n rawFilters: Record<string, Condition[]>;\n groupDefs: GroupDefs;\n } => {\n const qs = toQueryStringRecord(q);\n\n return {\n ...q,\n rawFilters: extractAndNormalizeRawFilters(qs),\n groupDefs: extractGroupDefs(q),\n };\n },\n )\n .pipe(\n baseSchema\n .superRefine((val, ctx): void => {\n // Pagination mode constraints\n if (config.paginationType === 'LIMIT_OFFSET') {\n if (val.cursor !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['cursor'],\n message: `cursor is not allowed when paginationType is LIMIT_OFFSET`,\n });\n }\n }\n\n if (config.paginationType === 'CURSOR') {\n if (val.page !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['page'],\n message: `page is not allowed when paginationType is CURSOR`,\n });\n }\n\n if (`${config.cursorProperty}`.trim().length === 0) {\n ctx.addIssue({\n code: 'custom',\n path: [],\n message: `cursorProperty must be a non-empty string when paginationType is CURSOR`,\n });\n }\n\n // Validate that cursor (if provided) can be coerced for that cursorProperty\n if (val.cursor !== undefined) {\n try {\n void coerceCursorFromProperty(config.dataSchema, config.cursorProperty, val.cursor);\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Invalid cursor';\n ctx.addIssue({\n code: 'custom',\n path: ['cursor'],\n message,\n });\n }\n }\n }\n\n // limit / maxLimit\n if (\n typeof val.limit === 'number' &&\n typeof config.maxLimit === 'number' &&\n val.limit > config.maxLimit\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['limit'],\n message: `limit must be <= ${config.maxLimit}`,\n });\n }\n\n // select forbidden if no selectable configured\n if (val.select && (!config.selectable || config.selectable.length === 0)) {\n ctx.addIssue({\n code: 'custom',\n path: ['select'],\n message: `select is not allowed (no selectable fields configured)`,\n });\n }\n\n // select allowlist + \"*\" expandability\n const selectForValidation =\n val.select ??\n (config.defaultSelect ? config.defaultSelect.map((x) => `${x}`) : undefined);\n\n if (selectForValidation) {\n let index = 0;\n\n for (const field of selectForValidation) {\n if (field === '*') {\n index += 1;\n continue;\n }\n\n if (allowedSelectable.size > 0 && !allowedSelectable.has(field)) {\n ctx.addIssue({\n code: 'custom',\n path: ['select', index],\n message: `select field \"${field}\" is not allowed`,\n });\n }\n\n index += 1;\n }\n\n if (selectForValidation.includes('*')) {\n const expanded = expandSelect(selectForValidation, config);\n if (!expanded || expanded.length === 0) {\n ctx.addIssue({\n code: 'custom',\n path: ['select'],\n message: `select \"*\" cannot be expanded (missing selectable in config)`,\n });\n }\n }\n }\n\n // sort allowlist\n const sortItems = computeSortBy(val.sortBy, config);\n if (val.sortBy) {\n if (!config.sortable || config.sortable.length === 0) {\n ctx.addIssue({\n code: 'custom',\n path: ['sortBy'],\n message: `sortBy is not allowed (no sortable fields configured)`,\n });\n } else if (sortItems) {\n let index = 0;\n for (const item of sortItems) {\n if (!allowedSortable.has(`${item.property}`)) {\n ctx.addIssue({\n code: 'custom',\n path: ['sortBy', index],\n message: `sort property \"${item.property}\" is not allowed`,\n });\n }\n index += 1;\n }\n }\n }\n\n // filter allowlist + operator/type validation\n for (const [field, conditions] of Object.entries(val.rawFilters)) {\n const cfg = filterable[field];\n\n if (!cfg) {\n ctx.addIssue({\n code: 'custom',\n path: ['rawFilters', field],\n message: `filter field \"${field}\" is not allowed`,\n });\n continue;\n }\n\n const allowedOps = new Set(cfg.ops);\n\n let index = 0;\n for (const cond of conditions) {\n if (!allowedOps.has(cond.op)) {\n ctx.addIssue({\n code: 'custom',\n path: ['rawFilters', field, index, 'op'],\n message: `operator \"${cond.op}\" is not allowed for \"${field}\"`,\n });\n }\n\n const typeError = validateConditionType(cfg.type, cond, field);\n if (typeError) {\n ctx.addIssue({\n code: 'custom',\n path: ['rawFilters', field, index],\n message: typeError,\n });\n }\n\n index += 1;\n }\n }\n\n // group consistency\n const hasAnyFilter = Object.keys(val.rawFilters).length > 0;\n const hasAnyGroupDef = Object.keys(val.groupDefs).length > 0;\n\n if (hasAnyGroupDef && !hasAnyFilter) {\n ctx.addIssue({\n code: 'custom',\n path: ['groupDefs'],\n message: `group.* is not allowed without any filter.*`,\n });\n } else if (hasAnyFilter) {\n try {\n void buildWhereAstWithGroups(val.rawFilters, val.groupDefs);\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Invalid group configuration';\n ctx.addIssue({\n code: 'custom',\n path: ['groupDefs'],\n message,\n });\n }\n }\n })\n .transform((val): PaginationQueryParams<TSchema> => {\n const limit = computeLimit(val.limit, config);\n const sortBy = computeSortBy(val.sortBy, config);\n const select = computeSelect(val.select, config);\n\n const hasAnyFilter = Object.keys(val.rawFilters).length > 0;\n\n const maybeFilters = hasAnyFilter\n ? { filters: buildWhereAstWithGroups(val.rawFilters, val.groupDefs) }\n : {};\n\n if (config.paginationType === 'LIMIT_OFFSET') {\n return {\n pagination: {\n type: 'LIMIT_OFFSET',\n limit,\n page: val.page,\n sortBy,\n select,\n ...maybeFilters,\n },\n };\n }\n\n // CURSOR: coerce string cursor into number/string based on cursorProperty\n let cursor: number | string | undefined = undefined;\n if (val.cursor !== undefined) {\n cursor = coerceCursorFromProperty(config.dataSchema, config.cursorProperty, val.cursor);\n }\n\n return {\n pagination: {\n type: 'CURSOR',\n limit,\n cursor,\n cursorProperty: config.cursorProperty,\n sortBy,\n select,\n ...maybeFilters,\n },\n };\n }),\n );\n\n const validatorSchema = (parsed?: PaginationQueryParams<TSchema>): z.ZodType => {\n const effectiveSelect =\n parsed?.pagination.select ?? computeSelect(undefined, config) ?? undefined;\n\n const dataItemSchema =\n effectiveSelect && effectiveSelect.length > 0\n ? projectDataSchema(\n config.dataSchema,\n effectiveSelect.map((x) => `${x}`),\n )\n : config.dataSchema;\n\n const dataArraySchema = z.array(dataItemSchema);\n\n if (config.paginationType === 'LIMIT_OFFSET') {\n return z.object({\n data: dataArraySchema,\n pagination: z.object({\n itemsPerPage: z.number(),\n totalItems: z.number(),\n currentPage: z.number(),\n totalPages: z.number(),\n sortBy: z\n .array(\n z.object({\n property: z.string(),\n direction: SortDirectionSchema,\n }),\n )\n .optional(),\n filter: WhereNodeSchema.optional(),\n }),\n });\n }\n\n const cursorType = cursorSchemaFromProperty(config.dataSchema, config.cursorProperty);\n\n return z.object({\n data: dataArraySchema,\n pagination: z.object({\n itemsPerPage: z.number(),\n cursor: cursorType,\n sortBy: z\n .array(\n z.object({\n property: z.string(),\n direction: SortDirectionSchema,\n }),\n )\n .optional(),\n filter: WhereNodeSchema.optional(),\n }),\n });\n };\n\n return { queryParamsSchema, validatorSchema };\n}\n"]}
|