@zenstackhq/server 3.0.0-beta.12 → 3.0.0-beta.14

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 (59) hide show
  1. package/dist/api.cjs +1767 -19
  2. package/dist/api.cjs.map +1 -1
  3. package/dist/api.d.cts +123 -4
  4. package/dist/api.d.ts +123 -4
  5. package/dist/api.js +1762 -15
  6. package/dist/api.js.map +1 -1
  7. package/dist/common-6DG-xEmM.d.cts +14 -0
  8. package/dist/common-CyapsM8n.d.ts +14 -0
  9. package/dist/elysia.cjs +118 -0
  10. package/dist/elysia.cjs.map +1 -0
  11. package/dist/elysia.d.cts +53 -0
  12. package/dist/elysia.d.ts +53 -0
  13. package/dist/elysia.js +83 -0
  14. package/dist/elysia.js.map +1 -0
  15. package/dist/express.cjs +41 -3
  16. package/dist/express.cjs.map +1 -1
  17. package/dist/express.d.cts +7 -7
  18. package/dist/express.d.ts +7 -7
  19. package/dist/express.js +30 -2
  20. package/dist/express.js.map +1 -1
  21. package/dist/fastify.cjs +103 -0
  22. package/dist/fastify.cjs.map +1 -0
  23. package/dist/fastify.d.cts +22 -0
  24. package/dist/fastify.d.ts +22 -0
  25. package/dist/fastify.js +68 -0
  26. package/dist/fastify.js.map +1 -0
  27. package/dist/hono.cjs +111 -0
  28. package/dist/hono.cjs.map +1 -0
  29. package/dist/hono.d.cts +18 -0
  30. package/dist/hono.d.ts +18 -0
  31. package/dist/hono.js +76 -0
  32. package/dist/hono.js.map +1 -0
  33. package/dist/next.cjs +178 -0
  34. package/dist/next.cjs.map +1 -0
  35. package/dist/next.d.cts +61 -0
  36. package/dist/next.d.ts +61 -0
  37. package/dist/next.js +143 -0
  38. package/dist/next.js.map +1 -0
  39. package/dist/nuxt.cjs +109 -0
  40. package/dist/nuxt.cjs.map +1 -0
  41. package/dist/nuxt.d.cts +19 -0
  42. package/dist/nuxt.d.ts +19 -0
  43. package/dist/nuxt.js +74 -0
  44. package/dist/nuxt.js.map +1 -0
  45. package/dist/sveltekit.cjs +134 -0
  46. package/dist/sveltekit.cjs.map +1 -0
  47. package/dist/sveltekit.d.cts +25 -0
  48. package/dist/sveltekit.d.ts +25 -0
  49. package/dist/sveltekit.js +99 -0
  50. package/dist/sveltekit.js.map +1 -0
  51. package/dist/tanstack-start.cjs +139 -0
  52. package/dist/tanstack-start.cjs.map +1 -0
  53. package/dist/tanstack-start.d.cts +32 -0
  54. package/dist/tanstack-start.d.ts +32 -0
  55. package/dist/tanstack-start.js +104 -0
  56. package/dist/tanstack-start.js.map +1 -0
  57. package/dist/{types-BH-88xJo.d.cts → types-D5t0sUEw.d.cts} +6 -2
  58. package/dist/{types-BH-88xJo.d.ts → types-D5t0sUEw.d.ts} +6 -2
  59. package/package.json +120 -8
@@ -0,0 +1,53 @@
1
+ import { ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
+ import { Context, Elysia } from 'elysia';
4
+ import { C as CommonAdapterOptions } from './common-CyapsM8n.js';
5
+ import './types-D5t0sUEw.js';
6
+
7
+ /**
8
+ * Options for initializing an Elysia middleware.
9
+ */
10
+ interface ElysiaOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
11
+ /**
12
+ * Callback method for getting a ZenStackClient instance for the given request context.
13
+ */
14
+ getClient: (context: Context) => Promise<ClientContract<Schema>> | ClientContract<Schema>;
15
+ /**
16
+ * Optional base path to strip from the request path before passing to the API handler.
17
+ */
18
+ basePath?: string;
19
+ }
20
+ /**
21
+ * Creates an Elysia middleware handler for ZenStack.
22
+ * This handler provides automatic CRUD APIs through Elysia's routing system.
23
+ */
24
+ declare function createElysiaHandler<Schema extends SchemaDef>(options: ElysiaOptions<Schema>): (app: Elysia) => Promise<Elysia<"", {
25
+ decorator: {};
26
+ store: {};
27
+ derive: {};
28
+ resolve: {};
29
+ }, {
30
+ typebox: {};
31
+ error: {};
32
+ }, {
33
+ schema: {};
34
+ standaloneSchema: {};
35
+ macro: {};
36
+ macroFn: {};
37
+ parser: {};
38
+ response: {};
39
+ }, {}, {
40
+ derive: {};
41
+ resolve: {};
42
+ schema: {};
43
+ standaloneSchema: {};
44
+ response: {};
45
+ }, {
46
+ derive: {};
47
+ resolve: {};
48
+ schema: {};
49
+ standaloneSchema: {};
50
+ response: {};
51
+ }>>;
52
+
53
+ export { type ElysiaOptions, createElysiaHandler };
package/dist/elysia.js ADDED
@@ -0,0 +1,83 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/api/utils.ts
5
+ import { Decimal } from "decimal.js";
6
+ import SuperJSON from "superjson";
7
+ import { match } from "ts-pattern";
8
+ import { fromError as fromError3 } from "zod-validation-error/v3";
9
+ import { fromError as fromError4 } from "zod-validation-error/v4";
10
+ function log(logger, level, message, error) {
11
+ if (!logger) {
12
+ return;
13
+ }
14
+ const getMessage = typeof message === "function" ? message : () => message;
15
+ if (typeof logger === "function") {
16
+ logger(level, getMessage(), error);
17
+ } else if (logger.includes(level)) {
18
+ const logFn = match(level).with("debug", () => console.debug).with("info", () => console.info).with("warn", () => console.warn).with("error", () => console.error).exhaustive();
19
+ logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `
20
+ ${error}` : ""}`);
21
+ }
22
+ }
23
+ __name(log, "log");
24
+
25
+ // src/adapter/common.ts
26
+ function logInternalError(logger, err) {
27
+ log(logger, "error", `An unhandled error occurred while processing the request: ${err}${err instanceof Error ? "\n" + err.stack : ""}`);
28
+ }
29
+ __name(logInternalError, "logInternalError");
30
+
31
+ // src/adapter/elysia/handler.ts
32
+ function createElysiaHandler(options) {
33
+ return async (app) => {
34
+ app.all("/*", async (ctx) => {
35
+ const { request, body, set } = ctx;
36
+ const client = await options.getClient(ctx);
37
+ if (!client) {
38
+ set.status = 500;
39
+ return {
40
+ message: "unable to get ZenStackClient from request context"
41
+ };
42
+ }
43
+ const url = new URL(request.url);
44
+ const query = Object.fromEntries(url.searchParams);
45
+ let path = url.pathname;
46
+ if (options.basePath && path.startsWith(options.basePath)) {
47
+ path = path.slice(options.basePath.length);
48
+ if (!path.startsWith("/")) {
49
+ path = "/" + path;
50
+ }
51
+ }
52
+ if (!path || path === "/") {
53
+ set.status = 400;
54
+ return {
55
+ message: "missing path parameter"
56
+ };
57
+ }
58
+ try {
59
+ const r = await options.apiHandler.handleRequest({
60
+ method: request.method,
61
+ path,
62
+ query,
63
+ requestBody: body,
64
+ client
65
+ });
66
+ set.status = r.status;
67
+ return r.body;
68
+ } catch (err) {
69
+ set.status = 500;
70
+ logInternalError(options.apiHandler.log, err);
71
+ return {
72
+ message: "An internal server error occurred"
73
+ };
74
+ }
75
+ });
76
+ return app;
77
+ };
78
+ }
79
+ __name(createElysiaHandler, "createElysiaHandler");
80
+ export {
81
+ createElysiaHandler
82
+ };
83
+ //# sourceMappingURL=elysia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/utils.ts","../src/adapter/common.ts","../src/adapter/elysia/handler.ts"],"sourcesContent":["import { Decimal } from 'decimal.js';\nimport SuperJSON from 'superjson';\nimport { match } from 'ts-pattern';\nimport { ZodError } from 'zod';\nimport { fromError as fromError3 } from 'zod-validation-error/v3';\nimport { fromError as fromError4 } from 'zod-validation-error/v4';\nimport type { LogConfig, LogLevel } from '../types';\n\nexport function log(logger: LogConfig | undefined, level: LogLevel, message: string | (() => string), error?: unknown) {\n if (!logger) {\n return;\n }\n\n const getMessage = typeof message === 'function' ? message : () => message;\n\n if (typeof logger === 'function') {\n logger(level, getMessage(), error);\n } else if (logger.includes(level)) {\n const logFn = match(level)\n .with('debug', () => console.debug)\n .with('info', () => console.info)\n .with('warn', () => console.warn)\n .with('error', () => console.error)\n .exhaustive();\n logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `\\n${error}` : ''}`);\n }\n}\n\n/**\n * Registers custom superjson serializers.\n */\nexport function registerCustomSerializers() {\n SuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal => Decimal.isDecimal(v),\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal',\n );\n\n // `Buffer` is not available in edge runtime\n if (globalThis.Buffer) {\n SuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes',\n );\n }\n}\n\n/**\n * Format ZodError into a readable string\n */\nexport function getZodErrorMessage(error: ZodError): string {\n if ('_zod' in error) {\n return fromError4(error).toString();\n } else {\n return fromError3(error).toString();\n }\n}\n","import type { SchemaDef } from '@zenstackhq/orm/schema';\nimport { log } from '../api/utils';\nimport type { ApiHandler, LogConfig } from '../types';\n\n/**\n * Options common to all adapters\n */\nexport interface CommonAdapterOptions<Schema extends SchemaDef> {\n /**\n * The API handler to process requests\n */\n apiHandler: ApiHandler<Schema>;\n}\n\nexport function logInternalError(logger: LogConfig | undefined, err: unknown) {\n log(\n logger,\n 'error',\n `An unhandled error occurred while processing the request: ${err}${err instanceof Error ? '\\n' + err.stack : ''}`,\n );\n}\n","import type { ClientContract } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport { Elysia, type Context as ElysiaContext } from 'elysia';\nimport { logInternalError, type CommonAdapterOptions } from '../common';\n\n/**\n * Options for initializing an Elysia middleware.\n */\nexport interface ElysiaOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {\n /**\n * Callback method for getting a ZenStackClient instance for the given request context.\n */\n getClient: (context: ElysiaContext) => Promise<ClientContract<Schema>> | ClientContract<Schema>;\n\n /**\n * Optional base path to strip from the request path before passing to the API handler.\n */\n basePath?: string;\n}\n\n/**\n * Creates an Elysia middleware handler for ZenStack.\n * This handler provides automatic CRUD APIs through Elysia's routing system.\n */\nexport function createElysiaHandler<Schema extends SchemaDef>(options: ElysiaOptions<Schema>) {\n return async (app: Elysia) => {\n app.all('/*', async (ctx: ElysiaContext) => {\n const { request, body, set } = ctx;\n const client = await options.getClient(ctx);\n if (!client) {\n set.status = 500;\n return {\n message: 'unable to get ZenStackClient from request context',\n };\n }\n\n const url = new URL(request.url);\n const query = Object.fromEntries(url.searchParams);\n let path = url.pathname;\n\n if (options.basePath && path.startsWith(options.basePath)) {\n path = path.slice(options.basePath.length);\n if (!path.startsWith('/')) {\n path = '/' + path;\n }\n }\n\n if (!path || path === '/') {\n set.status = 400;\n return {\n message: 'missing path parameter',\n };\n }\n\n try {\n const r = await options.apiHandler.handleRequest({\n method: request.method,\n path,\n query,\n requestBody: body,\n client,\n });\n\n set.status = r.status;\n return r.body;\n } catch (err) {\n set.status = 500;\n logInternalError(options.apiHandler.log, err);\n return {\n message: 'An internal server error occurred',\n };\n }\n });\n\n return app;\n };\n}\n"],"mappings":";;;;AAAA,SAASA,eAAe;AACxB,OAAOC,eAAe;AACtB,SAASC,aAAa;AAEtB,SAASC,aAAaC,kBAAkB;AACxC,SAASD,aAAaE,kBAAkB;AAGjC,SAASC,IAAIC,QAA+BC,OAAiBC,SAAkCC,OAAe;AACjH,MAAI,CAACH,QAAQ;AACT;EACJ;AAEA,QAAMI,aAAa,OAAOF,YAAY,aAAaA,UAAU,MAAMA;AAEnE,MAAI,OAAOF,WAAW,YAAY;AAC9BA,WAAOC,OAAOG,WAAAA,GAAcD,KAAAA;EAChC,WAAWH,OAAOK,SAASJ,KAAAA,GAAQ;AAC/B,UAAMK,QAAQC,MAAMN,KAAAA,EACfO,KAAK,SAAS,MAAMC,QAAQC,KAAK,EACjCF,KAAK,QAAQ,MAAMC,QAAQE,IAAI,EAC/BH,KAAK,QAAQ,MAAMC,QAAQG,IAAI,EAC/BJ,KAAK,SAAS,MAAMC,QAAQN,KAAK,EACjCU,WAAU;AACfP,UAAM,wBAAwBL,KAAAA,KAAUG,WAAAA,CAAAA,GAAeD,QAAQ;EAAKA,KAAAA,KAAU,EAAA,EAAI;EACtF;AACJ;AAlBgBJ;;;ACMT,SAASe,iBAAiBC,QAA+BC,KAAY;AACxEC,MACIF,QACA,SACA,6DAA6DC,GAAAA,GAAMA,eAAeE,QAAQ,OAAOF,IAAIG,QAAQ,EAAA,EAAI;AAEzH;AANgBL;;;ACUT,SAASM,oBAA8CC,SAA8B;AACxF,SAAO,OAAOC,QAAAA;AACVA,QAAIC,IAAI,MAAM,OAAOC,QAAAA;AACjB,YAAM,EAAEC,SAASC,MAAMC,IAAG,IAAKH;AAC/B,YAAMI,SAAS,MAAMP,QAAQQ,UAAUL,GAAAA;AACvC,UAAI,CAACI,QAAQ;AACTD,YAAIG,SAAS;AACb,eAAO;UACHC,SAAS;QACb;MACJ;AAEA,YAAMC,MAAM,IAAIC,IAAIR,QAAQO,GAAG;AAC/B,YAAME,QAAQC,OAAOC,YAAYJ,IAAIK,YAAY;AACjD,UAAIC,OAAON,IAAIO;AAEf,UAAIlB,QAAQmB,YAAYF,KAAKG,WAAWpB,QAAQmB,QAAQ,GAAG;AACvDF,eAAOA,KAAKI,MAAMrB,QAAQmB,SAASG,MAAM;AACzC,YAAI,CAACL,KAAKG,WAAW,GAAA,GAAM;AACvBH,iBAAO,MAAMA;QACjB;MACJ;AAEA,UAAI,CAACA,QAAQA,SAAS,KAAK;AACvBX,YAAIG,SAAS;AACb,eAAO;UACHC,SAAS;QACb;MACJ;AAEA,UAAI;AACA,cAAMa,IAAI,MAAMvB,QAAQwB,WAAWC,cAAc;UAC7CC,QAAQtB,QAAQsB;UAChBT;UACAJ;UACAc,aAAatB;UACbE;QACJ,CAAA;AAEAD,YAAIG,SAASc,EAAEd;AACf,eAAOc,EAAElB;MACb,SAASuB,KAAK;AACVtB,YAAIG,SAAS;AACboB,yBAAiB7B,QAAQwB,WAAWM,KAAKF,GAAAA;AACzC,eAAO;UACHlB,SAAS;QACb;MACJ;IACJ,CAAA;AAEA,WAAOT;EACX;AACJ;AApDgBF;","names":["Decimal","SuperJSON","match","fromError","fromError3","fromError4","log","logger","level","message","error","getMessage","includes","logFn","match","with","console","debug","info","warn","exhaustive","logInternalError","logger","err","log","Error","stack","createElysiaHandler","options","app","all","ctx","request","body","set","client","getClient","status","message","url","URL","query","Object","fromEntries","searchParams","path","pathname","basePath","startsWith","slice","length","r","apiHandler","handleRequest","method","requestBody","err","logInternalError","log"]}
package/dist/express.cjs CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
9
  var __export = (target, all) => {
@@ -16,16 +18,51 @@ var __copyProps = (to, from, except, desc) => {
16
18
  }
17
19
  return to;
18
20
  };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
19
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
30
 
21
- // src/express/index.ts
31
+ // src/adapter/express/index.ts
22
32
  var express_exports = {};
23
33
  __export(express_exports, {
24
34
  ZenStackMiddleware: () => factory
25
35
  });
26
36
  module.exports = __toCommonJS(express_exports);
27
37
 
28
- // src/express/middleware.ts
38
+ // src/api/utils.ts
39
+ var import_decimal = require("decimal.js");
40
+ var import_superjson = __toESM(require("superjson"), 1);
41
+ var import_ts_pattern = require("ts-pattern");
42
+ var import_v3 = require("zod-validation-error/v3");
43
+ var import_v4 = require("zod-validation-error/v4");
44
+ function log(logger, level, message, error) {
45
+ if (!logger) {
46
+ return;
47
+ }
48
+ const getMessage = typeof message === "function" ? message : () => message;
49
+ if (typeof logger === "function") {
50
+ logger(level, getMessage(), error);
51
+ } else if (logger.includes(level)) {
52
+ const logFn = (0, import_ts_pattern.match)(level).with("debug", () => console.debug).with("info", () => console.info).with("warn", () => console.warn).with("error", () => console.error).exhaustive();
53
+ logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `
54
+ ${error}` : ""}`);
55
+ }
56
+ }
57
+ __name(log, "log");
58
+
59
+ // src/adapter/common.ts
60
+ function logInternalError(logger, err) {
61
+ log(logger, "error", `An unhandled error occurred while processing the request: ${err}${err instanceof Error ? "\n" + err.stack : ""}`);
62
+ }
63
+ __name(logInternalError, "logInternalError");
64
+
65
+ // src/adapter/express/middleware.ts
29
66
  var factory = /* @__PURE__ */ __name((options) => {
30
67
  const requestHandler = options.apiHandler;
31
68
  return async (request, response, next) => {
@@ -62,8 +99,9 @@ var factory = /* @__PURE__ */ __name((options) => {
62
99
  if (sendResponse === false) {
63
100
  throw err;
64
101
  }
102
+ logInternalError(options.apiHandler.log, err);
65
103
  return response.status(500).json({
66
- message: `An unhandled error occurred: ${err}`
104
+ message: `An internal server error occurred`
67
105
  });
68
106
  }
69
107
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/express/index.ts","../src/express/middleware.ts"],"sourcesContent":["export { ZenStackMiddleware, type MiddlewareOptions } from './middleware';\n","import type { ClientContract } from '@zenstackhq/runtime';\nimport type { SchemaDef } from '@zenstackhq/runtime/schema';\nimport type { Handler, Request, Response } from 'express';\nimport type { ApiHandler } from '../types';\n\n/**\n * Express middleware options\n */\nexport interface MiddlewareOptions<Schema extends SchemaDef> {\n apiHandler: ApiHandler<Schema>;\n\n /**\n * Callback for getting a ZenStackClient for the given request\n */\n getClient: (req: Request, res: Response) => ClientContract<Schema> | Promise<ClientContract<Schema>>;\n\n /**\n * Controls if the middleware directly sends a response. If set to false,\n * the response is stored in the `res.locals` object and then the middleware\n * calls the `next()` function to pass the control to the next middleware.\n * Subsequent middleware or request handlers need to make sure to send\n * a response.\n *\n * Defaults to true;\n */\n sendResponse?: boolean;\n}\n\n/**\n * Creates an Express middleware for handling CRUD requests.\n */\nconst factory = <Schema extends SchemaDef>(options: MiddlewareOptions<Schema>): Handler => {\n const requestHandler = options.apiHandler;\n\n return async (request, response, next) => {\n const client = await options.getClient(request, response);\n const { sendResponse } = options;\n\n if (sendResponse === false && !client) {\n throw new Error('unable to get ZenStackClient from request context');\n }\n\n if (!client) {\n return response.status(500).json({ message: 'unable to get ZenStackClient from request context' });\n }\n\n // express converts query parameters with square brackets into object\n // e.g.: filter[foo]=bar is parsed to { filter: { foo: 'bar' } }\n // we need to revert this behavior and reconstruct params from original URL\n const url = request.protocol + '://' + request.get('host') + request.originalUrl;\n const searchParams = new URL(url).searchParams;\n const query = Object.fromEntries(searchParams);\n\n try {\n const r = await requestHandler.handleRequest({\n method: request.method,\n path: request.path,\n query,\n requestBody: request.body,\n client,\n });\n if (sendResponse === false) {\n // attach response and pass control to the next middleware\n response.locals['zenstack'] = {\n status: r.status,\n body: r.body,\n };\n return next();\n }\n return response.status(r.status).json(r.body);\n } catch (err) {\n if (sendResponse === false) {\n throw err;\n }\n return response.status(500).json({ message: `An unhandled error occurred: ${err}` });\n }\n };\n};\n\nexport default factory;\n\nexport { factory as ZenStackMiddleware };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;AC+BA,IAAMA,UAAU,wBAA2BC,YAAAA;AACvC,QAAMC,iBAAiBD,QAAQE;AAE/B,SAAO,OAAOC,SAASC,UAAUC,SAAAA;AAC7B,UAAMC,SAAS,MAAMN,QAAQO,UAAUJ,SAASC,QAAAA;AAChD,UAAM,EAAEI,aAAY,IAAKR;AAEzB,QAAIQ,iBAAiB,SAAS,CAACF,QAAQ;AACnC,YAAM,IAAIG,MAAM,mDAAA;IACpB;AAEA,QAAI,CAACH,QAAQ;AACT,aAAOF,SAASM,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS;MAAoD,CAAA;IACpG;AAKA,UAAMC,MAAMV,QAAQW,WAAW,QAAQX,QAAQY,IAAI,MAAA,IAAUZ,QAAQa;AACrE,UAAMC,eAAe,IAAIC,IAAIL,GAAAA,EAAKI;AAClC,UAAME,QAAQC,OAAOC,YAAYJ,YAAAA;AAEjC,QAAI;AACA,YAAMK,IAAI,MAAMrB,eAAesB,cAAc;QACzCC,QAAQrB,QAAQqB;QAChBC,MAAMtB,QAAQsB;QACdN;QACAO,aAAavB,QAAQwB;QACrBrB;MACJ,CAAA;AACA,UAAIE,iBAAiB,OAAO;AAExBJ,iBAASwB,OAAO,UAAA,IAAc;UAC1BlB,QAAQY,EAAEZ;UACViB,MAAML,EAAEK;QACZ;AACA,eAAOtB,KAAAA;MACX;AACA,aAAOD,SAASM,OAAOY,EAAEZ,MAAM,EAAEC,KAAKW,EAAEK,IAAI;IAChD,SAASE,KAAK;AACV,UAAIrB,iBAAiB,OAAO;AACxB,cAAMqB;MACV;AACA,aAAOzB,SAASM,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS,gCAAgCiB,GAAAA;MAAM,CAAA;IACtF;EACJ;AACJ,GA9CgB;","names":["factory","options","requestHandler","apiHandler","request","response","next","client","getClient","sendResponse","Error","status","json","message","url","protocol","get","originalUrl","searchParams","URL","query","Object","fromEntries","r","handleRequest","method","path","requestBody","body","locals","err"]}
1
+ {"version":3,"sources":["../src/adapter/express/index.ts","../src/api/utils.ts","../src/adapter/common.ts","../src/adapter/express/middleware.ts"],"sourcesContent":["export { ZenStackMiddleware, type ExpressMiddlewareOptions } from './middleware';\n","import { Decimal } from 'decimal.js';\nimport SuperJSON from 'superjson';\nimport { match } from 'ts-pattern';\nimport { ZodError } from 'zod';\nimport { fromError as fromError3 } from 'zod-validation-error/v3';\nimport { fromError as fromError4 } from 'zod-validation-error/v4';\nimport type { LogConfig, LogLevel } from '../types';\n\nexport function log(logger: LogConfig | undefined, level: LogLevel, message: string | (() => string), error?: unknown) {\n if (!logger) {\n return;\n }\n\n const getMessage = typeof message === 'function' ? message : () => message;\n\n if (typeof logger === 'function') {\n logger(level, getMessage(), error);\n } else if (logger.includes(level)) {\n const logFn = match(level)\n .with('debug', () => console.debug)\n .with('info', () => console.info)\n .with('warn', () => console.warn)\n .with('error', () => console.error)\n .exhaustive();\n logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `\\n${error}` : ''}`);\n }\n}\n\n/**\n * Registers custom superjson serializers.\n */\nexport function registerCustomSerializers() {\n SuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal => Decimal.isDecimal(v),\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal',\n );\n\n // `Buffer` is not available in edge runtime\n if (globalThis.Buffer) {\n SuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes',\n );\n }\n}\n\n/**\n * Format ZodError into a readable string\n */\nexport function getZodErrorMessage(error: ZodError): string {\n if ('_zod' in error) {\n return fromError4(error).toString();\n } else {\n return fromError3(error).toString();\n }\n}\n","import type { SchemaDef } from '@zenstackhq/orm/schema';\nimport { log } from '../api/utils';\nimport type { ApiHandler, LogConfig } from '../types';\n\n/**\n * Options common to all adapters\n */\nexport interface CommonAdapterOptions<Schema extends SchemaDef> {\n /**\n * The API handler to process requests\n */\n apiHandler: ApiHandler<Schema>;\n}\n\nexport function logInternalError(logger: LogConfig | undefined, err: unknown) {\n log(\n logger,\n 'error',\n `An unhandled error occurred while processing the request: ${err}${err instanceof Error ? '\\n' + err.stack : ''}`,\n );\n}\n","import type { ClientContract } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport type { Handler, Request, Response } from 'express';\nimport { logInternalError, type CommonAdapterOptions } from '../common';\n\n/**\n * Express middleware options\n */\nexport interface ExpressMiddlewareOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {\n /**\n * Callback for getting a ZenStackClient for the given request\n */\n getClient: (req: Request, res: Response) => ClientContract<Schema> | Promise<ClientContract<Schema>>;\n\n /**\n * Controls if the middleware directly sends a response. If set to false,\n * the response is stored in the `res.locals` object and then the middleware\n * calls the `next()` function to pass the control to the next middleware.\n * Subsequent middleware or request handlers need to make sure to send\n * a response.\n *\n * Defaults to true;\n */\n sendResponse?: boolean;\n}\n\n/**\n * Creates an Express middleware for handling CRUD requests.\n */\nconst factory = <Schema extends SchemaDef>(options: ExpressMiddlewareOptions<Schema>): Handler => {\n const requestHandler = options.apiHandler;\n\n return async (request, response, next) => {\n const client = await options.getClient(request, response);\n const { sendResponse } = options;\n\n if (sendResponse === false && !client) {\n throw new Error('unable to get ZenStackClient from request context');\n }\n\n if (!client) {\n return response.status(500).json({ message: 'unable to get ZenStackClient from request context' });\n }\n\n // express converts query parameters with square brackets into object\n // e.g.: filter[foo]=bar is parsed to { filter: { foo: 'bar' } }\n // we need to revert this behavior and reconstruct params from original URL\n const url = request.protocol + '://' + request.get('host') + request.originalUrl;\n const searchParams = new URL(url).searchParams;\n const query = Object.fromEntries(searchParams);\n\n try {\n const r = await requestHandler.handleRequest({\n method: request.method,\n path: request.path,\n query,\n requestBody: request.body,\n client,\n });\n if (sendResponse === false) {\n // attach response and pass control to the next middleware\n response.locals['zenstack'] = {\n status: r.status,\n body: r.body,\n };\n return next();\n }\n return response.status(r.status).json(r.body);\n } catch (err) {\n if (sendResponse === false) {\n throw err;\n }\n logInternalError(options.apiHandler.log, err);\n return response.status(500).json({ message: `An internal server error occurred` });\n }\n };\n};\n\nexport default factory;\n\nexport { factory as ZenStackMiddleware };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACAA,qBAAwB;AACxB,uBAAsB;AACtB,wBAAsB;AAEtB,gBAAwC;AACxC,gBAAwC;AAGjC,SAASA,IAAIC,QAA+BC,OAAiBC,SAAkCC,OAAe;AACjH,MAAI,CAACH,QAAQ;AACT;EACJ;AAEA,QAAMI,aAAa,OAAOF,YAAY,aAAaA,UAAU,MAAMA;AAEnE,MAAI,OAAOF,WAAW,YAAY;AAC9BA,WAAOC,OAAOG,WAAAA,GAAcD,KAAAA;EAChC,WAAWH,OAAOK,SAASJ,KAAAA,GAAQ;AAC/B,UAAMK,YAAQC,yBAAMN,KAAAA,EACfO,KAAK,SAAS,MAAMC,QAAQC,KAAK,EACjCF,KAAK,QAAQ,MAAMC,QAAQE,IAAI,EAC/BH,KAAK,QAAQ,MAAMC,QAAQG,IAAI,EAC/BJ,KAAK,SAAS,MAAMC,QAAQN,KAAK,EACjCU,WAAU;AACfP,UAAM,wBAAwBL,KAAAA,KAAUG,WAAAA,CAAAA,GAAeD,QAAQ;EAAKA,KAAAA,KAAU,EAAA,EAAI;EACtF;AACJ;AAlBgBJ;;;ACMT,SAASe,iBAAiBC,QAA+BC,KAAY;AACxEC,MACIF,QACA,SACA,6DAA6DC,GAAAA,GAAMA,eAAeE,QAAQ,OAAOF,IAAIG,QAAQ,EAAA,EAAI;AAEzH;AANgBL;;;ACehB,IAAMM,UAAU,wBAA2BC,YAAAA;AACvC,QAAMC,iBAAiBD,QAAQE;AAE/B,SAAO,OAAOC,SAASC,UAAUC,SAAAA;AAC7B,UAAMC,SAAS,MAAMN,QAAQO,UAAUJ,SAASC,QAAAA;AAChD,UAAM,EAAEI,aAAY,IAAKR;AAEzB,QAAIQ,iBAAiB,SAAS,CAACF,QAAQ;AACnC,YAAM,IAAIG,MAAM,mDAAA;IACpB;AAEA,QAAI,CAACH,QAAQ;AACT,aAAOF,SAASM,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS;MAAoD,CAAA;IACpG;AAKA,UAAMC,MAAMV,QAAQW,WAAW,QAAQX,QAAQY,IAAI,MAAA,IAAUZ,QAAQa;AACrE,UAAMC,eAAe,IAAIC,IAAIL,GAAAA,EAAKI;AAClC,UAAME,QAAQC,OAAOC,YAAYJ,YAAAA;AAEjC,QAAI;AACA,YAAMK,IAAI,MAAMrB,eAAesB,cAAc;QACzCC,QAAQrB,QAAQqB;QAChBC,MAAMtB,QAAQsB;QACdN;QACAO,aAAavB,QAAQwB;QACrBrB;MACJ,CAAA;AACA,UAAIE,iBAAiB,OAAO;AAExBJ,iBAASwB,OAAO,UAAA,IAAc;UAC1BlB,QAAQY,EAAEZ;UACViB,MAAML,EAAEK;QACZ;AACA,eAAOtB,KAAAA;MACX;AACA,aAAOD,SAASM,OAAOY,EAAEZ,MAAM,EAAEC,KAAKW,EAAEK,IAAI;IAChD,SAASE,KAAK;AACV,UAAIrB,iBAAiB,OAAO;AACxB,cAAMqB;MACV;AACAC,uBAAiB9B,QAAQE,WAAW6B,KAAKF,GAAAA;AACzC,aAAOzB,SAASM,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS;MAAoC,CAAA;IACpF;EACJ;AACJ,GA/CgB;","names":["log","logger","level","message","error","getMessage","includes","logFn","match","with","console","debug","info","warn","exhaustive","logInternalError","logger","err","log","Error","stack","factory","options","requestHandler","apiHandler","request","response","next","client","getClient","sendResponse","Error","status","json","message","url","protocol","get","originalUrl","searchParams","URL","query","Object","fromEntries","r","handleRequest","method","path","requestBody","body","locals","err","logInternalError","log"]}
@@ -1,13 +1,13 @@
1
- import { ClientContract } from '@zenstackhq/runtime';
2
- import { SchemaDef } from '@zenstackhq/runtime/schema';
1
+ import { ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
3
  import { Request, Response, Handler } from 'express';
4
- import { A as ApiHandler } from './types-BH-88xJo.cjs';
4
+ import { C as CommonAdapterOptions } from './common-6DG-xEmM.cjs';
5
+ import './types-D5t0sUEw.cjs';
5
6
 
6
7
  /**
7
8
  * Express middleware options
8
9
  */
9
- interface MiddlewareOptions<Schema extends SchemaDef> {
10
- apiHandler: ApiHandler<Schema>;
10
+ interface ExpressMiddlewareOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
11
11
  /**
12
12
  * Callback for getting a ZenStackClient for the given request
13
13
  */
@@ -26,6 +26,6 @@ interface MiddlewareOptions<Schema extends SchemaDef> {
26
26
  /**
27
27
  * Creates an Express middleware for handling CRUD requests.
28
28
  */
29
- declare const factory: <Schema extends SchemaDef>(options: MiddlewareOptions<Schema>) => Handler;
29
+ declare const factory: <Schema extends SchemaDef>(options: ExpressMiddlewareOptions<Schema>) => Handler;
30
30
 
31
- export { type MiddlewareOptions, factory as ZenStackMiddleware };
31
+ export { type ExpressMiddlewareOptions, factory as ZenStackMiddleware };
package/dist/express.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import { ClientContract } from '@zenstackhq/runtime';
2
- import { SchemaDef } from '@zenstackhq/runtime/schema';
1
+ import { ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
3
  import { Request, Response, Handler } from 'express';
4
- import { A as ApiHandler } from './types-BH-88xJo.js';
4
+ import { C as CommonAdapterOptions } from './common-CyapsM8n.js';
5
+ import './types-D5t0sUEw.js';
5
6
 
6
7
  /**
7
8
  * Express middleware options
8
9
  */
9
- interface MiddlewareOptions<Schema extends SchemaDef> {
10
- apiHandler: ApiHandler<Schema>;
10
+ interface ExpressMiddlewareOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
11
11
  /**
12
12
  * Callback for getting a ZenStackClient for the given request
13
13
  */
@@ -26,6 +26,6 @@ interface MiddlewareOptions<Schema extends SchemaDef> {
26
26
  /**
27
27
  * Creates an Express middleware for handling CRUD requests.
28
28
  */
29
- declare const factory: <Schema extends SchemaDef>(options: MiddlewareOptions<Schema>) => Handler;
29
+ declare const factory: <Schema extends SchemaDef>(options: ExpressMiddlewareOptions<Schema>) => Handler;
30
30
 
31
- export { type MiddlewareOptions, factory as ZenStackMiddleware };
31
+ export { type ExpressMiddlewareOptions, factory as ZenStackMiddleware };
package/dist/express.js CHANGED
@@ -1,7 +1,34 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
- // src/express/middleware.ts
4
+ // src/api/utils.ts
5
+ import { Decimal } from "decimal.js";
6
+ import SuperJSON from "superjson";
7
+ import { match } from "ts-pattern";
8
+ import { fromError as fromError3 } from "zod-validation-error/v3";
9
+ import { fromError as fromError4 } from "zod-validation-error/v4";
10
+ function log(logger, level, message, error) {
11
+ if (!logger) {
12
+ return;
13
+ }
14
+ const getMessage = typeof message === "function" ? message : () => message;
15
+ if (typeof logger === "function") {
16
+ logger(level, getMessage(), error);
17
+ } else if (logger.includes(level)) {
18
+ const logFn = match(level).with("debug", () => console.debug).with("info", () => console.info).with("warn", () => console.warn).with("error", () => console.error).exhaustive();
19
+ logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `
20
+ ${error}` : ""}`);
21
+ }
22
+ }
23
+ __name(log, "log");
24
+
25
+ // src/adapter/common.ts
26
+ function logInternalError(logger, err) {
27
+ log(logger, "error", `An unhandled error occurred while processing the request: ${err}${err instanceof Error ? "\n" + err.stack : ""}`);
28
+ }
29
+ __name(logInternalError, "logInternalError");
30
+
31
+ // src/adapter/express/middleware.ts
5
32
  var factory = /* @__PURE__ */ __name((options) => {
6
33
  const requestHandler = options.apiHandler;
7
34
  return async (request, response, next) => {
@@ -38,8 +65,9 @@ var factory = /* @__PURE__ */ __name((options) => {
38
65
  if (sendResponse === false) {
39
66
  throw err;
40
67
  }
68
+ logInternalError(options.apiHandler.log, err);
41
69
  return response.status(500).json({
42
- message: `An unhandled error occurred: ${err}`
70
+ message: `An internal server error occurred`
43
71
  });
44
72
  }
45
73
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/express/middleware.ts"],"sourcesContent":["import type { ClientContract } from '@zenstackhq/runtime';\nimport type { SchemaDef } from '@zenstackhq/runtime/schema';\nimport type { Handler, Request, Response } from 'express';\nimport type { ApiHandler } from '../types';\n\n/**\n * Express middleware options\n */\nexport interface MiddlewareOptions<Schema extends SchemaDef> {\n apiHandler: ApiHandler<Schema>;\n\n /**\n * Callback for getting a ZenStackClient for the given request\n */\n getClient: (req: Request, res: Response) => ClientContract<Schema> | Promise<ClientContract<Schema>>;\n\n /**\n * Controls if the middleware directly sends a response. If set to false,\n * the response is stored in the `res.locals` object and then the middleware\n * calls the `next()` function to pass the control to the next middleware.\n * Subsequent middleware or request handlers need to make sure to send\n * a response.\n *\n * Defaults to true;\n */\n sendResponse?: boolean;\n}\n\n/**\n * Creates an Express middleware for handling CRUD requests.\n */\nconst factory = <Schema extends SchemaDef>(options: MiddlewareOptions<Schema>): Handler => {\n const requestHandler = options.apiHandler;\n\n return async (request, response, next) => {\n const client = await options.getClient(request, response);\n const { sendResponse } = options;\n\n if (sendResponse === false && !client) {\n throw new Error('unable to get ZenStackClient from request context');\n }\n\n if (!client) {\n return response.status(500).json({ message: 'unable to get ZenStackClient from request context' });\n }\n\n // express converts query parameters with square brackets into object\n // e.g.: filter[foo]=bar is parsed to { filter: { foo: 'bar' } }\n // we need to revert this behavior and reconstruct params from original URL\n const url = request.protocol + '://' + request.get('host') + request.originalUrl;\n const searchParams = new URL(url).searchParams;\n const query = Object.fromEntries(searchParams);\n\n try {\n const r = await requestHandler.handleRequest({\n method: request.method,\n path: request.path,\n query,\n requestBody: request.body,\n client,\n });\n if (sendResponse === false) {\n // attach response and pass control to the next middleware\n response.locals['zenstack'] = {\n status: r.status,\n body: r.body,\n };\n return next();\n }\n return response.status(r.status).json(r.body);\n } catch (err) {\n if (sendResponse === false) {\n throw err;\n }\n return response.status(500).json({ message: `An unhandled error occurred: ${err}` });\n }\n };\n};\n\nexport default factory;\n\nexport { factory as ZenStackMiddleware };\n"],"mappings":";;;;AA+BA,IAAMA,UAAU,wBAA2BC,YAAAA;AACvC,QAAMC,iBAAiBD,QAAQE;AAE/B,SAAO,OAAOC,SAASC,UAAUC,SAAAA;AAC7B,UAAMC,SAAS,MAAMN,QAAQO,UAAUJ,SAASC,QAAAA;AAChD,UAAM,EAAEI,aAAY,IAAKR;AAEzB,QAAIQ,iBAAiB,SAAS,CAACF,QAAQ;AACnC,YAAM,IAAIG,MAAM,mDAAA;IACpB;AAEA,QAAI,CAACH,QAAQ;AACT,aAAOF,SAASM,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS;MAAoD,CAAA;IACpG;AAKA,UAAMC,MAAMV,QAAQW,WAAW,QAAQX,QAAQY,IAAI,MAAA,IAAUZ,QAAQa;AACrE,UAAMC,eAAe,IAAIC,IAAIL,GAAAA,EAAKI;AAClC,UAAME,QAAQC,OAAOC,YAAYJ,YAAAA;AAEjC,QAAI;AACA,YAAMK,IAAI,MAAMrB,eAAesB,cAAc;QACzCC,QAAQrB,QAAQqB;QAChBC,MAAMtB,QAAQsB;QACdN;QACAO,aAAavB,QAAQwB;QACrBrB;MACJ,CAAA;AACA,UAAIE,iBAAiB,OAAO;AAExBJ,iBAASwB,OAAO,UAAA,IAAc;UAC1BlB,QAAQY,EAAEZ;UACViB,MAAML,EAAEK;QACZ;AACA,eAAOtB,KAAAA;MACX;AACA,aAAOD,SAASM,OAAOY,EAAEZ,MAAM,EAAEC,KAAKW,EAAEK,IAAI;IAChD,SAASE,KAAK;AACV,UAAIrB,iBAAiB,OAAO;AACxB,cAAMqB;MACV;AACA,aAAOzB,SAASM,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS,gCAAgCiB,GAAAA;MAAM,CAAA;IACtF;EACJ;AACJ,GA9CgB;","names":["factory","options","requestHandler","apiHandler","request","response","next","client","getClient","sendResponse","Error","status","json","message","url","protocol","get","originalUrl","searchParams","URL","query","Object","fromEntries","r","handleRequest","method","path","requestBody","body","locals","err"]}
1
+ {"version":3,"sources":["../src/api/utils.ts","../src/adapter/common.ts","../src/adapter/express/middleware.ts"],"sourcesContent":["import { Decimal } from 'decimal.js';\nimport SuperJSON from 'superjson';\nimport { match } from 'ts-pattern';\nimport { ZodError } from 'zod';\nimport { fromError as fromError3 } from 'zod-validation-error/v3';\nimport { fromError as fromError4 } from 'zod-validation-error/v4';\nimport type { LogConfig, LogLevel } from '../types';\n\nexport function log(logger: LogConfig | undefined, level: LogLevel, message: string | (() => string), error?: unknown) {\n if (!logger) {\n return;\n }\n\n const getMessage = typeof message === 'function' ? message : () => message;\n\n if (typeof logger === 'function') {\n logger(level, getMessage(), error);\n } else if (logger.includes(level)) {\n const logFn = match(level)\n .with('debug', () => console.debug)\n .with('info', () => console.info)\n .with('warn', () => console.warn)\n .with('error', () => console.error)\n .exhaustive();\n logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `\\n${error}` : ''}`);\n }\n}\n\n/**\n * Registers custom superjson serializers.\n */\nexport function registerCustomSerializers() {\n SuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal => Decimal.isDecimal(v),\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal',\n );\n\n // `Buffer` is not available in edge runtime\n if (globalThis.Buffer) {\n SuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes',\n );\n }\n}\n\n/**\n * Format ZodError into a readable string\n */\nexport function getZodErrorMessage(error: ZodError): string {\n if ('_zod' in error) {\n return fromError4(error).toString();\n } else {\n return fromError3(error).toString();\n }\n}\n","import type { SchemaDef } from '@zenstackhq/orm/schema';\nimport { log } from '../api/utils';\nimport type { ApiHandler, LogConfig } from '../types';\n\n/**\n * Options common to all adapters\n */\nexport interface CommonAdapterOptions<Schema extends SchemaDef> {\n /**\n * The API handler to process requests\n */\n apiHandler: ApiHandler<Schema>;\n}\n\nexport function logInternalError(logger: LogConfig | undefined, err: unknown) {\n log(\n logger,\n 'error',\n `An unhandled error occurred while processing the request: ${err}${err instanceof Error ? '\\n' + err.stack : ''}`,\n );\n}\n","import type { ClientContract } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport type { Handler, Request, Response } from 'express';\nimport { logInternalError, type CommonAdapterOptions } from '../common';\n\n/**\n * Express middleware options\n */\nexport interface ExpressMiddlewareOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {\n /**\n * Callback for getting a ZenStackClient for the given request\n */\n getClient: (req: Request, res: Response) => ClientContract<Schema> | Promise<ClientContract<Schema>>;\n\n /**\n * Controls if the middleware directly sends a response. If set to false,\n * the response is stored in the `res.locals` object and then the middleware\n * calls the `next()` function to pass the control to the next middleware.\n * Subsequent middleware or request handlers need to make sure to send\n * a response.\n *\n * Defaults to true;\n */\n sendResponse?: boolean;\n}\n\n/**\n * Creates an Express middleware for handling CRUD requests.\n */\nconst factory = <Schema extends SchemaDef>(options: ExpressMiddlewareOptions<Schema>): Handler => {\n const requestHandler = options.apiHandler;\n\n return async (request, response, next) => {\n const client = await options.getClient(request, response);\n const { sendResponse } = options;\n\n if (sendResponse === false && !client) {\n throw new Error('unable to get ZenStackClient from request context');\n }\n\n if (!client) {\n return response.status(500).json({ message: 'unable to get ZenStackClient from request context' });\n }\n\n // express converts query parameters with square brackets into object\n // e.g.: filter[foo]=bar is parsed to { filter: { foo: 'bar' } }\n // we need to revert this behavior and reconstruct params from original URL\n const url = request.protocol + '://' + request.get('host') + request.originalUrl;\n const searchParams = new URL(url).searchParams;\n const query = Object.fromEntries(searchParams);\n\n try {\n const r = await requestHandler.handleRequest({\n method: request.method,\n path: request.path,\n query,\n requestBody: request.body,\n client,\n });\n if (sendResponse === false) {\n // attach response and pass control to the next middleware\n response.locals['zenstack'] = {\n status: r.status,\n body: r.body,\n };\n return next();\n }\n return response.status(r.status).json(r.body);\n } catch (err) {\n if (sendResponse === false) {\n throw err;\n }\n logInternalError(options.apiHandler.log, err);\n return response.status(500).json({ message: `An internal server error occurred` });\n }\n };\n};\n\nexport default factory;\n\nexport { factory as ZenStackMiddleware };\n"],"mappings":";;;;AAAA,SAASA,eAAe;AACxB,OAAOC,eAAe;AACtB,SAASC,aAAa;AAEtB,SAASC,aAAaC,kBAAkB;AACxC,SAASD,aAAaE,kBAAkB;AAGjC,SAASC,IAAIC,QAA+BC,OAAiBC,SAAkCC,OAAe;AACjH,MAAI,CAACH,QAAQ;AACT;EACJ;AAEA,QAAMI,aAAa,OAAOF,YAAY,aAAaA,UAAU,MAAMA;AAEnE,MAAI,OAAOF,WAAW,YAAY;AAC9BA,WAAOC,OAAOG,WAAAA,GAAcD,KAAAA;EAChC,WAAWH,OAAOK,SAASJ,KAAAA,GAAQ;AAC/B,UAAMK,QAAQC,MAAMN,KAAAA,EACfO,KAAK,SAAS,MAAMC,QAAQC,KAAK,EACjCF,KAAK,QAAQ,MAAMC,QAAQE,IAAI,EAC/BH,KAAK,QAAQ,MAAMC,QAAQG,IAAI,EAC/BJ,KAAK,SAAS,MAAMC,QAAQN,KAAK,EACjCU,WAAU;AACfP,UAAM,wBAAwBL,KAAAA,KAAUG,WAAAA,CAAAA,GAAeD,QAAQ;EAAKA,KAAAA,KAAU,EAAA,EAAI;EACtF;AACJ;AAlBgBJ;;;ACMT,SAASe,iBAAiBC,QAA+BC,KAAY;AACxEC,MACIF,QACA,SACA,6DAA6DC,GAAAA,GAAMA,eAAeE,QAAQ,OAAOF,IAAIG,QAAQ,EAAA,EAAI;AAEzH;AANgBL;;;ACehB,IAAMM,UAAU,wBAA2BC,YAAAA;AACvC,QAAMC,iBAAiBD,QAAQE;AAE/B,SAAO,OAAOC,SAASC,UAAUC,SAAAA;AAC7B,UAAMC,SAAS,MAAMN,QAAQO,UAAUJ,SAASC,QAAAA;AAChD,UAAM,EAAEI,aAAY,IAAKR;AAEzB,QAAIQ,iBAAiB,SAAS,CAACF,QAAQ;AACnC,YAAM,IAAIG,MAAM,mDAAA;IACpB;AAEA,QAAI,CAACH,QAAQ;AACT,aAAOF,SAASM,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS;MAAoD,CAAA;IACpG;AAKA,UAAMC,MAAMV,QAAQW,WAAW,QAAQX,QAAQY,IAAI,MAAA,IAAUZ,QAAQa;AACrE,UAAMC,eAAe,IAAIC,IAAIL,GAAAA,EAAKI;AAClC,UAAME,QAAQC,OAAOC,YAAYJ,YAAAA;AAEjC,QAAI;AACA,YAAMK,IAAI,MAAMrB,eAAesB,cAAc;QACzCC,QAAQrB,QAAQqB;QAChBC,MAAMtB,QAAQsB;QACdN;QACAO,aAAavB,QAAQwB;QACrBrB;MACJ,CAAA;AACA,UAAIE,iBAAiB,OAAO;AAExBJ,iBAASwB,OAAO,UAAA,IAAc;UAC1BlB,QAAQY,EAAEZ;UACViB,MAAML,EAAEK;QACZ;AACA,eAAOtB,KAAAA;MACX;AACA,aAAOD,SAASM,OAAOY,EAAEZ,MAAM,EAAEC,KAAKW,EAAEK,IAAI;IAChD,SAASE,KAAK;AACV,UAAIrB,iBAAiB,OAAO;AACxB,cAAMqB;MACV;AACAC,uBAAiB9B,QAAQE,WAAW6B,KAAKF,GAAAA;AACzC,aAAOzB,SAASM,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS;MAAoC,CAAA;IACpF;EACJ;AACJ,GA/CgB;","names":["Decimal","SuperJSON","match","fromError","fromError3","fromError4","log","logger","level","message","error","getMessage","includes","logFn","match","with","console","debug","info","warn","exhaustive","logInternalError","logger","err","log","Error","stack","factory","options","requestHandler","apiHandler","request","response","next","client","getClient","sendResponse","Error","status","json","message","url","protocol","get","originalUrl","searchParams","URL","query","Object","fromEntries","r","handleRequest","method","path","requestBody","body","locals","err","logInternalError","log"]}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ // src/adapter/fastify/index.ts
32
+ var fastify_exports = {};
33
+ __export(fastify_exports, {
34
+ ZenStackFastifyPlugin: () => plugin
35
+ });
36
+ module.exports = __toCommonJS(fastify_exports);
37
+
38
+ // src/adapter/fastify/plugin.ts
39
+ var import_fastify_plugin = __toESM(require("fastify-plugin"), 1);
40
+
41
+ // src/api/utils.ts
42
+ var import_decimal = require("decimal.js");
43
+ var import_superjson = __toESM(require("superjson"), 1);
44
+ var import_ts_pattern = require("ts-pattern");
45
+ var import_v3 = require("zod-validation-error/v3");
46
+ var import_v4 = require("zod-validation-error/v4");
47
+ function log(logger, level, message, error) {
48
+ if (!logger) {
49
+ return;
50
+ }
51
+ const getMessage = typeof message === "function" ? message : () => message;
52
+ if (typeof logger === "function") {
53
+ logger(level, getMessage(), error);
54
+ } else if (logger.includes(level)) {
55
+ const logFn = (0, import_ts_pattern.match)(level).with("debug", () => console.debug).with("info", () => console.info).with("warn", () => console.warn).with("error", () => console.error).exhaustive();
56
+ logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `
57
+ ${error}` : ""}`);
58
+ }
59
+ }
60
+ __name(log, "log");
61
+
62
+ // src/adapter/common.ts
63
+ function logInternalError(logger, err) {
64
+ log(logger, "error", `An unhandled error occurred while processing the request: ${err}${err instanceof Error ? "\n" + err.stack : ""}`);
65
+ }
66
+ __name(logInternalError, "logInternalError");
67
+
68
+ // src/adapter/fastify/plugin.ts
69
+ var pluginHandler = /* @__PURE__ */ __name((fastify, options, done) => {
70
+ const prefix = options.prefix ?? "";
71
+ fastify.all(`${prefix}/*`, async (request, reply) => {
72
+ const client = await options.getClient(request, reply);
73
+ if (!client) {
74
+ reply.status(500).send({
75
+ message: "unable to get ZenStackClient from request context"
76
+ });
77
+ return reply;
78
+ }
79
+ try {
80
+ const response = await options.apiHandler.handleRequest({
81
+ method: request.method,
82
+ path: request.params["*"],
83
+ query: request.query,
84
+ requestBody: request.body,
85
+ client
86
+ });
87
+ reply.status(response.status).send(response.body);
88
+ } catch (err) {
89
+ logInternalError(options.apiHandler.log, err);
90
+ reply.status(500).send({
91
+ message: `An internal server error occurred`
92
+ });
93
+ }
94
+ return reply;
95
+ });
96
+ done();
97
+ }, "pluginHandler");
98
+ var plugin = (0, import_fastify_plugin.default)(pluginHandler);
99
+ // Annotate the CommonJS export names for ESM import in node:
100
+ 0 && (module.exports = {
101
+ ZenStackFastifyPlugin
102
+ });
103
+ //# sourceMappingURL=fastify.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapter/fastify/index.ts","../src/adapter/fastify/plugin.ts","../src/api/utils.ts","../src/adapter/common.ts"],"sourcesContent":["export { ZenStackFastifyPlugin, type FastifyPluginOptions } from './plugin';\n","import type { ClientContract } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport type { FastifyPluginCallback, FastifyReply, FastifyRequest } from 'fastify';\nimport fp from 'fastify-plugin';\nimport { logInternalError, type CommonAdapterOptions } from '../common';\n\n/**\n * Fastify plugin options\n */\nexport interface FastifyPluginOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {\n /**\n * Url prefix, e.g.: /api\n */\n prefix: string;\n\n /**\n * Callback for getting a ZenStackClient for the given request\n */\n getClient: (\n request: FastifyRequest,\n reply: FastifyReply,\n ) => ClientContract<Schema> | Promise<ClientContract<Schema>>;\n}\n\n/**\n * Fastify plugin for handling CRUD requests.\n */\nconst pluginHandler: FastifyPluginCallback<FastifyPluginOptions<SchemaDef>> = (fastify, options, done) => {\n const prefix = options.prefix ?? '';\n\n fastify.all(`${prefix}/*`, async (request, reply) => {\n const client = await options.getClient(request, reply);\n if (!client) {\n reply.status(500).send({ message: 'unable to get ZenStackClient from request context' });\n return reply;\n }\n\n try {\n const response = await options.apiHandler.handleRequest({\n method: request.method,\n path: (request.params as any)['*'],\n query: request.query as Record<string, string | string[]>,\n requestBody: request.body,\n client,\n });\n reply.status(response.status).send(response.body);\n } catch (err) {\n logInternalError(options.apiHandler.log, err);\n reply.status(500).send({ message: `An internal server error occurred` });\n }\n\n return reply;\n });\n\n done();\n};\n\nconst plugin = fp(pluginHandler);\n\nexport { plugin as ZenStackFastifyPlugin };\n","import { Decimal } from 'decimal.js';\nimport SuperJSON from 'superjson';\nimport { match } from 'ts-pattern';\nimport { ZodError } from 'zod';\nimport { fromError as fromError3 } from 'zod-validation-error/v3';\nimport { fromError as fromError4 } from 'zod-validation-error/v4';\nimport type { LogConfig, LogLevel } from '../types';\n\nexport function log(logger: LogConfig | undefined, level: LogLevel, message: string | (() => string), error?: unknown) {\n if (!logger) {\n return;\n }\n\n const getMessage = typeof message === 'function' ? message : () => message;\n\n if (typeof logger === 'function') {\n logger(level, getMessage(), error);\n } else if (logger.includes(level)) {\n const logFn = match(level)\n .with('debug', () => console.debug)\n .with('info', () => console.info)\n .with('warn', () => console.warn)\n .with('error', () => console.error)\n .exhaustive();\n logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `\\n${error}` : ''}`);\n }\n}\n\n/**\n * Registers custom superjson serializers.\n */\nexport function registerCustomSerializers() {\n SuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal => Decimal.isDecimal(v),\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal',\n );\n\n // `Buffer` is not available in edge runtime\n if (globalThis.Buffer) {\n SuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes',\n );\n }\n}\n\n/**\n * Format ZodError into a readable string\n */\nexport function getZodErrorMessage(error: ZodError): string {\n if ('_zod' in error) {\n return fromError4(error).toString();\n } else {\n return fromError3(error).toString();\n }\n}\n","import type { SchemaDef } from '@zenstackhq/orm/schema';\nimport { log } from '../api/utils';\nimport type { ApiHandler, LogConfig } from '../types';\n\n/**\n * Options common to all adapters\n */\nexport interface CommonAdapterOptions<Schema extends SchemaDef> {\n /**\n * The API handler to process requests\n */\n apiHandler: ApiHandler<Schema>;\n}\n\nexport function logInternalError(logger: LogConfig | undefined, err: unknown) {\n log(\n logger,\n 'error',\n `An unhandled error occurred while processing the request: ${err}${err instanceof Error ? '\\n' + err.stack : ''}`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACGA,4BAAe;;;ACHf,qBAAwB;AACxB,uBAAsB;AACtB,wBAAsB;AAEtB,gBAAwC;AACxC,gBAAwC;AAGjC,SAASA,IAAIC,QAA+BC,OAAiBC,SAAkCC,OAAe;AACjH,MAAI,CAACH,QAAQ;AACT;EACJ;AAEA,QAAMI,aAAa,OAAOF,YAAY,aAAaA,UAAU,MAAMA;AAEnE,MAAI,OAAOF,WAAW,YAAY;AAC9BA,WAAOC,OAAOG,WAAAA,GAAcD,KAAAA;EAChC,WAAWH,OAAOK,SAASJ,KAAAA,GAAQ;AAC/B,UAAMK,YAAQC,yBAAMN,KAAAA,EACfO,KAAK,SAAS,MAAMC,QAAQC,KAAK,EACjCF,KAAK,QAAQ,MAAMC,QAAQE,IAAI,EAC/BH,KAAK,QAAQ,MAAMC,QAAQG,IAAI,EAC/BJ,KAAK,SAAS,MAAMC,QAAQN,KAAK,EACjCU,WAAU;AACfP,UAAM,wBAAwBL,KAAAA,KAAUG,WAAAA,CAAAA,GAAeD,QAAQ;EAAKA,KAAAA,KAAU,EAAA,EAAI;EACtF;AACJ;AAlBgBJ;;;ACMT,SAASe,iBAAiBC,QAA+BC,KAAY;AACxEC,MACIF,QACA,SACA,6DAA6DC,GAAAA,GAAMA,eAAeE,QAAQ,OAAOF,IAAIG,QAAQ,EAAA,EAAI;AAEzH;AANgBL;;;AFahB,IAAMM,gBAAwE,wBAACC,SAASC,SAASC,SAAAA;AAC7F,QAAMC,SAASF,QAAQE,UAAU;AAEjCH,UAAQI,IAAI,GAAGD,MAAAA,MAAY,OAAOE,SAASC,UAAAA;AACvC,UAAMC,SAAS,MAAMN,QAAQO,UAAUH,SAASC,KAAAA;AAChD,QAAI,CAACC,QAAQ;AACTD,YAAMG,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS;MAAoD,CAAA;AACtF,aAAOL;IACX;AAEA,QAAI;AACA,YAAMM,WAAW,MAAMX,QAAQY,WAAWC,cAAc;QACpDC,QAAQV,QAAQU;QAChBC,MAAOX,QAAQY,OAAe,GAAA;QAC9BC,OAAOb,QAAQa;QACfC,aAAad,QAAQe;QACrBb;MACJ,CAAA;AACAD,YAAMG,OAAOG,SAASH,MAAM,EAAEC,KAAKE,SAASQ,IAAI;IACpD,SAASC,KAAK;AACVC,uBAAiBrB,QAAQY,WAAWU,KAAKF,GAAAA;AACzCf,YAAMG,OAAO,GAAA,EAAKC,KAAK;QAAEC,SAAS;MAAoC,CAAA;IAC1E;AAEA,WAAOL;EACX,CAAA;AAEAJ,OAAAA;AACJ,GA5B8E;AA8B9E,IAAMsB,aAASC,sBAAAA,SAAG1B,aAAAA;","names":["log","logger","level","message","error","getMessage","includes","logFn","match","with","console","debug","info","warn","exhaustive","logInternalError","logger","err","log","Error","stack","pluginHandler","fastify","options","done","prefix","all","request","reply","client","getClient","status","send","message","response","apiHandler","handleRequest","method","path","params","query","requestBody","body","err","logInternalError","log","plugin","fp"]}
@@ -0,0 +1,22 @@
1
+ import { ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
+ import { FastifyPluginCallback, FastifyRequest, FastifyReply } from 'fastify';
4
+ import { C as CommonAdapterOptions } from './common-6DG-xEmM.cjs';
5
+ import './types-D5t0sUEw.cjs';
6
+
7
+ /**
8
+ * Fastify plugin options
9
+ */
10
+ interface FastifyPluginOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
11
+ /**
12
+ * Url prefix, e.g.: /api
13
+ */
14
+ prefix: string;
15
+ /**
16
+ * Callback for getting a ZenStackClient for the given request
17
+ */
18
+ getClient: (request: FastifyRequest, reply: FastifyReply) => ClientContract<Schema> | Promise<ClientContract<Schema>>;
19
+ }
20
+ declare const plugin: FastifyPluginCallback<FastifyPluginOptions<SchemaDef>>;
21
+
22
+ export { type FastifyPluginOptions, plugin as ZenStackFastifyPlugin };
@@ -0,0 +1,22 @@
1
+ import { ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
+ import { FastifyPluginCallback, FastifyRequest, FastifyReply } from 'fastify';
4
+ import { C as CommonAdapterOptions } from './common-CyapsM8n.js';
5
+ import './types-D5t0sUEw.js';
6
+
7
+ /**
8
+ * Fastify plugin options
9
+ */
10
+ interface FastifyPluginOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
11
+ /**
12
+ * Url prefix, e.g.: /api
13
+ */
14
+ prefix: string;
15
+ /**
16
+ * Callback for getting a ZenStackClient for the given request
17
+ */
18
+ getClient: (request: FastifyRequest, reply: FastifyReply) => ClientContract<Schema> | Promise<ClientContract<Schema>>;
19
+ }
20
+ declare const plugin: FastifyPluginCallback<FastifyPluginOptions<SchemaDef>>;
21
+
22
+ export { type FastifyPluginOptions, plugin as ZenStackFastifyPlugin };
@@ -0,0 +1,68 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/adapter/fastify/plugin.ts
5
+ import fp from "fastify-plugin";
6
+
7
+ // src/api/utils.ts
8
+ import { Decimal } from "decimal.js";
9
+ import SuperJSON from "superjson";
10
+ import { match } from "ts-pattern";
11
+ import { fromError as fromError3 } from "zod-validation-error/v3";
12
+ import { fromError as fromError4 } from "zod-validation-error/v4";
13
+ function log(logger, level, message, error) {
14
+ if (!logger) {
15
+ return;
16
+ }
17
+ const getMessage = typeof message === "function" ? message : () => message;
18
+ if (typeof logger === "function") {
19
+ logger(level, getMessage(), error);
20
+ } else if (logger.includes(level)) {
21
+ const logFn = match(level).with("debug", () => console.debug).with("info", () => console.info).with("warn", () => console.warn).with("error", () => console.error).exhaustive();
22
+ logFn(`@zenstackhq/server: [${level}] ${getMessage()}${error ? `
23
+ ${error}` : ""}`);
24
+ }
25
+ }
26
+ __name(log, "log");
27
+
28
+ // src/adapter/common.ts
29
+ function logInternalError(logger, err) {
30
+ log(logger, "error", `An unhandled error occurred while processing the request: ${err}${err instanceof Error ? "\n" + err.stack : ""}`);
31
+ }
32
+ __name(logInternalError, "logInternalError");
33
+
34
+ // src/adapter/fastify/plugin.ts
35
+ var pluginHandler = /* @__PURE__ */ __name((fastify, options, done) => {
36
+ const prefix = options.prefix ?? "";
37
+ fastify.all(`${prefix}/*`, async (request, reply) => {
38
+ const client = await options.getClient(request, reply);
39
+ if (!client) {
40
+ reply.status(500).send({
41
+ message: "unable to get ZenStackClient from request context"
42
+ });
43
+ return reply;
44
+ }
45
+ try {
46
+ const response = await options.apiHandler.handleRequest({
47
+ method: request.method,
48
+ path: request.params["*"],
49
+ query: request.query,
50
+ requestBody: request.body,
51
+ client
52
+ });
53
+ reply.status(response.status).send(response.body);
54
+ } catch (err) {
55
+ logInternalError(options.apiHandler.log, err);
56
+ reply.status(500).send({
57
+ message: `An internal server error occurred`
58
+ });
59
+ }
60
+ return reply;
61
+ });
62
+ done();
63
+ }, "pluginHandler");
64
+ var plugin = fp(pluginHandler);
65
+ export {
66
+ plugin as ZenStackFastifyPlugin
67
+ };
68
+ //# sourceMappingURL=fastify.js.map