@nanokajs/core 1.8.1 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,46 @@ All notable changes to `@nanokajs/core` will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.12.1] — 2026-07-02
9
+
10
+ ### Fixed
11
+
12
+ - リリース CI 修正のための再公開。`1.10.0`〜`1.12.0` は publish ワークフローの `publish-core` ジョブが `examples/basic` の typecheck 前に `@nanokajs/auth` をビルドしておらず、`TS2307 (Cannot find module '@nanokajs/auth')` で publish が中断し npm 未公開だった。ライブラリ本体のコード変更はなく、`1.12.0` と機能的に同一。
13
+
14
+ ## [1.12.0] — 2026-06-06
15
+
16
+ ### Added
17
+
18
+ - `findOne` / `update` / `delete` の `idOrWhere` に Drizzle `SQL` 式を渡せるよう対称化(`findMany` / `findAll` の `where: SQL` と同等)。`Session.delete(inArray(Session.table.id, chunk))` のように D1 バインド上限(100)回避の `inArray` チャンク分割が Model API で書けるようになった。
19
+ - `Where` 値型に最小 `{ in: [...] }` 演算子を追加(`WhereValue<T>` 型として export)。`findMany` / `findAll` / `findOne` / `update` / `delete` 全 where 経路で一貫して使える。空配列 `{ in: [] }` は 0 行マッチ。json フィールドの値が `{ in: [...] }` 形でも型上は演算子と区別できないが、ランタイムでは json フィールドは常に等値比較される。
20
+ - `WhereValue<T>` 型を `@nanokajs/core` から export。
21
+
22
+ ### Notes
23
+
24
+ - 後方互換。PK スカラー・等値 AND オブジェクト・空 where 400 ガード・prototype pollution ガードは従来どおり動作する。
25
+ - サポートする演算子オブジェクトは `in` のみ(escape hatch 対称化)。`and / or / lt / gt / like` はDrizzle 式か `app.db` で書く。
26
+
27
+ ## [1.11.0] — 2026-06-05
28
+
29
+ ### Added
30
+
31
+ - `t.timestamp().defaultNow()` — timestamp フィールドに DB の `DEFAULT` 句として現在時刻(epoch ミリ秒)を設定する糖衣。`nanoka generate` は `sql` `` `(cast((julianday('now') - 2440587.5)*86400000 as integer))` `` を `.default(...)` に出力し、`timestamp_ms` 列(epoch ms 整数)と整合する。`CURRENT_TIMESTAMP`(text を返す)は使わない。関数 default(`default(() => new Date())`)と異なり生成 SQL に `DEFAULT` 句が出力され、`nanoka generate` の警告が出ない。`inputSchema('create')` で省略可能(DB が値を埋める)。クライアントに値の設定を一切許さない場合は `readOnly()` を併用する。
32
+
33
+ ### Changed
34
+
35
+ - `create-nanoka-app` のデフォルトテンプレート(`posts.ts`)の `createdAt` を `t.timestamp().defaultNow().readOnly()` に更新。
36
+
37
+ ## [1.10.2] — 2026-05-23
38
+
39
+ ### Security
40
+
41
+ - `hono` を 4.12.16 → 4.12.22 に更新(JSX SSR の CSS Declaration Injection / Cache Middleware の `Vary` 無視に関する moderate advisory 2 件を解消)。core では該当機能を使用していないため実害低だが defense-in-depth として bump。
42
+ - `pnpm.overrides` の `devalue` を `>=5.6.4` → `>=5.8.1`(Svelte `devalue` の sparse array deserialization DoS advisory を解消)。
43
+
44
+ ### Changed
45
+
46
+ - devDep / 内部依存の lockfile を caret 範囲内の最新へ追従(`@hono/zod-validator` 0.4.0 → 0.4.3、`jiti` 2.6.1 → 2.7.0、`@cloudflare/workers-types`、`@types/node`、`tsup` 等)。peerDependencies の範囲は変更なし。
47
+
8
48
  ## [1.8.0] — 2026-05-06
9
49
 
10
50
  ### Added
package/README.md CHANGED
@@ -17,14 +17,14 @@ Targets **Cloudflare Workers + D1 (SQLite)** as first-class. Hono-compatible rou
17
17
 
18
18
  ## Status
19
19
 
20
- **Stable (1.6.1).** 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.
20
+ **Stable (1.12.1).** Core API-boundary surface — field policies, `inputSchema` / `outputSchema`, validator presets, `t.json(zodSchema)`, field accessor API, Zod 3 / 4 support, OpenAPI component seed, `t.timestamp().defaultNow()`, mutation/findOne SQL expression and `in` operator in `where` — is stable under SemVer.
21
21
 
22
22
  ## Stable API surface (1.0)
23
23
 
24
24
  The following APIs are stable. Breaking changes require a major version bump.
25
25
 
26
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()`
27
+ - **Field modifiers**: `.primary()` / `.unique()` / `.optional()` / `.default(fn)` / `.defaultNow()` (timestamp only) / `.min(n)` / `.max(n)` / `.email()`
28
28
  - **Field policies**: `.serverOnly()` / `.writeOnly()` / `.readOnly()` — `t.uuid().primary().readOnly()` implicitly generates a UUID via `crypto.randomUUID()` when no `.default()` is provided
29
29
  - **Schema derivation**: `Model.schema(opts?)` / `Model.inputSchema('create' | 'update', opts?)` / `Model.outputSchema(opts?)`
30
30
  - **Validator**: `Model.validator(target, opts | preset, hook?)` — presets: `'create'`, `'update'`
@@ -93,7 +93,7 @@ Peer dependency ranges: `hono ^4.0.0`, `drizzle-orm ^0.45.2`, `zod ^3.23.0 || ^4
93
93
  title: t.string().min(1).max(200),
94
94
  body: t.string().min(1),
95
95
  published: t.boolean().default(false),
96
- createdAt: t.timestamp().default(() => new Date()).readOnly(),
96
+ createdAt: t.timestamp().defaultNow().readOnly(), // DB DEFAULT clause (epoch ms)
97
97
  }
98
98
  ```
99
99
 
@@ -247,7 +247,7 @@ const fields = {
247
247
  active: t.boolean().default(() => true),
248
248
  age: t.integer().min(0).max(150),
249
249
  metadata: t.json(), // { key: string, value: unknown }[]
250
- createdAt: t.timestamp().default(() => new Date()),
250
+ createdAt: t.timestamp().defaultNow().readOnly(), // DB DEFAULT clause (epoch ms), no nanoka generate warning
251
251
  updatedAt: t.timestamp().default(() => new Date()),
252
252
  }
253
253
  ```
@@ -263,7 +263,8 @@ Modifiers:
263
263
  - `.primary()` — primary key (required, one per model)
264
264
  - `.unique()` — unique constraint
265
265
  - `.optional()` — nullable
266
- - `.default(fn)` — default value (function or constant)
266
+ - `.default(fn)` — default value (function or constant); runtime-only (no SQL DEFAULT clause emitted — function defaults produce a warning from `nanoka generate`)
267
+ - `.defaultNow()` — **timestamp only**: sets the DB DEFAULT clause to the current epoch-ms via `sql\`(cast((julianday('now') - 2440587.5)*86400000 as integer))\``. No `nanoka generate` warning. Optional in `inputSchema('create')` (DB fills the value). Combine with `.readOnly()` to block client writes entirely.
267
268
  - `.min(n)` / `.max(n)` — numeric / string length bounds
268
269
  - `.email()` — email validation (string modifier: `t.string().email()`)
269
270
 
@@ -332,8 +333,22 @@ const specific = await User.findMany({
332
333
  })
333
334
  ```
334
335
 
336
+ The `where` field also accepts `{ field: { in: [...] } }` for IN matching:
337
+
338
+ ```ts
339
+ // IN operator — equality OR over a set of values
340
+ const selected = await User.findMany({
341
+ limit: 50,
342
+ where: { role: { in: ['admin', 'moderator'] } },
343
+ })
344
+ ```
345
+
335
346
  When passing a Drizzle SQL expression, SQL injection prevention follows Drizzle's parametrized binding rules — ensure all user-supplied values are passed as Drizzle operands (e.g., `like(col, value)`) rather than interpolated into raw strings. Never pass user input to `sql.raw()`, which skips parametrization entirely.
336
347
 
348
+ Build `where` values from validated input (`c.req.valid(...)`); do not pass raw query/param objects directly. The `{ in: [...] }` operator uses the array for IN matching, so unvalidated input could trigger unintended IN semantics or large match sets.
349
+
350
+ **`offset` runtime cap:** `offset` is capped at 100,000 to prevent read amplification and DoS. If you need to paginate deeper, use cursor pagination (e.g., `id > lastId`) instead of offset/limit.
351
+
337
352
  ### `findAll` — unbounded fetch (no LIMIT)
338
353
 
339
354
  `findAll` issues no LIMIT clause and returns every row. Use it for batch processing, admin tooling, or export pipelines where you intentionally want all records.
@@ -353,6 +368,33 @@ return c.json(User.toResponseMany(users))
353
368
 
354
369
  **Warning:** `findAll` issues no LIMIT to the database. For request handlers, enforce an app-level size guard or use `findMany` with an explicit `limit` instead.
355
370
 
371
+ ### `findOne` / `update` / `delete` — Drizzle SQL and `in` operator
372
+
373
+ `findOne`, `update`, and `delete` accept the same where expression forms as `findMany`: a primary key scalar, a plain equality object, a `{ field: { in: [...] } }` operator object, or a Drizzle SQL expression.
374
+
375
+ ```ts
376
+ import { eq, inArray } from 'drizzle-orm'
377
+
378
+ // By primary key (unchanged)
379
+ await Session.delete('session-id')
380
+
381
+ // By equality object (unchanged)
382
+ await User.findOne({ email: 'alice@example.com' })
383
+
384
+ // By { in: [...] } operator
385
+ await Session.delete({ userId: { in: ['u-1', 'u-2', 'u-3'] } })
386
+
387
+ // By Drizzle SQL expression — e.g., inArray for D1 bind limit (100) workaround
388
+ const ids = ['id-1', 'id-2', /* ... 110 ids total ... */]
389
+ const chunkSize = 50
390
+ for (let i = 0; i < ids.length; i += chunkSize) {
391
+ const chunk = ids.slice(i, i + chunkSize)
392
+ await Session.delete(inArray(Session.table.id, chunk))
393
+ }
394
+ ```
395
+
396
+ SQL injection prevention follows Drizzle's parametrized binding rules for all forms above. The `{ in: [] }` empty array is valid and matches 0 rows. JSON fields typed as `{ in: [...] }` by coincidence are always compared by equality at runtime — the `in` operator applies to non-JSON fields only.
397
+
356
398
  ## Escape hatch: raw Drizzle and D1 batch
357
399
 
358
400
  ### `app.db` — use raw Drizzle when needed
@@ -1,3 +1,4 @@
1
+ import { sql } from 'drizzle-orm';
1
2
  import { text, integer, real } from 'drizzle-orm/sqlite-core';
2
3
  import { z } from 'zod';
3
4
 
@@ -491,7 +492,9 @@ var TimestampFieldBuilder = class _TimestampFieldBuilder extends BaseFieldBuilde
491
492
  if (this.modifiers.unique) {
492
493
  col = col.unique();
493
494
  }
494
- if (this.modifiers.hasDefault) {
495
+ if (this.modifiers.defaultNow) {
496
+ col = col.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`);
497
+ } else if (this.modifiers.hasDefault) {
495
498
  const defaultValue = this.modifiers.defaultValue;
496
499
  if (typeof defaultValue === "function") {
497
500
  col = col.$defaultFn(defaultValue);
@@ -532,6 +535,14 @@ var TimestampFieldBuilder = class _TimestampFieldBuilder extends BaseFieldBuilde
532
535
  const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value };
533
536
  return this.cloneWithModifiers(newMods);
534
537
  }
538
+ /**
539
+ * Sets the DB DEFAULT clause to the current timestamp (epoch ms).
540
+ * Generates `sql\`(cast((julianday('now') - 2440587.5)*86400000 as integer))\`` in Drizzle schema.
541
+ */
542
+ defaultNow() {
543
+ const newMods = { ...this.modifiers, defaultNow: true };
544
+ return this.cloneWithModifiers(newMods);
545
+ }
535
546
  serverOnly() {
536
547
  const newMods = { ...this.modifiers, policy: "serverOnly" };
537
548
  return this.cloneWithModifiers(newMods);
@@ -629,7 +640,6 @@ var RelationFieldBuilder = class {
629
640
  target;
630
641
  foreignKey;
631
642
  tsType;
632
- // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for empty modifiers
633
643
  modifiers = {};
634
644
  constructor(relationKind, target, foreignKey) {
635
645
  this.relationKind = relationKind;
@@ -686,5 +696,5 @@ var t = {
686
696
  };
687
697
 
688
698
  export { t };
689
- //# sourceMappingURL=chunk-SHPR4NTZ.js.map
690
- //# sourceMappingURL=chunk-SHPR4NTZ.js.map
699
+ //# sourceMappingURL=chunk-UBDSGKTX.js.map
700
+ //# sourceMappingURL=chunk-UBDSGKTX.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-UBDSGKTX.js","sourcesContent":["import type { SQLiteColumnBuilderBase } from 'drizzle-orm/sqlite-core'\nimport type { z } from 'zod'\nimport type { Field, FieldKind, FieldModifiers } from './types'\n\n/**\n * Abstract base class for field builders.\n * Provides shared implementation for Zod and Drizzle integration.\n *\n * Subclasses must implement:\n * - `zodBase: ZB` getter\n * - `drizzleColumn(name: string): SQLiteColumnBuilderBase` method\n * - Modifier chain methods (optional, primary, unique, default) that return the subclass type\n *\n * @template TS - The TypeScript type of the field\n * @template Mods - The type of modifiers currently applied\n * @template ZB - The Zod base schema type for this field\n */\nexport abstract class BaseFieldBuilder<\n TS,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> implements Field<TS, Mods, ZB>\n{\n readonly tsType: TS = undefined as unknown as TS\n abstract readonly kind: FieldKind\n readonly modifiers: Readonly<Mods>\n\n constructor(modifiers?: Mods) {\n this.modifiers = Object.freeze((modifiers ?? {}) as Mods)\n }\n\n abstract get zodBase(): ZB\n abstract drizzleColumn(name: string): SQLiteColumnBuilderBase\n\n /**\n * Creates an immutable copy of this field with updated modifiers.\n * Subclasses must implement this to maintain their concrete type.\n */\n // biome-ignore lint/suspicious/noExplicitAny: Field builders return polymorphic types\n protected abstract cloneWithModifiers(mods: FieldModifiers): any\n\n /**\n * Returns the Zod schema with all modifiers applied.\n * Order: base schema → format/min/max constraints → optional → default\n */\n protected applyModifiersToZod(baseSchema: z.ZodTypeAny): z.ZodTypeAny {\n let schema = baseSchema\n\n // Apply optional — use nullable() first so D1/SQLite null values are accepted\n if (this.modifiers.optional) {\n schema = schema.nullable().optional()\n }\n\n // Apply default\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n schema = schema.default(defaultValue)\n }\n\n return schema\n }\n}\n","import { sql } from 'drizzle-orm'\nimport type { SQLiteColumnBuilderBase } from 'drizzle-orm/sqlite-core'\nimport { integer, real, text } from 'drizzle-orm/sqlite-core'\nimport type { z } from 'zod'\nimport { z as zLib } from 'zod'\nimport { BaseFieldBuilder } from './builder'\nimport type { FieldModifiers, RelationKind, RelationTargetLike } from './types'\n\n// ==================== StringFieldBuilder ====================\n\nclass StringFieldBuilder<\n TS = string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'string' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.string()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n if (this.modifiers.format === 'email') {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).email()\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = text(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): StringFieldBuilder<TS, NewMods> {\n return new StringFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new StringFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: StringFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): StringFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds email format validation.\n */\n email(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Mods & { format: 'email' }> {\n const newMods = { ...this.modifiers, format: 'email' as const } as Mods & { format: 'email' }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum string length.\n */\n min(\n this: StringFieldBuilder<TS, Mods>,\n n: number,\n ): StringFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum string length.\n */\n max(\n this: StringFieldBuilder<TS, Mods>,\n n: number,\n ): StringFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: StringFieldBuilder<TS, Mods>,\n ): StringFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== UuidFieldBuilder ====================\n\nclass UuidFieldBuilder<\n TS = string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'uuid' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.string().uuid()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = text(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (\n this.modifiers.primary === true &&\n this.modifiers.policy === 'readOnly' &&\n !this.modifiers.hasDefault\n ) {\n col = col.$defaultFn(() => crypto.randomUUID())\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): UuidFieldBuilder<TS, NewMods> {\n return new UuidFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new UuidFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: UuidFieldBuilder<TS, Mods>): UuidFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: UuidFieldBuilder<TS, Mods>): UuidFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: UuidFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): UuidFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum string length.\n */\n min(this: UuidFieldBuilder<TS, Mods>, n: number): UuidFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum string length.\n */\n max(this: UuidFieldBuilder<TS, Mods>, n: number): UuidFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: UuidFieldBuilder<TS, Mods>,\n ): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== NumberFieldBuilder ====================\n\nclass NumberFieldBuilder<\n TS = number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'number' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.number()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = real(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): NumberFieldBuilder<TS, NewMods> {\n return new NumberFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new NumberFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: NumberFieldBuilder<TS, Mods>): NumberFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: NumberFieldBuilder<TS, Mods>): NumberFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: NumberFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): NumberFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum value.\n */\n min(\n this: NumberFieldBuilder<TS, Mods>,\n n: number,\n ): NumberFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum value.\n */\n max(\n this: NumberFieldBuilder<TS, Mods>,\n n: number,\n ): NumberFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: NumberFieldBuilder<TS, Mods>,\n ): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== IntegerFieldBuilder ====================\n\nclass IntegerFieldBuilder<\n TS = number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'integer' as const\n\n get zodBase(): ZB {\n let schema: z.ZodTypeAny = zLib.number().int()\n\n if (this.modifiers.min !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).min(this.modifiers.min)\n }\n if (this.modifiers.max !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: Chaining Zod methods\n schema = (schema as any).max(this.modifiers.max)\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Return type cast for generic ZB parameter\n return this.applyModifiersToZod(schema) as any\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = integer(name) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): IntegerFieldBuilder<TS, NewMods> {\n return new IntegerFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new IntegerFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: IntegerFieldBuilder<TS, Mods>): IntegerFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: IntegerFieldBuilder<TS, Mods>): IntegerFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: IntegerFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): IntegerFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets minimum value.\n */\n min(\n this: IntegerFieldBuilder<TS, Mods>,\n n: number,\n ): IntegerFieldBuilder<TS, Mods & { min: number }> {\n const newMods = { ...this.modifiers, min: n } as Mods & { min: number }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets maximum value.\n */\n max(\n this: IntegerFieldBuilder<TS, Mods>,\n n: number,\n ): IntegerFieldBuilder<TS, Mods & { max: number }> {\n const newMods = { ...this.modifiers, max: n } as Mods & { max: number }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: IntegerFieldBuilder<TS, Mods>,\n ): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== BooleanFieldBuilder ====================\n\nclass BooleanFieldBuilder<\n TS = boolean,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'boolean' as const\n\n get zodBase(): ZB {\n return this.applyModifiersToZod(zLib.boolean()) as ZB\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = integer(name, { mode: 'boolean' }) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): BooleanFieldBuilder<TS, NewMods> {\n return new BooleanFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new BooleanFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: BooleanFieldBuilder<TS, Mods>): BooleanFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: BooleanFieldBuilder<TS, Mods>): BooleanFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: BooleanFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): BooleanFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: BooleanFieldBuilder<TS, Mods>,\n ): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== TimestampFieldBuilder ====================\n\nclass TimestampFieldBuilder<\n TS = Date,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'timestamp' as const\n\n get zodBase(): ZB {\n return this.applyModifiersToZod(zLib.coerce.date()) as ZB\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = integer(name, { mode: 'timestamp_ms' }) as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.defaultNow) {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))` as any)\n } else if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): TimestampFieldBuilder<TS, NewMods> {\n return new TimestampFieldBuilder<TS, NewMods>(mods)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new TimestampFieldBuilder<TS | undefined, Mods & { optional: true }>(newMods)\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: TimestampFieldBuilder<TS, Mods>,\n value: TS | (() => TS),\n ): TimestampFieldBuilder<TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets the DB DEFAULT clause to the current timestamp (epoch ms).\n * Generates `sql\\`(cast((julianday('now') - 2440587.5)*86400000 as integer))\\`` in Drizzle schema.\n */\n defaultNow(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Mods & { defaultNow: true }> {\n const newMods = { ...this.modifiers, defaultNow: true } as Mods & { defaultNow: true }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: TimestampFieldBuilder<TS, Mods>,\n ): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== JsonFieldBuilder ====================\n\n/**\n * JSON フィールドビルダー。\n *\n * `t.json(zodSchema)` 形式で Zod スキーマを渡すと runtime 検証が走る。\n * スキーマ省略時は `z.unknown()` で後方互換を維持する。\n */\nclass JsonFieldBuilder<\n T = unknown,\n TS = T,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n Mods extends FieldModifiers = {},\n ZB extends z.ZodTypeAny = z.ZodTypeAny,\n> extends BaseFieldBuilder<TS, Mods, ZB> {\n readonly kind = 'json' as const\n private readonly _zodSchema: z.ZodTypeAny | undefined\n\n constructor(modifiers?: Mods, zodSchema?: z.ZodTypeAny) {\n super(modifiers)\n this._zodSchema = zodSchema\n }\n\n get zodBase(): ZB {\n return this.applyModifiersToZod(this._zodSchema ?? zLib.unknown()) as ZB\n }\n\n drizzleColumn(name: string): SQLiteColumnBuilderBase {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle column builder chaining\n let col = text(name, { mode: 'json' }).$type<T>() as any\n\n if (!this.modifiers.optional) {\n col = col.notNull()\n }\n if (this.modifiers.primary) {\n col = col.primaryKey()\n }\n if (this.modifiers.unique) {\n col = col.unique()\n }\n if (this.modifiers.hasDefault) {\n const defaultValue = this.modifiers.defaultValue\n if (typeof defaultValue === 'function') {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.$defaultFn(defaultValue as any)\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle API\n col = col.default(defaultValue as any)\n }\n }\n\n return col as SQLiteColumnBuilderBase\n }\n\n protected cloneWithModifiers<NewMods extends FieldModifiers>(\n mods: NewMods,\n ): JsonFieldBuilder<T, TS, NewMods> {\n return new JsonFieldBuilder<T, TS, NewMods>(mods, this._zodSchema)\n }\n\n /**\n * Marks this field as optional (allows undefined / null).\n */\n optional(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS | undefined, Mods & { optional: true }> {\n const newMods = { ...this.modifiers, optional: true } as Mods & { optional: true }\n return new JsonFieldBuilder<T, TS | undefined, Mods & { optional: true }>(\n newMods,\n this._zodSchema,\n )\n }\n\n /**\n * Marks this field as the primary key of its table.\n */\n primary(this: JsonFieldBuilder<T, TS, Mods>): JsonFieldBuilder<T, TS, Mods & { primary: true }> {\n const newMods = { ...this.modifiers, primary: true } as Mods & { primary: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Adds a unique constraint to this field.\n */\n unique(this: JsonFieldBuilder<T, TS, Mods>): JsonFieldBuilder<T, TS, Mods & { unique: true }> {\n const newMods = { ...this.modifiers, unique: true } as Mods & { unique: true }\n return this.cloneWithModifiers(newMods)\n }\n\n /**\n * Sets a default value for this field.\n */\n default(\n this: JsonFieldBuilder<T, TS, Mods>,\n value: TS | (() => TS),\n ): JsonFieldBuilder<T, TS, Mods & { hasDefault: true }> {\n const newMods = { ...this.modifiers, hasDefault: true, defaultValue: value } as Mods & {\n hasDefault: true\n }\n return this.cloneWithModifiers(newMods)\n }\n\n serverOnly(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & { policy: 'serverOnly' }> {\n const newMods = { ...this.modifiers, policy: 'serverOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'serverOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n writeOnly(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & { policy: 'writeOnly' }> {\n const newMods = { ...this.modifiers, policy: 'writeOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'writeOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n\n readOnly(\n this: JsonFieldBuilder<T, TS, Mods>,\n ): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & { policy: 'readOnly' }> {\n const newMods = { ...this.modifiers, policy: 'readOnly' as const } as Omit<Mods, 'policy'> & {\n policy: 'readOnly'\n }\n return this.cloneWithModifiers(newMods)\n }\n}\n\n// ==================== RelationFieldBuilder ====================\n\nexport class RelationFieldBuilder<\n Target extends RelationTargetLike,\n FK extends string,\n Kind extends RelationKind,\n> {\n readonly kind = 'relation' as const\n readonly relationKind: Kind\n readonly target: Target | (() => Target)\n readonly foreignKey: FK\n readonly tsType!: never\n readonly modifiers = {} as const\n\n constructor(relationKind: Kind, target: Target | (() => Target), foreignKey: FK) {\n this.relationKind = relationKind\n this.target = target\n this.foreignKey = foreignKey\n }\n\n get zodBase(): z.ZodNever {\n return zLib.never()\n }\n\n drizzleColumn(name: string): never {\n throw new Error(`relation field '${name}' has no DB column`)\n }\n}\n\n// ==================== Factory ====================\n\n// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\nfunction jsonField<S extends z.ZodTypeAny>(schema: S): JsonFieldBuilder<z.infer<S>, z.infer<S>, {}>\n// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\nfunction jsonField<T = unknown>(): JsonFieldBuilder<T, T, {}>\n// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\nfunction jsonField<T = unknown>(schema?: z.ZodTypeAny): JsonFieldBuilder<T, T, {}> {\n return new JsonFieldBuilder<T, T, {}>(undefined, schema)\n}\n\n/**\n * Field DSL factory for building type-safe database fields.\n *\n * @example\n * const nameField = t.string().min(1).max(255)\n * const emailField = t.string().email()\n * const idField = t.uuid().primary()\n * const ageField = t.integer().min(0).max(150)\n * const createdAtField = t.timestamp().default(() => new Date())\n * const dataField = t.json<{ foo: string }>()\n * const dataField2 = t.json(z.object({ foo: z.string() })) // runtime validation\n */\nexport const t = {\n string(): StringFieldBuilder<\n string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new StringFieldBuilder<string, {}>()\n },\n\n uuid(): UuidFieldBuilder<\n string,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new UuidFieldBuilder<string, {}>()\n },\n\n number(): NumberFieldBuilder<\n number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new NumberFieldBuilder<number, {}>()\n },\n\n integer(): IntegerFieldBuilder<\n number,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new IntegerFieldBuilder<number, {}>()\n },\n\n boolean(): BooleanFieldBuilder<\n boolean,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new BooleanFieldBuilder<boolean, {}>()\n },\n\n timestamp(): TimestampFieldBuilder<\n Date,\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n {}\n > {\n // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for the default empty modifiers\n return new TimestampFieldBuilder<Date, {}>()\n },\n\n /**\n * JSON フィールド。\n *\n * `t.json(zodSchema)` 形式で Zod スキーマを渡すと runtime 検証が走る。\n * スキーマ省略時は `z.unknown()` で後方互換を維持する。\n *\n * `t.json(z.object({ foo: z.string() }))` でオブジェクト形状の runtime 検証が可能。\n *\n * @note codegen (`nanoka generate`) は `t.json(zodSchema)` を渡しても `$type<unknown>()` のまま出力する。\n * Drizzle 型が欲しい場合は生成後に手動で書き換えるか `as` を使うこと。\n */\n json: jsonField,\n\n hasMany<Target extends RelationTargetLike, FK extends string>(\n target: Target | (() => Target),\n options: { foreignKey: FK },\n ): RelationFieldBuilder<Target, FK, 'hasMany'> {\n return new RelationFieldBuilder('hasMany', target, options.foreignKey)\n },\n\n belongsTo<Target extends RelationTargetLike, FK extends string>(\n target: Target | (() => Target),\n options: { foreignKey: FK },\n ): RelationFieldBuilder<Target, FK, 'belongsTo'> {\n return new RelationFieldBuilder('belongsTo', target, options.foreignKey)\n },\n}\n"]}
package/dist/cli.js CHANGED
@@ -38,7 +38,9 @@ function renderField(fieldName, field) {
38
38
  if (field.modifiers.unique) {
39
39
  column += ".unique()";
40
40
  }
41
- if (field.modifiers.hasDefault) {
41
+ if (field.kind === "timestamp" && field.modifiers.defaultNow) {
42
+ column += `.default(sql\`(cast((julianday('now') - 2440587.5)*86400000 as integer))\`)`;
43
+ } else if (field.modifiers.hasDefault) {
42
44
  const defaultValue = field.modifiers.defaultValue;
43
45
  if (typeof defaultValue === "function") {
44
46
  console.warn(
@@ -92,15 +94,29 @@ function buildImportStatement(imports) {
92
94
  }
93
95
  return `import { ${used.join(", ")} } from 'drizzle-orm/sqlite-core'`;
94
96
  }
97
+ function hasDefaultNowField(models) {
98
+ for (const model of models) {
99
+ for (const field of Object.values(model.fields)) {
100
+ if (field.kind !== "relation" && field.modifiers.defaultNow) {
101
+ return true;
102
+ }
103
+ }
104
+ }
105
+ return false;
106
+ }
95
107
  function generateDrizzleSchema(models) {
96
108
  const imports = detectImports(models);
97
109
  const importStatement = buildImportStatement(imports);
110
+ const needsSqlImport = hasDefaultNowField(models);
98
111
  const lines = [
99
112
  "// AUTO-GENERATED by `nanoka generate`. DO NOT EDIT BY HAND.",
100
- "// To regenerate: `npx nanoka generate`",
101
- importStatement,
102
- ""
113
+ "// To regenerate: `npx nanoka generate`"
103
114
  ];
115
+ if (needsSqlImport) {
116
+ lines.push("import { sql } from 'drizzle-orm'");
117
+ }
118
+ lines.push(importStatement);
119
+ lines.push("");
104
120
  for (const model of models) {
105
121
  const fieldLines = [];
106
122
  for (const [fieldName, field] of Object.entries(model.fields)) {
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/run.ts","../src/cli/index.ts"],"names":["resolve","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 | null {\n if (field.kind === 'relation') return null\n\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 === 'relation') continue\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 const nonRelationFields = Object.values(model.fields).filter((f) => f.kind !== 'relation')\n if (nonRelationFields.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 const rendered = renderField(fieldName, field)\n if (rendered !== null) {\n fieldLines.push(rendered)\n }\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 { spawn } from 'node:child_process'\n\nconst D1_DATABASE_NAME_RE = /^[A-Za-z0-9_-]{1,64}$/\n\nexport function validateDbName(db: string): void {\n if (!D1_DATABASE_NAME_RE.test(db)) {\n throw new Error(\n `Invalid D1 database name: \"${db}\". Only alphanumerics, hyphens, and underscores are allowed (max 64 chars).`,\n )\n }\n}\n\nfunction resolveRunner(pm: string): { cmd: string; prefix: string[] } {\n switch (pm) {\n case 'pnpm':\n return { cmd: 'pnpm', prefix: ['exec'] }\n case 'npm':\n return { cmd: 'npm', prefix: ['exec'] }\n case 'yarn':\n return { cmd: 'yarn', prefix: ['dlx'] }\n case 'bun':\n return { cmd: 'bunx', prefix: [] }\n case 'npx':\n return { cmd: 'npx', prefix: [] }\n default:\n throw new Error(\n `Unsupported package manager: \"${pm}\". Use one of: npx, pnpm, npm, yarn, bun.`,\n )\n }\n}\n\nfunction runProcess(cmd: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, { stdio: 'inherit', shell: false, cwd })\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n } else {\n reject(new Error(`Command '${cmd} ${args.join(' ')}' exited with code ${code}`))\n }\n })\n child.on('error', (err) => {\n reject(new Error(`Failed to spawn '${cmd}': ${err.message}`))\n })\n })\n}\n\nexport async function runDrizzleKitGenerate(opts: {\n cwd: string\n configPath?: string\n pm: string\n}): Promise<void> {\n const { cmd, prefix } = resolveRunner(opts.pm)\n const args = [...prefix, 'drizzle-kit', 'generate']\n if (opts.configPath) {\n args.push('--config', opts.configPath)\n }\n await runProcess(cmd, args, opts.cwd)\n}\n\nexport async function runWranglerApply(opts: {\n cwd: string\n db: string\n remote: boolean\n pm: string\n}): Promise<void> {\n validateDbName(opts.db)\n const { cmd, prefix } = resolveRunner(opts.pm)\n const args = [...prefix, 'wrangler', 'd1', 'migrations', 'apply', opts.db]\n args.push(opts.remote ? '--remote' : '--local')\n await runProcess(cmd, args, opts.cwd)\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'\nimport { runDrizzleKitGenerate, runWranglerApply, validateDbName } from './run'\n\nasync function findDrizzleConfig(cwd: string): Promise<string | undefined> {\n const candidates = ['drizzle.config.ts', 'drizzle.config.js', 'drizzle.config.mjs']\n for (const name of candidates) {\n try {\n await fs.access(resolve(cwd, name))\n return resolve(cwd, name)\n } catch {\n // not found, try next\n }\n }\n return undefined\n}\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(\n 'Usage: nanoka generate [--config <path>] [--output <path>] [--no-migrate] [--apply --db <name>] [--remote] [--package-manager <pm>]',\n )\n console.log('')\n console.log('Options:')\n console.log(\n ' --config <path> Path to nanoka.config.ts (default: ./nanoka.config.ts)',\n )\n console.log(' --output <path> Output file path (overrides config.output)')\n console.log(' --no-migrate Skip drizzle-kit generate (schema generation only)')\n console.log(\n ' --apply Run wrangler d1 migrations apply after drizzle-kit generate',\n )\n console.log(\n ' --db <name> D1 database name for wrangler (required with --apply)',\n )\n console.log(\n ' --remote Apply migrations to remote instead of local (used with --apply)',\n )\n console.log(\n ' --package-manager <pm> Package manager to use: npx (default), pnpm, npm, yarn, bun',\n )\n return 0\n }\n\n if (args[0] !== 'generate') {\n console.error(`Error: unknown command '${args[0]}'`)\n console.error(\n 'Usage: nanoka generate [--config <path>] [--output <path>] [--no-migrate] [--apply --db <name>] [--remote] [--package-manager <pm>]',\n )\n return 1\n }\n\n let configPath: string = './nanoka.config.ts'\n let outputPath: string | undefined\n let noMigrate = false\n let apply = false\n let dbName: string | undefined\n let remote = false\n let packageManager: string = 'npx'\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 if (args[i] === '--no-migrate') {\n noMigrate = true\n i += 1\n } else if (args[i] === '--apply') {\n apply = true\n i += 1\n } else if (args[i] === '--db' && i + 1 < args.length) {\n const next = args[i + 1]\n if (next !== undefined) dbName = next\n i += 2\n } else if (args[i] === '--remote') {\n remote = true\n i += 1\n } else if (args[i] === '--package-manager' && i + 1 < args.length) {\n const next = args[i + 1]\n if (next !== undefined) {\n const validPms = ['npx', 'pnpm', 'npm', 'yarn', 'bun']\n if (!validPms.includes(next)) {\n console.error(\n `Error: unsupported package manager '${next}'. Use one of: ${validPms.join(', ')}`,\n )\n return 1\n }\n packageManager = next\n }\n i += 2\n } else {\n console.error(`Error: unknown option '${args[i]}'`)\n return 1\n }\n }\n\n const cwd = process.cwd()\n const absoluteConfigPath = resolve(cwd, configPath)\n const config = await loadConfig(absoluteConfigPath)\n\n const finalOutputPath = outputPath ?? config.output ?? './drizzle/schema.ts'\n const absoluteOutputPath = resolve(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\n if (!noMigrate) {\n const drizzleConfigPath =\n config.migrate?.drizzleConfig !== undefined\n ? resolve(cwd, config.migrate.drizzleConfig)\n : await findDrizzleConfig(cwd)\n\n if (drizzleConfigPath !== undefined) {\n const pm = config.migrate?.packageManager ?? packageManager\n console.log('Running drizzle-kit generate...')\n await runDrizzleKitGenerate({ cwd, configPath: drizzleConfigPath, pm })\n console.log('✓ drizzle-kit generate completed')\n } else {\n console.log('No drizzle.config.ts found, skipping drizzle-kit generate')\n }\n }\n\n if (apply) {\n const resolvedDb = dbName ?? config.migrate?.database\n if (resolvedDb === undefined) {\n console.error(\n 'Error: --db <name> を指定するか nanoka.config.ts の migrate.database に設定してください',\n )\n return 1\n }\n try {\n validateDbName(resolvedDb)\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : err}`)\n return 1\n }\n\n const pm = config.migrate?.packageManager ?? packageManager\n console.log(`Running wrangler d1 migrations apply ${resolvedDb}...`)\n await runWranglerApply({ cwd, db: resolvedDb, remote, pm })\n console.log('✓ wrangler d1 migrations apply completed')\n }\n\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/run.ts","../src/cli/index.ts"],"names":["resolve","fs"],"mappings":"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","file":"cli.js","sourcesContent":["import type { Field, FieldModifiers } from '../field'\n\nexport function renderField(\n fieldName: string,\n field: Field<unknown, FieldModifiers>,\n): string | null {\n if (field.kind === 'relation') return null\n\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.kind === 'timestamp' && field.modifiers.defaultNow) {\n column += `.default(sql\\`(cast((julianday('now') - 2440587.5)*86400000 as integer))\\`)`\n } else 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 === 'relation') continue\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 const nonRelationFields = Object.values(model.fields).filter((f) => f.kind !== 'relation')\n if (nonRelationFields.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\nfunction hasDefaultNowField(models: readonly ModelDef[]): boolean {\n for (const model of models) {\n for (const field of Object.values(model.fields)) {\n if (field.kind !== 'relation' && field.modifiers.defaultNow) {\n return true\n }\n }\n }\n return false\n}\n\nexport function generateDrizzleSchema(models: readonly ModelDef[]): string {\n const imports = detectImports(models)\n const importStatement = buildImportStatement(imports)\n const needsSqlImport = hasDefaultNowField(models)\n\n const lines: string[] = [\n '// AUTO-GENERATED by `nanoka generate`. DO NOT EDIT BY HAND.',\n '// To regenerate: `npx nanoka generate`',\n ]\n\n if (needsSqlImport) {\n lines.push(\"import { sql } from 'drizzle-orm'\")\n }\n\n lines.push(importStatement)\n lines.push('')\n\n for (const model of models) {\n const fieldLines: string[] = []\n\n for (const [fieldName, field] of Object.entries(model.fields)) {\n const rendered = renderField(fieldName, field)\n if (rendered !== null) {\n fieldLines.push(rendered)\n }\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 { spawn } from 'node:child_process'\n\nconst D1_DATABASE_NAME_RE = /^[A-Za-z0-9_-]{1,64}$/\n\nexport function validateDbName(db: string): void {\n if (!D1_DATABASE_NAME_RE.test(db)) {\n throw new Error(\n `Invalid D1 database name: \"${db}\". Only alphanumerics, hyphens, and underscores are allowed (max 64 chars).`,\n )\n }\n}\n\nfunction resolveRunner(pm: string): { cmd: string; prefix: string[] } {\n switch (pm) {\n case 'pnpm':\n return { cmd: 'pnpm', prefix: ['exec'] }\n case 'npm':\n return { cmd: 'npm', prefix: ['exec'] }\n case 'yarn':\n return { cmd: 'yarn', prefix: ['dlx'] }\n case 'bun':\n return { cmd: 'bunx', prefix: [] }\n case 'npx':\n return { cmd: 'npx', prefix: [] }\n default:\n throw new Error(\n `Unsupported package manager: \"${pm}\". Use one of: npx, pnpm, npm, yarn, bun.`,\n )\n }\n}\n\nfunction runProcess(cmd: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, { stdio: 'inherit', shell: false, cwd })\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n } else {\n reject(new Error(`Command '${cmd} ${args.join(' ')}' exited with code ${code}`))\n }\n })\n child.on('error', (err) => {\n reject(new Error(`Failed to spawn '${cmd}': ${err.message}`))\n })\n })\n}\n\nexport async function runDrizzleKitGenerate(opts: {\n cwd: string\n configPath?: string\n pm: string\n}): Promise<void> {\n const { cmd, prefix } = resolveRunner(opts.pm)\n const args = [...prefix, 'drizzle-kit', 'generate']\n if (opts.configPath) {\n args.push('--config', opts.configPath)\n }\n await runProcess(cmd, args, opts.cwd)\n}\n\nexport async function runWranglerApply(opts: {\n cwd: string\n db: string\n remote: boolean\n pm: string\n}): Promise<void> {\n validateDbName(opts.db)\n const { cmd, prefix } = resolveRunner(opts.pm)\n const args = [...prefix, 'wrangler', 'd1', 'migrations', 'apply', opts.db]\n args.push(opts.remote ? '--remote' : '--local')\n await runProcess(cmd, args, opts.cwd)\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'\nimport { runDrizzleKitGenerate, runWranglerApply, validateDbName } from './run'\n\nasync function findDrizzleConfig(cwd: string): Promise<string | undefined> {\n const candidates = ['drizzle.config.ts', 'drizzle.config.js', 'drizzle.config.mjs']\n for (const name of candidates) {\n try {\n await fs.access(resolve(cwd, name))\n return resolve(cwd, name)\n } catch {\n // not found, try next\n }\n }\n return undefined\n}\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(\n 'Usage: nanoka generate [--config <path>] [--output <path>] [--no-migrate] [--apply --db <name>] [--remote] [--package-manager <pm>]',\n )\n console.log('')\n console.log('Options:')\n console.log(\n ' --config <path> Path to nanoka.config.ts (default: ./nanoka.config.ts)',\n )\n console.log(' --output <path> Output file path (overrides config.output)')\n console.log(' --no-migrate Skip drizzle-kit generate (schema generation only)')\n console.log(\n ' --apply Run wrangler d1 migrations apply after drizzle-kit generate',\n )\n console.log(\n ' --db <name> D1 database name for wrangler (required with --apply)',\n )\n console.log(\n ' --remote Apply migrations to remote instead of local (used with --apply)',\n )\n console.log(\n ' --package-manager <pm> Package manager to use: npx (default), pnpm, npm, yarn, bun',\n )\n return 0\n }\n\n if (args[0] !== 'generate') {\n console.error(`Error: unknown command '${args[0]}'`)\n console.error(\n 'Usage: nanoka generate [--config <path>] [--output <path>] [--no-migrate] [--apply --db <name>] [--remote] [--package-manager <pm>]',\n )\n return 1\n }\n\n let configPath: string = './nanoka.config.ts'\n let outputPath: string | undefined\n let noMigrate = false\n let apply = false\n let dbName: string | undefined\n let remote = false\n let packageManager: string = 'npx'\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 if (args[i] === '--no-migrate') {\n noMigrate = true\n i += 1\n } else if (args[i] === '--apply') {\n apply = true\n i += 1\n } else if (args[i] === '--db' && i + 1 < args.length) {\n const next = args[i + 1]\n if (next !== undefined) dbName = next\n i += 2\n } else if (args[i] === '--remote') {\n remote = true\n i += 1\n } else if (args[i] === '--package-manager' && i + 1 < args.length) {\n const next = args[i + 1]\n if (next !== undefined) {\n const validPms = ['npx', 'pnpm', 'npm', 'yarn', 'bun']\n if (!validPms.includes(next)) {\n console.error(\n `Error: unsupported package manager '${next}'. Use one of: ${validPms.join(', ')}`,\n )\n return 1\n }\n packageManager = next\n }\n i += 2\n } else {\n console.error(`Error: unknown option '${args[i]}'`)\n return 1\n }\n }\n\n const cwd = process.cwd()\n const absoluteConfigPath = resolve(cwd, configPath)\n const config = await loadConfig(absoluteConfigPath)\n\n const finalOutputPath = outputPath ?? config.output ?? './drizzle/schema.ts'\n const absoluteOutputPath = resolve(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\n if (!noMigrate) {\n const drizzleConfigPath =\n config.migrate?.drizzleConfig !== undefined\n ? resolve(cwd, config.migrate.drizzleConfig)\n : await findDrizzleConfig(cwd)\n\n if (drizzleConfigPath !== undefined) {\n const pm = config.migrate?.packageManager ?? packageManager\n console.log('Running drizzle-kit generate...')\n await runDrizzleKitGenerate({ cwd, configPath: drizzleConfigPath, pm })\n console.log('✓ drizzle-kit generate completed')\n } else {\n console.log('No drizzle.config.ts found, skipping drizzle-kit generate')\n }\n }\n\n if (apply) {\n const resolvedDb = dbName ?? config.migrate?.database\n if (resolvedDb === undefined) {\n console.error(\n 'Error: --db <name> を指定するか nanoka.config.ts の migrate.database に設定してください',\n )\n return 1\n }\n try {\n validateDbName(resolvedDb)\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : err}`)\n return 1\n }\n\n const pm = config.migrate?.packageManager ?? packageManager\n console.log(`Running wrangler d1 migrations apply ${resolvedDb}...`)\n await runWranglerApply({ cwd, db: resolvedDb, remote, pm })\n console.log('✓ wrangler d1 migrations apply completed')\n }\n\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
@@ -1,11 +1,11 @@
1
- import { F as Field } from './factories-CiYoD7dl.js';
2
- export { t } from './factories-CiYoD7dl.js';
1
+ import { F as Field, a as FieldModifiers } from './factories-D7estT7E.js';
2
+ export { t } from './factories-D7estT7E.js';
3
3
  import 'drizzle-orm/sqlite-core';
4
4
  import 'zod';
5
5
 
6
6
  interface ModelDef {
7
7
  readonly name: string;
8
- readonly fields: Record<string, Field<any, any, any>>;
8
+ readonly fields: Record<string, Field<unknown, FieldModifiers>>;
9
9
  }
10
10
  interface NanokaConfig {
11
11
  readonly output?: string | undefined;
package/dist/config.js CHANGED
@@ -1,4 +1,4 @@
1
- export { t } from './chunk-SHPR4NTZ.js';
1
+ export { t } from './chunk-UBDSGKTX.js';
2
2
 
3
3
  // src/config.ts
4
4
  function defineConfig(config) {
@@ -8,6 +8,7 @@ interface FieldModifiers {
8
8
  unique?: boolean;
9
9
  hasDefault?: boolean;
10
10
  defaultValue?: unknown;
11
+ defaultNow?: boolean;
11
12
  format?: 'email' | 'uuid';
12
13
  min?: number;
13
14
  max?: number;
@@ -396,6 +397,13 @@ declare class TimestampFieldBuilder<TS = Date, Mods extends FieldModifiers = {},
396
397
  default(this: TimestampFieldBuilder<TS, Mods>, value: TS | (() => TS)): TimestampFieldBuilder<TS, Mods & {
397
398
  hasDefault: true;
398
399
  }>;
400
+ /**
401
+ * Sets the DB DEFAULT clause to the current timestamp (epoch ms).
402
+ * Generates `sql\`(cast((julianday('now') - 2440587.5)*86400000 as integer))\`` in Drizzle schema.
403
+ */
404
+ defaultNow(this: TimestampFieldBuilder<TS, Mods>): TimestampFieldBuilder<TS, Mods & {
405
+ defaultNow: true;
406
+ }>;
399
407
  serverOnly(this: TimestampFieldBuilder<TS, Mods>): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & {
400
408
  policy: 'serverOnly';
401
409
  }>;
@@ -505,4 +513,4 @@ declare const t: {
505
513
  }): RelationFieldBuilder<Target, FK, "belongsTo">;
506
514
  };
507
515
 
508
- export { type Field as F, type InferFieldType as I, type RelationDef as R, type FieldPolicy as a, type FieldModifiers as b, type IsRelationField as c, RelationFieldBuilder as d, type RelationKind as e, type RelationTargetLike as f, t };
516
+ export { type Field as F, type InferFieldType as I, type RelationDef as R, type FieldModifiers as a, type FieldPolicy as b, type IsRelationField as c, RelationFieldBuilder as d, type RelationKind as e, type RelationTargetLike as f, t };