@zenstackhq/server 1.0.0-beta.2 → 1.0.0-beta.20

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/api/rpc/index.js CHANGED
@@ -8,21 +8,49 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ var __importDefault = (this && this.__importDefault) || function (mod) {
23
+ return (mod && mod.__esModule) ? mod : { "default": mod };
24
+ };
11
25
  Object.defineProperty(exports, "__esModule", { value: true });
12
26
  const runtime_1 = require("@zenstackhq/runtime");
27
+ const superjson_1 = __importDefault(require("superjson"));
28
+ const upper_case_first_1 = require("upper-case-first");
29
+ const zod_validation_error_1 = require("zod-validation-error");
30
+ const base_1 = require("../base");
13
31
  const utils_1 = require("../utils");
32
+ (0, utils_1.registerCustomSerializers)();
33
+ const ERROR_STATUS_MAPPING = {
34
+ [runtime_1.PrismaErrorCode.CONSTRAINED_FAILED]: 403,
35
+ [runtime_1.PrismaErrorCode.REQUIRED_CONNECTED_RECORD_NOT_FOUND]: 404,
36
+ [runtime_1.PrismaErrorCode.DEPEND_ON_RECORD_NOT_FOUND]: 404,
37
+ };
14
38
  /**
15
39
  * Prisma RPC style API request handler that mirrors the Prisma Client API
16
40
  */
17
- class RequestHandler {
18
- handleRequest({ prisma, method, path, query, requestBody, zodSchemas, logger, }) {
41
+ class RequestHandler extends base_1.APIHandlerBase {
42
+ handleRequest({ prisma, method, path, query, requestBody, modelMeta, zodSchemas, logger, }) {
19
43
  var _a, _b;
20
44
  return __awaiter(this, void 0, void 0, function* () {
45
+ modelMeta = modelMeta !== null && modelMeta !== void 0 ? modelMeta : this.defaultModelMeta;
46
+ if (!modelMeta) {
47
+ throw new Error('Model meta is not provided or loaded from default location');
48
+ }
21
49
  const parts = path.split('/').filter((p) => !!p);
22
50
  const op = parts.pop();
23
51
  const model = parts.pop();
24
52
  if (parts.length !== 0 || !op || !model) {
25
- return { status: 400, body: { message: 'invalid request path' } };
53
+ return { status: 400, body: this.makeError('invalid request path') };
26
54
  }
27
55
  method = method.toUpperCase();
28
56
  const dbOp = op;
@@ -33,10 +61,13 @@ class RequestHandler {
33
61
  case 'createMany':
34
62
  case 'upsert':
35
63
  if (method !== 'POST') {
36
- return { status: 400, body: { message: 'invalid request method, only POST is supported' } };
64
+ return {
65
+ status: 400,
66
+ body: this.makeError('invalid request method, only POST is supported'),
67
+ };
37
68
  }
38
69
  if (!requestBody) {
39
- return { status: 400, body: { message: 'missing request body' } };
70
+ return { status: 400, body: this.makeError('missing request body') };
40
71
  }
41
72
  args = requestBody;
42
73
  // TODO: upsert's status code should be conditional
@@ -49,13 +80,16 @@ class RequestHandler {
49
80
  case 'groupBy':
50
81
  case 'count':
51
82
  if (method !== 'GET') {
52
- return { status: 400, body: { message: 'invalid request method, only GET is supported' } };
83
+ return {
84
+ status: 400,
85
+ body: this.makeError('invalid request method, only GET is supported'),
86
+ };
53
87
  }
54
88
  try {
55
- args = (query === null || query === void 0 ? void 0 : query.q) ? this.unmarshal(query.q) : {};
89
+ args = (query === null || query === void 0 ? void 0 : query.q) ? this.unmarshalQ(query.q, query.meta) : {};
56
90
  }
57
91
  catch (_c) {
58
- return { status: 400, body: { message: 'query param must contain valid JSON' } };
92
+ return { status: 400, body: this.makeError('invalid "q" query parameter') };
59
93
  }
60
94
  break;
61
95
  case 'update':
@@ -63,81 +97,81 @@ class RequestHandler {
63
97
  if (method !== 'PUT' && method !== 'PATCH') {
64
98
  return {
65
99
  status: 400,
66
- body: { message: 'invalid request method, only PUT AND PATCH are supported' },
100
+ body: this.makeError('invalid request method, only PUT AND PATCH are supported'),
67
101
  };
68
102
  }
69
103
  if (!requestBody) {
70
- return { status: 400, body: { message: 'missing request body' } };
104
+ return { status: 400, body: this.makeError('missing request body') };
71
105
  }
72
106
  args = requestBody;
73
107
  break;
74
108
  case 'delete':
75
109
  case 'deleteMany':
76
110
  if (method !== 'DELETE') {
77
- return { status: 400, body: { message: 'invalid request method, only DELETE is supported' } };
111
+ return {
112
+ status: 400,
113
+ body: this.makeError('invalid request method, only DELETE is supported'),
114
+ };
78
115
  }
79
116
  try {
80
- args = (query === null || query === void 0 ? void 0 : query.q) ? this.unmarshal(query.q) : {};
117
+ args = (query === null || query === void 0 ? void 0 : query.q) ? this.unmarshalQ(query.q, query.meta) : {};
81
118
  }
82
119
  catch (_d) {
83
- return { status: 400, body: { message: 'query param must contain valid JSON' } };
120
+ return { status: 400, body: this.makeError('invalid "q" query parameter') };
84
121
  }
85
122
  break;
86
123
  default:
87
- return { status: 400, body: { message: 'invalid operation: ' + op } };
124
+ return { status: 400, body: this.makeError('invalid operation: ' + op) };
88
125
  }
89
- if (zodSchemas) {
90
- const { data, error } = (0, utils_1.zodValidate)(zodSchemas, model, dbOp, args);
91
- if (error) {
92
- return { status: 400, body: { message: error } };
93
- }
94
- else {
95
- args = data;
96
- }
126
+ const { error, data: parsedArgs } = yield this.processRequestPayload(args, model, dbOp, zodSchemas);
127
+ if (error) {
128
+ return { status: 400, body: this.makeError(error) };
97
129
  }
98
130
  try {
99
131
  if (!prisma[model]) {
100
- return { status: 400, body: { message: `unknown model name: ${model}` } };
132
+ return { status: 400, body: this.makeError(`unknown model name: ${model}`) };
101
133
  }
102
- const result = yield prisma[model][dbOp](args);
103
- (0, utils_1.stripAuxFields)(result);
104
- return { status: resCode, body: result };
134
+ const result = yield prisma[model][dbOp](parsedArgs);
135
+ (0, utils_1.processEntityData)(result);
136
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
137
+ let response = { data: result };
138
+ // superjson serialize response
139
+ if (result) {
140
+ const { json, meta } = superjson_1.default.serialize(result);
141
+ response = { data: json };
142
+ if (meta) {
143
+ response.meta = { serialization: meta };
144
+ }
145
+ }
146
+ return { status: resCode, body: response };
105
147
  }
106
148
  catch (err) {
107
149
  if ((0, runtime_1.isPrismaClientKnownRequestError)(err)) {
108
150
  (0, utils_1.logError)(logger, err.code, err.message);
109
- if (err.code === 'P2004') {
110
- // rejected by policy
111
- return {
112
- status: 403,
113
- body: {
114
- prisma: true,
115
- rejectedByPolicy: true,
116
- code: err.code,
117
- message: err.message,
118
- reason: (_a = err.meta) === null || _a === void 0 ? void 0 : _a.reason,
119
- },
120
- };
121
- }
122
- else {
123
- return {
124
- status: 400,
125
- body: {
151
+ const status = (_a = ERROR_STATUS_MAPPING[err.code]) !== null && _a !== void 0 ? _a : 400;
152
+ const rejectedByPolicy = err.code === runtime_1.PrismaErrorCode.CONSTRAINED_FAILED ? true : undefined;
153
+ return {
154
+ status,
155
+ body: {
156
+ error: {
126
157
  prisma: true,
158
+ rejectedByPolicy,
127
159
  code: err.code,
128
160
  message: err.message,
129
161
  reason: (_b = err.meta) === null || _b === void 0 ? void 0 : _b.reason,
130
162
  },
131
- };
132
- }
163
+ },
164
+ };
133
165
  }
134
166
  else if ((0, runtime_1.isPrismaClientUnknownRequestError)(err) || (0, runtime_1.isPrismaClientValidationError)(err)) {
135
167
  (0, utils_1.logError)(logger, err.message);
136
168
  return {
137
169
  status: 400,
138
170
  body: {
139
- prisma: true,
140
- message: err.message,
171
+ error: {
172
+ prisma: true,
173
+ message: err.message,
174
+ },
141
175
  },
142
176
  };
143
177
  }
@@ -146,16 +180,70 @@ class RequestHandler {
146
180
  (0, utils_1.logError)(logger, _err.message + (_err.stack ? '\n' + _err.stack : ''));
147
181
  return {
148
182
  status: 400,
149
- body: {
150
- message: err.message,
151
- },
183
+ body: this.makeError(err.message),
152
184
  };
153
185
  }
154
186
  }
155
187
  });
156
188
  }
157
- unmarshal(value) {
158
- return JSON.parse(value);
189
+ makeError(message) {
190
+ return { error: { message: message } };
191
+ }
192
+ processRequestPayload(
193
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
194
+ args, model, dbOp, zodSchemas) {
195
+ return __awaiter(this, void 0, void 0, function* () {
196
+ const { meta } = args, rest = __rest(args, ["meta"]);
197
+ if (meta === null || meta === void 0 ? void 0 : meta.serialization) {
198
+ // superjson deserialization
199
+ args = superjson_1.default.deserialize({ json: rest, meta: meta.serialization });
200
+ }
201
+ return this.zodValidate(zodSchemas, model, dbOp, args);
202
+ });
203
+ }
204
+ getZodSchema(zodSchemas, model, operation) {
205
+ var _a, _b;
206
+ // e.g.: UserInputSchema { findUnique: [schema] }
207
+ return (_b = (_a = zodSchemas.input) === null || _a === void 0 ? void 0 : _a[`${(0, upper_case_first_1.upperCaseFirst)(model)}InputSchema`]) === null || _b === void 0 ? void 0 : _b[operation];
208
+ }
209
+ zodValidate(zodSchemas, model, operation, args) {
210
+ const zodSchema = zodSchemas && this.getZodSchema(zodSchemas, model, operation);
211
+ if (zodSchema) {
212
+ const parseResult = zodSchema.safeParse(args);
213
+ if (parseResult.success) {
214
+ return { data: args, error: undefined };
215
+ }
216
+ else {
217
+ return { data: undefined, error: (0, zod_validation_error_1.fromZodError)(parseResult.error).message };
218
+ }
219
+ }
220
+ else {
221
+ return { data: args, error: undefined };
222
+ }
223
+ }
224
+ unmarshalQ(value, meta) {
225
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
226
+ let parsedValue;
227
+ try {
228
+ parsedValue = JSON.parse(value);
229
+ }
230
+ catch (_a) {
231
+ throw new Error('invalid "q" query parameter');
232
+ }
233
+ if (meta) {
234
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
235
+ let parsedMeta;
236
+ try {
237
+ parsedMeta = JSON.parse(meta);
238
+ }
239
+ catch (_b) {
240
+ throw new Error('invalid "meta" query parameter');
241
+ }
242
+ if (parsedMeta.serialization) {
243
+ return superjson_1.default.deserialize({ json: parsedValue, meta: parsedMeta.serialization });
244
+ }
245
+ }
246
+ return parsedValue;
159
247
  }
160
248
  }
161
249
  function makeHandler() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/rpc/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iDAK6B;AAE7B,oCAAiE;AAEjE;;GAEG;AACH,MAAM,cAAc;IACV,aAAa,CAAC,EAChB,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,WAAW,EACX,UAAU,EACV,MAAM,GACO;;;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAE1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE;gBACrC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC;aACrE;YAED,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,EAAwB,CAAC;YACtC,IAAI,IAAa,CAAC;YAClB,IAAI,OAAO,GAAG,GAAG,CAAC;YAElB,QAAQ,IAAI,EAAE;gBACV,KAAK,QAAQ,CAAC;gBACd,KAAK,YAAY,CAAC;gBAClB,KAAK,QAAQ;oBACT,IAAI,MAAM,KAAK,MAAM,EAAE;wBACnB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,gDAAgD,EAAE,EAAE,CAAC;qBAC/F;oBACD,IAAI,CAAC,WAAW,EAAE;wBACd,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC;qBACrE;oBAED,IAAI,GAAG,WAAW,CAAC;oBAEnB,mDAAmD;oBACnD,OAAO,GAAG,GAAG,CAAC;oBACd,MAAM;gBAEV,KAAK,WAAW,CAAC;gBACjB,KAAK,YAAY,CAAC;gBAClB,KAAK,UAAU,CAAC;gBAChB,KAAK,WAAW,CAAC;gBACjB,KAAK,SAAS,CAAC;gBACf,KAAK,OAAO;oBACR,IAAI,MAAM,KAAK,KAAK,EAAE;wBAClB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,+CAA+C,EAAE,EAAE,CAAC;qBAC9F;oBACD,IAAI;wBACA,IAAI,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,CAAC,EAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5D;oBAAC,WAAM;wBACJ,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,qCAAqC,EAAE,EAAE,CAAC;qBACpF;oBACD,MAAM;gBAEV,KAAK,QAAQ,CAAC;gBACd,KAAK,YAAY;oBACb,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,OAAO,EAAE;wBACxC,OAAO;4BACH,MAAM,EAAE,GAAG;4BACX,IAAI,EAAE,EAAE,OAAO,EAAE,0DAA0D,EAAE;yBAChF,CAAC;qBACL;oBACD,IAAI,CAAC,WAAW,EAAE;wBACd,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC;qBACrE;oBAED,IAAI,GAAG,WAAW,CAAC;oBACnB,MAAM;gBAEV,KAAK,QAAQ,CAAC;gBACd,KAAK,YAAY;oBACb,IAAI,MAAM,KAAK,QAAQ,EAAE;wBACrB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,kDAAkD,EAAE,EAAE,CAAC;qBACjG;oBACD,IAAI;wBACA,IAAI,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,CAAC,EAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5D;oBAAC,WAAM;wBACJ,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,qCAAqC,EAAE,EAAE,CAAC;qBACpF;oBACD,MAAM;gBAEV;oBACI,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,EAAE,EAAE,EAAE,CAAC;aAC7E;YAED,IAAI,UAAU,EAAE;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAA,mBAAW,EAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBACnE,IAAI,KAAK,EAAE;oBACP,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;iBACpD;qBAAM;oBACH,IAAI,GAAG,IAAI,CAAC;iBACf;aACJ;YAED,IAAI;gBACA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBAChB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,uBAAuB,KAAK,EAAE,EAAE,EAAE,CAAC;iBAC7E;gBACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAA,sBAAc,EAAC,MAAM,CAAC,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aAC5C;YAAC,OAAO,GAAG,EAAE;gBACV,IAAI,IAAA,yCAA+B,EAAC,GAAG,CAAC,EAAE;oBACtC,IAAA,gBAAQ,EAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBACxC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;wBACtB,qBAAqB;wBACrB,OAAO;4BACH,MAAM,EAAE,GAAG;4BACX,IAAI,EAAE;gCACF,MAAM,EAAE,IAAI;gCACZ,gBAAgB,EAAE,IAAI;gCACtB,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,OAAO,EAAE,GAAG,CAAC,OAAO;gCACpB,MAAM,EAAE,MAAA,GAAG,CAAC,IAAI,0CAAE,MAAM;6BAC3B;yBACJ,CAAC;qBACL;yBAAM;wBACH,OAAO;4BACH,MAAM,EAAE,GAAG;4BACX,IAAI,EAAE;gCACF,MAAM,EAAE,IAAI;gCACZ,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,OAAO,EAAE,GAAG,CAAC,OAAO;gCACpB,MAAM,EAAE,MAAA,GAAG,CAAC,IAAI,0CAAE,MAAM;6BAC3B;yBACJ,CAAC;qBACL;iBACJ;qBAAM,IAAI,IAAA,2CAAiC,EAAC,GAAG,CAAC,IAAI,IAAA,uCAA6B,EAAC,GAAG,CAAC,EAAE;oBACrF,IAAA,gBAAQ,EAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC9B,OAAO;wBACH,MAAM,EAAE,GAAG;wBACX,IAAI,EAAE;4BACF,MAAM,EAAE,IAAI;4BACZ,OAAO,EAAE,GAAG,CAAC,OAAO;yBACvB;qBACJ,CAAC;iBACL;qBAAM;oBACH,MAAM,IAAI,GAAG,GAAY,CAAC;oBAC1B,IAAA,gBAAQ,EAAC,MAAM,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACvE,OAAO;wBACH,MAAM,EAAE,GAAG;wBACX,IAAI,EAAE;4BACF,OAAO,EAAG,GAAa,CAAC,OAAO;yBAClC;qBACJ,CAAC;iBACL;aACJ;;KACJ;IAEO,SAAS,CAAC,KAAa;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CACJ;AAED,SAAwB,WAAW;IAC/B,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IACrC,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAHD,8BAGC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/rpc/index.ts"],"names":[],"mappings":"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"}
package/api/utils.d.ts CHANGED
@@ -1,18 +1,12 @@
1
- import { DbOperations } from '@zenstackhq/runtime';
2
- import type { ModelZodSchema } from '@zenstackhq/runtime/zod';
3
1
  import { LoggerConfig } from '../types';
4
- export declare function getZodSchema(zodSchemas: ModelZodSchema, model: string, operation: keyof DbOperations): import("zod").ZodType<any, import("zod").ZodTypeDef, any> | undefined;
5
- export declare function zodValidate(zodSchemas: ModelZodSchema | undefined, model: string, operation: keyof DbOperations, args: unknown): {
6
- data: any;
7
- error: undefined;
8
- } | {
9
- data: undefined;
10
- error: string;
11
- };
12
2
  export declare function logError(logger: LoggerConfig | undefined | null, message: string, code?: string): void;
13
3
  export declare function logWarning(logger: LoggerConfig | undefined | null, message: string): void;
14
4
  export declare function logInfo(logger: LoggerConfig | undefined | null, message: string): void;
15
5
  /**
16
- * Recursively strip auxiliary fields from the given data.
6
+ * Processes entity data returned from Prisma call.
17
7
  */
18
- export declare function stripAuxFields(data: unknown): void;
8
+ export declare function processEntityData(data: any): void;
9
+ /**
10
+ * Registers custom superjson serializers.
11
+ */
12
+ export declare function registerCustomSerializers(): void;
package/api/utils.js CHANGED
@@ -1,37 +1,13 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stripAuxFields = exports.logInfo = exports.logWarning = exports.logError = exports.zodValidate = exports.getZodSchema = void 0;
4
- const constants_1 = require("@zenstackhq/runtime/constants");
5
- const upper_case_first_1 = require("upper-case-first");
6
- const zod_validation_error_1 = require("zod-validation-error");
7
- function getZodSchema(zodSchemas, model, operation) {
8
- if (zodSchemas[model]) {
9
- return zodSchemas[model][operation];
10
- }
11
- else if (zodSchemas[(0, upper_case_first_1.upperCaseFirst)(model)]) {
12
- return zodSchemas[(0, upper_case_first_1.upperCaseFirst)(model)][operation];
13
- }
14
- else {
15
- return undefined;
16
- }
17
- }
18
- exports.getZodSchema = getZodSchema;
19
- function zodValidate(zodSchemas, model, operation, args) {
20
- const zodSchema = zodSchemas && getZodSchema(zodSchemas, model, operation);
21
- if (zodSchema) {
22
- const parseResult = zodSchema.safeParse(args);
23
- if (parseResult.success) {
24
- return { data: parseResult.data, error: undefined };
25
- }
26
- else {
27
- return { data: undefined, error: (0, zod_validation_error_1.fromZodError)(parseResult.error).message };
28
- }
29
- }
30
- else {
31
- return { data: args, error: undefined };
32
- }
33
- }
34
- exports.zodValidate = zodValidate;
6
+ exports.registerCustomSerializers = exports.processEntityData = exports.logInfo = exports.logWarning = exports.logError = void 0;
7
+ /* eslint-disable @typescript-eslint/no-explicit-any */
8
+ const runtime_1 = require("@zenstackhq/runtime");
9
+ const decimal_js_1 = require("decimal.js");
10
+ const superjson_1 = __importDefault(require("superjson"));
35
11
  function logError(logger, message, code) {
36
12
  if (logger === undefined) {
37
13
  console.error(`@zenstackhq/server: error ${code ? '[' + code + ']' : ''}, ${message}`);
@@ -59,16 +35,13 @@ function logInfo(logger, message) {
59
35
  }
60
36
  }
61
37
  exports.logInfo = logInfo;
62
- /**
63
- * Recursively strip auxiliary fields from the given data.
64
- */
65
38
  function stripAuxFields(data) {
66
39
  if (Array.isArray(data)) {
67
40
  return data.forEach(stripAuxFields);
68
41
  }
69
42
  else if (data && typeof data === 'object') {
70
43
  for (const [key, value] of Object.entries(data)) {
71
- if (constants_1.AUXILIARY_FIELDS.includes(key)) {
44
+ if (runtime_1.AUXILIARY_FIELDS.includes(key)) {
72
45
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
46
  delete data[key];
74
47
  }
@@ -78,5 +51,29 @@ function stripAuxFields(data) {
78
51
  }
79
52
  }
80
53
  }
81
- exports.stripAuxFields = stripAuxFields;
54
+ /**
55
+ * Processes entity data returned from Prisma call.
56
+ */
57
+ function processEntityData(data) {
58
+ if (data) {
59
+ stripAuxFields(data);
60
+ }
61
+ }
62
+ exports.processEntityData = processEntityData;
63
+ /**
64
+ * Registers custom superjson serializers.
65
+ */
66
+ function registerCustomSerializers() {
67
+ superjson_1.default.registerCustom({
68
+ isApplicable: (v) => decimal_js_1.Decimal.isDecimal(v),
69
+ serialize: (v) => v.toJSON(),
70
+ deserialize: (v) => new decimal_js_1.Decimal(v),
71
+ }, 'Decimal');
72
+ superjson_1.default.registerCustom({
73
+ isApplicable: (v) => Buffer.isBuffer(v),
74
+ serialize: (v) => v.toString('base64'),
75
+ deserialize: (v) => Buffer.from(v, 'base64'),
76
+ }, 'Bytes');
77
+ }
78
+ exports.registerCustomSerializers = registerCustomSerializers;
82
79
  //# sourceMappingURL=utils.js.map
package/api/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/api/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/api/utils.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,16 @@ export interface MiddlewareOptions extends AdapterBaseOptions {
8
8
  * Callback for getting a PrismaClient for the given request
9
9
  */
10
10
  getPrisma: (req: Request, res: Response) => unknown | Promise<unknown>;
11
+ /**
12
+ * Controls if the middleware directly sends a response. If set to false,
13
+ * the response is stored in the `res.locals` object and then the middleware
14
+ * calls the `next()` function to pass the control to the next middleware.
15
+ * Subsequent middleware or request handlers need to make sure to send
16
+ * a response.
17
+ *
18
+ * Defaults to true;
19
+ */
20
+ sendResponse?: boolean;
11
21
  }
12
22
  /**
13
23
  * Creates an Express middleware for handling CRUD requests.
@@ -12,9 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- const zod_1 = require("@zenstackhq/runtime/zod");
16
15
  const rpc_1 = __importDefault(require("../api/rpc"));
17
- const utils_1 = require("../utils");
18
16
  /**
19
17
  * Creates an Express middleware for handling CRUD requests.
20
18
  */
@@ -24,53 +22,58 @@ const factory = (options) => {
24
22
  zodSchemas = options.zodSchemas;
25
23
  }
26
24
  else if (options.zodSchemas === true) {
27
- zodSchemas = (0, zod_1.getModelZodSchemas)();
25
+ try {
26
+ zodSchemas = require('@zenstackhq/runtime/zod');
27
+ }
28
+ catch (_a) {
29
+ throw new Error('Unable to load zod schemas from default location');
30
+ }
28
31
  }
29
32
  const requestHandler = options.handler || (0, rpc_1.default)();
30
- const useSuperJson = options.useSuperJson === true;
31
- return (request, response) => __awaiter(void 0, void 0, void 0, function* () {
33
+ if (options.useSuperJson !== undefined) {
34
+ console.warn('The option "useSuperJson" is deprecated. The server APIs automatically use superjson for serialization.');
35
+ }
36
+ return (request, response, next) => __awaiter(void 0, void 0, void 0, function* () {
32
37
  const prisma = (yield options.getPrisma(request, response));
33
- if (!prisma) {
34
- response
35
- .status(500)
36
- .json((0, utils_1.marshalToObject)({ message: 'unable to get prisma from request context' }, useSuperJson));
37
- return;
38
+ const { sendResponse } = options;
39
+ if (sendResponse === false && !prisma) {
40
+ throw new Error('unable to get prisma from request context');
38
41
  }
39
- let query = {};
40
- try {
41
- // express converts query parameters with square brackets into object
42
- // e.g.: filter[foo]=bar is parsed to { filter: { foo: 'bar' } }
43
- // we need to revert this behavior and reconstruct params from original URL
44
- const url = request.protocol + '://' + request.get('host') + request.originalUrl;
45
- const searchParams = new URL(url).searchParams;
46
- const rawQuery = {};
47
- for (const key of searchParams.keys()) {
48
- const values = searchParams.getAll(key);
49
- rawQuery[key] = values.length === 1 ? values[0] : values;
50
- }
51
- query = (0, utils_1.buildUrlQuery)(rawQuery, useSuperJson);
52
- }
53
- catch (_a) {
54
- response.status(400).json((0, utils_1.marshalToObject)({ message: 'invalid query parameters' }, useSuperJson));
55
- return;
42
+ if (!prisma) {
43
+ return response.status(500).json({ message: 'unable to get prisma from request context' });
56
44
  }
45
+ // express converts query parameters with square brackets into object
46
+ // e.g.: filter[foo]=bar is parsed to { filter: { foo: 'bar' } }
47
+ // we need to revert this behavior and reconstruct params from original URL
48
+ const url = request.protocol + '://' + request.get('host') + request.originalUrl;
49
+ const searchParams = new URL(url).searchParams;
50
+ const query = Object.fromEntries(searchParams);
57
51
  try {
58
52
  const r = yield requestHandler({
59
53
  method: request.method,
60
54
  path: request.path,
61
55
  query,
62
- requestBody: (0, utils_1.unmarshalFromObject)(request.body, useSuperJson),
56
+ requestBody: request.body,
63
57
  prisma,
64
58
  modelMeta: options.modelMeta,
65
59
  zodSchemas,
66
60
  logger: options.logger,
67
61
  });
68
- response.status(r.status).json((0, utils_1.marshalToObject)(r.body, useSuperJson));
62
+ if (sendResponse === false) {
63
+ // attach response and pass control to the next middleware
64
+ response.locals = {
65
+ status: r.status,
66
+ body: r.body,
67
+ };
68
+ return next();
69
+ }
70
+ return response.status(r.status).json(r.body);
69
71
  }
70
72
  catch (err) {
71
- response
72
- .status(500)
73
- .json((0, utils_1.marshalToObject)({ message: `An unhandled error occurred: ${err}` }, useSuperJson));
73
+ if (sendResponse === false) {
74
+ throw err;
75
+ }
76
+ return response.status(500).json({ message: `An unhandled error occurred: ${err}` });
74
77
  }
75
78
  });
76
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/express/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/express/middleware.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAIA,qDAAuC;AAwBvC;;GAEG;AACH,MAAM,OAAO,GAAG,CAAC,OAA0B,EAAW,EAAE;IACpD,IAAI,UAAkC,CAAC;IACvC,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE;QACxC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;KACnC;SAAM,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE;QACpC,IAAI;YACA,UAAU,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;SACnD;QAAC,WAAM;YACJ,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;SACvE;KACJ;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,IAAI,IAAA,aAAa,GAAE,CAAC;IAC1D,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE;QACpC,OAAO,CAAC,IAAI,CACR,yGAAyG,CAC5G,CAAC;KACL;IAED,OAAO,CAAO,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAqB,CAAC;QAChF,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QAEjC,IAAI,YAAY,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE;YACnC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;SAChE;QAED,IAAI,CAAC,MAAM,EAAE;YACT,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC,CAAC;SAC9F;QAED,qEAAqE;QACrE,gEAAgE;QAChE,2EAA2E;QAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QACjF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAE/C,IAAI;YACA,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC;gBAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK;gBACL,WAAW,EAAE,OAAO,CAAC,IAAI;gBACzB,MAAM;gBACN,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,UAAU;gBACV,MAAM,EAAE,OAAO,CAAC,MAAM;aACzB,CAAC,CAAC;YACH,IAAI,YAAY,KAAK,KAAK,EAAE;gBACxB,0DAA0D;gBAC1D,QAAQ,CAAC,MAAM,GAAG;oBACd,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;iBACf,CAAC;gBACF,OAAO,IAAI,EAAE,CAAC;aACjB;YACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACjD;QAAC,OAAO,GAAG,EAAE;YACV,IAAI,YAAY,KAAK,KAAK,EAAE;gBACxB,MAAM,GAAG,CAAC;aACb;YACD,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gCAAgC,GAAG,EAAE,EAAE,CAAC,CAAC;SACxF;IACL,CAAC,CAAA,CAAC;AACN,CAAC,CAAC;AAEF,kBAAe,OAAO,CAAC"}
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import { FastifyPluginCallback, FastifyReply, FastifyRequest } from 'fastify';
2
3
  import { AdapterBaseOptions } from '../types';
3
4
  /**
@@ -13,5 +14,5 @@ export interface PluginOptions extends AdapterBaseOptions {
13
14
  */
14
15
  getPrisma: (request: FastifyRequest, reply: FastifyReply) => unknown | Promise<unknown>;
15
16
  }
16
- declare const _default: FastifyPluginCallback<PluginOptions, import("fastify").RawServerDefault, import("fastify").FastifyTypeProviderDefault, import("fastify").FastifyBaseLogger>;
17
+ declare const _default: FastifyPluginCallback<PluginOptions, import("http").Server, import("fastify").FastifyTypeProviderDefault, import("fastify").FastifyBaseLogger>;
17
18
  export default _default;