fumadocs-openapi 10.4.0 → 10.5.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 (48) hide show
  1. package/css/generated/shared.css +8 -3
  2. package/dist/generate-file.d.ts +11 -1
  3. package/dist/generate-file.d.ts.map +1 -1
  4. package/dist/generate-file.js +60 -26
  5. package/dist/generate-file.js.map +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/playground/client.d.ts +1 -1
  8. package/dist/playground/client.d.ts.map +1 -1
  9. package/dist/playground/client.js +5 -7
  10. package/dist/playground/client.js.map +1 -1
  11. package/dist/playground/schema.d.ts +0 -1
  12. package/dist/playground/schema.d.ts.map +1 -1
  13. package/dist/playground/schema.js +1 -1
  14. package/dist/requests/generators/index.d.ts +1 -1
  15. package/dist/requests/generators/index.js +2 -2
  16. package/dist/requests/generators/index.js.map +1 -1
  17. package/dist/requests/media/adapter.js +1 -1
  18. package/dist/requests/string-utils.js +1 -1
  19. package/dist/server/source-api.d.ts +7 -3
  20. package/dist/server/source-api.d.ts.map +1 -1
  21. package/dist/server/source-api.js +55 -5
  22. package/dist/server/source-api.js.map +1 -1
  23. package/dist/ui/api-page.d.ts +1 -0
  24. package/dist/ui/api-page.d.ts.map +1 -1
  25. package/dist/ui/base.d.ts +2 -2
  26. package/dist/ui/base.js.map +1 -1
  27. package/dist/ui/operation/index.js +4 -4
  28. package/dist/ui/operation/index.js.map +1 -1
  29. package/dist/ui/operation/request-tabs.d.ts +1 -0
  30. package/dist/ui/operation/request-tabs.d.ts.map +1 -1
  31. package/dist/ui/schema/client.d.ts +1 -0
  32. package/dist/ui/schema/client.d.ts.map +1 -1
  33. package/dist/ui/schema/index.d.ts +1 -0
  34. package/dist/ui/schema/index.d.ts.map +1 -1
  35. package/dist/utils/pages/builder.d.ts +9 -10
  36. package/dist/utils/pages/builder.d.ts.map +1 -1
  37. package/dist/utils/pages/builder.js +29 -30
  38. package/dist/utils/pages/builder.js.map +1 -1
  39. package/dist/utils/pages/preset-auto.d.ts +6 -5
  40. package/dist/utils/pages/preset-auto.d.ts.map +1 -1
  41. package/dist/utils/pages/preset-auto.js +97 -35
  42. package/dist/utils/pages/preset-auto.js.map +1 -1
  43. package/dist/utils/pages/to-text.d.ts.map +1 -1
  44. package/dist/utils/pages/to-text.js +4 -12
  45. package/dist/utils/pages/to-text.js.map +1 -1
  46. package/package.json +8 -8
  47. package/dist/utils/pages/to-body.js +0 -22
  48. package/dist/utils/pages/to-body.js.map +0 -1
@@ -2,7 +2,7 @@ import { OpenAPIServer } from "./create.js";
2
2
  import { ApiPageProps } from "../ui/api-page.js";
3
3
  import { SchemaToPagesOptions } from "../utils/pages/preset-auto.js";
4
4
  import { ProcessedDocument } from "../utils/process-document.js";
5
- import { LoaderPlugin, PageData, PageTreeTransformer, Source } from "fumadocs-core/source";
5
+ import { LoaderPlugin, MetaData, PageData, PageTreeTransformer, Source } from "fumadocs-core/source";
6
6
  import { StructuredData } from "fumadocs-core/mdx-plugins";
7
7
  import { TOCItemType } from "fumadocs-core/toc";
8
8
 
@@ -31,13 +31,17 @@ interface OpenAPIPageData extends PageData {
31
31
  structuredData: StructuredData;
32
32
  toc: TOCItemType[];
33
33
  }
34
+ interface MetaOptions {
35
+ folderStyle?: 'folder' | 'separator';
36
+ }
34
37
  /**
35
38
  * Generate virtual pages for Fumadocs Source API
36
39
  */
37
40
  declare function openapiSource(server: OpenAPIServer, options?: SchemaToPagesOptions & {
38
- baseDir?: string;
41
+ baseDir?: string; /** Generate `meta.json` files */
42
+ meta?: boolean | MetaOptions;
39
43
  }): Promise<Source<{
40
- metaData: never;
44
+ metaData: MetaData;
41
45
  pageData: OpenAPIPageData;
42
46
  }>>;
43
47
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"source-api.d.ts","names":[],"sources":["../../src/server/source-api.tsx"],"mappings":";;;;;;;;;;YAgBmB,QAAA;IAH+C;;;IAO9D,QAAA,GAAW,mBAAA;EAAA;AAAA;AAAA,UAIE,mBAAA;EACf,MAAA;EACA,OAAA;AAAA;AAFF;;;AAAA,iBAQgB,aAAA,CAAA,GAAiB,YAAA;AAAA,UAuCvB,eAAA,SAAwB,QAAA;EAChC,eAAA,QAAuB,YAAA;EACvB,SAAA;IAAmB,EAAA;EAAA,IAAe,iBAAA;EAClC,cAAA,EAAgB,cAAA;EAChB,GAAA,EAAK,WAAA;AAAA;;;;iBAMe,aAAA,CACpB,MAAA,EAAQ,aAAA,EACR,OAAA,GAAS,oBAAA;EACP,OAAA;AAAA,IAED,OAAA,CACD,MAAA;EACE,QAAA;EACA,QAAA,EAAU,eAAA;AAAA;;;;iBAuDE,kBAAA,CAAA,GAAsB,mBAAA"}
1
+ {"version":3,"file":"source-api.d.ts","names":[],"sources":["../../src/server/source-api.tsx"],"mappings":";;;;;;;;;;YAyBmB,QAAA;IAV+C;;;IAc9D,QAAA,GAAW,mBAAA;EAAA;AAAA;AAAA,UAIE,mBAAA;EACf,MAAA;EACA,OAAA;AAAA;AAFF;;;AAAA,iBAQgB,aAAA,CAAA,GAAiB,YAAA;AAAA,UAuCvB,eAAA,SAAwB,QAAA;EAChC,eAAA,QAAuB,YAAA;EACvB,SAAA;IAAmB,EAAA;EAAA,IAAe,iBAAA;EAClC,cAAA,EAAgB,cAAA;EAChB,GAAA,EAAK,WAAA;AAAA;AAAA,UAGG,WAAA;EACR,WAAA;AAAA;;;;iBAMoB,aAAA,CACpB,MAAA,EAAQ,aAAA,EACR,OAAA,GAAS,oBAAA;EACP,OAAA,WAjB8B;EAmB9B,IAAA,aAAiB,WAAA;AAAA,IAElB,OAAA,CACD,MAAA;EACE,QAAA,EAAU,QAAA;EACV,QAAA,EAAU,eAAA;AAAA;;;;iBA6HE,kBAAA,CAAA,GAAsB,mBAAA"}
@@ -1,4 +1,6 @@
1
1
  import { MethodLabel } from "../ui/components/method-label.js";
2
+ import path from "node:path";
3
+ import { PathUtils } from "fumadocs-core/source";
2
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
5
  //#region src/server/source-api.tsx
4
6
  /**
@@ -38,18 +40,16 @@ function openapiPlugin() {
38
40
  * Generate virtual pages for Fumadocs Source API
39
41
  */
40
42
  async function openapiSource(server, options = {}) {
41
- const { baseDir = "" } = options;
43
+ const { baseDir = "", meta = false } = options;
42
44
  const { createAutoPreset } = await import("../utils/pages/preset-auto.js");
43
45
  const { fromServer } = await import("../utils/pages/builder.js");
44
- const { toBody } = await import("../utils/pages/to-body.js");
45
46
  const { toStaticData } = await import("../utils/pages/to-static-data.js");
46
47
  const files = [];
47
48
  const entries = await fromServer(server, createAutoPreset(options));
48
49
  for (const [schemaId, list] of Object.entries(entries)) {
49
50
  const processed = await server.getSchema(schemaId);
50
- for (const entry of list) {
51
- const props = toBody(entry);
52
- props.showDescription ??= true;
51
+ function onEntry(entry) {
52
+ const props = getProps(entry);
53
53
  files.push({
54
54
  type: "page",
55
55
  path: `${baseDir}/${entry.path}`,
@@ -72,9 +72,59 @@ async function openapiSource(server, options = {}) {
72
72
  }
73
73
  });
74
74
  }
75
+ function onEntries(entries, parent) {
76
+ if (!meta) {
77
+ for (const entry of entries) if (entry.type === "group") onEntries(entry.entries, entry);
78
+ else onEntry(entry);
79
+ return;
80
+ }
81
+ const { folderStyle = "folder" } = meta === true ? {} : meta;
82
+ const pages = [];
83
+ for (const entry of entries) {
84
+ const relativePath = PathUtils.slash(parent ? path.relative(parent.path, entry.path) : entry.path);
85
+ if (entry.type === "group") {
86
+ onEntries(entry.entries, entry);
87
+ if (folderStyle === "folder") pages.push(relativePath);
88
+ else pages.push(`---${entry.info.title}---`, `...${relativePath}`);
89
+ } else {
90
+ onEntry(entry);
91
+ pages.push(relativePath.slice(0, -path.extname(entry.path).length));
92
+ }
93
+ }
94
+ if (pages.length === 0) return;
95
+ files.push({
96
+ type: "meta",
97
+ path: path.join(baseDir, parent?.path ?? "", "meta.json"),
98
+ data: {
99
+ title: parent?.info.title,
100
+ description: parent?.info.description,
101
+ pages
102
+ }
103
+ });
104
+ }
105
+ onEntries(list);
75
106
  }
76
107
  return { files };
77
108
  }
109
+ function getProps(entry) {
110
+ if (entry.type === "operation") return {
111
+ document: entry.schemaId,
112
+ operations: [entry.item],
113
+ showDescription: true
114
+ };
115
+ if (entry.type === "webhook") return {
116
+ document: entry.schemaId,
117
+ webhooks: [entry.item],
118
+ showDescription: true
119
+ };
120
+ return {
121
+ showTitle: true,
122
+ showDescription: true,
123
+ document: entry.schemaId,
124
+ operations: entry.operations,
125
+ webhooks: entry.webhooks
126
+ };
127
+ }
78
128
  /**
79
129
  * @deprecated use `openapiPlugin()`
80
130
  */
@@ -1 +1 @@
1
- {"version":3,"file":"source-api.js","names":[],"sources":["../../src/server/source-api.tsx"],"sourcesContent":["import { MethodLabel } from '@/ui/components/method-label';\nimport type {\n LoaderPlugin,\n PageData,\n PageTreeTransformer,\n Source,\n VirtualFile,\n} from 'fumadocs-core/source';\nimport type { OpenAPIServer } from '@/server/create';\nimport type { SchemaToPagesOptions } from '@/utils/pages/preset-auto';\nimport type { ApiPageProps } from '@/ui/api-page';\nimport type { StructuredData } from 'fumadocs-core/mdx-plugins';\nimport type { TOCItemType } from 'fumadocs-core/toc';\nimport type { ProcessedDocument } from '@/utils/process-document';\n\ndeclare module 'fumadocs-core/source' {\n export interface PageData {\n /**\n * Added by Fumadocs OpenAPI\n */\n _openapi?: InternalOpenAPIMeta;\n }\n}\n\nexport interface InternalOpenAPIMeta {\n method?: string;\n webhook?: boolean;\n}\n\n/**\n * Fumadocs Source API integration, pass this to `plugins` array in `loader()`.\n */\nexport function openapiPlugin(): LoaderPlugin {\n return {\n name: 'fumadocs:openapi',\n enforce: 'pre',\n transformPageTree: {\n file(node, filePath) {\n if (!filePath) return node;\n const file = this.storage.read(filePath);\n if (!file || file.format !== 'page') return node;\n\n const openApiData = file.data._openapi;\n if (!openApiData || typeof openApiData !== 'object') return node;\n\n if (openApiData.webhook) {\n node.name = (\n <>\n {node.name}{' '}\n <span className=\"ms-auto border border-current px-1 rounded-lg text-xs text-nowrap font-mono\">\n Webhook\n </span>\n </>\n );\n } else if (openApiData.method) {\n node.name = (\n <>\n {node.name}{' '}\n <MethodLabel className=\"ms-auto text-xs text-nowrap\">\n {openApiData.method}\n </MethodLabel>\n </>\n );\n }\n\n return node;\n },\n },\n };\n}\n\ninterface OpenAPIPageData extends PageData {\n getAPIPageProps: () => ApiPageProps;\n getSchema: () => { id: string } & ProcessedDocument;\n structuredData: StructuredData;\n toc: TOCItemType[];\n}\n\n/**\n * Generate virtual pages for Fumadocs Source API\n */\nexport async function openapiSource(\n server: OpenAPIServer,\n options: SchemaToPagesOptions & {\n baseDir?: string;\n } = {},\n): Promise<\n Source<{\n metaData: never;\n pageData: OpenAPIPageData;\n }>\n> {\n const { baseDir = '' } = options;\n const { createAutoPreset } = await import('@/utils/pages/preset-auto');\n const { fromServer } = await import('@/utils/pages/builder');\n const { toBody } = await import('@/utils/pages/to-body');\n const { toStaticData } = await import('@/utils/pages/to-static-data');\n const files: VirtualFile<{\n pageData: OpenAPIPageData;\n metaData: never;\n }>[] = [];\n\n const entries = await fromServer(server, createAutoPreset(options));\n for (const [schemaId, list] of Object.entries(entries)) {\n const processed = await server.getSchema(schemaId);\n for (const entry of list) {\n const props = toBody(entry);\n props.showDescription ??= true;\n\n files.push({\n type: 'page',\n path: `${baseDir}/${entry.path}`,\n data: {\n ...entry.info,\n getAPIPageProps() {\n return props;\n },\n getSchema() {\n return {\n id: schemaId,\n ...processed,\n };\n },\n ...toStaticData(props, processed.dereferenced),\n _openapi: {\n method:\n entry.type === 'operation' || entry.type === 'webhook'\n ? entry.item.method\n : undefined,\n webhook: entry.type === 'webhook',\n },\n },\n });\n }\n }\n\n return {\n files,\n };\n}\n\n/**\n * @deprecated use `openapiPlugin()`\n */\nexport function transformerOpenAPI(): PageTreeTransformer {\n return openapiPlugin().transformPageTree!;\n}\n"],"mappings":";;;;;;AAgCA,SAAgB,gBAA8B;AAC5C,QAAO;EACL,MAAM;EACN,SAAS;EACT,mBAAmB,EACjB,KAAK,MAAM,UAAU;AACnB,OAAI,CAAC,SAAU,QAAO;GACtB,MAAM,OAAO,KAAK,QAAQ,KAAK,SAAS;AACxC,OAAI,CAAC,QAAQ,KAAK,WAAW,OAAQ,QAAO;GAE5C,MAAM,cAAc,KAAK,KAAK;AAC9B,OAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO;AAE5D,OAAI,YAAY,QACd,MAAK,OACH,qBAAA,UAAA,EAAA,UAAA;IACG,KAAK;IAAM;IACZ,oBAAC,QAAD;KAAM,WAAU;eAA8E;KAEvF,CAAA;IACN,EAAA,CAAA;YAEI,YAAY,OACrB,MAAK,OACH,qBAAA,UAAA,EAAA,UAAA;IACG,KAAK;IAAM;IACZ,oBAAC,aAAD;KAAa,WAAU;eACpB,YAAY;KACD,CAAA;IACb,EAAA,CAAA;AAIP,UAAO;KAEV;EACF;;;;;AAaH,eAAsB,cACpB,QACA,UAEI,EAAE,EAMN;CACA,MAAM,EAAE,UAAU,OAAO;CACzB,MAAM,EAAE,qBAAqB,MAAM,OAAO;CAC1C,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,MAAM,EAAE,WAAW,MAAM,OAAO;CAChC,MAAM,EAAE,iBAAiB,MAAM,OAAO;CACtC,MAAM,QAGC,EAAE;CAET,MAAM,UAAU,MAAM,WAAW,QAAQ,iBAAiB,QAAQ,CAAC;AACnE,MAAK,MAAM,CAAC,UAAU,SAAS,OAAO,QAAQ,QAAQ,EAAE;EACtD,MAAM,YAAY,MAAM,OAAO,UAAU,SAAS;AAClD,OAAK,MAAM,SAAS,MAAM;GACxB,MAAM,QAAQ,OAAO,MAAM;AAC3B,SAAM,oBAAoB;AAE1B,SAAM,KAAK;IACT,MAAM;IACN,MAAM,GAAG,QAAQ,GAAG,MAAM;IAC1B,MAAM;KACJ,GAAG,MAAM;KACT,kBAAkB;AAChB,aAAO;;KAET,YAAY;AACV,aAAO;OACL,IAAI;OACJ,GAAG;OACJ;;KAEH,GAAG,aAAa,OAAO,UAAU,aAAa;KAC9C,UAAU;MACR,QACE,MAAM,SAAS,eAAe,MAAM,SAAS,YACzC,MAAM,KAAK,SACX,KAAA;MACN,SAAS,MAAM,SAAS;MACzB;KACF;IACF,CAAC;;;AAIN,QAAO,EACL,OACD;;;;;AAMH,SAAgB,qBAA0C;AACxD,QAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"source-api.js","names":[],"sources":["../../src/server/source-api.tsx"],"sourcesContent":["import { MethodLabel } from '@/ui/components/method-label';\nimport {\n PathUtils,\n type LoaderPlugin,\n type MetaData,\n type PageData,\n type PageTreeTransformer,\n type Source,\n type VirtualFile,\n} from 'fumadocs-core/source';\nimport type { OpenAPIServer } from '@/server/create';\nimport type { SchemaToPagesOptions } from '@/utils/pages/preset-auto';\nimport type { ApiPageProps } from '@/ui/api-page';\nimport type { StructuredData } from 'fumadocs-core/mdx-plugins';\nimport type { TOCItemType } from 'fumadocs-core/toc';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport type {\n OperationOutput,\n OutputEntry,\n PageOutput,\n WebhookOutput,\n} from '@/utils/pages/builder';\nimport path from 'node:path';\n\ndeclare module 'fumadocs-core/source' {\n export interface PageData {\n /**\n * Added by Fumadocs OpenAPI\n */\n _openapi?: InternalOpenAPIMeta;\n }\n}\n\nexport interface InternalOpenAPIMeta {\n method?: string;\n webhook?: boolean;\n}\n\n/**\n * Fumadocs Source API integration, pass this to `plugins` array in `loader()`.\n */\nexport function openapiPlugin(): LoaderPlugin {\n return {\n name: 'fumadocs:openapi',\n enforce: 'pre',\n transformPageTree: {\n file(node, filePath) {\n if (!filePath) return node;\n const file = this.storage.read(filePath);\n if (!file || file.format !== 'page') return node;\n\n const openApiData = file.data._openapi;\n if (!openApiData || typeof openApiData !== 'object') return node;\n\n if (openApiData.webhook) {\n node.name = (\n <>\n {node.name}{' '}\n <span className=\"ms-auto border border-current px-1 rounded-lg text-xs text-nowrap font-mono\">\n Webhook\n </span>\n </>\n );\n } else if (openApiData.method) {\n node.name = (\n <>\n {node.name}{' '}\n <MethodLabel className=\"ms-auto text-xs text-nowrap\">\n {openApiData.method}\n </MethodLabel>\n </>\n );\n }\n\n return node;\n },\n },\n };\n}\n\ninterface OpenAPIPageData extends PageData {\n getAPIPageProps: () => ApiPageProps;\n getSchema: () => { id: string } & ProcessedDocument;\n structuredData: StructuredData;\n toc: TOCItemType[];\n}\n\ninterface MetaOptions {\n folderStyle?: 'folder' | 'separator';\n}\n\n/**\n * Generate virtual pages for Fumadocs Source API\n */\nexport async function openapiSource(\n server: OpenAPIServer,\n options: SchemaToPagesOptions & {\n baseDir?: string;\n /** Generate `meta.json` files */\n meta?: boolean | MetaOptions;\n } = {},\n): Promise<\n Source<{\n metaData: MetaData;\n pageData: OpenAPIPageData;\n }>\n> {\n const { baseDir = '', meta = false } = options;\n const { createAutoPreset } = await import('@/utils/pages/preset-auto');\n const { fromServer } = await import('@/utils/pages/builder');\n const { toStaticData } = await import('@/utils/pages/to-static-data');\n const files: VirtualFile<{\n pageData: OpenAPIPageData;\n metaData: MetaData;\n }>[] = [];\n\n const entries = await fromServer(server, createAutoPreset(options));\n for (const [schemaId, list] of Object.entries(entries)) {\n const processed = await server.getSchema(schemaId);\n\n function onEntry(entry: PageOutput | OperationOutput | WebhookOutput) {\n const props = getProps(entry);\n\n files.push({\n type: 'page',\n path: `${baseDir}/${entry.path}`,\n data: {\n ...entry.info,\n getAPIPageProps() {\n return props;\n },\n getSchema() {\n return {\n id: schemaId,\n ...processed,\n };\n },\n ...toStaticData(props, processed.dereferenced),\n _openapi: {\n method:\n entry.type === 'operation' || entry.type === 'webhook'\n ? entry.item.method\n : undefined,\n webhook: entry.type === 'webhook',\n },\n },\n });\n }\n\n function onEntries(entries: OutputEntry[], parent?: OutputEntry) {\n if (!meta) {\n for (const entry of entries) {\n if (entry.type === 'group') {\n onEntries(entry.entries, entry);\n } else {\n onEntry(entry);\n }\n }\n\n return;\n }\n\n const { folderStyle = 'folder' } = meta === true ? {} : meta;\n const pages: string[] = [];\n\n for (const entry of entries) {\n const relativePath = PathUtils.slash(\n parent ? path.relative(parent.path, entry.path) : entry.path,\n );\n\n if (entry.type === 'group') {\n onEntries(entry.entries, entry);\n if (folderStyle === 'folder') {\n pages.push(relativePath);\n } else {\n pages.push(`---${entry.info.title}---`, `...${relativePath}`);\n }\n } else {\n onEntry(entry);\n pages.push(relativePath.slice(0, -path.extname(entry.path).length));\n }\n }\n\n if (pages.length === 0) return;\n files.push({\n type: 'meta',\n path: path.join(baseDir, parent?.path ?? '', 'meta.json'),\n data: {\n title: parent?.info.title,\n description: parent?.info.description,\n pages,\n },\n });\n }\n\n onEntries(list);\n }\n\n return {\n files,\n };\n}\n\nfunction getProps(entry: PageOutput | OperationOutput | WebhookOutput): ApiPageProps {\n if (entry.type === 'operation')\n return {\n document: entry.schemaId,\n operations: [entry.item],\n showDescription: true,\n };\n if (entry.type === 'webhook')\n return {\n document: entry.schemaId,\n webhooks: [entry.item],\n showDescription: true,\n };\n\n return {\n showTitle: true,\n showDescription: true,\n document: entry.schemaId,\n operations: entry.operations,\n webhooks: entry.webhooks,\n };\n}\n\n/**\n * @deprecated use `openapiPlugin()`\n */\nexport function transformerOpenAPI(): PageTreeTransformer {\n return openapiPlugin().transformPageTree!;\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { HttpMethods } from "../types.js";
2
2
  import { ProcessedDocument } from "../utils/process-document.js";
3
+
3
4
  //#region src/ui/api-page.d.ts
4
5
  interface ApiPageProps {
5
6
  document: Promise<ProcessedDocument> | string | ProcessedDocument;
@@ -1 +1 @@
1
- {"version":3,"file":"api-page.d.ts","names":[],"sources":["../../src/ui/api-page.tsx"],"mappings":";;;UAMiB,YAAA;EACf,QAAA,EAAU,OAAA,CAAQ,iBAAA,aAA8B,iBAAA;EAChD,SAAA;EACA,eAAA;EAH2B;;;EAQ3B,UAAA,GAAa,aAAA;EAEb,QAAA,GAAW,WAAA;AAAA;AAAA,UAGI,WAAA;EAHO;;;EAOtB,IAAA;EACA,MAAA,EAAQ,WAAA;AAAA;AAAA,UAGO,aAAA;EAlBf;;;EAsBA,IAAA;EAfW;;;EAmBX,MAAA,EAAQ,WAAA;AAAA"}
1
+ {"version":3,"file":"api-page.d.ts","names":[],"sources":["../../src/ui/api-page.tsx"],"mappings":";;;;UAMiB,YAAA;EACf,QAAA,EAAU,OAAA,CAAQ,iBAAA,aAA8B,iBAAA;EAChD,SAAA;EACA,eAAA;;;;EAKA,UAAA,GAAa,aAAA;EAEb,QAAA,GAAW,WAAA;AAAA;AAAA,UAGI,WAAA;EAHO;;;EAOtB,IAAA;EACA,MAAA,EAAQ,WAAA;AAAA;AAAA,UAGO,aAAA;EAbf;;;EAiBA,IAAA;EAfsB;;AAGxB;EAgBE,MAAA,EAAQ,WAAA;AAAA"}
package/dist/ui/base.d.ts CHANGED
@@ -100,7 +100,7 @@ interface CreateAPIPageOptions {
100
100
  apiExample: ReactNode;
101
101
  apiPlayground: ReactNode;
102
102
  authSchemes: ReactNode;
103
- paremeters: ReactNode;
103
+ parameters: ReactNode;
104
104
  body: ReactNode;
105
105
  responses: ReactNode;
106
106
  callbacks: ReactNode;
@@ -109,7 +109,7 @@ interface CreateAPIPageOptions {
109
109
  header: ReactNode;
110
110
  description: ReactNode;
111
111
  authSchemes: ReactNode;
112
- paremeters: ReactNode;
112
+ parameters: ReactNode;
113
113
  body: ReactNode;
114
114
  requests: ReactNode;
115
115
  responses: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","names":[],"sources":["../../src/ui/base.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- rehype-react without types */\nimport Slugger from 'github-slugger';\nimport type { Awaitable, MethodInformation, RenderContext } from '@/types';\nimport type { NoReference } from '@/utils/schema';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport { defaultAdapters, MediaAdapter } from '@/requests/media/adapter';\nimport type { FC, HTMLAttributes, ReactNode } from 'react';\nimport type { OpenAPIServer } from '@/server';\nimport type { APIPageClientOptions } from './client';\nimport { Heading } from 'fumadocs-ui/components/heading';\nimport { createRehypeCode } from 'fumadocs-core/mdx-plugins/rehype-code.core';\nimport { remarkGfm } from 'fumadocs-core/mdx-plugins/remark-gfm';\nimport defaultMdxComponents from 'fumadocs-ui/mdx';\nimport { remark } from 'remark';\nimport remarkRehype from 'remark-rehype';\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport { CodeBlock, Pre } from 'fumadocs-ui/components/codeblock';\nimport type { SchemaUIOptions } from './schema';\nimport type { ResponseTab } from './operation/response-tabs';\nimport type { ExampleRequestItem } from './operation/request-tabs';\nimport { APIPage, type ApiPageProps, type OperationItem, type WebhookItem } from './api-page';\nimport type { CodeUsageGeneratorRegistry, InlineCodeUsageGenerator } from '@/requests/generators';\nimport type { JSONSchema } from 'json-schema-typed';\nimport type { BundledTheme, CodeOptionsThemes, CodeToHastOptionsCommon } from 'shiki';\nimport { highlightHast, type ShikiFactory } from 'fumadocs-core/highlight/shiki';\n\nexport interface GenerateTypeScriptDefinitionsContext extends RenderContext {\n operation: NoReference<MethodInformation>;\n readOnly: boolean;\n writeOnly: boolean;\n /** @deprecated */\n _internal_legacy?: {\n statusCode: string;\n contentType: string;\n };\n}\n\nexport interface CreateAPIPageOptions {\n /**\n * Generate TypeScript definitions from response schema.\n *\n * Pass `false` to disable it.\n *\n * @param method - the operation object\n * @param statusCode - status code\n * @deprecated use `generateTypeScriptDefinitions` instead.\n */\n generateTypeScriptSchema?:\n | ((\n method: NoReference<MethodInformation>,\n statusCode: string,\n contentType: string,\n ctx: RenderContext,\n ) => Awaitable<string | undefined>)\n | false;\n\n /**\n * Generate TypeScript definitions from JSON schema.\n *\n * Pass `false` to disable it.\n */\n generateTypeScriptDefinitions?: (\n schema: JSONSchema,\n ctx: GenerateTypeScriptDefinitionsContext,\n ) => Awaitable<string | undefined>;\n\n /**\n * Generate example code usage for all endpoints.\n */\n codeUsages?: CodeUsageGeneratorRegistry;\n\n /**\n * Generate example code usage for each endpoint.\n */\n generateCodeSamples?: (method: MethodInformation) => Awaitable<InlineCodeUsageGenerator[]>;\n\n shiki: ShikiFactory;\n renderMarkdown?: (md: string) => ReactNode;\n shikiOptions: Omit<CodeToHastOptionsCommon, 'lang'> & CodeOptionsThemes<BundledTheme>;\n\n /**\n * Show full response schema instead of only example response & Typescript definitions.\n *\n * @default true\n */\n showResponseSchema?: boolean;\n\n /**\n * Support other media types (for server-side generation).\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n\n /**\n * Customise page content\n */\n content?: {\n renderResponseTabs?: (tabs: ResponseTab[], ctx: RenderContext) => Awaitable<ReactNode>;\n\n renderRequestTabs?: (\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n ) => Awaitable<ReactNode>;\n\n renderAPIExampleLayout?: (\n slots: {\n selector: ReactNode;\n usageTabs: ReactNode;\n responseTabs: ReactNode;\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * @param generators - codegens for API example usages\n */\n renderAPIExampleUsageTabs?: (\n generators: CodeUsageGeneratorRegistry,\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * renderer of the entire page's layout (containing all operations & webhooks UI)\n */\n renderPageLayout?: (\n slots: {\n operations?: {\n item: OperationItem;\n children: ReactNode;\n }[];\n webhooks?: {\n item: WebhookItem;\n children: ReactNode;\n }[];\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n renderOperationLayout?: (\n slots: {\n header: ReactNode;\n description: ReactNode;\n apiExample: ReactNode;\n apiPlayground: ReactNode;\n\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n },\n ctx: RenderContext,\n method: NoReference<MethodInformation>,\n ) => Awaitable<ReactNode>;\n\n renderWebhookLayout?: (slots: {\n header: ReactNode;\n description: ReactNode;\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n requests: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n }) => Awaitable<ReactNode>;\n };\n\n /**\n * Info UI for JSON schemas\n */\n schemaUI?: {\n render?: (options: SchemaUIOptions, ctx: RenderContext) => Awaitable<ReactNode>;\n\n /**\n * Show examples under the generated content of JSON schemas.\n *\n * @defaultValue false\n */\n showExample?: boolean;\n };\n\n /**\n * Customise API playground\n */\n playground?: {\n /**\n * @defaultValue true\n */\n enabled?: boolean;\n /**\n * replace the server-side renderer\n */\n render?: (props: {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n }) => Awaitable<ReactNode>;\n };\n\n renderHeading?: (\n props: HTMLAttributes<HTMLHeadingElement>,\n depth: number,\n ) => Awaitable<ReactNode>;\n renderCodeBlock?: (props: { lang: string; code: string }) => Awaitable<ReactNode>;\n\n client?: APIPageClientOptions;\n}\n\nexport function createAPIPage(\n server: OpenAPIServer,\n options: CreateAPIPageOptions,\n): FC<ApiPageProps> {\n let processor: ReturnType<typeof createMarkdownProcessor>;\n\n function createMarkdownProcessor() {\n function rehypeReact(this: any) {\n this.compiler = (tree: any, file: any) => {\n return toJsxRuntime(tree, {\n development: false,\n filePath: file.path,\n ...JsxRuntime,\n components: defaultMdxComponents,\n });\n };\n }\n\n return remark()\n .use(remarkGfm)\n .use(remarkRehype)\n .use(createRehypeCode(options.shiki), {\n langs: [],\n lazy: true,\n defaultColor: false,\n ...options.shikiOptions,\n })\n .use(rehypeReact);\n }\n\n return async function APIPageWrapper({ document, ...props }) {\n let processed: ProcessedDocument;\n if (typeof document === 'string') {\n processed = await server.getSchema(document);\n } else {\n processed = await document;\n }\n\n const slugger = new Slugger();\n\n const ctx: RenderContext = {\n schema: processed,\n proxyUrl: server.options.proxyUrl,\n ...options,\n mediaAdapters: {\n ...defaultAdapters,\n ...options.mediaAdapters,\n },\n slugger,\n async renderHeading(depth, text, props) {\n const id = typeof text === 'string' ? slugger.slug(text) : props?.id;\n if (!id) throw new Error(\"missing 'id' for non-string children\");\n\n if (options.renderHeading) {\n return options.renderHeading({ id, children: text, ...props }, depth);\n }\n\n return (\n <Heading id={id} key={id} as={`h${depth}` as `h1`} {...props}>\n {text}\n </Heading>\n );\n },\n generateTypeScriptDefinitions(schema, ctx) {\n const { generateTypeScriptSchema, generateTypeScriptDefinitions } = options;\n if (generateTypeScriptSchema && ctx._internal_legacy) {\n const { statusCode, contentType } = ctx._internal_legacy;\n return generateTypeScriptSchema(ctx.operation, statusCode, contentType, ctx);\n }\n\n return generateTypeScriptDefinitions?.(schema, ctx);\n },\n async renderMarkdown(text) {\n if (options.renderMarkdown) return options.renderMarkdown(text);\n processor ??= createMarkdownProcessor();\n\n const out = await processor.process({\n value: text,\n });\n\n return out.result as ReactNode;\n },\n async renderCodeBlock(lang, code) {\n if (options.renderCodeBlock) {\n return options.renderCodeBlock({ lang, code });\n }\n\n const hast = await highlightHast(await options.shiki.getOrInit(), code, {\n lang,\n defaultColor: false,\n ...options.shikiOptions,\n });\n const rendered = toJsxRuntime(hast, {\n ...JsxRuntime,\n components: {\n pre: Pre,\n },\n });\n\n return <CodeBlock className=\"my-0\">{rendered}</CodeBlock>;\n },\n };\n\n return <APIPage {...props} ctx={ctx} />;\n };\n}\n\nexport { ClientCodeBlockProvider } from './components/codeblock';\n"],"mappings":";;;;;;;;;;;;;;;;AAmNA,SAAgB,cACd,QACA,SACkB;CAClB,IAAI;CAEJ,SAAS,0BAA0B;EACjC,SAAS,cAAuB;AAC9B,QAAK,YAAY,MAAW,SAAc;AACxC,WAAO,aAAa,MAAM;KACxB,aAAa;KACb,UAAU,KAAK;KACf,GAAG;KACH,YAAY;KACb,CAAC;;;AAIN,SAAO,QAAQ,CACZ,IAAI,UAAU,CACd,IAAI,aAAa,CACjB,IAAI,iBAAiB,QAAQ,MAAM,EAAE;GACpC,OAAO,EAAE;GACT,MAAM;GACN,cAAc;GACd,GAAG,QAAQ;GACZ,CAAC,CACD,IAAI,YAAY;;AAGrB,QAAO,eAAe,eAAe,EAAE,UAAU,GAAG,SAAS;EAC3D,IAAI;AACJ,MAAI,OAAO,aAAa,SACtB,aAAY,MAAM,OAAO,UAAU,SAAS;MAE5C,aAAY,MAAM;EAGpB,MAAM,UAAU,IAAI,SAAS;EAE7B,MAAM,MAAqB;GACzB,QAAQ;GACR,UAAU,OAAO,QAAQ;GACzB,GAAG;GACH,eAAe;IACb,GAAG;IACH,GAAG,QAAQ;IACZ;GACD;GACA,MAAM,cAAc,OAAO,MAAM,OAAO;IACtC,MAAM,KAAK,OAAO,SAAS,WAAW,QAAQ,KAAK,KAAK,GAAG,OAAO;AAClE,QAAI,CAAC,GAAI,OAAM,IAAI,MAAM,uCAAuC;AAEhE,QAAI,QAAQ,cACV,QAAO,QAAQ,cAAc;KAAE;KAAI,UAAU;KAAM,GAAG;KAAO,EAAE,MAAM;AAGvE,WACE,oBAAC,SAAD;KAAa;KAAa,IAAI,IAAI;KAAiB,GAAI;eACpD;KACO,EAFY,GAEZ;;GAGd,8BAA8B,QAAQ,KAAK;IACzC,MAAM,EAAE,0BAA0B,kCAAkC;AACpE,QAAI,4BAA4B,IAAI,kBAAkB;KACpD,MAAM,EAAE,YAAY,gBAAgB,IAAI;AACxC,YAAO,yBAAyB,IAAI,WAAW,YAAY,aAAa,IAAI;;AAG9E,WAAO,gCAAgC,QAAQ,IAAI;;GAErD,MAAM,eAAe,MAAM;AACzB,QAAI,QAAQ,eAAgB,QAAO,QAAQ,eAAe,KAAK;AAC/D,kBAAc,yBAAyB;AAMvC,YAJY,MAAM,UAAU,QAAQ,EAClC,OAAO,MACR,CAAC,EAES;;GAEb,MAAM,gBAAgB,MAAM,MAAM;AAChC,QAAI,QAAQ,gBACV,QAAO,QAAQ,gBAAgB;KAAE;KAAM;KAAM,CAAC;AAehD,WAAO,oBAAC,WAAD;KAAW,WAAU;eAPX,aALJ,MAAM,cAAc,MAAM,QAAQ,MAAM,WAAW,EAAE,MAAM;MACtE;MACA,cAAc;MACd,GAAG,QAAQ;MACZ,CAAC,EACkC;MAClC,GAAG;MACH,YAAY,EACV,KAAK,KACN;MACF,CAAC;KAEuD,CAAA;;GAE5D;AAED,SAAO,oBAAC,SAAD;GAAS,GAAI;GAAY;GAAO,CAAA"}
1
+ {"version":3,"file":"base.js","names":[],"sources":["../../src/ui/base.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- rehype-react without types */\nimport Slugger from 'github-slugger';\nimport type { Awaitable, MethodInformation, RenderContext } from '@/types';\nimport type { NoReference } from '@/utils/schema';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport { defaultAdapters, MediaAdapter } from '@/requests/media/adapter';\nimport type { FC, HTMLAttributes, ReactNode } from 'react';\nimport type { OpenAPIServer } from '@/server';\nimport type { APIPageClientOptions } from './client';\nimport { Heading } from 'fumadocs-ui/components/heading';\nimport { createRehypeCode } from 'fumadocs-core/mdx-plugins/rehype-code.core';\nimport { remarkGfm } from 'fumadocs-core/mdx-plugins/remark-gfm';\nimport defaultMdxComponents from 'fumadocs-ui/mdx';\nimport { remark } from 'remark';\nimport remarkRehype from 'remark-rehype';\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport { CodeBlock, Pre } from 'fumadocs-ui/components/codeblock';\nimport type { SchemaUIOptions } from './schema';\nimport type { ResponseTab } from './operation/response-tabs';\nimport type { ExampleRequestItem } from './operation/request-tabs';\nimport { APIPage, type ApiPageProps, type OperationItem, type WebhookItem } from './api-page';\nimport type { CodeUsageGeneratorRegistry, InlineCodeUsageGenerator } from '@/requests/generators';\nimport type { JSONSchema } from 'json-schema-typed';\nimport type { BundledTheme, CodeOptionsThemes, CodeToHastOptionsCommon } from 'shiki';\nimport { highlightHast, type ShikiFactory } from 'fumadocs-core/highlight/shiki';\n\nexport interface GenerateTypeScriptDefinitionsContext extends RenderContext {\n operation: NoReference<MethodInformation>;\n readOnly: boolean;\n writeOnly: boolean;\n /** @deprecated */\n _internal_legacy?: {\n statusCode: string;\n contentType: string;\n };\n}\n\nexport interface CreateAPIPageOptions {\n /**\n * Generate TypeScript definitions from response schema.\n *\n * Pass `false` to disable it.\n *\n * @param method - the operation object\n * @param statusCode - status code\n * @deprecated use `generateTypeScriptDefinitions` instead.\n */\n generateTypeScriptSchema?:\n | ((\n method: NoReference<MethodInformation>,\n statusCode: string,\n contentType: string,\n ctx: RenderContext,\n ) => Awaitable<string | undefined>)\n | false;\n\n /**\n * Generate TypeScript definitions from JSON schema.\n *\n * Pass `false` to disable it.\n */\n generateTypeScriptDefinitions?: (\n schema: JSONSchema,\n ctx: GenerateTypeScriptDefinitionsContext,\n ) => Awaitable<string | undefined>;\n\n /**\n * Generate example code usage for all endpoints.\n */\n codeUsages?: CodeUsageGeneratorRegistry;\n\n /**\n * Generate example code usage for each endpoint.\n */\n generateCodeSamples?: (method: MethodInformation) => Awaitable<InlineCodeUsageGenerator[]>;\n\n shiki: ShikiFactory;\n renderMarkdown?: (md: string) => ReactNode;\n shikiOptions: Omit<CodeToHastOptionsCommon, 'lang'> & CodeOptionsThemes<BundledTheme>;\n\n /**\n * Show full response schema instead of only example response & Typescript definitions.\n *\n * @default true\n */\n showResponseSchema?: boolean;\n\n /**\n * Support other media types (for server-side generation).\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n\n /**\n * Customise page content\n */\n content?: {\n renderResponseTabs?: (tabs: ResponseTab[], ctx: RenderContext) => Awaitable<ReactNode>;\n\n renderRequestTabs?: (\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n ) => Awaitable<ReactNode>;\n\n renderAPIExampleLayout?: (\n slots: {\n selector: ReactNode;\n usageTabs: ReactNode;\n responseTabs: ReactNode;\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * @param generators - codegens for API example usages\n */\n renderAPIExampleUsageTabs?: (\n generators: CodeUsageGeneratorRegistry,\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * renderer of the entire page's layout (containing all operations & webhooks UI)\n */\n renderPageLayout?: (\n slots: {\n operations?: {\n item: OperationItem;\n children: ReactNode;\n }[];\n webhooks?: {\n item: WebhookItem;\n children: ReactNode;\n }[];\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n renderOperationLayout?: (\n slots: {\n header: ReactNode;\n description: ReactNode;\n apiExample: ReactNode;\n apiPlayground: ReactNode;\n\n authSchemes: ReactNode;\n parameters: ReactNode;\n body: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n },\n ctx: RenderContext,\n method: NoReference<MethodInformation>,\n ) => Awaitable<ReactNode>;\n\n renderWebhookLayout?: (slots: {\n header: ReactNode;\n description: ReactNode;\n authSchemes: ReactNode;\n parameters: ReactNode;\n body: ReactNode;\n requests: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n }) => Awaitable<ReactNode>;\n };\n\n /**\n * Info UI for JSON schemas\n */\n schemaUI?: {\n render?: (options: SchemaUIOptions, ctx: RenderContext) => Awaitable<ReactNode>;\n\n /**\n * Show examples under the generated content of JSON schemas.\n *\n * @defaultValue false\n */\n showExample?: boolean;\n };\n\n /**\n * Customise API playground\n */\n playground?: {\n /**\n * @defaultValue true\n */\n enabled?: boolean;\n /**\n * replace the server-side renderer\n */\n render?: (props: {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n }) => Awaitable<ReactNode>;\n };\n\n renderHeading?: (\n props: HTMLAttributes<HTMLHeadingElement>,\n depth: number,\n ) => Awaitable<ReactNode>;\n renderCodeBlock?: (props: { lang: string; code: string }) => Awaitable<ReactNode>;\n\n client?: APIPageClientOptions;\n}\n\nexport function createAPIPage(\n server: OpenAPIServer,\n options: CreateAPIPageOptions,\n): FC<ApiPageProps> {\n let processor: ReturnType<typeof createMarkdownProcessor>;\n\n function createMarkdownProcessor() {\n function rehypeReact(this: any) {\n this.compiler = (tree: any, file: any) => {\n return toJsxRuntime(tree, {\n development: false,\n filePath: file.path,\n ...JsxRuntime,\n components: defaultMdxComponents,\n });\n };\n }\n\n return remark()\n .use(remarkGfm)\n .use(remarkRehype)\n .use(createRehypeCode(options.shiki), {\n langs: [],\n lazy: true,\n defaultColor: false,\n ...options.shikiOptions,\n })\n .use(rehypeReact);\n }\n\n return async function APIPageWrapper({ document, ...props }) {\n let processed: ProcessedDocument;\n if (typeof document === 'string') {\n processed = await server.getSchema(document);\n } else {\n processed = await document;\n }\n\n const slugger = new Slugger();\n\n const ctx: RenderContext = {\n schema: processed,\n proxyUrl: server.options.proxyUrl,\n ...options,\n mediaAdapters: {\n ...defaultAdapters,\n ...options.mediaAdapters,\n },\n slugger,\n async renderHeading(depth, text, props) {\n const id = typeof text === 'string' ? slugger.slug(text) : props?.id;\n if (!id) throw new Error(\"missing 'id' for non-string children\");\n\n if (options.renderHeading) {\n return options.renderHeading({ id, children: text, ...props }, depth);\n }\n\n return (\n <Heading id={id} key={id} as={`h${depth}` as `h1`} {...props}>\n {text}\n </Heading>\n );\n },\n generateTypeScriptDefinitions(schema, ctx) {\n const { generateTypeScriptSchema, generateTypeScriptDefinitions } = options;\n if (generateTypeScriptSchema && ctx._internal_legacy) {\n const { statusCode, contentType } = ctx._internal_legacy;\n return generateTypeScriptSchema(ctx.operation, statusCode, contentType, ctx);\n }\n\n return generateTypeScriptDefinitions?.(schema, ctx);\n },\n async renderMarkdown(text) {\n if (options.renderMarkdown) return options.renderMarkdown(text);\n processor ??= createMarkdownProcessor();\n\n const out = await processor.process({\n value: text,\n });\n\n return out.result as ReactNode;\n },\n async renderCodeBlock(lang, code) {\n if (options.renderCodeBlock) {\n return options.renderCodeBlock({ lang, code });\n }\n\n const hast = await highlightHast(await options.shiki.getOrInit(), code, {\n lang,\n defaultColor: false,\n ...options.shikiOptions,\n });\n const rendered = toJsxRuntime(hast, {\n ...JsxRuntime,\n components: {\n pre: Pre,\n },\n });\n\n return <CodeBlock className=\"my-0\">{rendered}</CodeBlock>;\n },\n };\n\n return <APIPage {...props} ctx={ctx} />;\n };\n}\n\nexport { ClientCodeBlockProvider } from './components/codeblock';\n"],"mappings":";;;;;;;;;;;;;;;;AAmNA,SAAgB,cACd,QACA,SACkB;CAClB,IAAI;CAEJ,SAAS,0BAA0B;EACjC,SAAS,cAAuB;AAC9B,QAAK,YAAY,MAAW,SAAc;AACxC,WAAO,aAAa,MAAM;KACxB,aAAa;KACb,UAAU,KAAK;KACf,GAAG;KACH,YAAY;KACb,CAAC;;;AAIN,SAAO,QAAQ,CACZ,IAAI,UAAU,CACd,IAAI,aAAa,CACjB,IAAI,iBAAiB,QAAQ,MAAM,EAAE;GACpC,OAAO,EAAE;GACT,MAAM;GACN,cAAc;GACd,GAAG,QAAQ;GACZ,CAAC,CACD,IAAI,YAAY;;AAGrB,QAAO,eAAe,eAAe,EAAE,UAAU,GAAG,SAAS;EAC3D,IAAI;AACJ,MAAI,OAAO,aAAa,SACtB,aAAY,MAAM,OAAO,UAAU,SAAS;MAE5C,aAAY,MAAM;EAGpB,MAAM,UAAU,IAAI,SAAS;EAE7B,MAAM,MAAqB;GACzB,QAAQ;GACR,UAAU,OAAO,QAAQ;GACzB,GAAG;GACH,eAAe;IACb,GAAG;IACH,GAAG,QAAQ;IACZ;GACD;GACA,MAAM,cAAc,OAAO,MAAM,OAAO;IACtC,MAAM,KAAK,OAAO,SAAS,WAAW,QAAQ,KAAK,KAAK,GAAG,OAAO;AAClE,QAAI,CAAC,GAAI,OAAM,IAAI,MAAM,uCAAuC;AAEhE,QAAI,QAAQ,cACV,QAAO,QAAQ,cAAc;KAAE;KAAI,UAAU;KAAM,GAAG;KAAO,EAAE,MAAM;AAGvE,WACE,oBAAC,SAAD;KAAa;KAAa,IAAI,IAAI;KAAiB,GAAI;eACpD;KACO,EAFY,GAEZ;;GAGd,8BAA8B,QAAQ,KAAK;IACzC,MAAM,EAAE,0BAA0B,kCAAkC;AACpE,QAAI,4BAA4B,IAAI,kBAAkB;KACpD,MAAM,EAAE,YAAY,gBAAgB,IAAI;AACxC,YAAO,yBAAyB,IAAI,WAAW,YAAY,aAAa,IAAI;;AAG9E,WAAO,gCAAgC,QAAQ,IAAI;;GAErD,MAAM,eAAe,MAAM;AACzB,QAAI,QAAQ,eAAgB,QAAO,QAAQ,eAAe,KAAK;AAC/D,kBAAc,yBAAyB;AAMvC,YAJY,MAAM,UAAU,QAAQ,EAClC,OAAO,MACR,CAAC,EAES;;GAEb,MAAM,gBAAgB,MAAM,MAAM;AAChC,QAAI,QAAQ,gBACV,QAAO,QAAQ,gBAAgB;KAAE;KAAM;KAAM,CAAC;AAehD,WAAO,oBAAC,WAAD;KAAW,WAAU;eAPX,aALJ,MAAM,cAAc,MAAM,QAAQ,MAAM,WAAW,EAAE,MAAM;MACtE;MACA,cAAc;MACd,GAAG,QAAQ;MACZ,CAAC,EACkC;MAClC,GAAG;MACH,YAAY,EACV,KAAK,KACN;MACF,CAAC;KAEuD,CAAA;;GAE5D;AAED,SAAO,oBAAC,SAAD;GAAS,GAAI;GAAY;GAAO,CAAA"}
@@ -219,7 +219,7 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
219
219
  slots.apiPlayground,
220
220
  slots.description,
221
221
  slots.authSchemes,
222
- slots.paremeters,
222
+ slots.parameters,
223
223
  slots.body,
224
224
  slots.responses,
225
225
  slots.callbacks
@@ -237,7 +237,7 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
237
237
  authSchemes: authNode,
238
238
  body: bodyNode,
239
239
  callbacks: callbacksNode,
240
- paremeters: parameterNode,
240
+ parameters: parameterNode,
241
241
  responses: responseNode,
242
242
  apiPlayground: playgroundEnabled ? /* @__PURE__ */ jsx(APIPlayground, {
243
243
  path,
@@ -278,7 +278,7 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
278
278
  slots.header,
279
279
  slots.description,
280
280
  slots.authSchemes,
281
- slots.paremeters,
281
+ slots.parameters,
282
282
  slots.body,
283
283
  slots.responses,
284
284
  slots.callbacks
@@ -294,7 +294,7 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
294
294
  authSchemes: authNode,
295
295
  body: bodyNode,
296
296
  callbacks: callbacksNode,
297
- paremeters: parameterNode,
297
+ parameters: parameterNode,
298
298
  responses: responseNode,
299
299
  requests: /* @__PURE__ */ jsx(RequestTabs, {
300
300
  path,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/operation/index.tsx"],"sourcesContent":["import { ComponentProps, Fragment, type ReactNode } from 'react';\nimport type {\n CallbackObject,\n MethodInformation,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { createMethod, methodKeys, type NoReference, type ResolvedSchema } from '@/utils/schema';\nimport { idToTitle } from '@/utils/id-to-title';\nimport { Schema } from '../schema';\nimport { UsageTabs } from '@/ui/operation/usage-tabs';\nimport { Badge, MethodLabel } from '@/ui/components/method-label';\nimport { CopyTypeScriptPanel, SelectTab, SelectTabs, SelectTabTrigger } from './client';\nimport { I18nLabel } from '@/ui/client/i18n';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { isMediaTypeSupported } from '@/requests/media/adapter';\nimport { APIPlayground } from '@/playground';\nimport { getExampleRequests, RequestTabs } from './request-tabs';\nimport { UsageTabsProviderLazy } from './usage-tabs/lazy';\nimport { ServerProviderLazy } from '../contexts/api.lazy';\nimport { cn } from '@/utils/cn';\n\nconst paramTypeKeys = ['path', 'query', 'header', 'cookie'] as const;\n\nexport async function Operation({\n type = 'operation',\n path,\n method,\n ctx,\n showTitle,\n showDescription,\n headingLevel = 2,\n}: {\n type?: 'webhook' | 'operation';\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n\n showTitle?: boolean;\n showDescription?: boolean;\n headingLevel?: number;\n}) {\n const {\n schema: { dereferenced },\n } = ctx;\n const body = method.requestBody;\n let headNode: ReactNode = null;\n const descriptionNode =\n showDescription && method.description && ctx.renderMarkdown(method.description);\n let bodyNode: ReactNode = null;\n let authNode: ReactNode = null;\n let responseNode: ReactNode = null;\n let callbacksNode: ReactNode = null;\n\n if (showTitle) {\n const title = method.summary || (method.operationId ? idToTitle(method.operationId) : path);\n\n headNode = ctx.renderHeading(headingLevel, title);\n headingLevel++;\n }\n\n const contentTypes = body?.content ? Object.entries(body.content) : null;\n\n if (body && contentTypes && contentTypes.length > 0) {\n const items = contentTypes.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n bodyNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex gap-2 items-center justify-between mt-10\">\n {ctx.renderHeading(headingLevel, <I18nLabel label=\"titleRequestBody\" />, {\n id: 'request-body',\n className: 'my-0!',\n })}\n {contentTypes.length > 1 ? (\n <SelectTabTrigger items={items} className=\"font-medium\" />\n ) : (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n )}\n </div>\n {body.description && ctx.renderMarkdown(body.description)}\n {contentTypes.map(async ([type, content]) => {\n if (!isMediaTypeSupported(type, ctx.mediaAdapters)) {\n throw new Error(`Media type ${type} is not supported (in ${path})`);\n }\n\n const ts = content.schema\n ? await ctx.generateTypeScriptDefinitions(content.schema, {\n operation: method,\n readOnly: false,\n writeOnly: true,\n ...ctx,\n })\n : undefined;\n\n return (\n <SelectTab key={type} value={type}>\n {ts && <CopyTypeScriptPanel name=\"request body\" code={ts} className=\"mt-4\" />}\n <Schema\n client={{\n name: 'body',\n as: 'body',\n required: body.required,\n }}\n root={(content.schema ?? {}) as ResolvedSchema}\n readOnly={method.method === 'GET'}\n writeOnly={method.method !== 'GET'}\n ctx={ctx}\n />\n </SelectTab>\n );\n })}\n </SelectTabs>\n );\n }\n\n if (method.responses && ctx.showResponseSchema !== false) {\n const statuses = Object.keys(method.responses);\n\n responseNode = (\n <>\n {ctx.renderHeading(headingLevel, <I18nLabel label=\"titleResponseBody\" />, {\n id: 'response-body',\n })}\n\n <Accordions type=\"multiple\">\n {statuses.map((status) => (\n <ResponseAccordion key={status} status={status} operation={method} ctx={ctx} />\n ))}\n </Accordions>\n </>\n );\n }\n\n const parameterNode = paramTypeKeys.map((type) => {\n const params = method.parameters?.filter((param) => param.in === type);\n if (!params || params.length === 0) return;\n\n return (\n <Fragment key={type}>\n {ctx.renderHeading(headingLevel, <I18nLabel label={`${type}Parameters`} />, {\n id: `parameters-${type}`,\n })}\n <div className=\"flex flex-col\">\n {params.map(\n (param) =>\n param.schema != null && (\n <Schema\n key={param.name}\n client={{\n name: param.name!,\n required: param.required,\n }}\n root={\n typeof param.schema === 'object'\n ? {\n ...param.schema,\n description: param.description ?? param.schema?.description,\n deprecated:\n (param.deprecated ?? false) || (param.schema?.deprecated ?? false),\n }\n : param.schema\n }\n readOnly={method.method === 'GET'}\n writeOnly={method.method !== 'GET'}\n ctx={ctx}\n />\n ),\n )}\n </div>\n </Fragment>\n );\n });\n\n const securities = (method.security ?? dereferenced.security ?? []).filter(\n (v) => Object.keys(v).length > 0,\n );\n\n if (type === 'operation' && securities.length > 0) {\n const securitySchemes = dereferenced.components?.securitySchemes;\n const items = securities.map((security, i) => {\n return {\n value: String(i),\n label: (\n <div className=\"flex flex-col text-xs min-w-0\">\n {Object.entries(security).map(([key, scopes]) => (\n <code key={key} className=\"truncate\">\n <span className=\"font-medium\">{key}</span>{' '}\n {scopes.length > 0 && (\n <span className=\"text-fd-muted-foreground\">{scopes.join(', ')}</span>\n )}\n </code>\n ))}\n </div>\n ),\n };\n });\n\n authNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex items-start justify-between gap-2 mt-10\">\n {ctx.renderHeading(headingLevel, <I18nLabel label=\"authorization\" />, {\n id: 'authorization',\n className: 'my-0!',\n })}\n {items.length > 1 ? (\n <SelectTabTrigger items={items} />\n ) : (\n <div className=\"not-prose\">{items[0].label}</div>\n )}\n </div>\n {securities.map((security, i) => (\n <SelectTab key={i} value={items[i].value}>\n {Object.entries(security).map(([key, scopes]) => {\n const scheme = securitySchemes?.[key];\n if (!scheme) return;\n\n return <AuthScheme key={key} scheme={scheme} scopes={scopes} ctx={ctx} />;\n })}\n </SelectTab>\n ))}\n </SelectTabs>\n );\n }\n\n const callbacks = method.callbacks ? Object.entries(method.callbacks) : null;\n if (callbacks && callbacks.length > 0) {\n const items = callbacks.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n callbacksNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex justify-between gap-2 items-end mt-10\">\n {ctx.renderHeading(headingLevel, <I18nLabel label=\"titleCallbacks\" />, {\n id: 'callbacks',\n className: 'my-0!',\n })}\n {callbacks.length > 1 ? (\n <SelectTabTrigger items={items} className=\"font-medium\" />\n ) : (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n )}\n </div>\n {callbacks.map(([name, callback]) => (\n <SelectTab key={name} value={name}>\n <WebhookCallback callback={callback} ctx={ctx} headingLevel={headingLevel} />\n </SelectTab>\n ))}\n </SelectTabs>\n );\n }\n\n let { renderOperationLayout, renderWebhookLayout } = ctx.content ?? {};\n if (type === 'operation') {\n renderOperationLayout ??= (slots) => {\n return (\n <div className=\"flex flex-col gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start\">\n <div className=\"min-w-0 flex-1\">\n {slots.header}\n {slots.apiPlayground}\n {slots.description}\n {slots.authSchemes}\n {slots.paremeters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.apiExample}\n </div>\n </div>\n );\n };\n\n const playgroundEnabled = ctx.playground?.enabled ?? true;\n let content = await renderOperationLayout(\n {\n header: headNode,\n description: descriptionNode,\n authSchemes: authNode,\n body: bodyNode,\n callbacks: callbacksNode,\n paremeters: parameterNode,\n responses: responseNode,\n apiPlayground: playgroundEnabled ? (\n <APIPlayground path={path} method={method} ctx={ctx} />\n ) : (\n <div className=\"flex flex-row items-center gap-2.5 p-3 rounded-xl border bg-fd-card text-fd-card-foreground not-prose\">\n <MethodLabel className=\"text-xs\">{method.method}</MethodLabel>\n <code className=\"flex-1 overflow-auto text-nowrap text-[0.8125rem] text-fd-muted-foreground\">\n {path}\n </code>\n </div>\n ),\n apiExample: <UsageTabs method={method} ctx={ctx} />,\n },\n ctx,\n method,\n );\n\n content = (\n <UsageTabsProviderLazy\n defaultExampleId={method['x-exclusiveCodeSample'] ?? method['x-selectedCodeSample']}\n route={path}\n examples={getExampleRequests(path, method, ctx)}\n >\n {content}\n </UsageTabsProviderLazy>\n );\n if (method.servers) {\n content = <ServerProviderLazy servers={method.servers}>{content}</ServerProviderLazy>;\n }\n\n return content;\n } else {\n renderWebhookLayout ??= (slots) => (\n <div className=\"flex flex-col-reverse gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start\">\n <div className=\"min-w-0 flex-1\">\n {slots.header}\n {slots.description}\n {slots.authSchemes}\n {slots.paremeters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.requests}\n </div>\n </div>\n );\n return renderWebhookLayout({\n header: headNode,\n description: descriptionNode,\n authSchemes: authNode,\n body: bodyNode,\n callbacks: callbacksNode,\n paremeters: parameterNode,\n responses: responseNode,\n requests: <RequestTabs path={path} operation={method} ctx={ctx} />,\n });\n }\n}\n\nasync function ResponseAccordion({\n status,\n operation,\n ctx,\n}: {\n status: string;\n operation: MethodInformation;\n ctx: RenderContext;\n}) {\n const response = operation.responses![status];\n const contentTypes = response.content ? Object.entries(response.content) : [];\n let wrapper = (children: ReactNode) => children;\n let selectorNode: ReactNode = null;\n\n if (contentTypes.length > 0) {\n const items = contentTypes.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n selectorNode =\n items.length === 1 ? (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n ) : (\n <SelectTabTrigger items={items} />\n );\n wrapper = (children) => <SelectTabs defaultValue={items[0].value}>{children}</SelectTabs>;\n }\n\n return wrapper(\n <AccordionItem value={status}>\n <AccordionHeader>\n <AccordionTrigger className=\"font-mono\">{status}</AccordionTrigger>\n {selectorNode}\n </AccordionHeader>\n <AccordionContent className=\"ps-4.5\">\n {response.description && (\n <div className=\"prose-no-margin mb-2\">{ctx.renderMarkdown(response.description)}</div>\n )}\n {contentTypes.map(async ([type, resType]) => {\n const schema = resType.schema;\n const ts = schema\n ? await ctx.generateTypeScriptDefinitions(schema, {\n readOnly: true,\n writeOnly: false,\n operation,\n _internal_legacy: {\n statusCode: status,\n contentType: type,\n },\n ...ctx,\n })\n : undefined;\n\n return (\n <SelectTab key={type} value={type} className=\"mb-2\">\n {ts && <CopyTypeScriptPanel name=\"response body\" code={ts} />}\n {schema && (\n <div className=\"border px-3 py-2 rounded-lg\">\n <Schema\n client={{\n name: 'response',\n as: 'body',\n }}\n root={schema}\n readOnly\n ctx={ctx}\n />\n </div>\n )}\n </SelectTab>\n );\n })}\n </AccordionContent>\n </AccordionItem>,\n );\n}\n\nfunction WebhookCallback({\n callback,\n ctx,\n headingLevel,\n}: {\n callback: NoReference<CallbackObject>;\n ctx: RenderContext;\n headingLevel: number;\n}) {\n const pathItems = Object.entries(callback);\n\n return (\n <Accordions type=\"single\" collapsible>\n {pathItems.map(([path, pathItem]) => {\n const pathNodes = methodKeys.map((method) => {\n const operation = pathItem[method];\n if (!operation) return null;\n\n return (\n <div key={method} className=\"border p-3 my-2 @container prose-no-margin rounded-lg\">\n <Operation\n type=\"webhook\"\n path={path}\n headingLevel={headingLevel + 1}\n method={createMethod(method, pathItem, operation)}\n ctx={ctx}\n />\n </div>\n );\n });\n\n return (\n <AccordionItem key={path} value={path}>\n <AccordionHeader>\n <AccordionTrigger className=\"font-mono\">{path}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent>{pathNodes}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordions>\n );\n}\n\nfunction AuthScheme({\n scheme,\n scopes,\n ctx,\n}: {\n scheme: SecuritySchemeObject;\n scopes: string[];\n ctx: RenderContext;\n}) {\n if (scheme.type === 'http' || scheme.type === 'oauth2') {\n return (\n <AuthProperty\n name={<I18nLabel label=\"authorization\" />}\n type={\n scheme.type === 'http' && scheme.scheme === 'basic' ? (\n <I18nLabel label=\"authBasicTokenExample\" />\n ) : (\n <I18nLabel label=\"authBearerTokenExample\" />\n )\n }\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n <p>\n <I18nLabel label=\"authTokenIn\" />: <code>header</code>\n </p>\n </AuthProperty>\n );\n }\n\n if (scheme.type === 'apiKey') {\n return (\n <AuthProperty\n name={scheme.name!}\n type=\"<token>\"\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n <p>\n <I18nLabel label=\"authTokenIn\" />: <code>{scheme.in}</code>\n </p>\n </AuthProperty>\n );\n }\n\n if (scheme.type === 'openIdConnect') {\n return (\n <AuthProperty\n name={<I18nLabel label=\"openIdConnect\" />}\n type=\"<token>\"\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n </AuthProperty>\n );\n }\n}\n\nfunction AuthProperty({\n name,\n type,\n deprecated = false,\n scopes = [],\n className,\n ...props\n}: ComponentProps<'div'> & {\n name: ReactNode;\n type: ReactNode;\n deprecated?: boolean;\n scopes?: string[];\n children?: ReactNode;\n}) {\n return (\n <div className={cn('text-sm border-t my-4 first:border-t-0', className)}>\n <div className=\"flex flex-wrap items-center gap-3 not-prose\">\n <span className=\"font-medium font-mono text-fd-primary\">{name}</span>\n <span className=\"text-sm font-mono text-fd-muted-foreground\">{type}</span>\n {deprecated && (\n <Badge color=\"red\" className=\"text-xs\">\n <I18nLabel label=\"deprecated\" />\n </Badge>\n )}\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">\n {props.children}\n {scopes.length > 0 && (\n <p>\n <I18nLabel label=\"authScope\" />: <code>{scopes.join(', ')}</code>\n </p>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/operation/index.tsx"],"sourcesContent":["import { ComponentProps, Fragment, type ReactNode } from 'react';\nimport type {\n CallbackObject,\n MethodInformation,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { createMethod, methodKeys, type NoReference, type ResolvedSchema } from '@/utils/schema';\nimport { idToTitle } from '@/utils/id-to-title';\nimport { Schema } from '../schema';\nimport { UsageTabs } from '@/ui/operation/usage-tabs';\nimport { Badge, MethodLabel } from '@/ui/components/method-label';\nimport { CopyTypeScriptPanel, SelectTab, SelectTabs, SelectTabTrigger } from './client';\nimport { I18nLabel } from '@/ui/client/i18n';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { isMediaTypeSupported } from '@/requests/media/adapter';\nimport { APIPlayground } from '@/playground';\nimport { getExampleRequests, RequestTabs } from './request-tabs';\nimport { UsageTabsProviderLazy } from './usage-tabs/lazy';\nimport { ServerProviderLazy } from '../contexts/api.lazy';\nimport { cn } from '@/utils/cn';\n\nconst paramTypeKeys = ['path', 'query', 'header', 'cookie'] as const;\n\nexport async function Operation({\n type = 'operation',\n path,\n method,\n ctx,\n showTitle,\n showDescription,\n headingLevel = 2,\n}: {\n type?: 'webhook' | 'operation';\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n\n showTitle?: boolean;\n showDescription?: boolean;\n headingLevel?: number;\n}) {\n const {\n schema: { dereferenced },\n } = ctx;\n const body = method.requestBody;\n let headNode: ReactNode = null;\n const descriptionNode =\n showDescription && method.description && ctx.renderMarkdown(method.description);\n let bodyNode: ReactNode = null;\n let authNode: ReactNode = null;\n let responseNode: ReactNode = null;\n let callbacksNode: ReactNode = null;\n\n if (showTitle) {\n const title = method.summary || (method.operationId ? idToTitle(method.operationId) : path);\n\n headNode = ctx.renderHeading(headingLevel, title);\n headingLevel++;\n }\n\n const contentTypes = body?.content ? Object.entries(body.content) : null;\n\n if (body && contentTypes && contentTypes.length > 0) {\n const items = contentTypes.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n bodyNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex gap-2 items-center justify-between mt-10\">\n {ctx.renderHeading(headingLevel, <I18nLabel label=\"titleRequestBody\" />, {\n id: 'request-body',\n className: 'my-0!',\n })}\n {contentTypes.length > 1 ? (\n <SelectTabTrigger items={items} className=\"font-medium\" />\n ) : (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n )}\n </div>\n {body.description && ctx.renderMarkdown(body.description)}\n {contentTypes.map(async ([type, content]) => {\n if (!isMediaTypeSupported(type, ctx.mediaAdapters)) {\n throw new Error(`Media type ${type} is not supported (in ${path})`);\n }\n\n const ts = content.schema\n ? await ctx.generateTypeScriptDefinitions(content.schema, {\n operation: method,\n readOnly: false,\n writeOnly: true,\n ...ctx,\n })\n : undefined;\n\n return (\n <SelectTab key={type} value={type}>\n {ts && <CopyTypeScriptPanel name=\"request body\" code={ts} className=\"mt-4\" />}\n <Schema\n client={{\n name: 'body',\n as: 'body',\n required: body.required,\n }}\n root={(content.schema ?? {}) as ResolvedSchema}\n readOnly={method.method === 'GET'}\n writeOnly={method.method !== 'GET'}\n ctx={ctx}\n />\n </SelectTab>\n );\n })}\n </SelectTabs>\n );\n }\n\n if (method.responses && ctx.showResponseSchema !== false) {\n const statuses = Object.keys(method.responses);\n\n responseNode = (\n <>\n {ctx.renderHeading(headingLevel, <I18nLabel label=\"titleResponseBody\" />, {\n id: 'response-body',\n })}\n\n <Accordions type=\"multiple\">\n {statuses.map((status) => (\n <ResponseAccordion key={status} status={status} operation={method} ctx={ctx} />\n ))}\n </Accordions>\n </>\n );\n }\n\n const parameterNode = paramTypeKeys.map((type) => {\n const params = method.parameters?.filter((param) => param.in === type);\n if (!params || params.length === 0) return;\n\n return (\n <Fragment key={type}>\n {ctx.renderHeading(headingLevel, <I18nLabel label={`${type}Parameters`} />, {\n id: `parameters-${type}`,\n })}\n <div className=\"flex flex-col\">\n {params.map(\n (param) =>\n param.schema != null && (\n <Schema\n key={param.name}\n client={{\n name: param.name!,\n required: param.required,\n }}\n root={\n typeof param.schema === 'object'\n ? {\n ...param.schema,\n description: param.description ?? param.schema?.description,\n deprecated:\n (param.deprecated ?? false) || (param.schema?.deprecated ?? false),\n }\n : param.schema\n }\n readOnly={method.method === 'GET'}\n writeOnly={method.method !== 'GET'}\n ctx={ctx}\n />\n ),\n )}\n </div>\n </Fragment>\n );\n });\n\n const securities = (method.security ?? dereferenced.security ?? []).filter(\n (v) => Object.keys(v).length > 0,\n );\n\n if (type === 'operation' && securities.length > 0) {\n const securitySchemes = dereferenced.components?.securitySchemes;\n const items = securities.map((security, i) => {\n return {\n value: String(i),\n label: (\n <div className=\"flex flex-col text-xs min-w-0\">\n {Object.entries(security).map(([key, scopes]) => (\n <code key={key} className=\"truncate\">\n <span className=\"font-medium\">{key}</span>{' '}\n {scopes.length > 0 && (\n <span className=\"text-fd-muted-foreground\">{scopes.join(', ')}</span>\n )}\n </code>\n ))}\n </div>\n ),\n };\n });\n\n authNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex items-start justify-between gap-2 mt-10\">\n {ctx.renderHeading(headingLevel, <I18nLabel label=\"authorization\" />, {\n id: 'authorization',\n className: 'my-0!',\n })}\n {items.length > 1 ? (\n <SelectTabTrigger items={items} />\n ) : (\n <div className=\"not-prose\">{items[0].label}</div>\n )}\n </div>\n {securities.map((security, i) => (\n <SelectTab key={i} value={items[i].value}>\n {Object.entries(security).map(([key, scopes]) => {\n const scheme = securitySchemes?.[key];\n if (!scheme) return;\n\n return <AuthScheme key={key} scheme={scheme} scopes={scopes} ctx={ctx} />;\n })}\n </SelectTab>\n ))}\n </SelectTabs>\n );\n }\n\n const callbacks = method.callbacks ? Object.entries(method.callbacks) : null;\n if (callbacks && callbacks.length > 0) {\n const items = callbacks.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n callbacksNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex justify-between gap-2 items-end mt-10\">\n {ctx.renderHeading(headingLevel, <I18nLabel label=\"titleCallbacks\" />, {\n id: 'callbacks',\n className: 'my-0!',\n })}\n {callbacks.length > 1 ? (\n <SelectTabTrigger items={items} className=\"font-medium\" />\n ) : (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n )}\n </div>\n {callbacks.map(([name, callback]) => (\n <SelectTab key={name} value={name}>\n <WebhookCallback callback={callback} ctx={ctx} headingLevel={headingLevel} />\n </SelectTab>\n ))}\n </SelectTabs>\n );\n }\n\n let { renderOperationLayout, renderWebhookLayout } = ctx.content ?? {};\n if (type === 'operation') {\n renderOperationLayout ??= (slots) => {\n return (\n <div className=\"flex flex-col gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start\">\n <div className=\"min-w-0 flex-1\">\n {slots.header}\n {slots.apiPlayground}\n {slots.description}\n {slots.authSchemes}\n {slots.parameters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.apiExample}\n </div>\n </div>\n );\n };\n\n const playgroundEnabled = ctx.playground?.enabled ?? true;\n let content = await renderOperationLayout(\n {\n header: headNode,\n description: descriptionNode,\n authSchemes: authNode,\n body: bodyNode,\n callbacks: callbacksNode,\n parameters: parameterNode,\n responses: responseNode,\n apiPlayground: playgroundEnabled ? (\n <APIPlayground path={path} method={method} ctx={ctx} />\n ) : (\n <div className=\"flex flex-row items-center gap-2.5 p-3 rounded-xl border bg-fd-card text-fd-card-foreground not-prose\">\n <MethodLabel className=\"text-xs\">{method.method}</MethodLabel>\n <code className=\"flex-1 overflow-auto text-nowrap text-[0.8125rem] text-fd-muted-foreground\">\n {path}\n </code>\n </div>\n ),\n apiExample: <UsageTabs method={method} ctx={ctx} />,\n },\n ctx,\n method,\n );\n\n content = (\n <UsageTabsProviderLazy\n defaultExampleId={method['x-exclusiveCodeSample'] ?? method['x-selectedCodeSample']}\n route={path}\n examples={getExampleRequests(path, method, ctx)}\n >\n {content}\n </UsageTabsProviderLazy>\n );\n if (method.servers) {\n content = <ServerProviderLazy servers={method.servers}>{content}</ServerProviderLazy>;\n }\n\n return content;\n } else {\n renderWebhookLayout ??= (slots) => (\n <div className=\"flex flex-col-reverse gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start\">\n <div className=\"min-w-0 flex-1\">\n {slots.header}\n {slots.description}\n {slots.authSchemes}\n {slots.parameters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.requests}\n </div>\n </div>\n );\n return renderWebhookLayout({\n header: headNode,\n description: descriptionNode,\n authSchemes: authNode,\n body: bodyNode,\n callbacks: callbacksNode,\n parameters: parameterNode,\n responses: responseNode,\n requests: <RequestTabs path={path} operation={method} ctx={ctx} />,\n });\n }\n}\n\nasync function ResponseAccordion({\n status,\n operation,\n ctx,\n}: {\n status: string;\n operation: MethodInformation;\n ctx: RenderContext;\n}) {\n const response = operation.responses![status];\n const contentTypes = response.content ? Object.entries(response.content) : [];\n let wrapper = (children: ReactNode) => children;\n let selectorNode: ReactNode = null;\n\n if (contentTypes.length > 0) {\n const items = contentTypes.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n selectorNode =\n items.length === 1 ? (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n ) : (\n <SelectTabTrigger items={items} />\n );\n wrapper = (children) => <SelectTabs defaultValue={items[0].value}>{children}</SelectTabs>;\n }\n\n return wrapper(\n <AccordionItem value={status}>\n <AccordionHeader>\n <AccordionTrigger className=\"font-mono\">{status}</AccordionTrigger>\n {selectorNode}\n </AccordionHeader>\n <AccordionContent className=\"ps-4.5\">\n {response.description && (\n <div className=\"prose-no-margin mb-2\">{ctx.renderMarkdown(response.description)}</div>\n )}\n {contentTypes.map(async ([type, resType]) => {\n const schema = resType.schema;\n const ts = schema\n ? await ctx.generateTypeScriptDefinitions(schema, {\n readOnly: true,\n writeOnly: false,\n operation,\n _internal_legacy: {\n statusCode: status,\n contentType: type,\n },\n ...ctx,\n })\n : undefined;\n\n return (\n <SelectTab key={type} value={type} className=\"mb-2\">\n {ts && <CopyTypeScriptPanel name=\"response body\" code={ts} />}\n {schema && (\n <div className=\"border px-3 py-2 rounded-lg\">\n <Schema\n client={{\n name: 'response',\n as: 'body',\n }}\n root={schema}\n readOnly\n ctx={ctx}\n />\n </div>\n )}\n </SelectTab>\n );\n })}\n </AccordionContent>\n </AccordionItem>,\n );\n}\n\nfunction WebhookCallback({\n callback,\n ctx,\n headingLevel,\n}: {\n callback: NoReference<CallbackObject>;\n ctx: RenderContext;\n headingLevel: number;\n}) {\n const pathItems = Object.entries(callback);\n\n return (\n <Accordions type=\"single\" collapsible>\n {pathItems.map(([path, pathItem]) => {\n const pathNodes = methodKeys.map((method) => {\n const operation = pathItem[method];\n if (!operation) return null;\n\n return (\n <div key={method} className=\"border p-3 my-2 @container prose-no-margin rounded-lg\">\n <Operation\n type=\"webhook\"\n path={path}\n headingLevel={headingLevel + 1}\n method={createMethod(method, pathItem, operation)}\n ctx={ctx}\n />\n </div>\n );\n });\n\n return (\n <AccordionItem key={path} value={path}>\n <AccordionHeader>\n <AccordionTrigger className=\"font-mono\">{path}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent>{pathNodes}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordions>\n );\n}\n\nfunction AuthScheme({\n scheme,\n scopes,\n ctx,\n}: {\n scheme: SecuritySchemeObject;\n scopes: string[];\n ctx: RenderContext;\n}) {\n if (scheme.type === 'http' || scheme.type === 'oauth2') {\n return (\n <AuthProperty\n name={<I18nLabel label=\"authorization\" />}\n type={\n scheme.type === 'http' && scheme.scheme === 'basic' ? (\n <I18nLabel label=\"authBasicTokenExample\" />\n ) : (\n <I18nLabel label=\"authBearerTokenExample\" />\n )\n }\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n <p>\n <I18nLabel label=\"authTokenIn\" />: <code>header</code>\n </p>\n </AuthProperty>\n );\n }\n\n if (scheme.type === 'apiKey') {\n return (\n <AuthProperty\n name={scheme.name!}\n type=\"<token>\"\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n <p>\n <I18nLabel label=\"authTokenIn\" />: <code>{scheme.in}</code>\n </p>\n </AuthProperty>\n );\n }\n\n if (scheme.type === 'openIdConnect') {\n return (\n <AuthProperty\n name={<I18nLabel label=\"openIdConnect\" />}\n type=\"<token>\"\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n </AuthProperty>\n );\n }\n}\n\nfunction AuthProperty({\n name,\n type,\n deprecated = false,\n scopes = [],\n className,\n ...props\n}: ComponentProps<'div'> & {\n name: ReactNode;\n type: ReactNode;\n deprecated?: boolean;\n scopes?: string[];\n children?: ReactNode;\n}) {\n return (\n <div className={cn('text-sm border-t my-4 first:border-t-0', className)}>\n <div className=\"flex flex-wrap items-center gap-3 not-prose\">\n <span className=\"font-medium font-mono text-fd-primary\">{name}</span>\n <span className=\"text-sm font-mono text-fd-muted-foreground\">{type}</span>\n {deprecated && (\n <Badge color=\"red\" className=\"text-xs\">\n <I18nLabel label=\"deprecated\" />\n </Badge>\n )}\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">\n {props.children}\n {scopes.length > 0 && (\n <p>\n <I18nLabel label=\"authScope\" />: <code>{scopes.join(', ')}</code>\n </p>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { RawRequestData, RequestData } from "../../requests/types.js";
2
2
  import { ReactNode } from "react";
3
+
3
4
  //#region src/ui/operation/request-tabs.d.ts
4
5
  interface ExampleRequestItem {
5
6
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"request-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"mappings":";;;UAkBiB,kBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA,EAAM,cAAA;EACN,OAAA,EAAS,WAAA;AAAA"}
1
+ {"version":3,"file":"request-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"mappings":";;;;UAkBiB,kBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA,EAAM,cAAA;EACN,OAAA,EAAS,WAAA;AAAA"}
@@ -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
1
  import { ResolvedSchema } from "../../utils/schema.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"}
@@ -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"}
@@ -19,7 +19,35 @@ function fromSchema(schemaId, processed, config) {
19
19
  create(entry) {
20
20
  files.push(entry);
21
21
  },
22
- extract: () => extractInfo(dereferenced),
22
+ extract() {
23
+ const result = {
24
+ webhooks: [],
25
+ operations: []
26
+ };
27
+ for (const [path, pathItem] of Object.entries(dereferenced.paths ?? {})) {
28
+ if (!pathItem) continue;
29
+ for (const methodKey of methodKeys) {
30
+ if (!pathItem[methodKey]) continue;
31
+ result.operations.push({
32
+ method: methodKey,
33
+ path,
34
+ tags: pathItem[methodKey]?.tags
35
+ });
36
+ }
37
+ }
38
+ for (const [name, pathItem] of Object.entries(dereferenced.webhooks ?? {})) {
39
+ if (!pathItem) continue;
40
+ for (const methodKey of methodKeys) {
41
+ if (!pathItem[methodKey]) continue;
42
+ result.webhooks.push({
43
+ method: methodKey,
44
+ name,
45
+ tags: pathItem[methodKey]?.tags
46
+ });
47
+ }
48
+ }
49
+ return result;
50
+ },
23
51
  routePathToFilePath(path) {
24
52
  return path.toLowerCase().replaceAll(".", "-").split("/").flatMap((v) => {
25
53
  if (v.startsWith("{") && v.endsWith("}")) return v.slice(1, -1);
@@ -69,35 +97,6 @@ function fromSchema(schemaId, processed, config) {
69
97
  });
70
98
  return files;
71
99
  }
72
- function extractInfo(document) {
73
- const result = {
74
- webhooks: [],
75
- operations: []
76
- };
77
- for (const [path, pathItem] of Object.entries(document.paths ?? {})) {
78
- if (!pathItem) continue;
79
- for (const methodKey of methodKeys) {
80
- if (!pathItem[methodKey]) continue;
81
- result.operations.push({
82
- method: methodKey,
83
- path,
84
- tags: pathItem[methodKey]?.tags
85
- });
86
- }
87
- }
88
- for (const [name, pathItem] of Object.entries(document.webhooks ?? {})) {
89
- if (!pathItem) continue;
90
- for (const methodKey of methodKeys) {
91
- if (!pathItem[methodKey]) continue;
92
- result.webhooks.push({
93
- method: methodKey,
94
- name,
95
- tags: pathItem[methodKey]?.tags
96
- });
97
- }
98
- }
99
- return result;
100
- }
101
100
  //#endregion
102
101
  export { fromSchema, fromServer };
103
102