fumadocs-openapi 10.5.0 → 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.
- package/css/generated/shared.css +26 -21
- package/dist/generate-file.d.ts +10 -2
- package/dist/generate-file.d.ts.map +1 -1
- package/dist/generate-file.js +15 -3
- package/dist/generate-file.js.map +1 -1
- package/dist/playground/client.d.ts +27 -7
- package/dist/playground/client.d.ts.map +1 -1
- package/dist/playground/client.js +51 -44
- package/dist/playground/client.js.map +1 -1
- package/dist/playground/components/inputs.js +1 -1
- package/dist/playground/components/inputs.js.map +1 -1
- package/dist/playground/components/server-select.js +3 -4
- package/dist/playground/components/server-select.js.map +1 -1
- package/dist/playground/index.d.ts +1 -1
- package/dist/playground/index.d.ts.map +1 -1
- package/dist/playground/index.js +2 -2
- package/dist/playground/index.js.map +1 -1
- package/dist/playground/schema.d.ts.map +1 -1
- package/dist/playground/schema.js +10 -12
- package/dist/playground/schema.js.map +1 -1
- package/dist/requests/generators/python.d.ts +2 -1
- package/dist/requests/generators/python.d.ts.map +1 -1
- package/dist/requests/generators/python.js +13 -2
- package/dist/requests/generators/python.js.map +1 -1
- package/dist/scalar/index.d.ts +2 -1
- package/dist/scalar/index.d.ts.map +1 -1
- package/dist/server/create.d.ts +2 -0
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/create.js +11 -8
- package/dist/server/create.js.map +1 -1
- package/dist/server/source-api.d.ts +2 -0
- package/dist/server/source-api.d.ts.map +1 -1
- package/dist/server/source-api.js +10 -1
- package/dist/server/source-api.js.map +1 -1
- package/dist/types.d.ts +2 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/api-page.d.ts +1 -2
- package/dist/ui/api-page.d.ts.map +1 -1
- package/dist/ui/api-page.js +4 -6
- package/dist/ui/api-page.js.map +1 -1
- package/dist/ui/base.d.ts +20 -16
- package/dist/ui/base.d.ts.map +1 -1
- package/dist/ui/base.js +18 -9
- package/dist/ui/base.js.map +1 -1
- package/dist/ui/{full.client.js → client/full.js} +3 -3
- package/dist/ui/client/full.js.map +1 -0
- package/dist/ui/client/index.d.ts +1 -1
- package/dist/ui/client/index.js.map +1 -1
- package/dist/ui/client/storage-key.js.map +1 -1
- package/dist/ui/components/server-tab.js +43 -0
- package/dist/ui/components/server-tab.js.map +1 -0
- package/dist/ui/contexts/api.js +18 -35
- package/dist/ui/contexts/api.js.map +1 -1
- package/dist/ui/create-client.d.ts +26 -0
- package/dist/ui/create-client.d.ts.map +1 -0
- package/dist/ui/create-client.js +132 -0
- package/dist/ui/create-client.js.map +1 -0
- package/dist/ui/index.d.ts +10 -2
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +21 -1
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/operation/client.js +44 -36
- package/dist/ui/operation/client.js.map +1 -1
- package/dist/ui/operation/{request-tabs.d.ts → get-example-requests.d.ts} +2 -4
- package/dist/ui/operation/get-example-requests.d.ts.map +1 -0
- package/dist/ui/operation/get-example-requests.js +83 -0
- package/dist/ui/operation/get-example-requests.js.map +1 -0
- package/dist/ui/operation/index.js +101 -63
- package/dist/ui/operation/index.js.map +1 -1
- package/dist/ui/operation/request-tabs.js +3 -81
- package/dist/ui/operation/request-tabs.js.map +1 -1
- package/dist/ui/operation/response-tabs.d.ts +1 -1
- package/dist/ui/operation/response-tabs.js +57 -54
- package/dist/ui/operation/response-tabs.js.map +1 -1
- package/dist/ui/operation/usage-tabs/client.js +7 -48
- package/dist/ui/operation/usage-tabs/client.js.map +1 -1
- package/dist/ui/operation/usage-tabs/index.js +14 -10
- package/dist/ui/operation/usage-tabs/index.js.map +1 -1
- package/dist/ui/operation/usage-tabs/lazy.js +1 -2
- package/dist/ui/operation/usage-tabs/lazy.js.map +1 -1
- package/dist/ui/schema/index.d.ts +1 -1
- package/dist/ui/schema/index.js +4 -2
- package/dist/ui/schema/index.js.map +1 -1
- package/dist/utils/pages/builder.d.ts +1 -1
- package/dist/utils/pages/builder.js +1 -1
- package/dist/utils/process-document.d.ts +1 -1
- package/dist/utils/process-document.js +1 -32
- package/dist/utils/process-document.js.map +1 -1
- package/dist/utils/schema/dereference.js +37 -0
- package/dist/utils/schema/dereference.js.map +1 -0
- package/dist/utils/{schema.d.ts → schema/index.d.ts} +3 -3
- package/dist/utils/schema/index.d.ts.map +1 -0
- package/dist/utils/{schema.js → schema/index.js} +3 -3
- package/dist/utils/schema/index.js.map +1 -0
- package/dist/utils/schema/resolve-ref.js +21 -0
- package/dist/utils/schema/resolve-ref.js.map +1 -0
- package/dist/utils/{schema-to-string.js → schema/to-string.js} +2 -2
- package/dist/utils/schema/to-string.js.map +1 -0
- package/package.json +5 -4
- package/dist/requests/to-python-object.js +0 -17
- package/dist/requests/to-python-object.js.map +0 -1
- package/dist/ui/full.client.js.map +0 -1
- package/dist/ui/full.d.ts +0 -11
- package/dist/ui/full.d.ts.map +0 -1
- package/dist/ui/full.js +0 -36
- package/dist/ui/full.js.map +0 -1
- package/dist/ui/operation/request-tabs.d.ts.map +0 -1
- package/dist/utils/schema-to-string.js.map +0 -1
- package/dist/utils/schema.d.ts.map +0 -1
- package/dist/utils/schema.js.map +0 -1
- /package/dist/utils/{schema-to-string.d.ts → schema/to-string.d.ts} +0 -0
|
@@ -1,13 +1,54 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn } from "../../utils/cn.js";
|
|
3
|
-
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../components/select.js";
|
|
4
3
|
import { useTranslations } from "../client/i18n.js";
|
|
5
|
-
import { createContext, use, useMemo, useState } from "react";
|
|
4
|
+
import { createContext, use, useMemo, useRef, useState } from "react";
|
|
6
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
6
|
import { Check, Copy } from "lucide-react";
|
|
8
7
|
import { buttonVariants } from "fumadocs-ui/components/ui/button";
|
|
9
8
|
import { useCopyButton } from "fumadocs-ui/utils/use-copy-button";
|
|
10
9
|
//#region src/ui/operation/client.tsx
|
|
10
|
+
const OperationContext = createContext(null);
|
|
11
|
+
function OperationProvider({ route, examples, defaultExampleId, children }) {
|
|
12
|
+
const [example, setExample] = useState(() => defaultExampleId ?? examples.at(0)?.id);
|
|
13
|
+
const listeners = useRef([]);
|
|
14
|
+
return /* @__PURE__ */ jsx(OperationContext, {
|
|
15
|
+
value: useMemo(() => ({
|
|
16
|
+
example,
|
|
17
|
+
route,
|
|
18
|
+
setExample(newKey) {
|
|
19
|
+
const example = examples.find((example) => example.id === newKey);
|
|
20
|
+
if (!example) return;
|
|
21
|
+
setExample(newKey);
|
|
22
|
+
for (const listener of listeners.current) listener(example.data, example.encoded);
|
|
23
|
+
},
|
|
24
|
+
examples,
|
|
25
|
+
setExampleData(data, encoded) {
|
|
26
|
+
for (const item of examples) if (item.id === example) {
|
|
27
|
+
item.data = data;
|
|
28
|
+
item.encoded = encoded;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
for (const listener of listeners.current) listener(data, encoded);
|
|
32
|
+
},
|
|
33
|
+
removeListener(listener) {
|
|
34
|
+
listeners.current = listeners.current.filter((item) => item !== listener);
|
|
35
|
+
},
|
|
36
|
+
addListener(listener) {
|
|
37
|
+
const active = examples.find((item) => item.id === example);
|
|
38
|
+
listener(active.data, active.encoded);
|
|
39
|
+
listeners.current.push(listener);
|
|
40
|
+
}
|
|
41
|
+
}), [
|
|
42
|
+
example,
|
|
43
|
+
route,
|
|
44
|
+
examples
|
|
45
|
+
]),
|
|
46
|
+
children
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function useOperationContext() {
|
|
50
|
+
return use(OperationContext);
|
|
51
|
+
}
|
|
11
52
|
function CopyTypeScriptPanel({ name, code, className }) {
|
|
12
53
|
const [isChecked, onCopy] = useCopyButton(() => {
|
|
13
54
|
navigator.clipboard.writeText(code);
|
|
@@ -33,40 +74,7 @@ function CopyTypeScriptPanel({ name, code, className }) {
|
|
|
33
74
|
})]
|
|
34
75
|
});
|
|
35
76
|
}
|
|
36
|
-
const Context = createContext(null);
|
|
37
|
-
function SelectTabs({ defaultValue, children }) {
|
|
38
|
-
const [type, setType] = useState(defaultValue ?? null);
|
|
39
|
-
return /* @__PURE__ */ jsx(Context, {
|
|
40
|
-
value: useMemo(() => ({
|
|
41
|
-
type,
|
|
42
|
-
setType
|
|
43
|
-
}), [type]),
|
|
44
|
-
children
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
function SelectTab({ value, ...props }) {
|
|
48
|
-
if (value !== use(Context)?.type) return;
|
|
49
|
-
return /* @__PURE__ */ jsx("div", {
|
|
50
|
-
...props,
|
|
51
|
-
children: props.children
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
function SelectTabTrigger({ items, className, ...props }) {
|
|
55
|
-
const { type, setType } = use(Context);
|
|
56
|
-
return /* @__PURE__ */ jsxs(Select, {
|
|
57
|
-
value: type ?? "",
|
|
58
|
-
onValueChange: setType,
|
|
59
|
-
children: [/* @__PURE__ */ jsx(SelectTrigger, {
|
|
60
|
-
className: cn("not-prose w-fit min-w-0 *:min-w-0", className),
|
|
61
|
-
...props,
|
|
62
|
-
children: /* @__PURE__ */ jsx(SelectValue, {})
|
|
63
|
-
}), /* @__PURE__ */ jsx(SelectContent, { children: items.map(({ label, value }) => /* @__PURE__ */ jsx(SelectItem, {
|
|
64
|
-
value,
|
|
65
|
-
children: label
|
|
66
|
-
}, value)) })]
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
77
|
//#endregion
|
|
70
|
-
export { CopyTypeScriptPanel,
|
|
78
|
+
export { CopyTypeScriptPanel, OperationProvider, useOperationContext };
|
|
71
79
|
|
|
72
80
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../../src/ui/operation/client.tsx"],"sourcesContent":["'use client';\n\nimport { useCopyButton } from 'fumadocs-ui/utils/use-copy-button';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { cn } from '@/utils/cn';\nimport { Check, Copy } from 'lucide-react';\nimport {
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../../../src/ui/operation/client.tsx"],"sourcesContent":["'use client';\n\nimport { useCopyButton } from 'fumadocs-ui/utils/use-copy-button';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { cn } from '@/utils/cn';\nimport { Check, Copy } from 'lucide-react';\nimport { createContext, type ReactNode, use, useMemo, useRef, useState } from 'react';\nimport { useTranslations } from '@/ui/client/i18n';\nimport type { ExampleRequestItem } from './get-example-requests';\nimport type { RawRequestData, RequestData } from '@/requests/types';\n\nexport type ExampleUpdateListener = (data: RawRequestData, encoded: RequestData) => void;\n\nconst OperationContext = 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 OperationProvider({\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 <OperationContext\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 </OperationContext>\n );\n}\n\nexport function useOperationContext() {\n return use(OperationContext)!;\n}\n\nexport function CopyTypeScriptPanel({\n name,\n code,\n className,\n}: {\n code: string;\n name: 'response body' | 'request body';\n className?: string;\n}) {\n const [isChecked, onCopy] = useCopyButton(() => {\n void navigator.clipboard.writeText(code);\n });\n const t = useTranslations();\n const useTypeText = t.useTypeInTypeScript.replace('{name}', name);\n\n return (\n <div\n className={cn(\n 'flex items-start justify-between gap-2 bg-fd-card text-fd-card-foreground border rounded-xl p-3 not-prose mb-4 last:mb-0',\n className,\n )}\n >\n <div>\n <p className=\"font-medium text-sm mb-2\">{t.typeScriptDefinitions}</p>\n <p className=\"text-xs text-fd-muted-foreground\">{useTypeText}</p>\n </div>\n <button\n onClick={onCopy}\n className={cn(\n buttonVariants({\n color: 'secondary',\n className: 'p-2 gap-2',\n size: 'sm',\n }),\n )}\n >\n {isChecked ? <Check className=\"size-3.5\" /> : <Copy className=\"size-3.5\" />}\n {t.copy}\n </button>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAaA,MAAM,mBAAmB,cASf,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,kBAAD;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;EACgB,CAAA;;AAIvB,SAAgB,sBAAsB;AACpC,QAAO,IAAI,iBAAiB;;AAG9B,SAAgB,oBAAoB,EAClC,MACA,MACA,aAKC;CACD,MAAM,CAAC,WAAW,UAAU,oBAAoB;AACzC,YAAU,UAAU,UAAU,KAAK;GACxC;CACF,MAAM,IAAI,iBAAiB;CAC3B,MAAM,cAAc,EAAE,oBAAoB,QAAQ,UAAU,KAAK;AAEjE,QACE,qBAAC,OAAD;EACE,WAAW,GACT,4HACA,UACD;YAJH,CAME,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;GAAG,WAAU;aAA4B,EAAE;GAA0B,CAAA,EACrE,oBAAC,KAAD;GAAG,WAAU;aAAoC;GAAgB,CAAA,CAC7D,EAAA,CAAA,EACN,qBAAC,UAAD;GACE,SAAS;GACT,WAAW,GACT,eAAe;IACb,OAAO;IACP,WAAW;IACX,MAAM;IACP,CAAC,CACH;aARH,CAUG,YAAY,oBAAC,OAAD,EAAO,WAAU,YAAa,CAAA,GAAG,oBAAC,MAAD,EAAM,WAAU,YAAa,CAAA,EAC1E,EAAE,KACI;KACL"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { RawRequestData, RequestData } from "../../requests/types.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
//#region src/ui/operation/request-tabs.d.ts
|
|
2
|
+
//#region src/ui/operation/get-example-requests.d.ts
|
|
5
3
|
interface ExampleRequestItem {
|
|
6
4
|
id: string;
|
|
7
5
|
name: string;
|
|
@@ -11,4 +9,4 @@ interface ExampleRequestItem {
|
|
|
11
9
|
}
|
|
12
10
|
//#endregion
|
|
13
11
|
export { ExampleRequestItem };
|
|
14
|
-
//# sourceMappingURL=
|
|
12
|
+
//# sourceMappingURL=get-example-requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-example-requests.d.ts","names":[],"sources":["../../../src/ui/operation/get-example-requests.ts"],"mappings":";;UAMiB,kBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA,EAAM,cAAA;EACN,OAAA,EAAS,WAAA;AAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { getPreferredType, pickExample } from "../../utils/schema/index.js";
|
|
2
|
+
import { encodeRequestData } from "../../requests/media/encode.js";
|
|
3
|
+
import { sample } from "openapi-sampler";
|
|
4
|
+
//#region src/ui/operation/get-example-requests.ts
|
|
5
|
+
function getExampleRequests(path, operation, ctx) {
|
|
6
|
+
const requestBody = operation.requestBody;
|
|
7
|
+
const media = requestBody?.content ? getPreferredType(requestBody.content) : null;
|
|
8
|
+
const bodyOfType = media ? requestBody.content[media] : null;
|
|
9
|
+
if (bodyOfType?.examples) {
|
|
10
|
+
const result = [];
|
|
11
|
+
for (const [key, value] of Object.entries(bodyOfType.examples)) {
|
|
12
|
+
const data = getRequestData(path, operation, key, ctx);
|
|
13
|
+
result.push({
|
|
14
|
+
id: key,
|
|
15
|
+
name: value.summary || key,
|
|
16
|
+
description: value.description,
|
|
17
|
+
data,
|
|
18
|
+
encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? [])
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (result.length > 0) return result;
|
|
22
|
+
}
|
|
23
|
+
const data = getRequestData(path, operation, null, ctx);
|
|
24
|
+
return [{
|
|
25
|
+
id: "_default",
|
|
26
|
+
name: "Default",
|
|
27
|
+
description: typeof bodyOfType?.schema === "object" ? bodyOfType.schema.description : void 0,
|
|
28
|
+
data,
|
|
29
|
+
encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? [])
|
|
30
|
+
}];
|
|
31
|
+
}
|
|
32
|
+
function getRequestData(path, method, sampleKey, _ctx) {
|
|
33
|
+
const result = {
|
|
34
|
+
path: {},
|
|
35
|
+
cookie: {},
|
|
36
|
+
header: {},
|
|
37
|
+
query: {},
|
|
38
|
+
method: method.method
|
|
39
|
+
};
|
|
40
|
+
for (const param of method.parameters ?? []) {
|
|
41
|
+
let value = pickExample(param);
|
|
42
|
+
if (value === void 0 && param.required) {
|
|
43
|
+
if (param.schema) value = sample(param.schema);
|
|
44
|
+
else if (param.content) {
|
|
45
|
+
const type = getPreferredType(param.content);
|
|
46
|
+
const content = type ? param.content[type] : void 0;
|
|
47
|
+
if (!content || !content.schema) throw new Error(`Cannot find "${param.name}" parameter info for media type "${type}" in ${path} ${method.method}`);
|
|
48
|
+
value = sample(content.schema);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
switch (param.in) {
|
|
52
|
+
case "cookie":
|
|
53
|
+
result.cookie[param.name] = value;
|
|
54
|
+
break;
|
|
55
|
+
case "header":
|
|
56
|
+
result.header[param.name] = value;
|
|
57
|
+
break;
|
|
58
|
+
case "query":
|
|
59
|
+
result.query[param.name] = value;
|
|
60
|
+
break;
|
|
61
|
+
default: result.path[param.name] = value;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (method.requestBody?.content) {
|
|
65
|
+
const body = method.requestBody.content;
|
|
66
|
+
const type = getPreferredType(body);
|
|
67
|
+
if (!type) throw new Error(`Cannot find body schema for ${path} ${method.method}: missing media type`);
|
|
68
|
+
result.bodyMediaType = type;
|
|
69
|
+
const bodyOfType = body[type];
|
|
70
|
+
if (bodyOfType.examples && sampleKey) result.body = bodyOfType.examples[sampleKey].value;
|
|
71
|
+
else if (bodyOfType.example) result.body = bodyOfType.example;
|
|
72
|
+
else result.body = sample(bodyOfType?.schema ?? {}, {
|
|
73
|
+
skipReadOnly: method.method !== "GET",
|
|
74
|
+
skipWriteOnly: method.method === "GET",
|
|
75
|
+
skipNonRequired: true
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { getExampleRequests };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=get-example-requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-example-requests.js","names":[],"sources":["../../../src/ui/operation/get-example-requests.ts"],"sourcesContent":["import { encodeRequestData } from '@/requests/media/encode';\nimport type { RawRequestData, RequestData } from '@/requests/types';\nimport type { MethodInformation, RenderContext } from '@/types';\nimport { type NoReference, getPreferredType, pickExample } from '@/utils/schema';\nimport { sample } from 'openapi-sampler';\n\nexport interface ExampleRequestItem {\n id: string;\n name: string;\n description?: string;\n data: RawRequestData;\n encoded: RequestData;\n}\n\nexport function getExampleRequests(\n path: string,\n operation: NoReference<MethodInformation>,\n ctx: RenderContext,\n): ExampleRequestItem[] {\n const requestBody = operation.requestBody;\n const media = requestBody?.content ? getPreferredType(requestBody.content) : null;\n const bodyOfType = media ? requestBody!.content![media] : null;\n\n if (bodyOfType?.examples) {\n const result: ExampleRequestItem[] = [];\n\n for (const [key, value] of Object.entries(bodyOfType.examples)) {\n const data = getRequestData(path, operation, key, ctx);\n\n result.push({\n id: key,\n name: value.summary || key,\n description: value.description,\n data,\n encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? []),\n });\n }\n\n if (result.length > 0) return result;\n }\n\n const data = getRequestData(path, operation, null, ctx);\n return [\n {\n id: '_default',\n name: 'Default',\n description:\n typeof bodyOfType?.schema === 'object' ? bodyOfType.schema.description : undefined,\n data,\n encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? []),\n },\n ];\n}\n\nfunction getRequestData(\n path: string,\n method: NoReference<MethodInformation>,\n sampleKey: string | null,\n _ctx: RenderContext,\n): RawRequestData {\n const result: RawRequestData = {\n path: {},\n cookie: {},\n header: {},\n query: {},\n method: method.method,\n };\n\n for (const param of method.parameters ?? []) {\n let value = pickExample(param as never);\n\n if (value === undefined && param.required) {\n if (param.schema) {\n value = sample(param.schema as object);\n } else if (param.content) {\n const type = getPreferredType(param.content);\n const content = type ? param.content[type] : undefined;\n if (!content || !content.schema)\n throw new Error(\n `Cannot find \"${param.name}\" parameter info for media type \"${type}\" in ${path} ${method.method}`,\n );\n\n value = sample(content.schema as object);\n }\n }\n\n switch (param.in) {\n case 'cookie':\n result.cookie[param.name!] = value;\n break;\n case 'header':\n result.header[param.name!] = value;\n break;\n case 'query':\n result.query[param.name!] = value;\n break;\n default:\n result.path[param.name!] = value;\n }\n }\n\n if (method.requestBody?.content) {\n const body = method.requestBody.content;\n const type = getPreferredType(body);\n if (!type)\n throw new Error(`Cannot find body schema for ${path} ${method.method}: missing media type`);\n result.bodyMediaType = type as RawRequestData['bodyMediaType'];\n const bodyOfType = body[type];\n\n if (bodyOfType.examples && sampleKey) {\n result.body = bodyOfType.examples[sampleKey].value;\n } else if (bodyOfType.example) {\n result.body = bodyOfType.example;\n } else {\n result.body = sample((bodyOfType?.schema ?? {}) as object, {\n skipReadOnly: method.method !== 'GET',\n skipWriteOnly: method.method === 'GET',\n skipNonRequired: true,\n });\n }\n }\n\n return result;\n}\n"],"mappings":";;;;AAcA,SAAgB,mBACd,MACA,WACA,KACsB;CACtB,MAAM,cAAc,UAAU;CAC9B,MAAM,QAAQ,aAAa,UAAU,iBAAiB,YAAY,QAAQ,GAAG;CAC7E,MAAM,aAAa,QAAQ,YAAa,QAAS,SAAS;AAE1D,KAAI,YAAY,UAAU;EACxB,MAAM,SAA+B,EAAE;AAEvC,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,SAAS,EAAE;GAC9D,MAAM,OAAO,eAAe,MAAM,WAAW,KAAK,IAAI;AAEtD,UAAO,KAAK;IACV,IAAI;IACJ,MAAM,MAAM,WAAW;IACvB,aAAa,MAAM;IACnB;IACA,SAAS,kBAAkB,MAAM,IAAI,eAAe,UAAU,cAAc,EAAE,CAAC;IAChF,CAAC;;AAGJ,MAAI,OAAO,SAAS,EAAG,QAAO;;CAGhC,MAAM,OAAO,eAAe,MAAM,WAAW,MAAM,IAAI;AACvD,QAAO,CACL;EACE,IAAI;EACJ,MAAM;EACN,aACE,OAAO,YAAY,WAAW,WAAW,WAAW,OAAO,cAAc,KAAA;EAC3E;EACA,SAAS,kBAAkB,MAAM,IAAI,eAAe,UAAU,cAAc,EAAE,CAAC;EAChF,CACF;;AAGH,SAAS,eACP,MACA,QACA,WACA,MACgB;CAChB,MAAM,SAAyB;EAC7B,MAAM,EAAE;EACR,QAAQ,EAAE;EACV,QAAQ,EAAE;EACV,OAAO,EAAE;EACT,QAAQ,OAAO;EAChB;AAED,MAAK,MAAM,SAAS,OAAO,cAAc,EAAE,EAAE;EAC3C,IAAI,QAAQ,YAAY,MAAe;AAEvC,MAAI,UAAU,KAAA,KAAa,MAAM;OAC3B,MAAM,OACR,SAAQ,OAAO,MAAM,OAAiB;YAC7B,MAAM,SAAS;IACxB,MAAM,OAAO,iBAAiB,MAAM,QAAQ;IAC5C,MAAM,UAAU,OAAO,MAAM,QAAQ,QAAQ,KAAA;AAC7C,QAAI,CAAC,WAAW,CAAC,QAAQ,OACvB,OAAM,IAAI,MACR,gBAAgB,MAAM,KAAK,mCAAmC,KAAK,OAAO,KAAK,GAAG,OAAO,SAC1F;AAEH,YAAQ,OAAO,QAAQ,OAAiB;;;AAI5C,UAAQ,MAAM,IAAd;GACE,KAAK;AACH,WAAO,OAAO,MAAM,QAAS;AAC7B;GACF,KAAK;AACH,WAAO,OAAO,MAAM,QAAS;AAC7B;GACF,KAAK;AACH,WAAO,MAAM,MAAM,QAAS;AAC5B;GACF,QACE,QAAO,KAAK,MAAM,QAAS;;;AAIjC,KAAI,OAAO,aAAa,SAAS;EAC/B,MAAM,OAAO,OAAO,YAAY;EAChC,MAAM,OAAO,iBAAiB,KAAK;AACnC,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,+BAA+B,KAAK,GAAG,OAAO,OAAO,sBAAsB;AAC7F,SAAO,gBAAgB;EACvB,MAAM,aAAa,KAAK;AAExB,MAAI,WAAW,YAAY,UACzB,QAAO,OAAO,WAAW,SAAS,WAAW;WACpC,WAAW,QACpB,QAAO,OAAO,WAAW;MAEzB,QAAO,OAAO,OAAQ,YAAY,UAAU,EAAE,EAAa;GACzD,cAAc,OAAO,WAAW;GAChC,eAAe,OAAO,WAAW;GACjC,iBAAiB;GAClB,CAAC;;AAIN,QAAO"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { idToTitle } from "../../utils/id-to-title.js";
|
|
2
|
-
import { createMethod, methodKeys } from "../../utils/schema.js";
|
|
2
|
+
import { createMethod, methodKeys } from "../../utils/schema/index.js";
|
|
3
3
|
import { isMediaTypeSupported } from "../../requests/media/resolve-adapter.js";
|
|
4
4
|
import "../../requests/media/adapter.js";
|
|
5
5
|
import { cn } from "../../utils/cn.js";
|
|
6
6
|
import { Badge, MethodLabel } from "../components/method-label.js";
|
|
7
7
|
import { I18nLabel } from "../client/i18n.js";
|
|
8
|
+
import { CopyTypeScriptPanel, OperationProvider } from "./client.js";
|
|
8
9
|
import { APIPlayground } from "../../playground/index.js";
|
|
9
10
|
import { Schema } from "../schema/index.js";
|
|
10
|
-
import { UsageTabsProviderLazy } from "./usage-tabs/lazy.js";
|
|
11
11
|
import { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Accordions } from "../components/accordion.js";
|
|
12
12
|
import { UsageTabs } from "./usage-tabs/index.js";
|
|
13
|
-
import {
|
|
14
|
-
import { RequestTabs, getExampleRequests } from "./request-tabs.js";
|
|
13
|
+
import { RequestTabs } from "./request-tabs.js";
|
|
15
14
|
import { ServerProviderLazy } from "../contexts/api.lazy.js";
|
|
16
|
-
import {
|
|
15
|
+
import { getExampleRequests } from "./get-example-requests.js";
|
|
16
|
+
import { SelectTab, SelectTabTrigger, SelectTabs } from "../components/server-tab.js";
|
|
17
|
+
import { Fragment, use, useMemo } from "react";
|
|
17
18
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
18
19
|
//#region src/ui/operation/index.tsx
|
|
19
20
|
const paramTypeKeys = [
|
|
@@ -22,7 +23,7 @@ const paramTypeKeys = [
|
|
|
22
23
|
"header",
|
|
23
24
|
"cookie"
|
|
24
25
|
];
|
|
25
|
-
|
|
26
|
+
function Operation({ type = "operation", path, method, ctx, showTitle, showDescription, headingLevel = 2 }) {
|
|
26
27
|
const { schema: { dereferenced } } = ctx;
|
|
27
28
|
const body = method.requestBody;
|
|
28
29
|
let headNode = null;
|
|
@@ -31,6 +32,11 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
|
|
|
31
32
|
let authNode = null;
|
|
32
33
|
let responseNode = null;
|
|
33
34
|
let callbacksNode = null;
|
|
35
|
+
const exampleRequests = useMemo(() => getExampleRequests(path, method, ctx), [
|
|
36
|
+
ctx,
|
|
37
|
+
method,
|
|
38
|
+
path
|
|
39
|
+
]);
|
|
34
40
|
if (showTitle) {
|
|
35
41
|
const title = method.summary || (method.operationId ? idToTitle(method.operationId) : path);
|
|
36
42
|
headNode = ctx.renderHeading(headingLevel, title);
|
|
@@ -62,31 +68,15 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
|
|
|
62
68
|
})]
|
|
63
69
|
}),
|
|
64
70
|
body.description && ctx.renderMarkdown(body.description),
|
|
65
|
-
contentTypes.map(
|
|
71
|
+
contentTypes.map(([type, content]) => {
|
|
66
72
|
if (!isMediaTypeSupported(type, ctx.mediaAdapters)) throw new Error(`Media type ${type} is not supported (in ${path})`);
|
|
67
|
-
|
|
68
|
-
operation: method,
|
|
69
|
-
readOnly: false,
|
|
70
|
-
writeOnly: true,
|
|
71
|
-
...ctx
|
|
72
|
-
}) : void 0;
|
|
73
|
-
return /* @__PURE__ */ jsxs(SelectTab, {
|
|
73
|
+
return /* @__PURE__ */ jsx(SelectTab, {
|
|
74
74
|
value: type,
|
|
75
|
-
children:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
className: "mt-4"
|
|
79
|
-
}), /* @__PURE__ */ jsx(Schema, {
|
|
80
|
-
client: {
|
|
81
|
-
name: "body",
|
|
82
|
-
as: "body",
|
|
83
|
-
required: body.required
|
|
84
|
-
},
|
|
85
|
-
root: content.schema ?? {},
|
|
86
|
-
readOnly: method.method === "GET",
|
|
87
|
-
writeOnly: method.method !== "GET",
|
|
75
|
+
children: /* @__PURE__ */ jsx(RequestBodyContentItem, {
|
|
76
|
+
content,
|
|
77
|
+
method,
|
|
88
78
|
ctx
|
|
89
|
-
})
|
|
79
|
+
})
|
|
90
80
|
}, type);
|
|
91
81
|
})
|
|
92
82
|
]
|
|
@@ -231,7 +221,7 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
|
|
|
231
221
|
});
|
|
232
222
|
};
|
|
233
223
|
const playgroundEnabled = ctx.playground?.enabled ?? true;
|
|
234
|
-
let content =
|
|
224
|
+
let content = renderOperationLayout({
|
|
235
225
|
header: headNode,
|
|
236
226
|
description: descriptionNode,
|
|
237
227
|
authSchemes: authNode,
|
|
@@ -258,10 +248,10 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
|
|
|
258
248
|
ctx
|
|
259
249
|
})
|
|
260
250
|
}, ctx, method);
|
|
261
|
-
content = /* @__PURE__ */ jsx(
|
|
251
|
+
content = /* @__PURE__ */ jsx(OperationProvider, {
|
|
262
252
|
defaultExampleId: method["x-exclusiveCodeSample"] ?? method["x-selectedCodeSample"],
|
|
263
253
|
route: path,
|
|
264
|
-
examples:
|
|
254
|
+
examples: exampleRequests,
|
|
265
255
|
children: content
|
|
266
256
|
});
|
|
267
257
|
if (method.servers) content = /* @__PURE__ */ jsx(ServerProviderLazy, {
|
|
@@ -297,6 +287,7 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
|
|
|
297
287
|
parameters: parameterNode,
|
|
298
288
|
responses: responseNode,
|
|
299
289
|
requests: /* @__PURE__ */ jsx(RequestTabs, {
|
|
290
|
+
examples: exampleRequests,
|
|
300
291
|
path,
|
|
301
292
|
operation: method,
|
|
302
293
|
ctx
|
|
@@ -304,7 +295,38 @@ async function Operation({ type = "operation", path, method, ctx, showTitle, sho
|
|
|
304
295
|
});
|
|
305
296
|
}
|
|
306
297
|
}
|
|
307
|
-
|
|
298
|
+
function RequestBodyContentItem({ content, method, ctx }) {
|
|
299
|
+
let ts = useMemo(() => {
|
|
300
|
+
if (!content.schema || !ctx.generateTypeScriptDefinitions) return;
|
|
301
|
+
return ctx.generateTypeScriptDefinitions(content.schema, {
|
|
302
|
+
operation: method,
|
|
303
|
+
readOnly: false,
|
|
304
|
+
writeOnly: true,
|
|
305
|
+
...ctx
|
|
306
|
+
});
|
|
307
|
+
}, [
|
|
308
|
+
content.schema,
|
|
309
|
+
ctx,
|
|
310
|
+
method
|
|
311
|
+
]);
|
|
312
|
+
if (ts instanceof Promise) ts = use(ts);
|
|
313
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [ts && /* @__PURE__ */ jsx(CopyTypeScriptPanel, {
|
|
314
|
+
name: "request body",
|
|
315
|
+
code: ts,
|
|
316
|
+
className: "mt-4"
|
|
317
|
+
}), content.schema && /* @__PURE__ */ jsx(Schema, {
|
|
318
|
+
client: {
|
|
319
|
+
name: "body",
|
|
320
|
+
as: "body",
|
|
321
|
+
required: method.requestBody?.required
|
|
322
|
+
},
|
|
323
|
+
root: content.schema,
|
|
324
|
+
readOnly: method.method === "GET",
|
|
325
|
+
writeOnly: method.method !== "GET",
|
|
326
|
+
ctx
|
|
327
|
+
})] });
|
|
328
|
+
}
|
|
329
|
+
function ResponseAccordion({ status, operation, ctx }) {
|
|
308
330
|
const response = operation.responses[status];
|
|
309
331
|
const contentTypes = response.content ? Object.entries(response.content) : [];
|
|
310
332
|
let wrapper = (children) => children;
|
|
@@ -336,41 +358,57 @@ async function ResponseAccordion({ status, operation, ctx }) {
|
|
|
336
358
|
children: [response.description && /* @__PURE__ */ jsx("div", {
|
|
337
359
|
className: "prose-no-margin mb-2",
|
|
338
360
|
children: ctx.renderMarkdown(response.description)
|
|
339
|
-
}), contentTypes.map(
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
361
|
+
}), contentTypes.map(([type, item]) => /* @__PURE__ */ jsx(SelectTab, {
|
|
362
|
+
value: type,
|
|
363
|
+
className: "mb-2",
|
|
364
|
+
children: /* @__PURE__ */ jsx(RepsonseAccordionItem, {
|
|
365
|
+
type,
|
|
366
|
+
status,
|
|
367
|
+
item,
|
|
344
368
|
operation,
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
},
|
|
349
|
-
...ctx
|
|
350
|
-
}) : void 0;
|
|
351
|
-
return /* @__PURE__ */ jsxs(SelectTab, {
|
|
352
|
-
value: type,
|
|
353
|
-
className: "mb-2",
|
|
354
|
-
children: [ts && /* @__PURE__ */ jsx(CopyTypeScriptPanel, {
|
|
355
|
-
name: "response body",
|
|
356
|
-
code: ts
|
|
357
|
-
}), schema && /* @__PURE__ */ jsx("div", {
|
|
358
|
-
className: "border px-3 py-2 rounded-lg",
|
|
359
|
-
children: /* @__PURE__ */ jsx(Schema, {
|
|
360
|
-
client: {
|
|
361
|
-
name: "response",
|
|
362
|
-
as: "body"
|
|
363
|
-
},
|
|
364
|
-
root: schema,
|
|
365
|
-
readOnly: true,
|
|
366
|
-
ctx
|
|
367
|
-
})
|
|
368
|
-
})]
|
|
369
|
-
}, type);
|
|
370
|
-
})]
|
|
369
|
+
ctx
|
|
370
|
+
})
|
|
371
|
+
}, type))]
|
|
371
372
|
})]
|
|
372
373
|
}));
|
|
373
374
|
}
|
|
375
|
+
function RepsonseAccordionItem({ type, status, operation, item: { schema }, ctx }) {
|
|
376
|
+
let ts = useMemo(() => {
|
|
377
|
+
if (!schema || !ctx.generateTypeScriptDefinitions) return;
|
|
378
|
+
return ctx.generateTypeScriptDefinitions(schema, {
|
|
379
|
+
readOnly: true,
|
|
380
|
+
writeOnly: false,
|
|
381
|
+
operation,
|
|
382
|
+
_internal_legacy: {
|
|
383
|
+
statusCode: status,
|
|
384
|
+
contentType: type
|
|
385
|
+
},
|
|
386
|
+
...ctx
|
|
387
|
+
});
|
|
388
|
+
}, [
|
|
389
|
+
ctx,
|
|
390
|
+
operation,
|
|
391
|
+
schema,
|
|
392
|
+
status,
|
|
393
|
+
type
|
|
394
|
+
]);
|
|
395
|
+
if (ts instanceof Promise) ts = use(ts);
|
|
396
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [ts && /* @__PURE__ */ jsx(CopyTypeScriptPanel, {
|
|
397
|
+
name: "response body",
|
|
398
|
+
code: ts
|
|
399
|
+
}), schema && /* @__PURE__ */ jsx("div", {
|
|
400
|
+
className: "border px-3 py-2 rounded-lg",
|
|
401
|
+
children: /* @__PURE__ */ jsx(Schema, {
|
|
402
|
+
client: {
|
|
403
|
+
name: "response",
|
|
404
|
+
as: "body"
|
|
405
|
+
},
|
|
406
|
+
root: schema,
|
|
407
|
+
readOnly: true,
|
|
408
|
+
ctx
|
|
409
|
+
})
|
|
410
|
+
})] });
|
|
411
|
+
}
|
|
374
412
|
function WebhookCallback({ callback, ctx, headingLevel }) {
|
|
375
413
|
return /* @__PURE__ */ jsx(Accordions, {
|
|
376
414
|
type: "single",
|
|
@@ -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.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
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/operation/index.tsx"],"sourcesContent":["import { type ComponentProps, Fragment, use, useMemo, type ReactNode } from 'react';\nimport type {\n CallbackObject,\n MediaTypeObject,\n MethodInformation,\n RenderContext,\n SecuritySchemeObject,\n ServerObject,\n} from '@/types';\nimport { createMethod, methodKeys, type NoReference } 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, OperationProvider } 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 { RequestTabs } from './request-tabs';\nimport { ServerProviderLazy } from '../contexts/api.lazy';\nimport { cn } from '@/utils/cn';\nimport { getExampleRequests } from './get-example-requests';\nimport { SelectTabs, SelectTabTrigger, SelectTab } from '../components/server-tab';\n\nconst paramTypeKeys = ['path', 'query', 'header', 'cookie'] as const;\n\nexport 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 const exampleRequests = useMemo(() => getExampleRequests(path, method, ctx), [ctx, method, path]);\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(([type, content]) => {\n if (!isMediaTypeSupported(type, ctx.mediaAdapters)) {\n throw new Error(`Media type ${type} is not supported (in ${path})`);\n }\n\n return (\n <SelectTab key={type} value={type}>\n <RequestBodyContentItem content={content} method={method} ctx={ctx} />\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\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 = 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 <OperationProvider\n defaultExampleId={method['x-exclusiveCodeSample'] ?? method['x-selectedCodeSample']}\n route={path}\n examples={exampleRequests}\n >\n {content}\n </OperationProvider>\n );\n if (method.servers) {\n content = (\n <ServerProviderLazy servers={method.servers as ServerObject[]}>\n {content}\n </ServerProviderLazy>\n );\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 examples={exampleRequests} path={path} operation={method} ctx={ctx} />,\n });\n }\n}\n\nfunction RequestBodyContentItem({\n content,\n method,\n ctx,\n}: {\n content: NoReference<MediaTypeObject>;\n method: MethodInformation;\n ctx: RenderContext;\n}) {\n let ts = useMemo(() => {\n if (!content.schema || !ctx.generateTypeScriptDefinitions) return;\n return ctx.generateTypeScriptDefinitions(content.schema, {\n operation: method,\n readOnly: false,\n writeOnly: true,\n ...ctx,\n });\n }, [content.schema, ctx, method]);\n if (ts instanceof Promise) ts = use(ts);\n\n return (\n <>\n {ts && <CopyTypeScriptPanel name=\"request body\" code={ts} className=\"mt-4\" />}\n {content.schema && (\n <Schema\n client={{\n name: 'body',\n as: 'body',\n required: method.requestBody?.required,\n }}\n root={content.schema}\n readOnly={method.method === 'GET'}\n writeOnly={method.method !== 'GET'}\n ctx={ctx}\n />\n )}\n </>\n );\n}\n\nfunction 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(([type, item]) => (\n <SelectTab key={type} value={type} className=\"mb-2\">\n <RepsonseAccordionItem\n type={type}\n status={status}\n item={item}\n operation={operation}\n ctx={ctx}\n />\n </SelectTab>\n ))}\n </AccordionContent>\n </AccordionItem>,\n );\n}\n\nfunction RepsonseAccordionItem({\n type,\n status,\n operation,\n item: { schema },\n ctx,\n}: {\n type: string;\n status: string;\n operation: MethodInformation;\n item: NoReference<MediaTypeObject>;\n ctx: RenderContext;\n}) {\n let ts = useMemo(() => {\n if (!schema || !ctx.generateTypeScriptDefinitions) return;\n return 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 }, [ctx, operation, schema, status, type]);\n // assume it is on server component when returned async\n if (ts instanceof Promise) ts = use(ts);\n\n return (\n <>\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 </>\n );\n}\n\nfunction WebhookCallback({\n callback,\n ctx,\n headingLevel,\n}: {\n callback: NoReference<CallbackObject>;\n ctx: RenderContext;\n headingLevel: number;\n}) {\n return (\n <Accordions type=\"single\" collapsible>\n {Object.entries(callback).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}) {\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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"}
|