@objectstack/hono 1.0.12 → 2.0.0

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/hono@1.0.12 build /home/runner/work/spec/spec/packages/adapters/hono
2
+ > @objectstack/hono@2.0.0 build /home/runner/work/spec/spec/packages/adapters/hono
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.55 KB
14
- CJS dist/index.js.map 13.39 KB
15
- CJS ⚡️ Build success in 43ms
16
13
  ESM dist/index.mjs 6.45 KB
17
- ESM dist/index.mjs.map 13.35 KB
18
- ESM ⚡️ Build success in 43ms
14
+ ESM dist/index.mjs.map 14.01 KB
15
+ ESM ⚡️ Build success in 50ms
16
+ CJS dist/index.js 7.55 KB
17
+ CJS dist/index.js.map 14.05 KB
18
+ CJS ⚡️ Build success in 50ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 7098ms
21
- DTS dist/index.d.mts 664.00 B
22
- DTS dist/index.d.ts 664.00 B
20
+ DTS ⚡️ Build success in 9404ms
21
+ DTS dist/index.d.mts 1.22 KB
22
+ DTS dist/index.d.ts 1.22 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @objectstack/hono
2
2
 
3
+ ## 2.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - @objectstack/runtime@2.0.0
8
+
3
9
  ## 1.0.12
4
10
 
5
11
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -7,8 +7,22 @@ interface ObjectStackHonoOptions {
7
7
  prefix?: string;
8
8
  }
9
9
  /**
10
- * Creates a Hono application tailored for ObjectStack
11
- * Fully compliant with @objectstack/spec
10
+ * @deprecated Use `HonoServerPlugin` + `createRestApiPlugin()` + `createDispatcherPlugin()` instead.
11
+ * This function bundles all routes into a single Hono app using the legacy HttpDispatcher.
12
+ * The plugin-based approach provides better modularity and separation of concerns.
13
+ *
14
+ * Migration:
15
+ * ```ts
16
+ * // Before:
17
+ * const app = createHonoApp({ kernel, prefix: '/api/v1' });
18
+ *
19
+ * // After:
20
+ * import { createRestApiPlugin } from '@objectstack/rest';
21
+ * import { createDispatcherPlugin } from '@objectstack/runtime';
22
+ * kernel.use(new HonoServerPlugin({ port: 3000 }));
23
+ * kernel.use(createRestApiPlugin());
24
+ * kernel.use(createDispatcherPlugin({ prefix: '/api/v1' }));
25
+ * ```
12
26
  */
13
27
  declare function createHonoApp(options: ObjectStackHonoOptions): Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">;
14
28
  /**
package/dist/index.d.ts CHANGED
@@ -7,8 +7,22 @@ interface ObjectStackHonoOptions {
7
7
  prefix?: string;
8
8
  }
9
9
  /**
10
- * Creates a Hono application tailored for ObjectStack
11
- * Fully compliant with @objectstack/spec
10
+ * @deprecated Use `HonoServerPlugin` + `createRestApiPlugin()` + `createDispatcherPlugin()` instead.
11
+ * This function bundles all routes into a single Hono app using the legacy HttpDispatcher.
12
+ * The plugin-based approach provides better modularity and separation of concerns.
13
+ *
14
+ * Migration:
15
+ * ```ts
16
+ * // Before:
17
+ * const app = createHonoApp({ kernel, prefix: '/api/v1' });
18
+ *
19
+ * // After:
20
+ * import { createRestApiPlugin } from '@objectstack/rest';
21
+ * import { createDispatcherPlugin } from '@objectstack/runtime';
22
+ * kernel.use(new HonoServerPlugin({ port: 3000 }));
23
+ * kernel.use(createRestApiPlugin());
24
+ * kernel.use(createDispatcherPlugin({ prefix: '/api/v1' }));
25
+ * ```
12
26
  */
13
27
  declare function createHonoApp(options: ObjectStackHonoOptions): Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">;
14
28
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface ObjectStackHonoOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Creates a Hono application tailored for ObjectStack\n * Fully compliant with @objectstack/spec\n */\nexport function createHonoApp(options: ObjectStackHonoOptions) {\n const app = new Hono();\n const { prefix = '/api' } = options;\n const dispatcher = new HttpDispatcher(options.kernel);\n\n app.use('*', cors());\n\n // --- Helper for Response Normalization ---\n const normalizeResponse = (c: any, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n return c.json(result.response.body, result.response.status as any, result.response.headers);\n }\n if (result.result) {\n const res = result.result;\n // Redirect\n if (res.type === 'redirect' && res.url) {\n return c.redirect(res.url);\n }\n // Stream\n if (res.type === 'stream' && res.stream) {\n return c.body(res.stream, 200, res.headers);\n }\n \n // Hono handles standard Response objects\n return res;\n }\n }\n return c.json({ success: false, error: { message: 'Not Found', code: 404 } }, 404);\n }\n\n // --- 0. Discovery Endpoint ---\n app.get(prefix, (c) => {\n return c.json({ data: dispatcher.getDiscoveryInfo(prefix) });\n });\n\n // --- 1. Auth ---\n app.all(`${prefix}/auth/*`, async (c) => {\n try {\n // subpath from /api/auth/login -> login\n const path = c.req.path.substring(c.req.path.indexOf('/auth/') + 6);\n const body = await c.req.parseBody().catch(() => ({})); \n \n const result = await dispatcher.handleAuth(path, c.req.method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 2. GraphQL ---\n app.post(`${prefix}/graphql`, async (c) => {\n try {\n const body = await c.req.json();\n const result = await dispatcher.handleGraphQL(body, { request: c.req.raw });\n return c.json(result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 3. Metadata Endpoints ---\n app.all(`${prefix}/meta*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/meta') + 5);\n const method = c.req.method;\n let body = undefined;\n \n if (method === 'PUT' || method === 'POST') {\n // Attempt to parse JSON body\n try {\n body = await c.req.json();\n } catch (e) {\n // Ignore parse errors, body remains undefined or empty\n body = {};\n }\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleMetadata(path, { request: c.req.raw }, method, body, query);\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 4. Data Endpoints ---\n app.all(`${prefix}/data*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/data') + 5);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleData(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 5. Analytics Endpoints ---\n app.all(`${prefix}/analytics*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/analytics') + 10);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAnalytics(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 6. Hub Endpoints ---\n app.all(`${prefix}/hub*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/hub') + 4);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleHub(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 7. Automation Endpoints ---\n app.all(`${prefix}/automation*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/automation') + 11);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAutomation(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 8. Storage Endpoints ---\n app.all(`${prefix}/storage*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/storage') + 8);\n const method = c.req.method;\n \n let file: any = undefined;\n if (method === 'POST' && path.includes('upload')) {\n const body = await c.req.parseBody();\n file = body['file'];\n }\n\n const result = await dispatcher.handleStorage(path, method, file, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 9. Package Management Endpoints ---\n app.all(`${prefix}/packages*`, async (c) => {\n try {\n const packagesIndex = c.req.path.indexOf('/packages');\n const path = c.req.path.substring(packagesIndex + 9); // length of '/packages'\n const method = c.req.method;\n\n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handlePackages(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n return app;\n}\n\n/**\n * Middleware mode for existing Hono apps\n */\nexport function objectStackMiddleware(kernel: ObjectKernel) {\n return async (c: any, next: any) => {\n c.set('objectStack', kernel);\n await next();\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface ObjectStackHonoOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * @deprecated Use `HonoServerPlugin` + `createRestApiPlugin()` + `createDispatcherPlugin()` instead.\n * This function bundles all routes into a single Hono app using the legacy HttpDispatcher.\n * The plugin-based approach provides better modularity and separation of concerns.\n *\n * Migration:\n * ```ts\n * // Before:\n * const app = createHonoApp({ kernel, prefix: '/api/v1' });\n *\n * // After:\n * import { createRestApiPlugin } from '@objectstack/rest';\n * import { createDispatcherPlugin } from '@objectstack/runtime';\n * kernel.use(new HonoServerPlugin({ port: 3000 }));\n * kernel.use(createRestApiPlugin());\n * kernel.use(createDispatcherPlugin({ prefix: '/api/v1' }));\n * ```\n */\nexport function createHonoApp(options: ObjectStackHonoOptions) {\n const app = new Hono();\n const { prefix = '/api' } = options;\n const dispatcher = new HttpDispatcher(options.kernel);\n\n app.use('*', cors());\n\n // --- Helper for Response Normalization ---\n const normalizeResponse = (c: any, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n return c.json(result.response.body, result.response.status as any, result.response.headers);\n }\n if (result.result) {\n const res = result.result;\n // Redirect\n if (res.type === 'redirect' && res.url) {\n return c.redirect(res.url);\n }\n // Stream\n if (res.type === 'stream' && res.stream) {\n return c.body(res.stream, 200, res.headers);\n }\n \n // Hono handles standard Response objects\n return res;\n }\n }\n return c.json({ success: false, error: { message: 'Not Found', code: 404 } }, 404);\n }\n\n // --- 0. Discovery Endpoint ---\n app.get(prefix, (c) => {\n return c.json({ data: dispatcher.getDiscoveryInfo(prefix) });\n });\n\n // --- 1. Auth ---\n app.all(`${prefix}/auth/*`, async (c) => {\n try {\n // subpath from /api/auth/login -> login\n const path = c.req.path.substring(c.req.path.indexOf('/auth/') + 6);\n const body = await c.req.parseBody().catch(() => ({})); \n \n const result = await dispatcher.handleAuth(path, c.req.method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 2. GraphQL ---\n app.post(`${prefix}/graphql`, async (c) => {\n try {\n const body = await c.req.json();\n const result = await dispatcher.handleGraphQL(body, { request: c.req.raw });\n return c.json(result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 3. Metadata Endpoints ---\n app.all(`${prefix}/meta*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/meta') + 5);\n const method = c.req.method;\n let body = undefined;\n \n if (method === 'PUT' || method === 'POST') {\n // Attempt to parse JSON body\n try {\n body = await c.req.json();\n } catch (e) {\n // Ignore parse errors, body remains undefined or empty\n body = {};\n }\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleMetadata(path, { request: c.req.raw }, method, body, query);\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 4. Data Endpoints ---\n app.all(`${prefix}/data*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/data') + 5);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleData(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 5. Analytics Endpoints ---\n app.all(`${prefix}/analytics*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/analytics') + 10);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAnalytics(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 6. Hub Endpoints ---\n app.all(`${prefix}/hub*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/hub') + 4);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleHub(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 7. Automation Endpoints ---\n app.all(`${prefix}/automation*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/automation') + 11);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAutomation(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 8. Storage Endpoints ---\n app.all(`${prefix}/storage*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/storage') + 8);\n const method = c.req.method;\n \n let file: any = undefined;\n if (method === 'POST' && path.includes('upload')) {\n const body = await c.req.parseBody();\n file = body['file'];\n }\n\n const result = await dispatcher.handleStorage(path, method, file, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 9. Package Management Endpoints ---\n app.all(`${prefix}/packages*`, async (c) => {\n try {\n const packagesIndex = c.req.path.indexOf('/packages');\n const path = c.req.path.substring(packagesIndex + 9); // length of '/packages'\n const method = c.req.method;\n\n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handlePackages(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n return app;\n}\n\n/**\n * Middleware mode for existing Hono apps\n */\nexport function objectStackMiddleware(kernel: ObjectKernel) {\n return async (c: any, next: any) => {\n c.set('objectStack', kernel);\n await next();\n };\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface ObjectStackHonoOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Creates a Hono application tailored for ObjectStack\n * Fully compliant with @objectstack/spec\n */\nexport function createHonoApp(options: ObjectStackHonoOptions) {\n const app = new Hono();\n const { prefix = '/api' } = options;\n const dispatcher = new HttpDispatcher(options.kernel);\n\n app.use('*', cors());\n\n // --- Helper for Response Normalization ---\n const normalizeResponse = (c: any, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n return c.json(result.response.body, result.response.status as any, result.response.headers);\n }\n if (result.result) {\n const res = result.result;\n // Redirect\n if (res.type === 'redirect' && res.url) {\n return c.redirect(res.url);\n }\n // Stream\n if (res.type === 'stream' && res.stream) {\n return c.body(res.stream, 200, res.headers);\n }\n \n // Hono handles standard Response objects\n return res;\n }\n }\n return c.json({ success: false, error: { message: 'Not Found', code: 404 } }, 404);\n }\n\n // --- 0. Discovery Endpoint ---\n app.get(prefix, (c) => {\n return c.json({ data: dispatcher.getDiscoveryInfo(prefix) });\n });\n\n // --- 1. Auth ---\n app.all(`${prefix}/auth/*`, async (c) => {\n try {\n // subpath from /api/auth/login -> login\n const path = c.req.path.substring(c.req.path.indexOf('/auth/') + 6);\n const body = await c.req.parseBody().catch(() => ({})); \n \n const result = await dispatcher.handleAuth(path, c.req.method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 2. GraphQL ---\n app.post(`${prefix}/graphql`, async (c) => {\n try {\n const body = await c.req.json();\n const result = await dispatcher.handleGraphQL(body, { request: c.req.raw });\n return c.json(result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 3. Metadata Endpoints ---\n app.all(`${prefix}/meta*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/meta') + 5);\n const method = c.req.method;\n let body = undefined;\n \n if (method === 'PUT' || method === 'POST') {\n // Attempt to parse JSON body\n try {\n body = await c.req.json();\n } catch (e) {\n // Ignore parse errors, body remains undefined or empty\n body = {};\n }\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleMetadata(path, { request: c.req.raw }, method, body, query);\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 4. Data Endpoints ---\n app.all(`${prefix}/data*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/data') + 5);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleData(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 5. Analytics Endpoints ---\n app.all(`${prefix}/analytics*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/analytics') + 10);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAnalytics(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 6. Hub Endpoints ---\n app.all(`${prefix}/hub*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/hub') + 4);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleHub(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 7. Automation Endpoints ---\n app.all(`${prefix}/automation*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/automation') + 11);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAutomation(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 8. Storage Endpoints ---\n app.all(`${prefix}/storage*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/storage') + 8);\n const method = c.req.method;\n \n let file: any = undefined;\n if (method === 'POST' && path.includes('upload')) {\n const body = await c.req.parseBody();\n file = body['file'];\n }\n\n const result = await dispatcher.handleStorage(path, method, file, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 9. Package Management Endpoints ---\n app.all(`${prefix}/packages*`, async (c) => {\n try {\n const packagesIndex = c.req.path.indexOf('/packages');\n const path = c.req.path.substring(packagesIndex + 9); // length of '/packages'\n const method = c.req.method;\n\n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handlePackages(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n return app;\n}\n\n/**\n * Middleware mode for existing Hono apps\n */\nexport function objectStackMiddleware(kernel: ObjectKernel) {\n return async (c: any, next: any) => {\n c.set('objectStack', kernel);\n await next();\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface ObjectStackHonoOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * @deprecated Use `HonoServerPlugin` + `createRestApiPlugin()` + `createDispatcherPlugin()` instead.\n * This function bundles all routes into a single Hono app using the legacy HttpDispatcher.\n * The plugin-based approach provides better modularity and separation of concerns.\n *\n * Migration:\n * ```ts\n * // Before:\n * const app = createHonoApp({ kernel, prefix: '/api/v1' });\n *\n * // After:\n * import { createRestApiPlugin } from '@objectstack/rest';\n * import { createDispatcherPlugin } from '@objectstack/runtime';\n * kernel.use(new HonoServerPlugin({ port: 3000 }));\n * kernel.use(createRestApiPlugin());\n * kernel.use(createDispatcherPlugin({ prefix: '/api/v1' }));\n * ```\n */\nexport function createHonoApp(options: ObjectStackHonoOptions) {\n const app = new Hono();\n const { prefix = '/api' } = options;\n const dispatcher = new HttpDispatcher(options.kernel);\n\n app.use('*', cors());\n\n // --- Helper for Response Normalization ---\n const normalizeResponse = (c: any, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n return c.json(result.response.body, result.response.status as any, result.response.headers);\n }\n if (result.result) {\n const res = result.result;\n // Redirect\n if (res.type === 'redirect' && res.url) {\n return c.redirect(res.url);\n }\n // Stream\n if (res.type === 'stream' && res.stream) {\n return c.body(res.stream, 200, res.headers);\n }\n \n // Hono handles standard Response objects\n return res;\n }\n }\n return c.json({ success: false, error: { message: 'Not Found', code: 404 } }, 404);\n }\n\n // --- 0. Discovery Endpoint ---\n app.get(prefix, (c) => {\n return c.json({ data: dispatcher.getDiscoveryInfo(prefix) });\n });\n\n // --- 1. Auth ---\n app.all(`${prefix}/auth/*`, async (c) => {\n try {\n // subpath from /api/auth/login -> login\n const path = c.req.path.substring(c.req.path.indexOf('/auth/') + 6);\n const body = await c.req.parseBody().catch(() => ({})); \n \n const result = await dispatcher.handleAuth(path, c.req.method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 2. GraphQL ---\n app.post(`${prefix}/graphql`, async (c) => {\n try {\n const body = await c.req.json();\n const result = await dispatcher.handleGraphQL(body, { request: c.req.raw });\n return c.json(result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 3. Metadata Endpoints ---\n app.all(`${prefix}/meta*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/meta') + 5);\n const method = c.req.method;\n let body = undefined;\n \n if (method === 'PUT' || method === 'POST') {\n // Attempt to parse JSON body\n try {\n body = await c.req.json();\n } catch (e) {\n // Ignore parse errors, body remains undefined or empty\n body = {};\n }\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleMetadata(path, { request: c.req.raw }, method, body, query);\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 4. Data Endpoints ---\n app.all(`${prefix}/data*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/data') + 5);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleData(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 5. Analytics Endpoints ---\n app.all(`${prefix}/analytics*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/analytics') + 10);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAnalytics(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 6. Hub Endpoints ---\n app.all(`${prefix}/hub*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/hub') + 4);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleHub(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 7. Automation Endpoints ---\n app.all(`${prefix}/automation*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/automation') + 11);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAutomation(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 8. Storage Endpoints ---\n app.all(`${prefix}/storage*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/storage') + 8);\n const method = c.req.method;\n \n let file: any = undefined;\n if (method === 'POST' && path.includes('upload')) {\n const body = await c.req.parseBody();\n file = body['file'];\n }\n\n const result = await dispatcher.handleStorage(path, method, file, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 9. Package Management Endpoints ---\n app.all(`${prefix}/packages*`, async (c) => {\n try {\n const packagesIndex = c.req.path.indexOf('/packages');\n const path = c.req.path.substring(packagesIndex + 9); // length of '/packages'\n const method = c.req.method;\n\n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handlePackages(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n return app;\n}\n\n/**\n * Middleware mode for existing Hono apps\n */\nexport function objectStackMiddleware(kernel: ObjectKernel) {\n return async (c: any, next: any) => {\n c.set('objectStack', kernel);\n await next();\n };\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectstack/hono",
3
- "version": "1.0.12",
3
+ "version": "2.0.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,12 +13,12 @@
13
13
  },
14
14
  "peerDependencies": {
15
15
  "hono": "^4.0.0",
16
- "@objectstack/runtime": "1.0.12"
16
+ "@objectstack/runtime": "2.0.0"
17
17
  },
18
18
  "devDependencies": {
19
19
  "hono": "^4.0.0",
20
20
  "typescript": "^5.0.0",
21
- "@objectstack/runtime": "1.0.12"
21
+ "@objectstack/runtime": "2.0.0"
22
22
  },
23
23
  "scripts": {
24
24
  "build": "tsup --config ../../../tsup.config.ts"
package/src/index.ts CHANGED
@@ -1,3 +1,5 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+
1
3
  import { Hono } from 'hono';
2
4
  import { cors } from 'hono/cors';
3
5
  import { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';
@@ -8,8 +10,22 @@ export interface ObjectStackHonoOptions {
8
10
  }
9
11
 
10
12
  /**
11
- * Creates a Hono application tailored for ObjectStack
12
- * Fully compliant with @objectstack/spec
13
+ * @deprecated Use `HonoServerPlugin` + `createRestApiPlugin()` + `createDispatcherPlugin()` instead.
14
+ * This function bundles all routes into a single Hono app using the legacy HttpDispatcher.
15
+ * The plugin-based approach provides better modularity and separation of concerns.
16
+ *
17
+ * Migration:
18
+ * ```ts
19
+ * // Before:
20
+ * const app = createHonoApp({ kernel, prefix: '/api/v1' });
21
+ *
22
+ * // After:
23
+ * import { createRestApiPlugin } from '@objectstack/rest';
24
+ * import { createDispatcherPlugin } from '@objectstack/runtime';
25
+ * kernel.use(new HonoServerPlugin({ port: 3000 }));
26
+ * kernel.use(createRestApiPlugin());
27
+ * kernel.use(createDispatcherPlugin({ prefix: '/api/v1' }));
28
+ * ```
13
29
  */
14
30
  export function createHonoApp(options: ObjectStackHonoOptions) {
15
31
  const app = new Hono();