zod-paginate 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -106,7 +106,7 @@ const parsed = queryParamsSchema().parse({
106
106
  page: "2",
107
107
  sortBy: "createdAt:DESC",
108
108
  select: "id,status",
109
- "filter[status]": "$ilike:act",
109
+ filter: "status:$ilike:act",
110
110
  });
111
111
 
112
112
  console.log(parsed.pagination);
@@ -426,23 +426,23 @@ contextSchema.parse({
426
426
 
427
427
  ## Filters
428
428
 
429
- Filters use query keys with bracket notation `filter[<field>]=<dsl>` where `<field>` is a dot-path (e.g. `meta.score`). Configure which fields and operators are allowed via the `filterable` option.
429
+ Filters use a repeated `filter` query parameter with the format `field:$op:value`. Configure which fields and operators are allowed via the `filterable` option.
430
430
 
431
431
  ### Operators
432
432
 
433
433
  | Operator | Meaning | Value format | Example |
434
434
  |---|---|---|---|
435
- | `$eq` | equals | number / string / ISO date | `filter[status]=$eq:active` |
436
- | `$null` | is null | _(no value)_ | `filter[deletedAt]=$null` |
437
- | `$in` | in list | comma-separated | `filter[status]=$in:active,pending` |
438
- | `$contains` | contains values | comma-separated | `filter[tags]=$contains:typescript,zod` |
439
- | `$gt` | greater than | number or ISO date | `filter[id]=$gt:100` |
440
- | `$gte` | greater than or equal | number or ISO date | `filter[createdAt]=$gte:2025-01-01` |
441
- | `$lt` | less than | number or ISO date | `filter[id]=$lt:500` |
442
- | `$lte` | less than or equal | number or ISO date | `filter[id]=$lte:500` |
443
- | `$btw` | between (inclusive) | `a,b` (same type) | `filter[id]=$btw:10,100` |
444
- | `$ilike` | case-insensitive contains | string | `filter[name]=$ilike:john` |
445
- | `$sw` | starts with | string | `filter[name]=$sw:Jon` |
435
+ | `$eq` | equals | number / string / ISO date | `filter=status:$eq:active` |
436
+ | `$null` | is null | _(no value)_ | `filter=deletedAt:$null` |
437
+ | `$in` | in list | comma-separated | `filter=status:$in:active,pending` |
438
+ | `$contains` | contains values | comma-separated | `filter=tags:$contains:typescript,zod` |
439
+ | `$gt` | greater than | number or ISO date | `filter=id:$gt:100` |
440
+ | `$gte` | greater than or equal | number or ISO date | `filter=createdAt:$gte:2025-01-01` |
441
+ | `$lt` | less than | number or ISO date | `filter=id:$lt:500` |
442
+ | `$lte` | less than or equal | number or ISO date | `filter=id:$lte:500` |
443
+ | `$btw` | between (inclusive) | `a,b` (same type) | `filter=id:$btw:10,100` |
444
+ | `$ilike` | case-insensitive contains | string | `filter=name:$ilike:john` |
445
+ | `$sw` | starts with | string | `filter=name:$sw:Jon` |
446
446
 
447
447
  If the filter value does **not** start with `$`, it is interpreted as `$eq:<value>`.
448
448
 
@@ -451,20 +451,20 @@ If the filter value does **not** start with `$`, it is interpreted as `$eq:<valu
451
451
  Prefix any operator with `$not:` to negate the condition:
452
452
 
453
453
  ```txt
454
- filter[deletedAt]=$not:$null
455
- filter[status]=$not:$eq:active
454
+ filter=deletedAt:$not:$null
455
+ filter=status:$not:$eq:active
456
456
  ```
457
457
 
458
458
  ### Multiple conditions for the same field
459
459
 
460
- Repeat the same query param key to pass multiple conditions:
460
+ Repeat the `filter` param:
461
461
 
462
462
  ```txt
463
- filter[id]=$gt:10&filter[id]=$lt:100
463
+ ?filter=id:$gt:10&filter=id:$lt:100
464
464
  ```
465
465
 
466
466
  ```ts
467
- { "filter[id]": ["$gt:10", "$lt:100"] }
467
+ { filter: ["id:$gt:10", "id:$lt:100"] }
468
468
  ```
469
469
 
470
470
  Runtime validation enforces: field allowlist (`filterable`), operator allowlist per field (`ops`), and value type compatibility.
@@ -478,14 +478,14 @@ Groups let you build nested AND/OR boolean logic.
478
478
  Prefix any filter DSL with `$g:<groupId>:`:
479
479
 
480
480
  ```txt
481
- filter[status]=$g:1:$eq:active
481
+ filter=status:$g:1:$eq:active
482
482
  ```
483
483
 
484
484
  Within a group, the **first** condition cannot have `$and`/`$or`. Following conditions may be prefixed with `$and` or `$or`.
485
485
 
486
486
  ### Group tree definitions: `group`
487
487
 
488
- Define parent-child relationships between groups using the repeated `group` query parameter. Each entry has the format `id:key=value,key=value`.
488
+ Define parent-child relationships between groups using the repeated `group` query parameter. Each entry has the format `id:key:value,key:value`.
489
489
 
490
490
  Available keys:
491
491
 
@@ -498,15 +498,14 @@ Rules: root group id is always `"0"`. `parent` and `join` are forbidden on group
498
498
  **Example:** `(status == active OR status == postponed) AND (id > 10)`
499
499
 
500
500
  ```txt
501
- ?filter[status]=$g:1:$eq:active&filter[status]=$g:1:$or:$eq:postponed&filter[id]=$g:2:$gt:10&group=1:parent=0&group=2:parent=0,join=$and
501
+ ?filter=status:$g:1:$eq:active&filter=status:$g:1:$or:$eq:postponed&filter=id:$g:2:$gt:10&group=1:parent:0&group=2:parent:0,join:$and
502
502
  ```
503
503
 
504
504
  ```ts
505
505
  const parsed = queryParamsSchema().parse({
506
- "filter[status]": ["$g:1:$eq:active", "$g:1:$or:$eq:postponed"],
507
- "filter[id]": "$g:2:$gt:10",
506
+ filter: ["status:$g:1:$eq:active", "status:$g:1:$or:$eq:postponed", "id:$g:2:$gt:10"],
508
507
 
509
- group: ["1:parent=0", "2:parent=0,join=$and"],
508
+ group: ["1:parent:0", "2:parent:0,join:$and"],
510
509
  });
511
510
 
512
511
  // parsed.pagination.filters
@@ -759,7 +758,7 @@ Extra fields are validated together — errors from both sides are collected in
759
758
  ### LIMIT/OFFSET
760
759
 
761
760
  ```txt
762
- ?limit=20&page=1&select=id,status,createdAt&sortBy=createdAt:DESC&filter[status]=$ilike:act&filter[id]=$gt:10
761
+ ?limit=20&page=1&select=id,status,createdAt&sortBy=createdAt:DESC&filter=status:$ilike:act&filter=id:$gt:10
763
762
  ```
764
763
 
765
764
  ```ts
@@ -768,8 +767,7 @@ const parsed = queryParamsSchema().parse({
768
767
  page: "1",
769
768
  select: "id,status,createdAt",
770
769
  sortBy: "createdAt:DESC",
771
- "filter[status]": "$ilike:act",
772
- "filter[id]": "$gt:10",
770
+ filter: ["status:$ilike:act", "id:$gt:10"],
773
771
  });
774
772
 
775
773
  // parsed.pagination
@@ -167,7 +167,7 @@ export interface CommonQueryConfigFromSchema<TSchema extends DataSchema, TSelect
167
167
  decorative?: readonly AllowedPath<TSchema>[];
168
168
  /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */
169
169
  sortable?: readonly AllowedPath<TSchema>[];
170
- /** Map of filterable fields to their allowed type and operators. Enables the `filter[*]` query parameters. */
170
+ /** Map of filterable fields to their allowed type and operators. Enables the `filter` query parameter. */
171
171
  filterable?: Partial<{
172
172
  [P in AllowedPath<TSchema>]: FilterableFieldConfig<FieldTypeFromValue<PathValue<InferData<TSchema>, P>>>;
173
173
  }>;
@@ -323,7 +323,7 @@ export declare function paginate<TSchema extends DataSchema, const TSelectable e
323
323
  sortable?: NoDuplicates<TSortable>;
324
324
  /** Default sort order applied when `sortBy` is omitted from the query. */
325
325
  defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;
326
- /** Map of filterable fields to their allowed type and operators. Enables the `filter[*]` query parameters. */
326
+ /** Map of filterable fields to their allowed type and operators. Enables the `filter` query parameter. */
327
327
  filterable?: Partial<{
328
328
  [P in NoInfer<TSelectable[number]>]: FilterableFieldConfig<FieldTypeFromValue<PathValue<InferData<TSchema>, P>>>;
329
329
  }>;
@@ -345,7 +345,7 @@ export declare function paginate<TSchema extends DataSchema, const TSelectable e
345
345
  sortable?: NoDuplicates<TSortable>;
346
346
  /** Default sort order applied when `sortBy` is omitted from the query. */
347
347
  defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;
348
- /** Map of filterable fields to their allowed type and operators. Enables the `filter[*]` query parameters. */
348
+ /** Map of filterable fields to their allowed type and operators. Enables the `filter` query parameter. */
349
349
  filterable?: Partial<{
350
350
  [P in NoInfer<TSelectable[number]>]: FilterableFieldConfig<FieldTypeFromValue<PathValue<InferData<TSchema>, P>>>;
351
351
  }>;
@@ -367,7 +367,7 @@ export declare function paginate<TSchema extends DataSchema, const TSelectable e
367
367
  sortable?: NoDuplicates<TSortable>;
368
368
  /** Default sort order applied when `sortBy` is omitted from the query. */
369
369
  defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;
370
- /** Map of filterable fields to their allowed type and operators. Enables the `filter[*]` query parameters. */
370
+ /** Map of filterable fields to their allowed type and operators. Enables the `filter` query parameter. */
371
371
  filterable?: Partial<{
372
372
  [P in NoInfer<TSelectable[number]>]: FilterableFieldConfig<FieldTypeFromValue<PathValue<InferData<TSchema>, P>>>;
373
373
  }>;
package/dist/paginate.js CHANGED
@@ -7,17 +7,6 @@ const select_1 = require("./select");
7
7
  /* ---------------------------------- */
8
8
  /* Common input normalizers */
9
9
  /* ---------------------------------- */
10
- /**
11
- * We often want to allow both single values and arrays in the querystring, e.g. "select=field1,field2" or "select[]=field1&select[]=field2".
12
- * This function normalizes both cases to a string array.
13
- */
14
- function toStringArrayFromQueryString(v) {
15
- if (v === undefined)
16
- return [];
17
- if (Array.isArray(v))
18
- return v;
19
- return [v];
20
- }
21
10
  /**
22
11
  * Zod schema for a querystring parameter that can be either a single string or an array of strings.
23
12
  * It normalizes the output to always be an array of strings.
@@ -188,7 +177,7 @@ function extractGroupDefs(q) {
188
177
  entries = [];
189
178
  }
190
179
  for (const entry of entries) {
191
- // Format: "id:key=value,key=value"
180
+ // Format: "id:key:value,key:value"
192
181
  const colonIdx = entry.indexOf(':');
193
182
  if (colonIdx === -1)
194
183
  continue;
@@ -200,11 +189,11 @@ function extractGroupDefs(q) {
200
189
  const id = parsedId.data;
201
190
  const current = defs[id] ?? {};
202
191
  for (const pair of propsRaw.split(',')) {
203
- const eqIdx = pair.indexOf('=');
204
- if (eqIdx === -1)
192
+ const pairColonIdx = pair.indexOf(':');
193
+ if (pairColonIdx === -1)
205
194
  continue;
206
- const prop = pair.slice(0, eqIdx).trim();
207
- const value = pair.slice(eqIdx + 1).trim();
195
+ const prop = pair.slice(0, pairColonIdx).trim();
196
+ const value = pair.slice(pairColonIdx + 1).trim();
208
197
  if (prop === 'parent') {
209
198
  current.parent = exports.IntegerStringSchema.parse(value);
210
199
  }
@@ -381,7 +370,7 @@ function assertSameKind(a, b, ctx) {
381
370
  throw new Error(`$btw bounds must be same type (both number or both date) for ${ctx}`);
382
371
  }
383
372
  }
384
- /** Parse a single "filter[field]" DSL string into a Condition. */
373
+ /** Parse a single filter DSL string into a Condition (e.g. "$eq:active", "$g:1:$or:$eq:value"). */
385
374
  function parseSingleCondition(raw) {
386
375
  const parts = raw.split(':');
387
376
  let group = ROOT_GROUP_ID;
@@ -455,41 +444,36 @@ function parseSingleCondition(raw) {
455
444
  /* ---------------------------------- */
456
445
  /* Extract raw filters */
457
446
  /* ---------------------------------- */
458
- function toQueryStringValue(v) {
459
- if (v === undefined)
460
- return undefined;
461
- if (typeof v === 'string')
462
- return v;
463
- if (Array.isArray(v) && v.every((x) => typeof x === 'string'))
464
- return v;
465
- return undefined;
466
- }
467
447
  function extractAndNormalizeRawFilters(q) {
468
448
  const result = {};
469
- // Handle flat keys: filter[field] (frameworks that don't parse deep objects)
470
- for (const [k, v] of Object.entries(q)) {
471
- const match = /^filter\[([^\]]+)\]$/.exec(k);
472
- if (!match)
449
+ const raw = q.filter;
450
+ if (raw === undefined || raw === null)
451
+ return result;
452
+ let entries;
453
+ if (Array.isArray(raw)) {
454
+ entries = raw.filter((x) => typeof x === 'string');
455
+ }
456
+ else if (typeof raw === 'string') {
457
+ entries = [raw];
458
+ }
459
+ else {
460
+ entries = [];
461
+ }
462
+ for (const entry of entries) {
463
+ // Format: "field:$op:value" — first colon separates field from DSL
464
+ const colonIdx = entry.indexOf(':');
465
+ if (colonIdx === -1)
473
466
  continue;
474
- const field = (match[1] ?? '').trim();
467
+ const field = entry.slice(0, colonIdx).trim();
475
468
  if (!field)
476
469
  continue;
477
- const rawList = toStringArrayFromQueryString(toQueryStringValue(v));
478
- result[field] = rawList.filter(Boolean).map(parseSingleCondition);
479
- }
480
- // Handle nested object: filter: { field: value } (frameworks that parse deep objects)
481
- const filterObj = q.filter;
482
- if (filterObj && typeof filterObj === 'object' && !Array.isArray(filterObj)) {
483
- for (const [field, v] of Object.entries(filterObj)) {
484
- const trimmedField = field.trim();
485
- if (!trimmedField)
486
- continue;
487
- // Skip if already found via flat keys
488
- if (result[trimmedField])
489
- continue;
490
- const rawList = toStringArrayFromQueryString(toQueryStringValue(v));
491
- result[trimmedField] = rawList.filter(Boolean).map(parseSingleCondition);
492
- }
470
+ const dsl = entry.slice(colonIdx + 1);
471
+ if (!dsl)
472
+ continue;
473
+ const condition = parseSingleCondition(dsl);
474
+ const list = result[field] ?? [];
475
+ list.push(condition);
476
+ result[field] = list;
493
477
  }
494
478
  return result;
495
479
  }
@@ -779,9 +763,9 @@ function paginate(config) {
779
763
  /*
780
764
  * Build the root ZodObject with explicit named properties so that
781
765
  * OpenAPI tooling (zod-openapi, fastify-zod-openapi) can introspect
782
- * the query parameters. Filter fields use bracket notation (filter[field])
783
- * and group uses a repeated "group" param. The actual validation/transforms
784
- * happen in the piped baseSchema below.
766
+ * the query parameters. Both "filter" and "group" are repeated params
767
+ * (type: array of strings). The actual validation/transforms happen
768
+ * in the piped baseSchema below.
785
769
  */
786
770
  const rootShape = {
787
771
  limit: zod_1.z
@@ -826,39 +810,24 @@ function paginate(config) {
826
810
  example: defaultSelectDesc,
827
811
  });
828
812
  }
829
- // Add filter as a deep object and group param only when filterable is configured
813
+ // Add filter and group params only when filterable is configured
830
814
  if (config.filterable) {
831
- const filterShape = {};
832
- for (const [field, def] of Object.entries(filterable)) {
833
- const ops = def.ops.join(', ');
834
- filterShape[field] = zod_1.z
835
- .union([zod_1.z.string(), zod_1.z.array(zod_1.z.string())])
836
- .optional()
837
- .meta({
838
- description: `Filter on "${field}" (${def.type}). Supported operators: ${ops}. Format: "$op:value"`,
839
- example: `${def.ops[0]}:value`,
840
- });
841
- }
842
815
  const filterFields = Object.entries(filterable)
843
816
  .map(([field, def]) => ` - ${field} (${def.type}): ${def.ops.join(', ')}`)
844
817
  .join('\n');
845
818
  rootShape.filter = zod_1.z
846
- .object(filterShape)
819
+ .union([zod_1.z.string(), zod_1.z.array(zod_1.z.string())])
847
820
  .optional()
848
821
  .meta({
849
- description: `Filter conditions. Each property supports operators in the format "$op:value".\nAvailable fields:\n${filterFields}`,
850
- param: {
851
- style: 'deepObject',
852
- explode: true,
853
- description: `Filter conditions using deep object notation (filter[field]=$op:value).\nAvailable fields:\n${filterFields}`,
854
- },
822
+ description: `Filter conditions. Format: "field:$op:value". Repeat for multiple conditions.\nAvailable fields:\n${filterFields}`,
823
+ example: `${Object.keys(filterable)[0]}:${Object.values(filterable)[0]?.ops[0]}:value`,
855
824
  });
856
825
  rootShape.group = zod_1.z
857
826
  .union([zod_1.z.string(), zod_1.z.array(zod_1.z.string())])
858
827
  .optional()
859
828
  .meta({
860
- description: 'Group definitions for complex filter logic. Format: "id:key=value,key=value". Keys: parent, join ($and/$or), op ($and/$or)',
861
- example: '1:parent=0,join=$and',
829
+ description: 'Group definitions for complex filter logic. Format: "id:key:value,key:value". Keys: parent, join ($and/$or), op ($and/$or)',
830
+ example: '1:parent:0,join:$and',
862
831
  });
863
832
  }
864
833
  const baseQueryParamsSchema = zod_1.z
@@ -1041,7 +1010,7 @@ function paginate(config) {
1041
1010
  ctx.addIssue({
1042
1011
  code: 'custom',
1043
1012
  path: ['groupDefs'],
1044
- message: `group is not allowed without any filter[*]`,
1013
+ message: `group is not allowed without any filter`,
1045
1014
  });
1046
1015
  }
1047
1016
  else if (hasAnyFilter) {
@@ -1 +1 @@
1
- {"version":3,"file":"paginate.js","sourceRoot":"","sources":["../src/paginate.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport {\n type AllowedPath,\n type AllowedSelectablePath,\n computeSelect,\n type DataSchema,\n type EnsureDiscriminatorInSelectable,\n expandSelect,\n findNestedDiscriminators,\n getDiscriminatorKey,\n getOwnProp,\n getZodAtPath,\n type InferData,\n isPlainObject,\n isZodSchema,\n type NoDuplicateProperties,\n type NoDuplicates,\n type Path,\n type PathValue,\n pickFromAllowlist,\n projectDataSchemaPreservingUnion,\n resolveToZodObject,\n SelectSchema,\n type TypedProjectedData,\n type UntypedSelectableConfig,\n type ZodShape,\n} from './select';\n\n/* ---------------------------------- */\n/* Querystring value types */\n/* ---------------------------------- */\n\ntype QueryStringValue = string | string[] | undefined;\n\n/* ---------------------------------- */\n/* Pagination config */\n/* ---------------------------------- */\n\ninterface LimitOffsetPaginationConfig {\n /** Pagination mode: classic limit/offset with page numbers. */\n paginationType: 'LIMIT_OFFSET';\n}\n\ninterface CursorPaginationConfig<T> {\n /** Pagination mode: cursor-based (keyset). */\n paginationType: 'CURSOR';\n /** Field used as cursor. Its Zod type determines cursor coercion (number, string, or ISO date). */\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/* Sort */\n/* ---------------------------------- */\n\nexport const SortDirectionSchema = z.enum(['ASC', 'DESC']).meta({\n description: 'Sort direction',\n});\nexport type SortDirection = z.infer<typeof SortDirectionSchema>;\n\nexport const SortItemSchema = z\n .object({\n property: z.string().min(1).meta({ description: 'Field name to sort by' }),\n direction: SortDirectionSchema,\n })\n .meta({ description: 'A single sort instruction (field + direction)' });\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\n .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 .meta({\n id: 'FilterCondition',\n description: 'A single filter condition with operator, optional negation, and value',\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\n .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 .meta({\n id: 'WhereNode',\n description:\n 'Recursive filter AST node: a single filter condition, or an AND/OR group of nodes',\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 const raw = q.group;\n if (raw === undefined || raw === null) return defs;\n\n let entries: string[];\n if (Array.isArray(raw)) {\n entries = raw.filter((x): x is string => typeof x === 'string');\n } else if (typeof raw === 'string') {\n entries = [raw];\n } else {\n entries = [];\n }\n\n for (const entry of entries) {\n // Format: \"id:key=value,key=value\"\n const colonIdx = entry.indexOf(':');\n if (colonIdx === -1) continue;\n\n const idRaw = entry.slice(0, colonIdx).trim();\n const propsRaw = entry.slice(colonIdx + 1).trim();\n\n const parsedId = IntegerStringSchema.safeParse(idRaw);\n if (!parsedId.success) continue;\n const id = parsedId.data;\n\n const current = defs[id] ?? {};\n\n for (const pair of propsRaw.split(',')) {\n const eqIdx = pair.indexOf('=');\n if (eqIdx === -1) continue;\n\n const prop = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1).trim();\n\n if (prop === 'parent') {\n current.parent = IntegerStringSchema.parse(value);\n } else if (prop === 'join') {\n current.join = CombinatorSchema.parse(value);\n } else if (prop === 'op') {\n current.op = CombinatorSchema.parse(value);\n }\n }\n\n defs[id] = current;\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 toQueryStringValue(v: unknown): QueryStringValue {\n if (v === undefined) return undefined;\n if (typeof v === 'string') return v;\n if (Array.isArray(v) && v.every((x): x is string => typeof x === 'string')) return v;\n return undefined;\n}\n\nfunction extractAndNormalizeRawFilters(q: Record<string, unknown>): Record<string, Condition[]> {\n const result: Record<string, Condition[]> = {};\n\n // Handle flat keys: filter[field] (frameworks that don't parse deep objects)\n for (const [k, v] of Object.entries(q)) {\n const match = /^filter\\[([^\\]]+)\\]$/.exec(k);\n if (!match) continue;\n\n const field = (match[1] ?? '').trim();\n if (!field) continue;\n\n const rawList = toStringArrayFromQueryString(toQueryStringValue(v));\n result[field] = rawList.filter(Boolean).map(parseSingleCondition);\n }\n\n // Handle nested object: filter: { field: value } (frameworks that parse deep objects)\n const filterObj = q.filter;\n if (filterObj && typeof filterObj === 'object' && !Array.isArray(filterObj)) {\n for (const [field, v] of Object.entries(filterObj)) {\n const trimmedField = field.trim();\n if (!trimmedField) continue;\n // Skip if already found via flat keys\n if (result[trimmedField]) continue;\n\n const rawList = toStringArrayFromQueryString(toQueryStringValue(v));\n result[trimmedField] = rawList.filter(Boolean).map(parseSingleCondition);\n }\n }\n\n return result;\n}\n\ninterface FilterableFieldConfig<TKind extends FieldType> {\n type: TKind;\n ops: readonly OpsForFieldType<TKind>[];\n}\n\n/** Configuration shared by all pagination modes. */\nexport interface CommonQueryConfigFromSchema<\n TSchema extends DataSchema,\n TSelectable extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n> {\n /** Zod schema representing one data item (object, discriminated union, or union). */\n dataSchema: TSchema;\n\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: readonly TSelectable[];\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. Subset of selectable. */\n decorative?: readonly AllowedPath<TSchema>[];\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: readonly AllowedPath<TSchema>[];\n\n /** Map of filterable fields to their allowed type and operators. Enables the `filter[*]` query parameters. */\n filterable?: Partial<{\n [P in AllowedPath<TSchema>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: readonly { property: AllowedPath<TSchema>; direction: SortDirection }[];\n /** Default number of items per page when `limit` is omitted. */\n defaultLimit: number;\n\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: readonly TSelectable[] | '*';\n /** Maximum allowed value for `limit`. Requests exceeding this are rejected. */\n maxLimit: number;\n}\n\n/**\n * Full query config type, which includes pagination-specific properties depending on the pagination type.\n */\nexport type QueryConfigFromSchema<\n TSchema extends DataSchema,\n TSelectable extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n> = CommonQueryConfigFromSchema<TSchema, TSelectable> &\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\nfunction computeLimit(limit: number | undefined, defaultLimit: number): number {\n if (typeof limit === 'number') return limit;\n return defaultLimit;\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\n switch (cond.op) {\n case '$null':\n return null;\n\n case '$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 case '$ilike':\n case '$sw':\n if (expected !== 'string')\n return `Field \"${field}\" does not support \"${cond.op}\" (configured as ${expected})`;\n return null;\n\n case '$in':\n case '$contains':\n return null;\n\n case '$gt':\n case '$gte':\n case '$lt':\n case '$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 case '$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}\n\n/* ---------------------------------- */\n/* Sort defaults */\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: Pick<CommonQueryConfigFromSchema<TSchema>, 'sortable' | 'defaultSortBy'>,\n): SortItemTyped<TSchema>[] | undefined {\n if (sortByRaw) {\n const cleaned = sortByRaw.map((s) => s.trim()).filter(Boolean);\n if (cleaned.length > 0) {\n const seen = new Set<string>();\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 if (seen.has(picked)) continue;\n seen.add(picked);\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 /** Subset of `select` that are decorative (not from DB, added manually). */\n decorativeSelect?: 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 /** Subset of `select` that are decorative (not from DB, added manually). */\n decorativeSelect?: AllowedPath<TSchema>[];\n filters?: WhereNode;\n}\n\nexport type PaginationType = 'LIMIT_OFFSET' | 'CURSOR';\n\nexport type PaginationPayload<\n TSchema extends DataSchema,\n TType extends PaginationType = PaginationType,\n> = TType extends 'LIMIT_OFFSET'\n ? LimitOffsetPaginationPayload<TSchema>\n : TType extends 'CURSOR'\n ? CursorPaginationPayload<TSchema>\n : never;\n\nexport interface PaginationQueryParams<\n TSchema extends DataSchema,\n TType extends PaginationType = PaginationType,\n> {\n pagination: PaginationPayload<TSchema, TType>;\n}\n\n/* ---------------------------------- */\n/* Validator response types */\n/* ---------------------------------- */\n\nexport interface LimitOffsetPaginationResponseMeta {\n itemsPerPage: number;\n totalItems: number;\n currentPage: number;\n totalPages: number;\n sortBy?: { property: string; direction: SortDirection }[];\n filter?: WhereNode;\n}\n\nexport interface CursorPaginationResponseMeta {\n itemsPerPage: number;\n cursor: number | string | Date;\n sortBy?: { property: string; direction: SortDirection }[];\n filter?: WhereNode;\n}\n\nexport interface LimitOffsetPaginationResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> {\n data: TypedProjectedData<TSchema, TSelect>[];\n pagination: LimitOffsetPaginationResponseMeta;\n}\n\nexport interface CursorPaginationResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> {\n data: TypedProjectedData<TSchema, TSelect>[];\n pagination: CursorPaginationResponseMeta;\n}\n\nexport type PaginationResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n TType extends PaginationType = PaginationType,\n> = TType extends 'LIMIT_OFFSET'\n ? LimitOffsetPaginationResponse<TSchema, TSelect>\n : TType extends 'CURSOR'\n ? CursorPaginationResponse<TSchema, TSelect>\n : never;\n\n/* ---------------------------------- */\n/* Response schema shapes (ZodObject) */\n/* ---------------------------------- */\n\n/**\n * Re-exported from select.ts for use in paginate response schema shapes.\n */\n// ZodShape is imported from './select' and used locally only.\n\ninterface LimitOffsetPaginationMetaSchemaShapeDef {\n itemsPerPage: z.ZodNumber;\n totalItems: z.ZodNumber;\n currentPage: z.ZodNumber;\n totalPages: z.ZodNumber;\n sortBy: z.ZodOptional<z.ZodArray<z.ZodObject<z.ZodRawShape>>>;\n filter: z.ZodOptional<z.ZodType<WhereNode>>;\n}\nexport type LimitOffsetPaginationMetaSchemaShape =\n ZodShape<LimitOffsetPaginationMetaSchemaShapeDef>;\n\ninterface CursorPaginationMetaSchemaShapeDef {\n itemsPerPage: z.ZodNumber;\n cursor: z.ZodType<number | string | Date>;\n sortBy: z.ZodOptional<z.ZodArray<z.ZodObject<z.ZodRawShape>>>;\n filter: z.ZodOptional<z.ZodType<WhereNode>>;\n}\nexport type CursorPaginationMetaSchemaShape = ZodShape<CursorPaginationMetaSchemaShapeDef>;\n\ntype PaginatedDataSchema =\n | z.ZodArray<z.ZodObject<z.ZodRawShape>>\n | z.ZodArray<z.ZodUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>>;\n\ninterface LimitOffsetResponseSchemaShapeDef {\n data: PaginatedDataSchema;\n pagination: z.ZodObject<LimitOffsetPaginationMetaSchemaShape>;\n}\nexport type LimitOffsetResponseSchemaShape = ZodShape<LimitOffsetResponseSchemaShapeDef>;\n\ninterface CursorResponseSchemaShapeDef {\n data: PaginatedDataSchema;\n pagination: z.ZodObject<CursorPaginationMetaSchemaShape>;\n}\nexport type CursorResponseSchemaShape = ZodShape<CursorResponseSchemaShapeDef>;\n\nexport type PaginationResponseSchemaShape<TType extends PaginationType> =\n TType extends 'LIMIT_OFFSET'\n ? LimitOffsetResponseSchemaShape\n : TType extends 'CURSOR'\n ? CursorResponseSchemaShape\n : LimitOffsetResponseSchemaShape | CursorResponseSchemaShape;\n\n/**\n * Result type returned by `paginate()`. Use this instead of\n * `ReturnType<typeof paginate>` to preserve the generic `TSchema`.\n *\n * @example\n * function createPaginator(): PaginateResult<typeof MySchema> {\n * return paginate({ dataSchema: MySchema, … });\n * }\n */\nexport interface PaginateResult<\n TSchema extends DataSchema,\n TType extends PaginationType = PaginationType,\n> {\n queryParamsSchema: {\n (): z.ZodType<PaginationQueryParams<TSchema, TType>>;\n <TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<PaginationQueryParams<TSchema, TType> & z.infer<z.ZodObject<TExtraShape>>>;\n };\n validatorSchema: (\n parsed?: PaginationPayload<TSchema>,\n ) => z.ZodType<PaginationResponse<TSchema, AllowedPath<TSchema>, TType>>;\n responseSchema: z.ZodObject<PaginationResponseSchemaShape<TType>>;\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<number | string | Date> {\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/* Response schema builders */\n/* ---------------------------------- */\n\ninterface LimitOffsetResponseSchemaParts {\n itemsPerPage: z.ZodNumber;\n totalItems: z.ZodNumber;\n currentPage: z.ZodNumber;\n totalPages: z.ZodNumber;\n sortBy: z.ZodOptional<z.ZodArray<z.ZodObject<z.ZodRawShape>>>;\n filter: z.ZodOptional<z.ZodType<WhereNode>>;\n metaDescription: string;\n}\n\nfunction buildLimitOffsetResponseSchema(\n dataItemSchema: z.ZodType,\n parts: LimitOffsetResponseSchemaParts,\n): z.ZodObject<LimitOffsetResponseSchemaShape>;\nfunction buildLimitOffsetResponseSchema(\n dataItemSchema: z.ZodType,\n parts: LimitOffsetResponseSchemaParts,\n): z.ZodType {\n return z.object({\n data: z.array(dataItemSchema),\n pagination: z\n .object({\n itemsPerPage: parts.itemsPerPage,\n totalItems: parts.totalItems,\n currentPage: parts.currentPage,\n totalPages: parts.totalPages,\n sortBy: parts.sortBy,\n filter: parts.filter,\n })\n .meta({ description: parts.metaDescription }),\n });\n}\n\ninterface CursorResponseSchemaParts {\n itemsPerPage: z.ZodNumber;\n cursor: z.ZodType<number | string | Date>;\n sortBy: z.ZodOptional<z.ZodArray<z.ZodObject<z.ZodRawShape>>>;\n filter: z.ZodOptional<z.ZodType<WhereNode>>;\n metaDescription: string;\n cursorValueDescription: string;\n}\n\nfunction buildCursorResponseSchema(\n dataItemSchema: z.ZodType,\n parts: CursorResponseSchemaParts,\n): z.ZodObject<CursorResponseSchemaShape>;\nfunction buildCursorResponseSchema(\n dataItemSchema: z.ZodType,\n parts: CursorResponseSchemaParts,\n): z.ZodType {\n return z.object({\n data: z.array(dataItemSchema),\n pagination: z\n .object({\n itemsPerPage: parts.itemsPerPage,\n cursor: parts.cursor.meta({ description: parts.cursorValueDescription }),\n sortBy: parts.sortBy,\n filter: parts.filter,\n })\n .meta({ description: parts.metaDescription }),\n });\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 * - `responseSchema`: A pre-built Zod schema for validating the response (uses defaultSelect or all selectable fields).\n */\nexport function paginate<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TSortable extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSortBy extends readonly {\n property: NoInfer<TSelectable[number]>;\n direction: SortDirection;\n }[] = readonly { property: NoInfer<TSelectable[number]>; direction: SortDirection }[],\n>(\n config: Omit<\n CommonQueryConfigFromSchema<TSchema, TSelectable[number]>,\n 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'\n > &\n LimitOffsetPaginationConfig & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */\n decorative?: readonly NoInfer<TSelectable[number]>[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: NoDuplicates<TSortable>;\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;\n /** Map of filterable fields to their allowed type and operators. Enables the `filter[*]` query parameters. */\n filterable?: Partial<{\n [P in NoInfer<TSelectable[number]>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n },\n): PaginateResult<TSchema, 'LIMIT_OFFSET'>;\n\nexport function paginate<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TSortable extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSortBy extends readonly {\n property: NoInfer<TSelectable[number]>;\n direction: SortDirection;\n }[] = readonly { property: NoInfer<TSelectable[number]>; direction: SortDirection }[],\n>(\n config: Omit<\n CommonQueryConfigFromSchema<TSchema, TSelectable[number]>,\n 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'\n > &\n CursorPaginationConfig<InferData<TSchema>> & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */\n decorative?: readonly NoInfer<TSelectable[number]>[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: NoDuplicates<TSortable>;\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;\n /** Map of filterable fields to their allowed type and operators. Enables the `filter[*]` query parameters. */\n filterable?: Partial<{\n [P in NoInfer<TSelectable[number]>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n },\n): PaginateResult<TSchema, 'CURSOR'>;\n\nexport function paginate<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TSortable extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSortBy extends readonly {\n property: NoInfer<TSelectable[number]>;\n direction: SortDirection;\n }[] = readonly { property: NoInfer<TSelectable[number]>; direction: SortDirection }[],\n>(\n config: Omit<\n CommonQueryConfigFromSchema<TSchema, TSelectable[number]>,\n 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'\n > & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */\n decorative?: readonly NoInfer<TSelectable[number]>[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: NoDuplicates<TSortable>;\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;\n /** Map of filterable fields to their allowed type and operators. Enables the `filter[*]` query parameters. */\n filterable?: Partial<{\n [P in NoInfer<TSelectable[number]>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n } & (LimitOffsetPaginationConfig | CursorPaginationConfig<InferData<TSchema>>),\n): PaginateResult<TSchema>;\n\nexport function paginate<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TDecorative extends readonly NoInfer<TSelectable[number]>[] = readonly [],\n const TSortable extends readonly Exclude<NoInfer<TSelectable[number]>, TDecorative[number]>[] =\n readonly Exclude<NoInfer<TSelectable[number]>, TDecorative[number]>[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSortBy extends readonly {\n property: Exclude<NoInfer<TSelectable[number]>, TDecorative[number]>;\n direction: SortDirection;\n }[] = readonly {\n property: Exclude<NoInfer<TSelectable[number]>, TDecorative[number]>;\n direction: SortDirection;\n }[],\n>(\n config: Omit<\n CommonQueryConfigFromSchema<TSchema, TSelectable[number]>,\n 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'\n > & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */\n decorative?: NoDuplicates<TDecorative>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: NoDuplicates<TSortable>;\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;\n /** Map of filterable fields to their allowed type and operators. Enables the `filter[*]` query parameters. */\n filterable?: Partial<{\n [P in Exclude<TSelectable[number], TDecorative[number]>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n } & (LimitOffsetPaginationConfig | CursorPaginationConfig<InferData<TSchema>>),\n): PaginateResult<TSchema> {\n const discriminatorKey = getDiscriminatorKey(config.dataSchema);\n const nestedDiscriminators = findNestedDiscriminators(config.dataSchema);\n\n const selectableStrings: string[] = [...config.selectable];\n\n const effectiveConfig: UntypedSelectableConfig = {\n selectable: selectableStrings,\n defaultSelect: config.defaultSelect === '*' ? '*' : Array.from(config.defaultSelect, String),\n };\n\n const allowedSelectable = new Set<string>(selectableStrings);\n const decorativeSet = new Set<string>((config.decorative ?? []).map(String));\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 const filterableOps = new Map(Object.entries(filterable).map(([k, v]) => [k, new Set(v.ops)]));\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: SelectSchema.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 /*\n * Build the root ZodObject with explicit named properties so that\n * OpenAPI tooling (zod-openapi, fastify-zod-openapi) can introspect\n * the query parameters. Filter fields use bracket notation (filter[field])\n * and group uses a repeated \"group\" param. The actual validation/transforms\n * happen in the piped baseSchema below.\n */\n const rootShape: Record<string, z.ZodType> = {\n limit: z\n .string()\n .optional()\n .meta({\n description: `Maximum number of items to return per page (default: ${String(config.defaultLimit)}, max: ${String(config.maxLimit)})`,\n example: String(config.defaultLimit),\n }),\n };\n\n if (config.paginationType === 'LIMIT_OFFSET') {\n rootShape.page = z.string().optional().meta({\n description: 'Page number (1-based)',\n example: '1',\n });\n } else {\n rootShape.cursor = z.string().optional().meta({\n description: 'Cursor value for cursor-based pagination',\n example: '42',\n });\n }\n\n if (config.sortable && config.sortable.length > 0) {\n const defaultSortDesc =\n config.defaultSortBy && config.defaultSortBy.length > 0\n ? config.defaultSortBy.map((s) => `${s.property}:${s.direction}`).join(',')\n : 'none';\n rootShape.sortBy = z\n .union([z.string(), z.array(z.string())])\n .optional()\n .meta({\n description: `Sort by field and direction. Format: \"field:ASC\" or \"field:DESC\". Allowed fields: ${config.sortable.join(', ')}. Default: ${defaultSortDesc}`,\n example: config.sortable[0] ? `${config.sortable[0]}:ASC` : undefined,\n });\n }\n\n if (config.selectable.length > 0) {\n const defaultSelectDesc =\n config.defaultSelect === '*' ? '*' : [...config.defaultSelect].join(',');\n rootShape.select = z\n .string()\n .optional()\n .meta({\n description: `Comma-separated list of fields to return. Use \"*\" for all. Allowed fields: ${config.selectable.join(', ')}. Default: ${defaultSelectDesc}`,\n example: defaultSelectDesc,\n });\n }\n\n // Add filter as a deep object and group param only when filterable is configured\n if (config.filterable) {\n const filterShape: Record<string, z.ZodType> = {};\n for (const [field, def] of Object.entries(filterable)) {\n const ops = def.ops.join(', ');\n filterShape[field] = z\n .union([z.string(), z.array(z.string())])\n .optional()\n .meta({\n description: `Filter on \"${field}\" (${def.type}). Supported operators: ${ops}. Format: \"$op:value\"`,\n example: `${def.ops[0]}:value`,\n });\n }\n const filterFields = Object.entries(filterable)\n .map(([field, def]) => ` - ${field} (${def.type}): ${def.ops.join(', ')}`)\n .join('\\n');\n\n rootShape.filter = z\n .object(filterShape)\n .optional()\n .meta({\n description: `Filter conditions. Each property supports operators in the format \"$op:value\".\\nAvailable fields:\\n${filterFields}`,\n param: {\n style: 'deepObject',\n explode: true,\n description: `Filter conditions using deep object notation (filter[field]=$op:value).\\nAvailable fields:\\n${filterFields}`,\n },\n });\n\n rootShape.group = z\n .union([z.string(), z.array(z.string())])\n .optional()\n .meta({\n description:\n 'Group definitions for complex filter logic. Format: \"id:key=value,key=value\". Keys: parent, join ($and/$or), op ($and/$or)',\n example: '1:parent=0,join=$and',\n });\n }\n\n const baseQueryParamsSchema: z.ZodType<PaginationQueryParams<TSchema>> = z\n .object(rootShape)\n .catchall(z.unknown())\n .transform(\n (\n q,\n ): Record<string, unknown> & {\n rawFilters: Record<string, Condition[]>;\n groupDefs: GroupDefs;\n } => {\n return {\n ...q,\n rawFilters: extractAndNormalizeRawFilters(q),\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 (typeof val.limit === 'number' && val.limit > config.maxLimit) {\n ctx.addIssue({\n code: 'custom',\n path: ['limit'],\n message: `limit must be <= ${config.maxLimit}`,\n });\n }\n\n // select allowlist + \"*\" expandability\n const selectForValidation: readonly string[] =\n val.select ??\n (effectiveConfig.defaultSelect === '*' ? ['*'] : effectiveConfig.defaultSelect);\n\n const hasWildcard = selectForValidation.includes('*');\n\n {\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 (hasWildcard) {\n const expanded = expandSelect(selectForValidation, effectiveConfig);\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 if (\n discriminatorKey &&\n !hasWildcard &&\n !selectForValidation.includes(discriminatorKey)\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['select'],\n message: `select must include the discriminator field \"${discriminatorKey}\" when using a discriminated union`,\n });\n }\n\n // Check nested discriminated unions\n if (!hasWildcard) {\n for (const nested of nestedDiscriminators) {\n const hasAnyFieldUnderPrefix =\n nested.prefix === ''\n ? selectForValidation.length > 0\n : selectForValidation.some(\n (f) => f === nested.prefix || f.startsWith(`${nested.prefix}.`),\n );\n if (\n hasAnyFieldUnderPrefix &&\n !selectForValidation.includes(nested.discriminatorPath)\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['select'],\n message: `select must include the discriminator field \"${nested.discriminatorPath}\" when selecting fields under \"${nested.prefix}\" (discriminated union)`,\n });\n }\n }\n }\n }\n\n // sort allowlist\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 {\n const cleaned = val.sortBy.map((s) => s.trim()).filter(Boolean);\n let index = 0;\n for (const raw of cleaned) {\n const parsed = parseSortItem(raw);\n if (!allowedSortable.has(parsed.property)) {\n ctx.addIssue({\n code: 'custom',\n path: ['sortBy', index],\n message: `sort property \"${parsed.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 = filterableOps.get(field) ?? new Set<Operator>();\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.defaultLimit);\n const sortBy = computeSortBy(val.sortBy, config);\n const rawSelect = computeSelect(val.select, effectiveConfig);\n const select = rawSelect?.filter(\n (field): field is AllowedPath<TSchema> => typeof field === 'string',\n );\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 const decorativeSelect = select?.filter((f) => decorativeSet.has(f));\n return {\n pagination: {\n type: 'LIMIT_OFFSET',\n limit,\n page: val.page,\n sortBy,\n select,\n ...(decorativeSelect && decorativeSelect.length > 0 ? { decorativeSelect } : {}),\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 const decorativeSelect = select?.filter((f) => decorativeSet.has(f));\n return {\n pagination: {\n type: 'CURSOR',\n limit,\n cursor,\n cursorProperty: config.cursorProperty,\n sortBy,\n select,\n ...(decorativeSelect && decorativeSelect.length > 0 ? { decorativeSelect } : {}),\n ...maybeFilters,\n },\n };\n }),\n );\n\n const sortByResponseSchema = z\n .array(\n z.object({\n property: z.string(),\n direction: SortDirectionSchema,\n }),\n )\n .optional()\n .meta({ description: 'Applied sort order' });\n\n const filterResponseSchema = WhereNodeSchema.optional().meta({\n description: 'Applied filter AST',\n });\n\n const itemsPerPageSchema = z.number().meta({ description: 'Number of items returned per page' });\n const totalItemsSchema = z\n .number()\n .meta({ description: 'Total number of items matching the query' });\n const currentPageSchema = z.number().meta({ description: 'Current page number (1-based)' });\n const totalPagesSchema = z.number().min(1).meta({ description: 'Total number of pages' });\n\n const LIMIT_OFFSET_META_DESC = 'Pagination metadata for limit/offset mode';\n const CURSOR_META_DESC = 'Pagination metadata for cursor mode';\n const CURSOR_VALUE_DESC = 'Cursor value pointing to the last item returned';\n\n function validatorSchema(\n parsed?: PaginationPayload<TSchema>,\n ): z.ZodType<PaginationResponse<TSchema, AllowedPath<TSchema>>>;\n function validatorSchema(parsed?: PaginationPayload<TSchema>): z.ZodType {\n const effectiveSelect =\n parsed?.select ?? computeSelect(undefined, effectiveConfig) ?? undefined;\n\n const dataItemSchema =\n effectiveSelect && effectiveSelect.length > 0\n ? projectDataSchemaPreservingUnion(config.dataSchema, effectiveSelect.map(String))\n : resolveToZodObject(config.dataSchema);\n\n if (config.paginationType === 'LIMIT_OFFSET') {\n return z.object({\n data: z.array(dataItemSchema),\n pagination: z\n .object({\n itemsPerPage: itemsPerPageSchema,\n totalItems: totalItemsSchema,\n currentPage: currentPageSchema,\n totalPages: totalPagesSchema,\n sortBy: sortByResponseSchema,\n filter: filterResponseSchema,\n })\n .meta({ description: LIMIT_OFFSET_META_DESC }),\n });\n }\n\n const cursorType = cursorSchemaFromProperty(config.dataSchema, config.cursorProperty);\n return z.object({\n data: z.array(dataItemSchema),\n pagination: z\n .object({\n itemsPerPage: itemsPerPageSchema,\n cursor: cursorType.meta({ description: CURSOR_VALUE_DESC }),\n sortBy: sortByResponseSchema,\n filter: filterResponseSchema,\n })\n .meta({ description: CURSOR_META_DESC }),\n });\n }\n\n const partialDataItemSchema =\n selectableStrings.length > 0\n ? projectDataSchemaPreservingUnion(config.dataSchema, selectableStrings, { partial: true })\n : resolveToZodObject(config.dataSchema);\n\n const responseSchema =\n config.paginationType === 'LIMIT_OFFSET'\n ? buildLimitOffsetResponseSchema(partialDataItemSchema, {\n itemsPerPage: itemsPerPageSchema,\n totalItems: totalItemsSchema,\n currentPage: currentPageSchema,\n totalPages: totalPagesSchema,\n sortBy: sortByResponseSchema,\n filter: filterResponseSchema,\n metaDescription: LIMIT_OFFSET_META_DESC,\n })\n : buildCursorResponseSchema(partialDataItemSchema, {\n itemsPerPage: itemsPerPageSchema,\n cursor: cursorSchemaFromProperty(config.dataSchema, config.cursorProperty),\n sortBy: sortByResponseSchema,\n filter: filterResponseSchema,\n metaDescription: CURSOR_META_DESC,\n cursorValueDescription: CURSOR_VALUE_DESC,\n });\n\n function queryParamsSchema(): z.ZodType<PaginationQueryParams<TSchema>>;\n function queryParamsSchema<TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<PaginationQueryParams<TSchema> & z.infer<z.ZodObject<TExtraShape>>>;\n function queryParamsSchema<TExtraShape extends z.ZodRawShape>(\n extraShape?: TExtraShape,\n ): z.ZodType {\n if (!extraShape) return baseQueryParamsSchema;\n\n const extraSchema = z.object(extraShape);\n return z\n .object({ ...rootShape, ...extraShape })\n .catchall(z.unknown())\n .superRefine((raw, ctx) => {\n const pagResult = baseQueryParamsSchema.safeParse(raw);\n if (!pagResult.success) {\n for (const issue of pagResult.error.issues) {\n ctx.addIssue({ code: 'custom', message: issue.message, path: issue.path });\n }\n }\n const extraResult = extraSchema.safeParse(raw);\n if (!extraResult.success) {\n for (const issue of extraResult.error.issues) {\n ctx.addIssue({ code: 'custom', message: issue.message, path: issue.path });\n }\n }\n })\n .transform((raw) => ({\n ...baseQueryParamsSchema.parse(raw),\n ...extraSchema.parse(raw),\n }));\n }\n\n return { queryParamsSchema, validatorSchema, responseSchema };\n}\n"]}
1
+ {"version":3,"file":"paginate.js","sourceRoot":"","sources":["../src/paginate.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport {\n type AllowedPath,\n type AllowedSelectablePath,\n computeSelect,\n type DataSchema,\n type EnsureDiscriminatorInSelectable,\n expandSelect,\n findNestedDiscriminators,\n getDiscriminatorKey,\n getOwnProp,\n getZodAtPath,\n type InferData,\n isPlainObject,\n isZodSchema,\n type NoDuplicateProperties,\n type NoDuplicates,\n type Path,\n type PathValue,\n pickFromAllowlist,\n projectDataSchemaPreservingUnion,\n resolveToZodObject,\n SelectSchema,\n type TypedProjectedData,\n type UntypedSelectableConfig,\n type ZodShape,\n} from './select';\n\n/* ---------------------------------- */\n/* Pagination config */\n/* ---------------------------------- */\n\ninterface LimitOffsetPaginationConfig {\n /** Pagination mode: classic limit/offset with page numbers. */\n paginationType: 'LIMIT_OFFSET';\n}\n\ninterface CursorPaginationConfig<T> {\n /** Pagination mode: cursor-based (keyset). */\n paginationType: 'CURSOR';\n /** Field used as cursor. Its Zod type determines cursor coercion (number, string, or ISO date). */\n cursorProperty: Path<T>;\n}\n\n/* ---------------------------------- */\n/* Common input normalizers */\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/* Sort */\n/* ---------------------------------- */\n\nexport const SortDirectionSchema = z.enum(['ASC', 'DESC']).meta({\n description: 'Sort direction',\n});\nexport type SortDirection = z.infer<typeof SortDirectionSchema>;\n\nexport const SortItemSchema = z\n .object({\n property: z.string().min(1).meta({ description: 'Field name to sort by' }),\n direction: SortDirectionSchema,\n })\n .meta({ description: 'A single sort instruction (field + direction)' });\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\n .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 .meta({\n id: 'FilterCondition',\n description: 'A single filter condition with operator, optional negation, and value',\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\n .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 .meta({\n id: 'WhereNode',\n description:\n 'Recursive filter AST node: a single filter condition, or an AND/OR group of nodes',\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 const raw = q.group;\n if (raw === undefined || raw === null) return defs;\n\n let entries: string[];\n if (Array.isArray(raw)) {\n entries = raw.filter((x): x is string => typeof x === 'string');\n } else if (typeof raw === 'string') {\n entries = [raw];\n } else {\n entries = [];\n }\n\n for (const entry of entries) {\n // Format: \"id:key:value,key:value\"\n const colonIdx = entry.indexOf(':');\n if (colonIdx === -1) continue;\n\n const idRaw = entry.slice(0, colonIdx).trim();\n const propsRaw = entry.slice(colonIdx + 1).trim();\n\n const parsedId = IntegerStringSchema.safeParse(idRaw);\n if (!parsedId.success) continue;\n const id = parsedId.data;\n\n const current = defs[id] ?? {};\n\n for (const pair of propsRaw.split(',')) {\n const pairColonIdx = pair.indexOf(':');\n if (pairColonIdx === -1) continue;\n\n const prop = pair.slice(0, pairColonIdx).trim();\n const value = pair.slice(pairColonIdx + 1).trim();\n\n if (prop === 'parent') {\n current.parent = IntegerStringSchema.parse(value);\n } else if (prop === 'join') {\n current.join = CombinatorSchema.parse(value);\n } else if (prop === 'op') {\n current.op = CombinatorSchema.parse(value);\n }\n }\n\n defs[id] = current;\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 DSL string into a Condition (e.g. \"$eq:active\", \"$g:1:$or:$eq:value\"). */\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: Record<string, unknown>): Record<string, Condition[]> {\n const result: Record<string, Condition[]> = {};\n\n const raw = q.filter;\n if (raw === undefined || raw === null) return result;\n\n let entries: string[];\n if (Array.isArray(raw)) {\n entries = raw.filter((x): x is string => typeof x === 'string');\n } else if (typeof raw === 'string') {\n entries = [raw];\n } else {\n entries = [];\n }\n\n for (const entry of entries) {\n // Format: \"field:$op:value\" — first colon separates field from DSL\n const colonIdx = entry.indexOf(':');\n if (colonIdx === -1) continue;\n\n const field = entry.slice(0, colonIdx).trim();\n if (!field) continue;\n\n const dsl = entry.slice(colonIdx + 1);\n if (!dsl) continue;\n\n const condition = parseSingleCondition(dsl);\n const list = result[field] ?? [];\n list.push(condition);\n result[field] = list;\n }\n\n return result;\n}\n\ninterface FilterableFieldConfig<TKind extends FieldType> {\n type: TKind;\n ops: readonly OpsForFieldType<TKind>[];\n}\n\n/** Configuration shared by all pagination modes. */\nexport interface CommonQueryConfigFromSchema<\n TSchema extends DataSchema,\n TSelectable extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n> {\n /** Zod schema representing one data item (object, discriminated union, or union). */\n dataSchema: TSchema;\n\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: readonly TSelectable[];\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. Subset of selectable. */\n decorative?: readonly AllowedPath<TSchema>[];\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: readonly AllowedPath<TSchema>[];\n\n /** Map of filterable fields to their allowed type and operators. Enables the `filter` query parameter. */\n filterable?: Partial<{\n [P in AllowedPath<TSchema>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: readonly { property: AllowedPath<TSchema>; direction: SortDirection }[];\n /** Default number of items per page when `limit` is omitted. */\n defaultLimit: number;\n\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: readonly TSelectable[] | '*';\n /** Maximum allowed value for `limit`. Requests exceeding this are rejected. */\n maxLimit: number;\n}\n\n/**\n * Full query config type, which includes pagination-specific properties depending on the pagination type.\n */\nexport type QueryConfigFromSchema<\n TSchema extends DataSchema,\n TSelectable extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n> = CommonQueryConfigFromSchema<TSchema, TSelectable> &\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\nfunction computeLimit(limit: number | undefined, defaultLimit: number): number {\n if (typeof limit === 'number') return limit;\n return defaultLimit;\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\n switch (cond.op) {\n case '$null':\n return null;\n\n case '$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 case '$ilike':\n case '$sw':\n if (expected !== 'string')\n return `Field \"${field}\" does not support \"${cond.op}\" (configured as ${expected})`;\n return null;\n\n case '$in':\n case '$contains':\n return null;\n\n case '$gt':\n case '$gte':\n case '$lt':\n case '$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 case '$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}\n\n/* ---------------------------------- */\n/* Sort defaults */\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: Pick<CommonQueryConfigFromSchema<TSchema>, 'sortable' | 'defaultSortBy'>,\n): SortItemTyped<TSchema>[] | undefined {\n if (sortByRaw) {\n const cleaned = sortByRaw.map((s) => s.trim()).filter(Boolean);\n if (cleaned.length > 0) {\n const seen = new Set<string>();\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 if (seen.has(picked)) continue;\n seen.add(picked);\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 /** Subset of `select` that are decorative (not from DB, added manually). */\n decorativeSelect?: 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 /** Subset of `select` that are decorative (not from DB, added manually). */\n decorativeSelect?: AllowedPath<TSchema>[];\n filters?: WhereNode;\n}\n\nexport type PaginationType = 'LIMIT_OFFSET' | 'CURSOR';\n\nexport type PaginationPayload<\n TSchema extends DataSchema,\n TType extends PaginationType = PaginationType,\n> = TType extends 'LIMIT_OFFSET'\n ? LimitOffsetPaginationPayload<TSchema>\n : TType extends 'CURSOR'\n ? CursorPaginationPayload<TSchema>\n : never;\n\nexport interface PaginationQueryParams<\n TSchema extends DataSchema,\n TType extends PaginationType = PaginationType,\n> {\n pagination: PaginationPayload<TSchema, TType>;\n}\n\n/* ---------------------------------- */\n/* Validator response types */\n/* ---------------------------------- */\n\nexport interface LimitOffsetPaginationResponseMeta {\n itemsPerPage: number;\n totalItems: number;\n currentPage: number;\n totalPages: number;\n sortBy?: { property: string; direction: SortDirection }[];\n filter?: WhereNode;\n}\n\nexport interface CursorPaginationResponseMeta {\n itemsPerPage: number;\n cursor: number | string | Date;\n sortBy?: { property: string; direction: SortDirection }[];\n filter?: WhereNode;\n}\n\nexport interface LimitOffsetPaginationResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> {\n data: TypedProjectedData<TSchema, TSelect>[];\n pagination: LimitOffsetPaginationResponseMeta;\n}\n\nexport interface CursorPaginationResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> {\n data: TypedProjectedData<TSchema, TSelect>[];\n pagination: CursorPaginationResponseMeta;\n}\n\nexport type PaginationResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n TType extends PaginationType = PaginationType,\n> = TType extends 'LIMIT_OFFSET'\n ? LimitOffsetPaginationResponse<TSchema, TSelect>\n : TType extends 'CURSOR'\n ? CursorPaginationResponse<TSchema, TSelect>\n : never;\n\n/* ---------------------------------- */\n/* Response schema shapes (ZodObject) */\n/* ---------------------------------- */\n\n/**\n * Re-exported from select.ts for use in paginate response schema shapes.\n */\n// ZodShape is imported from './select' and used locally only.\n\ninterface LimitOffsetPaginationMetaSchemaShapeDef {\n itemsPerPage: z.ZodNumber;\n totalItems: z.ZodNumber;\n currentPage: z.ZodNumber;\n totalPages: z.ZodNumber;\n sortBy: z.ZodOptional<z.ZodArray<z.ZodObject<z.ZodRawShape>>>;\n filter: z.ZodOptional<z.ZodType<WhereNode>>;\n}\nexport type LimitOffsetPaginationMetaSchemaShape =\n ZodShape<LimitOffsetPaginationMetaSchemaShapeDef>;\n\ninterface CursorPaginationMetaSchemaShapeDef {\n itemsPerPage: z.ZodNumber;\n cursor: z.ZodType<number | string | Date>;\n sortBy: z.ZodOptional<z.ZodArray<z.ZodObject<z.ZodRawShape>>>;\n filter: z.ZodOptional<z.ZodType<WhereNode>>;\n}\nexport type CursorPaginationMetaSchemaShape = ZodShape<CursorPaginationMetaSchemaShapeDef>;\n\ntype PaginatedDataSchema =\n | z.ZodArray<z.ZodObject<z.ZodRawShape>>\n | z.ZodArray<z.ZodUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>>;\n\ninterface LimitOffsetResponseSchemaShapeDef {\n data: PaginatedDataSchema;\n pagination: z.ZodObject<LimitOffsetPaginationMetaSchemaShape>;\n}\nexport type LimitOffsetResponseSchemaShape = ZodShape<LimitOffsetResponseSchemaShapeDef>;\n\ninterface CursorResponseSchemaShapeDef {\n data: PaginatedDataSchema;\n pagination: z.ZodObject<CursorPaginationMetaSchemaShape>;\n}\nexport type CursorResponseSchemaShape = ZodShape<CursorResponseSchemaShapeDef>;\n\nexport type PaginationResponseSchemaShape<TType extends PaginationType> =\n TType extends 'LIMIT_OFFSET'\n ? LimitOffsetResponseSchemaShape\n : TType extends 'CURSOR'\n ? CursorResponseSchemaShape\n : LimitOffsetResponseSchemaShape | CursorResponseSchemaShape;\n\n/**\n * Result type returned by `paginate()`. Use this instead of\n * `ReturnType<typeof paginate>` to preserve the generic `TSchema`.\n *\n * @example\n * function createPaginator(): PaginateResult<typeof MySchema> {\n * return paginate({ dataSchema: MySchema, … });\n * }\n */\nexport interface PaginateResult<\n TSchema extends DataSchema,\n TType extends PaginationType = PaginationType,\n> {\n queryParamsSchema: {\n (): z.ZodType<PaginationQueryParams<TSchema, TType>>;\n <TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<PaginationQueryParams<TSchema, TType> & z.infer<z.ZodObject<TExtraShape>>>;\n };\n validatorSchema: (\n parsed?: PaginationPayload<TSchema>,\n ) => z.ZodType<PaginationResponse<TSchema, AllowedPath<TSchema>, TType>>;\n responseSchema: z.ZodObject<PaginationResponseSchemaShape<TType>>;\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<number | string | Date> {\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/* Response schema builders */\n/* ---------------------------------- */\n\ninterface LimitOffsetResponseSchemaParts {\n itemsPerPage: z.ZodNumber;\n totalItems: z.ZodNumber;\n currentPage: z.ZodNumber;\n totalPages: z.ZodNumber;\n sortBy: z.ZodOptional<z.ZodArray<z.ZodObject<z.ZodRawShape>>>;\n filter: z.ZodOptional<z.ZodType<WhereNode>>;\n metaDescription: string;\n}\n\nfunction buildLimitOffsetResponseSchema(\n dataItemSchema: z.ZodType,\n parts: LimitOffsetResponseSchemaParts,\n): z.ZodObject<LimitOffsetResponseSchemaShape>;\nfunction buildLimitOffsetResponseSchema(\n dataItemSchema: z.ZodType,\n parts: LimitOffsetResponseSchemaParts,\n): z.ZodType {\n return z.object({\n data: z.array(dataItemSchema),\n pagination: z\n .object({\n itemsPerPage: parts.itemsPerPage,\n totalItems: parts.totalItems,\n currentPage: parts.currentPage,\n totalPages: parts.totalPages,\n sortBy: parts.sortBy,\n filter: parts.filter,\n })\n .meta({ description: parts.metaDescription }),\n });\n}\n\ninterface CursorResponseSchemaParts {\n itemsPerPage: z.ZodNumber;\n cursor: z.ZodType<number | string | Date>;\n sortBy: z.ZodOptional<z.ZodArray<z.ZodObject<z.ZodRawShape>>>;\n filter: z.ZodOptional<z.ZodType<WhereNode>>;\n metaDescription: string;\n cursorValueDescription: string;\n}\n\nfunction buildCursorResponseSchema(\n dataItemSchema: z.ZodType,\n parts: CursorResponseSchemaParts,\n): z.ZodObject<CursorResponseSchemaShape>;\nfunction buildCursorResponseSchema(\n dataItemSchema: z.ZodType,\n parts: CursorResponseSchemaParts,\n): z.ZodType {\n return z.object({\n data: z.array(dataItemSchema),\n pagination: z\n .object({\n itemsPerPage: parts.itemsPerPage,\n cursor: parts.cursor.meta({ description: parts.cursorValueDescription }),\n sortBy: parts.sortBy,\n filter: parts.filter,\n })\n .meta({ description: parts.metaDescription }),\n });\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 * - `responseSchema`: A pre-built Zod schema for validating the response (uses defaultSelect or all selectable fields).\n */\nexport function paginate<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TSortable extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSortBy extends readonly {\n property: NoInfer<TSelectable[number]>;\n direction: SortDirection;\n }[] = readonly { property: NoInfer<TSelectable[number]>; direction: SortDirection }[],\n>(\n config: Omit<\n CommonQueryConfigFromSchema<TSchema, TSelectable[number]>,\n 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'\n > &\n LimitOffsetPaginationConfig & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */\n decorative?: readonly NoInfer<TSelectable[number]>[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: NoDuplicates<TSortable>;\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;\n /** Map of filterable fields to their allowed type and operators. Enables the `filter` query parameter. */\n filterable?: Partial<{\n [P in NoInfer<TSelectable[number]>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n },\n): PaginateResult<TSchema, 'LIMIT_OFFSET'>;\n\nexport function paginate<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TSortable extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSortBy extends readonly {\n property: NoInfer<TSelectable[number]>;\n direction: SortDirection;\n }[] = readonly { property: NoInfer<TSelectable[number]>; direction: SortDirection }[],\n>(\n config: Omit<\n CommonQueryConfigFromSchema<TSchema, TSelectable[number]>,\n 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'\n > &\n CursorPaginationConfig<InferData<TSchema>> & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */\n decorative?: readonly NoInfer<TSelectable[number]>[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: NoDuplicates<TSortable>;\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;\n /** Map of filterable fields to their allowed type and operators. Enables the `filter` query parameter. */\n filterable?: Partial<{\n [P in NoInfer<TSelectable[number]>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n },\n): PaginateResult<TSchema, 'CURSOR'>;\n\nexport function paginate<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TSortable extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSortBy extends readonly {\n property: NoInfer<TSelectable[number]>;\n direction: SortDirection;\n }[] = readonly { property: NoInfer<TSelectable[number]>; direction: SortDirection }[],\n>(\n config: Omit<\n CommonQueryConfigFromSchema<TSchema, TSelectable[number]>,\n 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'\n > & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */\n decorative?: readonly NoInfer<TSelectable[number]>[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: NoDuplicates<TSortable>;\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;\n /** Map of filterable fields to their allowed type and operators. Enables the `filter` query parameter. */\n filterable?: Partial<{\n [P in NoInfer<TSelectable[number]>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n } & (LimitOffsetPaginationConfig | CursorPaginationConfig<InferData<TSchema>>),\n): PaginateResult<TSchema>;\n\nexport function paginate<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TDecorative extends readonly NoInfer<TSelectable[number]>[] = readonly [],\n const TSortable extends readonly Exclude<NoInfer<TSelectable[number]>, TDecorative[number]>[] =\n readonly Exclude<NoInfer<TSelectable[number]>, TDecorative[number]>[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n const TDefaultSortBy extends readonly {\n property: Exclude<NoInfer<TSelectable[number]>, TDecorative[number]>;\n direction: SortDirection;\n }[] = readonly {\n property: Exclude<NoInfer<TSelectable[number]>, TDecorative[number]>;\n direction: SortDirection;\n }[],\n>(\n config: Omit<\n CommonQueryConfigFromSchema<TSchema, TSelectable[number]>,\n 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'\n > & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */\n decorative?: NoDuplicates<TDecorative>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */\n sortable?: NoDuplicates<TSortable>;\n /** Default sort order applied when `sortBy` is omitted from the query. */\n defaultSortBy?: NoDuplicateProperties<TDefaultSortBy>;\n /** Map of filterable fields to their allowed type and operators. Enables the `filter` query parameter. */\n filterable?: Partial<{\n [P in Exclude<TSelectable[number], TDecorative[number]>]: FilterableFieldConfig<\n FieldTypeFromValue<PathValue<InferData<TSchema>, P>>\n >;\n }>;\n } & (LimitOffsetPaginationConfig | CursorPaginationConfig<InferData<TSchema>>),\n): PaginateResult<TSchema> {\n const discriminatorKey = getDiscriminatorKey(config.dataSchema);\n const nestedDiscriminators = findNestedDiscriminators(config.dataSchema);\n\n const selectableStrings: string[] = [...config.selectable];\n\n const effectiveConfig: UntypedSelectableConfig = {\n selectable: selectableStrings,\n defaultSelect: config.defaultSelect === '*' ? '*' : Array.from(config.defaultSelect, String),\n };\n\n const allowedSelectable = new Set<string>(selectableStrings);\n const decorativeSet = new Set<string>((config.decorative ?? []).map(String));\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 const filterableOps = new Map(Object.entries(filterable).map(([k, v]) => [k, new Set(v.ops)]));\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: SelectSchema.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 /*\n * Build the root ZodObject with explicit named properties so that\n * OpenAPI tooling (zod-openapi, fastify-zod-openapi) can introspect\n * the query parameters. Both \"filter\" and \"group\" are repeated params\n * (type: array of strings). The actual validation/transforms happen\n * in the piped baseSchema below.\n */\n const rootShape: Record<string, z.ZodType> = {\n limit: z\n .string()\n .optional()\n .meta({\n description: `Maximum number of items to return per page (default: ${String(config.defaultLimit)}, max: ${String(config.maxLimit)})`,\n example: String(config.defaultLimit),\n }),\n };\n\n if (config.paginationType === 'LIMIT_OFFSET') {\n rootShape.page = z.string().optional().meta({\n description: 'Page number (1-based)',\n example: '1',\n });\n } else {\n rootShape.cursor = z.string().optional().meta({\n description: 'Cursor value for cursor-based pagination',\n example: '42',\n });\n }\n\n if (config.sortable && config.sortable.length > 0) {\n const defaultSortDesc =\n config.defaultSortBy && config.defaultSortBy.length > 0\n ? config.defaultSortBy.map((s) => `${s.property}:${s.direction}`).join(',')\n : 'none';\n rootShape.sortBy = z\n .union([z.string(), z.array(z.string())])\n .optional()\n .meta({\n description: `Sort by field and direction. Format: \"field:ASC\" or \"field:DESC\". Allowed fields: ${config.sortable.join(', ')}. Default: ${defaultSortDesc}`,\n example: config.sortable[0] ? `${config.sortable[0]}:ASC` : undefined,\n });\n }\n\n if (config.selectable.length > 0) {\n const defaultSelectDesc =\n config.defaultSelect === '*' ? '*' : [...config.defaultSelect].join(',');\n rootShape.select = z\n .string()\n .optional()\n .meta({\n description: `Comma-separated list of fields to return. Use \"*\" for all. Allowed fields: ${config.selectable.join(', ')}. Default: ${defaultSelectDesc}`,\n example: defaultSelectDesc,\n });\n }\n\n // Add filter and group params only when filterable is configured\n if (config.filterable) {\n const filterFields = Object.entries(filterable)\n .map(([field, def]) => ` - ${field} (${def.type}): ${def.ops.join(', ')}`)\n .join('\\n');\n\n rootShape.filter = z\n .union([z.string(), z.array(z.string())])\n .optional()\n .meta({\n description: `Filter conditions. Format: \"field:$op:value\". Repeat for multiple conditions.\\nAvailable fields:\\n${filterFields}`,\n example: `${Object.keys(filterable)[0]}:${Object.values(filterable)[0]?.ops[0]}:value`,\n });\n\n rootShape.group = z\n .union([z.string(), z.array(z.string())])\n .optional()\n .meta({\n description:\n 'Group definitions for complex filter logic. Format: \"id:key:value,key:value\". Keys: parent, join ($and/$or), op ($and/$or)',\n example: '1:parent:0,join:$and',\n });\n }\n\n const baseQueryParamsSchema: z.ZodType<PaginationQueryParams<TSchema>> = z\n .object(rootShape)\n .catchall(z.unknown())\n .transform(\n (\n q,\n ): Record<string, unknown> & {\n rawFilters: Record<string, Condition[]>;\n groupDefs: GroupDefs;\n } => {\n return {\n ...q,\n rawFilters: extractAndNormalizeRawFilters(q),\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 (typeof val.limit === 'number' && val.limit > config.maxLimit) {\n ctx.addIssue({\n code: 'custom',\n path: ['limit'],\n message: `limit must be <= ${config.maxLimit}`,\n });\n }\n\n // select allowlist + \"*\" expandability\n const selectForValidation: readonly string[] =\n val.select ??\n (effectiveConfig.defaultSelect === '*' ? ['*'] : effectiveConfig.defaultSelect);\n\n const hasWildcard = selectForValidation.includes('*');\n\n {\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 (hasWildcard) {\n const expanded = expandSelect(selectForValidation, effectiveConfig);\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 if (\n discriminatorKey &&\n !hasWildcard &&\n !selectForValidation.includes(discriminatorKey)\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['select'],\n message: `select must include the discriminator field \"${discriminatorKey}\" when using a discriminated union`,\n });\n }\n\n // Check nested discriminated unions\n if (!hasWildcard) {\n for (const nested of nestedDiscriminators) {\n const hasAnyFieldUnderPrefix =\n nested.prefix === ''\n ? selectForValidation.length > 0\n : selectForValidation.some(\n (f) => f === nested.prefix || f.startsWith(`${nested.prefix}.`),\n );\n if (\n hasAnyFieldUnderPrefix &&\n !selectForValidation.includes(nested.discriminatorPath)\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['select'],\n message: `select must include the discriminator field \"${nested.discriminatorPath}\" when selecting fields under \"${nested.prefix}\" (discriminated union)`,\n });\n }\n }\n }\n }\n\n // sort allowlist\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 {\n const cleaned = val.sortBy.map((s) => s.trim()).filter(Boolean);\n let index = 0;\n for (const raw of cleaned) {\n const parsed = parseSortItem(raw);\n if (!allowedSortable.has(parsed.property)) {\n ctx.addIssue({\n code: 'custom',\n path: ['sortBy', index],\n message: `sort property \"${parsed.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 = filterableOps.get(field) ?? new Set<Operator>();\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.defaultLimit);\n const sortBy = computeSortBy(val.sortBy, config);\n const rawSelect = computeSelect(val.select, effectiveConfig);\n const select = rawSelect?.filter(\n (field): field is AllowedPath<TSchema> => typeof field === 'string',\n );\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 const decorativeSelect = select?.filter((f) => decorativeSet.has(f));\n return {\n pagination: {\n type: 'LIMIT_OFFSET',\n limit,\n page: val.page,\n sortBy,\n select,\n ...(decorativeSelect && decorativeSelect.length > 0 ? { decorativeSelect } : {}),\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 const decorativeSelect = select?.filter((f) => decorativeSet.has(f));\n return {\n pagination: {\n type: 'CURSOR',\n limit,\n cursor,\n cursorProperty: config.cursorProperty,\n sortBy,\n select,\n ...(decorativeSelect && decorativeSelect.length > 0 ? { decorativeSelect } : {}),\n ...maybeFilters,\n },\n };\n }),\n );\n\n const sortByResponseSchema = z\n .array(\n z.object({\n property: z.string(),\n direction: SortDirectionSchema,\n }),\n )\n .optional()\n .meta({ description: 'Applied sort order' });\n\n const filterResponseSchema = WhereNodeSchema.optional().meta({\n description: 'Applied filter AST',\n });\n\n const itemsPerPageSchema = z.number().meta({ description: 'Number of items returned per page' });\n const totalItemsSchema = z\n .number()\n .meta({ description: 'Total number of items matching the query' });\n const currentPageSchema = z.number().meta({ description: 'Current page number (1-based)' });\n const totalPagesSchema = z.number().min(1).meta({ description: 'Total number of pages' });\n\n const LIMIT_OFFSET_META_DESC = 'Pagination metadata for limit/offset mode';\n const CURSOR_META_DESC = 'Pagination metadata for cursor mode';\n const CURSOR_VALUE_DESC = 'Cursor value pointing to the last item returned';\n\n function validatorSchema(\n parsed?: PaginationPayload<TSchema>,\n ): z.ZodType<PaginationResponse<TSchema, AllowedPath<TSchema>>>;\n function validatorSchema(parsed?: PaginationPayload<TSchema>): z.ZodType {\n const effectiveSelect =\n parsed?.select ?? computeSelect(undefined, effectiveConfig) ?? undefined;\n\n const dataItemSchema =\n effectiveSelect && effectiveSelect.length > 0\n ? projectDataSchemaPreservingUnion(config.dataSchema, effectiveSelect.map(String))\n : resolveToZodObject(config.dataSchema);\n\n if (config.paginationType === 'LIMIT_OFFSET') {\n return z.object({\n data: z.array(dataItemSchema),\n pagination: z\n .object({\n itemsPerPage: itemsPerPageSchema,\n totalItems: totalItemsSchema,\n currentPage: currentPageSchema,\n totalPages: totalPagesSchema,\n sortBy: sortByResponseSchema,\n filter: filterResponseSchema,\n })\n .meta({ description: LIMIT_OFFSET_META_DESC }),\n });\n }\n\n const cursorType = cursorSchemaFromProperty(config.dataSchema, config.cursorProperty);\n return z.object({\n data: z.array(dataItemSchema),\n pagination: z\n .object({\n itemsPerPage: itemsPerPageSchema,\n cursor: cursorType.meta({ description: CURSOR_VALUE_DESC }),\n sortBy: sortByResponseSchema,\n filter: filterResponseSchema,\n })\n .meta({ description: CURSOR_META_DESC }),\n });\n }\n\n const partialDataItemSchema =\n selectableStrings.length > 0\n ? projectDataSchemaPreservingUnion(config.dataSchema, selectableStrings, { partial: true })\n : resolveToZodObject(config.dataSchema);\n\n const responseSchema =\n config.paginationType === 'LIMIT_OFFSET'\n ? buildLimitOffsetResponseSchema(partialDataItemSchema, {\n itemsPerPage: itemsPerPageSchema,\n totalItems: totalItemsSchema,\n currentPage: currentPageSchema,\n totalPages: totalPagesSchema,\n sortBy: sortByResponseSchema,\n filter: filterResponseSchema,\n metaDescription: LIMIT_OFFSET_META_DESC,\n })\n : buildCursorResponseSchema(partialDataItemSchema, {\n itemsPerPage: itemsPerPageSchema,\n cursor: cursorSchemaFromProperty(config.dataSchema, config.cursorProperty),\n sortBy: sortByResponseSchema,\n filter: filterResponseSchema,\n metaDescription: CURSOR_META_DESC,\n cursorValueDescription: CURSOR_VALUE_DESC,\n });\n\n function queryParamsSchema(): z.ZodType<PaginationQueryParams<TSchema>>;\n function queryParamsSchema<TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<PaginationQueryParams<TSchema> & z.infer<z.ZodObject<TExtraShape>>>;\n function queryParamsSchema<TExtraShape extends z.ZodRawShape>(\n extraShape?: TExtraShape,\n ): z.ZodType {\n if (!extraShape) return baseQueryParamsSchema;\n\n const extraSchema = z.object(extraShape);\n return z\n .object({ ...rootShape, ...extraShape })\n .catchall(z.unknown())\n .superRefine((raw, ctx) => {\n const pagResult = baseQueryParamsSchema.safeParse(raw);\n if (!pagResult.success) {\n for (const issue of pagResult.error.issues) {\n ctx.addIssue({ code: 'custom', message: issue.message, path: issue.path });\n }\n }\n const extraResult = extraSchema.safeParse(raw);\n if (!extraResult.success) {\n for (const issue of extraResult.error.issues) {\n ctx.addIssue({ code: 'custom', message: issue.message, path: issue.path });\n }\n }\n })\n .transform((raw) => ({\n ...baseQueryParamsSchema.parse(raw),\n ...extraSchema.parse(raw),\n }));\n }\n\n return { queryParamsSchema, validatorSchema, responseSchema };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zod-paginate",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "A small utility to parse and validate pagination using Zod",
5
5
  "keywords": [
6
6
  "zod",