@baseplate-dev/fastify-generators 0.6.4 → 0.6.5
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/CHANGELOG.md +21 -0
- package/dist/constants/fastify-packages.d.ts +3 -3
- package/dist/constants/fastify-packages.js +3 -3
- package/dist/generators/auth/auth-roles/auth-roles.generator.d.ts +1 -0
- package/dist/generators/auth/auth-roles/auth-roles.generator.d.ts.map +1 -1
- package/dist/generators/auth/auth-roles/auth-roles.generator.js +5 -1
- package/dist/generators/auth/auth-roles/auth-roles.generator.js.map +1 -1
- package/dist/generators/auth/auth-roles/templates/module/constants/auth-roles.constants.ts +4 -3
- package/dist/generators/pothos/pothos-prisma-enum/pothos-prisma-enum.generator.d.ts +1 -0
- package/dist/generators/pothos/pothos-prisma-enum/pothos-prisma-enum.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-prisma-enum/pothos-prisma-enum.generator.js +11 -2
- package/dist/generators/pothos/pothos-prisma-enum/pothos-prisma-enum.generator.js.map +1 -1
- package/dist/generators/prisma/_shared/build-data-helpers/build-schema-fragments.d.ts +47 -0
- package/dist/generators/prisma/_shared/build-data-helpers/build-schema-fragments.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/build-schema-fragments.js +56 -0
- package/dist/generators/prisma/_shared/build-data-helpers/build-schema-fragments.js.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/build-transform-operation-parts.d.ts +71 -0
- package/dist/generators/prisma/_shared/build-data-helpers/build-transform-operation-parts.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/build-transform-operation-parts.js +153 -0
- package/dist/generators/prisma/_shared/build-data-helpers/build-transform-operation-parts.js.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorization-statements.d.ts +46 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorization-statements.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorization-statements.js +44 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorization-statements.js.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.d.ts +6 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.d.ts.map +1 -1
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.js +13 -1
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.js.map +1 -1
- package/dist/generators/prisma/_shared/build-data-helpers/generate-where-type.d.ts +24 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-where-type.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-where-type.js +49 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-where-type.js.map +1 -0
- package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.d.ts +1 -4
- package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.d.ts.map +1 -1
- package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.js +10 -2
- package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.js.map +1 -1
- package/dist/generators/prisma/_shared/field-definition-generators/types.d.ts +47 -1
- package/dist/generators/prisma/_shared/field-definition-generators/types.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/data-utils.generator.d.ts +17 -74
- package/dist/generators/prisma/data-utils/data-utils.generator.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/index.d.ts +50 -145
- package/dist/generators/prisma/data-utils/generated/index.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/template-paths.d.ts +5 -6
- package/dist/generators/prisma/data-utils/generated/template-paths.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/template-paths.js +5 -6
- package/dist/generators/prisma/data-utils/generated/template-paths.js.map +1 -1
- package/dist/generators/prisma/data-utils/generated/template-renderers.d.ts +0 -21
- package/dist/generators/prisma/data-utils/generated/template-renderers.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/template-renderers.js +1 -7
- package/dist/generators/prisma/data-utils/generated/template-renderers.js.map +1 -1
- package/dist/generators/prisma/data-utils/generated/ts-import-providers.d.ts +51 -159
- package/dist/generators/prisma/data-utils/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/ts-import-providers.js +32 -64
- package/dist/generators/prisma/data-utils/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/prisma/data-utils/generated/typed-templates.d.ts +66 -142
- package/dist/generators/prisma/data-utils/generated/typed-templates.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/typed-templates.js +47 -98
- package/dist/generators/prisma/data-utils/generated/typed-templates.js.map +1 -1
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/define-transformer.ts +130 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/execute-transform-plan.ts +108 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/nested-transformers.ts +364 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prepare-transformers.ts +73 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-types.ts +6 -83
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/transformer-types.ts +118 -0
- package/dist/generators/prisma/prisma-authorizer-utils/generated/index.d.ts +34 -106
- package/dist/generators/prisma/prisma-authorizer-utils/generated/index.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-authorizer-utils/generated/template-renderers.d.ts +17 -53
- package/dist/generators/prisma/prisma-authorizer-utils/generated/template-renderers.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-authorizer-utils/generated/typed-templates.d.ts +34 -106
- package/dist/generators/prisma/prisma-authorizer-utils/generated/typed-templates.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-authorizer-utils/prisma-authorizer-utils.generator.d.ts +17 -53
- package/dist/generators/prisma/prisma-authorizer-utils/prisma-authorizer-utils.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-authorizer-utils/templates/src/utils/authorizers.ts +11 -11
- package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.d.ts +39 -49
- package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.js +82 -45
- package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.js.map +1 -1
- package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.d.ts +39 -52
- package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.js +48 -32
- package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.js.map +1 -1
- package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.d.ts +16 -2
- package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.js +282 -138
- package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.js.map +1 -1
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.d.ts +19 -55
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.js +18 -4
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.js.map +1 -1
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.d.ts +37 -92
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.js +86 -29
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.js.map +1 -1
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.d.ts +40 -52
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.js +102 -49
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.js.map +1 -1
- package/dist/generators/prisma/prisma-query-filter-utils/generated/index.d.ts +51 -159
- package/dist/generators/prisma/prisma-query-filter-utils/generated/index.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-renderers.d.ts +17 -53
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-renderers.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-query-filter-utils/generated/typed-templates.d.ts +68 -212
- package/dist/generators/prisma/prisma-query-filter-utils/generated/typed-templates.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-query-filter-utils/prisma-query-filter-utils.generator.d.ts +17 -53
- package/dist/generators/prisma/prisma-query-filter-utils/prisma-query-filter-utils.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-relation-field/prisma-relation-field.generator.js +1 -1
- package/dist/generators/prisma/prisma-relation-field/prisma-relation-field.generator.js.map +1 -1
- package/dist/writers/prisma-schema/fields.d.ts +5 -1
- package/dist/writers/prisma-schema/fields.d.ts.map +1 -1
- package/dist/writers/prisma-schema/fields.js +8 -2
- package/dist/writers/prisma-schema/fields.js.map +1 -1
- package/package.json +8 -8
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorize-fragment.d.ts +0 -20
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorize-fragment.d.ts.map +0 -1
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorize-fragment.js +0 -28
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorize-fragment.js.map +0 -1
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.d.ts +0 -130
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.d.ts.map +0 -1
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.js +0 -221
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.js.map +0 -1
- package/dist/generators/prisma/_shared/build-data-helpers/index.d.ts +0 -4
- package/dist/generators/prisma/_shared/build-data-helpers/index.d.ts.map +0 -1
- package/dist/generators/prisma/_shared/build-data-helpers/index.js +0 -4
- package/dist/generators/prisma/_shared/build-data-helpers/index.js.map +0 -1
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/commit-operations.ts +0 -366
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/compose-operations.ts +0 -131
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/field-definitions.ts +0 -777
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/field-utils.ts +0 -201
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-utils.ts +0 -90
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/types.ts +0 -721
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# @baseplate-dev/fastify-generators
|
|
2
2
|
|
|
3
|
+
## 0.6.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#854](https://github.com/halfdomelabs/baseplate/pull/854) [`9708637`](https://github.com/halfdomelabs/baseplate/commit/97086370718861d2c3170ec6d83af84793fbd09e) Thanks [@kingston](https://github.com/kingston)! - Add optional description field to enum values that flows through to Pothos GraphQL enum type definitions
|
|
8
|
+
|
|
9
|
+
- [#844](https://github.com/halfdomelabs/baseplate/pull/844) [`06f5173`](https://github.com/halfdomelabs/baseplate/commit/06f517371c4904482873a4e30fe9b23b4fd2e36d) Thanks [@kingston](https://github.com/kingston)! - Improve better-auth feature parity with local-auth by adding password/email flows, admin mutations, frontend auth pages, seed user generator, and admin role. Also updates role flags, refines admin role handling, enhances auth UI, and adds project migration.
|
|
10
|
+
|
|
11
|
+
- [#845](https://github.com/halfdomelabs/baseplate/pull/845) [`9688ca3`](https://github.com/halfdomelabs/baseplate/commit/9688ca348fd995a228bff597069f58644d7e9459) Thanks [@kingston](https://github.com/kingston)! - Replace imperative compose/commit data service pattern with declarative transformer API and fix handling of JSON fields.
|
|
12
|
+
|
|
13
|
+
- [#849](https://github.com/halfdomelabs/baseplate/pull/849) [`8d30c14`](https://github.com/halfdomelabs/baseplate/commit/8d30c145ce5d72dcfc038ff076ed0746d2d763cc) Thanks [@kingston](https://github.com/kingston)! - Change default relation onDelete from Cascade to Restrict
|
|
14
|
+
|
|
15
|
+
- [#842](https://github.com/halfdomelabs/baseplate/pull/842) [`adc5f55`](https://github.com/halfdomelabs/baseplate/commit/adc5f55dbf3a1451f4402cd6bd126e15f60b8ed8) Thanks [@kingston](https://github.com/kingston)! - Upgrade Prisma to 7.5.0 and fix flaky E2E sync test
|
|
16
|
+
|
|
17
|
+
- [#865](https://github.com/halfdomelabs/baseplate/pull/865) [`c7131f5`](https://github.com/halfdomelabs/baseplate/commit/c7131f5caebda203ece99d30fcf2d58ead3abdb8) Thanks [@kingston](https://github.com/kingston)! - Add UUID v7 support by replacing `genUuid` boolean with `defaultGeneration` enum (`none` | `uuidv4` | `uuidv7`), leveraging PostgreSQL 18's native `uuidv7()` function
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [[`8dcf7b3`](https://github.com/halfdomelabs/baseplate/commit/8dcf7b3c909672487bad61b7a4465d1860092363), [`87a2218`](https://github.com/halfdomelabs/baseplate/commit/87a2218266f957bb4beacd6b13cb3d610fd15a41), [`c7131f5`](https://github.com/halfdomelabs/baseplate/commit/c7131f5caebda203ece99d30fcf2d58ead3abdb8)]:
|
|
20
|
+
- @baseplate-dev/utils@0.6.5
|
|
21
|
+
- @baseplate-dev/core-generators@0.6.5
|
|
22
|
+
- @baseplate-dev/sync@0.6.5
|
|
23
|
+
|
|
3
24
|
## 0.6.4
|
|
4
25
|
|
|
5
26
|
### Patch Changes
|
|
@@ -24,9 +24,9 @@ export declare const FASTIFY_PACKAGES: {
|
|
|
24
24
|
readonly 'graphql-scalars': "1.23.0";
|
|
25
25
|
readonly '@graphql-yoga/redis-event-target': "2.0.0";
|
|
26
26
|
readonly 'graphql-ws': "5.16.0";
|
|
27
|
-
readonly '@prisma/client': "7.
|
|
28
|
-
readonly prisma: "7.
|
|
29
|
-
readonly '@prisma/adapter-pg': "7.
|
|
27
|
+
readonly '@prisma/client': "7.5.0";
|
|
28
|
+
readonly prisma: "7.5.0";
|
|
29
|
+
readonly '@prisma/adapter-pg': "7.5.0";
|
|
30
30
|
readonly ms: "2.1.3";
|
|
31
31
|
readonly '@types/redis-info': "3.0.3";
|
|
32
32
|
readonly '@types/ms': "0.7.34";
|
|
@@ -27,9 +27,9 @@ export const FASTIFY_PACKAGES = {
|
|
|
27
27
|
'@graphql-yoga/redis-event-target': '2.0.0',
|
|
28
28
|
'graphql-ws': '5.16.0',
|
|
29
29
|
// Prisma
|
|
30
|
-
'@prisma/client': '7.
|
|
31
|
-
prisma: '7.
|
|
32
|
-
'@prisma/adapter-pg': '7.
|
|
30
|
+
'@prisma/client': '7.5.0',
|
|
31
|
+
prisma: '7.5.0',
|
|
32
|
+
'@prisma/adapter-pg': '7.5.0',
|
|
33
33
|
// Utils
|
|
34
34
|
ms: '2.1.3',
|
|
35
35
|
'@types/redis-info': '3.0.3',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-roles.generator.d.ts","sourceRoot":"","sources":["../../../../src/generators/auth/auth-roles/auth-roles.generator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-roles.generator.d.ts","sourceRoot":"","sources":["../../../../src/generators/auth/auth-roles/auth-roles.generator.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+C7B,CAAC"}
|
|
@@ -13,6 +13,7 @@ const descriptorSchema = z.object({
|
|
|
13
13
|
.regex(/^[a-z]+(-[a-z]+)*$/),
|
|
14
14
|
comment: z.string().min(1),
|
|
15
15
|
builtIn: z.boolean(),
|
|
16
|
+
autoAssigned: z.boolean(),
|
|
16
17
|
})),
|
|
17
18
|
});
|
|
18
19
|
export const authRolesGenerator = createGenerator({
|
|
@@ -39,7 +40,10 @@ export const authRolesGenerator = createGenerator({
|
|
|
39
40
|
variables: {
|
|
40
41
|
TPL_AUTH_ROLES: stringifyPrettyStable(Object.fromEntries(roles.map((r) => [
|
|
41
42
|
r.name,
|
|
42
|
-
{
|
|
43
|
+
{
|
|
44
|
+
comment: r.comment,
|
|
45
|
+
autoAssigned: r.autoAssigned,
|
|
46
|
+
},
|
|
43
47
|
]))),
|
|
44
48
|
},
|
|
45
49
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-roles.generator.js","sourceRoot":"","sources":["../../../../src/generators/auth/auth-roles/auth-roles.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,sDAAsD;IACtD,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;QACP,qBAAqB;QACrB,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,KAAK,CAAC,oBAAoB,CAAC;QAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"auth-roles.generator.js","sourceRoot":"","sources":["../../../../src/generators/auth/auth-roles/auth-roles.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,sDAAsD;IACtD,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;QACP,qBAAqB;QACrB,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,KAAK,CAAC,oBAAoB,CAAC;QAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;QACpB,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE;KAC1B,CAAC,CACH;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;IAChD,IAAI,EAAE,iBAAiB;IACvB,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;IACjC,gBAAgB;IAChB,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,IAAI;QAC3C,OAAO,EAAE,yBAAyB,CAAC,OAAO,CAAC,IAAI;QAC/C,IAAI,EAAE,mBAAmB,CAAC;YACxB,YAAY,EAAE;gBACZ,cAAc,EAAE,sBAAsB;gBACtC,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,QAAQ;aAChD;YACD,GAAG,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE;gBAC3B,IACE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CACnC,EACD,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBACjE,CAAC;gBAED,OAAO;oBACL,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;wBACvB,MAAM,OAAO,CAAC,KAAK,CACjB,cAAc,CAAC,kBAAkB,CAAC;4BAChC,QAAQ,EAAE,yBAAyB,CAAC,SAAS,CAAC,SAAS;4BACvD,WAAW,EAAE,KAAK,CAAC,SAAS;4BAC5B,SAAS,EAAE;gCACT,cAAc,EAAE,qBAAqB,CACnC,MAAM,CAAC,WAAW,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oCACf,CAAC,CAAC,IAAI;oCACN;wCACE,OAAO,EAAE,CAAC,CAAC,OAAO;wCAClB,YAAY,EAAE,CAAC,CAAC,YAAY;qCAC7B;iCACF,CAAC,CACH,CACF;6BACF;yBACF,CAAC,CACH,CAAC;oBACJ,CAAC;iBACF,CAAC;YACJ,CAAC;SACF,CAAC;KACH,CAAC;CACH,CAAC,CAAC"}
|
|
@@ -6,11 +6,12 @@ export interface RoleConfig {
|
|
|
6
6
|
*/
|
|
7
7
|
comment: string;
|
|
8
8
|
/**
|
|
9
|
-
* Whether this role is
|
|
9
|
+
* Whether this role is automatically assigned to all user contexts.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* Auto-assigned roles (public, user, system) should not be used in
|
|
12
|
+
* authorizer expressions or assigned to users directly.
|
|
12
13
|
*/
|
|
13
|
-
|
|
14
|
+
autoAssigned: boolean;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
/**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const pothosPrismaEnumGenerator: import("@baseplate-dev/sync").GeneratorBundleCreator<{
|
|
2
2
|
enumName: string;
|
|
3
|
+
valueDescriptions?: Record<string, string> | undefined;
|
|
3
4
|
}, {
|
|
4
5
|
main: import("@baseplate-dev/sync").GeneratorTask<any, {
|
|
5
6
|
prismaOutput: import("@baseplate-dev/sync").ProviderType<import("#src/generators/prisma/prisma/index.js").PrismaOutputProvider>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pothos-prisma-enum.generator.d.ts","sourceRoot":"","sources":["../../../../src/generators/pothos/pothos-prisma-enum/pothos-prisma-enum.generator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pothos-prisma-enum.generator.d.ts","sourceRoot":"","sources":["../../../../src/generators/pothos/pothos-prisma-enum/pothos-prisma-enum.generator.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,yBAAyB;;;;;;;;;;;EA8CpC,CAAC"}
|
|
@@ -8,13 +8,14 @@ import { pothosEnumsFileProvider } from '../pothos-enums-file/index.js';
|
|
|
8
8
|
import { pothosImportsProvider } from '../pothos/index.js';
|
|
9
9
|
const descriptorSchema = z.object({
|
|
10
10
|
enumName: z.string().min(1),
|
|
11
|
+
valueDescriptions: z.record(z.string(), z.string()).optional(),
|
|
11
12
|
});
|
|
12
13
|
export const pothosPrismaEnumGenerator = createGenerator({
|
|
13
14
|
name: 'pothos/pothos-prisma-enum',
|
|
14
15
|
generatorFileUrl: import.meta.url,
|
|
15
16
|
descriptorSchema,
|
|
16
17
|
getInstanceName: (descriptor) => descriptor.enumName,
|
|
17
|
-
buildTasks: ({ enumName }) => ({
|
|
18
|
+
buildTasks: ({ enumName, valueDescriptions }) => ({
|
|
18
19
|
main: createGeneratorTask({
|
|
19
20
|
dependencies: {
|
|
20
21
|
prismaOutput: prismaOutputProvider,
|
|
@@ -26,7 +27,15 @@ export const pothosPrismaEnumGenerator = createGenerator({
|
|
|
26
27
|
const exportName = `${lowerCaseFirst(enumName)}Enum`;
|
|
27
28
|
const enumFragment = tsTemplate `
|
|
28
29
|
export const ${exportName} = ${pothosImports.builder.fragment()}.enumType(${quot(enumName)}, {
|
|
29
|
-
values: ${TsCodeUtils.mergeFragmentsAsObject(Object.fromEntries(enumBlock.values.map((value) =>
|
|
30
|
+
values: ${TsCodeUtils.mergeFragmentsAsObject(Object.fromEntries(enumBlock.values.map((value) => {
|
|
31
|
+
const description = valueDescriptions?.[value.name];
|
|
32
|
+
return [
|
|
33
|
+
value.name,
|
|
34
|
+
description
|
|
35
|
+
? `{ description: ${quot(description)} }`
|
|
36
|
+
: '{}',
|
|
37
|
+
];
|
|
38
|
+
})),
|
|
30
39
|
// use sort from prisma output
|
|
31
40
|
{ disableSort: true })}
|
|
32
41
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pothos-prisma-enum.generator.js","sourceRoot":"","sources":["../../../../src/generators/pothos/pothos-prisma-enum/pothos-prisma-enum.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"pothos-prisma-enum.generator.js","sourceRoot":"","sources":["../../../../src/generators/pothos/pothos-prisma-enum/pothos-prisma-enum.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC/D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;IACvD,IAAI,EAAE,2BAA2B;IACjC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;IACjC,gBAAgB;IAChB,eAAe,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ;IACpD,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,EAAE,mBAAmB,CAAC;YACxB,YAAY,EAAE;gBACZ,YAAY,EAAE,oBAAoB;gBAClC,eAAe,EAAE,uBAAuB;gBACxC,aAAa,EAAE,qBAAqB;aACrC;YACD,GAAG,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE;gBAClD,MAAM,SAAS,GAAG,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBACxD,MAAM,UAAU,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAErD,MAAM,YAAY,GAAG,UAAU,CAAA;yBACd,UAAU,MAAM,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,IAAI,CAAC,QAAQ,CAAC;sBAC9E,WAAW,CAAC,sBAAsB,CAC1C,MAAM,CAAC,WAAW,CAChB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC7B,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACpD,OAAO;wBACL,KAAK,CAAC,IAAI;wBACV,WAAW;4BACT,CAAC,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,IAAI;4BACzC,CAAC,CAAC,IAAI;qBACT,CAAC;gBACJ,CAAC,CAAC,CACH;gBACD,8BAA8B;gBAC9B,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB;;SAEJ,CAAC;gBAEF,eAAe,CAAC,YAAY,CAAC;oBAC3B,IAAI,EAAE,QAAQ;oBACd,UAAU;oBACV,QAAQ,EAAE,YAAY;iBACvB,CAAC,CAAC;gBAEH,OAAO,EAAE,CAAC;YACZ,CAAC;SACF,CAAC;KACH,CAAC;CACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { TsCodeFragment } from '@baseplate-dev/core-generators';
|
|
2
|
+
import type { InputFieldDefinitionOutput } from '../field-definition-generators/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Builds a Zod schema entries object from field definitions.
|
|
5
|
+
* Returns a TsCodeFragment for `{ field1: z.string(), field2: z.number(), ... }`.
|
|
6
|
+
*
|
|
7
|
+
* @param fields - The field definitions to build from
|
|
8
|
+
* @param options - Optional configuration
|
|
9
|
+
* @returns TsCodeFragment for the schema entries object
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildFieldSchemasObject(fields: InputFieldDefinitionOutput[], options?: {
|
|
12
|
+
disableSort?: boolean;
|
|
13
|
+
}): TsCodeFragment;
|
|
14
|
+
interface BuildNestedSchemaFragmentsConfig {
|
|
15
|
+
/** The field definitions used by this nested relation */
|
|
16
|
+
fields: InputFieldDefinitionOutput[];
|
|
17
|
+
/** The field names used by this nested relation */
|
|
18
|
+
fieldNames: string[];
|
|
19
|
+
/** Whether this is a list relation (one-to-many) */
|
|
20
|
+
isList: boolean;
|
|
21
|
+
/** Import fragment for the nested model's fieldSchemas variable (when data service exists) */
|
|
22
|
+
nestedFieldSchemasFragment?: TsCodeFragment;
|
|
23
|
+
/** All field names in the nested model's data service (for subset detection) */
|
|
24
|
+
allDataServiceFieldNames?: string[];
|
|
25
|
+
}
|
|
26
|
+
interface NestedSchemaFragments {
|
|
27
|
+
/** The item-level schema (for transformer `schema:` config) */
|
|
28
|
+
itemSchema: TsCodeFragment;
|
|
29
|
+
/** The wrapped schema (for parent's fieldSchemas entry — array/nullish wrapped) */
|
|
30
|
+
schemaFragment: TsCodeFragment;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Builds the schema fragments for a nested relation.
|
|
34
|
+
*
|
|
35
|
+
* Two cases:
|
|
36
|
+
* 1. **Has fieldSchemas import** → `z.object(fieldSchemas)` or `z.object(pick(fieldSchemas, [...]))`
|
|
37
|
+
* 2. **No data service** → inline `z.object({ field1: z.string(), ... })`
|
|
38
|
+
*
|
|
39
|
+
* Returns `{ itemSchema, schemaFragment }` where `schemaFragment` is wrapped
|
|
40
|
+
* with `z.array(...).optional()` (list) or `.nullish()` (one-to-one).
|
|
41
|
+
*
|
|
42
|
+
* @param config - Configuration for building the schema
|
|
43
|
+
* @returns The item-level schema and the wrapped schema fragment
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildNestedSchemaFragments(config: BuildNestedSchemaFragmentsConfig): NestedSchemaFragments;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=build-schema-fragments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-schema-fragments.d.ts","sourceRoot":"","sources":["../../../../../src/generators/prisma/_shared/build-data-helpers/build-schema-fragments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAE1F;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,0BAA0B,EAAE,EACpC,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAClC,cAAc,CAOhB;AAED,UAAU,gCAAgC;IACxC,yDAAyD;IACzD,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACrC,mDAAmD;IACnD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oDAAoD;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,8FAA8F;IAC9F,0BAA0B,CAAC,EAAE,cAAc,CAAC;IAC5C,gFAAgF;IAChF,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;CACrC;AAED,UAAU,qBAAqB;IAC7B,+DAA+D;IAC/D,UAAU,EAAE,cAAc,CAAC;IAC3B,mFAAmF;IACnF,cAAc,EAAE,cAAc,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,gCAAgC,GACvC,qBAAqB,CAuCvB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { TsCodeUtils, tsTemplate } from '@baseplate-dev/core-generators';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a Zod schema entries object from field definitions.
|
|
4
|
+
* Returns a TsCodeFragment for `{ field1: z.string(), field2: z.number(), ... }`.
|
|
5
|
+
*
|
|
6
|
+
* @param fields - The field definitions to build from
|
|
7
|
+
* @param options - Optional configuration
|
|
8
|
+
* @returns TsCodeFragment for the schema entries object
|
|
9
|
+
*/
|
|
10
|
+
export function buildFieldSchemasObject(fields, options) {
|
|
11
|
+
return TsCodeUtils.mergeFragmentsAsObject(Object.fromEntries(fields.map((field) => [field.name, field.schemaFragment])), { disableSort: options?.disableSort });
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Builds the schema fragments for a nested relation.
|
|
15
|
+
*
|
|
16
|
+
* Two cases:
|
|
17
|
+
* 1. **Has fieldSchemas import** → `z.object(fieldSchemas)` or `z.object(pick(fieldSchemas, [...]))`
|
|
18
|
+
* 2. **No data service** → inline `z.object({ field1: z.string(), ... })`
|
|
19
|
+
*
|
|
20
|
+
* Returns `{ itemSchema, schemaFragment }` where `schemaFragment` is wrapped
|
|
21
|
+
* with `z.array(...).optional()` (list) or `.nullish()` (one-to-one).
|
|
22
|
+
*
|
|
23
|
+
* @param config - Configuration for building the schema
|
|
24
|
+
* @returns The item-level schema and the wrapped schema fragment
|
|
25
|
+
*/
|
|
26
|
+
export function buildNestedSchemaFragments(config) {
|
|
27
|
+
const { fields, fieldNames, isList, nestedFieldSchemasFragment, allDataServiceFieldNames, } = config;
|
|
28
|
+
const zFrag = TsCodeUtils.importFragment('z', 'zod');
|
|
29
|
+
let itemSchema;
|
|
30
|
+
if (nestedFieldSchemasFragment) {
|
|
31
|
+
// Has data service — construct from imported fieldSchemas
|
|
32
|
+
const usesAllFields = fieldNames.length === allDataServiceFieldNames?.length &&
|
|
33
|
+
fieldNames.every((n) => allDataServiceFieldNames.includes(n));
|
|
34
|
+
if (usesAllFields) {
|
|
35
|
+
// All fields match — use fieldSchemas directly
|
|
36
|
+
itemSchema = tsTemplate `${zFrag}.object(${nestedFieldSchemasFragment})`;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Subset — use pick() to select needed fields
|
|
40
|
+
const pickFrag = TsCodeUtils.importFragment('pick', 'es-toolkit');
|
|
41
|
+
const fieldNamesList = fieldNames.map((n) => `'${n}'`).join(', ');
|
|
42
|
+
itemSchema = tsTemplate `${zFrag}.object(${pickFrag}(${nestedFieldSchemasFragment}, [${fieldNamesList}]))`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// No data service — build inline from field definitions
|
|
47
|
+
const schemaEntries = buildFieldSchemasObject(fields);
|
|
48
|
+
itemSchema = tsTemplate `${zFrag}.object(${schemaEntries})`;
|
|
49
|
+
}
|
|
50
|
+
// Wrap for the parent's fieldSchemas entry
|
|
51
|
+
const schemaFragment = isList
|
|
52
|
+
? tsTemplate `${zFrag}.array(${itemSchema}).optional()`
|
|
53
|
+
: tsTemplate `${itemSchema}.nullish()`;
|
|
54
|
+
return { itemSchema, schemaFragment };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=build-schema-fragments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-schema-fragments.js","sourceRoot":"","sources":["../../../../../src/generators/prisma/_shared/build-data-helpers/build-schema-fragments.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAIzE;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAoC,EACpC,OAAmC;IAEnC,OAAO,WAAW,CAAC,sBAAsB,CACvC,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAC1D,EACD,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CACtC,CAAC;AACJ,CAAC;AAsBD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAwC;IAExC,MAAM,EACJ,MAAM,EACN,UAAU,EACV,MAAM,EACN,0BAA0B,EAC1B,wBAAwB,GACzB,GAAG,MAAM,CAAC;IAEX,MAAM,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrD,IAAI,UAA0B,CAAC;IAE/B,IAAI,0BAA0B,EAAE,CAAC;QAC/B,0DAA0D;QAC1D,MAAM,aAAa,GACjB,UAAU,CAAC,MAAM,KAAK,wBAAwB,EAAE,MAAM;YACtD,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhE,IAAI,aAAa,EAAE,CAAC;YAClB,+CAA+C;YAC/C,UAAU,GAAG,UAAU,CAAA,GAAG,KAAK,WAAW,0BAA0B,GAAG,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,8CAA8C;YAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAClE,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,UAAU,GAAG,UAAU,CAAA,GAAG,KAAK,WAAW,QAAQ,IAAI,0BAA0B,MAAM,cAAc,KAAK,CAAC;QAC5G,CAAC;IACH,CAAC;SAAM,CAAC;QACN,wDAAwD;QACxD,MAAM,aAAa,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACtD,UAAU,GAAG,UAAU,CAAA,GAAG,KAAK,WAAW,aAAa,GAAG,CAAC;IAC7D,CAAC;IAED,2CAA2C;IAC3C,MAAM,cAAc,GAAG,MAAM;QAC3B,CAAC,CAAC,UAAU,CAAA,GAAG,KAAK,UAAU,UAAU,cAAc;QACtD,CAAC,CAAC,UAAU,CAAA,GAAG,UAAU,YAAY,CAAC;IAExC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AACxC,CAAC"}
|
package/dist/generators/prisma/_shared/build-data-helpers/build-transform-operation-parts.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { TsCodeFragment } from '@baseplate-dev/core-generators';
|
|
2
|
+
import type { PrismaOutputModel } from '#src/types/prisma-output.js';
|
|
3
|
+
import type { DataUtilsImportsProvider } from '../../data-utils/index.js';
|
|
4
|
+
import type { InputFieldDefinitionOutput } from '../field-definition-generators/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for building transform operation parts.
|
|
7
|
+
*/
|
|
8
|
+
interface TransformOperationConfig {
|
|
9
|
+
/** All fields for this operation (scalar + transform) */
|
|
10
|
+
fields: InputFieldDefinitionOutput[];
|
|
11
|
+
/** Prisma model for FK relation detection */
|
|
12
|
+
prismaModel: PrismaOutputModel;
|
|
13
|
+
/** Data utils imports for relation helpers */
|
|
14
|
+
dataUtilsImports: DataUtilsImportsProvider;
|
|
15
|
+
/** Create or update operation */
|
|
16
|
+
operationType: 'create' | 'update';
|
|
17
|
+
/** Variable name for the input (default: 'data') */
|
|
18
|
+
inputVarName?: string;
|
|
19
|
+
/** Fragment or string for the transformers variable (e.g., 'xTransformers' or an import fragment) */
|
|
20
|
+
transformersVarFragment?: TsCodeFragment | string;
|
|
21
|
+
/** Variable name for existing item in update operations (default: 'existingItem') */
|
|
22
|
+
existingItemVarName?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Variable name to use in loadExisting where clauses (default: 'where').
|
|
25
|
+
* Set to existingItemVarName for nested processUpdate context where
|
|
26
|
+
* loadExisting should reference the existing nested item.
|
|
27
|
+
*/
|
|
28
|
+
loadExistingVarName?: string;
|
|
29
|
+
/** Additional entries for the Prisma data object (e.g., parent connect for nested) */
|
|
30
|
+
additionalDataEntries?: Record<string, TsCodeFragment | string>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Result of building transform operation parts.
|
|
34
|
+
* Contains all the fragments needed to generate a create/update operation body.
|
|
35
|
+
*/
|
|
36
|
+
export interface TransformOperationParts {
|
|
37
|
+
/** Names of transform fields */
|
|
38
|
+
transformFieldNames: string[];
|
|
39
|
+
/** Names of FK fields that need destructuring */
|
|
40
|
+
foreignKeyFieldNames: string[];
|
|
41
|
+
/** Whether destructuring is needed */
|
|
42
|
+
hasDestructure: boolean;
|
|
43
|
+
/** The destructure statement (e.g., `const { field1, ...rest } = input;`), or empty string */
|
|
44
|
+
inputDestructureFragment: TsCodeFragment | string;
|
|
45
|
+
/** The rest data variable name ('rest' or inputVarName) */
|
|
46
|
+
dataName: string;
|
|
47
|
+
/** Whether there are any sub-transform fields */
|
|
48
|
+
hasTransformFields: boolean;
|
|
49
|
+
/** The Prisma data fragment (object or just the variable name) */
|
|
50
|
+
prismaDataFragment: TsCodeFragment | string;
|
|
51
|
+
/** The transformer entries object for prepareTransformers (undefined if no transform fields) */
|
|
52
|
+
transformersObjectFragment?: TsCodeFragment;
|
|
53
|
+
/** Individual relation entries for create operations */
|
|
54
|
+
createRelationEntries: Record<string, TsCodeFragment>;
|
|
55
|
+
/** Individual relation entries for update operations */
|
|
56
|
+
updateRelationEntries: Record<string, TsCodeFragment>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Builds all the parts needed for a transform-aware create/update operation.
|
|
60
|
+
*
|
|
61
|
+
* This is the main shared helper used by:
|
|
62
|
+
* - prisma-data-create generator (top-level create)
|
|
63
|
+
* - prisma-data-update generator (top-level update)
|
|
64
|
+
* - nested-field-writer (processCreate/processUpdate inside nested transformers)
|
|
65
|
+
*
|
|
66
|
+
* @param config - Configuration for the operation
|
|
67
|
+
* @returns All fragments needed to generate the operation body
|
|
68
|
+
*/
|
|
69
|
+
export declare function buildTransformOperationParts(config: TransformOperationConfig): TransformOperationParts;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=build-transform-operation-parts.d.ts.map
|
package/dist/generators/prisma/_shared/build-data-helpers/build-transform-operation-parts.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-transform-operation-parts.d.ts","sourceRoot":"","sources":["../../../../../src/generators/prisma/_shared/build-data-helpers/build-transform-operation-parts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EACV,0BAA0B,EAE3B,MAAM,yCAAyC,CAAC;AAIjD;;GAEG;AACH,UAAU,wBAAwB;IAChC,yDAAyD;IACzD,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACrC,6CAA6C;IAC7C,WAAW,EAAE,iBAAiB,CAAC;IAC/B,8CAA8C;IAC9C,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,iCAAiC;IACjC,aAAa,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACnC,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qGAAqG;IACrG,uBAAuB,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC;IAClD,qFAAqF;IACrF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sFAAsF;IACtF,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,CAAC;CACjE;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,gCAAgC;IAChC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,iDAAiD;IACjD,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,sCAAsC;IACtC,cAAc,EAAE,OAAO,CAAC;IACxB,8FAA8F;IAC9F,wBAAwB,EAAE,cAAc,GAAG,MAAM,CAAC;IAClD,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kEAAkE;IAClE,kBAAkB,EAAE,cAAc,GAAG,MAAM,CAAC;IAC5C,gGAAgG;IAChG,0BAA0B,CAAC,EAAE,cAAc,CAAC;IAC5C,wDAAwD;IACxD,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtD,wDAAwD;IACxD,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACvD;AA2HD;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,wBAAwB,GAC/B,uBAAuB,CA8FzB"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { TsCodeUtils, tsTemplate } from '@baseplate-dev/core-generators';
|
|
2
|
+
import { generateRelationBuildData } from './generate-relation-build-data.js';
|
|
3
|
+
/**
|
|
4
|
+
* Builds the transformer entries object for `prepareTransformers()`.
|
|
5
|
+
*
|
|
6
|
+
* Delegates to each transformer's `buildForCreateEntry` / `buildForUpdateEntry`
|
|
7
|
+
* callbacks, which produce the complete `.forCreate()` / `.forUpdate()` fragments.
|
|
8
|
+
*
|
|
9
|
+
* @param transformFields - Fields that need transformer handling
|
|
10
|
+
* @param transformersVarFragment - Reference to the transformers variable
|
|
11
|
+
* @param operationType - Create or update
|
|
12
|
+
* @param existingItemVarName - Variable name for the existing item (for update)
|
|
13
|
+
* @param loadExistingVarName - Variable name for looking up existing related data
|
|
14
|
+
* @returns TsCodeFragment for the transformers object
|
|
15
|
+
*/
|
|
16
|
+
function buildTransformerEntries(transformFields, transformersVarFragment, operationType, existingItemVarName = 'existingItem', loadExistingVarName = 'where') {
|
|
17
|
+
const ctx = {
|
|
18
|
+
transformersVarFragment,
|
|
19
|
+
existingItemVarName,
|
|
20
|
+
loadExistingVarName,
|
|
21
|
+
};
|
|
22
|
+
return TsCodeUtils.mergeFragmentsAsObject(Object.fromEntries(transformFields.map((field) => {
|
|
23
|
+
const { transformer } = field;
|
|
24
|
+
if (!transformer) {
|
|
25
|
+
throw new Error(`Transform field '${field.name}' has no transformer definition`);
|
|
26
|
+
}
|
|
27
|
+
const { buildForCreateEntry, buildForUpdateEntry } = transformer;
|
|
28
|
+
const entry = operationType === 'create'
|
|
29
|
+
? buildForCreateEntry(ctx)
|
|
30
|
+
: buildForUpdateEntry(ctx);
|
|
31
|
+
return [field.name, entry];
|
|
32
|
+
})));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Builds a data expression that omits specified fields.
|
|
36
|
+
* Returns `omit(dataExpr, ['field1', 'field2'])` as a TsCodeFragment.
|
|
37
|
+
*/
|
|
38
|
+
function buildOmitExpression(dataExpr, fieldsToOmit) {
|
|
39
|
+
const omitFrag = TsCodeUtils.importFragment('omit', 'es-toolkit');
|
|
40
|
+
const fieldsList = fieldsToOmit.map((f) => `'${f}'`).join(', ');
|
|
41
|
+
return tsTemplate `${omitFrag}(${dataExpr}, [${fieldsList}])`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Builds the Prisma data fragment for create/update operations.
|
|
45
|
+
*
|
|
46
|
+
* Merges: `{ ...dataName, ...transformed, relation: connect(...), ...additionalEntries }`
|
|
47
|
+
*
|
|
48
|
+
* When `fieldsToOmit` is provided, wraps the data spread with `omit()` from es-toolkit
|
|
49
|
+
* to exclude ID fields that shouldn't be in Prisma update data.
|
|
50
|
+
*
|
|
51
|
+
* @param config - Configuration for building the data fragment
|
|
52
|
+
* @returns TsCodeFragment or string for the Prisma data argument
|
|
53
|
+
*/
|
|
54
|
+
function buildPrismaDataFragment(config) {
|
|
55
|
+
const { dataName, hasTransformFields, relationEntries, noRelations, additionalEntries, fieldsToOmit = [], } = config;
|
|
56
|
+
const hasOmit = fieldsToOmit.length > 0;
|
|
57
|
+
const hasAdditional = additionalEntries && Object.keys(additionalEntries).length > 0;
|
|
58
|
+
// Simple case: just the data variable (possibly wrapped in omit)
|
|
59
|
+
if (noRelations && !hasTransformFields && !hasAdditional) {
|
|
60
|
+
return hasOmit ? buildOmitExpression(dataName, fieldsToOmit) : dataName;
|
|
61
|
+
}
|
|
62
|
+
// Build the spread expression for the data variable
|
|
63
|
+
const dataSpreadExpr = hasOmit
|
|
64
|
+
? buildOmitExpression(dataName, fieldsToOmit)
|
|
65
|
+
: dataName;
|
|
66
|
+
const dataSpreadKey = hasOmit ? `...omit(${dataName})` : `...${dataName}`;
|
|
67
|
+
const entries = {
|
|
68
|
+
[dataSpreadKey]: dataSpreadExpr,
|
|
69
|
+
};
|
|
70
|
+
if (hasTransformFields) {
|
|
71
|
+
entries['...transformed'] = 'transformed';
|
|
72
|
+
}
|
|
73
|
+
for (const [name, fragment] of Object.entries(relationEntries)) {
|
|
74
|
+
entries[name] = fragment;
|
|
75
|
+
}
|
|
76
|
+
if (additionalEntries) {
|
|
77
|
+
for (const [name, fragment] of Object.entries(additionalEntries)) {
|
|
78
|
+
entries[name] = fragment;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return TsCodeUtils.mergeFragmentsAsObject(entries, { disableSort: true });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Builds all the parts needed for a transform-aware create/update operation.
|
|
85
|
+
*
|
|
86
|
+
* This is the main shared helper used by:
|
|
87
|
+
* - prisma-data-create generator (top-level create)
|
|
88
|
+
* - prisma-data-update generator (top-level update)
|
|
89
|
+
* - nested-field-writer (processCreate/processUpdate inside nested transformers)
|
|
90
|
+
*
|
|
91
|
+
* @param config - Configuration for the operation
|
|
92
|
+
* @returns All fragments needed to generate the operation body
|
|
93
|
+
*/
|
|
94
|
+
export function buildTransformOperationParts(config) {
|
|
95
|
+
const { fields, prismaModel, dataUtilsImports, operationType, inputVarName = 'data', transformersVarFragment, existingItemVarName = 'existingItem', loadExistingVarName = 'where', additionalDataEntries, } = config;
|
|
96
|
+
// Split fields into scalar and transform
|
|
97
|
+
const scalarFieldNames = fields
|
|
98
|
+
.filter((f) => !f.isTransformField)
|
|
99
|
+
.map((f) => f.name);
|
|
100
|
+
const transformFieldDefs = fields.filter((f) => f.isTransformField);
|
|
101
|
+
const transformFieldNames = transformFieldDefs.map((f) => f.name);
|
|
102
|
+
// Generate FK → relation transformations
|
|
103
|
+
const { passthrough: noFkRelations, foreignKeyFieldNames, createRelationEntries, updateRelationEntries, } = generateRelationBuildData({
|
|
104
|
+
prismaModel,
|
|
105
|
+
inputFieldNames: scalarFieldNames,
|
|
106
|
+
dataUtilsImports,
|
|
107
|
+
dataName: 'rest',
|
|
108
|
+
});
|
|
109
|
+
// For update operations, compute ID fields that need to be omitted from the data.
|
|
110
|
+
// Prisma will crash if ID fields are included in update data.
|
|
111
|
+
// These are model ID fields that are in the input but not already handled as FK or transform fields.
|
|
112
|
+
const fieldsToOmit = operationType === 'update'
|
|
113
|
+
? (prismaModel.idFields ?? []).filter((f) => scalarFieldNames.includes(f) && !foreignKeyFieldNames.includes(f))
|
|
114
|
+
: [];
|
|
115
|
+
// Build the destructure pattern (transform fields + FK fields only)
|
|
116
|
+
const allDestructuredNames = [
|
|
117
|
+
...new Set([...transformFieldNames, ...foreignKeyFieldNames]),
|
|
118
|
+
];
|
|
119
|
+
const hasDestructure = allDestructuredNames.length > 0;
|
|
120
|
+
const inputDestructureFragment = hasDestructure
|
|
121
|
+
? tsTemplate `const { ${allDestructuredNames.join(', ')}, ...rest } = ${inputVarName};`
|
|
122
|
+
: '';
|
|
123
|
+
const dataName = hasDestructure ? 'rest' : inputVarName;
|
|
124
|
+
// Build the Prisma data object
|
|
125
|
+
const relationEntries = operationType === 'create' ? createRelationEntries : updateRelationEntries;
|
|
126
|
+
const hasTransformFields = transformFieldDefs.length > 0;
|
|
127
|
+
const prismaDataFragment = buildPrismaDataFragment({
|
|
128
|
+
dataName,
|
|
129
|
+
hasTransformFields,
|
|
130
|
+
relationEntries,
|
|
131
|
+
noRelations: noFkRelations,
|
|
132
|
+
additionalEntries: additionalDataEntries,
|
|
133
|
+
fieldsToOmit,
|
|
134
|
+
});
|
|
135
|
+
// Build transformer entries (if there are transform fields and a transformers var)
|
|
136
|
+
let transformersObjectFragment;
|
|
137
|
+
if (hasTransformFields && transformersVarFragment) {
|
|
138
|
+
transformersObjectFragment = buildTransformerEntries(transformFieldDefs, transformersVarFragment, operationType, existingItemVarName, loadExistingVarName);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
transformFieldNames,
|
|
142
|
+
foreignKeyFieldNames,
|
|
143
|
+
hasDestructure,
|
|
144
|
+
inputDestructureFragment,
|
|
145
|
+
dataName,
|
|
146
|
+
hasTransformFields,
|
|
147
|
+
prismaDataFragment,
|
|
148
|
+
transformersObjectFragment,
|
|
149
|
+
createRelationEntries,
|
|
150
|
+
updateRelationEntries,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=build-transform-operation-parts.js.map
|
package/dist/generators/prisma/_shared/build-data-helpers/build-transform-operation-parts.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-transform-operation-parts.js","sourceRoot":"","sources":["../../../../../src/generators/prisma/_shared/build-data-helpers/build-transform-operation-parts.ts"],"names":[],"mappings":"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"}
|
package/dist/generators/prisma/_shared/build-data-helpers/generate-authorization-statements.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { TsCodeFragment } from '@baseplate-dev/core-generators';
|
|
2
|
+
import type { AuthorizerUtilsImportsProvider } from '../../../auth/_providers/authorizer-utils-imports.js';
|
|
3
|
+
interface ModelAuthorizerLike {
|
|
4
|
+
getRoleFragment(roleName: string): TsCodeFragment;
|
|
5
|
+
}
|
|
6
|
+
interface GenerateAuthorizationStatementsConfig {
|
|
7
|
+
/** Model name (lowercase) for error messages */
|
|
8
|
+
modelName: string;
|
|
9
|
+
/** Method type for error messages */
|
|
10
|
+
methodType: string;
|
|
11
|
+
/** Global roles (e.g., ['admin', 'user']) */
|
|
12
|
+
globalRoles?: string[];
|
|
13
|
+
/** Instance roles (e.g., ['owner']) — assumes `existingItem` is in scope */
|
|
14
|
+
instanceRoles?: string[];
|
|
15
|
+
/** Model authorizer provider (required if instanceRoles is set) */
|
|
16
|
+
modelAuthorizer: ModelAuthorizerLike | undefined;
|
|
17
|
+
/** Authorizer imports provider */
|
|
18
|
+
authorizerImports: AuthorizerUtilsImportsProvider;
|
|
19
|
+
}
|
|
20
|
+
interface AuthorizationStatements {
|
|
21
|
+
/**
|
|
22
|
+
* Fragment with authorization check statement.
|
|
23
|
+
*
|
|
24
|
+
* For global-only auth:
|
|
25
|
+
* ```
|
|
26
|
+
* checkGlobalAuthorization(context, ['admin']);
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* For instance auth (assumes `existingItem` is already in scope):
|
|
30
|
+
* ```
|
|
31
|
+
* await checkInstanceAuthorization(context, existingItem, ['admin', xAuthorizer.roles.owner]);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
fragment: TsCodeFragment | '';
|
|
35
|
+
/** Whether instance authorization is used (caller must ensure existingItem is in scope) */
|
|
36
|
+
hasInstanceAuth: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generates explicit authorization check statements.
|
|
40
|
+
*
|
|
41
|
+
* Does NOT emit the `existingItem` fetch — the caller is responsible for
|
|
42
|
+
* ensuring `existingItem` is in scope when instance roles are used.
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateAuthorizationStatements(config: GenerateAuthorizationStatementsConfig): AuthorizationStatements;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=generate-authorization-statements.d.ts.map
|
package/dist/generators/prisma/_shared/build-data-helpers/generate-authorization-statements.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-authorization-statements.d.ts","sourceRoot":"","sources":["../../../../../src/generators/prisma/_shared/build-data-helpers/generate-authorization-statements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAKrE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,sDAAsD,CAAC;AAE3G,UAAU,mBAAmB;IAC3B,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC;CACnD;AAED,UAAU,qCAAqC;IAC7C,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,mEAAmE;IACnE,eAAe,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACjD,kCAAkC;IAClC,iBAAiB,EAAE,8BAA8B,CAAC;CACnD;AAED,UAAU,uBAAuB;IAC/B;;;;;;;;;;;;OAYG;IACH,QAAQ,EAAE,cAAc,GAAG,EAAE,CAAC;IAC9B,2FAA2F;IAC3F,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,qCAAqC,GAC5C,uBAAuB,CAoDzB"}
|
package/dist/generators/prisma/_shared/build-data-helpers/generate-authorization-statements.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { TsCodeUtils, tsTemplate } from '@baseplate-dev/core-generators';
|
|
2
|
+
import { quot } from '@baseplate-dev/utils';
|
|
3
|
+
/**
|
|
4
|
+
* Generates explicit authorization check statements.
|
|
5
|
+
*
|
|
6
|
+
* Does NOT emit the `existingItem` fetch — the caller is responsible for
|
|
7
|
+
* ensuring `existingItem` is in scope when instance roles are used.
|
|
8
|
+
*/
|
|
9
|
+
export function generateAuthorizationStatements(config) {
|
|
10
|
+
const { modelName, methodType, globalRoles, instanceRoles, modelAuthorizer, authorizerImports, } = config;
|
|
11
|
+
const hasGlobalRoles = globalRoles != null && globalRoles.length > 0;
|
|
12
|
+
const hasInstanceRoles = instanceRoles != null && instanceRoles.length > 0;
|
|
13
|
+
if (!hasGlobalRoles && !hasInstanceRoles) {
|
|
14
|
+
return { fragment: '', hasInstanceAuth: false };
|
|
15
|
+
}
|
|
16
|
+
// Build role items array
|
|
17
|
+
const globalRoleItems = (globalRoles ?? []).map((r) => quot(r));
|
|
18
|
+
const instanceRoleFragments = (instanceRoles ?? []).map((roleName) => {
|
|
19
|
+
if (!modelAuthorizer) {
|
|
20
|
+
throw new Error(`${methodType} method on model '${modelName}' references instance role '${roleName}' but no authorizer is configured for this model.`);
|
|
21
|
+
}
|
|
22
|
+
return modelAuthorizer.getRoleFragment(roleName);
|
|
23
|
+
});
|
|
24
|
+
if (hasInstanceRoles) {
|
|
25
|
+
// Instance auth: assumes existingItem is already in scope
|
|
26
|
+
const allRoleItems = [
|
|
27
|
+
...globalRoleItems,
|
|
28
|
+
...instanceRoleFragments.map((f) => f.contents),
|
|
29
|
+
];
|
|
30
|
+
const rolesArray = `[${allRoleItems.join(', ')}]`;
|
|
31
|
+
const rolesFrag = TsCodeUtils.frag(rolesArray, instanceRoleFragments.flatMap((f) => f.imports ?? []));
|
|
32
|
+
return {
|
|
33
|
+
fragment: tsTemplate `await ${authorizerImports.checkInstanceAuthorization.fragment()}(context, existingItem, ${rolesFrag});`,
|
|
34
|
+
hasInstanceAuth: true,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Global auth only
|
|
38
|
+
const rolesArray = `[${globalRoleItems.join(', ')}]`;
|
|
39
|
+
return {
|
|
40
|
+
fragment: tsTemplate `${authorizerImports.checkGlobalAuthorization.fragment()}(context, ${rolesArray});`,
|
|
41
|
+
hasInstanceAuth: false,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=generate-authorization-statements.js.map
|