@zenstackhq/server 3.0.0-beta.21 → 3.0.0-beta.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/next.cjs +5 -8
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +2 -2
- package/dist/next.d.ts +2 -2
- package/dist/next.js +5 -8
- package/dist/next.js.map +1 -1
- package/package.json +8 -8
package/dist/next.cjs
CHANGED
|
@@ -35,9 +35,6 @@ __export(next_exports, {
|
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(next_exports);
|
|
37
37
|
|
|
38
|
-
// src/adapter/next/app-route-handler.ts
|
|
39
|
-
var import_server = require("next/server");
|
|
40
|
-
|
|
41
38
|
// src/api/utils.ts
|
|
42
39
|
var import_decimal = require("decimal.js");
|
|
43
40
|
var import_superjson = __toESM(require("superjson"), 1);
|
|
@@ -70,7 +67,7 @@ function factory(options) {
|
|
|
70
67
|
return async (req, context) => {
|
|
71
68
|
const client = await options.getClient(req);
|
|
72
69
|
if (!client) {
|
|
73
|
-
return
|
|
70
|
+
return Response.json({
|
|
74
71
|
message: "unable to get ZenStackClient from request context"
|
|
75
72
|
}, {
|
|
76
73
|
status: 500
|
|
@@ -82,14 +79,14 @@ function factory(options) {
|
|
|
82
79
|
try {
|
|
83
80
|
params = await context.params;
|
|
84
81
|
} catch {
|
|
85
|
-
return
|
|
82
|
+
return Response.json({
|
|
86
83
|
message: "Failed to resolve request parameters"
|
|
87
84
|
}, {
|
|
88
85
|
status: 500
|
|
89
86
|
});
|
|
90
87
|
}
|
|
91
88
|
if (!params.path) {
|
|
92
|
-
return
|
|
89
|
+
return Response.json({
|
|
93
90
|
message: "missing path parameter"
|
|
94
91
|
}, {
|
|
95
92
|
status: 400
|
|
@@ -111,12 +108,12 @@ function factory(options) {
|
|
|
111
108
|
requestBody,
|
|
112
109
|
client
|
|
113
110
|
});
|
|
114
|
-
return
|
|
111
|
+
return Response.json(r.body, {
|
|
115
112
|
status: r.status
|
|
116
113
|
});
|
|
117
114
|
} catch (err) {
|
|
118
115
|
logInternalError(options.apiHandler.log, err);
|
|
119
|
-
return
|
|
116
|
+
return Response.json({
|
|
120
117
|
message: "An internal server error occurred"
|
|
121
118
|
}, {
|
|
122
119
|
status: 500
|
package/dist/next.cjs.map
CHANGED
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapter/next/index.ts","../src/api/utils.ts","../src/adapter/common.ts","../src/adapter/next/app-route-handler.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 { 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 { NextRequest } 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<Response> {\n return async (req: NextRequest, context: Context) => {\n const client = await options.getClient(req);\n if (!client) {\n return Response.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 Response.json({ message: 'Failed to resolve request parameters' }, { status: 500 });\n }\n\n if (!params.path) {\n return Response.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 Response.json(r.body, { status: r.status });\n } catch (err) {\n logInternalError(options.apiHandler.log, err);\n return Response.json({ message: 'An internal server error occurred' }, { status: 500 });\n }\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","Response","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"]}
|
package/dist/next.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ClientContract } from '@zenstackhq/orm';
|
|
2
2
|
import { SchemaDef } from '@zenstackhq/orm/schema';
|
|
3
3
|
import { NextApiRequest, NextApiResponse } from 'next';
|
|
4
|
-
import { NextRequest
|
|
4
|
+
import { NextRequest } from 'next/server';
|
|
5
5
|
import { C as CommonAdapterOptions } from './common-6DG-xEmM.cjs';
|
|
6
6
|
import './types-D5t0sUEw.cjs';
|
|
7
7
|
|
|
@@ -16,7 +16,7 @@ type Context = {
|
|
|
16
16
|
* @param options Options for initialization
|
|
17
17
|
* @returns An API route request handler
|
|
18
18
|
*/
|
|
19
|
-
declare function factory$1<Schema extends SchemaDef>(options: AppRouteRequestHandlerOptions<Schema>): (req: NextRequest, context: Context) => Promise<
|
|
19
|
+
declare function factory$1<Schema extends SchemaDef>(options: AppRouteRequestHandlerOptions<Schema>): (req: NextRequest, context: Context) => Promise<Response>;
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Creates a Next.js API endpoint "pages" router request handler that handles ZenStack CRUD requests.
|
package/dist/next.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ClientContract } from '@zenstackhq/orm';
|
|
2
2
|
import { SchemaDef } from '@zenstackhq/orm/schema';
|
|
3
3
|
import { NextApiRequest, NextApiResponse } from 'next';
|
|
4
|
-
import { NextRequest
|
|
4
|
+
import { NextRequest } from 'next/server';
|
|
5
5
|
import { C as CommonAdapterOptions } from './common-CyapsM8n.js';
|
|
6
6
|
import './types-D5t0sUEw.js';
|
|
7
7
|
|
|
@@ -16,7 +16,7 @@ type Context = {
|
|
|
16
16
|
* @param options Options for initialization
|
|
17
17
|
* @returns An API route request handler
|
|
18
18
|
*/
|
|
19
|
-
declare function factory$1<Schema extends SchemaDef>(options: AppRouteRequestHandlerOptions<Schema>): (req: NextRequest, context: Context) => Promise<
|
|
19
|
+
declare function factory$1<Schema extends SchemaDef>(options: AppRouteRequestHandlerOptions<Schema>): (req: NextRequest, context: Context) => Promise<Response>;
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Creates a Next.js API endpoint "pages" router request handler that handles ZenStack CRUD requests.
|
package/dist/next.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
|
|
4
|
-
// src/adapter/next/app-route-handler.ts
|
|
5
|
-
import { NextResponse } from "next/server";
|
|
6
|
-
|
|
7
4
|
// src/api/utils.ts
|
|
8
5
|
import { Decimal } from "decimal.js";
|
|
9
6
|
import SuperJSON from "superjson";
|
|
@@ -36,7 +33,7 @@ function factory(options) {
|
|
|
36
33
|
return async (req, context) => {
|
|
37
34
|
const client = await options.getClient(req);
|
|
38
35
|
if (!client) {
|
|
39
|
-
return
|
|
36
|
+
return Response.json({
|
|
40
37
|
message: "unable to get ZenStackClient from request context"
|
|
41
38
|
}, {
|
|
42
39
|
status: 500
|
|
@@ -48,14 +45,14 @@ function factory(options) {
|
|
|
48
45
|
try {
|
|
49
46
|
params = await context.params;
|
|
50
47
|
} catch {
|
|
51
|
-
return
|
|
48
|
+
return Response.json({
|
|
52
49
|
message: "Failed to resolve request parameters"
|
|
53
50
|
}, {
|
|
54
51
|
status: 500
|
|
55
52
|
});
|
|
56
53
|
}
|
|
57
54
|
if (!params.path) {
|
|
58
|
-
return
|
|
55
|
+
return Response.json({
|
|
59
56
|
message: "missing path parameter"
|
|
60
57
|
}, {
|
|
61
58
|
status: 400
|
|
@@ -77,12 +74,12 @@ function factory(options) {
|
|
|
77
74
|
requestBody,
|
|
78
75
|
client
|
|
79
76
|
});
|
|
80
|
-
return
|
|
77
|
+
return Response.json(r.body, {
|
|
81
78
|
status: r.status
|
|
82
79
|
});
|
|
83
80
|
} catch (err) {
|
|
84
81
|
logInternalError(options.apiHandler.log, err);
|
|
85
|
-
return
|
|
82
|
+
return Response.json({
|
|
86
83
|
message: "An internal server error occurred"
|
|
87
84
|
}, {
|
|
88
85
|
status: 500
|
package/dist/next.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapter/next/app-route-handler.ts","../src/api/utils.ts","../src/adapter/common.ts","../src/adapter/next/pages-route-handler.ts","../src/adapter/next/index.ts"],"sourcesContent":["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","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"],"mappings":"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","names":["NextResponse","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","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/utils.ts","../src/adapter/common.ts","../src/adapter/next/app-route-handler.ts","../src/adapter/next/pages-route-handler.ts","../src/adapter/next/index.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 { SchemaDef } from '@zenstackhq/orm/schema';\nimport type { NextRequest } 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<Response> {\n return async (req: NextRequest, context: Context) => {\n const client = await options.getClient(req);\n if (!client) {\n return Response.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 Response.json({ message: 'Failed to resolve request parameters' }, { status: 500 });\n }\n\n if (!params.path) {\n return Response.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 Response.json(r.body, { status: r.status });\n } catch (err) {\n logInternalError(options.apiHandler.log, err);\n return Response.json({ message: 'An internal server error occurred' }, { status: 500 });\n }\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","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"],"mappings":"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","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","options","req","context","client","getClient","Response","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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenstackhq/server",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.23",
|
|
4
4
|
"description": "ZenStack automatic CRUD API handlers and server adapters",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -116,12 +116,12 @@
|
|
|
116
116
|
"dependencies": {
|
|
117
117
|
"decimal.js": "^10.4.3",
|
|
118
118
|
"superjson": "^2.2.3",
|
|
119
|
-
"ts-japi": "^1.12.
|
|
119
|
+
"ts-japi": "^1.12.1",
|
|
120
120
|
"ts-pattern": "^5.7.1",
|
|
121
121
|
"url-pattern": "^1.0.3",
|
|
122
122
|
"zod-validation-error": "^4.0.1",
|
|
123
|
-
"@zenstackhq/common-helpers": "3.0.0-beta.
|
|
124
|
-
"@zenstackhq/orm": "3.0.0-beta.
|
|
123
|
+
"@zenstackhq/common-helpers": "3.0.0-beta.23",
|
|
124
|
+
"@zenstackhq/orm": "3.0.0-beta.23"
|
|
125
125
|
},
|
|
126
126
|
"devDependencies": {
|
|
127
127
|
"@sveltejs/kit": "^2.48.3",
|
|
@@ -139,10 +139,10 @@
|
|
|
139
139
|
"nuxt": "^4.2.0",
|
|
140
140
|
"supertest": "^7.1.4",
|
|
141
141
|
"zod": "^4.1.0",
|
|
142
|
-
"@zenstackhq/eslint-config": "3.0.0-beta.
|
|
143
|
-
"@zenstackhq/testtools": "3.0.0-beta.
|
|
144
|
-
"@zenstackhq/typescript-config": "3.0.0-beta.
|
|
145
|
-
"@zenstackhq/vitest-config": "3.0.0-beta.
|
|
142
|
+
"@zenstackhq/eslint-config": "3.0.0-beta.23",
|
|
143
|
+
"@zenstackhq/testtools": "3.0.0-beta.23",
|
|
144
|
+
"@zenstackhq/typescript-config": "3.0.0-beta.23",
|
|
145
|
+
"@zenstackhq/vitest-config": "3.0.0-beta.23"
|
|
146
146
|
},
|
|
147
147
|
"peerDependencies": {
|
|
148
148
|
"@sveltejs/kit": "^2.0.0",
|