fumadocs-openapi 10.4.1 → 10.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/css/generated/shared.css +34 -22
  2. package/dist/generate-file.d.ts +21 -3
  3. package/dist/generate-file.d.ts.map +1 -1
  4. package/dist/generate-file.js +74 -28
  5. package/dist/generate-file.js.map +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/playground/client.d.ts +27 -7
  8. package/dist/playground/client.d.ts.map +1 -1
  9. package/dist/playground/client.js +51 -44
  10. package/dist/playground/client.js.map +1 -1
  11. package/dist/playground/components/inputs.js +1 -1
  12. package/dist/playground/components/inputs.js.map +1 -1
  13. package/dist/playground/components/server-select.js +3 -4
  14. package/dist/playground/components/server-select.js.map +1 -1
  15. package/dist/playground/index.d.ts +1 -1
  16. package/dist/playground/index.d.ts.map +1 -1
  17. package/dist/playground/index.js +2 -2
  18. package/dist/playground/index.js.map +1 -1
  19. package/dist/playground/schema.d.ts +0 -1
  20. package/dist/playground/schema.d.ts.map +1 -1
  21. package/dist/playground/schema.js +11 -13
  22. package/dist/playground/schema.js.map +1 -1
  23. package/dist/requests/generators/python.d.ts +2 -1
  24. package/dist/requests/generators/python.d.ts.map +1 -1
  25. package/dist/requests/generators/python.js +13 -2
  26. package/dist/requests/generators/python.js.map +1 -1
  27. package/dist/requests/media/adapter.js +1 -1
  28. package/dist/requests/string-utils.js +1 -1
  29. package/dist/scalar/index.d.ts +2 -1
  30. package/dist/scalar/index.d.ts.map +1 -1
  31. package/dist/server/create.d.ts +2 -0
  32. package/dist/server/create.d.ts.map +1 -1
  33. package/dist/server/create.js +11 -8
  34. package/dist/server/create.js.map +1 -1
  35. package/dist/server/source-api.d.ts +9 -3
  36. package/dist/server/source-api.d.ts.map +1 -1
  37. package/dist/server/source-api.js +65 -6
  38. package/dist/server/source-api.js.map +1 -1
  39. package/dist/types.d.ts +2 -4
  40. package/dist/types.d.ts.map +1 -1
  41. package/dist/ui/api-page.d.ts +2 -2
  42. package/dist/ui/api-page.d.ts.map +1 -1
  43. package/dist/ui/api-page.js +4 -6
  44. package/dist/ui/api-page.js.map +1 -1
  45. package/dist/ui/base.d.ts +20 -16
  46. package/dist/ui/base.d.ts.map +1 -1
  47. package/dist/ui/base.js +18 -9
  48. package/dist/ui/base.js.map +1 -1
  49. package/dist/ui/{full.client.js → client/full.js} +3 -3
  50. package/dist/ui/client/full.js.map +1 -0
  51. package/dist/ui/client/index.d.ts +1 -1
  52. package/dist/ui/client/index.js.map +1 -1
  53. package/dist/ui/client/storage-key.js.map +1 -1
  54. package/dist/ui/components/server-tab.js +43 -0
  55. package/dist/ui/components/server-tab.js.map +1 -0
  56. package/dist/ui/contexts/api.js +18 -35
  57. package/dist/ui/contexts/api.js.map +1 -1
  58. package/dist/ui/create-client.d.ts +26 -0
  59. package/dist/ui/create-client.d.ts.map +1 -0
  60. package/dist/ui/create-client.js +132 -0
  61. package/dist/ui/create-client.js.map +1 -0
  62. package/dist/ui/index.d.ts +10 -2
  63. package/dist/ui/index.d.ts.map +1 -0
  64. package/dist/ui/index.js +21 -1
  65. package/dist/ui/index.js.map +1 -0
  66. package/dist/ui/operation/client.js +44 -36
  67. package/dist/ui/operation/client.js.map +1 -1
  68. package/dist/ui/operation/{request-tabs.d.ts → get-example-requests.d.ts} +2 -3
  69. package/dist/ui/operation/get-example-requests.d.ts.map +1 -0
  70. package/dist/ui/operation/get-example-requests.js +83 -0
  71. package/dist/ui/operation/get-example-requests.js.map +1 -0
  72. package/dist/ui/operation/index.js +101 -63
  73. package/dist/ui/operation/index.js.map +1 -1
  74. package/dist/ui/operation/request-tabs.js +3 -81
  75. package/dist/ui/operation/request-tabs.js.map +1 -1
  76. package/dist/ui/operation/response-tabs.d.ts +1 -1
  77. package/dist/ui/operation/response-tabs.js +57 -54
  78. package/dist/ui/operation/response-tabs.js.map +1 -1
  79. package/dist/ui/operation/usage-tabs/client.js +7 -48
  80. package/dist/ui/operation/usage-tabs/client.js.map +1 -1
  81. package/dist/ui/operation/usage-tabs/index.js +14 -10
  82. package/dist/ui/operation/usage-tabs/index.js.map +1 -1
  83. package/dist/ui/operation/usage-tabs/lazy.js +1 -2
  84. package/dist/ui/operation/usage-tabs/lazy.js.map +1 -1
  85. package/dist/ui/schema/client.d.ts +1 -0
  86. package/dist/ui/schema/client.d.ts.map +1 -1
  87. package/dist/ui/schema/index.d.ts +2 -1
  88. package/dist/ui/schema/index.d.ts.map +1 -1
  89. package/dist/ui/schema/index.js +4 -2
  90. package/dist/ui/schema/index.js.map +1 -1
  91. package/dist/utils/pages/builder.d.ts +10 -11
  92. package/dist/utils/pages/builder.d.ts.map +1 -1
  93. package/dist/utils/pages/builder.js +30 -31
  94. package/dist/utils/pages/builder.js.map +1 -1
  95. package/dist/utils/pages/preset-auto.d.ts +6 -5
  96. package/dist/utils/pages/preset-auto.d.ts.map +1 -1
  97. package/dist/utils/pages/preset-auto.js +97 -35
  98. package/dist/utils/pages/preset-auto.js.map +1 -1
  99. package/dist/utils/pages/to-text.d.ts.map +1 -1
  100. package/dist/utils/pages/to-text.js +4 -12
  101. package/dist/utils/pages/to-text.js.map +1 -1
  102. package/dist/utils/process-document.d.ts +1 -1
  103. package/dist/utils/process-document.js +1 -32
  104. package/dist/utils/process-document.js.map +1 -1
  105. package/dist/utils/schema/dereference.js +37 -0
  106. package/dist/utils/schema/dereference.js.map +1 -0
  107. package/dist/utils/{schema.d.ts → schema/index.d.ts} +3 -3
  108. package/dist/utils/schema/index.d.ts.map +1 -0
  109. package/dist/utils/{schema.js → schema/index.js} +3 -3
  110. package/dist/utils/schema/index.js.map +1 -0
  111. package/dist/utils/schema/resolve-ref.js +21 -0
  112. package/dist/utils/schema/resolve-ref.js.map +1 -0
  113. package/dist/utils/{schema-to-string.js → schema/to-string.js} +2 -2
  114. package/dist/utils/schema/to-string.js.map +1 -0
  115. package/package.json +10 -9
  116. package/dist/requests/to-python-object.js +0 -17
  117. package/dist/requests/to-python-object.js.map +0 -1
  118. package/dist/ui/full.client.js.map +0 -1
  119. package/dist/ui/full.d.ts +0 -11
  120. package/dist/ui/full.d.ts.map +0 -1
  121. package/dist/ui/full.js +0 -36
  122. package/dist/ui/full.js.map +0 -1
  123. package/dist/ui/operation/request-tabs.d.ts.map +0 -1
  124. package/dist/utils/pages/to-body.js +0 -22
  125. package/dist/utils/pages/to-body.js.map +0 -1
  126. package/dist/utils/schema-to-string.js.map +0 -1
  127. package/dist/utils/schema.d.ts.map +0 -1
  128. package/dist/utils/schema.js.map +0 -1
  129. /package/dist/utils/{schema-to-string.d.ts → schema/to-string.d.ts} +0 -0
@@ -1,73 +1,76 @@
1
- import { getPreferredType } from "../../utils/schema.js";
1
+ import { getPreferredType } from "../../utils/schema/index.js";
2
2
  import { I18nLabel } from "../client/i18n.js";
3
3
  import { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Accordions } from "../components/accordion.js";
4
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ import { useMemo } from "react";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
6
  import { sample } from "openapi-sampler";
6
7
  import { Tab, Tabs } from "fumadocs-ui/components/tabs";
7
8
  //#region src/ui/operation/response-tabs.tsx
8
9
  function ResponseTabs({ operation, ctx }) {
9
- if (!operation.responses) return null;
10
- const tabs = [];
11
- for (const [code, response] of Object.entries(operation.responses)) {
12
- const media = response.content ? getPreferredType(response.content) : null;
13
- const responseOfType = media ? response.content?.[media] : null;
14
- const tab = {
15
- code,
16
- response,
17
- mediaType: media
18
- };
19
- if (responseOfType?.examples) {
20
- tab.examples ??= [];
21
- for (const [key, sample] of Object.entries(responseOfType.examples)) tab.examples.push({
22
- label: sample?.summary ?? /* @__PURE__ */ jsx(I18nLabel, {
23
- label: "responseTabName",
24
- replacements: { key }
25
- }),
26
- sample: sample.value,
27
- description: sample?.description
28
- });
29
- } else if (responseOfType?.example || responseOfType?.schema) {
30
- tab.examples ??= [];
31
- tab.examples.push({
32
- label: /* @__PURE__ */ jsx(I18nLabel, { label: "responseTabNameDefault" }),
33
- sample: responseOfType.example ?? sample(responseOfType.schema)
34
- });
10
+ const tabs = useMemo(() => {
11
+ const tabs = [];
12
+ if (!operation.responses) return tabs;
13
+ for (const [code, response] of Object.entries(operation.responses)) {
14
+ const media = response.content ? getPreferredType(response.content) : null;
15
+ const responseOfType = media ? response.content?.[media] : null;
16
+ const tab = {
17
+ code,
18
+ response,
19
+ mediaType: media
20
+ };
21
+ if (responseOfType?.examples) {
22
+ tab.examples ??= [];
23
+ for (const [key, sample] of Object.entries(responseOfType.examples)) tab.examples.push({
24
+ label: sample?.summary ?? /* @__PURE__ */ jsx(I18nLabel, {
25
+ label: "responseTabName",
26
+ replacements: { key }
27
+ }),
28
+ sample: sample.value,
29
+ description: sample?.description
30
+ });
31
+ } else if (responseOfType?.example || responseOfType?.schema) {
32
+ tab.examples ??= [];
33
+ tab.examples.push({
34
+ label: /* @__PURE__ */ jsx(I18nLabel, { label: "responseTabNameDefault" }),
35
+ sample: responseOfType.example ?? sample(responseOfType.schema)
36
+ });
37
+ }
38
+ tabs.push(tab);
35
39
  }
36
- tabs.push(tab);
37
- }
40
+ return tabs;
41
+ }, [operation.responses]);
42
+ if (tabs.length === 0) return null;
38
43
  const { renderResponseTabs = renderResponseTabsDefault } = ctx.content ?? {};
39
44
  return renderResponseTabs(tabs, ctx);
40
45
  }
41
46
  function renderResponseTabsDefault(tabs, ctx) {
42
47
  function renderExampleContent(example) {
43
- return /* @__PURE__ */ jsxs(Fragment, { children: [example.description && ctx.renderMarkdown(example.description), ctx.renderCodeBlock("json", JSON.stringify(example.sample, null, 2))] });
48
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [example.description && ctx.renderMarkdown(example.description), ctx.renderCodeBlock("json", JSON.stringify(example.sample, null, 2))] });
44
49
  }
45
- async function renderResponse(tab) {
46
- const { examples = [] } = tab;
47
- let slot = /* @__PURE__ */ jsx(I18nLabel, { label: "empty" });
48
- if (examples.length > 1) slot = /* @__PURE__ */ jsx(Accordions, {
49
- type: "single",
50
- className: "pt-2",
51
- defaultValue: "0",
52
- children: examples.map((example, i) => /* @__PURE__ */ jsxs(AccordionItem, {
53
- value: i.toString(),
54
- children: [/* @__PURE__ */ jsx(AccordionHeader, { children: /* @__PURE__ */ jsx(AccordionTrigger, { children: example.label }) }), /* @__PURE__ */ jsx(AccordionContent, {
55
- className: "prose-no-margin",
56
- children: renderExampleContent(example)
57
- })]
58
- }, i))
59
- });
60
- else if (examples.length === 1) slot = renderExampleContent(examples[0]);
61
- return /* @__PURE__ */ jsx(Tab, {
62
- value: tab.code,
63
- children: slot
64
- });
65
- }
66
- if (tabs.length === 0) return null;
67
50
  return /* @__PURE__ */ jsx(Tabs, {
68
51
  groupId: "fumadocs_openapi_responses",
69
52
  items: tabs.map((tab) => tab.code),
70
- children: tabs.map(renderResponse)
53
+ children: tabs.map((tab) => {
54
+ const { examples = [] } = tab;
55
+ let slot = /* @__PURE__ */ jsx(I18nLabel, { label: "empty" });
56
+ if (examples.length > 1) slot = /* @__PURE__ */ jsx(Accordions, {
57
+ type: "single",
58
+ className: "pt-2",
59
+ defaultValue: "0",
60
+ children: examples.map((example, i) => /* @__PURE__ */ jsxs(AccordionItem, {
61
+ value: i.toString(),
62
+ children: [/* @__PURE__ */ jsx(AccordionHeader, { children: /* @__PURE__ */ jsx(AccordionTrigger, { children: example.label }) }), /* @__PURE__ */ jsx(AccordionContent, {
63
+ className: "prose-no-margin",
64
+ children: renderExampleContent(example)
65
+ })]
66
+ }, i))
67
+ });
68
+ else if (examples.length === 1) slot = renderExampleContent(examples[0]);
69
+ return /* @__PURE__ */ jsx(Tab, {
70
+ value: tab.code,
71
+ children: slot
72
+ }, tab.code);
73
+ })
71
74
  });
72
75
  }
73
76
  //#endregion
@@ -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';\nimport { I18nLabel } from '@/ui/client/i18n';\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: ReactNode;\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 tab.examples.push({\n label: sample?.summary ?? <I18nLabel label=\"responseTabName\" replacements={{ key }} />,\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: <I18nLabel label=\"responseTabNameDefault\" />,\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 = <I18nLabel label=\"empty\" />;\n if (examples.length > 1) {\n slot = (\n <Accordions type=\"single\" className=\"pt-2\" defaultValue=\"0\">\n {examples.map((example, i) => (\n <AccordionItem key={i} value={i.toString()}>\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":";;;;;;;AA2CA,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,CACjE,KAAI,SAAS,KAAK;IAChB,OAAO,QAAQ,WAAW,oBAAC,WAAD;KAAW,OAAM;KAAkB,cAAc,EAAE,KAAK;KAAI,CAAA;IACtF,QAAQ,OAAO;IACf,aAAa,QAAQ;IACtB,CAAC;aAEK,gBAAgB,WAAW,gBAAgB,QAAQ;AAC5D,OAAI,aAAa,EAAE;AACnB,OAAI,SAAS,KAAK;IAChB,OAAO,oBAAC,WAAD,EAAW,OAAM,0BAA2B,CAAA;IACnD,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,oBAAC,WAAD,EAAW,OAAM,SAAU,CAAA;AACjD,MAAI,SAAS,SAAS,EACpB,QACE,oBAAC,YAAD;GAAY,MAAK;GAAS,WAAU;GAAO,cAAa;aACrD,SAAS,KAAK,SAAS,MACtB,qBAAC,eAAD;IAAuB,OAAO,EAAE,UAAU;cAA1C,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
+ {"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 { useMemo, type ReactNode } from 'react';\nimport { I18nLabel } from '@/ui/client/i18n';\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: ReactNode;\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 const tabs = useMemo(() => {\n const tabs: ResponseTab[] = [];\n if (!operation.responses) return tabs;\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 tab.examples.push({\n label: sample?.summary ?? <I18nLabel label=\"responseTabName\" replacements={{ key }} />,\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: <I18nLabel label=\"responseTabNameDefault\" />,\n sample: responseOfType.example ?? sample(responseOfType.schema as object),\n });\n }\n\n tabs.push(tab);\n }\n\n return tabs;\n }, [operation.responses]);\n\n if (tabs.length === 0) return null;\n\n const { renderResponseTabs = renderResponseTabsDefault } = ctx.content ?? {};\n\n return renderResponseTabs(tabs, ctx);\n}\n\nfunction renderResponseTabsDefault(tabs: ResponseTab[], ctx: RenderContext): 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 return (\n <Tabs groupId=\"fumadocs_openapi_responses\" items={tabs.map((tab) => tab.code)}>\n {tabs.map((tab) => {\n const { examples = [] } = tab;\n\n let slot: ReactNode = <I18nLabel label=\"empty\" />;\n if (examples.length > 1) {\n slot = (\n <Accordions type=\"single\" className=\"pt-2\" defaultValue=\"0\">\n {examples.map((example, i) => (\n <AccordionItem key={i} value={i.toString()}>\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 (\n <Tab key={tab.code} value={tab.code}>\n {slot}\n </Tab>\n );\n })}\n </Tabs>\n );\n}\n"],"mappings":";;;;;;;;AA2CA,SAAgB,aAAa,EAC3B,WACA,OAIC;CACD,MAAM,OAAO,cAAc;EACzB,MAAM,OAAsB,EAAE;AAC9B,MAAI,CAAC,UAAU,UAAW,QAAO;AAEjC,OAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,UAAU,UAAU,EAAE;GAClE,MAAM,QAAQ,SAAS,UAAU,iBAAiB,SAAS,QAAQ,GAAG;GACtE,MAAM,iBAAiB,QAAQ,SAAS,UAAU,SAAS;GAE3D,MAAM,MAAmB;IACvB;IACA;IACA,WAAW;IACZ;AAED,OAAI,gBAAgB,UAAU;AAC5B,QAAI,aAAa,EAAE;AAEnB,SAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,eAAe,SAAS,CACjE,KAAI,SAAS,KAAK;KAChB,OAAO,QAAQ,WAAW,oBAAC,WAAD;MAAW,OAAM;MAAkB,cAAc,EAAE,KAAK;MAAI,CAAA;KACtF,QAAQ,OAAO;KACf,aAAa,QAAQ;KACtB,CAAC;cAEK,gBAAgB,WAAW,gBAAgB,QAAQ;AAC5D,QAAI,aAAa,EAAE;AACnB,QAAI,SAAS,KAAK;KAChB,OAAO,oBAAC,WAAD,EAAW,OAAM,0BAA2B,CAAA;KACnD,QAAQ,eAAe,WAAW,OAAO,eAAe,OAAiB;KAC1E,CAAC;;AAGJ,QAAK,KAAK,IAAI;;AAGhB,SAAO;IACN,CAAC,UAAU,UAAU,CAAC;AAEzB,KAAI,KAAK,WAAW,EAAG,QAAO;CAE9B,MAAM,EAAE,qBAAqB,8BAA8B,IAAI,WAAW,EAAE;AAE5E,QAAO,mBAAmB,MAAM,IAAI;;AAGtC,SAAS,0BAA0B,MAAqB,KAA+B;CACrF,SAAS,qBAAqB,SAA0B;AACtD,SACE,qBAAA,YAAA,EAAA,UAAA,CACG,QAAQ,eAAe,IAAI,eAAe,QAAQ,YAAY,EAC9D,IAAI,gBAAgB,QAAQ,KAAK,UAAU,QAAQ,QAAQ,MAAM,EAAE,CAAC,CACpE,EAAA,CAAA;;AAIP,QACE,oBAAC,MAAD;EAAM,SAAQ;EAA6B,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;YAC1E,KAAK,KAAK,QAAQ;GACjB,MAAM,EAAE,WAAW,EAAE,KAAK;GAE1B,IAAI,OAAkB,oBAAC,WAAD,EAAW,OAAM,SAAU,CAAA;AACjD,OAAI,SAAS,SAAS,EACpB,QACE,oBAAC,YAAD;IAAY,MAAK;IAAS,WAAU;IAAO,cAAa;cACrD,SAAS,KAAK,SAAS,MACtB,qBAAC,eAAD;KAAuB,OAAO,EAAE,UAAU;eAA1C,CACE,oBAAC,iBAAD,EAAA,UACE,oBAAC,kBAAD,EAAA,UAAmB,QAAQ,OAAyB,CAAA,EACpC,CAAA,EAClB,oBAAC,kBAAD;MAAkB,WAAU;gBACzB,qBAAqB,QAAQ;MACb,CAAA,CACL;OAPI,EAOJ,CAChB;IACS,CAAA;YAEN,SAAS,WAAW,EAC7B,QAAO,qBAAqB,SAAS,GAAG;AAG1C,UACE,oBAAC,KAAD;IAAoB,OAAO,IAAI;cAC5B;IACG,EAFI,IAAI,KAER;IAER;EACG,CAAA"}
@@ -1,55 +1,14 @@
1
1
  "use client";
2
2
  import { joinURL, resolveRequestData, resolveServerUrl, withBase } from "../../../utils/url.js";
3
- import { useApiContext, useServerSelectContext } from "../../contexts/api.js";
3
+ import { useApiContext, useServerContext } from "../../contexts/api.js";
4
4
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../components/select.js";
5
5
  import { ClientCodeBlock } from "../../components/codeblock.js";
6
- import { createContext, use, useEffect, useMemo, useRef, useState } from "react";
6
+ import { useOperationContext } from "../client.js";
7
+ import { useEffect, useMemo, useState } from "react";
7
8
  import { jsx, jsxs } from "react/jsx-runtime";
8
9
  //#region src/ui/operation/usage-tabs/client.tsx
9
- const Context = createContext(null);
10
- function UsageTabsProvider({ route, examples, defaultExampleId, children }) {
11
- const [example, setExample] = useState(() => defaultExampleId ?? examples.at(0)?.id);
12
- const listeners = useRef([]);
13
- return /* @__PURE__ */ jsx(Context, {
14
- value: useMemo(() => ({
15
- example,
16
- route,
17
- setExample(newKey) {
18
- const example = examples.find((example) => example.id === newKey);
19
- if (!example) return;
20
- setExample(newKey);
21
- for (const listener of listeners.current) listener(example.data, example.encoded);
22
- },
23
- examples,
24
- setExampleData(data, encoded) {
25
- for (const item of examples) if (item.id === example) {
26
- item.data = data;
27
- item.encoded = encoded;
28
- break;
29
- }
30
- for (const listener of listeners.current) listener(data, encoded);
31
- },
32
- removeListener(listener) {
33
- listeners.current = listeners.current.filter((item) => item !== listener);
34
- },
35
- addListener(listener) {
36
- const active = examples.find((item) => item.id === example);
37
- listener(active.data, active.encoded);
38
- listeners.current.push(listener);
39
- }
40
- }), [
41
- example,
42
- route,
43
- examples
44
- ]),
45
- children
46
- });
47
- }
48
- function useExampleRequests() {
49
- return use(Context);
50
- }
51
10
  function UsageTabsSelector() {
52
- const { example: key, setExample: setKey, examples } = useExampleRequests();
11
+ const { example: key, setExample: setKey, examples } = useOperationContext();
53
12
  const { APIExampleSelector: Override } = useApiContext().client.operation ?? {};
54
13
  if (Override) return /* @__PURE__ */ jsx(Override, {
55
14
  items: examples,
@@ -84,8 +43,8 @@ function UsageTabsSelector() {
84
43
  }
85
44
  function UsageTab({ id, lang, _client }) {
86
45
  const { mediaAdapters, codeUsages } = useApiContext();
87
- const { examples, example: selectedExampleId, route, addListener, removeListener } = useExampleRequests();
88
- const { server } = useServerSelectContext();
46
+ const { examples, example: selectedExampleId, route, addListener, removeListener } = useOperationContext();
47
+ const { server } = useServerContext();
89
48
  const codegen = codeUsages.get(id);
90
49
  const [data, setData] = useState(() => examples.find((example) => example.id === selectedExampleId)?.encoded);
91
50
  useEffect(() => {
@@ -126,6 +85,6 @@ function UsageTab({ id, lang, _client }) {
126
85
  });
127
86
  }
128
87
  //#endregion
129
- export { UsageTab, UsageTabsProvider, UsageTabsSelector, useExampleRequests };
88
+ export { UsageTab, UsageTabsSelector };
130
89
 
131
90
  //# 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 { 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';\nimport { ClientCodeBlock } from '@/ui/components/codeblock';\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 { 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 <ClientCodeBlock lang={lang} code={code} />;\n}\n"],"mappings":";;;;;;;;AAkBA,MAAM,UAAU,cASN,KAAK;AAEf,SAAgB,kBAAkB,EAChC,OACA,UACA,kBACA,YAMC;CACD,MAAM,CAAC,SAAS,cAAc,eAAe,oBAAoB,SAAS,GAAG,EAAE,EAAE,GAAG;CACpF,MAAM,YAAY,OAAgC,EAAE,CAAC;AAErD,QACE,oBAAC,SAAD;EACE,OAAO,eACE;GACL;GACA;GACA,WAAW,QAAgB;IACzB,MAAM,UAAU,SAAS,MAAM,YAAY,QAAQ,OAAO,OAAO;AACjE,QAAI,CAAC,QAAS;AAEd,eAAW,OAAO;AAClB,SAAK,MAAM,YAAY,UAAU,QAC/B,UAAS,QAAQ,MAAM,QAAQ,QAAQ;;GAG3C;GACA,eAAe,MAAM,SAAS;AAC5B,SAAK,MAAM,QAAQ,SACjB,KAAI,KAAK,OAAO,SAAS;AAEvB,UAAK,OAAO;AACZ,UAAK,UAAU;AACf;;AAIJ,SAAK,MAAM,YAAY,UAAU,QAC/B,UAAS,MAAM,QAAQ;;GAG3B,eAAe,UAAU;AACvB,cAAU,UAAU,UAAU,QAAQ,QAAQ,SAAS,SAAS,SAAS;;GAE3E,YAAY,UAAU;IAGpB,MAAM,SAAS,SAAS,MAAM,SAAS,KAAK,OAAO,QAAQ;AAE3D,aAAS,OAAO,MAAM,OAAO,QAAQ;AACrC,cAAU,QAAQ,KAAK,SAAS;;GAEnC,GACD;GAAC;GAAS;GAAO;GAAS,CAC3B;EAEA;EACO,CAAA;;AAId,SAAgB,qBAAqB;AACnC,QAAO,IAAI,QAAQ;;AAGrB,SAAgB,oBAAoB;CAClC,MAAM,EAAE,SAAS,KAAK,YAAY,QAAQ,aAAa,oBAAoB;CAC3E,MAAM,EAAE,oBAAoB,aAAa,eAAe,CAAC,OAAO,aAAa,EAAE;AAE/E,KAAI,SACF,QAAO,oBAAC,UAAD;EAAU,OAAO;EAAU,OAAO;EAAK,eAAe;EAAU,CAAA;CAGzE,SAAS,WAAW,MAA0B;AAC5C,SACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,QAAD;GAAM,WAAU;aAAuB,KAAK;GAAY,CAAA,EACxD,oBAAC,QAAD;GAAM,WAAU;aAA4B,KAAK;GAAmB,CAAA,CAChE,EAAA,CAAA;;AAIV,KAAI,SAAS,WAAW,EAAG,QAAO;CAClC,MAAM,WAAW,SAAS,MAAM,SAAS,KAAK,OAAO,IAAI;AACzD,QACE,qBAAC,QAAD;EAAQ,OAAO;EAAK,eAAe;YAAnC,CACE,oBAAC,eAAD;GAAe,WAAU;aACtB,YAAY,oBAAC,aAAD;IAAa,SAAA;cAAS,WAAW,SAAS;IAAe,CAAA;GACxD,CAAA,EAChB,oBAAC,eAAD,EAAA,UACG,SAAS,KAAK,SACb,oBAAC,YAAD;GAA0B,OAAO,KAAK;aACnC,WAAW,KAAK;GACN,EAFI,KAAK,GAET,CACb,EACY,CAAA,CACT;;;AAIb,SAAgB,SAAS,EACvB,IACA,MACA,WACgE;CAChE,MAAM,EAAE,eAAe,eAAe,eAAe;CACrD,MAAM,EACJ,UACA,SAAS,mBACT,OACA,aACA,mBACE,oBAAoB;CACxB,MAAM,EAAE,WAAW,wBAAwB;CAC3C,MAAM,UAAU,WAAW,IAAI,GAAG;CAClC,MAAM,CAAC,MAAM,WAAW,eAChB,SAAS,MAAM,YAAY,QAAQ,OAAO,kBAAkB,EAAE,QACrE;AAED,iBAAgB;EACd,MAAM,YAAmC,GAAG,YAAY,QAAQ,QAAQ;AAExE,cAAY,SAAS;AACrB,eAAa;AACX,kBAAe,SAAS;;IAEzB,CAAC,aAAa,eAAe,CAAC;CAEjC,MAAM,OAAO,cAAc;AACzB,MAAI,CAAC,KAAM;EACX,MAAM,MAAM,QACV,SACE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,GAAG,KAC1D,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS,kBAC1D,EACD,mBAAmB,OAAO,KAAK,CAChC;AAED,MAAI,SAAS;GACX,MAAM,EAAE,UAAU,kBAAkB;AACpC,OAAI,OAAO,aAAa,SAAU,QAAO;AACzC,UAAO,SAAS,KAAK,MAAM;IACzB;IACA,QAAQ;IACT,CAAC;;AAGJ,MAAI,CAAC,QAAS;AACd,SAAO,QAAQ,SAAS,KAAK,MAAM;GACjC;GACA,QAAQ;GACT,CAAC;IACD;EAAC;EAAM;EAAQ;EAAO;EAAS;EAAS;EAAc,CAAC;AAE1D,KAAI,CAAC,KAAM,QAAO;AAElB,QAAO,oBAAC,iBAAD;EAAuB;EAAY;EAAQ,CAAA"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/client.tsx"],"sourcesContent":["'use client';\nimport { useApiContext, useServerContext } 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 { useState, useEffect, useMemo } from 'react';\nimport type { CodeUsageGenerator } from '@/requests/generators';\nimport { ClientCodeBlock } from '@/ui/components/codeblock';\nimport { type ExampleUpdateListener, useOperationContext } from '../client';\nimport type { ExampleRequestItem } from '../get-example-requests';\n\nexport function UsageTabsSelector() {\n const { example: key, setExample: setKey, examples } = useOperationContext();\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 { mediaAdapters, codeUsages } = useApiContext();\n const {\n examples,\n example: selectedExampleId,\n route,\n addListener,\n removeListener,\n } = useOperationContext();\n const { server } = useServerContext();\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 <ClientCodeBlock lang={lang} code={code} />;\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,oBAAoB;CAClC,MAAM,EAAE,SAAS,KAAK,YAAY,QAAQ,aAAa,qBAAqB;CAC5E,MAAM,EAAE,oBAAoB,aAAa,eAAe,CAAC,OAAO,aAAa,EAAE;AAE/E,KAAI,SACF,QAAO,oBAAC,UAAD;EAAU,OAAO;EAAU,OAAO;EAAK,eAAe;EAAU,CAAA;CAGzE,SAAS,WAAW,MAA0B;AAC5C,SACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,QAAD;GAAM,WAAU;aAAuB,KAAK;GAAY,CAAA,EACxD,oBAAC,QAAD;GAAM,WAAU;aAA4B,KAAK;GAAmB,CAAA,CAChE,EAAA,CAAA;;AAIV,KAAI,SAAS,WAAW,EAAG,QAAO;CAClC,MAAM,WAAW,SAAS,MAAM,SAAS,KAAK,OAAO,IAAI;AACzD,QACE,qBAAC,QAAD;EAAQ,OAAO;EAAK,eAAe;YAAnC,CACE,oBAAC,eAAD;GAAe,WAAU;aACtB,YAAY,oBAAC,aAAD;IAAa,SAAA;cAAS,WAAW,SAAS;IAAe,CAAA;GACxD,CAAA,EAChB,oBAAC,eAAD,EAAA,UACG,SAAS,KAAK,SACb,oBAAC,YAAD;GAA0B,OAAO,KAAK;aACnC,WAAW,KAAK;GACN,EAFI,KAAK,GAET,CACb,EACY,CAAA,CACT;;;AAIb,SAAgB,SAAS,EACvB,IACA,MACA,WACgE;CAChE,MAAM,EAAE,eAAe,eAAe,eAAe;CACrD,MAAM,EACJ,UACA,SAAS,mBACT,OACA,aACA,mBACE,qBAAqB;CACzB,MAAM,EAAE,WAAW,kBAAkB;CACrC,MAAM,UAAU,WAAW,IAAI,GAAG;CAClC,MAAM,CAAC,MAAM,WAAW,eAChB,SAAS,MAAM,YAAY,QAAQ,OAAO,kBAAkB,EAAE,QACrE;AAED,iBAAgB;EACd,MAAM,YAAmC,GAAG,YAAY,QAAQ,QAAQ;AAExE,cAAY,SAAS;AACrB,eAAa;AACX,kBAAe,SAAS;;IAEzB,CAAC,aAAa,eAAe,CAAC;CAEjC,MAAM,OAAO,cAAc;AACzB,MAAI,CAAC,KAAM;EACX,MAAM,MAAM,QACV,SACE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,GAAG,KAC1D,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS,kBAC1D,EACD,mBAAmB,OAAO,KAAK,CAChC;AAED,MAAI,SAAS;GACX,MAAM,EAAE,UAAU,kBAAkB;AACpC,OAAI,OAAO,aAAa,SAAU,QAAO;AACzC,UAAO,SAAS,KAAK,MAAM;IACzB;IACA,QAAQ;IACT,CAAC;;AAGJ,MAAI,CAAC,QAAS;AACd,SAAO,QAAQ,SAAS,KAAK,MAAM;GACjC;GACA,QAAQ;GACT,CAAC;IACD;EAAC;EAAM;EAAQ;EAAO;EAAS;EAAS;EAAc,CAAC;AAE1D,KAAI,CAAC,KAAM,QAAO;AAElB,QAAO,oBAAC,iBAAD;EAAuB;EAAY;EAAQ,CAAA"}
@@ -2,10 +2,11 @@ import { createCodeUsageGeneratorRegistry } from "../../../requests/generators/i
2
2
  import { registerDefault } from "../../../requests/generators/all.js";
3
3
  import { UsageTabLazy, UsageTabsSelectorLazy } from "./lazy.js";
4
4
  import { ResponseTabs } from "../response-tabs.js";
5
+ import { useMemo } from "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
7
  import { CodeBlockTab, CodeBlockTabs, CodeBlockTabsList, CodeBlockTabsTrigger } from "fumadocs-ui/components/codeblock";
7
8
  //#region src/ui/operation/usage-tabs/index.tsx
8
- async function UsageTabs({ method, ctx }) {
9
+ function UsageTabs({ method, ctx }) {
9
10
  let { renderAPIExampleUsageTabs, renderAPIExampleLayout } = ctx.content ?? {};
10
11
  renderAPIExampleLayout ??= (slots) => {
11
12
  return /* @__PURE__ */ jsxs("div", {
@@ -36,17 +37,20 @@ async function UsageTabs({ method, ctx }) {
36
37
  }, id))]
37
38
  });
38
39
  };
39
- let registry;
40
- if (ctx.codeUsages) registry = createCodeUsageGeneratorRegistry(ctx.codeUsages);
41
- else {
42
- registry = createCodeUsageGeneratorRegistry();
43
- registerDefault(registry);
44
- }
45
- for (const gen of await ctx.generateCodeSamples?.(method) ?? []) registry.addInline(gen);
46
- if (method["x-codeSamples"]) for (const sample of method["x-codeSamples"]) registry.addInline(sample);
40
+ const registry = useMemo(() => {
41
+ let registry;
42
+ if (ctx.codeUsages) registry = createCodeUsageGeneratorRegistry(ctx.codeUsages);
43
+ else {
44
+ registry = createCodeUsageGeneratorRegistry();
45
+ registerDefault(registry);
46
+ }
47
+ for (const gen of ctx.generateCodeSamples?.(method) ?? []) registry.addInline(gen);
48
+ if (method["x-codeSamples"]) for (const sample of method["x-codeSamples"]) registry.addInline(sample);
49
+ return registry;
50
+ }, [ctx, method]);
47
51
  return renderAPIExampleLayout({
48
52
  selector: method["x-exclusiveCodeSample"] ? null : /* @__PURE__ */ jsx(UsageTabsSelectorLazy, {}),
49
- usageTabs: await renderAPIExampleUsageTabs(registry, ctx),
53
+ usageTabs: renderAPIExampleUsageTabs(registry, ctx),
50
54
  responseTabs: /* @__PURE__ */ jsx(ResponseTabs, {
51
55
  operation: method,
52
56
  ctx
@@ -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,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
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/index.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\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';\nimport { useMemo } from 'react';\n\nexport function UsageTabs({ method, ctx }: { method: MethodInformation; ctx: RenderContext }) {\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 const registry = useMemo(() => {\n let registry: CodeUsageGeneratorRegistry;\n\n if (ctx.codeUsages) {\n registry = createCodeUsageGeneratorRegistry(ctx.codeUsages);\n } else {\n registry = createCodeUsageGeneratorRegistry();\n registerDefault(registry);\n }\n\n for (const gen of 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 registry;\n }, [ctx, method]);\n\n return renderAPIExampleLayout(\n {\n selector: method['x-exclusiveCodeSample'] ? null : <UsageTabsSelectorLazy />,\n usageTabs: renderAPIExampleUsageTabs(registry, ctx),\n responseTabs: <ResponseTabs operation={method} ctx={ctx} />,\n },\n ctx,\n );\n}\n"],"mappings":";;;;;;;;AAgBA,SAAgB,UAAU,EAAE,QAAQ,OAA0D;CAC5F,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,MAAM,WAAW,cAAc;EAC7B,IAAI;AAEJ,MAAI,IAAI,WACN,YAAW,iCAAiC,IAAI,WAAW;OACtD;AACL,cAAW,kCAAkC;AAC7C,mBAAgB,SAAS;;AAG3B,OAAK,MAAM,OAAO,IAAI,sBAAsB,OAAO,IAAI,EAAE,CACvD,UAAS,UAAU,IAAI;AAGzB,MAAI,OAAO,iBACT,MAAK,MAAM,UAAU,OAAO,iBAC1B,UAAS,UAAU,OAAO;AAI9B,SAAO;IACN,CAAC,KAAK,OAAO,CAAC;AAEjB,QAAO,uBACL;EACE,UAAU,OAAO,2BAA2B,OAAO,oBAAC,uBAAD,EAAyB,CAAA;EAC5E,WAAW,0BAA0B,UAAU,IAAI;EACnD,cAAc,oBAAC,cAAD;GAAc,WAAW;GAAa;GAAO,CAAA;EAC5D,EACD,IACD"}
@@ -3,8 +3,7 @@ import { wrapLazy } from "../../../utils/lazy.js";
3
3
  //#region src/ui/operation/usage-tabs/lazy.tsx
4
4
  const UsageTabsSelectorLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTabsSelector })));
5
5
  const UsageTabLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTab })));
6
- const UsageTabsProviderLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTabsProvider })));
7
6
  //#endregion
8
- export { UsageTabLazy, UsageTabsProviderLazy, UsageTabsSelectorLazy };
7
+ export { UsageTabLazy, UsageTabsSelectorLazy };
9
8
 
10
9
  //# 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"],"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"}
@@ -1,4 +1,5 @@
1
1
  import { SchemaUIGeneratedData } from "./index.js";
2
+
2
3
  //#region src/ui/schema/client.d.ts
3
4
  interface SchemaUIProps {
4
5
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","names":[],"sources":["../../../src/ui/schema/client.tsx"],"mappings":";;UAkEiB,aAAA;EACf,IAAA;EACA,QAAA;EACA,EAAA;EAEA,SAAA,EAAW,qBAAA;AAAA"}
1
+ {"version":3,"file":"client.d.ts","names":[],"sources":["../../../src/ui/schema/client.tsx"],"mappings":";;;UAkEiB,aAAA;EACf,IAAA;EACA,QAAA;EACA,EAAA;EAEA,SAAA,EAAW,qBAAA;AAAA"}
@@ -1,6 +1,7 @@
1
- import { ResolvedSchema } from "../../utils/schema.js";
1
+ import { ResolvedSchema } from "../../utils/schema/index.js";
2
2
  import { SchemaUIProps } from "./client.js";
3
3
  import { ReactNode } from "react";
4
+
4
5
  //#region src/ui/schema/index.d.ts
5
6
  interface FieldBase {
6
7
  description?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/ui/schema/index.tsx"],"mappings":";;;;UASiB,SAAA;EACf,WAAA,GAAc,SAAA;EACd,QAAA,GAAW,OAAA;EAEX,QAAA;EACA,SAAA;EAEA,UAAA;AAAA;AAAA,UAGe,OAAA;EACf,KAAA,EAAO,SAAA;EACP,KAAA;AAAA;AAAA,UAGe,wBAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGU,UAAA,GAAa,SAAA;EAGjB,IAAA;AAAA;EAGA,IAAA;EACA,KAAA,EAAO,wBAAA;AAAA;EAGP,IAAA;EACA,IAAA;IACE,KAAA;EAAA;AAAA;EAIF,IAAA;EACA,KAAA;IACE,IAAA;IACA,KAAA;EAAA;AAAA;EAIF,IAAA;EACA,KAAA;IACE,IAAA;IACA,KAAA;EAAA;AAAA;AAAA,UAKO,eAAA;EACf,IAAA,EAAM,cAAA;EACN,MAAA,EAAQ,IAAA,CAAK,aAAA;EA1BA;;;EA+Bb,QAAA;EAtBM;;;EA0BN,SAAA;AAAA;AAAA,UAGe,qBAAA;EACf,KAAA;EACA,IAAA,EAAM,MAAA,SAAe,UAAA;AAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/ui/schema/index.tsx"],"mappings":";;;;;UASiB,SAAA;EACf,WAAA,GAAc,SAAA;EACd,QAAA,GAAW,OAAA;EAEX,QAAA;EACA,SAAA;EAEA,UAAA;AAAA;AAAA,UAGe,OAAA;EACf,KAAA,EAAO,SAAA;EACP,KAAA;AAAA;AAAA,UAGe,wBAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGU,UAAA,GAAa,SAAA;EAGjB,IAAA;AAAA;EAGA,IAAA;EACA,KAAA,EAAO,wBAAA;AAAA;EAGP,IAAA;EACA,IAAA;IACE,KAAA;EAAA;AAAA;EAIF,IAAA;EACA,KAAA;IACE,IAAA;IACA,KAAA;EAAA;AAAA;EAIF,IAAA;EACA,KAAA;IACE,IAAA;IACA,KAAA;EAAA;AAAA;AAAA,UAKO,eAAA;EACf,IAAA,EAAM,cAAA;EACN,MAAA,EAAQ,IAAA,CAAK,aAAA;EAvBP;;;EA4BN,QAAA;EArBM;;;EAyBN,SAAA;AAAA;AAAA,UAGe,qBAAA;EACf,KAAA;EACA,IAAA,EAAM,MAAA,SAAe,UAAA;AAAA"}
@@ -1,14 +1,16 @@
1
1
  import { mergeAllOf } from "../../utils/merge-schema.js";
2
- import { FormatFlags, schemaToString } from "../../utils/schema-to-string.js";
2
+ import { FormatFlags, schemaToString } from "../../utils/schema/to-string.js";
3
3
  import { I18nLabel } from "../client/i18n.js";
4
4
  import { SchemaUILazy } from "./lazy.js";
5
+ import { useMemo } from "react";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
  //#region src/ui/schema/index.tsx
7
8
  function Schema({ ctx, ...options }) {
8
9
  if (ctx.schemaUI?.render) return ctx.schemaUI.render(options, ctx);
10
+ const generated = useMemo(() => generateSchemaUI(options, ctx), [ctx, options]);
9
11
  return /* @__PURE__ */ jsx(SchemaUILazy, {
10
12
  ...options.client,
11
- generated: generateSchemaUI(options, ctx)
13
+ generated
12
14
  });
13
15
  }
14
16
  function generateSchemaUI({ root, readOnly, writeOnly }, ctx) {
@@ -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';\nimport { I18nLabel } from '../client/i18n';\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: ReactNode;\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({\n label: <I18nLabel label=\"schemaDefault\" />,\n value: JSON.stringify(schema.default),\n });\n }\n\n if (schema.pattern) {\n fields.push({ label: <I18nLabel label=\"schemaMatch\" />, value: schema.pattern });\n }\n\n if (schema.format) {\n fields.push({ label: <I18nLabel label=\"schemaFormat\" />, value: schema.format });\n }\n\n if (schema.multipleOf) {\n fields.push({\n label: <I18nLabel label=\"schemaMultipleOf\" />,\n value: schema.multipleOf.toString(),\n });\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: <I18nLabel label=\"schemaRange\" />, value: range });\n\n range = formatRange('length', schema.minLength, undefined, schema.maxLength, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaLength\" />, 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: <I18nLabel label=\"schemaProperties\" />, value: range });\n\n range = formatRange('items', schema.minItems, undefined, schema.maxItems, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaItems\" />, value: range });\n\n if (schema.enum) {\n fields.push({\n label: <I18nLabel label=\"schemaValueIn\" />,\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({\n label: <I18nLabel label=\"schemaExample\" />,\n value: JSON.stringify(example, null, 2),\n });\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 { useMemo, 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';\nimport { I18nLabel } from '../client/i18n';\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: ReactNode;\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 // eslint-disable-next-line react-hooks/rules-of-hooks -- assume options unchanged\n const generated = useMemo(() => generateSchemaUI(options, ctx), [ctx, options]);\n return <SchemaUILazy {...options.client} generated={generated} />;\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({\n label: <I18nLabel label=\"schemaDefault\" />,\n value: JSON.stringify(schema.default),\n });\n }\n\n if (schema.pattern) {\n fields.push({ label: <I18nLabel label=\"schemaMatch\" />, value: schema.pattern });\n }\n\n if (schema.format) {\n fields.push({ label: <I18nLabel label=\"schemaFormat\" />, value: schema.format });\n }\n\n if (schema.multipleOf) {\n fields.push({\n label: <I18nLabel label=\"schemaMultipleOf\" />,\n value: schema.multipleOf.toString(),\n });\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: <I18nLabel label=\"schemaRange\" />, value: range });\n\n range = formatRange('length', schema.minLength, undefined, schema.maxLength, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaLength\" />, 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: <I18nLabel label=\"schemaProperties\" />, value: range });\n\n range = formatRange('items', schema.minItems, undefined, schema.maxItems, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaItems\" />, value: range });\n\n if (schema.enum) {\n fields.push({\n label: <I18nLabel label=\"schemaValueIn\" />,\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({\n label: <I18nLabel label=\"schemaExample\" />,\n value: JSON.stringify(example, null, 2),\n });\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":";;;;;;;AAgFA,SAAgB,OAAO,EACrB,KACA,GAAG,WAGF;AACD,KAAI,IAAI,UAAU,OAChB,QAAO,IAAI,SAAS,OAAO,SAAS,IAAI;CAI1C,MAAM,YAAY,cAAc,iBAAiB,SAAS,IAAI,EAAE,CAAC,KAAK,QAAQ,CAAC;AAC/E,QAAO,oBAAC,cAAD;EAAc,GAAI,QAAQ;EAAmB;EAAa,CAAA;;AAGnE,SAAgB,iBACd,EAAE,MAAM,UAAU,aAClB,KACuB;CACvB,MAAM,OAAmC,EAAE;CAC3C,MAAM,EAAE,cAAc,UAAU,IAAI,YAAY,EAAE;CAElD,SAAS,iBAAiB,QAA0C;EAClE,MAAM,SAAoB,EAAE;AAE5B,MAAI,OAAO,YAAY,KAAA,EACrB,QAAO,KAAK;GACV,OAAO,oBAAC,WAAD,EAAW,OAAM,iBAAkB,CAAA;GAC1C,OAAO,KAAK,UAAU,OAAO,QAAQ;GACtC,CAAC;AAGJ,MAAI,OAAO,QACT,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,eAAgB,CAAA;GAAE,OAAO,OAAO;GAAS,CAAC;AAGlF,MAAI,OAAO,OACT,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,gBAAiB,CAAA;GAAE,OAAO,OAAO;GAAQ,CAAC;AAGlF,MAAI,OAAO,WACT,QAAO,KAAK;GACV,OAAO,oBAAC,WAAD,EAAW,OAAM,oBAAqB,CAAA;GAC7C,OAAO,OAAO,WAAW,UAAU;GACpC,CAAC;EAGJ,IAAI,QAAQ,YACV,SACA,OAAO,SACP,OAAO,kBACP,OAAO,SACP,OAAO,iBACR;AACD,MAAI,MAAO,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,eAAgB,CAAA;GAAE,OAAO;GAAO,CAAC;AAElF,UAAQ,YAAY,UAAU,OAAO,WAAW,KAAA,GAAW,OAAO,WAAW,KAAA,EAAU;AACvF,MAAI,MAAO,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,gBAAiB,CAAA;GAAE,OAAO;GAAO,CAAC;AAEnF,UAAQ,YACN,cACA,OAAO,eACP,KAAA,GACA,OAAO,eACP,KAAA,EACD;AACD,MAAI,MAAO,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,oBAAqB,CAAA;GAAE,OAAO;GAAO,CAAC;AAEvF,UAAQ,YAAY,SAAS,OAAO,UAAU,KAAA,GAAW,OAAO,UAAU,KAAA,EAAU;AACpF,MAAI,MAAO,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,eAAgB,CAAA;GAAE,OAAO;GAAO,CAAC;AAElF,MAAI,OAAO,KACT,QAAO,KAAK;GACV,OAAO,oBAAC,WAAD,EAAW,OAAM,iBAAkB,CAAA;GAC1C,OAAO,OAAO,KAAK,KAAK,UAAU,KAAK,UAAU,MAAM,CAAC,CAAC,KAAK,MAAM;GACrE,CAAC;AAGJ,MAAI,eAAe,OAAO,SACxB,MAAK,MAAM,WAAW,OAAO,SAC3B,QAAO,KAAK;GACV,OAAO,oBAAC,WAAD,EAAW,OAAM,iBAAkB,CAAA;GAC1C,OAAO,KAAK,UAAU,SAAS,MAAM,EAAE;GACxC,CAAC;AAIN,SAAO;;CAGT,IAAI,WAAW;CACf,MAAM,0BAAU,IAAI,SAAmD;CACvE,SAAS,YAAY,QAAgC;AACnD,MAAI,OAAO,WAAW,UAAW,QAAO,OAAO,OAAO;EACtD,MAAM,MAAM,IAAI,OAAO,UAAU,OAAO;AACxC,MAAI,IAAK,QAAO;EAEhB,MAAM,OAAO,QAAQ,IAAI,OAAO;AAChC,MAAI,KAAM,QAAO;EAEjB,MAAM,YAAY,KAAK;AACvB,UAAQ,IAAI,QAAQ,UAAU;AAC9B,SAAO;;CAGT,SAAS,UAAU,QAAiC;AAClD,MAAI,OAAO,WAAW,UAAW,QAAO;AACxC,MAAI,OAAO,UAAW,QAAO,aAAa;AAC1C,MAAI,OAAO,SAAU,QAAO,YAAY;AACxC,SAAO;;CAGT,SAAS,KAAK,QAAmC;AAC/C,MAAI,OAAO,WAAW,WAAW;GAC/B,MAAM,OAAO,SAAS,QAAQ;AAC9B,UAAO;IACL,UAAU;IACV,WAAW;IACZ;;AAGH,SAAO;GACL,aAAa,OAAO,eAAe,IAAI,eAAe,OAAO,YAAY;GACzE,UAAU,iBAAiB,OAAO;GAClC,UAAU,eAAe,QAAQ,IAAI,OAAO;GAC5C,WAAW,eAAe,QAAQ,IAAI,QAAQ,YAAY,SAAS;GACnE,YAAY,OAAO;GACpB;;CAGH,SAAS,SAAS,IAAY,QAAwB;AACpD,MAAI,MAAM,KAAM;AAChB,MAAI,OAAO,WAAW,WAAW;AAC/B,QAAK,MAAM;IACT,MAAM;IACN,GAAG,KAAK,OAAO;IAChB;AACD;;AAGF,MAAI,MAAM,QAAQ,OAAO,KAAK,EAAE;GAC9B,MAAM,MAAkB;IACtB,MAAM;IACN,OAAO,EAAE;IACT,GAAG,KAAK,OAAO;IAChB;AACD,QAAK,MAAM;AAEX,QAAK,MAAM,QAAQ,OAAO,MAAM;IAC9B,MAAM,MAAM,GAAG,GAAG,QAAQ;AAC1B,aAAS,KAAK;KACZ,GAAG;KACH;KACD,CAAC;AACF,QAAI,MAAM,KAAK;KACb,MAAM;KACN,OAAO;KACR,CAAC;;AAEJ;;AAGF,MAAI,OAAO,SAAS,OAAO,OAAO;GAChC,MAAM,MAAkB;IACtB,MAAM;IACN,OAAO,EAAE;IACT,GAAG,KAAK,OAAO;IAChB;AACD,QAAK,MAAM;AACX,QAAK,MAAM,QAAQ,CAAC,SAAS,QAAQ,EAAW;IAC9C,MAAM,QAAQ,GAAG,GAAG,QAAQ;AAC5B,aAAS,OAAO;KAAE,GAAG;MAAS,OAAO,KAAA;KAAW,CAAC;AAEjD,QAAI,MAAM,KAAK;KACb,MAAM,KAAK,OAAO;KAClB;KACD,CAAC;;AAEJ;;EAIF,MAAM,QAAQ,OAAO,SAAS,OAAO;AACrC,MAAI,OAAO;GACT,MAAM,MAAkB;IACtB,MAAM;IACN,OAAO,EAAE;IACT,GAAG,KAAK,OAAO;IAChB;AACD,QAAK,MAAM;AAEX,QAAK,MAAM,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,UAAU,KAAK,CAAE;IAC3D,MAAM,SAAS,YAAY,KAAK;IAChC,MAAM,MAAM,GAAG,GAAG,WAAW;AAE7B,aAAS,KAAK;KACZ,GAAG;KACH,OAAO,KAAA;KACP,OAAO,KAAA;KACP,GAAG;KACH,YAAY;MACV,GAAG,OAAO;MACV,GAAG,KAAK;MACT;KACF,CAAC;AACF,QAAI,MAAM,KAAK;KACb,OAAO;KACP,MAAM,KAAK,SAAS,aAAa,eAAe,MAAM,IAAI,QAAQ,YAAY,SAAS;KACxF,CAAC;;AAEJ;;AAGF,MAAI,OAAO,OAAO;AAChB,YAAS,IAAI,WAAW,OAAO,CAAC;AAChC;;AAGF,MAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,MAAkB;IACtB,MAAM;IACN,OAAO,EAAE;IACT,GAAG,KAAK,OAAO;IAChB;AACD,QAAK,MAAM;GAEX,MAAM,EAAE,aAAa,EAAE,EAAE,mBAAmB,yBAAyB;GACrE,MAAM,QAAQ,OAAO,QAAQ,WAAW;AACxC,OAAI,kBAAmB,OAAM,KAAK,GAAG,OAAO,QAAQ,kBAAkB,CAAC;AAEvE,QAAK,MAAM,CAAC,KAAK,SAAS,OAAO;AAC/B,QAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAE;IAC/B,MAAM,QAAQ,YAAY,KAAK;AAC/B,aAAS,OAAO,KAAK;AACrB,QAAI,MAAM,KAAK;KACb;KACA,MAAM;KACN,UAAU,OAAO,UAAU,SAAS,IAAI,IAAI;KAC7C,CAAC;;AAGJ,OAAI,wBAAwB,UAAU,qBAAqB,EAAE;IAC3D,MAAM,QAAQ,YAAY,qBAAqB;AAC/C,aAAS,OAAO,qBAAqB;AAErC,QAAI,MAAM,KAAK;KACb;KACA,MAAM;KACN,UAAU;KACX,CAAC;;AAEJ;;AAGF,MAAI,OAAO,SAAS,SAAS;GAC3B,MAAM,QAAQ,OAAO,SAAS;GAC9B,MAAM,QAAQ,YAAY,MAAM;AAEhC,QAAK,MAAM;IACT,MAAM;IACN,MAAM,EACJ,OACD;IACD,GAAG,KAAK,OAAO;IAChB;AACD,YAAS,OAAO,MAAM;AACtB;;AAGF,OAAK,MAAM;GACT,MAAM;GACN,GAAG,KAAK,OAAO;GAChB;;CAGH,MAAM,QAAQ,YAAY,KAAK;AAC/B,UAAS,OAAO,KAAK;AACrB,QAAO;EACL;EACA;EACD;;AAGH,SAAS,YACP,OACA,KACA,cACA,KACA,cACA;CACA,MAAM,MAAgB,EAAE;AACxB,KAAI,QAAQ,KAAA,EACV,KAAI,KAAK,GAAG,IAAI,KAAK;UACZ,iBAAiB,KAAA,EAC1B,KAAI,KAAK,GAAG,aAAa,IAAI;AAG/B,KAAI,KAAK,MAAM;AACf,KAAI,QAAQ,KAAA,EACV,KAAI,KAAK,MAAM,MAAM;UACZ,iBAAiB,KAAA,EAC1B,KAAI,KAAK,KAAK,eAAe;AAE/B,KAAI,IAAI,SAAS,EAAG,QAAO,IAAI,KAAK,IAAI"}
@@ -1,4 +1,4 @@
1
- import { NoReference } from "../schema.js";
1
+ import { NoReference } from "../schema/index.js";
2
2
  import { OpenAPIServer } from "../../server/create.js";
3
3
  import { OperationItem, WebhookItem } from "../../ui/api-page.js";
4
4
  import { OperationObject, PathItemObject, TagObject } from "../../types.js";
@@ -21,19 +21,20 @@ interface WebhookOutput extends BaseEntry {
21
21
  type: 'webhook';
22
22
  item: WebhookItem;
23
23
  }
24
- interface TagOutput extends BaseEntry {
25
- type: 'tag';
26
- tag: string;
27
- rawTag: TagObject;
24
+ interface PageOutput extends BaseEntry {
25
+ type: 'page';
28
26
  operations: OperationItem[];
29
27
  webhooks: WebhookItem[];
28
+ /** tag info if the page is generated from a tag. */
29
+ tag?: TagObject;
30
30
  }
31
31
  interface OutputGroup extends BaseEntry {
32
32
  type: 'group';
33
- operations: OperationItem[];
34
- webhooks: WebhookItem[];
33
+ entries: OutputEntry[];
34
+ /** tag info if the group is generated from a tag. */
35
+ tag?: TagObject;
35
36
  }
36
- type OutputEntry = TagOutput | OperationOutput | WebhookOutput | OutputGroup;
37
+ type OutputEntry = PageOutput | OperationOutput | WebhookOutput | OutputGroup;
37
38
  interface PagesBuilderConfig {
38
39
  toPages: (builder: PagesBuilder) => void;
39
40
  }
@@ -45,8 +46,6 @@ interface PagesBuilder {
45
46
  document: ProcessedDocument;
46
47
  /**
47
48
  * add output entry.
48
- *
49
- * When the `path` property is unspecified, it will generate one.
50
49
  */
51
50
  create: (entry: OutputEntry) => void;
52
51
  /**
@@ -86,5 +85,5 @@ interface ExtractedInfo {
86
85
  declare function fromServer(server: OpenAPIServer, config: PagesBuilderConfig): Promise<Record<string, OutputEntry[]>>;
87
86
  declare function fromSchema(schemaId: string, processed: ProcessedDocument, config: PagesBuilderConfig): OutputEntry[];
88
87
  //#endregion
89
- export { OperationOutput, OutputEntry, OutputGroup, PagesBuilder, PagesBuilderConfig, TagOutput, WebhookOutput, fromSchema, fromServer };
88
+ export { OperationOutput, OutputEntry, OutputGroup, PageOutput, PagesBuilder, PagesBuilderConfig, WebhookOutput, fromSchema, fromServer };
90
89
  //# sourceMappingURL=builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","names":[],"sources":["../../../src/utils/pages/builder.ts"],"mappings":";;;;;;;UAOU,SAAA;EACR,IAAA;EACA,QAAA;EACA,IAAA;IACE,KAAA;IACA,WAAA;EAAA;AAAA;AAAA,UAIa,eAAA,SAAwB,SAAA;EACvC,IAAA;EACA,IAAA,EAAM,aAAA;AAAA;AAAA,UAGS,aAAA,SAAsB,SAAA;EACrC,IAAA;EACA,IAAA,EAAM,WAAA;AAAA;AAAA,UAGS,SAAA,SAAkB,SAAA;EACjC,IAAA;EACA,GAAA;EACA,MAAA,EAAQ,SAAA;EACR,UAAA,EAAY,aAAA;EACZ,QAAA,EAAU,WAAA;AAAA;AAAA,UAGK,WAAA,SAAoB,SAAA;EACnC,IAAA;EACA,UAAA,EAAY,aAAA;EACZ,QAAA,EAAU,WAAA;AAAA;AAAA,KAGA,WAAA,GAAc,SAAA,GAAY,eAAA,GAAkB,aAAA,GAAgB,WAAA;AAAA,UAEvD,kBAAA;EACf,OAAA,GAAU,OAAA,EAAS,YAAA;AAAA;AAAA,UAGJ,YAAA;EAvBE;AAGnB;;EAwBE,EAAA;EACA,QAAA,EAAU,iBAAA;EArBE;;;;;EA2BZ,MAAA,GAAS,KAAA,EAAO,WAAA;EA9BhB;;;EAmCA,mBAAA,GAAsB,IAAA;EAhCtB;;;EAqCA,OAAA,QAAe,aAAA;EACf,oBAAA,GAAuB,IAAA,EAAM,WAAA;IAAA,IAEnB,WAAA;IACJ,QAAA,EAAU,WAAA,CAAY,cAAA;IACtB,SAAA,EAAW,WAAA,CAAY,eAAA;EAAA;EAG7B,sBAAA,GAAyB,IAAA,EAAM,aAAA;IAAA,IAErB,WAAA;IACJ,QAAA,EAAU,WAAA,CAAY,cAAA;IACtB,SAAA,EAAW,WAAA,CAAY,eAAA;EAAA;EAG7B,OAAA,GAAU,GAAA,EAAK,SAAA;IAAA,IACT,WAAA;EAAA;EAEN,WAAA,GAAc,GAAA;IAER,IAAA,EAAM,SAAA;IAAA,IACF,WAAA;EAAA;AAAA;AAAA,UAKF,aAAA;EACR,QAAA,GAAW,WAAA;IAAgB,IAAA;EAAA;EAC3B,UAAA,GAAa,aAAA;IACX,IAAA;EAAA;AAAA;AAAA,iBAIkB,UAAA,CACpB,MAAA,EAAQ,aAAA,EACR,MAAA,EAAQ,kBAAA,GACP,OAAA,CAAQ,MAAA,SAAe,WAAA;AAAA,iBAgBV,UAAA,CACd,QAAA,UACA,SAAA,EAAW,iBAAA,EACX,MAAA,EAAQ,kBAAA,GACP,WAAA"}
1
+ {"version":3,"file":"builder.d.ts","names":[],"sources":["../../../src/utils/pages/builder.ts"],"mappings":";;;;;;;UAOU,SAAA;EACR,IAAA;EACA,QAAA;EACA,IAAA;IACE,KAAA;IACA,WAAA;EAAA;AAAA;AAAA,UAIa,eAAA,SAAwB,SAAA;EACvC,IAAA;EACA,IAAA,EAAM,aAAA;AAAA;AAAA,UAGS,aAAA,SAAsB,SAAA;EACrC,IAAA;EACA,IAAA,EAAM,WAAA;AAAA;AAAA,UAGS,UAAA,SAAmB,SAAA;EAClC,IAAA;EACA,UAAA,EAAY,aAAA;EACZ,QAAA,EAAU,WAAA;EAXV;EAaA,GAAA,GAAM,SAAA;AAAA;AAAA,UAGS,WAAA,SAAoB,SAAA;EACnC,IAAA;EACA,OAAA,EAAS,WAAA;;EAET,GAAA,GAAM,SAAA;AAAA;AAAA,KAGI,WAAA,GAAc,UAAA,GAAa,eAAA,GAAkB,aAAA,GAAgB,WAAA;AAAA,UAExD,kBAAA;EACf,OAAA,GAAU,OAAA,EAAS,YAAA;AAAA;AAAA,UAGJ,YAAA;EArBA;;;EAyBf,EAAA;EACA,QAAA,EAAU,iBAAA;EArBJ;;;EAyBN,MAAA,GAAS,KAAA,EAAO,WAAA;EA9BkB;;;EAmClC,mBAAA,GAAsB,IAAA;EAhCtB;;;EAqCA,OAAA,QAAe,aAAA;EACf,oBAAA,GAAuB,IAAA,EAAM,WAAA;IAAA,IAEnB,WAAA;IACJ,QAAA,EAAU,WAAA,CAAY,cAAA;IACtB,SAAA,EAAW,WAAA,CAAY,eAAA;EAAA;EAG7B,sBAAA,GAAyB,IAAA,EAAM,aAAA;IAAA,IAErB,WAAA;IACJ,QAAA,EAAU,WAAA,CAAY,cAAA;IACtB,SAAA,EAAW,WAAA,CAAY,eAAA;EAAA;EAG7B,OAAA,GAAU,GAAA,EAAK,SAAA;IAAA,IACT,WAAA;EAAA;EAEN,WAAA,GAAc,GAAA;IAER,IAAA,EAAM,SAAA;IAAA,IACF,WAAA;EAAA;AAAA;AAAA,UAKF,aAAA;EACR,QAAA,GAAW,WAAA;IAAgB,IAAA;EAAA;EAC3B,UAAA,GAAa,aAAA;IACX,IAAA;EAAA;AAAA;AAAA,iBAIkB,UAAA,CACpB,MAAA,EAAQ,aAAA,EACR,MAAA,EAAQ,kBAAA,GACP,OAAA,CAAQ,MAAA,SAAe,WAAA;AAAA,iBAgBV,UAAA,CACd,QAAA,UACA,SAAA,EAAW,iBAAA,EACX,MAAA,EAAQ,kBAAA,GACP,WAAA"}