@nanokajs/core 0.1.3 → 1.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 ADDED
@@ -0,0 +1,72 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@nanokajs/core` will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.0] — 2026-05-03
9
+
10
+ ### Stable API surface
11
+
12
+ The following public APIs are now considered stable. Breaking changes to these
13
+ will require a major version bump per SemVer.
14
+
15
+ **Field DSL**
16
+ - `t.string()`, `t.uuid()`, `t.integer()`, `t.number()`, `t.boolean()`, `t.timestamp()`, `t.json(zodSchema?)`
17
+ - Modifiers: `.primary()`, `.unique()`, `.optional()`, `.default(fn)`, `.min(n)`, `.max(n)`, `.email()`
18
+ - Policies: `.serverOnly()`, `.writeOnly()`, `.readOnly()`
19
+
20
+ **Model API**
21
+ - `defineModel(name, fields)`, `app.model(name, fields)`
22
+ - Schema derivation: `Model.schema(opts?)`, `Model.inputSchema('create' | 'update', opts?)`, `Model.outputSchema(opts?)`
23
+ - Validator: `Model.validator(target, opts | preset, hook?)` — presets: `'create'`, `'update'`
24
+ - Response shaping: `Model.toResponse(row)`
25
+ - Field accessor (typo-safe): `Model.schema({ pick: f => [f.fieldName] })`, `{ omit: f => [f.fieldName] }`
26
+ - CRUD: `Model.findMany({ limit, offset?, orderBy? })` (`limit` required), `Model.findOne`, `Model.create`, `Model.update`, `Model.delete`
27
+ - Escape hatch: `app.db` (raw Drizzle), `app.batch(...)` (D1 batch)
28
+
29
+ **Adapter**
30
+ - `d1Adapter(env.DB)`, `Adapter` interface
31
+
32
+ **OpenAPI seed**
33
+ - `Model.toOpenAPIComponent()`, `Model.toOpenAPISchema(usage)`
34
+
35
+ **Router**
36
+ - `nanoka<E extends Env = BlankEnv>(adapter)` (Hono-compatible)
37
+
38
+ **CLI**
39
+ - `nanoka generate` (model → Drizzle schema codegen)
40
+
41
+ **Config**
42
+ - `defineConfig` from `@nanokajs/core/config`
43
+
44
+ ### Added
45
+
46
+ - Field policies (`serverOnly`, `writeOnly`, `readOnly`) for API boundary control — Phase 2A / M1
47
+ - Purpose-specific schemas: `Model.inputSchema('create' | 'update')`, `Model.outputSchema()` — M1
48
+ - Validator presets: `Model.validator('json', 'create')`, `Model.validator('json', 'update')` — M1
49
+ - `Model.toResponse(row)` for explicit response shaping — M1
50
+ - `t.json(zodSchema)` runtime validation via Zod — M1
51
+ - Field accessor API (`{ pick: f => [...] }`) for typo-safe schema options — M2
52
+ - Zod 4 support: `peerDependencies.zod: ^3.23.0 || ^4.0.0` — M2
53
+ - Precise create/update input types: `CreateInput<Fields>` reflects `readOnly` / `default` / `optional` / `primary` — M2
54
+ - OpenAPI component generation per model: `Model.toOpenAPIComponent()` — M3
55
+
56
+ ### Changed
57
+
58
+ - `peerDependencies.zod` widened from `^3.23.0` to `^3.23.0 || ^4.0.0` (not a breaking change for v3 users)
59
+ - `Nanoka` is now `Nanoka<E extends Env = BlankEnv> extends Hono<E>` (not a breaking change due to default)
60
+
61
+ ### Notes
62
+
63
+ - **OpenAPI seed scope**: `toOpenAPIComponent()` / `toOpenAPISchema()` generate documentation /
64
+ component seed output derived from a representative subset of Zod types. They are not intended
65
+ as the enforcement source for API gateways or client-side validators. The runtime source of truth
66
+ for validation remains the Zod schema returned by `inputSchema()` / `outputSchema()`.
67
+ - **Not in 1.0.0** (planned for 1.x): relations (`hasMany` / `belongsTo`), Turso / libSQL adapter,
68
+ `create-nanoka-app` scaffolder, route-level OpenAPI + Swagger UI, VSCode extension.
69
+
70
+ ## [0.1.x] — pre-1.0
71
+
72
+ Pre-1.0 development. See [git history](https://github.com/nanokajs/nanoka/commits/main) for details.
package/README.md CHANGED
@@ -17,14 +17,31 @@ Targets **Cloudflare Workers + D1 (SQLite)** as first-class. Hono-compatible rou
17
17
 
18
18
  ## Status
19
19
 
20
- Phase 1 (MVP). Experimental. Expect breaking changes until v1.0.
20
+ **Stable (1.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 — is stable under SemVer.
21
+
22
+ ## Stable API surface (1.0)
23
+
24
+ The following APIs are stable. Breaking changes require a major version bump.
25
+
26
+ - **Field DSL**: `t.string()` / `t.uuid()` / `t.integer()` / `t.number()` / `t.boolean()` / `t.timestamp()` / `t.json(zodSchema?)`
27
+ - **Field modifiers**: `.primary()` / `.unique()` / `.optional()` / `.default(fn)` / `.min(n)` / `.max(n)` / `.email()`
28
+ - **Field policies**: `.serverOnly()` / `.writeOnly()` / `.readOnly()`
29
+ - **Schema derivation**: `Model.schema(opts?)` / `Model.inputSchema('create' | 'update', opts?)` / `Model.outputSchema(opts?)`
30
+ - **Validator**: `Model.validator(target, opts | preset, hook?)` — presets: `'create'`, `'update'`
31
+ - **Response shaping**: `Model.toResponse(row)`
32
+ - **Field accessor** (typo-safe): `Model.schema({ pick: f => [f.fieldName] })`
33
+ - **CRUD**: `Model.findMany({ limit, offset?, orderBy? })` / `Model.findOne` / `Model.create` / `Model.update` / `Model.delete`
34
+ - **Escape hatch**: `app.db` (raw Drizzle) / `app.batch(...)` (D1 batch)
35
+ - **OpenAPI seed**: `Model.toOpenAPIComponent()` / `Model.toOpenAPISchema(usage)`
36
+ - **Router**: `nanoka<E extends Env = BlankEnv>(adapter)`
37
+ - **Adapter**: `d1Adapter(env.DB)` / `Adapter` interface
21
38
 
22
39
  ## Install
23
40
 
24
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:
25
42
 
26
43
  ```bash
27
- pnpm add @nanokajs/core drizzle-orm zod@^3.23.0
44
+ pnpm add @nanokajs/core drizzle-orm zod
28
45
  pnpm add -D typescript drizzle-kit @cloudflare/workers-types
29
46
  ```
30
47
 
@@ -43,7 +60,7 @@ Without `types`, you would have to `import { D1Database, Request, ... } from '@c
43
60
 
44
61
  After this, the [Minimal example](#minimal-example-model--1-route) below works as written.
45
62
 
46
- > **Zod 4 is not yet supported.** Zod 4 reorders the `ZodType` generics, which collapses Nanoka's field type inference (`RowType`, `CreateInput`) to `never`. Pin `zod@^3.23.0` until Phase 2 ships Zod 4 support. Without the pin, `pnpm add zod` will install the latest 4.x and `User.create({...})` will fail to type-check.
63
+ Zod 3 and 4 are both supported (`peerDependencies.zod: ^3.23.0 || ^4.0.0`).
47
64
 
48
65
  `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.
49
66
 
@@ -52,13 +69,13 @@ After this, the [Minimal example](#minimal-example-model--1-route) below works a
52
69
  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:
53
70
 
54
71
  ```bash
55
- pnpm add @nanokajs/core hono drizzle-orm zod@^3.23.0
72
+ pnpm add @nanokajs/core hono drizzle-orm zod
56
73
  pnpm add -D typescript drizzle-kit @cloudflare/workers-types
57
74
  ```
58
75
 
59
76
  The tsconfig `types` entry above still applies if you're targeting Cloudflare Workers.
60
77
 
61
- Peer dependency ranges: `hono ^4.0.0`, `drizzle-orm ^0.45.0`, `zod ^3.23.0`, `@cloudflare/workers-types ^4.20240925.0`.
78
+ Peer dependency ranges: `hono ^4.0.0`, `drizzle-orm ^0.45.0`, `zod ^3.23.0 || ^4.0.0`, `@cloudflare/workers-types ^4.20240925.0`.
62
79
 
63
80
  ## Quickstart
64
81
 
@@ -154,12 +171,13 @@ export default {
154
171
  User.validator('json', { omit: ['id', 'passwordHash', 'createdAt'] }),
155
172
  async (c) => {
156
173
  const body = c.req.valid('json')
157
- const user = await User.create({
174
+ const created = await User.create({
158
175
  ...body,
159
176
  id: crypto.randomUUID(),
160
- passwordHash: 'hashed_value_here', // use bcrypt, argon2, etc. in production
177
+ passwordHash: 'hashed_value_here', // SECURITY: NEVER use this placeholder; replace with a bcrypt/argon2 hash
161
178
  createdAt: new Date(),
162
179
  })
180
+ const user = User.schema({ omit: ['passwordHash'] }).parse(created)
163
181
  return c.json(user, 201)
164
182
  }
165
183
  )
@@ -172,7 +190,7 @@ export default {
172
190
  ### Full working example
173
191
 
174
192
  Complete CRUD with curl tests, deployment steps, and troubleshooting:
175
- [examples/basic/README.md](../../examples/basic/README.md)
193
+ [examples/basic/README.md](https://github.com/nanokajs/nanoka/blob/main/examples/basic/README.md)
176
194
 
177
195
  ## How it fits with drizzle-kit and wrangler
178
196
 
@@ -377,19 +395,25 @@ app.onError((err, c) => {
377
395
 
378
396
  Note: this handler will not be called for validation failures originating from `User.validator()`. Use Option 1 for those.
379
397
 
380
- ## Phase 1 scope: what is NOT included
398
+ ## OpenAPI seed scope
399
+
400
+ `Model.toOpenAPIComponent()` and `Model.toOpenAPISchema(usage)` generate **documentation / component seed** output from a representative subset of Zod types. They are not intended as the enforcement source for API gateways, client-side validators, or route-level request validators.
401
+
402
+ The runtime source of truth for validation remains the Zod schema returned by `inputSchema()` / `outputSchema()`.
403
+
404
+ Route-level OpenAPI integration and Swagger UI are planned for a future 1.x release.
405
+
406
+ ## Roadmap (1.x)
381
407
 
382
- Nanoka Phase 1 is intentionally minimal. These features are Phase 2 or later:
408
+ The following features are planned for 1.x releases and are **not** required for 1.0.0:
383
409
 
384
- - **Relations** (`hasMany()`, `belongsTo()`, lazy loading) — Phase 2. Use raw Drizzle for joins.
385
- - **Field accessor API** (`User.schema({ pick: f => [f.name, f.email] })`, `User.where(f => eq(f.email, x))`) — Phase 2. Phase 1 uses string arrays and object-form `where`. When Phase 2 lands, the `f` object will be `as const`, with zero runtime cost.
386
- - **Zod 4 support** — Phase 2. Zod 4 changed `ZodType<Output, Def, Input>` (v3) to `ZodType<Output, Input, Internals>` (v4); Nanoka's field type derivation depends on the v3 generic order, so installing Zod 4 collapses `InferFieldType` to `never`. Pin `zod@^3.23.0` for now.
387
- - **OpenAPI generation** — Phase 2 or 3.
388
- - **Turso / libSQL adapters** — Phase 2. Nanoka is designed adapter-first; additional adapters will follow.
389
- - **CLI scaffolder** (`create-nanoka-app`) — Phase 3.
390
- - **Auth, full-stack React, complex query DSL** — explicitly out of scope at every phase.
410
+ - **Relations**: `t.hasMany()` / `t.belongsTo()` with cascade and N+1 query support
411
+ - **Turso / libSQL adapter**: alternative to D1 via the existing `Adapter` interface
412
+ - **`create-nanoka-app`**: scaffolding CLI (`npx create-nanoka-app`)
413
+ - **Route-level OpenAPI + Swagger UI**: full Hono route collection and spec generation
414
+ - **VSCode extension**: schema autocomplete and diagnostics
391
415
 
392
- For relations and complex joins in Phase 1, use raw Drizzle via `app.db`. The escape hatch is always open.
416
+ For complex joins in the meantime, use raw Drizzle via `app.db`. The escape hatch is always open.
393
417
 
394
418
  ## Workspace structure (for contributors)
395
419
 
@@ -439,7 +463,7 @@ Before running `pnpm publish`:
439
463
  - `tsconfig.json`, `vitest.config.ts`, `tsup.config.ts`, `scripts/`
440
464
  - `node_modules/`
441
465
 
442
- Note: `../../examples/basic` is a relative link in this README. It resolves correctly on GitHub but not on the npm registry. The link is kept for GitHub usability.
466
+ Note: External links use absolute GitHub URLs (https://github.com/nanokajs/nanoka/...) so they resolve on both GitHub and the npm registry page.
443
467
 
444
468
  2. **Verify publish access**
445
469
  ```bash
@@ -116,6 +116,18 @@ var StringFieldBuilder = class _StringFieldBuilder extends BaseFieldBuilder {
116
116
  const newMods = { ...this.modifiers, max: n };
117
117
  return this.cloneWithModifiers(newMods);
118
118
  }
119
+ serverOnly() {
120
+ const newMods = { ...this.modifiers, policy: "serverOnly" };
121
+ return this.cloneWithModifiers(newMods);
122
+ }
123
+ writeOnly() {
124
+ const newMods = { ...this.modifiers, policy: "writeOnly" };
125
+ return this.cloneWithModifiers(newMods);
126
+ }
127
+ readOnly() {
128
+ const newMods = { ...this.modifiers, policy: "readOnly" };
129
+ return this.cloneWithModifiers(newMods);
130
+ }
119
131
  };
120
132
  var UuidFieldBuilder = class _UuidFieldBuilder extends BaseFieldBuilder {
121
133
  kind = "uuid";
@@ -195,6 +207,18 @@ var UuidFieldBuilder = class _UuidFieldBuilder extends BaseFieldBuilder {
195
207
  const newMods = { ...this.modifiers, max: n };
196
208
  return this.cloneWithModifiers(newMods);
197
209
  }
210
+ serverOnly() {
211
+ const newMods = { ...this.modifiers, policy: "serverOnly" };
212
+ return this.cloneWithModifiers(newMods);
213
+ }
214
+ writeOnly() {
215
+ const newMods = { ...this.modifiers, policy: "writeOnly" };
216
+ return this.cloneWithModifiers(newMods);
217
+ }
218
+ readOnly() {
219
+ const newMods = { ...this.modifiers, policy: "readOnly" };
220
+ return this.cloneWithModifiers(newMods);
221
+ }
198
222
  };
199
223
  var NumberFieldBuilder = class _NumberFieldBuilder extends BaseFieldBuilder {
200
224
  kind = "number";
@@ -274,6 +298,18 @@ var NumberFieldBuilder = class _NumberFieldBuilder extends BaseFieldBuilder {
274
298
  const newMods = { ...this.modifiers, max: n };
275
299
  return this.cloneWithModifiers(newMods);
276
300
  }
301
+ serverOnly() {
302
+ const newMods = { ...this.modifiers, policy: "serverOnly" };
303
+ return this.cloneWithModifiers(newMods);
304
+ }
305
+ writeOnly() {
306
+ const newMods = { ...this.modifiers, policy: "writeOnly" };
307
+ return this.cloneWithModifiers(newMods);
308
+ }
309
+ readOnly() {
310
+ const newMods = { ...this.modifiers, policy: "readOnly" };
311
+ return this.cloneWithModifiers(newMods);
312
+ }
277
313
  };
278
314
  var IntegerFieldBuilder = class _IntegerFieldBuilder extends BaseFieldBuilder {
279
315
  kind = "integer";
@@ -353,6 +389,18 @@ var IntegerFieldBuilder = class _IntegerFieldBuilder extends BaseFieldBuilder {
353
389
  const newMods = { ...this.modifiers, max: n };
354
390
  return this.cloneWithModifiers(newMods);
355
391
  }
392
+ serverOnly() {
393
+ const newMods = { ...this.modifiers, policy: "serverOnly" };
394
+ return this.cloneWithModifiers(newMods);
395
+ }
396
+ writeOnly() {
397
+ const newMods = { ...this.modifiers, policy: "writeOnly" };
398
+ return this.cloneWithModifiers(newMods);
399
+ }
400
+ readOnly() {
401
+ const newMods = { ...this.modifiers, policy: "readOnly" };
402
+ return this.cloneWithModifiers(newMods);
403
+ }
356
404
  };
357
405
  var BooleanFieldBuilder = class _BooleanFieldBuilder extends BaseFieldBuilder {
358
406
  kind = "boolean";
@@ -411,6 +459,18 @@ var BooleanFieldBuilder = class _BooleanFieldBuilder extends BaseFieldBuilder {
411
459
  const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value };
412
460
  return this.cloneWithModifiers(newMods);
413
461
  }
462
+ serverOnly() {
463
+ const newMods = { ...this.modifiers, policy: "serverOnly" };
464
+ return this.cloneWithModifiers(newMods);
465
+ }
466
+ writeOnly() {
467
+ const newMods = { ...this.modifiers, policy: "writeOnly" };
468
+ return this.cloneWithModifiers(newMods);
469
+ }
470
+ readOnly() {
471
+ const newMods = { ...this.modifiers, policy: "readOnly" };
472
+ return this.cloneWithModifiers(newMods);
473
+ }
414
474
  };
415
475
  var TimestampFieldBuilder = class _TimestampFieldBuilder extends BaseFieldBuilder {
416
476
  kind = "timestamp";
@@ -469,11 +529,28 @@ var TimestampFieldBuilder = class _TimestampFieldBuilder extends BaseFieldBuilde
469
529
  const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value };
470
530
  return this.cloneWithModifiers(newMods);
471
531
  }
532
+ serverOnly() {
533
+ const newMods = { ...this.modifiers, policy: "serverOnly" };
534
+ return this.cloneWithModifiers(newMods);
535
+ }
536
+ writeOnly() {
537
+ const newMods = { ...this.modifiers, policy: "writeOnly" };
538
+ return this.cloneWithModifiers(newMods);
539
+ }
540
+ readOnly() {
541
+ const newMods = { ...this.modifiers, policy: "readOnly" };
542
+ return this.cloneWithModifiers(newMods);
543
+ }
472
544
  };
473
545
  var JsonFieldBuilder = class _JsonFieldBuilder extends BaseFieldBuilder {
474
546
  kind = "json";
547
+ _zodSchema;
548
+ constructor(modifiers, zodSchema) {
549
+ super(modifiers);
550
+ this._zodSchema = zodSchema;
551
+ }
475
552
  get zodBase() {
476
- return this.applyModifiersToZod(z.unknown());
553
+ return this.applyModifiersToZod(this._zodSchema ?? z.unknown());
477
554
  }
478
555
  drizzleColumn(name) {
479
556
  let col = text(name, { mode: "json" }).$type();
@@ -497,14 +574,17 @@ var JsonFieldBuilder = class _JsonFieldBuilder extends BaseFieldBuilder {
497
574
  return col;
498
575
  }
499
576
  cloneWithModifiers(mods) {
500
- return new _JsonFieldBuilder(mods);
577
+ return new _JsonFieldBuilder(mods, this._zodSchema);
501
578
  }
502
579
  /**
503
580
  * Marks this field as optional (allows undefined / null).
504
581
  */
505
582
  optional() {
506
583
  const newMods = { ...this.modifiers, optional: true };
507
- return new _JsonFieldBuilder(newMods);
584
+ return new _JsonFieldBuilder(
585
+ newMods,
586
+ this._zodSchema
587
+ );
508
588
  }
509
589
  /**
510
590
  * Marks this field as the primary key of its table.
@@ -527,7 +607,22 @@ var JsonFieldBuilder = class _JsonFieldBuilder extends BaseFieldBuilder {
527
607
  const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value };
528
608
  return this.cloneWithModifiers(newMods);
529
609
  }
610
+ serverOnly() {
611
+ const newMods = { ...this.modifiers, policy: "serverOnly" };
612
+ return this.cloneWithModifiers(newMods);
613
+ }
614
+ writeOnly() {
615
+ const newMods = { ...this.modifiers, policy: "writeOnly" };
616
+ return this.cloneWithModifiers(newMods);
617
+ }
618
+ readOnly() {
619
+ const newMods = { ...this.modifiers, policy: "readOnly" };
620
+ return this.cloneWithModifiers(newMods);
621
+ }
530
622
  };
623
+ function jsonField(schema) {
624
+ return new JsonFieldBuilder(void 0, schema);
625
+ }
531
626
  var t = {
532
627
  string() {
533
628
  return new StringFieldBuilder();
@@ -548,24 +643,19 @@ var t = {
548
643
  return new TimestampFieldBuilder();
549
644
  },
550
645
  /**
551
- * JSON フィールド。任意の JSON 値を受け入れる(Zod 内部表現は `z.unknown()`)。
646
+ * JSON フィールド。
552
647
  *
553
- * ⚠️ セキュリティ警告:
554
- * このフィールドの zod ベースは `z.unknown()` のため、型パラメータ `T` で
555
- * 指定した制約は **コンパイル時のみ** 適用され、validator() 経由でも
556
- * runtime バリデーションは行われません。API 入力として晒す場合は:
557
- * - `model.validator(target, { omit: ['<json field name>'] })` で除外する、または
558
- * - ハンドラ側で別途 Zod スキーマを使って手動検証する、
559
- * のいずれかを必ず実施してください。型パラメータが `unknown` 以外の値を
560
- * runtime で保証することはありません。
648
+ * `t.json(zodSchema)` 形式で Zod スキーマを渡すと runtime 検証が走る。
649
+ * スキーマ省略時は `z.unknown()` で後方互換を維持する。
561
650
  *
562
- * Phase 2 以降で `t.json(zodSchema)` 形式の引数追加を検討中。
651
+ * `t.json(z.object({ foo: z.string() }))` でオブジェクト形状の runtime 検証が可能。
652
+ *
653
+ * @note codegen (`nanoka generate`) は `t.json(zodSchema)` を渡しても `$type<unknown>()` のまま出力する。
654
+ * Drizzle 型が欲しい場合は生成後に手動で書き換えるか `as` を使うこと。
563
655
  */
564
- json() {
565
- return new JsonFieldBuilder();
566
- }
656
+ json: jsonField
567
657
  };
568
658
 
569
659
  export { t };
570
- //# sourceMappingURL=chunk-F5OBRXXY.js.map
571
- //# sourceMappingURL=chunk-F5OBRXXY.js.map
660
+ //# sourceMappingURL=chunk-UYXRKFAR.js.map
661
+ //# sourceMappingURL=chunk-UYXRKFAR.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-UYXRKFAR.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\n if (this.modifiers.optional) {\n schema = schema.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 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 } 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 (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.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 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// ==================== 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"]}
package/dist/cli.js CHANGED
@@ -106,15 +106,14 @@ function generateDrizzleSchema(models) {
106
106
  const tableContent = fieldsStr ? `{
107
107
  ${fieldsStr}
108
108
  }` : "{}";
109
- lines.push(
110
- `export const ${model.name} = sqliteTable('${model.name}', ${tableContent})`
111
- );
109
+ lines.push(`export const ${model.name} = sqliteTable('${model.name}', ${tableContent})`);
112
110
  lines.push("");
113
111
  }
114
112
  while (lines.length > 0 && lines[lines.length - 1] === "") {
115
113
  lines.pop();
116
114
  }
117
- return lines.join("\n") + "\n";
115
+ return `${lines.join("\n")}
116
+ `;
118
117
  }
119
118
  async function loadConfig(configPath) {
120
119
  const jiti = createJiti(import.meta.url, { interopDefault: true });
@@ -143,10 +142,12 @@ async function main(args) {
143
142
  let i = 1;
144
143
  while (i < args.length) {
145
144
  if (args[i] === "--config" && i + 1 < args.length) {
146
- configPath = args[i + 1];
145
+ const next = args[i + 1];
146
+ if (next !== void 0) configPath = next;
147
147
  i += 2;
148
148
  } else if (args[i] === "--output" && i + 1 < args.length) {
149
- outputPath = args[i + 1];
149
+ const next = args[i + 1];
150
+ if (next !== void 0) outputPath = next;
150
151
  i += 2;
151
152
  } else {
152
153
  console.error(`Error: unknown option '${args[i]}'`);