@voyant-travel/hono 0.116.1 → 0.117.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.
package/dist/app.d.ts CHANGED
@@ -1,5 +1,10 @@
1
- import { Hono } from "hono";
1
+ import type { Hono } from "hono";
2
2
  import type { VoyantAppConfig, VoyantBindings, VoyantVariables } from "./types.js";
3
+ /** The composed app's Hono env (bindings + framework request variables). */
4
+ type MountEnv<TBindings extends VoyantBindings> = {
5
+ Bindings: TBindings;
6
+ Variables: VoyantVariables;
7
+ };
3
8
  /**
4
9
  * App handle returned alongside the Hono instance. Carries `ready()` for
5
10
  * headless / sibling-process deployments that need to fire the lazy
@@ -43,8 +48,6 @@ export interface VoyantAppExtensions<TBindings = unknown> {
43
48
  * from a manifest + registry + capabilities and delegates here. Use `mountApp`
44
49
  * directly only when you have the resolved set in hand (tests, advanced hosts).
45
50
  */
46
- export declare function mountApp<TBindings extends VoyantBindings>(config: VoyantAppConfig<TBindings>): Hono<{
47
- Bindings: TBindings;
48
- Variables: VoyantVariables;
49
- }> & VoyantAppExtensions<TBindings>;
51
+ export declare function mountApp<TBindings extends VoyantBindings>(config: VoyantAppConfig<TBindings>): Hono<MountEnv<TBindings>> & VoyantAppExtensions<TBindings>;
52
+ export {};
50
53
  //# sourceMappingURL=app.d.ts.map
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAkC3B,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAY,eAAe,EAAE,MAAM,YAAY,CAAA;AAyB5F;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB,CAAC,SAAS,GAAG,OAAO;IACtD;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C;;;;;;;;OAQG;IACH,QAAQ,EAAE,OAAO,qBAAqB,EAAE,QAAQ,CAAA;CACjD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,SAAS,SAAS,cAAc,EACvD,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC,GACjC,IAAI,CAAC;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,eAAe,CAAA;CAAE,CAAC,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAke5F"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAkChC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAY,eAAe,EAAE,MAAM,YAAY,CAAA;AAI5F,4EAA4E;AAC5E,KAAK,QAAQ,CAAC,SAAS,SAAS,cAAc,IAAI;IAChD,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,EAAE,eAAe,CAAA;CAC3B,CAAA;AAuBD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB,CAAC,SAAS,GAAG,OAAO;IACtD;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C;;;;;;;;OAQG;IACH,QAAQ,EAAE,OAAO,qBAAqB,EAAE,QAAQ,CAAA;CACjD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,SAAS,SAAS,cAAc,EACvD,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC,GACjC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAue5D"}
package/dist/app.js CHANGED
@@ -1,6 +1,8 @@
1
+ // agent-quality: file-size exception — app.ts is the framework composition root;
2
+ // splitting it is intentional follow-up work, not part of voyant#2114.
3
+ import { OpenAPIHono } from "@hono/zod-openapi";
1
4
  import { createContainer, createEventBus, createQueryRunner, } from "@voyant-travel/core";
2
5
  import { createOutboxEventStore } from "@voyant-travel/db/outbox";
3
- import { Hono } from "hono";
4
6
  import { assembleAnonymousPaths } from "./anonymous-paths.js";
5
7
  import { containerToServiceResolver, makeFrameworkLogger, wireWorkflowRuntime, } from "./app-workflows.js";
6
8
  import { mountLazyRoutePaths, mountLazyRoutesAt } from "./lazy-routes.js";
@@ -45,7 +47,13 @@ function buildRateLimitPolicy(config, env, bucket, defaults) {
45
47
  * directly only when you have the resolved set in hand (tests, advanced hosts).
46
48
  */
47
49
  export function mountApp(config) {
48
- const app = new Hono();
50
+ // Composed root is an OpenAPIHono (a drop-in Hono superclass) so module routes
51
+ // authored with `.openapi()` register here and the spec can be generated via
52
+ // `@voyant-travel/hono/openapi` at build time. The doc *generator*
53
+ // (`@asteasolutions/zod-to-openapi` + `openapi3-ts`) is only reachable through
54
+ // `getOpenAPIDocument`, so it tree-shakes out of the Worker bundle; the
55
+ // OpenAPIHono registry + validator glue (~35 KB) is the only runtime cost.
56
+ const app = new OpenAPIHono();
49
57
  // Observability sink (RFC #1553) — resolved once and reused by both the
50
58
  // outer onError and the forwarded auth sub-app catch point below.
51
59
  const reporter = config.reporter ?? noopReporter;
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export { clientIpKey, consoleLoggerProvider, cors, DEFAULT_IDEMPOTENCY_TTL_MS, d
12
12
  export type { HonoExtension, HonoModule } from "./module.js";
13
13
  export type { ErrorEvent, Reporter } from "./observability/index.js";
14
14
  export { consoleReporter, getRequestId, noopReporter, runWithRequestId, safeCaptureException, } from "./observability/index.js";
15
+ export { openApiValidationHook } from "./openapi-validation.js";
15
16
  export type { ExpandedHonoBundles, ExpandedHonoPlugins, HonoBundle, HonoPlugin, } from "./plugin.js";
16
17
  export { defineHonoBundle, defineHonoPlugin, expandHonoBundles, expandHonoPlugins, } from "./plugin.js";
17
18
  export type { CreatePublicCapabilityOptions, PublicCapabilityCookieOptions, PublicCapabilityPayload, VerifyPublicCapabilityOptions, } from "./public-capability.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ export { createLazyRouteHandler, mountLazyRoutePaths, mountLazyRoutesAt, } from
7
7
  export { createPathDbSelector } from "./lib/db-selector.js";
8
8
  export { clientIpKey, consoleLoggerProvider, cors, DEFAULT_IDEMPOTENCY_TTL_MS, db, enforceRateLimit, errorBoundary, handleApiError, idempotencyKey, isStaffRbacEnforced, LIVE_LIMITS, logger, purgeExpiredIdempotencyKeys, rateLimit, requestId, requireActor, requireAuth, requirePermission, } from "./middleware/index.js";
9
9
  export { consoleReporter, getRequestId, noopReporter, runWithRequestId, safeCaptureException, } from "./observability/index.js";
10
+ export { openApiValidationHook } from "./openapi-validation.js";
10
11
  export { defineHonoBundle, defineHonoPlugin, expandHonoBundles, expandHonoPlugins, } from "./plugin.js";
11
12
  export { createPublicCapabilityToken, extractPublicCapabilityToken, serializePublicCapabilityCookie, verifyPublicCapabilityToken, } from "./public-capability.js";
12
13
  export { createDrizzlePublicDocumentDeliveryGrantStore, createPublicDocumentDeliveryGrant, createPublicDocumentDeliveryHonoModule, createPublicDocumentDeliveryRoutes, resolvePublicDocumentDeliveryGrant, revokePublicDocumentDeliveryGrant, } from "./public-document-delivery.js";
@@ -0,0 +1,20 @@
1
+ import type { Hook } from "@hono/zod-openapi";
2
+ /**
3
+ * Shared `OpenAPIHono` `defaultHook` (voyant#2114).
4
+ *
5
+ * `@hono/zod-openapi` validates `request` schemas before the handler runs;
6
+ * without a hook it returns `@hono/zod-validator`'s raw `safeParse` result as a
7
+ * bare 400, bypassing the framework's `parseQuery`/`parseJsonBody` path and the
8
+ * shared `{ error, code: "invalid_request", requestId, details }` contract that
9
+ * clients and the error-boundary rely on. This hook re-routes failures through
10
+ * the same `RequestValidationError` so `.openapi()` routes stay on-contract.
11
+ *
12
+ * Every module that constructs an `OpenAPIHono` must pass it:
13
+ *
14
+ * new OpenAPIHono<Env>({ defaultHook: openApiValidationHook })
15
+ *
16
+ * (Validation runs on the instance that owns the route, so a hook on the
17
+ * composed root app does NOT cover mounted module sub-apps.)
18
+ */
19
+ export declare const openApiValidationHook: Hook<any, any, any, unknown>;
20
+ //# sourceMappingURL=openapi-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-validation.d.ts","sourceRoot":"","sources":["../src/openapi-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAG7C;;;;;;;;;;;;;;;;GAgBG;AAIH,eAAO,MAAM,qBAAqB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAI9D,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { normalizeValidationError, RequestValidationError } from "./validation.js";
2
+ /**
3
+ * Shared `OpenAPIHono` `defaultHook` (voyant#2114).
4
+ *
5
+ * `@hono/zod-openapi` validates `request` schemas before the handler runs;
6
+ * without a hook it returns `@hono/zod-validator`'s raw `safeParse` result as a
7
+ * bare 400, bypassing the framework's `parseQuery`/`parseJsonBody` path and the
8
+ * shared `{ error, code: "invalid_request", requestId, details }` contract that
9
+ * clients and the error-boundary rely on. This hook re-routes failures through
10
+ * the same `RequestValidationError` so `.openapi()` routes stay on-contract.
11
+ *
12
+ * Every module that constructs an `OpenAPIHono` must pass it:
13
+ *
14
+ * new OpenAPIHono<Env>({ defaultHook: openApiValidationHook })
15
+ *
16
+ * (Validation runs on the instance that owns the route, so a hook on the
17
+ * composed root app does NOT cover mounted module sub-apps.)
18
+ */
19
+ // Typed as the library's own `defaultHook` shape (`Hook<any, E, any, any>`) so
20
+ // it stays assignable for every module's specific `OpenAPIHono<Env>`.
21
+ // biome-ignore lint/suspicious/noExplicitAny: matches @hono/zod-openapi's defaultHook signature
22
+ export const openApiValidationHook = (result) => {
23
+ if (!result.success) {
24
+ throw normalizeValidationError(result.error) ?? new RequestValidationError("Invalid request");
25
+ }
26
+ };
@@ -0,0 +1,58 @@
1
+ import type { OpenAPIHono } from "@hono/zod-openapi";
2
+ import type { Hono } from "hono";
3
+ /**
4
+ * OpenAPI document generation for composed Voyant apps (voyant#2114).
5
+ *
6
+ * The app returned by `createApp`/`mountApp` is an `OpenAPIHono` under the hood
7
+ * (typed as `Hono` for callers), so the helpers here cast to reach
8
+ * `getOpenAPIDocument`. Only routes authored via `createRoute(...).openapi(...)`
9
+ * contribute operations — plain routes are absent until migrated.
10
+ *
11
+ * Import these from `@voyant-travel/hono/openapi`, never from the package
12
+ * barrel: `getOpenAPIDocument` pulls in `@asteasolutions/zod-to-openapi`, which
13
+ * must stay out of the Worker runtime bundle. This module is meant for
14
+ * build-time generation only.
15
+ */
16
+ export interface OpenApiInfo {
17
+ title: string;
18
+ version: string;
19
+ description?: string;
20
+ /** OpenAPI spec extension fields (`x-*`), matching the doc's `InfoObject`. */
21
+ [extension: `x-${string}`]: unknown;
22
+ }
23
+ export interface OpenApiServer {
24
+ url: string;
25
+ description?: string;
26
+ [extension: `x-${string}`]: unknown;
27
+ }
28
+ export interface GenerateOpenApiOptions {
29
+ info: OpenApiInfo;
30
+ servers?: OpenApiServer[];
31
+ }
32
+ type AnyApp = Hono<any, any, any>;
33
+ /**
34
+ * An OpenAPI 3.1 document, as produced by `OpenAPIHono`. Named via the direct
35
+ * dependency's method type so the inferred type stays portable (TS2883).
36
+ */
37
+ export type OpenApiDocument = ReturnType<OpenAPIHono["getOpenAPI31Document"]>;
38
+ /**
39
+ * Generate a single OpenAPI 3.1 document covering every `.openapi()` route
40
+ * mounted on the composed app, with module base paths already merged in
41
+ * (honojs/middleware#952).
42
+ */
43
+ export declare function generateOpenApiDocument(app: AnyApp, options: GenerateOpenApiOptions): OpenApiDocument;
44
+ /**
45
+ * Voyant's two published API surfaces, keyed by path prefix. Admin routes mount
46
+ * under `/v1/admin/*` and storefront/public routes under `/v1/public/*`; the
47
+ * legacy `/v1/*` surface is intentionally excluded from the published docs.
48
+ */
49
+ export type ApiSurface = "admin" | "storefront";
50
+ /**
51
+ * Narrow a composed document to a single surface by path prefix, producing the
52
+ * `framework-admin` / `framework-storefront` documents that replace the
53
+ * hand-authored specs. Components are carried over verbatim (the generator may
54
+ * over-include shared component schemas, which is harmless).
55
+ */
56
+ export declare function selectSurface(doc: OpenApiDocument, surface: ApiSurface): OpenApiDocument;
57
+ export {};
58
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8EAA8E;IAC9E,CAAC,SAAS,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAA;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,CAAC,SAAS,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAA;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAA;CAC1B;AAGD,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAEjC;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAA;AAE7E;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CASjB;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,YAAY,CAAA;AAO/C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,GAAG,eAAe,CAMxF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Generate a single OpenAPI 3.1 document covering every `.openapi()` route
3
+ * mounted on the composed app, with module base paths already merged in
4
+ * (honojs/middleware#952).
5
+ */
6
+ export function generateOpenApiDocument(app, options) {
7
+ // The composed app is an `OpenAPIHono` (built in `mountApp`) presented to
8
+ // callers as `Hono`; this build-time seam narrows it back to read the doc.
9
+ const oapi = app;
10
+ return oapi.getOpenAPI31Document({
11
+ openapi: "3.1.0",
12
+ info: options.info,
13
+ ...(options.servers ? { servers: options.servers } : {}),
14
+ });
15
+ }
16
+ const SURFACE_PREFIX = {
17
+ admin: "/v1/admin",
18
+ storefront: "/v1/public",
19
+ };
20
+ /**
21
+ * Narrow a composed document to a single surface by path prefix, producing the
22
+ * `framework-admin` / `framework-storefront` documents that replace the
23
+ * hand-authored specs. Components are carried over verbatim (the generator may
24
+ * over-include shared component schemas, which is harmless).
25
+ */
26
+ export function selectSurface(doc, surface) {
27
+ const prefix = SURFACE_PREFIX[surface];
28
+ const paths = Object.fromEntries(Object.entries(doc.paths ?? {}).filter(([path]) => path.startsWith(prefix)));
29
+ return { ...doc, paths };
30
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyant-travel/hono",
3
- "version": "0.116.1",
3
+ "version": "0.117.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -14,6 +14,11 @@
14
14
  "import": "./dist/app.js",
15
15
  "default": "./dist/app.js"
16
16
  },
17
+ "./openapi": {
18
+ "types": "./dist/openapi.d.ts",
19
+ "import": "./dist/openapi.js",
20
+ "default": "./dist/openapi.js"
21
+ },
17
22
  "./module": {
18
23
  "types": "./dist/module.d.ts",
19
24
  "import": "./dist/module.js",
@@ -49,6 +54,11 @@
49
54
  "import": "./dist/observability/index.js",
50
55
  "default": "./dist/observability/index.js"
51
56
  },
57
+ "./observability/reporter": {
58
+ "types": "./dist/observability/reporter.d.ts",
59
+ "import": "./dist/observability/reporter.js",
60
+ "default": "./dist/observability/reporter.js"
61
+ },
52
62
  "./middleware": {
53
63
  "types": "./dist/middleware/index.d.ts",
54
64
  "import": "./dist/middleware/index.js",
@@ -121,22 +131,23 @@
121
131
  }
122
132
  },
123
133
  "dependencies": {
134
+ "@hono/zod-openapi": "^1.4.0",
124
135
  "drizzle-orm": "^0.45.2",
125
136
  "hono": "^4.12.10",
126
137
  "zod": "^4.3.6",
127
138
  "@voyant-travel/core": "^0.111.0",
139
+ "@voyant-travel/db": "^0.109.4",
128
140
  "@voyant-travel/storage": "^0.105.0",
129
- "@voyant-travel/db": "^0.109.2",
130
141
  "@voyant-travel/types": "^0.106.0",
131
142
  "@voyant-travel/utils": "^0.105.4",
132
- "@voyant-travel/workflows": "^0.111.7"
143
+ "@voyant-travel/workflows": "^0.111.9"
133
144
  },
134
145
  "devDependencies": {
135
146
  "@cloudflare/workers-types": "^4.20260426.1",
136
147
  "typescript": "^6.0.2",
137
148
  "vitest": "^4.1.2",
138
149
  "@voyant-travel/voyant-typescript-config": "^0.1.0",
139
- "@voyant-travel/workflows-orchestrator": "^0.111.7"
150
+ "@voyant-travel/workflows-orchestrator": "^0.111.9"
140
151
  },
141
152
  "files": [
142
153
  "dist"