@nanokajs/core 1.6.1 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +11 -11
- package/dist/{chunk-GZC7BVP2.js → chunk-SHPR4NTZ.js} +29 -3
- package/dist/{chunk-GZC7BVP2.js.map → chunk-SHPR4NTZ.js.map} +1 -1
- package/dist/cli.js +8 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.js +1 -1
- package/dist/{factories-Cmvx0495.d.ts → factories-CiYoD7dl.d.ts} +41 -2
- package/dist/index.d.ts +75 -28
- package/dist/index.js +187 -21
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@ 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.8.0] — 2026-05-06
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Depth-1 relation eager loading via `findMany(adapter, { limit, with })` and `findOne(adapter, idOrWhere, { with })`.
|
|
13
|
+
- Typed `WithOptions`, `WithResult`, `RelationKeys`, and `FindOneOptions` exports for relation query results.
|
|
14
|
+
- Runtime `with` validation and relation graph cycle detection for relation eager loading.
|
|
15
|
+
|
|
16
|
+
### Notes
|
|
17
|
+
|
|
18
|
+
- Relation loading follows the documented parent query + relation query + JavaScript grouping strategy; nested eager loading remains out of scope.
|
|
19
|
+
|
|
8
20
|
## [1.6.0] — 2026-05-05
|
|
9
21
|
|
|
10
22
|
### Added
|
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ Targets **Cloudflare Workers + D1 (SQLite)** as first-class. Hono-compatible rou
|
|
|
17
17
|
|
|
18
18
|
## Status
|
|
19
19
|
|
|
20
|
-
**Stable (1.
|
|
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.
|
|
21
21
|
|
|
22
22
|
## Stable API surface (1.0)
|
|
23
23
|
|
|
@@ -75,7 +75,7 @@ pnpm add -D typescript drizzle-kit @cloudflare/workers-types
|
|
|
75
75
|
|
|
76
76
|
The tsconfig `types` entry above still applies if you're targeting Cloudflare Workers.
|
|
77
77
|
|
|
78
|
-
Peer dependency ranges: `hono ^4.0.0`, `drizzle-orm ^0.45.
|
|
78
|
+
Peer dependency ranges: `hono ^4.0.0`, `drizzle-orm ^0.45.2`, `zod ^3.23.0 || ^4.0.0`, `@cloudflare/workers-types ^4.20240925.0`.
|
|
79
79
|
|
|
80
80
|
## Quickstart
|
|
81
81
|
|
|
@@ -89,11 +89,11 @@ Peer dependency ranges: `hono ^4.0.0`, `drizzle-orm ^0.45.0`, `zod ^3.23.0 || ^4
|
|
|
89
89
|
|
|
90
90
|
export const postTableName = 'posts'
|
|
91
91
|
export const postFields = {
|
|
92
|
-
id: t.uuid().primary(),
|
|
92
|
+
id: t.uuid().primary().readOnly(), // auto-generates UUID on create
|
|
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()),
|
|
96
|
+
createdAt: t.timestamp().default(() => new Date()).readOnly(),
|
|
97
97
|
}
|
|
98
98
|
```
|
|
99
99
|
|
|
@@ -181,10 +181,10 @@ export default {
|
|
|
181
181
|
|
|
182
182
|
app.post(
|
|
183
183
|
'/posts',
|
|
184
|
-
Post.validator('json',
|
|
184
|
+
Post.validator('json', 'create'), // readOnly fields auto-excluded
|
|
185
185
|
async (c) => {
|
|
186
186
|
const body = c.req.valid('json')
|
|
187
|
-
const created = await Post.create(
|
|
187
|
+
const created = await Post.create(body) // id auto-generated via readOnly UUID
|
|
188
188
|
return c.json(created, 201)
|
|
189
189
|
}
|
|
190
190
|
)
|
|
@@ -317,16 +317,16 @@ The optional `where` field accepts either an equality object or a Drizzle SQL ex
|
|
|
317
317
|
import { eq, like, or } from 'drizzle-orm'
|
|
318
318
|
|
|
319
319
|
// Equality AND (plain object form)
|
|
320
|
-
const admins = await User.findMany(
|
|
320
|
+
const admins = await User.findMany({ limit: 20, where: { role: 'admin' } })
|
|
321
321
|
|
|
322
322
|
// LIKE pattern (Drizzle SQL expression)
|
|
323
|
-
const exampleUsers = await User.findMany(
|
|
323
|
+
const exampleUsers = await User.findMany({
|
|
324
324
|
limit: 20,
|
|
325
325
|
where: like(User.table.email, '%@example.com'),
|
|
326
326
|
})
|
|
327
327
|
|
|
328
328
|
// OR condition
|
|
329
|
-
const specific = await User.findMany(
|
|
329
|
+
const specific = await User.findMany({
|
|
330
330
|
limit: 20,
|
|
331
331
|
where: or(eq(User.table.email, 'alice@example.com'), eq(User.table.email, 'bob@example.com')),
|
|
332
332
|
})
|
|
@@ -340,10 +340,10 @@ When passing a Drizzle SQL expression, SQL injection prevention follows Drizzle'
|
|
|
340
340
|
|
|
341
341
|
```ts
|
|
342
342
|
// Fetch all users (no limit)
|
|
343
|
-
const users = await User.findAll(
|
|
343
|
+
const users = await User.findAll()
|
|
344
344
|
|
|
345
345
|
// With filtering and ordering
|
|
346
|
-
const admins = await User.findAll(
|
|
346
|
+
const admins = await User.findAll({ orderBy: 'name', where: { role: 'admin' } })
|
|
347
347
|
|
|
348
348
|
// Apply toResponseMany to strip serverOnly fields
|
|
349
349
|
return c.json(User.toResponseMany(users))
|
|
@@ -623,6 +623,26 @@ var JsonFieldBuilder = class _JsonFieldBuilder extends BaseFieldBuilder {
|
|
|
623
623
|
return this.cloneWithModifiers(newMods);
|
|
624
624
|
}
|
|
625
625
|
};
|
|
626
|
+
var RelationFieldBuilder = class {
|
|
627
|
+
kind = "relation";
|
|
628
|
+
relationKind;
|
|
629
|
+
target;
|
|
630
|
+
foreignKey;
|
|
631
|
+
tsType;
|
|
632
|
+
// biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for empty modifiers
|
|
633
|
+
modifiers = {};
|
|
634
|
+
constructor(relationKind, target, foreignKey) {
|
|
635
|
+
this.relationKind = relationKind;
|
|
636
|
+
this.target = target;
|
|
637
|
+
this.foreignKey = foreignKey;
|
|
638
|
+
}
|
|
639
|
+
get zodBase() {
|
|
640
|
+
return z.never();
|
|
641
|
+
}
|
|
642
|
+
drizzleColumn(name) {
|
|
643
|
+
throw new Error(`relation field '${name}' has no DB column`);
|
|
644
|
+
}
|
|
645
|
+
};
|
|
626
646
|
function jsonField(schema) {
|
|
627
647
|
return new JsonFieldBuilder(void 0, schema);
|
|
628
648
|
}
|
|
@@ -656,9 +676,15 @@ var t = {
|
|
|
656
676
|
* @note codegen (`nanoka generate`) は `t.json(zodSchema)` を渡しても `$type<unknown>()` のまま出力する。
|
|
657
677
|
* Drizzle 型が欲しい場合は生成後に手動で書き換えるか `as` を使うこと。
|
|
658
678
|
*/
|
|
659
|
-
json: jsonField
|
|
679
|
+
json: jsonField,
|
|
680
|
+
hasMany(target, options) {
|
|
681
|
+
return new RelationFieldBuilder("hasMany", target, options.foreignKey);
|
|
682
|
+
},
|
|
683
|
+
belongsTo(target, options) {
|
|
684
|
+
return new RelationFieldBuilder("belongsTo", target, options.foreignKey);
|
|
685
|
+
}
|
|
660
686
|
};
|
|
661
687
|
|
|
662
688
|
export { t };
|
|
663
|
-
//# sourceMappingURL=chunk-
|
|
664
|
-
//# sourceMappingURL=chunk-
|
|
689
|
+
//# sourceMappingURL=chunk-SHPR4NTZ.js.map
|
|
690
|
+
//# sourceMappingURL=chunk-SHPR4NTZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/field/builder.ts","../src/field/factories.ts"],"names":["zLib"],"mappings":"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","file":"chunk-GZC7BVP2.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 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 (\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.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"]}
|
|
1
|
+
{"version":3,"sources":["../src/field/builder.ts","../src/field/factories.ts"],"names":["zLib"],"mappings":"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","file":"chunk-SHPR4NTZ.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 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.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// ==================== 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 // biome-ignore lint/complexity/noBannedTypes: {} is used intentionally for empty modifiers\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
|
@@ -9,6 +9,7 @@ import { spawn } from 'child_process';
|
|
|
9
9
|
|
|
10
10
|
// src/codegen/render-field.ts
|
|
11
11
|
function renderField(fieldName, field) {
|
|
12
|
+
if (field.kind === "relation") return null;
|
|
12
13
|
const lines = [];
|
|
13
14
|
const kind = field.kind;
|
|
14
15
|
let colType;
|
|
@@ -64,6 +65,7 @@ function detectImports(models) {
|
|
|
64
65
|
for (const model of models) {
|
|
65
66
|
for (const field of Object.values(model.fields)) {
|
|
66
67
|
const kind = field.kind;
|
|
68
|
+
if (kind === "relation") continue;
|
|
67
69
|
if (kind === "string" || kind === "uuid" || kind === "json") {
|
|
68
70
|
imports.text = true;
|
|
69
71
|
} else if (kind === "number") {
|
|
@@ -72,7 +74,8 @@ function detectImports(models) {
|
|
|
72
74
|
imports.integer = true;
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
|
-
|
|
77
|
+
const nonRelationFields = Object.values(model.fields).filter((f) => f.kind !== "relation");
|
|
78
|
+
if (nonRelationFields.length > 0) {
|
|
76
79
|
imports.sqliteTable = true;
|
|
77
80
|
}
|
|
78
81
|
}
|
|
@@ -101,7 +104,10 @@ function generateDrizzleSchema(models) {
|
|
|
101
104
|
for (const model of models) {
|
|
102
105
|
const fieldLines = [];
|
|
103
106
|
for (const [fieldName, field] of Object.entries(model.fields)) {
|
|
104
|
-
|
|
107
|
+
const rendered = renderField(fieldName, field);
|
|
108
|
+
if (rendered !== null) {
|
|
109
|
+
fieldLines.push(rendered);
|
|
110
|
+
}
|
|
105
111
|
}
|
|
106
112
|
const fieldsStr = fieldLines.length > 0 ? fieldLines.join("\n") : "";
|
|
107
113
|
const tableContent = fieldsStr ? `{
|
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 {\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 { 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 } 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"]}
|
package/dist/config.d.ts
CHANGED