prisma-generator-express 1.12.0 → 1.14.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.
Files changed (67) hide show
  1. package/README.md +87 -17
  2. package/dist/generator.js +2 -12
  3. package/dist/generator.js.map +1 -1
  4. package/dist/helpers/generateAggregate.js +13 -13
  5. package/dist/helpers/generateAggregate.js.map +1 -1
  6. package/dist/helpers/generateCount.js +12 -13
  7. package/dist/helpers/generateCount.js.map +1 -1
  8. package/dist/helpers/generateCreate.js +13 -15
  9. package/dist/helpers/generateCreate.js.map +1 -1
  10. package/dist/helpers/generateCreateMany.js +13 -15
  11. package/dist/helpers/generateCreateMany.js.map +1 -1
  12. package/dist/helpers/generateDelete.js +12 -15
  13. package/dist/helpers/generateDelete.js.map +1 -1
  14. package/dist/helpers/generateDeleteMany.js +13 -14
  15. package/dist/helpers/generateDeleteMany.js.map +1 -1
  16. package/dist/helpers/generateFindFirst.js +10 -15
  17. package/dist/helpers/generateFindFirst.js.map +1 -1
  18. package/dist/helpers/generateFindMany.js +10 -15
  19. package/dist/helpers/generateFindMany.js.map +1 -1
  20. package/dist/helpers/generateFindUnique.js +10 -15
  21. package/dist/helpers/generateFindUnique.js.map +1 -1
  22. package/dist/helpers/generateGroupBy.js +12 -13
  23. package/dist/helpers/generateGroupBy.js.map +1 -1
  24. package/dist/helpers/generateRouteFile.js +68 -35
  25. package/dist/helpers/generateRouteFile.js.map +1 -1
  26. package/dist/helpers/generateUpdate.js +12 -15
  27. package/dist/helpers/generateUpdate.js.map +1 -1
  28. package/dist/helpers/generateUpdateMany.js +12 -15
  29. package/dist/helpers/generateUpdateMany.js.map +1 -1
  30. package/dist/helpers/generateUpsert.js +12 -15
  31. package/dist/helpers/generateUpsert.js.map +1 -1
  32. package/dist/utils/copyFiles.js +26 -0
  33. package/dist/utils/copyFiles.js.map +1 -0
  34. package/package.json +4 -1
  35. package/src/copy/createOutputValidatorMiddleware.ts +44 -0
  36. package/src/copy/createValidatorMiddleware.ts +55 -0
  37. package/src/copy/encodeQueryParams.spec.ts +303 -0
  38. package/src/copy/encodeQueryParams.ts +44 -0
  39. package/src/copy/misc.spec.ts +62 -0
  40. package/src/copy/misc.ts +25 -0
  41. package/src/copy/parseQueryParams.spec.ts +187 -0
  42. package/src/copy/parseQueryParams.ts +42 -0
  43. package/src/copy/routeConfig.ts +34 -0
  44. package/src/copy/transformZod.spec.ts +714 -0
  45. package/src/copy/transformZod.ts +140 -0
  46. package/src/generator.ts +3 -13
  47. package/src/helpers/generateAggregate.ts +13 -13
  48. package/src/helpers/generateCount.ts +12 -13
  49. package/src/helpers/generateCreate.ts +14 -15
  50. package/src/helpers/generateCreateMany.ts +13 -15
  51. package/src/helpers/generateDelete.ts +13 -15
  52. package/src/helpers/generateDeleteMany.ts +14 -14
  53. package/src/helpers/generateFindFirst.ts +10 -15
  54. package/src/helpers/generateFindMany.ts +10 -15
  55. package/src/helpers/generateFindUnique.ts +10 -15
  56. package/src/helpers/generateGroupBy.ts +12 -13
  57. package/src/helpers/generateRouteFile.ts +68 -35
  58. package/src/helpers/generateUpdate.ts +13 -15
  59. package/src/helpers/generateUpdateMany.ts +13 -15
  60. package/src/helpers/generateUpsert.ts +13 -15
  61. package/src/utils/copyFiles.ts +27 -0
  62. package/dist/helpers/generateQsParser.js +0 -56
  63. package/dist/helpers/generateQsParser.js.map +0 -1
  64. package/dist/helpers/generateRouteConfigType.js +0 -34
  65. package/dist/helpers/generateRouteConfigType.js.map +0 -1
  66. package/src/helpers/generateQsParser.ts +0 -51
  67. package/src/helpers/generateRouteConfigType.ts +0 -29
@@ -0,0 +1,187 @@
1
+ import { parseQueryParams } from './parseQueryParams'
2
+
3
+ describe('parseQueryParams', () => {
4
+ it('should parse basic field selection correctly', () => {
5
+ const params = {
6
+ select: {
7
+ id: 'true',
8
+ name: 'true',
9
+ },
10
+ }
11
+ const result = parseQueryParams(params)
12
+ expect(result).toEqual({
13
+ select: {
14
+ id: true,
15
+ name: true,
16
+ },
17
+ })
18
+ })
19
+
20
+ it('should parse nested field selection correctly', () => {
21
+ const params = {
22
+ select: {
23
+ user: {
24
+ select: {
25
+ profile: 'true',
26
+ },
27
+ },
28
+ },
29
+ }
30
+ const result = parseQueryParams(params)
31
+ expect(result).toEqual({
32
+ select: {
33
+ user: {
34
+ select: {
35
+ profile: true,
36
+ },
37
+ },
38
+ },
39
+ })
40
+ })
41
+
42
+ it('should handle deeply nested logical operators correctly', () => {
43
+ const params = {
44
+ where: {
45
+ AND: [
46
+ { id: '123' },
47
+ {
48
+ OR: [{ active: 'true' }, { active: 'false' }],
49
+ },
50
+ ],
51
+ },
52
+ }
53
+ const result = parseQueryParams(params)
54
+ expect(result).toEqual({
55
+ where: {
56
+ AND: [
57
+ { id: 123 },
58
+ {
59
+ OR: [{ active: true }, { active: false }],
60
+ },
61
+ ],
62
+ },
63
+ })
64
+ })
65
+
66
+ it('should handle complex nested arrays correctly', () => {
67
+ const params = {
68
+ where: {
69
+ id: 'Vxdu42',
70
+ AND: [
71
+ {
72
+ OR: [{ to_delete: 'false' }, { to_delete: 'null' }],
73
+ },
74
+ ],
75
+ },
76
+ }
77
+ const result = parseQueryParams(params)
78
+ expect(result).toEqual({
79
+ where: {
80
+ id: 'Vxdu42',
81
+ AND: [
82
+ {
83
+ OR: [{ to_delete: false }, { to_delete: null }],
84
+ },
85
+ ],
86
+ },
87
+ })
88
+ })
89
+
90
+ it('should handle mixed types and conditions', () => {
91
+ const params = {
92
+ select: {
93
+ id: 'true',
94
+ project_id: 'true',
95
+ user_assignments: {
96
+ select: {
97
+ user: 'true',
98
+ },
99
+ },
100
+ tags_mappings: {
101
+ select: {
102
+ tag: 'true',
103
+ },
104
+ },
105
+ attachments: {
106
+ select: {
107
+ attachment: 'true',
108
+ },
109
+ where: {
110
+ is_image: 'true',
111
+ },
112
+ take: '100',
113
+ orderBy: {
114
+ created_at: 'desc',
115
+ },
116
+ },
117
+ },
118
+ where: {
119
+ id: 'Vxdu42',
120
+ AND: [
121
+ {
122
+ OR: [{ to_delete: 'false' }, { to_delete: 'null' }],
123
+ },
124
+ ],
125
+ },
126
+ }
127
+ const result = parseQueryParams(params)
128
+ expect(result).toEqual({
129
+ select: {
130
+ id: true,
131
+ project_id: true,
132
+ user_assignments: {
133
+ select: {
134
+ user: true,
135
+ },
136
+ },
137
+ tags_mappings: {
138
+ select: {
139
+ tag: true,
140
+ },
141
+ },
142
+ attachments: {
143
+ select: {
144
+ attachment: true,
145
+ },
146
+ where: {
147
+ is_image: true,
148
+ },
149
+ take: 100,
150
+ orderBy: {
151
+ created_at: 'desc',
152
+ },
153
+ },
154
+ },
155
+ where: {
156
+ id: 'Vxdu42',
157
+ AND: [
158
+ {
159
+ OR: [{ to_delete: false }, { to_delete: null }],
160
+ },
161
+ ],
162
+ },
163
+ })
164
+ })
165
+
166
+ it('should handle special cases correctly', () => {
167
+ const params = {
168
+ emptyObject: {},
169
+ emptyArray: [],
170
+ unexpectedType: '123',
171
+ }
172
+ const result = parseQueryParams(params)
173
+ expect(result).toEqual({
174
+ emptyObject: {},
175
+ emptyArray: [],
176
+ unexpectedType: 123,
177
+ })
178
+ })
179
+
180
+ it('should parse string values correctly', () => {
181
+ expect(parseQueryParams('true')).toBe(true)
182
+ expect(parseQueryParams('false')).toBe(false)
183
+ expect(parseQueryParams('null')).toBe(null)
184
+ expect(parseQueryParams('123')).toBe(123)
185
+ expect(parseQueryParams('test')).toBe('test')
186
+ })
187
+ })
@@ -0,0 +1,42 @@
1
+ import { isObject } from './misc'
2
+ import { ParsedQs } from 'qs'
3
+
4
+ /**
5
+ * Type definition for possible query parameter types.
6
+ */
7
+ type QueryParams = string | ParsedQs | string[] | ParsedQs[] | undefined
8
+
9
+ /**
10
+ * Parses a query value to convert strings to their respective types.
11
+ * @param {string} value - The query value to parse.
12
+ * @returns {unknown} The parsed value.
13
+ */
14
+ const parseQueryValue = (value: string): unknown => {
15
+ if (value === 'true') return true
16
+ if (value === 'false') return false
17
+ if (value === 'null') return null
18
+ if (!isNaN(Number(value))) return Number(value)
19
+ return value
20
+ }
21
+
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
+ export const parseQueryParams = (params: QueryParams): unknown => {
28
+ if (typeof params === 'string') {
29
+ return parseQueryValue(params)
30
+ }
31
+ if (Array.isArray(params)) {
32
+ return params.map(parseQueryParams)
33
+ }
34
+ if (isObject(params)) {
35
+ const parsedParams: Record<string, unknown> = {}
36
+ for (const key in params) {
37
+ parsedParams[key] = parseQueryParams(params[key])
38
+ }
39
+ return parsedParams
40
+ }
41
+ return params
42
+ }
@@ -0,0 +1,34 @@
1
+ import { RequestHandler } from 'express'
2
+ import { ZodTypeAny } from 'zod'
3
+
4
+ export interface ValidatorConfig {
5
+ allow?: string[]
6
+ forbid?: string[]
7
+ schema: ZodTypeAny
8
+ }
9
+
10
+ interface MiddlewareConfig<M> {
11
+ before?: M[]
12
+ after?: RequestHandler[]
13
+ input?: ValidatorConfig
14
+ output?: ValidatorConfig
15
+ }
16
+
17
+ export interface RouteConfig<M> {
18
+ findFirst?: MiddlewareConfig<M>
19
+ findMany?: MiddlewareConfig<M>
20
+ findUnique?: MiddlewareConfig<M>
21
+ create?: MiddlewareConfig<M>
22
+ createMany?: MiddlewareConfig<M>
23
+ update?: MiddlewareConfig<M>
24
+ updateMany?: MiddlewareConfig<M>
25
+ upsert?: MiddlewareConfig<M>
26
+ delete?: MiddlewareConfig<M>
27
+ deleteMany?: MiddlewareConfig<M>
28
+ aggregate?: MiddlewareConfig<M>
29
+ count?: MiddlewareConfig<M>
30
+ groupBy?: MiddlewareConfig<M>
31
+ addModelPrefix?: boolean
32
+ enableAll?: boolean
33
+ customUrlPrefix?: string
34
+ }