@nanokajs/core 0.1.4 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config.js CHANGED
@@ -1,4 +1,4 @@
1
- export { t } from './chunk-F5OBRXXY.js';
1
+ export { t } from './chunk-UYXRKFAR.js';
2
2
 
3
3
  // src/config.ts
4
4
  function defineConfig(config) {
@@ -1,6 +1,7 @@
1
1
  import { SQLiteColumnBuilderBase } from 'drizzle-orm/sqlite-core';
2
2
  import { z } from 'zod';
3
3
 
4
+ type FieldPolicy = 'serverOnly' | 'writeOnly' | 'readOnly';
4
5
  interface FieldModifiers {
5
6
  optional?: boolean;
6
7
  primary?: boolean;
@@ -10,6 +11,7 @@ interface FieldModifiers {
10
11
  format?: 'email' | 'uuid';
11
12
  min?: number;
12
13
  max?: number;
14
+ policy?: FieldPolicy;
13
15
  }
14
16
  type FieldKind = 'string' | 'uuid' | 'number' | 'integer' | 'boolean' | 'timestamp' | 'json';
15
17
  /**
@@ -60,7 +62,7 @@ interface Field<TS = unknown, Mods extends FieldModifiers = {}, ZB extends z.Zod
60
62
  * type T1 = InferFieldType<typeof t.string()> // string
61
63
  * type T2 = InferFieldType<typeof t.string().optional()> // string | undefined
62
64
  */
63
- type InferFieldType<F> = F extends Field<infer T, FieldModifiers, z.ZodTypeAny> ? T : never;
65
+ type InferFieldType<F> = F extends Field<infer T, FieldModifiers, z.ZodTypeAny> ? T : F extends Field<infer T, FieldModifiers, any> ? T : never;
64
66
 
65
67
  /**
66
68
  * Abstract base class for field builders.
@@ -94,7 +96,7 @@ declare abstract class BaseFieldBuilder<TS, Mods extends FieldModifiers = {}, ZB
94
96
  protected applyModifiersToZod(baseSchema: z.ZodTypeAny): z.ZodTypeAny;
95
97
  }
96
98
 
97
- declare class StringFieldBuilder<TS = string, Mods extends FieldModifiers = {}, ZB extends z.ZodType<TS, z.ZodTypeDef, TS> = z.ZodType<TS, z.ZodTypeDef, TS>> extends BaseFieldBuilder<TS, Mods, ZB> {
99
+ declare class StringFieldBuilder<TS = string, Mods extends FieldModifiers = {}, ZB extends z.ZodTypeAny = z.ZodTypeAny> extends BaseFieldBuilder<TS, Mods, ZB> {
98
100
  readonly kind: "string";
99
101
  get zodBase(): ZB;
100
102
  drizzleColumn(name: string): SQLiteColumnBuilderBase;
@@ -141,8 +143,17 @@ declare class StringFieldBuilder<TS = string, Mods extends FieldModifiers = {},
141
143
  max(this: StringFieldBuilder<TS, Mods>, n: number): StringFieldBuilder<TS, Mods & {
142
144
  max: number;
143
145
  }>;
146
+ serverOnly(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Omit<Mods, 'policy'> & {
147
+ policy: 'serverOnly';
148
+ }>;
149
+ writeOnly(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Omit<Mods, 'policy'> & {
150
+ policy: 'writeOnly';
151
+ }>;
152
+ readOnly(this: StringFieldBuilder<TS, Mods>): StringFieldBuilder<TS, Omit<Mods, 'policy'> & {
153
+ policy: 'readOnly';
154
+ }>;
144
155
  }
145
- declare class UuidFieldBuilder<TS = string, Mods extends FieldModifiers = {}, ZB extends z.ZodType<TS, z.ZodTypeDef, TS> = z.ZodType<TS, z.ZodTypeDef, TS>> extends BaseFieldBuilder<TS, Mods, ZB> {
156
+ declare class UuidFieldBuilder<TS = string, Mods extends FieldModifiers = {}, ZB extends z.ZodTypeAny = z.ZodTypeAny> extends BaseFieldBuilder<TS, Mods, ZB> {
146
157
  readonly kind: "uuid";
147
158
  get zodBase(): ZB;
148
159
  drizzleColumn(name: string): SQLiteColumnBuilderBase;
@@ -183,8 +194,17 @@ declare class UuidFieldBuilder<TS = string, Mods extends FieldModifiers = {}, ZB
183
194
  max(this: UuidFieldBuilder<TS, Mods>, n: number): UuidFieldBuilder<TS, Mods & {
184
195
  max: number;
185
196
  }>;
197
+ serverOnly(this: UuidFieldBuilder<TS, Mods>): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & {
198
+ policy: 'serverOnly';
199
+ }>;
200
+ writeOnly(this: UuidFieldBuilder<TS, Mods>): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & {
201
+ policy: 'writeOnly';
202
+ }>;
203
+ readOnly(this: UuidFieldBuilder<TS, Mods>): UuidFieldBuilder<TS, Omit<Mods, 'policy'> & {
204
+ policy: 'readOnly';
205
+ }>;
186
206
  }
187
- declare class NumberFieldBuilder<TS = number, Mods extends FieldModifiers = {}, ZB extends z.ZodType<TS, z.ZodTypeDef, TS> = z.ZodType<TS, z.ZodTypeDef, TS>> extends BaseFieldBuilder<TS, Mods, ZB> {
207
+ declare class NumberFieldBuilder<TS = number, Mods extends FieldModifiers = {}, ZB extends z.ZodTypeAny = z.ZodTypeAny> extends BaseFieldBuilder<TS, Mods, ZB> {
188
208
  readonly kind: "number";
189
209
  get zodBase(): ZB;
190
210
  drizzleColumn(name: string): SQLiteColumnBuilderBase;
@@ -225,8 +245,17 @@ declare class NumberFieldBuilder<TS = number, Mods extends FieldModifiers = {},
225
245
  max(this: NumberFieldBuilder<TS, Mods>, n: number): NumberFieldBuilder<TS, Mods & {
226
246
  max: number;
227
247
  }>;
248
+ serverOnly(this: NumberFieldBuilder<TS, Mods>): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & {
249
+ policy: 'serverOnly';
250
+ }>;
251
+ writeOnly(this: NumberFieldBuilder<TS, Mods>): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & {
252
+ policy: 'writeOnly';
253
+ }>;
254
+ readOnly(this: NumberFieldBuilder<TS, Mods>): NumberFieldBuilder<TS, Omit<Mods, 'policy'> & {
255
+ policy: 'readOnly';
256
+ }>;
228
257
  }
229
- declare class IntegerFieldBuilder<TS = number, Mods extends FieldModifiers = {}, ZB extends z.ZodType<TS, z.ZodTypeDef, TS> = z.ZodType<TS, z.ZodTypeDef, TS>> extends BaseFieldBuilder<TS, Mods, ZB> {
258
+ declare class IntegerFieldBuilder<TS = number, Mods extends FieldModifiers = {}, ZB extends z.ZodTypeAny = z.ZodTypeAny> extends BaseFieldBuilder<TS, Mods, ZB> {
230
259
  readonly kind: "integer";
231
260
  get zodBase(): ZB;
232
261
  drizzleColumn(name: string): SQLiteColumnBuilderBase;
@@ -267,8 +296,17 @@ declare class IntegerFieldBuilder<TS = number, Mods extends FieldModifiers = {},
267
296
  max(this: IntegerFieldBuilder<TS, Mods>, n: number): IntegerFieldBuilder<TS, Mods & {
268
297
  max: number;
269
298
  }>;
299
+ serverOnly(this: IntegerFieldBuilder<TS, Mods>): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & {
300
+ policy: 'serverOnly';
301
+ }>;
302
+ writeOnly(this: IntegerFieldBuilder<TS, Mods>): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & {
303
+ policy: 'writeOnly';
304
+ }>;
305
+ readOnly(this: IntegerFieldBuilder<TS, Mods>): IntegerFieldBuilder<TS, Omit<Mods, 'policy'> & {
306
+ policy: 'readOnly';
307
+ }>;
270
308
  }
271
- declare class BooleanFieldBuilder<TS = boolean, Mods extends FieldModifiers = {}, ZB extends z.ZodType<TS, z.ZodTypeDef, TS> = z.ZodType<TS, z.ZodTypeDef, TS>> extends BaseFieldBuilder<TS, Mods, ZB> {
309
+ declare class BooleanFieldBuilder<TS = boolean, Mods extends FieldModifiers = {}, ZB extends z.ZodTypeAny = z.ZodTypeAny> extends BaseFieldBuilder<TS, Mods, ZB> {
272
310
  readonly kind: "boolean";
273
311
  get zodBase(): ZB;
274
312
  drizzleColumn(name: string): SQLiteColumnBuilderBase;
@@ -297,8 +335,17 @@ declare class BooleanFieldBuilder<TS = boolean, Mods extends FieldModifiers = {}
297
335
  default(this: BooleanFieldBuilder<TS, Mods>, value: TS | (() => TS)): BooleanFieldBuilder<TS, Mods & {
298
336
  hasDefault: true;
299
337
  }>;
338
+ serverOnly(this: BooleanFieldBuilder<TS, Mods>): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & {
339
+ policy: 'serverOnly';
340
+ }>;
341
+ writeOnly(this: BooleanFieldBuilder<TS, Mods>): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & {
342
+ policy: 'writeOnly';
343
+ }>;
344
+ readOnly(this: BooleanFieldBuilder<TS, Mods>): BooleanFieldBuilder<TS, Omit<Mods, 'policy'> & {
345
+ policy: 'readOnly';
346
+ }>;
300
347
  }
301
- declare class TimestampFieldBuilder<TS = Date, Mods extends FieldModifiers = {}, ZB extends z.ZodType<TS, z.ZodTypeDef, Date | string | number> = z.ZodType<TS, z.ZodTypeDef, Date | string | number>> extends BaseFieldBuilder<TS, Mods, ZB> {
348
+ declare class TimestampFieldBuilder<TS = Date, Mods extends FieldModifiers = {}, ZB extends z.ZodTypeAny = z.ZodTypeAny> extends BaseFieldBuilder<TS, Mods, ZB> {
302
349
  readonly kind: "timestamp";
303
350
  get zodBase(): ZB;
304
351
  drizzleColumn(name: string): SQLiteColumnBuilderBase;
@@ -327,15 +374,26 @@ declare class TimestampFieldBuilder<TS = Date, Mods extends FieldModifiers = {},
327
374
  default(this: TimestampFieldBuilder<TS, Mods>, value: TS | (() => TS)): TimestampFieldBuilder<TS, Mods & {
328
375
  hasDefault: true;
329
376
  }>;
377
+ serverOnly(this: TimestampFieldBuilder<TS, Mods>): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & {
378
+ policy: 'serverOnly';
379
+ }>;
380
+ writeOnly(this: TimestampFieldBuilder<TS, Mods>): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & {
381
+ policy: 'writeOnly';
382
+ }>;
383
+ readOnly(this: TimestampFieldBuilder<TS, Mods>): TimestampFieldBuilder<TS, Omit<Mods, 'policy'> & {
384
+ policy: 'readOnly';
385
+ }>;
330
386
  }
331
387
  /**
332
388
  * JSON フィールドビルダー。
333
389
  *
334
- * ⚠️ セキュリティ警告: zod ベースは `z.unknown()` のため、API に晒す際は
335
- * `validator()` で除外するか、別途検証が必須。
390
+ * `t.json(zodSchema)` 形式で Zod スキーマを渡すと runtime 検証が走る。
391
+ * スキーマ省略時は `z.unknown()` で後方互換を維持する。
336
392
  */
337
- declare class JsonFieldBuilder<T = unknown, TS = T, Mods extends FieldModifiers = {}, ZB extends z.ZodType<TS, z.ZodTypeDef, TS> = z.ZodType<TS, z.ZodTypeDef, TS>> extends BaseFieldBuilder<TS, Mods, ZB> {
393
+ declare class JsonFieldBuilder<T = unknown, TS = T, Mods extends FieldModifiers = {}, ZB extends z.ZodTypeAny = z.ZodTypeAny> extends BaseFieldBuilder<TS, Mods, ZB> {
338
394
  readonly kind: "json";
395
+ private readonly _zodSchema;
396
+ constructor(modifiers?: Mods, zodSchema?: z.ZodTypeAny);
339
397
  get zodBase(): ZB;
340
398
  drizzleColumn(name: string): SQLiteColumnBuilderBase;
341
399
  protected cloneWithModifiers<NewMods extends FieldModifiers>(mods: NewMods): JsonFieldBuilder<T, TS, NewMods>;
@@ -363,7 +421,18 @@ declare class JsonFieldBuilder<T = unknown, TS = T, Mods extends FieldModifiers
363
421
  default(this: JsonFieldBuilder<T, TS, Mods>, value: TS | (() => TS)): JsonFieldBuilder<T, TS, Mods & {
364
422
  hasDefault: true;
365
423
  }>;
424
+ serverOnly(this: JsonFieldBuilder<T, TS, Mods>): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & {
425
+ policy: 'serverOnly';
426
+ }>;
427
+ writeOnly(this: JsonFieldBuilder<T, TS, Mods>): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & {
428
+ policy: 'writeOnly';
429
+ }>;
430
+ readOnly(this: JsonFieldBuilder<T, TS, Mods>): JsonFieldBuilder<T, TS, Omit<Mods, 'policy'> & {
431
+ policy: 'readOnly';
432
+ }>;
366
433
  }
434
+ declare function jsonField<S extends z.ZodTypeAny>(schema: S): JsonFieldBuilder<z.infer<S>, z.infer<S>, {}>;
435
+ declare function jsonField<T = unknown>(): JsonFieldBuilder<T, T, {}>;
367
436
  /**
368
437
  * Field DSL factory for building type-safe database fields.
369
438
  *
@@ -374,6 +443,7 @@ declare class JsonFieldBuilder<T = unknown, TS = T, Mods extends FieldModifiers
374
443
  * const ageField = t.integer().min(0).max(150)
375
444
  * const createdAtField = t.timestamp().default(() => new Date())
376
445
  * const dataField = t.json<{ foo: string }>()
446
+ * const dataField2 = t.json(z.object({ foo: z.string() })) // runtime validation
377
447
  */
378
448
  declare const t: {
379
449
  string(): StringFieldBuilder<string, {}>;
@@ -383,20 +453,17 @@ declare const t: {
383
453
  boolean(): BooleanFieldBuilder<boolean, {}>;
384
454
  timestamp(): TimestampFieldBuilder<Date, {}>;
385
455
  /**
386
- * JSON フィールド。任意の JSON 値を受け入れる(Zod 内部表現は `z.unknown()`)。
456
+ * JSON フィールド。
457
+ *
458
+ * `t.json(zodSchema)` 形式で Zod スキーマを渡すと runtime 検証が走る。
459
+ * スキーマ省略時は `z.unknown()` で後方互換を維持する。
387
460
  *
388
- * ⚠️ セキュリティ警告:
389
- * このフィールドの zod ベースは `z.unknown()` のため、型パラメータ `T` で
390
- * 指定した制約は **コンパイル時のみ** 適用され、validator() 経由でも
391
- * runtime バリデーションは行われません。API 入力として晒す場合は:
392
- * - `model.validator(target, { omit: ['<json field name>'] })` で除外する、または
393
- * - ハンドラ側で別途 Zod スキーマを使って手動検証する、
394
- * のいずれかを必ず実施してください。型パラメータが `unknown` 以外の値を
395
- * runtime で保証することはありません。
461
+ * `t.json(z.object({ foo: z.string() }))` でオブジェクト形状の runtime 検証が可能。
396
462
  *
397
- * Phase 2 以降で `t.json(zodSchema)` 形式の引数追加を検討中。
463
+ * @note codegen (`nanoka generate`) は `t.json(zodSchema)` を渡しても `$type<unknown>()` のまま出力する。
464
+ * Drizzle 型が欲しい場合は生成後に手動で書き換えるか `as` を使うこと。
398
465
  */
399
- json<T = unknown>(): JsonFieldBuilder<T, T, {}>;
466
+ json: typeof jsonField;
400
467
  };
401
468
 
402
- export { type Field as F, type InferFieldType as I, type FieldModifiers as a, t };
469
+ export { type Field as F, type InferFieldType as I, type FieldPolicy as a, type FieldModifiers as b, t };