zod-paginate 1.7.1 → 1.8.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/dist/select.d.ts CHANGED
@@ -163,6 +163,10 @@ export type SelectResponseData<TSchema extends DataSchema, TSelect extends Allow
163
163
  export interface SelectResponse<TSchema extends DataSchema, TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>, TResponseType extends SelectResponseType = 'many'> {
164
164
  data: SelectResponseData<TSchema, TSelect, TResponseType>;
165
165
  }
166
+ /** Shorthand for `SelectResponse` with `responseType: 'one'` (data is a single object). */
167
+ export type SelectOneResponse<TSchema extends DataSchema, TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>> = SelectResponse<TSchema, TSelect, 'one'>;
168
+ /** Shorthand for `SelectResponse` with `responseType: 'many'` (data is an array). */
169
+ export type SelectManyResponse<TSchema extends DataSchema, TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>> = SelectResponse<TSchema, TSelect>;
166
170
  /**
167
171
  * Result type returned by `select()`. Use this instead of
168
172
  * `ReturnType<typeof select>` to preserve the generic `TSchema`.
@@ -172,14 +176,14 @@ export interface SelectResponse<TSchema extends DataSchema, TSelect extends Allo
172
176
  * return select({ dataSchema: MySchema, … });
173
177
  * }
174
178
  */
175
- export interface SelectResult<TSchema extends DataSchema, TSelectable extends AllowedPath<TSchema> = AllowedPath<TSchema>> {
179
+ export interface SelectResult<TSchema extends DataSchema, TSelectable extends AllowedPath<TSchema> = AllowedPath<TSchema>, TResponseType extends SelectResponseType = SelectResponseType> {
176
180
  queryParamsSchema: {
177
181
  (): z.ZodType<SelectQueryParams<TSchema, TSelectable>>;
178
182
  <TExtraShape extends z.ZodRawShape>(extraShape: TExtraShape): z.ZodType<SelectQueryParams<TSchema, TSelectable> & z.infer<z.ZodObject<TExtraShape>>>;
179
183
  };
180
- validatorSchema: (parsed?: SelectQueryPayload<TSchema, TSelectable>) => z.ZodType<SelectResponse<TSchema, TSelectable>>;
184
+ validatorSchema: (parsed?: SelectQueryPayload<TSchema, TSelectable>) => z.ZodType<SelectResponse<TSchema, TSelectable, TResponseType>>;
181
185
  responseSchema: z.ZodObject<SelectResponseSchemaShape>;
182
- responseType: SelectResponseType;
186
+ responseType: TResponseType;
183
187
  }
184
188
  /**
185
189
  * Generate Zod schemas and runtime validators for select-only query parameters, based on a config object.
@@ -189,10 +193,20 @@ export interface SelectResult<TSchema extends DataSchema, TSelectable extends Al
189
193
  * - `validatorSchema`: A function that takes the already-parsed query parameters and returns a Zod schema for validating the response.
190
194
  * - `responseSchema`: A pre-built Zod schema for validating the response (uses defaultSelect or all selectable fields).
191
195
  */
192
- export declare function select<TSchema extends DataSchema, const TSelectable extends readonly AllowedPath<TSchema>[], TResponseType extends SelectResponseType = 'many'>(config: Omit<SelectConfig<TSchema, TSelectable[number], TResponseType>, 'selectable' | 'defaultSelect'> & {
196
+ export declare function select<TSchema extends DataSchema, const TSelectable extends readonly AllowedPath<TSchema>[]>(config: Omit<SelectConfig<TSchema, TSelectable[number], 'one'>, 'selectable' | 'defaultSelect'> & {
193
197
  /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */
194
198
  selectable: EnsureDiscriminatorInSelectable<TSchema, TSelectable>;
195
199
  /** Default fields returned when `select` is omitted. Use `"*"` to select all. */
196
200
  defaultSelect: readonly NoInfer<TSelectable[number]>[] | '*';
197
- }): SelectResult<TSchema, TSelectable[number]>;
201
+ /** Shape of `data` in the response: `"one"` returns a single object. */
202
+ responseType: 'one';
203
+ }): SelectResult<TSchema, TSelectable[number], 'one'>;
204
+ export declare function select<TSchema extends DataSchema, const TSelectable extends readonly AllowedPath<TSchema>[]>(config: Omit<SelectConfig<TSchema, TSelectable[number]>, 'selectable' | 'defaultSelect'> & {
205
+ /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */
206
+ selectable: EnsureDiscriminatorInSelectable<TSchema, TSelectable>;
207
+ /** Default fields returned when `select` is omitted. Use `"*"` to select all. */
208
+ defaultSelect: readonly NoInfer<TSelectable[number]>[] | '*';
209
+ /** Shape of `data` in the response: `"many"` returns an array (default). */
210
+ responseType?: 'many';
211
+ }): SelectResult<TSchema, TSelectable[number], 'many'>;
198
212
  export {};
package/dist/select.js CHANGED
@@ -478,17 +478,6 @@ function projectDataSchema(dataSchema, selectedPaths) {
478
478
  };
479
479
  return buildObjectFromTree(tree, '');
480
480
  }
481
- /* ---------------------------------- */
482
- /* Factory */
483
- /* ---------------------------------- */
484
- /**
485
- * Generate Zod schemas and runtime validators for select-only query parameters, based on a config object.
486
- * @param config The configuration object defining the selectable fields.
487
- * @returns An object containing:
488
- * - `queryParamsSchema`: A Zod schema for validating and parsing the raw query parameters.
489
- * - `validatorSchema`: A function that takes the already-parsed query parameters and returns a Zod schema for validating the response.
490
- * - `responseSchema`: A pre-built Zod schema for validating the response (uses defaultSelect or all selectable fields).
491
- */
492
481
  function select(config) {
493
482
  const responseType = config.responseType ?? 'many';
494
483
  const discriminatorKey = getDiscriminatorKey(config.dataSchema);
@@ -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/* 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>>;\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 * 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 SelectResponseSchemaShapeObjectDef {\n data: z.ZodObject<z.ZodRawShape>;\n}\nexport type SelectResponseSchemaShape =\n | ZodShape<SelectResponseSchemaShapeArrayDef>\n | ZodShape<SelectResponseSchemaShapeObjectDef>;\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 AllowedPath<TSchema> = AllowedPath<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 AllowedPath<TSchema> = AllowedPath<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 AllowedPath<TSchema> = AllowedPath<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 * 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 if (!isZodObjectSchema(current)) return false;\n const shape = getObjectShape(current);\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 if (!isZodObjectSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not inside a ZodObject`);\n }\n\n const shape = getObjectShape(current);\n const next = shape[p];\n\n if (!next) throw new Error(`dataSchema path \"${path}\" is invalid: missing key \"${p}\"`);\n if (!isZodSchema(next)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not a Zod schema`);\n }\n\n current = next;\n }\n\n if (!isZodSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: resolved value is not a Zod schema`);\n }\n\n return current;\n}\n\nexport function projectDataSchema(\n dataSchema: DataSchema,\n selectedPaths: string[],\n): z.ZodObject<z.ZodRawShape> {\n const tree: Record<string, unknown> = {};\n const arrayPaths = new Set<string>();\n const optionalPaths = new Set<string>();\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\n const { inner } = resolveSchemaForTraversal(schemaWalk);\n schemaWalk = inner;\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 // 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 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 let built: z.ZodType = buildObjectFromTree(v, childPath);\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 AllowedPath<TSchema> = AllowedPath<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> {\n fields: TSelect[];\n responseType?: SelectResponseType;\n}\n\nexport interface SelectQueryParams<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> {\n select: SelectQueryPayload<TSchema, TSelect>;\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/**\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 AllowedPath<TSchema> = AllowedPath<TSchema>,\n> {\n queryParamsSchema: {\n (): z.ZodType<SelectQueryParams<TSchema, TSelectable>>;\n <TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<SelectQueryParams<TSchema, TSelectable> & z.infer<z.ZodObject<TExtraShape>>>;\n };\n validatorSchema: (\n parsed?: SelectQueryPayload<TSchema, TSelectable>,\n ) => z.ZodType<SelectResponse<TSchema, TSelectable>>;\n responseSchema: z.ZodObject<SelectResponseSchemaShape>;\n responseType: SelectResponseType;\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 AllowedPath<TSchema>[],\n TResponseType extends SelectResponseType = 'many',\n>(\n config: Omit<\n SelectConfig<TSchema, TSelectable[number], TResponseType>,\n 'selectable' | 'defaultSelect'\n > & {\n /** Allowlist of selectable fields (dot-notation paths). Enables the `select` query parameter. */\n selectable: EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: readonly NoInfer<TSelectable[number]>[] | '*';\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: selectableList,\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]>>;\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/* 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>>;\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 * 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 SelectResponseSchemaShapeObjectDef {\n data: z.ZodObject<z.ZodRawShape>;\n}\nexport type SelectResponseSchemaShape =\n | ZodShape<SelectResponseSchemaShapeArrayDef>\n | ZodShape<SelectResponseSchemaShapeObjectDef>;\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 AllowedPath<TSchema> = AllowedPath<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 AllowedPath<TSchema> = AllowedPath<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 AllowedPath<TSchema> = AllowedPath<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 * 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 if (!isZodObjectSchema(current)) return false;\n const shape = getObjectShape(current);\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 if (!isZodObjectSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not inside a ZodObject`);\n }\n\n const shape = getObjectShape(current);\n const next = shape[p];\n\n if (!next) throw new Error(`dataSchema path \"${path}\" is invalid: missing key \"${p}\"`);\n if (!isZodSchema(next)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: \"${p}\" is not a Zod schema`);\n }\n\n current = next;\n }\n\n if (!isZodSchema(current)) {\n throw new Error(`dataSchema path \"${path}\" is invalid: resolved value is not a Zod schema`);\n }\n\n return current;\n}\n\nexport function projectDataSchema(\n dataSchema: DataSchema,\n selectedPaths: string[],\n): z.ZodObject<z.ZodRawShape> {\n const tree: Record<string, unknown> = {};\n const arrayPaths = new Set<string>();\n const optionalPaths = new Set<string>();\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\n const { inner } = resolveSchemaForTraversal(schemaWalk);\n schemaWalk = inner;\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 // 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 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 let built: z.ZodType = buildObjectFromTree(v, childPath);\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 AllowedPath<TSchema> = AllowedPath<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> {\n fields: TSelect[];\n responseType?: SelectResponseType;\n}\n\nexport interface SelectQueryParams<\n TSchema extends DataSchema,\n TSelect extends AllowedPath<TSchema> = AllowedPath<TSchema>,\n> {\n select: SelectQueryPayload<TSchema, TSelect>;\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 AllowedPath<TSchema> = AllowedPath<TSchema>,\n TResponseType extends SelectResponseType = SelectResponseType,\n> {\n queryParamsSchema: {\n (): z.ZodType<SelectQueryParams<TSchema, TSelectable>>;\n <TExtraShape extends z.ZodRawShape>(\n extraShape: TExtraShape,\n ): z.ZodType<SelectQueryParams<TSchema, TSelectable> & z.infer<z.ZodObject<TExtraShape>>>;\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 AllowedPath<TSchema>[],\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: EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: readonly NoInfer<TSelectable[number]>[] | '*';\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 AllowedPath<TSchema>[],\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: EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: readonly NoInfer<TSelectable[number]>[] | '*';\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 AllowedPath<TSchema>[],\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: EnsureDiscriminatorInSelectable<TSchema, TSelectable>;\n /** Default fields returned when `select` is omitted. Use `\"*\"` to select all. */\n defaultSelect: readonly NoInfer<TSelectable[number]>[] | '*';\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: selectableList,\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zod-paginate",
3
- "version": "1.7.1",
3
+ "version": "1.8.0",
4
4
  "description": "A small utility to parse and validate pagination using Zod",
5
5
  "keywords": [
6
6
  "zod",