@baseplate-dev/fastify-generators 0.5.3 → 0.6.1
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 +70 -0
- package/dist/constants/fastify-packages.d.ts +14 -14
- package/dist/constants/fastify-packages.js +14 -14
- package/dist/constants/fastify-packages.js.map +1 -1
- package/dist/generators/auth/auth-context/templates/module/types/auth-context.types.ts +1 -0
- package/dist/generators/auth/auth-context/templates/module/utils/auth-context.utils.ts +3 -1
- package/dist/generators/core/fastify/fastify.generator.d.ts.map +1 -1
- package/dist/generators/core/fastify/fastify.generator.js +3 -1
- package/dist/generators/core/fastify/fastify.generator.js.map +1 -1
- package/dist/generators/pothos/index.d.ts +1 -0
- package/dist/generators/pothos/index.d.ts.map +1 -1
- package/dist/generators/pothos/index.js +1 -0
- package/dist/generators/pothos/index.js.map +1 -1
- package/dist/generators/pothos/pothos-auth/pothos-auth.generator.d.ts +5 -0
- package/dist/generators/pothos/pothos-auth/pothos-auth.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-auth/pothos-auth.generator.js +8 -0
- package/dist/generators/pothos/pothos-auth/pothos-auth.generator.js.map +1 -1
- package/dist/generators/pothos/pothos-prisma-count-query/index.d.ts +2 -0
- package/dist/generators/pothos/pothos-prisma-count-query/index.d.ts.map +1 -0
- package/dist/generators/pothos/pothos-prisma-count-query/index.js +2 -0
- package/dist/generators/pothos/pothos-prisma-count-query/index.js.map +1 -0
- package/dist/generators/pothos/pothos-prisma-count-query/pothos-prisma-count-query.generator.d.ts +16 -0
- package/dist/generators/pothos/pothos-prisma-count-query/pothos-prisma-count-query.generator.d.ts.map +1 -0
- package/dist/generators/pothos/pothos-prisma-count-query/pothos-prisma-count-query.generator.js +104 -0
- package/dist/generators/pothos/pothos-prisma-count-query/pothos-prisma-count-query.generator.js.map +1 -0
- package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.js +2 -5
- package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.js.map +1 -1
- package/dist/generators/pothos/pothos-prisma-find-query/pothos-prisma-find-query.generator.d.ts +4 -0
- package/dist/generators/pothos/pothos-prisma-find-query/pothos-prisma-find-query.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-prisma-find-query/pothos-prisma-find-query.generator.js +52 -10
- package/dist/generators/pothos/pothos-prisma-find-query/pothos-prisma-find-query.generator.js.map +1 -1
- package/dist/generators/pothos/pothos-prisma-list-query/pothos-prisma-list-query.generator.d.ts +4 -0
- package/dist/generators/pothos/pothos-prisma-list-query/pothos-prisma-list-query.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-prisma-list-query/pothos-prisma-list-query.generator.js +39 -3
- package/dist/generators/pothos/pothos-prisma-list-query/pothos-prisma-list-query.generator.js.map +1 -1
- package/dist/generators/pothos/pothos-prisma-object/pothos-prisma-object.generator.d.ts +7 -1
- package/dist/generators/pothos/pothos-prisma-object/pothos-prisma-object.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-prisma-object/pothos-prisma-object.generator.js +73 -13
- package/dist/generators/pothos/pothos-prisma-object/pothos-prisma-object.generator.js.map +1 -1
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorize-fragment.d.ts +20 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorize-fragment.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorize-fragment.js +28 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-authorize-fragment.js.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.d.ts +48 -55
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.d.ts.map +1 -1
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.js +130 -67
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.js.map +1 -1
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.d.ts +2 -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 +3 -3
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.js.map +1 -1
- package/dist/generators/prisma/_shared/build-data-helpers/index.d.ts +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/index.d.ts.map +1 -1
- package/dist/generators/prisma/_shared/build-data-helpers/index.js +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/index.js.map +1 -1
- package/dist/generators/prisma/data-utils/data-utils.generator.d.ts +25 -6
- package/dist/generators/prisma/data-utils/data-utils.generator.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/index.d.ts +78 -23
- package/dist/generators/prisma/data-utils/generated/index.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/template-paths.d.ts +3 -1
- package/dist/generators/prisma/data-utils/generated/template-paths.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/template-paths.js +3 -1
- package/dist/generators/prisma/data-utils/generated/template-paths.js.map +1 -1
- package/dist/generators/prisma/data-utils/generated/ts-import-providers.d.ts +75 -18
- 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 +26 -8
- 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 +106 -34
- package/dist/generators/prisma/data-utils/generated/typed-templates.d.ts.map +1 -1
- package/dist/generators/prisma/data-utils/generated/typed-templates.js +61 -14
- package/dist/generators/prisma/data-utils/generated/typed-templates.js.map +1 -1
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/commit-operations.ts +366 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/compose-operations.ts +131 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/field-definitions.ts +26 -30
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/field-utils.ts +201 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-types.ts +24 -20
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-utils.ts +14 -6
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/relation-helpers.ts +21 -26
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/types.ts +374 -25
- package/dist/generators/prisma/index.d.ts +2 -0
- package/dist/generators/prisma/index.d.ts.map +1 -1
- package/dist/generators/prisma/index.js +2 -0
- package/dist/generators/prisma/index.js.map +1 -1
- package/dist/generators/prisma/prisma-authorizer-utils/generated/index.d.ts +50 -12
- 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 +25 -6
- 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 +50 -12
- 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 +25 -6
- package/dist/generators/prisma/prisma-authorizer-utils/prisma-authorizer-utils.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.d.ts +26 -6
- 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 +53 -25
- 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 +31 -6
- 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 +52 -15
- package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.js.map +1 -1
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.d.ts +25 -6
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.d.ts +25 -6
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.d.ts +31 -6
- 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 +65 -23
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.js.map +1 -1
- package/dist/generators/prisma/prisma-model-authorizer/prisma-model-authorizer.generator.d.ts +2 -0
- package/dist/generators/prisma/prisma-model-authorizer/prisma-model-authorizer.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma-model-authorizer/prisma-model-authorizer.generator.js +86 -53
- package/dist/generators/prisma/prisma-model-authorizer/prisma-model-authorizer.generator.js.map +1 -1
- package/dist/generators/prisma/prisma-model-query-filter/index.d.ts +2 -0
- package/dist/generators/prisma/prisma-model-query-filter/index.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-model-query-filter/index.js +2 -0
- package/dist/generators/prisma/prisma-model-query-filter/index.js.map +1 -0
- package/dist/generators/prisma/prisma-model-query-filter/prisma-model-query-filter.generator.d.ts +60 -0
- package/dist/generators/prisma/prisma-model-query-filter/prisma-model-query-filter.generator.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-model-query-filter/prisma-model-query-filter.generator.js +124 -0
- package/dist/generators/prisma/prisma-model-query-filter/prisma-model-query-filter.generator.js.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/index.d.ts +364 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/index.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/index.js +13 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/index.js.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-paths.d.ts +13 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-paths.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-paths.js +25 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-paths.js.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-renderers.d.ts +131 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-renderers.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-renderers.js +49 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/template-renderers.js.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/ts-import-providers.d.ts +66 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/ts-import-providers.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/ts-import-providers.js +40 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/ts-import-providers.js.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/typed-templates.d.ts +411 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/typed-templates.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/typed-templates.js +46 -0
- package/dist/generators/prisma/prisma-query-filter-utils/generated/typed-templates.js.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/index.d.ts +4 -0
- package/dist/generators/prisma/prisma-query-filter-utils/index.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/index.js +3 -0
- package/dist/generators/prisma/prisma-query-filter-utils/index.js.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/prisma-query-filter-utils.generator.d.ts +156 -0
- package/dist/generators/prisma/prisma-query-filter-utils/prisma-query-filter-utils.generator.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/prisma-query-filter-utils.generator.js +32 -0
- package/dist/generators/prisma/prisma-query-filter-utils/prisma-query-filter-utils.generator.js.map +1 -0
- package/dist/generators/prisma/prisma-query-filter-utils/templates/src/utils/query-filters.ts +209 -0
- package/dist/generators/prisma/prisma-query-filter-utils/templates/src/utils/query-helpers.ts +70 -0
- package/dist/generators/vitest/prisma-vitest/generated/index.d.ts +0 -6
- package/dist/generators/vitest/prisma-vitest/generated/index.d.ts.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/template-renderers.d.ts.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/template-renderers.js +0 -1
- package/dist/generators/vitest/prisma-vitest/generated/template-renderers.js.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/typed-templates.d.ts +0 -6
- package/dist/generators/vitest/prisma-vitest/generated/typed-templates.d.ts.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/typed-templates.js +1 -4
- package/dist/generators/vitest/prisma-vitest/generated/typed-templates.js.map +1 -1
- package/dist/generators/vitest/prisma-vitest/templates/src/tests/helpers/prisma.test-helper.ts +2 -10
- package/dist/types/service-dto-kinds.d.ts +0 -6
- package/dist/types/service-dto-kinds.d.ts.map +1 -1
- package/dist/types/service-dto-kinds.js +0 -6
- package/dist/types/service-dto-kinds.js.map +1 -1
- package/dist/writers/pothos/helpers.d.ts +1 -0
- package/dist/writers/pothos/helpers.d.ts.map +1 -1
- package/dist/writers/pothos/helpers.js +1 -0
- package/dist/writers/pothos/helpers.js.map +1 -1
- package/dist/writers/pothos/scalar-fields.d.ts +3 -1
- package/dist/writers/pothos/scalar-fields.d.ts.map +1 -1
- package/dist/writers/pothos/scalar-fields.js +1 -0
- package/dist/writers/pothos/scalar-fields.js.map +1 -1
- package/dist/writers/prisma-schema/fields.d.ts +1 -1
- package/dist/writers/prisma-schema/fields.js +2 -2
- package/dist/writers/prisma-schema/fields.js.map +1 -1
- package/package.json +8 -8
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/define-operations.ts +0 -1134
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
AnyFieldDefinition,
|
|
5
|
+
AnyOperationHooks,
|
|
6
|
+
DataOperationType,
|
|
7
|
+
InferFieldOutput,
|
|
8
|
+
InferFieldsCreateOutput,
|
|
9
|
+
InferFieldsOutput,
|
|
10
|
+
InferFieldsUpdateOutput,
|
|
11
|
+
InferInput,
|
|
12
|
+
InferInputSchema,
|
|
13
|
+
} from '$types';
|
|
14
|
+
import type { ServiceContext } from '%serviceContextImports';
|
|
15
|
+
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Invokes an array of hooks with the provided context.
|
|
20
|
+
*
|
|
21
|
+
* All hooks are executed in parallel using `Promise.all`. If no hooks are provided
|
|
22
|
+
* or the array is empty, this function returns immediately.
|
|
23
|
+
*
|
|
24
|
+
* @template TContext - The context type passed to each hook
|
|
25
|
+
* @param hooks - Optional array of async hook functions to invoke
|
|
26
|
+
* @param context - The context object passed to each hook
|
|
27
|
+
* @returns Promise that resolves when all hooks have completed
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* await invokeHooks(config.hooks?.beforeExecute, {
|
|
32
|
+
* operation: 'create',
|
|
33
|
+
* serviceContext: ctx,
|
|
34
|
+
* tx: transaction,
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export async function invokeHooks<TContext>(
|
|
39
|
+
hooks: ((ctx: TContext) => Promise<void>)[] | undefined,
|
|
40
|
+
context: TContext,
|
|
41
|
+
): Promise<void> {
|
|
42
|
+
if (!hooks || hooks.length === 0) return;
|
|
43
|
+
await Promise.all(hooks.map((hook) => hook(context)));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Transforms field definitions into Prisma create/update data structures.
|
|
48
|
+
*
|
|
49
|
+
* This function processes each field definition by:
|
|
50
|
+
* 1. Validating the input value against the field's schema
|
|
51
|
+
* 2. Transforming the value into Prisma-compatible create/update data
|
|
52
|
+
* 3. Collecting hooks from each field for execution during the operation lifecycle
|
|
53
|
+
*
|
|
54
|
+
* @template TFields - Record of field definitions
|
|
55
|
+
* @param fields - Field definitions to process
|
|
56
|
+
* @param input - Input data to validate and transform
|
|
57
|
+
* @param options - Transformation options
|
|
58
|
+
* @param options.serviceContext - Service context with user, request info
|
|
59
|
+
* @param options.operation - Type of operation (create, update, upsert, delete)
|
|
60
|
+
* @param options.allowOptionalFields - Whether to allow undefined field values
|
|
61
|
+
* @param options.loadExisting - Function to load existing model data
|
|
62
|
+
* @returns Object containing transformed data and collected hooks
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const { data, hooks } = await transformFields(
|
|
67
|
+
* { name: scalarField(z.string()), email: scalarField(z.email()) },
|
|
68
|
+
* { name: 'John', email: 'john@example.com' },
|
|
69
|
+
* {
|
|
70
|
+
* serviceContext: ctx,
|
|
71
|
+
* operation: 'create',
|
|
72
|
+
* allowOptionalFields: false,
|
|
73
|
+
* loadExisting: () => Promise.resolve(undefined),
|
|
74
|
+
* },
|
|
75
|
+
* );
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export async function transformFields<
|
|
79
|
+
TFields extends Record<string, AnyFieldDefinition>,
|
|
80
|
+
>(
|
|
81
|
+
fields: TFields,
|
|
82
|
+
input: InferInput<TFields>,
|
|
83
|
+
{
|
|
84
|
+
serviceContext,
|
|
85
|
+
operation,
|
|
86
|
+
allowOptionalFields,
|
|
87
|
+
loadExisting,
|
|
88
|
+
}: {
|
|
89
|
+
serviceContext: ServiceContext;
|
|
90
|
+
operation: DataOperationType;
|
|
91
|
+
allowOptionalFields: boolean;
|
|
92
|
+
loadExisting: () => Promise<object | undefined>;
|
|
93
|
+
},
|
|
94
|
+
): Promise<{
|
|
95
|
+
data: InferFieldsOutput<TFields>;
|
|
96
|
+
hooks: AnyOperationHooks;
|
|
97
|
+
}> {
|
|
98
|
+
const hooks: Required<AnyOperationHooks> = {
|
|
99
|
+
beforeExecute: [],
|
|
100
|
+
afterExecute: [],
|
|
101
|
+
afterCommit: [],
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const data = {} as {
|
|
105
|
+
[K in keyof TFields]: InferFieldOutput<TFields[K]>;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
for (const [key, field] of Object.entries(fields)) {
|
|
109
|
+
const fieldKey = key as keyof typeof input;
|
|
110
|
+
const value = input[fieldKey];
|
|
111
|
+
|
|
112
|
+
if (allowOptionalFields && value === undefined) continue;
|
|
113
|
+
|
|
114
|
+
const result = await field.processInput(value, {
|
|
115
|
+
operation,
|
|
116
|
+
serviceContext,
|
|
117
|
+
fieldName: fieldKey as string,
|
|
118
|
+
loadExisting,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
if (result.data !== undefined) {
|
|
122
|
+
data[fieldKey as keyof TFields] = result.data as InferFieldOutput<
|
|
123
|
+
TFields[keyof TFields]
|
|
124
|
+
>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (result.hooks) {
|
|
128
|
+
hooks.beforeExecute.push(...(result.hooks.beforeExecute ?? []));
|
|
129
|
+
hooks.afterExecute.push(...(result.hooks.afterExecute ?? []));
|
|
130
|
+
hooks.afterCommit.push(...(result.hooks.afterCommit ?? []));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const create = {} as InferFieldsCreateOutput<TFields>;
|
|
135
|
+
const update = {} as InferFieldsUpdateOutput<TFields>;
|
|
136
|
+
for (const [key, value] of Object.entries<
|
|
137
|
+
InferFieldOutput<TFields[keyof TFields]>
|
|
138
|
+
>(data)) {
|
|
139
|
+
if (value.create !== undefined) {
|
|
140
|
+
create[key as keyof TFields] =
|
|
141
|
+
value.create as InferFieldsCreateOutput<TFields>[keyof TFields];
|
|
142
|
+
}
|
|
143
|
+
if (value.update !== undefined) {
|
|
144
|
+
update[key as keyof TFields] =
|
|
145
|
+
value.update as InferFieldsUpdateOutput<TFields>[keyof TFields];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return { data: { create, update }, hooks };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* =========================================
|
|
154
|
+
* Schema Generation Utilities
|
|
155
|
+
* =========================================
|
|
156
|
+
*/
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Generates a Zod schema for create operations from field definitions.
|
|
160
|
+
*
|
|
161
|
+
* Extracts the Zod schema from each field definition and combines them
|
|
162
|
+
* into a single object schema. This schema can be used for validation
|
|
163
|
+
* in GraphQL resolvers, REST endpoints, tRPC procedures, or OpenAPI documentation.
|
|
164
|
+
*
|
|
165
|
+
* @template TFields - Record of field definitions
|
|
166
|
+
* @param fields - Field definitions to extract schemas from
|
|
167
|
+
* @returns Zod object schema preserving each field's optionality
|
|
168
|
+
*/
|
|
169
|
+
export function generateCreateSchema<
|
|
170
|
+
TFields extends Record<string, AnyFieldDefinition>,
|
|
171
|
+
>(fields: TFields): InferInputSchema<TFields> {
|
|
172
|
+
const shape = Object.fromEntries(
|
|
173
|
+
Object.entries(fields).map(([key, field]) => [key, field.schema]),
|
|
174
|
+
) as {
|
|
175
|
+
[K in keyof TFields]: TFields[K]['schema'];
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
return z.object(shape) as InferInputSchema<TFields>;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
type PartialSchema<T extends z.ZodObject<z.ZodRawShape>> = z.ZodObject<{
|
|
182
|
+
[K in keyof T['shape']]: z.ZodOptional<T['shape'][K]>;
|
|
183
|
+
}>;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Generates a Zod schema for update operations from field definitions.
|
|
187
|
+
*
|
|
188
|
+
* Wraps {@link generateCreateSchema} with `.partial()` so every field becomes
|
|
189
|
+
* optional, allowing callers to supply only the fields they want to change.
|
|
190
|
+
*
|
|
191
|
+
* @template TFields - Record of field definitions
|
|
192
|
+
* @param fields - Field definitions to extract schemas from
|
|
193
|
+
* @returns Partial Zod object schema where all fields are optional
|
|
194
|
+
*/
|
|
195
|
+
export function generateUpdateSchema<
|
|
196
|
+
TFields extends Record<string, AnyFieldDefinition>,
|
|
197
|
+
>(fields: TFields): PartialSchema<InferInputSchema<TFields>> {
|
|
198
|
+
return generateCreateSchema(fields).partial() as PartialSchema<
|
|
199
|
+
InferInputSchema<TFields>
|
|
200
|
+
>;
|
|
201
|
+
}
|
package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-types.ts
CHANGED
|
@@ -16,10 +16,12 @@ export type ModelPropName = Prisma.TypeMap['meta']['modelProps'];
|
|
|
16
16
|
* Infers the return type of a Prisma query for a given model and query arguments.
|
|
17
17
|
*
|
|
18
18
|
* This type extracts the shape of data returned from a Prisma query, respecting
|
|
19
|
-
* any `
|
|
19
|
+
* any `include` arguments provided. Only the `include` key from `TIncludeArgs` is
|
|
20
|
+
* forwarded to Prisma's Result type; `select` is stripped to avoid producing
|
|
21
|
+
* an unresolvable union type.
|
|
20
22
|
*
|
|
21
23
|
* @template TModelName - The Prisma model name
|
|
22
|
-
* @template
|
|
24
|
+
* @template TIncludeArgs - Optional query arguments (include only)
|
|
23
25
|
*
|
|
24
26
|
* @example
|
|
25
27
|
* ```typescript
|
|
@@ -28,41 +30,43 @@ export type ModelPropName = Prisma.TypeMap['meta']['modelProps'];
|
|
|
28
30
|
*
|
|
29
31
|
* // User with posts included
|
|
30
32
|
* type UserWithPosts = GetPayload<'user', { include: { posts: true } }>;
|
|
31
|
-
*
|
|
32
|
-
* // User with only specific fields
|
|
33
|
-
* type UserNameEmail = GetPayload<'user', { select: { name: true, email: true } }>;
|
|
34
33
|
* ```
|
|
35
34
|
*/
|
|
36
35
|
export type GetPayload<
|
|
37
36
|
TModelName extends ModelPropName,
|
|
38
|
-
|
|
39
|
-
> = Result<
|
|
37
|
+
TIncludeArgs = undefined,
|
|
38
|
+
> = Result<
|
|
39
|
+
(typeof prisma)[TModelName],
|
|
40
|
+
TIncludeArgs extends undefined
|
|
41
|
+
? undefined
|
|
42
|
+
: { include: TIncludeArgs extends { include?: infer I } ? I : undefined },
|
|
43
|
+
'findUniqueOrThrow'
|
|
44
|
+
>;
|
|
40
45
|
|
|
41
46
|
/**
|
|
42
|
-
* Type for Prisma
|
|
47
|
+
* Type for Prisma include arguments for a given model.
|
|
43
48
|
*
|
|
44
49
|
* Used to shape the returned data from database operations by specifying
|
|
45
|
-
* which
|
|
50
|
+
* which relations to include. Only `include` is supported; `select` is
|
|
51
|
+
* accepted as `undefined` for compatibility with `queryFromInfo()` but
|
|
52
|
+
* will be stripped by `GetPayload`.
|
|
46
53
|
*
|
|
47
54
|
* @template TModelName - The Prisma model name
|
|
48
55
|
*
|
|
49
56
|
* @example
|
|
50
57
|
* ```typescript
|
|
51
|
-
* const query:
|
|
52
|
-
* select: { id: true, name: true, email: true },
|
|
53
|
-
* };
|
|
54
|
-
*
|
|
55
|
-
* const queryWithInclude: ModelQuery<'user'> = {
|
|
58
|
+
* const query: ModelInclude<'user'> = {
|
|
56
59
|
* include: { posts: true, profile: true },
|
|
57
60
|
* };
|
|
58
61
|
* ```
|
|
59
62
|
*/
|
|
60
|
-
export type
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
export type ModelInclude<TModelName extends ModelPropName> = {
|
|
64
|
+
select?: undefined;
|
|
65
|
+
} & Pick<
|
|
66
|
+
Args<(typeof prisma)[TModelName], 'findUnique'> extends { include?: infer I }
|
|
67
|
+
? { include?: I }
|
|
68
|
+
: { include?: undefined },
|
|
69
|
+
'include'
|
|
66
70
|
>;
|
|
67
71
|
|
|
68
72
|
/**
|
package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-utils.ts
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
import type {
|
|
4
4
|
CreateInput,
|
|
5
5
|
GetPayload,
|
|
6
|
+
ModelInclude,
|
|
6
7
|
ModelPropName,
|
|
7
|
-
ModelQuery,
|
|
8
8
|
UpdateInput,
|
|
9
9
|
WhereInput,
|
|
10
10
|
WhereUniqueInput,
|
|
11
11
|
} from '$prismaTypes';
|
|
12
|
-
import type {
|
|
12
|
+
import type { Prisma } from '%prismaGeneratedImports';
|
|
13
|
+
import type { prisma } from '%prismaImports';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Generic interface for Prisma model delegates.
|
|
@@ -23,10 +24,17 @@ import type { PrismaTransaction } from '$types';
|
|
|
23
24
|
* @internal This interface is used internally by the data operations system
|
|
24
25
|
*/
|
|
25
26
|
interface GenericPrismaDelegate<TModelName extends ModelPropName> {
|
|
26
|
-
findUnique: <
|
|
27
|
+
findUnique: <
|
|
28
|
+
TInclude extends
|
|
29
|
+
| NonNullable<ModelInclude<TModelName>['include']>
|
|
30
|
+
| undefined = undefined,
|
|
31
|
+
>(args: {
|
|
27
32
|
where: WhereUniqueInput<TModelName>;
|
|
28
|
-
include?:
|
|
29
|
-
}) => Promise<GetPayload<
|
|
33
|
+
include?: TInclude;
|
|
34
|
+
}) => Promise<GetPayload<
|
|
35
|
+
TModelName,
|
|
36
|
+
TInclude extends undefined ? undefined : { include: TInclude }
|
|
37
|
+
> | null>;
|
|
30
38
|
findMany: (args: {
|
|
31
39
|
where: WhereInput<TModelName>;
|
|
32
40
|
}) => Promise<GetPayload<TModelName>[]>;
|
|
@@ -75,7 +83,7 @@ interface GenericPrismaDelegate<TModelName extends ModelPropName> {
|
|
|
75
83
|
* @internal This function is used internally by nested field handlers
|
|
76
84
|
*/
|
|
77
85
|
export function makeGenericPrismaDelegate<TModelName extends ModelPropName>(
|
|
78
|
-
tx:
|
|
86
|
+
tx: Prisma.TransactionClient | typeof prisma,
|
|
79
87
|
modelName: TModelName,
|
|
80
88
|
): GenericPrismaDelegate<TModelName> {
|
|
81
89
|
return tx[modelName] as unknown as GenericPrismaDelegate<TModelName>;
|
package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/relation-helpers.ts
CHANGED
|
@@ -108,7 +108,7 @@ function connectCreate<
|
|
|
108
108
|
* owner: relationHelpers.connectUpdate({ userId: null, tenantId: 'tenant-1' })
|
|
109
109
|
*
|
|
110
110
|
* @example
|
|
111
|
-
* // Composite key - no change (if any field is undefined)
|
|
111
|
+
* // Composite key - no change (if any field is undefined, the entire relation is unchanged)
|
|
112
112
|
* owner: relationHelpers.connectUpdate({ userId: undefined, tenantId: 'tenant-1' })
|
|
113
113
|
*/
|
|
114
114
|
function connectUpdate<
|
|
@@ -151,33 +151,28 @@ function connectUpdate<
|
|
|
151
151
|
* support for both single-field and composite key relations.
|
|
152
152
|
*
|
|
153
153
|
* @example
|
|
154
|
-
* // In a create
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
* })
|
|
154
|
+
* // In a create execute function with single field relations
|
|
155
|
+
* execute: async ({ tx, data: { todoListId, assigneeId, ...rest }, query }) =>
|
|
156
|
+
* tx.todoItem.create({
|
|
157
|
+
* data: {
|
|
158
|
+
* todoList: relationHelpers.connectCreate({ id: todoListId }),
|
|
159
|
+
* assignee: relationHelpers.connectCreate({ id: assigneeId }),
|
|
160
|
+
* ...rest,
|
|
161
|
+
* },
|
|
162
|
+
* ...query,
|
|
163
|
+
* })
|
|
160
164
|
*
|
|
161
165
|
* @example
|
|
162
|
-
* // In
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
* ...rest,
|
|
173
|
-
* })
|
|
174
|
-
*
|
|
175
|
-
* @example
|
|
176
|
-
* // In an update operation with composite key
|
|
177
|
-
* buildData: ({ userId, tenantId, ...rest }) => ({
|
|
178
|
-
* owner: relationHelpers.connectUpdate({ userId, tenantId }),
|
|
179
|
-
* ...rest,
|
|
180
|
-
* })
|
|
166
|
+
* // In an update execute function with single field
|
|
167
|
+
* execute: async ({ tx, data: { assigneeId, ...rest }, query }) =>
|
|
168
|
+
* tx.todoItem.update({
|
|
169
|
+
* where,
|
|
170
|
+
* data: {
|
|
171
|
+
* assignee: relationHelpers.connectUpdate({ id: assigneeId }),
|
|
172
|
+
* ...rest,
|
|
173
|
+
* },
|
|
174
|
+
* ...query,
|
|
175
|
+
* })
|
|
181
176
|
*/
|
|
182
177
|
export const relationHelpers = {
|
|
183
178
|
/**
|