vocs 2.0.17 → 2.1.2
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/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/globals.d.ts +16 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/config.d.ts +28 -0
- package/dist/internal/config.d.ts.map +1 -1
- package/dist/internal/config.js +10 -2
- package/dist/internal/config.js.map +1 -1
- package/dist/internal/llms.d.ts +21 -2
- package/dist/internal/llms.d.ts.map +1 -1
- package/dist/internal/llms.js +41 -1
- package/dist/internal/llms.js.map +1 -1
- package/dist/internal/markdown-negotiation.d.ts +36 -0
- package/dist/internal/markdown-negotiation.d.ts.map +1 -0
- package/dist/internal/markdown-negotiation.js +81 -0
- package/dist/internal/markdown-negotiation.js.map +1 -0
- package/dist/internal/markdown.d.ts.map +1 -1
- package/dist/internal/markdown.js +5 -0
- package/dist/internal/markdown.js.map +1 -1
- package/dist/internal/openapi/anchors.d.ts +25 -0
- package/dist/internal/openapi/anchors.d.ts.map +1 -0
- package/dist/internal/openapi/anchors.js +37 -0
- package/dist/internal/openapi/anchors.js.map +1 -0
- package/dist/internal/openapi/app.d.ts +89 -0
- package/dist/internal/openapi/app.d.ts.map +1 -0
- package/dist/internal/openapi/app.js +62 -0
- package/dist/internal/openapi/app.js.map +1 -0
- package/dist/internal/openapi/index.d.ts +8 -0
- package/dist/internal/openapi/index.d.ts.map +1 -0
- package/dist/internal/openapi/index.js +5 -0
- package/dist/internal/openapi/index.js.map +1 -0
- package/dist/internal/openapi/markdown.d.ts +42 -0
- package/dist/internal/openapi/markdown.d.ts.map +1 -0
- package/dist/internal/openapi/markdown.js +235 -0
- package/dist/internal/openapi/markdown.js.map +1 -0
- package/dist/internal/openapi/openapi.d.ts +187 -0
- package/dist/internal/openapi/openapi.d.ts.map +1 -0
- package/dist/internal/openapi/openapi.js +44 -0
- package/dist/internal/openapi/openapi.js.map +1 -0
- package/dist/internal/openapi/openrpc.d.ts +90 -0
- package/dist/internal/openapi/openrpc.d.ts.map +1 -0
- package/dist/internal/openapi/openrpc.js +213 -0
- package/dist/internal/openapi/openrpc.js.map +1 -0
- package/dist/internal/openapi/parser.d.ts +181 -0
- package/dist/internal/openapi/parser.d.ts.map +1 -0
- package/dist/internal/openapi/parser.js +329 -0
- package/dist/internal/openapi/parser.js.map +1 -0
- package/dist/internal/openapi/registry.d.ts +36 -0
- package/dist/internal/openapi/registry.d.ts.map +1 -0
- package/dist/internal/openapi/registry.js +79 -0
- package/dist/internal/openapi/registry.js.map +1 -0
- package/dist/internal/openapi/sample.d.ts +115 -0
- package/dist/internal/openapi/sample.d.ts.map +1 -0
- package/dist/internal/openapi/sample.js +434 -0
- package/dist/internal/openapi/sample.js.map +1 -0
- package/dist/internal/openapi/search.d.ts +19 -0
- package/dist/internal/openapi/search.d.ts.map +1 -0
- package/dist/internal/openapi/search.js +98 -0
- package/dist/internal/openapi/search.js.map +1 -0
- package/dist/internal/openapi/sidebar.d.ts +30 -0
- package/dist/internal/openapi/sidebar.d.ts.map +1 -0
- package/dist/internal/openapi/sidebar.js +67 -0
- package/dist/internal/openapi/sidebar.js.map +1 -0
- package/dist/internal/openapi/union.d.ts +36 -0
- package/dist/internal/openapi/union.d.ts.map +1 -0
- package/dist/internal/openapi/union.js +69 -0
- package/dist/internal/openapi/union.js.map +1 -0
- package/dist/internal/search.d.ts.map +1 -1
- package/dist/internal/search.js +20 -0
- package/dist/internal/search.js.map +1 -1
- package/dist/internal/vite-plugins.d.ts +12 -0
- package/dist/internal/vite-plugins.d.ts.map +1 -1
- package/dist/internal/vite-plugins.js +102 -11
- package/dist/internal/vite-plugins.js.map +1 -1
- package/dist/react/Badge.d.ts +2 -3
- package/dist/react/Badge.d.ts.map +1 -1
- package/dist/react/Layout.client.d.ts.map +1 -1
- package/dist/react/Layout.client.js +2 -2
- package/dist/react/Layout.client.js.map +1 -1
- package/dist/react/OpenApi.d.ts +6 -0
- package/dist/react/OpenApi.d.ts.map +1 -0
- package/dist/react/OpenApi.js +6 -0
- package/dist/react/OpenApi.js.map +1 -0
- package/dist/react/internal/CodeToHtml.client.d.ts +53 -2
- package/dist/react/internal/CodeToHtml.client.d.ts.map +1 -1
- package/dist/react/internal/CodeToHtml.client.js +154 -21
- package/dist/react/internal/CodeToHtml.client.js.map +1 -1
- package/dist/react/internal/Sidebar.d.ts.map +1 -1
- package/dist/react/internal/Sidebar.js +99 -2
- package/dist/react/internal/Sidebar.js.map +1 -1
- package/dist/react/internal/openapi/CodeSample.client.d.ts +21 -0
- package/dist/react/internal/openapi/CodeSample.client.d.ts.map +1 -0
- package/dist/react/internal/openapi/CodeSample.client.js +134 -0
- package/dist/react/internal/openapi/CodeSample.client.js.map +1 -0
- package/dist/react/internal/openapi/CollapsibleChildren.client.d.ts +17 -0
- package/dist/react/internal/openapi/CollapsibleChildren.client.d.ts.map +1 -0
- package/dist/react/internal/openapi/CollapsibleChildren.client.js +18 -0
- package/dist/react/internal/openapi/CollapsibleChildren.client.js.map +1 -0
- package/dist/react/internal/openapi/Disclosure.client.d.ts +28 -0
- package/dist/react/internal/openapi/Disclosure.client.d.ts.map +1 -0
- package/dist/react/internal/openapi/Disclosure.client.js +38 -0
- package/dist/react/internal/openapi/Disclosure.client.js.map +1 -0
- package/dist/react/internal/openapi/Endpoints.d.ts +26 -0
- package/dist/react/internal/openapi/Endpoints.d.ts.map +1 -0
- package/dist/react/internal/openapi/Endpoints.js +33 -0
- package/dist/react/internal/openapi/Endpoints.js.map +1 -0
- package/dist/react/internal/openapi/EndpointsView.d.ts +24 -0
- package/dist/react/internal/openapi/EndpointsView.d.ts.map +1 -0
- package/dist/react/internal/openapi/EndpointsView.js +26 -0
- package/dist/react/internal/openapi/EndpointsView.js.map +1 -0
- package/dist/react/internal/openapi/EnumValues.client.d.ts +14 -0
- package/dist/react/internal/openapi/EnumValues.client.d.ts.map +1 -0
- package/dist/react/internal/openapi/EnumValues.client.js +20 -0
- package/dist/react/internal/openapi/EnumValues.client.js.map +1 -0
- package/dist/react/internal/openapi/HeadingAnchor.d.ts +15 -0
- package/dist/react/internal/openapi/HeadingAnchor.d.ts.map +1 -0
- package/dist/react/internal/openapi/HeadingAnchor.js +12 -0
- package/dist/react/internal/openapi/HeadingAnchor.js.map +1 -0
- package/dist/react/internal/openapi/OpenApiPage.d.ts +79 -0
- package/dist/react/internal/openapi/OpenApiPage.d.ts.map +1 -0
- package/dist/react/internal/openapi/OpenApiPage.js +72 -0
- package/dist/react/internal/openapi/OpenApiPage.js.map +1 -0
- package/dist/react/internal/openapi/Operation.d.ts +25 -0
- package/dist/react/internal/openapi/Operation.d.ts.map +1 -0
- package/dist/react/internal/openapi/Operation.js +101 -0
- package/dist/react/internal/openapi/Operation.js.map +1 -0
- package/dist/react/internal/openapi/Playground.client.d.ts +33 -0
- package/dist/react/internal/openapi/Playground.client.d.ts.map +1 -0
- package/dist/react/internal/openapi/Playground.client.js +170 -0
- package/dist/react/internal/openapi/Playground.client.js.map +1 -0
- package/dist/react/internal/openapi/PropertyExample.client.d.ts +17 -0
- package/dist/react/internal/openapi/PropertyExample.client.d.ts.map +1 -0
- package/dist/react/internal/openapi/PropertyExample.client.js +21 -0
- package/dist/react/internal/openapi/PropertyExample.client.js.map +1 -0
- package/dist/react/internal/openapi/Reference.d.ts +55 -0
- package/dist/react/internal/openapi/Reference.d.ts.map +1 -0
- package/dist/react/internal/openapi/Reference.js +42 -0
- package/dist/react/internal/openapi/Reference.js.map +1 -0
- package/dist/react/internal/openapi/Schema.d.ts +110 -0
- package/dist/react/internal/openapi/Schema.d.ts.map +1 -0
- package/dist/react/internal/openapi/Schema.js +239 -0
- package/dist/react/internal/openapi/Schema.js.map +1 -0
- package/dist/react/internal/openapi/SchemaUnion.client.d.ts +25 -0
- package/dist/react/internal/openapi/SchemaUnion.client.d.ts.map +1 -0
- package/dist/react/internal/openapi/SchemaUnion.client.js +48 -0
- package/dist/react/internal/openapi/SchemaUnion.client.js.map +1 -0
- package/dist/react/internal/openapi/anchor-navigation.client.d.ts +47 -0
- package/dist/react/internal/openapi/anchor-navigation.client.d.ts.map +1 -0
- package/dist/react/internal/openapi/anchor-navigation.client.js +120 -0
- package/dist/react/internal/openapi/anchor-navigation.client.js.map +1 -0
- package/dist/react/internal/openapi/auth.d.ts +28 -0
- package/dist/react/internal/openapi/auth.d.ts.map +1 -0
- package/dist/react/internal/openapi/auth.js +75 -0
- package/dist/react/internal/openapi/auth.js.map +1 -0
- package/dist/react/useLayout.d.ts +2 -0
- package/dist/react/useLayout.d.ts.map +1 -1
- package/dist/react/useLayout.js +2 -0
- package/dist/react/useLayout.js.map +1 -1
- package/dist/server/handlers.d.ts +1 -1
- package/dist/server/handlers.d.ts.map +1 -1
- package/dist/server/handlers.js +26 -5
- package/dist/server/handlers.js.map +1 -1
- package/dist/server/og-assets.d.ts +5 -0
- package/dist/server/og-assets.d.ts.map +1 -0
- package/dist/server/og-assets.js +11 -0
- package/dist/server/og-assets.js.map +1 -0
- package/dist/server/openapi/assets.d.ts +33 -0
- package/dist/server/openapi/assets.d.ts.map +1 -0
- package/dist/server/openapi/assets.generated.d.ts +9 -0
- package/dist/server/openapi/assets.generated.d.ts.map +1 -0
- package/dist/server/openapi/assets.generated.js +1091 -0
- package/dist/server/openapi/assets.generated.js.map +1 -0
- package/dist/server/openapi/assets.js +32 -0
- package/dist/server/openapi/assets.js.map +1 -0
- package/dist/server/openapi/handler.d.ts +103 -0
- package/dist/server/openapi/handler.d.ts.map +1 -0
- package/dist/server/openapi/handler.js +198 -0
- package/dist/server/openapi/handler.js.map +1 -0
- package/dist/server/openapi/handler.test.d.ts +2 -0
- package/dist/server/openapi/handler.test.d.ts.map +1 -0
- package/dist/server/openapi/handler.test.js +203 -0
- package/dist/server/openapi/handler.test.js.map +1 -0
- package/dist/server/openapi/html.d.ts +16 -0
- package/dist/server/openapi/html.d.ts.map +1 -0
- package/dist/server/openapi/html.js +75 -0
- package/dist/server/openapi/html.js.map +1 -0
- package/dist/server/openapi/pages.d.ts +33 -0
- package/dist/server/openapi/pages.d.ts.map +1 -0
- package/dist/server/openapi/pages.js +130 -0
- package/dist/server/openapi/pages.js.map +1 -0
- package/dist/server/openapi/pages.test.d.ts +2 -0
- package/dist/server/openapi/pages.test.d.ts.map +1 -0
- package/dist/server/openapi/pages.test.js +94 -0
- package/dist/server/openapi/pages.test.js.map +1 -0
- package/dist/server/openapi/state.d.ts +42 -0
- package/dist/server/openapi/state.d.ts.map +1 -0
- package/dist/server/openapi/state.js +101 -0
- package/dist/server/openapi/state.js.map +1 -0
- package/dist/styles/index.css +16 -0
- package/dist/styles/markdown.css +9 -7
- package/dist/styles/openapi-playground.css +80 -0
- package/dist/styles/openapi.css +660 -0
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +1 -0
- package/dist/vite.js.map +1 -1
- package/dist/waku/internal/middleware/md-router.d.ts +0 -4
- package/dist/waku/internal/middleware/md-router.d.ts.map +1 -1
- package/dist/waku/internal/middleware/md-router.js +3 -48
- package/dist/waku/internal/middleware/md-router.js.map +1 -1
- package/dist/waku/internal/patches/adapters/vercel-build-enhancer.js +1 -1
- package/dist/waku/internal/patches/adapters/vercel-build-enhancer.js.map +1 -1
- package/dist/waku/internal/patches/router.d.ts.map +1 -1
- package/dist/waku/internal/patches/router.js +114 -1
- package/dist/waku/internal/patches/router.js.map +1 -1
- package/package.json +5 -1
- package/src/config.ts +1 -0
- package/src/globals.d.ts +16 -0
- package/src/index.ts +1 -0
- package/src/internal/config.ts +40 -1
- package/src/internal/llms.ts +51 -1
- package/src/internal/markdown-negotiation.test.ts +42 -0
- package/src/internal/markdown-negotiation.ts +95 -0
- package/src/internal/markdown.ts +5 -0
- package/src/internal/openapi/anchors.ts +44 -0
- package/src/internal/openapi/app.ts +127 -0
- package/src/internal/openapi/index.ts +24 -0
- package/src/internal/openapi/markdown.test.ts +115 -0
- package/src/internal/openapi/markdown.ts +275 -0
- package/src/internal/openapi/openapi.ts +212 -0
- package/src/internal/openapi/openrpc.test.ts +239 -0
- package/src/internal/openapi/openrpc.ts +295 -0
- package/src/internal/openapi/parser.test.ts +203 -0
- package/src/internal/openapi/parser.ts +613 -0
- package/src/internal/openapi/registry.test.ts +89 -0
- package/src/internal/openapi/registry.ts +89 -0
- package/src/internal/openapi/sample.test.ts +283 -0
- package/src/internal/openapi/sample.ts +562 -0
- package/src/internal/openapi/search.test.ts +62 -0
- package/src/internal/openapi/search.ts +108 -0
- package/src/internal/openapi/sidebar.test.ts +131 -0
- package/src/internal/openapi/sidebar.ts +94 -0
- package/src/internal/openapi/union.test.ts +51 -0
- package/src/internal/openapi/union.ts +74 -0
- package/src/internal/search.ts +20 -0
- package/src/internal/test/virtual-config.stub.ts +14 -0
- package/src/internal/vite-plugins.ts +106 -11
- package/src/openapi-app/App.tsx +64 -0
- package/src/openapi-app/blocks.tsx +33 -0
- package/src/openapi-app/client.tsx +25 -0
- package/src/openapi-app/links.test.ts +84 -0
- package/src/openapi-app/links.ts +66 -0
- package/src/openapi-app/payload.ts +20 -0
- package/src/openapi-app/virtual/config.ts +7 -0
- package/src/openapi-app/virtual/group-icons.ts +2 -0
- package/src/openapi-app/virtual/langs.ts +6 -0
- package/src/openapi-app/virtual/openapi.ts +10 -0
- package/src/openapi-app/virtual/search-index.ts +21 -0
- package/src/openapi-app/virtual/slots.ts +4 -0
- package/src/openapi-app/virtual/user-styles.ts +2 -0
- package/src/openapi-app/waku.tsx +154 -0
- package/src/react/Badge.tsx +2 -3
- package/src/react/Layout.client.tsx +17 -4
- package/src/react/OpenApi.tsx +5 -0
- package/src/react/internal/CodeToHtml.client.tsx +283 -22
- package/src/react/internal/Sidebar.tsx +126 -22
- package/src/react/internal/openapi/CodeSample.client.tsx +294 -0
- package/src/react/internal/openapi/CollapsibleChildren.client.tsx +41 -0
- package/src/react/internal/openapi/Disclosure.client.tsx +67 -0
- package/src/react/internal/openapi/Endpoints.tsx +58 -0
- package/src/react/internal/openapi/EndpointsView.tsx +76 -0
- package/src/react/internal/openapi/EnumValues.client.tsx +49 -0
- package/src/react/internal/openapi/HeadingAnchor.tsx +28 -0
- package/src/react/internal/openapi/OpenApiPage.tsx +173 -0
- package/src/react/internal/openapi/Operation.test.tsx +101 -0
- package/src/react/internal/openapi/Operation.tsx +335 -0
- package/src/react/internal/openapi/Playground.client.tsx +234 -0
- package/src/react/internal/openapi/PropertyExample.client.tsx +55 -0
- package/src/react/internal/openapi/Reference.tsx +120 -0
- package/src/react/internal/openapi/Schema.tsx +467 -0
- package/src/react/internal/openapi/SchemaUnion.client.tsx +123 -0
- package/src/react/internal/openapi/anchor-navigation.client.ts +154 -0
- package/src/react/internal/openapi/auth.ts +69 -0
- package/src/react/useLayout.ts +4 -0
- package/src/server/handlers.ts +31 -6
- package/src/server/og-assets.ts +14 -0
- package/src/server/openapi/assets.generated.ts +1093 -0
- package/src/server/openapi/assets.ts +57 -0
- package/src/server/openapi/handler.test.ts +244 -0
- package/src/server/openapi/handler.ts +277 -0
- package/src/server/openapi/html.ts +84 -0
- package/src/server/openapi/pages.test.ts +111 -0
- package/src/server/openapi/pages.ts +153 -0
- package/src/server/openapi/state.ts +136 -0
- package/src/styles/index.css +16 -0
- package/src/styles/markdown.css +9 -7
- package/src/styles/openapi-playground.css +80 -0
- package/src/styles/openapi.css +660 -0
- package/src/vite.ts +1 -0
- package/src/waku/internal/middleware/md-router.ts +8 -52
- package/src/waku/internal/patches/adapters/vercel-build-enhancer.ts +1 -1
- package/src/waku/internal/patches/router.ts +131 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.generated.js","sourceRoot":"","sources":["../../../src/server/openapi/assets.generated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { assets } from './assets.generated.js';
|
|
2
|
+
/** URL path segment under which standalone assets are served. */
|
|
3
|
+
export const assetRoot = '/_vocs/openapi/';
|
|
4
|
+
/** Returns the prebuilt bundle manifest. */
|
|
5
|
+
export function manifest() {
|
|
6
|
+
return assets;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Resolves a request pathname to a bundled asset, matching by the
|
|
10
|
+
* {@link assetRoot} marker so assets resolve regardless of the Hono mount path
|
|
11
|
+
* (e.g. `/docs/_vocs/openapi/client.js` → `client.js`).
|
|
12
|
+
*/
|
|
13
|
+
export function match(pathname) {
|
|
14
|
+
const index = pathname.lastIndexOf(assetRoot);
|
|
15
|
+
if (index === -1)
|
|
16
|
+
return undefined;
|
|
17
|
+
const name = pathname.slice(index + assetRoot.length);
|
|
18
|
+
return assets.files[name];
|
|
19
|
+
}
|
|
20
|
+
/** Builds a `Response` for a bundled asset with long-lived caching. */
|
|
21
|
+
export function response(asset) {
|
|
22
|
+
const body = asset.encoding === 'base64'
|
|
23
|
+
? Uint8Array.from(atob(asset.body), (c) => c.charCodeAt(0))
|
|
24
|
+
: asset.body;
|
|
25
|
+
return new Response(body, {
|
|
26
|
+
headers: {
|
|
27
|
+
'content-type': asset.type,
|
|
28
|
+
'cache-control': 'public, max-age=31536000, immutable',
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/server/openapi/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAwB9C,iEAAiE;AACjE,MAAM,CAAC,MAAM,SAAS,GAAG,iBAAiB,CAAA;AAE1C,4CAA4C;AAC5C,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,QAAgB;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IAC7C,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;IACrD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,QAAQ,CAAC,KAAgB;IACvC,MAAM,IAAI,GACR,KAAK,CAAC,QAAQ,KAAK,QAAQ;QACzB,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;IAChB,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,OAAO,EAAE;YACP,cAAc,EAAE,KAAK,CAAC,IAAI;YAC1B,eAAe,EAAE,qCAAqC;SACvD;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { getRequestListener } from '@hono/node-server';
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import type * as OpenApi from '../../internal/openapi/openapi.js';
|
|
4
|
+
/**
|
|
5
|
+
* A standalone OpenAPI reference handler: a Hono app augmented with a Node
|
|
6
|
+
* request `listener` so it can be mounted onto a Hono server (`app.route(...)`),
|
|
7
|
+
* served via the Web-standard `fetch`, or run with `node:http`.
|
|
8
|
+
*/
|
|
9
|
+
export type Handler<app extends Hono = Hono> = app & {
|
|
10
|
+
/** Node.js `(req, res)` request listener (for `http.createServer`). */
|
|
11
|
+
listener: ReturnType<typeof getRequestListener>;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Creates a standalone, mountable OpenAPI reference (Scalar-style, rendered
|
|
15
|
+
* entirely client-side by a prebuilt browser bundle shipped inside Vocs).
|
|
16
|
+
*
|
|
17
|
+
* Accepts the same config as a `vocs.config.ts` `openapi[]` entry, except `path`
|
|
18
|
+
* is optional (the mount location is provided by the host server; `path` only
|
|
19
|
+
* seeds generated link bases). Supply `pages` to add `.md`/`.mdx` override/guide
|
|
20
|
+
* content to the sidebar.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { Hono } from 'hono'
|
|
25
|
+
* import { Handler } from 'vocs/server'
|
|
26
|
+
*
|
|
27
|
+
* const app = new Hono()
|
|
28
|
+
* app.route('/docs', Handler.openApi({ spec: 'https://example.com/openapi.json' }))
|
|
29
|
+
* export default app
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* // Node.js
|
|
35
|
+
* import * as http from 'node:http'
|
|
36
|
+
* import { Handler } from 'vocs/server'
|
|
37
|
+
*
|
|
38
|
+
* const ref = Handler.openApi({ spec: './openapi.yaml' })
|
|
39
|
+
* http.createServer(ref.listener).listen(3000)
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function openApi(config: OpenApi.Config, options?: openApi.Options): Handler;
|
|
43
|
+
export declare namespace openApi {
|
|
44
|
+
type Options = {
|
|
45
|
+
/**
|
|
46
|
+
* Directory file-path specs/pages are resolved against.
|
|
47
|
+
* @default process.cwd()
|
|
48
|
+
*/
|
|
49
|
+
rootDir?: string | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Custom CSS injected into the shell `<head>` as an inline `<style>`, after
|
|
52
|
+
* the design-system stylesheets so it overrides them. Use it to tweak the
|
|
53
|
+
* standalone reference's theme without rebuilding the bundle.
|
|
54
|
+
*
|
|
55
|
+
* - A string of CSS.
|
|
56
|
+
* - `{ file }`: a path to a `.css` file, resolved against `rootDir` and read
|
|
57
|
+
* with `node:fs` (Node only; pass a string on filesystem-less runtimes).
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* Handler.openApi({ spec }, { css: ':root { --vocs-color-accent: #7c3aed }' })
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* Handler.openApi({ spec }, { css: { file: './api-theme.css' } })
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
css?: string | {
|
|
70
|
+
file: string;
|
|
71
|
+
} | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* How to handle requests that don't target one of the reference's own
|
|
74
|
+
* routes (the intro/landing, a group/page, or the asset root).
|
|
75
|
+
*
|
|
76
|
+
* - `'render'` (default): render the HTML shell for any path, so client-side
|
|
77
|
+
* deep links work when the handler owns the whole mount (standalone docs).
|
|
78
|
+
* - `'next'`: call Hono's `next()` so the host app handles the request. Use
|
|
79
|
+
* this when mounting at the host root next to other routes (e.g. a JSON
|
|
80
|
+
* API + JSON `notFound`):
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* app.route('/', Handler.openApi({ spec }, { fallback: 'next' }))
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* @default 'render'
|
|
88
|
+
*/
|
|
89
|
+
fallback?: 'render' | 'next' | undefined;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Composes multiple handlers onto a single Hono app mounted at `path`
|
|
94
|
+
* (default `/`).
|
|
95
|
+
*/
|
|
96
|
+
export declare function compose(handlers: readonly Handler[], options?: compose.Options): Handler;
|
|
97
|
+
export declare namespace compose {
|
|
98
|
+
type Options = {
|
|
99
|
+
/** Mount path for every composed handler. @default "/" */
|
|
100
|
+
path?: string | undefined;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/server/openapi/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAK3B,OAAO,KAAK,KAAK,OAAO,MAAM,mCAAmC,CAAA;AAMjE;;;;GAIG;AACH,MAAM,MAAM,OAAO,CAAC,GAAG,SAAS,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG;IACnD,uEAAuE;IACvE,QAAQ,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA;CAChD,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,GAAE,OAAO,CAAC,OAAY,GAAG,OAAO,CA2FtF;AAED,MAAM,CAAC,OAAO,WAAW,OAAO,CAAC;IAC/B,KAAK,OAAO,GAAG;QACb;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B;;;;;;;;;;;;;;;;;;WAkBG;QACH,GAAG,CAAC,EAAE,MAAM,GAAG;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;QAC3C;;;;;;;;;;;;;;;;WAgBG;QACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;KACzC,CAAA;CACF;AA0CD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,GAAE,OAAO,CAAC,OAAY,GAAG,OAAO,CAK5F;AAED,MAAM,CAAC,OAAO,WAAW,OAAO,CAAC;IAC/B,KAAK,OAAO,GAAG;QACb,0DAA0D;QAC1D,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACF"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { getRequestListener } from '@hono/node-server';
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { prefersMarkdown } from '../../internal/markdown-negotiation.js';
|
|
4
|
+
import { inferMount, join, knownRoutes } from '../../internal/openapi/app.js';
|
|
5
|
+
import * as Markdown from '../../internal/openapi/markdown.js';
|
|
6
|
+
import { normalizePath } from '../../internal/openapi/openapi.js';
|
|
7
|
+
import * as Assets from './assets.js';
|
|
8
|
+
import * as Html from './html.js';
|
|
9
|
+
import * as State from './state.js';
|
|
10
|
+
/**
|
|
11
|
+
* Creates a standalone, mountable OpenAPI reference (Scalar-style, rendered
|
|
12
|
+
* entirely client-side by a prebuilt browser bundle shipped inside Vocs).
|
|
13
|
+
*
|
|
14
|
+
* Accepts the same config as a `vocs.config.ts` `openapi[]` entry, except `path`
|
|
15
|
+
* is optional (the mount location is provided by the host server; `path` only
|
|
16
|
+
* seeds generated link bases). Supply `pages` to add `.md`/`.mdx` override/guide
|
|
17
|
+
* content to the sidebar.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { Hono } from 'hono'
|
|
22
|
+
* import { Handler } from 'vocs/server'
|
|
23
|
+
*
|
|
24
|
+
* const app = new Hono()
|
|
25
|
+
* app.route('/docs', Handler.openApi({ spec: 'https://example.com/openapi.json' }))
|
|
26
|
+
* export default app
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* // Node.js
|
|
32
|
+
* import * as http from 'node:http'
|
|
33
|
+
* import { Handler } from 'vocs/server'
|
|
34
|
+
*
|
|
35
|
+
* const ref = Handler.openApi({ spec: './openapi.yaml' })
|
|
36
|
+
* http.createServer(ref.listener).listen(3000)
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function openApi(config, options = {}) {
|
|
40
|
+
const app = new Hono();
|
|
41
|
+
// Parse the spec + compile pages once, lazily, and memoize. The first
|
|
42
|
+
// request's origin seeds `baseUrl` so a relative `x-openrpc` URL (e.g.
|
|
43
|
+
// `/openrpc.json`) can be fetched at runtime; the OpenRPC document is
|
|
44
|
+
// host-independent, so reusing the first origin across requests is correct.
|
|
45
|
+
let state;
|
|
46
|
+
const prepare = (baseUrl) => {
|
|
47
|
+
if (!state)
|
|
48
|
+
state = State.prepare(config, { rootDir: options.rootDir, baseUrl });
|
|
49
|
+
return state;
|
|
50
|
+
};
|
|
51
|
+
// Resolve custom CSS once, lazily, and memoize (a `file` read needs `node:fs`,
|
|
52
|
+
// so only touch it when a file is actually configured).
|
|
53
|
+
let css;
|
|
54
|
+
const resolveCss = () => {
|
|
55
|
+
if (!css)
|
|
56
|
+
css = State.resolveCss(options.css, { rootDir: options.rootDir });
|
|
57
|
+
return css;
|
|
58
|
+
};
|
|
59
|
+
app.get('*', async (c, next) => {
|
|
60
|
+
const { pathname, origin } = new URL(c.req.url);
|
|
61
|
+
// Serve a bundled asset if the path targets the asset root.
|
|
62
|
+
const asset = Assets.match(pathname);
|
|
63
|
+
if (asset)
|
|
64
|
+
return Assets.response(asset);
|
|
65
|
+
const payload = await prepare(origin);
|
|
66
|
+
const routes = knownRoutes(payload);
|
|
67
|
+
// Serve the Markdown / agent-facing version of a route: `<route>.md`, any
|
|
68
|
+
// route requested with `Accept: text/markdown`, or an AI/terminal client.
|
|
69
|
+
// Shares the exact negotiation rules of the site `.md` router (Open Graph
|
|
70
|
+
// bots and search engines stay on HTML). Generated routes (overview +
|
|
71
|
+
// categories) win over overrides, and authored guide pages serve their own
|
|
72
|
+
// Markdown.
|
|
73
|
+
const wantsMarkdown = prefersMarkdown({
|
|
74
|
+
pathname,
|
|
75
|
+
userAgent: c.req.header('user-agent'),
|
|
76
|
+
accept: c.req.header('accept'),
|
|
77
|
+
});
|
|
78
|
+
if (wantsMarkdown) {
|
|
79
|
+
const basePathname = pathname.endsWith('.md') ? pathname.slice(0, -3) : pathname;
|
|
80
|
+
const mount = options.fallback === 'next'
|
|
81
|
+
? mountFromRoutePath(c.req.routePath)
|
|
82
|
+
: inferMount(basePathname, routes);
|
|
83
|
+
const markdown = resolveMarkdown(payload, relativeRoute(basePathname, mount), mount);
|
|
84
|
+
if (markdown)
|
|
85
|
+
return c.text(markdown, 200, { 'content-type': 'text/markdown; charset=utf-8' });
|
|
86
|
+
// Explicit `.md` for an unknown route falls through to the normal handling
|
|
87
|
+
// below (renders the shell, or `next()` in fallback mode).
|
|
88
|
+
}
|
|
89
|
+
// Fallthrough mode: only own the reference's own routes (the intro/landing,
|
|
90
|
+
// each group/page, and the asset root above) and defer everything else to
|
|
91
|
+
// the host app via `next()`. This lets the handler be mounted at the host
|
|
92
|
+
// root (`app.route('/', handler)`) alongside a JSON API and a JSON
|
|
93
|
+
// `notFound` without its catch-all swallowing them. The mount prefix comes
|
|
94
|
+
// from Hono's matched `routePath` (e.g. `/api/*`), so it's exact — unlike
|
|
95
|
+
// suffix inference, an API path like `/api/v1/blocks` is never mistaken for
|
|
96
|
+
// a docs route.
|
|
97
|
+
if (options.fallback === 'next') {
|
|
98
|
+
const mount = mountFromRoutePath(c.req.routePath);
|
|
99
|
+
const relative = (pathname.startsWith(mount) ? pathname.slice(mount.length) : pathname) || '/';
|
|
100
|
+
if (!isKnownRoute(relative, routes))
|
|
101
|
+
return next();
|
|
102
|
+
}
|
|
103
|
+
// Otherwise render the HTML shell (client-side router takes over).
|
|
104
|
+
const manifest = Assets.manifest();
|
|
105
|
+
if (!manifest.built)
|
|
106
|
+
return c.text('[vocs] The standalone OpenAPI bundle has not been built. Run `pnpm build` (or install a published build of `vocs`).', 500);
|
|
107
|
+
// Infer the host mount prefix so asset URLs route back to this handler
|
|
108
|
+
// regardless of where it is mounted (and independent of a trailing slash).
|
|
109
|
+
const mount = options.fallback === 'next'
|
|
110
|
+
? mountFromRoutePath(c.req.routePath)
|
|
111
|
+
: inferMount(pathname, routes);
|
|
112
|
+
const customCss = await resolveCss();
|
|
113
|
+
// The shell references content-hashed assets, so it must never be cached:
|
|
114
|
+
// a stale shell would point at an old hash (404 after a rebuild), leaving
|
|
115
|
+
// the page rendered but unstyled. Assets themselves stay `immutable`.
|
|
116
|
+
return c.html(Html.render(payload, manifest, mount, customCss), 200, {
|
|
117
|
+
'cache-control': 'no-store, must-revalidate',
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
return withListener(app);
|
|
121
|
+
}
|
|
122
|
+
/** Derives the host mount prefix from Hono's matched `routePath` (`/api/*` → `/api`, `/*` → ``). */
|
|
123
|
+
function mountFromRoutePath(routePath) {
|
|
124
|
+
return (routePath ?? '').replace(/\*+$/, '').replace(/\/+$/, '');
|
|
125
|
+
}
|
|
126
|
+
/** Whether a mount-relative path is one of the reference's known section routes. */
|
|
127
|
+
function isKnownRoute(relativePath, routes) {
|
|
128
|
+
const path = stripTrailingSlash(relativePath) || '/';
|
|
129
|
+
return routes.some((route) => (stripTrailingSlash(route) || '/') === path);
|
|
130
|
+
}
|
|
131
|
+
/** Strips the host mount prefix from a pathname, yielding a section route. */
|
|
132
|
+
function relativeRoute(pathname, mount) {
|
|
133
|
+
const path = pathname.startsWith(mount) ? pathname.slice(mount.length) : pathname;
|
|
134
|
+
return stripTrailingSlash(path) || '/';
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Resolves the Markdown for a section route: the generated overview (intro), a
|
|
138
|
+
* generated category page, or an authored guide page's own Markdown. Returns
|
|
139
|
+
* `null` for unknown routes. `mount` is the live host prefix, prepended to the
|
|
140
|
+
* overview's endpoint links so they resolve back to this handler.
|
|
141
|
+
*/
|
|
142
|
+
function resolveMarkdown(payload, relative, mount) {
|
|
143
|
+
const base = payload.ir.path || '/';
|
|
144
|
+
const linkBase = `${mount}${base === '/' ? '' : base}`;
|
|
145
|
+
const introRoute = base === '/' ? '/' : normalizePath(base);
|
|
146
|
+
if (relative === introRoute)
|
|
147
|
+
return Markdown.renderOverview(payload.ir, linkBase);
|
|
148
|
+
for (const group of payload.ir.groups)
|
|
149
|
+
if (relative === join(base, `/${group.id}`))
|
|
150
|
+
return Markdown.renderGroup(payload.ir, group);
|
|
151
|
+
for (const page of payload.pages)
|
|
152
|
+
if (page.markdown && relative === join(base, page.path))
|
|
153
|
+
return page.markdown;
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
function stripTrailingSlash(value) {
|
|
157
|
+
return value.length > 1 && value.endsWith('/') ? value.slice(0, -1) : value;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Composes multiple handlers onto a single Hono app mounted at `path`
|
|
161
|
+
* (default `/`).
|
|
162
|
+
*/
|
|
163
|
+
export function compose(handlers, options = {}) {
|
|
164
|
+
const app = new Hono();
|
|
165
|
+
for (const handler of handlers)
|
|
166
|
+
app.route(options.path ?? '/', handler);
|
|
167
|
+
app.notFound(() => new Response('Not Found', { status: 404 }));
|
|
168
|
+
return withListener(app);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Augments a Hono app with a Node request `listener`.
|
|
172
|
+
*
|
|
173
|
+
* The listener is created lazily on first access. `getRequestListener`
|
|
174
|
+
* (from `@hono/node-server`) overwrites the global `Request`/`Response` with
|
|
175
|
+
* non-configurable Node polyfills the first time it runs; on edge runtimes
|
|
176
|
+
* (Cloudflare Workers, Deno, Bun) that would replace the native `Response` and
|
|
177
|
+
* make every `c.json()`/`c.html()` produce a value the runtime rejects. Edge
|
|
178
|
+
* consumers only ever call `.fetch()` (or mount via `app.route(...)`) and never
|
|
179
|
+
* touch `.listener`, so deferring its creation keeps the global `Response`
|
|
180
|
+
* native there, while Node consumers (`http.createServer(ref.listener)`) get the
|
|
181
|
+
* same behavior as before on first access.
|
|
182
|
+
*/
|
|
183
|
+
function withListener(app) {
|
|
184
|
+
let listener;
|
|
185
|
+
// Define the getter directly (not via `Object.assign`, which would invoke it
|
|
186
|
+
// immediately while copying the property and defeat the laziness).
|
|
187
|
+
Object.defineProperty(app, 'listener', {
|
|
188
|
+
configurable: true,
|
|
189
|
+
enumerable: true,
|
|
190
|
+
get() {
|
|
191
|
+
if (!listener)
|
|
192
|
+
listener = getRequestListener((request) => app.fetch(request));
|
|
193
|
+
return listener;
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
return app;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/server/openapi/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.test.d.ts","sourceRoot":"","sources":["../../../src/server/openapi/handler.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { Hono } from 'hono';
|
|
5
|
+
import { describe, expect, test } from 'vitest';
|
|
6
|
+
import { openApi } from './handler.js';
|
|
7
|
+
const spec = {
|
|
8
|
+
openapi: '3.1.0',
|
|
9
|
+
info: { title: 'Demo API', version: '1.0.0', description: 'A demo.' },
|
|
10
|
+
servers: [{ url: 'https://api.example.com' }],
|
|
11
|
+
tags: [{ name: 'Pets', description: 'Pet operations' }],
|
|
12
|
+
paths: {
|
|
13
|
+
'/pets': {
|
|
14
|
+
get: {
|
|
15
|
+
operationId: 'listPets',
|
|
16
|
+
summary: 'List pets',
|
|
17
|
+
tags: ['Pets'],
|
|
18
|
+
responses: { '200': { description: 'OK' } },
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
describe('Handler.openApi', () => {
|
|
24
|
+
test('serves the HTML shell with embedded payload', async () => {
|
|
25
|
+
const ref = openApi({ spec });
|
|
26
|
+
const response = await ref.fetch(new Request('http://localhost/'));
|
|
27
|
+
expect(response.status).toBe(200);
|
|
28
|
+
expect(response.headers.get('content-type')).toContain('text/html');
|
|
29
|
+
const html = await response.text();
|
|
30
|
+
expect(html).toContain('id="vocs-openapi-data"');
|
|
31
|
+
expect(html).toContain('Demo API');
|
|
32
|
+
// Asset references are absolute, prefixed by the inferred mount (root here).
|
|
33
|
+
expect(html).toContain('/_vocs/openapi/');
|
|
34
|
+
// Embedded payload includes the parsed group.
|
|
35
|
+
expect(html).toContain('"Pets"');
|
|
36
|
+
expect(html).toContain('listPets');
|
|
37
|
+
});
|
|
38
|
+
test('serves the prebuilt client bundle', async () => {
|
|
39
|
+
const ref = openApi({ spec });
|
|
40
|
+
const response = await ref.fetch(new Request('http://localhost/_vocs/openapi/client.js'));
|
|
41
|
+
expect(response.status).toBe(200);
|
|
42
|
+
expect(response.headers.get('content-type')).toContain('javascript');
|
|
43
|
+
expect(response.headers.get('cache-control')).toContain('immutable');
|
|
44
|
+
const body = await response.text();
|
|
45
|
+
expect(body.length).toBeGreaterThan(0);
|
|
46
|
+
});
|
|
47
|
+
test('serves assets regardless of mount prefix', async () => {
|
|
48
|
+
const ref = openApi({ spec });
|
|
49
|
+
const response = await ref.fetch(new Request('http://localhost/docs/_vocs/openapi/client.js'));
|
|
50
|
+
expect(response.status).toBe(200);
|
|
51
|
+
expect(response.headers.get('content-type')).toContain('javascript');
|
|
52
|
+
});
|
|
53
|
+
test('exposes a Node request listener', () => {
|
|
54
|
+
const ref = openApi({ spec });
|
|
55
|
+
expect(typeof ref.listener).toBe('function');
|
|
56
|
+
});
|
|
57
|
+
test('accepts an already-started spec promise', async () => {
|
|
58
|
+
const ref = openApi({ spec: Promise.resolve(spec) });
|
|
59
|
+
const response = await ref.fetch(new Request('http://localhost/'));
|
|
60
|
+
expect(response.status).toBe(200);
|
|
61
|
+
expect(await response.text()).toContain('listPets');
|
|
62
|
+
});
|
|
63
|
+
describe('custom css', () => {
|
|
64
|
+
test('injects an inline CSS string into the shell head, after the bundle styles', async () => {
|
|
65
|
+
const ref = openApi({ spec }, { css: ':root { --vocs-color-accent: #7c3aed }' });
|
|
66
|
+
const html = await (await ref.fetch(new Request('http://localhost/'))).text();
|
|
67
|
+
expect(html).toContain('<style>:root { --vocs-color-accent: #7c3aed }</style>');
|
|
68
|
+
// Custom CSS comes after the design-system stylesheets so it wins.
|
|
69
|
+
expect(html.indexOf('rel="stylesheet"')).toBeLessThan(html.indexOf('<style>'));
|
|
70
|
+
});
|
|
71
|
+
test('omits the inline <style> when no css is configured', async () => {
|
|
72
|
+
const ref = openApi({ spec });
|
|
73
|
+
const html = await (await ref.fetch(new Request('http://localhost/'))).text();
|
|
74
|
+
expect(html).not.toContain('<style>');
|
|
75
|
+
});
|
|
76
|
+
test('reads css from a { file }', async () => {
|
|
77
|
+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'vocs-openapi-css-'));
|
|
78
|
+
await fs.writeFile(path.join(dir, 'theme.css'), '.body { color: red }');
|
|
79
|
+
const ref = openApi({ spec }, { css: { file: 'theme.css' }, rootDir: dir });
|
|
80
|
+
const html = await (await ref.fetch(new Request('http://localhost/'))).text();
|
|
81
|
+
expect(html).toContain('<style>.body { color: red }</style>');
|
|
82
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
83
|
+
});
|
|
84
|
+
test('neutralizes a closing </style> tag without corrupting CSS', async () => {
|
|
85
|
+
const ref = openApi({ spec }, { css: 'a > b { color: red } /* </style><script>x</script> */' });
|
|
86
|
+
const html = await (await ref.fetch(new Request('http://localhost/'))).text();
|
|
87
|
+
// `>` combinators are preserved. The closing tags are escaped so they
|
|
88
|
+
// can't break out of the `<style>` block (the opening `<script>` is inert
|
|
89
|
+
// as CSS text once `</style>` can't terminate the block).
|
|
90
|
+
expect(html).toContain('a > b { color: red }');
|
|
91
|
+
expect(html).toContain('<\\/style>');
|
|
92
|
+
expect(html).toContain('<\\/script>');
|
|
93
|
+
expect(html).not.toContain('</style><script>');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe("fallback: 'next'", () => {
|
|
97
|
+
test('renders the reference at the host root, falls through elsewhere', async () => {
|
|
98
|
+
const app = new Hono();
|
|
99
|
+
app.get('/v1/blocks', (c) => c.json({ who: 'api' }));
|
|
100
|
+
app.route('/', openApi({ spec }, { fallback: 'next' }));
|
|
101
|
+
app.notFound((c) => c.json({ error: 'not_found' }, 404));
|
|
102
|
+
// Reference landing page is owned by the handler.
|
|
103
|
+
const landing = await app.request('http://localhost/');
|
|
104
|
+
expect(landing.status).toBe(200);
|
|
105
|
+
expect(landing.headers.get('content-type')).toContain('text/html');
|
|
106
|
+
// Assets resolve back to the root mount.
|
|
107
|
+
expect(await landing.text()).toContain('/_vocs/openapi/');
|
|
108
|
+
// A known section route (the "Pets" group) renders the shell too.
|
|
109
|
+
const group = await app.request('http://localhost/pets');
|
|
110
|
+
expect(group.status).toBe(200);
|
|
111
|
+
expect(group.headers.get('content-type')).toContain('text/html');
|
|
112
|
+
// Bundled assets are served by the handler.
|
|
113
|
+
const asset = await app.request('http://localhost/_vocs/openapi/client.js');
|
|
114
|
+
expect(asset.status).toBe(200);
|
|
115
|
+
expect(asset.headers.get('content-type')).toContain('javascript');
|
|
116
|
+
// The host API route wins.
|
|
117
|
+
const api = await app.request('http://localhost/v1/blocks');
|
|
118
|
+
expect(api.status).toBe(200);
|
|
119
|
+
expect(await api.json()).toEqual({ who: 'api' });
|
|
120
|
+
// An unrelated path falls through to the host notFound (not the shell).
|
|
121
|
+
const missing = await app.request('http://localhost/v1/missing');
|
|
122
|
+
expect(missing.status).toBe(404);
|
|
123
|
+
expect(await missing.json()).toEqual({ error: 'not_found' });
|
|
124
|
+
});
|
|
125
|
+
test('derives the mount prefix from the host basePath', async () => {
|
|
126
|
+
const app = new Hono().basePath('/api');
|
|
127
|
+
app.route('/', openApi({ spec }, { fallback: 'next' }));
|
|
128
|
+
const landing = await app.request('http://localhost/api/');
|
|
129
|
+
expect(landing.status).toBe(200);
|
|
130
|
+
// Asset URLs are prefixed with the host basePath so they route back here.
|
|
131
|
+
expect(await landing.text()).toContain('/api/_vocs/openapi/');
|
|
132
|
+
const asset = await app.request('http://localhost/api/_vocs/openapi/client.js');
|
|
133
|
+
expect(asset.status).toBe(200);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('markdown', () => {
|
|
137
|
+
test('serves the generated overview at `<intro>.md`', async () => {
|
|
138
|
+
const ref = openApi({ spec, path: '/api' });
|
|
139
|
+
const response = await ref.fetch(new Request('http://localhost/api.md'));
|
|
140
|
+
expect(response.status).toBe(200);
|
|
141
|
+
expect(response.headers.get('content-type')).toContain('text/markdown');
|
|
142
|
+
const md = await response.text();
|
|
143
|
+
expect(md).toContain('# Demo API');
|
|
144
|
+
expect(md).toContain('## Endpoints');
|
|
145
|
+
expect(md).toContain('- [`GET /pets`](/api/pets#listpets): List pets');
|
|
146
|
+
});
|
|
147
|
+
test('serves a generated category at `<group>.md`', async () => {
|
|
148
|
+
const ref = openApi({ spec, path: '/api' });
|
|
149
|
+
const response = await ref.fetch(new Request('http://localhost/api/pets.md'));
|
|
150
|
+
expect(response.status).toBe(200);
|
|
151
|
+
expect(response.headers.get('content-type')).toContain('text/markdown');
|
|
152
|
+
const md = await response.text();
|
|
153
|
+
expect(md).toContain('## List pets');
|
|
154
|
+
expect(md).toContain('`GET /pets`');
|
|
155
|
+
});
|
|
156
|
+
test('honors `Accept: text/markdown` without a `.md` suffix', async () => {
|
|
157
|
+
const ref = openApi({ spec, path: '/api' });
|
|
158
|
+
const response = await ref.fetch(new Request('http://localhost/api', { headers: { accept: 'text/markdown' } }));
|
|
159
|
+
expect(response.status).toBe(200);
|
|
160
|
+
expect(response.headers.get('content-type')).toContain('text/markdown');
|
|
161
|
+
expect(await response.text()).toContain('# Demo API');
|
|
162
|
+
});
|
|
163
|
+
test('serves an authored guide page as its own Markdown', async () => {
|
|
164
|
+
const ref = openApi({
|
|
165
|
+
spec,
|
|
166
|
+
path: '/api',
|
|
167
|
+
pages: [{ path: '/guide', content: '---\ntitle: Guide\n---\n# Guide\n\nHello there.' }],
|
|
168
|
+
});
|
|
169
|
+
const response = await ref.fetch(new Request('http://localhost/api/guide.md'));
|
|
170
|
+
expect(response.status).toBe(200);
|
|
171
|
+
expect(response.headers.get('content-type')).toContain('text/markdown');
|
|
172
|
+
const md = await response.text();
|
|
173
|
+
expect(md).toContain('# Guide');
|
|
174
|
+
expect(md).toContain('Hello there.');
|
|
175
|
+
});
|
|
176
|
+
test('serves Markdown to terminal clients (curl) without a `.md` suffix', async () => {
|
|
177
|
+
const ref = openApi({ spec, path: '/api' });
|
|
178
|
+
const response = await ref.fetch(new Request('http://localhost/api', { headers: { 'user-agent': 'curl/8.4.0' } }));
|
|
179
|
+
expect(response.status).toBe(200);
|
|
180
|
+
expect(response.headers.get('content-type')).toContain('text/markdown');
|
|
181
|
+
expect(await response.text()).toContain('# Demo API');
|
|
182
|
+
});
|
|
183
|
+
test('serves Markdown to AI agents without a `.md` suffix', async () => {
|
|
184
|
+
const ref = openApi({ spec, path: '/api' });
|
|
185
|
+
const response = await ref.fetch(new Request('http://localhost/api', { headers: { 'user-agent': 'ChatGPT-User/2.0' } }));
|
|
186
|
+
expect(response.status).toBe(200);
|
|
187
|
+
expect(response.headers.get('content-type')).toContain('text/markdown');
|
|
188
|
+
});
|
|
189
|
+
test('does not serve Markdown to search engines without a `.md` suffix', async () => {
|
|
190
|
+
const ref = openApi({ spec, path: '/api' });
|
|
191
|
+
const response = await ref.fetch(new Request('http://localhost/api', { headers: { 'user-agent': 'Googlebot/2.1' } }));
|
|
192
|
+
expect(response.headers.get('content-type') ?? '').not.toContain('text/markdown');
|
|
193
|
+
});
|
|
194
|
+
test('prefixes overview links with the live host mount', async () => {
|
|
195
|
+
const app = new Hono().basePath('/docs');
|
|
196
|
+
app.route('/', openApi({ spec, path: '/api' }, { fallback: 'next' }));
|
|
197
|
+
const response = await app.request('http://localhost/docs/api.md');
|
|
198
|
+
expect(response.status).toBe(200);
|
|
199
|
+
expect(await response.text()).toContain('](/docs/api/pets#listpets)');
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.test.js","sourceRoot":"","sources":["../../../src/server/openapi/handler.test.ts"],"names":[],"mappings":"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"}
|