@nanokajs/core 0.1.4 → 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 +72 -0
- package/README.md +38 -20
- package/dist/{chunk-F5OBRXXY.js → chunk-UYXRKFAR.js} +108 -18
- package/dist/chunk-UYXRKFAR.js.map +1 -0
- package/dist/cli.js +6 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.js +1 -1
- package/dist/{factories-CDsk1Hdt.d.ts → factories-Cmvx0495.d.ts} +89 -22
- package/dist/index.d.ts +206 -24
- package/dist/index.js +338 -39
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
- package/dist/chunk-F5OBRXXY.js.map +0 -1
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,16 +17,31 @@ Targets **Cloudflare Workers + D1 (SQLite)** as first-class. Hono-compatible rou
|
|
|
17
17
|
|
|
18
18
|
## Status
|
|
19
19
|
|
|
20
|
-
|
|
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
21
|
|
|
22
|
-
|
|
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
|
|
23
38
|
|
|
24
39
|
## Install
|
|
25
40
|
|
|
26
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:
|
|
27
42
|
|
|
28
43
|
```bash
|
|
29
|
-
pnpm add @nanokajs/core drizzle-orm zod
|
|
44
|
+
pnpm add @nanokajs/core drizzle-orm zod
|
|
30
45
|
pnpm add -D typescript drizzle-kit @cloudflare/workers-types
|
|
31
46
|
```
|
|
32
47
|
|
|
@@ -45,7 +60,7 @@ Without `types`, you would have to `import { D1Database, Request, ... } from '@c
|
|
|
45
60
|
|
|
46
61
|
After this, the [Minimal example](#minimal-example-model--1-route) below works as written.
|
|
47
62
|
|
|
48
|
-
|
|
63
|
+
Zod 3 and 4 are both supported (`peerDependencies.zod: ^3.23.0 || ^4.0.0`).
|
|
49
64
|
|
|
50
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.
|
|
51
66
|
|
|
@@ -54,13 +69,13 @@ After this, the [Minimal example](#minimal-example-model--1-route) below works a
|
|
|
54
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:
|
|
55
70
|
|
|
56
71
|
```bash
|
|
57
|
-
pnpm add @nanokajs/core hono drizzle-orm zod
|
|
72
|
+
pnpm add @nanokajs/core hono drizzle-orm zod
|
|
58
73
|
pnpm add -D typescript drizzle-kit @cloudflare/workers-types
|
|
59
74
|
```
|
|
60
75
|
|
|
61
76
|
The tsconfig `types` entry above still applies if you're targeting Cloudflare Workers.
|
|
62
77
|
|
|
63
|
-
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`.
|
|
64
79
|
|
|
65
80
|
## Quickstart
|
|
66
81
|
|
|
@@ -159,7 +174,7 @@ export default {
|
|
|
159
174
|
const created = await User.create({
|
|
160
175
|
...body,
|
|
161
176
|
id: crypto.randomUUID(),
|
|
162
|
-
passwordHash: 'hashed_value_here', // use
|
|
177
|
+
passwordHash: 'hashed_value_here', // SECURITY: NEVER use this placeholder; replace with a bcrypt/argon2 hash
|
|
163
178
|
createdAt: new Date(),
|
|
164
179
|
})
|
|
165
180
|
const user = User.schema({ omit: ['passwordHash'] }).parse(created)
|
|
@@ -380,22 +395,25 @@ app.onError((err, c) => {
|
|
|
380
395
|
|
|
381
396
|
Note: this handler will not be called for validation failures originating from `User.validator()`. Use Option 1 for those.
|
|
382
397
|
|
|
383
|
-
##
|
|
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)
|
|
384
407
|
|
|
385
|
-
|
|
408
|
+
The following features are planned for 1.x releases and are **not** required for 1.0.0:
|
|
386
409
|
|
|
387
|
-
- **
|
|
388
|
-
- **
|
|
389
|
-
-
|
|
390
|
-
- **
|
|
391
|
-
- **
|
|
392
|
-
- **OpenAPI component generation** — Phase 2 seed. Route-level OpenAPI, route auto-discovery, and Swagger UI are Phase 3.
|
|
393
|
-
- **Relations** (`hasMany()`, `belongsTo()`, lazy loading) — Phase 2 later or Phase 3. Use raw Drizzle for joins.
|
|
394
|
-
- **Turso / libSQL adapters** — Phase 2 later or Phase 3. Nanoka is designed adapter-first; additional adapters will follow.
|
|
395
|
-
- **CLI scaffolder** (`create-nanoka-app`) — Phase 3.
|
|
396
|
-
- **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
|
|
397
415
|
|
|
398
|
-
For
|
|
416
|
+
For complex joins in the meantime, use raw Drizzle via `app.db`. The escape hatch is always open.
|
|
399
417
|
|
|
400
418
|
## Workspace structure (for contributors)
|
|
401
419
|
|
|
@@ -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(
|
|
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
|
|
646
|
+
* JSON フィールド。
|
|
552
647
|
*
|
|
553
|
-
*
|
|
554
|
-
*
|
|
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
|
-
*
|
|
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-
|
|
571
|
-
//# sourceMappingURL=chunk-
|
|
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":";;;;;;AAiBO,IAAe,mBAAf,MAMP;AAAA,EACW,MAAA,GAAa,MAAA;AAAA,EAEb,SAAA;AAAA,EAET,YAAY,SAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,MAAA,CAAQ,SAAA,IAAa,EAAW,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBU,oBAAoB,UAAA,EAAwC;AACpE,IAAA,IAAI,MAAA,GAAS,UAAA;AAGb,IAAA,IAAI,IAAA,CAAK,UAAU,QAAA,EAAU;AAC3B,MAAA,MAAA,GAAS,OAAO,QAAA,EAAS;AAAA,IAC3B;AAGA,IAAA,IAAI,IAAA,CAAK,UAAU,UAAA,EAAY;AAC7B,MAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU,YAAA;AACpC,MAAA,MAAA,GAAS,MAAA,CAAO,QAAQ,YAAY,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;;;ACrDA,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAKI,gBAAA,CAA+B;AAAA,EAC9B,IAAA,GAAO,QAAA;AAAA,EAEhB,IAAI,OAAA,GAAc;AAChB,IAAA,IAAI,MAAA,GAAuBA,EAAK,MAAA,EAAO;AAEvC,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,KAAQ,MAAA,EAAW;AAEpC,MAAA,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,KAAQ,MAAA,EAAW;AAEpC,MAAA,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,OAAA,EAAS;AAErC,MAAA,MAAA,GAAU,OAAe,KAAA,EAAM;AAAA,IACjC;AAGA,IAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,cAAc,IAAA,EAAuC;AAEnD,IAAA,IAAI,GAAA,GAAM,KAAK,IAAI,CAAA;AAEnB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU;AAC5B,MAAA,GAAA,GAAM,IAAI,OAAA,EAAQ;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,OAAA,EAAS;AAC1B,MAAA,GAAA,GAAM,IAAI,UAAA,EAAW;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,IAAI,MAAA,EAAO;AAAA,IACnB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,UAAA,EAAY;AAC7B,MAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU,YAAA;AACpC,MAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AAEtC,QAAA,GAAA,GAAM,GAAA,CAAI,WAAW,YAAmB,CAAA;AAAA,MAC1C,CAAA,MAAO;AAEL,QAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,YAAmB,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,mBACR,IAAA,EACiC;AACjC,IAAA,OAAO,IAAI,oBAAgC,IAAI,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAEiE;AAC/D,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,UAAU,IAAA,EAAK;AACpD,IAAA,OAAO,IAAI,oBAA8D,OAAO,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAA8F;AAC5F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,SAAS,IAAA,EAAK;AACnD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA4F;AAC1F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,IAAA,EAAK;AAClD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAEE,KAAA,EACqD;AACrD,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,WAAW,UAAA,EAAY,IAAA,EAAM,cAAc,KAAA,EAAM;AAG3E,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAA8F;AAC5F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,OAAA,EAAiB;AAC9D,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAEE,CAAA,EACgD;AAChD,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA,EAAE;AAC5C,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAEE,CAAA,EACgD;AAChD,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA,EAAE;AAC5C,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,UAAA,GAE2E;AACzE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,YAAA,EAAsB;AAGnE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,SAAA,GAE0E;AACxE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,WAAA,EAAqB;AAGlE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,QAAA,GAEyE;AACvE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,UAAA,EAAoB;AAGjE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AACF,CAAA;AAIA,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAKI,gBAAA,CAA+B;AAAA,EAC9B,IAAA,GAAO,MAAA;AAAA,EAEhB,IAAI,OAAA,GAAc;AAChB,IAAA,IAAI,MAAA,GAAuBA,CAAA,CAAK,MAAA,EAAO,CAAE,IAAA,EAAK;AAE9C,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,KAAQ,MAAA,EAAW;AAEpC,MAAA,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,KAAQ,MAAA,EAAW;AAEpC,MAAA,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,IACjD;AAGA,IAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,cAAc,IAAA,EAAuC;AAEnD,IAAA,IAAI,GAAA,GAAM,KAAK,IAAI,CAAA;AAEnB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU;AAC5B,MAAA,GAAA,GAAM,IAAI,OAAA,EAAQ;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,OAAA,EAAS;AAC1B,MAAA,GAAA,GAAM,IAAI,UAAA,EAAW;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,IAAI,MAAA,EAAO;AAAA,IACnB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,UAAA,EAAY;AAC7B,MAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU,YAAA;AACpC,MAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AAEtC,QAAA,GAAA,GAAM,GAAA,CAAI,WAAW,YAAmB,CAAA;AAAA,MAC1C,CAAA,MAAO;AAEL,QAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,YAAmB,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,mBACR,IAAA,EAC+B;AAC/B,IAAA,OAAO,IAAI,kBAA8B,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAE+D;AAC7D,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,UAAU,IAAA,EAAK;AACpD,IAAA,OAAO,IAAI,kBAA4D,OAAO,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAA0F;AACxF,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,SAAS,IAAA,EAAK;AACnD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAwF;AACtF,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,IAAA,EAAK;AAClD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAEE,KAAA,EACmD;AACnD,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,WAAW,UAAA,EAAY,IAAA,EAAM,cAAc,KAAA,EAAM;AAG3E,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAsC,CAAA,EAAyD;AAC7F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA,EAAE;AAC5C,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAsC,CAAA,EAAyD;AAC7F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA,EAAE;AAC5C,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,UAAA,GAEyE;AACvE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,YAAA,EAAsB;AAGnE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,SAAA,GAEwE;AACtE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,WAAA,EAAqB;AAGlE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,QAAA,GAEuE;AACrE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,UAAA,EAAoB;AAGjE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AACF,CAAA;AAIA,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAKI,gBAAA,CAA+B;AAAA,EAC9B,IAAA,GAAO,QAAA;AAAA,EAEhB,IAAI,OAAA,GAAc;AAChB,IAAA,IAAI,MAAA,GAAuBA,EAAK,MAAA,EAAO;AAEvC,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,KAAQ,MAAA,EAAW;AAEpC,MAAA,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,KAAQ,MAAA,EAAW;AAEpC,MAAA,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,IACjD;AAGA,IAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,cAAc,IAAA,EAAuC;AAEnD,IAAA,IAAI,GAAA,GAAM,KAAK,IAAI,CAAA;AAEnB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU;AAC5B,MAAA,GAAA,GAAM,IAAI,OAAA,EAAQ;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,OAAA,EAAS;AAC1B,MAAA,GAAA,GAAM,IAAI,UAAA,EAAW;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,IAAI,MAAA,EAAO;AAAA,IACnB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,UAAA,EAAY;AAC7B,MAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU,YAAA;AACpC,MAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AAEtC,QAAA,GAAA,GAAM,GAAA,CAAI,WAAW,YAAmB,CAAA;AAAA,MAC1C,CAAA,MAAO;AAEL,QAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,YAAmB,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,mBACR,IAAA,EACiC;AACjC,IAAA,OAAO,IAAI,oBAAgC,IAAI,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAEiE;AAC/D,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,UAAU,IAAA,EAAK;AACpD,IAAA,OAAO,IAAI,oBAA8D,OAAO,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAA8F;AAC5F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,SAAS,IAAA,EAAK;AACnD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA4F;AAC1F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,IAAA,EAAK;AAClD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAEE,KAAA,EACqD;AACrD,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,WAAW,UAAA,EAAY,IAAA,EAAM,cAAc,KAAA,EAAM;AAG3E,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAEE,CAAA,EACgD;AAChD,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA,EAAE;AAC5C,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAEE,CAAA,EACgD;AAChD,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA,EAAE;AAC5C,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,UAAA,GAE2E;AACzE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,YAAA,EAAsB;AAGnE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,SAAA,GAE0E;AACxE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,WAAA,EAAqB;AAGlE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,QAAA,GAEyE;AACvE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,UAAA,EAAoB;AAGjE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AACF,CAAA;AAIA,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAKI,gBAAA,CAA+B;AAAA,EAC9B,IAAA,GAAO,SAAA;AAAA,EAEhB,IAAI,OAAA,GAAc;AAChB,IAAA,IAAI,MAAA,GAAuBA,CAAA,CAAK,MAAA,EAAO,CAAE,GAAA,EAAI;AAE7C,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,KAAQ,MAAA,EAAW;AAEpC,MAAA,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,KAAQ,MAAA,EAAW;AAEpC,MAAA,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,IACjD;AAGA,IAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,cAAc,IAAA,EAAuC;AAEnD,IAAA,IAAI,GAAA,GAAM,QAAQ,IAAI,CAAA;AAEtB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU;AAC5B,MAAA,GAAA,GAAM,IAAI,OAAA,EAAQ;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,OAAA,EAAS;AAC1B,MAAA,GAAA,GAAM,IAAI,UAAA,EAAW;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,IAAI,MAAA,EAAO;AAAA,IACnB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,UAAA,EAAY;AAC7B,MAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU,YAAA;AACpC,MAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AAEtC,QAAA,GAAA,GAAM,GAAA,CAAI,WAAW,YAAmB,CAAA;AAAA,MAC1C,CAAA,MAAO;AAEL,QAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,YAAmB,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,mBACR,IAAA,EACkC;AAClC,IAAA,OAAO,IAAI,qBAAiC,IAAI,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAEkE;AAChE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,UAAU,IAAA,EAAK;AACpD,IAAA,OAAO,IAAI,qBAA+D,OAAO,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgG;AAC9F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,SAAS,IAAA,EAAK;AACnD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA8F;AAC5F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,IAAA,EAAK;AAClD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAEE,KAAA,EACsD;AACtD,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,WAAW,UAAA,EAAY,IAAA,EAAM,cAAc,KAAA,EAAM;AAG3E,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAEE,CAAA,EACiD;AACjD,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA,EAAE;AAC5C,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAEE,CAAA,EACiD;AACjD,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA,EAAE;AAC5C,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,UAAA,GAE4E;AAC1E,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,YAAA,EAAsB;AAGnE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,SAAA,GAE2E;AACzE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,WAAA,EAAqB;AAGlE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,QAAA,GAE0E;AACxE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,UAAA,EAAoB;AAGjE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AACF,CAAA;AAIA,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAKI,gBAAA,CAA+B;AAAA,EAC9B,IAAA,GAAO,SAAA;AAAA,EAEhB,IAAI,OAAA,GAAc;AAChB,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoBA,CAAA,CAAK,OAAA,EAAS,CAAA;AAAA,EAChD;AAAA,EAEA,cAAc,IAAA,EAAuC;AAEnD,IAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,IAAA,EAAM,WAAW,CAAA;AAE3C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU;AAC5B,MAAA,GAAA,GAAM,IAAI,OAAA,EAAQ;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,OAAA,EAAS;AAC1B,MAAA,GAAA,GAAM,IAAI,UAAA,EAAW;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,IAAI,MAAA,EAAO;AAAA,IACnB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,UAAA,EAAY;AAC7B,MAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU,YAAA;AACpC,MAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AAEtC,QAAA,GAAA,GAAM,GAAA,CAAI,WAAW,YAAmB,CAAA;AAAA,MAC1C,CAAA,MAAO;AAEL,QAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,YAAmB,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,mBACR,IAAA,EACkC;AAClC,IAAA,OAAO,IAAI,qBAAiC,IAAI,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAEkE;AAChE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,UAAU,IAAA,EAAK;AACpD,IAAA,OAAO,IAAI,qBAA+D,OAAO,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgG;AAC9F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,SAAS,IAAA,EAAK;AACnD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA8F;AAC5F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,IAAA,EAAK;AAClD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAEE,KAAA,EACsD;AACtD,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,WAAW,UAAA,EAAY,IAAA,EAAM,cAAc,KAAA,EAAM;AAG3E,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,UAAA,GAE4E;AAC1E,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,YAAA,EAAsB;AAGnE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,SAAA,GAE2E;AACzE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,WAAA,EAAqB;AAGlE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,QAAA,GAE0E;AACxE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,UAAA,EAAoB;AAGjE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AACF,CAAA;AAIA,IAAM,qBAAA,GAAN,MAAM,sBAAA,SAKI,gBAAA,CAA+B;AAAA,EAC9B,IAAA,GAAO,WAAA;AAAA,EAEhB,IAAI,OAAA,GAAc;AAChB,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoBA,CAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,EACpD;AAAA,EAEA,cAAc,IAAA,EAAuC;AAEnD,IAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,IAAA,EAAM,gBAAgB,CAAA;AAEhD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU;AAC5B,MAAA,GAAA,GAAM,IAAI,OAAA,EAAQ;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,OAAA,EAAS;AAC1B,MAAA,GAAA,GAAM,IAAI,UAAA,EAAW;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,IAAI,MAAA,EAAO;AAAA,IACnB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,UAAA,EAAY;AAC7B,MAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU,YAAA;AACpC,MAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AAEtC,QAAA,GAAA,GAAM,GAAA,CAAI,WAAW,YAAmB,CAAA;AAAA,MAC1C,CAAA,MAAO;AAEL,QAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,YAAmB,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,mBACR,IAAA,EACoC;AACpC,IAAA,OAAO,IAAI,uBAAmC,IAAI,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAEoE;AAClE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,UAAU,IAAA,EAAK;AACpD,IAAA,OAAO,IAAI,uBAAiE,OAAO,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAEuD;AACrD,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,SAAS,IAAA,EAAK;AACnD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAEsD;AACpD,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,IAAA,EAAK;AAClD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAEE,KAAA,EACwD;AACxD,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,WAAW,UAAA,EAAY,IAAA,EAAM,cAAc,KAAA,EAAM;AAG3E,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,UAAA,GAE8E;AAC5E,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,YAAA,EAAsB;AAGnE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,SAAA,GAE6E;AAC3E,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,WAAA,EAAqB;AAGlE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,QAAA,GAE4E;AAC1E,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,UAAA,EAAoB;AAGjE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AACF,CAAA;AAUA,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAMI,gBAAA,CAA+B;AAAA,EAC9B,IAAA,GAAO,MAAA;AAAA,EACC,UAAA;AAAA,EAEjB,WAAA,CAAY,WAAkB,SAAA,EAA0B;AACtD,IAAA,KAAA,CAAM,SAAS,CAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,EACpB;AAAA,EAEA,IAAI,OAAA,GAAc;AAChB,IAAA,OAAO,KAAK,mBAAA,CAAoB,IAAA,CAAK,UAAA,IAAcA,CAAA,CAAK,SAAS,CAAA;AAAA,EACnE;AAAA,EAEA,cAAc,IAAA,EAAuC;AAEnD,IAAA,IAAI,GAAA,GAAM,KAAK,IAAA,EAAM,EAAE,MAAM,MAAA,EAAQ,EAAE,KAAA,EAAS;AAEhD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU;AAC5B,MAAA,GAAA,GAAM,IAAI,OAAA,EAAQ;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,OAAA,EAAS;AAC1B,MAAA,GAAA,GAAM,IAAI,UAAA,EAAW;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,IAAI,MAAA,EAAO;AAAA,IACnB;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,UAAA,EAAY;AAC7B,MAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU,YAAA;AACpC,MAAA,IAAI,OAAO,iBAAiB,UAAA,EAAY;AAEtC,QAAA,GAAA,GAAM,GAAA,CAAI,WAAW,YAAmB,CAAA;AAAA,MAC1C,CAAA,MAAO;AAEL,QAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,YAAmB,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,mBACR,IAAA,EACkC;AAClC,IAAA,OAAO,IAAI,iBAAA,CAAiC,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAEkE;AAChE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,UAAU,IAAA,EAAK;AACpD,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,OAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgG;AAC9F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,SAAS,IAAA,EAAK;AACnD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA8F;AAC5F,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,IAAA,EAAK;AAClD,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAEE,KAAA,EACsD;AACtD,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,WAAW,UAAA,EAAY,IAAA,EAAM,cAAc,KAAA,EAAM;AAG3E,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,UAAA,GAE4E;AAC1E,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,YAAA,EAAsB;AAGnE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,SAAA,GAE2E;AACzE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,WAAA,EAAqB;AAGlE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,QAAA,GAE0E;AACxE,IAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,QAAQ,UAAA,EAAoB;AAGjE,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACxC;AACF,CAAA;AASA,SAAS,UAAuB,MAAA,EAAmD;AACjF,EAAA,OAAO,IAAI,gBAAA,CAA2B,MAAA,EAAW,MAAM,CAAA;AACzD;AAcO,IAAM,CAAA,GAAI;AAAA,EACf,MAAA,GAIE;AAEA,IAAA,OAAO,IAAI,kBAAA,EAA+B;AAAA,EAC5C,CAAA;AAAA,EAEA,IAAA,GAIE;AAEA,IAAA,OAAO,IAAI,gBAAA,EAA6B;AAAA,EAC1C,CAAA;AAAA,EAEA,MAAA,GAIE;AAEA,IAAA,OAAO,IAAI,kBAAA,EAA+B;AAAA,EAC5C,CAAA;AAAA,EAEA,OAAA,GAIE;AAEA,IAAA,OAAO,IAAI,mBAAA,EAAgC;AAAA,EAC7C,CAAA;AAAA,EAEA,OAAA,GAIE;AAEA,IAAA,OAAO,IAAI,mBAAA,EAAiC;AAAA,EAC9C,CAAA;AAAA,EAEA,SAAA,GAIE;AAEA,IAAA,OAAO,IAAI,qBAAA,EAAgC;AAAA,EAC7C,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,IAAA,EAAM;AACR","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
|
@@ -112,7 +112,8 @@ ${fieldsStr}
|
|
|
112
112
|
while (lines.length > 0 && lines[lines.length - 1] === "") {
|
|
113
113
|
lines.pop();
|
|
114
114
|
}
|
|
115
|
-
return lines.join("\n")
|
|
115
|
+
return `${lines.join("\n")}
|
|
116
|
+
`;
|
|
116
117
|
}
|
|
117
118
|
async function loadConfig(configPath) {
|
|
118
119
|
const jiti = createJiti(import.meta.url, { interopDefault: true });
|
|
@@ -141,10 +142,12 @@ async function main(args) {
|
|
|
141
142
|
let i = 1;
|
|
142
143
|
while (i < args.length) {
|
|
143
144
|
if (args[i] === "--config" && i + 1 < args.length) {
|
|
144
|
-
|
|
145
|
+
const next = args[i + 1];
|
|
146
|
+
if (next !== void 0) configPath = next;
|
|
145
147
|
i += 2;
|
|
146
148
|
} else if (args[i] === "--output" && i + 1 < args.length) {
|
|
147
|
-
|
|
149
|
+
const next = args[i + 1];
|
|
150
|
+
if (next !== void 0) outputPath = next;
|
|
148
151
|
i += 2;
|
|
149
152
|
} else {
|
|
150
153
|
console.error(`Error: unknown option '${args[i]}'`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/codegen/render-field.ts","../src/codegen/generate.ts","../src/cli/load-config.ts","../src/cli/index.ts"],"names":["fs"],"mappings":"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","file":"cli.js","sourcesContent":["import type { Field } from '../field'\n\nexport function renderField(fieldName: string, field: Field<any, any, any>): string {\n const lines: string[] = []\n\n const kind = field.kind\n let colType: string\n\n if (kind === 'string' || kind === 'uuid') {\n colType = `text('${fieldName}')`\n } else if (kind === 'number') {\n colType = `real('${fieldName}')`\n } else if (kind === 'integer') {\n colType = `integer('${fieldName}')`\n } else if (kind === 'boolean') {\n colType = `integer('${fieldName}', { mode: 'boolean' })`\n } else if (kind === 'timestamp') {\n colType = `integer('${fieldName}', { mode: 'timestamp_ms' })`\n } else if (kind === 'json') {\n colType = `text('${fieldName}', { mode: 'json' }).$type<unknown>()`\n } else {\n throw new Error(`Unknown field kind: ${kind}`)\n }\n\n let column = colType\n\n if (field.modifiers.primary) {\n column += '.primaryKey()'\n }\n\n if (!field.modifiers.optional) {\n column += '.notNull()'\n }\n\n if (field.modifiers.unique) {\n column += '.unique()'\n }\n\n if (field.modifiers.hasDefault) {\n const defaultValue = field.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n console.warn(\n `[nanoka] Warning: field \"${fieldName}\" has a function default. Default clause will be omitted. ` +\n `Use Drizzle's $defaultFn() or .onUpdateCurrent() in your custom schema if needed.`,\n )\n } else {\n const serializedValue = JSON.stringify(defaultValue)\n column += `.default(${serializedValue})`\n }\n }\n\n lines.push(` ${fieldName}: ${column},`)\n return lines.join('\\n')\n}\n","import { renderField } from './render-field'\nimport type { ModelDef } from './types'\n\nconst USED_DRIZZLE_IMPORTS = {\n text: false,\n integer: false,\n real: false,\n sqliteTable: false,\n}\n\nfunction detectImports(\n models: readonly ModelDef[],\n): Record<keyof typeof USED_DRIZZLE_IMPORTS, boolean> {\n const imports = { ...USED_DRIZZLE_IMPORTS }\n\n for (const model of models) {\n for (const field of Object.values(model.fields)) {\n const kind = field.kind\n\n if (kind === 'string' || kind === 'uuid' || kind === 'json') {\n imports.text = true\n } else if (kind === 'number') {\n imports.real = true\n } else if (kind === 'integer' || kind === 'boolean' || kind === 'timestamp') {\n imports.integer = true\n }\n }\n\n if (Object.values(model.fields).length > 0) {\n imports.sqliteTable = true\n }\n }\n\n return imports\n}\n\nfunction buildImportStatement(imports: Record<keyof typeof USED_DRIZZLE_IMPORTS, boolean>): string {\n const used: string[] = []\n\n if (imports.integer) used.push('integer')\n if (imports.real) used.push('real')\n if (imports.sqliteTable) used.push('sqliteTable')\n if (imports.text) used.push('text')\n\n if (used.length === 0) {\n return \"import { sqliteTable } from 'drizzle-orm/sqlite-core'\"\n }\n\n return `import { ${used.join(', ')} } from 'drizzle-orm/sqlite-core'`\n}\n\nexport function generateDrizzleSchema(models: readonly ModelDef[]): string {\n const imports = detectImports(models)\n const importStatement = buildImportStatement(imports)\n\n const lines: string[] = [\n '// AUTO-GENERATED by `nanoka generate`. DO NOT EDIT BY HAND.',\n '// To regenerate: `npx nanoka generate`',\n importStatement,\n '',\n ]\n\n for (const model of models) {\n const fieldLines: string[] = []\n\n for (const [fieldName, field] of Object.entries(model.fields)) {\n fieldLines.push(renderField(fieldName, field))\n }\n\n const fieldsStr = fieldLines.length > 0 ? fieldLines.join('\\n') : ''\n const tableContent = fieldsStr ? `{\\n${fieldsStr}\\n}` : '{}'\n\n lines.push(`export const ${model.name} = sqliteTable('${model.name}', ${tableContent})`)\n lines.push('')\n }\n\n // Remove trailing empty line and add single newline at EOF\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop()\n }\n\n return lines.join('\\n') + '\\n'\n}\n","import { createJiti } from 'jiti'\nimport type { NanokaConfig } from '../codegen/types'\n\nexport async function loadConfig(configPath: string): Promise<NanokaConfig> {\n const jiti = createJiti(import.meta.url, { interopDefault: true })\n const mod = await jiti.import<{ default: NanokaConfig }>(configPath)\n return mod.default\n}\n","import { promises as fs, realpathSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { generateDrizzleSchema } from '../codegen/generate'\nimport { loadConfig } from './load-config'\n\nasync function main(args: string[]): Promise<number> {\n try {\n if (args.length === 0 || args[0] === 'help' || args[0] === '--help' || args[0] === '-h') {\n console.log('Usage: nanoka generate [--config <path>] [--output <path>]')\n console.log('')\n console.log('Options:')\n console.log(' --config <path> Path to nanoka.config.ts (default: ./nanoka.config.ts)')\n console.log(' --output <path> Output file path (overrides config.output)')\n return 0\n }\n\n if (args[0] !== 'generate') {\n console.error(`Error: unknown command '${args[0]}'`)\n console.error('Usage: nanoka generate [--config <path>] [--output <path>]')\n return 1\n }\n\n let configPath: string = './nanoka.config.ts'\n let outputPath: string | undefined\n\n let i = 1\n while (i < args.length) {\n if (args[i] === '--config' && i + 1 < args.length) {\n configPath = args[i + 1]!\n i += 2\n } else if (args[i] === '--output' && i + 1 < args.length) {\n outputPath = args[i + 1]!\n i += 2\n } else {\n console.error(`Error: unknown option '${args[i]}'`)\n return 1\n }\n }\n\n const absoluteConfigPath = resolve(process.cwd(), configPath)\n const config = await loadConfig(absoluteConfigPath)\n\n const finalOutputPath = outputPath ?? config.output ?? './drizzle/schema.ts'\n const absoluteOutputPath = resolve(process.cwd(), finalOutputPath)\n\n const schema = generateDrizzleSchema(config.models)\n\n await fs.mkdir(dirname(absoluteOutputPath), { recursive: true })\n await fs.writeFile(absoluteOutputPath, schema, 'utf-8')\n\n console.log(`✓ Generated ${absoluteOutputPath}`)\n return 0\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`)\n } else {\n console.error('Unknown error:', error)\n }\n return 1\n }\n}\n\n// Entry-point detection: compare realpath-resolved argv[1] (which may be a\n// symlink under pnpm/npm bin shims) with this module's URL. A naive\n// `file://${argv[1]}` comparison fails whenever the package is installed via\n// pnpm because node_modules entries are symlinks into the .pnpm store while\n// import.meta.url is always the resolved path.\nfunction isCliEntrypoint(): boolean {\n const argv1 = process.argv[1]\n if (!argv1) return false\n try {\n return pathToFileURL(realpathSync(argv1)).href === import.meta.url\n } catch {\n return false\n }\n}\n\nif (isCliEntrypoint()) {\n main(process.argv.slice(2)).then((code) => {\n process.exit(code)\n })\n}\n\nexport { main }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/codegen/render-field.ts","../src/codegen/generate.ts","../src/cli/load-config.ts","../src/cli/index.ts"],"names":["fs"],"mappings":"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","file":"cli.js","sourcesContent":["import type { Field } from '../field'\n\nexport function renderField(fieldName: string, field: Field<any, any, any>): string {\n const lines: string[] = []\n\n const kind = field.kind\n let colType: string\n\n if (kind === 'string' || kind === 'uuid') {\n colType = `text('${fieldName}')`\n } else if (kind === 'number') {\n colType = `real('${fieldName}')`\n } else if (kind === 'integer') {\n colType = `integer('${fieldName}')`\n } else if (kind === 'boolean') {\n colType = `integer('${fieldName}', { mode: 'boolean' })`\n } else if (kind === 'timestamp') {\n colType = `integer('${fieldName}', { mode: 'timestamp_ms' })`\n } else if (kind === 'json') {\n colType = `text('${fieldName}', { mode: 'json' }).$type<unknown>()`\n } else {\n throw new Error(`Unknown field kind: ${kind}`)\n }\n\n let column = colType\n\n if (field.modifiers.primary) {\n column += '.primaryKey()'\n }\n\n if (!field.modifiers.optional) {\n column += '.notNull()'\n }\n\n if (field.modifiers.unique) {\n column += '.unique()'\n }\n\n if (field.modifiers.hasDefault) {\n const defaultValue = field.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n console.warn(\n `[nanoka] Warning: field \"${fieldName}\" has a function default. Default clause will be omitted. ` +\n `Use Drizzle's $defaultFn() or .onUpdateCurrent() in your custom schema if needed.`,\n )\n } else {\n const serializedValue = JSON.stringify(defaultValue)\n column += `.default(${serializedValue})`\n }\n }\n\n lines.push(` ${fieldName}: ${column},`)\n return lines.join('\\n')\n}\n","import { renderField } from './render-field'\nimport type { ModelDef } from './types'\n\nconst USED_DRIZZLE_IMPORTS = {\n text: false,\n integer: false,\n real: false,\n sqliteTable: false,\n}\n\nfunction detectImports(\n models: readonly ModelDef[],\n): Record<keyof typeof USED_DRIZZLE_IMPORTS, boolean> {\n const imports = { ...USED_DRIZZLE_IMPORTS }\n\n for (const model of models) {\n for (const field of Object.values(model.fields)) {\n const kind = field.kind\n\n if (kind === 'string' || kind === 'uuid' || kind === 'json') {\n imports.text = true\n } else if (kind === 'number') {\n imports.real = true\n } else if (kind === 'integer' || kind === 'boolean' || kind === 'timestamp') {\n imports.integer = true\n }\n }\n\n if (Object.values(model.fields).length > 0) {\n imports.sqliteTable = true\n }\n }\n\n return imports\n}\n\nfunction buildImportStatement(imports: Record<keyof typeof USED_DRIZZLE_IMPORTS, boolean>): string {\n const used: string[] = []\n\n if (imports.integer) used.push('integer')\n if (imports.real) used.push('real')\n if (imports.sqliteTable) used.push('sqliteTable')\n if (imports.text) used.push('text')\n\n if (used.length === 0) {\n return \"import { sqliteTable } from 'drizzle-orm/sqlite-core'\"\n }\n\n return `import { ${used.join(', ')} } from 'drizzle-orm/sqlite-core'`\n}\n\nexport function generateDrizzleSchema(models: readonly ModelDef[]): string {\n const imports = detectImports(models)\n const importStatement = buildImportStatement(imports)\n\n const lines: string[] = [\n '// AUTO-GENERATED by `nanoka generate`. DO NOT EDIT BY HAND.',\n '// To regenerate: `npx nanoka generate`',\n importStatement,\n '',\n ]\n\n for (const model of models) {\n const fieldLines: string[] = []\n\n for (const [fieldName, field] of Object.entries(model.fields)) {\n fieldLines.push(renderField(fieldName, field))\n }\n\n const fieldsStr = fieldLines.length > 0 ? fieldLines.join('\\n') : ''\n const tableContent = fieldsStr ? `{\\n${fieldsStr}\\n}` : '{}'\n\n lines.push(`export const ${model.name} = sqliteTable('${model.name}', ${tableContent})`)\n lines.push('')\n }\n\n // Remove trailing empty line and add single newline at EOF\n while (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop()\n }\n\n return `${lines.join('\\n')}\\n`\n}\n","import { createJiti } from 'jiti'\nimport type { NanokaConfig } from '../codegen/types'\n\nexport async function loadConfig(configPath: string): Promise<NanokaConfig> {\n const jiti = createJiti(import.meta.url, { interopDefault: true })\n const mod = await jiti.import<{ default: NanokaConfig }>(configPath)\n return mod.default\n}\n","import { promises as fs, realpathSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { generateDrizzleSchema } from '../codegen/generate'\nimport { loadConfig } from './load-config'\n\nasync function main(args: string[]): Promise<number> {\n try {\n if (args.length === 0 || args[0] === 'help' || args[0] === '--help' || args[0] === '-h') {\n console.log('Usage: nanoka generate [--config <path>] [--output <path>]')\n console.log('')\n console.log('Options:')\n console.log(' --config <path> Path to nanoka.config.ts (default: ./nanoka.config.ts)')\n console.log(' --output <path> Output file path (overrides config.output)')\n return 0\n }\n\n if (args[0] !== 'generate') {\n console.error(`Error: unknown command '${args[0]}'`)\n console.error('Usage: nanoka generate [--config <path>] [--output <path>]')\n return 1\n }\n\n let configPath: string = './nanoka.config.ts'\n let outputPath: string | undefined\n\n let i = 1\n while (i < args.length) {\n if (args[i] === '--config' && i + 1 < args.length) {\n const next = args[i + 1]\n if (next !== undefined) configPath = next\n i += 2\n } else if (args[i] === '--output' && i + 1 < args.length) {\n const next = args[i + 1]\n if (next !== undefined) outputPath = next\n i += 2\n } else {\n console.error(`Error: unknown option '${args[i]}'`)\n return 1\n }\n }\n\n const absoluteConfigPath = resolve(process.cwd(), configPath)\n const config = await loadConfig(absoluteConfigPath)\n\n const finalOutputPath = outputPath ?? config.output ?? './drizzle/schema.ts'\n const absoluteOutputPath = resolve(process.cwd(), finalOutputPath)\n\n const schema = generateDrizzleSchema(config.models)\n\n await fs.mkdir(dirname(absoluteOutputPath), { recursive: true })\n await fs.writeFile(absoluteOutputPath, schema, 'utf-8')\n\n console.log(`✓ Generated ${absoluteOutputPath}`)\n return 0\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`)\n } else {\n console.error('Unknown error:', error)\n }\n return 1\n }\n}\n\n// Entry-point detection: compare realpath-resolved argv[1] (which may be a\n// symlink under pnpm/npm bin shims) with this module's URL. A naive\n// `file://${argv[1]}` comparison fails whenever the package is installed via\n// pnpm because node_modules entries are symlinks into the .pnpm store while\n// import.meta.url is always the resolved path.\nfunction isCliEntrypoint(): boolean {\n const argv1 = process.argv[1]\n if (!argv1) return false\n try {\n return pathToFileURL(realpathSync(argv1)).href === import.meta.url\n } catch {\n return false\n }\n}\n\nif (isCliEntrypoint()) {\n main(process.argv.slice(2)).then((code) => {\n process.exit(code)\n })\n}\n\nexport { main }\n"]}
|
package/dist/config.d.ts
CHANGED