@objectstack/nuxt 3.2.5 → 3.2.6
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/.turbo/turbo-build.log +8 -8
- package/CHANGELOG.md +6 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +2 -2
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @objectstack/nuxt@3.2.
|
|
2
|
+
> @objectstack/nuxt@3.2.6 build /home/runner/work/spec/spec/packages/adapters/nuxt
|
|
3
3
|
> tsup --config ../../../tsup.config.ts
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[34mCJS[39m Build start
|
|
13
|
-
[32mESM[39m [1mdist/index.mjs [22m[32m6.
|
|
14
|
-
[32mESM[39m [1mdist/index.mjs.map [22m[32m13.
|
|
15
|
-
[32mESM[39m ⚡️ Build success in
|
|
16
|
-
[32mCJS[39m [1mdist/index.js [22m[32m8.
|
|
17
|
-
[32mCJS[39m [1mdist/index.js.map [22m[32m13.
|
|
18
|
-
[32mCJS[39m ⚡️ Build success in
|
|
13
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m6.83 KB[39m
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m13.38 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 57ms
|
|
16
|
+
[32mCJS[39m [1mdist/index.js [22m[32m8.08 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m13.36 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 57ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 12137ms
|
|
21
21
|
[32mDTS[39m [1mdist/index.d.mts [22m[32m677.00 B[39m
|
|
22
22
|
[32mDTS[39m [1mdist/index.d.ts [22m[32m677.00 B[39m
|
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -64,8 +64,8 @@ function createH3Router(options) {
|
|
|
64
64
|
};
|
|
65
65
|
router.get(
|
|
66
66
|
`${prefix}`,
|
|
67
|
-
(0, import_h3.defineEventHandler)(() => {
|
|
68
|
-
return { data: dispatcher.getDiscoveryInfo(prefix) };
|
|
67
|
+
(0, import_h3.defineEventHandler)(async () => {
|
|
68
|
+
return { data: await dispatcher.getDiscoveryInfo(prefix) };
|
|
69
69
|
})
|
|
70
70
|
);
|
|
71
71
|
router.get(
|
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 (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"]}
|
|
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(async () => {\n return { data: await 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
|
@@ -48,8 +48,8 @@ function createH3Router(options) {
|
|
|
48
48
|
};
|
|
49
49
|
router.get(
|
|
50
50
|
`${prefix}`,
|
|
51
|
-
defineEventHandler(() => {
|
|
52
|
-
return { data: dispatcher.getDiscoveryInfo(prefix) };
|
|
51
|
+
defineEventHandler(async () => {
|
|
52
|
+
return { data: await dispatcher.getDiscoveryInfo(prefix) };
|
|
53
53
|
})
|
|
54
54
|
);
|
|
55
55
|
router.get(
|
package/dist/index.mjs.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 (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":";AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAA4B,sBAA4C;AA4BjE,SAAS,eAAe,SAAqC;AAClE,QAAM,SAAS,aAAa;AAC5B,QAAM,aAAa,IAAI,eAAe,QAAQ,MAAM;AACpD,QAAM,SAAS,QAAQ,UAAU;AAEjC,QAAM,YAAY,CAAC,OAAgB,SAAiB,OAAe,QAAQ;AACzE,sBAAkB,OAAO,IAAI;AAC7B,WAAO,EAAE,SAAS,OAAO,OAAO,EAAE,SAAS,KAAK,EAAE;AAAA,EACpD;AAEA,QAAM,aAAa,CAAC,OAAgB,WAAiC;AACnE,QAAI,OAAO,SAAS;AAClB,UAAI,OAAO,UAAU;AACnB,YAAI,OAAO,SAAS,SAAS;AAC3B,iBAAO,QAAQ,OAAO,SAAS,OAAO,EAAE;AAAA,YAAQ,CAAC,CAAC,GAAG,CAAC,MACpD,kBAAkB,OAAO,GAAG,CAAW;AAAA,UACzC;AAAA,QACF;AACA,0BAAkB,OAAO,OAAO,SAAS,MAAM;AAC/C,eAAO,OAAO,SAAS;AAAA,MACzB;AACA,UAAI,OAAO,QAAQ;AACjB,cAAM,MAAM,OAAO;AACnB,YAAI,IAAI,SAAS,cAAc,IAAI,KAAK;AACtC,iBAAO,aAAa,OAAO,IAAI,GAAG;AAAA,QACpC;AACA,YAAI,IAAI,SAAS,YAAY,IAAI,QAAQ;AACvC,cAAI,IAAI,SAAS;AACf,mBAAO,QAAQ,IAAI,OAAO,EAAE;AAAA,cAAQ,CAAC,CAAC,GAAG,CAAC,MACxC,kBAAkB,OAAO,GAAG,CAAW;AAAA,YACzC;AAAA,UACF;AACA,iBAAO,IAAI;AAAA,QACb;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,UAAU,OAAO,aAAa,GAAG;AAAA,EAC1C;AAGA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,mBAAmB,MAAM;AACvB,aAAO,EAAE,MAAM,WAAW,iBAAiB,MAAM,EAAE;AAAA,IACrD,CAAC;AAAA,EACH;AAGA,SAAO;AAAA,IACL;AAAA,IACA,mBAAmB,CAAC,UAAU;AAC5B,aAAO,aAAa,OAAO,MAAM;AAAA,IACnC,CAAC;AAAA,EACH;AAGA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,mBAAmB,OAAO,UAAU;AAClC,UAAI;AACF,cAAM,UAAU,MAAM,QAAQ,MAAM,KAAK,IAAI,OAAO;AACpD,cAAM,OAAO,QAAQ,UAAU,GAAG,MAAM,SAAS,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;AACrE,cAAM,SAAS,MAAM;AAGrB,YAAI,cAAkC;AACtC,YAAI;AACF,cAAI,OAAO,QAAQ,OAAO,oBAAoB,YAAY;AACxD,0BAAc,MAAM,QAAQ,OAAO,gBAA6B,MAAM;AAAA,UACxE,WAAW,OAAO,QAAQ,OAAO,eAAe,YAAY;AAC1D,0BAAc,QAAQ,OAAO,WAAwB,MAAM;AAAA,UAC7D;AAAA,QACF,QAAQ;AAEN,wBAAc;AAAA,QAChB;AAEA,YAAI,eAAe,OAAO,YAAY,kBAAkB,YAAY;AAClE,gBAAM,OAAO,MAAM,KAAK,IAAI,QAAQ,QAAQ;AAC5C,gBAAM,WAAY,MAAM,KAAK,IAAI,QAAgB,YAAY,UAAU;AACvE,gBAAM,MAAM,GAAG,QAAQ,MAAM,IAAI,GAAG,OAAO;AAC3C,gBAAM,UAAU,IAAI,QAAQ;AAC5B,cAAI,MAAM,KAAK,IAAI,SAAS;AAC1B,mBAAO,QAAQ,MAAM,KAAK,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM;AACzD,kBAAI,OAAO,MAAM,SAAU,SAAQ,IAAI,GAAG,CAAC;AAAA,uBAClC,MAAM,QAAQ,CAAC,EAAG,SAAQ,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,YACxD,CAAC;AAAA,UACH;AACA,gBAAM,OAAoB,EAAE,QAAQ,QAAQ;AAC5C,cAAI,WAAW,SAAS,WAAW,QAAQ;AACzC,kBAAMA,QAAO,MAAM,SAAS,KAAK;AACjC,gBAAIA,OAAM;AACR,mBAAK,OAAO,OAAOA,UAAS,WAAWA,QAAO,KAAK,UAAUA,KAAI;AACjE,kBAAI,CAAC,QAAQ,IAAI,cAAc,GAAG;AAChC,wBAAQ,IAAI,gBAAgB,kBAAkB;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AACA,gBAAM,aAAa,IAAI,QAAQ,KAAK,IAAI;AACxC,gBAAM,WAAW,MAAM,YAAY,cAAc,UAAU;AAC3D,4BAAkB,OAAO,SAAS,MAAM;AACxC,mBAAS,QAAQ,QAAQ,CAAC,GAAW,MAAc,kBAAkB,OAAO,GAAG,CAAC,CAAC;AACjF,iBAAO,MAAM,SAAS,KAAK;AAAA,QAC7B;AAGA,cAAM,OAAO,WAAW,SAAS,WAAW,SACxC,CAAC,IACD,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC1C,cAAM,SAAS,MAAM,WAAW,WAAW,MAAM,QAAQ,MAAM,EAAE,SAAS,MAAM,KAAK,IAAI,CAAC;AAC1F,eAAO,WAAW,OAAO,MAAM;AAAA,MACjC,SAAS,KAAU;AACjB,eAAO,UAAU,OAAO,IAAI,WAAW,yBAAyB,IAAI,cAAc,GAAG;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,mBAAmB,OAAO,UAAU;AAClC,UAAI;AACF,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,SAAS,MAAM,WAAW,cAAc,MAAM,EAAE,SAAS,MAAM,KAAK,IAAI,CAAC;AAC/E,eAAO;AAAA,MACT,SAAS,KAAU;AACjB,eAAO,UAAU,OAAO,IAAI,WAAW,yBAAyB,IAAI,cAAc,GAAG;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,mBAAmB,OAAO,UAAU;AAClC,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ,MAAM,KAAK,IAAI,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC;AACrE,cAAM,UAAU,QAAQ,UAAU,GAAG,MAAM,QAAQ,MAAM;AACzD,cAAM,SAAS,MAAM;AACrB,cAAM,OAAQ,WAAW,SAAS,WAAW,SACzC,MAAM,SAAS,KAAK,IACpB;AACJ,cAAM,SAAS,MAAM,WAAW,eAAe,SAAS,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,QAAQ,IAAI;AACjG,eAAO,WAAW,OAAO,MAAM;AAAA,MACjC,SAAS,KAAU;AACjB,eAAO,UAAU,OAAO,IAAI,WAAW,yBAAyB,IAAI,cAAc,GAAG;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,mBAAmB,OAAO,UAAU;AAClC,UAAI;AACF,cAAM,SAAS,MAAM;AACrB,cAAM,OAAQ,WAAW,SAAS,WAAW,SACzC,MAAM,SAAS,KAAK,IACpB;AACJ,cAAM,SAAS,MAAM,WAAW,eAAe,IAAI,EAAE,SAAS,MAAM,KAAK,IAAI,GAAG,QAAQ,IAAI;AAC5F,eAAO,WAAW,OAAO,MAAM;AAAA,MACjC,SAAS,KAAU;AACjB,eAAO,UAAU,OAAO,IAAI,WAAW,yBAAyB,IAAI,cAAc,GAAG;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,mBAAmB,OAAO,UAAU;AAClC,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ,MAAM,KAAK,IAAI,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC;AACrE,cAAM,UAAU,QAAQ,UAAU,GAAG,MAAM,QAAQ,MAAM;AACzD,cAAM,SAAS,MAAM;AACrB,cAAM,OAAQ,WAAW,UAAU,WAAW,UAC1C,MAAM,SAAS,KAAK,IACpB,CAAC;AACL,cAAM,QAAQ,SAAS,KAAK;AAC5B,cAAM,SAAS,MAAM,WAAW,WAAW,SAAS,QAAQ,MAAM,OAAO,EAAE,SAAS,MAAM,KAAK,IAAI,CAAC;AACpG,eAAO,WAAW,OAAO,MAAM;AAAA,MACjC,SAAS,KAAU;AACjB,eAAO,UAAU,OAAO,IAAI,WAAW,yBAAyB,IAAI,cAAc,GAAG;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,mBAAmB,OAAO,UAAU;AAClC,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ,MAAM,KAAK,IAAI,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC;AACrE,cAAM,UAAU,QAAQ,UAAU,GAAG,MAAM,WAAW,MAAM;AAC5D,cAAM,SAAS,MAAM;AACrB,cAAM,OAAO;AACb,cAAM,SAAS,MAAM,WAAW,cAAc,SAAS,QAAQ,MAAM,EAAE,SAAS,MAAM,KAAK,IAAI,CAAC;AAChG,eAAO,WAAW,OAAO,MAAM;AAAA,MACjC,SAAS,KAAU;AACjB,eAAO,UAAU,OAAO,IAAI,WAAW,yBAAyB,IAAI,cAAc,GAAG;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;","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(async () => {\n return { data: await 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.2.
|
|
3
|
+
"version": "3.2.6",
|
|
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.6",
|
|
16
|
-
"@objectstack/runtime": "^3.2.
|
|
16
|
+
"@objectstack/runtime": "^3.2.6"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"h3": "^1.15.6",
|
|
20
20
|
"typescript": "^5.0.0",
|
|
21
21
|
"vitest": "^4.0.18",
|
|
22
|
-
"@objectstack/runtime": "3.2.
|
|
22
|
+
"@objectstack/runtime": "3.2.6"
|
|
23
23
|
},
|
|
24
24
|
"scripts": {
|
|
25
25
|
"build": "tsup --config ../../../tsup.config.ts",
|
package/src/index.ts
CHANGED
|
@@ -82,8 +82,8 @@ export function createH3Router(options: NuxtAdapterOptions): Router {
|
|
|
82
82
|
// --- Discovery ---
|
|
83
83
|
router.get(
|
|
84
84
|
`${prefix}`,
|
|
85
|
-
defineEventHandler(() => {
|
|
86
|
-
return { data: dispatcher.getDiscoveryInfo(prefix) };
|
|
85
|
+
defineEventHandler(async () => {
|
|
86
|
+
return { data: await dispatcher.getDiscoveryInfo(prefix) };
|
|
87
87
|
}),
|
|
88
88
|
);
|
|
89
89
|
|