prisma-generator-express 1.16.7 → 1.19.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 +399 -194
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +1 -1
- package/dist/bin.js.map +1 -1
- package/dist/client/encodeQueryParams.d.ts +1 -0
- package/dist/client/encodeQueryParams.js +33 -0
- package/dist/client/encodeQueryParams.js.map +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/copy/misc.d.ts +5 -0
- package/dist/copy/misc.js +52 -0
- package/dist/copy/misc.js.map +1 -0
- package/dist/generators/generateImportPrismaStatement.d.ts +3 -0
- package/dist/generators/generateImportPrismaStatement.js +55 -0
- package/dist/generators/generateImportPrismaStatement.js.map +1 -0
- package/dist/generators/generateQueryBuilderHelper.d.ts +2 -0
- package/dist/generators/generateQueryBuilderHelper.js +139 -0
- package/dist/generators/generateQueryBuilderHelper.js.map +1 -0
- package/dist/generators/generateRouter.d.ts +6 -0
- package/dist/generators/generateRouter.js +340 -0
- package/dist/generators/generateRouter.js.map +1 -0
- package/dist/generators/generateUnifiedDocs.d.ts +1 -0
- package/dist/generators/generateUnifiedDocs.js +171 -0
- package/dist/generators/generateUnifiedDocs.js.map +1 -0
- package/dist/generators/generateUnifiedHandler.d.ts +6 -0
- package/dist/generators/generateUnifiedHandler.js +444 -0
- package/dist/generators/generateUnifiedHandler.js.map +1 -0
- package/dist/generators/generateUnifiedScalarUI.d.ts +5 -0
- package/dist/generators/generateUnifiedScalarUI.js +1390 -0
- package/dist/generators/generateUnifiedScalarUI.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/copyFiles.d.ts +6 -0
- package/dist/utils/copyFiles.js +123 -21
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/strings.d.ts +2 -0
- package/dist/utils/writeFileSafely.d.ts +10 -0
- package/dist/utils/writeFileSafely.js +86 -14
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +64 -31
- package/src/client/encodeQueryParams.ts +56 -0
- package/src/copy/buildModelOpenApi.ts +1569 -0
- package/src/copy/createOutputValidatorMiddleware.ts +1 -1
- package/src/copy/createValidatorMiddleware.ts +1 -1
- package/src/copy/misc.ts +22 -1
- package/src/copy/operationDefinitions.ts +96 -0
- package/src/copy/parseQueryParams.ts +36 -21
- package/src/copy/routeConfig.ts +69 -27
- package/src/copy/transformZod.ts +15 -16
- package/dist/generator.js +0 -168
- package/dist/generator.js.map +0 -1
- package/dist/helpers/generateAggregate.js +0 -51
- package/dist/helpers/generateAggregate.js.map +0 -1
- package/dist/helpers/generateCount.js +0 -50
- package/dist/helpers/generateCount.js.map +0 -1
- package/dist/helpers/generateCreate.js +0 -49
- package/dist/helpers/generateCreate.js.map +0 -1
- package/dist/helpers/generateCreateMany.js +0 -49
- package/dist/helpers/generateCreateMany.js.map +0 -1
- package/dist/helpers/generateDelete.js +0 -49
- package/dist/helpers/generateDelete.js.map +0 -1
- package/dist/helpers/generateDeleteMany.js +0 -49
- package/dist/helpers/generateDeleteMany.js.map +0 -1
- package/dist/helpers/generateFindFirst.js +0 -56
- package/dist/helpers/generateFindFirst.js.map +0 -1
- package/dist/helpers/generateFindMany.js +0 -56
- package/dist/helpers/generateFindMany.js.map +0 -1
- package/dist/helpers/generateFindUnique.js +0 -56
- package/dist/helpers/generateFindUnique.js.map +0 -1
- package/dist/helpers/generateGroupBy.js +0 -51
- package/dist/helpers/generateGroupBy.js.map +0 -1
- package/dist/helpers/generateImportPrismaStatement.js +0 -25
- package/dist/helpers/generateImportPrismaStatement.js.map +0 -1
- package/dist/helpers/generateRouteFile.js +0 -192
- package/dist/helpers/generateRouteFile.js.map +0 -1
- package/dist/helpers/generateUpdate.js +0 -49
- package/dist/helpers/generateUpdate.js.map +0 -1
- package/dist/helpers/generateUpdateMany.js +0 -49
- package/dist/helpers/generateUpdateMany.js.map +0 -1
- package/dist/helpers/generateUpsert.js +0 -49
- package/dist/helpers/generateUpsert.js.map +0 -1
- package/dist/utils/formatFile.js +0 -26
- package/dist/utils/formatFile.js.map +0 -1
- package/src/bin.ts +0 -2
- package/src/constants.ts +0 -1
- package/src/copy/encodeQueryParams.spec.ts +0 -303
- package/src/copy/encodeQueryParams.ts +0 -44
- package/src/copy/misc.spec.ts +0 -62
- package/src/copy/parseQueryParams.spec.ts +0 -187
- package/src/copy/transformZod.spec.ts +0 -763
- package/src/generator.ts +0 -188
- package/src/helpers/generateAggregate.ts +0 -59
- package/src/helpers/generateCount.ts +0 -58
- package/src/helpers/generateCreate.ts +0 -56
- package/src/helpers/generateCreateMany.ts +0 -55
- package/src/helpers/generateDelete.ts +0 -57
- package/src/helpers/generateDeleteMany.ts +0 -57
- package/src/helpers/generateFindFirst.ts +0 -62
- package/src/helpers/generateFindMany.ts +0 -62
- package/src/helpers/generateFindUnique.ts +0 -62
- package/src/helpers/generateGroupBy.ts +0 -60
- package/src/helpers/generateImportPrismaStatement.ts +0 -38
- package/src/helpers/generateRouteFile.ts +0 -195
- package/src/helpers/generateUpdate.ts +0 -56
- package/src/helpers/generateUpdateMany.ts +0 -56
- package/src/helpers/generateUpsert.ts +0 -57
- package/src/utils/copyFiles.ts +0 -27
- package/src/utils/formatFile.ts +0 -22
- package/src/utils/strings.ts +0 -7
- package/src/utils/writeFileSafely.ts +0 -29
|
@@ -29,7 +29,7 @@ export function createOutputValidatorMiddleware({
|
|
|
29
29
|
res.send = function (data) {
|
|
30
30
|
const validationResult = schema.safeParse(data)
|
|
31
31
|
if (!validationResult.success) {
|
|
32
|
-
const errors = validationResult.error.
|
|
32
|
+
const errors = validationResult.error.issues
|
|
33
33
|
next({
|
|
34
34
|
status: 400,
|
|
35
35
|
message: 'Output validation failed',
|
package/src/copy/misc.ts
CHANGED
|
@@ -17,9 +17,30 @@ export function safeJSONparse<T>(
|
|
|
17
17
|
if (data === 'false') return false
|
|
18
18
|
if (data === 'undefined') return undefined
|
|
19
19
|
if (data === 'null') return null
|
|
20
|
-
return isJsonString(data) ? JSON.parse(data as string) : data
|
|
20
|
+
return isJsonString(data) ? JSON.parse(data as string) : data as any
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export const isObject = (value: unknown): value is Record<string, unknown> => {
|
|
24
24
|
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
25
25
|
}
|
|
26
|
+
|
|
27
|
+
const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype'])
|
|
28
|
+
|
|
29
|
+
export function isSafeKey(key: string): boolean {
|
|
30
|
+
return !UNSAFE_KEYS.has(key)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function sanitizeKeys<T>(value: T): T {
|
|
34
|
+
if (Array.isArray(value)) {
|
|
35
|
+
return value.map(sanitizeKeys) as T
|
|
36
|
+
}
|
|
37
|
+
if (isObject(value)) {
|
|
38
|
+
const result: Record<string, unknown> = {}
|
|
39
|
+
for (const key of Object.keys(value)) {
|
|
40
|
+
if (!isSafeKey(key)) continue
|
|
41
|
+
result[key] = sanitizeKeys((value as Record<string, unknown>)[key])
|
|
42
|
+
}
|
|
43
|
+
return result as T
|
|
44
|
+
}
|
|
45
|
+
return value
|
|
46
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export type HttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete'
|
|
2
|
+
|
|
3
|
+
export interface OperationDef {
|
|
4
|
+
name: string
|
|
5
|
+
method: HttpMethod
|
|
6
|
+
pathSuffix: string
|
|
7
|
+
configKey: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const OPERATION_DEFS: OperationDef[] = [
|
|
11
|
+
{ name: 'findMany', method: 'get', pathSuffix: '', configKey: 'findMany' },
|
|
12
|
+
{
|
|
13
|
+
name: 'findUnique',
|
|
14
|
+
method: 'get',
|
|
15
|
+
pathSuffix: '/unique',
|
|
16
|
+
configKey: 'findUnique',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'findUniqueOrThrow',
|
|
20
|
+
method: 'get',
|
|
21
|
+
pathSuffix: '/unique/strict',
|
|
22
|
+
configKey: 'findUniqueOrThrow',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'findFirst',
|
|
26
|
+
method: 'get',
|
|
27
|
+
pathSuffix: '/first',
|
|
28
|
+
configKey: 'findFirst',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'findFirstOrThrow',
|
|
32
|
+
method: 'get',
|
|
33
|
+
pathSuffix: '/first/strict',
|
|
34
|
+
configKey: 'findFirstOrThrow',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'findManyPaginated',
|
|
38
|
+
method: 'get',
|
|
39
|
+
pathSuffix: '/paginated',
|
|
40
|
+
configKey: 'findManyPaginated',
|
|
41
|
+
},
|
|
42
|
+
{ name: 'create', method: 'post', pathSuffix: '', configKey: 'create' },
|
|
43
|
+
{
|
|
44
|
+
name: 'createMany',
|
|
45
|
+
method: 'post',
|
|
46
|
+
pathSuffix: '/many',
|
|
47
|
+
configKey: 'createMany',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'createManyAndReturn',
|
|
51
|
+
method: 'post',
|
|
52
|
+
pathSuffix: '/many/return',
|
|
53
|
+
configKey: 'createManyAndReturn',
|
|
54
|
+
},
|
|
55
|
+
{ name: 'update', method: 'put', pathSuffix: '', configKey: 'update' },
|
|
56
|
+
{
|
|
57
|
+
name: 'updateMany',
|
|
58
|
+
method: 'put',
|
|
59
|
+
pathSuffix: '/many',
|
|
60
|
+
configKey: 'updateMany',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'updateManyAndReturn',
|
|
64
|
+
method: 'put',
|
|
65
|
+
pathSuffix: '/many/return',
|
|
66
|
+
configKey: 'updateManyAndReturn',
|
|
67
|
+
},
|
|
68
|
+
{ name: 'upsert', method: 'patch', pathSuffix: '', configKey: 'upsert' },
|
|
69
|
+
{ name: 'delete', method: 'delete', pathSuffix: '', configKey: 'delete' },
|
|
70
|
+
{
|
|
71
|
+
name: 'deleteMany',
|
|
72
|
+
method: 'delete',
|
|
73
|
+
pathSuffix: '/many',
|
|
74
|
+
configKey: 'deleteMany',
|
|
75
|
+
},
|
|
76
|
+
{ name: 'count', method: 'get', pathSuffix: '/count', configKey: 'count' },
|
|
77
|
+
{
|
|
78
|
+
name: 'aggregate',
|
|
79
|
+
method: 'get',
|
|
80
|
+
pathSuffix: '/aggregate',
|
|
81
|
+
configKey: 'aggregate',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'groupBy',
|
|
85
|
+
method: 'get',
|
|
86
|
+
pathSuffix: '/groupby',
|
|
87
|
+
configKey: 'groupBy',
|
|
88
|
+
},
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
export function isOperationEnabled(
|
|
92
|
+
config: Record<string, any>,
|
|
93
|
+
def: OperationDef,
|
|
94
|
+
): boolean {
|
|
95
|
+
return !!(config.enableAll || config[def.configKey])
|
|
96
|
+
}
|
|
@@ -1,29 +1,38 @@
|
|
|
1
|
-
import { isObject } from './misc'
|
|
2
|
-
import { ParsedQs } from 'qs'
|
|
1
|
+
import { isObject, isSafeKey, sanitizeKeys } from './misc'
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
type QueryParams =
|
|
4
|
+
| string
|
|
5
|
+
| Record<string, unknown>
|
|
6
|
+
| string[]
|
|
7
|
+
| Record<string, unknown>[]
|
|
8
|
+
| undefined
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
10
|
+
const NUMERIC_KEYS = new Set(['take', 'skip'])
|
|
11
|
+
|
|
12
|
+
const parseQueryValue = (value: string, key?: string): unknown => {
|
|
13
|
+
if (value.startsWith('{') || value.startsWith('[') || value.startsWith('"')) {
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(value)
|
|
16
|
+
return sanitizeKeys(parsed)
|
|
17
|
+
} catch {
|
|
18
|
+
// fall through
|
|
19
|
+
}
|
|
20
|
+
}
|
|
15
21
|
if (value === 'true') return true
|
|
16
22
|
if (value === 'false') return false
|
|
17
23
|
if (value === 'null') return null
|
|
18
|
-
if (
|
|
24
|
+
if (
|
|
25
|
+
key &&
|
|
26
|
+
NUMERIC_KEYS.has(key) &&
|
|
27
|
+
value !== '' &&
|
|
28
|
+
!isNaN(Number(value)) &&
|
|
29
|
+
isFinite(Number(value))
|
|
30
|
+
) {
|
|
31
|
+
return Number(value)
|
|
32
|
+
}
|
|
19
33
|
return value
|
|
20
34
|
}
|
|
21
35
|
|
|
22
|
-
/**
|
|
23
|
-
* Recursively parses query parameters to convert strings to their respective types.
|
|
24
|
-
* @param {QueryParams} params - The query parameters to parse.
|
|
25
|
-
* @returns {unknown} The parsed query parameters.
|
|
26
|
-
*/
|
|
27
36
|
export const parseQueryParams = (params: QueryParams): unknown => {
|
|
28
37
|
if (typeof params === 'string') {
|
|
29
38
|
return parseQueryValue(params)
|
|
@@ -33,10 +42,16 @@ export const parseQueryParams = (params: QueryParams): unknown => {
|
|
|
33
42
|
}
|
|
34
43
|
if (isObject(params)) {
|
|
35
44
|
const parsedParams: Record<string, unknown> = {}
|
|
36
|
-
for (const key
|
|
37
|
-
|
|
45
|
+
for (const key of Object.keys(params)) {
|
|
46
|
+
if (!isSafeKey(key)) continue
|
|
47
|
+
const raw = params[key]
|
|
48
|
+
if (typeof raw === 'string') {
|
|
49
|
+
parsedParams[key] = parseQueryValue(raw, key)
|
|
50
|
+
} else {
|
|
51
|
+
parsedParams[key] = raw
|
|
52
|
+
}
|
|
38
53
|
}
|
|
39
54
|
return parsedParams
|
|
40
55
|
}
|
|
41
56
|
return params
|
|
42
|
-
}
|
|
57
|
+
}
|
package/src/copy/routeConfig.ts
CHANGED
|
@@ -1,34 +1,76 @@
|
|
|
1
|
-
import { RequestHandler } from 'express'
|
|
2
|
-
import { ZodTypeAny } from 'zod'
|
|
1
|
+
import { RequestHandler, Request } from 'express'
|
|
3
2
|
|
|
4
|
-
export interface
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
export interface OperationConfig {
|
|
4
|
+
before?: RequestHandler[]
|
|
5
|
+
after?: RequestHandler[]
|
|
6
|
+
shape?: Record<string, any>
|
|
8
7
|
}
|
|
9
8
|
|
|
10
|
-
interface
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
export interface QueryBuilderConfig {
|
|
10
|
+
enabled?: boolean
|
|
11
|
+
port?: number
|
|
12
|
+
host?: string
|
|
13
|
+
schemaPath?: string
|
|
14
|
+
databaseUrl?: string
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export interface
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
17
|
+
export interface OpenApiServerConfig {
|
|
18
|
+
url: string
|
|
19
|
+
description?: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface OpenApiSecuritySchemeConfig {
|
|
23
|
+
type: string
|
|
24
|
+
scheme?: string
|
|
25
|
+
bearerFormat?: string
|
|
26
|
+
name?: string
|
|
27
|
+
in?: string
|
|
28
|
+
description?: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RouteConfig {
|
|
32
32
|
enableAll?: boolean
|
|
33
|
+
addModelPrefix?: boolean
|
|
33
34
|
customUrlPrefix?: string
|
|
34
|
-
|
|
35
|
+
specBasePath?: string
|
|
36
|
+
disableOpenApi?: boolean
|
|
37
|
+
scalarCdnUrl?: string
|
|
38
|
+
|
|
39
|
+
openApiTitle?: string
|
|
40
|
+
openApiDescription?: string
|
|
41
|
+
openApiVersion?: string
|
|
42
|
+
openApiServers?: OpenApiServerConfig[]
|
|
43
|
+
openApiSecuritySchemes?: Record<string, OpenApiSecuritySchemeConfig>
|
|
44
|
+
openApiSecurity?: Record<string, string[]>[]
|
|
45
|
+
|
|
46
|
+
guard?: {
|
|
47
|
+
resolveVariant?: (req: Request) => string | undefined
|
|
48
|
+
variantHeader?: string
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
queryBuilder?: QueryBuilderConfig | false
|
|
52
|
+
|
|
53
|
+
pagination?: {
|
|
54
|
+
defaultLimit?: number
|
|
55
|
+
maxLimit?: number
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
findUnique?: OperationConfig
|
|
59
|
+
findUniqueOrThrow?: OperationConfig
|
|
60
|
+
findFirst?: OperationConfig
|
|
61
|
+
findFirstOrThrow?: OperationConfig
|
|
62
|
+
findMany?: OperationConfig
|
|
63
|
+
findManyPaginated?: OperationConfig
|
|
64
|
+
create?: OperationConfig
|
|
65
|
+
createMany?: OperationConfig
|
|
66
|
+
createManyAndReturn?: OperationConfig
|
|
67
|
+
update?: OperationConfig
|
|
68
|
+
updateMany?: OperationConfig
|
|
69
|
+
updateManyAndReturn?: OperationConfig
|
|
70
|
+
upsert?: OperationConfig
|
|
71
|
+
delete?: OperationConfig
|
|
72
|
+
deleteMany?: OperationConfig
|
|
73
|
+
aggregate?: OperationConfig
|
|
74
|
+
count?: OperationConfig
|
|
75
|
+
groupBy?: OperationConfig
|
|
76
|
+
}
|
package/src/copy/transformZod.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { get } from 'lodash'
|
|
2
2
|
import {
|
|
3
|
+
output,
|
|
3
4
|
z,
|
|
4
|
-
ZodEffects,
|
|
5
5
|
ZodError,
|
|
6
|
-
ZodIssue,
|
|
7
|
-
ZodIssueCode,
|
|
8
6
|
ZodObject,
|
|
9
|
-
|
|
7
|
+
ZodType,
|
|
10
8
|
} from 'zod'
|
|
11
9
|
|
|
12
10
|
function startsWith(str: string, prefix: string): boolean {
|
|
@@ -34,13 +32,14 @@ function isKeyAllowed(key: string, allowedPaths: string[]): boolean {
|
|
|
34
32
|
)
|
|
35
33
|
}
|
|
36
34
|
|
|
37
|
-
export function allow<T extends
|
|
35
|
+
export function allow<T extends ZodType>(
|
|
38
36
|
schema: T,
|
|
39
37
|
allowedPaths: string[],
|
|
40
|
-
)
|
|
41
|
-
const
|
|
38
|
+
) {
|
|
39
|
+
const schemaToTransform = schema instanceof z.ZodObject ? schema.strict() : schema
|
|
40
|
+
const rootSchema = schemaToTransform instanceof z.ZodObject ? schemaToTransform : undefined
|
|
42
41
|
|
|
43
|
-
return
|
|
42
|
+
return schemaToTransform.transform((data) => {
|
|
44
43
|
const flatData = flattenObject(data, '', rootSchema)
|
|
45
44
|
|
|
46
45
|
const disallowedPaths: string[] = []
|
|
@@ -56,13 +55,13 @@ export function allow<T extends ZodTypeAny>(
|
|
|
56
55
|
}
|
|
57
56
|
|
|
58
57
|
return data
|
|
59
|
-
})
|
|
58
|
+
})
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
export function forbid<T extends
|
|
61
|
+
export function forbid<T extends ZodType>(
|
|
63
62
|
schema: T,
|
|
64
63
|
forbiddenPaths: string[],
|
|
65
|
-
)
|
|
64
|
+
) {
|
|
66
65
|
return schema.transform((data) => {
|
|
67
66
|
const forbiddenMatches: string[] = []
|
|
68
67
|
|
|
@@ -78,11 +77,11 @@ export function forbid<T extends z.ZodTypeAny>(
|
|
|
78
77
|
throw createZodErrorFromPaths(forbiddenMatches, 'Field is forbidden:')
|
|
79
78
|
}
|
|
80
79
|
return data
|
|
81
|
-
})
|
|
80
|
+
})
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
export function flattenObject(
|
|
85
|
-
obj: Record<string, any>,
|
|
83
|
+
export function flattenObject<T>(
|
|
84
|
+
obj: Record<string, any> | output<T>,
|
|
86
85
|
prefix = '',
|
|
87
86
|
schema?: ZodObject<any>,
|
|
88
87
|
): Record<string, any> {
|
|
@@ -128,10 +127,10 @@ function createZodErrorFromPaths(
|
|
|
128
127
|
disallowedPaths: string[],
|
|
129
128
|
errorMessage: string,
|
|
130
129
|
): ZodError {
|
|
131
|
-
const errors: ZodIssue[] = []
|
|
130
|
+
const errors: z.core.$ZodIssue[] = []
|
|
132
131
|
for (const path of disallowedPaths) {
|
|
133
132
|
errors.push({
|
|
134
|
-
code:
|
|
133
|
+
code: 'custom',
|
|
135
134
|
message: `${errorMessage} '${path}'`,
|
|
136
135
|
path: path.split('.'),
|
|
137
136
|
})
|
package/dist/generator.js
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const generator_helper_1 = require("@prisma/generator-helper");
|
|
4
|
-
const sdk_1 = require("@prisma/sdk");
|
|
5
|
-
const constants_1 = require("./constants");
|
|
6
|
-
const writeFileSafely_1 = require("./utils/writeFileSafely");
|
|
7
|
-
const generateFindUnique_1 = require("./helpers/generateFindUnique");
|
|
8
|
-
const generateImportPrismaStatement_1 = require("./helpers/generateImportPrismaStatement");
|
|
9
|
-
const generateFindMany_1 = require("./helpers/generateFindMany");
|
|
10
|
-
const generateFindFirst_1 = require("./helpers/generateFindFirst");
|
|
11
|
-
const generateCreate_1 = require("./helpers/generateCreate");
|
|
12
|
-
const generateRouteFile_1 = require("./helpers/generateRouteFile");
|
|
13
|
-
const generateCreateMany_1 = require("./helpers/generateCreateMany");
|
|
14
|
-
const generateUpdate_1 = require("./helpers/generateUpdate");
|
|
15
|
-
const generateUpdateMany_1 = require("./helpers/generateUpdateMany");
|
|
16
|
-
const generateUpsert_1 = require("./helpers/generateUpsert");
|
|
17
|
-
const generateDelete_1 = require("./helpers/generateDelete");
|
|
18
|
-
const generateDeleteMany_1 = require("./helpers/generateDeleteMany");
|
|
19
|
-
const generateAggregate_1 = require("./helpers/generateAggregate");
|
|
20
|
-
const generateCount_1 = require("./helpers/generateCount");
|
|
21
|
-
const generateGroupBy_1 = require("./helpers/generateGroupBy");
|
|
22
|
-
const copyFiles_1 = require("./utils/copyFiles");
|
|
23
|
-
const { version } = require('../package.json');
|
|
24
|
-
(0, generator_helper_1.generatorHandler)({
|
|
25
|
-
onManifest() {
|
|
26
|
-
sdk_1.logger.info(`${constants_1.GENERATOR_NAME}:Registered`);
|
|
27
|
-
return {
|
|
28
|
-
version,
|
|
29
|
-
defaultOutput: '../generated',
|
|
30
|
-
prettyName: constants_1.GENERATOR_NAME,
|
|
31
|
-
};
|
|
32
|
-
},
|
|
33
|
-
onGenerate: async (options) => {
|
|
34
|
-
const prismaImportStatement = (0, generateImportPrismaStatement_1.generateImportPrismaStatement)(options);
|
|
35
|
-
for await (const model of options.dmmf.datamodel.models) {
|
|
36
|
-
if (model.documentation &&
|
|
37
|
-
model.documentation.includes('generator off')) {
|
|
38
|
-
sdk_1.logger.info(`Skipping generation for model ${model.name} as it is marked with 'generator off'.`);
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
42
|
-
content: (0, generateFindUnique_1.generateFindUniqueFunction)({
|
|
43
|
-
model,
|
|
44
|
-
prismaImportStatement,
|
|
45
|
-
}),
|
|
46
|
-
options,
|
|
47
|
-
model,
|
|
48
|
-
operation: 'FindUnique',
|
|
49
|
-
});
|
|
50
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
51
|
-
content: (0, generateFindFirst_1.generateFindFirstFunction)({
|
|
52
|
-
model,
|
|
53
|
-
prismaImportStatement,
|
|
54
|
-
}),
|
|
55
|
-
options,
|
|
56
|
-
model,
|
|
57
|
-
operation: 'FindFirst',
|
|
58
|
-
});
|
|
59
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
60
|
-
content: (0, generateFindMany_1.generateFindManyFunction)({
|
|
61
|
-
model,
|
|
62
|
-
prismaImportStatement,
|
|
63
|
-
}),
|
|
64
|
-
options,
|
|
65
|
-
model,
|
|
66
|
-
operation: 'FindMany',
|
|
67
|
-
});
|
|
68
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
69
|
-
content: (0, generateCreate_1.generateCreateFunction)({
|
|
70
|
-
model,
|
|
71
|
-
prismaImportStatement,
|
|
72
|
-
}),
|
|
73
|
-
options,
|
|
74
|
-
model,
|
|
75
|
-
operation: 'Create',
|
|
76
|
-
});
|
|
77
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
78
|
-
content: (0, generateCreateMany_1.generateCreateManyFunction)({
|
|
79
|
-
model,
|
|
80
|
-
prismaImportStatement,
|
|
81
|
-
}),
|
|
82
|
-
options,
|
|
83
|
-
model,
|
|
84
|
-
operation: 'CreateMany',
|
|
85
|
-
});
|
|
86
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
87
|
-
content: (0, generateUpdate_1.generateUpdateFunction)({
|
|
88
|
-
model,
|
|
89
|
-
prismaImportStatement,
|
|
90
|
-
}),
|
|
91
|
-
options,
|
|
92
|
-
model,
|
|
93
|
-
operation: 'Update',
|
|
94
|
-
});
|
|
95
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
96
|
-
content: (0, generateUpdateMany_1.generateUpdateManyFunction)({
|
|
97
|
-
model,
|
|
98
|
-
prismaImportStatement,
|
|
99
|
-
}),
|
|
100
|
-
options,
|
|
101
|
-
model,
|
|
102
|
-
operation: 'UpdateMany',
|
|
103
|
-
});
|
|
104
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
105
|
-
content: (0, generateUpsert_1.generateUpsertFunction)({
|
|
106
|
-
model,
|
|
107
|
-
prismaImportStatement,
|
|
108
|
-
}),
|
|
109
|
-
options,
|
|
110
|
-
model,
|
|
111
|
-
operation: 'Upsert',
|
|
112
|
-
});
|
|
113
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
114
|
-
content: (0, generateDelete_1.generateDeleteFunction)({
|
|
115
|
-
model,
|
|
116
|
-
prismaImportStatement,
|
|
117
|
-
}),
|
|
118
|
-
options,
|
|
119
|
-
model,
|
|
120
|
-
operation: 'Delete',
|
|
121
|
-
});
|
|
122
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
123
|
-
content: (0, generateDeleteMany_1.generateDeleteManyFunction)({
|
|
124
|
-
model,
|
|
125
|
-
prismaImportStatement,
|
|
126
|
-
}),
|
|
127
|
-
options,
|
|
128
|
-
model,
|
|
129
|
-
operation: 'DeleteMany',
|
|
130
|
-
});
|
|
131
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
132
|
-
content: (0, generateAggregate_1.generateAggregateFunction)({
|
|
133
|
-
model,
|
|
134
|
-
prismaImportStatement,
|
|
135
|
-
}),
|
|
136
|
-
options,
|
|
137
|
-
model,
|
|
138
|
-
operation: 'Aggregate',
|
|
139
|
-
});
|
|
140
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
141
|
-
content: (0, generateCount_1.generateCountFunction)({
|
|
142
|
-
model,
|
|
143
|
-
prismaImportStatement,
|
|
144
|
-
}),
|
|
145
|
-
options,
|
|
146
|
-
model,
|
|
147
|
-
operation: 'Count',
|
|
148
|
-
});
|
|
149
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
150
|
-
content: (0, generateGroupBy_1.generateGroupByFunction)({
|
|
151
|
-
model,
|
|
152
|
-
prismaImportStatement,
|
|
153
|
-
}),
|
|
154
|
-
options,
|
|
155
|
-
model,
|
|
156
|
-
operation: 'GroupBy',
|
|
157
|
-
});
|
|
158
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
159
|
-
content: (0, generateRouteFile_1.generateRouterFunction)({ model }),
|
|
160
|
-
options,
|
|
161
|
-
model,
|
|
162
|
-
operation: 'index',
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
await (0, copyFiles_1.copyFiles)(options);
|
|
166
|
-
},
|
|
167
|
-
});
|
|
168
|
-
//# sourceMappingURL=generator.js.map
|
package/dist/generator.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateAggregateFunction = void 0;
|
|
4
|
-
const strings_1 = require("../utils/strings");
|
|
5
|
-
const generateAggregateFunction = (options) => {
|
|
6
|
-
const { model, prismaImportStatement } = options;
|
|
7
|
-
const modelName = model.name;
|
|
8
|
-
const functionName = `${modelName}Aggregate`;
|
|
9
|
-
const argsTypeName = `Prisma.${(0, strings_1.capitalize)(modelName)}AggregateArgs`;
|
|
10
|
-
return `
|
|
11
|
-
${prismaImportStatement}
|
|
12
|
-
import { Request, Response, NextFunction } from 'express';
|
|
13
|
-
import { RequestHandler, ParamsDictionary } from 'express-serve-static-core'
|
|
14
|
-
import { ParsedQs } from 'qs'
|
|
15
|
-
import { ZodTypeAny } from 'zod';
|
|
16
|
-
import { ValidatorConfig } from '../routeConfig'
|
|
17
|
-
|
|
18
|
-
interface AggregateRequest extends Request {
|
|
19
|
-
prisma: PrismaClient;
|
|
20
|
-
query: Partial<${argsTypeName}> & ParsedQs;
|
|
21
|
-
outputValidation?: ZodTypeAny;
|
|
22
|
-
locals?: {
|
|
23
|
-
outputValidator?: ValidatorConfig;
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export type AggregateMiddleware = RequestHandler<ParamsDictionary, any, Partial<${argsTypeName}>, Record<string, any>>;
|
|
28
|
-
|
|
29
|
-
export async function ${functionName}(req: AggregateRequest, res: Response, next: NextFunction) {
|
|
30
|
-
try {
|
|
31
|
-
const outputValidator = res.locals.outputValidator?.schema || req.outputValidation;
|
|
32
|
-
|
|
33
|
-
const result = await req.prisma.${(0, strings_1.toPascalCase)(modelName)}.aggregate(req.query as ${argsTypeName});
|
|
34
|
-
|
|
35
|
-
if (outputValidator) {
|
|
36
|
-
const validationResult = outputValidator.safeParse(result);
|
|
37
|
-
if (validationResult.success) {
|
|
38
|
-
return res.status(200).json(validationResult.data);
|
|
39
|
-
} else {
|
|
40
|
-
return res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
41
|
-
}
|
|
42
|
-
} else {
|
|
43
|
-
return res.status(200).json(result);
|
|
44
|
-
}
|
|
45
|
-
} catch(error: unknown) {
|
|
46
|
-
next(error)
|
|
47
|
-
}
|
|
48
|
-
}`;
|
|
49
|
-
};
|
|
50
|
-
exports.generateAggregateFunction = generateAggregateFunction;
|
|
51
|
-
//# sourceMappingURL=generateAggregate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generateAggregate.js","sourceRoot":"","sources":["../../src/helpers/generateAggregate.ts"],"names":[],"mappings":";;;AACA,8CAA2D;AASpD,MAAM,yBAAyB,GAAG,CAAC,OAGzC,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,WAAW,CAAA;IAC5C,MAAM,YAAY,GAAG,UAAU,IAAA,oBAAU,EAAC,SAAS,CAAC,eAAe,CAAA;IAEnE,OAAO;EACP,qBAAqB;;;;;;;;;mBASJ,YAAY;;;;;;;kFAOmD,YAAY;;wBAEtE,YAAY;;;;sCAIE,IAAA,sBAAY,EAAC,SAAS,CAAC,2BAA2B,YAAY;;;;;;;;;;;;;;;EAelG,CAAA;AACF,CAAC,CAAA;AAhDY,QAAA,yBAAyB,6BAgDrC"}
|