1
1
import { DMMF } from '@prisma/generator-helper' ;
2
2
import {
3
3
CrudFailureReason ,
4
+ PluginError ,
4
5
PluginOptions ,
5
6
RUNTIME_PACKAGE ,
6
7
requireOption ,
@@ -12,6 +13,7 @@ import { promises as fs } from 'fs';
12
13
import { lowerCaseFirst } from 'lower-case-first' ;
13
14
import path from 'path' ;
14
15
import { Project } from 'ts-morph' ;
16
+ import { name } from '.' ;
15
17
import {
16
18
generateHelperImport ,
17
19
generateProcedure ,
@@ -27,6 +29,29 @@ export async function generate(model: Model, options: PluginOptions, dmmf: DMMF.
27
29
let outDir = requireOption < string > ( options , 'output' ) ;
28
30
outDir = resolvePath ( outDir , options ) ;
29
31
32
+ // resolve "generateModelActions" option
33
+ let generateModelActions : string [ ] | undefined = undefined ;
34
+ if ( options . generateModelActions ) {
35
+ if ( typeof options . generateModelActions === 'string' ) {
36
+ // comma separated string
37
+ generateModelActions = options . generateModelActions
38
+ . split ( ',' )
39
+ . filter ( ( i ) => ! ! i )
40
+ . map ( ( i ) => i . trim ( ) ) ;
41
+ } else if (
42
+ Array . isArray ( options . generateModelActions ) &&
43
+ options . generateModelActions . every ( ( i ) => typeof i === 'string' )
44
+ ) {
45
+ // string array
46
+ generateModelActions = options . generateModelActions as string [ ] ;
47
+ } else {
48
+ throw new PluginError (
49
+ name ,
50
+ `Invalid "generateModelActions" option: must be a comma-separated string or an array of strings`
51
+ ) ;
52
+ }
53
+ }
54
+
30
55
await fs . mkdir ( outDir , { recursive : true } ) ;
31
56
await removeDir ( outDir , true ) ;
32
57
@@ -39,13 +64,18 @@ export async function generate(model: Model, options: PluginOptions, dmmf: DMMF.
39
64
const hiddenModels : string [ ] = [ ] ;
40
65
resolveModelsComments ( models , hiddenModels ) ;
41
66
42
- createAppRouter ( outDir , modelOperations , hiddenModels ) ;
67
+ createAppRouter ( outDir , modelOperations , hiddenModels , generateModelActions ) ;
43
68
createHelper ( outDir ) ;
44
69
45
70
await saveProject ( project ) ;
46
71
}
47
72
48
- function createAppRouter ( outDir : string , modelOperations : DMMF . ModelMapping [ ] , hiddenModels : string [ ] ) {
73
+ function createAppRouter (
74
+ outDir : string ,
75
+ modelOperations : DMMF . ModelMapping [ ] ,
76
+ hiddenModels : string [ ] ,
77
+ generateModelActions : string [ ] | undefined
78
+ ) {
49
79
const appRouter = project . createSourceFile ( path . resolve ( outDir , 'routers' , `index.ts` ) , undefined , {
50
80
overwrite : true ,
51
81
} ) ;
@@ -109,7 +139,10 @@ function createAppRouter(outDir: string, modelOperations: DMMF.ModelMapping[], h
109
139
continue ;
110
140
}
111
141
112
- generateModelCreateRouter ( project , model , operations , outDir ) ;
142
+ // somehow dmmf doesn't contain "count" operation, we need to add it here
143
+ operations . count = 'count' ;
144
+
145
+ generateModelCreateRouter ( project , model , operations , outDir , generateModelActions ) ;
113
146
114
147
appRouter . addImportDeclaration ( {
115
148
defaultImport : `create${ model } Router` ,
@@ -129,7 +162,8 @@ function generateModelCreateRouter(
129
162
project : Project ,
130
163
model : string ,
131
164
operations : Record < string , string | undefined | null > ,
132
- outputDir : string
165
+ outputDir : string ,
166
+ generateModelActions : string [ ] | undefined
133
167
) {
134
168
const modelRouter = project . createSourceFile ( path . resolve ( outputDir , 'routers' , `${ model } .router.ts` ) , undefined , {
135
169
overwrite : true ,
@@ -162,11 +196,15 @@ function generateModelCreateRouter(
162
196
writer . block ( ( ) => {
163
197
for ( const [ opType , opNameWithModel ] of Object . entries ( operations ) ) {
164
198
const baseOpType = opType . replace ( 'OrThrow' , '' ) ;
165
-
166
199
const inputType = getInputTypeByOpName ( baseOpType , model ) ;
167
-
168
- if ( opNameWithModel && inputType ) {
169
- generateProcedure ( writer , opType . replace ( / O n e $ / , '' ) , inputType , model , baseOpType ) ;
200
+ const generateOpName = opType . replace ( / O n e $ / , '' ) ;
201
+
202
+ if (
203
+ opNameWithModel &&
204
+ inputType &&
205
+ ( ! generateModelActions || generateModelActions . includes ( generateOpName ) )
206
+ ) {
207
+ generateProcedure ( writer , generateOpName , inputType , model , baseOpType ) ;
170
208
}
171
209
}
172
210
} ) ;
0 commit comments