prisma-generator-express 1.37.1 → 1.39.0

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/README.md CHANGED
@@ -301,8 +301,10 @@ app.use((req, res, next) => {
301
301
  app.use('/', UserRouter({
302
302
  findMany: {
303
303
  shape: {
304
- where: { name: { contains: true } },
305
- take: { max: 50, default: 20 },
304
+ default: {
305
+ where: { name: { contains: true } },
306
+ take: { max: 50, default: 20 },
307
+ },
306
308
  },
307
309
  },
308
310
  }))
@@ -322,34 +324,46 @@ Each operation config accepts an optional `shape` property. When present, the ge
322
324
 
323
325
  When `shape` is absent, the handler calls Prisma directly with no guard enforcement.
324
326
 
325
- ### Single shape per operation
327
+ Generated route config types treat `shape` as a named shape map. Use `default` for the normal single-shape case, and add other keys only when you need caller-based variants. The runtime still passes the map to `prisma-guard`; the `default` variant is selected when no caller is provided or no variant matches.
328
+
329
+ ### Default shape per operation
330
+
331
+ In generated route configs, `shape` is always a named shape map. Use the `default` key when an operation has one normal shape and no caller-specific variants.
326
332
 
327
- A single shape object restricts what the client can do on that operation. No caller routing is needed.
333
+ `default` is used when no caller is provided or when the caller does not match a named variant. If you do not want fallback behavior, omit `default` and define only explicit variants.
328
334
 
329
335
  ```ts
330
336
  const userConfig = {
331
337
  findMany: {
332
338
  shape: {
333
- where: { email: { contains: true }, role: { equals: true } },
334
- orderBy: { createdAt: true },
335
- take: { max: 100, default: 25 },
336
- skip: true,
339
+ default: {
340
+ where: { email: { contains: true }, role: { equals: true } },
341
+ orderBy: { createdAt: true },
342
+ take: { max: 100, default: 25 },
343
+ skip: true,
344
+ },
337
345
  },
338
346
  },
339
347
  create: {
340
348
  shape: {
341
- data: { email: true, name: true, role: 'user' },
349
+ default: {
350
+ data: { email: true, name: true, role: 'user' },
351
+ },
342
352
  },
343
353
  },
344
354
  update: {
345
355
  shape: {
346
- data: { name: true },
347
- where: { id: { equals: true } },
356
+ default: {
357
+ data: { name: true },
358
+ where: { id: { equals: true } },
359
+ },
348
360
  },
349
361
  },
350
362
  delete: {
351
363
  shape: {
352
- where: { id: { equals: true } },
364
+ default: {
365
+ where: { id: { equals: true } },
366
+ },
353
367
  },
354
368
  },
355
369
  }
@@ -374,12 +388,14 @@ import { force } from 'prisma-guard'
374
388
  const config = {
375
389
  create: {
376
390
  shape: {
377
- data: {
378
- email: true, // client-controlled, @zod chains apply
379
- name: true, // client-controlled
380
- role: 'member', // forced to 'member', client cannot override
381
- isActive: force(true), // forced to boolean true (force() needed to distinguish from client-controlled)
382
- bio: (base) => base.max(500), // client-controlled with inline validation override
391
+ default: {
392
+ data: {
393
+ email: true, // client-controlled, @zod chains apply
394
+ name: true, // client-controlled
395
+ role: 'member', // forced to 'member', client cannot override
396
+ isActive: force(true), // forced to boolean true (force() needed to distinguish from client-controlled)
397
+ bio: (base) => base.max(500), // client-controlled with inline validation override
398
+ },
383
399
  },
384
400
  },
385
401
  },
@@ -539,13 +555,15 @@ import { force } from 'prisma-guard'
539
555
  const projectConfig = {
540
556
  findMany: {
541
557
  shape: {
542
- where: {
543
- status: { equals: 'published' }, // always filter to published
544
- isDeleted: { equals: false }, // always exclude deleted
545
- isActive: { equals: force(true) }, // force() needed for boolean true
546
- title: { contains: true }, // client-controlled
558
+ default: {
559
+ where: {
560
+ status: { equals: 'published' }, // always filter to published
561
+ isDeleted: { equals: false }, // always exclude deleted
562
+ isActive: { equals: force(true) }, // force() needed for boolean true
563
+ title: { contains: true }, // client-controlled
564
+ },
565
+ take: { max: 50 },
547
566
  },
548
- take: { max: 50 },
549
567
  },
550
568
  },
551
569
  }
@@ -570,14 +588,16 @@ Where shapes support `AND`, `OR`, and `NOT`. The combinator value defines which
570
588
  const config = {
571
589
  findMany: {
572
590
  shape: {
573
- where: {
574
- OR: {
575
- title: { contains: true },
576
- description: { contains: true },
591
+ default: {
592
+ where: {
593
+ OR: {
594
+ title: { contains: true },
595
+ description: { contains: true },
596
+ },
597
+ status: { equals: 'published' }, // forced, always applied
577
598
  },
578
- status: { equals: 'published' }, // forced, always applied
599
+ take: { max: 50 },
579
600
  },
580
- take: { max: 50 },
581
601
  },
582
602
  },
583
603
  }
@@ -606,15 +626,17 @@ Where shapes support relation-level filters. To-many relations use `some`, `ever
606
626
  const userConfig = {
607
627
  findMany: {
608
628
  shape: {
609
- where: {
610
- posts: {
611
- some: {
612
- title: { contains: true },
613
- published: { equals: true }, // forced inside the relation
629
+ default: {
630
+ where: {
631
+ posts: {
632
+ some: {
633
+ title: { contains: true },
634
+ published: { equals: true }, // forced inside the relation
635
+ },
614
636
  },
615
637
  },
638
+ take: { max: 50 },
616
639
  },
617
- take: { max: 50 },
618
640
  },
619
641
  },
620
642
  }
@@ -630,19 +652,21 @@ Shapes can restrict which response fields and relations the client may request:
630
652
  const userConfig = {
631
653
  findMany: {
632
654
  shape: {
633
- where: { role: { equals: true } },
634
- select: {
635
- id: true,
636
- email: true,
637
- name: true,
638
- posts: {
639
- select: { id: true, title: true },
640
- },
641
- _count: {
642
- select: { posts: true },
655
+ default: {
656
+ where: { role: { equals: true } },
657
+ select: {
658
+ id: true,
659
+ email: true,
660
+ name: true,
661
+ posts: {
662
+ select: { id: true, title: true },
663
+ },
664
+ _count: {
665
+ select: { posts: true },
666
+ },
643
667
  },
668
+ take: { max: 50 },
644
669
  },
645
- take: { max: 50 },
646
670
  },
647
671
  },
648
672
  }
@@ -666,23 +690,25 @@ import { force } from 'prisma-guard'
666
690
  const userConfig = {
667
691
  findMany: {
668
692
  shape: {
669
- include: {
670
- posts: {
671
- where: { isDeleted: { equals: false } }, // forced: never return deleted posts
672
- orderBy: { createdAt: true },
673
- take: { max: 20, default: 10 },
674
- skip: true,
675
- },
676
- profile: true, // simple include, no constraints
677
- _count: {
678
- select: {
679
- posts: {
680
- where: { isDeleted: { equals: false } }, // count only non-deleted
693
+ default: {
694
+ include: {
695
+ posts: {
696
+ where: { isDeleted: { equals: false } }, // forced: never return deleted posts
697
+ orderBy: { createdAt: true },
698
+ take: { max: 20, default: 10 },
699
+ skip: true,
700
+ },
701
+ profile: true, // simple include, no constraints
702
+ _count: {
703
+ select: {
704
+ posts: {
705
+ where: { isDeleted: { equals: false } }, // count only non-deleted
706
+ },
681
707
  },
682
708
  },
683
709
  },
710
+ take: { max: 50 },
684
711
  },
685
- take: { max: 50 },
686
712
  },
687
713
  },
688
714
  }
@@ -696,20 +722,24 @@ Write operations that return records (`create`, `update`, `upsert`, `delete`, `c
696
722
  const userConfig = {
697
723
  create: {
698
724
  shape: {
699
- data: { email: true, name: true },
700
- include: {
701
- profile: true,
725
+ default: {
726
+ data: { email: true, name: true },
727
+ include: {
728
+ profile: true,
729
+ },
702
730
  },
703
731
  },
704
732
  },
705
733
  update: {
706
734
  shape: {
707
- data: { name: true },
708
- where: { id: { equals: true } },
709
- select: {
710
- id: true,
711
- name: true,
712
- updatedAt: true,
735
+ default: {
736
+ data: { name: true },
737
+ where: { id: { equals: true } },
738
+ select: {
739
+ id: true,
740
+ name: true,
741
+ updatedAt: true,
742
+ },
713
743
  },
714
744
  },
715
745
  },
@@ -730,16 +760,18 @@ import { force } from 'prisma-guard'
730
760
  const projectConfig = {
731
761
  upsert: {
732
762
  shape: {
733
- where: { id: { equals: true } },
734
- create: {
735
- title: true,
736
- status: 'draft',
737
- isActive: force(true),
738
- },
739
- update: {
740
- title: true,
763
+ default: {
764
+ where: { id: { equals: true } },
765
+ create: {
766
+ title: true,
767
+ status: 'draft',
768
+ isActive: force(true),
769
+ },
770
+ update: {
771
+ title: true,
772
+ },
773
+ select: { id: true, title: true, status: true },
741
774
  },
742
- select: { id: true, title: true, status: true },
743
775
  },
744
776
  },
745
777
  }
@@ -755,13 +787,17 @@ All three (`where`, `create`, `update`) are required. Using `data` instead of `c
755
787
  const userConfig = {
756
788
  deleteMany: {
757
789
  shape: {
758
- where: { isActive: { equals: true }, role: { equals: true } },
790
+ default: {
791
+ where: { isActive: { equals: true }, role: { equals: true } },
792
+ },
759
793
  },
760
794
  },
761
795
  updateMany: {
762
796
  shape: {
763
- data: { isActive: true },
764
- where: { role: { equals: true } },
797
+ default: {
798
+ data: { isActive: true },
799
+ where: { role: { equals: true } },
800
+ },
765
801
  },
766
802
  },
767
803
  }
@@ -812,13 +848,17 @@ app.use((req, res, next) => {
812
848
  app.use('/', ProjectRouter({
813
849
  findMany: {
814
850
  shape: {
815
- where: { title: { contains: true } },
816
- take: { max: 50 },
851
+ default: {
852
+ where: { title: { contains: true } },
853
+ take: { max: 50 },
854
+ },
817
855
  },
818
856
  },
819
857
  create: {
820
858
  shape: {
821
- data: { title: true },
859
+ default: {
860
+ data: { title: true },
861
+ },
822
862
  },
823
863
  },
824
864
  }))
@@ -1,3 +1,4 @@
1
1
  import { GeneratorOptions } from '@prisma/generator-helper';
2
2
  export declare function generateImportPrismaStatement(generatorOptions: GeneratorOptions): string;
3
3
  export declare function getRelativeClientPath(generatorOptions: GeneratorOptions, modelName: string): string;
4
+ export declare function getGuardShapesImport(options: GeneratorOptions, modelName: string): string | null;
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.generateImportPrismaStatement = generateImportPrismaStatement;
7
7
  exports.getRelativeClientPath = getRelativeClientPath;
8
+ exports.getGuardShapesImport = getGuardShapesImport;
8
9
  const path_1 = __importDefault(require("path"));
9
10
  function findClientGenerator(options) {
10
11
  const byName = options.otherGenerators.find((gen) => gen.name === 'client');
@@ -52,4 +53,27 @@ function getRelativeClientPath(generatorOptions, modelName) {
52
53
  const routerDirPath = path_1.default.join(outputValue, modelName);
53
54
  return getRelativeImportPath(routerDirPath, clientGenerator.output.value);
54
55
  }
56
+ function findGuardGenerator(options) {
57
+ const byProvider = options.otherGenerators.find((gen) => !!gen.provider?.value && gen.provider.value.includes('prisma-guard'));
58
+ if (byProvider)
59
+ return byProvider;
60
+ const byConfig = options.otherGenerators.find((gen) => !!gen.config &&
61
+ ('typedGuardShapes' in gen.config ||
62
+ 'onInvalidZod' in gen.config ||
63
+ 'findUniqueMode' in gen.config));
64
+ return byConfig || null;
65
+ }
66
+ function getGuardShapesImport(options, modelName) {
67
+ const guard = findGuardGenerator(options);
68
+ if (!guard || !guard.output?.value)
69
+ return null;
70
+ if (guard.config?.typedGuardShapes === 'false')
71
+ return null;
72
+ const outputValue = options.generator.output?.value;
73
+ if (!outputValue)
74
+ return null;
75
+ const fromDir = path_1.default.join(outputValue, modelName);
76
+ const shapesPath = path_1.default.join(guard.output.value, 'shapes');
77
+ return getRelativeImportPath(fromDir, shapesPath);
78
+ }
55
79
  //# sourceMappingURL=generateImportPrismaStatement.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateImportPrismaStatement.js","sourceRoot":"","sources":["../../src/generators/generateImportPrismaStatement.ts"],"names":[],"mappings":";;;;;AAmCA,sEAoBC;AAED,sDAoBC;AA5ED,gDAAuB;AAEvB,SAAS,mBAAmB,CAAC,OAAyB;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;IAC3E,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,CAC7C,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,kBAAkB;QACzC,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,gBAAgB;QACvC,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,eAAe,CACzC,CAAA;IACD,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IAEjC,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,CAC7C,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC;QACrC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CACxC,CAAA;IACD,OAAO,UAAU,IAAI,IAAI,CAAA;AAC3B,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAe,EACf,gBAAwB;IAExB,IAAI,kBAAkB,GAAG,cAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;IACjE,kBAAkB,GAAG,kBAAkB,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5E,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,kBAAkB,GAAG,IAAI,GAAG,kBAAkB,CAAA;IAChD,CAAC;IACD,OAAO,kBAAkB,CAAA;AAC3B,CAAC;AAED,SAAgB,6BAA6B,CAC3C,gBAAkC;IAElC,MAAM,eAAe,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;IAE7D,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,+GAA+G,CAChH,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAA;IAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IAClD,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAE9E,OAAO,yCAAyC,UAAU,MAAM,CAAA;AAClE,CAAC;AAED,SAAgB,qBAAqB,CACnC,gBAAkC,EAClC,SAAiB;IAEjB,MAAM,eAAe,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;IAE7D,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,+GAA+G,CAChH,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAA;IAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAEvD,OAAO,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC3E,CAAC"}
1
+ {"version":3,"file":"generateImportPrismaStatement.js","sourceRoot":"","sources":["../../src/generators/generateImportPrismaStatement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function generateRouteConfigType(modelName: string, hookHandlerType: string, guardShapesImport: string | null): string;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateRouteConfigType = generateRouteConfigType;
4
+ const ROUTER_OPERATIONS = [
5
+ 'findUnique',
6
+ 'findUniqueOrThrow',
7
+ 'findFirst',
8
+ 'findFirstOrThrow',
9
+ 'findMany',
10
+ 'findManyPaginated',
11
+ 'count',
12
+ 'aggregate',
13
+ 'groupBy',
14
+ 'create',
15
+ 'createMany',
16
+ 'createManyAndReturn',
17
+ 'update',
18
+ 'updateMany',
19
+ 'updateManyAndReturn',
20
+ 'upsert',
21
+ 'delete',
22
+ 'deleteMany',
23
+ ];
24
+ const ROUTER_OP_TO_SHAPE_OP = {
25
+ findUnique: 'findUnique',
26
+ findUniqueOrThrow: 'findUniqueOrThrow',
27
+ findFirst: 'findFirst',
28
+ findFirstOrThrow: 'findFirstOrThrow',
29
+ findMany: 'findMany',
30
+ findManyPaginated: 'findManyPaginated',
31
+ count: 'count',
32
+ aggregate: 'aggregate',
33
+ groupBy: 'groupBy',
34
+ create: 'create',
35
+ createMany: 'createMany',
36
+ createManyAndReturn: 'createManyAndReturn',
37
+ update: 'update',
38
+ updateMany: 'updateMany',
39
+ updateManyAndReturn: 'updateManyAndReturn',
40
+ upsert: 'upsert',
41
+ delete: 'delete',
42
+ deleteMany: 'deleteMany',
43
+ };
44
+ function capitalize(s) {
45
+ return s.charAt(0).toUpperCase() + s.slice(1);
46
+ }
47
+ function generateRouteConfigType(modelName, hookHandlerType, guardShapesImport) {
48
+ const m = modelName;
49
+ if (!guardShapesImport) {
50
+ return `export type ${m}RouteConfig<TCtx = unknown> = RouteConfig\n`;
51
+ }
52
+ const shapeOps = Object.values(ROUTER_OP_TO_SHAPE_OP).filter((v, i, a) => a.indexOf(v) === i);
53
+ const opShapeImports = shapeOps
54
+ .map((op) => `${m}${capitalize(op)}ShapeInput`)
55
+ .join(',\n ');
56
+ const overrides = ROUTER_OPERATIONS.map((routerOp) => {
57
+ const shapeOp = ROUTER_OP_TO_SHAPE_OP[routerOp];
58
+ const c = capitalize(shapeOp);
59
+ return (` ${routerOp}?: {\n` +
60
+ ` before?: ${hookHandlerType}[]\n` +
61
+ ` after?: ${hookHandlerType}[]\n` +
62
+ ` shape?: ${m}${c}ShapeInput<TCtx>\n` +
63
+ ` }`);
64
+ }).join('\n');
65
+ const omitKeys = ROUTER_OPERATIONS.map((k) => `'${k}'`).join('\n | ');
66
+ return (`import type {\n ${opShapeImports}\n} from '${guardShapesImport}'\n\n` +
67
+ `export type ${m}RouteConfig<TCtx = unknown> = Omit<\n` +
68
+ ` RouteConfig,\n` +
69
+ ` | ${omitKeys}\n` +
70
+ `> & {\n${overrides}\n}\n`);
71
+ }
72
+ //# sourceMappingURL=generateRouteConfigType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateRouteConfigType.js","sourceRoot":"","sources":["../../src/generators/generateRouteConfigType.ts"],"names":[],"mappings":";;AAgDA,0DAwCC;AAxFD,MAAM,iBAAiB,GAAG;IACxB,YAAY;IACZ,mBAAmB;IACnB,WAAW;IACX,kBAAkB;IAClB,UAAU;IACV,mBAAmB;IACnB,OAAO;IACP,WAAW;IACX,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,qBAAqB;IACrB,QAAQ;IACR,YAAY;IACZ,qBAAqB;IACrB,QAAQ;IACR,QAAQ;IACR,YAAY;CACJ,CAAA;AAIV,MAAM,qBAAqB,GAAoC;IAC7D,UAAU,EAAE,YAAY;IACxB,iBAAiB,EAAE,mBAAmB;IACtC,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,kBAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,iBAAiB,EAAE,mBAAmB;IACtC,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;IAC1C,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;IAC1C,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;CACzB,CAAA;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED,SAAgB,uBAAuB,CACrC,SAAiB,EACjB,eAAuB,EACvB,iBAAgC;IAEhC,MAAM,CAAC,GAAG,SAAS,CAAA;IAEnB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,eAAe,CAAC,6CAA6C,CAAA;IACtE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAC1D,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAChC,CAAA;IAED,MAAM,cAAc,GAAG,QAAQ;SAC5B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC;SAC9C,IAAI,CAAC,OAAO,CAAC,CAAA;IAEhB,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;QAC7B,OAAO,CACL,KAAK,QAAQ,QAAQ;YACrB,gBAAgB,eAAe,MAAM;YACrC,eAAe,eAAe,MAAM;YACpC,eAAe,CAAC,GAAG,CAAC,oBAAoB;YACxC,KAAK,CACN,CAAA;IACH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAEtE,OAAO,CACL,oBAAoB,cAAc,aAAa,iBAAiB,OAAO;QACvE,eAAe,CAAC,uCAAuC;QACvD,kBAAkB;QAClB,OAAO,QAAQ,IAAI;QACnB,UAAU,SAAS,OAAO,CAC3B,CAAA;AACH,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { DMMF } from '@prisma/generator-helper';
2
- export declare function generateRouterFunction({ model, enums, relativeClientPath, }: {
2
+ export declare function generateRouterFunction({ model, enums, relativeClientPath, guardShapesImport, }: {
3
3
  model: DMMF.Model;
4
4
  enums: DMMF.DatamodelEnum[];
5
5
  relativeClientPath: string;
6
+ guardShapesImport: string | null;
6
7
  }): string;
@@ -2,7 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateRouterFunction = generateRouterFunction;
4
4
  const strings_1 = require("../utils/strings");
5
- function generateRouterFunction({ model, enums, relativeClientPath, }) {
5
+ const generateRouteConfigType_1 = require("./generateRouteConfigType");
6
+ function generateRouterFunction({ model, enums, relativeClientPath, guardShapesImport, }) {
6
7
  const modelName = model.name;
7
8
  const prefix = (0, strings_1.toCamelCase)(modelName);
8
9
  const modelNameLower = modelName.toLowerCase();
@@ -53,6 +54,7 @@ import { sanitizeKeys } from '../misc'
53
54
  import { buildModelOpenApi } from '../buildModelOpenApi'
54
55
  import { transformResult } from '../operationRuntime'
55
56
 
57
+ ${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'RequestHandler', guardShapesImport)}
56
58
  const _env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
57
59
 
58
60
  const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
@@ -86,7 +88,7 @@ function getQueryBuilderConfig(config: RouteConfig) {
86
88
  return {}
87
89
  }
88
90
 
89
- export function ${routerFunctionName}(config: RouteConfig = {}) {
91
+ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteConfig<TCtx> = {}) {
90
92
  const router = express.Router()
91
93
 
92
94
  router.use(express.json())
@@ -1 +1 @@
1
- {"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { DMMF } from '@prisma/generator-helper';
2
- export declare function generateFastifyRouterFunction({ model, enums, }: {
2
+ export declare function generateFastifyRouterFunction({ model, enums, guardShapesImport, }: {
3
3
  model: DMMF.Model;
4
4
  enums: DMMF.DatamodelEnum[];
5
+ guardShapesImport: string | null;
5
6
  }): string;
@@ -2,7 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateFastifyRouterFunction = generateFastifyRouterFunction;
4
4
  const strings_1 = require("../utils/strings");
5
- function generateFastifyRouterFunction({ model, enums, }) {
5
+ const generateRouteConfigType_1 = require("./generateRouteConfigType");
6
+ function generateFastifyRouterFunction({ model, enums, guardShapesImport, }) {
6
7
  const modelName = model.name;
7
8
  const prefix = (0, strings_1.toCamelCase)(modelName);
8
9
  const modelNameLower = modelName.toLowerCase();
@@ -52,6 +53,7 @@ import { sanitizeKeys } from '../misc'
52
53
  import { buildModelOpenApi } from '../buildModelOpenApi'
53
54
  import { mapError, transformResult, HttpError } from '../operationRuntime'
54
55
 
56
+ ${(0, generateRouteConfigType_1.generateRouteConfigType)(modelName, 'FastifyHookHandler', guardShapesImport)}
55
57
  const _env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
56
58
 
57
59
  const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
@@ -145,9 +147,9 @@ function sendError(reply: FastifyReply, error: unknown): void {
145
147
  reply.code(httpError.status).send({ message: httpError.message })
146
148
  }
147
149
 
148
- export async function ${routerFunctionName}(
150
+ export async function ${routerFunctionName}<TCtx = unknown>(
149
151
  fastify: FastifyInstance,
150
- config: RouteConfig = {},
152
+ config: ${modelName}RouteConfig<TCtx> = {},
151
153
  ) {
152
154
  const customPrefix = normalizePrefix(config.customUrlPrefix || '')
153
155
  const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
@@ -1 +1 @@
1
- {"version":3,"file":"generateRouterFastify.js","sourceRoot":"","sources":["../../src/generators/generateRouterFastify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generateRouterFastify.js","sourceRoot":"","sources":["../../src/generators/generateRouterFastify.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -51,9 +51,6 @@ function getTarget(options) {
51
51
  });
52
52
  const modelNames = [];
53
53
  const generateHandler = target === 'fastify' ? generateFastifyHandler_1.generateFastifyHandler : generateUnifiedHandler_1.generateUnifiedHandler;
54
- const generateRouter = target === 'fastify'
55
- ? generateRouterFastify_1.generateFastifyRouterFunction
56
- : generateRouter_1.generateRouterFunction;
57
54
  for (const model of options.dmmf.datamodel.models) {
58
55
  if (model.documentation &&
59
56
  model.documentation.includes('generator off')) {
@@ -62,6 +59,7 @@ function getTarget(options) {
62
59
  }
63
60
  modelNames.push(model.name);
64
61
  const relativeClientPath = (0, generateImportPrismaStatement_1.getRelativeClientPath)(options, model.name);
62
+ const guardShapesImport = (0, generateImportPrismaStatement_1.getGuardShapesImport)(options, model.name);
65
63
  await (0, writeFileSafely_1.writeFileSafely)({
66
64
  content: (0, generateOperationCore_1.generateModelCore)({ model: model }),
67
65
  options,
@@ -76,12 +74,20 @@ function getTarget(options) {
76
74
  model: model,
77
75
  operation: 'Handlers',
78
76
  });
79
- await (0, writeFileSafely_1.writeFileSafely)({
80
- content: generateRouter({
77
+ const routerContent = target === 'fastify'
78
+ ? (0, generateRouterFastify_1.generateFastifyRouterFunction)({
79
+ model: model,
80
+ enums: options.dmmf.datamodel.enums,
81
+ guardShapesImport,
82
+ })
83
+ : (0, generateRouter_1.generateRouterFunction)({
81
84
  model: model,
82
85
  enums: options.dmmf.datamodel.enums,
83
86
  relativeClientPath,
84
- }),
87
+ guardShapesImport,
88
+ });
89
+ await (0, writeFileSafely_1.writeFileSafely)({
90
+ content: routerContent,
85
91
  options,
86
92
  model: model,
87
93
  operation: 'Router',
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "prisma-generator-express",
3
3
  "description": "Prisma generator for Express/Fastify CRUD API with OpenAPI documentation",
4
- "version": "1.37.1",
4
+ "version": "1.39.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "MIT",
@@ -9,6 +9,8 @@ import {
9
9
 
10
10
  export type { QueryBuilderConfig, OpenApiServerConfig, OpenApiSecuritySchemeConfig }
11
11
 
12
- export type OperationConfig = BaseOperationConfig<RequestHandler>
12
+ export type OperationConfig<TShape = Record<string, any>> =
13
+ BaseOperationConfig<RequestHandler, TShape>
13
14
 
14
- export type RouteConfig = BaseRouteConfig<RequestHandler, Request>
15
+ export type RouteConfig<TShape = Record<string, any>> =
16
+ BaseRouteConfig<RequestHandler, Request, TShape>
@@ -14,6 +14,8 @@ export type FastifyHookHandler = (
14
14
  reply: FastifyReply,
15
15
  ) => Promise<void> | void
16
16
 
17
- export type OperationConfig = BaseOperationConfig<FastifyHookHandler>
17
+ export type OperationConfig<TShape = Record<string, any>> =
18
+ BaseOperationConfig<FastifyHookHandler, TShape>
18
19
 
19
- export type RouteConfig = BaseRouteConfig<FastifyHookHandler, FastifyRequest>
20
+ export type RouteConfig<TShape = Record<string, any>> =
21
+ BaseRouteConfig<FastifyHookHandler, FastifyRequest, TShape>
@@ -20,13 +20,13 @@ export interface OpenApiSecuritySchemeConfig {
20
20
  description?: string
21
21
  }
22
22
 
23
- export interface BaseOperationConfig<HookHandler> {
23
+ export interface BaseOperationConfig<HookHandler, TShape = Record<string, any>> {
24
24
  before?: HookHandler[]
25
25
  after?: HookHandler[]
26
- shape?: Record<string, any>
26
+ shape?: TShape
27
27
  }
28
28
 
29
- export interface BaseRouteConfig<HookHandler, RequestType> {
29
+ export interface BaseRouteConfig<HookHandler, RequestType, TShape = Record<string, any>> {
30
30
  enableAll?: boolean
31
31
  addModelPrefix?: boolean
32
32
  customUrlPrefix?: string
@@ -34,45 +34,40 @@ export interface BaseRouteConfig<HookHandler, RequestType> {
34
34
  disableOpenApi?: boolean
35
35
  disablePostReads?: boolean
36
36
  scalarCdnUrl?: string
37
-
38
37
  openApiTitle?: string
39
38
  openApiDescription?: string
40
39
  openApiVersion?: string
41
40
  openApiServers?: OpenApiServerConfig[]
42
41
  openApiSecuritySchemes?: Record<string, OpenApiSecuritySchemeConfig>
43
42
  openApiSecurity?: Record<string, string[]>[]
44
-
45
43
  guard?: {
46
44
  resolveVariant?: (request: RequestType) => string | undefined
47
45
  variantHeader?: string
48
46
  }
49
-
50
47
  queryBuilder?: QueryBuilderConfig | false
51
-
52
48
  pagination?: {
53
49
  defaultLimit?: number
54
50
  maxLimit?: number
55
51
  distinctCountLimit?: number
56
52
  }
57
-
58
- findUnique?: BaseOperationConfig<HookHandler>
59
- findUniqueOrThrow?: BaseOperationConfig<HookHandler>
60
- findFirst?: BaseOperationConfig<HookHandler>
61
- findFirstOrThrow?: BaseOperationConfig<HookHandler>
62
- findMany?: BaseOperationConfig<HookHandler>
63
- findManyPaginated?: BaseOperationConfig<HookHandler>
64
- create?: BaseOperationConfig<HookHandler>
65
- createMany?: BaseOperationConfig<HookHandler>
66
- createManyAndReturn?: BaseOperationConfig<HookHandler>
67
- update?: BaseOperationConfig<HookHandler>
68
- updateMany?: BaseOperationConfig<HookHandler>
69
- updateManyAndReturn?: BaseOperationConfig<HookHandler>
70
- upsert?: BaseOperationConfig<HookHandler>
71
- delete?: BaseOperationConfig<HookHandler>
72
- deleteMany?: BaseOperationConfig<HookHandler>
73
- aggregate?: BaseOperationConfig<HookHandler>
74
- count?: BaseOperationConfig<HookHandler>
75
- groupBy?: BaseOperationConfig<HookHandler>
53
+ findUnique?: BaseOperationConfig<HookHandler, TShape>
54
+ findUniqueOrThrow?: BaseOperationConfig<HookHandler, TShape>
55
+ findFirst?: BaseOperationConfig<HookHandler, TShape>
56
+ findFirstOrThrow?: BaseOperationConfig<HookHandler, TShape>
57
+ findMany?: BaseOperationConfig<HookHandler, TShape>
58
+ findManyPaginated?: BaseOperationConfig<HookHandler, TShape>
59
+ create?: BaseOperationConfig<HookHandler, TShape>
60
+ createMany?: BaseOperationConfig<HookHandler, TShape>
61
+ createManyAndReturn?: BaseOperationConfig<HookHandler, TShape>
62
+ update?: BaseOperationConfig<HookHandler, TShape>
63
+ updateMany?: BaseOperationConfig<HookHandler, TShape>
64
+ updateManyAndReturn?: BaseOperationConfig<HookHandler, TShape>
65
+ upsert?: BaseOperationConfig<HookHandler, TShape>
66
+ delete?: BaseOperationConfig<HookHandler, TShape>
67
+ deleteMany?: BaseOperationConfig<HookHandler, TShape>
68
+ aggregate?: BaseOperationConfig<HookHandler, TShape>
69
+ count?: BaseOperationConfig<HookHandler, TShape>
70
+ groupBy?: BaseOperationConfig<HookHandler, TShape>
76
71
  }
77
72
 
78
73
  export type OperationConfig = BaseOperationConfig<any>
@@ -75,4 +75,38 @@ export function getRelativeClientPath(
75
75
  const routerDirPath = path.join(outputValue, modelName)
76
76
 
77
77
  return getRelativeImportPath(routerDirPath, clientGenerator.output.value)
78
+ }
79
+
80
+ function findGuardGenerator(options: GeneratorOptions) {
81
+ const byProvider = options.otherGenerators.find(
82
+ (gen) =>
83
+ !!gen.provider?.value && gen.provider.value.includes('prisma-guard'),
84
+ )
85
+ if (byProvider) return byProvider
86
+
87
+ const byConfig = options.otherGenerators.find(
88
+ (gen) =>
89
+ !!gen.config &&
90
+ ('typedGuardShapes' in gen.config ||
91
+ 'onInvalidZod' in gen.config ||
92
+ 'findUniqueMode' in gen.config),
93
+ )
94
+ return byConfig || null
95
+ }
96
+
97
+ export function getGuardShapesImport(
98
+ options: GeneratorOptions,
99
+ modelName: string,
100
+ ): string | null {
101
+ const guard = findGuardGenerator(options)
102
+ if (!guard || !guard.output?.value) return null
103
+
104
+ if (guard.config?.typedGuardShapes === 'false') return null
105
+
106
+ const outputValue = options.generator.output?.value
107
+ if (!outputValue) return null
108
+
109
+ const fromDir = path.join(outputValue, modelName)
110
+ const shapesPath = path.join(guard.output.value, 'shapes')
111
+ return getRelativeImportPath(fromDir, shapesPath)
78
112
  }
@@ -0,0 +1,89 @@
1
+ const ROUTER_OPERATIONS = [
2
+ 'findUnique',
3
+ 'findUniqueOrThrow',
4
+ 'findFirst',
5
+ 'findFirstOrThrow',
6
+ 'findMany',
7
+ 'findManyPaginated',
8
+ 'count',
9
+ 'aggregate',
10
+ 'groupBy',
11
+ 'create',
12
+ 'createMany',
13
+ 'createManyAndReturn',
14
+ 'update',
15
+ 'updateMany',
16
+ 'updateManyAndReturn',
17
+ 'upsert',
18
+ 'delete',
19
+ 'deleteMany',
20
+ ] as const
21
+
22
+ type RouterOperation = (typeof ROUTER_OPERATIONS)[number]
23
+
24
+ const ROUTER_OP_TO_SHAPE_OP: Record<RouterOperation, string> = {
25
+ findUnique: 'findUnique',
26
+ findUniqueOrThrow: 'findUniqueOrThrow',
27
+ findFirst: 'findFirst',
28
+ findFirstOrThrow: 'findFirstOrThrow',
29
+ findMany: 'findMany',
30
+ findManyPaginated: 'findManyPaginated',
31
+ count: 'count',
32
+ aggregate: 'aggregate',
33
+ groupBy: 'groupBy',
34
+ create: 'create',
35
+ createMany: 'createMany',
36
+ createManyAndReturn: 'createManyAndReturn',
37
+ update: 'update',
38
+ updateMany: 'updateMany',
39
+ updateManyAndReturn: 'updateManyAndReturn',
40
+ upsert: 'upsert',
41
+ delete: 'delete',
42
+ deleteMany: 'deleteMany',
43
+ }
44
+
45
+ function capitalize(s: string): string {
46
+ return s.charAt(0).toUpperCase() + s.slice(1)
47
+ }
48
+
49
+ export function generateRouteConfigType(
50
+ modelName: string,
51
+ hookHandlerType: string,
52
+ guardShapesImport: string | null,
53
+ ): string {
54
+ const m = modelName
55
+
56
+ if (!guardShapesImport) {
57
+ return `export type ${m}RouteConfig<TCtx = unknown> = RouteConfig\n`
58
+ }
59
+
60
+ const shapeOps = Object.values(ROUTER_OP_TO_SHAPE_OP).filter(
61
+ (v, i, a) => a.indexOf(v) === i,
62
+ )
63
+
64
+ const opShapeImports = shapeOps
65
+ .map((op) => `${m}${capitalize(op)}ShapeInput`)
66
+ .join(',\n ')
67
+
68
+ const overrides = ROUTER_OPERATIONS.map((routerOp) => {
69
+ const shapeOp = ROUTER_OP_TO_SHAPE_OP[routerOp]
70
+ const c = capitalize(shapeOp)
71
+ return (
72
+ ` ${routerOp}?: {\n` +
73
+ ` before?: ${hookHandlerType}[]\n` +
74
+ ` after?: ${hookHandlerType}[]\n` +
75
+ ` shape?: ${m}${c}ShapeInput<TCtx>\n` +
76
+ ` }`
77
+ )
78
+ }).join('\n')
79
+
80
+ const omitKeys = ROUTER_OPERATIONS.map((k) => `'${k}'`).join('\n | ')
81
+
82
+ return (
83
+ `import type {\n ${opShapeImports}\n} from '${guardShapesImport}'\n\n` +
84
+ `export type ${m}RouteConfig<TCtx = unknown> = Omit<\n` +
85
+ ` RouteConfig,\n` +
86
+ ` | ${omitKeys}\n` +
87
+ `> & {\n${overrides}\n}\n`
88
+ )
89
+ }
@@ -1,14 +1,17 @@
1
1
  import { DMMF } from '@prisma/generator-helper'
2
2
  import { toCamelCase } from '../utils/strings'
3
+ import { generateRouteConfigType } from './generateRouteConfigType'
3
4
 
4
5
  export function generateRouterFunction({
5
6
  model,
6
7
  enums,
7
8
  relativeClientPath,
9
+ guardShapesImport,
8
10
  }: {
9
11
  model: DMMF.Model
10
12
  enums: DMMF.DatamodelEnum[]
11
13
  relativeClientPath: string
14
+ guardShapesImport: string | null
12
15
  }): string {
13
16
  const modelName = model.name
14
17
  const prefix = toCamelCase(modelName)
@@ -66,6 +69,7 @@ import { sanitizeKeys } from '../misc'
66
69
  import { buildModelOpenApi } from '../buildModelOpenApi'
67
70
  import { transformResult } from '../operationRuntime'
68
71
 
72
+ ${generateRouteConfigType(modelName, 'RequestHandler', guardShapesImport)}
69
73
  const _env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
70
74
 
71
75
  const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
@@ -99,7 +103,7 @@ function getQueryBuilderConfig(config: RouteConfig) {
99
103
  return {}
100
104
  }
101
105
 
102
- export function ${routerFunctionName}(config: RouteConfig = {}) {
106
+ export function ${routerFunctionName}<TCtx = unknown>(config: ${modelName}RouteConfig<TCtx> = {}) {
103
107
  const router = express.Router()
104
108
 
105
109
  router.use(express.json())
@@ -1,12 +1,15 @@
1
1
  import { DMMF } from '@prisma/generator-helper'
2
2
  import { toCamelCase } from '../utils/strings'
3
+ import { generateRouteConfigType } from './generateRouteConfigType'
3
4
 
4
5
  export function generateFastifyRouterFunction({
5
6
  model,
6
7
  enums,
8
+ guardShapesImport,
7
9
  }: {
8
10
  model: DMMF.Model
9
11
  enums: DMMF.DatamodelEnum[]
12
+ guardShapesImport: string | null
10
13
  }): string {
11
14
  const modelName = model.name
12
15
  const prefix = toCamelCase(modelName)
@@ -63,6 +66,7 @@ import { sanitizeKeys } from '../misc'
63
66
  import { buildModelOpenApi } from '../buildModelOpenApi'
64
67
  import { mapError, transformResult, HttpError } from '../operationRuntime'
65
68
 
69
+ ${generateRouteConfigType(modelName, 'FastifyHookHandler', guardShapesImport)}
66
70
  const _env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
67
71
 
68
72
  const MODEL_FIELDS = ${JSON.stringify(fieldsMeta, null, 2)} as const
@@ -156,9 +160,9 @@ function sendError(reply: FastifyReply, error: unknown): void {
156
160
  reply.code(httpError.status).send({ message: httpError.message })
157
161
  }
158
162
 
159
- export async function ${routerFunctionName}(
163
+ export async function ${routerFunctionName}<TCtx = unknown>(
160
164
  fastify: FastifyInstance,
161
- config: RouteConfig = {},
165
+ config: ${modelName}RouteConfig<TCtx> = {},
162
166
  ) {
163
167
  const customPrefix = normalizePrefix(config.customUrlPrefix || '')
164
168
  const modelPrefix = config.addModelPrefix !== false ? '/${modelNameLower}' : ''
package/src/index.ts CHANGED
@@ -16,8 +16,9 @@ import {
16
16
  generateModelCore,
17
17
  } from './generators/generateOperationCore'
18
18
  import {
19
- generateImportPrismaStatement,
19
+
20
20
  getRelativeClientPath,
21
+ getGuardShapesImport,
21
22
  } from './generators/generateImportPrismaStatement'
22
23
  import { writeFileSafely } from './utils/writeFileSafely'
23
24
  import { copyFiles } from './utils/copyFiles'
@@ -69,11 +70,6 @@ generatorHandler({
69
70
  const generateHandler =
70
71
  target === 'fastify' ? generateFastifyHandler : generateUnifiedHandler
71
72
 
72
- const generateRouter =
73
- target === 'fastify'
74
- ? generateFastifyRouterFunction
75
- : generateRouterFunction
76
-
77
73
  for (const model of options.dmmf.datamodel.models) {
78
74
  if (
79
75
  model.documentation &&
@@ -86,6 +82,7 @@ generatorHandler({
86
82
  modelNames.push(model.name)
87
83
 
88
84
  const relativeClientPath = getRelativeClientPath(options, model.name)
85
+ const guardShapesImport = getGuardShapesImport(options, model.name)
89
86
 
90
87
  await writeFileSafely({
91
88
  content: generateModelCore({ model: model as DMMF.Model }),
@@ -103,12 +100,22 @@ generatorHandler({
103
100
  operation: 'Handlers',
104
101
  })
105
102
 
103
+ const routerContent =
104
+ target === 'fastify'
105
+ ? generateFastifyRouterFunction({
106
+ model: model as DMMF.Model,
107
+ enums: options.dmmf.datamodel.enums as DMMF.DatamodelEnum[],
108
+ guardShapesImport,
109
+ })
110
+ : generateRouterFunction({
111
+ model: model as DMMF.Model,
112
+ enums: options.dmmf.datamodel.enums as DMMF.DatamodelEnum[],
113
+ relativeClientPath,
114
+ guardShapesImport,
115
+ })
116
+
106
117
  await writeFileSafely({
107
- content: generateRouter({
108
- model: model as DMMF.Model,
109
- enums: options.dmmf.datamodel.enums as DMMF.DatamodelEnum[],
110
- relativeClientPath,
111
- }),
118
+ content: routerContent,
112
119
  options,
113
120
  model: model as DMMF.Model,
114
121
  operation: 'Router',