fumadocs-openapi 10.3.16 → 10.3.17

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 (148) hide show
  1. package/css/generated/shared.css +1 -0
  2. package/dist/generate-file.js +1 -2
  3. package/dist/generate-file.js.map +1 -1
  4. package/dist/index.js +1 -2
  5. package/dist/playground/client.d.ts +4 -3
  6. package/dist/playground/client.d.ts.map +1 -1
  7. package/dist/playground/client.js +2 -4
  8. package/dist/playground/client.js.map +1 -1
  9. package/dist/playground/components/inputs.js +2 -4
  10. package/dist/playground/components/inputs.js.map +1 -1
  11. package/dist/playground/components/oauth-dialog.js +1 -2
  12. package/dist/playground/components/oauth-dialog.js.map +1 -1
  13. package/dist/playground/components/server-select.js +2 -4
  14. package/dist/playground/components/server-select.js.map +1 -1
  15. package/dist/playground/fetcher.js +1 -2
  16. package/dist/playground/fetcher.js.map +1 -1
  17. package/dist/playground/index.d.ts +2 -7
  18. package/dist/playground/index.d.ts.map +1 -1
  19. package/dist/playground/index.js +23 -3
  20. package/dist/playground/index.js.map +1 -1
  21. package/dist/playground/lazy.js +2 -4
  22. package/dist/playground/lazy.js.map +1 -1
  23. package/dist/playground/schema.js +1 -2
  24. package/dist/playground/schema.js.map +1 -1
  25. package/dist/playground/status-info.js +1 -2
  26. package/dist/playground/status-info.js.map +1 -1
  27. package/dist/requests/generators/all.js +1 -2
  28. package/dist/requests/generators/all.js.map +1 -1
  29. package/dist/requests/generators/csharp.js +1 -2
  30. package/dist/requests/generators/csharp.js.map +1 -1
  31. package/dist/requests/generators/curl.js +1 -2
  32. package/dist/requests/generators/curl.js.map +1 -1
  33. package/dist/requests/generators/go.js +1 -2
  34. package/dist/requests/generators/go.js.map +1 -1
  35. package/dist/requests/generators/index.js +1 -1
  36. package/dist/requests/generators/java.js +1 -2
  37. package/dist/requests/generators/java.js.map +1 -1
  38. package/dist/requests/generators/javascript.js +1 -2
  39. package/dist/requests/generators/javascript.js.map +1 -1
  40. package/dist/requests/generators/python.js +1 -2
  41. package/dist/requests/generators/python.js.map +1 -1
  42. package/dist/requests/media/adapter.js +2 -3
  43. package/dist/requests/media/adapter.js.map +1 -1
  44. package/dist/requests/media/encode.d.ts.map +1 -1
  45. package/dist/requests/media/encode.js +1 -2
  46. package/dist/requests/media/encode.js.map +1 -1
  47. package/dist/requests/media/resolve-adapter.js +1 -1
  48. package/dist/requests/media/resolve-adapter.js.map +1 -1
  49. package/dist/requests/string-utils.js +1 -2
  50. package/dist/requests/string-utils.js.map +1 -1
  51. package/dist/requests/to-python-object.js +1 -1
  52. package/dist/scalar/client.js +2 -4
  53. package/dist/scalar/client.js.map +1 -1
  54. package/dist/scalar/index.js +1 -2
  55. package/dist/scalar/index.js.map +1 -1
  56. package/dist/server/create.js +1 -2
  57. package/dist/server/create.js.map +1 -1
  58. package/dist/server/index.js +1 -2
  59. package/dist/server/proxy.js +1 -1
  60. package/dist/server/proxy.js.map +1 -1
  61. package/dist/server/source-api.js +1 -2
  62. package/dist/server/source-api.js.map +1 -1
  63. package/dist/ui/api-page.js +1 -2
  64. package/dist/ui/api-page.js.map +1 -1
  65. package/dist/ui/base.js +1 -2
  66. package/dist/ui/base.js.map +1 -1
  67. package/dist/ui/client/index.js +2 -3
  68. package/dist/ui/client/index.js.map +1 -1
  69. package/dist/ui/client/storage-key.js +1 -2
  70. package/dist/ui/client/storage-key.js.map +1 -1
  71. package/dist/ui/components/accordion.js +2 -4
  72. package/dist/ui/components/accordion.js.map +1 -1
  73. package/dist/ui/components/dialog.js +3 -5
  74. package/dist/ui/components/dialog.js.map +1 -1
  75. package/dist/ui/components/input.js +1 -2
  76. package/dist/ui/components/input.js.map +1 -1
  77. package/dist/ui/components/method-label.js +1 -2
  78. package/dist/ui/components/method-label.js.map +1 -1
  79. package/dist/ui/components/select.js +2 -3
  80. package/dist/ui/components/select.js.map +1 -1
  81. package/dist/ui/contexts/api.js +2 -4
  82. package/dist/ui/contexts/api.js.map +1 -1
  83. package/dist/ui/contexts/api.lazy.js +2 -4
  84. package/dist/ui/contexts/api.lazy.js.map +1 -1
  85. package/dist/ui/full.client.js +2 -4
  86. package/dist/ui/full.client.js.map +1 -1
  87. package/dist/ui/full.js +1 -2
  88. package/dist/ui/full.js.map +1 -1
  89. package/dist/ui/index.js +1 -2
  90. package/dist/ui/operation/client.js +2 -4
  91. package/dist/ui/operation/client.js.map +1 -1
  92. package/dist/ui/operation/index.js +1 -2
  93. package/dist/ui/operation/index.js.map +1 -1
  94. package/dist/ui/operation/request-tabs.js +1 -2
  95. package/dist/ui/operation/request-tabs.js.map +1 -1
  96. package/dist/ui/operation/response-tabs.js +1 -2
  97. package/dist/ui/operation/response-tabs.js.map +1 -1
  98. package/dist/ui/operation/usage-tabs/client.js +4 -7
  99. package/dist/ui/operation/usage-tabs/client.js.map +1 -1
  100. package/dist/ui/operation/usage-tabs/index.js +1 -2
  101. package/dist/ui/operation/usage-tabs/index.js.map +1 -1
  102. package/dist/ui/operation/usage-tabs/lazy.js +2 -4
  103. package/dist/ui/operation/usage-tabs/lazy.js.map +1 -1
  104. package/dist/ui/schema/client.js +2 -4
  105. package/dist/ui/schema/client.js.map +1 -1
  106. package/dist/ui/schema/index.js +1 -2
  107. package/dist/ui/schema/index.js.map +1 -1
  108. package/dist/ui/schema/lazy.js +2 -4
  109. package/dist/ui/schema/lazy.js.map +1 -1
  110. package/dist/utils/cn.js +1 -2
  111. package/dist/utils/deep-equal.js +1 -1
  112. package/dist/utils/id-to-title.js +1 -1
  113. package/dist/utils/lazy.js +1 -2
  114. package/dist/utils/lazy.js.map +1 -1
  115. package/dist/utils/merge-schema.js +1 -2
  116. package/dist/utils/merge-schema.js.map +1 -1
  117. package/dist/utils/pages/builder.js +1 -2
  118. package/dist/utils/pages/builder.js.map +1 -1
  119. package/dist/utils/pages/preset-auto.js +1 -2
  120. package/dist/utils/pages/preset-auto.js.map +1 -1
  121. package/dist/utils/pages/to-body.js +1 -1
  122. package/dist/utils/pages/to-static-data.js +1 -2
  123. package/dist/utils/pages/to-static-data.js.map +1 -1
  124. package/dist/utils/pages/to-text.js +1 -2
  125. package/dist/utils/pages/to-text.js.map +1 -1
  126. package/dist/utils/process-document.js +3 -5
  127. package/dist/utils/process-document.js.map +1 -1
  128. package/dist/utils/remove-undefined.js +1 -1
  129. package/dist/utils/remove-undefined.js.map +1 -1
  130. package/dist/utils/schema-to-string.js +1 -1
  131. package/dist/utils/schema-to-string.js.map +1 -1
  132. package/dist/utils/schema.js +1 -2
  133. package/dist/utils/schema.js.map +1 -1
  134. package/dist/utils/url.js +1 -1
  135. package/dist/utils/use-query.js +1 -2
  136. package/dist/utils/use-query.js.map +1 -1
  137. package/package.json +8 -8
  138. package/dist/_virtual/_rolldown/runtime.js +0 -5
  139. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/dereference.js +0 -43
  140. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/dereference.js.map +0 -1
  141. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/index.js +0 -29
  142. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/index.js.map +0 -1
  143. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/klona.js +0 -42
  144. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/klona.js.map +0 -1
  145. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/resolveRef.js +0 -46
  146. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/resolveRef.js.map +0 -1
  147. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/types.js +0 -12
  148. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"request-tabs.js","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport { getPreferredType, type NoReference, pickExample } from '@/utils/schema';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { sample } from 'openapi-sampler';\nimport type { ReactNode } from 'react';\nimport type { RawRequestData, RequestData } from '@/requests/types';\nimport { encodeRequestData } from '@/requests/media/encode';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from 'fumadocs-ui/components/tabs';\nimport { resolveRequestData } from '@/utils/url';\nimport { MethodLabel } from '../components/method-label';\n\nexport interface ExampleRequestItem {\n id: string;\n name: string;\n description?: string;\n data: RawRequestData;\n encoded: RequestData;\n}\n\nexport function getExampleRequests(\n path: string,\n operation: NoReference<MethodInformation>,\n ctx: RenderContext,\n): ExampleRequestItem[] {\n const requestBody = operation.requestBody;\n const media = requestBody?.content ? getPreferredType(requestBody.content) : null;\n const bodyOfType = media ? requestBody!.content![media] : null;\n\n if (bodyOfType?.examples) {\n const result: ExampleRequestItem[] = [];\n\n for (const [key, value] of Object.entries(bodyOfType.examples)) {\n const data = getRequestData(path, operation, key, ctx);\n\n result.push({\n id: key,\n name: value.summary || key,\n description: value.description,\n data,\n encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? []),\n });\n }\n\n if (result.length > 0) return result;\n }\n\n const data = getRequestData(path, operation, null, ctx);\n return [\n {\n id: '_default',\n name: 'Default',\n description:\n typeof bodyOfType?.schema === 'object' ? bodyOfType.schema.description : undefined,\n data,\n encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? []),\n },\n ];\n}\n\nfunction getRequestData(\n path: string,\n method: NoReference<MethodInformation>,\n sampleKey: string | null,\n _ctx: RenderContext,\n): RawRequestData {\n const result: RawRequestData = {\n path: {},\n cookie: {},\n header: {},\n query: {},\n method: method.method,\n };\n\n for (const param of method.parameters ?? []) {\n let value = pickExample(param as never);\n\n if (value === undefined && param.required) {\n if (param.schema) {\n value = sample(param.schema as object);\n } else if (param.content) {\n const type = getPreferredType(param.content);\n const content = type ? param.content[type] : undefined;\n if (!content || !content.schema)\n throw new Error(\n `Cannot find \"${param.name}\" parameter info for media type \"${type}\" in ${path} ${method.method}`,\n );\n\n value = sample(content.schema as object);\n }\n }\n\n switch (param.in) {\n case 'cookie':\n result.cookie[param.name!] = value;\n break;\n case 'header':\n result.header[param.name!] = value;\n break;\n case 'query':\n result.query[param.name!] = value;\n break;\n default:\n result.path[param.name!] = value;\n }\n }\n\n if (method.requestBody?.content) {\n const body = method.requestBody.content;\n const type = getPreferredType(body);\n if (!type)\n throw new Error(`Cannot find body schema for ${path} ${method.method}: missing media type`);\n result.bodyMediaType = type as RawRequestData['bodyMediaType'];\n const bodyOfType = body[type];\n\n if (bodyOfType.examples && sampleKey) {\n result.body = bodyOfType.examples[sampleKey].value;\n } else if (bodyOfType.example) {\n result.body = bodyOfType.example;\n } else {\n result.body = sample((bodyOfType?.schema ?? {}) as object, {\n skipReadOnly: method.method !== 'GET',\n skipWriteOnly: method.method === 'GET',\n skipNonRequired: true,\n });\n }\n }\n\n return result;\n}\n\nexport async function RequestTabs({\n path,\n operation,\n ctx,\n}: {\n path: string;\n operation: NoReference<MethodInformation>;\n ctx: RenderContext;\n}) {\n if (!operation.requestBody) return null;\n const { renderRequestTabs = renderRequestTabsDefault } = ctx.content ?? {};\n\n return renderRequestTabs(getExampleRequests(path, operation, ctx), {\n ...ctx,\n route: path,\n operation,\n });\n}\n\nfunction renderRequestTabsDefault(\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n) {\n function renderItem(item: ExampleRequestItem) {\n const requestData = item.data;\n const displayNames: Partial<Record<keyof RawRequestData, ReactNode>> = {\n body: (\n <>\n Body\n <code className=\"text-xs text-fd-muted-foreground ms-auto\">\n {requestData.bodyMediaType}\n </code>\n </>\n ),\n cookie: 'Cookie',\n header: 'Header',\n query: 'Query Parameters',\n path: 'Path Parameters',\n };\n\n return (\n <>\n {item.description && ctx.renderMarkdown(item.description)}\n <div className=\"flex flex-row gap-2 items-center justify-between\">\n <MethodLabel>{requestData.method}</MethodLabel>\n <code>{resolveRequestData(ctx.route, item.encoded)}</code>\n </div>\n\n <Accordions type=\"multiple\" className=\"mt-2\">\n {Object.entries(displayNames).map(([k, v]) => {\n const data = requestData[k as keyof RawRequestData];\n if (!data || Object.keys(data).length === 0) return;\n\n return (\n <AccordionItem key={k} value={k}>\n <AccordionHeader>\n <AccordionTrigger>{v}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent className=\"prose-no-margin\">\n {ctx.renderCodeBlock('json', JSON.stringify(data, null, 2))}\n </AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordions>\n </>\n );\n }\n\n let children: ReactNode;\n if (items.length > 1) {\n children = (\n <Tabs defaultValue={items[0].id}>\n <TabsList>\n {items.map((item) => (\n <TabsTrigger key={item.id} value={item.id}>\n {item.name}\n </TabsTrigger>\n ))}\n </TabsList>\n {items.map((item) => (\n <TabsContent key={item.id} value={item.id}>\n {renderItem(item)}\n </TabsContent>\n ))}\n </Tabs>\n );\n } else if (items.length === 1) {\n children = renderItem(items[0]);\n } else {\n children = <p className=\"text-fd-muted-foreground text-xs\">Empty</p>;\n }\n\n return (\n <div className=\"p-3 rounded-xl border prose-no-margin bg-fd-card text-fd-card-foreground shadow-md\">\n <p className=\"font-semibold border-b pb-2\">Example Requests</p>\n {children}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"request-tabs.js","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport { getPreferredType, type NoReference, pickExample } from '@/utils/schema';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { sample } from 'openapi-sampler';\nimport type { ReactNode } from 'react';\nimport type { RawRequestData, RequestData } from '@/requests/types';\nimport { encodeRequestData } from '@/requests/media/encode';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from 'fumadocs-ui/components/tabs';\nimport { resolveRequestData } from '@/utils/url';\nimport { MethodLabel } from '../components/method-label';\n\nexport interface ExampleRequestItem {\n id: string;\n name: string;\n description?: string;\n data: RawRequestData;\n encoded: RequestData;\n}\n\nexport function getExampleRequests(\n path: string,\n operation: NoReference<MethodInformation>,\n ctx: RenderContext,\n): ExampleRequestItem[] {\n const requestBody = operation.requestBody;\n const media = requestBody?.content ? getPreferredType(requestBody.content) : null;\n const bodyOfType = media ? requestBody!.content![media] : null;\n\n if (bodyOfType?.examples) {\n const result: ExampleRequestItem[] = [];\n\n for (const [key, value] of Object.entries(bodyOfType.examples)) {\n const data = getRequestData(path, operation, key, ctx);\n\n result.push({\n id: key,\n name: value.summary || key,\n description: value.description,\n data,\n encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? []),\n });\n }\n\n if (result.length > 0) return result;\n }\n\n const data = getRequestData(path, operation, null, ctx);\n return [\n {\n id: '_default',\n name: 'Default',\n description:\n typeof bodyOfType?.schema === 'object' ? bodyOfType.schema.description : undefined,\n data,\n encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? []),\n },\n ];\n}\n\nfunction getRequestData(\n path: string,\n method: NoReference<MethodInformation>,\n sampleKey: string | null,\n _ctx: RenderContext,\n): RawRequestData {\n const result: RawRequestData = {\n path: {},\n cookie: {},\n header: {},\n query: {},\n method: method.method,\n };\n\n for (const param of method.parameters ?? []) {\n let value = pickExample(param as never);\n\n if (value === undefined && param.required) {\n if (param.schema) {\n value = sample(param.schema as object);\n } else if (param.content) {\n const type = getPreferredType(param.content);\n const content = type ? param.content[type] : undefined;\n if (!content || !content.schema)\n throw new Error(\n `Cannot find \"${param.name}\" parameter info for media type \"${type}\" in ${path} ${method.method}`,\n );\n\n value = sample(content.schema as object);\n }\n }\n\n switch (param.in) {\n case 'cookie':\n result.cookie[param.name!] = value;\n break;\n case 'header':\n result.header[param.name!] = value;\n break;\n case 'query':\n result.query[param.name!] = value;\n break;\n default:\n result.path[param.name!] = value;\n }\n }\n\n if (method.requestBody?.content) {\n const body = method.requestBody.content;\n const type = getPreferredType(body);\n if (!type)\n throw new Error(`Cannot find body schema for ${path} ${method.method}: missing media type`);\n result.bodyMediaType = type as RawRequestData['bodyMediaType'];\n const bodyOfType = body[type];\n\n if (bodyOfType.examples && sampleKey) {\n result.body = bodyOfType.examples[sampleKey].value;\n } else if (bodyOfType.example) {\n result.body = bodyOfType.example;\n } else {\n result.body = sample((bodyOfType?.schema ?? {}) as object, {\n skipReadOnly: method.method !== 'GET',\n skipWriteOnly: method.method === 'GET',\n skipNonRequired: true,\n });\n }\n }\n\n return result;\n}\n\nexport async function RequestTabs({\n path,\n operation,\n ctx,\n}: {\n path: string;\n operation: NoReference<MethodInformation>;\n ctx: RenderContext;\n}) {\n if (!operation.requestBody) return null;\n const { renderRequestTabs = renderRequestTabsDefault } = ctx.content ?? {};\n\n return renderRequestTabs(getExampleRequests(path, operation, ctx), {\n ...ctx,\n route: path,\n operation,\n });\n}\n\nfunction renderRequestTabsDefault(\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n) {\n function renderItem(item: ExampleRequestItem) {\n const requestData = item.data;\n const displayNames: Partial<Record<keyof RawRequestData, ReactNode>> = {\n body: (\n <>\n Body\n <code className=\"text-xs text-fd-muted-foreground ms-auto\">\n {requestData.bodyMediaType}\n </code>\n </>\n ),\n cookie: 'Cookie',\n header: 'Header',\n query: 'Query Parameters',\n path: 'Path Parameters',\n };\n\n return (\n <>\n {item.description && ctx.renderMarkdown(item.description)}\n <div className=\"flex flex-row gap-2 items-center justify-between\">\n <MethodLabel>{requestData.method}</MethodLabel>\n <code>{resolveRequestData(ctx.route, item.encoded)}</code>\n </div>\n\n <Accordions type=\"multiple\" className=\"mt-2\">\n {Object.entries(displayNames).map(([k, v]) => {\n const data = requestData[k as keyof RawRequestData];\n if (!data || Object.keys(data).length === 0) return;\n\n return (\n <AccordionItem key={k} value={k}>\n <AccordionHeader>\n <AccordionTrigger>{v}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent className=\"prose-no-margin\">\n {ctx.renderCodeBlock('json', JSON.stringify(data, null, 2))}\n </AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordions>\n </>\n );\n }\n\n let children: ReactNode;\n if (items.length > 1) {\n children = (\n <Tabs defaultValue={items[0].id}>\n <TabsList>\n {items.map((item) => (\n <TabsTrigger key={item.id} value={item.id}>\n {item.name}\n </TabsTrigger>\n ))}\n </TabsList>\n {items.map((item) => (\n <TabsContent key={item.id} value={item.id}>\n {renderItem(item)}\n </TabsContent>\n ))}\n </Tabs>\n );\n } else if (items.length === 1) {\n children = renderItem(items[0]);\n } else {\n children = <p className=\"text-fd-muted-foreground text-xs\">Empty</p>;\n }\n\n return (\n <div className=\"p-3 rounded-xl border prose-no-margin bg-fd-card text-fd-card-foreground shadow-md\">\n <p className=\"font-semibold border-b pb-2\">Example Requests</p>\n {children}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -3,7 +3,6 @@ import { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Acc
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  import { sample } from "openapi-sampler";
5
5
  import { Tab, Tabs } from "fumadocs-ui/components/tabs";
6
-
7
6
  //#region src/ui/operation/response-tabs.tsx
8
7
  function ResponseTabs({ operation, ctx }) {
9
8
  if (!operation.responses) return null;
@@ -70,7 +69,7 @@ function renderResponseTabsDefault(tabs, ctx) {
70
69
  children: tabs.map(renderResponse)
71
70
  });
72
71
  }
73
-
74
72
  //#endregion
75
73
  export { ResponseTabs };
74
+
76
75
  //# sourceMappingURL=response-tabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"response-tabs.js","names":[],"sources":["../../../src/ui/operation/response-tabs.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext, ResponseObject } from '@/types';\nimport { getPreferredType, type NoReference } from '@/utils/schema';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\nimport { sample } from 'openapi-sampler';\nimport type { ReactNode } from 'react';\n\nexport interface ResponseTab {\n /**\n * HTTP response code\n */\n code: string;\n\n response: NoReference<ResponseObject>;\n /**\n * media type of response\n */\n mediaType: string | null;\n\n examples?: ResponseExample[];\n}\n\ninterface ResponseExample {\n /**\n * generated/defined example data\n */\n sample: unknown;\n\n label: string;\n\n /**\n * description (in Markdown)\n */\n description?: string;\n}\n\nexport function ResponseTabs({\n operation,\n ctx,\n}: {\n operation: NoReference<MethodInformation>;\n ctx: RenderContext;\n}) {\n if (!operation.responses) return null;\n const tabs: ResponseTab[] = [];\n\n for (const [code, response] of Object.entries(operation.responses)) {\n const media = response.content ? getPreferredType(response.content) : null;\n const responseOfType = media ? response.content?.[media] : null;\n\n const tab: ResponseTab = {\n code,\n response,\n mediaType: media as string | null,\n };\n\n if (responseOfType?.examples) {\n tab.examples ??= [];\n\n for (const [key, sample] of Object.entries(responseOfType.examples)) {\n const title = sample?.summary || `Example ${key}`;\n\n tab.examples.push({\n label: title,\n sample: sample.value,\n description: sample?.description,\n });\n }\n } else if (responseOfType?.example || responseOfType?.schema) {\n tab.examples ??= [];\n tab.examples.push({\n label: 'Example',\n sample: responseOfType.example ?? sample(responseOfType.schema as object),\n });\n }\n\n tabs.push(tab);\n }\n const { renderResponseTabs = renderResponseTabsDefault } = ctx.content ?? {};\n\n return renderResponseTabs(tabs, ctx);\n}\n\nfunction renderResponseTabsDefault(\n tabs: ResponseTab[],\n ctx: RenderContext,\n): ReactNode | Promise<ReactNode> {\n function renderExampleContent(example: ResponseExample) {\n return (\n <>\n {example.description && ctx.renderMarkdown(example.description)}\n {ctx.renderCodeBlock('json', JSON.stringify(example.sample, null, 2))}\n </>\n );\n }\n\n async function renderResponse(tab: ResponseTab) {\n const { examples = [] } = tab;\n\n let slot: ReactNode = 'Empty';\n if (examples.length > 1) {\n slot = (\n <Accordions type=\"single\" className=\"pt-2\" defaultValue={examples[0].label}>\n {examples.map((example, i) => (\n <AccordionItem key={i} value={example.label}>\n <AccordionHeader>\n <AccordionTrigger>{example.label}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent className=\"prose-no-margin\">\n {renderExampleContent(example)}\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordions>\n );\n } else if (examples.length === 1) {\n slot = renderExampleContent(examples[0]);\n }\n\n return <Tab value={tab.code}>{slot}</Tab>;\n }\n\n if (tabs.length === 0) return null;\n\n return (\n <Tabs groupId=\"fumadocs_openapi_responses\" items={tabs.map((tab) => tab.code)}>\n {tabs.map(renderResponse)}\n </Tabs>\n );\n}\n"],"mappings":";;;;;;;AA0CA,SAAgB,aAAa,EAC3B,WACA,OAIC;AACD,KAAI,CAAC,UAAU,UAAW,QAAO;CACjC,MAAM,OAAsB,EAAE;AAE9B,MAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,UAAU,UAAU,EAAE;EAClE,MAAM,QAAQ,SAAS,UAAU,iBAAiB,SAAS,QAAQ,GAAG;EACtE,MAAM,iBAAiB,QAAQ,SAAS,UAAU,SAAS;EAE3D,MAAM,MAAmB;GACvB;GACA;GACA,WAAW;GACZ;AAED,MAAI,gBAAgB,UAAU;AAC5B,OAAI,aAAa,EAAE;AAEnB,QAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,eAAe,SAAS,EAAE;IACnE,MAAM,QAAQ,QAAQ,WAAW,WAAW;AAE5C,QAAI,SAAS,KAAK;KAChB,OAAO;KACP,QAAQ,OAAO;KACf,aAAa,QAAQ;KACtB,CAAC;;aAEK,gBAAgB,WAAW,gBAAgB,QAAQ;AAC5D,OAAI,aAAa,EAAE;AACnB,OAAI,SAAS,KAAK;IAChB,OAAO;IACP,QAAQ,eAAe,WAAW,OAAO,eAAe,OAAiB;IAC1E,CAAC;;AAGJ,OAAK,KAAK,IAAI;;CAEhB,MAAM,EAAE,qBAAqB,8BAA8B,IAAI,WAAW,EAAE;AAE5E,QAAO,mBAAmB,MAAM,IAAI;;AAGtC,SAAS,0BACP,MACA,KACgC;CAChC,SAAS,qBAAqB,SAA0B;AACtD,SACE,4CACG,QAAQ,eAAe,IAAI,eAAe,QAAQ,YAAY,EAC9D,IAAI,gBAAgB,QAAQ,KAAK,UAAU,QAAQ,QAAQ,MAAM,EAAE,CAAC,IACpE;;CAIP,eAAe,eAAe,KAAkB;EAC9C,MAAM,EAAE,WAAW,EAAE,KAAK;EAE1B,IAAI,OAAkB;AACtB,MAAI,SAAS,SAAS,EACpB,QACE,oBAAC;GAAW,MAAK;GAAS,WAAU;GAAO,cAAc,SAAS,GAAG;aAClE,SAAS,KAAK,SAAS,MACtB,qBAAC;IAAsB,OAAO,QAAQ;eACpC,oBAAC,6BACC,oBAAC,8BAAkB,QAAQ,QAAyB,GACpC,EAClB,oBAAC;KAAiB,WAAU;eACzB,qBAAqB,QAAQ;MACb;MAND,EAOJ,CAChB;IACS;WAEN,SAAS,WAAW,EAC7B,QAAO,qBAAqB,SAAS,GAAG;AAG1C,SAAO,oBAAC;GAAI,OAAO,IAAI;aAAO;IAAW;;AAG3C,KAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QACE,oBAAC;EAAK,SAAQ;EAA6B,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;YAC1E,KAAK,IAAI,eAAe;GACpB"}
1
+ {"version":3,"file":"response-tabs.js","names":[],"sources":["../../../src/ui/operation/response-tabs.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext, ResponseObject } from '@/types';\nimport { getPreferredType, type NoReference } from '@/utils/schema';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\nimport { sample } from 'openapi-sampler';\nimport type { ReactNode } from 'react';\n\nexport interface ResponseTab {\n /**\n * HTTP response code\n */\n code: string;\n\n response: NoReference<ResponseObject>;\n /**\n * media type of response\n */\n mediaType: string | null;\n\n examples?: ResponseExample[];\n}\n\ninterface ResponseExample {\n /**\n * generated/defined example data\n */\n sample: unknown;\n\n label: string;\n\n /**\n * description (in Markdown)\n */\n description?: string;\n}\n\nexport function ResponseTabs({\n operation,\n ctx,\n}: {\n operation: NoReference<MethodInformation>;\n ctx: RenderContext;\n}) {\n if (!operation.responses) return null;\n const tabs: ResponseTab[] = [];\n\n for (const [code, response] of Object.entries(operation.responses)) {\n const media = response.content ? getPreferredType(response.content) : null;\n const responseOfType = media ? response.content?.[media] : null;\n\n const tab: ResponseTab = {\n code,\n response,\n mediaType: media as string | null,\n };\n\n if (responseOfType?.examples) {\n tab.examples ??= [];\n\n for (const [key, sample] of Object.entries(responseOfType.examples)) {\n const title = sample?.summary || `Example ${key}`;\n\n tab.examples.push({\n label: title,\n sample: sample.value,\n description: sample?.description,\n });\n }\n } else if (responseOfType?.example || responseOfType?.schema) {\n tab.examples ??= [];\n tab.examples.push({\n label: 'Example',\n sample: responseOfType.example ?? sample(responseOfType.schema as object),\n });\n }\n\n tabs.push(tab);\n }\n const { renderResponseTabs = renderResponseTabsDefault } = ctx.content ?? {};\n\n return renderResponseTabs(tabs, ctx);\n}\n\nfunction renderResponseTabsDefault(\n tabs: ResponseTab[],\n ctx: RenderContext,\n): ReactNode | Promise<ReactNode> {\n function renderExampleContent(example: ResponseExample) {\n return (\n <>\n {example.description && ctx.renderMarkdown(example.description)}\n {ctx.renderCodeBlock('json', JSON.stringify(example.sample, null, 2))}\n </>\n );\n }\n\n async function renderResponse(tab: ResponseTab) {\n const { examples = [] } = tab;\n\n let slot: ReactNode = 'Empty';\n if (examples.length > 1) {\n slot = (\n <Accordions type=\"single\" className=\"pt-2\" defaultValue={examples[0].label}>\n {examples.map((example, i) => (\n <AccordionItem key={i} value={example.label}>\n <AccordionHeader>\n <AccordionTrigger>{example.label}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent className=\"prose-no-margin\">\n {renderExampleContent(example)}\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordions>\n );\n } else if (examples.length === 1) {\n slot = renderExampleContent(examples[0]);\n }\n\n return <Tab value={tab.code}>{slot}</Tab>;\n }\n\n if (tabs.length === 0) return null;\n\n return (\n <Tabs groupId=\"fumadocs_openapi_responses\" items={tabs.map((tab) => tab.code)}>\n {tabs.map(renderResponse)}\n </Tabs>\n );\n}\n"],"mappings":";;;;;;AA0CA,SAAgB,aAAa,EAC3B,WACA,OAIC;AACD,KAAI,CAAC,UAAU,UAAW,QAAO;CACjC,MAAM,OAAsB,EAAE;AAE9B,MAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,UAAU,UAAU,EAAE;EAClE,MAAM,QAAQ,SAAS,UAAU,iBAAiB,SAAS,QAAQ,GAAG;EACtE,MAAM,iBAAiB,QAAQ,SAAS,UAAU,SAAS;EAE3D,MAAM,MAAmB;GACvB;GACA;GACA,WAAW;GACZ;AAED,MAAI,gBAAgB,UAAU;AAC5B,OAAI,aAAa,EAAE;AAEnB,QAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,eAAe,SAAS,EAAE;IACnE,MAAM,QAAQ,QAAQ,WAAW,WAAW;AAE5C,QAAI,SAAS,KAAK;KAChB,OAAO;KACP,QAAQ,OAAO;KACf,aAAa,QAAQ;KACtB,CAAC;;aAEK,gBAAgB,WAAW,gBAAgB,QAAQ;AAC5D,OAAI,aAAa,EAAE;AACnB,OAAI,SAAS,KAAK;IAChB,OAAO;IACP,QAAQ,eAAe,WAAW,OAAO,eAAe,OAAiB;IAC1E,CAAC;;AAGJ,OAAK,KAAK,IAAI;;CAEhB,MAAM,EAAE,qBAAqB,8BAA8B,IAAI,WAAW,EAAE;AAE5E,QAAO,mBAAmB,MAAM,IAAI;;AAGtC,SAAS,0BACP,MACA,KACgC;CAChC,SAAS,qBAAqB,SAA0B;AACtD,SACE,qBAAA,UAAA,EAAA,UAAA,CACG,QAAQ,eAAe,IAAI,eAAe,QAAQ,YAAY,EAC9D,IAAI,gBAAgB,QAAQ,KAAK,UAAU,QAAQ,QAAQ,MAAM,EAAE,CAAC,CACpE,EAAA,CAAA;;CAIP,eAAe,eAAe,KAAkB;EAC9C,MAAM,EAAE,WAAW,EAAE,KAAK;EAE1B,IAAI,OAAkB;AACtB,MAAI,SAAS,SAAS,EACpB,QACE,oBAAC,YAAD;GAAY,MAAK;GAAS,WAAU;GAAO,cAAc,SAAS,GAAG;aAClE,SAAS,KAAK,SAAS,MACtB,qBAAC,eAAD;IAAuB,OAAO,QAAQ;cAAtC,CACE,oBAAC,iBAAD,EAAA,UACE,oBAAC,kBAAD,EAAA,UAAmB,QAAQ,OAAyB,CAAA,EACpC,CAAA,EAClB,oBAAC,kBAAD;KAAkB,WAAU;eACzB,qBAAqB,QAAQ;KACb,CAAA,CACL;MAPI,EAOJ,CAChB;GACS,CAAA;WAEN,SAAS,WAAW,EAC7B,QAAO,qBAAqB,SAAS,GAAG;AAG1C,SAAO,oBAAC,KAAD;GAAK,OAAO,IAAI;aAAO;GAAW,CAAA;;AAG3C,KAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QACE,oBAAC,MAAD;EAAM,SAAQ;EAA6B,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;YAC1E,KAAK,IAAI,eAAe;EACpB,CAAA"}
@@ -1,12 +1,10 @@
1
- 'use client';
2
-
1
+ "use client";
3
2
  import { joinURL, resolveRequestData, resolveServerUrl, withBase } from "../../../utils/url.js";
4
3
  import { useApiContext, useServerSelectContext } from "../../contexts/api.js";
5
4
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../components/select.js";
6
5
  import { createContext, use, useEffect, useMemo, useRef, useState } from "react";
7
6
  import { jsx, jsxs } from "react/jsx-runtime";
8
7
  import { DynamicCodeBlock } from "fumadocs-ui/components/dynamic-codeblock.core";
9
-
10
8
  //#region src/ui/operation/usage-tabs/client.tsx
11
9
  const Context = createContext(null);
12
10
  function UsageTabsProvider({ route, examples, defaultExampleId, children }) {
@@ -88,6 +86,7 @@ function UsageTab({ id, lang, _client }) {
88
86
  const { shikiOptions, mediaAdapters, codeUsages } = useApiContext();
89
87
  const { examples, example: selectedExampleId, route, addListener, removeListener } = useExampleRequests();
90
88
  const { server } = useServerSelectContext();
89
+ const codegen = codeUsages.get(id);
91
90
  const [data, setData] = useState(() => examples.find((example) => example.id === selectedExampleId)?.encoded);
92
91
  useEffect(() => {
93
92
  const listener = (_, encoded) => setData(encoded);
@@ -107,7 +106,6 @@ function UsageTab({ id, lang, _client }) {
107
106
  server: serverContext
108
107
  });
109
108
  }
110
- const codegen = codeUsages.get(id);
111
109
  if (!codegen) return;
112
110
  return codegen.generate(url, data, {
113
111
  mediaAdapters,
@@ -118,8 +116,7 @@ function UsageTab({ id, lang, _client }) {
118
116
  server,
119
117
  route,
120
118
  _client,
121
- codeUsages,
122
- id,
119
+ codegen,
123
120
  mediaAdapters
124
121
  ]);
125
122
  if (!code) return null;
@@ -129,7 +126,7 @@ function UsageTab({ id, lang, _client }) {
129
126
  options: shikiOptions
130
127
  });
131
128
  }
132
-
133
129
  //#endregion
134
130
  export { UsageTab, UsageTabsProvider, UsageTabsSelector, useExampleRequests };
131
+
135
132
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/client.tsx"],"sourcesContent":["'use client';\nimport { useApiContext, useServerSelectContext } from '@/ui/contexts/api';\nimport { joinURL, withBase, resolveServerUrl, resolveRequestData } from '@/utils/url';\nimport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n} from '@/ui/components/select';\nimport { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock.core';\nimport { useState, useEffect, useMemo, createContext, ReactNode, useRef, use } from 'react';\nimport type { ExampleRequestItem } from '../request-tabs';\nimport type { RawRequestData, RequestData } from '@/requests/types';\nimport type { CodeUsageGenerator } from '@/requests/generators';\n\nexport type ExampleUpdateListener = (data: RawRequestData, encoded: RequestData) => void;\n\nconst Context = createContext<{\n route: string;\n examples: ExampleRequestItem[];\n example: string | undefined;\n setExample: (id: string) => void;\n setExampleData: (data: RawRequestData, encoded: RequestData) => void;\n\n addListener: (listener: ExampleUpdateListener) => void;\n removeListener: (listener: ExampleUpdateListener) => void;\n} | null>(null);\n\nexport function UsageTabsProvider({\n route,\n examples,\n defaultExampleId,\n children,\n}: {\n route: string;\n examples: ExampleRequestItem[];\n defaultExampleId?: string;\n children: ReactNode;\n}) {\n const [example, setExample] = useState(() => defaultExampleId ?? examples.at(0)?.id);\n const listeners = useRef<ExampleUpdateListener[]>([]);\n\n return (\n <Context\n value={useMemo(\n () => ({\n example,\n route,\n setExample(newKey: string) {\n const example = examples.find((example) => example.id === newKey);\n if (!example) return;\n\n setExample(newKey);\n for (const listener of listeners.current) {\n listener(example.data, example.encoded);\n }\n },\n examples,\n setExampleData(data, encoded) {\n for (const item of examples) {\n if (item.id === example) {\n // persistent changes\n item.data = data;\n item.encoded = encoded;\n break;\n }\n }\n\n for (const listener of listeners.current) {\n listener(data, encoded);\n }\n },\n removeListener(listener) {\n listeners.current = listeners.current.filter((item) => item !== listener);\n },\n addListener(listener) {\n // initial call to listeners to ensure their data is the latest\n // this is necessary to avoid race conditions between `useEffect()`\n const active = examples.find((item) => item.id === example)!;\n\n listener(active.data, active.encoded);\n listeners.current.push(listener);\n },\n }),\n [example, route, examples],\n )}\n >\n {children}\n </Context>\n );\n}\n\nexport function useExampleRequests() {\n return use(Context)!;\n}\n\nexport function UsageTabsSelector() {\n const { example: key, setExample: setKey, examples } = useExampleRequests();\n const { APIExampleSelector: Override } = useApiContext().client.operation ?? {};\n\n if (Override) {\n return <Override items={examples} value={key} onValueChange={setKey} />;\n }\n\n function renderItem(item: ExampleRequestItem) {\n return (\n <div>\n <span className=\"font-medium text-sm\">{item.name}</span>\n <span className=\"text-fd-muted-foreground\">{item.description}</span>\n </div>\n );\n }\n\n if (examples.length === 1) return null;\n const selected = examples.find((item) => item.id === key);\n return (\n <Select value={key} onValueChange={setKey}>\n <SelectTrigger className=\"not-prose mb-2\">\n {selected && <SelectValue asChild>{renderItem(selected)}</SelectValue>}\n </SelectTrigger>\n <SelectContent>\n {examples.map((item) => (\n <SelectItem key={item.id} value={item.id}>\n {renderItem(item)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nexport function UsageTab({\n id,\n lang,\n _client,\n}: Pick<CodeUsageGenerator, 'lang' | '_client'> & { id: string }) {\n const { shikiOptions, mediaAdapters, codeUsages } = useApiContext();\n const {\n examples,\n example: selectedExampleId,\n route,\n addListener,\n removeListener,\n } = useExampleRequests();\n const { server } = useServerSelectContext();\n const [data, setData] = useState(\n () => examples.find((example) => example.id === selectedExampleId)?.encoded,\n );\n\n useEffect(() => {\n const listener: ExampleUpdateListener = (_, encoded) => setData(encoded);\n\n addListener(listener);\n return () => {\n removeListener(listener);\n };\n }, [addListener, removeListener]);\n\n const code = useMemo(() => {\n if (!data) return;\n const url = joinURL(\n withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n typeof window !== 'undefined' ? window.location.origin : 'https://loading',\n ),\n resolveRequestData(route, data),\n );\n\n if (_client) {\n const { generate, serverContext } = _client;\n if (typeof generate === 'string') return generate;\n return generate(url, data, {\n mediaAdapters,\n server: serverContext,\n });\n }\n\n const codegen = codeUsages.get(id);\n if (!codegen) return;\n return codegen.generate(url, data, {\n mediaAdapters,\n server: null,\n });\n }, [data, server, route, _client, codeUsages, id, mediaAdapters]);\n\n if (!code) return null;\n\n return <DynamicCodeBlock lang={lang} code={code} options={shikiOptions} />;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/client.tsx"],"sourcesContent":["'use client';\nimport { useApiContext, useServerSelectContext } from '@/ui/contexts/api';\nimport { joinURL, withBase, resolveServerUrl, resolveRequestData } from '@/utils/url';\nimport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n} from '@/ui/components/select';\nimport { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock.core';\nimport { useState, useEffect, useMemo, createContext, ReactNode, useRef, use } from 'react';\nimport type { ExampleRequestItem } from '../request-tabs';\nimport type { RawRequestData, RequestData } from '@/requests/types';\nimport type { CodeUsageGenerator } from '@/requests/generators';\n\nexport type ExampleUpdateListener = (data: RawRequestData, encoded: RequestData) => void;\n\nconst Context = createContext<{\n route: string;\n examples: ExampleRequestItem[];\n example: string | undefined;\n setExample: (id: string) => void;\n setExampleData: (data: RawRequestData, encoded: RequestData) => void;\n\n addListener: (listener: ExampleUpdateListener) => void;\n removeListener: (listener: ExampleUpdateListener) => void;\n} | null>(null);\n\nexport function UsageTabsProvider({\n route,\n examples,\n defaultExampleId,\n children,\n}: {\n route: string;\n examples: ExampleRequestItem[];\n defaultExampleId?: string;\n children: ReactNode;\n}) {\n const [example, setExample] = useState(() => defaultExampleId ?? examples.at(0)?.id);\n const listeners = useRef<ExampleUpdateListener[]>([]);\n\n return (\n <Context\n value={useMemo(\n () => ({\n example,\n route,\n setExample(newKey: string) {\n const example = examples.find((example) => example.id === newKey);\n if (!example) return;\n\n setExample(newKey);\n for (const listener of listeners.current) {\n listener(example.data, example.encoded);\n }\n },\n examples,\n setExampleData(data, encoded) {\n for (const item of examples) {\n if (item.id === example) {\n // persistent changes\n item.data = data;\n item.encoded = encoded;\n break;\n }\n }\n\n for (const listener of listeners.current) {\n listener(data, encoded);\n }\n },\n removeListener(listener) {\n listeners.current = listeners.current.filter((item) => item !== listener);\n },\n addListener(listener) {\n // initial call to listeners to ensure their data is the latest\n // this is necessary to avoid race conditions between `useEffect()`\n const active = examples.find((item) => item.id === example)!;\n\n listener(active.data, active.encoded);\n listeners.current.push(listener);\n },\n }),\n [example, route, examples],\n )}\n >\n {children}\n </Context>\n );\n}\n\nexport function useExampleRequests() {\n return use(Context)!;\n}\n\nexport function UsageTabsSelector() {\n const { example: key, setExample: setKey, examples } = useExampleRequests();\n const { APIExampleSelector: Override } = useApiContext().client.operation ?? {};\n\n if (Override) {\n return <Override items={examples} value={key} onValueChange={setKey} />;\n }\n\n function renderItem(item: ExampleRequestItem) {\n return (\n <div>\n <span className=\"font-medium text-sm\">{item.name}</span>\n <span className=\"text-fd-muted-foreground\">{item.description}</span>\n </div>\n );\n }\n\n if (examples.length === 1) return null;\n const selected = examples.find((item) => item.id === key);\n return (\n <Select value={key} onValueChange={setKey}>\n <SelectTrigger className=\"not-prose mb-2\">\n {selected && <SelectValue asChild>{renderItem(selected)}</SelectValue>}\n </SelectTrigger>\n <SelectContent>\n {examples.map((item) => (\n <SelectItem key={item.id} value={item.id}>\n {renderItem(item)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nexport function UsageTab({\n id,\n lang,\n _client,\n}: Pick<CodeUsageGenerator, 'lang' | '_client'> & { id: string }) {\n const { shikiOptions, mediaAdapters, codeUsages } = useApiContext();\n const {\n examples,\n example: selectedExampleId,\n route,\n addListener,\n removeListener,\n } = useExampleRequests();\n const { server } = useServerSelectContext();\n const codegen = codeUsages.get(id);\n const [data, setData] = useState(\n () => examples.find((example) => example.id === selectedExampleId)?.encoded,\n );\n\n useEffect(() => {\n const listener: ExampleUpdateListener = (_, encoded) => setData(encoded);\n\n addListener(listener);\n return () => {\n removeListener(listener);\n };\n }, [addListener, removeListener]);\n\n const code = useMemo(() => {\n if (!data) return;\n const url = joinURL(\n withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n typeof window !== 'undefined' ? window.location.origin : 'https://loading',\n ),\n resolveRequestData(route, data),\n );\n\n if (_client) {\n const { generate, serverContext } = _client;\n if (typeof generate === 'string') return generate;\n return generate(url, data, {\n mediaAdapters,\n server: serverContext,\n });\n }\n\n if (!codegen) return;\n return codegen.generate(url, data, {\n mediaAdapters,\n server: null,\n });\n }, [data, server, route, _client, codegen, mediaAdapters]);\n\n if (!code) return null;\n\n return <DynamicCodeBlock lang={lang} code={code} options={shikiOptions} />;\n}\n"],"mappings":"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"}
@@ -4,7 +4,6 @@ import { UsageTabLazy, UsageTabsSelectorLazy } from "./lazy.js";
4
4
  import { ResponseTabs } from "../response-tabs.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { CodeBlockTab, CodeBlockTabs, CodeBlockTabsList, CodeBlockTabsTrigger } from "fumadocs-ui/components/codeblock";
7
-
8
7
  //#region src/ui/operation/usage-tabs/index.tsx
9
8
  async function UsageTabs({ method, ctx }) {
10
9
  let { renderAPIExampleUsageTabs, renderAPIExampleLayout } = ctx.content ?? {};
@@ -54,7 +53,7 @@ async function UsageTabs({ method, ctx }) {
54
53
  })
55
54
  }, ctx);
56
55
  }
57
-
58
56
  //#endregion
59
57
  export { UsageTabs };
58
+
60
59
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/index.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport type { CodeUsageGeneratorFn } from '@/requests/generators';\nimport {\n type CodeUsageGeneratorRegistry,\n createCodeUsageGeneratorRegistry,\n} from '@/requests/generators';\nimport {\n CodeBlockTab,\n CodeBlockTabs,\n CodeBlockTabsList,\n CodeBlockTabsTrigger,\n} from 'fumadocs-ui/components/codeblock';\nimport { UsageTabsSelectorLazy, UsageTabLazy } from './lazy';\nimport { ResponseTabs } from '../response-tabs';\nimport { registerDefault } from '@/requests/generators/all';\n\n/**\n * Generate code example for given programming language\n */\nexport interface CodeUsageGenerator<T = unknown> {\n id: string;\n lang: string;\n label?: string;\n /**\n * either:\n * - code\n * - a function imported from a file with \"use client\" directive\n * - false (disabled)\n */\n source?: string | CodeUsageGeneratorFn<T> | false;\n\n /**\n * Pass extra context to client-side source generator\n */\n serverContext?: T;\n}\n\nexport async function UsageTabs({\n method,\n ctx,\n}: {\n method: MethodInformation;\n ctx: RenderContext;\n}) {\n let { renderAPIExampleUsageTabs, renderAPIExampleLayout } = ctx.content ?? {};\n\n renderAPIExampleLayout ??= (slots) => {\n return (\n <div className=\"prose-no-margin\">\n {slots.selector}\n {slots.usageTabs}\n {slots.responseTabs}\n </div>\n );\n };\n\n renderAPIExampleUsageTabs ??= (registry) => {\n const map = Array.from(registry.map().entries());\n if (map.length === 0) return null;\n\n return (\n <CodeBlockTabs groupId=\"fumadocs_openapi_requests\" defaultValue={map[0][0]}>\n <CodeBlockTabsList>\n {map.map(([id, item]) => (\n <CodeBlockTabsTrigger key={id} value={id}>\n {item.label ?? item.lang}\n </CodeBlockTabsTrigger>\n ))}\n </CodeBlockTabsList>\n {map.map(([id, item]) => (\n <CodeBlockTab key={id} value={id}>\n <UsageTabLazy id={id} lang={item.lang} _client={item._client} />\n </CodeBlockTab>\n ))}\n </CodeBlockTabs>\n );\n };\n\n let registry: CodeUsageGeneratorRegistry;\n if (ctx.codeUsages) {\n registry = createCodeUsageGeneratorRegistry(ctx.codeUsages);\n } else {\n registry = createCodeUsageGeneratorRegistry();\n registerDefault(registry);\n }\n\n for (const gen of (await ctx.generateCodeSamples?.(method)) ?? []) {\n registry.addInline(gen);\n }\n\n if (method['x-codeSamples']) {\n for (const sample of method['x-codeSamples']) {\n registry.addInline(sample);\n }\n }\n\n return renderAPIExampleLayout(\n {\n selector: method['x-exclusiveCodeSample'] ? null : <UsageTabsSelectorLazy />,\n usageTabs: await renderAPIExampleUsageTabs(registry, ctx),\n responseTabs: <ResponseTabs operation={method} ctx={ctx} />,\n },\n ctx,\n );\n}\n"],"mappings":";;;;;;;;AAqCA,eAAsB,UAAU,EAC9B,QACA,OAIC;CACD,IAAI,EAAE,2BAA2B,2BAA2B,IAAI,WAAW,EAAE;AAE7E,6BAA4B,UAAU;AACpC,SACE,qBAAC;GAAI,WAAU;;IACZ,MAAM;IACN,MAAM;IACN,MAAM;;IACH;;AAIV,gCAA+B,aAAa;EAC1C,MAAM,MAAM,MAAM,KAAK,SAAS,KAAK,CAAC,SAAS,CAAC;AAChD,MAAI,IAAI,WAAW,EAAG,QAAO;AAE7B,SACE,qBAAC;GAAc,SAAQ;GAA4B,cAAc,IAAI,GAAG;cACtE,oBAAC,+BACE,IAAI,KAAK,CAAC,IAAI,UACb,oBAAC;IAA8B,OAAO;cACnC,KAAK,SAAS,KAAK;MADK,GAEJ,CACvB,GACgB,EACnB,IAAI,KAAK,CAAC,IAAI,UACb,oBAAC;IAAsB,OAAO;cAC5B,oBAAC;KAAiB;KAAI,MAAM,KAAK;KAAM,SAAS,KAAK;MAAW;MAD/C,GAEJ,CACf;IACY;;CAIpB,IAAI;AACJ,KAAI,IAAI,WACN,YAAW,iCAAiC,IAAI,WAAW;MACtD;AACL,aAAW,kCAAkC;AAC7C,kBAAgB,SAAS;;AAG3B,MAAK,MAAM,OAAQ,MAAM,IAAI,sBAAsB,OAAO,IAAK,EAAE,CAC/D,UAAS,UAAU,IAAI;AAGzB,KAAI,OAAO,iBACT,MAAK,MAAM,UAAU,OAAO,iBAC1B,UAAS,UAAU,OAAO;AAI9B,QAAO,uBACL;EACE,UAAU,OAAO,2BAA2B,OAAO,oBAAC,0BAAwB;EAC5E,WAAW,MAAM,0BAA0B,UAAU,IAAI;EACzD,cAAc,oBAAC;GAAa,WAAW;GAAa;IAAO;EAC5D,EACD,IACD"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/index.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport type { CodeUsageGeneratorFn } from '@/requests/generators';\nimport {\n type CodeUsageGeneratorRegistry,\n createCodeUsageGeneratorRegistry,\n} from '@/requests/generators';\nimport {\n CodeBlockTab,\n CodeBlockTabs,\n CodeBlockTabsList,\n CodeBlockTabsTrigger,\n} from 'fumadocs-ui/components/codeblock';\nimport { UsageTabsSelectorLazy, UsageTabLazy } from './lazy';\nimport { ResponseTabs } from '../response-tabs';\nimport { registerDefault } from '@/requests/generators/all';\n\n/**\n * Generate code example for given programming language\n */\nexport interface CodeUsageGenerator<T = unknown> {\n id: string;\n lang: string;\n label?: string;\n /**\n * either:\n * - code\n * - a function imported from a file with \"use client\" directive\n * - false (disabled)\n */\n source?: string | CodeUsageGeneratorFn<T> | false;\n\n /**\n * Pass extra context to client-side source generator\n */\n serverContext?: T;\n}\n\nexport async function UsageTabs({\n method,\n ctx,\n}: {\n method: MethodInformation;\n ctx: RenderContext;\n}) {\n let { renderAPIExampleUsageTabs, renderAPIExampleLayout } = ctx.content ?? {};\n\n renderAPIExampleLayout ??= (slots) => {\n return (\n <div className=\"prose-no-margin\">\n {slots.selector}\n {slots.usageTabs}\n {slots.responseTabs}\n </div>\n );\n };\n\n renderAPIExampleUsageTabs ??= (registry) => {\n const map = Array.from(registry.map().entries());\n if (map.length === 0) return null;\n\n return (\n <CodeBlockTabs groupId=\"fumadocs_openapi_requests\" defaultValue={map[0][0]}>\n <CodeBlockTabsList>\n {map.map(([id, item]) => (\n <CodeBlockTabsTrigger key={id} value={id}>\n {item.label ?? item.lang}\n </CodeBlockTabsTrigger>\n ))}\n </CodeBlockTabsList>\n {map.map(([id, item]) => (\n <CodeBlockTab key={id} value={id}>\n <UsageTabLazy id={id} lang={item.lang} _client={item._client} />\n </CodeBlockTab>\n ))}\n </CodeBlockTabs>\n );\n };\n\n let registry: CodeUsageGeneratorRegistry;\n if (ctx.codeUsages) {\n registry = createCodeUsageGeneratorRegistry(ctx.codeUsages);\n } else {\n registry = createCodeUsageGeneratorRegistry();\n registerDefault(registry);\n }\n\n for (const gen of (await ctx.generateCodeSamples?.(method)) ?? []) {\n registry.addInline(gen);\n }\n\n if (method['x-codeSamples']) {\n for (const sample of method['x-codeSamples']) {\n registry.addInline(sample);\n }\n }\n\n return renderAPIExampleLayout(\n {\n selector: method['x-exclusiveCodeSample'] ? null : <UsageTabsSelectorLazy />,\n usageTabs: await renderAPIExampleUsageTabs(registry, ctx),\n responseTabs: <ResponseTabs operation={method} ctx={ctx} />,\n },\n ctx,\n );\n}\n"],"mappings":";;;;;;;AAqCA,eAAsB,UAAU,EAC9B,QACA,OAIC;CACD,IAAI,EAAE,2BAA2B,2BAA2B,IAAI,WAAW,EAAE;AAE7E,6BAA4B,UAAU;AACpC,SACE,qBAAC,OAAD;GAAK,WAAU;aAAf;IACG,MAAM;IACN,MAAM;IACN,MAAM;IACH;;;AAIV,gCAA+B,aAAa;EAC1C,MAAM,MAAM,MAAM,KAAK,SAAS,KAAK,CAAC,SAAS,CAAC;AAChD,MAAI,IAAI,WAAW,EAAG,QAAO;AAE7B,SACE,qBAAC,eAAD;GAAe,SAAQ;GAA4B,cAAc,IAAI,GAAG;aAAxE,CACE,oBAAC,mBAAD,EAAA,UACG,IAAI,KAAK,CAAC,IAAI,UACb,oBAAC,sBAAD;IAA+B,OAAO;cACnC,KAAK,SAAS,KAAK;IACC,EAFI,GAEJ,CACvB,EACgB,CAAA,EACnB,IAAI,KAAK,CAAC,IAAI,UACb,oBAAC,cAAD;IAAuB,OAAO;cAC5B,oBAAC,cAAD;KAAkB;KAAI,MAAM,KAAK;KAAM,SAAS,KAAK;KAAW,CAAA;IACnD,EAFI,GAEJ,CACf,CACY;;;CAIpB,IAAI;AACJ,KAAI,IAAI,WACN,YAAW,iCAAiC,IAAI,WAAW;MACtD;AACL,aAAW,kCAAkC;AAC7C,kBAAgB,SAAS;;AAG3B,MAAK,MAAM,OAAQ,MAAM,IAAI,sBAAsB,OAAO,IAAK,EAAE,CAC/D,UAAS,UAAU,IAAI;AAGzB,KAAI,OAAO,iBACT,MAAK,MAAM,UAAU,OAAO,iBAC1B,UAAS,UAAU,OAAO;AAI9B,QAAO,uBACL;EACE,UAAU,OAAO,2BAA2B,OAAO,oBAAC,uBAAD,EAAyB,CAAA;EAC5E,WAAW,MAAM,0BAA0B,UAAU,IAAI;EACzD,cAAc,oBAAC,cAAD;GAAc,WAAW;GAAa;GAAO,CAAA;EAC5D,EACD,IACD"}
@@ -1,12 +1,10 @@
1
- 'use client';
2
-
1
+ "use client";
3
2
  import { wrapLazy } from "../../../utils/lazy.js";
4
-
5
3
  //#region src/ui/operation/usage-tabs/lazy.tsx
6
4
  const UsageTabsSelectorLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTabsSelector })));
7
5
  const UsageTabLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTab })));
8
6
  const UsageTabsProviderLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTabsProvider })));
9
-
10
7
  //#endregion
11
8
  export { UsageTabLazy, UsageTabsProviderLazy, UsageTabsSelectorLazy };
9
+
12
10
  //# sourceMappingURL=lazy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/lazy.tsx"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../../utils/lazy';\n\nexport const UsageTabsSelectorLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTabsSelector })),\n);\n\nexport const UsageTabLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTab })),\n);\n\nexport const UsageTabsProviderLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTabsProvider })),\n);\n"],"mappings":";;;;;AAGA,MAAa,wBAAwB,eACnC,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CACvE;AAED,MAAa,eAAe,eAC1B,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAC9D;AAED,MAAa,wBAAwB,eACnC,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CACvE"}
1
+ {"version":3,"file":"lazy.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/lazy.tsx"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../../utils/lazy';\n\nexport const UsageTabsSelectorLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTabsSelector })),\n);\n\nexport const UsageTabLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTab })),\n);\n\nexport const UsageTabsProviderLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTabsProvider })),\n);\n"],"mappings":";;;AAGA,MAAa,wBAAwB,eACnC,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CACvE;AAED,MAAa,eAAe,eAC1B,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAC9D;AAED,MAAa,wBAAwB,eACnC,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CACvE"}
@@ -1,5 +1,4 @@
1
- 'use client';
2
-
1
+ "use client";
3
2
  import { cn } from "../../utils/cn.js";
4
3
  import { Badge } from "../components/method-label.js";
5
4
  import { Fragment, Suspense, createContext, use, useCallback, useDeferredValue, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
@@ -10,7 +9,6 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "fumadocs-ui
10
9
  import { buttonVariants } from "fumadocs-ui/components/ui/button";
11
10
  import { Tabs, TabsContent, TabsList, TabsTrigger } from "fumadocs-ui/components/tabs";
12
11
  import { Popover, PopoverContent, PopoverTrigger } from "fumadocs-ui/components/ui/popover";
13
-
14
12
  //#region src/ui/schema/client.tsx
15
13
  const typeVariants = cva("text-sm text-start text-fd-muted-foreground font-mono", { variants: { variant: { trigger: "underline hover:text-fd-accent-foreground data-[state=open]:text-fd-accent-foreground" } } });
16
14
  const PopoverContext = createContext({ renderTrigger: (props) => /* @__PURE__ */ jsx(RootPopoverTrigger, { ...props }) });
@@ -335,7 +333,7 @@ function Property({ name, type, required, deprecated, nested = false, className,
335
333
  })]
336
334
  });
337
335
  }
338
-
339
336
  //#endregion
340
337
  export { SchemaUI };
338
+
341
339
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../../src/ui/schema/client.tsx"],"sourcesContent":["'use client';\nimport {\n type ComponentProps,\n createContext,\n Fragment,\n type ReactNode,\n type RefObject,\n Suspense,\n use,\n useCallback,\n useDeferredValue,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from 'fumadocs-ui/components/tabs';\nimport type { InfoTag, SchemaDataObjectProperty, SchemaUIGeneratedData } from '@/ui/schema';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from 'fumadocs-ui/components/ui/collapsible';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { ChevronDown, FilterIcon } from 'lucide-react';\nimport { Badge } from '@/ui/components/method-label';\nimport { Popover, PopoverContent, PopoverTrigger } from 'fumadocs-ui/components/ui/popover';\nimport { cn } from '@/utils/cn';\nimport { cva } from 'class-variance-authority';\n\ntype DataContextType = SchemaUIGeneratedData;\n\ninterface PopoverContextType {\n renderTrigger: (props: { pathName: ReactNode; $ref: string; children: ReactNode }) => ReactNode;\n}\n\nconst typeVariants = cva('text-sm text-start text-fd-muted-foreground font-mono', {\n variants: {\n variant: {\n trigger:\n 'underline hover:text-fd-accent-foreground data-[state=open]:text-fd-accent-foreground',\n },\n },\n});\n\nconst PopoverContext = createContext<PopoverContextType>({\n renderTrigger: (props) => <RootPopoverTrigger {...props} />,\n});\n\nconst DataContext = createContext<DataContextType | null>(null);\n\nfunction useData() {\n return use(DataContext)!;\n}\n\nfunction usePopover() {\n return use(PopoverContext);\n}\n\nexport interface SchemaUIProps {\n name: string;\n required?: boolean;\n as?: 'property' | 'body';\n\n generated: SchemaUIGeneratedData;\n}\n\nexport function SchemaUI({ name, required = false, as = 'property', generated }: SchemaUIProps) {\n return (\n <DataContext value={generated}>\n <SchemaUIProperty\n name={name}\n $type={generated.$root}\n overrides={{\n required,\n }}\n variant={\n as === 'property' || generated.refs[generated.$root].type === 'primitive'\n ? 'default'\n : 'expand'\n }\n />\n </DataContext>\n );\n}\n\nfunction SchemaUIProperty({\n name,\n $type,\n variant = 'default',\n overrides,\n objectSearchOverrides,\n}: {\n name: ReactNode;\n $type: string;\n variant?: 'default' | 'expand';\n overrides?: Partial<PropertyProps>;\n objectSearchOverrides?: Partial<ObjectSearchProps>;\n}) {\n const { refs } = useData();\n const schema = refs[$type];\n const renderRef = useRenderRef();\n let type: ReactNode = schema.typeName;\n\n if ((schema.type === 'or' || schema.type === 'and') && schema.items.length > 0) {\n if (variant === 'expand')\n return (\n <Tabs defaultValue={schema.items[0].$type}>\n <TabsList>\n {schema.items.map((item) => (\n <TabsTrigger key={item.$type} value={item.$type}>\n {item.name}\n </TabsTrigger>\n ))}\n </TabsList>\n {schema.items.map((item) => (\n <TabsContent\n key={item.$type}\n value={item.$type}\n forceMount={undefined}\n className=\"pt-2 pb-0\"\n >\n <SchemaUIProperty {...item} variant=\"expand\" />\n </TabsContent>\n ))}\n </Tabs>\n );\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n } else if (schema.type === 'object' && schema.props.length > 0) {\n if (variant === 'expand')\n return <ObjectSearch properties={schema.props} {...objectSearchOverrides} />;\n\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n } else if (schema.type === 'array') {\n if (variant === 'expand')\n return (\n <Collapsible className=\"my-2\">\n <CollapsibleTrigger\n className={cn(\n buttonVariants({ color: 'secondary', size: 'sm' }),\n 'group px-3 py-2 data-[state=open]:rounded-b-none',\n )}\n >\n Array Item\n <ChevronDown className=\"size-4 text-fd-muted-foreground group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"-mt-px bg-fd-card px-3 rounded-lg rounded-tl-none border shadow-sm\">\n <SchemaUIProperty name=\"\" $type={schema.item.$type} variant=\"expand\" />\n </CollapsibleContent>\n </Collapsible>\n );\n\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n }\n\n const child = (\n <>\n {schema.description}\n {schema.infoTags && schema.infoTags.length > 0 && (\n <div className=\"flex flex-row gap-2 flex-wrap my-2 not-prose empty:hidden\">\n {schema.infoTags.map((tag) => (\n <InfoTag key={tag.label} tag={tag} />\n ))}\n </div>\n )}\n </>\n );\n if (variant === 'expand') return child;\n return (\n <Property name={name} type={type} deprecated={schema.deprecated} {...overrides}>\n {child}\n </Property>\n );\n}\n\ninterface ObjectSearchProps {\n properties: SchemaDataObjectProperty[];\n container?: ComponentProps<'div'>;\n open?: (item: SchemaDataObjectProperty) => void;\n}\n\nfunction ObjectSearch({ properties, container, open }: ObjectSearchProps) {\n const [search, setSearch] = useState('');\n const deferredValue = useDeferredValue(search);\n const firstItemRef = useRef<SchemaDataObjectProperty>(null);\n const prevProperties = useRef(properties);\n\n if (prevProperties.current !== properties) {\n prevProperties.current = properties;\n setSearch('');\n }\n\n return (\n <>\n <div\n {...container}\n className={cn(\n 'flex items-center border my-2 rounded-md bg-fd-secondary text-fd-secondary-foreground transition-colors shadow-sm focus-within:ring-2 focus-within:ring-fd-ring',\n container?.className,\n )}\n >\n <FilterIcon className=\"text-fd-muted-foreground ms-2 size-3.5\" />\n <input\n value={search}\n data-object-search-input=\"\"\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Filter Properties\"\n className=\"text-sm ps-2 py-2 flex-1 outline-none placeholder:text-fd-muted-foreground\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && open) {\n if (firstItemRef.current) open(firstItemRef.current);\n e.preventDefault();\n }\n }}\n />\n </div>\n <Suspense>\n <ObjectSearchContent\n search={deferredValue}\n properties={properties}\n firstItemRef={firstItemRef}\n />\n </Suspense>\n </>\n );\n}\n\nfunction ObjectSearchContent({\n search: rawSearch,\n firstItemRef,\n properties,\n}: {\n search: string;\n firstItemRef: RefObject<SchemaDataObjectProperty | null>;\n properties: SchemaDataObjectProperty[];\n}) {\n const filtered = useMemo(() => {\n const search = rawSearch.trim().toLowerCase();\n return search.length > 0\n ? properties.filter((prop) => prop.name.toLowerCase().includes(search))\n : properties;\n }, [properties, rawSearch]);\n\n firstItemRef.current = filtered.length > 0 ? filtered[0] : null;\n\n if (filtered.length === 0)\n return (\n <p className=\"text-fd-muted-foreground text-sm px-2\">\n No property matching{' '}\n <span className=\"text-fd-foreground font-medium\">{`\"${rawSearch}\"`}</span>\n </p>\n );\n\n return filtered.map((prop) => (\n <SchemaUIProperty\n key={prop.name}\n name={prop.name}\n $type={prop.$type}\n overrides={{ required: prop.required }}\n />\n ));\n}\n\nfunction InfoTag({ tag }: { tag: InfoTag }) {\n const ref = useRef<HTMLElement>(null);\n const [isTruncated, setTruncated] = useState(false);\n const [open, setOpen] = useState(false);\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n // assume the tag width will never change\n setTruncated(element.scrollWidth !== element.offsetWidth);\n }, []);\n\n return (\n <div className=\"flex flex-row items-start gap-2 bg-fd-secondary border rounded-lg text-xs p-1.5 shadow-md max-w-full\">\n <span className=\"font-medium\">{tag.label}</span>\n <code\n ref={ref}\n className={cn(\n 'min-w-0 flex-1 text-fd-muted-foreground',\n open ? 'wrap-break-word' : 'truncate',\n )}\n >\n {tag.value}\n </code>\n {isTruncated && (\n <button\n className={cn(buttonVariants({ size: 'icon-xs', variant: 'ghost' }))}\n onClick={() => setOpen((prev) => !prev)}\n >\n <ChevronDown />\n </button>\n )}\n </div>\n );\n}\n\ninterface PathItemType {\n name: ReactNode;\n $ref?: string;\n scrollTop?: number;\n}\n\nfunction SchemaUIPopover({\n containerRef,\n initialPath,\n}: {\n containerRef: RefObject<HTMLDivElement | null>;\n initialPath: PathItemType[];\n}) {\n const [path, setPath] = useState(initialPath);\n\n useLayoutEffect(() => {\n const last = path[0];\n const element = containerRef.current;\n if (!element || !last || !element.parentElement) return;\n\n // recover scroll\n element.parentElement.scrollTop = last.scrollTop ?? 0;\n return () => {\n if (element.parentElement) last.scrollTop = element.parentElement.scrollTop;\n };\n }, [containerRef, path]);\n\n const context: PopoverContextType = useMemo(\n () => ({\n renderTrigger: ({ $ref, pathName, children }) => (\n <button\n className={cn(typeVariants({ variant: 'trigger' }))}\n onClick={() => setPath((path) => [...path, { name: pathName, $ref }])}\n >\n {children}\n </button>\n ),\n }),\n [],\n );\n\n const currentRef = path.findLast((item) => item.$ref !== undefined);\n\n return (\n <>\n <div className=\"sticky top-0 -mx-2 flex flex-row flex-wrap items-center text-sm font-medium font-mono bg-fd-popover px-2 h-8 border-b\">\n {path.map((item, i) => {\n const isDuplicated = path.some((other, j) => j < i && other.$ref === item.$ref);\n const className = cn(\n isDuplicated && 'text-orange-400',\n item.$ref && 'hover:underline hover:text-fd-accent-foreground',\n );\n const node = item.$ref ? (\n <button onClick={() => setPath((path) => path.slice(0, i + 1))} className={className}>\n {item.name}\n </button>\n ) : (\n <span className={className}>{item.name}</span>\n );\n\n return (\n <Fragment key={i}>\n {i > 0 && '.'}\n {node}\n </Fragment>\n );\n })}\n </div>\n <PopoverContext value={context}>\n {currentRef?.$ref && (\n <SchemaUIProperty\n name=\"\"\n $type={currentRef.$ref}\n variant=\"expand\"\n objectSearchOverrides={{\n container: {\n className: 'sticky top-10',\n },\n open(item) {\n setPath((path) => [...path, { name: item.name, $ref: item.$type }]);\n },\n }}\n />\n )}\n </PopoverContext>\n </>\n );\n}\n\nfunction useRenderRef() {\n const { refs } = useData();\n const { renderTrigger } = usePopover();\n return function renderRef({\n pathName,\n $ref,\n text,\n }: {\n pathName: ReactNode;\n $ref: string;\n text?: ReactNode;\n }) {\n const schema = refs[$ref];\n\n if (schema.type === 'and' || schema.type === 'or') {\n const sep = schema.type === 'and' ? '&' : '|';\n return (\n <span className={cn(typeVariants(), 'flex flex-row gap-2 items-center flex-wrap')}>\n {schema.items.map((item, i) => (\n <Fragment key={item.$type}>\n {i > 0 && <span>{sep}</span>}\n {renderRef({ pathName, text: item.name, $ref: item.$type })}\n </Fragment>\n ))}\n </span>\n );\n }\n\n if (schema.type === 'array') {\n return (\n <span className={cn(typeVariants(), 'flex flex-row items-center flex-wrap')}>\n {'array<'}\n {renderRef({ pathName: <>{pathName}[]</>, $ref: schema.item.$type })}\n {'>'}\n </span>\n );\n }\n\n return renderTrigger({ $ref, pathName, children: text ?? schema.aliasName });\n };\n}\n\nfunction RootPopoverTrigger({\n $ref,\n pathName,\n children,\n}: {\n pathName: ReactNode;\n $ref: string;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const refCallback = useCallback((element: HTMLDivElement | null) => {\n ref.current = element;\n if (!element || element.style.getPropertyValue('--initial-height')) return;\n\n element.style.setProperty('--initial-height', `${element.clientHeight + 2}px`);\n }, []);\n\n return (\n <Popover>\n <PopoverTrigger className={cn(typeVariants({ variant: 'trigger' }))}>\n {children}\n </PopoverTrigger>\n <PopoverContent\n ref={refCallback}\n onOpenAutoFocus={(e) => {\n if (!ref.current) return;\n const input = ref.current.querySelector('input[data-object-search-input]');\n if (!(input instanceof HTMLInputElement)) return;\n input.focus({ preventScroll: true });\n e.preventDefault();\n }}\n className=\"w-[600px] min-h-(--initial-height,0) max-h-[460px] px-2 py-0\"\n >\n <SchemaUIPopover\n containerRef={ref}\n initialPath={[\n {\n name: pathName,\n $ref: $ref,\n },\n ]}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface PropertyProps {\n name: ReactNode;\n type: ReactNode;\n required?: boolean;\n deprecated?: boolean;\n nested?: boolean;\n\n children?: ReactNode;\n className?: string;\n}\n\nfunction Property({\n name,\n type,\n required,\n deprecated,\n nested = false,\n className,\n ...props\n}: PropertyProps) {\n return (\n <div\n className={cn(\n 'text-sm border-t',\n nested\n ? 'p-3 border-x bg-fd-card last:rounded-b-xl first:rounded-tr-xl last:border-b'\n : 'py-4 first:border-t-0',\n className,\n )}\n >\n <div className=\"flex flex-wrap items-center gap-3 not-prose\">\n <span className=\"font-medium font-mono text-fd-primary\">\n {name}\n {required ? (\n <span className=\"text-red-400\">*</span>\n ) : (\n <span className=\"text-fd-muted-foreground\">?</span>\n )}\n </span>\n {typeof type === 'string' ? (\n <span className=\"text-sm font-mono text-fd-muted-foreground\">{type}</span>\n ) : (\n type\n )}\n {deprecated && (\n <Badge color=\"yellow\" className=\"ms-auto text-xs\">\n Deprecated\n </Badge>\n )}\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">{props.children}</div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../../src/ui/schema/client.tsx"],"sourcesContent":["'use client';\nimport {\n type ComponentProps,\n createContext,\n Fragment,\n type ReactNode,\n type RefObject,\n Suspense,\n use,\n useCallback,\n useDeferredValue,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from 'fumadocs-ui/components/tabs';\nimport type { InfoTag, SchemaDataObjectProperty, SchemaUIGeneratedData } from '@/ui/schema';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from 'fumadocs-ui/components/ui/collapsible';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { ChevronDown, FilterIcon } from 'lucide-react';\nimport { Badge } from '@/ui/components/method-label';\nimport { Popover, PopoverContent, PopoverTrigger } from 'fumadocs-ui/components/ui/popover';\nimport { cn } from '@/utils/cn';\nimport { cva } from 'class-variance-authority';\n\ntype DataContextType = SchemaUIGeneratedData;\n\ninterface PopoverContextType {\n renderTrigger: (props: { pathName: ReactNode; $ref: string; children: ReactNode }) => ReactNode;\n}\n\nconst typeVariants = cva('text-sm text-start text-fd-muted-foreground font-mono', {\n variants: {\n variant: {\n trigger:\n 'underline hover:text-fd-accent-foreground data-[state=open]:text-fd-accent-foreground',\n },\n },\n});\n\nconst PopoverContext = createContext<PopoverContextType>({\n renderTrigger: (props) => <RootPopoverTrigger {...props} />,\n});\n\nconst DataContext = createContext<DataContextType | null>(null);\n\nfunction useData() {\n return use(DataContext)!;\n}\n\nfunction usePopover() {\n return use(PopoverContext);\n}\n\nexport interface SchemaUIProps {\n name: string;\n required?: boolean;\n as?: 'property' | 'body';\n\n generated: SchemaUIGeneratedData;\n}\n\nexport function SchemaUI({ name, required = false, as = 'property', generated }: SchemaUIProps) {\n return (\n <DataContext value={generated}>\n <SchemaUIProperty\n name={name}\n $type={generated.$root}\n overrides={{\n required,\n }}\n variant={\n as === 'property' || generated.refs[generated.$root].type === 'primitive'\n ? 'default'\n : 'expand'\n }\n />\n </DataContext>\n );\n}\n\nfunction SchemaUIProperty({\n name,\n $type,\n variant = 'default',\n overrides,\n objectSearchOverrides,\n}: {\n name: ReactNode;\n $type: string;\n variant?: 'default' | 'expand';\n overrides?: Partial<PropertyProps>;\n objectSearchOverrides?: Partial<ObjectSearchProps>;\n}) {\n const { refs } = useData();\n const schema = refs[$type];\n const renderRef = useRenderRef();\n let type: ReactNode = schema.typeName;\n\n if ((schema.type === 'or' || schema.type === 'and') && schema.items.length > 0) {\n if (variant === 'expand')\n return (\n <Tabs defaultValue={schema.items[0].$type}>\n <TabsList>\n {schema.items.map((item) => (\n <TabsTrigger key={item.$type} value={item.$type}>\n {item.name}\n </TabsTrigger>\n ))}\n </TabsList>\n {schema.items.map((item) => (\n <TabsContent\n key={item.$type}\n value={item.$type}\n forceMount={undefined}\n className=\"pt-2 pb-0\"\n >\n <SchemaUIProperty {...item} variant=\"expand\" />\n </TabsContent>\n ))}\n </Tabs>\n );\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n } else if (schema.type === 'object' && schema.props.length > 0) {\n if (variant === 'expand')\n return <ObjectSearch properties={schema.props} {...objectSearchOverrides} />;\n\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n } else if (schema.type === 'array') {\n if (variant === 'expand')\n return (\n <Collapsible className=\"my-2\">\n <CollapsibleTrigger\n className={cn(\n buttonVariants({ color: 'secondary', size: 'sm' }),\n 'group px-3 py-2 data-[state=open]:rounded-b-none',\n )}\n >\n Array Item\n <ChevronDown className=\"size-4 text-fd-muted-foreground group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"-mt-px bg-fd-card px-3 rounded-lg rounded-tl-none border shadow-sm\">\n <SchemaUIProperty name=\"\" $type={schema.item.$type} variant=\"expand\" />\n </CollapsibleContent>\n </Collapsible>\n );\n\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n }\n\n const child = (\n <>\n {schema.description}\n {schema.infoTags && schema.infoTags.length > 0 && (\n <div className=\"flex flex-row gap-2 flex-wrap my-2 not-prose empty:hidden\">\n {schema.infoTags.map((tag) => (\n <InfoTag key={tag.label} tag={tag} />\n ))}\n </div>\n )}\n </>\n );\n if (variant === 'expand') return child;\n return (\n <Property name={name} type={type} deprecated={schema.deprecated} {...overrides}>\n {child}\n </Property>\n );\n}\n\ninterface ObjectSearchProps {\n properties: SchemaDataObjectProperty[];\n container?: ComponentProps<'div'>;\n open?: (item: SchemaDataObjectProperty) => void;\n}\n\nfunction ObjectSearch({ properties, container, open }: ObjectSearchProps) {\n const [search, setSearch] = useState('');\n const deferredValue = useDeferredValue(search);\n const firstItemRef = useRef<SchemaDataObjectProperty>(null);\n const prevProperties = useRef(properties);\n\n if (prevProperties.current !== properties) {\n prevProperties.current = properties;\n setSearch('');\n }\n\n return (\n <>\n <div\n {...container}\n className={cn(\n 'flex items-center border my-2 rounded-md bg-fd-secondary text-fd-secondary-foreground transition-colors shadow-sm focus-within:ring-2 focus-within:ring-fd-ring',\n container?.className,\n )}\n >\n <FilterIcon className=\"text-fd-muted-foreground ms-2 size-3.5\" />\n <input\n value={search}\n data-object-search-input=\"\"\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Filter Properties\"\n className=\"text-sm ps-2 py-2 flex-1 outline-none placeholder:text-fd-muted-foreground\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && open) {\n if (firstItemRef.current) open(firstItemRef.current);\n e.preventDefault();\n }\n }}\n />\n </div>\n <Suspense>\n <ObjectSearchContent\n search={deferredValue}\n properties={properties}\n firstItemRef={firstItemRef}\n />\n </Suspense>\n </>\n );\n}\n\nfunction ObjectSearchContent({\n search: rawSearch,\n firstItemRef,\n properties,\n}: {\n search: string;\n firstItemRef: RefObject<SchemaDataObjectProperty | null>;\n properties: SchemaDataObjectProperty[];\n}) {\n const filtered = useMemo(() => {\n const search = rawSearch.trim().toLowerCase();\n return search.length > 0\n ? properties.filter((prop) => prop.name.toLowerCase().includes(search))\n : properties;\n }, [properties, rawSearch]);\n\n firstItemRef.current = filtered.length > 0 ? filtered[0] : null;\n\n if (filtered.length === 0)\n return (\n <p className=\"text-fd-muted-foreground text-sm px-2\">\n No property matching{' '}\n <span className=\"text-fd-foreground font-medium\">{`\"${rawSearch}\"`}</span>\n </p>\n );\n\n return filtered.map((prop) => (\n <SchemaUIProperty\n key={prop.name}\n name={prop.name}\n $type={prop.$type}\n overrides={{ required: prop.required }}\n />\n ));\n}\n\nfunction InfoTag({ tag }: { tag: InfoTag }) {\n const ref = useRef<HTMLElement>(null);\n const [isTruncated, setTruncated] = useState(false);\n const [open, setOpen] = useState(false);\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n // assume the tag width will never change\n setTruncated(element.scrollWidth !== element.offsetWidth);\n }, []);\n\n return (\n <div className=\"flex flex-row items-start gap-2 bg-fd-secondary border rounded-lg text-xs p-1.5 shadow-md max-w-full\">\n <span className=\"font-medium\">{tag.label}</span>\n <code\n ref={ref}\n className={cn(\n 'min-w-0 flex-1 text-fd-muted-foreground',\n open ? 'wrap-break-word' : 'truncate',\n )}\n >\n {tag.value}\n </code>\n {isTruncated && (\n <button\n className={cn(buttonVariants({ size: 'icon-xs', variant: 'ghost' }))}\n onClick={() => setOpen((prev) => !prev)}\n >\n <ChevronDown />\n </button>\n )}\n </div>\n );\n}\n\ninterface PathItemType {\n name: ReactNode;\n $ref?: string;\n scrollTop?: number;\n}\n\nfunction SchemaUIPopover({\n containerRef,\n initialPath,\n}: {\n containerRef: RefObject<HTMLDivElement | null>;\n initialPath: PathItemType[];\n}) {\n const [path, setPath] = useState(initialPath);\n\n useLayoutEffect(() => {\n const last = path[0];\n const element = containerRef.current;\n if (!element || !last || !element.parentElement) return;\n\n // recover scroll\n element.parentElement.scrollTop = last.scrollTop ?? 0;\n return () => {\n if (element.parentElement) last.scrollTop = element.parentElement.scrollTop;\n };\n }, [containerRef, path]);\n\n const context: PopoverContextType = useMemo(\n () => ({\n renderTrigger: ({ $ref, pathName, children }) => (\n <button\n className={cn(typeVariants({ variant: 'trigger' }))}\n onClick={() => setPath((path) => [...path, { name: pathName, $ref }])}\n >\n {children}\n </button>\n ),\n }),\n [],\n );\n\n const currentRef = path.findLast((item) => item.$ref !== undefined);\n\n return (\n <>\n <div className=\"sticky top-0 -mx-2 flex flex-row flex-wrap items-center text-sm font-medium font-mono bg-fd-popover px-2 h-8 border-b\">\n {path.map((item, i) => {\n const isDuplicated = path.some((other, j) => j < i && other.$ref === item.$ref);\n const className = cn(\n isDuplicated && 'text-orange-400',\n item.$ref && 'hover:underline hover:text-fd-accent-foreground',\n );\n const node = item.$ref ? (\n <button onClick={() => setPath((path) => path.slice(0, i + 1))} className={className}>\n {item.name}\n </button>\n ) : (\n <span className={className}>{item.name}</span>\n );\n\n return (\n <Fragment key={i}>\n {i > 0 && '.'}\n {node}\n </Fragment>\n );\n })}\n </div>\n <PopoverContext value={context}>\n {currentRef?.$ref && (\n <SchemaUIProperty\n name=\"\"\n $type={currentRef.$ref}\n variant=\"expand\"\n objectSearchOverrides={{\n container: {\n className: 'sticky top-10',\n },\n open(item) {\n setPath((path) => [...path, { name: item.name, $ref: item.$type }]);\n },\n }}\n />\n )}\n </PopoverContext>\n </>\n );\n}\n\nfunction useRenderRef() {\n const { refs } = useData();\n const { renderTrigger } = usePopover();\n return function renderRef({\n pathName,\n $ref,\n text,\n }: {\n pathName: ReactNode;\n $ref: string;\n text?: ReactNode;\n }) {\n const schema = refs[$ref];\n\n if (schema.type === 'and' || schema.type === 'or') {\n const sep = schema.type === 'and' ? '&' : '|';\n return (\n <span className={cn(typeVariants(), 'flex flex-row gap-2 items-center flex-wrap')}>\n {schema.items.map((item, i) => (\n <Fragment key={item.$type}>\n {i > 0 && <span>{sep}</span>}\n {renderRef({ pathName, text: item.name, $ref: item.$type })}\n </Fragment>\n ))}\n </span>\n );\n }\n\n if (schema.type === 'array') {\n return (\n <span className={cn(typeVariants(), 'flex flex-row items-center flex-wrap')}>\n {'array<'}\n {renderRef({ pathName: <>{pathName}[]</>, $ref: schema.item.$type })}\n {'>'}\n </span>\n );\n }\n\n return renderTrigger({ $ref, pathName, children: text ?? schema.aliasName });\n };\n}\n\nfunction RootPopoverTrigger({\n $ref,\n pathName,\n children,\n}: {\n pathName: ReactNode;\n $ref: string;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const refCallback = useCallback((element: HTMLDivElement | null) => {\n ref.current = element;\n if (!element || element.style.getPropertyValue('--initial-height')) return;\n\n element.style.setProperty('--initial-height', `${element.clientHeight + 2}px`);\n }, []);\n\n return (\n <Popover>\n <PopoverTrigger className={cn(typeVariants({ variant: 'trigger' }))}>\n {children}\n </PopoverTrigger>\n <PopoverContent\n ref={refCallback}\n onOpenAutoFocus={(e) => {\n if (!ref.current) return;\n const input = ref.current.querySelector('input[data-object-search-input]');\n if (!(input instanceof HTMLInputElement)) return;\n input.focus({ preventScroll: true });\n e.preventDefault();\n }}\n className=\"w-[600px] min-h-(--initial-height,0) max-h-[460px] px-2 py-0\"\n >\n <SchemaUIPopover\n containerRef={ref}\n initialPath={[\n {\n name: pathName,\n $ref: $ref,\n },\n ]}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface PropertyProps {\n name: ReactNode;\n type: ReactNode;\n required?: boolean;\n deprecated?: boolean;\n nested?: boolean;\n\n children?: ReactNode;\n className?: string;\n}\n\nfunction Property({\n name,\n type,\n required,\n deprecated,\n nested = false,\n className,\n ...props\n}: PropertyProps) {\n return (\n <div\n className={cn(\n 'text-sm border-t',\n nested\n ? 'p-3 border-x bg-fd-card last:rounded-b-xl first:rounded-tr-xl last:border-b'\n : 'py-4 first:border-t-0',\n className,\n )}\n >\n <div className=\"flex flex-wrap items-center gap-3 not-prose\">\n <span className=\"font-medium font-mono text-fd-primary\">\n {name}\n {required ? (\n <span className=\"text-red-400\">*</span>\n ) : (\n <span className=\"text-fd-muted-foreground\">?</span>\n )}\n </span>\n {typeof type === 'string' ? (\n <span className=\"text-sm font-mono text-fd-muted-foreground\">{type}</span>\n ) : (\n type\n )}\n {deprecated && (\n <Badge color=\"yellow\" className=\"ms-auto text-xs\">\n Deprecated\n </Badge>\n )}\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">{props.children}</div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -2,7 +2,6 @@ import { mergeAllOf } from "../../utils/merge-schema.js";
2
2
  import { FormatFlags, schemaToString } from "../../utils/schema-to-string.js";
3
3
  import { SchemaUILazy } from "./lazy.js";
4
4
  import { jsx } from "react/jsx-runtime";
5
-
6
5
  //#region src/ui/schema/index.tsx
7
6
  function Schema({ ctx, ...options }) {
8
7
  if (ctx.schemaUI?.render) return ctx.schemaUI.render(options, ctx);
@@ -241,7 +240,7 @@ function formatRange(value, min, exclusiveMin, max, exclusiveMax) {
241
240
  else if (exclusiveMax !== void 0) out.push(`< ${exclusiveMax}`);
242
241
  if (out.length > 1) return out.join(" ");
243
242
  }
244
-
245
243
  //#endregion
246
244
  export { Schema };
245
+
247
246
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/schema/index.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { ResolvedSchema } from '@/utils/schema';\nimport type { RenderContext } from '@/types';\nimport { FormatFlags, schemaToString } from '@/utils/schema-to-string';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport type { SchemaUIProps } from '@/ui/schema/client';\nimport { SchemaUILazy } from '@/ui/schema/lazy';\n\nexport interface FieldBase {\n description?: ReactNode;\n infoTags?: InfoTag[];\n\n typeName: string;\n aliasName: string;\n\n deprecated?: boolean;\n}\n\nexport interface InfoTag {\n label: string;\n value: string;\n}\n\nexport interface SchemaDataObjectProperty {\n name: string;\n $type: string;\n required: boolean;\n}\n\nexport type SchemaData = FieldBase &\n (\n | {\n type: 'primitive';\n }\n | {\n type: 'object';\n props: SchemaDataObjectProperty[];\n }\n | {\n type: 'array';\n item: {\n $type: string;\n };\n }\n | {\n type: 'or';\n items: {\n name: string;\n $type: string;\n }[];\n }\n | {\n type: 'and';\n items: {\n name: string;\n $type: string;\n }[];\n }\n );\n\nexport interface SchemaUIOptions {\n root: ResolvedSchema;\n client: Omit<SchemaUIProps, 'generated'>;\n\n /**\n * include read only props\n */\n readOnly?: boolean;\n /**\n * include write only props\n */\n writeOnly?: boolean;\n}\n\nexport interface SchemaUIGeneratedData {\n $root: string;\n refs: Record<string, SchemaData>;\n}\n\nexport function Schema({\n ctx,\n ...options\n}: SchemaUIOptions & {\n ctx: RenderContext;\n}) {\n if (ctx.schemaUI?.render) {\n return ctx.schemaUI.render(options, ctx);\n }\n\n return <SchemaUILazy {...options.client} generated={generateSchemaUI(options, ctx)} />;\n}\n\nexport function generateSchemaUI(\n { root, readOnly, writeOnly }: SchemaUIOptions,\n ctx: RenderContext,\n): SchemaUIGeneratedData {\n const refs: Record<string, SchemaData> = {};\n const { showExample = false } = ctx.schemaUI ?? {};\n\n function generateInfoTags(schema: Exclude<ResolvedSchema, boolean>) {\n const fields: InfoTag[] = [];\n\n if (schema.default !== undefined) {\n fields.push({ label: 'Default', value: JSON.stringify(schema.default) });\n }\n\n if (schema.pattern) {\n fields.push({ label: 'Match', value: schema.pattern });\n }\n\n if (schema.format) {\n fields.push({ label: 'Format', value: schema.format });\n }\n\n if (schema.multipleOf) {\n fields.push({ label: 'Multiple Of', value: schema.multipleOf.toString() });\n }\n\n let range = formatRange(\n 'value',\n schema.minimum,\n schema.exclusiveMinimum,\n schema.maximum,\n schema.exclusiveMaximum,\n );\n if (range) fields.push({ label: 'Range', value: range });\n\n range = formatRange('length', schema.minLength, undefined, schema.maxLength, undefined);\n if (range) fields.push({ label: 'Length', value: range });\n\n range = formatRange(\n 'properties',\n schema.minProperties,\n undefined,\n schema.maxProperties,\n undefined,\n );\n if (range) fields.push({ label: 'Properties', value: range });\n\n range = formatRange('items', schema.minItems, undefined, schema.maxItems, undefined);\n if (range) fields.push({ label: 'Items', value: range });\n\n if (schema.enum) {\n fields.push({\n label: 'Value in',\n value: schema.enum.map((value) => JSON.stringify(value)).join(' | '),\n });\n }\n\n if (showExample && schema.examples) {\n for (const example of schema.examples) {\n fields.push({ label: 'Example', value: JSON.stringify(example, null, 2) });\n }\n }\n\n return fields;\n }\n\n let _counter = 0;\n const autoIds = new WeakMap<Exclude<ResolvedSchema, boolean>, string>();\n function getSchemaId(schema: ResolvedSchema): string {\n if (typeof schema === 'boolean') return String(schema);\n const raw = ctx.schema.getRawRef(schema);\n if (raw) return raw;\n\n const prev = autoIds.get(schema);\n if (prev) return prev;\n\n const generated = `__${_counter++}`;\n autoIds.set(schema, generated);\n return generated;\n }\n\n function isVisible(schema: ResolvedSchema): boolean {\n if (typeof schema === 'boolean') return true;\n if (schema.writeOnly) return writeOnly ?? false;\n if (schema.readOnly) return readOnly ?? false;\n return true;\n }\n\n function base(schema: ResolvedSchema): FieldBase {\n if (typeof schema === 'boolean') {\n const name = schema ? 'any' : 'never';\n return {\n typeName: name,\n aliasName: name,\n };\n }\n\n return {\n description: schema.description && ctx.renderMarkdown(schema.description),\n infoTags: generateInfoTags(schema),\n typeName: schemaToString(schema, ctx.schema),\n aliasName: schemaToString(schema, ctx.schema, FormatFlags.UseAlias),\n deprecated: schema.deprecated,\n };\n }\n\n function scanRefs(id: string, schema: ResolvedSchema) {\n if (id in refs) return;\n if (typeof schema === 'boolean') {\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n return;\n }\n\n if (Array.isArray(schema.type)) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const type of schema.type) {\n const key = `${id}_type:${type}`;\n scanRefs(key, {\n ...schema,\n type,\n });\n out.items.push({\n name: type,\n $type: key,\n });\n }\n return;\n }\n\n if (schema.oneOf && schema.anyOf) {\n const out: SchemaData = {\n type: 'and',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n for (const omit of ['anyOf', 'oneOf'] as const) {\n const $type = `${id}_omit:${omit}`;\n scanRefs($type, { ...schema, [omit]: undefined });\n\n out.items.push({\n name: refs[$type].aliasName,\n $type,\n });\n }\n return;\n }\n\n // display both `oneOf` & `anyOf` as OR for simplified overview\n const union = schema.oneOf ?? schema.anyOf;\n if (union) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const item of union) {\n if (!item || typeof item !== 'object' || !isVisible(item)) continue;\n const itemId = getSchemaId(item);\n const key = `${id}_extends:${itemId}`;\n\n scanRefs(key, {\n ...schema,\n oneOf: undefined,\n anyOf: undefined,\n ...item,\n properties: {\n ...schema.properties,\n ...item.properties,\n },\n });\n out.items.push({\n $type: key,\n name: refs[itemId]?.aliasName ?? schemaToString(item, ctx.schema, FormatFlags.UseAlias),\n });\n }\n return;\n }\n\n if (schema.allOf) {\n scanRefs(id, mergeAllOf(schema));\n return;\n }\n\n if (schema.type === 'object') {\n const out: SchemaData = {\n type: 'object',\n props: [],\n ...base(schema),\n };\n refs[id] = out;\n\n const { properties = {}, patternProperties, additionalProperties } = schema;\n const props = Object.entries(properties);\n if (patternProperties) props.push(...Object.entries(patternProperties));\n\n for (const [key, prop] of props) {\n if (!prop || !isVisible(prop)) continue;\n const $type = getSchemaId(prop);\n scanRefs($type, prop);\n out.props.push({\n $type,\n name: key,\n required: schema.required?.includes(key) ?? false,\n });\n }\n\n if (additionalProperties && isVisible(additionalProperties)) {\n const $type = getSchemaId(additionalProperties);\n scanRefs($type, additionalProperties);\n\n out.props.push({\n $type,\n name: '[key: string]',\n required: false,\n });\n }\n return;\n }\n\n if (schema.type === 'array') {\n const items = schema.items ?? true;\n const $type = getSchemaId(items);\n\n refs[id] = {\n type: 'array',\n item: {\n $type,\n },\n ...base(schema),\n };\n scanRefs($type, items);\n return;\n }\n\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n }\n\n const $root = getSchemaId(root);\n scanRefs($root, root);\n return {\n refs,\n $root,\n };\n}\n\nfunction formatRange(\n value: string,\n min: number | undefined,\n exclusiveMin: number | undefined,\n max: number | undefined,\n exclusiveMax: number | undefined,\n) {\n const out: string[] = [];\n if (min !== undefined) {\n out.push(`${min} <=`);\n } else if (exclusiveMin !== undefined) {\n out.push(`${exclusiveMin} <`);\n }\n\n out.push(value);\n if (max !== undefined) {\n out.push(`<= ${max}`);\n } else if (exclusiveMax !== undefined) {\n out.push(`< ${exclusiveMax}`);\n }\n if (out.length > 1) return out.join(' ');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/schema/index.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { ResolvedSchema } from '@/utils/schema';\nimport type { RenderContext } from '@/types';\nimport { FormatFlags, schemaToString } from '@/utils/schema-to-string';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport type { SchemaUIProps } from '@/ui/schema/client';\nimport { SchemaUILazy } from '@/ui/schema/lazy';\n\nexport interface FieldBase {\n description?: ReactNode;\n infoTags?: InfoTag[];\n\n typeName: string;\n aliasName: string;\n\n deprecated?: boolean;\n}\n\nexport interface InfoTag {\n label: string;\n value: string;\n}\n\nexport interface SchemaDataObjectProperty {\n name: string;\n $type: string;\n required: boolean;\n}\n\nexport type SchemaData = FieldBase &\n (\n | {\n type: 'primitive';\n }\n | {\n type: 'object';\n props: SchemaDataObjectProperty[];\n }\n | {\n type: 'array';\n item: {\n $type: string;\n };\n }\n | {\n type: 'or';\n items: {\n name: string;\n $type: string;\n }[];\n }\n | {\n type: 'and';\n items: {\n name: string;\n $type: string;\n }[];\n }\n );\n\nexport interface SchemaUIOptions {\n root: ResolvedSchema;\n client: Omit<SchemaUIProps, 'generated'>;\n\n /**\n * include read only props\n */\n readOnly?: boolean;\n /**\n * include write only props\n */\n writeOnly?: boolean;\n}\n\nexport interface SchemaUIGeneratedData {\n $root: string;\n refs: Record<string, SchemaData>;\n}\n\nexport function Schema({\n ctx,\n ...options\n}: SchemaUIOptions & {\n ctx: RenderContext;\n}) {\n if (ctx.schemaUI?.render) {\n return ctx.schemaUI.render(options, ctx);\n }\n\n return <SchemaUILazy {...options.client} generated={generateSchemaUI(options, ctx)} />;\n}\n\nexport function generateSchemaUI(\n { root, readOnly, writeOnly }: SchemaUIOptions,\n ctx: RenderContext,\n): SchemaUIGeneratedData {\n const refs: Record<string, SchemaData> = {};\n const { showExample = false } = ctx.schemaUI ?? {};\n\n function generateInfoTags(schema: Exclude<ResolvedSchema, boolean>) {\n const fields: InfoTag[] = [];\n\n if (schema.default !== undefined) {\n fields.push({ label: 'Default', value: JSON.stringify(schema.default) });\n }\n\n if (schema.pattern) {\n fields.push({ label: 'Match', value: schema.pattern });\n }\n\n if (schema.format) {\n fields.push({ label: 'Format', value: schema.format });\n }\n\n if (schema.multipleOf) {\n fields.push({ label: 'Multiple Of', value: schema.multipleOf.toString() });\n }\n\n let range = formatRange(\n 'value',\n schema.minimum,\n schema.exclusiveMinimum,\n schema.maximum,\n schema.exclusiveMaximum,\n );\n if (range) fields.push({ label: 'Range', value: range });\n\n range = formatRange('length', schema.minLength, undefined, schema.maxLength, undefined);\n if (range) fields.push({ label: 'Length', value: range });\n\n range = formatRange(\n 'properties',\n schema.minProperties,\n undefined,\n schema.maxProperties,\n undefined,\n );\n if (range) fields.push({ label: 'Properties', value: range });\n\n range = formatRange('items', schema.minItems, undefined, schema.maxItems, undefined);\n if (range) fields.push({ label: 'Items', value: range });\n\n if (schema.enum) {\n fields.push({\n label: 'Value in',\n value: schema.enum.map((value) => JSON.stringify(value)).join(' | '),\n });\n }\n\n if (showExample && schema.examples) {\n for (const example of schema.examples) {\n fields.push({ label: 'Example', value: JSON.stringify(example, null, 2) });\n }\n }\n\n return fields;\n }\n\n let _counter = 0;\n const autoIds = new WeakMap<Exclude<ResolvedSchema, boolean>, string>();\n function getSchemaId(schema: ResolvedSchema): string {\n if (typeof schema === 'boolean') return String(schema);\n const raw = ctx.schema.getRawRef(schema);\n if (raw) return raw;\n\n const prev = autoIds.get(schema);\n if (prev) return prev;\n\n const generated = `__${_counter++}`;\n autoIds.set(schema, generated);\n return generated;\n }\n\n function isVisible(schema: ResolvedSchema): boolean {\n if (typeof schema === 'boolean') return true;\n if (schema.writeOnly) return writeOnly ?? false;\n if (schema.readOnly) return readOnly ?? false;\n return true;\n }\n\n function base(schema: ResolvedSchema): FieldBase {\n if (typeof schema === 'boolean') {\n const name = schema ? 'any' : 'never';\n return {\n typeName: name,\n aliasName: name,\n };\n }\n\n return {\n description: schema.description && ctx.renderMarkdown(schema.description),\n infoTags: generateInfoTags(schema),\n typeName: schemaToString(schema, ctx.schema),\n aliasName: schemaToString(schema, ctx.schema, FormatFlags.UseAlias),\n deprecated: schema.deprecated,\n };\n }\n\n function scanRefs(id: string, schema: ResolvedSchema) {\n if (id in refs) return;\n if (typeof schema === 'boolean') {\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n return;\n }\n\n if (Array.isArray(schema.type)) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const type of schema.type) {\n const key = `${id}_type:${type}`;\n scanRefs(key, {\n ...schema,\n type,\n });\n out.items.push({\n name: type,\n $type: key,\n });\n }\n return;\n }\n\n if (schema.oneOf && schema.anyOf) {\n const out: SchemaData = {\n type: 'and',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n for (const omit of ['anyOf', 'oneOf'] as const) {\n const $type = `${id}_omit:${omit}`;\n scanRefs($type, { ...schema, [omit]: undefined });\n\n out.items.push({\n name: refs[$type].aliasName,\n $type,\n });\n }\n return;\n }\n\n // display both `oneOf` & `anyOf` as OR for simplified overview\n const union = schema.oneOf ?? schema.anyOf;\n if (union) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const item of union) {\n if (!item || typeof item !== 'object' || !isVisible(item)) continue;\n const itemId = getSchemaId(item);\n const key = `${id}_extends:${itemId}`;\n\n scanRefs(key, {\n ...schema,\n oneOf: undefined,\n anyOf: undefined,\n ...item,\n properties: {\n ...schema.properties,\n ...item.properties,\n },\n });\n out.items.push({\n $type: key,\n name: refs[itemId]?.aliasName ?? schemaToString(item, ctx.schema, FormatFlags.UseAlias),\n });\n }\n return;\n }\n\n if (schema.allOf) {\n scanRefs(id, mergeAllOf(schema));\n return;\n }\n\n if (schema.type === 'object') {\n const out: SchemaData = {\n type: 'object',\n props: [],\n ...base(schema),\n };\n refs[id] = out;\n\n const { properties = {}, patternProperties, additionalProperties } = schema;\n const props = Object.entries(properties);\n if (patternProperties) props.push(...Object.entries(patternProperties));\n\n for (const [key, prop] of props) {\n if (!prop || !isVisible(prop)) continue;\n const $type = getSchemaId(prop);\n scanRefs($type, prop);\n out.props.push({\n $type,\n name: key,\n required: schema.required?.includes(key) ?? false,\n });\n }\n\n if (additionalProperties && isVisible(additionalProperties)) {\n const $type = getSchemaId(additionalProperties);\n scanRefs($type, additionalProperties);\n\n out.props.push({\n $type,\n name: '[key: string]',\n required: false,\n });\n }\n return;\n }\n\n if (schema.type === 'array') {\n const items = schema.items ?? true;\n const $type = getSchemaId(items);\n\n refs[id] = {\n type: 'array',\n item: {\n $type,\n },\n ...base(schema),\n };\n scanRefs($type, items);\n return;\n }\n\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n }\n\n const $root = getSchemaId(root);\n scanRefs($root, root);\n return {\n refs,\n $root,\n };\n}\n\nfunction formatRange(\n value: string,\n min: number | undefined,\n exclusiveMin: number | undefined,\n max: number | undefined,\n exclusiveMax: number | undefined,\n) {\n const out: string[] = [];\n if (min !== undefined) {\n out.push(`${min} <=`);\n } else if (exclusiveMin !== undefined) {\n out.push(`${exclusiveMin} <`);\n }\n\n out.push(value);\n if (max !== undefined) {\n out.push(`<= ${max}`);\n } else if (exclusiveMax !== undefined) {\n out.push(`< ${exclusiveMax}`);\n }\n if (out.length > 1) return out.join(' ');\n}\n"],"mappings":"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"}
@@ -1,10 +1,8 @@
1
- 'use client';
2
-
1
+ "use client";
3
2
  import { wrapLazy } from "../../utils/lazy.js";
4
-
5
3
  //#region src/ui/schema/lazy.ts
6
4
  const SchemaUILazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.SchemaUI })));
7
-
8
5
  //#endregion
9
6
  export { SchemaUILazy };
7
+
10
8
  //# sourceMappingURL=lazy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.js","names":[],"sources":["../../../src/ui/schema/lazy.ts"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../utils/lazy';\n\nexport const SchemaUILazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.SchemaUI })),\n);\n"],"mappings":";;;;;AAGA,MAAa,eAAe,eAC1B,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAC9D"}
1
+ {"version":3,"file":"lazy.js","names":[],"sources":["../../../src/ui/schema/lazy.ts"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../utils/lazy';\n\nexport const SchemaUILazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.SchemaUI })),\n);\n"],"mappings":";;;AAGA,MAAa,eAAe,eAC1B,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAC9D"}
package/dist/utils/cn.js CHANGED
@@ -1,3 +1,2 @@
1
1
  import { twMerge as cn } from "tailwind-merge";
2
-
3
- export { cn };
2
+ export { cn };
@@ -13,7 +13,7 @@ function deepEqual(a, b) {
13
13
  if (keysA.length !== keysB.length) return false;
14
14
  return keysA.every((key) => Object.prototype.hasOwnProperty.call(b, key) && deepEqual(a[key], b[key]));
15
15
  }
16
-
17
16
  //#endregion
18
17
  export { deepEqual };
18
+
19
19
  //# sourceMappingURL=deep-equal.js.map
@@ -8,7 +8,7 @@ function idToTitle(id) {
8
8
  else result.push(c);
9
9
  return result.join("");
10
10
  }
11
-
12
11
  //#endregion
13
12
  export { idToTitle };
13
+
14
14
  //# sourceMappingURL=id-to-title.js.map
@@ -1,6 +1,5 @@
1
1
  import { lazy } from "react";
2
2
  import { jsx } from "react/jsx-runtime";
3
-
4
3
  //#region src/utils/lazy.tsx
5
4
  function wrapLazy(load) {
6
5
  const V = lazy(load);
@@ -8,7 +7,7 @@ function wrapLazy(load) {
8
7
  return /* @__PURE__ */ jsx(V, { ...props });
9
8
  };
10
9
  }
11
-
12
10
  //#endregion
13
11
  export { wrapLazy };
12
+
14
13
  //# sourceMappingURL=lazy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.js","names":[],"sources":["../../src/utils/lazy.tsx"],"sourcesContent":["import { type ComponentType, lazy } from 'react';\n\n// Waku wraps all export functions of a \"use client\" file in `React.lazy`, but `lazy(lazy(() => ...))` causes error.\n// we wrap another layer of component such that it is valid\n// TODO: perhaps we can remove it once Waku migrated to vite-rsc\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- type infer\nexport function wrapLazy<T extends ComponentType<any>>(load: () => Promise<{ default: T }>): T {\n const V = lazy(load);\n\n return function wrapper(props) {\n return <V {...props} />;\n } as T;\n}\n"],"mappings":";;;;AAMA,SAAgB,SAAuC,MAAwC;CAC7F,MAAM,IAAI,KAAK,KAAK;AAEpB,QAAO,SAAS,QAAQ,OAAO;AAC7B,SAAO,oBAAC,KAAE,GAAI,QAAS"}
1
+ {"version":3,"file":"lazy.js","names":[],"sources":["../../src/utils/lazy.tsx"],"sourcesContent":["import { type ComponentType, lazy } from 'react';\n\n// Waku wraps all export functions of a \"use client\" file in `React.lazy`, but `lazy(lazy(() => ...))` causes error.\n// we wrap another layer of component such that it is valid\n// TODO: perhaps we can remove it once Waku migrated to vite-rsc\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- type infer\nexport function wrapLazy<T extends ComponentType<any>>(load: () => Promise<{ default: T }>): T {\n const V = lazy(load);\n\n return function wrapper(props) {\n return <V {...props} />;\n } as T;\n}\n"],"mappings":";;;AAMA,SAAgB,SAAuC,MAAwC;CAC7F,MAAM,IAAI,KAAK,KAAK;AAEpB,QAAO,SAAS,QAAQ,OAAO;AAC7B,SAAO,oBAAC,GAAD,EAAG,GAAI,OAAS,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import { deepEqual } from "./deep-equal.js";
2
-
3
2
  //#region src/utils/merge-schema.ts
4
3
  /**
5
4
  * Merge `allOf` object schema
@@ -146,7 +145,7 @@ function intersectArray(a, b) {
146
145
  for (const item of b) if (a.includes(item)) out.add(item);
147
146
  return Array.from(out);
148
147
  }
149
-
150
148
  //#endregion
151
149
  export { mergeAllOf };
150
+
152
151
  //# sourceMappingURL=merge-schema.js.map