fumadocs-openapi 9.7.1 → 9.7.2

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 (31) hide show
  1. package/dist/playground/client.d.ts.map +1 -1
  2. package/dist/playground/client.js +9 -9
  3. package/dist/playground/fetcher.d.ts.map +1 -1
  4. package/dist/playground/fetcher.js +2 -1
  5. package/dist/playground/inputs.d.ts.map +1 -1
  6. package/dist/playground/inputs.js +4 -3
  7. package/dist/playground/schema.d.ts.map +1 -1
  8. package/dist/playground/schema.js +2 -3
  9. package/dist/render/operation/get-request-data.d.ts.map +1 -1
  10. package/dist/render/operation/get-request-data.js +19 -12
  11. package/dist/render/operation/index.d.ts.map +1 -1
  12. package/dist/render/operation/index.js +2 -1
  13. package/dist/requests/generators/csharp.d.ts.map +1 -1
  14. package/dist/requests/generators/csharp.js +4 -2
  15. package/dist/requests/generators/go.d.ts.map +1 -1
  16. package/dist/requests/generators/go.js +4 -2
  17. package/dist/requests/generators/java.d.ts.map +1 -1
  18. package/dist/requests/generators/java.js +4 -3
  19. package/dist/requests/generators/javascript.d.ts.map +1 -1
  20. package/dist/requests/generators/javascript.js +4 -2
  21. package/dist/requests/generators/python.d.ts.map +1 -1
  22. package/dist/requests/generators/python.js +4 -2
  23. package/dist/requests/media/adapter.d.ts +1 -1
  24. package/dist/requests/media/adapter.d.ts.map +1 -1
  25. package/dist/requests/media/adapter.js +1 -0
  26. package/dist/requests/media/encode.d.ts.map +1 -1
  27. package/dist/requests/media/encode.js +4 -2
  28. package/dist/requests/media/resolve-adapter.d.ts +19 -0
  29. package/dist/requests/media/resolve-adapter.d.ts.map +1 -0
  30. package/dist/requests/media/resolve-adapter.js +33 -0
  31. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/playground/client.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EAAE,EAEP,KAAK,cAAc,EAEnB,KAAK,YAAY,EAKlB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAUzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,oBAAoB,CAAC;AAuC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IAEd,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,WAAW,CAAC,KAAK,SAAS,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;IACpE,MAAM,EAAE,CAAC,KAAK,EAAE;QACd;;WAEG;QACH,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChD,UAAU,EAAE,oBAAoB,CAAC;QACjC,SAAS,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;KAC3C,KAAK,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,eAAe,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,UAAU,EAAE,aAAa,EAAE,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,aAAa,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,WAAW,CACrB,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,EACnC,cAAc,CACf,CAAC;QACF,IAAI,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;KAC3C,CAAC;IAEF,UAAU,CAAC,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,EAAE,CAAC;YAAE,IAAI,EAAE,WAAW,CAAA;SAAE,CAAC,CAAC;KAC1C,CAAC,CAAC;CACJ;AAgBD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,KAAK,EACL,MAAc,EACd,UAAU,EACV,UAAe,EACf,IAAI,EACJ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,UAAU,EAAE,EAAE,aAAoC,EAAO,EACzD,cAAmB,EACnB,GAAG,IAAI,EACR,EAAE,WAAW,2CA0Kb"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/playground/client.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EAAE,EAEP,KAAK,cAAc,EAEnB,KAAK,YAAY,EAKlB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAUzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,oBAAoB,CAAC;AAuC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IAEd,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,WAAW,CAAC,KAAK,SAAS,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;IACpE,MAAM,EAAE,CAAC,KAAK,EAAE;QACd;;WAEG;QACH,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChD,UAAU,EAAE,oBAAoB,CAAC;QACjC,SAAS,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;KAC3C,KAAK,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,eAAe,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,UAAU,EAAE,aAAa,EAAE,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,aAAa,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,WAAW,CACrB,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,EACnC,cAAc,CACf,CAAC;QACF,IAAI,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;KAC3C,CAAC;IAEF,UAAU,CAAC,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,EAAE,CAAC;YAAE,IAAI,EAAE,WAAW,CAAA;SAAE,CAAC,CAAC;KAC1C,CAAC,CAAC;CACJ;AAgBD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,KAAK,EACL,MAAc,EACd,UAAU,EACV,UAAe,EACf,IAAI,EACJ,MAAM,EACN,UAAU,EACV,QAAQ,EACR,UAAU,EAAE,EAAE,aAAoC,EAAO,EACzD,cAAmB,EACnB,GAAG,IAAI,EACR,EAAE,WAAW,2CAyKb"}
@@ -53,10 +53,6 @@ export default function Client({ route, method = 'GET', securities, parameters =
53
53
  ...input._encoded,
54
54
  });
55
55
  });
56
- const onUpdateDefaults = useEffectEvent(() => {
57
- fieldInfoMap.clear();
58
- form.reset(initAuthValues(defaultValues, inputs));
59
- });
60
56
  const onUpdateDebounced = useEffectEvent((values) => {
61
57
  for (const item of inputs) {
62
58
  const value = get(values, item.fieldName);
@@ -72,9 +68,6 @@ export default function Client({ route, method = 'GET', securities, parameters =
72
68
  values._encoded ?? (values._encoded = encodeRequestData(data, mediaAdapters, parameters));
73
69
  updater.setData(data, values._encoded);
74
70
  });
75
- useEffect(() => {
76
- onUpdateDefaults();
77
- }, [requestDataKey]);
78
71
  useEffect(() => {
79
72
  let timer = null;
80
73
  const subscription = form.subscribe({
@@ -104,6 +97,13 @@ export default function Client({ route, method = 'GET', securities, parameters =
104
97
  };
105
98
  // eslint-disable-next-line react-hooks/exhaustive-deps -- mounted once only
106
99
  }, [inputs]);
100
+ useEffect(() => {
101
+ return () => {
102
+ fieldInfoMap.clear();
103
+ form.reset(initAuthValues(defaultValues, inputs));
104
+ };
105
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- for on change
106
+ }, [requestDataKey]);
107
107
  const onSubmit = form.handleSubmit((value) => {
108
108
  testQuery.start(mapInputs(value));
109
109
  });
@@ -292,11 +292,11 @@ function Route({ route, ...props }) {
292
292
  function DefaultResultDisplay({ data }) {
293
293
  const statusInfo = useMemo(() => getStatusInfo(data.status), [data.status]);
294
294
  const { shikiOptions } = useApiContext();
295
- return (_jsxs("div", { className: "flex flex-col gap-3 p-3", children: [_jsxs("div", { className: "inline-flex items-center gap-1.5 text-sm font-medium text-fd-foreground", children: [_jsx(statusInfo.icon, { className: cn('size-4', statusInfo.color) }), statusInfo.description] }), _jsx("p", { className: "text-sm text-fd-muted-foreground", children: data.status }), data.data ? (_jsx(DynamicCodeBlock, { lang: typeof data.data === 'string' && data.data.length > 50000
295
+ return (_jsxs("div", { className: "flex flex-col gap-3 p-3", children: [_jsxs("div", { className: "inline-flex items-center gap-1.5 text-sm font-medium text-fd-foreground", children: [_jsx(statusInfo.icon, { className: cn('size-4', statusInfo.color) }), statusInfo.description] }), _jsx("p", { className: "text-sm text-fd-muted-foreground", children: data.status }), data.data !== undefined && (_jsx(DynamicCodeBlock, { lang: typeof data.data === 'string' && data.data.length > 50000
296
296
  ? 'text'
297
297
  : data.type, code: typeof data.data === 'string'
298
298
  ? data.data
299
- : JSON.stringify(data.data, null, 2), options: shikiOptions })) : null] }));
299
+ : JSON.stringify(data.data, null, 2), options: shikiOptions }))] }));
300
300
  }
301
301
  function CollapsiblePanel({ title, children, ...props }) {
302
302
  return (_jsxs(Collapsible, { ...props, className: "border-b last:border-b-0", children: [_jsxs(CollapsibleTrigger, { className: "group w-full flex items-center gap-2 p-3 text-sm font-medium", children: [title, _jsx(ChevronDown, { className: "ms-auto size-3.5 text-fd-muted-foreground group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { children: _jsx("div", { className: "flex flex-col gap-3 p-3 pt-1", children: children }) })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/playground/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACrE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EACtC,cAAc,EAAE,MAAM,GACrB,OAAO,CAwFT"}
1
+ {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/playground/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACrE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EACtC,cAAc,EAAE,MAAM,GACrB,OAAO,CAwFT"}
@@ -1,3 +1,4 @@
1
+ import { resolveMediaAdapter } from '../requests/media/adapter.js';
1
2
  export function createBrowserFetcher(adapters, requestTimeout) {
2
3
  return {
3
4
  async fetch(url, options) {
@@ -23,7 +24,7 @@ export function createBrowserFetcher(adapters, requestTimeout) {
23
24
  }
24
25
  let body = undefined;
25
26
  if (options.bodyMediaType && options.body) {
26
- const adapter = adapters[options.bodyMediaType];
27
+ const adapter = resolveMediaAdapter(options.bodyMediaType, adapters);
27
28
  if (!adapter)
28
29
  return {
29
30
  status: 400,
@@ -1 +1 @@
1
- {"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/playground/inputs.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAef,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAkDxD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,SAAS,EACT,GAAG,KAAK,EACT,EAAE;IACD,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,cAAc,CAAC,KAAK,CAAC,uDAwCxB;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,2CA8B7D;AA6FD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,EACT,UAAU,EACV,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG;IAC/B,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB,uDAmGA;AAED,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EAAE,MAAM,EACb,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,KAAS,EACT,QAAQ,EACR,WAAkB,EAClB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,kDA4KA"}
1
+ {"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/playground/inputs.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAef,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAkDxD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,SAAS,EACT,GAAG,KAAK,EACT,EAAE;IACD,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,cAAc,CAAC,KAAK,CAAC,uDAwCxB;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,2CA8B7D;AA6FD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,EACT,UAAU,EACV,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG;IAC/B,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB,uDAoGA;AAED,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EAAE,MAAM,EACb,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,KAAS,EACT,QAAQ,EACR,WAAkB,EAClB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,kDA4KA"}
@@ -93,9 +93,9 @@ function DynamicProperties({ fieldName, filterKey = () => true, getType = () =>
93
93
  } }), _jsx("button", { type: "button", className: cn(buttonVariants({ color: 'secondary', size: 'sm' }), 'px-4'), onClick: onAppend, children: "New" })] })] }));
94
94
  }
95
95
  export function FieldInput({ field, fieldName, isRequired, ...props }) {
96
- const { control, reset } = useFormContext();
96
+ const form = useFormContext();
97
97
  const { field: { value, onChange, ...restField }, } = useController({
98
- control,
98
+ control: form.control,
99
99
  name: fieldName,
100
100
  });
101
101
  if (field.type === 'string' && field.format === 'binary') {
@@ -114,7 +114,8 @@ export function FieldInput({ field, fieldName, isRequired, ...props }) {
114
114
  if (field.type === 'null')
115
115
  return;
116
116
  return (_jsxs("div", { ...props, className: cn('flex flex-row gap-2', props.className), children: [_jsx(Input, { id: fieldName, placeholder: "Enter value", type: field.type === 'string' ? 'text' : 'number', step: field.type === 'number' ? 'any' : undefined, value: value ?? '', onChange: onChange, ...restField }), !isRequired && value !== undefined && (_jsx("button", { type: "button", onClick: () => {
117
- reset((values) => {
117
+ // TODO: react-hook-form `reset()` cannot clear default values
118
+ form.reset((values) => {
118
119
  set(values, fieldName, undefined);
119
120
  return values;
120
121
  });
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/playground/schema.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAiB,SAAS,EAAiC,MAAM,OAAO,CAAC;AAMhF,UAAU,iBAAiB;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,GAAG,EAAE,OAAO,CAAC;CACd;AAED,KAAK,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAGD,eAAO,MAAM,SAAS;;;;CAIG,CAAC;AAE1B,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,YAAY,EACZ,QAAQ,GACT,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAsB1D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,EACvC,KAAK,EAAE,MAAM,GACZ;IACD,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;CACjD,CAqEA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAQjC;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAEjC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/playground/schema.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAiB,SAAS,EAAiC,MAAM,OAAO,CAAC;AAKhF,UAAU,iBAAiB;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,GAAG,EAAE,OAAO,CAAC;CACd;AAED,KAAK,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAGD,eAAO,MAAM,SAAS;;;;CAIG,CAAC;AAE1B,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,YAAY,EACZ,QAAQ,GACT,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAsB1D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,EACvC,KAAK,EAAE,MAAM,GACZ;IACD,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;CACjD,CAqEA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAQjC;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAEjC"}
@@ -2,7 +2,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Ajv2020 } from 'ajv/dist/2020';
3
3
  import { createContext, useContext, useMemo, useState } from 'react';
4
4
  import { useFormContext } from 'react-hook-form';
5
- import { useEffectEvent } from 'fumadocs-core/utils/use-effect-event';
6
5
  import { getDefaultValue } from '../playground/get-default-values.js';
7
6
  const SchemaContext = createContext(undefined);
8
7
  export const anyFields = {
@@ -63,7 +62,7 @@ export function useFieldInfo(fieldName, schema, depth) {
63
62
  fieldInfoMap.set(keyName, info);
64
63
  return {
65
64
  info,
66
- updateInfo: useEffectEvent((value) => {
65
+ updateInfo: (value) => {
67
66
  const updated = {
68
67
  ...info,
69
68
  ...value,
@@ -80,7 +79,7 @@ export function useFieldInfo(fieldName, schema, depth) {
80
79
  valueSchema = { ...schema, type: updated.selectedType };
81
80
  }
82
81
  form.setValue(fieldName, getDefaultValue(valueSchema));
83
- }),
82
+ },
84
83
  };
85
84
  }
86
85
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"get-request-data.d.ts","sourceRoot":"","sources":["../../../src/render/operation/get-request-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,aAAa,GAClB,cAAc,CA8DhB"}
1
+ {"version":3,"file":"get-request-data.d.ts","sourceRoot":"","sources":["../../../src/render/operation/get-request-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,aAAa,GAClB,cAAc,CAwEhB"}
@@ -14,25 +14,32 @@ export function getRequestData(path, method, sampleKey, _ctx) {
14
14
  if (!schema && param.content) {
15
15
  const type = getPreferredType(param.content);
16
16
  const content = type ? param.content[type] : undefined;
17
- if (!content)
17
+ if (!content || !content.schema)
18
18
  throw new Error(`Cannot find parameter schema for ${param.name} in ${path} ${method.method}`);
19
19
  schema = content.schema;
20
- value = content.example ?? param.example ?? sample(schema);
20
+ value = content.example ?? param.example;
21
21
  }
22
22
  else {
23
- value = param.example ?? sample(schema);
23
+ value = param.example;
24
24
  }
25
- if (param.in === 'cookie') {
26
- result.cookie[param.name] = value;
25
+ if (param.required) {
26
+ value ?? (value = sample(schema));
27
27
  }
28
- else if (param.in === 'header') {
29
- result.header[param.name] = value;
28
+ else if (value === undefined) {
29
+ continue;
30
30
  }
31
- else if (param.in === 'query') {
32
- result.query[param.name] = value;
33
- }
34
- else if (param.in === 'path') {
35
- result.path[param.name] = value;
31
+ switch (param.in) {
32
+ case 'cookie':
33
+ result.cookie[param.name] = value;
34
+ break;
35
+ case 'header':
36
+ result.header[param.name] = value;
37
+ break;
38
+ case 'query':
39
+ result.query[param.name] = value;
40
+ break;
41
+ default:
42
+ result.path[param.name] = value;
36
43
  }
37
44
  }
38
45
  if (method.requestBody) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/render/operation/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,YAAY,EAAkB,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EAEV,iBAAiB,EACjB,aAAa,EAEd,MAAM,SAAS,CAAC;AAiBjB,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYxD,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAE7C;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC;CACnB;AASD,wBAAgB,SAAS,CAAC,EACxB,IAAkB,EAClB,IAAI,EACJ,MAAM,EACN,GAAG,EACH,OAAO,EACP,YAAgB,GACjB,EAAE;IACD,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,GAAG,EAAE,aAAa,CAAC;IAEnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,YAAY,CAiNf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/render/operation/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,YAAY,EAAkB,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EAEV,iBAAiB,EACjB,aAAa,EAEd,MAAM,SAAS,CAAC;AAiBjB,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAaxD,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAE7C;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC;CACnB;AASD,wBAAgB,SAAS,CAAC,EACxB,IAAkB,EAClB,IAAI,EACJ,MAAM,EACN,GAAG,EACH,OAAO,EACP,YAAgB,GACjB,EAAE;IACD,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,GAAG,EAAE,aAAa,CAAC;IAEnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,YAAY,CAiNf"}
@@ -11,6 +11,7 @@ import { getTypescriptSchema } from '../../utils/get-typescript-schema.js';
11
11
  import { CopyResponseTypeScript } from '../../ui/client.js';
12
12
  import { SelectTab, SelectTabs, SelectTabTrigger } from '../../ui/select-tabs.js';
13
13
  import { AccordionContent, AccordionHeader, AccordionItem, Accordions, AccordionTrigger, } from '../../ui/components/accordion.js';
14
+ import { isMediaTypeSupported } from '../../requests/media/adapter.js';
14
15
  const ParamTypes = {
15
16
  path: 'Path Parameters',
16
17
  query: 'Query Parameters',
@@ -34,7 +35,7 @@ export function Operation({ type = 'operation', path, method, ctx, hasHead, head
34
35
  const contentTypes = body ? Object.entries(body.content) : null;
35
36
  if (body && contentTypes && contentTypes.length > 0) {
36
37
  bodyNode = (_jsxs(SelectTabs, { defaultValue: contentTypes[0][0], children: [_jsxs("div", { className: "flex gap-2 items-end justify-between", children: [heading(headingLevel, 'Request Body', ctx), _jsx(SelectTabTrigger, { items: contentTypes.map((v) => v[0]), className: "mb-4" })] }), body.description && _jsx(Markdown, { text: body.description }), contentTypes.map(([type, content]) => {
37
- if (!(type in ctx.mediaAdapters)) {
38
+ if (!isMediaTypeSupported(type, ctx.mediaAdapters)) {
38
39
  throw new Error(`Media type ${type} is not supported (in ${path})`);
39
40
  }
40
41
  return (_jsx(SelectTab, { value: type, children: _jsx(Schema, { name: "body", as: "body", root: (content.schema ?? {}), required: body.required, readOnly: method.method === 'GET', writeOnly: method.method !== 'GET', ctx: ctx }) }, type));
@@ -1 +1 @@
1
- {"version":3,"file":"csharp.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/csharp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,eAAO,MAAM,SAAS,EAAE,eAkEvB,CAAC"}
1
+ {"version":3,"file":"csharp.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/csharp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,eAAO,MAAM,SAAS,EAAE,eAgEvB,CAAC"}
@@ -1,12 +1,14 @@
1
1
  'use client';
2
+ import { resolveMediaAdapter } from '../../requests/media/adapter.js';
2
3
  export const generator = (url, data, { mediaAdapters }) => {
3
4
  const s = [];
4
5
  const imports = new Set(['System', 'System.Net.Http', 'System.Text']);
5
6
  const headers = { ...data.header };
6
7
  // Handle request body
7
8
  let body;
8
- if (data.body && data.bodyMediaType && data.bodyMediaType in mediaAdapters) {
9
- body = mediaAdapters[data.bodyMediaType].generateExample(data, {
9
+ if (data.body && data.bodyMediaType) {
10
+ const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);
11
+ body = adapter?.generateExample(data, {
10
12
  lang: 'csharp',
11
13
  addImport(from) {
12
14
  imports.add(from);
@@ -1 +1 @@
1
- {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/go.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,eAAO,MAAM,SAAS,EAAE,eA2DvB,CAAC"}
1
+ {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/go.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,eAAO,MAAM,SAAS,EAAE,eAyDvB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import { ident } from '../../requests/string-utils.js';
3
+ import { resolveMediaAdapter } from '../../requests/media/adapter.js';
3
4
  export const generator = (url, data, { mediaAdapters }) => {
4
5
  const imports = ['fmt', 'net/http', 'io/ioutil'];
5
6
  const headers = new Map();
@@ -13,9 +14,10 @@ export const generator = (url, data, { mediaAdapters }) => {
13
14
  headers.set('Cookie', JSON.stringify(cookies.map(([k, param]) => `${k}=${param.value}`).join('; ')));
14
15
  }
15
16
  let body;
16
- if (data.body && data.bodyMediaType && data.bodyMediaType in mediaAdapters) {
17
+ if (data.body && data.bodyMediaType) {
18
+ const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);
17
19
  headers.set('Content-Type', `"${data.bodyMediaType}"`);
18
- body = mediaAdapters[data.bodyMediaType].generateExample(data, {
20
+ body = adapter?.generateExample(data, {
19
21
  lang: 'go',
20
22
  addImport(from) {
21
23
  imports.push(from);
@@ -1 +1 @@
1
- {"version":3,"file":"java.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/java.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,eAAO,MAAM,SAAS,EAAE,eAqFvB,CAAC"}
1
+ {"version":3,"file":"java.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/java.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,eAAO,MAAM,SAAS,EAAE,eAoFvB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import { ident } from '../../requests/string-utils.js';
3
+ import { resolveMediaAdapter } from '../../requests/media/adapter.js';
3
4
  export const generator = (url, data, { mediaAdapters }) => {
4
5
  const s = [];
5
6
  const headers = { ...data.header };
@@ -13,9 +14,9 @@ export const generator = (url, data, { mediaAdapters }) => {
13
14
  ]);
14
15
  // Handle body if present
15
16
  let body;
16
- if (data.body && data.bodyMediaType && data.bodyMediaType in mediaAdapters) {
17
- const adapter = mediaAdapters[data.bodyMediaType];
18
- body = adapter.generateExample(data, {
17
+ if (data.body && data.bodyMediaType) {
18
+ const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);
19
+ body = adapter?.generateExample(data, {
19
20
  lang: 'java',
20
21
  addImport(specifier) {
21
22
  imports.add(specifier);
@@ -1 +1 @@
1
- {"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/javascript.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,eAAO,MAAM,SAAS,EAAE,eAuDvB,CAAC"}
1
+ {"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/javascript.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,eAAO,MAAM,SAAS,EAAE,eAqDvB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import { ident } from '../../requests/string-utils.js';
3
+ import { resolveMediaAdapter } from '../../requests/media/adapter.js';
3
4
  export const generator = (url, data, { mediaAdapters }) => {
4
5
  const s = [];
5
6
  const options = new Map();
@@ -21,8 +22,9 @@ export const generator = (url, data, { mediaAdapters }) => {
21
22
  options.set('headers', JSON.stringify(headers, null, 2));
22
23
  }
23
24
  let body;
24
- if (data.body && data.bodyMediaType && data.bodyMediaType in mediaAdapters) {
25
- body = mediaAdapters[data.bodyMediaType].generateExample(data, {
25
+ if (data.body && data.bodyMediaType) {
26
+ const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);
27
+ body = adapter?.generateExample(data, {
26
28
  lang: 'js',
27
29
  addImport(from, name) {
28
30
  s.unshift(`import { ${name} } from "${from}"`);
@@ -1 +1 @@
1
- {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/python.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,eAAO,MAAM,SAAS,EAAE,eAmDvB,CAAC"}
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/requests/generators/python.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIxD,eAAO,MAAM,SAAS,EAAE,eAiDvB,CAAC"}
@@ -1,14 +1,16 @@
1
1
  'use client';
2
2
  import { generatePythonObject } from '../../requests/to-python-object.js';
3
+ import { resolveMediaAdapter } from '../../requests/media/adapter.js';
3
4
  export const generator = (url, data, { mediaAdapters }) => {
4
5
  const headers = {};
5
6
  const imports = new Set();
6
7
  const params = [`"${data.method}"`, 'url'];
7
8
  let body;
8
9
  imports.add('requests');
9
- if (data.body && data.bodyMediaType && data.bodyMediaType in mediaAdapters) {
10
+ if (data.body && data.bodyMediaType) {
11
+ const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);
10
12
  headers['Content-Type'] = data.bodyMediaType;
11
- body = mediaAdapters[data.bodyMediaType].generateExample(data, {
13
+ body = adapter?.generateExample(data, {
12
14
  lang: 'python',
13
15
  });
14
16
  if (body) {
@@ -1,3 +1,4 @@
1
+ export { resolveMediaAdapter, isMediaTypeSupported } from './resolve-adapter.js';
1
2
  interface BaseContext {
2
3
  /**
3
4
  * Passed by your custom example generator, for your custom media adapter to receive.
@@ -99,5 +100,4 @@ export declare const defaultAdapters: {
99
100
  generateExample(): undefined;
100
101
  };
101
102
  };
102
- export {};
103
103
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/requests/media/adapter.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,UAAU,SAAU,SAAQ,WAAW;IACrC,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,UAAU,iBAAkB,SAAQ,WAAW;IAC7C,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED,UAAU,WAAY,SAAQ,WAAW;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,UAAU,aAAc,SAAQ,WAAW;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,SAAS,GACT,iBAAiB,GACjB,aAAa,GACb,CAAC,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;;;OAIG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,QAAQ,CAAC;IAE9C;;;;;;;;OAQG;IACH,eAAe,EAAE,CACf,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,EACvB,GAAG,EAAE,YAAY,KACd,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,eAAO,MAAM,eAAe;;;kBAjBH,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;YAgLN,QAAQ;;;CAOM,CAAC"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/requests/media/adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAI9E,UAAU,WAAW;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,UAAU,SAAU,SAAQ,WAAW;IACrC,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,UAAU,iBAAkB,SAAQ,WAAW;IAC7C,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED,UAAU,WAAY,SAAQ,WAAW;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,UAAU,aAAc,SAAQ,WAAW;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,SAAS,GACT,iBAAiB,GACjB,aAAa,GACb,CAAC,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;;;OAIG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,QAAQ,CAAC;IAE9C;;;;;;;;OAQG;IACH,eAAe,EAAE,CACf,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,EACvB,GAAG,EAAE,YAAY,KACd,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,eAAO,MAAM,eAAe;;;kBAjBH,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;;;kBAYd,OAAO;;;;;kBAZA,OAAO;YAgLN,QAAQ;;;CAOM,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { escapeString, inputToString } from '../../requests/string-utils.js';
2
+ export { resolveMediaAdapter, isMediaTypeSupported } from './resolve-adapter.js';
2
3
  // @ts-expect-error -- untyped
3
4
  import js2xml from 'xml-js/lib/js2xml';
4
5
  export const defaultAdapters = {
@@ -1 +1 @@
1
- {"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../../src/requests/media/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACnC;AAYD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EACtC,UAAU,EAAE,WAAW,CAAC,eAAe,CAAC,EAAE,GACzC,WAAW,CA+Fb"}
1
+ {"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../../src/requests/media/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACnC;AAYD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EACtC,UAAU,EAAE,WAAW,CAAC,eAAe,CAAC,EAAE,GACzC,WAAW,CA+Fb"}
@@ -1,3 +1,4 @@
1
+ import { resolveMediaAdapter } from '../../requests/media/adapter.js';
1
2
  const FormDelimiter = {
2
3
  spaceDelimited: ' ',
3
4
  pipeDelimited: '|',
@@ -89,8 +90,9 @@ function getMediaEncoder(field, adapters) {
89
90
  if (!field.content)
90
91
  return;
91
92
  for (const k in field.content) {
92
- if (k in adapters) {
93
- return (v) => String(adapters[k].encode({ body: v }));
93
+ const adapter = resolveMediaAdapter(k, adapters);
94
+ if (adapter) {
95
+ return (v) => String(adapter.encode({ body: v }));
94
96
  }
95
97
  }
96
98
  }
@@ -0,0 +1,19 @@
1
+ import type { MediaAdapter } from './adapter.js';
2
+ /**
3
+ * Resolve a media adapter for a given media type.
4
+ * Supports exact matches and pattern matching (e.g., +json suffix).
5
+ *
6
+ * @param mediaType - The media type to resolve (e.g., "application/json", "application/json-patch+json")
7
+ * @param adapters - Record of media adapters
8
+ * @returns The resolved adapter or undefined if not found
9
+ */
10
+ export declare function resolveMediaAdapter(mediaType: string, adapters: Record<string, MediaAdapter>): MediaAdapter | undefined;
11
+ /**
12
+ * Check if a media type is supported by the given adapters.
13
+ *
14
+ * @param mediaType - The media type to check
15
+ * @param adapters - Record of media adapters
16
+ * @returns true if the media type is supported
17
+ */
18
+ export declare function isMediaTypeSupported(mediaType: string, adapters: Record<string, MediaAdapter>): boolean;
19
+ //# sourceMappingURL=resolve-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-adapter.d.ts","sourceRoot":"","sources":["../../../src/requests/media/resolve-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAK9C;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GACrC,YAAY,GAAG,SAAS,CAgB1B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GACrC,OAAO,CAET"}
@@ -0,0 +1,33 @@
1
+ const VariantMediaTypeRegex = /^(?<dir>[a-zA-Z0-9._-]+)\/(?<content>[a-zA-Z0-9._-]+)\+(?<variant>[a-zA-Z0-9._-]+)$/;
2
+ /**
3
+ * Resolve a media adapter for a given media type.
4
+ * Supports exact matches and pattern matching (e.g., +json suffix).
5
+ *
6
+ * @param mediaType - The media type to resolve (e.g., "application/json", "application/json-patch+json")
7
+ * @param adapters - Record of media adapters
8
+ * @returns The resolved adapter or undefined if not found
9
+ */
10
+ export function resolveMediaAdapter(mediaType, adapters) {
11
+ // Normalize media type (remove parameters like charset)
12
+ const normalized = mediaType.split(';', 2)[0].trim().toLowerCase();
13
+ if (normalized in adapters) {
14
+ return adapters[normalized];
15
+ }
16
+ const match = VariantMediaTypeRegex.exec(normalized);
17
+ if (match?.groups) {
18
+ const baseType = `${match.groups.dir}/${match.groups.variant}`;
19
+ if (baseType in adapters) {
20
+ return adapters[baseType];
21
+ }
22
+ }
23
+ }
24
+ /**
25
+ * Check if a media type is supported by the given adapters.
26
+ *
27
+ * @param mediaType - The media type to check
28
+ * @param adapters - Record of media adapters
29
+ * @returns true if the media type is supported
30
+ */
31
+ export function isMediaTypeSupported(mediaType, adapters) {
32
+ return resolveMediaAdapter(mediaType, adapters) !== undefined;
33
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fumadocs-openapi",
3
- "version": "9.7.1",
3
+ "version": "9.7.2",
4
4
  "description": "Generate MDX docs for your OpenAPI spec",
5
5
  "keywords": [
6
6
  "NextJs",
@@ -65,13 +65,13 @@
65
65
  "remark-rehype": "^11.1.2",
66
66
  "tinyglobby": "^0.2.15",
67
67
  "xml-js": "^1.6.11",
68
- "fumadocs-core": "16.0.5",
69
- "fumadocs-ui": "16.0.5"
68
+ "fumadocs-core": "16.0.6",
69
+ "fumadocs-ui": "16.0.6"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@scalar/api-client-react": "^1.3.46",
73
73
  "@types/js-yaml": "^4.0.9",
74
- "@types/node": "24.9.1",
74
+ "@types/node": "24.9.2",
75
75
  "@types/openapi-sampler": "^1.0.3",
76
76
  "@types/react": "^19.2.2",
77
77
  "json-schema-typed": "^8.0.1",