@@ -2,19 +2,16 @@ import { DMMF } from "@prisma/generator-helper";
22import { formatEntityName } from "./formatEntityName" ;
33import { prismaTypeMap } from "./prismaTypeMap" ;
44import { InternalGeneratorOptions } from "./onGenerate" ;
5+ import { formatList } from "./formatList" ;
6+ import { formatNull } from "./formatNull" ;
7+ import { isValueField } from "./isValueField" ;
58
6- const formatNull = ( field : DMMF . Field ) => {
7- return ! field . isRequired ? " | null" : "" ;
8- } ;
9-
10- const isBaseField = ( field : DMMF . Field , foreignKeysMap : Record < string , 1 > ) => {
11- return ! (
12- field . isId ||
13- field . isUnique ||
14- field . kind === "object" ||
15- foreignKeysMap [ field . name ]
16- ) ;
17- } ;
9+ const EXTENDED = "Extended" ;
10+ const RELATIONS = "Relations" ;
11+ const VALUES = "Values" ;
12+ const FOREIGN_KEYS = "ForeignKeys" ;
13+ const UNIQUE_KEYS = "UniqueKeys" ;
14+ const KEYS = "Keys" ;
1815
1916export const generateModel = (
2017 model : DMMF . Model ,
@@ -24,8 +21,6 @@ export const generateModel = (
2421
2522 const modelTypeName = formatEntityName ( model . name , config ) ; // TODO: use also model.dbName with alias?
2623
27- // console.log(model.fields);
28-
2924 // Example of foreignKeysMap:
3025 // { categoryId: 1, userId: 1 }
3126 const foreignKeysMap = model . fields
@@ -37,81 +32,118 @@ export const generateModel = (
3732 return acc ;
3833 } , { } as Record < string , 1 > ) ;
3934
40- // Create Keys type
41- out += `export type ${ modelTypeName } Keys = {\n` ;
35+ if ( model . name === "Label" ) console . log ( foreignKeysMap ) ;
36+
37+ // Create UniqueKeys type
38+ out += `export type ${ modelTypeName } ${ UNIQUE_KEYS } = {\n` ;
4239
4340 for ( const field of model . fields ) {
44- if ( isBaseField ( field , foreignKeysMap ) ) {
41+ if (
42+ foreignKeysMap [ field . name ] || // goes in next block
43+ ( ! field . isUnique && ! field . isId ) // must be unique
44+ ) {
4545 continue ;
4646 }
47+
4748 switch ( field . kind ) {
48- case "scalar" :
49- out += ` ${ field . name } : ${ prismaTypeMap . get ( field . type ) } ${
50- field . isList ? "[]" : ""
51- } ${ formatNull ( field ) } ;\n`;
49+ case "scalar" : {
50+ out += ` ${ field . name } : ${ prismaTypeMap . get ( field . type ) } ${ formatList (
51+ field
52+ ) } ${ formatNull ( field ) } ;\n`;
5253 break ;
54+ }
55+ case "enum" : {
56+ out += ` ${ field . name } : ${ formatEntityName (
57+ field . type ,
58+ config
59+ ) } ${ formatList ( field ) } ${ formatNull ( field ) } ;\n`;
60+ break ;
61+ }
5362 default :
5463 break ;
5564 }
5665 }
5766
58- out += `};\n` ;
59- out += "\n" ;
67+ out += `};\n\n` ;
68+
69+ // Create ForeignKeys type
70+ out += `export type ${ modelTypeName } ${ FOREIGN_KEYS } = {\n` ;
71+
72+ for ( const field of model . fields ) {
73+ if ( ! foreignKeysMap [ field . name ] ) {
74+ continue ;
75+ }
76+ switch ( field . kind ) {
77+ case "scalar" : {
78+ out += ` ${ field . name } : ${ prismaTypeMap . get ( field . type ) } ${ formatList (
79+ field
80+ ) } ${ formatNull ( field ) } ;\n`;
81+ break ;
82+ }
83+ default :
84+ break ;
85+ }
86+ }
87+
88+ out += `};\n\n` ;
89+
90+ // Create Keys type
91+ out += `export type ${ modelTypeName } ${ KEYS } = ${ modelTypeName } ${ FOREIGN_KEYS } & ${ modelTypeName } ${ UNIQUE_KEYS } \n\n` ;
6092
6193 // Create Values type
62- out += `export type ${ modelTypeName } Values = {\n` ;
94+ out += `export type ${ modelTypeName } ${ VALUES } = {\n` ;
6395
6496 for ( const field of model . fields ) {
65- if ( ! isBaseField ( field , foreignKeysMap ) ) {
97+ if ( ! isValueField ( field , foreignKeysMap ) ) {
6698 continue ;
6799 }
68100 switch ( field . kind ) {
69- case "enum" :
101+ case "enum" : {
70102 out += ` ${ field . name } : ${ formatEntityName (
71103 field . type ,
72104 config
73- ) } ${ formatNull ( field ) } ;\n`;
105+ ) } ${ formatList ( field ) } ${ formatNull ( field ) } ;\n`;
74106 break ;
107+ }
75108 case "scalar" :
76- case "unsupported" : // Untested
77- out += ` ${ field . name } : ${ prismaTypeMap . get ( field . type ) } ${
78- field . isList ? "[]" : ""
79- } ${ formatNull ( field ) } ;\n`;
109+ case "unsupported" : {
110+ // Untested
111+ out += ` ${ field . name } : ${ prismaTypeMap . get ( field . type ) } ${ formatList (
112+ field
113+ ) } ${ formatNull ( field ) } ;\n`;
80114 break ;
115+ }
81116 default :
82117 break ;
83118 }
84119 }
85120
86- out += `};\n` ;
87- out += "\n" ;
121+ out += `};\n\n` ;
88122
89123 // Create Relations type
90124 out += `export type ${ modelTypeName } ${ RELATIONS } = {\n` ;
91125
92126 for ( const field of model . fields ) {
93127 switch ( field . kind ) {
94- case "object" :
128+ case "object" : {
95129 out += ` ${ field . name } : ${ formatEntityName (
96130 field . type ,
97131 config
98- ) } ${ EXTENDED } ${ field . isList ? "[]" : "" } ${ formatNull ( field ) } ;\n`;
132+ ) } ${ EXTENDED } ${ formatList ( field ) } ${ formatNull ( field ) } ;\n`;
99133 break ;
134+ }
100135 default :
101136 break ;
102137 }
103138 }
104139
105- out += `};\n` ;
106- out += "\n" ;
140+ out += `};\n\n` ;
107141
108142 // Create DB type
109- out += `export type ${ modelTypeName } = ${ modelTypeName } Keys & ${ modelTypeName } Values;\n` ;
110- out += "\n" ;
143+ out += `export type ${ modelTypeName } = ${ modelTypeName } ${ KEYS } & ${ modelTypeName } ${ VALUES } ;\n\n` ;
111144
112145 // Create Extended type
113- out += `export type ${ modelTypeName } ${ EXTENDED } = ${ modelTypeName } & ${ modelTypeName } ${ RELATIONS } ;\n` ;
114- out += "\n" ;
146+ out += `export type ${ modelTypeName } ${ EXTENDED } = ${ modelTypeName } & ${ modelTypeName } ${ RELATIONS } ;\n\n` ;
115147
116148 return out ;
117149} ;
@@ -135,6 +167,3 @@ export const generateModel = (
135167// isGenerated: false,
136168// isUpdatedAt: false
137169// }
138-
139- const EXTENDED = "Extended" ;
140- const RELATIONS = "Relations" ;
0 commit comments