@@ -6,10 +6,49 @@ import { TypeId, TYPE_IDENTITY, TYPE_VALIDATOR,
66 IDENTITY_SUBTYPE_PRIMARY , OBJECT_SUBTYPE_ENTITY ,
77 VALIDATOR_SUBTYPE_REGEX , VALIDATOR_SUBTYPE_LENGTH ,
88 MetaDataLoader , InMemoryStringSource } from "@metaobjectsdev/metadata" ;
9- import { meta , metaObject , metaField } from "../_meta-build.js" ;
9+ import { meta , metaObject , metaField , metaRoot } from "../_meta-build.js" ;
1010import { renderZodValidators } from "../../src/templates/zod-validators.js" ;
11+ import { makeRenderContext } from "../../src/render-context.js" ;
12+ import { buildPkMap } from "../../src/pk-resolver.js" ;
13+ import { buildRelationMap } from "../../src/relation-resolver.js" ;
14+ import { FIELD_SUBTYPE_TIMESTAMP } from "@metaobjectsdev/metadata" ;
1115
1216describe ( "renderZodValidators" , ( ) => {
17+ // Reported against an adopting project: a plain field.timestamp (autoSet or not) always got
18+ // z.string() regardless of timestampMode, disagreeing with a "date"-mode Drizzle column
19+ // (Date-typed) and failing to typecheck downstream.
20+ test ( "timestampMode: \"date\" — field.timestamp gets z.date(), @autoSet gets a Date-returning transform" , ( ) => {
21+ const post = metaObject ( OBJECT_SUBTYPE_ENTITY , "Post" ) ;
22+ const id = metaField ( FIELD_SUBTYPE_LONG , "id" ) ;
23+ post . addChild ( id ) ;
24+ const updatedAt = metaField ( FIELD_SUBTYPE_TIMESTAMP , "updatedAt" ) ; // plain, not autoSet
25+ post . addChild ( updatedAt ) ;
26+ const createdAt = metaField ( FIELD_SUBTYPE_TIMESTAMP , "createdAt" ) ;
27+ createdAt . setAttr ( "required" , true ) ;
28+ createdAt . setAttr ( "autoSet" , "onCreate" ) ;
29+ post . addChild ( createdAt ) ;
30+ const primary = meta ( new TypeId ( TYPE_IDENTITY , IDENTITY_SUBTYPE_PRIMARY ) , "primary" ) ;
31+ primary . setAttr ( "fields" , [ "id" ] ) ;
32+ primary . setAttr ( "generation" , "increment" ) ;
33+ post . addChild ( primary ) ;
34+
35+ const root = metaRoot ( ) ;
36+ root . addChild ( post ) ;
37+ const ctx = makeRenderContext ( {
38+ dialect : "postgres" ,
39+ timestampMode : "date" ,
40+ loadedRoot : root ,
41+ outDir : "/x" ,
42+ dbImport : "~/db" ,
43+ pkMap : buildPkMap ( root ) ,
44+ relationMap : buildRelationMap ( root ) ,
45+ } ) ;
46+ const out = renderZodValidators ( post , ctx ) . toString ( ) ;
47+ expect ( out ) . toContain ( "updatedAt: z.date()" ) ; // plain field, general zodFieldExpr path
48+ expect ( out ) . toContain ( "z.date().optional().transform(() =>" ) ; // @autoSet insert path
49+ expect ( out ) . not . toContain ( "z.string()" ) ; // no stale string-typed timestamp anywhere
50+ expect ( out ) . not . toContain ( ".toISOString()" ) ;
51+ } ) ;
1352 test ( "emits InsertSchema with required fields and optional unset fields" , ( ) => {
1453 const post = metaObject ( OBJECT_SUBTYPE_ENTITY , "Post" ) ;
1554 const id = metaField ( FIELD_SUBTYPE_LONG , "id" ) ;
0 commit comments