@zenstackhq/server 1.0.0-beta.1 → 1.0.0-beta.11
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/base.d.ts +8 -0
- package/api/base.js +19 -0
- package/api/base.js.map +1 -0
- package/api/rest/index.d.ts +1 -1
- package/api/rest/index.js +111 -69
- package/api/rest/index.js.map +1 -1
- package/api/rpc/index.d.ts +1 -1
- package/api/rpc/index.js +140 -43
- package/api/rpc/index.js.map +1 -1
- package/api/utils.d.ts +6 -12
- package/api/utils.js +34 -37
- package/api/utils.js.map +1 -1
- package/express/middleware.d.ts +10 -0
- package/express/middleware.js +35 -32
- package/express/middleware.js.map +1 -1
- package/fastify/plugin.d.ts +2 -1
- package/fastify/plugin.js +15 -22
- package/fastify/plugin.js.map +1 -1
- package/next/app-route-handler.js +14 -19
- package/next/app-route-handler.js.map +1 -1
- package/next/pages-route-handler.js +13 -18
- package/next/pages-route-handler.js.map +1 -1
- package/package.json +8 -9
- package/sveltekit/handler.js +15 -28
- package/sveltekit/handler.js.map +1 -1
- package/types.d.ts +3 -4
- package/utils.d.ts +0 -17
- package/utils.js +0 -93
- package/utils.js.map +0 -1
package/api/rpc/index.js
CHANGED
|
@@ -8,21 +8,44 @@ 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)();
|
|
14
33
|
/**
|
|
15
34
|
* Prisma RPC style API request handler that mirrors the Prisma Client API
|
|
16
35
|
*/
|
|
17
|
-
class RequestHandler {
|
|
18
|
-
handleRequest({ prisma, method, path, query, requestBody, zodSchemas, logger, }) {
|
|
36
|
+
class RequestHandler extends base_1.APIHandlerBase {
|
|
37
|
+
handleRequest({ prisma, method, path, query, requestBody, modelMeta, zodSchemas, logger, }) {
|
|
19
38
|
var _a, _b;
|
|
20
39
|
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
modelMeta = modelMeta !== null && modelMeta !== void 0 ? modelMeta : this.defaultModelMeta;
|
|
41
|
+
if (!modelMeta) {
|
|
42
|
+
throw new Error('Model meta is not provided or loaded from default location');
|
|
43
|
+
}
|
|
21
44
|
const parts = path.split('/').filter((p) => !!p);
|
|
22
45
|
const op = parts.pop();
|
|
23
46
|
const model = parts.pop();
|
|
24
47
|
if (parts.length !== 0 || !op || !model) {
|
|
25
|
-
return { status: 400, body:
|
|
48
|
+
return { status: 400, body: this.makeError('invalid request path') };
|
|
26
49
|
}
|
|
27
50
|
method = method.toUpperCase();
|
|
28
51
|
const dbOp = op;
|
|
@@ -33,10 +56,13 @@ class RequestHandler {
|
|
|
33
56
|
case 'createMany':
|
|
34
57
|
case 'upsert':
|
|
35
58
|
if (method !== 'POST') {
|
|
36
|
-
return {
|
|
59
|
+
return {
|
|
60
|
+
status: 400,
|
|
61
|
+
body: this.makeError('invalid request method, only POST is supported'),
|
|
62
|
+
};
|
|
37
63
|
}
|
|
38
64
|
if (!requestBody) {
|
|
39
|
-
return { status: 400, body:
|
|
65
|
+
return { status: 400, body: this.makeError('missing request body') };
|
|
40
66
|
}
|
|
41
67
|
args = requestBody;
|
|
42
68
|
// TODO: upsert's status code should be conditional
|
|
@@ -49,13 +75,16 @@ class RequestHandler {
|
|
|
49
75
|
case 'groupBy':
|
|
50
76
|
case 'count':
|
|
51
77
|
if (method !== 'GET') {
|
|
52
|
-
return {
|
|
78
|
+
return {
|
|
79
|
+
status: 400,
|
|
80
|
+
body: this.makeError('invalid request method, only GET is supported'),
|
|
81
|
+
};
|
|
53
82
|
}
|
|
54
83
|
try {
|
|
55
|
-
args = (query === null || query === void 0 ? void 0 : query.q) ? this.
|
|
84
|
+
args = (query === null || query === void 0 ? void 0 : query.q) ? this.unmarshalQ(query.q, query.meta) : {};
|
|
56
85
|
}
|
|
57
86
|
catch (_c) {
|
|
58
|
-
return { status: 400, body:
|
|
87
|
+
return { status: 400, body: this.makeError('invalid "q" query parameter') };
|
|
59
88
|
}
|
|
60
89
|
break;
|
|
61
90
|
case 'update':
|
|
@@ -63,59 +92,69 @@ class RequestHandler {
|
|
|
63
92
|
if (method !== 'PUT' && method !== 'PATCH') {
|
|
64
93
|
return {
|
|
65
94
|
status: 400,
|
|
66
|
-
body:
|
|
95
|
+
body: this.makeError('invalid request method, only PUT AND PATCH are supported'),
|
|
67
96
|
};
|
|
68
97
|
}
|
|
69
98
|
if (!requestBody) {
|
|
70
|
-
return { status: 400, body:
|
|
99
|
+
return { status: 400, body: this.makeError('missing request body') };
|
|
71
100
|
}
|
|
72
101
|
args = requestBody;
|
|
73
102
|
break;
|
|
74
103
|
case 'delete':
|
|
75
104
|
case 'deleteMany':
|
|
76
105
|
if (method !== 'DELETE') {
|
|
77
|
-
return {
|
|
106
|
+
return {
|
|
107
|
+
status: 400,
|
|
108
|
+
body: this.makeError('invalid request method, only DELETE is supported'),
|
|
109
|
+
};
|
|
78
110
|
}
|
|
79
111
|
try {
|
|
80
|
-
args = (query === null || query === void 0 ? void 0 : query.q) ? this.
|
|
112
|
+
args = (query === null || query === void 0 ? void 0 : query.q) ? this.unmarshalQ(query.q, query.meta) : {};
|
|
81
113
|
}
|
|
82
114
|
catch (_d) {
|
|
83
|
-
return { status: 400, body:
|
|
115
|
+
return { status: 400, body: this.makeError('invalid "q" query parameter') };
|
|
84
116
|
}
|
|
85
117
|
break;
|
|
86
118
|
default:
|
|
87
|
-
return { status: 400, body:
|
|
119
|
+
return { status: 400, body: this.makeError('invalid operation: ' + op) };
|
|
88
120
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return { status: 400, body: { message: error } };
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
args = data;
|
|
96
|
-
}
|
|
121
|
+
const { error, data: parsedArgs } = yield this.processRequestPayload(args, model, dbOp, zodSchemas);
|
|
122
|
+
if (error) {
|
|
123
|
+
return { status: 400, body: this.makeError(error) };
|
|
97
124
|
}
|
|
98
125
|
try {
|
|
99
126
|
if (!prisma[model]) {
|
|
100
|
-
return { status: 400, body:
|
|
127
|
+
return { status: 400, body: this.makeError(`unknown model name: ${model}`) };
|
|
101
128
|
}
|
|
102
|
-
const result = yield prisma[model][dbOp](
|
|
103
|
-
(0, utils_1.
|
|
104
|
-
|
|
129
|
+
const result = yield prisma[model][dbOp](parsedArgs);
|
|
130
|
+
(0, utils_1.processEntityData)(result);
|
|
131
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
132
|
+
let response = { data: result };
|
|
133
|
+
// superjson serialize response
|
|
134
|
+
if (result) {
|
|
135
|
+
const { json, meta } = superjson_1.default.serialize(result);
|
|
136
|
+
response = { data: json };
|
|
137
|
+
if (meta) {
|
|
138
|
+
response.meta = { serialization: meta };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return { status: resCode, body: response };
|
|
105
142
|
}
|
|
106
143
|
catch (err) {
|
|
107
144
|
if ((0, runtime_1.isPrismaClientKnownRequestError)(err)) {
|
|
108
145
|
(0, utils_1.logError)(logger, err.code, err.message);
|
|
109
|
-
if (err.code ===
|
|
146
|
+
if (err.code === runtime_1.PrismaErrorCode.CONSTRAINED_FAILED) {
|
|
110
147
|
// rejected by policy
|
|
111
148
|
return {
|
|
112
149
|
status: 403,
|
|
113
150
|
body: {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
151
|
+
error: {
|
|
152
|
+
prisma: true,
|
|
153
|
+
rejectedByPolicy: true,
|
|
154
|
+
code: err.code,
|
|
155
|
+
message: err.message,
|
|
156
|
+
reason: (_a = err.meta) === null || _a === void 0 ? void 0 : _a.reason,
|
|
157
|
+
},
|
|
119
158
|
},
|
|
120
159
|
};
|
|
121
160
|
}
|
|
@@ -123,10 +162,12 @@ class RequestHandler {
|
|
|
123
162
|
return {
|
|
124
163
|
status: 400,
|
|
125
164
|
body: {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
165
|
+
error: {
|
|
166
|
+
prisma: true,
|
|
167
|
+
code: err.code,
|
|
168
|
+
message: err.message,
|
|
169
|
+
reason: (_b = err.meta) === null || _b === void 0 ? void 0 : _b.reason,
|
|
170
|
+
},
|
|
130
171
|
},
|
|
131
172
|
};
|
|
132
173
|
}
|
|
@@ -136,8 +177,10 @@ class RequestHandler {
|
|
|
136
177
|
return {
|
|
137
178
|
status: 400,
|
|
138
179
|
body: {
|
|
139
|
-
|
|
140
|
-
|
|
180
|
+
error: {
|
|
181
|
+
prisma: true,
|
|
182
|
+
message: err.message,
|
|
183
|
+
},
|
|
141
184
|
},
|
|
142
185
|
};
|
|
143
186
|
}
|
|
@@ -146,16 +189,70 @@ class RequestHandler {
|
|
|
146
189
|
(0, utils_1.logError)(logger, _err.message + (_err.stack ? '\n' + _err.stack : ''));
|
|
147
190
|
return {
|
|
148
191
|
status: 400,
|
|
149
|
-
body:
|
|
150
|
-
message: err.message,
|
|
151
|
-
},
|
|
192
|
+
body: this.makeError(err.message),
|
|
152
193
|
};
|
|
153
194
|
}
|
|
154
195
|
}
|
|
155
196
|
});
|
|
156
197
|
}
|
|
157
|
-
|
|
158
|
-
return
|
|
198
|
+
makeError(message) {
|
|
199
|
+
return { error: { message: message } };
|
|
200
|
+
}
|
|
201
|
+
processRequestPayload(
|
|
202
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
203
|
+
args, model, dbOp, zodSchemas) {
|
|
204
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
205
|
+
const { meta } = args, rest = __rest(args, ["meta"]);
|
|
206
|
+
if (meta === null || meta === void 0 ? void 0 : meta.serialization) {
|
|
207
|
+
// superjson deserialization
|
|
208
|
+
args = superjson_1.default.deserialize({ json: rest, meta: meta.serialization });
|
|
209
|
+
}
|
|
210
|
+
return this.zodValidate(zodSchemas, model, dbOp, args);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
getZodSchema(zodSchemas, model, operation) {
|
|
214
|
+
var _a, _b;
|
|
215
|
+
// e.g.: UserInputSchema { findUnique: [schema] }
|
|
216
|
+
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];
|
|
217
|
+
}
|
|
218
|
+
zodValidate(zodSchemas, model, operation, args) {
|
|
219
|
+
const zodSchema = zodSchemas && this.getZodSchema(zodSchemas, model, operation);
|
|
220
|
+
if (zodSchema) {
|
|
221
|
+
const parseResult = zodSchema.safeParse(args);
|
|
222
|
+
if (parseResult.success) {
|
|
223
|
+
return { data: args, error: undefined };
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
return { data: undefined, error: (0, zod_validation_error_1.fromZodError)(parseResult.error).message };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
return { data: args, error: undefined };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
unmarshalQ(value, meta) {
|
|
234
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
235
|
+
let parsedValue;
|
|
236
|
+
try {
|
|
237
|
+
parsedValue = JSON.parse(value);
|
|
238
|
+
}
|
|
239
|
+
catch (_a) {
|
|
240
|
+
throw new Error('invalid "q" query parameter');
|
|
241
|
+
}
|
|
242
|
+
if (meta) {
|
|
243
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
244
|
+
let parsedMeta;
|
|
245
|
+
try {
|
|
246
|
+
parsedMeta = JSON.parse(meta);
|
|
247
|
+
}
|
|
248
|
+
catch (_b) {
|
|
249
|
+
throw new Error('invalid "meta" query parameter');
|
|
250
|
+
}
|
|
251
|
+
if (parsedMeta.serialization) {
|
|
252
|
+
return superjson_1.default.deserialize({ json: parsedValue, meta: parsedMeta.serialization });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return parsedValue;
|
|
159
256
|
}
|
|
160
257
|
}
|
|
161
258
|
function makeHandler() {
|
package/api/rpc/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/rpc/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/rpc/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAO6B;AAC7B,0DAAkC;AAClC,uDAAkD;AAClD,+DAAoD;AAEpD,kCAAyC;AACzC,oCAAkF;AAElF,IAAA,iCAAyB,GAAE,CAAC;AAE5B;;GAEG;AACH,MAAM,cAAe,SAAQ,qBAAc;IACjC,aAAa,CAAC,EAChB,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,GACO;;;YACb,SAAS,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,IAAI,CAAC,gBAAgB,CAAC;YAC/C,IAAI,CAAC,SAAS,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;aACjF;YAED,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,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC;aACxE;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;4BACH,MAAM,EAAE,GAAG;4BACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,gDAAgD,CAAC;yBACzE,CAAC;qBACL;oBACD,IAAI,CAAC,WAAW,EAAE;wBACd,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC;qBACxE;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;4BACH,MAAM,EAAE,GAAG;4BACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,+CAA+C,CAAC;yBACxE,CAAC;qBACL;oBACD,IAAI;wBACA,IAAI,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,CAAC,EAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAW,EAAE,KAAK,CAAC,IAA0B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC/F;oBAAC,WAAM;wBACJ,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,6BAA6B,CAAC,EAAE,CAAC;qBAC/E;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,IAAI,CAAC,SAAS,CAAC,0DAA0D,CAAC;yBACnF,CAAC;qBACL;oBACD,IAAI,CAAC,WAAW,EAAE;wBACd,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC;qBACxE;oBAED,IAAI,GAAG,WAAW,CAAC;oBACnB,MAAM;gBAEV,KAAK,QAAQ,CAAC;gBACd,KAAK,YAAY;oBACb,IAAI,MAAM,KAAK,QAAQ,EAAE;wBACrB,OAAO;4BACH,MAAM,EAAE,GAAG;4BACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,kDAAkD,CAAC;yBAC3E,CAAC;qBACL;oBACD,IAAI;wBACA,IAAI,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,CAAC,EAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAW,EAAE,KAAK,CAAC,IAA0B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC/F;oBAAC,WAAM;wBACJ,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,6BAA6B,CAAC,EAAE,CAAC;qBAC/E;oBACD,MAAM;gBAEV;oBACI,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC;aAChF;YAED,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACpG,IAAI,KAAK,EAAE;gBACP,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;aACvD;YAED,IAAI;gBACA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBAChB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,KAAK,EAAE,CAAC,EAAE,CAAC;iBAChF;gBAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;gBACrD,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAC;gBAE1B,8DAA8D;gBAC9D,IAAI,QAAQ,GAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAErC,+BAA+B;gBAC/B,IAAI,MAAM,EAAE;oBACR,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,mBAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBACnD,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBAC1B,IAAI,IAAI,EAAE;wBACN,QAAQ,CAAC,IAAI,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;qBAC3C;iBACJ;gBAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;aAC9C;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,yBAAe,CAAC,kBAAkB,EAAE;wBACjD,qBAAqB;wBACrB,OAAO;4BACH,MAAM,EAAE,GAAG;4BACX,IAAI,EAAE;gCACF,KAAK,EAAE;oCACH,MAAM,EAAE,IAAI;oCACZ,gBAAgB,EAAE,IAAI;oCACtB,IAAI,EAAE,GAAG,CAAC,IAAI;oCACd,OAAO,EAAE,GAAG,CAAC,OAAO;oCACpB,MAAM,EAAE,MAAA,GAAG,CAAC,IAAI,0CAAE,MAAM;iCAC3B;6BACJ;yBACJ,CAAC;qBACL;yBAAM;wBACH,OAAO;4BACH,MAAM,EAAE,GAAG;4BACX,IAAI,EAAE;gCACF,KAAK,EAAE;oCACH,MAAM,EAAE,IAAI;oCACZ,IAAI,EAAE,GAAG,CAAC,IAAI;oCACd,OAAO,EAAE,GAAG,CAAC,OAAO;oCACpB,MAAM,EAAE,MAAA,GAAG,CAAC,IAAI,0CAAE,MAAM;iCAC3B;6BACJ;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,KAAK,EAAE;gCACH,MAAM,EAAE,IAAI;gCACZ,OAAO,EAAE,GAAG,CAAC,OAAO;6BACvB;yBACJ;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,IAAI,CAAC,SAAS,CAAE,GAAa,CAAC,OAAO,CAAC;qBAC/C,CAAC;iBACL;aACJ;;KACJ;IAEO,SAAS,CAAC,OAAe;QAC7B,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;IAC3C,CAAC;IAEa,qBAAqB;IAC/B,8DAA8D;IAC9D,IAAS,EACT,KAAa,EACb,IAAY,EACZ,UAAkC;;YAElC,MAAM,EAAE,IAAI,KAAc,IAAI,EAAb,IAAI,UAAK,IAAI,EAAxB,QAAiB,CAAO,CAAC;YAC/B,IAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa,EAAE;gBACrB,4BAA4B;gBAC5B,IAAI,GAAG,mBAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;aAC1E;YACD,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,IAA0B,EAAE,IAAI,CAAC,CAAC;QACjF,CAAC;KAAA;IAEO,YAAY,CAAC,UAAsB,EAAE,KAAa,EAAE,SAA6B;;QACrF,iDAAiD;QACjD,OAAO,MAAA,MAAA,UAAU,CAAC,KAAK,0CAAG,GAAG,IAAA,iCAAc,EAAC,KAAK,CAAC,aAAa,CAAC,0CAAG,SAAS,CAAC,CAAC;IAClF,CAAC;IAEO,WAAW,CACf,UAAkC,EAClC,KAAa,EACb,SAA6B,EAC7B,IAAa;QAEb,MAAM,SAAS,GAAG,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAChF,IAAI,SAAS,EAAE;YACX,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,WAAW,CAAC,OAAO,EAAE;gBACrB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAC3C;iBAAM;gBACH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAA,mCAAY,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC9E;SACJ;aAAM;YACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SAC3C;IACL,CAAC;IAEO,UAAU,CAAC,KAAa,EAAE,IAAwB;QACtD,8DAA8D;QAC9D,IAAI,WAAgB,CAAC;QACrB,IAAI;YACA,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACnC;QAAC,WAAM;YACJ,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;SAClD;QAED,IAAI,IAAI,EAAE;YACN,8DAA8D;YAC9D,IAAI,UAAe,CAAC;YACpB,IAAI;gBACA,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;aACjC;YAAC,WAAM;gBACJ,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;aACrD;YAED,IAAI,UAAU,CAAC,aAAa,EAAE;gBAC1B,OAAO,mBAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;aACvF;SACJ;QAED,OAAO,WAAW,CAAC;IACvB,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"}
|
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
|
-
*
|
|
6
|
+
* Processes entity data returned from Prisma call.
|
|
17
7
|
*/
|
|
18
|
-
export declare function
|
|
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.
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
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 (
|
|
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
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/api/utils.ts"],"names":[],"mappings":"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"}
|
package/express/middleware.d.ts
CHANGED
|
@@ -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.
|
package/express/middleware.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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:
|
|
56
|
+
requestBody: request.body,
|
|
63
57
|
prisma,
|
|
64
58
|
modelMeta: options.modelMeta,
|
|
65
59
|
zodSchemas,
|
|
66
60
|
logger: options.logger,
|
|
67
61
|
});
|
|
68
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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":";;;;;;;;;;;;;;
|
|
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"}
|
package/fastify/plugin.d.ts
CHANGED
|
@@ -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("
|
|
17
|
+
declare const _default: FastifyPluginCallback<PluginOptions, import("http").Server, import("fastify").FastifyTypeProviderDefault, import("fastify").FastifyBaseLogger>;
|
|
17
18
|
export default _default;
|