@nanokajs/core 2.0.2 → 3.0.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/CHANGELOG.md CHANGED
@@ -5,6 +5,27 @@ All notable changes to `@nanokajs/core` will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.0.0] — 2026-10-25
9
+
10
+ ### Changed
11
+
12
+ - **BREAKING**: Require Zod `^4.6.6`; remove Zod 3 / `zod/v3` support. Upgrade `@hono/zod-validator` to the Zod 4-compatible 0.9 line. Core/scaffolder versions move together to 3.0.0.
13
+ - `t.json(schema)` rejects directly supplied schemas from unsupported Zod versions during initialization, including when a package manager installs multiple Zod copies.
14
+ - Derived schemas and validator errors now use Zod 4. Consumers must migrate Zod 3-only APIs (for example, `z.record(value)` becomes `z.record(key, value)`) and review Zod 4's stricter UUID/email validation and error format.
15
+ - In Zod 4, brands are type-only and no longer make a schema unsupported for OpenAPI. Custom refinements remain marked unsupported and rejected in strict mode.
16
+
17
+ ### Security
18
+
19
+ - Use the patched Zod 4 parser throughout the dependency graph, including Workers test tooling. Bounded arrays reject oversized inputs before walking their elements. Unbounded inputs still require application-level body and collection limits; a clean audit is not a resource-limit policy.
20
+ - Preserve PATCH omission semantics: omitted fields never populate defaults, and serverOnly fields stay excluded from API input/output schemas.
21
+ - Require Hono `^4.13.12` as a peer to exclude older releases affected by published Hono advisories. Consumers must update their own Hono installation.
22
+
23
+ ## [2.0.3] — 2026-10-19
24
+
25
+ ### Fixed
26
+
27
+ - Isolate the CLI default-output test in a private temporary directory with an owned configuration fixture and cleanup. Runtime behavior is unchanged.
28
+
8
29
  ## [2.0.2] — 2026-10-19
9
30
 
10
31
  ### Fixed
package/README.md CHANGED
@@ -17,7 +17,7 @@ Targets **Cloudflare Workers + D1 (SQLite)** as first-class. Hono-compatible rou
17
17
 
18
18
  ## Status
19
19
 
20
- **Stable (2.0.0).** Core API-boundary surface — field policies, `inputSchema` / `outputSchema`, validator presets, `t.json(zodSchema)`, field accessor API, Zod 3 / 4 support, OpenAPI component seed, `t.timestamp().defaultNow()`, mutation/findOne SQL expression and `in` operator in `where` — is stable under SemVer.
20
+ **Stable (3.0.0).** Core API-boundary surface — field policies, `inputSchema` / `outputSchema`, validator presets, `t.json(zodSchema)`, field accessor API, Zod 4.6.6+ support, OpenAPI component seed, `t.timestamp().defaultNow()`, mutation/findOne SQL expression and `in` operator in `where` — is stable under SemVer.
21
21
 
22
22
  ## Stable API surface (1.0)
23
23
 
@@ -41,7 +41,7 @@ The following APIs are stable. Breaking changes require a major version bump.
41
41
  Nanoka assumes a Hono + Cloudflare Workers project. The standard starting point is `pnpm create hono@latest` (Cloudflare Workers template), which scaffolds `wrangler` and `hono` but **not** TypeScript, `@cloudflare/workers-types`, or `drizzle-kit`. From a fresh scaffold, add Nanoka and the missing pieces:
42
42
 
43
43
  ```bash
44
- pnpm add @nanokajs/core drizzle-orm zod
44
+ pnpm add @nanokajs/core drizzle-orm zod@^4.6.6
45
45
  pnpm add -D typescript drizzle-kit @cloudflare/workers-types
46
46
  ```
47
47
 
@@ -62,7 +62,7 @@ Without `types`, you would have to `import { D1Database, Request, ... } from '@c
62
62
 
63
63
  After this, the [Minimal example](#minimal-example-model--1-route) below works as written.
64
64
 
65
- Zod 3 and 4 are both supported (`peerDependencies.zod: ^3.23.0 || ^4.0.0`).
65
+ Nanoka 3 requires Zod `^4.6.6`. Zod 3 and the `zod/v3` compatibility entry point are no longer supported. Upgrade existing applications with `pnpm add @nanokajs/core@^3 zod@^4.6.6`.
66
66
 
67
67
  `drizzle-kit` is required at install time (not a peer dep) because `npx drizzle-kit generate` is the supported migration step — see Quickstart step 3.
68
68
 
@@ -71,13 +71,34 @@ Zod 3 and 4 are both supported (`peerDependencies.zod: ^3.23.0 || ^4.0.0`).
71
71
  If you're integrating into an existing TypeScript project (no `create hono`), `hono` itself is also a peer dep — add it to the runtime install:
72
72
 
73
73
  ```bash
74
- pnpm add @nanokajs/core hono drizzle-orm zod
74
+ pnpm add @nanokajs/core hono drizzle-orm zod@^4.6.6
75
75
  pnpm add -D typescript drizzle-kit @cloudflare/workers-types
76
76
  ```
77
77
 
78
78
  The tsconfig `types` entry above still applies if you're targeting Cloudflare Workers.
79
79
 
80
- Peer dependency ranges: `hono ^4.0.0`, `drizzle-orm ^0.45.2`, `zod ^3.23.0 || ^4.0.0`, `@cloudflare/workers-types ^4.20240925.0`.
80
+ Peer dependency ranges: `hono ^4.13.12`, `drizzle-orm ^0.45.2`, `zod ^4.6.6`, `@cloudflare/workers-types ^4.20240925.0`.
81
+
82
+ Existing applications must update Hono to 4.13.12 or later in the 4.x line. The peer
83
+ minimum excludes older releases affected by published Hono advisories, including
84
+ [static-path middleware bypass](https://github.com/honojs/hono/security/advisories/GHSA-5r4p-p66f-jhc7).
85
+ The repository lockfile does not control the Hono version installed by consumers.
86
+
87
+ ## Migrating from Nanoka 2
88
+
89
+ Use Zod `^4.6.6` with Nanoka 3. Zod 3 schemas and `zod/v3` are unsupported. Auth
90
+ users should also upgrade to `@nanokajs/auth@^2.1`, which accepts core 3.
91
+ `t.json(schema)` rejects directly supplied schemas from unsupported versions at
92
+ initialization, even if a package manager installs multiple Zod copies.
93
+ Schema and validator results now follow Zod 4: review custom error handling,
94
+ `z.record(key, value)`, and stricter UUID/email checks. PATCH schemas continue to
95
+ leave omitted fields absent instead of applying their defaults. Runtime brands
96
+ are erased by Zod 4; custom refinements remain unsupported in strict OpenAPI output.
97
+
98
+ For untrusted arrays, sets and maps, specify a collection size bound and apply a
99
+ request body limit before validation. Zod 4.6.6 rejects oversized **bounded**
100
+ collections before parsing their elements; upgrading does not impose limits on
101
+ unbounded collections. Do not treat generated OpenAPI as runtime enforcement.
81
102
 
82
103
  ## Quickstart
83
104
 
@@ -654,6 +654,12 @@ var RelationFieldBuilder = class {
654
654
  }
655
655
  };
656
656
  function jsonField(schema) {
657
+ if (schema !== void 0) {
658
+ const version = schema._zod?.version;
659
+ if (!version || version.major !== 4 || version.minor < 6 || version.minor === 6 && version.patch < 6) {
660
+ throw new TypeError("t.json(schema) requires Zod 4.6.6 or later in the 4.x line");
661
+ }
662
+ }
657
663
  return new JsonFieldBuilder(void 0, schema);
658
664
  }
659
665
  var t = {
@@ -696,5 +702,5 @@ var t = {
696
702
  };
697
703
 
698
704
  export { t };
699
- //# sourceMappingURL=chunk-UBDSGKTX.js.map
700
- //# sourceMappingURL=chunk-UBDSGKTX.js.map
705
+ //# sourceMappingURL=chunk-Y4HMEUSV.js.map
706
+ //# sourceMappingURL=chunk-Y4HMEUSV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/field/builder.ts","../src/field/factories.ts"],"names":["zLib"],"mappings":"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","file":"chunk-Y4HMEUSV.js","sourcesContent":["import type { SQLiteColumnBuilderBase } from 'drizzle-orm/sqlite-core'\nimport type { z } from 'zod'\nimport type { Field, FieldKind, FieldModifiers } from './types'\n\n/**\n * Abstract base class for field builders.\n * Provides shared implementation for Zod and Drizzle integration.\n *\n * Subclasses must implement:\n * - `zodBase: ZB` getter\n * - `drizzleColumn(name: string): SQLiteColumnBuilderBase` method\n * - Modifier chain methods (optional, primary, unique, default) that return the subclass type\n *\n * @template TS - The TypeScript type of the field\n * @template Mods - The type of modifiers currently applied\n * @template ZB - The Zod base schema type for this field\n */\nexport abstract class BaseFieldBuilder<\n TS,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> implements Field<TS, Mods, ZB>\n{\n readonly tsType: TS = undefined as unknown as TS\n abstract readonly kind: FieldKind\n readonly modifiers: Readonly<Mods>\n\n constructor(modifiers?: Mods) {\n this.modifiers = Object.freeze((modifiers ?? {}) as Mods)\n }\n\n abstract get zodBase(): ZB\n abstract drizzleColumn(name: string): SQLiteColumnBuilderBase\n\n /**\n * Creates an immutable copy of this field with updated modifiers.\n * Subclasses must implement this to maintain their concrete type.\n */\n // biome-ignore lint/suspicious/noExplicitAny: Field builders return polymorphic types\n protected abstract cloneWithModifiers(mods: FieldModifiers): any\n\n /**\n * Returns the Zod schema with all modifiers applied.\n * Order: base schema → format/min/max constraints → optional → default\n */\n protected applyModifiersToZod(baseSchema: z.ZodTypeAny): z.ZodTypeAny {\n let schema = baseSchema\n\n // Apply optional — use nullable() first so D1/SQLite null values are accepted\n if (this.modifiers.optional) {\n schema = schema.nullable().optional()\n }\n\n // Apply default\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n schema = schema.default(defaultValue)\n }\n\n return schema\n }\n}\n","import { sql } from 'drizzle-orm'\nimport type { SQLiteColumnBuilderBase } from 'drizzle-orm/sqlite-core'\nimport { integer, real, text } from 'drizzle-orm/sqlite-core'\nimport type { z } from 'zod'\nimport { z as zLib } from 'zod'\nimport { BaseFieldBuilder } from './builder'\nimport type { FieldModifiers, RelationKind, RelationTargetLike } from './types'\n\n// ==================== StringFieldBuilder ====================\n\nclass StringFieldBuilder<\n TS = string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'string' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.string()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n if (this.modifiers.format === 'email') {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).email()\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = text(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): StringFieldBuilder<TS, NewMods> {\n return new StringFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new StringFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: StringFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): StringFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds email format validation.\n */\n email(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Mods & { format: 'email' }> {\n const newMods = { ...this.modifiers, format: 'email' as const } as Mods & { format: 'email' }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum string length.\n */\n min(\n this: StringFieldBuilder<TS, Mods>,\n n: number,\n ): StringFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum string length.\n */\n max(\n this: StringFieldBuilder<TS, Mods>,\n n: number,\n ): StringFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== UuidFieldBuilder ====================\n\nclass UuidFieldBuilder<\n TS = string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'uuid' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.string().uuid()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = text(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (\n this.modifiers.primary === true &&\n this.modifiers.policy === 'readOnly' &&\n !this.modifiers.hasDefault\n ) {\n col = col.$defaultFn(() => crypto.randomUUID())\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): UuidFieldBuilder<TS, NewMods> {\n return new UuidFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new UuidFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: UuidFieldBuilder<TS, Mods>): UuidFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: UuidFieldBuilder<TS, Mods>): UuidFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: UuidFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): UuidFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum string length.\n */\n min(this: UuidFieldBuilder<TS, Mods>, n: number): UuidFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum string length.\n */\n max(this: UuidFieldBuilder<TS, Mods>, n: number): UuidFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== NumberFieldBuilder ====================\n\nclass NumberFieldBuilder<\n TS = number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'number' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.number()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = real(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): NumberFieldBuilder<TS, NewMods> {\n return new NumberFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new NumberFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: NumberFieldBuilder<TS, Mods>): NumberFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: NumberFieldBuilder<TS, Mods>): NumberFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: NumberFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): NumberFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum value.\n */\n min(\n this: NumberFieldBuilder<TS, Mods>,\n n: number,\n ): NumberFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum value.\n */\n max(\n this: NumberFieldBuilder<TS, Mods>,\n n: number,\n ): NumberFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== IntegerFieldBuilder ====================\n\nclass IntegerFieldBuilder<\n TS = number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'integer' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.number().int()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = integer(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): IntegerFieldBuilder<TS, NewMods> {\n return new IntegerFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new IntegerFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: IntegerFieldBuilder<TS, Mods>): IntegerFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: IntegerFieldBuilder<TS, Mods>): IntegerFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: IntegerFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): IntegerFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum value.\n */\n min(\n this: IntegerFieldBuilder<TS, Mods>,\n n: number,\n ): IntegerFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum value.\n */\n max(\n this: IntegerFieldBuilder<TS, Mods>,\n n: number,\n ): IntegerFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== BooleanFieldBuilder ====================\n\nclass BooleanFieldBuilder<\n TS = boolean,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'boolean' as const\n\n get zodBase(): ZB {\n return this.applyModifiersToZod(zLib.boolean()) as ZB\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = integer(name, { mode: 'boolean' }) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): BooleanFieldBuilder<TS, NewMods> {\n return new BooleanFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new BooleanFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: BooleanFieldBuilder<TS, Mods>): BooleanFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: BooleanFieldBuilder<TS, Mods>): BooleanFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: BooleanFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): BooleanFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== TimestampFieldBuilder ====================\n\nclass TimestampFieldBuilder<\n TS = Date,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'timestamp' as const\n\n get zodBase(): ZB {\n return this.applyModifiersToZod(zLib.coerce.date()) as ZB\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = integer(name, { mode: 'timestamp_ms' }) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.defaultNow) {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))` as any)\n } else if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): TimestampFieldBuilder<TS, NewMods> {\n return new TimestampFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new TimestampFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: TimestampFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): TimestampFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets the DB DEFAULT clause to the current timestamp (epoch ms).\n * Generates `sql\\`(cast((julianday('now') - 2440587.5)*86400000 as integer))\\`` in Drizzle schema.\n */\n defaultNow(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Mods & { defaultNow: true }> {\n const newMods = { ...this.modifiers, defaultNow: true } as Mods & { defaultNow: true }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== JsonFieldBuilder ====================\n\n/**\n * JSON フィールドビルダー。\n *\n * `t.json(zodSchema)` 形式で Zod スキーマを渡すと runtime 検証が走る。\n * スキーマ省略時は `z.unknown()` で後方互換を維持する。\n */\nclass JsonFieldBuilder<\n T = unknown,\n TS = T,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'json' as const\n private readonly _zodSchema: z.ZodTypeAny | undefined\n\n constructor(modifiers?: Mods, zodSchema?: z.ZodTypeAny) {\n super(modifiers)\n this._zodSchema = zodSchema\n }\n\n get zodBase(): ZB {\n return this.applyModifiersToZod(this._zodSchema ?? zLib.unknown()) as ZB\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = text(name, { mode: 'json' }).$type<T>() as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): JsonFieldBuilder<T, TS, NewMods> {\n return new JsonFieldBuilder<T, TS, NewMods>(mods, this._zodSchema)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new JsonFieldBuilder<T, TS | undefined, Mods & { optional: true }>(\n newMods,\n this._zodSchema,\n )\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: JsonFieldBuilder<T, TS, Mods>): JsonFieldBuilder<T, TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: JsonFieldBuilder<T, TS, Mods>): JsonFieldBuilder<T, TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: JsonFieldBuilder<T, TS, Mods>,\n value: TS | (() => TS),\n ): JsonFieldBuilder<T, TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== RelationFieldBuilder ====================\n\nexport class RelationFieldBuilder<\n Target extends RelationTargetLike,\n FK extends string,\n Kind extends RelationKind,\n> {\n readonly kind = 'relation' as const\n readonly relationKind: Kind\n readonly target: Target | (() => Target)\n readonly foreignKey: FK\n readonly tsType!: never\n readonly modifiers = {} as const\n\n constructor(relationKind: Kind, target: Target | (() => Target), foreignKey: FK) {\n this.relationKind = relationKind\n this.target = target\n this.foreignKey = foreignKey\n }\n\n get zodBase(): z.ZodNever {\n return zLib.never()\n }\n\n drizzleColumn(name: string): never {\n throw new Error(`relation field '${name}' has no DB column`)\n }\n}\n\n// ==================== Factory ====================\n\n// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\nfunction jsonField<S extends z.ZodTypeAny>(schema: S): JsonFieldBuilder<z.infer<S>, z.infer<S>, {}>\n// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\nfunction jsonField<T = unknown>(): JsonFieldBuilder<T, T, {}>\n// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\nfunction jsonField<T = unknown>(schema?: z.ZodTypeAny): JsonFieldBuilder<T, T, {}> {\n if (schema !== undefined) {\n const version = schema._zod?.version\n if (\n !version ||\n version.major !== 4 ||\n version.minor < 6 ||\n (version.minor === 6 && version.patch < 6)\n ) {\n throw new TypeError('t.json(schema) requires Zod 4.6.6 or later in the 4.x line')\n }\n }\n // biome-ignore lint/complexity/noBannedTypes: {} represents the initial field modifiers\n return new JsonFieldBuilder<T, T, {}>(undefined, schema)\n}\n\n/**\n * Field DSL factory for building type-safe database fields.\n *\n * @example\n * const nameField = t.string().min(1).max(255)\n * const emailField = t.string().email()\n * const idField = t.uuid().primary()\n * const ageField = t.integer().min(0).max(150)\n * const createdAtField = t.timestamp().default(() => new Date())\n * const dataField = t.json<{ foo: string }>()\n * const dataField2 = t.json(z.object({ foo: z.string() })) // runtime validation\n */\nexport const t = {\n string(): StringFieldBuilder<\n string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new StringFieldBuilder<string, {}>()\n },\n\n uuid(): UuidFieldBuilder<\n string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new UuidFieldBuilder<string, {}>()\n },\n\n number(): NumberFieldBuilder<\n number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new NumberFieldBuilder<number, {}>()\n },\n\n integer(): IntegerFieldBuilder<\n number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new IntegerFieldBuilder<number, {}>()\n },\n\n boolean(): BooleanFieldBuilder<\n boolean,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new BooleanFieldBuilder<boolean, {}>()\n },\n\n timestamp(): TimestampFieldBuilder<\n Date,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new TimestampFieldBuilder<Date, {}>()\n },\n\n /**\n * JSON フィールド。\n *\n * `t.json(zodSchema)` 形式で Zod スキーマを渡すと runtime 検証が走る。\n * スキーマ省略時は `z.unknown()` で後方互換を維持する。\n *\n * `t.json(z.object({ foo: z.string() }))` でオブジェクト形状の runtime 検証が可能。\n *\n * @note codegen (`nanoka generate`) は `t.json(zodSchema)` を渡しても `$type<unknown>()` のまま出力する。\n * Drizzle 型が欲しい場合は生成後に手動で書き換えるか `as` を使うこと。\n */\n json: jsonField,\n\n hasMany<Target extends RelationTargetLike, FK extends string>(\n target: Target | (() => Target),\n options: { foreignKey: FK },\n ): RelationFieldBuilder<Target, FK, 'hasMany'> {\n return new RelationFieldBuilder('hasMany', target, options.foreignKey)\n },\n\n belongsTo<Target extends RelationTargetLike, FK extends string>(\n target: Target | (() => Target),\n options: { foreignKey: FK },\n ): RelationFieldBuilder<Target, FK, 'belongsTo'> {\n return new RelationFieldBuilder('belongsTo', target, options.foreignKey)\n },\n}\n"]}
package/dist/config.js CHANGED
@@ -1,4 +1,4 @@
1
- export { t } from './chunk-UBDSGKTX.js';
1
+ export { t } from './chunk-Y4HMEUSV.js';
2
2
 
3
3
  // src/config.ts
4
4
  function defineConfig(config) {
package/dist/index.d.ts CHANGED
@@ -350,7 +350,7 @@ type ApplyOmitToRecord<R, OmitOpt> = ResolveOptKeys<OmitOpt> extends readonly st
350
350
  * @internal
351
351
  * Apply pick/omit/partial transformations to a TypeScript record type.
352
352
  * Mirrors ApplyShape but operates on TS types directly, not Zod shapes.
353
- * Used for Zod v3/v4 compatible middleware input/output type computation.
353
+ * Used for precise Zod 4 middleware input/output type computation.
354
354
  */
355
355
  type ApplyToRecord<R, Opts extends SchemaOptions | undefined> = Opts extends SchemaOptions ? HasOpt<Opts['pick']> extends true ? HasOpt<Opts['omit']> extends true ? Opts extends {
356
356
  partial: true;
@@ -400,7 +400,7 @@ type ValidatorInput<Target extends keyof ValidationTargets, Schema extends z.Zod
400
400
  * Provides proper type narrowing for c.req.valid(target).
401
401
  *
402
402
  * Uses RowType<Fields> directly for input/output type computation
403
- * to ensure Zod v3/v4 compatibility (z.input<ZodTypeAny> returns unknown in Zod v4).
403
+ * to preserve field types (z.input<ZodTypeAny> returns unknown in Zod 4).
404
404
  */
405
405
  type ModelValidatorReturn<Fields extends Record<string, Field<any, any, any>>, Target extends keyof ValidationTargets, Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined> = MiddlewareHandler<any, string, ValidatorInput<Target, Apply<FieldsToZodShape<Fields>, Opts>, ApplyToRecord<RowType<Fields>, Opts>, ApplyToRecord<RowType<Fields>, Opts>>>;
406
406
 
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { t } from './chunk-UBDSGKTX.js';
1
+ export { t } from './chunk-Y4HMEUSV.js';
2
2
  import { drizzle } from 'drizzle-orm/d1';
3
3
  import { zValidator } from '@hono/zod-validator';
4
4
  import { z } from 'zod';
@@ -105,24 +105,38 @@ function applySchemaOptions(baseSchema, opts, accessor) {
105
105
  const resolvedOmit = resolveSchemaOptionKeys(opts.omit, acc);
106
106
  let schema = baseSchema;
107
107
  if (resolvedPick !== void 0) {
108
- const pickArray = Array.from(resolvedPick);
108
+ const pickArray = Array.from(resolvedPick).filter((key) => Object.hasOwn(schema.shape, key));
109
109
  schema = schema.pick(
110
110
  // biome-ignore lint/suspicious/noExplicitAny: Zod API
111
111
  Object.fromEntries(pickArray.map((k) => [k, true]))
112
112
  );
113
113
  }
114
114
  if (resolvedOmit !== void 0) {
115
- const omitArray = Array.from(resolvedOmit);
115
+ const omitArray = Array.from(resolvedOmit).filter((key) => Object.hasOwn(schema.shape, key));
116
116
  schema = schema.omit(
117
117
  // biome-ignore lint/suspicious/noExplicitAny: Zod API
118
118
  Object.fromEntries(omitArray.map((k) => [k, true]))
119
119
  );
120
120
  }
121
121
  if (opts.partial === true) {
122
- schema = schema.partial();
122
+ schema = z.object(
123
+ Object.fromEntries(
124
+ Object.entries(schema.shape).map(([key, value]) => [
125
+ key,
126
+ withoutDefaults(value)
127
+ ])
128
+ )
129
+ ).partial();
123
130
  }
124
131
  return schema;
125
132
  }
133
+ function withoutDefaults(schema) {
134
+ if (schema instanceof z.ZodDefault) return withoutDefaults(schema.removeDefault());
135
+ if (schema instanceof z.ZodPrefault) return withoutDefaults(schema.unwrap());
136
+ if (schema instanceof z.ZodOptional) return z.optional(withoutDefaults(schema.unwrap()));
137
+ if (schema instanceof z.ZodNullable) return z.nullable(withoutDefaults(schema.unwrap()));
138
+ return schema;
139
+ }
126
140
 
127
141
  // src/openapi/generate.ts
128
142
  function toOpenAPIComponent(fields, opts) {
@@ -203,6 +217,18 @@ function zodToOpenAPISchema(schema, strict = false) {
203
217
  const def = getZodDef(schema);
204
218
  if (def === void 0) return {};
205
219
  const typeName = getZodTypeName(def);
220
+ const hasCustomChecks = getZodChecks(def).some((check) => {
221
+ const kind = getZodCheckDef(check).check;
222
+ return kind === "custom" || kind === "overwrite";
223
+ });
224
+ if (hasCustomChecks) {
225
+ if (strict) {
226
+ throw new Error(
227
+ `Unsupported Zod type for strict OpenAPI generation: ${typeName ?? "unknown"}`
228
+ );
229
+ }
230
+ return { "x-nanoka-zod-unsupported": true, "x-nanoka-zod-type": typeName ?? "unknown" };
231
+ }
206
232
  if (typeName === "ZodOptional" || typeName === "optional") {
207
233
  return zodToOpenAPISchema(def.innerType, strict);
208
234
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter/d1.ts","../src/model/types.ts","../src/model/schema.ts","../src/openapi/generate.ts","../src/model/table.ts","../src/model/crud.ts","../src/model/define.ts","../src/openapi/route.ts","../src/openapi/swagger-ui.ts","../src/router/nanoka.ts"],"names":["partial","combinedOmit"],"mappings":"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","file":"index.js","sourcesContent":["import type { D1Database } from '@cloudflare/workers-types'\nimport { drizzle } from 'drizzle-orm/d1'\nimport type { Adapter } from './types'\n\n/**\n * D1-specific adapter factory. Wraps Cloudflare D1 binding in the generic\n * Adapter abstraction, enabling the core query path and router to remain\n * implementation-agnostic.\n */\nexport function d1Adapter<TSchema extends Record<string, unknown> = Record<string, never>>(\n d1: D1Database,\n): Adapter<TSchema> {\n // drizzle-orm/d1's drizzle() returns DrizzleD1Database which embeds D1-specific\n // result types. We cast to BaseSQLiteDatabase via the Adapter interface to keep\n // the D1 dependency local to this file (see CLAUDE.md rule #3). Consumers receive\n // the typed Adapter interface, so this `any` is intentionally local.\n //\n // Note: drizzle-orm/d1 internally stores the D1 binding in db.$client. When\n // handling multiple D1 bindings, call d1Adapter() fresh for each binding rather\n // than caching the return value across binding switches.\n // biome-ignore lint/suspicious/noExplicitAny: intentional - Drizzle returns complex union type\n const db = drizzle(d1) as any\n\n return {\n drizzle: db,\n batch: (queries) => db.batch(queries),\n }\n}\n","import type { Hook } from '@hono/zod-validator'\nimport type { SQL } from 'drizzle-orm'\nimport type { AnySQLiteColumn, SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core'\nimport type { Env, MiddlewareHandler, ValidationTargets } from 'hono'\nimport type { z } from 'zod'\nimport type { Adapter } from '../adapter/types'\nimport type { Field, FieldPolicy, InferFieldType, RelationDef } from '../field/types'\nimport type { OpenAPIModelComponent, OpenAPISchemaObject, OpenAPIUsage } from '../openapi/types'\n\n/**\n * @internal\n * Extracts keys of non-relation fields from a Fields record.\n * Relation fields (kind: 'relation') are excluded from DB column types, RowType, etc.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport type NonRelationKeys<Fields extends Record<string, Field<any, any, any>>> = {\n [K in keyof Fields]: Fields[K] extends { kind: 'relation' } ? never : K\n}[keyof Fields]\n\n/**\n * @internal\n * Extracts keys of relation fields from a Fields record.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport type RelationKeys<Fields extends Record<string, Field<any, any, any>>> = {\n [K in keyof Fields]: Fields[K] extends { kind: 'relation' } ? K : never\n}[keyof Fields]\n\nexport type RelationTargetFields<Target> = Target extends () => infer Resolved\n ? RelationTargetFields<Resolved>\n : Target extends { fields: infer TargetFields }\n ? TargetFields\n : never\n\nexport type RelationResult<F> =\n F extends RelationDef<infer Target, string>\n ? RelationTargetFields<Target> extends Record<string, Field<any, any, any>>\n ? F['relationKind'] extends 'hasMany'\n ? RowType<RelationTargetFields<Target>>[]\n : RowType<RelationTargetFields<Target>> | null\n : never\n : never\n\nexport type WithOptions<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n readonly [K in RelationKeys<Fields>]?: true\n}\n\nexport type WithResult<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n With,\n> = RowType<Fields> & { readonly [K in keyof With]: RelationResult<Fields[K & keyof Fields]> }\n\n/**\n * Options for findMany query.\n * `limit` is required (no default).\n * `offset` defaults to 0 if omitted. Runtime-capped at 100_000 to prevent read amplification — use cursor pagination for deeper paging.\n * `orderBy` is optional for column ordering.\n * `where` accepts either an equality object or a Drizzle SQL expression.\n */\nexport interface FindManyOptions<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n With extends WithOptions<Fields> | undefined = undefined,\n> {\n readonly limit: number\n /** default: 0; runtime cap: 100000 */\n readonly offset?: number\n readonly orderBy?: OrderBy<Fields>\n readonly where?: Where<Fields> | SQL\n readonly with?: With\n}\n\nexport interface FindOneOptions<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n With extends WithOptions<Fields> | undefined = undefined,\n> {\n readonly with?: With\n}\n\n/**\n * Options for findAll query.\n * No `limit` — issues no LIMIT clause. For batch processing / admin tooling.\n * Apply an app-level size guard when used in request handlers.\n */\nexport interface FindAllOptions<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> {\n readonly offset?: number\n readonly orderBy?: OrderBy<Fields>\n readonly where?: Where<Fields> | SQL\n}\n\n/**\n * Order-by specification: single field, or field with direction, or array of multiple.\n */\nexport type OrderBy<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> =\n | (NonRelationKeys<Fields> & string)\n | { readonly column: NonRelationKeys<Fields> & string; readonly direction?: 'asc' | 'desc' }\n | ReadonlyArray<\n | (NonRelationKeys<Fields> & string)\n | { readonly column: NonRelationKeys<Fields> & string; readonly direction?: 'asc' | 'desc' }\n >\n\n/**\n * A single where value: either an equality value or an `{ in: [...] }` operator for IN matching.\n * Note: json fields whose stored value happens to be `{ in: [...] }` in shape are still treated\n * as equality at runtime — the IN operator is applied to non-json fields only.\n */\nexport type WhereValue<T> = T | { readonly in: readonly T[] }\n\n/**\n * Where clause object: each key is a field name, each value is the desired equality, or an\n * `{ in: [...] }` operator for IN matching.\n * json フィールドの値が偶然 `{ in: [...] }` 形でも型上は演算子と区別できないが、ランタイムでは\n * json フィールドは常に等値比較される(IN 演算子は非 json フィールドのみ)。\n */\nexport type Where<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n readonly [K in NonRelationKeys<Fields>]?: WhereValue<InferFieldType<Fields[K]>>\n}\n\n/**\n * Identifier or Where clause: can be a primary key value, a Where object, or a Drizzle SQL expression.\n */\nexport type IdOrWhere<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = string | number | Where<Fields> | SQL\n\n/**\n * Row type: full record type from fields, excluding relation fields.\n */\nexport type RowType<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n [K in NonRelationKeys<Fields>]: InferFieldType<Fields[K]>\n}\n\n/**\n * Drizzle table type with columns typed to match the model's Fields (excluding relation fields).\n * Allows type-safe column access via Model.table.fieldName.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport type ModelTable<Fields extends Record<string, Field<any, any, any>>> =\n SQLiteTableWithColumns<{\n name: string\n schema: undefined\n columns: { [K in NonRelationKeys<Fields>]: AnySQLiteColumn }\n dialect: 'sqlite'\n }>\n\n/**\n * @internal\n * Extracts the policy from a Field's modifiers.\n *\n * Uses `Field<any, { policy: infer P }, any>` rather than a two-step\n * `infer M` + `M extends { policy: infer P }` pattern.\n * The two-step pattern is broken when TypeScript widens `M` to the constraint\n * `FieldModifiers` (which has `policy?: FieldPolicy` as optional), causing\n * `M extends { policy: infer P }` to be true for ALL fields regardless of their\n * actual policy value. Directly matching `{ policy: infer P }` avoids this.\n */\ntype PolicyOf<F> =\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { policy: infer P extends FieldPolicy }, any> ? P : never\n\n/**\n * @internal\n * Computes which field keys should be omitted based on policy and usage.\n * Mirrors the runtime logic in derivePolicyOptions() in schema.ts.\n *\n * NOTE: `[PolicyOf<Fields[K]>] extends [never]` (non-distributive form) is used to\n * short-circuit fields with no policy to `never` (do not omit). Without this guard,\n * `never extends 'serverOnly'` evaluates to `true` (vacuously), causing every field\n * without a policy to be incorrectly included in the omit set.\n */\nexport type PolicyOmitKeys<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n Usage extends 'input-create' | 'input-update' | 'output',\n> = {\n [K in keyof Fields]: [PolicyOf<Fields[K]>] extends [never]\n ? never\n : PolicyOf<Fields[K]> extends 'serverOnly'\n ? K\n : Usage extends 'output'\n ? PolicyOf<Fields[K]> extends 'writeOnly'\n ? K\n : never\n : Usage extends 'input-create' | 'input-update'\n ? PolicyOf<Fields[K]> extends 'readOnly'\n ? K\n : never\n : never\n}[keyof Fields]\n\n/**\n * @internal\n * Computes which field keys have the serverOnly policy.\n * serverOnly fields are completely excluded from CreateInput\n * (cannot be passed even from library internals — they are server-side only).\n *\n * Uses `[PolicyOf<Fields[K]>] extends [never]` (non-distributive form) to short-circuit\n * fields with no policy to `never`. Without this guard, `never extends 'serverOnly'`\n * evaluates to `true` (vacuously), causing every field without a policy to be included.\n */\ntype ServerOnlyKeys<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n [K in keyof Fields]: [PolicyOf<Fields[K]>] extends [never]\n ? never\n : PolicyOf<Fields[K]> extends 'serverOnly'\n ? K\n : never\n}[keyof Fields]\n\n/**\n * @internal\n * Determines if a field is required for create input.\n * A field is optional if it has a default, has defaultNow, is optional, or is readOnly.\n *\n * Uses direct shape matching (`Field<any, { hasDefault: true }, any>`) to avoid\n * the TypeScript infer-widening issue where `infer M` resolves to `FieldModifiers`\n * (the constraint bound) instead of the concrete Mods type, causing `M extends\n * { policy: 'readOnly' }` to be false even for readOnly fields.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\ntype IsRequired<F extends Field<any, any, any>> =\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { hasDefault: true }, any>\n ? false\n : // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { defaultNow: true }, any>\n ? false\n : // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { optional: true }, any>\n ? false\n : // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { policy: 'readOnly' }, any>\n ? false\n : true\n\n/**\n * Create input with precise types:\n * - `readOnly` fields are optional (library internals can pass them; API callers\n * are excluded via inputSchema — but CreateInput itself keeps them as optional\n * so handlers can supply generated values like `id` or `createdAt`)\n * - fields with `default` or `defaultNow` are optional (DB or runtime fills the value)\n * - fields marked `optional` are optional\n * - all other fields are required\n * - `serverOnly` fields are completely excluded (cannot be passed even internally)\n * - `writeOnly` fields are included as required (they are input fields by design)\n * - relation fields are completely excluded (no DB column)\n */\nexport type CreateInput<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n [K in NonRelationKeys<Fields> as IsRequired<Fields[K]> extends true\n ? K extends ServerOnlyKeys<Fields>\n ? never\n : K\n : never]: InferFieldType<Fields[K]>\n} & {\n [K in NonRelationKeys<Fields> as IsRequired<Fields[K]> extends true\n ? never\n : K extends ServerOnlyKeys<Fields>\n ? never\n : K]?: InferFieldType<Fields[K]>\n}\n\nexport type FieldAccessor<K extends string> = { readonly [Key in K]: Key }\n\nexport interface SchemaOptions<K extends string = string> {\n readonly pick?: readonly K[] | ((f: FieldAccessor<K>) => readonly K[])\n readonly omit?: readonly K[] | ((f: FieldAccessor<K>) => readonly K[])\n readonly partial?: boolean\n}\n\n/**\n * @internal\n * Resolves pick/omit option to string array using the accessor when it's a function.\n */\nexport function resolveSchemaOptionKeys<K extends string>(\n opt: readonly K[] | ((f: FieldAccessor<K>) => readonly K[]) | undefined,\n accessor: FieldAccessor<K>,\n): readonly K[] | undefined {\n if (opt === undefined) return undefined\n if (typeof opt === 'function') return opt(accessor)\n return opt\n}\n\n/**\n * @internal\n * Builds a frozen field accessor object for use in schema/validator options.\n * Relation fields are excluded so that `omit: f => [f.posts]` is a type error.\n * Each non-relation key maps to itself, providing typo detection at type level.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport function buildFieldAccessor<Fields extends Record<string, Field<any, any, any>>>(\n fields: Fields,\n): { readonly [K in NonRelationKeys<Fields>]: K } {\n const acc: Record<string, string> = {}\n for (const [k, field] of Object.entries(fields)) {\n if (field.kind === 'relation') continue\n acc[k] = k\n }\n return Object.freeze(acc) as { readonly [K in NonRelationKeys<Fields>]: K }\n}\n\n/**\n * @internal\n * Extracts a Zod shape from fields for the Apply type.\n * Only non-relation fields are included (relation fields have zodBase: ZodNever\n * and are skipped at runtime in buildBaseObject).\n * Indexed access ensures concrete Zod types are preserved (not `any`).\n */\nexport type FieldsToZodShape<\n Fields extends Record<\n string,\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Field<any, any, any>\n >,\n> = {\n [K in NonRelationKeys<Fields>]: Fields[K]['zodBase']\n}\n\n/**\n * @internal\n * Utility to narrow array literal types to union of strings.\n */\ntype ArrayKeys<A> = A extends readonly (infer U)[] ? U : never\n\n/**\n * @internal\n * Resolves pick/omit option type to the array type.\n * Handles both array form and accessor function form.\n */\ntype ResolveOptKeys<Opt> = Opt extends readonly string[]\n ? Opt\n : Opt extends (f: FieldAccessor<infer _K>) => readonly (infer R)[]\n ? readonly R[]\n : never\n\n/**\n * @internal\n * Apply pick transformation to a shape.\n */\ntype ApplyPickToShape<Shape extends z.ZodRawShape, PickOpt> =\n ResolveOptKeys<PickOpt> extends readonly string[]\n ? Pick<Shape, ArrayKeys<ResolveOptKeys<PickOpt>> & keyof Shape>\n : Shape\n\n/**\n * @internal\n * Apply omit transformation to a shape.\n */\ntype ApplyOmitToShape<Shape extends z.ZodRawShape, OmitOpt> =\n ResolveOptKeys<OmitOpt> extends readonly string[]\n ? Omit<Shape, ArrayKeys<ResolveOptKeys<OmitOpt>> & keyof Shape>\n : Shape\n\n/**\n * @internal\n * Apply partial transformation to a shape.\n */\ntype ApplyPartialToShape<Shape extends z.ZodRawShape> = {\n [K in keyof Shape]: z.ZodOptional<Shape[K]>\n}\n\n/**\n * @internal\n * Checks if an option value (array or function) is present (i.e. not undefined and not never).\n * Uses distributive conditional to handle union types like `T | undefined`.\n */\ntype HasOpt<Opt> = undefined extends Opt ? false : [Opt] extends [never] ? false : true\n\n/**\n * @internal\n * Apply pick/omit/partial transformations to a Zod raw shape.\n * Order: pick → omit → partial\n * Handles both array form and accessor function form for pick/omit.\n */\ntype ApplyShape<\n Shape extends z.ZodRawShape,\n Opts extends SchemaOptions | undefined,\n> = Opts extends SchemaOptions\n ? HasOpt<Opts['pick']> extends true\n ? HasOpt<Opts['omit']> extends true\n ? Opts extends { partial: true }\n ? ApplyPartialToShape<ApplyOmitToShape<ApplyPickToShape<Shape, Opts['pick']>, Opts['omit']>>\n : ApplyOmitToShape<ApplyPickToShape<Shape, Opts['pick']>, Opts['omit']>\n : Opts extends { partial: true }\n ? ApplyPartialToShape<ApplyPickToShape<Shape, Opts['pick']>>\n : ApplyPickToShape<Shape, Opts['pick']>\n : HasOpt<Opts['omit']> extends true\n ? Opts extends { partial: true }\n ? ApplyPartialToShape<ApplyOmitToShape<Shape, Opts['omit']>>\n : ApplyOmitToShape<Shape, Opts['omit']>\n : Opts extends { partial: true }\n ? ApplyPartialToShape<Shape>\n : Shape\n : Shape\n\n/**\n * @internal\n * Returns the correct Zod object type after applying pick/omit/partial transformations.\n */\nexport type Apply<\n Shape extends z.ZodRawShape,\n Opts extends SchemaOptions | undefined,\n> = z.ZodObject<ApplyShape<Shape, Opts>>\n\n/**\n * @internal\n * Apply pick transformation to a TS record type.\n */\ntype ApplyPickToRecord<R, PickOpt> =\n ResolveOptKeys<PickOpt> extends readonly string[]\n ? Pick<R, ArrayKeys<ResolveOptKeys<PickOpt>> & keyof R>\n : R\n\n/**\n * @internal\n * Apply omit transformation to a TS record type.\n */\ntype ApplyOmitToRecord<R, OmitOpt> =\n ResolveOptKeys<OmitOpt> extends readonly string[]\n ? Omit<R, ArrayKeys<ResolveOptKeys<OmitOpt>> & keyof R>\n : R\n\n/**\n * @internal\n * Apply pick/omit/partial transformations to a TypeScript record type.\n * Mirrors ApplyShape but operates on TS types directly, not Zod shapes.\n * Used for Zod v3/v4 compatible middleware input/output type computation.\n */\ntype ApplyToRecord<R, Opts extends SchemaOptions | undefined> = Opts extends SchemaOptions\n ? HasOpt<Opts['pick']> extends true\n ? HasOpt<Opts['omit']> extends true\n ? Opts extends { partial: true }\n ? Partial<ApplyOmitToRecord<ApplyPickToRecord<R, Opts['pick']>, Opts['omit']>>\n : ApplyOmitToRecord<ApplyPickToRecord<R, Opts['pick']>, Opts['omit']>\n : Opts extends { partial: true }\n ? Partial<ApplyPickToRecord<R, Opts['pick']>>\n : ApplyPickToRecord<R, Opts['pick']>\n : HasOpt<Opts['omit']> extends true\n ? Opts extends { partial: true }\n ? Partial<ApplyOmitToRecord<R, Opts['omit']>>\n : ApplyOmitToRecord<R, Opts['omit']>\n : Opts extends { partial: true }\n ? Partial<R>\n : R\n : R\n\n/**\n * @internal\n * Mirrors @hono/zod-validator's middleware Input type.\n * Aligned with @hono/zod-validator@0.4.x; revisit on version bump.\n */\ntype HasUndefined<T> = undefined extends T ? true : false\n\n/**\n * @internal\n * Hono middleware input/output type for validator middleware.\n * Aligned with @hono/zod-validator@0.4.x; revisit on version bump.\n *\n * WARNING (Zod 4): `z.input<ZodTypeAny>` resolves to `unknown` in Zod 4, making\n * `c.req.valid(target)` return `unknown` if `In`/`Out` are left as defaults.\n * When using this type directly (outside of `ModelValidatorReturn`), always pass\n * explicit `In` and `Out` type arguments — do NOT rely on the defaults.\n *\n * Internal usages in this file (ModelValidatorReturn and preset overloads) already\n * pass `In`/`Out` explicitly via `ApplyToRecord` or `Omit<RowType<Fields>, ...>`.\n */\nexport type ValidatorInput<\n Target extends keyof ValidationTargets,\n Schema extends z.ZodTypeAny,\n In = z.input<Schema>,\n Out = z.output<Schema>,\n> = {\n in: HasUndefined<In> extends true\n ? {\n [K in Target]?:\n | (In extends ValidationTargets[K]\n ? In\n : { [K2 in keyof In]?: ValidationTargets[K][K2] | undefined })\n | undefined\n }\n : {\n [K in Target]: In extends ValidationTargets[K]\n ? In\n : { [K2 in keyof In]: ValidationTargets[K][K2] }\n }\n out: { [K in Target]: Out }\n}\n\n/**\n * @internal\n * Type-safe Hono middleware handler return for Model.validator().\n * Provides proper type narrowing for c.req.valid(target).\n *\n * Uses RowType<Fields> directly for input/output type computation\n * to ensure Zod v3/v4 compatibility (z.input<ZodTypeAny> returns unknown in Zod v4).\n */\nexport type ModelValidatorReturn<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n Target extends keyof ValidationTargets,\n Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined,\n> = MiddlewareHandler<\n any,\n string,\n ValidatorInput<\n Target,\n Apply<FieldsToZodShape<Fields>, Opts>,\n ApplyToRecord<RowType<Fields>, Opts>,\n ApplyToRecord<RowType<Fields>, Opts>\n >\n>\n\n/**\n * Hook type for Model.validator() third argument.\n * Re-exported from @hono/zod-validator for convenience.\n */\nexport type { Hook }\n\n/**\n * Represents a database model with type-safe schema derivation and CRUD operations.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for the generic Field constraint\nexport interface Model<Fields extends Record<string, Field<any, any, any>>> {\n readonly fields: Fields\n readonly tableName: string\n readonly table: ModelTable<Fields>\n\n /**\n * Returns a Zod schema derived from this model's fields.\n * Supports pick, omit, and partial transformations.\n *\n * @example\n * const CreateSchema = User.schema({ omit: ['passwordHash'] })\n * const UpdateSchema = User.schema({ partial: true, pick: ['name', 'email'] })\n */\n schema<Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined>(\n opts?: Opts,\n ): Apply<FieldsToZodShape<Fields>, Opts>\n\n /**\n * Returns a Hono middleware validator derived from this model's schema.\n * Integrates with @hono/zod-validator to validate request inputs.\n * The optional `hook` argument is passed through to @hono/zod-validator.\n *\n * Accepts a preset ('create' | 'update') as second argument to use inputSchema.\n * When a preset is used, the return type is a MiddlewareHandler (loosely typed in Phase 2A).\n * Precise type narrowing for preset is deferred to Phase 2B M2.3.\n *\n * @example\n * app.post('/users', User.validator('json', 'create'), c => {\n * const body = c.req.valid('json')\n * })\n * app.post('/users', User.validator('json', { omit: ['passwordHash'] }), c => {\n * const body = c.req.valid('json')\n * })\n * // With hook:\n * app.post('/users', User.validator('json', opts, (result, c) => {\n * if (!result.success) return c.json({ error: 'Invalid request' }, 400)\n * }), handler)\n */\n validator<Target extends keyof ValidationTargets, E extends Env = Env, P extends string = string>(\n target: Target,\n preset: 'create',\n hook?: Hook<\n Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-create'> & string>,\n E,\n P,\n Target\n >,\n ): MiddlewareHandler<\n E,\n P,\n ValidatorInput<\n Target,\n z.ZodObject<z.ZodRawShape>,\n Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-create'> & string>,\n Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-create'> & string>\n >\n >\n validator<Target extends keyof ValidationTargets, E extends Env = Env, P extends string = string>(\n target: Target,\n preset: 'update',\n hook?: Hook<\n Partial<Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-update'> & string>>,\n E,\n P,\n Target\n >,\n ): MiddlewareHandler<\n E,\n P,\n ValidatorInput<\n Target,\n z.ZodObject<z.ZodRawShape>,\n Partial<Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-update'> & string>>,\n Partial<Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-update'> & string>>\n >\n >\n validator<\n Target extends keyof ValidationTargets,\n Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined,\n E extends Env = Env,\n P extends string = string,\n >(\n target: Target,\n opts?: Opts,\n hook?: Hook<z.output<Apply<FieldsToZodShape<Fields>, Opts>>, E, P, Target>,\n ): ModelValidatorReturn<Fields, Target, Opts>\n\n /**\n * Returns a Zod schema for API input, with policy-based field exclusions applied.\n * - 'create': serverOnly and readOnly fields are excluded\n * - 'update': same exclusions + all fields become optional (partial: true)\n *\n * The return type precisely reflects policy-derived omissions using PolicyOmitKeys.\n */\n inputSchema<Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined = undefined>(\n usage: 'create',\n opts?: Opts,\n ): z.ZodObject<\n ApplyShape<\n Omit<FieldsToZodShape<Fields>, PolicyOmitKeys<Fields, 'input-create'> & string>,\n Opts\n >\n >\n inputSchema<Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined = undefined>(\n usage: 'update',\n opts?: Opts,\n ): z.ZodObject<\n ApplyShape<\n Omit<FieldsToZodShape<Fields>, PolicyOmitKeys<Fields, 'input-update'> & string>,\n Opts extends undefined ? { partial: true } : Opts & { partial: true }\n >\n >\n inputSchema(\n usage: 'create' | 'update',\n opts?: SchemaOptions<NonRelationKeys<Fields> & string>,\n ): z.ZodObject<z.ZodRawShape>\n\n /**\n * Returns a Zod schema for API output, with policy-based field exclusions applied.\n * - serverOnly and writeOnly fields are excluded\n * - readOnly fields remain present\n *\n * The return type precisely reflects policy-derived omissions using PolicyOmitKeys.\n */\n outputSchema<\n Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined = undefined,\n >(\n opts?: Opts,\n ): z.ZodObject<\n ApplyShape<Omit<FieldsToZodShape<Fields>, PolicyOmitKeys<Fields, 'output'> & string>, Opts>\n >\n\n /**\n * Parses a DB row through outputSchema and returns the safe response object.\n * Equivalent to `User.outputSchema().parse(row)`.\n */\n toResponse(row: RowType<Fields>): unknown\n\n /**\n * Parses an array of DB rows through outputSchema and returns safe response objects.\n * The outputSchema is built once and reused for all rows.\n * Equivalent to mapping `toResponse` over the array but more efficient.\n *\n * @example\n * const rows = await app.db.select().from(User.table).where(...)\n * return c.json(User.toResponseMany(rows))\n */\n toResponseMany(rows: readonly RowType<Fields>[]): unknown[]\n\n toOpenAPIComponent(): OpenAPIModelComponent\n\n toOpenAPISchema(\n usage: 'output',\n opts: { readonly with: Partial<Record<RelationKeys<Fields> & string, true>> },\n ): OpenAPISchemaObject\n toOpenAPISchema(usage: OpenAPIUsage): OpenAPISchemaObject\n\n /**\n * Fetches multiple rows with pagination and optional ordering.\n * `limit` is required (no default) to prevent accidental unbounded queries.\n * Offset defaults to 0 if omitted. Runtime-capped at offset 100_000 — use cursor pagination for deeper paging.\n *\n * @example\n * const users = await User.findMany(adapter, { limit: 20 })\n * const page2 = await User.findMany(adapter, { limit: 20, offset: 20 })\n * const sorted = await User.findMany(adapter, { limit: 10, orderBy: 'name' })\n */\n findMany<With extends WithOptions<Fields>>(\n adapter: Adapter,\n options: FindManyOptions<Fields, With> & { readonly with: With },\n ): Promise<WithResult<Fields, With>[]>\n findMany(adapter: Adapter, options: FindManyOptions<Fields>): Promise<RowType<Fields>[]>\n\n /**\n * Fetches all rows without a LIMIT clause.\n * For batch processing / admin tooling. Apply an app-level size guard when used in request handlers.\n *\n * @example\n * const users = await User.findAll(adapter)\n * const admins = await User.findAll(adapter, { orderBy: 'name', where: { role: 'admin' } })\n */\n findAll(adapter: Adapter, options?: FindAllOptions<Fields>): Promise<RowType<Fields>[]>\n\n /**\n * Fetches a single row by primary key or where clause.\n * Returns null if not found.\n *\n * @example\n * const user = await User.findOne(adapter, id)\n * const byEmail = await User.findOne(adapter, { email: 'john@example.com' })\n */\n findOne<With extends WithOptions<Fields>>(\n adapter: Adapter,\n idOrWhere: IdOrWhere<Fields>,\n options: FindOneOptions<Fields, With> & { readonly with: With },\n ): Promise<WithResult<Fields, With> | null>\n findOne(adapter: Adapter, idOrWhere: IdOrWhere<Fields>): Promise<RowType<Fields> | null>\n\n /**\n * Creates a new row and returns the created record.\n *\n * @example\n * const user = await User.create(adapter, { name: 'John', email: 'john@example.com' })\n */\n create(adapter: Adapter, data: CreateInput<Fields>): Promise<RowType<Fields>>\n\n /**\n * Updates rows matching the given id or where clause.\n * Returns the updated row(s), or null if no rows matched.\n *\n * @example\n * const updated = await User.update(adapter, id, { name: 'Jane' })\n * const byEmail = await User.update(adapter, { email: '...' }, { name: 'Jane' })\n */\n update(\n adapter: Adapter,\n idOrWhere: IdOrWhere<Fields>,\n data: Partial<RowType<Fields>>,\n ): Promise<RowType<Fields> | null>\n\n /**\n * Deletes rows matching the given id or where clause.\n * Returns the number of deleted rows.\n *\n * @example\n * const result = await User.delete(adapter, id)\n * console.log(result.deleted) // number\n */\n delete(adapter: Adapter, idOrWhere: IdOrWhere<Fields>): Promise<{ readonly deleted: number }>\n}\n","import { z } from 'zod'\nimport type { Field } from '../field/types'\nimport { type FieldAccessor, resolveSchemaOptionKeys, type SchemaOptions } from './types'\n\ntype PolicyUsage = 'input-create' | 'input-update' | 'output'\n\n/**\n * Returns field names that are security-critical and must always be omitted from API schemas.\n * Currently only serverOnly fields. These cannot be overridden by user pick/omit.\n */\nfunction computeForcedOmit(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling\n fields: Record<string, Field<any, any, any>>,\n): string[] {\n const omit: string[] = []\n for (const [key, field] of Object.entries(fields)) {\n if (field.modifiers.policy === 'serverOnly') {\n omit.push(key)\n }\n }\n return omit\n}\n\n/**\n * Returns field names for relation fields that must always be omitted from API schemas.\n * Relation fields have no DB column and no Zod schema representation.\n */\nfunction computeRelationOmit(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling\n fields: Record<string, Field<any, any, any>>,\n): Set<string> {\n const keys = new Set<string>()\n for (const [key, field] of Object.entries(fields)) {\n if (field.kind === 'relation') keys.add(key)\n }\n return keys\n}\n\n/**\n * Returns field names to omit based on UX-oriented policy (writeOnly / readOnly).\n * These can be overridden when user explicitly provides pick.\n *\n * Policy mapping:\n * - `writeOnly`: omitted from output only. For input targets (input-create, input-update),\n * writeOnly fields are NOT omitted — they are intentionally part of the input (e.g. password).\n * - `readOnly`: omitted from input targets (input-create, input-update) only. Remains in output.\n *\n * The asymmetry is by design: writeOnly means \"accepted on write, hidden on read\";\n * readOnly means \"visible on read, rejected on write\".\n */\nfunction computeOptionalOmit(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling\n fields: Record<string, Field<any, any, any>>,\n target: PolicyUsage,\n): string[] {\n const omit: string[] = []\n for (const [key, field] of Object.entries(fields)) {\n const policy = field.modifiers.policy\n if (!policy) continue\n if (policy === 'writeOnly' && target === 'output') {\n omit.push(key)\n } else if (policy === 'readOnly' && (target === 'input-create' || target === 'input-update')) {\n omit.push(key)\n }\n }\n return omit\n}\n\n/**\n * Merges policy-derived omit with user-provided SchemaOptions.\n *\n * serverOnly fields are always omitted regardless of user pick/omit (security invariant).\n * writeOnly / readOnly are UX-oriented and can be overridden when user provides pick.\n * For 'input-update', partial defaults to true unless user specifies otherwise.\n */\nexport function derivePolicyOptions(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling\n fields: Record<string, Field<any, any, any>>,\n usage: PolicyUsage,\n userOpts?: SchemaOptions,\n // biome-ignore lint/suspicious/noExplicitAny: accessor is a plain object with string keys\n accessor?: FieldAccessor<any>,\n): SchemaOptions {\n const forcedBase = computeForcedOmit(fields)\n const relationOmit = computeRelationOmit(fields)\n const forced = [...new Set([...forcedBase, ...relationOmit])]\n const optional = computeOptionalOmit(fields, usage)\n\n const acc = accessor ?? ({} as FieldAccessor<string>)\n const resolvedPick = resolveSchemaOptionKeys(userOpts?.pick, acc)\n const resolvedOmit = resolveSchemaOptionKeys(userOpts?.omit, acc)\n\n if (resolvedPick !== undefined) {\n const partial = usage === 'input-update' ? (userOpts?.partial ?? true) : userOpts?.partial\n // serverOnly fields are stripped from pick even if user explicitly listed them\n const sanitizedPick = Array.from(resolvedPick).filter((k) => !forced.includes(k))\n // Combine forced omit with user-provided omit to preserve both constraints\n const combinedOmit = [...new Set([...forced, ...(resolvedOmit ?? [])])]\n return {\n ...userOpts,\n pick: sanitizedPick,\n ...(combinedOmit.length > 0 ? { omit: combinedOmit } : {}),\n partial,\n }\n }\n\n const combinedOmit = [...new Set([...forced, ...optional, ...(resolvedOmit ?? [])])]\n const partial =\n usage === 'input-update' ? (userOpts?.partial ?? true) : (userOpts?.partial ?? undefined)\n\n return {\n ...(userOpts ?? {}),\n pick: undefined,\n ...(combinedOmit.length > 0 ? { omit: combinedOmit } : {}),\n ...(partial !== undefined ? { partial } : {}),\n }\n}\n\n/**\n * Builds a Zod object schema from a fields definition.\n * Returns a ZodObject with all fields required and present.\n * Relation fields are excluded as they have no Zod schema representation.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling and Zod shape\nexport function buildBaseObject(fields: Record<string, Field<any, any, any>>): z.ZodObject<any> {\n // biome-ignore lint/suspicious/noExplicitAny: Record key-value pairs have any type for shape\n const shape: Record<string, any> = {}\n for (const [key, field] of Object.entries(fields)) {\n if (field.kind === 'relation') continue\n shape[key] = field.zodBase\n }\n return z.object(shape)\n}\n\n/**\n * Applies pick, omit, and partial transformations to a Zod object schema.\n * Order: pick → omit → partial\n *\n * Returns the transformed schema, cast to Apply<Shape, Opts> at the call site.\n */\nexport function applySchemaOptions(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Zod shape operations\n baseSchema: z.ZodObject<any>,\n opts: SchemaOptions | undefined,\n // biome-ignore lint/suspicious/noExplicitAny: accessor is a plain object with string keys\n accessor?: FieldAccessor<any>,\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for return type\n): z.ZodObject<any> {\n if (!opts) {\n return baseSchema\n }\n\n const acc = accessor ?? ({} as FieldAccessor<string>)\n const resolvedPick = resolveSchemaOptionKeys(opts.pick, acc)\n const resolvedOmit = resolveSchemaOptionKeys(opts.omit, acc)\n\n let schema = baseSchema\n\n // Apply pick\n if (resolvedPick !== undefined) {\n const pickArray = Array.from(resolvedPick)\n schema = schema.pick(\n // biome-ignore lint/suspicious/noExplicitAny: Zod API\n Object.fromEntries(pickArray.map((k) => [k, true])) as any,\n )\n }\n\n // Apply omit\n if (resolvedOmit !== undefined) {\n const omitArray = Array.from(resolvedOmit)\n schema = schema.omit(\n // biome-ignore lint/suspicious/noExplicitAny: Zod API\n Object.fromEntries(omitArray.map((k) => [k, true])) as any,\n )\n }\n\n // Apply partial\n // `partial: false` を渡してもこの条件で何もしない。スキーマは required のまま。\n if (opts.partial === true) {\n schema = schema.partial()\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Cast to Apply type at call site\n return schema as any\n}\n","import type { Field, RelationDef } from '../field/types'\nimport { applySchemaOptions, buildBaseObject, derivePolicyOptions } from '../model/schema'\nimport type { SchemaOptions } from '../model/types'\nimport type {\n OpenAPIModelComponent,\n OpenAPISchemaObject,\n OpenAPIUsage,\n WithOpenAPIOption,\n} from './types'\n\n// biome-ignore lint/suspicious/noExplicitAny: OpenAPI generation accepts any concrete field builder.\ntype AnyField = Field<any, any, any>\ntype FieldsRecord = Record<string, AnyField>\n\ninterface OpenAPIOptions {\n readonly opts?: SchemaOptions\n readonly strict?: boolean\n readonly with?: WithOpenAPIOption\n}\n\nexport function toOpenAPIComponent(\n fields: FieldsRecord,\n opts?: OpenAPIOptions,\n): OpenAPIModelComponent {\n return {\n create: toOpenAPISchema(fields, 'create', opts),\n update: toOpenAPISchema(fields, 'update', opts),\n output: toOpenAPISchema(fields, 'output', opts),\n }\n}\n\nexport function toOpenAPISchema(\n fields: FieldsRecord,\n usage: OpenAPIUsage,\n opts?: OpenAPIOptions,\n): OpenAPISchemaObject {\n const policyUsage =\n usage === 'create' ? 'input-create' : usage === 'update' ? 'input-update' : 'output'\n const merged = derivePolicyOptions(fields, policyUsage, opts?.opts)\n const schema = applySchemaOptions(buildBaseObject(fields), merged)\n const shape = getZodObjectShape(schema)\n const properties: Record<string, OpenAPISchemaObject> = {}\n const required: string[] = []\n\n for (const [key, zodSchema] of Object.entries(shape)) {\n const field = fields[key]\n if (field === undefined) continue\n if (field.kind === 'relation') continue\n\n properties[key] = fieldToOpenAPISchema(field, opts?.strict)\n if (field.modifiers.policy === 'writeOnly' && (usage === 'create' || usage === 'update')) {\n properties[key].writeOnly = true\n }\n if (field.modifiers.policy === 'readOnly' && usage === 'output') {\n properties[key].readOnly = true\n }\n if (usage !== 'update' && isRequiredZodSchema(zodSchema)) {\n required.push(key)\n }\n }\n\n if (usage === 'output' && opts?.with !== undefined) {\n for (const [key, field] of Object.entries(fields)) {\n if (field.kind !== 'relation') continue\n if (opts.with[key] !== true) continue\n const relationField = field as unknown as RelationDef\n const rawTarget = relationField.target\n const targetModel = typeof rawTarget === 'function' ? rawTarget() : rawTarget\n const targetSchema = toOpenAPISchema(targetModel.fields as FieldsRecord, 'output')\n if (relationField.relationKind === 'hasMany') {\n properties[key] = { type: 'array', items: targetSchema }\n } else {\n properties[key] = { ...targetSchema, nullable: true }\n }\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n }\n}\n\nfunction fieldToOpenAPISchema(field: AnyField, strict = false): OpenAPISchemaObject {\n const schema: OpenAPISchemaObject =\n field.kind === 'json'\n ? zodToOpenAPISchema(field.zodBase, strict)\n : field.kind === 'string'\n ? { type: 'string' }\n : field.kind === 'uuid'\n ? { type: 'string', format: 'uuid' }\n : field.kind === 'number'\n ? { type: 'number' }\n : field.kind === 'integer'\n ? { type: 'integer' }\n : field.kind === 'boolean'\n ? { type: 'boolean' }\n : field.kind === 'timestamp'\n ? { type: 'string', format: 'date-time' }\n : {}\n\n if (field.modifiers.format === 'email') {\n schema.format = 'email'\n }\n if (field.modifiers.min !== undefined) {\n if (field.kind === 'string' || field.kind === 'uuid') {\n schema.minLength = field.modifiers.min\n } else {\n schema.minimum = field.modifiers.min\n }\n }\n if (field.modifiers.max !== undefined) {\n if (field.kind === 'string' || field.kind === 'uuid') {\n schema.maxLength = field.modifiers.max\n } else {\n schema.maximum = field.modifiers.max\n }\n }\n\n if (field.modifiers.optional) {\n schema.nullable = true\n }\n\n return schema\n}\n\nfunction zodToOpenAPISchema(schema: unknown, strict = false): OpenAPISchemaObject {\n const def = getZodDef(schema)\n if (def === undefined) return {}\n\n const typeName = getZodTypeName(def)\n\n if (typeName === 'ZodOptional' || typeName === 'optional') {\n return zodToOpenAPISchema(def.innerType, strict)\n }\n if (typeName === 'ZodDefault' || typeName === 'default') {\n return zodToOpenAPISchema(def.innerType, strict)\n }\n if (typeName === 'ZodNullable' || typeName === 'nullable') {\n return { ...zodToOpenAPISchema(def.innerType, strict), nullable: true }\n }\n\n if (typeName === 'ZodObject' || typeName === 'object') {\n const shape = getZodObjectShape(schema)\n const properties: Record<string, OpenAPISchemaObject> = {}\n const required: string[] = []\n\n for (const [key, childSchema] of Object.entries(shape)) {\n properties[key] = zodToOpenAPISchema(childSchema, strict)\n if (isRequiredZodSchema(childSchema)) {\n required.push(key)\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n }\n }\n\n if (typeName === 'ZodString' || typeName === 'string') {\n return applyStringChecks({ type: 'string' }, def)\n }\n\n if (typeName === 'ZodNumber' || typeName === 'number') {\n return applyNumberChecks({ type: hasIntegerCheck(def) ? 'integer' : 'number' }, def)\n }\n\n if (typeName === 'ZodBoolean' || typeName === 'boolean') {\n return { type: 'boolean' }\n }\n\n if (typeName === 'ZodArray' || typeName === 'array') {\n const itemSchema = def.element ?? def.type\n return {\n type: 'array',\n items: zodToOpenAPISchema(itemSchema, strict),\n }\n }\n\n if (typeName === 'ZodRecord' || typeName === 'record') {\n return {\n type: 'object',\n additionalProperties: zodToOpenAPISchema(def.valueType, strict),\n }\n }\n\n if (typeName === 'ZodUnknown' || typeName === 'unknown') {\n return {}\n }\n\n if (strict) {\n throw new Error(`Unsupported Zod type for strict OpenAPI generation: ${typeName ?? 'unknown'}`)\n }\n return {\n 'x-nanoka-zod-unsupported': true,\n ...(typeName ? { 'x-nanoka-zod-type': typeName } : {}),\n }\n}\n\nfunction getZodObjectShape(schema: unknown): Record<string, unknown> {\n if (\n typeof schema === 'object' &&\n schema !== null &&\n 'shape' in schema &&\n typeof schema.shape === 'object' &&\n schema.shape !== null\n ) {\n return schema.shape as Record<string, unknown>\n }\n\n if (\n typeof schema === 'object' &&\n schema !== null &&\n '_def' in schema &&\n typeof schema._def === 'object' &&\n schema._def !== null &&\n 'shape' in schema._def\n ) {\n const shape = schema._def.shape\n return (typeof shape === 'function' ? shape() : shape) as Record<string, unknown>\n }\n\n return {}\n}\n\nfunction isRequiredZodSchema(schema: unknown): boolean {\n const def = getZodDef(schema)\n if (def === undefined) {\n return true\n }\n\n const typeName = getZodTypeName(def)\n return (\n typeName !== 'ZodOptional' &&\n typeName !== 'optional' &&\n typeName !== 'ZodDefault' &&\n typeName !== 'default'\n )\n}\n\nfunction getZodDef(schema: unknown): Record<string, unknown> | undefined {\n if (\n typeof schema === 'object' &&\n schema !== null &&\n '_def' in schema &&\n typeof schema._def === 'object' &&\n schema._def !== null\n ) {\n return schema._def as Record<string, unknown>\n }\n\n return undefined\n}\n\nfunction getZodTypeName(def: Record<string, unknown>): string | undefined {\n return typeof def.typeName === 'string'\n ? def.typeName\n : typeof def.type === 'string'\n ? def.type\n : undefined\n}\n\nfunction applyStringChecks(\n schema: OpenAPISchemaObject,\n def: Record<string, unknown>,\n): OpenAPISchemaObject {\n for (const check of getZodChecks(def)) {\n const checkDef = getZodCheckDef(check)\n if (checkDef.kind === 'email' || checkDef.format === 'email') {\n schema.format = 'email'\n }\n if (checkDef.kind === 'min' && typeof checkDef.value === 'number') {\n schema.minLength = checkDef.value\n }\n if (checkDef.kind === 'max' && typeof checkDef.value === 'number') {\n schema.maxLength = checkDef.value\n }\n if (checkDef.check === 'min_length' && typeof checkDef.minimum === 'number') {\n schema.minLength = checkDef.minimum\n }\n if (checkDef.check === 'max_length' && typeof checkDef.maximum === 'number') {\n schema.maxLength = checkDef.maximum\n }\n }\n\n return schema\n}\n\nfunction applyNumberChecks(\n schema: OpenAPISchemaObject,\n def: Record<string, unknown>,\n): OpenAPISchemaObject {\n for (const check of getZodChecks(def)) {\n const checkDef = getZodCheckDef(check)\n if (checkDef.kind === 'min' && typeof checkDef.value === 'number') {\n schema.minimum = checkDef.value\n }\n if (checkDef.kind === 'max' && typeof checkDef.value === 'number') {\n schema.maximum = checkDef.value\n }\n if (\n (checkDef.check === 'greater_than' || checkDef.check === 'number_format') &&\n typeof checkDef.minimum === 'number'\n ) {\n schema.minimum = checkDef.minimum\n }\n if (\n (checkDef.check === 'less_than' || checkDef.check === 'number_format') &&\n typeof checkDef.maximum === 'number'\n ) {\n schema.maximum = checkDef.maximum\n }\n }\n\n return schema\n}\n\nfunction hasIntegerCheck(def: Record<string, unknown>): boolean {\n return getZodChecks(def).some((check) => {\n const checkDef = getZodCheckDef(check)\n return (\n checkDef.kind === 'int' ||\n checkDef.format === 'safeint' ||\n checkDef.format === 'int32' ||\n checkDef.format === 'int64'\n )\n })\n}\n\nfunction getZodChecks(def: Record<string, unknown>): readonly unknown[] {\n return Array.isArray(def.checks) ? def.checks : []\n}\n\nfunction getZodCheckDef(check: unknown): Record<string, unknown> {\n if (typeof check !== 'object' || check === null) {\n return {}\n }\n if (\n '_zod' in check &&\n typeof check._zod === 'object' &&\n check._zod !== null &&\n 'def' in check._zod &&\n typeof check._zod.def === 'object' &&\n check._zod.def !== null\n ) {\n return check._zod.def as Record<string, unknown>\n }\n\n return check as Record<string, unknown>\n}\n","import {\n type AnySQLiteColumn,\n type SQLiteTableWithColumns,\n sqliteTable,\n} from 'drizzle-orm/sqlite-core'\nimport type { Field } from '../field/types'\nimport type { NonRelationKeys } from './types'\n\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\ntype ModelTable<Fields extends Record<string, Field<any, any, any>>> = SQLiteTableWithColumns<{\n name: string\n schema: undefined\n columns: { [K in NonRelationKeys<Fields>]: AnySQLiteColumn }\n dialect: 'sqlite'\n}>\n\n/**\n * Constructs a Drizzle SQLiteTable from a tableName and fields.\n * Each field is converted to a Drizzle column via field.drizzleColumn(key).\n * @internal\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport function buildTable<Fields extends Record<string, Field<any, any, any>>>(\n tableName: string,\n fields: Fields,\n): ModelTable<Fields> {\n const columns: Record<string, any> = {}\n for (const [key, field] of Object.entries(fields)) {\n if (field.kind === 'relation') continue\n columns[key] = field.drizzleColumn(key)\n }\n return sqliteTable(tableName, columns) as unknown as ModelTable<Fields>\n}\n","import { and, asc, desc, eq, inArray, SQL } from 'drizzle-orm'\nimport type { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core'\nimport { HTTPException } from 'hono/http-exception'\nimport type { Adapter } from '../adapter/types'\nimport type { Field, RelationDef, RelationTargetLike } from '../field/types'\nimport { buildTable } from './table'\nimport type {\n CreateInput,\n FindAllOptions,\n FindOneOptions,\n IdOrWhere,\n OrderBy,\n RowType,\n Where,\n WithOptions,\n WithResult,\n} from './types'\n\n// DoS guard for findMany; findAll intentionally bypasses this; values >100k → use cursor pagination. Keep in sync with README / docs-site / llms-full.txt.\nconst MAX_OFFSET = 100_000\n\n/**\n * Validates and guards limit/offset parameters.\n * @internal\n */\nfunction guardLimit(limit: unknown): number {\n if (!Number.isInteger(limit)) {\n throw new HTTPException(400, { message: 'limit must be an integer' })\n }\n const n = limit as number\n if (n < 0) {\n throw new HTTPException(400, { message: 'limit must be >= 0' })\n }\n return n\n}\n\nfunction guardOffset(offset: unknown): number {\n if (!Number.isInteger(offset)) {\n throw new HTTPException(400, { message: 'offset must be an integer' })\n }\n const n = offset as number\n if (n < 0) {\n throw new HTTPException(400, { message: 'offset must be >= 0' })\n }\n return n\n}\n\n/**\n * Finds the primary key field from fields record.\n * @internal\n */\nfunction findPrimaryKey(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n fields: Record<string, Field<any, any, any>>,\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n): [string, Field<any, any, any>] | null {\n let pkKey: string | undefined\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n let pkField: Field<any, any, any> | undefined\n let pkCount = 0\n\n for (const [key, field] of Object.entries(fields)) {\n if (field.modifiers.primary === true) {\n pkCount++\n if (pkCount === 1) {\n pkKey = key\n pkField = field\n }\n }\n }\n\n if (pkCount === 0) {\n return null\n }\n if (pkCount > 1) {\n throw new HTTPException(500, { message: 'model has multiple primary keys' })\n }\n if (pkKey === undefined || pkField === undefined) {\n return null\n }\n\n return [pkKey, pkField]\n}\n\n/**\n * Detects whether a value is an `{ in: [...] }` operator object for a non-json field.\n * @internal\n */\n// biome-ignore lint/suspicious/noExplicitAny: field constraint\nfunction isInOperator(value: unknown, field: Field<any, any, any> | undefined): boolean {\n return (\n field?.kind !== 'json' &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.hasOwn(value, 'in') &&\n Array.isArray((value as { in: unknown }).in)\n )\n}\n\n/**\n * Constructs a Drizzle where clause from an object.\n * All entries are combined with AND.\n * @internal\n */\nfunction buildWhereClause(\n table: SQLiteTableWithColumns<any>,\n fields: Record<string, Field<any, any, any>>,\n where: Where<Record<string, any>>,\n): ReturnType<typeof and> | null {\n const conditions: SQL[] = []\n\n for (const [key, value] of Object.entries(where)) {\n // Multi-layered guard against identifier injection\n if (!Object.hasOwn(fields, key)) {\n throw new HTTPException(400, { message: 'invalid field in where clause' })\n }\n if (!Object.hasOwn(table, key)) {\n throw new HTTPException(400, { message: 'invalid column in table' })\n }\n // biome-ignore lint/suspicious/noExplicitAny: table column access is runtime-guarded by hasOwn\n const col = (table as unknown as Record<string, any>)[key]\n const field = fields[key]\n if (isInOperator(value, field)) {\n conditions.push(inArray(col, (value as { in: unknown[] }).in))\n } else {\n conditions.push(eq(col, value))\n }\n }\n\n if (conditions.length === 0) {\n return null\n }\n // conditions is SQL[] (inArray/eq both return SQL); cast to satisfy Drizzle's and()/return type which expects the narrower eq() result shape. Safe at runtime — all elements are SQL wrappers.\n if (conditions.length === 1) {\n return conditions[0] as ReturnType<typeof eq>\n }\n return and(...(conditions as ReturnType<typeof eq>[]))\n}\n\nfunction resolveRelationTarget(field: RelationDef): RelationTargetLike {\n return typeof field.target === 'function' ? field.target() : field.target\n}\n\nfunction getTargetTable(target: RelationTargetLike): SQLiteTableWithColumns<any> {\n if (Object.hasOwn(target, 'table')) {\n return (target as unknown as { table: SQLiteTableWithColumns<any> }).table\n }\n return buildTable(target.tableName, target.fields as Record<string, Field<any, any, any>>)\n}\n\nfunction validateWithOptions(\n fields: Record<string, Field<any, any, any>>,\n withOptions: Record<string, unknown>,\n): void {\n if (withOptions === null || typeof withOptions !== 'object' || Array.isArray(withOptions)) {\n throw new HTTPException(400, { message: 'invalid with option' })\n }\n\n for (const [key, value] of Object.entries(withOptions)) {\n if (value !== true) {\n throw new HTTPException(400, { message: 'nested with is not supported' })\n }\n if (!Object.hasOwn(fields, key) || fields[key]?.kind !== 'relation') {\n throw new HTTPException(400, { message: 'invalid relation in with option' })\n }\n }\n}\n\nasync function loadRelations<\n Fields extends Record<string, Field<any, any, any>>,\n With extends WithOptions<Fields>,\n>(\n adapter: Adapter,\n _parentTable: SQLiteTableWithColumns<any>,\n parentFields: Fields,\n parentRows: RowType<Fields>[],\n withOptions: With,\n): Promise<WithResult<Fields, With>[]> {\n if (parentRows.length === 0) {\n return []\n }\n\n const rows = parentRows.map((row) => ({ ...row })) as WithResult<Fields, With>[]\n\n for (const relationKey of Object.keys(withOptions)) {\n const field = parentFields[relationKey]\n if (field?.kind !== 'relation') {\n throw new HTTPException(400, { message: 'invalid relation in with option' })\n }\n\n const relation = field as RelationDef\n const target = resolveRelationTarget(relation)\n const targetFields = target.fields as Record<string, Field<any, any, any>>\n const targetTable = getTargetTable(target)\n\n if (relation.relationKind === 'hasMany') {\n const parentPk = findPrimaryKey(parentFields)\n if (!parentPk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n const parentPkKey = parentPk[0]\n const foreignKey = relation.foreignKey\n if (!Object.hasOwn(targetFields, foreignKey) || !Object.hasOwn(targetTable, foreignKey)) {\n throw new HTTPException(500, { message: 'invalid relation foreign key' })\n }\n\n const parentIds = Array.from(\n new Set(parentRows.map((row) => (row as Record<string, unknown>)[parentPkKey])),\n )\n const targetRows =\n parentIds.length === 0\n ? []\n : await adapter.drizzle\n .select()\n .from(targetTable)\n .where(\n inArray(\n (targetTable as unknown as Record<string, any>)[foreignKey],\n parentIds as any[],\n ),\n )\n\n const grouped = new Map<unknown, unknown[]>()\n for (const targetRow of targetRows as Record<string, unknown>[]) {\n const value = targetRow[foreignKey]\n const group = grouped.get(value)\n if (group === undefined) {\n grouped.set(value, [targetRow])\n } else {\n group.push(targetRow)\n }\n }\n\n for (const row of rows as Record<string, unknown>[]) {\n row[relationKey] = grouped.get(row[parentPkKey]) ?? []\n }\n } else {\n const foreignKey = relation.foreignKey\n if (!Object.hasOwn(parentFields, foreignKey) || !Object.hasOwn(_parentTable, foreignKey)) {\n throw new HTTPException(500, { message: 'invalid relation foreign key' })\n }\n\n const targetPk = findPrimaryKey(targetFields)\n if (!targetPk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n const targetPkKey = targetPk[0]\n if (!Object.hasOwn(targetTable, targetPkKey)) {\n throw new HTTPException(500, { message: 'invalid relation primary key' })\n }\n\n const parentFkValues = Array.from(\n new Set(parentRows.map((row) => (row as Record<string, unknown>)[foreignKey])),\n )\n const targetRows =\n parentFkValues.length === 0\n ? []\n : await adapter.drizzle\n .select()\n .from(targetTable)\n .where(\n inArray(\n (targetTable as unknown as Record<string, any>)[targetPkKey],\n parentFkValues as any[],\n ),\n )\n\n const byPk = new Map<unknown, unknown>()\n for (const targetRow of targetRows as Record<string, unknown>[]) {\n byPk.set(targetRow[targetPkKey], targetRow)\n }\n\n for (const row of rows as Record<string, unknown>[]) {\n row[relationKey] = byPk.get(row[foreignKey]) ?? null\n }\n }\n }\n\n return rows\n}\n\n/**\n * Fetches multiple rows with limit, offset, optional ordering, and optional where clause.\n * @internal\n */\nexport async function findManyImpl<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n With extends WithOptions<Fields> | undefined = undefined,\n>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n options: {\n limit: unknown\n offset?: unknown\n orderBy?: OrderBy<Fields>\n where?: Where<Fields> | SQL\n with?: With\n },\n): Promise<RowType<Fields>[] | WithResult<Fields, NonNullable<With>>[]> {\n const limit = guardLimit(options.limit)\n const offset = options.offset !== undefined ? guardOffset(options.offset) : 0\n\n if (offset > MAX_OFFSET) {\n throw new HTTPException(400, {\n message: `offset must be <= ${MAX_OFFSET}; use cursor pagination for deeper paging`,\n })\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query builder type narrowing\n let query: any = adapter.drizzle.select().from(table).limit(limit).offset(offset)\n\n // Apply where clause\n if (options.where !== undefined) {\n if (options.where instanceof SQL) {\n query = query.where(options.where)\n } else {\n const whereClause = buildWhereClause(\n table,\n fields,\n options.where as Where<Record<string, any>>,\n )\n if (whereClause !== null) {\n query = query.where(whereClause)\n }\n }\n }\n\n // Apply ordering\n if (options.orderBy !== undefined) {\n const orderByList = Array.isArray(options.orderBy) ? options.orderBy : [options.orderBy]\n\n for (const orderByItem of orderByList) {\n let column: string\n let direction: 'asc' | 'desc' = 'asc'\n\n if (typeof orderByItem === 'string') {\n column = orderByItem\n } else if (\n typeof orderByItem === 'object' &&\n orderByItem !== null &&\n 'column' in orderByItem\n ) {\n column = orderByItem.column\n if (orderByItem.direction) {\n direction = orderByItem.direction\n }\n } else {\n throw new HTTPException(400, { message: 'invalid orderBy format' })\n }\n\n // Runtime guard against identifier injection (both fields and table to match where-clause guard)\n if (!Object.hasOwn(fields, column) || !Object.hasOwn(table, column)) {\n throw new HTTPException(400, { message: 'invalid field in orderBy' })\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: table column access is runtime-guarded by hasOwn\n const col = (table as unknown as Record<string, any>)[column]\n query = query.orderBy(direction === 'asc' ? asc(col) : desc(col))\n }\n }\n\n const rows = await query\n if (options.with !== undefined) {\n validateWithOptions(fields, options.with as Record<string, unknown>)\n return loadRelations(adapter, table, fields, rows, options.with as NonNullable<With>)\n }\n return rows\n}\n\n/**\n * Fetches all rows without a LIMIT clause.\n * For batch processing / admin tooling. Apply an app-level size guard when used in request handlers.\n * @internal\n */\nexport async function findAllImpl<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n options?: FindAllOptions<Fields>,\n): Promise<RowType<Fields>[]> {\n const offset = options?.offset !== undefined ? guardOffset(options.offset) : undefined\n\n // SQLite requires LIMIT when OFFSET is used.\n // Number.MAX_SAFE_INTEGER is used as a sentinel \"no practical limit\" value when offset is specified.\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query builder type narrowing\n let query: any =\n offset !== undefined\n ? adapter.drizzle.select().from(table).limit(Number.MAX_SAFE_INTEGER).offset(offset)\n : adapter.drizzle.select().from(table)\n\n // Apply where clause\n if (options?.where !== undefined) {\n if (options.where instanceof SQL) {\n query = query.where(options.where)\n } else {\n const whereClause = buildWhereClause(\n table,\n fields,\n options.where as Where<Record<string, any>>,\n )\n if (whereClause !== null) {\n query = query.where(whereClause)\n }\n }\n }\n\n // Apply ordering\n if (options?.orderBy !== undefined) {\n const orderByList = Array.isArray(options.orderBy) ? options.orderBy : [options.orderBy]\n\n for (const orderByItem of orderByList) {\n let column: string\n let direction: 'asc' | 'desc' = 'asc'\n\n if (typeof orderByItem === 'string') {\n column = orderByItem\n } else if (\n typeof orderByItem === 'object' &&\n orderByItem !== null &&\n 'column' in orderByItem\n ) {\n column = orderByItem.column\n if (orderByItem.direction) {\n direction = orderByItem.direction\n }\n } else {\n throw new HTTPException(400, { message: 'invalid orderBy format' })\n }\n\n // Runtime guard against identifier injection (both fields and table to match where-clause guard)\n if (!Object.hasOwn(fields, column) || !Object.hasOwn(table, column)) {\n throw new HTTPException(400, { message: 'invalid field in orderBy' })\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: table column access is runtime-guarded by hasOwn\n const col = (table as unknown as Record<string, any>)[column]\n query = query.orderBy(direction === 'asc' ? asc(col) : desc(col))\n }\n }\n\n const rows = await query\n return rows\n}\n\n/**\n * Fetches a single row by primary key or where clause.\n * @internal\n */\nexport async function findOneImpl<Fields extends Record<string, Field<any, any, any>>>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n idOrWhere: IdOrWhere<Fields>,\n options?: FindOneOptions<Fields>,\n): Promise<RowType<Fields> | null> {\n let whereClause: SQL | ReturnType<typeof buildWhereClause>\n\n if (idOrWhere instanceof SQL) {\n whereClause = idOrWhere\n } else {\n let where: Where<Fields>\n if (typeof idOrWhere === 'string' || typeof idOrWhere === 'number') {\n // PK mode\n const pk = findPrimaryKey(fields)\n if (!pk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n where = { [pk[0]]: idOrWhere } as Where<Fields>\n } else {\n where = idOrWhere as Where<Fields>\n }\n whereClause = buildWhereClause(table, fields, where)\n }\n\n if (!whereClause) {\n throw new HTTPException(400, { message: 'where clause must not be empty' })\n }\n\n if (options?.with !== undefined) {\n validateWithOptions(fields, options.with as Record<string, unknown>)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query type\n const rows = await (adapter.drizzle.select().from(table).where(whereClause).limit(1) as any)\n if (rows.length === 0) {\n return null\n }\n if (options?.with !== undefined) {\n const withRows = await loadRelations(adapter, table, fields, [rows[0]], options.with)\n return withRows[0] ?? null\n }\n return rows[0]\n}\n\n/**\n * Creates a new row and returns the created record.\n * @internal\n */\nexport async function createImpl<Fields extends Record<string, Field<any, any, any>>>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n data: CreateInput<Fields>,\n): Promise<RowType<Fields>> {\n const builder = adapter.drizzle\n .insert(table)\n .values(data as any)\n .returning()\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query type\n const rows = await (builder as any)\n return rows[0]\n}\n\n/**\n * Updates rows matching the given id or where clause.\n * @internal\n */\nexport async function updateImpl<Fields extends Record<string, Field<any, any, any>>>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n idOrWhere: IdOrWhere<Fields>,\n data: Partial<RowType<Fields>>,\n): Promise<RowType<Fields> | null> {\n let whereClause: SQL | ReturnType<typeof buildWhereClause>\n\n if (idOrWhere instanceof SQL) {\n whereClause = idOrWhere\n } else {\n let where: Where<Fields>\n if (typeof idOrWhere === 'string' || typeof idOrWhere === 'number') {\n // PK mode\n const pk = findPrimaryKey(fields)\n if (!pk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n where = { [pk[0]]: idOrWhere } as Where<Fields>\n } else {\n where = idOrWhere as Where<Fields>\n }\n whereClause = buildWhereClause(table, fields, where)\n }\n\n if (!whereClause) {\n throw new HTTPException(400, { message: 'where clause must not be empty' })\n }\n\n const builder = adapter.drizzle\n .update(table)\n .set(data as any)\n .where(whereClause)\n .returning()\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query type\n const rows = await (builder as any)\n return rows.length > 0 ? rows[0] : null\n}\n\n/**\n * Deletes rows matching the given id or where clause.\n * @internal\n */\nexport async function deleteImpl<Fields extends Record<string, Field<any, any, any>>>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n idOrWhere: IdOrWhere<Fields>,\n): Promise<{ readonly deleted: number }> {\n let whereClause: SQL | ReturnType<typeof buildWhereClause>\n\n if (idOrWhere instanceof SQL) {\n whereClause = idOrWhere\n } else {\n let where: Where<Fields>\n if (typeof idOrWhere === 'string' || typeof idOrWhere === 'number') {\n // PK mode\n const pk = findPrimaryKey(fields)\n if (!pk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n where = { [pk[0]]: idOrWhere } as Where<Fields>\n } else {\n where = idOrWhere as Where<Fields>\n }\n whereClause = buildWhereClause(table, fields, where)\n }\n\n if (!whereClause) {\n throw new HTTPException(400, { message: 'where clause must not be empty' })\n }\n\n const result = await adapter.drizzle.delete(table).where(whereClause).returning()\n return { deleted: result.length }\n}\n","import { type Hook, zValidator } from '@hono/zod-validator'\nimport type { Env, ValidationTargets } from 'hono'\nimport type { z } from 'zod'\nimport type { Adapter } from '../adapter/types'\nimport type { Field } from '../field/types'\nimport { toOpenAPIComponent, toOpenAPISchema } from '../openapi/generate'\nimport type { OpenAPIUsage, WithOpenAPIOption } from '../openapi/types'\nimport { createImpl, deleteImpl, findAllImpl, findManyImpl, findOneImpl, updateImpl } from './crud'\nimport { applySchemaOptions, buildBaseObject, derivePolicyOptions } from './schema'\nimport { buildTable } from './table'\nimport type {\n Apply,\n CreateInput,\n FieldsToZodShape,\n FindAllOptions,\n FindManyOptions,\n FindOneOptions,\n IdOrWhere,\n Model,\n NonRelationKeys,\n RowType,\n SchemaOptions,\n} from './types'\nimport { buildFieldAccessor } from './types'\n\n/**\n * Creates a Model instance from a tableName and fields definition.\n * The model supports deriving Zod schemas, Hono validators, and CRUD operations.\n *\n * @example\n * const User = defineModel('users', {\n * id: t.uuid().primary(),\n * name: t.string(),\n * email: t.string().email(),\n * passwordHash: t.string(),\n * })\n *\n * const CreateSchema = User.schema({ omit: ['passwordHash'] })\n * const users = await User.findMany(adapter, { limit: 20 })\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field constraint\nexport function defineModel<Fields extends Record<string, Field<any, any, any>>>(\n tableName: string,\n fields: Fields,\n): Model<Fields> {\n const table = buildTable(tableName, fields)\n const accessor = buildFieldAccessor(fields)\n\n return {\n fields,\n tableName,\n table,\n\n schema<Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined>(\n opts?: Opts,\n ): Apply<FieldsToZodShape<Fields>, Opts> {\n const baseSchema = buildBaseObject(fields)\n const schema = applySchemaOptions(baseSchema, opts, accessor)\n // biome-ignore lint/suspicious/noExplicitAny: Zod .pick()/.omit() return type narrowing requires cast at boundary\n return schema as any\n },\n\n validator(\n target: keyof ValidationTargets,\n optsOrPreset?: 'create' | 'update' | SchemaOptions<NonRelationKeys<Fields> & string>,\n // biome-ignore lint/suspicious/noExplicitAny: Hook<T> is contravariant in T; any is required to bridge overload implementations\n hook?: Hook<any, Env, string, keyof ValidationTargets>,\n ) {\n let schema: z.ZodTypeAny\n if (optsOrPreset === 'create' || optsOrPreset === 'update') {\n schema = this.inputSchema(optsOrPreset)\n } else {\n schema = this.schema(optsOrPreset as SchemaOptions<NonRelationKeys<Fields> & string>)\n }\n // biome-ignore lint/suspicious/noExplicitAny: zValidator return type cast required at overload boundary\n return zValidator(target, schema, hook) as any\n },\n\n inputSchema(\n usage: 'create' | 'update',\n opts?: SchemaOptions<NonRelationKeys<Fields> & string>,\n // biome-ignore lint/suspicious/noExplicitAny: precise return type is enforced by Model<Fields> overload signatures\n ): any {\n const merged = derivePolicyOptions(\n fields,\n usage === 'create' ? 'input-create' : 'input-update',\n opts,\n accessor,\n )\n const baseSchema = buildBaseObject(fields)\n let schema = applySchemaOptions(baseSchema, merged)\n if (usage === 'create') {\n // biome-ignore lint/suspicious/noExplicitAny: Zod shape access requires any\n const shape = (schema as z.ZodObject<any>).shape\n // biome-ignore lint/suspicious/noExplicitAny: patch record values are ZodTypeAny\n const patch: Record<string, any> = {}\n for (const [key, field] of Object.entries(fields)) {\n if (\n field.modifiers.defaultNow === true &&\n field.modifiers.policy !== 'readOnly' &&\n key in shape\n ) {\n patch[key] = shape[key].optional()\n }\n }\n if (Object.keys(patch).length > 0) {\n schema = schema.extend(patch)\n }\n }\n return schema\n },\n\n outputSchema(\n opts?: SchemaOptions<NonRelationKeys<Fields> & string>,\n // biome-ignore lint/suspicious/noExplicitAny: precise return type is enforced by Model<Fields> overload signatures\n ): any {\n const merged = derivePolicyOptions(fields, 'output', opts, accessor)\n const baseSchema = buildBaseObject(fields)\n return applySchemaOptions(baseSchema, merged)\n },\n\n toResponse(row: RowType<Fields>): unknown {\n return this.outputSchema().parse(row)\n },\n\n toResponseMany(rows: readonly RowType<Fields>[]): unknown[] {\n const schema = this.outputSchema()\n return rows.map((row) => schema.parse(row))\n },\n\n toOpenAPIComponent() {\n return toOpenAPIComponent(fields)\n },\n\n toOpenAPISchema(usage: OpenAPIUsage, opts?: { readonly with: Partial<Record<string, true>> }) {\n return toOpenAPISchema(\n fields,\n usage,\n opts ? { with: opts.with as WithOpenAPIOption } : undefined,\n )\n },\n\n findMany: ((adapter: Adapter, options: FindManyOptions<Fields>) =>\n findManyImpl(adapter, table, fields, options)) as Model<Fields>['findMany'],\n\n findAll(adapter: Adapter, options?: FindAllOptions<Fields>): Promise<RowType<Fields>[]> {\n return findAllImpl(adapter, table, fields, options)\n },\n\n findOne: ((adapter: Adapter, idOrWhere: IdOrWhere<Fields>, options?: FindOneOptions<Fields>) =>\n findOneImpl(adapter, table, fields, idOrWhere, options)) as Model<Fields>['findOne'],\n\n create(adapter: Adapter, data: CreateInput<Fields>): Promise<RowType<Fields>> {\n return createImpl(adapter, table, data)\n },\n\n update(\n adapter: Adapter,\n idOrWhere: IdOrWhere<Fields>,\n data: Partial<RowType<Fields>>,\n ): Promise<RowType<Fields> | null> {\n return updateImpl(adapter, table, fields, idOrWhere, data)\n },\n\n delete(adapter: Adapter, idOrWhere: IdOrWhere<Fields>): Promise<{ readonly deleted: number }> {\n return deleteImpl(adapter, table, fields, idOrWhere)\n },\n }\n}\n","import type { OpenAPIDocument, OpenAPIRouteMetadata, OpenAPISpecOptions } from './types'\n\nfunction honoPathToOpenAPI(path: string): string {\n return path.replace(/:([^/]+)/g, '{$1}')\n}\n\nexport function buildOpenAPIDocument(\n routes: readonly OpenAPIRouteMetadata[],\n options: OpenAPISpecOptions,\n): OpenAPIDocument {\n const paths: Record<string, Record<string, unknown>> = {}\n\n for (const route of routes) {\n const openAPIPath = honoPathToOpenAPI(route.path)\n if (!paths[openAPIPath]) {\n paths[openAPIPath] = {}\n }\n\n const operation: Record<string, unknown> = {}\n if (route.operationId) operation.operationId = route.operationId\n if (route.summary) operation.summary = route.summary\n if (route.description) operation.description = route.description\n if (route.tags) operation.tags = route.tags\n\n const parameters: unknown[] = []\n const pathParams = [...route.path.matchAll(/:([^/]+)/g)].map((m) => m[1])\n for (const param of pathParams) {\n const alreadyDefined = route.params?.some((p) => p.name === param && p.in === 'path')\n if (!alreadyDefined) {\n parameters.push({ name: param, in: 'path', required: true, schema: { type: 'string' } })\n }\n }\n if (route.params) {\n parameters.push(...route.params)\n }\n if (parameters.length > 0) operation.parameters = parameters\n\n if (route.requestBody) operation.requestBody = route.requestBody\n operation.responses = route.responses\n\n paths[openAPIPath][route.method] = operation\n }\n\n const doc: OpenAPIDocument = {\n openapi: '3.1.0',\n info: options.info,\n ...(options.servers ? { servers: options.servers } : {}),\n paths,\n }\n\n return doc\n}\n","import type { MiddlewareHandler } from 'hono'\n\nexport interface SwaggerUIOptions {\n readonly url: string\n readonly title?: string\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\nexport function swaggerUI(options: SwaggerUIOptions): MiddlewareHandler {\n const title = escapeHtml(options.title ?? 'API Documentation')\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <title>${title}</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\" />\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n <script>\n SwaggerUIBundle({\n url: ${JSON.stringify(options.url)},\n dom_id: '#swagger-ui',\n presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],\n layout: 'BaseLayout',\n })\n </script>\n</body>\n</html>`\n\n return async (c) => {\n return c.html(html)\n }\n}\n","import { Hono } from 'hono'\nimport type { BlankEnv, Env, H } from 'hono/types'\nimport type { Adapter } from '../adapter/types'\nimport type { Field } from '../field/types'\nimport { defineModel } from '../model/define'\nimport type { IdOrWhere } from '../model/types'\nimport { buildOpenAPIDocument } from '../openapi/route'\nimport type { HttpMethod, OpenAPIRouteMetadata } from '../openapi/types'\nimport type { Nanoka, NanokaModel, RouteOpenAPIOption } from './types'\n\n/**\n * Creates a Nanoka application instance with the given database adapter.\n *\n * @param adapter - The database adapter (e.g., d1Adapter(env.DB))\n * @returns A Nanoka application (Hono extended with model(), db, and batch)\n *\n * @example\n * export default {\n * fetch(req: Request, env: Env, ctx: ExecutionContext) {\n * const app = nanoka(d1Adapter(env.DB))\n * const User = app.model('users', { id, name, email, passwordHash })\n * app.get('/users', async (c) => {\n * const users = await User.findMany({ limit: 20 })\n * return c.json(users)\n * })\n * return app.fetch(req, env, ctx)\n * }\n * }\n */\nexport function nanoka<E extends Env = BlankEnv>(adapter: Adapter): Nanoka<E> {\n const app = new Hono<E>() as Nanoka<E>\n const openapiRoutes: OpenAPIRouteMetadata[] = []\n\n Object.defineProperty(app, 'db', {\n get: () => adapter.drizzle,\n enumerable: true,\n })\n\n app.batch = ((queries: Parameters<Adapter['batch']>[0]) =>\n adapter.batch(queries)) as unknown as Adapter['batch']\n\n app.openapi = (metadata: OpenAPIRouteMetadata) => {\n openapiRoutes.push(metadata)\n return app\n }\n\n app.generateOpenAPISpec = (options) => buildOpenAPIDocument(openapiRoutes, options)\n\n function wrapWithOpenAPI(method: HttpMethod) {\n // biome-ignore lint/suspicious/noExplicitAny: original Hono method is typed as HandlerInterface which needs any at call site\n const original = (app as any)[method].bind(app)\n // biome-ignore lint/suspicious/noExplicitAny: overload bridge — type safety is provided by the Nanoka interface overload\n ;(app as any)[method] = (path: string, second: RouteOpenAPIOption | H, ...rest: H[]) => {\n if (\n second !== null &&\n typeof second === 'object' &&\n !Array.isArray(second) &&\n typeof (second as RouteOpenAPIOption).openapi === 'object'\n ) {\n const { openapi } = second as RouteOpenAPIOption\n openapiRoutes.push({ ...openapi, path, method })\n return original(path, ...rest)\n }\n return original(path, second, ...rest)\n }\n }\n\n for (const method of ['get', 'post', 'put', 'patch', 'delete'] as const) {\n wrapWithOpenAPI(method)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field generic constraint\n app.model = function model<Fields extends Record<string, Field<any, any, any>>>(\n name: string,\n fields: Fields,\n ): NanokaModel<Fields> {\n const inner = defineModel(name, fields)\n\n return {\n fields: inner.fields,\n tableName: inner.tableName,\n table: inner.table,\n\n schema: (opts) => inner.schema(opts),\n\n validator: (\n ...args: [\n keyof import('hono').ValidationTargets,\n (\n | 'create'\n | 'update'\n | import('../model/types').SchemaOptions<\n import('../model/types').NonRelationKeys<Fields> & string\n >\n )?,\n import('@hono/zod-validator').Hook<\n // biome-ignore lint/suspicious/noExplicitAny: Hook<T> is contravariant in T; any is required to bridge overload implementations\n any,\n import('hono').Env,\n string,\n keyof import('hono').ValidationTargets\n >?,\n ]\n ) => {\n // `NanokaModel` interface の overload 定義 (router/types.ts) で type safety は担保する。\n // 実装は inner.validator に委譲するだけで、型は interface 側の overload に従う。\n // biome-ignore lint/suspicious/noExplicitAny: NanokaModel interface overloads provide type safety\n return (inner.validator as (...a: typeof args) => any)(...args)\n },\n\n inputSchema: (usage, opts) => inner.inputSchema(usage, opts),\n\n outputSchema: (opts) => inner.outputSchema(opts),\n\n toResponse: (row) => inner.toResponse(row),\n\n toResponseMany: (rows) => inner.toResponseMany(rows),\n\n toOpenAPIComponent: () => inner.toOpenAPIComponent(),\n\n toOpenAPISchema: (usage, opts?: { readonly with: Partial<Record<string, true>> }) =>\n // biome-ignore lint/suspicious/noExplicitAny: NanokaModel interface overloads provide type safety\n (inner.toOpenAPISchema as (u: typeof usage, o?: typeof opts) => any)(usage, opts),\n\n findMany: ((options: Parameters<NanokaModel<Fields>['findMany']>[0]) =>\n inner.findMany(adapter, options as any)) as NanokaModel<Fields>['findMany'],\n\n findAll: (options) => inner.findAll(adapter, options),\n\n findOne: ((\n idOrWhere: IdOrWhere<Fields>,\n options?: import('../model/types').FindOneOptions<Fields>,\n ) => inner.findOne(adapter, idOrWhere, options as any)) as NanokaModel<Fields>['findOne'],\n\n create: (data) => inner.create(adapter, data),\n\n update: (idOrWhere, data) => inner.update(adapter, idOrWhere, data),\n\n delete: (idOrWhere) => inner.delete(adapter, idOrWhere),\n }\n }\n\n return app\n}\n"]}
1
+ {"version":3,"sources":["../src/adapter/d1.ts","../src/model/types.ts","../src/model/schema.ts","../src/openapi/generate.ts","../src/model/table.ts","../src/model/crud.ts","../src/model/define.ts","../src/openapi/route.ts","../src/openapi/swagger-ui.ts","../src/router/nanoka.ts"],"names":["partial","combinedOmit"],"mappings":"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","file":"index.js","sourcesContent":["import type { D1Database } from '@cloudflare/workers-types'\nimport { drizzle } from 'drizzle-orm/d1'\nimport type { Adapter } from './types'\n\n/**\n * D1-specific adapter factory. Wraps Cloudflare D1 binding in the generic\n * Adapter abstraction, enabling the core query path and router to remain\n * implementation-agnostic.\n */\nexport function d1Adapter<TSchema extends Record<string, unknown> = Record<string, never>>(\n d1: D1Database,\n): Adapter<TSchema> {\n // drizzle-orm/d1's drizzle() returns DrizzleD1Database which embeds D1-specific\n // result types. We cast to BaseSQLiteDatabase via the Adapter interface to keep\n // the D1 dependency local to this file (see CLAUDE.md rule #3). Consumers receive\n // the typed Adapter interface, so this `any` is intentionally local.\n //\n // Note: drizzle-orm/d1 internally stores the D1 binding in db.$client. When\n // handling multiple D1 bindings, call d1Adapter() fresh for each binding rather\n // than caching the return value across binding switches.\n // biome-ignore lint/suspicious/noExplicitAny: intentional - Drizzle returns complex union type\n const db = drizzle(d1) as any\n\n return {\n drizzle: db,\n batch: (queries) => db.batch(queries),\n }\n}\n","import type { Hook } from '@hono/zod-validator'\nimport type { SQL } from 'drizzle-orm'\nimport type { AnySQLiteColumn, SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core'\nimport type { Env, MiddlewareHandler, ValidationTargets } from 'hono'\nimport type { z } from 'zod'\nimport type { Adapter } from '../adapter/types'\nimport type { Field, FieldPolicy, InferFieldType, RelationDef } from '../field/types'\nimport type { OpenAPIModelComponent, OpenAPISchemaObject, OpenAPIUsage } from '../openapi/types'\n\n/**\n * @internal\n * Extracts keys of non-relation fields from a Fields record.\n * Relation fields (kind: 'relation') are excluded from DB column types, RowType, etc.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport type NonRelationKeys<Fields extends Record<string, Field<any, any, any>>> = {\n [K in keyof Fields]: Fields[K] extends { kind: 'relation' } ? never : K\n}[keyof Fields]\n\n/**\n * @internal\n * Extracts keys of relation fields from a Fields record.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport type RelationKeys<Fields extends Record<string, Field<any, any, any>>> = {\n [K in keyof Fields]: Fields[K] extends { kind: 'relation' } ? K : never\n}[keyof Fields]\n\nexport type RelationTargetFields<Target> = Target extends () => infer Resolved\n ? RelationTargetFields<Resolved>\n : Target extends { fields: infer TargetFields }\n ? TargetFields\n : never\n\nexport type RelationResult<F> =\n F extends RelationDef<infer Target, string>\n ? RelationTargetFields<Target> extends Record<string, Field<any, any, any>>\n ? F['relationKind'] extends 'hasMany'\n ? RowType<RelationTargetFields<Target>>[]\n : RowType<RelationTargetFields<Target>> | null\n : never\n : never\n\nexport type WithOptions<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n readonly [K in RelationKeys<Fields>]?: true\n}\n\nexport type WithResult<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n With,\n> = RowType<Fields> & { readonly [K in keyof With]: RelationResult<Fields[K & keyof Fields]> }\n\n/**\n * Options for findMany query.\n * `limit` is required (no default).\n * `offset` defaults to 0 if omitted. Runtime-capped at 100_000 to prevent read amplification — use cursor pagination for deeper paging.\n * `orderBy` is optional for column ordering.\n * `where` accepts either an equality object or a Drizzle SQL expression.\n */\nexport interface FindManyOptions<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n With extends WithOptions<Fields> | undefined = undefined,\n> {\n readonly limit: number\n /** default: 0; runtime cap: 100000 */\n readonly offset?: number\n readonly orderBy?: OrderBy<Fields>\n readonly where?: Where<Fields> | SQL\n readonly with?: With\n}\n\nexport interface FindOneOptions<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n With extends WithOptions<Fields> | undefined = undefined,\n> {\n readonly with?: With\n}\n\n/**\n * Options for findAll query.\n * No `limit` — issues no LIMIT clause. For batch processing / admin tooling.\n * Apply an app-level size guard when used in request handlers.\n */\nexport interface FindAllOptions<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> {\n readonly offset?: number\n readonly orderBy?: OrderBy<Fields>\n readonly where?: Where<Fields> | SQL\n}\n\n/**\n * Order-by specification: single field, or field with direction, or array of multiple.\n */\nexport type OrderBy<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> =\n | (NonRelationKeys<Fields> & string)\n | { readonly column: NonRelationKeys<Fields> & string; readonly direction?: 'asc' | 'desc' }\n | ReadonlyArray<\n | (NonRelationKeys<Fields> & string)\n | { readonly column: NonRelationKeys<Fields> & string; readonly direction?: 'asc' | 'desc' }\n >\n\n/**\n * A single where value: either an equality value or an `{ in: [...] }` operator for IN matching.\n * Note: json fields whose stored value happens to be `{ in: [...] }` in shape are still treated\n * as equality at runtime — the IN operator is applied to non-json fields only.\n */\nexport type WhereValue<T> = T | { readonly in: readonly T[] }\n\n/**\n * Where clause object: each key is a field name, each value is the desired equality, or an\n * `{ in: [...] }` operator for IN matching.\n * json フィールドの値が偶然 `{ in: [...] }` 形でも型上は演算子と区別できないが、ランタイムでは\n * json フィールドは常に等値比較される(IN 演算子は非 json フィールドのみ)。\n */\nexport type Where<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n readonly [K in NonRelationKeys<Fields>]?: WhereValue<InferFieldType<Fields[K]>>\n}\n\n/**\n * Identifier or Where clause: can be a primary key value, a Where object, or a Drizzle SQL expression.\n */\nexport type IdOrWhere<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = string | number | Where<Fields> | SQL\n\n/**\n * Row type: full record type from fields, excluding relation fields.\n */\nexport type RowType<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n [K in NonRelationKeys<Fields>]: InferFieldType<Fields[K]>\n}\n\n/**\n * Drizzle table type with columns typed to match the model's Fields (excluding relation fields).\n * Allows type-safe column access via Model.table.fieldName.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport type ModelTable<Fields extends Record<string, Field<any, any, any>>> =\n SQLiteTableWithColumns<{\n name: string\n schema: undefined\n columns: { [K in NonRelationKeys<Fields>]: AnySQLiteColumn }\n dialect: 'sqlite'\n }>\n\n/**\n * @internal\n * Extracts the policy from a Field's modifiers.\n *\n * Uses `Field<any, { policy: infer P }, any>` rather than a two-step\n * `infer M` + `M extends { policy: infer P }` pattern.\n * The two-step pattern is broken when TypeScript widens `M` to the constraint\n * `FieldModifiers` (which has `policy?: FieldPolicy` as optional), causing\n * `M extends { policy: infer P }` to be true for ALL fields regardless of their\n * actual policy value. Directly matching `{ policy: infer P }` avoids this.\n */\ntype PolicyOf<F> =\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { policy: infer P extends FieldPolicy }, any> ? P : never\n\n/**\n * @internal\n * Computes which field keys should be omitted based on policy and usage.\n * Mirrors the runtime logic in derivePolicyOptions() in schema.ts.\n *\n * NOTE: `[PolicyOf<Fields[K]>] extends [never]` (non-distributive form) is used to\n * short-circuit fields with no policy to `never` (do not omit). Without this guard,\n * `never extends 'serverOnly'` evaluates to `true` (vacuously), causing every field\n * without a policy to be incorrectly included in the omit set.\n */\nexport type PolicyOmitKeys<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n Usage extends 'input-create' | 'input-update' | 'output',\n> = {\n [K in keyof Fields]: [PolicyOf<Fields[K]>] extends [never]\n ? never\n : PolicyOf<Fields[K]> extends 'serverOnly'\n ? K\n : Usage extends 'output'\n ? PolicyOf<Fields[K]> extends 'writeOnly'\n ? K\n : never\n : Usage extends 'input-create' | 'input-update'\n ? PolicyOf<Fields[K]> extends 'readOnly'\n ? K\n : never\n : never\n}[keyof Fields]\n\n/**\n * @internal\n * Computes which field keys have the serverOnly policy.\n * serverOnly fields are completely excluded from CreateInput\n * (cannot be passed even from library internals — they are server-side only).\n *\n * Uses `[PolicyOf<Fields[K]>] extends [never]` (non-distributive form) to short-circuit\n * fields with no policy to `never`. Without this guard, `never extends 'serverOnly'`\n * evaluates to `true` (vacuously), causing every field without a policy to be included.\n */\ntype ServerOnlyKeys<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n [K in keyof Fields]: [PolicyOf<Fields[K]>] extends [never]\n ? never\n : PolicyOf<Fields[K]> extends 'serverOnly'\n ? K\n : never\n}[keyof Fields]\n\n/**\n * @internal\n * Determines if a field is required for create input.\n * A field is optional if it has a default, has defaultNow, is optional, or is readOnly.\n *\n * Uses direct shape matching (`Field<any, { hasDefault: true }, any>`) to avoid\n * the TypeScript infer-widening issue where `infer M` resolves to `FieldModifiers`\n * (the constraint bound) instead of the concrete Mods type, causing `M extends\n * { policy: 'readOnly' }` to be false even for readOnly fields.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\ntype IsRequired<F extends Field<any, any, any>> =\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { hasDefault: true }, any>\n ? false\n : // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { defaultNow: true }, any>\n ? false\n : // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { optional: true }, any>\n ? false\n : // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n F extends Field<any, { policy: 'readOnly' }, any>\n ? false\n : true\n\n/**\n * Create input with precise types:\n * - `readOnly` fields are optional (library internals can pass them; API callers\n * are excluded via inputSchema — but CreateInput itself keeps them as optional\n * so handlers can supply generated values like `id` or `createdAt`)\n * - fields with `default` or `defaultNow` are optional (DB or runtime fills the value)\n * - fields marked `optional` are optional\n * - all other fields are required\n * - `serverOnly` fields are completely excluded (cannot be passed even internally)\n * - `writeOnly` fields are included as required (they are input fields by design)\n * - relation fields are completely excluded (no DB column)\n */\nexport type CreateInput<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n> = {\n [K in NonRelationKeys<Fields> as IsRequired<Fields[K]> extends true\n ? K extends ServerOnlyKeys<Fields>\n ? never\n : K\n : never]: InferFieldType<Fields[K]>\n} & {\n [K in NonRelationKeys<Fields> as IsRequired<Fields[K]> extends true\n ? never\n : K extends ServerOnlyKeys<Fields>\n ? never\n : K]?: InferFieldType<Fields[K]>\n}\n\nexport type FieldAccessor<K extends string> = { readonly [Key in K]: Key }\n\nexport interface SchemaOptions<K extends string = string> {\n readonly pick?: readonly K[] | ((f: FieldAccessor<K>) => readonly K[])\n readonly omit?: readonly K[] | ((f: FieldAccessor<K>) => readonly K[])\n readonly partial?: boolean\n}\n\n/**\n * @internal\n * Resolves pick/omit option to string array using the accessor when it's a function.\n */\nexport function resolveSchemaOptionKeys<K extends string>(\n opt: readonly K[] | ((f: FieldAccessor<K>) => readonly K[]) | undefined,\n accessor: FieldAccessor<K>,\n): readonly K[] | undefined {\n if (opt === undefined) return undefined\n if (typeof opt === 'function') return opt(accessor)\n return opt\n}\n\n/**\n * @internal\n * Builds a frozen field accessor object for use in schema/validator options.\n * Relation fields are excluded so that `omit: f => [f.posts]` is a type error.\n * Each non-relation key maps to itself, providing typo detection at type level.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport function buildFieldAccessor<Fields extends Record<string, Field<any, any, any>>>(\n fields: Fields,\n): { readonly [K in NonRelationKeys<Fields>]: K } {\n const acc: Record<string, string> = {}\n for (const [k, field] of Object.entries(fields)) {\n if (field.kind === 'relation') continue\n acc[k] = k\n }\n return Object.freeze(acc) as { readonly [K in NonRelationKeys<Fields>]: K }\n}\n\n/**\n * @internal\n * Extracts a Zod shape from fields for the Apply type.\n * Only non-relation fields are included (relation fields have zodBase: ZodNever\n * and are skipped at runtime in buildBaseObject).\n * Indexed access ensures concrete Zod types are preserved (not `any`).\n */\nexport type FieldsToZodShape<\n Fields extends Record<\n string,\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Field<any, any, any>\n >,\n> = {\n [K in NonRelationKeys<Fields>]: Fields[K]['zodBase']\n}\n\n/**\n * @internal\n * Utility to narrow array literal types to union of strings.\n */\ntype ArrayKeys<A> = A extends readonly (infer U)[] ? U : never\n\n/**\n * @internal\n * Resolves pick/omit option type to the array type.\n * Handles both array form and accessor function form.\n */\ntype ResolveOptKeys<Opt> = Opt extends readonly string[]\n ? Opt\n : Opt extends (f: FieldAccessor<infer _K>) => readonly (infer R)[]\n ? readonly R[]\n : never\n\n/**\n * @internal\n * Apply pick transformation to a shape.\n */\ntype ApplyPickToShape<Shape extends z.ZodRawShape, PickOpt> =\n ResolveOptKeys<PickOpt> extends readonly string[]\n ? Pick<Shape, ArrayKeys<ResolveOptKeys<PickOpt>> & keyof Shape>\n : Shape\n\n/**\n * @internal\n * Apply omit transformation to a shape.\n */\ntype ApplyOmitToShape<Shape extends z.ZodRawShape, OmitOpt> =\n ResolveOptKeys<OmitOpt> extends readonly string[]\n ? Omit<Shape, ArrayKeys<ResolveOptKeys<OmitOpt>> & keyof Shape>\n : Shape\n\n/**\n * @internal\n * Apply partial transformation to a shape.\n */\ntype ApplyPartialToShape<Shape extends z.ZodRawShape> = {\n [K in keyof Shape]: z.ZodOptional<Shape[K]>\n}\n\n/**\n * @internal\n * Checks if an option value (array or function) is present (i.e. not undefined and not never).\n * Uses distributive conditional to handle union types like `T | undefined`.\n */\ntype HasOpt<Opt> = undefined extends Opt ? false : [Opt] extends [never] ? false : true\n\n/**\n * @internal\n * Apply pick/omit/partial transformations to a Zod raw shape.\n * Order: pick → omit → partial\n * Handles both array form and accessor function form for pick/omit.\n */\ntype ApplyShape<\n Shape extends z.ZodRawShape,\n Opts extends SchemaOptions | undefined,\n> = Opts extends SchemaOptions\n ? HasOpt<Opts['pick']> extends true\n ? HasOpt<Opts['omit']> extends true\n ? Opts extends { partial: true }\n ? ApplyPartialToShape<ApplyOmitToShape<ApplyPickToShape<Shape, Opts['pick']>, Opts['omit']>>\n : ApplyOmitToShape<ApplyPickToShape<Shape, Opts['pick']>, Opts['omit']>\n : Opts extends { partial: true }\n ? ApplyPartialToShape<ApplyPickToShape<Shape, Opts['pick']>>\n : ApplyPickToShape<Shape, Opts['pick']>\n : HasOpt<Opts['omit']> extends true\n ? Opts extends { partial: true }\n ? ApplyPartialToShape<ApplyOmitToShape<Shape, Opts['omit']>>\n : ApplyOmitToShape<Shape, Opts['omit']>\n : Opts extends { partial: true }\n ? ApplyPartialToShape<Shape>\n : Shape\n : Shape\n\n/**\n * @internal\n * Returns the correct Zod object type after applying pick/omit/partial transformations.\n */\nexport type Apply<\n Shape extends z.ZodRawShape,\n Opts extends SchemaOptions | undefined,\n> = z.ZodObject<ApplyShape<Shape, Opts>>\n\n/**\n * @internal\n * Apply pick transformation to a TS record type.\n */\ntype ApplyPickToRecord<R, PickOpt> =\n ResolveOptKeys<PickOpt> extends readonly string[]\n ? Pick<R, ArrayKeys<ResolveOptKeys<PickOpt>> & keyof R>\n : R\n\n/**\n * @internal\n * Apply omit transformation to a TS record type.\n */\ntype ApplyOmitToRecord<R, OmitOpt> =\n ResolveOptKeys<OmitOpt> extends readonly string[]\n ? Omit<R, ArrayKeys<ResolveOptKeys<OmitOpt>> & keyof R>\n : R\n\n/**\n * @internal\n * Apply pick/omit/partial transformations to a TypeScript record type.\n * Mirrors ApplyShape but operates on TS types directly, not Zod shapes.\n * Used for precise Zod 4 middleware input/output type computation.\n */\ntype ApplyToRecord<R, Opts extends SchemaOptions | undefined> = Opts extends SchemaOptions\n ? HasOpt<Opts['pick']> extends true\n ? HasOpt<Opts['omit']> extends true\n ? Opts extends { partial: true }\n ? Partial<ApplyOmitToRecord<ApplyPickToRecord<R, Opts['pick']>, Opts['omit']>>\n : ApplyOmitToRecord<ApplyPickToRecord<R, Opts['pick']>, Opts['omit']>\n : Opts extends { partial: true }\n ? Partial<ApplyPickToRecord<R, Opts['pick']>>\n : ApplyPickToRecord<R, Opts['pick']>\n : HasOpt<Opts['omit']> extends true\n ? Opts extends { partial: true }\n ? Partial<ApplyOmitToRecord<R, Opts['omit']>>\n : ApplyOmitToRecord<R, Opts['omit']>\n : Opts extends { partial: true }\n ? Partial<R>\n : R\n : R\n\n/**\n * @internal\n * Mirrors @hono/zod-validator's middleware Input type.\n * Aligned with @hono/zod-validator@0.4.x; revisit on version bump.\n */\ntype HasUndefined<T> = undefined extends T ? true : false\n\n/**\n * @internal\n * Hono middleware input/output type for validator middleware.\n * Aligned with @hono/zod-validator@0.4.x; revisit on version bump.\n *\n * WARNING (Zod 4): `z.input<ZodTypeAny>` resolves to `unknown` in Zod 4, making\n * `c.req.valid(target)` return `unknown` if `In`/`Out` are left as defaults.\n * When using this type directly (outside of `ModelValidatorReturn`), always pass\n * explicit `In` and `Out` type arguments — do NOT rely on the defaults.\n *\n * Internal usages in this file (ModelValidatorReturn and preset overloads) already\n * pass `In`/`Out` explicitly via `ApplyToRecord` or `Omit<RowType<Fields>, ...>`.\n */\nexport type ValidatorInput<\n Target extends keyof ValidationTargets,\n Schema extends z.ZodTypeAny,\n In = z.input<Schema>,\n Out = z.output<Schema>,\n> = {\n in: HasUndefined<In> extends true\n ? {\n [K in Target]?:\n | (In extends ValidationTargets[K]\n ? In\n : { [K2 in keyof In]?: ValidationTargets[K][K2] | undefined })\n | undefined\n }\n : {\n [K in Target]: In extends ValidationTargets[K]\n ? In\n : { [K2 in keyof In]: ValidationTargets[K][K2] }\n }\n out: { [K in Target]: Out }\n}\n\n/**\n * @internal\n * Type-safe Hono middleware handler return for Model.validator().\n * Provides proper type narrowing for c.req.valid(target).\n *\n * Uses RowType<Fields> directly for input/output type computation\n * to preserve field types (z.input<ZodTypeAny> returns unknown in Zod 4).\n */\nexport type ModelValidatorReturn<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n Target extends keyof ValidationTargets,\n Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined,\n> = MiddlewareHandler<\n any,\n string,\n ValidatorInput<\n Target,\n Apply<FieldsToZodShape<Fields>, Opts>,\n ApplyToRecord<RowType<Fields>, Opts>,\n ApplyToRecord<RowType<Fields>, Opts>\n >\n>\n\n/**\n * Hook type for Model.validator() third argument.\n * Re-exported from @hono/zod-validator for convenience.\n */\nexport type { Hook }\n\n/**\n * Represents a database model with type-safe schema derivation and CRUD operations.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for the generic Field constraint\nexport interface Model<Fields extends Record<string, Field<any, any, any>>> {\n readonly fields: Fields\n readonly tableName: string\n readonly table: ModelTable<Fields>\n\n /**\n * Returns a Zod schema derived from this model's fields.\n * Supports pick, omit, and partial transformations.\n *\n * @example\n * const CreateSchema = User.schema({ omit: ['passwordHash'] })\n * const UpdateSchema = User.schema({ partial: true, pick: ['name', 'email'] })\n */\n schema<Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined>(\n opts?: Opts,\n ): Apply<FieldsToZodShape<Fields>, Opts>\n\n /**\n * Returns a Hono middleware validator derived from this model's schema.\n * Integrates with @hono/zod-validator to validate request inputs.\n * The optional `hook` argument is passed through to @hono/zod-validator.\n *\n * Accepts a preset ('create' | 'update') as second argument to use inputSchema.\n * When a preset is used, the return type is a MiddlewareHandler (loosely typed in Phase 2A).\n * Precise type narrowing for preset is deferred to Phase 2B M2.3.\n *\n * @example\n * app.post('/users', User.validator('json', 'create'), c => {\n * const body = c.req.valid('json')\n * })\n * app.post('/users', User.validator('json', { omit: ['passwordHash'] }), c => {\n * const body = c.req.valid('json')\n * })\n * // With hook:\n * app.post('/users', User.validator('json', opts, (result, c) => {\n * if (!result.success) return c.json({ error: 'Invalid request' }, 400)\n * }), handler)\n */\n validator<Target extends keyof ValidationTargets, E extends Env = Env, P extends string = string>(\n target: Target,\n preset: 'create',\n hook?: Hook<\n Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-create'> & string>,\n E,\n P,\n Target\n >,\n ): MiddlewareHandler<\n E,\n P,\n ValidatorInput<\n Target,\n z.ZodObject<z.ZodRawShape>,\n Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-create'> & string>,\n Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-create'> & string>\n >\n >\n validator<Target extends keyof ValidationTargets, E extends Env = Env, P extends string = string>(\n target: Target,\n preset: 'update',\n hook?: Hook<\n Partial<Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-update'> & string>>,\n E,\n P,\n Target\n >,\n ): MiddlewareHandler<\n E,\n P,\n ValidatorInput<\n Target,\n z.ZodObject<z.ZodRawShape>,\n Partial<Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-update'> & string>>,\n Partial<Omit<RowType<Fields>, PolicyOmitKeys<Fields, 'input-update'> & string>>\n >\n >\n validator<\n Target extends keyof ValidationTargets,\n Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined,\n E extends Env = Env,\n P extends string = string,\n >(\n target: Target,\n opts?: Opts,\n hook?: Hook<z.output<Apply<FieldsToZodShape<Fields>, Opts>>, E, P, Target>,\n ): ModelValidatorReturn<Fields, Target, Opts>\n\n /**\n * Returns a Zod schema for API input, with policy-based field exclusions applied.\n * - 'create': serverOnly and readOnly fields are excluded\n * - 'update': same exclusions + all fields become optional (partial: true)\n *\n * The return type precisely reflects policy-derived omissions using PolicyOmitKeys.\n */\n inputSchema<Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined = undefined>(\n usage: 'create',\n opts?: Opts,\n ): z.ZodObject<\n ApplyShape<\n Omit<FieldsToZodShape<Fields>, PolicyOmitKeys<Fields, 'input-create'> & string>,\n Opts\n >\n >\n inputSchema<Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined = undefined>(\n usage: 'update',\n opts?: Opts,\n ): z.ZodObject<\n ApplyShape<\n Omit<FieldsToZodShape<Fields>, PolicyOmitKeys<Fields, 'input-update'> & string>,\n Opts extends undefined ? { partial: true } : Opts & { partial: true }\n >\n >\n inputSchema(\n usage: 'create' | 'update',\n opts?: SchemaOptions<NonRelationKeys<Fields> & string>,\n ): z.ZodObject<z.ZodRawShape>\n\n /**\n * Returns a Zod schema for API output, with policy-based field exclusions applied.\n * - serverOnly and writeOnly fields are excluded\n * - readOnly fields remain present\n *\n * The return type precisely reflects policy-derived omissions using PolicyOmitKeys.\n */\n outputSchema<\n Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined = undefined,\n >(\n opts?: Opts,\n ): z.ZodObject<\n ApplyShape<Omit<FieldsToZodShape<Fields>, PolicyOmitKeys<Fields, 'output'> & string>, Opts>\n >\n\n /**\n * Parses a DB row through outputSchema and returns the safe response object.\n * Equivalent to `User.outputSchema().parse(row)`.\n */\n toResponse(row: RowType<Fields>): unknown\n\n /**\n * Parses an array of DB rows through outputSchema and returns safe response objects.\n * The outputSchema is built once and reused for all rows.\n * Equivalent to mapping `toResponse` over the array but more efficient.\n *\n * @example\n * const rows = await app.db.select().from(User.table).where(...)\n * return c.json(User.toResponseMany(rows))\n */\n toResponseMany(rows: readonly RowType<Fields>[]): unknown[]\n\n toOpenAPIComponent(): OpenAPIModelComponent\n\n toOpenAPISchema(\n usage: 'output',\n opts: { readonly with: Partial<Record<RelationKeys<Fields> & string, true>> },\n ): OpenAPISchemaObject\n toOpenAPISchema(usage: OpenAPIUsage): OpenAPISchemaObject\n\n /**\n * Fetches multiple rows with pagination and optional ordering.\n * `limit` is required (no default) to prevent accidental unbounded queries.\n * Offset defaults to 0 if omitted. Runtime-capped at offset 100_000 — use cursor pagination for deeper paging.\n *\n * @example\n * const users = await User.findMany(adapter, { limit: 20 })\n * const page2 = await User.findMany(adapter, { limit: 20, offset: 20 })\n * const sorted = await User.findMany(adapter, { limit: 10, orderBy: 'name' })\n */\n findMany<With extends WithOptions<Fields>>(\n adapter: Adapter,\n options: FindManyOptions<Fields, With> & { readonly with: With },\n ): Promise<WithResult<Fields, With>[]>\n findMany(adapter: Adapter, options: FindManyOptions<Fields>): Promise<RowType<Fields>[]>\n\n /**\n * Fetches all rows without a LIMIT clause.\n * For batch processing / admin tooling. Apply an app-level size guard when used in request handlers.\n *\n * @example\n * const users = await User.findAll(adapter)\n * const admins = await User.findAll(adapter, { orderBy: 'name', where: { role: 'admin' } })\n */\n findAll(adapter: Adapter, options?: FindAllOptions<Fields>): Promise<RowType<Fields>[]>\n\n /**\n * Fetches a single row by primary key or where clause.\n * Returns null if not found.\n *\n * @example\n * const user = await User.findOne(adapter, id)\n * const byEmail = await User.findOne(adapter, { email: 'john@example.com' })\n */\n findOne<With extends WithOptions<Fields>>(\n adapter: Adapter,\n idOrWhere: IdOrWhere<Fields>,\n options: FindOneOptions<Fields, With> & { readonly with: With },\n ): Promise<WithResult<Fields, With> | null>\n findOne(adapter: Adapter, idOrWhere: IdOrWhere<Fields>): Promise<RowType<Fields> | null>\n\n /**\n * Creates a new row and returns the created record.\n *\n * @example\n * const user = await User.create(adapter, { name: 'John', email: 'john@example.com' })\n */\n create(adapter: Adapter, data: CreateInput<Fields>): Promise<RowType<Fields>>\n\n /**\n * Updates rows matching the given id or where clause.\n * Returns the updated row(s), or null if no rows matched.\n *\n * @example\n * const updated = await User.update(adapter, id, { name: 'Jane' })\n * const byEmail = await User.update(adapter, { email: '...' }, { name: 'Jane' })\n */\n update(\n adapter: Adapter,\n idOrWhere: IdOrWhere<Fields>,\n data: Partial<RowType<Fields>>,\n ): Promise<RowType<Fields> | null>\n\n /**\n * Deletes rows matching the given id or where clause.\n * Returns the number of deleted rows.\n *\n * @example\n * const result = await User.delete(adapter, id)\n * console.log(result.deleted) // number\n */\n delete(adapter: Adapter, idOrWhere: IdOrWhere<Fields>): Promise<{ readonly deleted: number }>\n}\n","import { z } from 'zod'\nimport type { Field } from '../field/types'\nimport { type FieldAccessor, resolveSchemaOptionKeys, type SchemaOptions } from './types'\n\ntype PolicyUsage = 'input-create' | 'input-update' | 'output'\n\n/**\n * Returns field names that are security-critical and must always be omitted from API schemas.\n * Currently only serverOnly fields. These cannot be overridden by user pick/omit.\n */\nfunction computeForcedOmit(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling\n fields: Record<string, Field<any, any, any>>,\n): string[] {\n const omit: string[] = []\n for (const [key, field] of Object.entries(fields)) {\n if (field.modifiers.policy === 'serverOnly') {\n omit.push(key)\n }\n }\n return omit\n}\n\n/**\n * Returns field names for relation fields that must always be omitted from API schemas.\n * Relation fields have no DB column and no Zod schema representation.\n */\nfunction computeRelationOmit(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling\n fields: Record<string, Field<any, any, any>>,\n): Set<string> {\n const keys = new Set<string>()\n for (const [key, field] of Object.entries(fields)) {\n if (field.kind === 'relation') keys.add(key)\n }\n return keys\n}\n\n/**\n * Returns field names to omit based on UX-oriented policy (writeOnly / readOnly).\n * These can be overridden when user explicitly provides pick.\n *\n * Policy mapping:\n * - `writeOnly`: omitted from output only. For input targets (input-create, input-update),\n * writeOnly fields are NOT omitted — they are intentionally part of the input (e.g. password).\n * - `readOnly`: omitted from input targets (input-create, input-update) only. Remains in output.\n *\n * The asymmetry is by design: writeOnly means \"accepted on write, hidden on read\";\n * readOnly means \"visible on read, rejected on write\".\n */\nfunction computeOptionalOmit(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling\n fields: Record<string, Field<any, any, any>>,\n target: PolicyUsage,\n): string[] {\n const omit: string[] = []\n for (const [key, field] of Object.entries(fields)) {\n const policy = field.modifiers.policy\n if (!policy) continue\n if (policy === 'writeOnly' && target === 'output') {\n omit.push(key)\n } else if (policy === 'readOnly' && (target === 'input-create' || target === 'input-update')) {\n omit.push(key)\n }\n }\n return omit\n}\n\n/**\n * Merges policy-derived omit with user-provided SchemaOptions.\n *\n * serverOnly fields are always omitted regardless of user pick/omit (security invariant).\n * writeOnly / readOnly are UX-oriented and can be overridden when user provides pick.\n * For 'input-update', partial defaults to true unless user specifies otherwise.\n */\nexport function derivePolicyOptions(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling\n fields: Record<string, Field<any, any, any>>,\n usage: PolicyUsage,\n userOpts?: SchemaOptions,\n // biome-ignore lint/suspicious/noExplicitAny: accessor is a plain object with string keys\n accessor?: FieldAccessor<any>,\n): SchemaOptions {\n const forcedBase = computeForcedOmit(fields)\n const relationOmit = computeRelationOmit(fields)\n const forced = [...new Set([...forcedBase, ...relationOmit])]\n const optional = computeOptionalOmit(fields, usage)\n\n const acc = accessor ?? ({} as FieldAccessor<string>)\n const resolvedPick = resolveSchemaOptionKeys(userOpts?.pick, acc)\n const resolvedOmit = resolveSchemaOptionKeys(userOpts?.omit, acc)\n\n if (resolvedPick !== undefined) {\n const partial = usage === 'input-update' ? (userOpts?.partial ?? true) : userOpts?.partial\n // serverOnly fields are stripped from pick even if user explicitly listed them\n const sanitizedPick = Array.from(resolvedPick).filter((k) => !forced.includes(k))\n // Combine forced omit with user-provided omit to preserve both constraints\n const combinedOmit = [...new Set([...forced, ...(resolvedOmit ?? [])])]\n return {\n ...userOpts,\n pick: sanitizedPick,\n ...(combinedOmit.length > 0 ? { omit: combinedOmit } : {}),\n partial,\n }\n }\n\n const combinedOmit = [...new Set([...forced, ...optional, ...(resolvedOmit ?? [])])]\n const partial =\n usage === 'input-update' ? (userOpts?.partial ?? true) : (userOpts?.partial ?? undefined)\n\n return {\n ...(userOpts ?? {}),\n pick: undefined,\n ...(combinedOmit.length > 0 ? { omit: combinedOmit } : {}),\n ...(partial !== undefined ? { partial } : {}),\n }\n}\n\n/**\n * Builds a Zod object schema from a fields definition.\n * Returns a ZodObject with all fields required and present.\n * Relation fields are excluded as they have no Zod schema representation.\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field handling and Zod shape\nexport function buildBaseObject(fields: Record<string, Field<any, any, any>>): z.ZodObject<any> {\n // biome-ignore lint/suspicious/noExplicitAny: Record key-value pairs have any type for shape\n const shape: Record<string, any> = {}\n for (const [key, field] of Object.entries(fields)) {\n if (field.kind === 'relation') continue\n shape[key] = field.zodBase\n }\n return z.object(shape)\n}\n\n/**\n * Applies pick, omit, and partial transformations to a Zod object schema.\n * Order: pick → omit → partial\n *\n * Returns the transformed schema, cast to Apply<Shape, Opts> at the call site.\n */\nexport function applySchemaOptions(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Zod shape operations\n baseSchema: z.ZodObject<any>,\n opts: SchemaOptions | undefined,\n // biome-ignore lint/suspicious/noExplicitAny: accessor is a plain object with string keys\n accessor?: FieldAccessor<any>,\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for return type\n): z.ZodObject<any> {\n if (!opts) {\n return baseSchema\n }\n\n const acc = accessor ?? ({} as FieldAccessor<string>)\n const resolvedPick = resolveSchemaOptionKeys(opts.pick, acc)\n const resolvedOmit = resolveSchemaOptionKeys(opts.omit, acc)\n\n let schema = baseSchema\n\n // Apply pick\n if (resolvedPick !== undefined) {\n const pickArray = Array.from(resolvedPick).filter((key) => Object.hasOwn(schema.shape, key))\n schema = schema.pick(\n // biome-ignore lint/suspicious/noExplicitAny: Zod API\n Object.fromEntries(pickArray.map((k) => [k, true])) as any,\n )\n }\n\n // Apply omit\n if (resolvedOmit !== undefined) {\n const omitArray = Array.from(resolvedOmit).filter((key) => Object.hasOwn(schema.shape, key))\n schema = schema.omit(\n // biome-ignore lint/suspicious/noExplicitAny: Zod API\n Object.fromEntries(omitArray.map((k) => [k, true])) as any,\n )\n }\n\n // Apply partial\n // `partial: false` を渡してもこの条件で何もしない。スキーマは required のまま。\n if (opts.partial === true) {\n // Zod 4 applies inner defaults even through optional(). An omitted PATCH\n // field must stay omitted, rather than overwriting stored data with a default.\n schema = z\n .object(\n Object.fromEntries(\n Object.entries(schema.shape).map(([key, value]) => [\n key,\n withoutDefaults(value as z.ZodType),\n ]),\n ),\n )\n .partial()\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Cast to Apply type at call site\n return schema as any\n}\n\nfunction withoutDefaults(schema: z.core.$ZodType): z.core.$ZodType {\n if (schema instanceof z.ZodDefault) return withoutDefaults(schema.removeDefault())\n if (schema instanceof z.ZodPrefault) return withoutDefaults(schema.unwrap())\n if (schema instanceof z.ZodOptional) return z.optional(withoutDefaults(schema.unwrap()))\n if (schema instanceof z.ZodNullable) return z.nullable(withoutDefaults(schema.unwrap()))\n return schema\n}\n","import type { Field, RelationDef } from '../field/types'\nimport { applySchemaOptions, buildBaseObject, derivePolicyOptions } from '../model/schema'\nimport type { SchemaOptions } from '../model/types'\nimport type {\n OpenAPIModelComponent,\n OpenAPISchemaObject,\n OpenAPIUsage,\n WithOpenAPIOption,\n} from './types'\n\n// biome-ignore lint/suspicious/noExplicitAny: OpenAPI generation accepts any concrete field builder.\ntype AnyField = Field<any, any, any>\ntype FieldsRecord = Record<string, AnyField>\n\ninterface OpenAPIOptions {\n readonly opts?: SchemaOptions\n readonly strict?: boolean\n readonly with?: WithOpenAPIOption\n}\n\nexport function toOpenAPIComponent(\n fields: FieldsRecord,\n opts?: OpenAPIOptions,\n): OpenAPIModelComponent {\n return {\n create: toOpenAPISchema(fields, 'create', opts),\n update: toOpenAPISchema(fields, 'update', opts),\n output: toOpenAPISchema(fields, 'output', opts),\n }\n}\n\nexport function toOpenAPISchema(\n fields: FieldsRecord,\n usage: OpenAPIUsage,\n opts?: OpenAPIOptions,\n): OpenAPISchemaObject {\n const policyUsage =\n usage === 'create' ? 'input-create' : usage === 'update' ? 'input-update' : 'output'\n const merged = derivePolicyOptions(fields, policyUsage, opts?.opts)\n const schema = applySchemaOptions(buildBaseObject(fields), merged)\n const shape = getZodObjectShape(schema)\n const properties: Record<string, OpenAPISchemaObject> = {}\n const required: string[] = []\n\n for (const [key, zodSchema] of Object.entries(shape)) {\n const field = fields[key]\n if (field === undefined) continue\n if (field.kind === 'relation') continue\n\n properties[key] = fieldToOpenAPISchema(field, opts?.strict)\n if (field.modifiers.policy === 'writeOnly' && (usage === 'create' || usage === 'update')) {\n properties[key].writeOnly = true\n }\n if (field.modifiers.policy === 'readOnly' && usage === 'output') {\n properties[key].readOnly = true\n }\n if (usage !== 'update' && isRequiredZodSchema(zodSchema)) {\n required.push(key)\n }\n }\n\n if (usage === 'output' && opts?.with !== undefined) {\n for (const [key, field] of Object.entries(fields)) {\n if (field.kind !== 'relation') continue\n if (opts.with[key] !== true) continue\n const relationField = field as unknown as RelationDef\n const rawTarget = relationField.target\n const targetModel = typeof rawTarget === 'function' ? rawTarget() : rawTarget\n const targetSchema = toOpenAPISchema(targetModel.fields as FieldsRecord, 'output')\n if (relationField.relationKind === 'hasMany') {\n properties[key] = { type: 'array', items: targetSchema }\n } else {\n properties[key] = { ...targetSchema, nullable: true }\n }\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n }\n}\n\nfunction fieldToOpenAPISchema(field: AnyField, strict = false): OpenAPISchemaObject {\n const schema: OpenAPISchemaObject =\n field.kind === 'json'\n ? zodToOpenAPISchema(field.zodBase, strict)\n : field.kind === 'string'\n ? { type: 'string' }\n : field.kind === 'uuid'\n ? { type: 'string', format: 'uuid' }\n : field.kind === 'number'\n ? { type: 'number' }\n : field.kind === 'integer'\n ? { type: 'integer' }\n : field.kind === 'boolean'\n ? { type: 'boolean' }\n : field.kind === 'timestamp'\n ? { type: 'string', format: 'date-time' }\n : {}\n\n if (field.modifiers.format === 'email') {\n schema.format = 'email'\n }\n if (field.modifiers.min !== undefined) {\n if (field.kind === 'string' || field.kind === 'uuid') {\n schema.minLength = field.modifiers.min\n } else {\n schema.minimum = field.modifiers.min\n }\n }\n if (field.modifiers.max !== undefined) {\n if (field.kind === 'string' || field.kind === 'uuid') {\n schema.maxLength = field.modifiers.max\n } else {\n schema.maximum = field.modifiers.max\n }\n }\n\n if (field.modifiers.optional) {\n schema.nullable = true\n }\n\n return schema\n}\n\nfunction zodToOpenAPISchema(schema: unknown, strict = false): OpenAPISchemaObject {\n const def = getZodDef(schema)\n if (def === undefined) return {}\n\n const typeName = getZodTypeName(def)\n\n // Refinements are inline checks in Zod 4, rather than ZodEffects wrappers.\n // Preserve the unsupported marker/strict rejection for custom runtime rules.\n const hasCustomChecks = getZodChecks(def).some((check) => {\n const kind = getZodCheckDef(check).check\n return kind === 'custom' || kind === 'overwrite'\n })\n if (hasCustomChecks) {\n if (strict) {\n throw new Error(\n `Unsupported Zod type for strict OpenAPI generation: ${typeName ?? 'unknown'}`,\n )\n }\n return { 'x-nanoka-zod-unsupported': true, 'x-nanoka-zod-type': typeName ?? 'unknown' }\n }\n\n if (typeName === 'ZodOptional' || typeName === 'optional') {\n return zodToOpenAPISchema(def.innerType, strict)\n }\n if (typeName === 'ZodDefault' || typeName === 'default') {\n return zodToOpenAPISchema(def.innerType, strict)\n }\n if (typeName === 'ZodNullable' || typeName === 'nullable') {\n return { ...zodToOpenAPISchema(def.innerType, strict), nullable: true }\n }\n\n if (typeName === 'ZodObject' || typeName === 'object') {\n const shape = getZodObjectShape(schema)\n const properties: Record<string, OpenAPISchemaObject> = {}\n const required: string[] = []\n\n for (const [key, childSchema] of Object.entries(shape)) {\n properties[key] = zodToOpenAPISchema(childSchema, strict)\n if (isRequiredZodSchema(childSchema)) {\n required.push(key)\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n }\n }\n\n if (typeName === 'ZodString' || typeName === 'string') {\n return applyStringChecks({ type: 'string' }, def)\n }\n\n if (typeName === 'ZodNumber' || typeName === 'number') {\n return applyNumberChecks({ type: hasIntegerCheck(def) ? 'integer' : 'number' }, def)\n }\n\n if (typeName === 'ZodBoolean' || typeName === 'boolean') {\n return { type: 'boolean' }\n }\n\n if (typeName === 'ZodArray' || typeName === 'array') {\n const itemSchema = def.element ?? def.type\n return {\n type: 'array',\n items: zodToOpenAPISchema(itemSchema, strict),\n }\n }\n\n if (typeName === 'ZodRecord' || typeName === 'record') {\n return {\n type: 'object',\n additionalProperties: zodToOpenAPISchema(def.valueType, strict),\n }\n }\n\n if (typeName === 'ZodUnknown' || typeName === 'unknown') {\n return {}\n }\n\n if (strict) {\n throw new Error(`Unsupported Zod type for strict OpenAPI generation: ${typeName ?? 'unknown'}`)\n }\n return {\n 'x-nanoka-zod-unsupported': true,\n ...(typeName ? { 'x-nanoka-zod-type': typeName } : {}),\n }\n}\n\nfunction getZodObjectShape(schema: unknown): Record<string, unknown> {\n if (\n typeof schema === 'object' &&\n schema !== null &&\n 'shape' in schema &&\n typeof schema.shape === 'object' &&\n schema.shape !== null\n ) {\n return schema.shape as Record<string, unknown>\n }\n\n if (\n typeof schema === 'object' &&\n schema !== null &&\n '_def' in schema &&\n typeof schema._def === 'object' &&\n schema._def !== null &&\n 'shape' in schema._def\n ) {\n const shape = schema._def.shape\n return (typeof shape === 'function' ? shape() : shape) as Record<string, unknown>\n }\n\n return {}\n}\n\nfunction isRequiredZodSchema(schema: unknown): boolean {\n const def = getZodDef(schema)\n if (def === undefined) {\n return true\n }\n\n const typeName = getZodTypeName(def)\n return (\n typeName !== 'ZodOptional' &&\n typeName !== 'optional' &&\n typeName !== 'ZodDefault' &&\n typeName !== 'default'\n )\n}\n\nfunction getZodDef(schema: unknown): Record<string, unknown> | undefined {\n if (\n typeof schema === 'object' &&\n schema !== null &&\n '_def' in schema &&\n typeof schema._def === 'object' &&\n schema._def !== null\n ) {\n return schema._def as Record<string, unknown>\n }\n\n return undefined\n}\n\nfunction getZodTypeName(def: Record<string, unknown>): string | undefined {\n return typeof def.typeName === 'string'\n ? def.typeName\n : typeof def.type === 'string'\n ? def.type\n : undefined\n}\n\nfunction applyStringChecks(\n schema: OpenAPISchemaObject,\n def: Record<string, unknown>,\n): OpenAPISchemaObject {\n for (const check of getZodChecks(def)) {\n const checkDef = getZodCheckDef(check)\n if (checkDef.kind === 'email' || checkDef.format === 'email') {\n schema.format = 'email'\n }\n if (checkDef.kind === 'min' && typeof checkDef.value === 'number') {\n schema.minLength = checkDef.value\n }\n if (checkDef.kind === 'max' && typeof checkDef.value === 'number') {\n schema.maxLength = checkDef.value\n }\n if (checkDef.check === 'min_length' && typeof checkDef.minimum === 'number') {\n schema.minLength = checkDef.minimum\n }\n if (checkDef.check === 'max_length' && typeof checkDef.maximum === 'number') {\n schema.maxLength = checkDef.maximum\n }\n }\n\n return schema\n}\n\nfunction applyNumberChecks(\n schema: OpenAPISchemaObject,\n def: Record<string, unknown>,\n): OpenAPISchemaObject {\n for (const check of getZodChecks(def)) {\n const checkDef = getZodCheckDef(check)\n if (checkDef.kind === 'min' && typeof checkDef.value === 'number') {\n schema.minimum = checkDef.value\n }\n if (checkDef.kind === 'max' && typeof checkDef.value === 'number') {\n schema.maximum = checkDef.value\n }\n if (\n (checkDef.check === 'greater_than' || checkDef.check === 'number_format') &&\n typeof checkDef.minimum === 'number'\n ) {\n schema.minimum = checkDef.minimum\n }\n if (\n (checkDef.check === 'less_than' || checkDef.check === 'number_format') &&\n typeof checkDef.maximum === 'number'\n ) {\n schema.maximum = checkDef.maximum\n }\n }\n\n return schema\n}\n\nfunction hasIntegerCheck(def: Record<string, unknown>): boolean {\n return getZodChecks(def).some((check) => {\n const checkDef = getZodCheckDef(check)\n return (\n checkDef.kind === 'int' ||\n checkDef.format === 'safeint' ||\n checkDef.format === 'int32' ||\n checkDef.format === 'int64'\n )\n })\n}\n\nfunction getZodChecks(def: Record<string, unknown>): readonly unknown[] {\n return Array.isArray(def.checks) ? def.checks : []\n}\n\nfunction getZodCheckDef(check: unknown): Record<string, unknown> {\n if (typeof check !== 'object' || check === null) {\n return {}\n }\n if (\n '_zod' in check &&\n typeof check._zod === 'object' &&\n check._zod !== null &&\n 'def' in check._zod &&\n typeof check._zod.def === 'object' &&\n check._zod.def !== null\n ) {\n return check._zod.def as Record<string, unknown>\n }\n\n return check as Record<string, unknown>\n}\n","import {\n type AnySQLiteColumn,\n type SQLiteTableWithColumns,\n sqliteTable,\n} from 'drizzle-orm/sqlite-core'\nimport type { Field } from '../field/types'\nimport type { NonRelationKeys } from './types'\n\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\ntype ModelTable<Fields extends Record<string, Field<any, any, any>>> = SQLiteTableWithColumns<{\n name: string\n schema: undefined\n columns: { [K in NonRelationKeys<Fields>]: AnySQLiteColumn }\n dialect: 'sqlite'\n}>\n\n/**\n * Constructs a Drizzle SQLiteTable from a tableName and fields.\n * Each field is converted to a Drizzle column via field.drizzleColumn(key).\n * @internal\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\nexport function buildTable<Fields extends Record<string, Field<any, any, any>>>(\n tableName: string,\n fields: Fields,\n): ModelTable<Fields> {\n const columns: Record<string, any> = {}\n for (const [key, field] of Object.entries(fields)) {\n if (field.kind === 'relation') continue\n columns[key] = field.drizzleColumn(key)\n }\n return sqliteTable(tableName, columns) as unknown as ModelTable<Fields>\n}\n","import { and, asc, desc, eq, inArray, SQL } from 'drizzle-orm'\nimport type { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core'\nimport { HTTPException } from 'hono/http-exception'\nimport type { Adapter } from '../adapter/types'\nimport type { Field, RelationDef, RelationTargetLike } from '../field/types'\nimport { buildTable } from './table'\nimport type {\n CreateInput,\n FindAllOptions,\n FindOneOptions,\n IdOrWhere,\n OrderBy,\n RowType,\n Where,\n WithOptions,\n WithResult,\n} from './types'\n\n// DoS guard for findMany; findAll intentionally bypasses this; values >100k → use cursor pagination. Keep in sync with README / docs-site / llms-full.txt.\nconst MAX_OFFSET = 100_000\n\n/**\n * Validates and guards limit/offset parameters.\n * @internal\n */\nfunction guardLimit(limit: unknown): number {\n if (!Number.isInteger(limit)) {\n throw new HTTPException(400, { message: 'limit must be an integer' })\n }\n const n = limit as number\n if (n < 0) {\n throw new HTTPException(400, { message: 'limit must be >= 0' })\n }\n return n\n}\n\nfunction guardOffset(offset: unknown): number {\n if (!Number.isInteger(offset)) {\n throw new HTTPException(400, { message: 'offset must be an integer' })\n }\n const n = offset as number\n if (n < 0) {\n throw new HTTPException(400, { message: 'offset must be >= 0' })\n }\n return n\n}\n\n/**\n * Finds the primary key field from fields record.\n * @internal\n */\nfunction findPrimaryKey(\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n fields: Record<string, Field<any, any, any>>,\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n): [string, Field<any, any, any>] | null {\n let pkKey: string | undefined\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n let pkField: Field<any, any, any> | undefined\n let pkCount = 0\n\n for (const [key, field] of Object.entries(fields)) {\n if (field.modifiers.primary === true) {\n pkCount++\n if (pkCount === 1) {\n pkKey = key\n pkField = field\n }\n }\n }\n\n if (pkCount === 0) {\n return null\n }\n if (pkCount > 1) {\n throw new HTTPException(500, { message: 'model has multiple primary keys' })\n }\n if (pkKey === undefined || pkField === undefined) {\n return null\n }\n\n return [pkKey, pkField]\n}\n\n/**\n * Detects whether a value is an `{ in: [...] }` operator object for a non-json field.\n * @internal\n */\n// biome-ignore lint/suspicious/noExplicitAny: field constraint\nfunction isInOperator(value: unknown, field: Field<any, any, any> | undefined): boolean {\n return (\n field?.kind !== 'json' &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.hasOwn(value, 'in') &&\n Array.isArray((value as { in: unknown }).in)\n )\n}\n\n/**\n * Constructs a Drizzle where clause from an object.\n * All entries are combined with AND.\n * @internal\n */\nfunction buildWhereClause(\n table: SQLiteTableWithColumns<any>,\n fields: Record<string, Field<any, any, any>>,\n where: Where<Record<string, any>>,\n): ReturnType<typeof and> | null {\n const conditions: SQL[] = []\n\n for (const [key, value] of Object.entries(where)) {\n // Multi-layered guard against identifier injection\n if (!Object.hasOwn(fields, key)) {\n throw new HTTPException(400, { message: 'invalid field in where clause' })\n }\n if (!Object.hasOwn(table, key)) {\n throw new HTTPException(400, { message: 'invalid column in table' })\n }\n // biome-ignore lint/suspicious/noExplicitAny: table column access is runtime-guarded by hasOwn\n const col = (table as unknown as Record<string, any>)[key]\n const field = fields[key]\n if (isInOperator(value, field)) {\n conditions.push(inArray(col, (value as { in: unknown[] }).in))\n } else {\n conditions.push(eq(col, value))\n }\n }\n\n if (conditions.length === 0) {\n return null\n }\n // conditions is SQL[] (inArray/eq both return SQL); cast to satisfy Drizzle's and()/return type which expects the narrower eq() result shape. Safe at runtime — all elements are SQL wrappers.\n if (conditions.length === 1) {\n return conditions[0] as ReturnType<typeof eq>\n }\n return and(...(conditions as ReturnType<typeof eq>[]))\n}\n\nfunction resolveRelationTarget(field: RelationDef): RelationTargetLike {\n return typeof field.target === 'function' ? field.target() : field.target\n}\n\nfunction getTargetTable(target: RelationTargetLike): SQLiteTableWithColumns<any> {\n if (Object.hasOwn(target, 'table')) {\n return (target as unknown as { table: SQLiteTableWithColumns<any> }).table\n }\n return buildTable(target.tableName, target.fields as Record<string, Field<any, any, any>>)\n}\n\nfunction validateWithOptions(\n fields: Record<string, Field<any, any, any>>,\n withOptions: Record<string, unknown>,\n): void {\n if (withOptions === null || typeof withOptions !== 'object' || Array.isArray(withOptions)) {\n throw new HTTPException(400, { message: 'invalid with option' })\n }\n\n for (const [key, value] of Object.entries(withOptions)) {\n if (value !== true) {\n throw new HTTPException(400, { message: 'nested with is not supported' })\n }\n if (!Object.hasOwn(fields, key) || fields[key]?.kind !== 'relation') {\n throw new HTTPException(400, { message: 'invalid relation in with option' })\n }\n }\n}\n\nasync function loadRelations<\n Fields extends Record<string, Field<any, any, any>>,\n With extends WithOptions<Fields>,\n>(\n adapter: Adapter,\n _parentTable: SQLiteTableWithColumns<any>,\n parentFields: Fields,\n parentRows: RowType<Fields>[],\n withOptions: With,\n): Promise<WithResult<Fields, With>[]> {\n if (parentRows.length === 0) {\n return []\n }\n\n const rows = parentRows.map((row) => ({ ...row })) as WithResult<Fields, With>[]\n\n for (const relationKey of Object.keys(withOptions)) {\n const field = parentFields[relationKey]\n if (field?.kind !== 'relation') {\n throw new HTTPException(400, { message: 'invalid relation in with option' })\n }\n\n const relation = field as RelationDef\n const target = resolveRelationTarget(relation)\n const targetFields = target.fields as Record<string, Field<any, any, any>>\n const targetTable = getTargetTable(target)\n\n if (relation.relationKind === 'hasMany') {\n const parentPk = findPrimaryKey(parentFields)\n if (!parentPk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n const parentPkKey = parentPk[0]\n const foreignKey = relation.foreignKey\n if (!Object.hasOwn(targetFields, foreignKey) || !Object.hasOwn(targetTable, foreignKey)) {\n throw new HTTPException(500, { message: 'invalid relation foreign key' })\n }\n\n const parentIds = Array.from(\n new Set(parentRows.map((row) => (row as Record<string, unknown>)[parentPkKey])),\n )\n const targetRows =\n parentIds.length === 0\n ? []\n : await adapter.drizzle\n .select()\n .from(targetTable)\n .where(\n inArray(\n (targetTable as unknown as Record<string, any>)[foreignKey],\n parentIds as any[],\n ),\n )\n\n const grouped = new Map<unknown, unknown[]>()\n for (const targetRow of targetRows as Record<string, unknown>[]) {\n const value = targetRow[foreignKey]\n const group = grouped.get(value)\n if (group === undefined) {\n grouped.set(value, [targetRow])\n } else {\n group.push(targetRow)\n }\n }\n\n for (const row of rows as Record<string, unknown>[]) {\n row[relationKey] = grouped.get(row[parentPkKey]) ?? []\n }\n } else {\n const foreignKey = relation.foreignKey\n if (!Object.hasOwn(parentFields, foreignKey) || !Object.hasOwn(_parentTable, foreignKey)) {\n throw new HTTPException(500, { message: 'invalid relation foreign key' })\n }\n\n const targetPk = findPrimaryKey(targetFields)\n if (!targetPk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n const targetPkKey = targetPk[0]\n if (!Object.hasOwn(targetTable, targetPkKey)) {\n throw new HTTPException(500, { message: 'invalid relation primary key' })\n }\n\n const parentFkValues = Array.from(\n new Set(parentRows.map((row) => (row as Record<string, unknown>)[foreignKey])),\n )\n const targetRows =\n parentFkValues.length === 0\n ? []\n : await adapter.drizzle\n .select()\n .from(targetTable)\n .where(\n inArray(\n (targetTable as unknown as Record<string, any>)[targetPkKey],\n parentFkValues as any[],\n ),\n )\n\n const byPk = new Map<unknown, unknown>()\n for (const targetRow of targetRows as Record<string, unknown>[]) {\n byPk.set(targetRow[targetPkKey], targetRow)\n }\n\n for (const row of rows as Record<string, unknown>[]) {\n row[relationKey] = byPk.get(row[foreignKey]) ?? null\n }\n }\n }\n\n return rows\n}\n\n/**\n * Fetches multiple rows with limit, offset, optional ordering, and optional where clause.\n * @internal\n */\nexport async function findManyImpl<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n With extends WithOptions<Fields> | undefined = undefined,\n>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n options: {\n limit: unknown\n offset?: unknown\n orderBy?: OrderBy<Fields>\n where?: Where<Fields> | SQL\n with?: With\n },\n): Promise<RowType<Fields>[] | WithResult<Fields, NonNullable<With>>[]> {\n const limit = guardLimit(options.limit)\n const offset = options.offset !== undefined ? guardOffset(options.offset) : 0\n\n if (offset > MAX_OFFSET) {\n throw new HTTPException(400, {\n message: `offset must be <= ${MAX_OFFSET}; use cursor pagination for deeper paging`,\n })\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query builder type narrowing\n let query: any = adapter.drizzle.select().from(table).limit(limit).offset(offset)\n\n // Apply where clause\n if (options.where !== undefined) {\n if (options.where instanceof SQL) {\n query = query.where(options.where)\n } else {\n const whereClause = buildWhereClause(\n table,\n fields,\n options.where as Where<Record<string, any>>,\n )\n if (whereClause !== null) {\n query = query.where(whereClause)\n }\n }\n }\n\n // Apply ordering\n if (options.orderBy !== undefined) {\n const orderByList = Array.isArray(options.orderBy) ? options.orderBy : [options.orderBy]\n\n for (const orderByItem of orderByList) {\n let column: string\n let direction: 'asc' | 'desc' = 'asc'\n\n if (typeof orderByItem === 'string') {\n column = orderByItem\n } else if (\n typeof orderByItem === 'object' &&\n orderByItem !== null &&\n 'column' in orderByItem\n ) {\n column = orderByItem.column\n if (orderByItem.direction) {\n direction = orderByItem.direction\n }\n } else {\n throw new HTTPException(400, { message: 'invalid orderBy format' })\n }\n\n // Runtime guard against identifier injection (both fields and table to match where-clause guard)\n if (!Object.hasOwn(fields, column) || !Object.hasOwn(table, column)) {\n throw new HTTPException(400, { message: 'invalid field in orderBy' })\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: table column access is runtime-guarded by hasOwn\n const col = (table as unknown as Record<string, any>)[column]\n query = query.orderBy(direction === 'asc' ? asc(col) : desc(col))\n }\n }\n\n const rows = await query\n if (options.with !== undefined) {\n validateWithOptions(fields, options.with as Record<string, unknown>)\n return loadRelations(adapter, table, fields, rows, options.with as NonNullable<With>)\n }\n return rows\n}\n\n/**\n * Fetches all rows without a LIMIT clause.\n * For batch processing / admin tooling. Apply an app-level size guard when used in request handlers.\n * @internal\n */\nexport async function findAllImpl<\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field constraint\n Fields extends Record<string, Field<any, any, any>>,\n>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n options?: FindAllOptions<Fields>,\n): Promise<RowType<Fields>[]> {\n const offset = options?.offset !== undefined ? guardOffset(options.offset) : undefined\n\n // SQLite requires LIMIT when OFFSET is used.\n // Number.MAX_SAFE_INTEGER is used as a sentinel \"no practical limit\" value when offset is specified.\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query builder type narrowing\n let query: any =\n offset !== undefined\n ? adapter.drizzle.select().from(table).limit(Number.MAX_SAFE_INTEGER).offset(offset)\n : adapter.drizzle.select().from(table)\n\n // Apply where clause\n if (options?.where !== undefined) {\n if (options.where instanceof SQL) {\n query = query.where(options.where)\n } else {\n const whereClause = buildWhereClause(\n table,\n fields,\n options.where as Where<Record<string, any>>,\n )\n if (whereClause !== null) {\n query = query.where(whereClause)\n }\n }\n }\n\n // Apply ordering\n if (options?.orderBy !== undefined) {\n const orderByList = Array.isArray(options.orderBy) ? options.orderBy : [options.orderBy]\n\n for (const orderByItem of orderByList) {\n let column: string\n let direction: 'asc' | 'desc' = 'asc'\n\n if (typeof orderByItem === 'string') {\n column = orderByItem\n } else if (\n typeof orderByItem === 'object' &&\n orderByItem !== null &&\n 'column' in orderByItem\n ) {\n column = orderByItem.column\n if (orderByItem.direction) {\n direction = orderByItem.direction\n }\n } else {\n throw new HTTPException(400, { message: 'invalid orderBy format' })\n }\n\n // Runtime guard against identifier injection (both fields and table to match where-clause guard)\n if (!Object.hasOwn(fields, column) || !Object.hasOwn(table, column)) {\n throw new HTTPException(400, { message: 'invalid field in orderBy' })\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: table column access is runtime-guarded by hasOwn\n const col = (table as unknown as Record<string, any>)[column]\n query = query.orderBy(direction === 'asc' ? asc(col) : desc(col))\n }\n }\n\n const rows = await query\n return rows\n}\n\n/**\n * Fetches a single row by primary key or where clause.\n * @internal\n */\nexport async function findOneImpl<Fields extends Record<string, Field<any, any, any>>>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n idOrWhere: IdOrWhere<Fields>,\n options?: FindOneOptions<Fields>,\n): Promise<RowType<Fields> | null> {\n let whereClause: SQL | ReturnType<typeof buildWhereClause>\n\n if (idOrWhere instanceof SQL) {\n whereClause = idOrWhere\n } else {\n let where: Where<Fields>\n if (typeof idOrWhere === 'string' || typeof idOrWhere === 'number') {\n // PK mode\n const pk = findPrimaryKey(fields)\n if (!pk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n where = { [pk[0]]: idOrWhere } as Where<Fields>\n } else {\n where = idOrWhere as Where<Fields>\n }\n whereClause = buildWhereClause(table, fields, where)\n }\n\n if (!whereClause) {\n throw new HTTPException(400, { message: 'where clause must not be empty' })\n }\n\n if (options?.with !== undefined) {\n validateWithOptions(fields, options.with as Record<string, unknown>)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query type\n const rows = await (adapter.drizzle.select().from(table).where(whereClause).limit(1) as any)\n if (rows.length === 0) {\n return null\n }\n if (options?.with !== undefined) {\n const withRows = await loadRelations(adapter, table, fields, [rows[0]], options.with)\n return withRows[0] ?? null\n }\n return rows[0]\n}\n\n/**\n * Creates a new row and returns the created record.\n * @internal\n */\nexport async function createImpl<Fields extends Record<string, Field<any, any, any>>>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n data: CreateInput<Fields>,\n): Promise<RowType<Fields>> {\n const builder = adapter.drizzle\n .insert(table)\n .values(data as any)\n .returning()\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query type\n const rows = await (builder as any)\n return rows[0]\n}\n\n/**\n * Updates rows matching the given id or where clause.\n * @internal\n */\nexport async function updateImpl<Fields extends Record<string, Field<any, any, any>>>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n idOrWhere: IdOrWhere<Fields>,\n data: Partial<RowType<Fields>>,\n): Promise<RowType<Fields> | null> {\n let whereClause: SQL | ReturnType<typeof buildWhereClause>\n\n if (idOrWhere instanceof SQL) {\n whereClause = idOrWhere\n } else {\n let where: Where<Fields>\n if (typeof idOrWhere === 'string' || typeof idOrWhere === 'number') {\n // PK mode\n const pk = findPrimaryKey(fields)\n if (!pk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n where = { [pk[0]]: idOrWhere } as Where<Fields>\n } else {\n where = idOrWhere as Where<Fields>\n }\n whereClause = buildWhereClause(table, fields, where)\n }\n\n if (!whereClause) {\n throw new HTTPException(400, { message: 'where clause must not be empty' })\n }\n\n const builder = adapter.drizzle\n .update(table)\n .set(data as any)\n .where(whereClause)\n .returning()\n // biome-ignore lint/suspicious/noExplicitAny: drizzle query type\n const rows = await (builder as any)\n return rows.length > 0 ? rows[0] : null\n}\n\n/**\n * Deletes rows matching the given id or where clause.\n * @internal\n */\nexport async function deleteImpl<Fields extends Record<string, Field<any, any, any>>>(\n adapter: Adapter,\n table: SQLiteTableWithColumns<any>,\n fields: Fields,\n idOrWhere: IdOrWhere<Fields>,\n): Promise<{ readonly deleted: number }> {\n let whereClause: SQL | ReturnType<typeof buildWhereClause>\n\n if (idOrWhere instanceof SQL) {\n whereClause = idOrWhere\n } else {\n let where: Where<Fields>\n if (typeof idOrWhere === 'string' || typeof idOrWhere === 'number') {\n // PK mode\n const pk = findPrimaryKey(fields)\n if (!pk) {\n throw new HTTPException(500, { message: 'model has no primary key' })\n }\n where = { [pk[0]]: idOrWhere } as Where<Fields>\n } else {\n where = idOrWhere as Where<Fields>\n }\n whereClause = buildWhereClause(table, fields, where)\n }\n\n if (!whereClause) {\n throw new HTTPException(400, { message: 'where clause must not be empty' })\n }\n\n const result = await adapter.drizzle.delete(table).where(whereClause).returning()\n return { deleted: result.length }\n}\n","import { type Hook, zValidator } from '@hono/zod-validator'\nimport type { Env, ValidationTargets } from 'hono'\nimport type { z } from 'zod'\nimport type { Adapter } from '../adapter/types'\nimport type { Field } from '../field/types'\nimport { toOpenAPIComponent, toOpenAPISchema } from '../openapi/generate'\nimport type { OpenAPIUsage, WithOpenAPIOption } from '../openapi/types'\nimport { createImpl, deleteImpl, findAllImpl, findManyImpl, findOneImpl, updateImpl } from './crud'\nimport { applySchemaOptions, buildBaseObject, derivePolicyOptions } from './schema'\nimport { buildTable } from './table'\nimport type {\n Apply,\n CreateInput,\n FieldsToZodShape,\n FindAllOptions,\n FindManyOptions,\n FindOneOptions,\n IdOrWhere,\n Model,\n NonRelationKeys,\n RowType,\n SchemaOptions,\n} from './types'\nimport { buildFieldAccessor } from './types'\n\n/**\n * Creates a Model instance from a tableName and fields definition.\n * The model supports deriving Zod schemas, Hono validators, and CRUD operations.\n *\n * @example\n * const User = defineModel('users', {\n * id: t.uuid().primary(),\n * name: t.string(),\n * email: t.string().email(),\n * passwordHash: t.string(),\n * })\n *\n * const CreateSchema = User.schema({ omit: ['passwordHash'] })\n * const users = await User.findMany(adapter, { limit: 20 })\n */\n// biome-ignore lint/suspicious/noExplicitAny: any is necessary for generic Field constraint\nexport function defineModel<Fields extends Record<string, Field<any, any, any>>>(\n tableName: string,\n fields: Fields,\n): Model<Fields> {\n const table = buildTable(tableName, fields)\n const accessor = buildFieldAccessor(fields)\n\n return {\n fields,\n tableName,\n table,\n\n schema<Opts extends SchemaOptions<NonRelationKeys<Fields> & string> | undefined>(\n opts?: Opts,\n ): Apply<FieldsToZodShape<Fields>, Opts> {\n const baseSchema = buildBaseObject(fields)\n const schema = applySchemaOptions(baseSchema, opts, accessor)\n // biome-ignore lint/suspicious/noExplicitAny: Zod .pick()/.omit() return type narrowing requires cast at boundary\n return schema as any\n },\n\n validator(\n target: keyof ValidationTargets,\n optsOrPreset?: 'create' | 'update' | SchemaOptions<NonRelationKeys<Fields> & string>,\n // biome-ignore lint/suspicious/noExplicitAny: Hook<T> is contravariant in T; any is required to bridge overload implementations\n hook?: Hook<any, Env, string, keyof ValidationTargets>,\n ) {\n let schema: z.ZodTypeAny\n if (optsOrPreset === 'create' || optsOrPreset === 'update') {\n schema = this.inputSchema(optsOrPreset)\n } else {\n schema = this.schema(optsOrPreset as SchemaOptions<NonRelationKeys<Fields> & string>)\n }\n // biome-ignore lint/suspicious/noExplicitAny: zValidator return type cast required at overload boundary\n return zValidator(target, schema, hook) as any\n },\n\n inputSchema(\n usage: 'create' | 'update',\n opts?: SchemaOptions<NonRelationKeys<Fields> & string>,\n // biome-ignore lint/suspicious/noExplicitAny: precise return type is enforced by Model<Fields> overload signatures\n ): any {\n const merged = derivePolicyOptions(\n fields,\n usage === 'create' ? 'input-create' : 'input-update',\n opts,\n accessor,\n )\n const baseSchema = buildBaseObject(fields)\n let schema = applySchemaOptions(baseSchema, merged)\n if (usage === 'create') {\n // biome-ignore lint/suspicious/noExplicitAny: Zod shape access requires any\n const shape = (schema as z.ZodObject<any>).shape\n // biome-ignore lint/suspicious/noExplicitAny: patch record values are ZodTypeAny\n const patch: Record<string, any> = {}\n for (const [key, field] of Object.entries(fields)) {\n if (\n field.modifiers.defaultNow === true &&\n field.modifiers.policy !== 'readOnly' &&\n key in shape\n ) {\n patch[key] = shape[key].optional()\n }\n }\n if (Object.keys(patch).length > 0) {\n schema = schema.extend(patch)\n }\n }\n return schema\n },\n\n outputSchema(\n opts?: SchemaOptions<NonRelationKeys<Fields> & string>,\n // biome-ignore lint/suspicious/noExplicitAny: precise return type is enforced by Model<Fields> overload signatures\n ): any {\n const merged = derivePolicyOptions(fields, 'output', opts, accessor)\n const baseSchema = buildBaseObject(fields)\n return applySchemaOptions(baseSchema, merged)\n },\n\n toResponse(row: RowType<Fields>): unknown {\n return this.outputSchema().parse(row)\n },\n\n toResponseMany(rows: readonly RowType<Fields>[]): unknown[] {\n const schema = this.outputSchema()\n return rows.map((row) => schema.parse(row))\n },\n\n toOpenAPIComponent() {\n return toOpenAPIComponent(fields)\n },\n\n toOpenAPISchema(usage: OpenAPIUsage, opts?: { readonly with: Partial<Record<string, true>> }) {\n return toOpenAPISchema(\n fields,\n usage,\n opts ? { with: opts.with as WithOpenAPIOption } : undefined,\n )\n },\n\n findMany: ((adapter: Adapter, options: FindManyOptions<Fields>) =>\n findManyImpl(adapter, table, fields, options)) as Model<Fields>['findMany'],\n\n findAll(adapter: Adapter, options?: FindAllOptions<Fields>): Promise<RowType<Fields>[]> {\n return findAllImpl(adapter, table, fields, options)\n },\n\n findOne: ((adapter: Adapter, idOrWhere: IdOrWhere<Fields>, options?: FindOneOptions<Fields>) =>\n findOneImpl(adapter, table, fields, idOrWhere, options)) as Model<Fields>['findOne'],\n\n create(adapter: Adapter, data: CreateInput<Fields>): Promise<RowType<Fields>> {\n return createImpl(adapter, table, data)\n },\n\n update(\n adapter: Adapter,\n idOrWhere: IdOrWhere<Fields>,\n data: Partial<RowType<Fields>>,\n ): Promise<RowType<Fields> | null> {\n return updateImpl(adapter, table, fields, idOrWhere, data)\n },\n\n delete(adapter: Adapter, idOrWhere: IdOrWhere<Fields>): Promise<{ readonly deleted: number }> {\n return deleteImpl(adapter, table, fields, idOrWhere)\n },\n }\n}\n","import type { OpenAPIDocument, OpenAPIRouteMetadata, OpenAPISpecOptions } from './types'\n\nfunction honoPathToOpenAPI(path: string): string {\n return path.replace(/:([^/]+)/g, '{$1}')\n}\n\nexport function buildOpenAPIDocument(\n routes: readonly OpenAPIRouteMetadata[],\n options: OpenAPISpecOptions,\n): OpenAPIDocument {\n const paths: Record<string, Record<string, unknown>> = {}\n\n for (const route of routes) {\n const openAPIPath = honoPathToOpenAPI(route.path)\n if (!paths[openAPIPath]) {\n paths[openAPIPath] = {}\n }\n\n const operation: Record<string, unknown> = {}\n if (route.operationId) operation.operationId = route.operationId\n if (route.summary) operation.summary = route.summary\n if (route.description) operation.description = route.description\n if (route.tags) operation.tags = route.tags\n\n const parameters: unknown[] = []\n const pathParams = [...route.path.matchAll(/:([^/]+)/g)].map((m) => m[1])\n for (const param of pathParams) {\n const alreadyDefined = route.params?.some((p) => p.name === param && p.in === 'path')\n if (!alreadyDefined) {\n parameters.push({ name: param, in: 'path', required: true, schema: { type: 'string' } })\n }\n }\n if (route.params) {\n parameters.push(...route.params)\n }\n if (parameters.length > 0) operation.parameters = parameters\n\n if (route.requestBody) operation.requestBody = route.requestBody\n operation.responses = route.responses\n\n paths[openAPIPath][route.method] = operation\n }\n\n const doc: OpenAPIDocument = {\n openapi: '3.1.0',\n info: options.info,\n ...(options.servers ? { servers: options.servers } : {}),\n paths,\n }\n\n return doc\n}\n","import type { MiddlewareHandler } from 'hono'\n\nexport interface SwaggerUIOptions {\n readonly url: string\n readonly title?: string\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\nexport function swaggerUI(options: SwaggerUIOptions): MiddlewareHandler {\n const title = escapeHtml(options.title ?? 'API Documentation')\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <title>${title}</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\" />\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\"></script>\n <script>\n SwaggerUIBundle({\n url: ${JSON.stringify(options.url)},\n dom_id: '#swagger-ui',\n presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],\n layout: 'BaseLayout',\n })\n </script>\n</body>\n</html>`\n\n return async (c) => {\n return c.html(html)\n }\n}\n","import { Hono } from 'hono'\nimport type { BlankEnv, Env, H } from 'hono/types'\nimport type { Adapter } from '../adapter/types'\nimport type { Field } from '../field/types'\nimport { defineModel } from '../model/define'\nimport type { IdOrWhere } from '../model/types'\nimport { buildOpenAPIDocument } from '../openapi/route'\nimport type { HttpMethod, OpenAPIRouteMetadata } from '../openapi/types'\nimport type { Nanoka, NanokaModel, RouteOpenAPIOption } from './types'\n\n/**\n * Creates a Nanoka application instance with the given database adapter.\n *\n * @param adapter - The database adapter (e.g., d1Adapter(env.DB))\n * @returns A Nanoka application (Hono extended with model(), db, and batch)\n *\n * @example\n * export default {\n * fetch(req: Request, env: Env, ctx: ExecutionContext) {\n * const app = nanoka(d1Adapter(env.DB))\n * const User = app.model('users', { id, name, email, passwordHash })\n * app.get('/users', async (c) => {\n * const users = await User.findMany({ limit: 20 })\n * return c.json(users)\n * })\n * return app.fetch(req, env, ctx)\n * }\n * }\n */\nexport function nanoka<E extends Env = BlankEnv>(adapter: Adapter): Nanoka<E> {\n const app = new Hono<E>() as Nanoka<E>\n const openapiRoutes: OpenAPIRouteMetadata[] = []\n\n Object.defineProperty(app, 'db', {\n get: () => adapter.drizzle,\n enumerable: true,\n })\n\n app.batch = ((queries: Parameters<Adapter['batch']>[0]) =>\n adapter.batch(queries)) as unknown as Adapter['batch']\n\n app.openapi = (metadata: OpenAPIRouteMetadata) => {\n openapiRoutes.push(metadata)\n return app\n }\n\n app.generateOpenAPISpec = (options) => buildOpenAPIDocument(openapiRoutes, options)\n\n function wrapWithOpenAPI(method: HttpMethod) {\n // biome-ignore lint/suspicious/noExplicitAny: original Hono method is typed as HandlerInterface which needs any at call site\n const original = (app as any)[method].bind(app)\n // biome-ignore lint/suspicious/noExplicitAny: overload bridge — type safety is provided by the Nanoka interface overload\n ;(app as any)[method] = (path: string, second: RouteOpenAPIOption | H, ...rest: H[]) => {\n if (\n second !== null &&\n typeof second === 'object' &&\n !Array.isArray(second) &&\n typeof (second as RouteOpenAPIOption).openapi === 'object'\n ) {\n const { openapi } = second as RouteOpenAPIOption\n openapiRoutes.push({ ...openapi, path, method })\n return original(path, ...rest)\n }\n return original(path, second, ...rest)\n }\n }\n\n for (const method of ['get', 'post', 'put', 'patch', 'delete'] as const) {\n wrapWithOpenAPI(method)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: any is necessary for Field generic constraint\n app.model = function model<Fields extends Record<string, Field<any, any, any>>>(\n name: string,\n fields: Fields,\n ): NanokaModel<Fields> {\n const inner = defineModel(name, fields)\n\n return {\n fields: inner.fields,\n tableName: inner.tableName,\n table: inner.table,\n\n schema: (opts) => inner.schema(opts),\n\n validator: (\n ...args: [\n keyof import('hono').ValidationTargets,\n (\n | 'create'\n | 'update'\n | import('../model/types').SchemaOptions<\n import('../model/types').NonRelationKeys<Fields> & string\n >\n )?,\n import('@hono/zod-validator').Hook<\n // biome-ignore lint/suspicious/noExplicitAny: Hook<T> is contravariant in T; any is required to bridge overload implementations\n any,\n import('hono').Env,\n string,\n keyof import('hono').ValidationTargets\n >?,\n ]\n ) => {\n // `NanokaModel` interface の overload 定義 (router/types.ts) で type safety は担保する。\n // 実装は inner.validator に委譲するだけで、型は interface 側の overload に従う。\n // biome-ignore lint/suspicious/noExplicitAny: NanokaModel interface overloads provide type safety\n return (inner.validator as (...a: typeof args) => any)(...args)\n },\n\n inputSchema: (usage, opts) => inner.inputSchema(usage, opts),\n\n outputSchema: (opts) => inner.outputSchema(opts),\n\n toResponse: (row) => inner.toResponse(row),\n\n toResponseMany: (rows) => inner.toResponseMany(rows),\n\n toOpenAPIComponent: () => inner.toOpenAPIComponent(),\n\n toOpenAPISchema: (usage, opts?: { readonly with: Partial<Record<string, true>> }) =>\n // biome-ignore lint/suspicious/noExplicitAny: NanokaModel interface overloads provide type safety\n (inner.toOpenAPISchema as (u: typeof usage, o?: typeof opts) => any)(usage, opts),\n\n findMany: ((options: Parameters<NanokaModel<Fields>['findMany']>[0]) =>\n inner.findMany(adapter, options as any)) as NanokaModel<Fields>['findMany'],\n\n findAll: (options) => inner.findAll(adapter, options),\n\n findOne: ((\n idOrWhere: IdOrWhere<Fields>,\n options?: import('../model/types').FindOneOptions<Fields>,\n ) => inner.findOne(adapter, idOrWhere, options as any)) as NanokaModel<Fields>['findOne'],\n\n create: (data) => inner.create(adapter, data),\n\n update: (idOrWhere, data) => inner.update(adapter, idOrWhere, data),\n\n delete: (idOrWhere) => inner.delete(adapter, idOrWhere),\n }\n }\n\n return app\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanokajs/core",
3
- "version": "2.0.2",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "description": "Thin wrapper over Hono + Drizzle + Zod for Cloudflare Workers + D1. 80% automatic, 20% explicit.",
6
6
  "author": "Eiichiro Iriguchi <eiichiro_iriguchi@a-1ro.dev>",
@@ -65,8 +65,8 @@
65
65
  "@cloudflare/workers-types": "^4.20240925.0",
66
66
  "@libsql/client": ">=0.14.0 <0.18.0",
67
67
  "drizzle-orm": "^0.45.2",
68
- "hono": "^4.0.0",
69
- "zod": "^3.23.0 || ^4.0.0"
68
+ "hono": "^4.13.12",
69
+ "zod": "^4.6.6"
70
70
  },
71
71
  "peerDependenciesMeta": {
72
72
  "@libsql/client": {
@@ -74,14 +74,14 @@
74
74
  }
75
75
  },
76
76
  "dependencies": {
77
- "@hono/zod-validator": "^0.4.3",
77
+ "@hono/zod-validator": "^0.9.1",
78
78
  "jiti": "^2.7.0"
79
79
  },
80
80
  "devDependencies": {
81
- "@cloudflare/vitest-pool-workers": "^0.18.5",
81
+ "@cloudflare/vitest-pool-workers": "0.23.0",
82
82
  "@cloudflare/workers-types": "^4.20260523.1",
83
83
  "@libsql/client": "^0.17.4",
84
- "@types/node": "^25.9.1",
84
+ "@types/node": "^26.6.5",
85
85
  "drizzle-orm": "^0.45.2",
86
86
  "hono": "^4.13.12",
87
87
  "tsup": "^8.5.1",
@@ -89,6 +89,6 @@
89
89
  "vite": "^8.1.4",
90
90
  "vitest": "^4.1.11",
91
91
  "wrangler": "^4.111.0",
92
- "zod": "^3.25.76"
92
+ "zod": "^4.6.6"
93
93
  }
94
94
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/field/builder.ts","../src/field/factories.ts"],"names":["zLib"],"mappings":"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","file":"chunk-UBDSGKTX.js","sourcesContent":["import type { SQLiteColumnBuilderBase } from 'drizzle-orm/sqlite-core'\nimport type { z } from 'zod'\nimport type { Field, FieldKind, FieldModifiers } from './types'\n\n/**\n * Abstract base class for field builders.\n * Provides shared implementation for Zod and Drizzle integration.\n *\n * Subclasses must implement:\n * - `zodBase: ZB` getter\n * - `drizzleColumn(name: string): SQLiteColumnBuilderBase` method\n * - Modifier chain methods (optional, primary, unique, default) that return the subclass type\n *\n * @template TS - The TypeScript type of the field\n * @template Mods - The type of modifiers currently applied\n * @template ZB - The Zod base schema type for this field\n */\nexport abstract class BaseFieldBuilder<\n TS,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> implements Field<TS, Mods, ZB>\n{\n readonly tsType: TS = undefined as unknown as TS\n abstract readonly kind: FieldKind\n readonly modifiers: Readonly<Mods>\n\n constructor(modifiers?: Mods) {\n this.modifiers = Object.freeze((modifiers ?? {}) as Mods)\n }\n\n abstract get zodBase(): ZB\n abstract drizzleColumn(name: string): SQLiteColumnBuilderBase\n\n /**\n * Creates an immutable copy of this field with updated modifiers.\n * Subclasses must implement this to maintain their concrete type.\n */\n // biome-ignore lint/suspicious/noExplicitAny: Field builders return polymorphic types\n protected abstract cloneWithModifiers(mods: FieldModifiers): any\n\n /**\n * Returns the Zod schema with all modifiers applied.\n * Order: base schema → format/min/max constraints → optional → default\n */\n protected applyModifiersToZod(baseSchema: z.ZodTypeAny): z.ZodTypeAny {\n let schema = baseSchema\n\n // Apply optional — use nullable() first so D1/SQLite null values are accepted\n if (this.modifiers.optional) {\n schema = schema.nullable().optional()\n }\n\n // Apply default\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n schema = schema.default(defaultValue)\n }\n\n return schema\n }\n}\n","import { sql } from 'drizzle-orm'\nimport type { SQLiteColumnBuilderBase } from 'drizzle-orm/sqlite-core'\nimport { integer, real, text } from 'drizzle-orm/sqlite-core'\nimport type { z } from 'zod'\nimport { z as zLib } from 'zod'\nimport { BaseFieldBuilder } from './builder'\nimport type { FieldModifiers, RelationKind, RelationTargetLike } from './types'\n\n// ==================== StringFieldBuilder ====================\n\nclass StringFieldBuilder<\n TS = string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'string' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.string()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n if (this.modifiers.format === 'email') {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).email()\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = text(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): StringFieldBuilder<TS, NewMods> {\n return new StringFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new StringFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: StringFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): StringFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds email format validation.\n */\n email(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Mods & { format: 'email' }> {\n const newMods = { ...this.modifiers, format: 'email' as const } as Mods & { format: 'email' }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum string length.\n */\n min(\n this: StringFieldBuilder<TS, Mods>,\n n: number,\n ): StringFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum string length.\n */\n max(\n this: StringFieldBuilder<TS, Mods>,\n n: number,\n ): StringFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== UuidFieldBuilder ====================\n\nclass UuidFieldBuilder<\n TS = string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'uuid' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.string().uuid()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = text(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (\n this.modifiers.primary === true &&\n this.modifiers.policy === 'readOnly' &&\n !this.modifiers.hasDefault\n ) {\n col = col.$defaultFn(() => crypto.randomUUID())\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): UuidFieldBuilder<TS, NewMods> {\n return new UuidFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new UuidFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: UuidFieldBuilder<TS, Mods>): UuidFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: UuidFieldBuilder<TS, Mods>): UuidFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: UuidFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): UuidFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum string length.\n */\n min(this: UuidFieldBuilder<TS, Mods>, n: number): UuidFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum string length.\n */\n max(this: UuidFieldBuilder<TS, Mods>, n: number): UuidFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== NumberFieldBuilder ====================\n\nclass NumberFieldBuilder<\n TS = number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'number' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.number()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = real(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): NumberFieldBuilder<TS, NewMods> {\n return new NumberFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new NumberFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: NumberFieldBuilder<TS, Mods>): NumberFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: NumberFieldBuilder<TS, Mods>): NumberFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: NumberFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): NumberFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum value.\n */\n min(\n this: NumberFieldBuilder<TS, Mods>,\n n: number,\n ): NumberFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum value.\n */\n max(\n this: NumberFieldBuilder<TS, Mods>,\n n: number,\n ): NumberFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== IntegerFieldBuilder ====================\n\nclass IntegerFieldBuilder<\n TS = number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'integer' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.number().int()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = integer(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): IntegerFieldBuilder<TS, NewMods> {\n return new IntegerFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new IntegerFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: IntegerFieldBuilder<TS, Mods>): IntegerFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: IntegerFieldBuilder<TS, Mods>): IntegerFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: IntegerFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): IntegerFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum value.\n */\n min(\n this: IntegerFieldBuilder<TS, Mods>,\n n: number,\n ): IntegerFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum value.\n */\n max(\n this: IntegerFieldBuilder<TS, Mods>,\n n: number,\n ): IntegerFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== BooleanFieldBuilder ====================\n\nclass BooleanFieldBuilder<\n TS = boolean,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'boolean' as const\n\n get zodBase(): ZB {\n return this.applyModifiersToZod(zLib.boolean()) as ZB\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = integer(name, { mode: 'boolean' }) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): BooleanFieldBuilder<TS, NewMods> {\n return new BooleanFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new BooleanFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: BooleanFieldBuilder<TS, Mods>): BooleanFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: BooleanFieldBuilder<TS, Mods>): BooleanFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: BooleanFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): BooleanFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== TimestampFieldBuilder ====================\n\nclass TimestampFieldBuilder<\n TS = Date,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'timestamp' as const\n\n get zodBase(): ZB {\n return this.applyModifiersToZod(zLib.coerce.date()) as ZB\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = integer(name, { mode: 'timestamp_ms' }) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.defaultNow) {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))` as any)\n } else if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): TimestampFieldBuilder<TS, NewMods> {\n return new TimestampFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new TimestampFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: TimestampFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): TimestampFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets the DB DEFAULT clause to the current timestamp (epoch ms).\n * Generates `sql\\`(cast((julianday('now') - 2440587.5)*86400000 as integer))\\`` in Drizzle schema.\n */\n defaultNow(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Mods & { defaultNow: true }> {\n const newMods = { ...this.modifiers, defaultNow: true } as Mods & { defaultNow: true }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== JsonFieldBuilder ====================\n\n/**\n * JSON フィールドビルダー。\n *\n * `t.json(zodSchema)` 形式で Zod スキーマを渡すと runtime 検証が走る。\n * スキーマ省略時は `z.unknown()` で後方互換を維持する。\n */\nclass JsonFieldBuilder<\n T = unknown,\n TS = T,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'json' as const\n private readonly _zodSchema: z.ZodTypeAny | undefined\n\n constructor(modifiers?: Mods, zodSchema?: z.ZodTypeAny) {\n super(modifiers)\n this._zodSchema = zodSchema\n }\n\n get zodBase(): ZB {\n return this.applyModifiersToZod(this._zodSchema ?? zLib.unknown()) as ZB\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = text(name, { mode: 'json' }).$type<T>() as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): JsonFieldBuilder<T, TS, NewMods> {\n return new JsonFieldBuilder<T, TS, NewMods>(mods, this._zodSchema)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new JsonFieldBuilder<T, TS | undefined, Mods & { optional: true }>(\n newMods,\n this._zodSchema,\n )\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: JsonFieldBuilder<T, TS, Mods>): JsonFieldBuilder<T, TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: JsonFieldBuilder<T, TS, Mods>): JsonFieldBuilder<T, TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: JsonFieldBuilder<T, TS, Mods>,\n value: TS | (() => TS),\n ): JsonFieldBuilder<T, TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== RelationFieldBuilder ====================\n\nexport class RelationFieldBuilder<\n Target extends RelationTargetLike,\n FK extends string,\n Kind extends RelationKind,\n> {\n readonly kind = 'relation' as const\n readonly relationKind: Kind\n readonly target: Target | (() => Target)\n readonly foreignKey: FK\n readonly tsType!: never\n readonly modifiers = {} as const\n\n constructor(relationKind: Kind, target: Target | (() => Target), foreignKey: FK) {\n this.relationKind = relationKind\n this.target = target\n this.foreignKey = foreignKey\n }\n\n get zodBase(): z.ZodNever {\n return zLib.never()\n }\n\n drizzleColumn(name: string): never {\n throw new Error(`relation field '${name}' has no DB column`)\n }\n}\n\n// ==================== Factory ====================\n\n// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\nfunction jsonField<S extends z.ZodTypeAny>(schema: S): JsonFieldBuilder<z.infer<S>, z.infer<S>, {}>\n// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\nfunction jsonField<T = unknown>(): JsonFieldBuilder<T, T, {}>\n// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\nfunction jsonField<T = unknown>(schema?: z.ZodTypeAny): JsonFieldBuilder<T, T, {}> {\n return new JsonFieldBuilder<T, T, {}>(undefined, schema)\n}\n\n/**\n * Field DSL factory for building type-safe database fields.\n *\n * @example\n * const nameField = t.string().min(1).max(255)\n * const emailField = t.string().email()\n * const idField = t.uuid().primary()\n * const ageField = t.integer().min(0).max(150)\n * const createdAtField = t.timestamp().default(() => new Date())\n * const dataField = t.json<{ foo: string }>()\n * const dataField2 = t.json(z.object({ foo: z.string() })) // runtime validation\n */\nexport const t = {\n string(): StringFieldBuilder<\n string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new StringFieldBuilder<string, {}>()\n },\n\n uuid(): UuidFieldBuilder<\n string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new UuidFieldBuilder<string, {}>()\n },\n\n number(): NumberFieldBuilder<\n number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new NumberFieldBuilder<number, {}>()\n },\n\n integer(): IntegerFieldBuilder<\n number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new IntegerFieldBuilder<number, {}>()\n },\n\n boolean(): BooleanFieldBuilder<\n boolean,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new BooleanFieldBuilder<boolean, {}>()\n },\n\n timestamp(): TimestampFieldBuilder<\n Date,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new TimestampFieldBuilder<Date, {}>()\n },\n\n /**\n * JSON フィールド。\n *\n * `t.json(zodSchema)` 形式で Zod スキーマを渡すと runtime 検証が走る。\n * スキーマ省略時は `z.unknown()` で後方互換を維持する。\n *\n * `t.json(z.object({ foo: z.string() }))` でオブジェクト形状の runtime 検証が可能。\n *\n * @note codegen (`nanoka generate`) は `t.json(zodSchema)` を渡しても `$type<unknown>()` のまま出力する。\n * Drizzle 型が欲しい場合は生成後に手動で書き換えるか `as` を使うこと。\n */\n json: jsonField,\n\n hasMany<Target extends RelationTargetLike, FK extends string>(\n target: Target | (() => Target),\n options: { foreignKey: FK },\n ): RelationFieldBuilder<Target, FK, 'hasMany'> {\n return new RelationFieldBuilder('hasMany', target, options.foreignKey)\n },\n\n belongsTo<Target extends RelationTargetLike, FK extends string>(\n target: Target | (() => Target),\n options: { foreignKey: FK },\n ): RelationFieldBuilder<Target, FK, 'belongsTo'> {\n return new RelationFieldBuilder('belongsTo', target, options.foreignKey)\n },\n}\n"]}