fumadocs-openapi 10.6.0 → 10.6.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 (81) hide show
  1. package/css/generated/shared.css +21 -2
  2. package/dist/_virtual/_rolldown/runtime.js +13 -0
  3. package/dist/playground/client.d.ts +8 -6
  4. package/dist/playground/client.d.ts.map +1 -1
  5. package/dist/playground/client.js +22 -20
  6. package/dist/playground/client.js.map +1 -1
  7. package/dist/playground/fetcher.d.ts +20 -1
  8. package/dist/playground/fetcher.d.ts.map +1 -1
  9. package/dist/playground/fetcher.js +28 -24
  10. package/dist/playground/fetcher.js.map +1 -1
  11. package/dist/playground/index.d.ts +3 -3
  12. package/dist/playground/index.d.ts.map +1 -1
  13. package/dist/playground/index.js +3 -3
  14. package/dist/playground/index.js.map +1 -1
  15. package/dist/playground/schema.d.ts +1 -0
  16. package/dist/playground/schema.d.ts.map +1 -1
  17. package/dist/requests/generators/curl.js +2 -2
  18. package/dist/requests/generators/curl.js.map +1 -1
  19. package/dist/requests/generators/go.js +5 -5
  20. package/dist/requests/generators/go.js.map +1 -1
  21. package/dist/requests/generators/java.js +13 -13
  22. package/dist/requests/generators/java.js.map +1 -1
  23. package/dist/requests/generators/javascript.js +2 -2
  24. package/dist/requests/generators/javascript.js.map +1 -1
  25. package/dist/requests/string-utils.js +4 -3
  26. package/dist/requests/string-utils.js.map +1 -1
  27. package/dist/server/create.d.ts +1 -1
  28. package/dist/server/proxy.d.ts +5 -2
  29. package/dist/server/proxy.d.ts.map +1 -1
  30. package/dist/server/proxy.js +41 -31
  31. package/dist/server/proxy.js.map +1 -1
  32. package/dist/types.d.ts +4 -2
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/ui/api-page.d.ts +0 -1
  35. package/dist/ui/api-page.d.ts.map +1 -1
  36. package/dist/ui/api-page.js +2 -3
  37. package/dist/ui/api-page.js.map +1 -1
  38. package/dist/ui/base.d.ts +3 -3
  39. package/dist/ui/base.js +9 -0
  40. package/dist/ui/base.js.map +1 -1
  41. package/dist/ui/client/boundary.d.ts +12 -0
  42. package/dist/ui/client/boundary.d.ts.map +1 -0
  43. package/dist/ui/client/boundary.js +19 -0
  44. package/dist/ui/client/boundary.js.map +1 -0
  45. package/dist/ui/client/boundary.lazy.js +20 -0
  46. package/dist/ui/client/boundary.lazy.js.map +1 -0
  47. package/dist/ui/client/index.d.ts +1 -1
  48. package/dist/ui/components/codeblock.d.ts +2 -2
  49. package/dist/ui/components/codeblock.d.ts.map +1 -1
  50. package/dist/ui/contexts/api.d.ts +27 -0
  51. package/dist/ui/contexts/api.d.ts.map +1 -0
  52. package/dist/ui/create-client.d.ts.map +1 -1
  53. package/dist/ui/create-client.js +2 -0
  54. package/dist/ui/create-client.js.map +1 -1
  55. package/dist/ui/index.d.ts +2 -2
  56. package/dist/ui/index.d.ts.map +1 -1
  57. package/dist/ui/operation/index.js +1 -2
  58. package/dist/ui/operation/index.js.map +1 -1
  59. package/dist/ui/operation/usage-tabs/client.d.ts +15 -0
  60. package/dist/ui/operation/usage-tabs/client.d.ts.map +1 -0
  61. package/dist/ui/operation/usage-tabs/index.js +2 -3
  62. package/dist/ui/operation/usage-tabs/index.js.map +1 -1
  63. package/dist/ui/schema/client.d.ts +8 -1
  64. package/dist/ui/schema/client.d.ts.map +1 -1
  65. package/dist/ui/schema/client.js +17 -6
  66. package/dist/ui/schema/client.js.map +1 -1
  67. package/dist/ui/schema/index.d.ts +0 -1
  68. package/dist/ui/schema/index.d.ts.map +1 -1
  69. package/dist/ui/schema/index.js +19 -10
  70. package/dist/ui/schema/index.js.map +1 -1
  71. package/package.json +7 -8
  72. package/dist/playground/lazy.js +0 -8
  73. package/dist/playground/lazy.js.map +0 -1
  74. package/dist/ui/contexts/api.lazy.js +0 -9
  75. package/dist/ui/contexts/api.lazy.js.map +0 -1
  76. package/dist/ui/operation/usage-tabs/lazy.js +0 -9
  77. package/dist/ui/operation/usage-tabs/lazy.js.map +0 -1
  78. package/dist/ui/schema/lazy.js +0 -8
  79. package/dist/ui/schema/lazy.js.map +0 -1
  80. package/dist/utils/lazy.js +0 -13
  81. package/dist/utils/lazy.js.map +0 -1
@@ -47,6 +47,7 @@
47
47
  @source inline("already");
48
48
  @source inline("and");
49
49
  @source inline("animate-spin");
50
+ @source inline("another");
50
51
  @source inline("any");
51
52
  @source inline("anyFields");
52
53
  @source inline("anyOf");
@@ -84,6 +85,7 @@
84
85
  @source inline("basic");
85
86
  @source inline("be");
86
87
  @source inline("because");
88
+ @source inline("before");
87
89
  @source inline("between");
88
90
  @source inline("bg-black/30");
89
91
  @source inline("bg-fd-background/50");
@@ -108,6 +110,7 @@
108
110
  @source inline("border-x");
109
111
  @source inline("border-y");
110
112
  @source inline("both");
113
+ @source inline("boundary");
111
114
  @source inline("bundled");
112
115
  @source inline("but");
113
116
  @source inline("button");
@@ -119,8 +122,10 @@
119
122
  @source inline("callback");
120
123
  @source inline("callbacks");
121
124
  @source inline("callbacksNode");
125
+ @source inline("can");
122
126
  @source inline("case");
123
127
  @source inline("catch");
128
+ @source inline("causes");
124
129
  @source inline("change");
125
130
  @source inline("changes");
126
131
  @source inline("check");
@@ -130,6 +135,7 @@
130
135
  @source inline("className");
131
136
  @source inline("client");
132
137
  @source inline("client-side");
138
+ @source inline("clientBoundary");
133
139
  @source inline("clientCredentials");
134
140
  @source inline("clientHeight");
135
141
  @source inline("clientId");
@@ -170,6 +176,7 @@
170
176
  @source inline("createContext");
171
177
  @source inline("createMethod");
172
178
  @source inline("createRehypeCode");
179
+ @source inline("credentials");
173
180
  @source inline("css");
174
181
  @source inline("ctx");
175
182
  @source inline("current");
@@ -270,6 +277,7 @@
270
277
  @source inline("fallback");
271
278
  @source inline("false");
272
279
  @source inline("fetch");
280
+ @source inline("fetchOptions");
273
281
  @source inline("fetcher");
274
282
  @source inline("fetchingToken");
275
283
  @source inline("field");
@@ -311,7 +319,6 @@
311
319
  @source inline("font-mono");
312
320
  @source inline("font-semibold");
313
321
  @source inline("for");
314
- @source inline("forceMount");
315
322
  @source inline("form");
316
323
  @source inline("format");
317
324
  @source inline("forwardRef");
@@ -327,6 +334,7 @@
327
334
  @source inline("fumadocs_openapi_requests");
328
335
  @source inline("fumadocs_openapi_responses");
329
336
  @source inline("function");
337
+ @source inline("functions");
330
338
  @source inline("gap-0.5");
331
339
  @source inline("gap-1");
332
340
  @source inline("gap-1.5");
@@ -405,6 +413,7 @@
405
413
  @source inline("imports");
406
414
  @source inline("in");
407
415
  @source inline("include");
416
+ @source inline("infer");
408
417
  @source inline("info");
409
418
  @source inline("infoTags");
410
419
  @source inline("initAuthValues");
@@ -457,6 +466,7 @@
457
466
  @source inline("last:mb-0");
458
467
  @source inline("last:rounded-b-xl");
459
468
  @source inline("latest");
469
+ @source inline("layer");
460
470
  @source inline("layout");
461
471
  @source inline("lazy");
462
472
  @source inline("leading-none");
@@ -495,6 +505,7 @@
495
505
  @source inline("meta");
496
506
  @source inline("metaData");
497
507
  @source inline("method");
508
+ @source inline("migrated");
498
509
  @source inline("min");
499
510
  @source inline("min-h-(--initial-height,0)");
500
511
  @source inline("min-w-0");
@@ -554,6 +565,7 @@
554
565
  @source inline("onOpenChange");
555
566
  @source inline("onSubmit");
556
567
  @source inline("onValueChange");
568
+ @source inline("once");
557
569
  @source inline("one");
558
570
  @source inline("oneOf");
559
571
  @source inline("only");
@@ -617,6 +629,7 @@
617
629
  @source inline("pe-2");
618
630
  @source inline("peer-disabled:cursor-not-allowed");
619
631
  @source inline("peer-disabled:opacity-70");
632
+ @source inline("perhaps");
620
633
  @source inline("persist");
621
634
  @source inline("persistent");
622
635
  @source inline("pickExample");
@@ -645,6 +658,8 @@
645
658
  @source inline("property");
646
659
  @source inline("props");
647
660
  @source inline("prose-no-margin");
661
+ @source inline("proxy");
662
+ @source inline("proxyForwardCookie");
648
663
  @source inline("proxyUrl");
649
664
  @source inline("ps-2");
650
665
  @source inline("ps-4.5");
@@ -674,7 +689,6 @@
674
689
  @source inline("react");
675
690
  @source inline("react-hook-form");
676
691
  @source inline("react-hooks/exhaustive-deps");
677
- @source inline("react-hooks/rules-of-hooks");
678
692
  @source inline("react/jsx-runtime");
679
693
  @source inline("read");
680
694
  @source inline("readOnly");
@@ -720,8 +734,10 @@
720
734
  @source inline("request-body");
721
735
  @source inline("requestBody");
722
736
  @source inline("requestData");
737
+ @source inline("requestInit");
723
738
  @source inline("requestTabNameDefault");
724
739
  @source inline("requestTimeout");
740
+ @source inline("requestUrl");
725
741
  @source inline("requests");
726
742
  @source inline("required");
727
743
  @source inline("res");
@@ -1005,6 +1021,7 @@
1005
1021
  @source inline("used");
1006
1022
  @source inline("username");
1007
1023
  @source inline("using");
1024
+ @source inline("valid");
1008
1025
  @source inline("validateFormats");
1009
1026
  @source inline("validateSchema");
1010
1027
  @source inline("value");
@@ -1017,6 +1034,7 @@
1017
1034
  @source inline("ve");
1018
1035
  @source inline("via");
1019
1036
  @source inline("virtual");
1037
+ @source inline("vite-rsc");
1020
1038
  @source inline("void");
1021
1039
  @source inline("w-0");
1022
1040
  @source inline("w-14");
@@ -1039,6 +1057,7 @@
1039
1057
  @source inline("wrapLazy");
1040
1058
  @source inline("wrapper");
1041
1059
  @source inline("wrapping");
1060
+ @source inline("wraps");
1042
1061
  @source inline("write");
1043
1062
  @source inline("writeOnly");
1044
1063
  @source inline("x-codeSamples");
@@ -0,0 +1,13 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true
8
+ });
9
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
10
+ return target;
11
+ };
12
+ //#endregion
13
+ export { __exportAll };
@@ -1,10 +1,10 @@
1
- import { ParsedSchema } from "../utils/schema/index.js";
2
- import { FetchResult } from "./fetcher.js";
1
+ import { BrowserFetcherOptions, FetchResult } from "./fetcher.js";
3
2
  import { SecurityEntry } from "./index.js";
3
+ import { ParsedSchema } from "../utils/schema/index.js";
4
4
  import { SchemaScope } from "./schema.js";
5
5
  import { ParameterObject } from "../types.js";
6
6
  import { ComponentProps, FC, ReactNode } from "react";
7
- import * as react_jsx_runtime0 from "react/jsx-runtime";
7
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
8
8
  import { Collapsible } from "fumadocs-ui/components/ui/collapsible";
9
9
  import { FieldKey } from "@fumari/stf";
10
10
 
@@ -44,8 +44,10 @@ interface PlaygroundClientOptions {
44
44
  * transform fields for auth-specific parameters (e.g. header)
45
45
  */
46
46
  transformAuthInputs?: (fields: AuthField[]) => AuthField[];
47
+ fetchOptions?: BrowserFetcherOptions;
47
48
  /**
48
49
  * Request timeout in seconds (default: 10s)
50
+ * @deprecated use `fetchOptions.requestTimeout` instead.
49
51
  */
50
52
  requestTimeout?: number;
51
53
  components?: {
@@ -82,7 +84,7 @@ declare function PlaygroundClient({
82
84
  writeOnly,
83
85
  readOnly,
84
86
  ...rest
85
- }: PlaygroundClientProps): react_jsx_runtime0.JSX.Element;
87
+ }: PlaygroundClientProps): _$react_jsx_runtime0.JSX.Element;
86
88
  declare const ParamTypes: readonly ["path", "header", "cookie", "query"];
87
89
  type ParamType = (typeof ParamTypes)[number];
88
90
  interface AuthField {
@@ -96,12 +98,12 @@ declare function DefaultResultDisplay({
96
98
  data,
97
99
  reset,
98
100
  ...rest
99
- }: ResultDisplayProps): react_jsx_runtime0.JSX.Element;
101
+ }: ResultDisplayProps): _$react_jsx_runtime0.JSX.Element;
100
102
  declare function DefaultCollapsiblePanel({
101
103
  title,
102
104
  children,
103
105
  ...props
104
- }: CollapsiblePanelProps): react_jsx_runtime0.JSX.Element;
106
+ }: CollapsiblePanelProps): _$react_jsx_runtime0.JSX.Element;
105
107
  declare const Custom: {
106
108
  useController(fieldName: FieldKey, options?: {
107
109
  defaultValue?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","names":[],"sources":["../../src/playground/client.tsx"],"mappings":";;;;;;;;;;;UAwDiB,UAAA,SAAmB,MAAA;EAClC,IAAA,EAAM,MAAA;EACN,KAAA,EAAO,MAAA;EACP,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,MAAA;EACR,IAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,cAAA,UAAwB,WAAA;EACrE,KAAA;EACA,MAAA;EACA,UAAA,GAAa,eAAA;EACb,UAAA,EAAY,aAAA;EACZ,IAAA;IACE,MAAA,EAAQ,YAAA;IACR,SAAA;EAAA;EAbF;;;EAkBA,UAAA,EAAY,MAAA,SAAe,YAAA;EAC3B,QAAA;AAAA;AAAA,UAGe,kBAAA,SAA2B,cAAA;EAC1C,IAAA,EAAM,WAAA;EACN,KAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,IAAA,CAAK,cAAA,QAAsB,WAAA;EACxE,WAAA,6BAAwC,SAAA;EACxC,KAAA,EAAO,SAAA;AAAA;AAAA,UAGQ,uBAAA;EAdY;;;EAkB3B,mBAAA,IAAuB,MAAA,EAAQ,SAAA,OAAgB,SAAA;EA9BiC;;;EAmChF,cAAA;EAEA,UAAA;IACE,aAAA,GAAgB,EAAA,CAAG,kBAAA;IACnB,gBAAA,GAAmB,EAAA,CAAG,qBAAA;EAAA;EAnCxB;;;;;;;;EA8CA,oBAAA,IAAwB,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,eAAA,KAAoB,SAAA;EArCxE;;;AAGF;;EAyCE,eAAA,IACE,SAAA,UACA,IAAA;IACE,MAAA,EAAQ,YAAA;IACR,SAAA;EAAA,MAEC,SAAA;AAAA;AAAA,iBAciB,gBAAA,CAAA;EACtB,KAAA;EACA,MAAA;EACA,UAAA;EACA,UAAA;EACA,IAAA;EACA,UAAA;EACA,QAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAoOlB,UAAA;AAAA,KACD,SAAA,WAAoB,UAAA;AAAA,UAiHR,SAAA;EACf,SAAA,EAAW,QAAA;EACX,YAAA;EAEA,QAAA,GAAW,aAAA;EACX,QAAA,EAAU,SAAA;EAEV,SAAA,IAAa,MAAA;AAAA;AAAA,iBA8MC,oBAAA,CAAA;EAAuB,IAAA;EAAM,KAAA;EAAA,GAAU;AAAA,GAAQ,kBAAA,GAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAoCjE,uBAAA,CAAA;EAA0B,KAAA;EAAO,QAAA;EAAA,GAAa;AAAA,GAAS,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAc/E,MAAA;2BAEE,QAAA,EAAQ,OAAA;IAEjB,YAAA;EAAA"}
1
+ {"version":3,"file":"client.d.ts","names":[],"sources":["../../src/playground/client.tsx"],"mappings":";;;;;;;;;;;UAwDiB,UAAA,SAAmB,MAAA;EAClC,IAAA,EAAM,MAAA;EACN,KAAA,EAAO,MAAA;EACP,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,MAAA;EACR,IAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,cAAA,UAAwB,WAAA;EACrE,KAAA;EACA,MAAA;EACA,UAAA,GAAa,eAAA;EACb,UAAA,EAAY,aAAA;EACZ,IAAA;IACE,MAAA,EAAQ,YAAA;IACR,SAAA;EAAA;EAbF;;;EAkBA,UAAA,EAAY,MAAA,SAAe,YAAA;EAC3B,QAAA;AAAA;AAAA,UAGe,kBAAA,SAA2B,cAAA;EAC1C,IAAA,EAAM,WAAA;EACN,KAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,IAAA,CAAK,cAAA,QAAsB,WAAA;EACxE,WAAA,6BAAwC,SAAA;EACxC,KAAA,EAAO,SAAA;AAAA;AAAA,UAGQ,uBAAA;EAdY;;;EAkB3B,mBAAA,IAAuB,MAAA,EAAQ,SAAA,OAAgB,SAAA;EAE/C,YAAA,GAAe,qBAAA;EAhCiE;;;;EAsChF,cAAA;EAEA,UAAA;IACE,aAAA,GAAgB,EAAA,CAAG,kBAAA;IACnB,gBAAA,GAAmB,EAAA,CAAG,qBAAA;EAAA;EArCxB;;;;;;;;EAgDA,oBAAA,IAAwB,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,eAAA,KAAoB,SAAA;EAxChE;AAGV;;;;EA4CE,eAAA,IACE,SAAA,UACA,IAAA;IACE,MAAA,EAAQ,YAAA;IACR,SAAA;EAAA,MAEC,SAAA;AAAA;AAAA,iBAGiB,gBAAA,CAAA;EACtB,KAAA;EACA,MAAA;EACA,UAAA;EACA,UAAA;EACA,IAAA;EACA,UAAA;EACA,QAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,qBAAA,GAAqB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cA4OlB,UAAA;AAAA,KACD,SAAA,WAAoB,UAAA;AAAA,UAiHR,SAAA;EACf,SAAA,EAAW,QAAA;EACX,YAAA;EAEA,QAAA,GAAW,aAAA;EACX,QAAA,EAAU,SAAA;EAEV,SAAA,IAAa,MAAA;AAAA;AAAA,iBA8MC,oBAAA,CAAA;EAAuB,IAAA;EAAM,KAAA;EAAA,GAAU;AAAA,GAAQ,kBAAA,GAAkB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAoCjE,uBAAA,CAAA;EAA0B,KAAA;EAAO,QAAA;EAAA,GAAa;AAAA,GAAS,qBAAA,GAAqB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAc/E,MAAA;2BAEE,QAAA,EAAQ,OAAA;IAEjB,YAAA;EAAA"}
@@ -15,7 +15,8 @@ import ServerSelect from "./components/server-select.js";
15
15
  import { FieldInput, FieldSet, JsonInput, ObjectInput } from "./components/inputs.js";
16
16
  import { ClientCodeBlock } from "../ui/components/codeblock.js";
17
17
  import { useOperationContext } from "../ui/operation/client.js";
18
- import { Fragment, lazy, useEffect, useMemo, useRef, useState } from "react";
18
+ import { OauthDialog, OauthDialogTrigger } from "./components/oauth-dialog.js";
19
+ import { Fragment, useEffect, useMemo, useRef, useState } from "react";
19
20
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
20
21
  import { ChevronDown, LoaderCircle } from "lucide-react";
21
22
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "fumadocs-ui/components/ui/collapsible";
@@ -23,14 +24,12 @@ import { buttonVariants } from "fumadocs-ui/components/ui/button";
23
24
  import { StfProvider, useDataEngine, useFieldValue, useListener, useStf } from "@fumari/stf";
24
25
  import { objectGet, objectSet, stringifyFieldKey } from "@fumari/stf/lib/utils";
25
26
  //#region src/playground/client.tsx
26
- const OauthDialog = lazy(() => import("./components/oauth-dialog.js").then((mod) => ({ default: mod.OauthDialog })));
27
- const OauthDialogTrigger = lazy(() => import("./components/oauth-dialog.js").then((mod) => ({ default: mod.OauthDialogTrigger })));
28
27
  function PlaygroundClient({ route, method = "GET", securities, parameters = [], body, references, proxyUrl, writeOnly, readOnly, ...rest }) {
29
28
  const t = useTranslations();
30
29
  const { example: exampleId, examples, setExampleData } = useOperationContext();
31
30
  const { server } = useServerContext();
32
31
  const storageKeys = useStorageKey();
33
- const { mediaAdapters, client: { playground: { components: { ResultDisplay = DefaultResultDisplay } = {}, requestTimeout = 10, transformAuthInputs } = {} } } = useApiContext();
32
+ const { mediaAdapters, client: { playground: { components: { ResultDisplay = DefaultResultDisplay } = {}, requestTimeout, fetchOptions = { requestTimeout }, transformAuthInputs } = {} } } = useApiContext();
34
33
  const [securityId, setSecurityId] = useState(() => {
35
34
  const idx = securities.findIndex((s) => s.every((entry) => !entry.deprecated));
36
35
  return idx === -1 ? 0 : idx;
@@ -48,16 +47,16 @@ function PlaygroundClient({ route, method = "GET", securities, parameters = [],
48
47
  }, [examples, exampleId]);
49
48
  const stf = useStf({ defaultValues });
50
49
  const testQuery = useQuery(async (input) => {
51
- const fetcher = await import("./fetcher.js").then((mod) => mod.createBrowserFetcher(mediaAdapters, requestTimeout));
50
+ const fetcher = await import("./fetcher.js").then((mod) => mod.createBrowserFetcher(mediaAdapters, {
51
+ proxyUrl,
52
+ ...fetchOptions
53
+ }));
52
54
  const encoded = encodeRequestData({
53
55
  ...mapInputs(input),
54
56
  method,
55
57
  bodyMediaType: body?.mediaType
56
58
  }, mediaAdapters, parameters);
57
- return fetcher.fetch(joinURL(withBase(server ? resolveServerUrl(server.url, server.variables) : "/", window.location.origin), resolveRequestData(route, encoded)), {
58
- proxyUrl,
59
- ...encoded
60
- });
59
+ return fetcher.fetch(joinURL(withBase(server ? resolveServerUrl(server.url, server.variables) : "/", window.location.origin), resolveRequestData(route, encoded)), encoded);
61
60
  });
62
61
  const timerRef = useRef(null);
63
62
  useListener({
@@ -139,6 +138,18 @@ function PlaygroundClient({ route, method = "GET", securities, parameters = [],
139
138
  })
140
139
  });
141
140
  }
141
+ function SecurityTabsSelectItem({ security }) {
142
+ return /* @__PURE__ */ jsx("div", {
143
+ className: "flex flex-col gap-2 max-w-[600px]",
144
+ children: security.map((item) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
145
+ className: cn("font-mono font-medium", item.deprecated && "text-fd-muted-foreground line-through"),
146
+ children: item.id
147
+ }), /* @__PURE__ */ jsx("p", {
148
+ className: "text-fd-muted-foreground whitespace-pre-wrap",
149
+ children: item.description
150
+ })] }, item.id))
151
+ });
152
+ }
142
153
  function SecurityTabs({ securities, setSecurityId, securityId, children }) {
143
154
  const [open, setOpen] = useState(false);
144
155
  const engine = useDataEngine();
@@ -150,18 +161,9 @@ function SecurityTabs({ securities, setSecurityId, securityId, children }) {
150
161
  children: [/* @__PURE__ */ jsxs(Select, {
151
162
  value: securityId.toString(),
152
163
  onValueChange: (v) => setSecurityId(Number(v)),
153
- children: [/* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }), /* @__PURE__ */ jsx(SelectContent, { children: securities.map((security, i) => /* @__PURE__ */ jsx(SelectItem, {
164
+ children: [/* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { children: /* @__PURE__ */ jsx(SecurityTabsSelectItem, { security: securities[securityId] }) }) }), /* @__PURE__ */ jsx(SelectContent, { children: securities.map((security, i) => /* @__PURE__ */ jsx(SelectItem, {
154
165
  value: i.toString(),
155
- children: security.map((item) => /* @__PURE__ */ jsxs("div", {
156
- className: "max-w-[600px]",
157
- children: [/* @__PURE__ */ jsx("p", {
158
- className: cn("font-mono font-medium", item.deprecated && "text-fd-muted-foreground line-through"),
159
- children: item.id
160
- }), /* @__PURE__ */ jsx("p", {
161
- className: "text-fd-muted-foreground whitespace-pre-wrap",
162
- children: item.description
163
- })]
164
- }, item.id))
166
+ children: /* @__PURE__ */ jsx(SecurityTabsSelectItem, { security })
165
167
  }, i)) })]
166
168
  }), children]
167
169
  });
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../src/playground/client.tsx"],"sourcesContent":["'use client';\nimport {\n type FC,\n Fragment,\n lazy,\n type ReactNode,\n useEffect,\n useMemo,\n useState,\n type ComponentProps,\n useRef,\n} from 'react';\nimport { useApiContext, useServerContext } from '@/ui/contexts/api';\nimport type { FetchResult } from '@/playground/fetcher';\nimport type { SecurityEntry } from '@/playground/index';\nimport { getStatusInfo } from './status-info';\nimport { joinURL, resolveRequestData, resolveServerUrl, withBase } from '@/utils/url';\nimport { MethodLabel } from '@/ui/components/method-label';\nimport { useQuery } from '@/utils/use-query';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from 'fumadocs-ui/components/ui/collapsible';\nimport { ChevronDown, LoaderCircle } from 'lucide-react';\nimport { encodeRequestData } from '@/requests/media/encode';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { cn } from '@/utils/cn';\nimport { anyFields, SchemaProvider, SchemaScope, useResolvedSchema } from '@/playground/schema';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\nimport { labelVariants } from '@/ui/components/input';\nimport type { ParsedSchema } from '@/utils/schema';\nimport ServerSelect from './components/server-select';\nimport { useStorageKey } from '@/ui/client/storage-key';\nimport {\n FieldKey,\n Stf,\n StfProvider,\n useDataEngine,\n useFieldValue,\n useListener,\n useStf,\n} from '@fumari/stf';\nimport { objectGet, objectSet, stringifyFieldKey } from '@fumari/stf/lib/utils';\nimport { FieldInput, FieldSet, JsonInput, ObjectInput } from './components/inputs';\nimport type { ParameterObject } from '@/types';\nimport { ClientCodeBlock } from '@/ui/components/codeblock';\nimport { useTranslations } from '@/ui/client/i18n';\nimport { useOperationContext } from '@/ui/operation/client';\n\nexport interface FormValues extends Record<string, unknown> {\n path: Record<string, unknown>;\n query: Record<string, unknown>;\n header: Record<string, unknown>;\n cookie: Record<string, unknown>;\n body: unknown;\n}\n\nexport interface PlaygroundClientProps extends ComponentProps<'form'>, SchemaScope {\n route: string;\n method: string;\n parameters?: ParameterObject[];\n securities: SecurityEntry[][];\n body?: {\n schema: ParsedSchema;\n mediaType: string;\n };\n /**\n * Resolver for $ref schemas you've passed\n */\n references: Record<string, ParsedSchema>;\n proxyUrl?: string;\n}\n\nexport interface ResultDisplayProps extends ComponentProps<'div'> {\n data: FetchResult;\n reset: () => void;\n}\n\nexport interface CollapsiblePanelProps extends Omit<ComponentProps<typeof Collapsible>, 'title'> {\n 'data-type': 'authorization' | 'body' | ParamType;\n title: ReactNode;\n}\n\nexport interface PlaygroundClientOptions {\n /**\n * transform fields for auth-specific parameters (e.g. header)\n */\n transformAuthInputs?: (fields: AuthField[]) => AuthField[];\n\n /**\n * Request timeout in seconds (default: 10s)\n */\n requestTimeout?: number;\n\n components?: {\n ResultDisplay?: FC<ResultDisplayProps>;\n CollapsiblePanel?: FC<CollapsiblePanelProps>;\n };\n\n /**\n * render the parameter inputs of API endpoint.\n *\n * for updating values, use:\n * - the `Custom.useController()` from `fumadocs-openapi/playground/client`.\n *\n * Recommended types packages: `json-schema-typed`, `openapi-types`.\n */\n renderParameterField?: (fieldName: FieldKey, param: ParameterObject) => ReactNode;\n\n /**\n * render the input for API endpoint body.\n *\n * @see renderParameterField for customisation tips\n */\n renderBodyField?: (\n fieldName: 'body',\n info: {\n schema: ParsedSchema;\n mediaType: string;\n },\n ) => ReactNode;\n}\n\nconst OauthDialog = lazy(() =>\n import('./components/oauth-dialog').then((mod) => ({\n default: mod.OauthDialog,\n })),\n);\nconst OauthDialogTrigger = lazy(() =>\n import('./components/oauth-dialog').then((mod) => ({\n default: mod.OauthDialogTrigger,\n })),\n);\n\nexport default function PlaygroundClient({\n route,\n method = 'GET',\n securities,\n parameters = [],\n body,\n references,\n proxyUrl,\n writeOnly,\n readOnly,\n ...rest\n}: PlaygroundClientProps) {\n const t = useTranslations();\n const { example: exampleId, examples, setExampleData } = useOperationContext();\n const { server } = useServerContext();\n const storageKeys = useStorageKey();\n const {\n mediaAdapters,\n client: {\n playground: {\n components: { ResultDisplay = DefaultResultDisplay } = {},\n requestTimeout = 10,\n transformAuthInputs,\n } = {},\n },\n } = useApiContext();\n const [securityId, setSecurityId] = useState(() => {\n const idx = securities.findIndex((s) => s.every((entry) => !entry.deprecated));\n return idx === -1 ? 0 : idx;\n });\n const { inputs, mapInputs, initAuthValues } = useAuthInputs(\n securities[securityId],\n transformAuthInputs,\n );\n\n const defaultValues: FormValues = useMemo(() => {\n const requestData = examples.find((example) => example.id === exampleId)?.data;\n\n return {\n path: requestData?.path ?? {},\n query: requestData?.query ?? {},\n header: requestData?.header ?? {},\n body: requestData?.body ?? {},\n cookie: requestData?.cookie ?? {},\n };\n }, [examples, exampleId]);\n\n const stf = useStf({\n // it is fine to modify `defaultValues` in place\n // because we already try to persist the form values via `setExampleData`.\n defaultValues,\n });\n\n const testQuery = useQuery(async (input: FormValues) => {\n const fetcher = await import('./fetcher').then((mod) =>\n mod.createBrowserFetcher(mediaAdapters, requestTimeout),\n );\n const encoded = encodeRequestData(\n { ...mapInputs(input), method, bodyMediaType: body?.mediaType },\n mediaAdapters,\n parameters,\n );\n return fetcher.fetch(\n joinURL(\n withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n window.location.origin,\n ),\n resolveRequestData(route, encoded),\n ),\n {\n proxyUrl,\n ...encoded,\n },\n );\n });\n\n const timerRef = useRef<number | null>(null);\n useListener({\n stf,\n onUpdate() {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(\n () => {\n const values = stf.dataEngine.getData() as FormValues;\n for (const item of inputs) {\n const value = stf.dataEngine.get(item.fieldName);\n\n if (value) {\n localStorage.setItem(storageKeys.AuthField(item), JSON.stringify(value));\n }\n }\n\n const data = {\n ...mapInputs(values),\n method,\n bodyMediaType: body?.mediaType,\n };\n setExampleData(data, encodeRequestData(data, mediaAdapters, parameters));\n },\n timerRef.current ? 400 : 0,\n );\n },\n });\n\n useEffect(() => {\n // same object reference = unchanged\n if (stf.dataEngine.getData() === defaultValues) return;\n\n stf.dataEngine.reset(defaultValues);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- ignore other parts\n }, [defaultValues]);\n\n useEffect(() => {\n return initAuthValues(stf);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- ignore other parts\n }, [defaultValues, inputs]);\n\n return (\n <StfProvider value={stf}>\n <SchemaProvider references={references} writeOnly={writeOnly} readOnly={readOnly}>\n <form\n {...rest}\n className={cn(\n 'not-prose flex flex-col rounded-xl border shadow-md overflow-hidden bg-fd-card text-fd-card-foreground',\n rest.className,\n )}\n onSubmit={(e) => {\n testQuery.start(mapInputs(stf.dataEngine.getData() as FormValues));\n e.preventDefault();\n }}\n >\n <ServerSelect className=\"border-b\" />\n <div className=\"flex flex-row items-center gap-2 text-sm p-3 not-last:pb-0\">\n <MethodLabel>{method}</MethodLabel>\n <Route route={route} className=\"flex-1\" />\n <button\n type=\"submit\"\n className={cn(buttonVariants({ color: 'primary', size: 'sm' }), 'w-14 py-1.5')}\n disabled={testQuery.isLoading}\n >\n {testQuery.isLoading ? <LoaderCircle className=\"size-4 animate-spin\" /> : t.send}\n </button>\n </div>\n {testQuery.data ? <ResultDisplay data={testQuery.data} reset={testQuery.reset} /> : null}\n\n {securities.length > 0 && (\n <SecurityTabs\n securities={securities}\n securityId={securityId}\n setSecurityId={setSecurityId}\n >\n {inputs.map((input) => (\n <Fragment key={stringifyFieldKey(input.fieldName)}>{input.children}</Fragment>\n ))}\n </SecurityTabs>\n )}\n <FormBody body={body} parameters={parameters} />\n </form>\n </SchemaProvider>\n </StfProvider>\n );\n}\n\nfunction SecurityTabs({\n securities,\n setSecurityId,\n securityId,\n children,\n}: {\n securities: SecurityEntry[][];\n securityId: number;\n setSecurityId: (value: number) => void;\n children: ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const engine = useDataEngine();\n const t = useTranslations();\n const { CollapsiblePanel = DefaultCollapsiblePanel } =\n useApiContext().client.playground?.components ?? {};\n\n const result = (\n <CollapsiblePanel title={t.authorization} data-type=\"authorization\">\n <Select value={securityId.toString()} onValueChange={(v) => setSecurityId(Number(v))}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {securities.map((security, i) => (\n <SelectItem key={i} value={i.toString()}>\n {security.map((item) => (\n <div key={item.id} className=\"max-w-[600px]\">\n <p\n className={cn(\n 'font-mono font-medium',\n item.deprecated && 'text-fd-muted-foreground line-through',\n )}\n >\n {item.id}\n </p>\n <p className=\"text-fd-muted-foreground whitespace-pre-wrap\">{item.description}</p>\n </div>\n ))}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {children}\n </CollapsiblePanel>\n );\n\n for (let i = 0; i < securities.length; i++) {\n const security = securities[i];\n\n for (const item of security) {\n if (item.type === 'oauth2') {\n return (\n <OauthDialog\n scheme={item}\n scopes={item.scopes}\n open={open}\n setOpen={(v) => {\n setOpen(v);\n if (v) {\n setSecurityId(i);\n }\n }}\n setToken={(token) => engine.update(['header', 'Authorization'], token)}\n >\n {result}\n </OauthDialog>\n );\n }\n }\n }\n\n return result;\n}\n\nconst ParamTypes = ['path', 'header', 'cookie', 'query'] as const;\ntype ParamType = (typeof ParamTypes)[number];\n\nfunction FormBodyItem({ type, parameters }: { type: ParamType; parameters: ParameterObject[] }) {\n const { renderParameterField } = useApiContext().client.playground ?? {};\n\n return parameters.map((field) => {\n const fieldName: FieldKey = [type, field.name!];\n if (renderParameterField) {\n return renderParameterField(fieldName, field);\n }\n\n const contentTypes = field.content && Object.keys(field.content);\n const schema =\n field.content && contentTypes && contentTypes.length > 0\n ? field.content[contentTypes[0]].schema\n : field.schema;\n\n return (\n <FieldSet\n key={stringifyFieldKey(fieldName)}\n name={field.name}\n fieldName={fieldName}\n field={(schema ?? anyFields) as ParsedSchema}\n isRequired={field.required}\n />\n );\n });\n}\n\nfunction FormBody({ parameters = [], body }: Pick<PlaygroundClientProps, 'parameters' | 'body'>) {\n const { renderBodyField, components: { CollapsiblePanel = DefaultCollapsiblePanel } = {} } =\n useApiContext().client.playground ?? {};\n const t = useTranslations();\n const displayNames = {\n header: t.header,\n cookie: t.cookies,\n query: t.query,\n path: t.path,\n };\n\n return (\n <>\n {ParamTypes.map((type) => {\n const items = parameters.filter((v) => v.in === type);\n if (items.length === 0) return;\n\n return (\n <CollapsiblePanel key={type} data-type={type} title={displayNames[type]}>\n <FormBodyItem parameters={items} type={type} />\n </CollapsiblePanel>\n );\n })}\n {body && (\n <CollapsiblePanel data-type=\"body\" title={t.body}>\n {renderBodyField ? renderBodyField('body', body) : <BodyInput field={body.schema} />}\n </CollapsiblePanel>\n )}\n </>\n );\n}\n\nfunction BodyInput({ field: _field }: { field: ParsedSchema }) {\n const field = useResolvedSchema(_field);\n const [isJson, setIsJson] = useState(false);\n const t = useTranslations();\n\n if (field.format === 'binary') return <FieldSet field={field} fieldName={['body']} isRequired />;\n\n if (isJson)\n return (\n <>\n <button\n className={cn(\n buttonVariants({\n color: 'secondary',\n size: 'sm',\n className: 'w-fit font-mono p-2',\n }),\n )}\n onClick={() => setIsJson(false)}\n type=\"button\"\n >\n {t.closeJsonEditor}\n </button>\n <JsonInput fieldName={['body']} />\n </>\n );\n\n return (\n <FieldSet\n field={field}\n fieldName={['body']}\n collapsible={false}\n isRequired\n name={\n <button\n type=\"button\"\n className={cn(\n buttonVariants({\n color: 'secondary',\n size: 'sm',\n className: 'p-2',\n }),\n )}\n onClick={() => setIsJson(true)}\n >\n {t.openJsonEditor}\n </button>\n }\n />\n );\n}\n\nexport interface AuthField {\n fieldName: FieldKey;\n defaultValue: unknown;\n\n original?: SecurityEntry;\n children: ReactNode;\n\n mapOutput?: (values: unknown) => unknown;\n}\n\nfunction useAuthInputs(\n securities?: SecurityEntry[],\n transform?: (fields: AuthField[]) => AuthField[],\n) {\n const storageKeys = useStorageKey();\n const t = useTranslations();\n const inputs = useMemo(() => {\n const result: AuthField[] = [];\n if (!securities) return result;\n\n for (const security of securities) {\n if (security.type === 'http' && security.scheme === 'basic') {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n original: security,\n defaultValue: {\n username: '',\n password: '',\n },\n mapOutput(out) {\n if (out && typeof out === 'object') {\n const obj = out as Record<string, unknown>;\n return `Basic ${btoa(`${obj.username ?? ''}:${obj.password ?? ''}`)}`;\n }\n\n return out;\n },\n children: (\n <ObjectInput\n field={{\n type: 'object',\n properties: {\n username: {\n type: 'string',\n },\n password: {\n type: 'string',\n },\n },\n }}\n fieldName={fieldName}\n />\n ),\n });\n } else if (security.type === 'oauth2') {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n original: security,\n defaultValue: 'Bearer ',\n children: (\n <fieldset className=\"flex flex-col gap-2\">\n <label htmlFor={stringifyFieldKey(fieldName)} className={cn(labelVariants())}>\n {t.accessToken}\n </label>\n <div className=\"flex gap-2\">\n <FieldInput\n fieldName={fieldName}\n field={{\n type: 'string',\n }}\n className=\"flex-1\"\n />\n\n <OauthDialogTrigger\n type=\"button\"\n className={cn(\n buttonVariants({\n size: 'sm',\n color: 'secondary',\n }),\n )}\n >\n {t.authorize}\n </OauthDialogTrigger>\n </div>\n </fieldset>\n ),\n });\n } else if (security.type === 'http') {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n original: security,\n defaultValue: 'Bearer ',\n children: (\n <FieldSet\n name={`${t.authorization} (${t.header})`}\n fieldName={fieldName}\n field={{\n type: 'string',\n }}\n />\n ),\n });\n } else if (security.type === 'apiKey') {\n const fieldName: FieldKey = [security.in!, security.name!];\n\n result.push({\n fieldName,\n defaultValue: '',\n original: security,\n children: (\n <FieldSet\n fieldName={fieldName}\n name={`${security.name} (${security.in})`}\n field={{\n type: 'string',\n }}\n />\n ),\n });\n } else {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n defaultValue: '',\n original: security,\n children: (\n <>\n <FieldSet\n name={`${t.authorization} (${t.header})`}\n fieldName={fieldName}\n field={{\n type: 'string',\n }}\n />\n <p className=\"text-fd-muted-foreground text-xs\">{t.openIdUnsupported}</p>\n </>\n ),\n });\n }\n }\n\n return transform ? transform(result) : result;\n }, [securities, transform, t]);\n\n const mapInputs = (values: FormValues) => {\n const cloned = structuredClone(values);\n\n for (const item of inputs) {\n if (!item.mapOutput) continue;\n objectSet(cloned, item.fieldName, item.mapOutput(objectGet(cloned, item.fieldName)));\n }\n\n return cloned;\n };\n\n const initAuthValues = (stf: Stf) => {\n const { dataEngine } = stf;\n for (const item of inputs) {\n const stored = localStorage.getItem(storageKeys.AuthField(item));\n\n if (stored) {\n const parsed = JSON.parse(stored);\n if (typeof parsed === typeof item.defaultValue) {\n dataEngine.init(item.fieldName, parsed);\n continue;\n }\n }\n\n dataEngine.init(item.fieldName, item.defaultValue);\n }\n\n // reset\n return () => {\n for (const item of inputs) {\n stf.dataEngine.delete(item.fieldName);\n }\n };\n };\n\n return { inputs, mapInputs, initAuthValues };\n}\n\nfunction Route({ route, ...props }: ComponentProps<'div'> & { route: string }) {\n return (\n <div\n {...props}\n className={cn(\n 'flex flex-row items-center gap-0.5 overflow-auto text-nowrap',\n props.className,\n )}\n >\n {route.split('/').map((part, index) => (\n <Fragment key={index}>\n {index > 0 && <span className=\"text-fd-muted-foreground\">/</span>}\n {part.startsWith('{') && part.endsWith('}') ? (\n <code className=\"bg-fd-primary/10 text-fd-primary\">{part}</code>\n ) : (\n <code className=\"text-fd-foreground\">{part}</code>\n )}\n </Fragment>\n ))}\n </div>\n );\n}\n\nexport function DefaultResultDisplay({ data, reset, ...rest }: ResultDisplayProps) {\n const t = useTranslations();\n const statusInfo = useMemo(() => getStatusInfo(data.status, t), [data.status, t]);\n\n return (\n <div\n {...rest}\n className={cn(\n 'flex flex-col gap-3 mt-2 px-3 py-2 border-y bg-fd-secondary text-fd-secondary-foreground',\n rest.className,\n )}\n >\n <div className=\"flex justify-between items-center\">\n <div className=\"inline-flex items-center gap-1.5 text-sm font-medium\">\n <statusInfo.icon className={cn('size-4', statusInfo.color)} />\n {statusInfo.description}\n </div>\n <button\n type=\"button\"\n className={cn(buttonVariants({ size: 'sm', variant: 'outline' }))}\n onClick={() => reset()}\n >\n {t.close}\n </button>\n </div>\n <p className=\"text-sm text-fd-muted-foreground\">{data.status}</p>\n {data.data !== undefined && (\n <ClientCodeBlock\n lang={typeof data.data === 'string' && data.data.length > 50000 ? 'text' : data.type}\n code={typeof data.data === 'string' ? data.data : JSON.stringify(data.data, null, 2)}\n />\n )}\n </div>\n );\n}\n\nexport function DefaultCollapsiblePanel({ title, children, ...props }: CollapsiblePanelProps) {\n return (\n <Collapsible {...props} className={cn('border-b last:border-b-0', props.className)}>\n <CollapsibleTrigger className=\"group w-full flex items-center gap-2 p-3 text-sm font-medium\">\n {title}\n <ChevronDown className=\"ms-auto size-3.5 text-fd-muted-foreground group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"flex flex-col gap-3 p-3 pt-1\">{children}</div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nexport const Custom = {\n useController(\n fieldName: FieldKey,\n options?: {\n defaultValue?: unknown;\n },\n ) {\n const [value, setValue] = useFieldValue(fieldName, options);\n return {\n value,\n setValue,\n };\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../src/playground/client.tsx"],"sourcesContent":["'use client';\nimport {\n type FC,\n Fragment,\n type ReactNode,\n useEffect,\n useMemo,\n useState,\n type ComponentProps,\n useRef,\n} from 'react';\nimport { useApiContext, useServerContext } from '@/ui/contexts/api';\nimport type { BrowserFetcherOptions, FetchResult } from '@/playground/fetcher';\nimport type { SecurityEntry } from '@/playground/index';\nimport { getStatusInfo } from './status-info';\nimport { joinURL, resolveRequestData, resolveServerUrl, withBase } from '@/utils/url';\nimport { MethodLabel } from '@/ui/components/method-label';\nimport { useQuery } from '@/utils/use-query';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from 'fumadocs-ui/components/ui/collapsible';\nimport { ChevronDown, LoaderCircle } from 'lucide-react';\nimport { encodeRequestData } from '@/requests/media/encode';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { cn } from '@/utils/cn';\nimport { anyFields, SchemaProvider, SchemaScope, useResolvedSchema } from '@/playground/schema';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\nimport { labelVariants } from '@/ui/components/input';\nimport type { ParsedSchema } from '@/utils/schema';\nimport ServerSelect from './components/server-select';\nimport { useStorageKey } from '@/ui/client/storage-key';\nimport {\n FieldKey,\n Stf,\n StfProvider,\n useDataEngine,\n useFieldValue,\n useListener,\n useStf,\n} from '@fumari/stf';\nimport { objectGet, objectSet, stringifyFieldKey } from '@fumari/stf/lib/utils';\nimport { FieldInput, FieldSet, JsonInput, ObjectInput } from './components/inputs';\nimport type { ParameterObject } from '@/types';\nimport { ClientCodeBlock } from '@/ui/components/codeblock';\nimport { useTranslations } from '@/ui/client/i18n';\nimport { useOperationContext } from '@/ui/operation/client';\nimport { OauthDialog, OauthDialogTrigger } from './components/oauth-dialog';\n\nexport interface FormValues extends Record<string, unknown> {\n path: Record<string, unknown>;\n query: Record<string, unknown>;\n header: Record<string, unknown>;\n cookie: Record<string, unknown>;\n body: unknown;\n}\n\nexport interface PlaygroundClientProps extends ComponentProps<'form'>, SchemaScope {\n route: string;\n method: string;\n parameters?: ParameterObject[];\n securities: SecurityEntry[][];\n body?: {\n schema: ParsedSchema;\n mediaType: string;\n };\n /**\n * Resolver for $ref schemas you've passed\n */\n references: Record<string, ParsedSchema>;\n proxyUrl?: string;\n}\n\nexport interface ResultDisplayProps extends ComponentProps<'div'> {\n data: FetchResult;\n reset: () => void;\n}\n\nexport interface CollapsiblePanelProps extends Omit<ComponentProps<typeof Collapsible>, 'title'> {\n 'data-type': 'authorization' | 'body' | ParamType;\n title: ReactNode;\n}\n\nexport interface PlaygroundClientOptions {\n /**\n * transform fields for auth-specific parameters (e.g. header)\n */\n transformAuthInputs?: (fields: AuthField[]) => AuthField[];\n\n fetchOptions?: BrowserFetcherOptions;\n\n /**\n * Request timeout in seconds (default: 10s)\n * @deprecated use `fetchOptions.requestTimeout` instead.\n */\n requestTimeout?: number;\n\n components?: {\n ResultDisplay?: FC<ResultDisplayProps>;\n CollapsiblePanel?: FC<CollapsiblePanelProps>;\n };\n\n /**\n * render the parameter inputs of API endpoint.\n *\n * for updating values, use:\n * - the `Custom.useController()` from `fumadocs-openapi/playground/client`.\n *\n * Recommended types packages: `json-schema-typed`, `openapi-types`.\n */\n renderParameterField?: (fieldName: FieldKey, param: ParameterObject) => ReactNode;\n\n /**\n * render the input for API endpoint body.\n *\n * @see renderParameterField for customisation tips\n */\n renderBodyField?: (\n fieldName: 'body',\n info: {\n schema: ParsedSchema;\n mediaType: string;\n },\n ) => ReactNode;\n}\n\nexport default function PlaygroundClient({\n route,\n method = 'GET',\n securities,\n parameters = [],\n body,\n references,\n proxyUrl,\n writeOnly,\n readOnly,\n ...rest\n}: PlaygroundClientProps) {\n const t = useTranslations();\n const { example: exampleId, examples, setExampleData } = useOperationContext();\n const { server } = useServerContext();\n const storageKeys = useStorageKey();\n const {\n mediaAdapters,\n client: {\n playground: {\n components: { ResultDisplay = DefaultResultDisplay } = {},\n requestTimeout,\n fetchOptions = { requestTimeout },\n transformAuthInputs,\n } = {},\n },\n } = useApiContext();\n const [securityId, setSecurityId] = useState(() => {\n const idx = securities.findIndex((s) => s.every((entry) => !entry.deprecated));\n return idx === -1 ? 0 : idx;\n });\n const { inputs, mapInputs, initAuthValues } = useAuthInputs(\n securities[securityId],\n transformAuthInputs,\n );\n\n const defaultValues: FormValues = useMemo(() => {\n const requestData = examples.find((example) => example.id === exampleId)?.data;\n\n return {\n path: requestData?.path ?? {},\n query: requestData?.query ?? {},\n header: requestData?.header ?? {},\n body: requestData?.body ?? {},\n cookie: requestData?.cookie ?? {},\n };\n }, [examples, exampleId]);\n\n const stf = useStf({\n // it is fine to modify `defaultValues` in place\n // because we already try to persist the form values via `setExampleData`.\n defaultValues,\n });\n\n const testQuery = useQuery(async (input: FormValues) => {\n const fetcher = await import('./fetcher').then((mod) =>\n mod.createBrowserFetcher(mediaAdapters, { proxyUrl, ...fetchOptions }),\n );\n const encoded = encodeRequestData(\n { ...mapInputs(input), method, bodyMediaType: body?.mediaType },\n mediaAdapters,\n parameters,\n );\n return fetcher.fetch(\n joinURL(\n withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n window.location.origin,\n ),\n resolveRequestData(route, encoded),\n ),\n encoded,\n );\n });\n\n const timerRef = useRef<number | null>(null);\n useListener({\n stf,\n onUpdate() {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(\n () => {\n const values = stf.dataEngine.getData() as FormValues;\n for (const item of inputs) {\n const value = stf.dataEngine.get(item.fieldName);\n\n if (value) {\n localStorage.setItem(storageKeys.AuthField(item), JSON.stringify(value));\n }\n }\n\n const data = {\n ...mapInputs(values),\n method,\n bodyMediaType: body?.mediaType,\n };\n setExampleData(data, encodeRequestData(data, mediaAdapters, parameters));\n },\n timerRef.current ? 400 : 0,\n );\n },\n });\n\n useEffect(() => {\n // same object reference = unchanged\n if (stf.dataEngine.getData() === defaultValues) return;\n\n stf.dataEngine.reset(defaultValues);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- ignore other parts\n }, [defaultValues]);\n\n useEffect(() => {\n return initAuthValues(stf);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- ignore other parts\n }, [defaultValues, inputs]);\n\n return (\n <StfProvider value={stf}>\n <SchemaProvider references={references} writeOnly={writeOnly} readOnly={readOnly}>\n <form\n {...rest}\n className={cn(\n 'not-prose flex flex-col rounded-xl border shadow-md overflow-hidden bg-fd-card text-fd-card-foreground',\n rest.className,\n )}\n onSubmit={(e) => {\n testQuery.start(mapInputs(stf.dataEngine.getData() as FormValues));\n e.preventDefault();\n }}\n >\n <ServerSelect className=\"border-b\" />\n <div className=\"flex flex-row items-center gap-2 text-sm p-3 not-last:pb-0\">\n <MethodLabel>{method}</MethodLabel>\n <Route route={route} className=\"flex-1\" />\n <button\n type=\"submit\"\n className={cn(buttonVariants({ color: 'primary', size: 'sm' }), 'w-14 py-1.5')}\n disabled={testQuery.isLoading}\n >\n {testQuery.isLoading ? <LoaderCircle className=\"size-4 animate-spin\" /> : t.send}\n </button>\n </div>\n {testQuery.data ? <ResultDisplay data={testQuery.data} reset={testQuery.reset} /> : null}\n\n {securities.length > 0 && (\n <SecurityTabs\n securities={securities}\n securityId={securityId}\n setSecurityId={setSecurityId}\n >\n {inputs.map((input) => (\n <Fragment key={stringifyFieldKey(input.fieldName)}>{input.children}</Fragment>\n ))}\n </SecurityTabs>\n )}\n <FormBody body={body} parameters={parameters} />\n </form>\n </SchemaProvider>\n </StfProvider>\n );\n}\n\nfunction SecurityTabsSelectItem({ security }: { security: SecurityEntry[] }) {\n return (\n <div className=\"flex flex-col gap-2 max-w-[600px]\">\n {security.map((item) => (\n <div key={item.id}>\n <p\n className={cn(\n 'font-mono font-medium',\n item.deprecated && 'text-fd-muted-foreground line-through',\n )}\n >\n {item.id}\n </p>\n <p className=\"text-fd-muted-foreground whitespace-pre-wrap\">{item.description}</p>\n </div>\n ))}\n </div>\n );\n}\n\nfunction SecurityTabs({\n securities,\n setSecurityId,\n securityId,\n children,\n}: {\n securities: SecurityEntry[][];\n securityId: number;\n setSecurityId: (value: number) => void;\n children: ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const engine = useDataEngine();\n const t = useTranslations();\n const { CollapsiblePanel = DefaultCollapsiblePanel } =\n useApiContext().client.playground?.components ?? {};\n\n const result = (\n <CollapsiblePanel title={t.authorization} data-type=\"authorization\">\n <Select value={securityId.toString()} onValueChange={(v) => setSecurityId(Number(v))}>\n <SelectTrigger>\n <SelectValue>\n <SecurityTabsSelectItem security={securities[securityId]} />\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {securities.map((security, i) => (\n <SelectItem key={i} value={i.toString()}>\n <SecurityTabsSelectItem security={security} />\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {children}\n </CollapsiblePanel>\n );\n\n for (let i = 0; i < securities.length; i++) {\n const security = securities[i];\n\n for (const item of security) {\n if (item.type === 'oauth2') {\n return (\n <OauthDialog\n scheme={item}\n scopes={item.scopes}\n open={open}\n setOpen={(v) => {\n setOpen(v);\n if (v) {\n setSecurityId(i);\n }\n }}\n setToken={(token) => engine.update(['header', 'Authorization'], token)}\n >\n {result}\n </OauthDialog>\n );\n }\n }\n }\n\n return result;\n}\n\nconst ParamTypes = ['path', 'header', 'cookie', 'query'] as const;\ntype ParamType = (typeof ParamTypes)[number];\n\nfunction FormBodyItem({ type, parameters }: { type: ParamType; parameters: ParameterObject[] }) {\n const { renderParameterField } = useApiContext().client.playground ?? {};\n\n return parameters.map((field) => {\n const fieldName: FieldKey = [type, field.name!];\n if (renderParameterField) {\n return renderParameterField(fieldName, field);\n }\n\n const contentTypes = field.content && Object.keys(field.content);\n const schema =\n field.content && contentTypes && contentTypes.length > 0\n ? field.content[contentTypes[0]].schema\n : field.schema;\n\n return (\n <FieldSet\n key={stringifyFieldKey(fieldName)}\n name={field.name}\n fieldName={fieldName}\n field={(schema ?? anyFields) as ParsedSchema}\n isRequired={field.required}\n />\n );\n });\n}\n\nfunction FormBody({ parameters = [], body }: Pick<PlaygroundClientProps, 'parameters' | 'body'>) {\n const { renderBodyField, components: { CollapsiblePanel = DefaultCollapsiblePanel } = {} } =\n useApiContext().client.playground ?? {};\n const t = useTranslations();\n const displayNames = {\n header: t.header,\n cookie: t.cookies,\n query: t.query,\n path: t.path,\n };\n\n return (\n <>\n {ParamTypes.map((type) => {\n const items = parameters.filter((v) => v.in === type);\n if (items.length === 0) return;\n\n return (\n <CollapsiblePanel key={type} data-type={type} title={displayNames[type]}>\n <FormBodyItem parameters={items} type={type} />\n </CollapsiblePanel>\n );\n })}\n {body && (\n <CollapsiblePanel data-type=\"body\" title={t.body}>\n {renderBodyField ? renderBodyField('body', body) : <BodyInput field={body.schema} />}\n </CollapsiblePanel>\n )}\n </>\n );\n}\n\nfunction BodyInput({ field: _field }: { field: ParsedSchema }) {\n const field = useResolvedSchema(_field);\n const [isJson, setIsJson] = useState(false);\n const t = useTranslations();\n\n if (field.format === 'binary') return <FieldSet field={field} fieldName={['body']} isRequired />;\n\n if (isJson)\n return (\n <>\n <button\n className={cn(\n buttonVariants({\n color: 'secondary',\n size: 'sm',\n className: 'w-fit font-mono p-2',\n }),\n )}\n onClick={() => setIsJson(false)}\n type=\"button\"\n >\n {t.closeJsonEditor}\n </button>\n <JsonInput fieldName={['body']} />\n </>\n );\n\n return (\n <FieldSet\n field={field}\n fieldName={['body']}\n collapsible={false}\n isRequired\n name={\n <button\n type=\"button\"\n className={cn(\n buttonVariants({\n color: 'secondary',\n size: 'sm',\n className: 'p-2',\n }),\n )}\n onClick={() => setIsJson(true)}\n >\n {t.openJsonEditor}\n </button>\n }\n />\n );\n}\n\nexport interface AuthField {\n fieldName: FieldKey;\n defaultValue: unknown;\n\n original?: SecurityEntry;\n children: ReactNode;\n\n mapOutput?: (values: unknown) => unknown;\n}\n\nfunction useAuthInputs(\n securities?: SecurityEntry[],\n transform?: (fields: AuthField[]) => AuthField[],\n) {\n const storageKeys = useStorageKey();\n const t = useTranslations();\n const inputs = useMemo(() => {\n const result: AuthField[] = [];\n if (!securities) return result;\n\n for (const security of securities) {\n if (security.type === 'http' && security.scheme === 'basic') {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n original: security,\n defaultValue: {\n username: '',\n password: '',\n },\n mapOutput(out) {\n if (out && typeof out === 'object') {\n const obj = out as Record<string, unknown>;\n return `Basic ${btoa(`${obj.username ?? ''}:${obj.password ?? ''}`)}`;\n }\n\n return out;\n },\n children: (\n <ObjectInput\n field={{\n type: 'object',\n properties: {\n username: {\n type: 'string',\n },\n password: {\n type: 'string',\n },\n },\n }}\n fieldName={fieldName}\n />\n ),\n });\n } else if (security.type === 'oauth2') {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n original: security,\n defaultValue: 'Bearer ',\n children: (\n <fieldset className=\"flex flex-col gap-2\">\n <label htmlFor={stringifyFieldKey(fieldName)} className={cn(labelVariants())}>\n {t.accessToken}\n </label>\n <div className=\"flex gap-2\">\n <FieldInput\n fieldName={fieldName}\n field={{\n type: 'string',\n }}\n className=\"flex-1\"\n />\n\n <OauthDialogTrigger\n type=\"button\"\n className={cn(\n buttonVariants({\n size: 'sm',\n color: 'secondary',\n }),\n )}\n >\n {t.authorize}\n </OauthDialogTrigger>\n </div>\n </fieldset>\n ),\n });\n } else if (security.type === 'http') {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n original: security,\n defaultValue: 'Bearer ',\n children: (\n <FieldSet\n name={`${t.authorization} (${t.header})`}\n fieldName={fieldName}\n field={{\n type: 'string',\n }}\n />\n ),\n });\n } else if (security.type === 'apiKey') {\n const fieldName: FieldKey = [security.in!, security.name!];\n\n result.push({\n fieldName,\n defaultValue: '',\n original: security,\n children: (\n <FieldSet\n fieldName={fieldName}\n name={`${security.name} (${security.in})`}\n field={{\n type: 'string',\n }}\n />\n ),\n });\n } else {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n defaultValue: '',\n original: security,\n children: (\n <>\n <FieldSet\n name={`${t.authorization} (${t.header})`}\n fieldName={fieldName}\n field={{\n type: 'string',\n }}\n />\n <p className=\"text-fd-muted-foreground text-xs\">{t.openIdUnsupported}</p>\n </>\n ),\n });\n }\n }\n\n return transform ? transform(result) : result;\n }, [securities, transform, t]);\n\n const mapInputs = (values: FormValues) => {\n const cloned = structuredClone(values);\n\n for (const item of inputs) {\n if (!item.mapOutput) continue;\n objectSet(cloned, item.fieldName, item.mapOutput(objectGet(cloned, item.fieldName)));\n }\n\n return cloned;\n };\n\n const initAuthValues = (stf: Stf) => {\n const { dataEngine } = stf;\n for (const item of inputs) {\n const stored = localStorage.getItem(storageKeys.AuthField(item));\n\n if (stored) {\n const parsed = JSON.parse(stored);\n if (typeof parsed === typeof item.defaultValue) {\n dataEngine.init(item.fieldName, parsed);\n continue;\n }\n }\n\n dataEngine.init(item.fieldName, item.defaultValue);\n }\n\n // reset\n return () => {\n for (const item of inputs) {\n stf.dataEngine.delete(item.fieldName);\n }\n };\n };\n\n return { inputs, mapInputs, initAuthValues };\n}\n\nfunction Route({ route, ...props }: ComponentProps<'div'> & { route: string }) {\n return (\n <div\n {...props}\n className={cn(\n 'flex flex-row items-center gap-0.5 overflow-auto text-nowrap',\n props.className,\n )}\n >\n {route.split('/').map((part, index) => (\n <Fragment key={index}>\n {index > 0 && <span className=\"text-fd-muted-foreground\">/</span>}\n {part.startsWith('{') && part.endsWith('}') ? (\n <code className=\"bg-fd-primary/10 text-fd-primary\">{part}</code>\n ) : (\n <code className=\"text-fd-foreground\">{part}</code>\n )}\n </Fragment>\n ))}\n </div>\n );\n}\n\nexport function DefaultResultDisplay({ data, reset, ...rest }: ResultDisplayProps) {\n const t = useTranslations();\n const statusInfo = useMemo(() => getStatusInfo(data.status, t), [data.status, t]);\n\n return (\n <div\n {...rest}\n className={cn(\n 'flex flex-col gap-3 mt-2 px-3 py-2 border-y bg-fd-secondary text-fd-secondary-foreground',\n rest.className,\n )}\n >\n <div className=\"flex justify-between items-center\">\n <div className=\"inline-flex items-center gap-1.5 text-sm font-medium\">\n <statusInfo.icon className={cn('size-4', statusInfo.color)} />\n {statusInfo.description}\n </div>\n <button\n type=\"button\"\n className={cn(buttonVariants({ size: 'sm', variant: 'outline' }))}\n onClick={() => reset()}\n >\n {t.close}\n </button>\n </div>\n <p className=\"text-sm text-fd-muted-foreground\">{data.status}</p>\n {data.data !== undefined && (\n <ClientCodeBlock\n lang={typeof data.data === 'string' && data.data.length > 50000 ? 'text' : data.type}\n code={typeof data.data === 'string' ? data.data : JSON.stringify(data.data, null, 2)}\n />\n )}\n </div>\n );\n}\n\nexport function DefaultCollapsiblePanel({ title, children, ...props }: CollapsiblePanelProps) {\n return (\n <Collapsible {...props} className={cn('border-b last:border-b-0', props.className)}>\n <CollapsibleTrigger className=\"group w-full flex items-center gap-2 p-3 text-sm font-medium\">\n {title}\n <ChevronDown className=\"ms-auto size-3.5 text-fd-muted-foreground group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"flex flex-col gap-3 p-3 pt-1\">{children}</div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nexport const Custom = {\n useController(\n fieldName: FieldKey,\n options?: {\n defaultValue?: unknown;\n },\n ) {\n const [value, setValue] = useFieldValue(fieldName, options);\n return {\n value,\n setValue,\n };\n },\n};\n"],"mappings":"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"}
@@ -1,9 +1,28 @@
1
+ import { Awaitable } from "../types.js";
2
+
1
3
  //#region src/playground/fetcher.d.ts
2
4
  interface FetchResult {
3
5
  status: number;
4
6
  type: 'json' | 'html' | 'text';
5
7
  data: unknown;
6
8
  }
9
+ interface BrowserFetcherOptions {
10
+ /**
11
+ * Request timeout in seconds (default: 10s)
12
+ */
13
+ requestTimeout?: number | false;
14
+ proxyUrl?: string;
15
+ /**
16
+ * Forward cookies via search parameters when API proxy is configured.
17
+ *
18
+ * @default true
19
+ */
20
+ proxyForwardCookie?: boolean;
21
+ /**
22
+ * transform the request options before sending.
23
+ */
24
+ onRequestInit?: (requestInit: RequestInit) => Awaitable<RequestInit>;
25
+ }
7
26
  //#endregion
8
- export { FetchResult };
27
+ export { BrowserFetcherOptions, FetchResult };
9
28
  //# sourceMappingURL=fetcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetcher.d.ts","names":[],"sources":["../../src/playground/fetcher.ts"],"mappings":";UAQiB,WAAA;EACf,MAAA;EACA,IAAA;EACA,IAAA;AAAA"}
1
+ {"version":3,"file":"fetcher.d.ts","names":[],"sources":["../../src/playground/fetcher.ts"],"mappings":";;;UAKiB,WAAA;EACf,MAAA;EACA,IAAA;EACA,IAAA;AAAA;AAAA,UAYe,qBAAA;EAiByC;;;EAbxD,cAAA;EAEA,QAAA;EAAA;;;;;EAMA,kBAAA;EAKwD;;;EAAxD,aAAA,IAAiB,WAAA,EAAa,WAAA,KAAgB,SAAA,CAAU,WAAA;AAAA"}
@@ -1,42 +1,46 @@
1
1
  import { resolveMediaAdapter } from "../requests/media/resolve-adapter.js";
2
2
  import "../requests/media/adapter.js";
3
3
  //#region src/playground/fetcher.ts
4
- function createBrowserFetcher(adapters, requestTimeout) {
5
- return { async fetch(url, options) {
6
- const headers = new Headers();
7
- if (options.bodyMediaType && options.bodyMediaType !== "multipart/form-data") headers.append("Content-Type", options.bodyMediaType);
8
- for (const key in options.header) {
9
- const param = options.header[key];
4
+ function createBrowserFetcher(adapters, { proxyUrl, proxyForwardCookie = true, requestTimeout = 10, onRequestInit } = {}) {
5
+ return { async fetch(url, data) {
6
+ let requestUrl = new URL(url, document.baseURI);
7
+ let requestInit = {
8
+ method: data.method,
9
+ cache: "no-cache",
10
+ signal: typeof requestTimeout === "number" ? AbortSignal.timeout(requestTimeout * 1e3) : void 0
11
+ };
12
+ const headers = requestInit.headers = new Headers();
13
+ for (const key in data.header) {
14
+ const param = data.header[key];
10
15
  headers.append(key, param.value);
11
16
  }
12
- const proxyUrl = options.proxyUrl ? new URL(options.proxyUrl, document.baseURI) : null;
13
17
  if (proxyUrl) {
14
- proxyUrl.searchParams.append("url", url);
15
- url = proxyUrl.toString();
18
+ requestUrl = new URL(proxyUrl, document.baseURI);
19
+ requestUrl.searchParams.append("url", url);
16
20
  }
17
- let body = void 0;
18
- if (options.bodyMediaType && options.body) {
19
- const adapter = resolveMediaAdapter(options.bodyMediaType, adapters);
21
+ if (data.bodyMediaType && data.body) {
22
+ const adapter = resolveMediaAdapter(data.bodyMediaType, adapters);
20
23
  if (!adapter) return {
21
24
  status: 400,
22
25
  type: "text",
23
- data: `[Fumadocs] No adapter for ${options.bodyMediaType}, you need to specify one from 'createOpenAPI()'.`
26
+ data: `[Fumadocs] No adapter for ${data.bodyMediaType}, you need to specify one from 'createOpenAPI()'.`
24
27
  };
25
- body = adapter.encode(options);
28
+ if (data.bodyMediaType !== "multipart/form-data") headers.append("Content-Type", data.bodyMediaType);
29
+ requestInit.body = adapter.encode(data);
26
30
  }
27
- for (const key in options.cookie) {
28
- const segs = [`${key}=${options.cookie[key].value}`];
29
- if (proxyUrl && proxyUrl.origin !== window.location.origin) segs.push(`domain=${proxyUrl.host}`);
31
+ if (proxyUrl && proxyForwardCookie) {
32
+ const encoded = Object.entries(data.cookie).map(([k, v]) => `${k}=${encodeURIComponent(v.value)}`).join("; ");
33
+ requestUrl.searchParams.set("cookie", encoded);
34
+ requestInit.credentials = "omit";
35
+ } else for (const key in data.cookie) {
36
+ const param = data.cookie[key];
37
+ const segs = [`${key}=${encodeURIComponent(param.value)}`];
38
+ if (proxyUrl && requestUrl.origin !== window.location.origin) segs.push(`domain=${requestUrl.host}`);
30
39
  segs.push("path=/", "max-age=30");
31
40
  document.cookie = segs.join("; ");
32
41
  }
33
- return fetch(url, {
34
- method: options.method,
35
- cache: "no-cache",
36
- headers,
37
- body,
38
- signal: AbortSignal.timeout(requestTimeout * 1e3)
39
- }).then(async (res) => {
42
+ if (onRequestInit) requestInit = await onRequestInit(requestInit);
43
+ return fetch(requestUrl, requestInit).then(async (res) => {
40
44
  const contentType = res.headers.get("Content-Type") ?? "";
41
45
  let type;
42
46
  let data;
@@ -1 +1 @@
1
- {"version":3,"file":"fetcher.js","names":[],"sources":["../../src/playground/fetcher.ts"],"sourcesContent":["import type { RequestData } from '@/requests/types';\nimport type { MediaAdapter } from '@/requests/media/adapter';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport interface FetchOptions extends RequestData {\n proxyUrl?: string;\n}\n\nexport interface FetchResult {\n status: number;\n type: 'json' | 'html' | 'text';\n data: unknown;\n}\n\nexport interface Fetcher {\n /**\n * This method will not apply the path & search parameters from `options` to given `url`.\n *\n * @param url - The full URL of request.\n */\n fetch: (url: string, options: FetchOptions) => Promise<FetchResult>;\n}\n\nexport function createBrowserFetcher(\n adapters: Record<string, MediaAdapter>,\n requestTimeout: number,\n): Fetcher {\n return {\n async fetch(url, options) {\n const headers = new Headers();\n if (options.bodyMediaType && options.bodyMediaType !== 'multipart/form-data')\n headers.append('Content-Type', options.bodyMediaType);\n\n for (const key in options.header) {\n const param = options.header[key];\n headers.append(key, param.value);\n }\n\n const proxyUrl = options.proxyUrl ? new URL(options.proxyUrl, document.baseURI) : null;\n\n if (proxyUrl) {\n proxyUrl.searchParams.append('url', url);\n url = proxyUrl.toString();\n }\n\n let body: BodyInit | undefined = undefined;\n if (options.bodyMediaType && options.body) {\n const adapter = resolveMediaAdapter(options.bodyMediaType, adapters);\n if (!adapter)\n return {\n status: 400,\n type: 'text',\n data: `[Fumadocs] No adapter for ${options.bodyMediaType}, you need to specify one from 'createOpenAPI()'.`,\n };\n\n body = adapter.encode(options as { body: unknown });\n }\n\n // cookies\n for (const key in options.cookie) {\n const param = options.cookie[key];\n const segs: string[] = [`${key}=${param.value}`];\n\n if (proxyUrl && proxyUrl.origin !== window.location.origin)\n segs.push(`domain=${proxyUrl.host}`);\n segs.push('path=/', 'max-age=30');\n\n document.cookie = segs.join('; ');\n }\n\n return fetch(url, {\n method: options.method,\n cache: 'no-cache',\n headers,\n body,\n signal: AbortSignal.timeout(requestTimeout * 1000),\n })\n .then(async (res) => {\n const contentType = res.headers.get('Content-Type') ?? '';\n let type: FetchResult['type'];\n let data: unknown;\n\n if (contentType.startsWith('application/json')) {\n type = 'json';\n data = await res.json();\n } else {\n type = contentType.startsWith('text/html') ? 'html' : 'text';\n data = await res.text();\n }\n\n return { status: res.status, type, data };\n })\n .catch((e) => {\n const message = e instanceof Error ? `[${e.name}] ${e.message}` : e.toString();\n\n return {\n status: 400,\n type: 'text',\n data: `Client side error: ${message}`,\n };\n });\n },\n };\n}\n"],"mappings":";;;AAuBA,SAAgB,qBACd,UACA,gBACS;AACT,QAAO,EACL,MAAM,MAAM,KAAK,SAAS;EACxB,MAAM,UAAU,IAAI,SAAS;AAC7B,MAAI,QAAQ,iBAAiB,QAAQ,kBAAkB,sBACrD,SAAQ,OAAO,gBAAgB,QAAQ,cAAc;AAEvD,OAAK,MAAM,OAAO,QAAQ,QAAQ;GAChC,MAAM,QAAQ,QAAQ,OAAO;AAC7B,WAAQ,OAAO,KAAK,MAAM,MAAM;;EAGlC,MAAM,WAAW,QAAQ,WAAW,IAAI,IAAI,QAAQ,UAAU,SAAS,QAAQ,GAAG;AAElF,MAAI,UAAU;AACZ,YAAS,aAAa,OAAO,OAAO,IAAI;AACxC,SAAM,SAAS,UAAU;;EAG3B,IAAI,OAA6B,KAAA;AACjC,MAAI,QAAQ,iBAAiB,QAAQ,MAAM;GACzC,MAAM,UAAU,oBAAoB,QAAQ,eAAe,SAAS;AACpE,OAAI,CAAC,QACH,QAAO;IACL,QAAQ;IACR,MAAM;IACN,MAAM,6BAA6B,QAAQ,cAAc;IAC1D;AAEH,UAAO,QAAQ,OAAO,QAA6B;;AAIrD,OAAK,MAAM,OAAO,QAAQ,QAAQ;GAEhC,MAAM,OAAiB,CAAC,GAAG,IAAI,GADjB,QAAQ,OAAO,KACW,QAAQ;AAEhD,OAAI,YAAY,SAAS,WAAW,OAAO,SAAS,OAClD,MAAK,KAAK,UAAU,SAAS,OAAO;AACtC,QAAK,KAAK,UAAU,aAAa;AAEjC,YAAS,SAAS,KAAK,KAAK,KAAK;;AAGnC,SAAO,MAAM,KAAK;GAChB,QAAQ,QAAQ;GAChB,OAAO;GACP;GACA;GACA,QAAQ,YAAY,QAAQ,iBAAiB,IAAK;GACnD,CAAC,CACC,KAAK,OAAO,QAAQ;GACnB,MAAM,cAAc,IAAI,QAAQ,IAAI,eAAe,IAAI;GACvD,IAAI;GACJ,IAAI;AAEJ,OAAI,YAAY,WAAW,mBAAmB,EAAE;AAC9C,WAAO;AACP,WAAO,MAAM,IAAI,MAAM;UAClB;AACL,WAAO,YAAY,WAAW,YAAY,GAAG,SAAS;AACtD,WAAO,MAAM,IAAI,MAAM;;AAGzB,UAAO;IAAE,QAAQ,IAAI;IAAQ;IAAM;IAAM;IACzC,CACD,OAAO,MAAM;AAGZ,UAAO;IACL,QAAQ;IACR,MAAM;IACN,MAAM,sBALQ,aAAa,QAAQ,IAAI,EAAE,KAAK,IAAI,EAAE,YAAY,EAAE,UAAU;IAM7E;IACD;IAEP"}
1
+ {"version":3,"file":"fetcher.js","names":[],"sources":["../../src/playground/fetcher.ts"],"sourcesContent":["import type { RequestData } from '@/requests/types';\nimport type { MediaAdapter } from '@/requests/media/adapter';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\nimport type { Awaitable } from '@/types';\n\nexport interface FetchResult {\n status: number;\n type: 'json' | 'html' | 'text';\n data: unknown;\n}\n\nexport interface Fetcher {\n /**\n * This method will not apply the path & search parameters from `options` to given `url`.\n *\n * @param url - The full URL of request.\n */\n fetch: (url: string, data: RequestData) => Promise<FetchResult>;\n}\n\nexport interface BrowserFetcherOptions {\n /**\n * Request timeout in seconds (default: 10s)\n */\n requestTimeout?: number | false;\n\n proxyUrl?: string;\n /**\n * Forward cookies via search parameters when API proxy is configured.\n *\n * @default true\n */\n proxyForwardCookie?: boolean;\n\n /**\n * transform the request options before sending.\n */\n onRequestInit?: (requestInit: RequestInit) => Awaitable<RequestInit>;\n}\n\nexport function createBrowserFetcher(\n adapters: Record<string, MediaAdapter>,\n {\n proxyUrl,\n proxyForwardCookie = true,\n requestTimeout = 10,\n onRequestInit,\n }: BrowserFetcherOptions = {},\n): Fetcher {\n return {\n async fetch(url, data) {\n let requestUrl = new URL(url, document.baseURI);\n let requestInit: RequestInit = {\n method: data.method,\n cache: 'no-cache',\n signal:\n typeof requestTimeout === 'number'\n ? AbortSignal.timeout(requestTimeout * 1000)\n : undefined,\n };\n\n const headers = (requestInit.headers = new Headers());\n\n for (const key in data.header) {\n const param = data.header[key];\n headers.append(key, param.value);\n }\n\n if (proxyUrl) {\n requestUrl = new URL(proxyUrl, document.baseURI);\n requestUrl.searchParams.append('url', url);\n }\n\n if (data.bodyMediaType && data.body) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, adapters);\n if (!adapter)\n return {\n status: 400,\n type: 'text',\n data: `[Fumadocs] No adapter for ${data.bodyMediaType}, you need to specify one from 'createOpenAPI()'.`,\n };\n\n if (data.bodyMediaType !== 'multipart/form-data') {\n headers.append('Content-Type', data.bodyMediaType);\n }\n\n requestInit.body = adapter.encode(data as { body: unknown });\n }\n\n // cookies\n if (proxyUrl && proxyForwardCookie) {\n const encoded = Object.entries(data.cookie)\n .map(([k, v]) => `${k}=${encodeURIComponent(v.value)}`)\n .join('; ');\n requestUrl.searchParams.set('cookie', encoded);\n requestInit.credentials = 'omit';\n } else {\n for (const key in data.cookie) {\n const param = data.cookie[key];\n const segs: string[] = [`${key}=${encodeURIComponent(param.value)}`];\n\n if (proxyUrl && requestUrl.origin !== window.location.origin)\n segs.push(`domain=${requestUrl.host}`);\n segs.push('path=/', 'max-age=30');\n\n document.cookie = segs.join('; ');\n }\n }\n\n if (onRequestInit) requestInit = await onRequestInit(requestInit);\n\n return fetch(requestUrl, requestInit)\n .then(async (res) => {\n const contentType = res.headers.get('Content-Type') ?? '';\n let type: FetchResult['type'];\n let data: unknown;\n\n if (contentType.startsWith('application/json')) {\n type = 'json';\n data = await res.json();\n } else {\n type = contentType.startsWith('text/html') ? 'html' : 'text';\n data = await res.text();\n }\n\n return { status: res.status, type, data };\n })\n .catch((e) => {\n const message = e instanceof Error ? `[${e.name}] ${e.message}` : e.toString();\n\n return {\n status: 400,\n type: 'text',\n data: `Client side error: ${message}`,\n };\n });\n },\n };\n}\n"],"mappings":";;;AAwCA,SAAgB,qBACd,UACA,EACE,UACA,qBAAqB,MACrB,iBAAiB,IACjB,kBACyB,EAAE,EACpB;AACT,QAAO,EACL,MAAM,MAAM,KAAK,MAAM;EACrB,IAAI,aAAa,IAAI,IAAI,KAAK,SAAS,QAAQ;EAC/C,IAAI,cAA2B;GAC7B,QAAQ,KAAK;GACb,OAAO;GACP,QACE,OAAO,mBAAmB,WACtB,YAAY,QAAQ,iBAAiB,IAAK,GAC1C,KAAA;GACP;EAED,MAAM,UAAW,YAAY,UAAU,IAAI,SAAS;AAEpD,OAAK,MAAM,OAAO,KAAK,QAAQ;GAC7B,MAAM,QAAQ,KAAK,OAAO;AAC1B,WAAQ,OAAO,KAAK,MAAM,MAAM;;AAGlC,MAAI,UAAU;AACZ,gBAAa,IAAI,IAAI,UAAU,SAAS,QAAQ;AAChD,cAAW,aAAa,OAAO,OAAO,IAAI;;AAG5C,MAAI,KAAK,iBAAiB,KAAK,MAAM;GACnC,MAAM,UAAU,oBAAoB,KAAK,eAAe,SAAS;AACjE,OAAI,CAAC,QACH,QAAO;IACL,QAAQ;IACR,MAAM;IACN,MAAM,6BAA6B,KAAK,cAAc;IACvD;AAEH,OAAI,KAAK,kBAAkB,sBACzB,SAAQ,OAAO,gBAAgB,KAAK,cAAc;AAGpD,eAAY,OAAO,QAAQ,OAAO,KAA0B;;AAI9D,MAAI,YAAY,oBAAoB;GAClC,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO,CACxC,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,mBAAmB,EAAE,MAAM,GAAG,CACtD,KAAK,KAAK;AACb,cAAW,aAAa,IAAI,UAAU,QAAQ;AAC9C,eAAY,cAAc;QAE1B,MAAK,MAAM,OAAO,KAAK,QAAQ;GAC7B,MAAM,QAAQ,KAAK,OAAO;GAC1B,MAAM,OAAiB,CAAC,GAAG,IAAI,GAAG,mBAAmB,MAAM,MAAM,GAAG;AAEpE,OAAI,YAAY,WAAW,WAAW,OAAO,SAAS,OACpD,MAAK,KAAK,UAAU,WAAW,OAAO;AACxC,QAAK,KAAK,UAAU,aAAa;AAEjC,YAAS,SAAS,KAAK,KAAK,KAAK;;AAIrC,MAAI,cAAe,eAAc,MAAM,cAAc,YAAY;AAEjE,SAAO,MAAM,YAAY,YAAY,CAClC,KAAK,OAAO,QAAQ;GACnB,MAAM,cAAc,IAAI,QAAQ,IAAI,eAAe,IAAI;GACvD,IAAI;GACJ,IAAI;AAEJ,OAAI,YAAY,WAAW,mBAAmB,EAAE;AAC9C,WAAO;AACP,WAAO,MAAM,IAAI,MAAM;UAClB;AACL,WAAO,YAAY,WAAW,YAAY,GAAG,SAAS;AACtD,WAAO,MAAM,IAAI,MAAM;;AAGzB,UAAO;IAAE,QAAQ,IAAI;IAAQ;IAAM;IAAM;IACzC,CACD,OAAO,MAAM;AAGZ,UAAO;IACL,QAAQ;IACR,MAAM;IACN,MAAM,sBALQ,aAAa,QAAQ,IAAI,EAAE,KAAK,IAAI,EAAE,YAAY,EAAE,UAAU;IAM7E;IACD;IAEP"}