@zenstackhq/server 3.0.0-beta.13 → 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 @@
1
+ {"version":3,"sources":["../src/adapter/fastify/plugin.ts","../src/api/utils.ts","../src/adapter/common.ts"],"sourcesContent":["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":";;;;AAGA,OAAOA,QAAQ;;;ACHf,SAASC,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;;;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,SAASC,GAAG1B,aAAAA;","names":["fp","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","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"]}
package/dist/hono.cjs ADDED
@@ -0,0 +1,111 @@
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/hono/index.ts
32
+ var hono_exports = {};
33
+ __export(hono_exports, {
34
+ createHonoHandler: () => createHonoHandler
35
+ });
36
+ module.exports = __toCommonJS(hono_exports);
37
+
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/hono/handler.ts
66
+ function createHonoHandler(options) {
67
+ return async (ctx) => {
68
+ const client = await options.getClient(ctx);
69
+ if (!client) {
70
+ return ctx.json({
71
+ message: "unable to get ZenStackClient from request context"
72
+ }, 500);
73
+ }
74
+ const url = new URL(ctx.req.url);
75
+ const query = Object.fromEntries(url.searchParams);
76
+ const path = ctx.req.path.substring(ctx.req.routePath.length - 1);
77
+ if (!path) {
78
+ return ctx.json({
79
+ message: "missing path parameter"
80
+ }, 400);
81
+ }
82
+ let requestBody;
83
+ if (ctx.req.raw.body) {
84
+ try {
85
+ requestBody = await ctx.req.json();
86
+ } catch {
87
+ }
88
+ }
89
+ try {
90
+ const r = await options.apiHandler.handleRequest({
91
+ method: ctx.req.method,
92
+ path,
93
+ query,
94
+ requestBody,
95
+ client
96
+ });
97
+ return ctx.json(r.body, r.status);
98
+ } catch (err) {
99
+ logInternalError(options.apiHandler.log, err);
100
+ return ctx.json({
101
+ message: `An internal server error occurred`
102
+ }, 500);
103
+ }
104
+ };
105
+ }
106
+ __name(createHonoHandler, "createHonoHandler");
107
+ // Annotate the CommonJS export names for ESM import in node:
108
+ 0 && (module.exports = {
109
+ createHonoHandler
110
+ });
111
+ //# sourceMappingURL=hono.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapter/hono/index.ts","../src/api/utils.ts","../src/adapter/common.ts","../src/adapter/hono/handler.ts"],"sourcesContent":["export { createHonoHandler, type HonoOptions } from './handler';\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 { Context, MiddlewareHandler } from 'hono';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { logInternalError, type CommonAdapterOptions } from '../common';\n\n/**\n * Options for initializing a Hono middleware.\n */\nexport interface HonoOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {\n /**\n * Callback method for getting a ZenStackClient instance for the given request.\n */\n getClient: (ctx: Context) => Promise<ClientContract<Schema>> | ClientContract<Schema>;\n}\n\nexport function createHonoHandler<Schema extends SchemaDef>(options: HonoOptions<Schema>): MiddlewareHandler {\n return async (ctx) => {\n const client = await options.getClient(ctx);\n if (!client) {\n return ctx.json({ message: 'unable to get ZenStackClient from request context' }, 500);\n }\n\n const url = new URL(ctx.req.url);\n const query = Object.fromEntries(url.searchParams);\n\n const path = ctx.req.path.substring(ctx.req.routePath.length - 1);\n if (!path) {\n return ctx.json({ message: 'missing path parameter' }, 400);\n }\n\n let requestBody: unknown;\n if (ctx.req.raw.body) {\n try {\n requestBody = await ctx.req.json();\n } catch {\n // noop\n }\n }\n\n try {\n const r = await options.apiHandler.handleRequest({\n method: ctx.req.method,\n path,\n query,\n requestBody,\n client,\n });\n return ctx.json(r.body as object, r.status as ContentfulStatusCode);\n } catch (err) {\n logInternalError(options.apiHandler.log, err);\n return ctx.json({ message: `An internal server error occurred` }, 500);\n }\n };\n}\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;;;ACET,SAASM,kBAA4CC,SAA4B;AACpF,SAAO,OAAOC,QAAAA;AACV,UAAMC,SAAS,MAAMF,QAAQG,UAAUF,GAAAA;AACvC,QAAI,CAACC,QAAQ;AACT,aAAOD,IAAIG,KAAK;QAAEC,SAAS;MAAoD,GAAG,GAAA;IACtF;AAEA,UAAMC,MAAM,IAAIC,IAAIN,IAAIO,IAAIF,GAAG;AAC/B,UAAMG,QAAQC,OAAOC,YAAYL,IAAIM,YAAY;AAEjD,UAAMC,OAAOZ,IAAIO,IAAIK,KAAKC,UAAUb,IAAIO,IAAIO,UAAUC,SAAS,CAAA;AAC/D,QAAI,CAACH,MAAM;AACP,aAAOZ,IAAIG,KAAK;QAAEC,SAAS;MAAyB,GAAG,GAAA;IAC3D;AAEA,QAAIY;AACJ,QAAIhB,IAAIO,IAAIU,IAAIC,MAAM;AAClB,UAAI;AACAF,sBAAc,MAAMhB,IAAIO,IAAIJ,KAAI;MACpC,QAAQ;MAER;IACJ;AAEA,QAAI;AACA,YAAMgB,IAAI,MAAMpB,QAAQqB,WAAWC,cAAc;QAC7CC,QAAQtB,IAAIO,IAAIe;QAChBV;QACAJ;QACAQ;QACAf;MACJ,CAAA;AACA,aAAOD,IAAIG,KAAKgB,EAAED,MAAgBC,EAAEI,MAAM;IAC9C,SAASC,KAAK;AACVC,uBAAiB1B,QAAQqB,WAAWM,KAAKF,GAAAA;AACzC,aAAOxB,IAAIG,KAAK;QAAEC,SAAS;MAAoC,GAAG,GAAA;IACtE;EACJ;AACJ;AAtCgBN;","names":["log","logger","level","message","error","getMessage","includes","logFn","match","with","console","debug","info","warn","exhaustive","logInternalError","logger","err","log","Error","stack","createHonoHandler","options","ctx","client","getClient","json","message","url","URL","req","query","Object","fromEntries","searchParams","path","substring","routePath","length","requestBody","raw","body","r","apiHandler","handleRequest","method","status","err","logInternalError","log"]}
@@ -0,0 +1,18 @@
1
+ import { ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
+ import { Context, MiddlewareHandler } from 'hono';
4
+ import { C as CommonAdapterOptions } from './common-6DG-xEmM.cjs';
5
+ import './types-D5t0sUEw.cjs';
6
+
7
+ /**
8
+ * Options for initializing a Hono middleware.
9
+ */
10
+ interface HonoOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
11
+ /**
12
+ * Callback method for getting a ZenStackClient instance for the given request.
13
+ */
14
+ getClient: (ctx: Context) => Promise<ClientContract<Schema>> | ClientContract<Schema>;
15
+ }
16
+ declare function createHonoHandler<Schema extends SchemaDef>(options: HonoOptions<Schema>): MiddlewareHandler;
17
+
18
+ export { type HonoOptions, createHonoHandler };
package/dist/hono.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
+ import { Context, MiddlewareHandler } from 'hono';
4
+ import { C as CommonAdapterOptions } from './common-CyapsM8n.js';
5
+ import './types-D5t0sUEw.js';
6
+
7
+ /**
8
+ * Options for initializing a Hono middleware.
9
+ */
10
+ interface HonoOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
11
+ /**
12
+ * Callback method for getting a ZenStackClient instance for the given request.
13
+ */
14
+ getClient: (ctx: Context) => Promise<ClientContract<Schema>> | ClientContract<Schema>;
15
+ }
16
+ declare function createHonoHandler<Schema extends SchemaDef>(options: HonoOptions<Schema>): MiddlewareHandler;
17
+
18
+ export { type HonoOptions, createHonoHandler };
package/dist/hono.js ADDED
@@ -0,0 +1,76 @@
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/hono/handler.ts
32
+ function createHonoHandler(options) {
33
+ return async (ctx) => {
34
+ const client = await options.getClient(ctx);
35
+ if (!client) {
36
+ return ctx.json({
37
+ message: "unable to get ZenStackClient from request context"
38
+ }, 500);
39
+ }
40
+ const url = new URL(ctx.req.url);
41
+ const query = Object.fromEntries(url.searchParams);
42
+ const path = ctx.req.path.substring(ctx.req.routePath.length - 1);
43
+ if (!path) {
44
+ return ctx.json({
45
+ message: "missing path parameter"
46
+ }, 400);
47
+ }
48
+ let requestBody;
49
+ if (ctx.req.raw.body) {
50
+ try {
51
+ requestBody = await ctx.req.json();
52
+ } catch {
53
+ }
54
+ }
55
+ try {
56
+ const r = await options.apiHandler.handleRequest({
57
+ method: ctx.req.method,
58
+ path,
59
+ query,
60
+ requestBody,
61
+ client
62
+ });
63
+ return ctx.json(r.body, r.status);
64
+ } catch (err) {
65
+ logInternalError(options.apiHandler.log, err);
66
+ return ctx.json({
67
+ message: `An internal server error occurred`
68
+ }, 500);
69
+ }
70
+ };
71
+ }
72
+ __name(createHonoHandler, "createHonoHandler");
73
+ export {
74
+ createHonoHandler
75
+ };
76
+ //# sourceMappingURL=hono.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/utils.ts","../src/adapter/common.ts","../src/adapter/hono/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 type { Context, MiddlewareHandler } from 'hono';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { logInternalError, type CommonAdapterOptions } from '../common';\n\n/**\n * Options for initializing a Hono middleware.\n */\nexport interface HonoOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {\n /**\n * Callback method for getting a ZenStackClient instance for the given request.\n */\n getClient: (ctx: Context) => Promise<ClientContract<Schema>> | ClientContract<Schema>;\n}\n\nexport function createHonoHandler<Schema extends SchemaDef>(options: HonoOptions<Schema>): MiddlewareHandler {\n return async (ctx) => {\n const client = await options.getClient(ctx);\n if (!client) {\n return ctx.json({ message: 'unable to get ZenStackClient from request context' }, 500);\n }\n\n const url = new URL(ctx.req.url);\n const query = Object.fromEntries(url.searchParams);\n\n const path = ctx.req.path.substring(ctx.req.routePath.length - 1);\n if (!path) {\n return ctx.json({ message: 'missing path parameter' }, 400);\n }\n\n let requestBody: unknown;\n if (ctx.req.raw.body) {\n try {\n requestBody = await ctx.req.json();\n } catch {\n // noop\n }\n }\n\n try {\n const r = await options.apiHandler.handleRequest({\n method: ctx.req.method,\n path,\n query,\n requestBody,\n client,\n });\n return ctx.json(r.body as object, r.status as ContentfulStatusCode);\n } catch (err) {\n logInternalError(options.apiHandler.log, err);\n return ctx.json({ message: `An internal server error occurred` }, 500);\n }\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;;;ACET,SAASM,kBAA4CC,SAA4B;AACpF,SAAO,OAAOC,QAAAA;AACV,UAAMC,SAAS,MAAMF,QAAQG,UAAUF,GAAAA;AACvC,QAAI,CAACC,QAAQ;AACT,aAAOD,IAAIG,KAAK;QAAEC,SAAS;MAAoD,GAAG,GAAA;IACtF;AAEA,UAAMC,MAAM,IAAIC,IAAIN,IAAIO,IAAIF,GAAG;AAC/B,UAAMG,QAAQC,OAAOC,YAAYL,IAAIM,YAAY;AAEjD,UAAMC,OAAOZ,IAAIO,IAAIK,KAAKC,UAAUb,IAAIO,IAAIO,UAAUC,SAAS,CAAA;AAC/D,QAAI,CAACH,MAAM;AACP,aAAOZ,IAAIG,KAAK;QAAEC,SAAS;MAAyB,GAAG,GAAA;IAC3D;AAEA,QAAIY;AACJ,QAAIhB,IAAIO,IAAIU,IAAIC,MAAM;AAClB,UAAI;AACAF,sBAAc,MAAMhB,IAAIO,IAAIJ,KAAI;MACpC,QAAQ;MAER;IACJ;AAEA,QAAI;AACA,YAAMgB,IAAI,MAAMpB,QAAQqB,WAAWC,cAAc;QAC7CC,QAAQtB,IAAIO,IAAIe;QAChBV;QACAJ;QACAQ;QACAf;MACJ,CAAA;AACA,aAAOD,IAAIG,KAAKgB,EAAED,MAAgBC,EAAEI,MAAM;IAC9C,SAASC,KAAK;AACVC,uBAAiB1B,QAAQqB,WAAWM,KAAKF,GAAAA;AACzC,aAAOxB,IAAIG,KAAK;QAAEC,SAAS;MAAoC,GAAG,GAAA;IACtE;EACJ;AACJ;AAtCgBN;","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","createHonoHandler","options","ctx","client","getClient","json","message","url","URL","req","query","Object","fromEntries","searchParams","path","substring","routePath","length","requestBody","raw","body","r","apiHandler","handleRequest","method","status","err","logInternalError","log"]}
package/dist/next.cjs ADDED
@@ -0,0 +1,178 @@
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/next/index.ts
32
+ var next_exports = {};
33
+ __export(next_exports, {
34
+ NextRequestHandler: () => NextRequestHandler
35
+ });
36
+ module.exports = __toCommonJS(next_exports);
37
+
38
+ // src/adapter/next/app-route-handler.ts
39
+ var import_server = require("next/server");
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/next/app-route-handler.ts
69
+ function factory(options) {
70
+ return async (req, context) => {
71
+ const client = await options.getClient(req);
72
+ if (!client) {
73
+ return import_server.NextResponse.json({
74
+ message: "unable to get ZenStackClient from request context"
75
+ }, {
76
+ status: 500
77
+ });
78
+ }
79
+ let params;
80
+ const url = new URL(req.url);
81
+ const query = Object.fromEntries(url.searchParams);
82
+ try {
83
+ params = await context.params;
84
+ } catch {
85
+ return import_server.NextResponse.json({
86
+ message: "Failed to resolve request parameters"
87
+ }, {
88
+ status: 500
89
+ });
90
+ }
91
+ if (!params.path) {
92
+ return import_server.NextResponse.json({
93
+ message: "missing path parameter"
94
+ }, {
95
+ status: 400
96
+ });
97
+ }
98
+ const path = params.path.join("/");
99
+ let requestBody;
100
+ if (req.body) {
101
+ try {
102
+ requestBody = await req.json();
103
+ } catch {
104
+ }
105
+ }
106
+ try {
107
+ const r = await options.apiHandler.handleRequest({
108
+ method: req.method,
109
+ path,
110
+ query,
111
+ requestBody,
112
+ client
113
+ });
114
+ return import_server.NextResponse.json(r.body, {
115
+ status: r.status
116
+ });
117
+ } catch (err) {
118
+ logInternalError(options.apiHandler.log, err);
119
+ return import_server.NextResponse.json({
120
+ message: "An internal server error occurred"
121
+ }, {
122
+ status: 500
123
+ });
124
+ }
125
+ };
126
+ }
127
+ __name(factory, "factory");
128
+
129
+ // src/adapter/next/pages-route-handler.ts
130
+ function factory2(options) {
131
+ return async (req, res) => {
132
+ const client = await options.getClient(req, res);
133
+ if (!client) {
134
+ res.status(500).json({
135
+ message: "unable to get ZenStackClient from request context"
136
+ });
137
+ return;
138
+ }
139
+ if (!req.query["path"]) {
140
+ res.status(400).json({
141
+ message: "missing path parameter"
142
+ });
143
+ return;
144
+ }
145
+ const path = req.query["path"].join("/");
146
+ try {
147
+ const r = await options.apiHandler.handleRequest({
148
+ method: req.method,
149
+ path,
150
+ query: req.query,
151
+ requestBody: req.body,
152
+ client
153
+ });
154
+ res.status(r.status).send(r.body);
155
+ } catch (err) {
156
+ logInternalError(options.apiHandler.log, err);
157
+ res.status(500).send({
158
+ message: "An internal server error occurred"
159
+ });
160
+ }
161
+ };
162
+ }
163
+ __name(factory2, "factory");
164
+
165
+ // src/adapter/next/index.ts
166
+ function NextRequestHandler(options) {
167
+ if (options.useAppDir === true) {
168
+ return factory(options);
169
+ } else {
170
+ return factory2(options);
171
+ }
172
+ }
173
+ __name(NextRequestHandler, "NextRequestHandler");
174
+ // Annotate the CommonJS export names for ESM import in node:
175
+ 0 && (module.exports = {
176
+ NextRequestHandler
177
+ });
178
+ //# sourceMappingURL=next.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapter/next/index.ts","../src/adapter/next/app-route-handler.ts","../src/api/utils.ts","../src/adapter/common.ts","../src/adapter/next/pages-route-handler.ts"],"sourcesContent":["import type { ClientContract } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport type { NextApiRequest, NextApiResponse } from 'next';\nimport type { NextRequest } from 'next/server';\nimport type { CommonAdapterOptions } from '../common';\nimport { default as AppRouteHandler } from './app-route-handler';\nimport { default as PagesRouteHandler } from './pages-route-handler';\n\n/**\n * Options for initializing a Next.js API endpoint request handler.\n */\nexport interface PageRouteRequestHandlerOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {\n /**\n * Callback for getting a ZenStackClient for the given request\n */\n getClient: (req: NextApiRequest, res: NextApiResponse) => ClientContract<Schema> | Promise<ClientContract<Schema>>;\n\n /**\n * Use app dir or not\n */\n useAppDir?: false | undefined;\n}\n\n/**\n * Options for initializing a Next.js 13 app dir API route handler.\n */\nexport interface AppRouteRequestHandlerOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {\n /**\n * Callback for getting a ZenStackClient for the given request.\n */\n getClient: (req: NextRequest) => ClientContract<Schema> | Promise<ClientContract<Schema>>;\n\n /**\n * Use app dir or not\n */\n useAppDir: true;\n}\n\n/**\n * Creates a Next.js API route handler.\n */\nexport function NextRequestHandler<Schema extends SchemaDef>(\n options: PageRouteRequestHandlerOptions<Schema>,\n): ReturnType<typeof PagesRouteHandler>;\nexport function NextRequestHandler<Schema extends SchemaDef>(\n options: AppRouteRequestHandlerOptions<Schema>,\n): ReturnType<typeof AppRouteHandler>;\nexport function NextRequestHandler<Schema extends SchemaDef>(\n options: PageRouteRequestHandlerOptions<Schema> | AppRouteRequestHandlerOptions<Schema>,\n) {\n if (options.useAppDir === true) {\n return AppRouteHandler(options);\n } else {\n return PagesRouteHandler(options);\n }\n}\n","import type { SchemaDef } from '@zenstackhq/orm/schema';\nimport { NextRequest, NextResponse } from 'next/server';\nimport type { AppRouteRequestHandlerOptions } from '.';\nimport { logInternalError } from '../common';\n\ntype Context = { params: Promise<{ path: string[] }> };\n\n/**\n * Creates a Next.js \"app router\" API route request handler that handles ZenStack CRUD requests.\n *\n * @param options Options for initialization\n * @returns An API route request handler\n */\nexport default function factory<Schema extends SchemaDef>(\n options: AppRouteRequestHandlerOptions<Schema>,\n): (req: NextRequest, context: Context) => Promise<NextResponse> {\n return async (req: NextRequest, context: Context) => {\n const client = await options.getClient(req);\n if (!client) {\n return NextResponse.json({ message: 'unable to get ZenStackClient from request context' }, { status: 500 });\n }\n\n let params: Awaited<Context['params']>;\n const url = new URL(req.url);\n const query = Object.fromEntries(url.searchParams);\n\n try {\n params = await context.params;\n } catch {\n return NextResponse.json({ message: 'Failed to resolve request parameters' }, { status: 500 });\n }\n\n if (!params.path) {\n return NextResponse.json(\n { message: 'missing path parameter' },\n {\n status: 400,\n },\n );\n }\n const path = params.path.join('/');\n\n let requestBody: unknown;\n if (req.body) {\n try {\n requestBody = await req.json();\n } catch {\n // noop\n }\n }\n\n try {\n const r = await options.apiHandler.handleRequest({\n method: req.method!,\n path,\n query,\n requestBody,\n client,\n });\n return NextResponse.json(r.body, { status: r.status });\n } catch (err) {\n logInternalError(options.apiHandler.log, err);\n return NextResponse.json({ message: 'An internal server error occurred' }, { status: 500 });\n }\n };\n}\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 { SchemaDef } from '@zenstackhq/orm/schema';\nimport type { NextApiRequest, NextApiResponse } from 'next';\nimport type { PageRouteRequestHandlerOptions } from '.';\nimport { logInternalError } from '../common';\n\n/**\n * Creates a Next.js API endpoint \"pages\" router request handler that handles ZenStack CRUD requests.\n *\n * @param options Options for initialization\n * @returns An API endpoint request handler\n */\nexport default function factory<Schema extends SchemaDef>(\n options: PageRouteRequestHandlerOptions<Schema>,\n): (req: NextApiRequest, res: NextApiResponse) => Promise<void> {\n return async (req: NextApiRequest, res: NextApiResponse) => {\n const client = await options.getClient(req, res);\n if (!client) {\n res.status(500).json({ message: 'unable to get ZenStackClient from request context' });\n return;\n }\n\n if (!req.query['path']) {\n res.status(400).json({ message: 'missing path parameter' });\n return;\n }\n const path = (req.query['path'] as string[]).join('/');\n\n try {\n const r = await options.apiHandler.handleRequest({\n method: req.method!,\n path,\n query: req.query as Record<string, string | string[]>,\n requestBody: req.body,\n client,\n });\n res.status(r.status).send(r.body);\n } catch (err) {\n logInternalError(options.apiHandler.log, err);\n res.status(500).send({ message: 'An internal server error occurred' });\n }\n };\n}\n"],"mappings":"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","names":["log","logger","level","message","error","getMessage","includes","logFn","match","with","console","debug","info","warn","exhaustive","logInternalError","logger","err","log","Error","stack","options","req","context","client","getClient","NextResponse","json","message","status","params","url","URL","query","Object","fromEntries","searchParams","path","join","requestBody","body","r","apiHandler","handleRequest","method","err","logInternalError","log","factory","factory","options","req","res","client","getClient","status","json","message","query","path","join","r","apiHandler","handleRequest","method","requestBody","body","send","err","logInternalError","log","NextRequestHandler","options","useAppDir","AppRouteHandler","PagesRouteHandler"]}
@@ -0,0 +1,61 @@
1
+ import { ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
+ import { NextApiRequest, NextApiResponse } from 'next';
4
+ import { NextRequest, NextResponse } from 'next/server';
5
+ import { C as CommonAdapterOptions } from './common-6DG-xEmM.cjs';
6
+ import './types-D5t0sUEw.cjs';
7
+
8
+ type Context = {
9
+ params: Promise<{
10
+ path: string[];
11
+ }>;
12
+ };
13
+ /**
14
+ * Creates a Next.js "app router" API route request handler that handles ZenStack CRUD requests.
15
+ *
16
+ * @param options Options for initialization
17
+ * @returns An API route request handler
18
+ */
19
+ declare function factory$1<Schema extends SchemaDef>(options: AppRouteRequestHandlerOptions<Schema>): (req: NextRequest, context: Context) => Promise<NextResponse>;
20
+
21
+ /**
22
+ * Creates a Next.js API endpoint "pages" router request handler that handles ZenStack CRUD requests.
23
+ *
24
+ * @param options Options for initialization
25
+ * @returns An API endpoint request handler
26
+ */
27
+ declare function factory<Schema extends SchemaDef>(options: PageRouteRequestHandlerOptions<Schema>): (req: NextApiRequest, res: NextApiResponse) => Promise<void>;
28
+
29
+ /**
30
+ * Options for initializing a Next.js API endpoint request handler.
31
+ */
32
+ interface PageRouteRequestHandlerOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
33
+ /**
34
+ * Callback for getting a ZenStackClient for the given request
35
+ */
36
+ getClient: (req: NextApiRequest, res: NextApiResponse) => ClientContract<Schema> | Promise<ClientContract<Schema>>;
37
+ /**
38
+ * Use app dir or not
39
+ */
40
+ useAppDir?: false | undefined;
41
+ }
42
+ /**
43
+ * Options for initializing a Next.js 13 app dir API route handler.
44
+ */
45
+ interface AppRouteRequestHandlerOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
46
+ /**
47
+ * Callback for getting a ZenStackClient for the given request.
48
+ */
49
+ getClient: (req: NextRequest) => ClientContract<Schema> | Promise<ClientContract<Schema>>;
50
+ /**
51
+ * Use app dir or not
52
+ */
53
+ useAppDir: true;
54
+ }
55
+ /**
56
+ * Creates a Next.js API route handler.
57
+ */
58
+ declare function NextRequestHandler<Schema extends SchemaDef>(options: PageRouteRequestHandlerOptions<Schema>): ReturnType<typeof factory>;
59
+ declare function NextRequestHandler<Schema extends SchemaDef>(options: AppRouteRequestHandlerOptions<Schema>): ReturnType<typeof factory$1>;
60
+
61
+ export { type AppRouteRequestHandlerOptions, NextRequestHandler, type PageRouteRequestHandlerOptions };
package/dist/next.d.ts ADDED
@@ -0,0 +1,61 @@
1
+ import { ClientContract } from '@zenstackhq/orm';
2
+ import { SchemaDef } from '@zenstackhq/orm/schema';
3
+ import { NextApiRequest, NextApiResponse } from 'next';
4
+ import { NextRequest, NextResponse } from 'next/server';
5
+ import { C as CommonAdapterOptions } from './common-CyapsM8n.js';
6
+ import './types-D5t0sUEw.js';
7
+
8
+ type Context = {
9
+ params: Promise<{
10
+ path: string[];
11
+ }>;
12
+ };
13
+ /**
14
+ * Creates a Next.js "app router" API route request handler that handles ZenStack CRUD requests.
15
+ *
16
+ * @param options Options for initialization
17
+ * @returns An API route request handler
18
+ */
19
+ declare function factory$1<Schema extends SchemaDef>(options: AppRouteRequestHandlerOptions<Schema>): (req: NextRequest, context: Context) => Promise<NextResponse>;
20
+
21
+ /**
22
+ * Creates a Next.js API endpoint "pages" router request handler that handles ZenStack CRUD requests.
23
+ *
24
+ * @param options Options for initialization
25
+ * @returns An API endpoint request handler
26
+ */
27
+ declare function factory<Schema extends SchemaDef>(options: PageRouteRequestHandlerOptions<Schema>): (req: NextApiRequest, res: NextApiResponse) => Promise<void>;
28
+
29
+ /**
30
+ * Options for initializing a Next.js API endpoint request handler.
31
+ */
32
+ interface PageRouteRequestHandlerOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
33
+ /**
34
+ * Callback for getting a ZenStackClient for the given request
35
+ */
36
+ getClient: (req: NextApiRequest, res: NextApiResponse) => ClientContract<Schema> | Promise<ClientContract<Schema>>;
37
+ /**
38
+ * Use app dir or not
39
+ */
40
+ useAppDir?: false | undefined;
41
+ }
42
+ /**
43
+ * Options for initializing a Next.js 13 app dir API route handler.
44
+ */
45
+ interface AppRouteRequestHandlerOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {
46
+ /**
47
+ * Callback for getting a ZenStackClient for the given request.
48
+ */
49
+ getClient: (req: NextRequest) => ClientContract<Schema> | Promise<ClientContract<Schema>>;
50
+ /**
51
+ * Use app dir or not
52
+ */
53
+ useAppDir: true;
54
+ }
55
+ /**
56
+ * Creates a Next.js API route handler.
57
+ */
58
+ declare function NextRequestHandler<Schema extends SchemaDef>(options: PageRouteRequestHandlerOptions<Schema>): ReturnType<typeof factory>;
59
+ declare function NextRequestHandler<Schema extends SchemaDef>(options: AppRouteRequestHandlerOptions<Schema>): ReturnType<typeof factory$1>;
60
+
61
+ export { type AppRouteRequestHandlerOptions, NextRequestHandler, type PageRouteRequestHandlerOptions };