prisma-generator-express 1.11.2 → 1.11.4

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/dist/generator.js CHANGED
@@ -20,6 +20,7 @@ const generateAggregate_1 = require("./helpers/generateAggregate");
20
20
  const generateCount_1 = require("./helpers/generateCount");
21
21
  const generateGroupBy_1 = require("./helpers/generateGroupBy");
22
22
  const generateRouteConfigType_1 = require("./helpers/generateRouteConfigType");
23
+ const generateQsParser_1 = require("./helpers/generateQsParser");
23
24
  const { version } = require('../package.json');
24
25
  (0, generator_helper_1.generatorHandler)({
25
26
  onManifest() {
@@ -162,6 +163,11 @@ const { version } = require('../package.json');
162
163
  options,
163
164
  operation: 'RouteConfig',
164
165
  });
166
+ await (0, writeFileSafely_1.writeFileSafely)({
167
+ content: (0, generateQsParser_1.generateParseQueryParams)(),
168
+ options,
169
+ operation: 'ParseQueryParams',
170
+ });
165
171
  },
166
172
  });
167
173
  //# sourceMappingURL=generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateParseQueryParams = void 0;
4
+ function generateParseQueryParams() {
5
+ return `/**
6
+ * Type guard to check if a value is an object.
7
+ * @param {unknown} value - The value to check.
8
+ * @returns {boolean} True if the value is an object, false otherwise.
9
+ */
10
+ const isObject = (value: unknown): value is Record<string, unknown> => {
11
+ return typeof value === "object" && value !== null;
12
+ };
13
+
14
+ /**
15
+ * Parses a query value to convert strings to their respective types.
16
+ * @param {string} value - The query value to parse.
17
+ * @returns {any} The parsed value.
18
+ */
19
+ const parseQueryValue = (value: string): unknown => {
20
+ if (value === "true") return true;
21
+ if (value === "false") return false;
22
+ if (value === "null") return null;
23
+ if (!isNaN(Number(value))) return Number(value);
24
+ return value;
25
+ };
26
+
27
+ /**
28
+ * Recursively parses query parameters to convert strings to their respective types.
29
+ * @param {unknown} params - The query parameters to parse.
30
+ * @returns {unknown} The parsed query parameters.
31
+ */
32
+ export const parseQueryParams = (params: unknown): unknown => {
33
+ if (typeof params === "string") {
34
+ return parseQueryValue(params);
35
+ }
36
+ if (Array.isArray(params)) {
37
+ return params.map(parseQueryParams);
38
+ }
39
+ if (isObject(params)) {
40
+ const parsedParams: Record<string, unknown> = {};
41
+ for (const key in params) {
42
+ if (key === "AND" || key === "OR" || key === "NOT") {
43
+ parsedParams[key] = Array.isArray(params[key])
44
+ ? (params[key] as unknown[]).map(parseQueryParams)
45
+ : parseQueryParams(params[key]);
46
+ } else {
47
+ parsedParams[key] = parseQueryParams(params[key]);
48
+ }
49
+ }
50
+ return parsedParams;
51
+ }
52
+ return params;
53
+ };`;
54
+ }
55
+ exports.generateParseQueryParams = generateParseQueryParams;
56
+ //# sourceMappingURL=generateQsParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateQsParser.js","sourceRoot":"","sources":["../../src/helpers/generateQsParser.ts"],"names":[],"mappings":";;;AAAA,SAAgB,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgDL,CAAA;AACJ,CAAC;AAlDD,4DAkDC"}
@@ -6,6 +6,7 @@ function generateRouterFunction({ model, }) {
6
6
  const routerFunctionName = `${modelName}Router`;
7
7
  return `
8
8
  import express, { RequestHandler } from 'express';
9
+ import { ParsedQs } from 'qs'
9
10
  import { ${modelName}FindFirst } from './${modelName}FindFirst';
10
11
  import { ${modelName}FindMany } from './${modelName}FindMany';
11
12
  import { ${modelName}FindUnique } from './${modelName}FindUnique';
@@ -20,47 +21,14 @@ import { ${modelName}Aggregate } from './${modelName}Aggregate';
20
21
  import { ${modelName}Count } from './${modelName}Count';
21
22
  import { ${modelName}GroupBy } from './${modelName}GroupBy';
22
23
  import { RouteConfig } from "../RouteConfig";
24
+ import qs from "qs";
25
+ import { parseQueryParams } from "../ParseQueryParams";
23
26
 
24
27
  const defaultBeforeAfter = {
25
28
  before: [] as RequestHandler[],
26
29
  after: [] as RequestHandler[],
27
30
  };
28
31
 
29
- /**
30
- * Parses a query value to convert strings to their respective types.
31
- * @param {string} value - The query value to parse.
32
- * @returns {any} The parsed value.
33
- */
34
- const parseQueryValue = (value: string) => {
35
- if (value === 'true') return true;
36
- if (value === 'false') return false;
37
- if (value === 'null') return null;
38
- if (!isNaN(Number(value))) return Number(value);
39
- return value;
40
- };
41
-
42
- /**
43
- * Recursively parses query parameters to convert strings to their respective types.
44
- * @param {any} params - The query parameters to parse.
45
- * @returns {any} The parsed query parameters.
46
- */
47
- const parseQueryParams = (params: any) => {
48
- const parsedParams: any = {};
49
- for (const key in params) {
50
- const value = params[key];
51
- if (typeof value === 'string') {
52
- parsedParams[key] = parseQueryValue(value);
53
- } else if (Array.isArray(value)) {
54
- parsedParams[key] = value.map(parseQueryValue);
55
- } else if (typeof value === 'object') {
56
- parsedParams[key] = parseQueryParams(value);
57
- } else {
58
- parsedParams[key] = value;
59
- }
60
- }
61
- return parsedParams;
62
- };
63
-
64
32
  /**
65
33
  * Generates an Express router for ${modelName} model.
66
34
  * @param config Contains optional middleware to enable routes.
@@ -78,8 +46,8 @@ export function ${routerFunctionName}(config: RouteConfig<RequestHandler>) {
78
46
  handler: RequestHandler
79
47
  ) => {
80
48
  router[method](basePath + path, (req, res, next) => {
81
- req.query = parseQueryParams(req.query);
82
- next();
49
+ if (req.query)
50
+ req.query = parseQueryParams(qs.parse(req.query as Record<string, string>)) as ParsedQs; next();
83
51
  }, ...middlewares, handler);
84
52
  };
85
53
 
@@ -1 +1 @@
1
- {"version":3,"file":"generateRouteFile.js","sourceRoot":"","sources":["../../src/helpers/generateRouteFile.ts"],"names":[],"mappings":";;;AAEA,SAAgB,sBAAsB,CAAC,EACrC,KAAK,GAGN;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,kBAAkB,GAAG,GAAG,SAAS,QAAQ,CAAA;IAE/C,OAAO;;WAEE,SAAS,uBAAuB,SAAS;WACzC,SAAS,sBAAsB,SAAS;WACxC,SAAS,wBAAwB,SAAS;WAC1C,SAAS,oBAAoB,SAAS;WACtC,SAAS,wBAAwB,SAAS;WAC1C,SAAS,oBAAoB,SAAS;WACtC,SAAS,wBAAwB,SAAS;WAC1C,SAAS,oBAAoB,SAAS;WACtC,SAAS,oBAAoB,SAAS;WACtC,SAAS,wBAAwB,SAAS;WAC1C,SAAS,uBAAuB,SAAS;WACzC,SAAS,mBAAmB,SAAS;WACrC,SAAS,qBAAqB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCA4Cb,SAAS;;;;;kBAK5B,kBAAkB;;iFAE6C,SAAS,CAAC,WAAW,EAAE;;;;;;;;;;;;;;;;0CAgB9D,SAAS;;;;;;;;qCAQd,SAAS;;;;;;;;wCAQN,SAAS;;;;;;;;sCAQX,SAAS;;;;;;;;0CAQL,SAAS;;;;;;;;qCAQd,SAAS;;;;;;;;yCAQL,SAAS;;;;;;;;uCAQX,SAAS;;;;;;;;wCAQR,SAAS;;;;;;;;4CAQL,SAAS;;;;;;;;8CAQP,SAAS;;;;;;;;0CAQb,SAAS;;;;;;;;4CAQP,SAAS;;;;;;;;CAQpD,CAAA;AACD,CAAC;AAlMD,wDAkMC"}
1
+ {"version":3,"file":"generateRouteFile.js","sourceRoot":"","sources":["../../src/helpers/generateRouteFile.ts"],"names":[],"mappings":";;;AAEA,SAAgB,sBAAsB,CAAC,EACrC,KAAK,GAGN;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,kBAAkB,GAAG,GAAG,SAAS,QAAQ,CAAA;IAE/C,OAAO;;;WAGE,SAAS,uBAAuB,SAAS;WACzC,SAAS,sBAAsB,SAAS;WACxC,SAAS,wBAAwB,SAAS;WAC1C,SAAS,oBAAoB,SAAS;WACtC,SAAS,wBAAwB,SAAS;WAC1C,SAAS,oBAAoB,SAAS;WACtC,SAAS,wBAAwB,SAAS;WAC1C,SAAS,oBAAoB,SAAS;WACtC,SAAS,oBAAoB,SAAS;WACtC,SAAS,wBAAwB,SAAS;WAC1C,SAAS,uBAAuB,SAAS;WACzC,SAAS,mBAAmB,SAAS;WACrC,SAAS,qBAAqB,SAAS;;;;;;;;;;;qCAWb,SAAS;;;;;kBAK5B,kBAAkB;;iFAE6C,SAAS,CAAC,WAAW,EAAE;;;;;;;;;;;;;;;;0CAgB9D,SAAS;;;;;;;;qCAQd,SAAS;;;;;;;;wCAQN,SAAS;;;;;;;;sCAQX,SAAS;;;;;;;;0CAQL,SAAS;;;;;;;;qCAQd,SAAS;;;;;;;;yCAQL,SAAS;;;;;;;;uCAQX,SAAS;;;;;;;;wCAQR,SAAS;;;;;;;;4CAQL,SAAS;;;;;;;;8CAQP,SAAS;;;;;;;;0CAQb,SAAS;;;;;;;;4CAQP,SAAS;;;;;;;;CAQpD,CAAA;AACD,CAAC;AAlKD,wDAkKC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "prisma-generator-express",
3
3
  "description": "Prisma generator of Express CRUD API",
4
- "version": "1.11.2",
4
+ "version": "1.11.4",
5
5
  "main": "dist/generator.js",
6
6
  "license": "MIT",
7
7
  "bin": {
package/src/generator.ts CHANGED
@@ -18,6 +18,7 @@ import { generateAggregateFunction } from './helpers/generateAggregate'
18
18
  import { generateCountFunction } from './helpers/generateCount'
19
19
  import { generateGroupByFunction } from './helpers/generateGroupBy'
20
20
  import { generateRouteConfigType } from './helpers/generateRouteConfigType'
21
+ import { generateParseQueryParams } from './helpers/generateQsParser'
21
22
 
22
23
  const { version } = require('../package.json')
23
24
 
@@ -177,5 +178,11 @@ generatorHandler({
177
178
  options,
178
179
  operation: 'RouteConfig',
179
180
  })
181
+
182
+ await writeFileSafely({
183
+ content: generateParseQueryParams(),
184
+ options,
185
+ operation: 'ParseQueryParams',
186
+ })
180
187
  },
181
188
  })
@@ -0,0 +1,51 @@
1
+ export function generateParseQueryParams() {
2
+ return `/**
3
+ * Type guard to check if a value is an object.
4
+ * @param {unknown} value - The value to check.
5
+ * @returns {boolean} True if the value is an object, false otherwise.
6
+ */
7
+ const isObject = (value: unknown): value is Record<string, unknown> => {
8
+ return typeof value === "object" && value !== null;
9
+ };
10
+
11
+ /**
12
+ * Parses a query value to convert strings to their respective types.
13
+ * @param {string} value - The query value to parse.
14
+ * @returns {any} The parsed value.
15
+ */
16
+ const parseQueryValue = (value: string): unknown => {
17
+ if (value === "true") return true;
18
+ if (value === "false") return false;
19
+ if (value === "null") return null;
20
+ if (!isNaN(Number(value))) return Number(value);
21
+ return value;
22
+ };
23
+
24
+ /**
25
+ * Recursively parses query parameters to convert strings to their respective types.
26
+ * @param {unknown} params - The query parameters to parse.
27
+ * @returns {unknown} The parsed query parameters.
28
+ */
29
+ export const parseQueryParams = (params: unknown): unknown => {
30
+ if (typeof params === "string") {
31
+ return parseQueryValue(params);
32
+ }
33
+ if (Array.isArray(params)) {
34
+ return params.map(parseQueryParams);
35
+ }
36
+ if (isObject(params)) {
37
+ const parsedParams: Record<string, unknown> = {};
38
+ for (const key in params) {
39
+ if (key === "AND" || key === "OR" || key === "NOT") {
40
+ parsedParams[key] = Array.isArray(params[key])
41
+ ? (params[key] as unknown[]).map(parseQueryParams)
42
+ : parseQueryParams(params[key]);
43
+ } else {
44
+ parsedParams[key] = parseQueryParams(params[key]);
45
+ }
46
+ }
47
+ return parsedParams;
48
+ }
49
+ return params;
50
+ };`
51
+ }
@@ -10,6 +10,7 @@ export function generateRouterFunction({
10
10
 
11
11
  return `
12
12
  import express, { RequestHandler } from 'express';
13
+ import { ParsedQs } from 'qs'
13
14
  import { ${modelName}FindFirst } from './${modelName}FindFirst';
14
15
  import { ${modelName}FindMany } from './${modelName}FindMany';
15
16
  import { ${modelName}FindUnique } from './${modelName}FindUnique';
@@ -24,47 +25,14 @@ import { ${modelName}Aggregate } from './${modelName}Aggregate';
24
25
  import { ${modelName}Count } from './${modelName}Count';
25
26
  import { ${modelName}GroupBy } from './${modelName}GroupBy';
26
27
  import { RouteConfig } from "../RouteConfig";
28
+ import qs from "qs";
29
+ import { parseQueryParams } from "../ParseQueryParams";
27
30
 
28
31
  const defaultBeforeAfter = {
29
32
  before: [] as RequestHandler[],
30
33
  after: [] as RequestHandler[],
31
34
  };
32
35
 
33
- /**
34
- * Parses a query value to convert strings to their respective types.
35
- * @param {string} value - The query value to parse.
36
- * @returns {any} The parsed value.
37
- */
38
- const parseQueryValue = (value: string) => {
39
- if (value === 'true') return true;
40
- if (value === 'false') return false;
41
- if (value === 'null') return null;
42
- if (!isNaN(Number(value))) return Number(value);
43
- return value;
44
- };
45
-
46
- /**
47
- * Recursively parses query parameters to convert strings to their respective types.
48
- * @param {any} params - The query parameters to parse.
49
- * @returns {any} The parsed query parameters.
50
- */
51
- const parseQueryParams = (params: any) => {
52
- const parsedParams: any = {};
53
- for (const key in params) {
54
- const value = params[key];
55
- if (typeof value === 'string') {
56
- parsedParams[key] = parseQueryValue(value);
57
- } else if (Array.isArray(value)) {
58
- parsedParams[key] = value.map(parseQueryValue);
59
- } else if (typeof value === 'object') {
60
- parsedParams[key] = parseQueryParams(value);
61
- } else {
62
- parsedParams[key] = value;
63
- }
64
- }
65
- return parsedParams;
66
- };
67
-
68
36
  /**
69
37
  * Generates an Express router for ${modelName} model.
70
38
  * @param config Contains optional middleware to enable routes.
@@ -82,8 +50,8 @@ export function ${routerFunctionName}(config: RouteConfig<RequestHandler>) {
82
50
  handler: RequestHandler
83
51
  ) => {
84
52
  router[method](basePath + path, (req, res, next) => {
85
- req.query = parseQueryParams(req.query);
86
- next();
53
+ if (req.query)
54
+ req.query = parseQueryParams(qs.parse(req.query as Record<string, string>)) as ParsedQs; next();
87
55
  }, ...middlewares, handler);
88
56
  };
89
57