@@ -31,6 +31,7 @@ const validPost = {
3131 title : 'My First Post' ,
3232 published : true ,
3333 authorId : null ,
34+ tags : [ 'announcement' , 'update' ] ,
3435} ;
3536
3637describe ( 'SchemaFactory - makeModelSchema' , ( ) => {
@@ -103,6 +104,19 @@ describe('SchemaFactory - makeModelSchema', () => {
103104 // optional scalar (foreign key)
104105 expectTypeOf < Post [ 'authorId' ] > ( ) . toEqualTypeOf < string | null | undefined > ( ) ;
105106
107+ // scalar array
108+ expectTypeOf < Post [ 'tags' ] > ( ) . toEqualTypeOf < string [ ] > ( ) ;
109+
110+ const createPostSchema = factory . makeModelCreateSchema ( 'Post' ) ;
111+ type PostCreate = z . infer < typeof createPostSchema > ;
112+
113+ expectTypeOf < PostCreate [ 'tags' ] > ( ) . toEqualTypeOf < string [ ] > ( ) ;
114+
115+ const updatePostSchema = factory . makeModelUpdateSchema ( 'Post' ) ;
116+ type PostUpdate = z . infer < typeof updatePostSchema > ;
117+
118+ expectTypeOf < PostUpdate [ 'tags' ] > ( ) . toEqualTypeOf < string [ ] | undefined > ( ) ;
119+
106120 // optional relation field present in type
107121 expectTypeOf < Post > ( ) . toHaveProperty ( 'author' ) ;
108122 const _userSchema = factory . makeModelSchema ( 'User' ) ;
@@ -362,7 +376,7 @@ describe('SchemaFactory - makeModelSchema', () => {
362376 const userSchema = factory . makeModelSchema ( 'User' ) ;
363377 const result = userSchema . safeParse ( {
364378 ...validUser ,
365- address : { street : '123 Main St' , city : 'Springfield' , zip : null } ,
379+ address : { residents : [ ] , street : '123 Main St' , city : 'Springfield' , zip : null } ,
366380 } ) ;
367381 expect ( result . success ) . toBe ( true ) ;
368382 } ) ;
@@ -371,7 +385,7 @@ describe('SchemaFactory - makeModelSchema', () => {
371385 const userSchema = factory . makeModelSchema ( 'User' ) ;
372386 const result = userSchema . safeParse ( {
373387 ...validUser ,
374- address : { street : '123 Main St' , city : 'Springfield' , zip : '12345' } ,
388+ address : { residents : [ ] , street : '123 Main St' , city : 'Springfield' , zip : '12345' } ,
375389 } ) ;
376390 expect ( result . success ) . toBe ( true ) ;
377391 } ) ;
@@ -380,7 +394,7 @@ describe('SchemaFactory - makeModelSchema', () => {
380394 const userSchema = factory . makeModelSchema ( 'User' ) ;
381395 const result = userSchema . safeParse ( {
382396 ...validUser ,
383- address : { street : '123 Main St' , city : 'Springfield' , zip : null , extra : 'field' } ,
397+ address : { residents : [ ] , street : '123 Main St' , city : 'Springfield' , zip : null , extra : 'field' } ,
384398 } ) ;
385399 expect ( result . success ) . toBe ( false ) ;
386400 } ) ;
@@ -389,7 +403,7 @@ describe('SchemaFactory - makeModelSchema', () => {
389403 const userSchema = factory . makeModelSchema ( 'User' ) ;
390404 const result = userSchema . safeParse ( {
391405 ...validUser ,
392- address : { street : '123 Main St' } ,
406+ address : { residents : [ ] , street : '123 Main St' } ,
393407 } ) ;
394408 expect ( result . success ) . toBe ( false ) ;
395409 } ) ;
@@ -440,18 +454,21 @@ describe('SchemaFactory - makeModelSchema', () => {
440454describe ( 'SchemaFactory - makeTypeSchema' , ( ) => {
441455 it ( 'generates schema for Address typedef' , ( ) => {
442456 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
443- expect ( addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' , zip : null } ) . success ) . toBe ( true ) ;
457+ expect (
458+ addressSchema . safeParse ( { residents : [ ] , street : '123 Main' , city : 'Springfield' , zip : null } ) . success ,
459+ ) . toBe ( true ) ;
444460 } ) ;
445461
446462 it ( 'rejects Address with missing required field' , ( ) => {
447463 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
448- const result = addressSchema . safeParse ( { street : '123 Main' } ) ;
464+ const result = addressSchema . safeParse ( { residents : [ ] , street : '123 Main' } ) ;
449465 expect ( result . success ) . toBe ( false ) ;
450466 } ) ;
451467
452468 it ( 'rejects Address with extra fields (strict object)' , ( ) => {
453469 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
454470 const result = addressSchema . safeParse ( {
471+ residents : [ ] ,
455472 street : '123 Main' ,
456473 city : 'Springfield' ,
457474 zip : null ,
@@ -462,47 +479,71 @@ describe('SchemaFactory - makeTypeSchema', () => {
462479
463480 it ( 'accepts Address with optional zip as null' , ( ) => {
464481 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
465- expect ( addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' , zip : null } ) . success ) . toBe ( true ) ;
482+ expect (
483+ addressSchema . safeParse ( { residents : [ ] , street : '123 Main' , city : 'Springfield' , zip : null } ) . success ,
484+ ) . toBe ( true ) ;
466485 } ) ;
467486
468487 it ( 'accepts Address with optional zip as a string' , ( ) => {
469488 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
470- expect ( addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' , zip : '12345' } ) . success ) . toBe ( true ) ;
489+ expect (
490+ addressSchema . safeParse ( { residents : [ ] , street : '123 Main' , city : 'Springfield' , zip : '12345' } ) . success ,
491+ ) . toBe ( true ) ;
471492 } ) ;
472493
473494 describe ( 'extra validations' , ( ) => {
474495 it ( 'passes when zip is null' , ( ) => {
475496 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
476- expect ( addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' , zip : null } ) . success ) . toBe ( true ) ;
497+ expect (
498+ addressSchema . safeParse ( { residents : [ ] , street : '123 Main' , city : 'Springfield' , zip : null } ) . success ,
499+ ) . toBe ( true ) ;
477500 } ) ;
478501
479502 it ( 'passes when zip is omitted' , ( ) => {
480503 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
481- expect ( addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' } ) . success ) . toBe ( true ) ;
504+ expect ( addressSchema . safeParse ( { residents : [ ] , street : '123 Main' , city : 'Springfield' } ) . success ) . toBe (
505+ true ,
506+ ) ;
482507 } ) ;
483508
484509 it ( 'passes when zip is exactly 5 characters' , ( ) => {
485510 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
486- expect ( addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' , zip : '90210' } ) . success ) . toBe (
487- true ,
488- ) ;
511+ expect (
512+ addressSchema . safeParse ( { residents : [ ] , street : '123 Main' , city : 'Springfield' , zip : '90210' } )
513+ . success ,
514+ ) . toBe ( true ) ;
489515 } ) ;
490516
491517 it ( 'fails when zip is fewer than 5 characters' , ( ) => {
492518 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
493- const result = addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' , zip : '123' } ) ;
519+ const result = addressSchema . safeParse ( {
520+ residents : [ ] ,
521+ street : '123 Main' ,
522+ city : 'Springfield' ,
523+ zip : '123' ,
524+ } ) ;
494525 expect ( result . success ) . toBe ( false ) ;
495526 } ) ;
496527
497528 it ( 'fails when zip is more than 5 characters' , ( ) => {
498529 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
499- const result = addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' , zip : '123456' } ) ;
530+ const result = addressSchema . safeParse ( {
531+ residents : [ ] ,
532+ street : '123 Main' ,
533+ city : 'Springfield' ,
534+ zip : '123456' ,
535+ } ) ;
500536 expect ( result . success ) . toBe ( false ) ;
501537 } ) ;
502538
503539 it ( 'error message matches the configured message' , ( ) => {
504540 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
505- const result = addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' , zip : '123' } ) ;
541+ const result = addressSchema . safeParse ( {
542+ residents : [ ] ,
543+ street : '123 Main' ,
544+ city : 'Springfield' ,
545+ zip : '123' ,
546+ } ) ;
506547 expect ( result . success ) . toBe ( false ) ;
507548 if ( ! result . success ) {
508549 expect ( result . error . issues . map ( ( i ) => i . message ) ) . toContain ( 'Zip code must be exactly 5 characters' ) ;
@@ -511,7 +552,12 @@ describe('SchemaFactory - makeTypeSchema', () => {
511552
512553 it ( 'error path points to the zip field' , ( ) => {
513554 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
514- const result = addressSchema . safeParse ( { street : '123 Main' , city : 'Springfield' , zip : '123' } ) ;
555+ const result = addressSchema . safeParse ( {
556+ residents : [ ] ,
557+ street : '123 Main' ,
558+ city : 'Springfield' ,
559+ zip : '123' ,
560+ } ) ;
515561 expect ( result . success ) . toBe ( false ) ;
516562 if ( ! result . success ) {
517563 expect ( result . error . issues . map ( ( i ) => i . path ) ) . toContainEqual ( [ 'zip' ] ) ;
@@ -520,7 +566,7 @@ describe('SchemaFactory - makeTypeSchema', () => {
520566
521567 it ( 'fails when city is too short' , ( ) => {
522568 const addressSchema = factory . makeTypeSchema ( 'Address' ) ;
523- const result = addressSchema . safeParse ( { street : '123 Main' , city : '' , zip : '12345' } ) ;
569+ const result = addressSchema . safeParse ( { residents : [ ] , street : '123 Main' , city : '' , zip : '12345' } ) ;
524570 expect ( result . success ) . toBe ( false ) ;
525571 } ) ;
526572
@@ -541,12 +587,14 @@ describe('SchemaFactory - makeTypeSchema', () => {
541587 avatar : null ,
542588 metadata : null ,
543589 status : 'ACTIVE' ,
544- address : { street : '123 Main' , city : 'Springfield' , zip : '90210' } ,
590+ address : { residents : [ ] , street : '123 Main' , city : 'Springfield' , zip : '90210' } ,
545591 } ;
546592 expect ( userSchema . safeParse ( validUser ) . success ) . toBe ( true ) ;
547593 expect (
548- userSchema . safeParse ( { ...validUser , address : { street : '123 Main' , city : 'Springfield' , zip : '123' } } )
549- . success ,
594+ userSchema . safeParse ( {
595+ ...validUser ,
596+ address : { residents : [ 'Alice' ] , street : '123 Main' , city : 'Springfield' , zip : '123' } ,
597+ } ) . success ,
550598 ) . toBe ( false ) ;
551599 } ) ;
552600 } ) ;
0 commit comments