zod-paginate 1.10.2 → 1.11.0
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 +97 -1
- package/dist/paginate.d.ts +12 -0
- package/dist/paginate.js +5 -0
- package/dist/paginate.js.map +1 -1
- package/dist/select.d.ts +10 -2
- package/dist/select.js +9 -1
- package/dist/select.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,6 +18,7 @@ It is designed for Node.js HTTP stacks where query parameters arrive as strings
|
|
|
18
18
|
- **Filter DSL** with `$` operators and **nested AND/OR grouping**.
|
|
19
19
|
- **Response validation** — `responseSchema` is a generic schema covering all possible responses based on your config; `validatorSchema(parsed.select)` validates outgoing data projected to the actual requested `select`. `z.infer<typeof responseSchema>` gives you **key autocompletion** narrowed to configured `selectable` paths.
|
|
20
20
|
- **Discriminated union support** — `z.discriminatedUnion()` and `z.union()` as `dataSchema`, with compile-time and runtime discriminator enforcement.
|
|
21
|
+
- **Decorative fields** — mark computed/manual fields as selectable-only (excluded from sort & filter)
|
|
21
22
|
- **Standalone `select()`** utility for field-projection-only use cases.
|
|
22
23
|
- Compatible with **OpenAPI tooling** ([zod-openapi](https://github.com/samchungy/zod-openapi) etc.).
|
|
23
24
|
|
|
@@ -167,6 +168,7 @@ Returns:
|
|
|
167
168
|
|---|---:|---|
|
|
168
169
|
| `dataSchema` | `z.ZodObject` \| `z.ZodDiscriminatedUnion` \| `z.ZodUnion` | Zod schema representing one data item. |
|
|
169
170
|
| `selectable` | `string[]` (typed paths) | Allowlist of selectable fields (dot paths supported). |
|
|
171
|
+
| `decorative?` | `string[]` (typed paths) | Subset of `selectable`. Fields that are added manually (not from DB). Included in `decorativeFields` output. |
|
|
170
172
|
| `defaultSelect` | `field[] \| "*"` | **Required.** Default when `select` is missing. `"*"` expands to `selectable`. |
|
|
171
173
|
| `responseType` | `"many" \| "one"` | Shape of `data` in the response (default: `"many"`). |
|
|
172
174
|
|
|
@@ -271,6 +273,7 @@ Returns:
|
|
|
271
273
|
| `paginationType` | `"LIMIT_OFFSET"` \| `"CURSOR"` | Pagination mode. |
|
|
272
274
|
| `dataSchema` | `z.ZodObject` \| `z.ZodDiscriminatedUnion` \| `z.ZodUnion` | Zod schema for one data item (used for projection + cursor inference). |
|
|
273
275
|
| `selectable` | `string[]` (typed paths) | **Required.** Allowlist of selectable fields (dot paths). Enables `select`. |
|
|
276
|
+
| `decorative?` | `string[]` (typed paths) | Subset of `selectable`. Fields added manually (not from DB). Cannot be sorted or filtered. Included in `decorativeSelect` output. |
|
|
274
277
|
| `sortable?` | `string[]` (typed paths) | Allowlist of sortable fields. Enables `sortBy`. |
|
|
275
278
|
| `filterable?` | object | Allowlist of filterable fields and allowed operators + field type. |
|
|
276
279
|
| `defaultSortBy?` | `{ property, direction }[]` | Default sort if `sortBy` missing/empty. |
|
|
@@ -629,6 +632,99 @@ schema.safeParse({ data: [{ id: 1, type: "video", bitrate: 320 }] });
|
|
|
629
632
|
// → fails validation
|
|
630
633
|
```
|
|
631
634
|
|
|
635
|
+
## Decorative fields
|
|
636
|
+
|
|
637
|
+
Some fields in your schema may be computed or added manually at runtime (e.g. image URLs, aggregated values) rather than stored in and fetched from the database. Marking them as `decorative` tells zod-paginate that they are **selectable** but must **not be sorted or filtered**.
|
|
638
|
+
|
|
639
|
+
### Configuration
|
|
640
|
+
|
|
641
|
+
```ts
|
|
642
|
+
import { z } from "zod";
|
|
643
|
+
import { paginate } from "zod-paginate";
|
|
644
|
+
|
|
645
|
+
const ShowSummary = z.object({
|
|
646
|
+
id: z.number(),
|
|
647
|
+
title: z.string(),
|
|
648
|
+
urlAlias: z.string(),
|
|
649
|
+
image: z.string(),
|
|
650
|
+
genres: z.string().nullable(),
|
|
651
|
+
});
|
|
652
|
+
|
|
653
|
+
const PublicFeed = z.object({
|
|
654
|
+
id: z.number(),
|
|
655
|
+
title: z.string(),
|
|
656
|
+
shows: z.array(ShowSummary),
|
|
657
|
+
});
|
|
658
|
+
|
|
659
|
+
const { queryParamsSchema } = paginate({
|
|
660
|
+
paginationType: "LIMIT_OFFSET",
|
|
661
|
+
dataSchema: PublicFeed,
|
|
662
|
+
selectable: ["id", "title", "shows.id", "shows.title", "shows.image", "shows.genres"],
|
|
663
|
+
decorative: ["shows.image"], // ← added at runtime, not from DB
|
|
664
|
+
sortable: ["id", "title"], // "shows.image" here would be a type error
|
|
665
|
+
filterable: {
|
|
666
|
+
id: { type: "number", ops: ["$eq"] },
|
|
667
|
+
// "shows.image" here would be a type error
|
|
668
|
+
},
|
|
669
|
+
defaultSelect: "*",
|
|
670
|
+
defaultLimit: 20,
|
|
671
|
+
maxLimit: 100,
|
|
672
|
+
});
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
### Parsed output
|
|
676
|
+
|
|
677
|
+
The parsed payload includes `decorativeSelect` (or `decorativeFields` for `select()`), containing only the decorative fields that were actually requested:
|
|
678
|
+
|
|
679
|
+
```ts
|
|
680
|
+
const parsed = queryParamsSchema().parse({ select: "*" });
|
|
681
|
+
|
|
682
|
+
parsed.pagination.select;
|
|
683
|
+
// → ["id", "title", "shows.id", "shows.title", "shows.image", "shows.genres"]
|
|
684
|
+
|
|
685
|
+
parsed.pagination.decorativeSelect;
|
|
686
|
+
// → ["shows.image"]
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
When none of the requested fields are decorative, `decorativeSelect` is `undefined`.
|
|
690
|
+
|
|
691
|
+
### Usage in adapters
|
|
692
|
+
|
|
693
|
+
Your adapter can use `decorativeSelect` to skip those fields when building the database query:
|
|
694
|
+
|
|
695
|
+
```ts
|
|
696
|
+
const { select, decorativeSelect } = parsed.pagination;
|
|
697
|
+
|
|
698
|
+
// Only query real DB fields
|
|
699
|
+
const dbFields = select?.filter(f => !decorativeSelect?.includes(f));
|
|
700
|
+
// → ["id", "title", "shows.id", "shows.title", "shows.genres"]
|
|
701
|
+
|
|
702
|
+
const rows = await db.query(dbFields);
|
|
703
|
+
|
|
704
|
+
// Then enrich with decorative fields manually
|
|
705
|
+
const data = rows.map(row => ({
|
|
706
|
+
...row,
|
|
707
|
+
shows: row.shows.map(s => ({ ...s, image: buildImageUrl(s) })),
|
|
708
|
+
}));
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
### With `select()` standalone
|
|
712
|
+
|
|
713
|
+
The same option works with `select()` — the output uses `decorativeFields` instead:
|
|
714
|
+
|
|
715
|
+
```ts
|
|
716
|
+
const { queryParamsSchema } = select({
|
|
717
|
+
dataSchema: ShowSummary,
|
|
718
|
+
selectable: ["id", "title", "urlAlias", "image", "genres"],
|
|
719
|
+
decorative: ["image"],
|
|
720
|
+
defaultSelect: "*",
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
const parsed = queryParamsSchema().parse({ select: "id,title,image" });
|
|
724
|
+
parsed.select.fields; // → ["id", "title", "image"]
|
|
725
|
+
parsed.select.decorativeFields; // → ["image"]
|
|
726
|
+
```
|
|
727
|
+
|
|
632
728
|
## Extending `queryParamsSchema`
|
|
633
729
|
|
|
634
730
|
Both `select()` and `paginate()` support extending `queryParamsSchema` with additional fields:
|
|
@@ -777,7 +873,7 @@ export function select<
|
|
|
777
873
|
| `SelectConfig<TSchema, TSelectable>` | Configuration for `select()` |
|
|
778
874
|
| `SelectResult<TSchema, TSelectable, TResponseType?>` | Return type of `select()`. `TResponseType` narrows `validatorSchema` return and `responseType` property. |
|
|
779
875
|
| `SelectQueryParams<TSchema, TSelectable>` | Parsed output of `select()` — `{ select: SelectQueryPayload }` |
|
|
780
|
-
| `SelectQueryPayload<TSchema, TSelectable, TResponseType?>` | Inner select payload — `{ fields, responseType }`. Passed to `validatorSchema()`. |
|
|
876
|
+
| `SelectQueryPayload<TSchema, TSelectable, TResponseType?>` | Inner select payload — `{ fields, decorativeFields?, responseType }`. Passed to `validatorSchema()`. |
|
|
781
877
|
| `SelectOneQueryPayload<TSchema, TSelectable?>` | Shorthand for `SelectQueryPayload<…, 'one'>` |
|
|
782
878
|
| `SelectManyQueryPayload<TSchema, TSelectable?>` | Shorthand for `SelectQueryPayload<…, 'many'>` |
|
|
783
879
|
| `SelectResponse<TSchema, TSelect, TResponseType?>` | Response type: `{ data: … }` — array when `'many'`, single object when `'one'` |
|
package/dist/paginate.d.ts
CHANGED
|
@@ -163,6 +163,8 @@ export interface CommonQueryConfigFromSchema<TSchema extends DataSchema, TSelect
|
|
|
163
163
|
dataSchema: TSchema;
|
|
164
164
|
/** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */
|
|
165
165
|
selectable: readonly TSelectable[];
|
|
166
|
+
/** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. Subset of selectable. */
|
|
167
|
+
decorative?: readonly AllowedPath<TSchema>[];
|
|
166
168
|
/** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */
|
|
167
169
|
sortable?: readonly AllowedPath<TSchema>[];
|
|
168
170
|
/** Map of filterable fields to their allowed type and operators. Enables the `filter.*` query parameters. */
|
|
@@ -195,6 +197,8 @@ export interface LimitOffsetPaginationPayload<TSchema extends DataSchema> {
|
|
|
195
197
|
page?: number;
|
|
196
198
|
sortBy?: SortItemTyped<TSchema>[];
|
|
197
199
|
select?: AllowedPath<TSchema>[];
|
|
200
|
+
/** Subset of `select` that are decorative (not from DB, added manually). */
|
|
201
|
+
decorativeSelect?: AllowedPath<TSchema>[];
|
|
198
202
|
filters?: WhereNode;
|
|
199
203
|
}
|
|
200
204
|
/**
|
|
@@ -208,6 +212,8 @@ export interface CursorPaginationPayload<TSchema extends DataSchema> {
|
|
|
208
212
|
cursorProperty: AllowedPath<TSchema>;
|
|
209
213
|
sortBy?: SortItemTyped<TSchema>[];
|
|
210
214
|
select?: AllowedPath<TSchema>[];
|
|
215
|
+
/** Subset of `select` that are decorative (not from DB, added manually). */
|
|
216
|
+
decorativeSelect?: AllowedPath<TSchema>[];
|
|
211
217
|
filters?: WhereNode;
|
|
212
218
|
}
|
|
213
219
|
export type PaginationType = 'LIMIT_OFFSET' | 'CURSOR';
|
|
@@ -309,6 +315,8 @@ export declare function paginate<TSchema extends DataSchema, const TSelectable e
|
|
|
309
315
|
}[]>(config: Omit<CommonQueryConfigFromSchema<TSchema, TSelectable[number]>, 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'> & LimitOffsetPaginationConfig & {
|
|
310
316
|
/** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */
|
|
311
317
|
selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;
|
|
318
|
+
/** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */
|
|
319
|
+
decorative?: readonly NoInfer<TSelectable[number]>[];
|
|
312
320
|
/** Default fields returned when `select` is omitted. Use `"*"` to select all. */
|
|
313
321
|
defaultSelect: NoDuplicates<TDefaultSelect> | '*';
|
|
314
322
|
/** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */
|
|
@@ -329,6 +337,8 @@ export declare function paginate<TSchema extends DataSchema, const TSelectable e
|
|
|
329
337
|
}[]>(config: Omit<CommonQueryConfigFromSchema<TSchema, TSelectable[number]>, 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'> & CursorPaginationConfig<InferData<TSchema>> & {
|
|
330
338
|
/** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */
|
|
331
339
|
selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;
|
|
340
|
+
/** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */
|
|
341
|
+
decorative?: readonly NoInfer<TSelectable[number]>[];
|
|
332
342
|
/** Default fields returned when `select` is omitted. Use `"*"` to select all. */
|
|
333
343
|
defaultSelect: NoDuplicates<TDefaultSelect> | '*';
|
|
334
344
|
/** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */
|
|
@@ -349,6 +359,8 @@ export declare function paginate<TSchema extends DataSchema, const TSelectable e
|
|
|
349
359
|
}[]>(config: Omit<CommonQueryConfigFromSchema<TSchema, TSelectable[number]>, 'selectable' | 'defaultSelect' | 'sortable' | 'defaultSortBy' | 'filterable'> & {
|
|
350
360
|
/** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */
|
|
351
361
|
selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;
|
|
362
|
+
/** Fields that are decorative (added manually, not from DB). Cannot be sorted or filtered. */
|
|
363
|
+
decorative?: readonly NoInfer<TSelectable[number]>[];
|
|
352
364
|
/** Default fields returned when `select` is omitted. Use `"*"` to select all. */
|
|
353
365
|
defaultSelect: NoDuplicates<TDefaultSelect> | '*';
|
|
354
366
|
/** Allowlist of sortable fields. Enables the `sortBy` query parameter. Unknown sort fields are rejected. */
|
package/dist/paginate.js
CHANGED
|
@@ -729,6 +729,7 @@ function paginate(config) {
|
|
|
729
729
|
defaultSelect: config.defaultSelect === '*' ? '*' : Array.from(config.defaultSelect, String),
|
|
730
730
|
};
|
|
731
731
|
const allowedSelectable = new Set(selectableStrings);
|
|
732
|
+
const decorativeSet = new Set((config.decorative ?? []).map(String));
|
|
732
733
|
const allowedSortable = new Set();
|
|
733
734
|
for (const f of config.sortable ?? [])
|
|
734
735
|
allowedSortable.add(`${f}`);
|
|
@@ -1009,6 +1010,7 @@ function paginate(config) {
|
|
|
1009
1010
|
? { filters: buildWhereAstWithGroups(val.rawFilters, val.groupDefs) }
|
|
1010
1011
|
: {};
|
|
1011
1012
|
if (config.paginationType === 'LIMIT_OFFSET') {
|
|
1013
|
+
const decorativeSelect = select?.filter((f) => decorativeSet.has(f));
|
|
1012
1014
|
return {
|
|
1013
1015
|
pagination: {
|
|
1014
1016
|
type: 'LIMIT_OFFSET',
|
|
@@ -1016,6 +1018,7 @@ function paginate(config) {
|
|
|
1016
1018
|
page: val.page,
|
|
1017
1019
|
sortBy,
|
|
1018
1020
|
select,
|
|
1021
|
+
...(decorativeSelect && decorativeSelect.length > 0 ? { decorativeSelect } : {}),
|
|
1019
1022
|
...maybeFilters,
|
|
1020
1023
|
},
|
|
1021
1024
|
};
|
|
@@ -1025,6 +1028,7 @@ function paginate(config) {
|
|
|
1025
1028
|
if (val.cursor !== undefined) {
|
|
1026
1029
|
cursor = coerceCursorFromProperty(config.dataSchema, config.cursorProperty, val.cursor);
|
|
1027
1030
|
}
|
|
1031
|
+
const decorativeSelect = select?.filter((f) => decorativeSet.has(f));
|
|
1028
1032
|
return {
|
|
1029
1033
|
pagination: {
|
|
1030
1034
|
type: 'CURSOR',
|
|
@@ -1033,6 +1037,7 @@ function paginate(config) {
|
|
|
1033
1037
|
cursorProperty: config.cursorProperty,
|
|
1034
1038
|
sortBy,
|
|
1035
1039
|
select,
|
|
1040
|
+
...(decorativeSelect && decorativeSelect.length > 0 ? { decorativeSelect } : {}),
|
|
1036
1041
|
...maybeFilters,
|
|
1037
1042
|
},
|
|
1038
1043
|
};
|
package/dist/paginate.js.map
CHANGED
|
@@ -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;\ntype QueryStringRecord = Record<string, QueryStringValue>;\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 for (const [k, v] of Object.entries(q)) {\n if (!k.startsWith('group.')) continue;\n\n const rest = k.slice('group.'.length);\n const dotIdx = rest.indexOf('.');\n if (dotIdx === -1) continue;\n\n const groupIdRaw = rest.slice(0, dotIdx).trim();\n const prop = rest.slice(dotIdx + 1).trim();\n\n const parsedId = IntegerStringSchema.safeParse(groupIdRaw);\n if (!parsedId.success) continue;\n const id = parsedId.data;\n\n const first = Array.isArray(v) ? v[0] : v;\n const valueStr = typeof first === 'string' ? first : '';\n\n const current = defs[id] ?? {};\n\n if (prop === 'parent') {\n defs[id] = { ...current, parent: IntegerStringSchema.parse(valueStr.trim()) };\n continue;\n }\n if (prop === 'join') {\n defs[id] = { ...current, join: CombinatorSchema.parse(valueStr.trim()) };\n continue;\n }\n if (prop === 'op') {\n defs[id] = { ...current, op: CombinatorSchema.parse(valueStr.trim()) };\n continue;\n }\n }\n\n return defs;\n}\n\nfunction validateGroupDefs(defs: GroupDefs): void {\n const root = defs[ROOT_GROUP_ID];\n if (root && (root.parent !== undefined || root.join !== undefined)) {\n throw new Error(\n `group.0 can only define \"op\". \"parent\" and \"join\" are not allowed on root group \"0\".`,\n );\n }\n\n for (const [id, def] of Object.entries(defs)) {\n if (id === ROOT_GROUP_ID) continue;\n if (def.parent !== undefined) IntegerStringSchema.parse(def.parent);\n }\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const visit = (id: string): void => {\n if (visited.has(id)) return;\n if (visiting.has(id)) throw new Error(`Group cycle detected at group \"${id}\".`);\n visiting.add(id);\n\n const parent = defs[id]?.parent;\n if (parent && parent !== ROOT_GROUP_ID) visit(parent);\n\n visiting.delete(id);\n visited.add(id);\n };\n\n for (const id of Object.keys(defs)) {\n if (id === ROOT_GROUP_ID) continue;\n visit(id);\n }\n}\n\nfunction buildGroupConditionExprs(rawFilters: Record<string, Condition[]>): Map<string, WhereNode> {\n const groupNodes = new Map<string, WhereFilter[]>();\n\n for (const [field, conditions] of Object.entries(rawFilters)) {\n for (const cond of conditions) {\n const groupId = cond.group;\n const list = groupNodes.get(groupId) ?? [];\n const isFirst = list.length === 0;\n\n if (isFirst && cond.combinator !== undefined) {\n throw new Error(\n `Invalid combinator \"${cond.combinator}\" on first condition of group \"${groupId}\". ` +\n `First condition in a group cannot define \"$and\" or \"$or\".`,\n );\n }\n\n list.push({ type: 'filter', field, condition: cond });\n groupNodes.set(groupId, list);\n }\n }\n\n const exprs = new Map<string, WhereNode>();\n for (const [groupId, nodes] of groupNodes.entries()) {\n if (nodes.length === 0) continue;\n if (!nodes[0]) continue;\n\n let current: WhereNode = nodes[0];\n for (let i = 1; i < nodes.length; i += 1) {\n const next = nodes[i];\n if (!next) break;\n current = fold(next.condition.combinator, current, next);\n }\n exprs.set(groupId, current);\n }\n\n return exprs;\n}\n\nfunction buildWhereAstWithGroups(\n rawFilters: Record<string, Condition[]>,\n groupDefs: GroupDefs,\n): WhereNode {\n const groupExprs = buildGroupConditionExprs(rawFilters);\n\n const allGroupIds = new Set<string>();\n for (const id of groupExprs.keys()) allGroupIds.add(id);\n for (const id of Object.keys(groupDefs)) allGroupIds.add(id);\n allGroupIds.add(ROOT_GROUP_ID);\n\n const effectiveParent = (id: string): string => {\n if (id === ROOT_GROUP_ID) return ROOT_GROUP_ID;\n return groupDefs[id]?.parent ?? ROOT_GROUP_ID;\n };\n\n const childrenByParent = new Map<string, string[]>();\n for (const id of allGroupIds) {\n if (id === ROOT_GROUP_ID) continue;\n const parentId = effectiveParent(id);\n const arr = childrenByParent.get(parentId) ?? [];\n arr.push(id);\n childrenByParent.set(parentId, arr);\n }\n\n const sortNumericIds = (ids: string[]): string[] => {\n const pairs = ids.map((s) => ({ s, n: Number(s) }));\n pairs.sort((a, b) => a.n - b.n);\n return pairs.map((p) => p.s);\n };\n\n const visiting = new Set<string>();\n const resolved = new Map<string, WhereNode>();\n\n const resolveGroup = (id: string): WhereNode => {\n const cached = resolved.get(id);\n if (cached) return cached;\n\n if (visiting.has(id)) throw new Error(`Group cycle detected while resolving group \"${id}\".`);\n visiting.add(id);\n\n const items: { expr: WhereNode; join?: Combinator }[] = [];\n\n const own = groupExprs.get(id);\n if (own) items.push({ expr: own });\n\n const children = sortNumericIds(childrenByParent.get(id) ?? []);\n const parentOp = groupDefs[id]?.op;\n\n for (const childId of children) {\n const childExpr = resolveGroup(childId);\n const childJoin = groupDefs[childId]?.join;\n items.push({ expr: childExpr, join: childJoin ?? parentOp });\n }\n\n if (items.length === 0 || !items[0]) {\n const empty: WhereNode = { type: 'and', items: [] };\n resolved.set(id, empty);\n visiting.delete(id);\n return empty;\n }\n\n if (items[0].join !== undefined) {\n throw new Error(\n `Invalid group join \"${items[0].join}\" for the first item inside group \"${id}\". ` +\n `A group cannot start with \"$and\" or \"$or\" because there is nothing to join with.`,\n );\n }\n\n let current = items[0].expr;\n for (let i = 1; i < items.length; i += 1) {\n const next = items[i];\n if (!next) break;\n current = fold(next.join, current, next.expr);\n }\n\n resolved.set(id, current);\n visiting.delete(id);\n return current;\n };\n\n validateGroupDefs(groupDefs);\n return resolveGroup(ROOT_GROUP_ID);\n}\n\n/* ---------------------------------- */\n/* DSL parsing */\n/* ---------------------------------- */\n\n/** Parse a string as either a finite number or an ISO date string. */\nfunction parseNumOrDateStrict(raw: string, ctx: string): number | string {\n const s = raw.trim();\n\n if (/^[+-]?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (!Number.isFinite(n)) throw new Error(`Invalid number for ${ctx}: \"${raw}\"`);\n return n;\n }\n\n if (ISO_DATE_RE.test(s) || ISO_DATETIME_RE.test(s)) {\n const t = Date.parse(s);\n if (Number.isNaN(t)) throw new Error(`Invalid ISO date for ${ctx}: \"${raw}\"`);\n return s;\n }\n\n throw new Error(`Expected number or ISO date for ${ctx}, got \"${raw}\"`);\n}\n\n/** Ensure $btw bounds are both numbers or both dates. */\nfunction assertSameKind(a: number | string, b: number | string, ctx: string): void {\n const ka = typeof a === 'number' ? 'number' : 'date';\n const kb = typeof b === 'number' ? 'number' : 'date';\n if (ka !== kb) {\n throw new Error(`$btw bounds must be same type (both number or both date) for ${ctx}`);\n }\n}\n\n/** Parse a single \"filter.<field>\" DSL string into a Condition. */\nfunction parseSingleCondition(raw: string): Condition {\n const parts = raw.split(':');\n\n let group = ROOT_GROUP_ID;\n let cursor = parts;\n\n if (cursor[0] === '$g') {\n group = IntegerStringSchema.parse((cursor[1] ?? '').trim());\n cursor = cursor.slice(2);\n if (cursor.length === 0) {\n throw new Error(`Invalid group prefix in \"${raw}\" (missing condition after \"$g:<id>\")`);\n }\n }\n\n let combinator: Combinator | undefined;\n if (cursor[0] === '$and' || cursor[0] === '$or') {\n combinator = CombinatorSchema.parse(cursor[0]);\n cursor = cursor.slice(1);\n if (cursor.length === 0) {\n throw new Error(`Invalid combinator in \"${raw}\" (missing condition after \"${combinator}\")`);\n }\n }\n\n const hasNot = cursor[0] === '$not';\n if (hasNot && !cursor[1]) {\n throw new Error(`Invalid \"$not\" usage in \"${raw}\" (missing operator after \"$not\")`);\n }\n\n const head = hasNot ? cursor[1] : cursor[0];\n const rest = hasNot ? cursor.slice(2).join(':') : cursor.slice(1).join(':');\n const not = hasNot ? true : undefined;\n\n if (!head?.startsWith('$')) {\n return ConditionSchema.parse({\n group,\n combinator,\n op: '$eq',\n value: cursor.join(':'),\n });\n }\n\n const op = OperatorSchema.parse(head);\n\n if (op === '$null') return ConditionSchema.parse({ group, combinator, op: '$null', not });\n\n if (op === '$eq') {\n let value: number | string;\n try {\n value = parseNumOrDateStrict(rest, '$eq');\n } catch {\n value = rest;\n }\n return ConditionSchema.parse({ group, combinator, op: '$eq', not, value });\n }\n\n if (op === '$btw') {\n const [aRaw, bRaw] = rest.split(',');\n if (!aRaw || !bRaw) throw new Error(`Invalid $btw \"${raw}\" (expected \"$btw:a,b\")`);\n const a = parseNumOrDateStrict(aRaw, '$btw');\n const b = parseNumOrDateStrict(bRaw, '$btw');\n assertSameKind(a, b, '$btw');\n return ConditionSchema.parse({ group, combinator, op: '$btw', not, value: [a, b] });\n }\n\n if (op === '$in' || op === '$contains') {\n const arr = rest\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n return ConditionSchema.parse({ group, combinator, op, not, value: arr });\n }\n\n if (op === '$gt' || op === '$gte' || op === '$lt' || op === '$lte') {\n const v = parseNumOrDateStrict(rest, op);\n return ConditionSchema.parse({ group, combinator, op, not, value: v });\n }\n\n // $ilike | $sw\n return ConditionSchema.parse({ group, combinator, op, not, value: rest });\n}\n\n/* ---------------------------------- */\n/* Extract raw filters */\n/* ---------------------------------- */\n\nfunction extractAndNormalizeRawFilters(q: QueryStringRecord): Record<string, Condition[]> {\n const result: Record<string, Condition[]> = {};\n\n for (const [k, v] of Object.entries(q)) {\n if (!k.startsWith('filter.')) continue;\n\n const field = k.slice('filter.'.length).trim();\n if (!field) continue;\n\n const rawList = toStringArrayFromQueryString(v);\n result[field] = rawList.filter(Boolean).map(parseSingleCondition);\n }\n\n return result;\n}\n\nfunction toQueryStringRecord(q: Record<string, unknown>): QueryStringRecord {\n const out: QueryStringRecord = {};\n for (const [k, v] of Object.entries(q)) {\n if (typeof v === 'string') {\n out[k] = v;\n continue;\n }\n if (Array.isArray(v) && v.every((x) => typeof x === 'string')) {\n out[k] = v;\n continue;\n }\n out[k] = undefined;\n }\n return out;\n}\n\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 /** 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 filters?: WhereNode;\n}\n\n/**\n * Cursor is always a string in the query input, BUT we coerce it at parse-time\n * to match the type of cursorProperty (number / string / ISO date string).\n */\nexport interface CursorPaginationPayload<TSchema extends DataSchema> {\n type: 'CURSOR';\n limit: number;\n cursor?: number | string;\n cursorProperty: AllowedPath<TSchema>;\n sortBy?: SortItemTyped<TSchema>[];\n select?: AllowedPath<TSchema>[];\n filters?: WhereNode;\n}\n\nexport 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 /** 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 /** 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 /** 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 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 /** 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 TSelectable[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\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. Dynamic keys (filter.*, group.*) pass through\n * via .catchall(z.unknown()). 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 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 const qs = toQueryStringRecord(q);\n\n return {\n ...q,\n rawFilters: extractAndNormalizeRawFilters(qs),\n groupDefs: extractGroupDefs(q),\n };\n },\n )\n .pipe(\n baseSchema\n .superRefine((val, ctx): void => {\n // Pagination mode constraints\n if (config.paginationType === 'LIMIT_OFFSET') {\n if (val.cursor !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['cursor'],\n message: `cursor is not allowed when paginationType is LIMIT_OFFSET`,\n });\n }\n }\n\n if (config.paginationType === 'CURSOR') {\n if (val.page !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['page'],\n message: `page is not allowed when paginationType is CURSOR`,\n });\n }\n\n if (`${config.cursorProperty}`.trim().length === 0) {\n ctx.addIssue({\n code: 'custom',\n path: [],\n message: `cursorProperty must be a non-empty string when paginationType is CURSOR`,\n });\n }\n\n // Validate that cursor (if provided) can be coerced for that cursorProperty\n if (val.cursor !== undefined) {\n try {\n void coerceCursorFromProperty(config.dataSchema, config.cursorProperty, val.cursor);\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Invalid cursor';\n ctx.addIssue({\n code: 'custom',\n path: ['cursor'],\n message,\n });\n }\n }\n }\n\n // limit / maxLimit\n if (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 return {\n pagination: {\n type: 'LIMIT_OFFSET',\n limit,\n page: val.page,\n sortBy,\n select,\n ...maybeFilters,\n },\n };\n }\n\n // CURSOR: coerce string cursor into number/string based on cursorProperty\n let cursor: number | string | undefined = undefined;\n if (val.cursor !== undefined) {\n cursor = coerceCursorFromProperty(config.dataSchema, config.cursorProperty, val.cursor);\n }\n\n return {\n pagination: {\n type: 'CURSOR',\n limit,\n cursor,\n cursorProperty: config.cursorProperty,\n sortBy,\n select,\n ...maybeFilters,\n },\n };\n }),\n );\n\n const 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/* Querystring value types */\n/* ---------------------------------- */\n\ntype QueryStringValue = string | string[] | undefined;\ntype QueryStringRecord = Record<string, QueryStringValue>;\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 for (const [k, v] of Object.entries(q)) {\n if (!k.startsWith('group.')) continue;\n\n const rest = k.slice('group.'.length);\n const dotIdx = rest.indexOf('.');\n if (dotIdx === -1) continue;\n\n const groupIdRaw = rest.slice(0, dotIdx).trim();\n const prop = rest.slice(dotIdx + 1).trim();\n\n const parsedId = IntegerStringSchema.safeParse(groupIdRaw);\n if (!parsedId.success) continue;\n const id = parsedId.data;\n\n const first = Array.isArray(v) ? v[0] : v;\n const valueStr = typeof first === 'string' ? first : '';\n\n const current = defs[id] ?? {};\n\n if (prop === 'parent') {\n defs[id] = { ...current, parent: IntegerStringSchema.parse(valueStr.trim()) };\n continue;\n }\n if (prop === 'join') {\n defs[id] = { ...current, join: CombinatorSchema.parse(valueStr.trim()) };\n continue;\n }\n if (prop === 'op') {\n defs[id] = { ...current, op: CombinatorSchema.parse(valueStr.trim()) };\n continue;\n }\n }\n\n return defs;\n}\n\nfunction validateGroupDefs(defs: GroupDefs): void {\n const root = defs[ROOT_GROUP_ID];\n if (root && (root.parent !== undefined || root.join !== undefined)) {\n throw new Error(\n `group.0 can only define \"op\". \"parent\" and \"join\" are not allowed on root group \"0\".`,\n );\n }\n\n for (const [id, def] of Object.entries(defs)) {\n if (id === ROOT_GROUP_ID) continue;\n if (def.parent !== undefined) IntegerStringSchema.parse(def.parent);\n }\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const visit = (id: string): void => {\n if (visited.has(id)) return;\n if (visiting.has(id)) throw new Error(`Group cycle detected at group \"${id}\".`);\n visiting.add(id);\n\n const parent = defs[id]?.parent;\n if (parent && parent !== ROOT_GROUP_ID) visit(parent);\n\n visiting.delete(id);\n visited.add(id);\n };\n\n for (const id of Object.keys(defs)) {\n if (id === ROOT_GROUP_ID) continue;\n visit(id);\n }\n}\n\nfunction buildGroupConditionExprs(rawFilters: Record<string, Condition[]>): Map<string, WhereNode> {\n const groupNodes = new Map<string, WhereFilter[]>();\n\n for (const [field, conditions] of Object.entries(rawFilters)) {\n for (const cond of conditions) {\n const groupId = cond.group;\n const list = groupNodes.get(groupId) ?? [];\n const isFirst = list.length === 0;\n\n if (isFirst && cond.combinator !== undefined) {\n throw new Error(\n `Invalid combinator \"${cond.combinator}\" on first condition of group \"${groupId}\". ` +\n `First condition in a group cannot define \"$and\" or \"$or\".`,\n );\n }\n\n list.push({ type: 'filter', field, condition: cond });\n groupNodes.set(groupId, list);\n }\n }\n\n const exprs = new Map<string, WhereNode>();\n for (const [groupId, nodes] of groupNodes.entries()) {\n if (nodes.length === 0) continue;\n if (!nodes[0]) continue;\n\n let current: WhereNode = nodes[0];\n for (let i = 1; i < nodes.length; i += 1) {\n const next = nodes[i];\n if (!next) break;\n current = fold(next.condition.combinator, current, next);\n }\n exprs.set(groupId, current);\n }\n\n return exprs;\n}\n\nfunction buildWhereAstWithGroups(\n rawFilters: Record<string, Condition[]>,\n groupDefs: GroupDefs,\n): WhereNode {\n const groupExprs = buildGroupConditionExprs(rawFilters);\n\n const allGroupIds = new Set<string>();\n for (const id of groupExprs.keys()) allGroupIds.add(id);\n for (const id of Object.keys(groupDefs)) allGroupIds.add(id);\n allGroupIds.add(ROOT_GROUP_ID);\n\n const effectiveParent = (id: string): string => {\n if (id === ROOT_GROUP_ID) return ROOT_GROUP_ID;\n return groupDefs[id]?.parent ?? ROOT_GROUP_ID;\n };\n\n const childrenByParent = new Map<string, string[]>();\n for (const id of allGroupIds) {\n if (id === ROOT_GROUP_ID) continue;\n const parentId = effectiveParent(id);\n const arr = childrenByParent.get(parentId) ?? [];\n arr.push(id);\n childrenByParent.set(parentId, arr);\n }\n\n const sortNumericIds = (ids: string[]): string[] => {\n const pairs = ids.map((s) => ({ s, n: Number(s) }));\n pairs.sort((a, b) => a.n - b.n);\n return pairs.map((p) => p.s);\n };\n\n const visiting = new Set<string>();\n const resolved = new Map<string, WhereNode>();\n\n const resolveGroup = (id: string): WhereNode => {\n const cached = resolved.get(id);\n if (cached) return cached;\n\n if (visiting.has(id)) throw new Error(`Group cycle detected while resolving group \"${id}\".`);\n visiting.add(id);\n\n const items: { expr: WhereNode; join?: Combinator }[] = [];\n\n const own = groupExprs.get(id);\n if (own) items.push({ expr: own });\n\n const children = sortNumericIds(childrenByParent.get(id) ?? []);\n const parentOp = groupDefs[id]?.op;\n\n for (const childId of children) {\n const childExpr = resolveGroup(childId);\n const childJoin = groupDefs[childId]?.join;\n items.push({ expr: childExpr, join: childJoin ?? parentOp });\n }\n\n if (items.length === 0 || !items[0]) {\n const empty: WhereNode = { type: 'and', items: [] };\n resolved.set(id, empty);\n visiting.delete(id);\n return empty;\n }\n\n if (items[0].join !== undefined) {\n throw new Error(\n `Invalid group join \"${items[0].join}\" for the first item inside group \"${id}\". ` +\n `A group cannot start with \"$and\" or \"$or\" because there is nothing to join with.`,\n );\n }\n\n let current = items[0].expr;\n for (let i = 1; i < items.length; i += 1) {\n const next = items[i];\n if (!next) break;\n current = fold(next.join, current, next.expr);\n }\n\n resolved.set(id, current);\n visiting.delete(id);\n return current;\n };\n\n validateGroupDefs(groupDefs);\n return resolveGroup(ROOT_GROUP_ID);\n}\n\n/* ---------------------------------- */\n/* DSL parsing */\n/* ---------------------------------- */\n\n/** Parse a string as either a finite number or an ISO date string. */\nfunction parseNumOrDateStrict(raw: string, ctx: string): number | string {\n const s = raw.trim();\n\n if (/^[+-]?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (!Number.isFinite(n)) throw new Error(`Invalid number for ${ctx}: \"${raw}\"`);\n return n;\n }\n\n if (ISO_DATE_RE.test(s) || ISO_DATETIME_RE.test(s)) {\n const t = Date.parse(s);\n if (Number.isNaN(t)) throw new Error(`Invalid ISO date for ${ctx}: \"${raw}\"`);\n return s;\n }\n\n throw new Error(`Expected number or ISO date for ${ctx}, got \"${raw}\"`);\n}\n\n/** Ensure $btw bounds are both numbers or both dates. */\nfunction assertSameKind(a: number | string, b: number | string, ctx: string): void {\n const ka = typeof a === 'number' ? 'number' : 'date';\n const kb = typeof b === 'number' ? 'number' : 'date';\n if (ka !== kb) {\n throw new Error(`$btw bounds must be same type (both number or both date) for ${ctx}`);\n }\n}\n\n/** Parse a single \"filter.<field>\" DSL string into a Condition. */\nfunction parseSingleCondition(raw: string): Condition {\n const parts = raw.split(':');\n\n let group = ROOT_GROUP_ID;\n let cursor = parts;\n\n if (cursor[0] === '$g') {\n group = IntegerStringSchema.parse((cursor[1] ?? '').trim());\n cursor = cursor.slice(2);\n if (cursor.length === 0) {\n throw new Error(`Invalid group prefix in \"${raw}\" (missing condition after \"$g:<id>\")`);\n }\n }\n\n let combinator: Combinator | undefined;\n if (cursor[0] === '$and' || cursor[0] === '$or') {\n combinator = CombinatorSchema.parse(cursor[0]);\n cursor = cursor.slice(1);\n if (cursor.length === 0) {\n throw new Error(`Invalid combinator in \"${raw}\" (missing condition after \"${combinator}\")`);\n }\n }\n\n const hasNot = cursor[0] === '$not';\n if (hasNot && !cursor[1]) {\n throw new Error(`Invalid \"$not\" usage in \"${raw}\" (missing operator after \"$not\")`);\n }\n\n const head = hasNot ? cursor[1] : cursor[0];\n const rest = hasNot ? cursor.slice(2).join(':') : cursor.slice(1).join(':');\n const not = hasNot ? true : undefined;\n\n if (!head?.startsWith('$')) {\n return ConditionSchema.parse({\n group,\n combinator,\n op: '$eq',\n value: cursor.join(':'),\n });\n }\n\n const op = OperatorSchema.parse(head);\n\n if (op === '$null') return ConditionSchema.parse({ group, combinator, op: '$null', not });\n\n if (op === '$eq') {\n let value: number | string;\n try {\n value = parseNumOrDateStrict(rest, '$eq');\n } catch {\n value = rest;\n }\n return ConditionSchema.parse({ group, combinator, op: '$eq', not, value });\n }\n\n if (op === '$btw') {\n const [aRaw, bRaw] = rest.split(',');\n if (!aRaw || !bRaw) throw new Error(`Invalid $btw \"${raw}\" (expected \"$btw:a,b\")`);\n const a = parseNumOrDateStrict(aRaw, '$btw');\n const b = parseNumOrDateStrict(bRaw, '$btw');\n assertSameKind(a, b, '$btw');\n return ConditionSchema.parse({ group, combinator, op: '$btw', not, value: [a, b] });\n }\n\n if (op === '$in' || op === '$contains') {\n const arr = rest\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n return ConditionSchema.parse({ group, combinator, op, not, value: arr });\n }\n\n if (op === '$gt' || op === '$gte' || op === '$lt' || op === '$lte') {\n const v = parseNumOrDateStrict(rest, op);\n return ConditionSchema.parse({ group, combinator, op, not, value: v });\n }\n\n // $ilike | $sw\n return ConditionSchema.parse({ group, combinator, op, not, value: rest });\n}\n\n/* ---------------------------------- */\n/* Extract raw filters */\n/* ---------------------------------- */\n\nfunction extractAndNormalizeRawFilters(q: QueryStringRecord): Record<string, Condition[]> {\n const result: Record<string, Condition[]> = {};\n\n for (const [k, v] of Object.entries(q)) {\n if (!k.startsWith('filter.')) continue;\n\n const field = k.slice('filter.'.length).trim();\n if (!field) continue;\n\n const rawList = toStringArrayFromQueryString(v);\n result[field] = rawList.filter(Boolean).map(parseSingleCondition);\n }\n\n return result;\n}\n\nfunction toQueryStringRecord(q: Record<string, unknown>): QueryStringRecord {\n const out: QueryStringRecord = {};\n for (const [k, v] of Object.entries(q)) {\n if (typeof v === 'string') {\n out[k] = v;\n continue;\n }\n if (Array.isArray(v) && v.every((x) => typeof x === 'string')) {\n out[k] = v;\n continue;\n }\n out[k] = undefined;\n }\n return out;\n}\n\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. Dynamic keys (filter.*, group.*) pass through\n * via .catchall(z.unknown()). 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 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 const qs = toQueryStringRecord(q);\n\n return {\n ...q,\n rawFilters: extractAndNormalizeRawFilters(qs),\n groupDefs: extractGroupDefs(q),\n };\n },\n )\n .pipe(\n baseSchema\n .superRefine((val, ctx): void => {\n // Pagination mode constraints\n if (config.paginationType === 'LIMIT_OFFSET') {\n if (val.cursor !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['cursor'],\n message: `cursor is not allowed when paginationType is LIMIT_OFFSET`,\n });\n }\n }\n\n if (config.paginationType === 'CURSOR') {\n if (val.page !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['page'],\n message: `page is not allowed when paginationType is CURSOR`,\n });\n }\n\n if (`${config.cursorProperty}`.trim().length === 0) {\n ctx.addIssue({\n code: 'custom',\n path: [],\n message: `cursorProperty must be a non-empty string when paginationType is CURSOR`,\n });\n }\n\n // Validate that cursor (if provided) can be coerced for that cursorProperty\n if (val.cursor !== undefined) {\n try {\n void coerceCursorFromProperty(config.dataSchema, config.cursorProperty, val.cursor);\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Invalid cursor';\n ctx.addIssue({\n code: 'custom',\n path: ['cursor'],\n message,\n });\n }\n }\n }\n\n // limit / maxLimit\n if (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/dist/select.d.ts
CHANGED
|
@@ -167,6 +167,8 @@ export interface SelectConfig<TSchema extends DataSchema, TSelect extends Allowe
|
|
|
167
167
|
dataSchema: TSchema;
|
|
168
168
|
/** Allowlist of selectable fields (dot-notation paths supported). */
|
|
169
169
|
selectable: readonly TSelect[];
|
|
170
|
+
/** Fields that are decorative (added manually, not from DB). Subset of selectable. */
|
|
171
|
+
decorative?: readonly TSelect[];
|
|
170
172
|
/** Default fields returned when `select` is omitted from the query. Use `"*"` to select all. */
|
|
171
173
|
defaultSelect: readonly TSelect[] | '*';
|
|
172
174
|
/** Shape of `data` in the response: `"many"` returns an array, `"one"` returns a single object. @default "many" */
|
|
@@ -196,6 +198,8 @@ export type TypedProjectedData<TSchema extends DataSchema, TSelect extends Allow
|
|
|
196
198
|
};
|
|
197
199
|
export interface SelectQueryPayload<TSchema extends DataSchema, TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>, TResponseType extends SelectResponseType = SelectResponseType> {
|
|
198
200
|
fields: TSelect[];
|
|
201
|
+
/** Subset of `fields` that are decorative (not from DB, added manually). */
|
|
202
|
+
decorativeFields?: TSelect[];
|
|
199
203
|
responseType: TResponseType;
|
|
200
204
|
}
|
|
201
205
|
/** Shorthand for `SelectQueryPayload` with `responseType: 'one'`. */
|
|
@@ -239,17 +243,21 @@ export interface SelectResult<TSchema extends DataSchema, TSelectable extends Al
|
|
|
239
243
|
* - `validatorSchema`: A function that takes the already-parsed query parameters and returns a Zod schema for validating the response.
|
|
240
244
|
* - `responseSchema`: A pre-built Zod schema for validating the response (uses defaultSelect or all selectable fields).
|
|
241
245
|
*/
|
|
242
|
-
export declare function select<TSchema extends DataSchema, const TSelectable extends readonly AllowedSelectablePath<TSchema>[], const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<TSelectable[number]>[]>(config: Omit<SelectConfig<TSchema, TSelectable[number], 'one'>, 'selectable' | 'defaultSelect'> & {
|
|
246
|
+
export declare function select<TSchema extends DataSchema, const TSelectable extends readonly AllowedSelectablePath<TSchema>[], const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<TSelectable[number]>[]>(config: Omit<SelectConfig<TSchema, TSelectable[number], 'one'>, 'selectable' | 'defaultSelect' | 'decorative'> & {
|
|
243
247
|
/** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */
|
|
244
248
|
selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;
|
|
249
|
+
/** Fields that are decorative (added manually, not from DB). Subset of selectable. */
|
|
250
|
+
decorative?: readonly NoInfer<TSelectable[number]>[];
|
|
245
251
|
/** Default fields returned when `select` is omitted. Use `"*"` to select all. */
|
|
246
252
|
defaultSelect: NoDuplicates<TDefaultSelect> | '*';
|
|
247
253
|
/** Shape of `data` in the response: `"one"` returns a single object. */
|
|
248
254
|
responseType: 'one';
|
|
249
255
|
}): SelectResult<TSchema, TSelectable[number], 'one'>;
|
|
250
|
-
export declare function select<TSchema extends DataSchema, const TSelectable extends readonly AllowedSelectablePath<TSchema>[], const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<TSelectable[number]>[]>(config: Omit<SelectConfig<TSchema, TSelectable[number]>, 'selectable' | 'defaultSelect'> & {
|
|
256
|
+
export declare function select<TSchema extends DataSchema, const TSelectable extends readonly AllowedSelectablePath<TSchema>[], const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<TSelectable[number]>[]>(config: Omit<SelectConfig<TSchema, TSelectable[number]>, 'selectable' | 'defaultSelect' | 'decorative'> & {
|
|
251
257
|
/** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */
|
|
252
258
|
selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;
|
|
259
|
+
/** Fields that are decorative (added manually, not from DB). Subset of selectable. */
|
|
260
|
+
decorative?: readonly NoInfer<TSelectable[number]>[];
|
|
253
261
|
/** Default fields returned when `select` is omitted. Use `"*"` to select all. */
|
|
254
262
|
defaultSelect: NoDuplicates<TDefaultSelect> | '*';
|
|
255
263
|
/** Shape of `data` in the response: `"many"` returns an array (default). */
|
package/dist/select.js
CHANGED
|
@@ -537,6 +537,7 @@ function select(config) {
|
|
|
537
537
|
const discriminatorKey = getDiscriminatorKey(config.dataSchema);
|
|
538
538
|
const nestedDiscriminators = findNestedDiscriminators(config.dataSchema);
|
|
539
539
|
const selectableStrings = [...config.selectable];
|
|
540
|
+
const decorativeSet = new Set((config.decorative ?? []).map(String));
|
|
540
541
|
const effectiveConfig = {
|
|
541
542
|
selectable: selectableStrings,
|
|
542
543
|
defaultSelect: config.defaultSelect === '*' ? '*' : Array.from(config.defaultSelect, String),
|
|
@@ -628,7 +629,14 @@ function select(config) {
|
|
|
628
629
|
// Safe: resolved values come from config.selectable (discriminator enforced at type level).
|
|
629
630
|
// plus the discriminator key (which is a valid AllowedPath<TSchema> at runtime).
|
|
630
631
|
const typedSelect = resolved.filter((field) => typeof field === 'string');
|
|
631
|
-
|
|
632
|
+
const decorativeFields = typedSelect.filter((f) => decorativeSet.has(String(f)));
|
|
633
|
+
return {
|
|
634
|
+
select: {
|
|
635
|
+
fields: typedSelect,
|
|
636
|
+
...(decorativeFields.length > 0 ? { decorativeFields } : {}),
|
|
637
|
+
responseType,
|
|
638
|
+
},
|
|
639
|
+
};
|
|
632
640
|
}));
|
|
633
641
|
function validatorSchema(parsed) {
|
|
634
642
|
const effectiveSelect = parsed?.fields ?? computeSelect(undefined, effectiveConfig) ?? undefined;
|
package/dist/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\n\n/* ---------------------------------- */\n/* Typed field paths (dot notation) */\n/* ---------------------------------- */\n\n/**\n * Primitive types that we consider as leaves in the Path type. Arrays are also considered leaves, since we don't want to generate paths like \"arrayField.0.someProp\".\n */\ntype Primitive = string | number | boolean | bigint | symbol | null | undefined | Date;\n\n/**\n * Join two path segments K and P with a dot, if both are strings. Otherwise, return never.\n */\ntype Join<K, P> = K extends string ? (P extends string ? `${K}.${P}` : never) : never;\n\n/**\n * Generate dot notation paths for a given type T, up to a certain depth D (default 5).\n * For example, for { a: { b: string }, c: number }, we would generate \"a\", \"a.b\", and \"c\". We stop recursion at depth 0 to prevent infinite types.\n */\ntype Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n\n/**\n * Generate dot notation paths for a given type T. For example, for { a: { b: string }, c: number }, we would generate \"a\", \"a.b\", and \"c\".\n */\nexport type Path<T, D extends number = 5> = D extends 0\n ? never\n : T extends Primitive\n ? never\n : T extends readonly (infer E)[]\n ? E extends Primitive\n ? never\n : Path<E, Prev[D]>\n : {\n [K in Extract<keyof T, string>]: T[K] extends Primitive\n ? K\n : T[K] extends readonly (infer E)[]\n ? E extends Primitive\n ? K\n : K | Join<K, Path<E, Prev[D]>>\n : K | Join<K, Path<T[K], Prev[D]>>;\n }[Extract<keyof T, string>];\n\n/**\n * Given a type T and a dot notation path P, resolve the type at that path.\n * For example, for T = { a: { b: string }, c: number } and P = \"a.b\", we would get string.\n */\nexport type PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[]\n ? PathValue<E, Rest>\n : PathValue<T[K], Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never;\n\n/**\n * Like `Path` but excludes intermediate object keys — only leaf paths are produced.\n * For `{ a: { b: string }, c: number }`, generates `\"a.b\"` and `\"c\"` (not `\"a\"`).\n * Object fields that contain only primitives at the leaf level are still represented via their dot-paths.\n */\nexport type LeafPath<T, D extends number = 5> = D extends 0\n ? never\n : T extends Primitive\n ? never\n : T extends readonly (infer E)[]\n ? E extends Primitive\n ? never\n : LeafPath<E, Prev[D]>\n : {\n [K in Extract<keyof T, string>]: T[K] extends Primitive\n ? K\n : T[K] extends readonly (infer E)[]\n ? E extends Primitive\n ? K\n : K | Join<K, LeafPath<E, Prev[D]>>\n : Join<K, LeafPath<T[K], Prev[D]>>;\n }[Extract<keyof T, string>];\n\n/* ---------------------------------- */\n/* Schema types */\n/* ---------------------------------- */\n\nexport type DataSchema =\n | z.ZodObject<z.ZodRawShape>\n | z.ZodDiscriminatedUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>\n | z.ZodUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>\n | z.ZodDiscriminatedUnion<\n readonly [z.ZodType<Record<string, unknown>>, ...z.ZodType<Record<string, unknown>>[]]\n >\n | z.ZodUnion<\n readonly [z.ZodType<Record<string, unknown>>, ...z.ZodType<Record<string, unknown>>[]]\n >;\nexport type InferData<TSchema extends DataSchema> = z.infer<TSchema>;\nexport type AllowedPath<TSchema extends DataSchema> = Path<InferData<TSchema>>;\nexport type AllowedSelectablePath<TSchema extends DataSchema> = LeafPath<InferData<TSchema>>;\n\n/**\n * Extract the discriminator key as a string literal from a ZodDiscriminatedUnion.\n * Returns `never` for plain ZodObject or ZodUnion.\n */\nexport type ExtractDiscriminator<TSchema> =\n TSchema extends z.ZodDiscriminatedUnion<\n z.ZodType<Record<string, unknown>>[],\n infer D extends string\n >\n ? D\n : never;\n\n/**\n * Evaluates to `never` when the readonly tuple `T` contains duplicate elements;\n * otherwise evaluates to `T` itself. Used to enforce unique items at the type level.\n */\ntype HasDuplicates<T extends readonly unknown[]> = T extends readonly [infer First, ...infer Rest]\n ? First extends Rest[number]\n ? true\n : HasDuplicates<Rest>\n : false;\nexport type NoDuplicates<T extends readonly unknown[]> = HasDuplicates<T> extends true ? never : T;\n\n/**\n * Extracts the `property` values from a readonly tuple of `{ property }` objects\n * into a tuple of their property types, enabling duplicate detection on those values.\n */\ntype PropertyValues<T extends readonly { property: unknown }[]> = T extends readonly [\n infer First extends { property: unknown },\n ...infer Rest extends { property: unknown }[],\n]\n ? [First['property'], ...PropertyValues<Rest>]\n : [];\n\n/**\n * Evaluates to `never` when the readonly tuple `T` contains two or more objects\n * with the same `property` value; otherwise evaluates to `T` itself.\n */\nexport type NoDuplicateProperties<T extends readonly { property: string }[]> =\n HasDuplicates<PropertyValues<T>> extends true ? never : T;\n\n/**\n * Enforces that `TSelectable` includes the discriminator key when `TSchema` is a `ZodDiscriminatedUnion`.\n * If the discriminator is missing, evaluates to `never`, causing a compile error.\n */\nexport type EnsureDiscriminatorInSelectable<\n TSchema extends DataSchema,\n TSelectable extends readonly string[],\n> = [ExtractDiscriminator<TSchema>] extends [never]\n ? TSelectable\n : ExtractDiscriminator<TSchema> extends TSelectable[number]\n ? TSelectable\n : never;\n\n/* ---------------------------------- */\n/* Response schema shapes (ZodObject) */\n/* ---------------------------------- */\n\n/**\n * Identity mapped type: converts an interface into a type alias with implicit\n * index signatures — required by Zod 4's ZodObject shape constraint.\n */\nexport type ZodShape<T> = { [K in keyof T]: T[K] };\n\ninterface SelectResponseSchemaShapeArrayDef {\n data: z.ZodArray<z.ZodObject<z.ZodRawShape>>;\n}\ninterface SelectResponseSchemaShapeArrayUnionDef {\n data: z.ZodArray<\n z.ZodUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>\n >;\n}\ninterface SelectResponseSchemaShapeObjectDef {\n data: z.ZodObject<z.ZodRawShape>;\n}\ninterface SelectResponseSchemaShapeObjectUnionDef {\n data: z.ZodUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>;\n}\nexport type SelectResponseSchemaShape =\n | ZodShape<SelectResponseSchemaShapeArrayDef>\n | ZodShape<SelectResponseSchemaShapeArrayUnionDef>\n | ZodShape<SelectResponseSchemaShapeObjectDef>\n | ZodShape<SelectResponseSchemaShapeObjectUnionDef>;\n\nexport type SelectResponseType = 'one' | 'many';\n\n/**\n * Zod schema for the \"select\" parameter, which can be a comma-separated string.\n * It normalizes the output to an array of strings.\n */\nexport const SelectSchema = z\n .string()\n .transform((s) =>\n s\n .split(',')\n .map((x) => x.trim())\n .filter(Boolean),\n )\n .refine((arr) => arr.length > 0, { message: 'select cannot be empty' });\n\n/* ---------------------------------- */\n/* Select config (shared) */\n/* ---------------------------------- */\n\n/** Selectable fields configuration shared between `select()` and `paginate()` internals. */\nexport interface SelectableConfig<\n TSchema extends DataSchema,\n TSelect extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n> {\n /** Allowlist of selectable fields (dot-notation paths supported). */\n selectable?: readonly TSelect[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: readonly TSelect[] | '*';\n}\n\n/** Untyped version of SelectableConfig for internal use with string arrays. */\nexport interface UntypedSelectableConfig {\n selectable?: readonly string[];\n defaultSelect: readonly string[] | '*';\n}\n\n/* ---------------------------------- */\n/* Allowlist helpers */\n/* ---------------------------------- */\n\n/**\n * Find a typed AllowedPath value from a string, by matching against a typed allowlist.\n * This avoids `as`: we return the existing typed value.\n */\nexport function pickFromAllowlist<T extends string>(\n allowlist: readonly T[] | undefined,\n value: string,\n): T | undefined {\n if (!allowlist) return undefined;\n for (const item of allowlist) {\n if (item === value) return item;\n }\n return undefined;\n}\n\n/** Expand \"*\" to selectable; otherwise map through allowlist. */\nexport function expandSelect<\n TSchema extends DataSchema,\n TSelect extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n>(\n select: readonly string[] | undefined,\n config: SelectableConfig<TSchema, TSelect>,\n): readonly TSelect[] | undefined;\nexport function expandSelect(\n select: readonly string[] | undefined,\n config: UntypedSelectableConfig,\n): readonly string[] | undefined;\nexport function expandSelect(\n select: readonly string[] | undefined,\n config: UntypedSelectableConfig,\n): readonly string[] | undefined {\n if (!select) return undefined;\n\n if (!select.includes('*')) {\n if (!config.selectable || config.selectable.length === 0) return undefined;\n\n const out: string[] = [];\n for (const field of select) {\n const picked = pickFromAllowlist(config.selectable, field);\n if (picked) out.push(picked);\n }\n return out;\n }\n\n if (config.selectable && config.selectable.length > 0) return [...config.selectable];\n return undefined;\n}\n\nexport function computeSelect<\n TSchema extends DataSchema,\n TSelect extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n>(select: string[] | undefined, config: SelectableConfig<TSchema, TSelect>): TSelect[] | undefined;\nexport function computeSelect(\n select: string[] | undefined,\n config: UntypedSelectableConfig,\n): string[] | undefined;\nexport function computeSelect(\n select: string[] | undefined,\n config: UntypedSelectableConfig,\n): string[] | undefined {\n if (select) {\n const expanded = expandSelect(select, config);\n if (!expanded) return undefined;\n return Array.from(new Set(expanded));\n }\n\n const defaultSelectArr: readonly string[] =\n config.defaultSelect === '*' ? ['*'] : config.defaultSelect;\n const expanded = expandSelect(defaultSelectArr, config);\n if (!expanded) return undefined;\n return Array.from(new Set(expanded));\n}\n\n/* ---------------------------------- */\n/* Projection helpers (NO \"as\") */\n/* ---------------------------------- */\n\ntype MutableShape = Record<string, z.ZodType>;\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nexport function getOwnProp(obj: Record<string, unknown>, key: string): unknown {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) return undefined;\n return obj[key];\n}\n\n/** Duck-typed Zod schema check. */\nexport function isZodSchema(v: unknown): v is z.ZodType {\n if (!isPlainObject(v)) return false;\n const parseFn = getOwnProp(v, 'parse');\n return typeof parseFn === 'function';\n}\n\n/** Duck-typed ZodObject check. */\nfunction isZodObjectSchema(v: unknown): v is z.ZodObject<z.ZodRawShape> {\n if (!isPlainObject(v)) return false;\n const parseFn = getOwnProp(v, 'parse');\n if (typeof parseFn !== 'function') return false;\n const shape = getOwnProp(v, 'shape');\n return isPlainObject(shape);\n}\n\n/** Duck-typed check for union schemas (ZodUnion / ZodDiscriminatedUnion). */\nfunction isZodUnionSchema(\n v: unknown,\n): v is { options: (z.ZodObject<z.ZodRawShape> | z.ZodType)[] } & z.ZodType {\n if (!isPlainObject(v)) return false;\n const options = getOwnProp(v, 'options');\n if (!Array.isArray(options) || options.length === 0) return false;\n // Each option must be a ZodObject or another union\n return options.every((o) => isZodObjectSchema(o) || isZodUnionSchema(o));\n}\n\n/** Duck-typed: get the element schema from a ZodArray. Returns undefined if not a ZodArray. */\nfunction getZodArrayElement(v: unknown): z.ZodType | undefined {\n if (!isPlainObject(v)) return undefined;\n const element = getOwnProp(v, 'element');\n if (isZodSchema(element)) return element;\n return undefined;\n}\n\n/** Try to unwrap one layer (optional, nullable, etc.) via `unwrap()` method. */\nfunction tryZodUnwrap(v: unknown): z.ZodType | undefined {\n if (!isPlainObject(v)) return undefined;\n const fn = getOwnProp(v, 'unwrap');\n if (typeof fn !== 'function') return undefined;\n const result: unknown = fn.call(v);\n if (isZodSchema(result)) return result;\n return undefined;\n}\n\n/**\n * Resolve a schema for path traversal: unwrap optional/nullable and array wrappers\n * to reach the inner ZodObject or ZodUnion that can be traversed further.\n */\nfunction resolveSchemaForTraversal(schema: unknown): {\n inner: unknown;\n isArray: boolean;\n isOptional: boolean;\n} {\n let current = schema;\n let isArray = false;\n let isOptional = false;\n\n for (let i = 0; i < 10; i += 1) {\n if (isZodObjectSchema(current) || isZodUnionSchema(current)) break;\n\n const element = getZodArrayElement(current);\n if (element) {\n isArray = true;\n current = element;\n continue;\n }\n\n const unwrapped = tryZodUnwrap(current);\n if (unwrapped) {\n isOptional = true;\n current = unwrapped;\n continue;\n }\n\n break;\n }\n\n return { inner: current, isArray, isOptional };\n}\n\n/**\n * Merge a union schema's leaf ZodObjects into a single ZodObject for path traversal\n * (first-seen key wins). Returns undefined if the value is not a union schema.\n */\nfunction mergeUnionForTraversal(v: unknown): z.ZodObject<z.ZodRawShape> | undefined {\n if (!isZodUnionSchema(v)) return undefined;\n const leaves = v.options.flatMap((option) => collectLeafObjects(option));\n const mergedShape: Record<string, z.ZodType> = {};\n for (const leaf of leaves) {\n for (const [key, value] of Object.entries(leaf.shape)) {\n if (!(key in mergedShape) && isZodSchema(value)) {\n mergedShape[key] = value;\n }\n }\n }\n return z.object(mergedShape);\n}\n\n/**\n * Recursively collect all leaf ZodObject schemas from a DataSchema.\n * Traverses nested unions (ZodUnion / ZodDiscriminatedUnion) to reach the ZodObject leaves.\n */\nexport function collectLeafObjects(schema: DataSchema | z.ZodType): z.ZodObject<z.ZodRawShape>[] {\n if (isZodObjectSchema(schema)) return [schema];\n if (isZodUnionSchema(schema)) {\n return schema.options.flatMap((option) => collectLeafObjects(option));\n }\n return [];\n}\n\n/**\n * Extract the discriminator key from a `z.discriminatedUnion()`.\n * Returns `undefined` for plain `z.union()` or `z.object()`.\n */\nexport function getDiscriminatorKey(schema: DataSchema): string | undefined {\n if (!isPlainObject(schema)) return undefined;\n const def = getOwnProp(schema, '_def');\n if (!isPlainObject(def)) return undefined;\n const disc = getOwnProp(def, 'discriminator');\n return typeof disc === 'string' ? disc : undefined;\n}\n\n/** Same as getDiscriminatorKey but accepts any value (for recursive schema walking). */\nfunction getDiscriminatorKeyFromAny(schema: unknown): string | undefined {\n if (!isPlainObject(schema)) return undefined;\n const def = getOwnProp(schema, '_def');\n if (!isPlainObject(def)) return undefined;\n const disc = getOwnProp(def, 'discriminator');\n return typeof disc === 'string' ? disc : undefined;\n}\n\n/** Duck-typed check for union-like schemas on any value. */\nfunction isUnionLike(v: unknown): v is { options: unknown[] } {\n if (!isPlainObject(v)) return false;\n const options = getOwnProp(v, 'options');\n return Array.isArray(options) && options.length > 0;\n}\n\nexport interface NestedDiscriminator {\n prefix: string;\n discriminatorPath: string;\n}\n\n/**\n * Recursively find all nested `z.discriminatedUnion()` schemas within a DataSchema.\n * Returns an array of `{ prefix, discriminatorPath }` for each nested discriminated union.\n * For example, if `codec` is a `z.discriminatedUnion(\"type\", ...)`, returns\n * `[{ prefix: \"codec\", discriminatorPath: \"codec.type\" }]`.\n *\n * Also detects top-level discriminators from nested union levels.\n * E.g. `discriminatedUnion('status', [ discriminatedUnion('materialType', [obj, ...]) ])`\n * returns both `{ prefix: '', discriminatorPath: 'status' }` and\n * `{ prefix: '', discriminatorPath: 'materialType' }`.\n */\nexport function findNestedDiscriminators(schema: DataSchema): NestedDiscriminator[] {\n const results: NestedDiscriminator[] = [];\n\n function walkObject(obj: unknown, prefix: string): void {\n if (!isZodObjectSchema(obj)) return;\n const shape = obj.shape;\n for (const [key, value] of Object.entries(shape)) {\n if (!isZodSchema(value)) continue;\n const fullPath = prefix ? `${prefix}.${key}` : key;\n const disc = getDiscriminatorKeyFromAny(value);\n if (disc) {\n results.push({ prefix: fullPath, discriminatorPath: `${fullPath}.${disc}` });\n // Recurse into each option of this nested union\n if (isUnionLike(value)) {\n for (const option of value.options) {\n walkObject(option, fullPath);\n }\n }\n } else if (isZodObjectSchema(value)) {\n walkObject(value, fullPath);\n }\n }\n }\n\n if (isZodObjectSchema(schema)) {\n walkObject(schema, '');\n } else if (isZodUnionSchema(schema)) {\n // Collect discriminator keys from all union levels (including nested unions)\n const unionDiscs = collectUnionDiscriminators(schema, '');\n results.push(...unionDiscs);\n // Walk leaf objects for nested discriminated union fields\n const leaves = collectLeafObjects(schema);\n for (const leaf of leaves) {\n walkObject(leaf, '');\n }\n }\n\n return results;\n}\n\n/**\n * Recursively collect discriminator keys from nested union levels.\n * For `discriminatedUnion('status', [discriminatedUnion('materialType', [...])])`,\n * this produces `{ prefix: '', discriminatorPath: 'status' }` and\n * `{ prefix: '', discriminatorPath: 'materialType' }`.\n */\nfunction collectUnionDiscriminators(\n schema: unknown,\n prefix: string,\n results: NestedDiscriminator[] = [],\n seen = new Set<string>(),\n): NestedDiscriminator[] {\n const disc = getDiscriminatorKeyFromAny(schema);\n if (disc) {\n const path = prefix ? `${prefix}.${disc}` : disc;\n if (!seen.has(path)) {\n seen.add(path);\n results.push({ prefix, discriminatorPath: path });\n }\n }\n if (isUnionLike(schema)) {\n for (const option of schema.options) {\n if (!isZodObjectSchema(option)) {\n // Nested union — recurse at the same prefix level\n collectUnionDiscriminators(option, prefix, results, seen);\n }\n }\n }\n return results;\n}\n\n/**\n * If the schema is a ZodObject, return it directly.\n * If the schema is a ZodUnion / ZodDiscriminatedUnion (possibly nested),\n * collect all leaf ZodObject shapes and merge them into a single ZodObject (first-seen key wins).\n */\nexport function resolveToZodObject(schema: DataSchema): z.ZodObject<z.ZodRawShape> {\n if (isZodObjectSchema(schema)) return schema;\n\n if (isZodUnionSchema(schema)) {\n const leaves = collectLeafObjects(schema);\n const mergedShape: Record<string, z.ZodType> = {};\n for (const leaf of leaves) {\n const shape = leaf.shape;\n for (const [key, value] of Object.entries(shape)) {\n if (!(key in mergedShape) && isZodSchema(value)) {\n mergedShape[key] = value;\n }\n }\n }\n return z.object(mergedShape);\n }\n\n throw new Error(\n 'dataSchema must be a ZodObject or a ZodUnion/ZodDiscriminatedUnion of ZodObjects',\n );\n}\n\nfunction getObjectShape(obj: z.ZodObject<z.ZodRawShape>): Readonly<Record<string, unknown>> {\n return obj.shape;\n}\n\n/** Check whether a dot-path resolves successfully inside a single ZodObject. */\nfunction hasPathInObject(obj: z.ZodObject<z.ZodRawShape>, path: string): boolean {\n const parts = path.split('.').filter(Boolean);\n let current: unknown = obj;\n for (const p of parts) {\n const { inner } = resolveSchemaForTraversal(current);\n current = inner;\n const resolved = isZodObjectSchema(current) ? current : mergeUnionForTraversal(current);\n if (!resolved) return false;\n const shape = getObjectShape(resolved);\n const next = shape[p];\n if (!next || !isZodSchema(next)) return false;\n current = next;\n }\n return true;\n}\n\n/**\n * Recursively apply `.optional()` to all properties of a ZodObject,\n * descending into nested ZodObject shapes.\n */\nfunction deepPartial(schema: z.ZodObject<z.ZodRawShape>): z.ZodObject<z.ZodRawShape> {\n const shape: MutableShape = {};\n for (const [key, value] of Object.entries(schema.shape)) {\n if (!isZodSchema(value)) continue;\n if (isZodObjectSchema(value)) {\n shape[key] = deepPartial(value).optional();\n } else {\n shape[key] = value.optional();\n }\n }\n return z.object(shape);\n}\n\n/**\n * Project a DataSchema preserving the union structure (including nested unions).\n * - ZodObject → delegates to `projectDataSchema`.\n * - ZodUnion / ZodDiscriminatedUnion → projects each option independently\n * (paths that don't exist in a given option are skipped) and returns `z.union([...])`.\n * If an option is itself a union, recurse into it preserving the nested structure.\n *\n * When `partial` is true, a recursive deep partial is applied to each projected option\n * **before** wrapping in the union, so you get\n * `z.union([deepPartial(OptionA), deepPartial(OptionB)])` instead of a single merged partial.\n */\n\n/** Internal helper: project a nested union that may not match the DataSchema type exactly. */\nfunction projectNestedUnion(\n schema: { options: (z.ZodObject<z.ZodRawShape> | z.ZodType)[] } & z.ZodType,\n selectedPaths: string[],\n opts?: { partial?: boolean },\n): z.ZodType {\n const projected: z.ZodType[] = schema.options.map((option) => {\n if (isZodUnionSchema(option) && !isZodObjectSchema(option)) {\n return projectNestedUnion(option, selectedPaths, opts);\n }\n if (!isZodObjectSchema(option)) {\n throw new Error('Union option is neither a ZodObject nor a ZodUnion');\n }\n const validPaths = selectedPaths.filter((p) => hasPathInObject(option, p));\n const obj = validPaths.length > 0 ? projectDataSchema(option, validPaths) : z.object({});\n return opts?.partial ? deepPartial(obj) : obj;\n });\n\n const first = projected[0];\n const second = projected[1];\n if (!first || !second) {\n throw new Error('Union must have at least 2 options');\n }\n return z.union([first, second, ...projected.slice(2)]);\n}\n\nexport function projectDataSchemaPreservingUnion(\n dataSchema: DataSchema,\n selectedPaths: string[],\n options?: { partial?: boolean },\n): z.ZodType {\n if (isZodObjectSchema(dataSchema)) {\n const projected = projectDataSchema(dataSchema, selectedPaths);\n return options?.partial ? deepPartial(projected) : projected;\n }\n\n if (isZodUnionSchema(dataSchema)) {\n return projectNestedUnion(dataSchema, selectedPaths, options);\n }\n\n throw new Error(\n 'dataSchema must be a ZodObject or a ZodUnion/ZodDiscriminatedUnion of ZodObjects',\n );\n}\n\nexport function getZodAtPath(obj: DataSchema, path: string): z.ZodType {\n const parts = path.split('.').filter(Boolean);\n\n let current: unknown = resolveToZodObject(obj);\n\n for (const p of parts) {\n const { inner } = resolveSchemaForTraversal(current);\n current = inner;\n\n const resolved = isZodObjectSchema(current) ? current : mergeUnionForTraversal(current);\n if (!resolved) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not inside a ZodObject`);\n }\n\n const shape = getObjectShape(resolved);\n const next = shape[p];\n\n if (!next) throw new Error(`dataSchema path \"${path}\" is invalid: missing key \"${p}\"`);\n if (!isZodSchema(next)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not a Zod schema`);\n }\n\n current = next;\n }\n\n if (!isZodSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: resolved value is not a Zod schema`);\n }\n\n return current;\n}\n\nexport function projectDataSchema(\n dataSchema: DataSchema,\n selectedPaths: string[],\n): z.ZodObject<z.ZodRawShape> {\n type UnionSchema = { options: (z.ZodObject<z.ZodRawShape> | z.ZodType)[] } & z.ZodType;\n\n const tree: Record<string, unknown> = {};\n const arrayPaths = new Set<string>();\n const optionalPaths = new Set<string>();\n const unionAtPath = new Map<string, UnionSchema>();\n\n const ensureTreeNode = (node: Record<string, unknown>, key: string): Record<string, unknown> => {\n const existing = node[key];\n\n if (existing === undefined) {\n const child: Record<string, unknown> = {};\n node[key] = child;\n return child;\n }\n\n if (isPlainObject(existing)) return existing;\n\n if (isZodSchema(existing)) {\n throw new Error(`Cannot project \"${key}\": \"${key}\" is selected as a leaf and as an object`);\n }\n\n throw new Error(`Cannot project \"${key}\": conflicting selection`);\n };\n\n for (const fullPath of selectedPaths) {\n const parts = fullPath.split('.').filter(Boolean);\n if (parts.length === 0) continue;\n\n let cursor = tree;\n\n // Walk the original schema alongside the tree to detect array/optional wrappers\n let schemaWalk: unknown = resolveToZodObject(dataSchema);\n\n for (let i = 0; i < parts.length; i += 1) {\n const key = parts[i];\n if (!key) continue;\n\n const isLeaf = i === parts.length - 1;\n\n // Resolve schemaWalk to a traversable ZodObject (or merge union for traversal)\n const { inner } = resolveSchemaForTraversal(schemaWalk);\n schemaWalk = inner;\n if (!isZodObjectSchema(schemaWalk)) {\n const merged = mergeUnionForTraversal(schemaWalk);\n if (merged) schemaWalk = merged;\n }\n\n if (isZodObjectSchema(schemaWalk)) {\n const shape = getObjectShape(schemaWalk);\n const rawField = shape[key];\n\n if (rawField && isZodSchema(rawField)) {\n const partialPath = parts.slice(0, i + 1).join('.');\n const wrapInfo = resolveSchemaForTraversal(rawField);\n if (wrapInfo.isArray) arrayPaths.add(partialPath);\n if (wrapInfo.isOptional) optionalPaths.add(partialPath);\n\n // Track nested unions at intermediate paths so buildObjectFromTree\n // can preserve the union structure instead of merging into a single object.\n if (!isLeaf && isZodUnionSchema(wrapInfo.inner)) {\n unionAtPath.set(partialPath, wrapInfo.inner);\n }\n\n // Advance schema walk to the unwrapped inner for next iteration\n schemaWalk = isLeaf ? rawField : wrapInfo.inner;\n }\n }\n\n if (isLeaf) {\n cursor[key] = getZodAtPath(dataSchema, fullPath);\n } else {\n cursor = ensureTreeNode(cursor, key);\n }\n }\n }\n\n /** Collect leaf dot-paths from a projection tree node. */\n const collectTreePaths = (node: Record<string, unknown>, prefix = ''): string[] => {\n const paths: string[] = [];\n for (const [key, value] of Object.entries(node)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (isZodSchema(value)) {\n paths.push(path);\n } else if (isPlainObject(value)) {\n paths.push(...collectTreePaths(value, path));\n }\n }\n return paths;\n };\n\n const buildObjectFromTree = (\n node: Record<string, unknown>,\n parentPath: string,\n ): z.ZodObject<z.ZodRawShape> => {\n const shape: MutableShape = {};\n\n for (const [k, v] of Object.entries(node)) {\n const childPath = parentPath ? `${parentPath}.${k}` : k;\n\n if (isZodSchema(v)) {\n shape[k] = v;\n continue;\n }\n if (isPlainObject(v)) {\n const nestedUnion = unionAtPath.get(childPath);\n let built: z.ZodType;\n if (nestedUnion) {\n // Preserve the nested union structure by projecting each option independently.\n const subPaths = collectTreePaths(v);\n built = projectNestedUnion(nestedUnion, subPaths);\n } else {\n built = buildObjectFromTree(v, childPath);\n }\n if (arrayPaths.has(childPath)) built = z.array(built);\n if (optionalPaths.has(childPath)) built = built.optional();\n shape[k] = built;\n continue;\n }\n throw new Error(`Invalid projection tree at \"${k}\"`);\n }\n\n return z.object(shape);\n };\n\n return buildObjectFromTree(tree, '');\n}\n\n/* ---------------------------------- */\n/* Config */\n/* ---------------------------------- */\n\n/** Configuration for the `select()` factory. */\nexport interface SelectConfig<\n TSchema extends DataSchema,\n TSelect extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n TResponseType extends SelectResponseType = 'many',\n> {\n /** Zod schema representing one data item (object, discriminated union, or union). */\n dataSchema: TSchema;\n /** Allowlist of selectable fields (dot-notation paths supported). */\n selectable: readonly TSelect[];\n /** Default fields returned when `select` is omitted from the query. Use `\"*\"` to select all. */\n defaultSelect: readonly TSelect[] | '*';\n /** Shape of `data` in the response: `\"many\"` returns an array, `\"one\"` returns a single object. @default \"many\" */\n responseType?: TResponseType;\n}\n\n/* ---------------------------------- */\n/* Output */\n/* ---------------------------------- */\n\n/**\n * Extract the top-level key from a dot-path.\n * e.g. `'meta.score'` → `'meta'`, `'id'` → `'id'`.\n */\nexport type TopLevelKey<P extends string> = P extends `${infer K}.${string}` ? K : P;\n\n/**\n * Projected data item: exposes only the selectable keys of the original schema\n * with `unknown` values. This gives consumers key auto-completion\n * without requiring `as` (projectDataSchema erases value types at runtime).\n */\nexport type ProjectedData<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = Partial<Record<TopLevelKey<TSelect> & keyof InferData<TSchema>, unknown>>;\n\n/**\n * Typed projected data item: like `ProjectedData` but resolves value types\n * via `PathValue`. For top-level paths the value type is exact; for nested\n * dot-paths (e.g. `'meta.score'`) the top-level key is typed as the full\n * nested object (not the leaf), so partial nested projections may be wider\n * than the runtime shape. Use this when you need value-level type safety\n * and accept that trade-off.\n */\nexport type TypedProjectedData<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = {\n [K in TopLevelKey<TSelect> & keyof InferData<TSchema>]?: InferData<TSchema>[K];\n};\n\nexport interface SelectQueryPayload<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n TResponseType extends SelectResponseType = SelectResponseType,\n> {\n fields: TSelect[];\n responseType: TResponseType;\n}\n\n/** Shorthand for `SelectQueryPayload` with `responseType: 'one'`. */\nexport type SelectOneQueryPayload<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = SelectQueryPayload<TSchema, TSelect, 'one'>;\n\n/** Shorthand for `SelectQueryPayload` with `responseType: 'many'`. */\nexport type SelectManyQueryPayload<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = SelectQueryPayload<TSchema, TSelect, 'many'>;\n\nexport interface SelectQueryParams<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n TResponseType extends SelectResponseType = SelectResponseType,\n> {\n select: SelectQueryPayload<TSchema, TSelect, TResponseType>;\n}\n\nexport type SelectResponseData<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema>,\n TResponseType extends SelectResponseType,\n> = TResponseType extends 'one'\n ? TypedProjectedData<TSchema, TSelect>\n : TypedProjectedData<TSchema, TSelect>[];\n\nexport interface SelectResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n TResponseType extends SelectResponseType = 'many',\n> {\n data: SelectResponseData<TSchema, TSelect, TResponseType>;\n}\n\n/** Shorthand for `SelectResponse` with `responseType: 'one'` (data is a single object). */\nexport type SelectOneResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = SelectResponse<TSchema, TSelect, 'one'>;\n\n/** Shorthand for `SelectResponse` with `responseType: 'many'` (data is an array). */\nexport type SelectManyResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = SelectResponse<TSchema, TSelect>;\n\n/**\n * Result type returned by `select()`. Use this instead of\n * `ReturnType<typeof select>` to preserve the generic `TSchema`.\n *\n * @example\n * function createSelector(): SelectResult<typeof MySchema> {\n * return select({ dataSchema: MySchema, … });\n * }\n */\nexport interface SelectResult<\n TSchema extends DataSchema,\n TSelectable extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n TResponseType extends SelectResponseType = SelectResponseType,\n> {\n queryParamsSchema: {\n (): z.ZodType<SelectQueryParams<TSchema, TSelectable, TResponseType>>;\n <TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<\n SelectQueryParams<TSchema, TSelectable, TResponseType> & z.infer<z.ZodObject<TExtraShape>>\n >;\n };\n validatorSchema: (\n parsed?: SelectQueryPayload<TSchema, TSelectable>,\n ) => z.ZodType<SelectResponse<TSchema, TSelectable, TResponseType>>;\n responseSchema: z.ZodObject<SelectResponseSchemaShape>;\n responseType: TResponseType;\n}\n\n/* ---------------------------------- */\n/* Factory */\n/* ---------------------------------- */\n\n/**\n * Generate Zod schemas and runtime validators for select-only query parameters, based on a config object.\n * @param config The configuration object defining the selectable 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 validating the response.\n * - `responseSchema`: A pre-built Zod schema for validating the response (uses defaultSelect or all selectable fields).\n */\nexport function select<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n>(\n config: Omit<\n SelectConfig<TSchema, TSelectable[number], 'one'>,\n 'selectable' | 'defaultSelect'\n > & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Shape of `data` in the response: `\"one\"` returns a single object. */\n responseType: 'one';\n },\n): SelectResult<TSchema, TSelectable[number], 'one'>;\n\nexport function select<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n>(\n config: Omit<SelectConfig<TSchema, TSelectable[number]>, 'selectable' | 'defaultSelect'> & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Shape of `data` in the response: `\"many\"` returns an array (default). */\n responseType?: 'many';\n },\n): SelectResult<TSchema, TSelectable[number], 'many'>;\n\nexport function select<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n>(\n config: Omit<\n SelectConfig<TSchema, TSelectable[number], SelectResponseType>,\n 'selectable' | 'defaultSelect'\n > & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: NoDuplicates<TSelectable> & EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n },\n): SelectResult<TSchema, TSelectable[number]> {\n const responseType: SelectResponseType = config.responseType ?? 'many';\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\n const baseSchema = z.object({\n select: SelectSchema.optional(),\n });\n\n const selectableList = selectableStrings.join(', ');\n const defaultSelectDesc =\n config.defaultSelect === '*' ? '*' : [...config.defaultSelect].join(',');\n\n const rootShape: Record<string, z.ZodType> = {\n select: z\n .string()\n .optional()\n .meta({\n description: `Comma-separated list of fields to include in the response. Allowed: ${selectableList}. Use \"*\" to select all. Default: ${defaultSelectDesc}`,\n example: defaultSelectDesc,\n }),\n };\n\n const baseQueryParamsSchema: z.ZodType<SelectQueryParams<TSchema, TSelectable[number]>> = z\n .object(rootShape)\n .catchall(z.unknown())\n .transform((q): Record<string, unknown> => {\n const raw = q.select;\n return {\n ...q,\n select: typeof raw === 'string' ? raw : undefined,\n };\n })\n .pipe(\n baseSchema\n .superRefine((val, ctx): void => {\n const selectForValidation: readonly string[] =\n val.select ??\n (effectiveConfig.defaultSelect === '*' ? ['*'] : effectiveConfig.defaultSelect);\n\n const hasWildcard = selectForValidation.includes('*');\n\n let index = 0;\n for (const field of selectForValidation) {\n if (field === '*') {\n index += 1;\n continue;\n }\n\n if (!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 (empty selectable)',\n });\n }\n }\n\n if (discriminatorKey && !hasWildcard && !selectForValidation.includes(discriminatorKey)) {\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 .transform((val): SelectQueryParams<TSchema, TSelectable[number]> => {\n const resolved = computeSelect(val.select, effectiveConfig);\n\n if (!resolved || resolved.length === 0) {\n throw new Error('select resolved to empty (this should not happen after validation)');\n }\n\n // Safe: resolved values come from config.selectable (discriminator enforced at type level).\n // plus the discriminator key (which is a valid AllowedPath<TSchema> at runtime).\n const typedSelect: TSelectable[number][] = resolved.filter(\n (field): field is TSelectable[number] => typeof field === 'string',\n );\n\n return { select: { fields: typedSelect, responseType } };\n }),\n );\n\n function validatorSchema(\n parsed?: SelectQueryPayload<TSchema, TSelectable[number]>,\n ): z.ZodType<SelectResponse<TSchema, TSelectable[number], SelectResponseType>>;\n function validatorSchema(parsed?: SelectQueryPayload<TSchema, TSelectable[number]>): z.ZodType {\n const effectiveSelect =\n parsed?.fields ?? computeSelect(undefined, effectiveConfig) ?? undefined;\n\n const dataItemSchema: z.ZodType =\n effectiveSelect && effectiveSelect.length > 0\n ? projectDataSchemaPreservingUnion(config.dataSchema, effectiveSelect.map(String))\n : resolveToZodObject(config.dataSchema);\n\n const dataSchema = responseType === 'one' ? dataItemSchema : z.array(dataItemSchema);\n const schema: z.ZodType = z.object({ data: dataSchema });\n return schema;\n }\n\n const dataItemSchema: z.ZodType =\n selectableStrings.length > 0\n ? projectDataSchemaPreservingUnion(config.dataSchema, selectableStrings, { partial: true })\n : resolveToZodObject(config.dataSchema);\n const dataSchemaForResponse = responseType === 'one' ? dataItemSchema : z.array(dataItemSchema);\n\n function buildResponseSchema(): z.ZodObject<SelectResponseSchemaShape>;\n function buildResponseSchema(): z.ZodType {\n return z.object({ data: dataSchemaForResponse });\n }\n const responseSchema = buildResponseSchema();\n\n function queryParamsSchema(): z.ZodType<SelectQueryParams<TSchema, TSelectable[number]>>;\n function queryParamsSchema<TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<SelectQueryParams<TSchema, TSelectable[number]> & 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 baseResult = baseQueryParamsSchema.safeParse(raw);\n if (!baseResult.success) {\n for (const issue of baseResult.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 {\n queryParamsSchema,\n validatorSchema,\n responseSchema,\n responseType,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\n\n/* ---------------------------------- */\n/* Typed field paths (dot notation) */\n/* ---------------------------------- */\n\n/**\n * Primitive types that we consider as leaves in the Path type. Arrays are also considered leaves, since we don't want to generate paths like \"arrayField.0.someProp\".\n */\ntype Primitive = string | number | boolean | bigint | symbol | null | undefined | Date;\n\n/**\n * Join two path segments K and P with a dot, if both are strings. Otherwise, return never.\n */\ntype Join<K, P> = K extends string ? (P extends string ? `${K}.${P}` : never) : never;\n\n/**\n * Generate dot notation paths for a given type T, up to a certain depth D (default 5).\n * For example, for { a: { b: string }, c: number }, we would generate \"a\", \"a.b\", and \"c\". We stop recursion at depth 0 to prevent infinite types.\n */\ntype Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n\n/**\n * Generate dot notation paths for a given type T. For example, for { a: { b: string }, c: number }, we would generate \"a\", \"a.b\", and \"c\".\n */\nexport type Path<T, D extends number = 5> = D extends 0\n ? never\n : T extends Primitive\n ? never\n : T extends readonly (infer E)[]\n ? E extends Primitive\n ? never\n : Path<E, Prev[D]>\n : {\n [K in Extract<keyof T, string>]: T[K] extends Primitive\n ? K\n : T[K] extends readonly (infer E)[]\n ? E extends Primitive\n ? K\n : K | Join<K, Path<E, Prev[D]>>\n : K | Join<K, Path<T[K], Prev[D]>>;\n }[Extract<keyof T, string>];\n\n/**\n * Given a type T and a dot notation path P, resolve the type at that path.\n * For example, for T = { a: { b: string }, c: number } and P = \"a.b\", we would get string.\n */\nexport type PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[]\n ? PathValue<E, Rest>\n : PathValue<T[K], Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never;\n\n/**\n * Like `Path` but excludes intermediate object keys — only leaf paths are produced.\n * For `{ a: { b: string }, c: number }`, generates `\"a.b\"` and `\"c\"` (not `\"a\"`).\n * Object fields that contain only primitives at the leaf level are still represented via their dot-paths.\n */\nexport type LeafPath<T, D extends number = 5> = D extends 0\n ? never\n : T extends Primitive\n ? never\n : T extends readonly (infer E)[]\n ? E extends Primitive\n ? never\n : LeafPath<E, Prev[D]>\n : {\n [K in Extract<keyof T, string>]: T[K] extends Primitive\n ? K\n : T[K] extends readonly (infer E)[]\n ? E extends Primitive\n ? K\n : K | Join<K, LeafPath<E, Prev[D]>>\n : Join<K, LeafPath<T[K], Prev[D]>>;\n }[Extract<keyof T, string>];\n\n/* ---------------------------------- */\n/* Schema types */\n/* ---------------------------------- */\n\nexport type DataSchema =\n | z.ZodObject<z.ZodRawShape>\n | z.ZodDiscriminatedUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>\n | z.ZodUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>\n | z.ZodDiscriminatedUnion<\n readonly [z.ZodType<Record<string, unknown>>, ...z.ZodType<Record<string, unknown>>[]]\n >\n | z.ZodUnion<\n readonly [z.ZodType<Record<string, unknown>>, ...z.ZodType<Record<string, unknown>>[]]\n >;\nexport type InferData<TSchema extends DataSchema> = z.infer<TSchema>;\nexport type AllowedPath<TSchema extends DataSchema> = Path<InferData<TSchema>>;\nexport type AllowedSelectablePath<TSchema extends DataSchema> = LeafPath<InferData<TSchema>>;\n\n/**\n * Extract the discriminator key as a string literal from a ZodDiscriminatedUnion.\n * Returns `never` for plain ZodObject or ZodUnion.\n */\nexport type ExtractDiscriminator<TSchema> =\n TSchema extends z.ZodDiscriminatedUnion<\n z.ZodType<Record<string, unknown>>[],\n infer D extends string\n >\n ? D\n : never;\n\n/**\n * Evaluates to `never` when the readonly tuple `T` contains duplicate elements;\n * otherwise evaluates to `T` itself. Used to enforce unique items at the type level.\n */\ntype HasDuplicates<T extends readonly unknown[]> = T extends readonly [infer First, ...infer Rest]\n ? First extends Rest[number]\n ? true\n : HasDuplicates<Rest>\n : false;\nexport type NoDuplicates<T extends readonly unknown[]> = HasDuplicates<T> extends true ? never : T;\n\n/**\n * Extracts the `property` values from a readonly tuple of `{ property }` objects\n * into a tuple of their property types, enabling duplicate detection on those values.\n */\ntype PropertyValues<T extends readonly { property: unknown }[]> = T extends readonly [\n infer First extends { property: unknown },\n ...infer Rest extends { property: unknown }[],\n]\n ? [First['property'], ...PropertyValues<Rest>]\n : [];\n\n/**\n * Evaluates to `never` when the readonly tuple `T` contains two or more objects\n * with the same `property` value; otherwise evaluates to `T` itself.\n */\nexport type NoDuplicateProperties<T extends readonly { property: string }[]> =\n HasDuplicates<PropertyValues<T>> extends true ? never : T;\n\n/**\n * Enforces that `TSelectable` includes the discriminator key when `TSchema` is a `ZodDiscriminatedUnion`.\n * If the discriminator is missing, evaluates to `never`, causing a compile error.\n */\nexport type EnsureDiscriminatorInSelectable<\n TSchema extends DataSchema,\n TSelectable extends readonly string[],\n> = [ExtractDiscriminator<TSchema>] extends [never]\n ? TSelectable\n : ExtractDiscriminator<TSchema> extends TSelectable[number]\n ? TSelectable\n : never;\n\n/* ---------------------------------- */\n/* Response schema shapes (ZodObject) */\n/* ---------------------------------- */\n\n/**\n * Identity mapped type: converts an interface into a type alias with implicit\n * index signatures — required by Zod 4's ZodObject shape constraint.\n */\nexport type ZodShape<T> = { [K in keyof T]: T[K] };\n\ninterface SelectResponseSchemaShapeArrayDef {\n data: z.ZodArray<z.ZodObject<z.ZodRawShape>>;\n}\ninterface SelectResponseSchemaShapeArrayUnionDef {\n data: z.ZodArray<\n z.ZodUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>\n >;\n}\ninterface SelectResponseSchemaShapeObjectDef {\n data: z.ZodObject<z.ZodRawShape>;\n}\ninterface SelectResponseSchemaShapeObjectUnionDef {\n data: z.ZodUnion<readonly [z.ZodObject<z.ZodRawShape>, ...z.ZodObject<z.ZodRawShape>[]]>;\n}\nexport type SelectResponseSchemaShape =\n | ZodShape<SelectResponseSchemaShapeArrayDef>\n | ZodShape<SelectResponseSchemaShapeArrayUnionDef>\n | ZodShape<SelectResponseSchemaShapeObjectDef>\n | ZodShape<SelectResponseSchemaShapeObjectUnionDef>;\n\nexport type SelectResponseType = 'one' | 'many';\n\n/**\n * Zod schema for the \"select\" parameter, which can be a comma-separated string.\n * It normalizes the output to an array of strings.\n */\nexport const SelectSchema = z\n .string()\n .transform((s) =>\n s\n .split(',')\n .map((x) => x.trim())\n .filter(Boolean),\n )\n .refine((arr) => arr.length > 0, { message: 'select cannot be empty' });\n\n/* ---------------------------------- */\n/* Select config (shared) */\n/* ---------------------------------- */\n\n/** Selectable fields configuration shared between `select()` and `paginate()` internals. */\nexport interface SelectableConfig<\n TSchema extends DataSchema,\n TSelect extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n> {\n /** Allowlist of selectable fields (dot-notation paths supported). */\n selectable?: readonly TSelect[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: readonly TSelect[] | '*';\n}\n\n/** Untyped version of SelectableConfig for internal use with string arrays. */\nexport interface UntypedSelectableConfig {\n selectable?: readonly string[];\n defaultSelect: readonly string[] | '*';\n}\n\n/* ---------------------------------- */\n/* Allowlist helpers */\n/* ---------------------------------- */\n\n/**\n * Find a typed AllowedPath value from a string, by matching against a typed allowlist.\n * This avoids `as`: we return the existing typed value.\n */\nexport function pickFromAllowlist<T extends string>(\n allowlist: readonly T[] | undefined,\n value: string,\n): T | undefined {\n if (!allowlist) return undefined;\n for (const item of allowlist) {\n if (item === value) return item;\n }\n return undefined;\n}\n\n/** Expand \"*\" to selectable; otherwise map through allowlist. */\nexport function expandSelect<\n TSchema extends DataSchema,\n TSelect extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n>(\n select: readonly string[] | undefined,\n config: SelectableConfig<TSchema, TSelect>,\n): readonly TSelect[] | undefined;\nexport function expandSelect(\n select: readonly string[] | undefined,\n config: UntypedSelectableConfig,\n): readonly string[] | undefined;\nexport function expandSelect(\n select: readonly string[] | undefined,\n config: UntypedSelectableConfig,\n): readonly string[] | undefined {\n if (!select) return undefined;\n\n if (!select.includes('*')) {\n if (!config.selectable || config.selectable.length === 0) return undefined;\n\n const out: string[] = [];\n for (const field of select) {\n const picked = pickFromAllowlist(config.selectable, field);\n if (picked) out.push(picked);\n }\n return out;\n }\n\n if (config.selectable && config.selectable.length > 0) return [...config.selectable];\n return undefined;\n}\n\nexport function computeSelect<\n TSchema extends DataSchema,\n TSelect extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n>(select: string[] | undefined, config: SelectableConfig<TSchema, TSelect>): TSelect[] | undefined;\nexport function computeSelect(\n select: string[] | undefined,\n config: UntypedSelectableConfig,\n): string[] | undefined;\nexport function computeSelect(\n select: string[] | undefined,\n config: UntypedSelectableConfig,\n): string[] | undefined {\n if (select) {\n const expanded = expandSelect(select, config);\n if (!expanded) return undefined;\n return Array.from(new Set(expanded));\n }\n\n const defaultSelectArr: readonly string[] =\n config.defaultSelect === '*' ? ['*'] : config.defaultSelect;\n const expanded = expandSelect(defaultSelectArr, config);\n if (!expanded) return undefined;\n return Array.from(new Set(expanded));\n}\n\n/* ---------------------------------- */\n/* Projection helpers (NO \"as\") */\n/* ---------------------------------- */\n\ntype MutableShape = Record<string, z.ZodType>;\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nexport function getOwnProp(obj: Record<string, unknown>, key: string): unknown {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) return undefined;\n return obj[key];\n}\n\n/** Duck-typed Zod schema check. */\nexport function isZodSchema(v: unknown): v is z.ZodType {\n if (!isPlainObject(v)) return false;\n const parseFn = getOwnProp(v, 'parse');\n return typeof parseFn === 'function';\n}\n\n/** Duck-typed ZodObject check. */\nfunction isZodObjectSchema(v: unknown): v is z.ZodObject<z.ZodRawShape> {\n if (!isPlainObject(v)) return false;\n const parseFn = getOwnProp(v, 'parse');\n if (typeof parseFn !== 'function') return false;\n const shape = getOwnProp(v, 'shape');\n return isPlainObject(shape);\n}\n\n/** Duck-typed check for union schemas (ZodUnion / ZodDiscriminatedUnion). */\nfunction isZodUnionSchema(\n v: unknown,\n): v is { options: (z.ZodObject<z.ZodRawShape> | z.ZodType)[] } & z.ZodType {\n if (!isPlainObject(v)) return false;\n const options = getOwnProp(v, 'options');\n if (!Array.isArray(options) || options.length === 0) return false;\n // Each option must be a ZodObject or another union\n return options.every((o) => isZodObjectSchema(o) || isZodUnionSchema(o));\n}\n\n/** Duck-typed: get the element schema from a ZodArray. Returns undefined if not a ZodArray. */\nfunction getZodArrayElement(v: unknown): z.ZodType | undefined {\n if (!isPlainObject(v)) return undefined;\n const element = getOwnProp(v, 'element');\n if (isZodSchema(element)) return element;\n return undefined;\n}\n\n/** Try to unwrap one layer (optional, nullable, etc.) via `unwrap()` method. */\nfunction tryZodUnwrap(v: unknown): z.ZodType | undefined {\n if (!isPlainObject(v)) return undefined;\n const fn = getOwnProp(v, 'unwrap');\n if (typeof fn !== 'function') return undefined;\n const result: unknown = fn.call(v);\n if (isZodSchema(result)) return result;\n return undefined;\n}\n\n/**\n * Resolve a schema for path traversal: unwrap optional/nullable and array wrappers\n * to reach the inner ZodObject or ZodUnion that can be traversed further.\n */\nfunction resolveSchemaForTraversal(schema: unknown): {\n inner: unknown;\n isArray: boolean;\n isOptional: boolean;\n} {\n let current = schema;\n let isArray = false;\n let isOptional = false;\n\n for (let i = 0; i < 10; i += 1) {\n if (isZodObjectSchema(current) || isZodUnionSchema(current)) break;\n\n const element = getZodArrayElement(current);\n if (element) {\n isArray = true;\n current = element;\n continue;\n }\n\n const unwrapped = tryZodUnwrap(current);\n if (unwrapped) {\n isOptional = true;\n current = unwrapped;\n continue;\n }\n\n break;\n }\n\n return { inner: current, isArray, isOptional };\n}\n\n/**\n * Merge a union schema's leaf ZodObjects into a single ZodObject for path traversal\n * (first-seen key wins). Returns undefined if the value is not a union schema.\n */\nfunction mergeUnionForTraversal(v: unknown): z.ZodObject<z.ZodRawShape> | undefined {\n if (!isZodUnionSchema(v)) return undefined;\n const leaves = v.options.flatMap((option) => collectLeafObjects(option));\n const mergedShape: Record<string, z.ZodType> = {};\n for (const leaf of leaves) {\n for (const [key, value] of Object.entries(leaf.shape)) {\n if (!(key in mergedShape) && isZodSchema(value)) {\n mergedShape[key] = value;\n }\n }\n }\n return z.object(mergedShape);\n}\n\n/**\n * Recursively collect all leaf ZodObject schemas from a DataSchema.\n * Traverses nested unions (ZodUnion / ZodDiscriminatedUnion) to reach the ZodObject leaves.\n */\nexport function collectLeafObjects(schema: DataSchema | z.ZodType): z.ZodObject<z.ZodRawShape>[] {\n if (isZodObjectSchema(schema)) return [schema];\n if (isZodUnionSchema(schema)) {\n return schema.options.flatMap((option) => collectLeafObjects(option));\n }\n return [];\n}\n\n/**\n * Extract the discriminator key from a `z.discriminatedUnion()`.\n * Returns `undefined` for plain `z.union()` or `z.object()`.\n */\nexport function getDiscriminatorKey(schema: DataSchema): string | undefined {\n if (!isPlainObject(schema)) return undefined;\n const def = getOwnProp(schema, '_def');\n if (!isPlainObject(def)) return undefined;\n const disc = getOwnProp(def, 'discriminator');\n return typeof disc === 'string' ? disc : undefined;\n}\n\n/** Same as getDiscriminatorKey but accepts any value (for recursive schema walking). */\nfunction getDiscriminatorKeyFromAny(schema: unknown): string | undefined {\n if (!isPlainObject(schema)) return undefined;\n const def = getOwnProp(schema, '_def');\n if (!isPlainObject(def)) return undefined;\n const disc = getOwnProp(def, 'discriminator');\n return typeof disc === 'string' ? disc : undefined;\n}\n\n/** Duck-typed check for union-like schemas on any value. */\nfunction isUnionLike(v: unknown): v is { options: unknown[] } {\n if (!isPlainObject(v)) return false;\n const options = getOwnProp(v, 'options');\n return Array.isArray(options) && options.length > 0;\n}\n\nexport interface NestedDiscriminator {\n prefix: string;\n discriminatorPath: string;\n}\n\n/**\n * Recursively find all nested `z.discriminatedUnion()` schemas within a DataSchema.\n * Returns an array of `{ prefix, discriminatorPath }` for each nested discriminated union.\n * For example, if `codec` is a `z.discriminatedUnion(\"type\", ...)`, returns\n * `[{ prefix: \"codec\", discriminatorPath: \"codec.type\" }]`.\n *\n * Also detects top-level discriminators from nested union levels.\n * E.g. `discriminatedUnion('status', [ discriminatedUnion('materialType', [obj, ...]) ])`\n * returns both `{ prefix: '', discriminatorPath: 'status' }` and\n * `{ prefix: '', discriminatorPath: 'materialType' }`.\n */\nexport function findNestedDiscriminators(schema: DataSchema): NestedDiscriminator[] {\n const results: NestedDiscriminator[] = [];\n\n function walkObject(obj: unknown, prefix: string): void {\n if (!isZodObjectSchema(obj)) return;\n const shape = obj.shape;\n for (const [key, value] of Object.entries(shape)) {\n if (!isZodSchema(value)) continue;\n const fullPath = prefix ? `${prefix}.${key}` : key;\n const disc = getDiscriminatorKeyFromAny(value);\n if (disc) {\n results.push({ prefix: fullPath, discriminatorPath: `${fullPath}.${disc}` });\n // Recurse into each option of this nested union\n if (isUnionLike(value)) {\n for (const option of value.options) {\n walkObject(option, fullPath);\n }\n }\n } else if (isZodObjectSchema(value)) {\n walkObject(value, fullPath);\n }\n }\n }\n\n if (isZodObjectSchema(schema)) {\n walkObject(schema, '');\n } else if (isZodUnionSchema(schema)) {\n // Collect discriminator keys from all union levels (including nested unions)\n const unionDiscs = collectUnionDiscriminators(schema, '');\n results.push(...unionDiscs);\n // Walk leaf objects for nested discriminated union fields\n const leaves = collectLeafObjects(schema);\n for (const leaf of leaves) {\n walkObject(leaf, '');\n }\n }\n\n return results;\n}\n\n/**\n * Recursively collect discriminator keys from nested union levels.\n * For `discriminatedUnion('status', [discriminatedUnion('materialType', [...])])`,\n * this produces `{ prefix: '', discriminatorPath: 'status' }` and\n * `{ prefix: '', discriminatorPath: 'materialType' }`.\n */\nfunction collectUnionDiscriminators(\n schema: unknown,\n prefix: string,\n results: NestedDiscriminator[] = [],\n seen = new Set<string>(),\n): NestedDiscriminator[] {\n const disc = getDiscriminatorKeyFromAny(schema);\n if (disc) {\n const path = prefix ? `${prefix}.${disc}` : disc;\n if (!seen.has(path)) {\n seen.add(path);\n results.push({ prefix, discriminatorPath: path });\n }\n }\n if (isUnionLike(schema)) {\n for (const option of schema.options) {\n if (!isZodObjectSchema(option)) {\n // Nested union — recurse at the same prefix level\n collectUnionDiscriminators(option, prefix, results, seen);\n }\n }\n }\n return results;\n}\n\n/**\n * If the schema is a ZodObject, return it directly.\n * If the schema is a ZodUnion / ZodDiscriminatedUnion (possibly nested),\n * collect all leaf ZodObject shapes and merge them into a single ZodObject (first-seen key wins).\n */\nexport function resolveToZodObject(schema: DataSchema): z.ZodObject<z.ZodRawShape> {\n if (isZodObjectSchema(schema)) return schema;\n\n if (isZodUnionSchema(schema)) {\n const leaves = collectLeafObjects(schema);\n const mergedShape: Record<string, z.ZodType> = {};\n for (const leaf of leaves) {\n const shape = leaf.shape;\n for (const [key, value] of Object.entries(shape)) {\n if (!(key in mergedShape) && isZodSchema(value)) {\n mergedShape[key] = value;\n }\n }\n }\n return z.object(mergedShape);\n }\n\n throw new Error(\n 'dataSchema must be a ZodObject or a ZodUnion/ZodDiscriminatedUnion of ZodObjects',\n );\n}\n\nfunction getObjectShape(obj: z.ZodObject<z.ZodRawShape>): Readonly<Record<string, unknown>> {\n return obj.shape;\n}\n\n/** Check whether a dot-path resolves successfully inside a single ZodObject. */\nfunction hasPathInObject(obj: z.ZodObject<z.ZodRawShape>, path: string): boolean {\n const parts = path.split('.').filter(Boolean);\n let current: unknown = obj;\n for (const p of parts) {\n const { inner } = resolveSchemaForTraversal(current);\n current = inner;\n const resolved = isZodObjectSchema(current) ? current : mergeUnionForTraversal(current);\n if (!resolved) return false;\n const shape = getObjectShape(resolved);\n const next = shape[p];\n if (!next || !isZodSchema(next)) return false;\n current = next;\n }\n return true;\n}\n\n/**\n * Recursively apply `.optional()` to all properties of a ZodObject,\n * descending into nested ZodObject shapes.\n */\nfunction deepPartial(schema: z.ZodObject<z.ZodRawShape>): z.ZodObject<z.ZodRawShape> {\n const shape: MutableShape = {};\n for (const [key, value] of Object.entries(schema.shape)) {\n if (!isZodSchema(value)) continue;\n if (isZodObjectSchema(value)) {\n shape[key] = deepPartial(value).optional();\n } else {\n shape[key] = value.optional();\n }\n }\n return z.object(shape);\n}\n\n/**\n * Project a DataSchema preserving the union structure (including nested unions).\n * - ZodObject → delegates to `projectDataSchema`.\n * - ZodUnion / ZodDiscriminatedUnion → projects each option independently\n * (paths that don't exist in a given option are skipped) and returns `z.union([...])`.\n * If an option is itself a union, recurse into it preserving the nested structure.\n *\n * When `partial` is true, a recursive deep partial is applied to each projected option\n * **before** wrapping in the union, so you get\n * `z.union([deepPartial(OptionA), deepPartial(OptionB)])` instead of a single merged partial.\n */\n\n/** Internal helper: project a nested union that may not match the DataSchema type exactly. */\nfunction projectNestedUnion(\n schema: { options: (z.ZodObject<z.ZodRawShape> | z.ZodType)[] } & z.ZodType,\n selectedPaths: string[],\n opts?: { partial?: boolean },\n): z.ZodType {\n const projected: z.ZodType[] = schema.options.map((option) => {\n if (isZodUnionSchema(option) && !isZodObjectSchema(option)) {\n return projectNestedUnion(option, selectedPaths, opts);\n }\n if (!isZodObjectSchema(option)) {\n throw new Error('Union option is neither a ZodObject nor a ZodUnion');\n }\n const validPaths = selectedPaths.filter((p) => hasPathInObject(option, p));\n const obj = validPaths.length > 0 ? projectDataSchema(option, validPaths) : z.object({});\n return opts?.partial ? deepPartial(obj) : obj;\n });\n\n const first = projected[0];\n const second = projected[1];\n if (!first || !second) {\n throw new Error('Union must have at least 2 options');\n }\n return z.union([first, second, ...projected.slice(2)]);\n}\n\nexport function projectDataSchemaPreservingUnion(\n dataSchema: DataSchema,\n selectedPaths: string[],\n options?: { partial?: boolean },\n): z.ZodType {\n if (isZodObjectSchema(dataSchema)) {\n const projected = projectDataSchema(dataSchema, selectedPaths);\n return options?.partial ? deepPartial(projected) : projected;\n }\n\n if (isZodUnionSchema(dataSchema)) {\n return projectNestedUnion(dataSchema, selectedPaths, options);\n }\n\n throw new Error(\n 'dataSchema must be a ZodObject or a ZodUnion/ZodDiscriminatedUnion of ZodObjects',\n );\n}\n\nexport function getZodAtPath(obj: DataSchema, path: string): z.ZodType {\n const parts = path.split('.').filter(Boolean);\n\n let current: unknown = resolveToZodObject(obj);\n\n for (const p of parts) {\n const { inner } = resolveSchemaForTraversal(current);\n current = inner;\n\n const resolved = isZodObjectSchema(current) ? current : mergeUnionForTraversal(current);\n if (!resolved) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not inside a ZodObject`);\n }\n\n const shape = getObjectShape(resolved);\n const next = shape[p];\n\n if (!next) throw new Error(`dataSchema path \"${path}\" is invalid: missing key \"${p}\"`);\n if (!isZodSchema(next)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not a Zod schema`);\n }\n\n current = next;\n }\n\n if (!isZodSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: resolved value is not a Zod schema`);\n }\n\n return current;\n}\n\nexport function projectDataSchema(\n dataSchema: DataSchema,\n selectedPaths: string[],\n): z.ZodObject<z.ZodRawShape> {\n type UnionSchema = { options: (z.ZodObject<z.ZodRawShape> | z.ZodType)[] } & z.ZodType;\n\n const tree: Record<string, unknown> = {};\n const arrayPaths = new Set<string>();\n const optionalPaths = new Set<string>();\n const unionAtPath = new Map<string, UnionSchema>();\n\n const ensureTreeNode = (node: Record<string, unknown>, key: string): Record<string, unknown> => {\n const existing = node[key];\n\n if (existing === undefined) {\n const child: Record<string, unknown> = {};\n node[key] = child;\n return child;\n }\n\n if (isPlainObject(existing)) return existing;\n\n if (isZodSchema(existing)) {\n throw new Error(`Cannot project \"${key}\": \"${key}\" is selected as a leaf and as an object`);\n }\n\n throw new Error(`Cannot project \"${key}\": conflicting selection`);\n };\n\n for (const fullPath of selectedPaths) {\n const parts = fullPath.split('.').filter(Boolean);\n if (parts.length === 0) continue;\n\n let cursor = tree;\n\n // Walk the original schema alongside the tree to detect array/optional wrappers\n let schemaWalk: unknown = resolveToZodObject(dataSchema);\n\n for (let i = 0; i < parts.length; i += 1) {\n const key = parts[i];\n if (!key) continue;\n\n const isLeaf = i === parts.length - 1;\n\n // Resolve schemaWalk to a traversable ZodObject (or merge union for traversal)\n const { inner } = resolveSchemaForTraversal(schemaWalk);\n schemaWalk = inner;\n if (!isZodObjectSchema(schemaWalk)) {\n const merged = mergeUnionForTraversal(schemaWalk);\n if (merged) schemaWalk = merged;\n }\n\n if (isZodObjectSchema(schemaWalk)) {\n const shape = getObjectShape(schemaWalk);\n const rawField = shape[key];\n\n if (rawField && isZodSchema(rawField)) {\n const partialPath = parts.slice(0, i + 1).join('.');\n const wrapInfo = resolveSchemaForTraversal(rawField);\n if (wrapInfo.isArray) arrayPaths.add(partialPath);\n if (wrapInfo.isOptional) optionalPaths.add(partialPath);\n\n // Track nested unions at intermediate paths so buildObjectFromTree\n // can preserve the union structure instead of merging into a single object.\n if (!isLeaf && isZodUnionSchema(wrapInfo.inner)) {\n unionAtPath.set(partialPath, wrapInfo.inner);\n }\n\n // Advance schema walk to the unwrapped inner for next iteration\n schemaWalk = isLeaf ? rawField : wrapInfo.inner;\n }\n }\n\n if (isLeaf) {\n cursor[key] = getZodAtPath(dataSchema, fullPath);\n } else {\n cursor = ensureTreeNode(cursor, key);\n }\n }\n }\n\n /** Collect leaf dot-paths from a projection tree node. */\n const collectTreePaths = (node: Record<string, unknown>, prefix = ''): string[] => {\n const paths: string[] = [];\n for (const [key, value] of Object.entries(node)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (isZodSchema(value)) {\n paths.push(path);\n } else if (isPlainObject(value)) {\n paths.push(...collectTreePaths(value, path));\n }\n }\n return paths;\n };\n\n const buildObjectFromTree = (\n node: Record<string, unknown>,\n parentPath: string,\n ): z.ZodObject<z.ZodRawShape> => {\n const shape: MutableShape = {};\n\n for (const [k, v] of Object.entries(node)) {\n const childPath = parentPath ? `${parentPath}.${k}` : k;\n\n if (isZodSchema(v)) {\n shape[k] = v;\n continue;\n }\n if (isPlainObject(v)) {\n const nestedUnion = unionAtPath.get(childPath);\n let built: z.ZodType;\n if (nestedUnion) {\n // Preserve the nested union structure by projecting each option independently.\n const subPaths = collectTreePaths(v);\n built = projectNestedUnion(nestedUnion, subPaths);\n } else {\n built = buildObjectFromTree(v, childPath);\n }\n if (arrayPaths.has(childPath)) built = z.array(built);\n if (optionalPaths.has(childPath)) built = built.optional();\n shape[k] = built;\n continue;\n }\n throw new Error(`Invalid projection tree at \"${k}\"`);\n }\n\n return z.object(shape);\n };\n\n return buildObjectFromTree(tree, '');\n}\n\n/* ---------------------------------- */\n/* Config */\n/* ---------------------------------- */\n\n/** Configuration for the `select()` factory. */\nexport interface SelectConfig<\n TSchema extends DataSchema,\n TSelect extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n TResponseType extends SelectResponseType = 'many',\n> {\n /** Zod schema representing one data item (object, discriminated union, or union). */\n dataSchema: TSchema;\n /** Allowlist of selectable fields (dot-notation paths supported). */\n selectable: readonly TSelect[];\n /** Fields that are decorative (added manually, not from DB). Subset of selectable. */\n decorative?: readonly TSelect[];\n /** Default fields returned when `select` is omitted from the query. Use `\"*\"` to select all. */\n defaultSelect: readonly TSelect[] | '*';\n /** Shape of `data` in the response: `\"many\"` returns an array, `\"one\"` returns a single object. @default \"many\" */\n responseType?: TResponseType;\n}\n\n/* ---------------------------------- */\n/* Output */\n/* ---------------------------------- */\n\n/**\n * Extract the top-level key from a dot-path.\n * e.g. `'meta.score'` → `'meta'`, `'id'` → `'id'`.\n */\nexport type TopLevelKey<P extends string> = P extends `${infer K}.${string}` ? K : P;\n\n/**\n * Projected data item: exposes only the selectable keys of the original schema\n * with `unknown` values. This gives consumers key auto-completion\n * without requiring `as` (projectDataSchema erases value types at runtime).\n */\nexport type ProjectedData<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = Partial<Record<TopLevelKey<TSelect> & keyof InferData<TSchema>, unknown>>;\n\n/**\n * Typed projected data item: like `ProjectedData` but resolves value types\n * via `PathValue`. For top-level paths the value type is exact; for nested\n * dot-paths (e.g. `'meta.score'`) the top-level key is typed as the full\n * nested object (not the leaf), so partial nested projections may be wider\n * than the runtime shape. Use this when you need value-level type safety\n * and accept that trade-off.\n */\nexport type TypedProjectedData<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = {\n [K in TopLevelKey<TSelect> & keyof InferData<TSchema>]?: InferData<TSchema>[K];\n};\n\nexport interface SelectQueryPayload<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n TResponseType extends SelectResponseType = SelectResponseType,\n> {\n fields: TSelect[];\n /** Subset of `fields` that are decorative (not from DB, added manually). */\n decorativeFields?: TSelect[];\n responseType: TResponseType;\n}\n\n/** Shorthand for `SelectQueryPayload` with `responseType: 'one'`. */\nexport type SelectOneQueryPayload<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = SelectQueryPayload<TSchema, TSelect, 'one'>;\n\n/** Shorthand for `SelectQueryPayload` with `responseType: 'many'`. */\nexport type SelectManyQueryPayload<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = SelectQueryPayload<TSchema, TSelect, 'many'>;\n\nexport interface SelectQueryParams<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n TResponseType extends SelectResponseType = SelectResponseType,\n> {\n select: SelectQueryPayload<TSchema, TSelect, TResponseType>;\n}\n\nexport type SelectResponseData<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema>,\n TResponseType extends SelectResponseType,\n> = TResponseType extends 'one'\n ? TypedProjectedData<TSchema, TSelect>\n : TypedProjectedData<TSchema, TSelect>[];\n\nexport interface SelectResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n TResponseType extends SelectResponseType = 'many',\n> {\n data: SelectResponseData<TSchema, TSelect, TResponseType>;\n}\n\n/** Shorthand for `SelectResponse` with `responseType: 'one'` (data is a single object). */\nexport type SelectOneResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = SelectResponse<TSchema, TSelect, 'one'>;\n\n/** Shorthand for `SelectResponse` with `responseType: 'many'` (data is an array). */\nexport type SelectManyResponse<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> = SelectResponse<TSchema, TSelect>;\n\n/**\n * Result type returned by `select()`. Use this instead of\n * `ReturnType<typeof select>` to preserve the generic `TSchema`.\n *\n * @example\n * function createSelector(): SelectResult<typeof MySchema> {\n * return select({ dataSchema: MySchema, … });\n * }\n */\nexport interface SelectResult<\n TSchema extends DataSchema,\n TSelectable extends AllowedSelectablePath<TSchema> = AllowedSelectablePath<TSchema>,\n TResponseType extends SelectResponseType = SelectResponseType,\n> {\n queryParamsSchema: {\n (): z.ZodType<SelectQueryParams<TSchema, TSelectable, TResponseType>>;\n <TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<\n SelectQueryParams<TSchema, TSelectable, TResponseType> & z.infer<z.ZodObject<TExtraShape>>\n >;\n };\n validatorSchema: (\n parsed?: SelectQueryPayload<TSchema, TSelectable>,\n ) => z.ZodType<SelectResponse<TSchema, TSelectable, TResponseType>>;\n responseSchema: z.ZodObject<SelectResponseSchemaShape>;\n responseType: TResponseType;\n}\n\n/* ---------------------------------- */\n/* Factory */\n/* ---------------------------------- */\n\n/**\n * Generate Zod schemas and runtime validators for select-only query parameters, based on a config object.\n * @param config The configuration object defining the selectable 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 validating the response.\n * - `responseSchema`: A pre-built Zod schema for validating the response (uses defaultSelect or all selectable fields).\n */\nexport function select<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n>(\n config: Omit<\n SelectConfig<TSchema, TSelectable[number], 'one'>,\n 'selectable' | 'defaultSelect' | 'decorative'\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). Subset of selectable. */\n decorative?: readonly NoInfer<TSelectable[number]>[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Shape of `data` in the response: `\"one\"` returns a single object. */\n responseType: 'one';\n },\n): SelectResult<TSchema, TSelectable[number], 'one'>;\n\nexport function select<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n>(\n config: Omit<\n SelectConfig<TSchema, TSelectable[number]>,\n 'selectable' | 'defaultSelect' | 'decorative'\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). Subset of selectable. */\n decorative?: readonly NoInfer<TSelectable[number]>[];\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n /** Shape of `data` in the response: `\"many\"` returns an array (default). */\n responseType?: 'many';\n },\n): SelectResult<TSchema, TSelectable[number], 'many'>;\n\nexport function select<\n TSchema extends DataSchema,\n const TSelectable extends readonly AllowedSelectablePath<TSchema>[],\n const TDecorative extends readonly NoInfer<TSelectable[number]>[] = readonly [],\n const TDefaultSelect extends readonly NoInfer<TSelectable[number]>[] = readonly NoInfer<\n TSelectable[number]\n >[],\n>(\n config: Omit<\n SelectConfig<TSchema, TSelectable[number], SelectResponseType>,\n 'selectable' | 'defaultSelect' | 'decorative'\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). Subset of selectable. */\n decorative?: NoDuplicates<TDecorative>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: NoDuplicates<TDefaultSelect> | '*';\n },\n): SelectResult<TSchema, TSelectable[number]> {\n const responseType: SelectResponseType = config.responseType ?? 'many';\n const discriminatorKey = getDiscriminatorKey(config.dataSchema);\n const nestedDiscriminators = findNestedDiscriminators(config.dataSchema);\n\n const selectableStrings: string[] = [...config.selectable];\n const decorativeSet = new Set<string>((config.decorative ?? []).map(String));\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\n const baseSchema = z.object({\n select: SelectSchema.optional(),\n });\n\n const selectableList = selectableStrings.join(', ');\n const defaultSelectDesc =\n config.defaultSelect === '*' ? '*' : [...config.defaultSelect].join(',');\n\n const rootShape: Record<string, z.ZodType> = {\n select: z\n .string()\n .optional()\n .meta({\n description: `Comma-separated list of fields to include in the response. Allowed: ${selectableList}. Use \"*\" to select all. Default: ${defaultSelectDesc}`,\n example: defaultSelectDesc,\n }),\n };\n\n const baseQueryParamsSchema: z.ZodType<SelectQueryParams<TSchema, TSelectable[number]>> = z\n .object(rootShape)\n .catchall(z.unknown())\n .transform((q): Record<string, unknown> => {\n const raw = q.select;\n return {\n ...q,\n select: typeof raw === 'string' ? raw : undefined,\n };\n })\n .pipe(\n baseSchema\n .superRefine((val, ctx): void => {\n const selectForValidation: readonly string[] =\n val.select ??\n (effectiveConfig.defaultSelect === '*' ? ['*'] : effectiveConfig.defaultSelect);\n\n const hasWildcard = selectForValidation.includes('*');\n\n let index = 0;\n for (const field of selectForValidation) {\n if (field === '*') {\n index += 1;\n continue;\n }\n\n if (!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 (empty selectable)',\n });\n }\n }\n\n if (discriminatorKey && !hasWildcard && !selectForValidation.includes(discriminatorKey)) {\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 .transform((val): SelectQueryParams<TSchema, TSelectable[number]> => {\n const resolved = computeSelect(val.select, effectiveConfig);\n\n if (!resolved || resolved.length === 0) {\n throw new Error('select resolved to empty (this should not happen after validation)');\n }\n\n // Safe: resolved values come from config.selectable (discriminator enforced at type level).\n // plus the discriminator key (which is a valid AllowedPath<TSchema> at runtime).\n const typedSelect: TSelectable[number][] = resolved.filter(\n (field): field is TSelectable[number] => typeof field === 'string',\n );\n\n const decorativeFields = typedSelect.filter((f) => decorativeSet.has(String(f)));\n return {\n select: {\n fields: typedSelect,\n ...(decorativeFields.length > 0 ? { decorativeFields } : {}),\n responseType,\n },\n };\n }),\n );\n\n function validatorSchema(\n parsed?: SelectQueryPayload<TSchema, TSelectable[number]>,\n ): z.ZodType<SelectResponse<TSchema, TSelectable[number], SelectResponseType>>;\n function validatorSchema(parsed?: SelectQueryPayload<TSchema, TSelectable[number]>): z.ZodType {\n const effectiveSelect =\n parsed?.fields ?? computeSelect(undefined, effectiveConfig) ?? undefined;\n\n const dataItemSchema: z.ZodType =\n effectiveSelect && effectiveSelect.length > 0\n ? projectDataSchemaPreservingUnion(config.dataSchema, effectiveSelect.map(String))\n : resolveToZodObject(config.dataSchema);\n\n const dataSchema = responseType === 'one' ? dataItemSchema : z.array(dataItemSchema);\n const schema: z.ZodType = z.object({ data: dataSchema });\n return schema;\n }\n\n const dataItemSchema: z.ZodType =\n selectableStrings.length > 0\n ? projectDataSchemaPreservingUnion(config.dataSchema, selectableStrings, { partial: true })\n : resolveToZodObject(config.dataSchema);\n const dataSchemaForResponse = responseType === 'one' ? dataItemSchema : z.array(dataItemSchema);\n\n function buildResponseSchema(): z.ZodObject<SelectResponseSchemaShape>;\n function buildResponseSchema(): z.ZodType {\n return z.object({ data: dataSchemaForResponse });\n }\n const responseSchema = buildResponseSchema();\n\n function queryParamsSchema(): z.ZodType<SelectQueryParams<TSchema, TSelectable[number]>>;\n function queryParamsSchema<TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<SelectQueryParams<TSchema, TSelectable[number]> & 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 baseResult = baseQueryParamsSchema.safeParse(raw);\n if (!baseResult.success) {\n for (const issue of baseResult.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 {\n queryParamsSchema,\n validatorSchema,\n responseSchema,\n responseType,\n };\n}\n"]}
|