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 +124 -84
- package/dist/generators/generateImportPrismaStatement.d.ts +1 -0
- package/dist/generators/generateImportPrismaStatement.js +24 -0
- package/dist/generators/generateImportPrismaStatement.js.map +1 -1
- package/dist/generators/generateRouteConfigType.d.ts +1 -0
- package/dist/generators/generateRouteConfigType.js +72 -0
- package/dist/generators/generateRouteConfigType.js.map +1 -0
- package/dist/generators/generateRouter.d.ts +2 -1
- package/dist/generators/generateRouter.js +4 -2
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.d.ts +2 -1
- package/dist/generators/generateRouterFastify.js +5 -3
- package/dist/generators/generateRouterFastify.js.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/copy/routeConfig.express.ts +4 -2
- package/src/copy/routeConfig.fastify.ts +4 -2
- package/src/copy/routeConfig.ts +21 -26
- package/src/generators/generateImportPrismaStatement.ts +34 -0
- package/src/generators/generateRouteConfigType.ts +89 -0
- package/src/generators/generateRouter.ts +5 -1
- package/src/generators/generateRouterFastify.ts +6 -2
- package/src/index.ts +18 -11
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
|
-
|
|
305
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
-
|
|
349
|
+
default: {
|
|
350
|
+
data: { email: true, name: true, role: 'user' },
|
|
351
|
+
},
|
|
342
352
|
},
|
|
343
353
|
},
|
|
344
354
|
update: {
|
|
345
355
|
shape: {
|
|
346
|
-
|
|
347
|
-
|
|
356
|
+
default: {
|
|
357
|
+
data: { name: true },
|
|
358
|
+
where: { id: { equals: true } },
|
|
359
|
+
},
|
|
348
360
|
},
|
|
349
361
|
},
|
|
350
362
|
delete: {
|
|
351
363
|
shape: {
|
|
352
|
-
|
|
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
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
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
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
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
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
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
|
-
|
|
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
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
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
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
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
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
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
|
-
|
|
700
|
-
|
|
701
|
-
|
|
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
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
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
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
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
|
-
|
|
790
|
+
default: {
|
|
791
|
+
where: { isActive: { equals: true }, role: { equals: true } },
|
|
792
|
+
},
|
|
759
793
|
},
|
|
760
794
|
},
|
|
761
795
|
updateMany: {
|
|
762
796
|
shape: {
|
|
763
|
-
|
|
764
|
-
|
|
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
|
-
|
|
816
|
-
|
|
851
|
+
default: {
|
|
852
|
+
where: { title: { contains: true } },
|
|
853
|
+
take: { max: 50 },
|
|
854
|
+
},
|
|
817
855
|
},
|
|
818
856
|
},
|
|
819
857
|
create: {
|
|
820
858
|
shape: {
|
|
821
|
-
|
|
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;
|
|
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
|
-
|
|
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":";;
|
|
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
|
-
|
|
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":";;
|
|
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
|
-
|
|
80
|
-
|
|
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":";;;;;AAAA,+DAIiC;AACjC,gDAAuB;AACvB,gFAA4E;AAC5E,gFAA4E;AAC5E,gEAAoE;AACpE,8EAAkF;AAClF,kFAA8E;AAC9E,0EAAsE;AACtE,wFAAoF;AACpF,8EAG2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -9,6 +9,8 @@ import {
|
|
|
9
9
|
|
|
10
10
|
export type { QueryBuilderConfig, OpenApiServerConfig, OpenApiSecuritySchemeConfig }
|
|
11
11
|
|
|
12
|
-
export type OperationConfig =
|
|
12
|
+
export type OperationConfig<TShape = Record<string, any>> =
|
|
13
|
+
BaseOperationConfig<RequestHandler, TShape>
|
|
13
14
|
|
|
14
|
-
export type RouteConfig =
|
|
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 =
|
|
17
|
+
export type OperationConfig<TShape = Record<string, any>> =
|
|
18
|
+
BaseOperationConfig<FastifyHookHandler, TShape>
|
|
18
19
|
|
|
19
|
-
export type RouteConfig =
|
|
20
|
+
export type RouteConfig<TShape = Record<string, any>> =
|
|
21
|
+
BaseRouteConfig<FastifyHookHandler, FastifyRequest, TShape>
|
package/src/copy/routeConfig.ts
CHANGED
|
@@ -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?:
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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:
|
|
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',
|