@objectstack/nuxt 3.1.1 → 3.2.1

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @objectstack/nuxt@3.1.1 build /home/runner/work/spec/spec/packages/adapters/nuxt
2
+ > @objectstack/nuxt@3.2.1 build /home/runner/work/spec/spec/packages/adapters/nuxt
3
3
  > tsup --config ../../../tsup.config.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- CJS dist/index.js 7.81 KB
14
- CJS dist/index.js.map 12.79 KB
15
- CJS ⚡️ Build success in 90ms
16
- ESM dist/index.mjs 6.56 KB
17
- ESM dist/index.mjs.map 12.81 KB
18
- ESM ⚡️ Build success in 90ms
13
+ CJS dist/index.js 8.07 KB
14
+ CJS dist/index.js.map 13.34 KB
15
+ CJS ⚡️ Build success in 71ms
16
+ ESM dist/index.mjs 6.82 KB
17
+ ESM dist/index.mjs.map 13.36 KB
18
+ ESM ⚡️ Build success in 71ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 12408ms
20
+ DTS ⚡️ Build success in 12763ms
21
21
  DTS dist/index.d.mts 677.00 B
22
22
  DTS dist/index.d.ts 677.00 B
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @objectstack/nuxt
2
2
 
3
+ ## 3.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - @objectstack/runtime@3.2.1
8
+
9
+ ## 3.2.0
10
+
11
+ ### Patch Changes
12
+
13
+ - @objectstack/runtime@3.2.0
14
+
3
15
  ## 3.1.1
4
16
 
5
17
  ### Patch Changes
package/dist/index.js CHANGED
@@ -81,7 +81,16 @@ function createH3Router(options) {
81
81
  const urlPath = event.path || event.node.req.url || "";
82
82
  const path = urlPath.substring(`${prefix}/auth/`.length).split("?")[0];
83
83
  const method = event.method;
84
- const authService = typeof options.kernel.getService === "function" ? options.kernel.getService("auth") : null;
84
+ let authService = null;
85
+ try {
86
+ if (typeof options.kernel.getServiceAsync === "function") {
87
+ authService = await options.kernel.getServiceAsync("auth");
88
+ } else if (typeof options.kernel.getService === "function") {
89
+ authService = options.kernel.getService("auth");
90
+ }
91
+ } catch {
92
+ authService = null;
93
+ }
85
94
  if (authService && typeof authService.handleRequest === "function") {
86
95
  const host = event.node.req.headers.host || "localhost";
87
96
  const protocol = event.node.req.socket?.encrypted ? "https" : "http";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport {\n createRouter,\n defineEventHandler,\n getQuery,\n readBody,\n sendRedirect,\n setResponseHeader,\n setResponseStatus,\n type H3Event,\n type Router,\n} from 'h3';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface NuxtAdapterOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Auth service interface with handleRequest method\n */\ninterface AuthService {\n handleRequest(request: Request): Promise<Response>;\n}\n\n/**\n * Creates an h3 router with all ObjectStack route dispatchers.\n * Designed for use in Nuxt server routes or standalone h3 apps.\n *\n * @example\n * ```ts\n * // server/api/[...].ts\n * import { createH3Router } from '@objectstack/nuxt';\n * import { kernel } from '../kernel';\n *\n * const router = createH3Router({ kernel });\n * export default defineEventHandler(router.handler);\n * ```\n */\nexport function createH3Router(options: NuxtAdapterOptions): Router {\n const router = createRouter();\n const dispatcher = new HttpDispatcher(options.kernel);\n const prefix = options.prefix || '/api';\n\n const errorJson = (event: H3Event, message: string, code: number = 500) => {\n setResponseStatus(event, code);\n return { success: false, error: { message, code } };\n };\n\n const toResponse = (event: H3Event, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n if (result.response.headers) {\n Object.entries(result.response.headers).forEach(([k, v]) =>\n setResponseHeader(event, k, v as string),\n );\n }\n setResponseStatus(event, result.response.status);\n return result.response.body;\n }\n if (result.result) {\n const res = result.result;\n if (res.type === 'redirect' && res.url) {\n return sendRedirect(event, res.url);\n }\n if (res.type === 'stream' && res.stream) {\n if (res.headers) {\n Object.entries(res.headers).forEach(([k, v]) =>\n setResponseHeader(event, k, v as string),\n );\n }\n return res.stream;\n }\n return res;\n }\n }\n return errorJson(event, 'Not Found', 404);\n };\n\n // --- Discovery ---\n router.get(\n `${prefix}`,\n defineEventHandler(() => {\n return { data: dispatcher.getDiscoveryInfo(prefix) };\n }),\n );\n\n // --- .well-known ---\n router.get(\n '/.well-known/objectstack',\n defineEventHandler((event) => {\n return sendRedirect(event, prefix);\n }),\n );\n\n // --- Auth ---\n router.use(\n `${prefix}/auth/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = event.path || event.node.req.url || '';\n const path = urlPath.substring(`${prefix}/auth/`.length).split('?')[0];\n const method = event.method;\n\n // Try AuthPlugin service first\n const authService = typeof options.kernel.getService === 'function'\n ? options.kernel.getService<AuthService>('auth')\n : null;\n\n if (authService && typeof authService.handleRequest === 'function') {\n const host = event.node.req.headers.host || 'localhost';\n const protocol = (event.node.req.socket as any)?.encrypted ? 'https' : 'http';\n const url = `${protocol}://${host}${urlPath}`;\n const headers = new Headers();\n if (event.node.req.headers) {\n Object.entries(event.node.req.headers).forEach(([k, v]) => {\n if (typeof v === 'string') headers.set(k, v);\n else if (Array.isArray(v)) headers.set(k, v.join(', '));\n });\n }\n const init: RequestInit = { method, headers };\n if (method !== 'GET' && method !== 'HEAD') {\n const body = await readBody(event);\n if (body) {\n init.body = typeof body === 'string' ? body : JSON.stringify(body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n }\n const webRequest = new Request(url, init);\n const response = await authService.handleRequest(webRequest);\n setResponseStatus(event, response.status);\n response.headers.forEach((v: string, k: string) => setResponseHeader(event, k, v));\n return await response.text();\n }\n\n // Fallback to dispatcher\n const body = method === 'GET' || method === 'HEAD'\n ? {}\n : await readBody(event).catch(() => ({}));\n const result = await dispatcher.handleAuth(path, method, body, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- GraphQL ---\n router.post(\n `${prefix}/graphql`,\n defineEventHandler(async (event) => {\n try {\n const body = await readBody(event);\n const result = await dispatcher.handleGraphQL(body, { request: event.node.req });\n return result;\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Metadata ---\n router.use(\n `${prefix}/meta/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/meta`.length);\n const method = event.method;\n const body = (method === 'PUT' || method === 'POST')\n ? await readBody(event)\n : undefined;\n const result = await dispatcher.handleMetadata(subPath, { request: event.node.req }, method, body);\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n router.use(\n `${prefix}/meta`,\n defineEventHandler(async (event) => {\n try {\n const method = event.method;\n const body = (method === 'PUT' || method === 'POST')\n ? await readBody(event)\n : undefined;\n const result = await dispatcher.handleMetadata('', { request: event.node.req }, method, body);\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Data ---\n router.use(\n `${prefix}/data/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/data`.length);\n const method = event.method;\n const body = (method === 'POST' || method === 'PATCH')\n ? await readBody(event)\n : {};\n const query = getQuery(event);\n const result = await dispatcher.handleData(subPath, method, body, query, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Storage ---\n router.use(\n `${prefix}/storage/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/storage`.length);\n const method = event.method;\n const file = undefined; // File upload requires multipart parsing (e.g., formidable)\n const result = await dispatcher.handleStorage(subPath, method, file, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n return router;\n}\n"],"mappings":"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","names":["body"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport {\n createRouter,\n defineEventHandler,\n getQuery,\n readBody,\n sendRedirect,\n setResponseHeader,\n setResponseStatus,\n type H3Event,\n type Router,\n} from 'h3';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface NuxtAdapterOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Auth service interface with handleRequest method\n */\ninterface AuthService {\n handleRequest(request: Request): Promise<Response>;\n}\n\n/**\n * Creates an h3 router with all ObjectStack route dispatchers.\n * Designed for use in Nuxt server routes or standalone h3 apps.\n *\n * @example\n * ```ts\n * // server/api/[...].ts\n * import { createH3Router } from '@objectstack/nuxt';\n * import { kernel } from '../kernel';\n *\n * const router = createH3Router({ kernel });\n * export default defineEventHandler(router.handler);\n * ```\n */\nexport function createH3Router(options: NuxtAdapterOptions): Router {\n const router = createRouter();\n const dispatcher = new HttpDispatcher(options.kernel);\n const prefix = options.prefix || '/api';\n\n const errorJson = (event: H3Event, message: string, code: number = 500) => {\n setResponseStatus(event, code);\n return { success: false, error: { message, code } };\n };\n\n const toResponse = (event: H3Event, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n if (result.response.headers) {\n Object.entries(result.response.headers).forEach(([k, v]) =>\n setResponseHeader(event, k, v as string),\n );\n }\n setResponseStatus(event, result.response.status);\n return result.response.body;\n }\n if (result.result) {\n const res = result.result;\n if (res.type === 'redirect' && res.url) {\n return sendRedirect(event, res.url);\n }\n if (res.type === 'stream' && res.stream) {\n if (res.headers) {\n Object.entries(res.headers).forEach(([k, v]) =>\n setResponseHeader(event, k, v as string),\n );\n }\n return res.stream;\n }\n return res;\n }\n }\n return errorJson(event, 'Not Found', 404);\n };\n\n // --- Discovery ---\n router.get(\n `${prefix}`,\n defineEventHandler(() => {\n return { data: dispatcher.getDiscoveryInfo(prefix) };\n }),\n );\n\n // --- .well-known ---\n router.get(\n '/.well-known/objectstack',\n defineEventHandler((event) => {\n return sendRedirect(event, prefix);\n }),\n );\n\n // --- Auth ---\n router.use(\n `${prefix}/auth/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = event.path || event.node.req.url || '';\n const path = urlPath.substring(`${prefix}/auth/`.length).split('?')[0];\n const method = event.method;\n\n // Try AuthPlugin service first (prefer async to support factory-based services)\n let authService: AuthService | null = null;\n try {\n if (typeof options.kernel.getServiceAsync === 'function') {\n authService = await options.kernel.getServiceAsync<AuthService>('auth');\n } else if (typeof options.kernel.getService === 'function') {\n authService = options.kernel.getService<AuthService>('auth');\n }\n } catch {\n // Service not registered — fall through to dispatcher\n authService = null;\n }\n\n if (authService && typeof authService.handleRequest === 'function') {\n const host = event.node.req.headers.host || 'localhost';\n const protocol = (event.node.req.socket as any)?.encrypted ? 'https' : 'http';\n const url = `${protocol}://${host}${urlPath}`;\n const headers = new Headers();\n if (event.node.req.headers) {\n Object.entries(event.node.req.headers).forEach(([k, v]) => {\n if (typeof v === 'string') headers.set(k, v);\n else if (Array.isArray(v)) headers.set(k, v.join(', '));\n });\n }\n const init: RequestInit = { method, headers };\n if (method !== 'GET' && method !== 'HEAD') {\n const body = await readBody(event);\n if (body) {\n init.body = typeof body === 'string' ? body : JSON.stringify(body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n }\n const webRequest = new Request(url, init);\n const response = await authService.handleRequest(webRequest);\n setResponseStatus(event, response.status);\n response.headers.forEach((v: string, k: string) => setResponseHeader(event, k, v));\n return await response.text();\n }\n\n // Fallback to dispatcher\n const body = method === 'GET' || method === 'HEAD'\n ? {}\n : await readBody(event).catch(() => ({}));\n const result = await dispatcher.handleAuth(path, method, body, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- GraphQL ---\n router.post(\n `${prefix}/graphql`,\n defineEventHandler(async (event) => {\n try {\n const body = await readBody(event);\n const result = await dispatcher.handleGraphQL(body, { request: event.node.req });\n return result;\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Metadata ---\n router.use(\n `${prefix}/meta/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/meta`.length);\n const method = event.method;\n const body = (method === 'PUT' || method === 'POST')\n ? await readBody(event)\n : undefined;\n const result = await dispatcher.handleMetadata(subPath, { request: event.node.req }, method, body);\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n router.use(\n `${prefix}/meta`,\n defineEventHandler(async (event) => {\n try {\n const method = event.method;\n const body = (method === 'PUT' || method === 'POST')\n ? await readBody(event)\n : undefined;\n const result = await dispatcher.handleMetadata('', { request: event.node.req }, method, body);\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Data ---\n router.use(\n `${prefix}/data/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/data`.length);\n const method = event.method;\n const body = (method === 'POST' || method === 'PATCH')\n ? await readBody(event)\n : {};\n const query = getQuery(event);\n const result = await dispatcher.handleData(subPath, method, body, query, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Storage ---\n router.use(\n `${prefix}/storage/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/storage`.length);\n const method = event.method;\n const file = undefined; // File upload requires multipart parsing (e.g., formidable)\n const result = await dispatcher.handleStorage(subPath, method, file, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n return router;\n}\n"],"mappings":"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","names":["body"]}
package/dist/index.mjs CHANGED
@@ -65,7 +65,16 @@ function createH3Router(options) {
65
65
  const urlPath = event.path || event.node.req.url || "";
66
66
  const path = urlPath.substring(`${prefix}/auth/`.length).split("?")[0];
67
67
  const method = event.method;
68
- const authService = typeof options.kernel.getService === "function" ? options.kernel.getService("auth") : null;
68
+ let authService = null;
69
+ try {
70
+ if (typeof options.kernel.getServiceAsync === "function") {
71
+ authService = await options.kernel.getServiceAsync("auth");
72
+ } else if (typeof options.kernel.getService === "function") {
73
+ authService = options.kernel.getService("auth");
74
+ }
75
+ } catch {
76
+ authService = null;
77
+ }
69
78
  if (authService && typeof authService.handleRequest === "function") {
70
79
  const host = event.node.req.headers.host || "localhost";
71
80
  const protocol = event.node.req.socket?.encrypted ? "https" : "http";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport {\n createRouter,\n defineEventHandler,\n getQuery,\n readBody,\n sendRedirect,\n setResponseHeader,\n setResponseStatus,\n type H3Event,\n type Router,\n} from 'h3';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface NuxtAdapterOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Auth service interface with handleRequest method\n */\ninterface AuthService {\n handleRequest(request: Request): Promise<Response>;\n}\n\n/**\n * Creates an h3 router with all ObjectStack route dispatchers.\n * Designed for use in Nuxt server routes or standalone h3 apps.\n *\n * @example\n * ```ts\n * // server/api/[...].ts\n * import { createH3Router } from '@objectstack/nuxt';\n * import { kernel } from '../kernel';\n *\n * const router = createH3Router({ kernel });\n * export default defineEventHandler(router.handler);\n * ```\n */\nexport function createH3Router(options: NuxtAdapterOptions): Router {\n const router = createRouter();\n const dispatcher = new HttpDispatcher(options.kernel);\n const prefix = options.prefix || '/api';\n\n const errorJson = (event: H3Event, message: string, code: number = 500) => {\n setResponseStatus(event, code);\n return { success: false, error: { message, code } };\n };\n\n const toResponse = (event: H3Event, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n if (result.response.headers) {\n Object.entries(result.response.headers).forEach(([k, v]) =>\n setResponseHeader(event, k, v as string),\n );\n }\n setResponseStatus(event, result.response.status);\n return result.response.body;\n }\n if (result.result) {\n const res = result.result;\n if (res.type === 'redirect' && res.url) {\n return sendRedirect(event, res.url);\n }\n if (res.type === 'stream' && res.stream) {\n if (res.headers) {\n Object.entries(res.headers).forEach(([k, v]) =>\n setResponseHeader(event, k, v as string),\n );\n }\n return res.stream;\n }\n return res;\n }\n }\n return errorJson(event, 'Not Found', 404);\n };\n\n // --- Discovery ---\n router.get(\n `${prefix}`,\n defineEventHandler(() => {\n return { data: dispatcher.getDiscoveryInfo(prefix) };\n }),\n );\n\n // --- .well-known ---\n router.get(\n '/.well-known/objectstack',\n defineEventHandler((event) => {\n return sendRedirect(event, prefix);\n }),\n );\n\n // --- Auth ---\n router.use(\n `${prefix}/auth/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = event.path || event.node.req.url || '';\n const path = urlPath.substring(`${prefix}/auth/`.length).split('?')[0];\n const method = event.method;\n\n // Try AuthPlugin service first\n const authService = typeof options.kernel.getService === 'function'\n ? options.kernel.getService<AuthService>('auth')\n : null;\n\n if (authService && typeof authService.handleRequest === 'function') {\n const host = event.node.req.headers.host || 'localhost';\n const protocol = (event.node.req.socket as any)?.encrypted ? 'https' : 'http';\n const url = `${protocol}://${host}${urlPath}`;\n const headers = new Headers();\n if (event.node.req.headers) {\n Object.entries(event.node.req.headers).forEach(([k, v]) => {\n if (typeof v === 'string') headers.set(k, v);\n else if (Array.isArray(v)) headers.set(k, v.join(', '));\n });\n }\n const init: RequestInit = { method, headers };\n if (method !== 'GET' && method !== 'HEAD') {\n const body = await readBody(event);\n if (body) {\n init.body = typeof body === 'string' ? body : JSON.stringify(body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n }\n const webRequest = new Request(url, init);\n const response = await authService.handleRequest(webRequest);\n setResponseStatus(event, response.status);\n response.headers.forEach((v: string, k: string) => setResponseHeader(event, k, v));\n return await response.text();\n }\n\n // Fallback to dispatcher\n const body = method === 'GET' || method === 'HEAD'\n ? {}\n : await readBody(event).catch(() => ({}));\n const result = await dispatcher.handleAuth(path, method, body, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- GraphQL ---\n router.post(\n `${prefix}/graphql`,\n defineEventHandler(async (event) => {\n try {\n const body = await readBody(event);\n const result = await dispatcher.handleGraphQL(body, { request: event.node.req });\n return result;\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Metadata ---\n router.use(\n `${prefix}/meta/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/meta`.length);\n const method = event.method;\n const body = (method === 'PUT' || method === 'POST')\n ? await readBody(event)\n : undefined;\n const result = await dispatcher.handleMetadata(subPath, { request: event.node.req }, method, body);\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n router.use(\n `${prefix}/meta`,\n defineEventHandler(async (event) => {\n try {\n const method = event.method;\n const body = (method === 'PUT' || method === 'POST')\n ? await readBody(event)\n : undefined;\n const result = await dispatcher.handleMetadata('', { request: event.node.req }, method, body);\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Data ---\n router.use(\n `${prefix}/data/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/data`.length);\n const method = event.method;\n const body = (method === 'POST' || method === 'PATCH')\n ? await readBody(event)\n : {};\n const query = getQuery(event);\n const result = await dispatcher.handleData(subPath, method, body, query, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Storage ---\n router.use(\n `${prefix}/storage/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/storage`.length);\n const method = event.method;\n const file = undefined; // File upload requires multipart parsing (e.g., formidable)\n const result = await dispatcher.handleStorage(subPath, method, file, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n return router;\n}\n"],"mappings":"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","names":["body"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport {\n createRouter,\n defineEventHandler,\n getQuery,\n readBody,\n sendRedirect,\n setResponseHeader,\n setResponseStatus,\n type H3Event,\n type Router,\n} from 'h3';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface NuxtAdapterOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Auth service interface with handleRequest method\n */\ninterface AuthService {\n handleRequest(request: Request): Promise<Response>;\n}\n\n/**\n * Creates an h3 router with all ObjectStack route dispatchers.\n * Designed for use in Nuxt server routes or standalone h3 apps.\n *\n * @example\n * ```ts\n * // server/api/[...].ts\n * import { createH3Router } from '@objectstack/nuxt';\n * import { kernel } from '../kernel';\n *\n * const router = createH3Router({ kernel });\n * export default defineEventHandler(router.handler);\n * ```\n */\nexport function createH3Router(options: NuxtAdapterOptions): Router {\n const router = createRouter();\n const dispatcher = new HttpDispatcher(options.kernel);\n const prefix = options.prefix || '/api';\n\n const errorJson = (event: H3Event, message: string, code: number = 500) => {\n setResponseStatus(event, code);\n return { success: false, error: { message, code } };\n };\n\n const toResponse = (event: H3Event, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n if (result.response.headers) {\n Object.entries(result.response.headers).forEach(([k, v]) =>\n setResponseHeader(event, k, v as string),\n );\n }\n setResponseStatus(event, result.response.status);\n return result.response.body;\n }\n if (result.result) {\n const res = result.result;\n if (res.type === 'redirect' && res.url) {\n return sendRedirect(event, res.url);\n }\n if (res.type === 'stream' && res.stream) {\n if (res.headers) {\n Object.entries(res.headers).forEach(([k, v]) =>\n setResponseHeader(event, k, v as string),\n );\n }\n return res.stream;\n }\n return res;\n }\n }\n return errorJson(event, 'Not Found', 404);\n };\n\n // --- Discovery ---\n router.get(\n `${prefix}`,\n defineEventHandler(() => {\n return { data: dispatcher.getDiscoveryInfo(prefix) };\n }),\n );\n\n // --- .well-known ---\n router.get(\n '/.well-known/objectstack',\n defineEventHandler((event) => {\n return sendRedirect(event, prefix);\n }),\n );\n\n // --- Auth ---\n router.use(\n `${prefix}/auth/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = event.path || event.node.req.url || '';\n const path = urlPath.substring(`${prefix}/auth/`.length).split('?')[0];\n const method = event.method;\n\n // Try AuthPlugin service first (prefer async to support factory-based services)\n let authService: AuthService | null = null;\n try {\n if (typeof options.kernel.getServiceAsync === 'function') {\n authService = await options.kernel.getServiceAsync<AuthService>('auth');\n } else if (typeof options.kernel.getService === 'function') {\n authService = options.kernel.getService<AuthService>('auth');\n }\n } catch {\n // Service not registered — fall through to dispatcher\n authService = null;\n }\n\n if (authService && typeof authService.handleRequest === 'function') {\n const host = event.node.req.headers.host || 'localhost';\n const protocol = (event.node.req.socket as any)?.encrypted ? 'https' : 'http';\n const url = `${protocol}://${host}${urlPath}`;\n const headers = new Headers();\n if (event.node.req.headers) {\n Object.entries(event.node.req.headers).forEach(([k, v]) => {\n if (typeof v === 'string') headers.set(k, v);\n else if (Array.isArray(v)) headers.set(k, v.join(', '));\n });\n }\n const init: RequestInit = { method, headers };\n if (method !== 'GET' && method !== 'HEAD') {\n const body = await readBody(event);\n if (body) {\n init.body = typeof body === 'string' ? body : JSON.stringify(body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n }\n const webRequest = new Request(url, init);\n const response = await authService.handleRequest(webRequest);\n setResponseStatus(event, response.status);\n response.headers.forEach((v: string, k: string) => setResponseHeader(event, k, v));\n return await response.text();\n }\n\n // Fallback to dispatcher\n const body = method === 'GET' || method === 'HEAD'\n ? {}\n : await readBody(event).catch(() => ({}));\n const result = await dispatcher.handleAuth(path, method, body, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- GraphQL ---\n router.post(\n `${prefix}/graphql`,\n defineEventHandler(async (event) => {\n try {\n const body = await readBody(event);\n const result = await dispatcher.handleGraphQL(body, { request: event.node.req });\n return result;\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Metadata ---\n router.use(\n `${prefix}/meta/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/meta`.length);\n const method = event.method;\n const body = (method === 'PUT' || method === 'POST')\n ? await readBody(event)\n : undefined;\n const result = await dispatcher.handleMetadata(subPath, { request: event.node.req }, method, body);\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n router.use(\n `${prefix}/meta`,\n defineEventHandler(async (event) => {\n try {\n const method = event.method;\n const body = (method === 'PUT' || method === 'POST')\n ? await readBody(event)\n : undefined;\n const result = await dispatcher.handleMetadata('', { request: event.node.req }, method, body);\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Data ---\n router.use(\n `${prefix}/data/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/data`.length);\n const method = event.method;\n const body = (method === 'POST' || method === 'PATCH')\n ? await readBody(event)\n : {};\n const query = getQuery(event);\n const result = await dispatcher.handleData(subPath, method, body, query, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n // --- Storage ---\n router.use(\n `${prefix}/storage/**`,\n defineEventHandler(async (event) => {\n try {\n const urlPath = (event.path || event.node.req.url || '').split('?')[0];\n const subPath = urlPath.substring(`${prefix}/storage`.length);\n const method = event.method;\n const file = undefined; // File upload requires multipart parsing (e.g., formidable)\n const result = await dispatcher.handleStorage(subPath, method, file, { request: event.node.req });\n return toResponse(event, result);\n } catch (err: any) {\n return errorJson(event, err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }),\n );\n\n return router;\n}\n"],"mappings":"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","names":["body"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectstack/nuxt",
3
- "version": "3.1.1",
3
+ "version": "3.2.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,13 +13,13 @@
13
13
  },
14
14
  "peerDependencies": {
15
15
  "h3": "^1.15.5",
16
- "@objectstack/runtime": "^3.1.1"
16
+ "@objectstack/runtime": "^3.2.1"
17
17
  },
18
18
  "devDependencies": {
19
19
  "h3": "^1.15.5",
20
20
  "typescript": "^5.0.0",
21
21
  "vitest": "^4.0.18",
22
- "@objectstack/runtime": "3.1.1"
22
+ "@objectstack/runtime": "3.2.1"
23
23
  },
24
24
  "scripts": {
25
25
  "build": "tsup --config ../../../tsup.config.ts",
package/src/index.ts CHANGED
@@ -104,10 +104,18 @@ export function createH3Router(options: NuxtAdapterOptions): Router {
104
104
  const path = urlPath.substring(`${prefix}/auth/`.length).split('?')[0];
105
105
  const method = event.method;
106
106
 
107
- // Try AuthPlugin service first
108
- const authService = typeof options.kernel.getService === 'function'
109
- ? options.kernel.getService<AuthService>('auth')
110
- : null;
107
+ // Try AuthPlugin service first (prefer async to support factory-based services)
108
+ let authService: AuthService | null = null;
109
+ try {
110
+ if (typeof options.kernel.getServiceAsync === 'function') {
111
+ authService = await options.kernel.getServiceAsync<AuthService>('auth');
112
+ } else if (typeof options.kernel.getService === 'function') {
113
+ authService = options.kernel.getService<AuthService>('auth');
114
+ }
115
+ } catch {
116
+ // Service not registered — fall through to dispatcher
117
+ authService = null;
118
+ }
111
119
 
112
120
  if (authService && typeof authService.handleRequest === 'function') {
113
121
  const host = event.node.req.headers.host || 'localhost';