fumadocs-openapi 6.0.1 → 6.0.3

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.
Files changed (155) hide show
  1. package/dist/build-routes.d.ts +15 -0
  2. package/dist/build-routes.d.ts.map +1 -0
  3. package/dist/build-routes.js +38 -0
  4. package/dist/generate-file.d.ts +38 -0
  5. package/dist/generate-file.d.ts.map +1 -0
  6. package/dist/generate-file.js +118 -0
  7. package/dist/generate.d.ts +48 -0
  8. package/dist/generate.d.ts.map +1 -0
  9. package/dist/generate.js +129 -0
  10. package/dist/index.d.ts +4 -274
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +3 -389
  13. package/dist/render/codeblock.d.ts +9 -0
  14. package/dist/render/codeblock.d.ts.map +1 -0
  15. package/dist/render/codeblock.js +13 -0
  16. package/dist/render/heading.d.ts +4 -0
  17. package/dist/render/heading.d.ts.map +1 -0
  18. package/dist/render/heading.js +6 -0
  19. package/dist/render/markdown.d.ts +5 -0
  20. package/dist/render/markdown.d.ts.map +1 -0
  21. package/dist/render/markdown.js +25 -0
  22. package/dist/render/operation.d.ts +17 -0
  23. package/dist/render/operation.d.ts.map +1 -0
  24. package/dist/render/operation.js +230 -0
  25. package/dist/render/playground.d.ts +66 -0
  26. package/dist/render/playground.d.ts.map +1 -0
  27. package/dist/render/playground.js +181 -0
  28. package/dist/render/renderer.d.ts +76 -0
  29. package/dist/render/renderer.d.ts.map +1 -0
  30. package/dist/render/renderer.js +23 -0
  31. package/dist/render/schema.d.ts +29 -0
  32. package/dist/render/schema.d.ts.map +1 -0
  33. package/dist/render/schema.js +151 -0
  34. package/dist/requests/curl.d.ts +3 -0
  35. package/dist/requests/curl.d.ts.map +1 -0
  36. package/dist/requests/curl.js +33 -0
  37. package/dist/requests/go.d.ts +3 -0
  38. package/dist/requests/go.d.ts.map +1 -0
  39. package/dist/requests/go.js +54 -0
  40. package/dist/requests/javascript.d.ts +3 -0
  41. package/dist/requests/javascript.d.ts.map +1 -0
  42. package/dist/requests/javascript.js +49 -0
  43. package/dist/requests/python.d.ts +3 -0
  44. package/dist/requests/python.d.ts.map +1 -0
  45. package/dist/requests/python.js +45 -0
  46. package/dist/scalar/client.d.ts +6 -0
  47. package/dist/scalar/client.d.ts.map +1 -0
  48. package/dist/scalar/client.js +25 -0
  49. package/dist/scalar/index.d.ts +4 -173
  50. package/dist/scalar/index.d.ts.map +1 -0
  51. package/dist/scalar/index.js +4 -11
  52. package/dist/server/api-page.d.ts +33 -0
  53. package/dist/server/api-page.d.ts.map +1 -0
  54. package/dist/server/api-page.js +59 -0
  55. package/dist/server/create-method.d.ts +7 -0
  56. package/dist/server/create-method.d.ts.map +1 -0
  57. package/dist/server/create-method.js +12 -0
  58. package/dist/server/create.d.ts +16 -0
  59. package/dist/server/create.d.ts.map +1 -0
  60. package/dist/server/create.js +11 -0
  61. package/dist/server/index.d.ts +3 -221
  62. package/dist/server/index.d.ts.map +1 -0
  63. package/dist/server/index.js +2 -1493
  64. package/dist/server/proxy.d.ts +8 -0
  65. package/dist/server/proxy.d.ts.map +1 -0
  66. package/dist/server/proxy.js +53 -0
  67. package/dist/server/source-api.d.ts +8 -0
  68. package/dist/server/source-api.d.ts.map +1 -0
  69. package/dist/server/source-api.js +34 -0
  70. package/dist/types.d.ts +60 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +1 -0
  73. package/dist/ui/client.d.ts +22 -0
  74. package/dist/ui/client.d.ts.map +1 -0
  75. package/dist/ui/client.js +10 -0
  76. package/dist/ui/components/input.d.ts +6 -0
  77. package/dist/ui/components/input.d.ts.map +1 -0
  78. package/dist/ui/components/input.js +10 -0
  79. package/dist/ui/components/method-label.d.ts +5 -0
  80. package/dist/ui/components/method-label.d.ts.map +1 -0
  81. package/dist/ui/components/method-label.js +33 -0
  82. package/dist/ui/components/select.d.ts +14 -0
  83. package/dist/ui/components/select.d.ts.map +1 -0
  84. package/dist/ui/components/select.js +24 -0
  85. package/dist/ui/components/variants.d.ts +6 -0
  86. package/dist/ui/components/variants.d.ts.map +1 -0
  87. package/dist/ui/components/variants.js +26 -0
  88. package/dist/ui/contexts/api.d.ts +28 -0
  89. package/dist/ui/contexts/api.d.ts.map +1 -0
  90. package/dist/ui/contexts/api.js +74 -0
  91. package/dist/ui/contexts/schema.d.ts +17 -0
  92. package/dist/ui/contexts/schema.d.ts.map +1 -0
  93. package/dist/ui/contexts/schema.js +8 -0
  94. package/dist/ui/index.d.ts +12 -302
  95. package/dist/ui/index.d.ts.map +1 -0
  96. package/dist/ui/index.js +18 -98
  97. package/dist/ui/playground/fetcher.d.ts +34 -0
  98. package/dist/ui/playground/fetcher.d.ts.map +1 -0
  99. package/dist/ui/{fetcher-CsHhplmD.js → playground/fetcher.js} +45 -44
  100. package/dist/ui/playground/get-default-values.d.ts +4 -0
  101. package/dist/ui/playground/get-default-values.d.ts.map +1 -0
  102. package/dist/ui/playground/get-default-values.js +24 -0
  103. package/dist/ui/playground/index.d.ts +44 -0
  104. package/dist/ui/playground/index.d.ts.map +1 -0
  105. package/dist/ui/playground/index.js +187 -0
  106. package/dist/ui/playground/inputs.d.ts +23 -0
  107. package/dist/ui/playground/inputs.d.ts.map +1 -0
  108. package/dist/ui/playground/inputs.js +172 -0
  109. package/dist/ui/playground/resolve.d.ts +6 -0
  110. package/dist/ui/playground/resolve.d.ts.map +1 -0
  111. package/dist/ui/playground/resolve.js +14 -0
  112. package/dist/ui/playground/status-info.d.ts +8 -0
  113. package/dist/ui/playground/status-info.d.ts.map +1 -0
  114. package/dist/ui/playground/status-info.js +40 -0
  115. package/dist/ui/server-select.d.ts +3 -0
  116. package/dist/ui/server-select.d.ts.map +1 -0
  117. package/dist/ui/server-select.js +27 -0
  118. package/dist/utils/combine-schema.d.ts +6 -0
  119. package/dist/utils/combine-schema.d.ts.map +1 -0
  120. package/dist/utils/combine-schema.js +46 -0
  121. package/dist/utils/generate-document.d.ts +20 -0
  122. package/dist/utils/generate-document.d.ts.map +1 -0
  123. package/dist/utils/generate-document.js +82 -0
  124. package/dist/utils/generate-sample.d.ts +33 -0
  125. package/dist/utils/generate-sample.d.ts.map +1 -0
  126. package/dist/utils/generate-sample.js +97 -0
  127. package/dist/utils/get-security.d.ts +8 -0
  128. package/dist/utils/get-security.d.ts.map +1 -0
  129. package/dist/utils/get-security.js +23 -0
  130. package/dist/utils/get-typescript-schema.d.ts +4 -0
  131. package/dist/utils/get-typescript-schema.d.ts.map +1 -0
  132. package/dist/utils/get-typescript-schema.js +18 -0
  133. package/dist/utils/id-to-title.d.ts +2 -0
  134. package/dist/utils/id-to-title.d.ts.map +1 -0
  135. package/dist/utils/id-to-title.js +17 -0
  136. package/dist/utils/input-to-string.d.ts +5 -0
  137. package/dist/utils/input-to-string.d.ts.map +1 -0
  138. package/dist/utils/input-to-string.js +21 -0
  139. package/dist/utils/process-document.d.ts +14 -0
  140. package/dist/utils/process-document.d.ts.map +1 -0
  141. package/dist/utils/process-document.js +32 -0
  142. package/dist/utils/schema.d.ts +9 -0
  143. package/dist/utils/schema.d.ts.map +1 -0
  144. package/dist/utils/schema.js +16 -0
  145. package/dist/utils/server-url.d.ts +2 -0
  146. package/dist/utils/server-url.d.ts.map +1 -0
  147. package/dist/utils/server-url.js +7 -0
  148. package/dist/utils/use-query.d.ts +6 -0
  149. package/dist/utils/use-query.d.ts.map +1 -0
  150. package/dist/utils/use-query.js +22 -0
  151. package/package.json +8 -8
  152. package/dist/scalar/client-client-BXAjVueF.js +0 -93
  153. package/dist/ui/client-client-CYO00OiB.js +0 -107
  154. package/dist/ui/index-client-BUeWwFWK.js +0 -1116
  155. package/dist/ui/server-select-client-Ct_HJ46K.js +0 -86
@@ -0,0 +1,8 @@
1
+ import type { NextRequest } from 'next/server';
2
+ declare const keys: readonly ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"];
3
+ type Proxy = {
4
+ [K in (typeof keys)[number]]: (req: NextRequest) => Promise<Response>;
5
+ };
6
+ export declare function createProxy(allowedUrls?: string[]): Proxy;
7
+ export {};
8
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/server/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,QAAA,MAAM,IAAI,4DAA6D,CAAC;AAExE,KAAK,KAAK,GAAG;KACV,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC;CACtE,CAAC;AAEF,wBAAgB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAoEzD"}
@@ -0,0 +1,53 @@
1
+ const keys = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'];
2
+ export function createProxy(allowedUrls) {
3
+ const handlers = {};
4
+ async function handler(req) {
5
+ const url = req.nextUrl.searchParams.get('url');
6
+ if (!url) {
7
+ return Response.json('A `url` query parameter is required for proxy url', {
8
+ status: 400,
9
+ });
10
+ }
11
+ if (allowedUrls &&
12
+ allowedUrls.every((allowedUrl) => !allowedUrl.startsWith(url))) {
13
+ return Response.json('The given `url` query parameter is not allowed', {
14
+ status: 400,
15
+ });
16
+ }
17
+ const clonedReq = new Request(url, {
18
+ ...req,
19
+ cache: 'no-cache',
20
+ mode: 'cors',
21
+ });
22
+ clonedReq.headers.forEach((_value, originalKey) => {
23
+ const key = originalKey.toLowerCase();
24
+ const notAllowed = key === 'origin';
25
+ if (notAllowed) {
26
+ clonedReq.headers.delete(originalKey);
27
+ }
28
+ });
29
+ const res = await fetch(clonedReq).catch((e) => new Error(e.toString()));
30
+ if (res instanceof Error) {
31
+ return Response.json(`Failed to proxy request: ${res.message}`, {
32
+ status: 400,
33
+ });
34
+ }
35
+ const headers = new Headers(res.headers);
36
+ headers.forEach((_value, originalKey) => {
37
+ const key = originalKey.toLowerCase();
38
+ const notAllowed = key.startsWith('access-control-') || key === 'content-encoding';
39
+ if (notAllowed) {
40
+ headers.delete(originalKey);
41
+ }
42
+ });
43
+ headers.set('X-Forwarded-Host', res.url);
44
+ return new Response(res.body, {
45
+ ...res,
46
+ headers,
47
+ });
48
+ }
49
+ for (const key of keys) {
50
+ handlers[key] = handler;
51
+ }
52
+ return handlers;
53
+ }
@@ -0,0 +1,8 @@
1
+ import type { BuildPageTreeOptions } from 'fumadocs-core/source';
2
+ /**
3
+ * Source API Integration
4
+ *
5
+ * Add this to page tree builder options
6
+ */
7
+ export declare const attachFile: BuildPageTreeOptions['attachFile'];
8
+ //# sourceMappingURL=source-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-api.d.ts","sourceRoot":"","sources":["../../src/server/source-api.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAIjE;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,oBAAoB,CAAC,YAAY,CA6BzD,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cva } from 'class-variance-authority';
3
+ import { getBadgeColor } from '../ui/components/variants.js';
4
+ /**
5
+ * Source API Integration
6
+ *
7
+ * Add this to page tree builder options
8
+ */
9
+ export const attachFile = (node, file) => {
10
+ if (!file)
11
+ return node;
12
+ const data = file.data.data;
13
+ let method;
14
+ if ('_openapi' in data && typeof data._openapi === 'object') {
15
+ const meta = data._openapi;
16
+ method = meta.method;
17
+ }
18
+ if (method) {
19
+ const color = getBadgeColor(method);
20
+ node.name = (_jsxs(_Fragment, { children: [node.name, ' ', _jsx("span", { className: badgeVariants({ className: 'ms-auto text-nowrap', color }), children: method })] }));
21
+ }
22
+ return node;
23
+ };
24
+ const badgeVariants = cva('rounded-full border px-1.5 text-xs font-medium', {
25
+ variants: {
26
+ color: {
27
+ green: 'bg-green-400/20 text-green-600 dark:text-green-400',
28
+ yellow: 'bg-yellow-400/20 text-yellow-600 dark:text-yellow-400',
29
+ red: 'bg-red-400/20 text-red-600 dark:text-red-400',
30
+ blue: 'bg-blue-400/20 text-blue-600 dark:text-blue-400',
31
+ orange: 'bg-orange-400/20 text-orange-600 dark:text-orange-400',
32
+ },
33
+ },
34
+ });
@@ -0,0 +1,60 @@
1
+ import type { OpenAPIV3_1 as V3_1 } from 'openapi-types';
2
+ import type { default as Slugger } from 'github-slugger';
3
+ import { type Renderer } from './render/renderer.js';
4
+ import type { EndpointSample } from './utils/generate-sample.js';
5
+ import type { CodeSample } from './render/operation.js';
6
+ import type { BuiltinTheme, CodeOptionsThemes, CodeToHastOptionsCommon } from 'shiki';
7
+ import type { NoReference } from './utils/schema.js';
8
+ import type { ProcessedDocument } from './utils/process-document.js';
9
+ export type Document = V3_1.Document;
10
+ export type OperationObject = V3_1.OperationObject;
11
+ export type ParameterObject = V3_1.ParameterObject;
12
+ export type SecurityRequirementObject = V3_1.SecurityRequirementObject;
13
+ export type SecuritySchemeObject = V3_1.SecuritySchemeObject;
14
+ export type ReferenceObject = V3_1.ReferenceObject;
15
+ export type PathItemObject = V3_1.PathItemObject;
16
+ export type TagObject = V3_1.TagObject;
17
+ export type ServerObject = NoReference<V3_1.ServerObject>;
18
+ export type CallbackObject = NoReference<V3_1.CallbackObject>;
19
+ export type MethodInformation = NoReference<OperationObject> & {
20
+ method: string;
21
+ };
22
+ type Awaitable<T> = T | Promise<T>;
23
+ /**
24
+ * Dereferenced value and its original `$ref` value
25
+ */
26
+ export type DereferenceMap = Map<unknown, string>;
27
+ export interface RenderContext {
28
+ /**
29
+ * The url of proxy to avoid CORS issues
30
+ */
31
+ proxyUrl?: string;
32
+ renderer: Renderer;
33
+ baseUrl: string;
34
+ servers: ServerObject[];
35
+ slugger: Slugger;
36
+ /**
37
+ * dereferenced schema
38
+ */
39
+ schema: ProcessedDocument;
40
+ /**
41
+ * Generate TypeScript definitions from response schema.
42
+ *
43
+ * Pass `false` to disable it.
44
+ *
45
+ * @param endpoint - the API endpoint
46
+ * @param code - status code
47
+ */
48
+ generateTypeScriptSchema?: ((endpoint: EndpointSample, code: string) => Awaitable<string>) | false;
49
+ /**
50
+ * Generate code samples for endpoint.
51
+ */
52
+ generateCodeSamples?: (endpoint: EndpointSample) => Awaitable<CodeSample[]>;
53
+ shikiOptions?: Omit<CodeToHastOptionsCommon, 'lang'> & CodeOptionsThemes<BuiltinTheme>;
54
+ /**
55
+ * Show full response schema instead of only example response & Typescript definitions
56
+ */
57
+ showResponseSchema?: boolean;
58
+ }
59
+ export {};
60
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;AACrC,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;AACnD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;AACnD,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC;AACvE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;AAC7D,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;AACnD,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;AACjD,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AACvC,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAE9D,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,eAAe,CAAC,GAAG;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEnC;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,EAAE,CAAC;IAExB,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAC;IAE1B;;;;;;;OAOG;IACH,wBAAwB,CAAC,EACrB,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,GAC/D,KAAK,CAAC;IAEV;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;IAE5E,YAAY,CAAC,EAAE,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,GAClD,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAElC;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ import { type RootProps } from '../render/renderer.js';
3
+ import type { RenderContext } from '../types.js';
4
+ export declare const APIPlayground: import("react").ComponentType<import("../render/renderer.js").APIPlaygroundProps & {
5
+ fields?: {
6
+ auth?: import("./playground/index.js").CustomField<"authorization", import("../render/renderer.js").RequestSchema>;
7
+ path?: import("./playground/index.js").CustomField<`path.${string}`, import("../render/renderer.js").PrimitiveRequestField>;
8
+ query?: import("./playground/index.js").CustomField<`query.${string}`, import("../render/renderer.js").PrimitiveRequestField>;
9
+ header?: import("./playground/index.js").CustomField<`header.${string}`, import("../render/renderer.js").PrimitiveRequestField>;
10
+ body?: import("./playground/index.js").CustomField<"body", import("../render/renderer.js").RequestSchema>;
11
+ };
12
+ components?: Partial<{
13
+ ResultDisplay: import("react").FC<{
14
+ data: import("./playground/fetcher.js").FetchResult;
15
+ }>;
16
+ }>;
17
+ } & HTMLAttributes<HTMLFormElement>>;
18
+ export declare function Root({ children, baseUrl, className, shikiOptions, servers, ...props }: RootProps & {
19
+ shikiOptions: RenderContext['shikiOptions'];
20
+ } & HTMLAttributes<HTMLDivElement>): ReactNode;
21
+ export { useSchemaContext } from './contexts/schema.js';
22
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ui/client.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI5D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,eAAO,MAAM,aAAa;;YAkCy4C,CAAC;YAAuD,CAAC;aAAiE,CAAC;cAAmE,CAAC;YAAkE,CAAC;;;;;;;oCAhCpqD,CAAC;AAEF,wBAAgB,IAAI,CAAC,EACnB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,YAAY,EACZ,OAAO,EACP,GAAG,KAAK,EACT,EAAE,SAAS,GAAG;IACb,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;CAC7C,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,CAkB7C;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { cn } from 'fumadocs-ui/components/api';
4
+ import dynamic from 'next/dynamic';
5
+ import { ApiProvider } from '../ui/contexts/api.js';
6
+ export const APIPlayground = dynamic(() => import('./playground/index.js').then((mod) => mod.APIPlayground));
7
+ export function Root({ children, baseUrl, className, shikiOptions, servers, ...props }) {
8
+ return (_jsx("div", { className: cn('flex flex-col gap-24 text-sm text-fd-muted-foreground', className), ...props, children: _jsx(ApiProvider, { servers: servers, shikiOptions: shikiOptions, defaultBaseUrl: baseUrl, children: children }) }));
9
+ }
10
+ export { useSchemaContext } from './contexts/schema.js';
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+ export type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
3
+ export declare const labelVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
4
+ declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
5
+ export { Input };
6
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/ui/components/input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;AAErE,eAAO,MAAM,aAAa,oFAEzB,CAAC;AAEF,QAAA,MAAM,KAAK,qFAcV,CAAC;AAGF,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { cn } from 'fumadocs-ui/components/api';
4
+ import { cva } from 'class-variance-authority';
5
+ export const labelVariants = cva('text-[13px] font-mono text-fd-card-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70');
6
+ const Input = React.forwardRef(({ className, type, ...props }, ref) => {
7
+ return (_jsx("input", { type: type, className: cn('flex h-9 w-full rounded-md border bg-transparent px-2 py-1.5 text-[13px] text-fd-foreground transition-colors placeholder:text-fd-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-fd-ring disabled:cursor-not-allowed disabled:opacity-50', className), ref: ref, ...props }));
8
+ });
9
+ Input.displayName = 'Input';
10
+ export { Input };
@@ -0,0 +1,5 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export declare function MethodLabel({ children, ...props }: Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {
3
+ children: string;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=method-label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"method-label.d.ts","sourceRoot":"","sources":["../../../src/ui/components/method-label.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AA8B5C,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,GAAG;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB,2CAcA"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cva } from 'class-variance-authority';
3
+ import { cn } from 'fumadocs-ui/components/api';
4
+ const variants = cva('font-mono font-medium', {
5
+ variants: {
6
+ color: {
7
+ green: 'text-green-600 dark:text-green-400',
8
+ yellow: 'text-yellow-600 dark:text-yellow-400',
9
+ red: 'text-red-600 dark:text-red-400',
10
+ blue: 'text-blue-600 dark:text-blue-400',
11
+ orange: 'text-orange-600 dark:text-orange-400',
12
+ },
13
+ },
14
+ });
15
+ function getBadgeColor(method) {
16
+ switch (method.toUpperCase()) {
17
+ case 'PUT':
18
+ return 'yellow';
19
+ case 'PATCH':
20
+ return 'orange';
21
+ case 'POST':
22
+ return 'blue';
23
+ case 'DELETE':
24
+ return 'red';
25
+ default:
26
+ return 'green';
27
+ }
28
+ }
29
+ export function MethodLabel({ children, ...props }) {
30
+ return (_jsx("span", { ...props, className: cn(variants({
31
+ color: getBadgeColor(children),
32
+ }), props.className), children: children.toUpperCase() }));
33
+ }
@@ -0,0 +1,14 @@
1
+ import * as SelectPrimitive from '@radix-ui/react-select';
2
+ import React from 'react';
3
+ declare const Select: React.FC<SelectPrimitive.SelectProps>;
4
+ declare const SelectGroup: React.ForwardRefExoticComponent<SelectPrimitive.SelectGroupProps & React.RefAttributes<HTMLDivElement>>;
5
+ declare const SelectValue: React.ForwardRefExoticComponent<SelectPrimitive.SelectValueProps & React.RefAttributes<HTMLSpanElement>>;
6
+ declare const SelectTrigger: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
7
+ declare const SelectScrollUpButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollUpButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
8
+ declare const SelectScrollDownButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollDownButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
9
+ declare const SelectContent: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
+ declare const SelectLabel: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
11
+ declare const SelectItem: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
12
+ declare const SelectSeparator: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
13
+ export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator, SelectScrollUpButton, SelectScrollDownButton, };
14
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/ui/components/select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,QAAA,MAAM,MAAM,uCAAuB,CAAC;AAEpC,QAAA,MAAM,WAAW,yGAAwB,CAAC;AAE1C,QAAA,MAAM,WAAW,0GAAwB,CAAC;AAE1C,QAAA,MAAM,aAAa,oKAiBjB,CAAC;AAGH,QAAA,MAAM,oBAAoB,qKAWxB,CAAC;AAGH,QAAA,MAAM,sBAAsB,uKAW1B,CAAC;AAIH,QAAA,MAAM,aAAa,8JAqBjB,CAAC;AAGH,QAAA,MAAM,WAAW,4JASf,CAAC;AAGH,QAAA,MAAM,UAAU,2JAkBd,CAAC;AAGH,QAAA,MAAM,eAAe,gKASnB,CAAC;AAGH,OAAO,EACL,MAAM,EACN,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,sBAAsB,GACvB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as SelectPrimitive from '@radix-ui/react-select';
3
+ import { Check, ChevronDown, ChevronUp } from 'lucide-react';
4
+ import { forwardRef } from 'react';
5
+ import { cn } from 'fumadocs-ui/components/api';
6
+ const Select = SelectPrimitive.Root;
7
+ const SelectGroup = SelectPrimitive.Group;
8
+ const SelectValue = SelectPrimitive.Value;
9
+ const SelectTrigger = forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Trigger, { ref: ref, className: cn('flex h-10 items-center w-full rounded-md border px-3 py-2 text-start text-[13px] text-fd-foreground hover:bg-fd-accent focus:outline-none focus:ring-2 focus:ring-fd-ring disabled:cursor-not-allowed disabled:opacity-50', className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDown, { className: "ms-auto size-4 text-fd-muted-foreground" }) })] })));
10
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
11
+ const SelectScrollUpButton = forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollUpButton, { ref: ref, className: cn('flex items-center justify-center py-1', className), ...props, children: _jsx(ChevronUp, { className: "size-4" }) })));
12
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
13
+ const SelectScrollDownButton = forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollDownButton, { ref: ref, className: cn('flex items-center justify-center py-1', className), ...props, children: _jsx(ChevronDown, { className: "size-4" }) })));
14
+ SelectScrollDownButton.displayName =
15
+ SelectPrimitive.ScrollDownButton.displayName;
16
+ const SelectContent = forwardRef(({ className, children, position, ...props }, ref) => (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { ref: ref, className: cn('z-50 overflow-hidden rounded-lg border bg-fd-popover text-fd-popover-foreground shadow-md', className), position: position, ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: "p-1", children: children }), _jsx(SelectScrollDownButton, {})] }) })));
17
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
18
+ const SelectLabel = forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.Label, { ref: ref, className: cn('py-1.5 pe-2 ps-6 text-sm font-semibold', className), ...props })));
19
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
20
+ const SelectItem = forwardRef(({ className, children, ...props }, ref) => (_jsxs(SelectPrimitive.Item, { ref: ref, className: cn('flex select-none flex-row items-center rounded-md py-1.5 pe-2 ps-6 text-[13px] outline-none focus:bg-fd-accent focus:text-fd-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', className), ...props, children: [_jsx(SelectPrimitive.ItemIndicator, { className: "absolute start-2", children: _jsx(Check, { className: "size-4" }) }), _jsx(SelectPrimitive.ItemText, { children: children })] })));
21
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
22
+ const SelectSeparator = forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.Separator, { ref: ref, className: cn('my-1 h-px bg-fd-muted', className), ...props })));
23
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
24
+ export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator, SelectScrollUpButton, SelectScrollDownButton, };
@@ -0,0 +1,6 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ export declare const badgeVariants: (props?: ({
3
+ color?: "red" | "green" | "yellow" | "blue" | "orange" | null | undefined;
4
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
5
+ export declare function getBadgeColor(method: string): VariantProps<typeof badgeVariants>['color'];
6
+ //# sourceMappingURL=variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/ui/components/variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,eAAO,MAAM,aAAa;;8EAazB,CAAC;AAEF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GACb,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC,OAAO,CAAC,CAa7C"}
@@ -0,0 +1,26 @@
1
+ import { cva } from 'class-variance-authority';
2
+ export const badgeVariants = cva('rounded-xl border px-1.5 py-1 text-xs font-medium leading-[12px]', {
3
+ variants: {
4
+ color: {
5
+ green: 'bg-green-400/20 text-green-600 dark:text-green-400',
6
+ yellow: 'bg-yellow-400/20 text-yellow-600 dark:text-yellow-400',
7
+ red: 'bg-red-400/20 text-red-600 dark:text-red-400',
8
+ blue: 'bg-blue-400/20 text-blue-600 dark:text-blue-400',
9
+ orange: 'bg-orange-400/20 text-orange-600 dark:text-orange-400',
10
+ },
11
+ },
12
+ });
13
+ export function getBadgeColor(method) {
14
+ switch (method) {
15
+ case 'PUT':
16
+ return 'yellow';
17
+ case 'PATCH':
18
+ return 'orange';
19
+ case 'POST':
20
+ return 'blue';
21
+ case 'DELETE':
22
+ return 'red';
23
+ default:
24
+ return 'green';
25
+ }
26
+ }
@@ -0,0 +1,28 @@
1
+ import { type ReactNode, type RefObject } from 'react';
2
+ import type { RenderContext, ServerObject } from '../../types.js';
3
+ export interface ApiProviderProps {
4
+ /**
5
+ * Base URL for API requests
6
+ */
7
+ defaultBaseUrl?: string;
8
+ servers: ServerObject[];
9
+ shikiOptions: RenderContext['shikiOptions'];
10
+ children?: ReactNode;
11
+ }
12
+ interface SelectedServer {
13
+ url: string;
14
+ variables: Record<string, string>;
15
+ }
16
+ interface ApiContextType extends Omit<ApiProviderProps, 'children' | 'defaultBaseUrl'> {
17
+ serverRef: RefObject<SelectedServer | null>;
18
+ }
19
+ interface ServerSelectType {
20
+ server: SelectedServer | null;
21
+ setServer: (value: string) => void;
22
+ setServerVariables: (value: Record<string, string>) => void;
23
+ }
24
+ export declare function useApiContext(): ApiContextType;
25
+ export declare function useServerSelectContext(): ServerSelectType;
26
+ export declare function ApiProvider({ defaultBaseUrl, children, ...props }: ApiProviderProps): import("react/jsx-runtime").JSX.Element;
27
+ export {};
28
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/ui/contexts/api.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAE5C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,UAAU,cACR,SAAQ,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,gBAAgB,CAAC;IAC7D,SAAS,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CAC7C;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;CAC7D;AAOD,wBAAgB,aAAa,IAAI,cAAc,CAK9C;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAKzD;AAED,wBAAgB,WAAW,CAAC,EAC1B,cAAc,EACd,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,gBAAgB,2CA0ElB"}
@@ -0,0 +1,74 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
3
+ const ApiContext = createContext(undefined);
4
+ const ServerSelectContext = createContext(undefined);
5
+ export function useApiContext() {
6
+ const ctx = useContext(ApiContext);
7
+ if (!ctx)
8
+ throw new Error('Component must be used under <ApiProvider />');
9
+ return ctx;
10
+ }
11
+ export function useServerSelectContext() {
12
+ const ctx = useContext(ServerSelectContext);
13
+ if (!ctx)
14
+ throw new Error('Component must be used under <ApiProvider />');
15
+ return ctx;
16
+ }
17
+ export function ApiProvider({ defaultBaseUrl, children, ...props }) {
18
+ const [server, setServer] = useState(() => {
19
+ const defaultItem = defaultBaseUrl
20
+ ? props.servers.find((item) => item.url === defaultBaseUrl)
21
+ : undefined;
22
+ return defaultItem
23
+ ? {
24
+ url: defaultItem.url,
25
+ variables: getDefaultValues(defaultItem),
26
+ }
27
+ : null;
28
+ });
29
+ const serverRef = useRef(server);
30
+ serverRef.current = server;
31
+ useEffect(() => {
32
+ const cached = localStorage.getItem('apiBaseUrl');
33
+ if (!cached)
34
+ return;
35
+ try {
36
+ const obj = JSON.parse(cached);
37
+ if (!obj || typeof obj !== 'object')
38
+ return;
39
+ setServer(obj);
40
+ }
41
+ catch {
42
+ // ignore
43
+ }
44
+ }, []);
45
+ return (_jsx(ApiContext.Provider, { value: useMemo(() => ({
46
+ ...props,
47
+ serverRef,
48
+ }), [props]), children: _jsx(ServerSelectContext.Provider, { value: useMemo(() => ({
49
+ server,
50
+ setServerVariables(variables) {
51
+ setServer((prev) => {
52
+ if (!prev)
53
+ return null;
54
+ const updated = { ...prev, variables };
55
+ localStorage.setItem('apiBaseUrl', JSON.stringify(updated));
56
+ return updated;
57
+ });
58
+ },
59
+ setServer(value) {
60
+ const obj = props.servers.find((item) => item.url === value);
61
+ if (!obj)
62
+ return;
63
+ const result = {
64
+ url: value,
65
+ variables: getDefaultValues(obj),
66
+ };
67
+ localStorage.setItem('apiBaseUrl', JSON.stringify(result));
68
+ setServer(result);
69
+ },
70
+ }), [server, props.servers]), children: children }) }));
71
+ }
72
+ function getDefaultValues(server) {
73
+ return Object.fromEntries(Object.entries(server.variables ?? {}).map(([k, v]) => [k, v.default]));
74
+ }
@@ -0,0 +1,17 @@
1
+ import { type RefObject } from 'react';
2
+ import { type ReferenceSchema, type RequestSchema } from '../../render/playground.js';
3
+ interface SchemaContextType {
4
+ references: Record<string, RequestSchema>;
5
+ dynamic: RefObject<Map<string, DynamicField>>;
6
+ }
7
+ export type DynamicField = {
8
+ type: 'object';
9
+ properties: string[];
10
+ } | {
11
+ type: 'field';
12
+ schema: RequestSchema | ReferenceSchema;
13
+ };
14
+ export declare const SchemaContext: import("react").Context<SchemaContextType | undefined>;
15
+ export declare function useSchemaContext(): SchemaContextType;
16
+ export {};
17
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/ui/contexts/schema.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAc,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE/E,UAAU,iBAAiB;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,aAAa,GAAG,eAAe,CAAC;CACzC,CAAC;AAEN,eAAO,MAAM,aAAa,wDAEzB,CAAC;AAEF,wBAAgB,gBAAgB,IAAI,iBAAiB,CAIpD"}
@@ -0,0 +1,8 @@
1
+ import { createContext, useContext } from 'react';
2
+ export const SchemaContext = createContext(undefined);
3
+ export function useSchemaContext() {
4
+ const ctx = useContext(SchemaContext);
5
+ if (!ctx)
6
+ throw new Error('Missing provider');
7
+ return ctx;
8
+ }