fumadocs-openapi 10.2.4 → 10.2.5

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 (50) hide show
  1. package/dist/generate-file.js.map +1 -1
  2. package/dist/playground/client.d.ts +11 -12
  3. package/dist/playground/client.d.ts.map +1 -1
  4. package/dist/playground/client.js +70 -74
  5. package/dist/playground/client.js.map +1 -1
  6. package/dist/playground/components/inputs.js +198 -187
  7. package/dist/playground/components/inputs.js.map +1 -1
  8. package/dist/playground/components/oauth-dialog.js +2 -2
  9. package/dist/playground/components/server-select.js +24 -25
  10. package/dist/playground/components/server-select.js.map +1 -1
  11. package/dist/playground/fetcher.js.map +1 -1
  12. package/dist/playground/index.js.map +1 -1
  13. package/dist/playground/schema.d.ts +1 -0
  14. package/dist/playground/schema.d.ts.map +1 -1
  15. package/dist/playground/schema.js +10 -12
  16. package/dist/playground/schema.js.map +1 -1
  17. package/dist/playground/status-info.js.map +1 -1
  18. package/dist/requests/generators/csharp.js.map +1 -1
  19. package/dist/requests/generators/curl.js.map +1 -1
  20. package/dist/requests/generators/go.js.map +1 -1
  21. package/dist/requests/generators/index.js.map +1 -1
  22. package/dist/requests/generators/java.js.map +1 -1
  23. package/dist/requests/generators/javascript.js.map +1 -1
  24. package/dist/requests/generators/python.js.map +1 -1
  25. package/dist/requests/media/adapter.js.map +1 -1
  26. package/dist/requests/media/encode.js.map +1 -1
  27. package/dist/requests/media/resolve-adapter.js +4 -0
  28. package/dist/requests/media/resolve-adapter.js.map +1 -1
  29. package/dist/server/create.js.map +1 -1
  30. package/dist/server/proxy.js.map +1 -1
  31. package/dist/server/source-api.js.map +1 -1
  32. package/dist/ui/api-page.js.map +1 -1
  33. package/dist/ui/contexts/api.js.map +1 -1
  34. package/dist/ui/operation/index.js.map +1 -1
  35. package/dist/ui/operation/request-tabs.js.map +1 -1
  36. package/dist/ui/operation/response-tabs.js.map +1 -1
  37. package/dist/ui/operation/usage-tabs/client.js.map +1 -1
  38. package/dist/ui/operation/usage-tabs/index.js.map +1 -1
  39. package/dist/ui/schema/client.d.ts.map +1 -1
  40. package/dist/ui/schema/client.js +120 -114
  41. package/dist/ui/schema/client.js.map +1 -1
  42. package/dist/ui/schema/index.js +1 -1
  43. package/dist/ui/schema/index.js.map +1 -1
  44. package/dist/utils/id-to-title.js.map +1 -1
  45. package/dist/utils/merge-schema.js.map +1 -1
  46. package/dist/utils/pages/builder.js.map +1 -1
  47. package/dist/utils/pages/preset-auto.js.map +1 -1
  48. package/dist/utils/pages/to-static-data.js.map +1 -1
  49. package/dist/utils/pages/to-text.js.map +1 -1
  50. package/package.json +13 -12
@@ -6,9 +6,9 @@ import { cn } from "../../utils/cn.js";
6
6
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../ui/components/select.js";
7
7
  import { Input, labelVariants } from "../../ui/components/input.js";
8
8
  import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from "../../ui/components/dialog.js";
9
- import { useEffect, useEffectEvent, useState } from "react";
10
- import { FormProvider, useController, useForm } from "react-hook-form";
9
+ import { useEffect, useRef, useState } from "react";
11
10
  import { jsx, jsxs } from "react/jsx-runtime";
11
+ import { StfProvider, useFieldValue, useListener, useStf } from "@fumari/stf";
12
12
 
13
13
  //#region src/playground/components/server-select.tsx
14
14
  function ServerSelect(props) {
@@ -55,20 +55,17 @@ function ServerSelect(props) {
55
55
  });
56
56
  }
57
57
  function ServerSelectContent({ defaultValues, onChange, schema }) {
58
- const form = useForm({ defaultValues });
59
- const onChangeDebounced = useEffectEvent(onChange);
60
- useEffect(() => {
61
- let timer = null;
62
- return form.subscribe({
63
- formState: { values: true },
64
- callback({ values }) {
65
- if (timer !== null) window.clearTimeout(timer);
66
- timer = window.setTimeout(() => onChangeDebounced(values), 500);
67
- }
68
- });
69
- }, []);
70
- return /* @__PURE__ */ jsx(FormProvider, {
71
- ...form,
58
+ const stf = useStf({ defaultValues: () => structuredClone(defaultValues) });
59
+ const timerRef = useRef(null);
60
+ useListener({
61
+ stf,
62
+ onUpdate() {
63
+ if (timerRef.current !== null) window.clearTimeout(timerRef.current);
64
+ timerRef.current = window.setTimeout(() => onChange(stf.dataEngine.getData()), 500);
65
+ }
66
+ });
67
+ return /* @__PURE__ */ jsx(StfProvider, {
68
+ value: stf,
72
69
  children: /* @__PURE__ */ jsx("div", {
73
70
  className: "flex flex-col gap-4",
74
71
  children: Object.entries(schema).map(([key, variable]) => {
@@ -95,22 +92,24 @@ function ServerSelectContent({ defaultValues, onChange, schema }) {
95
92
  });
96
93
  }
97
94
  function Field({ fieldName, variable }) {
98
- const { field } = useController({ name: fieldName });
95
+ const [value, setValue] = useFieldValue([fieldName], { compute(currentValue) {
96
+ return typeof currentValue === "string" ? currentValue : void 0;
97
+ } });
99
98
  if (variable.enum) return /* @__PURE__ */ jsxs(Select, {
100
- value: field.value,
101
- onValueChange: field.onChange,
99
+ value,
100
+ onValueChange: setValue,
102
101
  children: [/* @__PURE__ */ jsx(SelectTrigger, {
103
102
  id: fieldName,
104
- ref: field.ref,
105
103
  children: /* @__PURE__ */ jsx(SelectValue, {})
106
- }), /* @__PURE__ */ jsx(SelectContent, { children: variable.enum.map((value) => /* @__PURE__ */ jsx(SelectItem, {
107
- value,
108
- children: value
109
- }, value)) })]
104
+ }), /* @__PURE__ */ jsx(SelectContent, { children: variable.enum.map((value$1) => /* @__PURE__ */ jsx(SelectItem, {
105
+ value: value$1,
106
+ children: value$1
107
+ }, value$1)) })]
110
108
  });
111
109
  return /* @__PURE__ */ jsx(Input, {
112
110
  id: fieldName,
113
- ...field
111
+ value,
112
+ onChange: (e) => setValue(e.target.value)
114
113
  });
115
114
  }
116
115
 
@@ -1 +1 @@
1
- {"version":3,"file":"server-select.js","names":["timer: number | null"],"sources":["../../../src/playground/components/server-select.tsx"],"sourcesContent":["'use client';\nimport { useApiContext, useServerSelectContext } from '@/ui/contexts/api';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\nimport { Input, labelVariants } from '@/ui/components/input';\nimport { type HTMLAttributes, useEffect, useState, useEffectEvent } from 'react';\nimport { cn } from '@/utils/cn';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@/ui/components/dialog';\nimport { resolveServerUrl, withBase } from '@/utils/url';\nimport { FormProvider, useController, useForm } from 'react-hook-form';\nimport type { ServerVariableObject } from '@/types';\nimport type { NoReference } from '@/utils/schema';\n\nexport default function ServerSelect(props: HTMLAttributes<HTMLDivElement>) {\n const { servers } = useApiContext();\n const { server, setServer, setServerVariables } = useServerSelectContext();\n const [open, setOpen] = useState(false);\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (servers.length <= 0) return;\n const serverSchema = server ? servers.find((obj) => obj.url === server.url) : null;\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger className=\"text-xs p-3 py-2 bg-fd-muted text-fd-muted-foreground transition-colors truncate hover:bg-fd-accent hover:text-fd-accent-foreground focus-visible:outline-none\">\n {isMounted\n ? withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n window.location.origin,\n )\n : 'loading...'}\n </DialogTrigger>\n <DialogContent {...props}>\n <DialogHeader>\n <DialogTitle>Server URL</DialogTitle>\n <DialogDescription>The base URL of your API endpoint.</DialogDescription>\n </DialogHeader>\n <Select value={server?.url} onValueChange={setServer}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {servers.map((item) => (\n <SelectItem key={item.url} value={item.url}>\n <code className=\"text-[0.8125rem]\">{item.url}</code>\n <p className=\"text-fd-muted-foreground\">{item.description}</p>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {server?.variables && serverSchema?.variables && (\n <ServerSelectContent\n key={server.url}\n defaultValues={server.variables}\n schema={serverSchema.variables}\n onChange={setServerVariables}\n />\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ServerSelectContent({\n defaultValues,\n onChange,\n schema,\n}: {\n defaultValues: Record<string, string>;\n onChange: (values: Record<string, string>) => void;\n schema: Record<string, NoReference<ServerVariableObject>>;\n}) {\n const form = useForm({\n defaultValues,\n });\n\n const onChangeDebounced = useEffectEvent(onChange);\n useEffect(() => {\n let timer: number | null = null;\n\n return form.subscribe({\n formState: {\n values: true,\n },\n callback({ values }) {\n if (timer !== null) window.clearTimeout(timer);\n\n timer = window.setTimeout(() => onChangeDebounced(values), 500);\n },\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `form` shouldn't be included\n }, []);\n\n return (\n <FormProvider {...form}>\n <div className=\"flex flex-col gap-4\">\n {Object.entries(schema).map(([key, variable]) => {\n return (\n <fieldset key={key} className=\"flex flex-col gap-1\">\n <label className={cn(labelVariants())} htmlFor={key}>\n {key}\n </label>\n <p className=\"text-xs text-fd-muted-foreground empty:hidden\">\n {variable.description}\n </p>\n <Field fieldName={key} variable={variable} />\n </fieldset>\n );\n })}\n </div>\n </FormProvider>\n );\n}\n\nfunction Field({\n fieldName,\n variable,\n}: {\n variable: NoReference<ServerVariableObject>;\n fieldName: string;\n}) {\n const { field } = useController({\n name: fieldName,\n });\n\n if (variable.enum) {\n return (\n <Select value={field.value} onValueChange={field.onChange}>\n <SelectTrigger id={fieldName} ref={field.ref}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {variable.enum.map((value) => (\n <SelectItem key={value} value={value}>\n {value}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n return <Input id={fieldName} {...field} />;\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,SAAwB,aAAa,OAAuC;CAC1E,MAAM,EAAE,YAAY,eAAe;CACnC,MAAM,EAAE,QAAQ,WAAW,uBAAuB,wBAAwB;CAC1E,MAAM,CAAC,MAAM,WAAW,SAAS,MAAM;CACvC,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;AAEjD,iBAAgB;AACd,eAAa,KAAK;IACjB,EAAE,CAAC;AAEN,KAAI,QAAQ,UAAU,EAAG;CACzB,MAAM,eAAe,SAAS,QAAQ,MAAM,QAAQ,IAAI,QAAQ,OAAO,IAAI,GAAG;AAE9E,QACE,qBAAC;EAAa;EAAM,cAAc;aAChC,oBAAC;GAAc,WAAU;aACtB,YACG,SACE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,GAAG,KAC1D,OAAO,SAAS,OACjB,GACD;IACU,EAChB,qBAAC;GAAc,GAAI;;IACjB,qBAAC,2BACC,oBAAC,yBAAY,eAAwB,EACrC,oBAAC,+BAAkB,uCAAsD,IAC5D;IACf,qBAAC;KAAO,OAAO,QAAQ;KAAK,eAAe;gBACzC,oBAAC,2BACC,oBAAC,gBAAc,GACD,EAChB,oBAAC,2BACE,QAAQ,KAAK,SACZ,qBAAC;MAA0B,OAAO,KAAK;iBACrC,oBAAC;OAAK,WAAU;iBAAoB,KAAK;QAAW,EACpD,oBAAC;OAAE,WAAU;iBAA4B,KAAK;QAAgB;QAF/C,KAAK,IAGT,CACb,GACY;MACT;IACR,QAAQ,aAAa,cAAc,aAClC,oBAAC;KAEC,eAAe,OAAO;KACtB,QAAQ,aAAa;KACrB,UAAU;OAHL,OAAO,IAIZ;;IAEU;GACT;;AAIb,SAAS,oBAAoB,EAC3B,eACA,UACA,UAKC;CACD,MAAM,OAAO,QAAQ,EACnB,eACD,CAAC;CAEF,MAAM,oBAAoB,eAAe,SAAS;AAClD,iBAAgB;EACd,IAAIA,QAAuB;AAE3B,SAAO,KAAK,UAAU;GACpB,WAAW,EACT,QAAQ,MACT;GACD,SAAS,EAAE,UAAU;AACnB,QAAI,UAAU,KAAM,QAAO,aAAa,MAAM;AAE9C,YAAQ,OAAO,iBAAiB,kBAAkB,OAAO,EAAE,IAAI;;GAElE,CAAC;IAED,EAAE,CAAC;AAEN,QACE,oBAAC;EAAa,GAAI;YAChB,oBAAC;GAAI,WAAU;aACZ,OAAO,QAAQ,OAAO,CAAC,KAAK,CAAC,KAAK,cAAc;AAC/C,WACE,qBAAC;KAAmB,WAAU;;MAC5B,oBAAC;OAAM,WAAW,GAAG,eAAe,CAAC;OAAE,SAAS;iBAC7C;QACK;MACR,oBAAC;OAAE,WAAU;iBACV,SAAS;QACR;MACJ,oBAAC;OAAM,WAAW;OAAe;QAAY;;OAPhC,IAQJ;KAEb;IACE;GACO;;AAInB,SAAS,MAAM,EACb,WACA,YAIC;CACD,MAAM,EAAE,UAAU,cAAc,EAC9B,MAAM,WACP,CAAC;AAEF,KAAI,SAAS,KACX,QACE,qBAAC;EAAO,OAAO,MAAM;EAAO,eAAe,MAAM;aAC/C,oBAAC;GAAc,IAAI;GAAW,KAAK,MAAM;aACvC,oBAAC,gBAAc;IACD,EAChB,oBAAC,2BACE,SAAS,KAAK,KAAK,UAClB,oBAAC;GAA8B;aAC5B;KADc,MAEJ,CACb,GACY;GACT;AAIb,QAAO,oBAAC;EAAM,IAAI;EAAW,GAAI;GAAS"}
1
+ {"version":3,"file":"server-select.js","names":["value"],"sources":["../../../src/playground/components/server-select.tsx"],"sourcesContent":["'use client';\nimport { useApiContext, useServerSelectContext } from '@/ui/contexts/api';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\nimport { Input, labelVariants } from '@/ui/components/input';\nimport { type HTMLAttributes, useEffect, useState, useRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@/ui/components/dialog';\nimport { resolveServerUrl, withBase } from '@/utils/url';\nimport type { ServerVariableObject } from '@/types';\nimport type { NoReference } from '@/utils/schema';\nimport { StfProvider, useFieldValue, useListener, useStf } from '@fumari/stf';\n\nexport default function ServerSelect(props: HTMLAttributes<HTMLDivElement>) {\n const { servers } = useApiContext();\n const { server, setServer, setServerVariables } = useServerSelectContext();\n const [open, setOpen] = useState(false);\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (servers.length <= 0) return;\n const serverSchema = server ? servers.find((obj) => obj.url === server.url) : null;\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger className=\"text-xs p-3 py-2 bg-fd-muted text-fd-muted-foreground transition-colors truncate hover:bg-fd-accent hover:text-fd-accent-foreground focus-visible:outline-none\">\n {isMounted\n ? withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n window.location.origin,\n )\n : 'loading...'}\n </DialogTrigger>\n <DialogContent {...props}>\n <DialogHeader>\n <DialogTitle>Server URL</DialogTitle>\n <DialogDescription>The base URL of your API endpoint.</DialogDescription>\n </DialogHeader>\n <Select value={server?.url} onValueChange={setServer}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {servers.map((item) => (\n <SelectItem key={item.url} value={item.url}>\n <code className=\"text-[0.8125rem]\">{item.url}</code>\n <p className=\"text-fd-muted-foreground\">{item.description}</p>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {server?.variables && serverSchema?.variables && (\n <ServerSelectContent\n key={server.url}\n defaultValues={server.variables}\n schema={serverSchema.variables}\n onChange={setServerVariables}\n />\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ServerSelectContent({\n defaultValues,\n onChange,\n schema,\n}: {\n defaultValues: Record<string, string>;\n onChange: (values: Record<string, string>) => void;\n schema: Record<string, NoReference<ServerVariableObject>>;\n}) {\n const stf = useStf({\n defaultValues: () => structuredClone(defaultValues),\n });\n const timerRef = useRef<number | null>(null);\n useListener({\n stf,\n onUpdate() {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n\n timerRef.current = window.setTimeout(\n () => onChange(stf.dataEngine.getData() as Record<string, string>),\n 500,\n );\n },\n });\n\n return (\n <StfProvider value={stf}>\n <div className=\"flex flex-col gap-4\">\n {Object.entries(schema).map(([key, variable]) => {\n return (\n <fieldset key={key} className=\"flex flex-col gap-1\">\n <label className={cn(labelVariants())} htmlFor={key}>\n {key}\n </label>\n <p className=\"text-xs text-fd-muted-foreground empty:hidden\">\n {variable.description}\n </p>\n <Field fieldName={key} variable={variable} />\n </fieldset>\n );\n })}\n </div>\n </StfProvider>\n );\n}\n\nfunction Field({\n fieldName,\n variable,\n}: {\n variable: NoReference<ServerVariableObject>;\n fieldName: string;\n}) {\n const [value, setValue] = useFieldValue([fieldName], {\n compute(currentValue) {\n return typeof currentValue === 'string' ? currentValue : undefined;\n },\n });\n\n if (variable.enum) {\n return (\n <Select value={value} onValueChange={setValue}>\n <SelectTrigger id={fieldName}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {variable.enum.map((value) => (\n <SelectItem key={value} value={value}>\n {value}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n return <Input id={fieldName} value={value} onChange={(e) => setValue(e.target.value)} />;\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,SAAwB,aAAa,OAAuC;CAC1E,MAAM,EAAE,YAAY,eAAe;CACnC,MAAM,EAAE,QAAQ,WAAW,uBAAuB,wBAAwB;CAC1E,MAAM,CAAC,MAAM,WAAW,SAAS,MAAM;CACvC,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;AAEjD,iBAAgB;AACd,eAAa,KAAK;IACjB,EAAE,CAAC;AAEN,KAAI,QAAQ,UAAU,EAAG;CACzB,MAAM,eAAe,SAAS,QAAQ,MAAM,QAAQ,IAAI,QAAQ,OAAO,IAAI,GAAG;AAE9E,QACE,qBAAC;EAAa;EAAM,cAAc;aAChC,oBAAC;GAAc,WAAU;aACtB,YACG,SACE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,GAAG,KAC1D,OAAO,SAAS,OACjB,GACD;IACU,EAChB,qBAAC;GAAc,GAAI;;IACjB,qBAAC,2BACC,oBAAC,yBAAY,eAAwB,EACrC,oBAAC,+BAAkB,uCAAsD,IAC5D;IACf,qBAAC;KAAO,OAAO,QAAQ;KAAK,eAAe;gBACzC,oBAAC,2BACC,oBAAC,gBAAc,GACD,EAChB,oBAAC,2BACE,QAAQ,KAAK,SACZ,qBAAC;MAA0B,OAAO,KAAK;iBACrC,oBAAC;OAAK,WAAU;iBAAoB,KAAK;QAAW,EACpD,oBAAC;OAAE,WAAU;iBAA4B,KAAK;QAAgB;QAF/C,KAAK,IAGT,CACb,GACY;MACT;IACR,QAAQ,aAAa,cAAc,aAClC,oBAAC;KAEC,eAAe,OAAO;KACtB,QAAQ,aAAa;KACrB,UAAU;OAHL,OAAO,IAIZ;;IAEU;GACT;;AAIb,SAAS,oBAAoB,EAC3B,eACA,UACA,UAKC;CACD,MAAM,MAAM,OAAO,EACjB,qBAAqB,gBAAgB,cAAc,EACpD,CAAC;CACF,MAAM,WAAW,OAAsB,KAAK;AAC5C,aAAY;EACV;EACA,WAAW;AACT,OAAI,SAAS,YAAY,KAAM,QAAO,aAAa,SAAS,QAAQ;AAEpE,YAAS,UAAU,OAAO,iBAClB,SAAS,IAAI,WAAW,SAAS,CAA2B,EAClE,IACD;;EAEJ,CAAC;AAEF,QACE,oBAAC;EAAY,OAAO;YAClB,oBAAC;GAAI,WAAU;aACZ,OAAO,QAAQ,OAAO,CAAC,KAAK,CAAC,KAAK,cAAc;AAC/C,WACE,qBAAC;KAAmB,WAAU;;MAC5B,oBAAC;OAAM,WAAW,GAAG,eAAe,CAAC;OAAE,SAAS;iBAC7C;QACK;MACR,oBAAC;OAAE,WAAU;iBACV,SAAS;QACR;MACJ,oBAAC;OAAM,WAAW;OAAe;QAAY;;OAPhC,IAQJ;KAEb;IACE;GACM;;AAIlB,SAAS,MAAM,EACb,WACA,YAIC;CACD,MAAM,CAAC,OAAO,YAAY,cAAc,CAAC,UAAU,EAAE,EACnD,QAAQ,cAAc;AACpB,SAAO,OAAO,iBAAiB,WAAW,eAAe;IAE5D,CAAC;AAEF,KAAI,SAAS,KACX,QACE,qBAAC;EAAc;EAAO,eAAe;aACnC,oBAAC;GAAc,IAAI;aACjB,oBAAC,gBAAc;IACD,EAChB,oBAAC,2BACE,SAAS,KAAK,KAAK,YAClB,oBAAC;GAAuB,OAAOA;aAC5BA;KADcA,QAEJ,CACb,GACY;GACT;AAIb,QAAO,oBAAC;EAAM,IAAI;EAAkB;EAAO,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;GAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetcher.js","names":["body: BodyInit | undefined","segs: string[]","type: FetchResult['type']","data: unknown"],"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,IAAIA,OAA6B;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,MAAMC,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,IAAIC;GACJ,IAAIC;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';\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;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 +1 @@
1
- {"version":3,"file":"index.js","names":["context: Context","result: PlaygroundClientProps['securities']","list: PlaygroundClientProps['securities'][number]"],"sources":["../../src/playground/index.tsx"],"sourcesContent":["import type {\n MethodInformation,\n ParameterObject,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { getPreferredType, type NoReference, type ParsedSchema } from '@/utils/schema';\nimport { type PlaygroundClientProps } from './client';\nimport { ClientLazy } from './lazy';\n\nexport type ParameterField = NoReference<ParameterObject> & {\n schema: ParsedSchema;\n in: 'cookie' | 'header' | 'query' | 'path';\n};\n\ninterface Context {\n references: Record<string, ParsedSchema>;\n registered: WeakMap<Exclude<ParsedSchema, boolean>, string>;\n nextId: () => string;\n}\n\nexport interface APIPlaygroundProps {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n}\n\nexport type SecurityEntry = SecuritySchemeObject & {\n scopes: string[];\n id: string;\n};\n\nexport async function APIPlayground({ path, method, ctx }: APIPlaygroundProps) {\n if (ctx.playground?.render) {\n return ctx.playground.render({ path, method, ctx });\n }\n\n let currentId = 0;\n const bodyContent = method.requestBody?.content;\n const mediaType = bodyContent ? getPreferredType(bodyContent) : undefined;\n\n const context: Context = {\n references: {},\n nextId() {\n return String(currentId++);\n },\n registered: new WeakMap(),\n };\n\n const props: PlaygroundClientProps = {\n securities: parseSecurities(method, ctx),\n method: method.method,\n route: path,\n parameters: method.parameters as ParameterField[],\n body:\n bodyContent && mediaType\n ? ({\n schema: writeReferences(bodyContent[mediaType].schema as ParsedSchema, context),\n mediaType,\n } as PlaygroundClientProps['body'])\n : undefined,\n references: context.references,\n proxyUrl: ctx.proxyUrl,\n writeOnly: true,\n readOnly: false,\n };\n\n return <ClientLazy {...props} />;\n}\n\nfunction writeReferences(\n schema: ParsedSchema,\n ctx: Context,\n stack: WeakMap<object, object> = new WeakMap(),\n): ParsedSchema {\n if (typeof schema !== 'object' || !schema) return schema;\n if (stack.has(schema)) {\n const out = stack.get(schema)!;\n const id = ctx.nextId();\n ctx.references[id] = out;\n\n return {\n $ref: id,\n };\n }\n\n const output = { ...schema };\n stack.set(schema, output);\n for (const _n in output) {\n const name = _n as keyof typeof output;\n if (!output[name]) continue;\n\n switch (name) {\n case 'oneOf':\n case 'allOf':\n case 'anyOf':\n output[name] = output[name].map((item) => writeReferences(item, ctx, stack));\n continue;\n case 'items':\n case 'additionalProperties':\n case 'not':\n output[name] = writeReferences(output[name], ctx, stack);\n continue;\n case 'properties':\n case 'patternProperties':\n output[name] = { ...output[name] };\n\n for (const key in output[name]) {\n output[name][key] = writeReferences(output[name][key], ctx, stack);\n }\n }\n }\n\n return output;\n}\n\nfunction parseSecurities(\n method: MethodInformation,\n { schema: { dereferenced } }: RenderContext,\n): PlaygroundClientProps['securities'] {\n const result: PlaygroundClientProps['securities'] = [];\n const security = method.security ?? dereferenced.security ?? [];\n if (security.length === 0) return result;\n\n for (const map of security) {\n const list: PlaygroundClientProps['securities'][number] = [];\n\n for (const [key, scopes] of Object.entries(map)) {\n const scheme = dereferenced.components?.securitySchemes?.[key];\n if (!scheme) continue;\n\n list.push({\n ...scheme,\n scopes,\n id: key,\n });\n }\n\n if (list.length > 0) result.push(list);\n }\n\n return result;\n}\n"],"mappings":";;;;;AAgCA,eAAsB,cAAc,EAAE,MAAM,QAAQ,OAA2B;AAC7E,KAAI,IAAI,YAAY,OAClB,QAAO,IAAI,WAAW,OAAO;EAAE;EAAM;EAAQ;EAAK,CAAC;CAGrD,IAAI,YAAY;CAChB,MAAM,cAAc,OAAO,aAAa;CACxC,MAAM,YAAY,cAAc,iBAAiB,YAAY,GAAG;CAEhE,MAAMA,UAAmB;EACvB,YAAY,EAAE;EACd,SAAS;AACP,UAAO,OAAO,YAAY;;EAE5B,4BAAY,IAAI,SAAS;EAC1B;AAoBD,QAAO,oBAAC;EAjBN,YAAY,gBAAgB,QAAQ,IAAI;EACxC,QAAQ,OAAO;EACf,OAAO;EACP,YAAY,OAAO;EACnB,MACE,eAAe,YACV;GACC,QAAQ,gBAAgB,YAAY,WAAW,QAAwB,QAAQ;GAC/E;GACD,GACD;EACN,YAAY,QAAQ;EACpB,UAAU,IAAI;EACd,WAAW;EACX,UAAU;GAGoB;;AAGlC,SAAS,gBACP,QACA,KACA,wBAAiC,IAAI,SAAS,EAChC;AACd,KAAI,OAAO,WAAW,YAAY,CAAC,OAAQ,QAAO;AAClD,KAAI,MAAM,IAAI,OAAO,EAAE;EACrB,MAAM,MAAM,MAAM,IAAI,OAAO;EAC7B,MAAM,KAAK,IAAI,QAAQ;AACvB,MAAI,WAAW,MAAM;AAErB,SAAO,EACL,MAAM,IACP;;CAGH,MAAM,SAAS,EAAE,GAAG,QAAQ;AAC5B,OAAM,IAAI,QAAQ,OAAO;AACzB,MAAK,MAAM,MAAM,QAAQ;EACvB,MAAM,OAAO;AACb,MAAI,CAAC,OAAO,MAAO;AAEnB,UAAQ,MAAR;GACE,KAAK;GACL,KAAK;GACL,KAAK;AACH,WAAO,QAAQ,OAAO,MAAM,KAAK,SAAS,gBAAgB,MAAM,KAAK,MAAM,CAAC;AAC5E;GACF,KAAK;GACL,KAAK;GACL,KAAK;AACH,WAAO,QAAQ,gBAAgB,OAAO,OAAO,KAAK,MAAM;AACxD;GACF,KAAK;GACL,KAAK;AACH,WAAO,QAAQ,EAAE,GAAG,OAAO,OAAO;AAElC,SAAK,MAAM,OAAO,OAAO,MACvB,QAAO,MAAM,OAAO,gBAAgB,OAAO,MAAM,MAAM,KAAK,MAAM;;;AAK1E,QAAO;;AAGT,SAAS,gBACP,QACA,EAAE,QAAQ,EAAE,kBACyB;CACrC,MAAMC,SAA8C,EAAE;CACtD,MAAM,WAAW,OAAO,YAAY,aAAa,YAAY,EAAE;AAC/D,KAAI,SAAS,WAAW,EAAG,QAAO;AAElC,MAAK,MAAM,OAAO,UAAU;EAC1B,MAAMC,OAAoD,EAAE;AAE5D,OAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,IAAI,EAAE;GAC/C,MAAM,SAAS,aAAa,YAAY,kBAAkB;AAC1D,OAAI,CAAC,OAAQ;AAEb,QAAK,KAAK;IACR,GAAG;IACH;IACA,IAAI;IACL,CAAC;;AAGJ,MAAI,KAAK,SAAS,EAAG,QAAO,KAAK,KAAK;;AAGxC,QAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/playground/index.tsx"],"sourcesContent":["import type {\n MethodInformation,\n ParameterObject,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { getPreferredType, type NoReference, type ParsedSchema } from '@/utils/schema';\nimport { type PlaygroundClientProps } from './client';\nimport { ClientLazy } from './lazy';\n\nexport type ParameterField = NoReference<ParameterObject> & {\n schema: ParsedSchema;\n in: 'cookie' | 'header' | 'query' | 'path';\n};\n\ninterface Context {\n references: Record<string, ParsedSchema>;\n registered: WeakMap<Exclude<ParsedSchema, boolean>, string>;\n nextId: () => string;\n}\n\nexport interface APIPlaygroundProps {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n}\n\nexport type SecurityEntry = SecuritySchemeObject & {\n scopes: string[];\n id: string;\n};\n\nexport async function APIPlayground({ path, method, ctx }: APIPlaygroundProps) {\n if (ctx.playground?.render) {\n return ctx.playground.render({ path, method, ctx });\n }\n\n let currentId = 0;\n const bodyContent = method.requestBody?.content;\n const mediaType = bodyContent ? getPreferredType(bodyContent) : undefined;\n\n const context: Context = {\n references: {},\n nextId() {\n return String(currentId++);\n },\n registered: new WeakMap(),\n };\n\n const props: PlaygroundClientProps = {\n securities: parseSecurities(method, ctx),\n method: method.method,\n route: path,\n parameters: method.parameters as ParameterField[],\n body:\n bodyContent && mediaType\n ? ({\n schema: writeReferences(bodyContent[mediaType].schema as ParsedSchema, context),\n mediaType,\n } as PlaygroundClientProps['body'])\n : undefined,\n references: context.references,\n proxyUrl: ctx.proxyUrl,\n writeOnly: true,\n readOnly: false,\n };\n\n return <ClientLazy {...props} />;\n}\n\nfunction writeReferences(\n schema: ParsedSchema,\n ctx: Context,\n stack: WeakMap<object, object> = new WeakMap(),\n): ParsedSchema {\n if (typeof schema !== 'object' || !schema) return schema;\n if (stack.has(schema)) {\n const out = stack.get(schema)!;\n const id = ctx.nextId();\n ctx.references[id] = out;\n\n return {\n $ref: id,\n };\n }\n\n const output = { ...schema };\n stack.set(schema, output);\n for (const _n in output) {\n const name = _n as keyof typeof output;\n if (!output[name]) continue;\n\n switch (name) {\n case 'oneOf':\n case 'allOf':\n case 'anyOf':\n output[name] = output[name].map((item) => writeReferences(item, ctx, stack));\n continue;\n case 'items':\n case 'additionalProperties':\n case 'not':\n output[name] = writeReferences(output[name], ctx, stack);\n continue;\n case 'properties':\n case 'patternProperties':\n output[name] = { ...output[name] };\n\n for (const key in output[name]) {\n output[name][key] = writeReferences(output[name][key], ctx, stack);\n }\n }\n }\n\n return output;\n}\n\nfunction parseSecurities(\n method: MethodInformation,\n { schema: { dereferenced } }: RenderContext,\n): PlaygroundClientProps['securities'] {\n const result: PlaygroundClientProps['securities'] = [];\n const security = method.security ?? dereferenced.security ?? [];\n if (security.length === 0) return result;\n\n for (const map of security) {\n const list: PlaygroundClientProps['securities'][number] = [];\n\n for (const [key, scopes] of Object.entries(map)) {\n const scheme = dereferenced.components?.securitySchemes?.[key];\n if (!scheme) continue;\n\n list.push({\n ...scheme,\n scopes,\n id: key,\n });\n }\n\n if (list.length > 0) result.push(list);\n }\n\n return result;\n}\n"],"mappings":";;;;;AAgCA,eAAsB,cAAc,EAAE,MAAM,QAAQ,OAA2B;AAC7E,KAAI,IAAI,YAAY,OAClB,QAAO,IAAI,WAAW,OAAO;EAAE;EAAM;EAAQ;EAAK,CAAC;CAGrD,IAAI,YAAY;CAChB,MAAM,cAAc,OAAO,aAAa;CACxC,MAAM,YAAY,cAAc,iBAAiB,YAAY,GAAG;CAEhE,MAAM,UAAmB;EACvB,YAAY,EAAE;EACd,SAAS;AACP,UAAO,OAAO,YAAY;;EAE5B,4BAAY,IAAI,SAAS;EAC1B;AAoBD,QAAO,oBAAC;EAjBN,YAAY,gBAAgB,QAAQ,IAAI;EACxC,QAAQ,OAAO;EACf,OAAO;EACP,YAAY,OAAO;EACnB,MACE,eAAe,YACV;GACC,QAAQ,gBAAgB,YAAY,WAAW,QAAwB,QAAQ;GAC/E;GACD,GACD;EACN,YAAY,QAAQ;EACpB,UAAU,IAAI;EACd,WAAW;EACX,UAAU;GAGoB;;AAGlC,SAAS,gBACP,QACA,KACA,wBAAiC,IAAI,SAAS,EAChC;AACd,KAAI,OAAO,WAAW,YAAY,CAAC,OAAQ,QAAO;AAClD,KAAI,MAAM,IAAI,OAAO,EAAE;EACrB,MAAM,MAAM,MAAM,IAAI,OAAO;EAC7B,MAAM,KAAK,IAAI,QAAQ;AACvB,MAAI,WAAW,MAAM;AAErB,SAAO,EACL,MAAM,IACP;;CAGH,MAAM,SAAS,EAAE,GAAG,QAAQ;AAC5B,OAAM,IAAI,QAAQ,OAAO;AACzB,MAAK,MAAM,MAAM,QAAQ;EACvB,MAAM,OAAO;AACb,MAAI,CAAC,OAAO,MAAO;AAEnB,UAAQ,MAAR;GACE,KAAK;GACL,KAAK;GACL,KAAK;AACH,WAAO,QAAQ,OAAO,MAAM,KAAK,SAAS,gBAAgB,MAAM,KAAK,MAAM,CAAC;AAC5E;GACF,KAAK;GACL,KAAK;GACL,KAAK;AACH,WAAO,QAAQ,gBAAgB,OAAO,OAAO,KAAK,MAAM;AACxD;GACF,KAAK;GACL,KAAK;AACH,WAAO,QAAQ,EAAE,GAAG,OAAO,OAAO;AAElC,SAAK,MAAM,OAAO,OAAO,MACvB,QAAO,MAAM,OAAO,gBAAgB,OAAO,MAAM,MAAM,KAAK,MAAM;;;AAK1E,QAAO;;AAGT,SAAS,gBACP,QACA,EAAE,QAAQ,EAAE,kBACyB;CACrC,MAAM,SAA8C,EAAE;CACtD,MAAM,WAAW,OAAO,YAAY,aAAa,YAAY,EAAE;AAC/D,KAAI,SAAS,WAAW,EAAG,QAAO;AAElC,MAAK,MAAM,OAAO,UAAU;EAC1B,MAAM,OAAoD,EAAE;AAE5D,OAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,IAAI,EAAE;GAC/C,MAAM,SAAS,aAAa,YAAY,kBAAkB;AAC1D,OAAI,CAAC,OAAQ;AAEb,QAAK,KAAK;IACR,GAAG;IACH;IACA,IAAI;IACL,CAAC;;AAGJ,MAAI,KAAK,SAAS,EAAG,QAAO,KAAK,KAAK;;AAGxC,QAAO"}
@@ -2,6 +2,7 @@ import "../utils/schema.js";
2
2
  import { ReactNode } from "react";
3
3
  import "react/jsx-runtime";
4
4
  import { Ajv2020 } from "ajv/dist/2020";
5
+ import { FieldKey } from "@fumari/stf";
5
6
 
6
7
  //#region src/playground/schema.d.ts
7
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/playground/schema.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAaiB,WAAA"}
1
+ {"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/playground/schema.tsx"],"sourcesContent":[],"mappings":";;;;;;;;UAYiB,WAAA"}
@@ -1,9 +1,9 @@
1
1
  import { getDefaultValue } from "./get-default-values.js";
2
2
  import { mergeAllOf } from "../utils/merge-schema.js";
3
3
  import { createContext, use, useMemo, useState } from "react";
4
- import { useFormContext } from "react-hook-form";
5
4
  import { jsx } from "react/jsx-runtime";
6
5
  import { Ajv2020 } from "ajv/dist/2020";
6
+ import { useDataEngine } from "@fumari/stf";
7
7
 
8
8
  //#region src/playground/schema.tsx
9
9
  const SchemaContext = createContext(void 0);
@@ -18,7 +18,7 @@ const anyFields = {
18
18
  items: true,
19
19
  additionalProperties: true
20
20
  };
21
- function SchemaProvider({ references, fieldInfoMap, readOnly, writeOnly, children }) {
21
+ function SchemaProvider({ references, readOnly, writeOnly, children }) {
22
22
  const ajv = useMemo(() => new Ajv2020({
23
23
  strict: false,
24
24
  validateSchema: false,
@@ -28,13 +28,11 @@ function SchemaProvider({ references, fieldInfoMap, readOnly, writeOnly, childre
28
28
  return /* @__PURE__ */ jsx(SchemaContext.Provider, {
29
29
  value: useMemo(() => ({
30
30
  references,
31
- fieldInfoMap,
32
31
  ajv,
33
32
  readOnly,
34
33
  writeOnly
35
34
  }), [
36
35
  references,
37
- fieldInfoMap,
38
36
  ajv,
39
37
  readOnly,
40
38
  writeOnly
@@ -52,13 +50,13 @@ function useSchemaScope() {
52
50
  * @param schema - The JSON Schema to generate initial values.
53
51
  * @param depth - The depth to avoid duplicated field name with same schema (e.g. nested `oneOf`).
54
52
  */
55
- function useFieldInfo(fieldName, schema, depth) {
56
- const { fieldInfoMap, ajv } = use(SchemaContext);
57
- const form = useFormContext();
58
- const keyName = `${fieldName}:${depth}`;
53
+ function useFieldInfo(fieldName, schema) {
54
+ const { ajv } = use(SchemaContext);
55
+ const engine = useDataEngine();
56
+ const attachedData = engine.attachedData("field-info");
59
57
  const [info, setInfo] = useState(() => {
60
- const value = form.getValues(fieldName);
61
- const initialInfo = fieldInfoMap.get(keyName);
58
+ const value = engine.get(fieldName);
59
+ const initialInfo = attachedData.get(fieldName);
62
60
  if (initialInfo) return initialInfo;
63
61
  const out = { oneOf: -1 };
64
62
  const union = getUnion(schema);
@@ -83,7 +81,7 @@ function useFieldInfo(fieldName, schema, depth) {
83
81
  }
84
82
  return out;
85
83
  });
86
- fieldInfoMap.set(keyName, info);
84
+ attachedData.set(fieldName, info);
87
85
  return {
88
86
  info,
89
87
  updateInfo: (value) => {
@@ -99,7 +97,7 @@ function useFieldInfo(fieldName, schema, depth) {
99
97
  ...schema,
100
98
  type: updated.selectedType
101
99
  };
102
- form.setValue(fieldName, getDefaultValue(valueSchema));
100
+ engine.update(fieldName, getDefaultValue(valueSchema));
103
101
  }
104
102
  };
105
103
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":["out: FieldInfo","valueSchema: ParsedSchema"],"sources":["../../src/playground/schema.tsx"],"sourcesContent":["import { Ajv2020 } from 'ajv/dist/2020';\nimport { createContext, ReactNode, use, useMemo, useState } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { getDefaultValue } from '@/playground/get-default-values';\nimport type { ParsedSchema } from '@/utils/schema';\nimport { mergeAllOf } from '@/utils/merge-schema';\n\ninterface SchemaContextType extends SchemaScope {\n references: Record<string, ParsedSchema>;\n fieldInfoMap: Map<string, FieldInfo>;\n ajv: Ajv2020;\n}\n\nexport interface SchemaScope {\n /**\n * show write only fields\n */\n writeOnly: boolean;\n\n /**\n * show read only fields\n */\n readOnly: boolean;\n}\n\ntype UnionField = 'anyOf' | 'oneOf';\n\nexport interface FieldInfo {\n selectedType?: string;\n oneOf: number;\n\n /**\n * The actual field that represents union members.\n */\n unionField?: UnionField;\n\n intersection?: {\n merged: Exclude<ParsedSchema, boolean>;\n };\n}\n\nconst SchemaContext = createContext<SchemaContextType | undefined>(undefined);\nexport const anyFields = {\n type: ['string', 'number', 'boolean', 'array', 'object'],\n items: true,\n additionalProperties: true,\n} satisfies ParsedSchema;\n\nexport function SchemaProvider({\n references,\n fieldInfoMap,\n readOnly,\n writeOnly,\n children,\n}: Omit<SchemaContextType, 'ajv'> & { children: ReactNode }) {\n const ajv = useMemo(\n () =>\n new Ajv2020({\n strict: false,\n validateSchema: false,\n validateFormats: false,\n schemas: references,\n }),\n [references],\n );\n\n return (\n <SchemaContext.Provider\n value={useMemo(\n () => ({ references, fieldInfoMap, ajv, readOnly, writeOnly }),\n [references, fieldInfoMap, ajv, readOnly, writeOnly],\n )}\n >\n {children}\n </SchemaContext.Provider>\n );\n}\n\nexport function useSchemaScope(): SchemaScope {\n return use(SchemaContext)!;\n}\n\n/**\n * A hook to store dynamic info of a field, such as selected schema of `oneOf`.\n *\n * @param fieldName - field name of form.\n * @param schema - The JSON Schema to generate initial values.\n * @param depth - The depth to avoid duplicated field name with same schema (e.g. nested `oneOf`).\n */\nexport function useFieldInfo(\n fieldName: string,\n schema: Exclude<ParsedSchema, boolean>,\n depth: number,\n): {\n info: FieldInfo;\n updateInfo: (value: Partial<FieldInfo>) => void;\n} {\n const { fieldInfoMap, ajv } = use(SchemaContext)!;\n const form = useFormContext();\n const keyName = `${fieldName}:${depth}`;\n const [info, setInfo] = useState<FieldInfo>(() => {\n const value = form.getValues(fieldName as 'body');\n const initialInfo = fieldInfoMap.get(keyName);\n if (initialInfo) return initialInfo;\n\n const out: FieldInfo = {\n oneOf: -1,\n };\n const union = getUnion(schema);\n if (union) {\n const [members, field] = union;\n\n out.oneOf = members.findIndex((item) => ajv.validate(item, value));\n if (out.oneOf === -1) out.oneOf = 0;\n out.unionField = field;\n }\n\n if (Array.isArray(schema.type)) {\n const types = schema.type;\n\n out.selectedType =\n types.find((type) => {\n schema.type = type;\n const match = ajv.validate(schema, value);\n schema.type = types;\n\n return match;\n }) ?? types.at(0);\n }\n\n if (schema.allOf) {\n const merged = mergeAllOf(schema);\n\n if (typeof merged !== 'boolean')\n out.intersection = {\n merged,\n };\n }\n\n return out;\n });\n\n fieldInfoMap.set(keyName, info);\n\n return {\n info,\n updateInfo: (value) => {\n const updated = {\n ...info,\n ...value,\n };\n\n if (updated.oneOf === info.oneOf && updated.selectedType === info.selectedType) return;\n\n setInfo(updated);\n\n let valueSchema: ParsedSchema = schema;\n if (updated.unionField) {\n valueSchema = schema[updated.unionField]![updated.oneOf];\n } else if (updated.selectedType) {\n valueSchema = { ...schema, type: updated.selectedType };\n }\n\n form.setValue(fieldName, getDefaultValue(valueSchema));\n },\n };\n}\n\n/**\n * Resolve `$ref` in the schema, **not recursive**.\n */\nexport function useResolvedSchema(schema: ParsedSchema): Exclude<ParsedSchema, boolean> {\n const { references } = use(SchemaContext)!;\n\n return useMemo(() => {\n if (typeof schema === 'boolean') return anyFields;\n if (schema.$ref) return fallbackAny(references[schema.$ref]);\n return schema;\n }, [references, schema]);\n}\n\nexport function fallbackAny(schema: ParsedSchema): Exclude<ParsedSchema, boolean> {\n return typeof schema === 'boolean' ? anyFields : schema;\n}\n\nfunction getUnion(\n schema: Exclude<ParsedSchema, boolean>,\n): [readonly ParsedSchema[], UnionField] | undefined {\n if (schema.anyOf) {\n return [schema.anyOf, 'anyOf'];\n }\n\n if (schema.oneOf) return [schema.oneOf, 'oneOf'];\n}\n"],"mappings":";;;;;;;;AAyCA,MAAM,gBAAgB,cAA6C,OAAU;AAC7E,MAAa,YAAY;CACvB,MAAM;EAAC;EAAU;EAAU;EAAW;EAAS;EAAS;CACxD,OAAO;CACP,sBAAsB;CACvB;AAED,SAAgB,eAAe,EAC7B,YACA,cACA,UACA,WACA,YAC2D;CAC3D,MAAM,MAAM,cAER,IAAI,QAAQ;EACV,QAAQ;EACR,gBAAgB;EAChB,iBAAiB;EACjB,SAAS;EACV,CAAC,EACJ,CAAC,WAAW,CACb;AAED,QACE,oBAAC,cAAc;EACb,OAAO,eACE;GAAE;GAAY;GAAc;GAAK;GAAU;GAAW,GAC7D;GAAC;GAAY;GAAc;GAAK;GAAU;GAAU,CACrD;EAEA;GACsB;;AAI7B,SAAgB,iBAA8B;AAC5C,QAAO,IAAI,cAAc;;;;;;;;;AAU3B,SAAgB,aACd,WACA,QACA,OAIA;CACA,MAAM,EAAE,cAAc,QAAQ,IAAI,cAAc;CAChD,MAAM,OAAO,gBAAgB;CAC7B,MAAM,UAAU,GAAG,UAAU,GAAG;CAChC,MAAM,CAAC,MAAM,WAAW,eAA0B;EAChD,MAAM,QAAQ,KAAK,UAAU,UAAoB;EACjD,MAAM,cAAc,aAAa,IAAI,QAAQ;AAC7C,MAAI,YAAa,QAAO;EAExB,MAAMA,MAAiB,EACrB,OAAO,IACR;EACD,MAAM,QAAQ,SAAS,OAAO;AAC9B,MAAI,OAAO;GACT,MAAM,CAAC,SAAS,SAAS;AAEzB,OAAI,QAAQ,QAAQ,WAAW,SAAS,IAAI,SAAS,MAAM,MAAM,CAAC;AAClE,OAAI,IAAI,UAAU,GAAI,KAAI,QAAQ;AAClC,OAAI,aAAa;;AAGnB,MAAI,MAAM,QAAQ,OAAO,KAAK,EAAE;GAC9B,MAAM,QAAQ,OAAO;AAErB,OAAI,eACF,MAAM,MAAM,SAAS;AACnB,WAAO,OAAO;IACd,MAAM,QAAQ,IAAI,SAAS,QAAQ,MAAM;AACzC,WAAO,OAAO;AAEd,WAAO;KACP,IAAI,MAAM,GAAG,EAAE;;AAGrB,MAAI,OAAO,OAAO;GAChB,MAAM,SAAS,WAAW,OAAO;AAEjC,OAAI,OAAO,WAAW,UACpB,KAAI,eAAe,EACjB,QACD;;AAGL,SAAO;GACP;AAEF,cAAa,IAAI,SAAS,KAAK;AAE/B,QAAO;EACL;EACA,aAAa,UAAU;GACrB,MAAM,UAAU;IACd,GAAG;IACH,GAAG;IACJ;AAED,OAAI,QAAQ,UAAU,KAAK,SAAS,QAAQ,iBAAiB,KAAK,aAAc;AAEhF,WAAQ,QAAQ;GAEhB,IAAIC,cAA4B;AAChC,OAAI,QAAQ,WACV,eAAc,OAAO,QAAQ,YAAa,QAAQ;YACzC,QAAQ,aACjB,eAAc;IAAE,GAAG;IAAQ,MAAM,QAAQ;IAAc;AAGzD,QAAK,SAAS,WAAW,gBAAgB,YAAY,CAAC;;EAEzD;;;;;AAMH,SAAgB,kBAAkB,QAAsD;CACtF,MAAM,EAAE,eAAe,IAAI,cAAc;AAEzC,QAAO,cAAc;AACnB,MAAI,OAAO,WAAW,UAAW,QAAO;AACxC,MAAI,OAAO,KAAM,QAAO,YAAY,WAAW,OAAO,MAAM;AAC5D,SAAO;IACN,CAAC,YAAY,OAAO,CAAC;;AAG1B,SAAgB,YAAY,QAAsD;AAChF,QAAO,OAAO,WAAW,YAAY,YAAY;;AAGnD,SAAS,SACP,QACmD;AACnD,KAAI,OAAO,MACT,QAAO,CAAC,OAAO,OAAO,QAAQ;AAGhC,KAAI,OAAO,MAAO,QAAO,CAAC,OAAO,OAAO,QAAQ"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../src/playground/schema.tsx"],"sourcesContent":["import { Ajv2020 } from 'ajv/dist/2020';\nimport { createContext, ReactNode, use, useMemo, useState } from 'react';\nimport { getDefaultValue } from '@/playground/get-default-values';\nimport type { ParsedSchema } from '@/utils/schema';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport { FieldKey, useDataEngine } from '@fumari/stf';\n\ninterface SchemaContextType extends SchemaScope {\n references: Record<string, ParsedSchema>;\n ajv: Ajv2020;\n}\n\nexport interface SchemaScope {\n /**\n * show write only fields\n */\n writeOnly: boolean;\n\n /**\n * show read only fields\n */\n readOnly: boolean;\n}\n\ntype UnionField = 'anyOf' | 'oneOf';\n\nexport interface FieldInfo {\n selectedType?: string;\n oneOf: number;\n\n /**\n * The actual field that represents union members.\n */\n unionField?: UnionField;\n\n intersection?: {\n merged: Exclude<ParsedSchema, boolean>;\n };\n}\n\nconst SchemaContext = createContext<SchemaContextType | undefined>(undefined);\nexport const anyFields = {\n type: ['string', 'number', 'boolean', 'array', 'object'],\n items: true,\n additionalProperties: true,\n} satisfies ParsedSchema;\n\nexport function SchemaProvider({\n references,\n readOnly,\n writeOnly,\n children,\n}: Omit<SchemaContextType, 'ajv'> & { children: ReactNode }) {\n const ajv = useMemo(\n () =>\n new Ajv2020({\n strict: false,\n validateSchema: false,\n validateFormats: false,\n schemas: references,\n }),\n [references],\n );\n\n return (\n <SchemaContext.Provider\n value={useMemo(\n () => ({ references, ajv, readOnly, writeOnly }),\n [references, ajv, readOnly, writeOnly],\n )}\n >\n {children}\n </SchemaContext.Provider>\n );\n}\n\nexport function useSchemaScope(): SchemaScope {\n return use(SchemaContext)!;\n}\n\n/**\n * A hook to store dynamic info of a field, such as selected schema of `oneOf`.\n *\n * @param fieldName - field name of form.\n * @param schema - The JSON Schema to generate initial values.\n * @param depth - The depth to avoid duplicated field name with same schema (e.g. nested `oneOf`).\n */\nexport function useFieldInfo(\n fieldName: FieldKey,\n schema: Exclude<ParsedSchema, boolean>,\n): {\n info: FieldInfo;\n updateInfo: (value: Partial<FieldInfo>) => void;\n} {\n const { ajv } = use(SchemaContext)!;\n const engine = useDataEngine();\n const attachedData = engine.attachedData<FieldInfo>('field-info');\n const [info, setInfo] = useState<FieldInfo>(() => {\n const value = engine.get(fieldName);\n const initialInfo = attachedData.get(fieldName);\n if (initialInfo) return initialInfo;\n\n const out: FieldInfo = {\n oneOf: -1,\n };\n const union = getUnion(schema);\n if (union) {\n const [members, field] = union;\n\n out.oneOf = members.findIndex((item) => ajv.validate(item, value));\n if (out.oneOf === -1) out.oneOf = 0;\n out.unionField = field;\n }\n\n if (Array.isArray(schema.type)) {\n const types = schema.type;\n\n out.selectedType =\n types.find((type) => {\n schema.type = type;\n const match = ajv.validate(schema, value);\n schema.type = types;\n\n return match;\n }) ?? types.at(0);\n }\n\n if (schema.allOf) {\n const merged = mergeAllOf(schema);\n\n if (typeof merged !== 'boolean')\n out.intersection = {\n merged,\n };\n }\n\n return out;\n });\n\n attachedData.set(fieldName, info);\n return {\n info,\n updateInfo: (value) => {\n const updated = {\n ...info,\n ...value,\n };\n\n if (updated.oneOf === info.oneOf && updated.selectedType === info.selectedType) return;\n\n setInfo(updated);\n\n let valueSchema: ParsedSchema = schema;\n if (updated.unionField) {\n valueSchema = schema[updated.unionField]![updated.oneOf];\n } else if (updated.selectedType) {\n valueSchema = { ...schema, type: updated.selectedType };\n }\n\n engine.update(fieldName, getDefaultValue(valueSchema));\n },\n };\n}\n\n/**\n * Resolve `$ref` in the schema, **not recursive**.\n */\nexport function useResolvedSchema(schema: ParsedSchema): Exclude<ParsedSchema, boolean> {\n const { references } = use(SchemaContext)!;\n\n return useMemo(() => {\n if (typeof schema === 'boolean') return anyFields;\n if (schema.$ref) return fallbackAny(references[schema.$ref]);\n return schema;\n }, [references, schema]);\n}\n\nexport function fallbackAny(schema: ParsedSchema): Exclude<ParsedSchema, boolean> {\n return typeof schema === 'boolean' ? anyFields : schema;\n}\n\nfunction getUnion(\n schema: Exclude<ParsedSchema, boolean>,\n): [readonly ParsedSchema[], UnionField] | undefined {\n if (schema.anyOf) {\n return [schema.anyOf, 'anyOf'];\n }\n\n if (schema.oneOf) return [schema.oneOf, 'oneOf'];\n}\n"],"mappings":";;;;;;;;AAwCA,MAAM,gBAAgB,cAA6C,OAAU;AAC7E,MAAa,YAAY;CACvB,MAAM;EAAC;EAAU;EAAU;EAAW;EAAS;EAAS;CACxD,OAAO;CACP,sBAAsB;CACvB;AAED,SAAgB,eAAe,EAC7B,YACA,UACA,WACA,YAC2D;CAC3D,MAAM,MAAM,cAER,IAAI,QAAQ;EACV,QAAQ;EACR,gBAAgB;EAChB,iBAAiB;EACjB,SAAS;EACV,CAAC,EACJ,CAAC,WAAW,CACb;AAED,QACE,oBAAC,cAAc;EACb,OAAO,eACE;GAAE;GAAY;GAAK;GAAU;GAAW,GAC/C;GAAC;GAAY;GAAK;GAAU;GAAU,CACvC;EAEA;GACsB;;AAI7B,SAAgB,iBAA8B;AAC5C,QAAO,IAAI,cAAc;;;;;;;;;AAU3B,SAAgB,aACd,WACA,QAIA;CACA,MAAM,EAAE,QAAQ,IAAI,cAAc;CAClC,MAAM,SAAS,eAAe;CAC9B,MAAM,eAAe,OAAO,aAAwB,aAAa;CACjE,MAAM,CAAC,MAAM,WAAW,eAA0B;EAChD,MAAM,QAAQ,OAAO,IAAI,UAAU;EACnC,MAAM,cAAc,aAAa,IAAI,UAAU;AAC/C,MAAI,YAAa,QAAO;EAExB,MAAM,MAAiB,EACrB,OAAO,IACR;EACD,MAAM,QAAQ,SAAS,OAAO;AAC9B,MAAI,OAAO;GACT,MAAM,CAAC,SAAS,SAAS;AAEzB,OAAI,QAAQ,QAAQ,WAAW,SAAS,IAAI,SAAS,MAAM,MAAM,CAAC;AAClE,OAAI,IAAI,UAAU,GAAI,KAAI,QAAQ;AAClC,OAAI,aAAa;;AAGnB,MAAI,MAAM,QAAQ,OAAO,KAAK,EAAE;GAC9B,MAAM,QAAQ,OAAO;AAErB,OAAI,eACF,MAAM,MAAM,SAAS;AACnB,WAAO,OAAO;IACd,MAAM,QAAQ,IAAI,SAAS,QAAQ,MAAM;AACzC,WAAO,OAAO;AAEd,WAAO;KACP,IAAI,MAAM,GAAG,EAAE;;AAGrB,MAAI,OAAO,OAAO;GAChB,MAAM,SAAS,WAAW,OAAO;AAEjC,OAAI,OAAO,WAAW,UACpB,KAAI,eAAe,EACjB,QACD;;AAGL,SAAO;GACP;AAEF,cAAa,IAAI,WAAW,KAAK;AACjC,QAAO;EACL;EACA,aAAa,UAAU;GACrB,MAAM,UAAU;IACd,GAAG;IACH,GAAG;IACJ;AAED,OAAI,QAAQ,UAAU,KAAK,SAAS,QAAQ,iBAAiB,KAAK,aAAc;AAEhF,WAAQ,QAAQ;GAEhB,IAAI,cAA4B;AAChC,OAAI,QAAQ,WACV,eAAc,OAAO,QAAQ,YAAa,QAAQ;YACzC,QAAQ,aACjB,eAAc;IAAE,GAAG;IAAQ,MAAM,QAAQ;IAAc;AAGzD,UAAO,OAAO,WAAW,gBAAgB,YAAY,CAAC;;EAEzD;;;;;AAMH,SAAgB,kBAAkB,QAAsD;CACtF,MAAM,EAAE,eAAe,IAAI,cAAc;AAEzC,QAAO,cAAc;AACnB,MAAI,OAAO,WAAW,UAAW,QAAO;AACxC,MAAI,OAAO,KAAM,QAAO,YAAY,WAAW,OAAO,MAAM;AAC5D,SAAO;IACN,CAAC,YAAY,OAAO,CAAC;;AAG1B,SAAgB,YAAY,QAAsD;AAChF,QAAO,OAAO,WAAW,YAAY,YAAY;;AAGnD,SAAS,SACP,QACmD;AACnD,KAAI,OAAO,MACT,QAAO,CAAC,OAAO,OAAO,QAAQ;AAGhC,KAAI,OAAO,MAAO,QAAO,CAAC,OAAO,OAAO,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"status-info.js","names":["statusMap: Record<number, StatusInfo>"],"sources":["../../src/playground/status-info.tsx"],"sourcesContent":["import { CircleCheck, CircleX } from 'lucide-react';\n\ninterface StatusInfo {\n description: string;\n color: string;\n icon: React.ElementType;\n}\n\nconst statusMap: Record<number, StatusInfo> = {\n 400: { description: 'Bad Request', color: 'text-red-500', icon: CircleX },\n 401: {\n description: 'Unauthorized',\n color: 'text-red-500',\n icon: CircleX,\n },\n 403: { description: 'Forbidden', color: 'text-red-500', icon: CircleX },\n 404: {\n description: 'Not Found',\n color: 'text-fd-muted-foreground',\n icon: CircleX,\n },\n 500: {\n description: 'Internal Server Error',\n color: 'text-red-500',\n icon: CircleX,\n },\n};\n\nexport function getStatusInfo(status: number): StatusInfo {\n if (status in statusMap) {\n return statusMap[status];\n }\n\n if (status >= 200 && status < 300) {\n return {\n description: 'Successful',\n color: 'text-green-500',\n icon: CircleCheck,\n };\n }\n\n if (status >= 400) {\n return { description: 'Error', color: 'text-red-500', icon: CircleX };\n }\n\n return {\n description: 'No Description',\n color: 'text-fd-muted-foreground',\n icon: CircleX,\n };\n}\n"],"mappings":";;;AAQA,MAAMA,YAAwC;CAC5C,KAAK;EAAE,aAAa;EAAe,OAAO;EAAgB,MAAM;EAAS;CACzE,KAAK;EACH,aAAa;EACb,OAAO;EACP,MAAM;EACP;CACD,KAAK;EAAE,aAAa;EAAa,OAAO;EAAgB,MAAM;EAAS;CACvE,KAAK;EACH,aAAa;EACb,OAAO;EACP,MAAM;EACP;CACD,KAAK;EACH,aAAa;EACb,OAAO;EACP,MAAM;EACP;CACF;AAED,SAAgB,cAAc,QAA4B;AACxD,KAAI,UAAU,UACZ,QAAO,UAAU;AAGnB,KAAI,UAAU,OAAO,SAAS,IAC5B,QAAO;EACL,aAAa;EACb,OAAO;EACP,MAAM;EACP;AAGH,KAAI,UAAU,IACZ,QAAO;EAAE,aAAa;EAAS,OAAO;EAAgB,MAAM;EAAS;AAGvE,QAAO;EACL,aAAa;EACb,OAAO;EACP,MAAM;EACP"}
1
+ {"version":3,"file":"status-info.js","names":[],"sources":["../../src/playground/status-info.tsx"],"sourcesContent":["import { CircleCheck, CircleX } from 'lucide-react';\n\ninterface StatusInfo {\n description: string;\n color: string;\n icon: React.ElementType;\n}\n\nconst statusMap: Record<number, StatusInfo> = {\n 400: { description: 'Bad Request', color: 'text-red-500', icon: CircleX },\n 401: {\n description: 'Unauthorized',\n color: 'text-red-500',\n icon: CircleX,\n },\n 403: { description: 'Forbidden', color: 'text-red-500', icon: CircleX },\n 404: {\n description: 'Not Found',\n color: 'text-fd-muted-foreground',\n icon: CircleX,\n },\n 500: {\n description: 'Internal Server Error',\n color: 'text-red-500',\n icon: CircleX,\n },\n};\n\nexport function getStatusInfo(status: number): StatusInfo {\n if (status in statusMap) {\n return statusMap[status];\n }\n\n if (status >= 200 && status < 300) {\n return {\n description: 'Successful',\n color: 'text-green-500',\n icon: CircleCheck,\n };\n }\n\n if (status >= 400) {\n return { description: 'Error', color: 'text-red-500', icon: CircleX };\n }\n\n return {\n description: 'No Description',\n color: 'text-fd-muted-foreground',\n icon: CircleX,\n };\n}\n"],"mappings":";;;AAQA,MAAM,YAAwC;CAC5C,KAAK;EAAE,aAAa;EAAe,OAAO;EAAgB,MAAM;EAAS;CACzE,KAAK;EACH,aAAa;EACb,OAAO;EACP,MAAM;EACP;CACD,KAAK;EAAE,aAAa;EAAa,OAAO;EAAgB,MAAM;EAAS;CACvE,KAAK;EACH,aAAa;EACb,OAAO;EACP,MAAM;EACP;CACD,KAAK;EACH,aAAa;EACb,OAAO;EACP,MAAM;EACP;CACF;AAED,SAAgB,cAAc,QAA4B;AACxD,KAAI,UAAU,UACZ,QAAO,UAAU;AAGnB,KAAI,UAAU,OAAO,SAAS,IAC5B,QAAO;EACL,aAAa;EACb,OAAO;EACP,MAAM;EACP;AAGH,KAAI,UAAU,IACZ,QAAO;EAAE,aAAa;EAAS,OAAO;EAAgB,MAAM;EAAS;AAGvE,QAAO;EACL,aAAa;EACb,OAAO;EACP,MAAM;EACP"}
@@ -1 +1 @@
1
- {"version":3,"file":"csharp.js","names":["generator: SampleGenerator","s: string[]","body: string | undefined","headerLines: string[]"],"sources":["../../../src/requests/generators/csharp.ts"],"sourcesContent":["'use client';\nimport type { SampleGenerator } from '@/requests/types';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const s: string[] = [];\n const imports = new Set<string>(['System', 'System.Net.Http', 'System.Text']);\n const headers = { ...data.header };\n\n // Handle request body\n let body: string | undefined;\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'csharp',\n addImport(from) {\n imports.add(from);\n },\n });\n }\n\n for (const specifier of imports) {\n s.push(`using ${specifier};`);\n }\n\n s.push('');\n\n if (body) {\n s.push(body, '');\n }\n\n s.push('var client = new HttpClient();');\n const headerLines: string[] = [];\n\n function addHeader(key: string, value: string) {\n headerLines.push(`client.DefaultRequestHeaders.Add(\"${key}\", ${JSON.stringify(value)});`);\n }\n for (const k in headers) {\n addHeader(k, headers[k].value);\n }\n\n // Add cookie header if cookies are present\n if (Object.keys(data.cookie).length > 0) {\n const cookie = Object.entries(data.cookie)\n .map(([key, param]) => `${key}=${param.value}`)\n .join('; ');\n\n addHeader('cookie', cookie);\n }\n\n s.push(...headerLines);\n\n // Build the request\n const method = data.method[0].toUpperCase() + data.method.slice(1).toLowerCase() + 'Async';\n\n if (body) {\n s.push(`var response = await client.${method}(\"${url}\", body);`);\n } else {\n s.push(`var response = await client.${method}(\"${url}\");`);\n }\n\n // Add response handling\n s.push('var responseBody = await response.Content.ReadAsStringAsync();');\n\n return s.join('\\n');\n};\n"],"mappings":";;;;;;AAIA,MAAaA,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAMC,IAAc,EAAE;CACtB,MAAM,UAAU,IAAI,IAAY;EAAC;EAAU;EAAmB;EAAc,CAAC;CAC7E,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;CAGlC,IAAIC;AACJ,KAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;EACzD,MAAM;EACN,UAAU,MAAM;AACd,WAAQ,IAAI,KAAK;;EAEpB,CAAC;AAGJ,MAAK,MAAM,aAAa,QACtB,GAAE,KAAK,SAAS,UAAU,GAAG;AAG/B,GAAE,KAAK,GAAG;AAEV,KAAI,KACF,GAAE,KAAK,MAAM,GAAG;AAGlB,GAAE,KAAK,iCAAiC;CACxC,MAAMC,cAAwB,EAAE;CAEhC,SAAS,UAAU,KAAa,OAAe;AAC7C,cAAY,KAAK,qCAAqC,IAAI,KAAK,KAAK,UAAU,MAAM,CAAC,IAAI;;AAE3F,MAAK,MAAM,KAAK,QACd,WAAU,GAAG,QAAQ,GAAG,MAAM;AAIhC,KAAI,OAAO,KAAK,KAAK,OAAO,CAAC,SAAS,EAKpC,WAAU,UAJK,OAAO,QAAQ,KAAK,OAAO,CACvC,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAC9C,KAAK,KAAK,CAEc;AAG7B,GAAE,KAAK,GAAG,YAAY;CAGtB,MAAM,SAAS,KAAK,OAAO,GAAG,aAAa,GAAG,KAAK,OAAO,MAAM,EAAE,CAAC,aAAa,GAAG;AAEnF,KAAI,KACF,GAAE,KAAK,+BAA+B,OAAO,IAAI,IAAI,WAAW;KAEhE,GAAE,KAAK,+BAA+B,OAAO,IAAI,IAAI,KAAK;AAI5D,GAAE,KAAK,iEAAiE;AAExE,QAAO,EAAE,KAAK,KAAK"}
1
+ {"version":3,"file":"csharp.js","names":[],"sources":["../../../src/requests/generators/csharp.ts"],"sourcesContent":["'use client';\nimport type { SampleGenerator } from '@/requests/types';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const s: string[] = [];\n const imports = new Set<string>(['System', 'System.Net.Http', 'System.Text']);\n const headers = { ...data.header };\n\n // Handle request body\n let body: string | undefined;\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'csharp',\n addImport(from) {\n imports.add(from);\n },\n });\n }\n\n for (const specifier of imports) {\n s.push(`using ${specifier};`);\n }\n\n s.push('');\n\n if (body) {\n s.push(body, '');\n }\n\n s.push('var client = new HttpClient();');\n const headerLines: string[] = [];\n\n function addHeader(key: string, value: string) {\n headerLines.push(`client.DefaultRequestHeaders.Add(\"${key}\", ${JSON.stringify(value)});`);\n }\n for (const k in headers) {\n addHeader(k, headers[k].value);\n }\n\n // Add cookie header if cookies are present\n if (Object.keys(data.cookie).length > 0) {\n const cookie = Object.entries(data.cookie)\n .map(([key, param]) => `${key}=${param.value}`)\n .join('; ');\n\n addHeader('cookie', cookie);\n }\n\n s.push(...headerLines);\n\n // Build the request\n const method = data.method[0].toUpperCase() + data.method.slice(1).toLowerCase() + 'Async';\n\n if (body) {\n s.push(`var response = await client.${method}(\"${url}\", body);`);\n } else {\n s.push(`var response = await client.${method}(\"${url}\");`);\n }\n\n // Add response handling\n s.push('var responseBody = await response.Content.ReadAsStringAsync();');\n\n return s.join('\\n');\n};\n"],"mappings":";;;;;;AAIA,MAAa,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAM,IAAc,EAAE;CACtB,MAAM,UAAU,IAAI,IAAY;EAAC;EAAU;EAAmB;EAAc,CAAC;CAC7E,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;CAGlC,IAAI;AACJ,KAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;EACzD,MAAM;EACN,UAAU,MAAM;AACd,WAAQ,IAAI,KAAK;;EAEpB,CAAC;AAGJ,MAAK,MAAM,aAAa,QACtB,GAAE,KAAK,SAAS,UAAU,GAAG;AAG/B,GAAE,KAAK,GAAG;AAEV,KAAI,KACF,GAAE,KAAK,MAAM,GAAG;AAGlB,GAAE,KAAK,iCAAiC;CACxC,MAAM,cAAwB,EAAE;CAEhC,SAAS,UAAU,KAAa,OAAe;AAC7C,cAAY,KAAK,qCAAqC,IAAI,KAAK,KAAK,UAAU,MAAM,CAAC,IAAI;;AAE3F,MAAK,MAAM,KAAK,QACd,WAAU,GAAG,QAAQ,GAAG,MAAM;AAIhC,KAAI,OAAO,KAAK,KAAK,OAAO,CAAC,SAAS,EAKpC,WAAU,UAJK,OAAO,QAAQ,KAAK,OAAO,CACvC,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAC9C,KAAK,KAAK,CAEc;AAG7B,GAAE,KAAK,GAAG,YAAY;CAGtB,MAAM,SAAS,KAAK,OAAO,GAAG,aAAa,GAAG,KAAK,OAAO,MAAM,EAAE,CAAC,aAAa,GAAG;AAEnF,KAAI,KACF,GAAE,KAAK,+BAA+B,OAAO,IAAI,IAAI,WAAW;KAEhE,GAAE,KAAK,+BAA+B,OAAO,IAAI,IAAI,KAAK;AAI5D,GAAE,KAAK,iEAAiE;AAExE,QAAO,EAAE,KAAK,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"curl.js","names":["generator: SampleGenerator","s: string[]"],"sources":["../../../src/requests/generators/curl.ts"],"sourcesContent":["'use client';\nimport { escapeString, ident, inputToString } from '@/requests/string-utils';\nimport type { SampleGenerator } from '@/requests/types';\n\nexport const generator: SampleGenerator = (url, data) => {\n const s: string[] = [];\n s.push(`curl -X ${data.method} \"${url}\"`);\n\n for (const header in data.header) {\n const value = `${header}: ${data.header[header].value}`;\n\n s.push(`-H \"${value}\"`);\n }\n\n for (const k in data.cookie) {\n const param = data.cookie[k];\n\n s.push(`--cookie ${JSON.stringify(`${k}=${param.value}`)}`);\n }\n\n if (data.body && data.bodyMediaType === 'multipart/form-data') {\n if (typeof data.body !== 'object') throw new Error('[CURL] request body must be an object.');\n\n for (const [key, value] of Object.entries(data.body)) {\n s.push(`-F ${key}=${JSON.stringify(inputToString(value))}`);\n }\n } else if (data.body && data.bodyMediaType) {\n const escaped = escapeString(\n inputToString(\n data.body,\n // @ts-expect-error -- assume the body media type is supported\n data.bodyMediaType,\n ),\n \"'\",\n );\n\n s.push(`-H \"Content-Type: ${data.bodyMediaType}\"`);\n s.push(`-d ${escaped}`);\n }\n\n return s.flatMap((v, i) => ident(v, i > 0 ? 1 : 0)).join(' \\\\\\n');\n};\n"],"mappings":";;;;;AAIA,MAAaA,aAA8B,KAAK,SAAS;CACvD,MAAMC,IAAc,EAAE;AACtB,GAAE,KAAK,WAAW,KAAK,OAAO,IAAI,IAAI,GAAG;AAEzC,MAAK,MAAM,UAAU,KAAK,QAAQ;EAChC,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,OAAO,QAAQ;AAEhD,IAAE,KAAK,OAAO,MAAM,GAAG;;AAGzB,MAAK,MAAM,KAAK,KAAK,QAAQ;EAC3B,MAAM,QAAQ,KAAK,OAAO;AAE1B,IAAE,KAAK,YAAY,KAAK,UAAU,GAAG,EAAE,GAAG,MAAM,QAAQ,GAAG;;AAG7D,KAAI,KAAK,QAAQ,KAAK,kBAAkB,uBAAuB;AAC7D,MAAI,OAAO,KAAK,SAAS,SAAU,OAAM,IAAI,MAAM,yCAAyC;AAE5F,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,KAAK,CAClD,GAAE,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU,cAAc,MAAM,CAAC,GAAG;YAEpD,KAAK,QAAQ,KAAK,eAAe;EAC1C,MAAM,UAAU,aACd,cACE,KAAK,MAEL,KAAK,cACN,EACD,IACD;AAED,IAAE,KAAK,qBAAqB,KAAK,cAAc,GAAG;AAClD,IAAE,KAAK,MAAM,UAAU;;AAGzB,QAAO,EAAE,SAAS,GAAG,MAAM,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,QAAQ"}
1
+ {"version":3,"file":"curl.js","names":[],"sources":["../../../src/requests/generators/curl.ts"],"sourcesContent":["'use client';\nimport { escapeString, ident, inputToString } from '@/requests/string-utils';\nimport type { SampleGenerator } from '@/requests/types';\n\nexport const generator: SampleGenerator = (url, data) => {\n const s: string[] = [];\n s.push(`curl -X ${data.method} \"${url}\"`);\n\n for (const header in data.header) {\n const value = `${header}: ${data.header[header].value}`;\n\n s.push(`-H \"${value}\"`);\n }\n\n for (const k in data.cookie) {\n const param = data.cookie[k];\n\n s.push(`--cookie ${JSON.stringify(`${k}=${param.value}`)}`);\n }\n\n if (data.body && data.bodyMediaType === 'multipart/form-data') {\n if (typeof data.body !== 'object') throw new Error('[CURL] request body must be an object.');\n\n for (const [key, value] of Object.entries(data.body)) {\n s.push(`-F ${key}=${JSON.stringify(inputToString(value))}`);\n }\n } else if (data.body && data.bodyMediaType) {\n const escaped = escapeString(\n inputToString(\n data.body,\n // @ts-expect-error -- assume the body media type is supported\n data.bodyMediaType,\n ),\n \"'\",\n );\n\n s.push(`-H \"Content-Type: ${data.bodyMediaType}\"`);\n s.push(`-d ${escaped}`);\n }\n\n return s.flatMap((v, i) => ident(v, i > 0 ? 1 : 0)).join(' \\\\\\n');\n};\n"],"mappings":";;;;;AAIA,MAAa,aAA8B,KAAK,SAAS;CACvD,MAAM,IAAc,EAAE;AACtB,GAAE,KAAK,WAAW,KAAK,OAAO,IAAI,IAAI,GAAG;AAEzC,MAAK,MAAM,UAAU,KAAK,QAAQ;EAChC,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,OAAO,QAAQ;AAEhD,IAAE,KAAK,OAAO,MAAM,GAAG;;AAGzB,MAAK,MAAM,KAAK,KAAK,QAAQ;EAC3B,MAAM,QAAQ,KAAK,OAAO;AAE1B,IAAE,KAAK,YAAY,KAAK,UAAU,GAAG,EAAE,GAAG,MAAM,QAAQ,GAAG;;AAG7D,KAAI,KAAK,QAAQ,KAAK,kBAAkB,uBAAuB;AAC7D,MAAI,OAAO,KAAK,SAAS,SAAU,OAAM,IAAI,MAAM,yCAAyC;AAE5F,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,KAAK,CAClD,GAAE,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU,cAAc,MAAM,CAAC,GAAG;YAEpD,KAAK,QAAQ,KAAK,eAAe;EAC1C,MAAM,UAAU,aACd,cACE,KAAK,MAEL,KAAK,cACN,EACD,IACD;AAED,IAAE,KAAK,qBAAqB,KAAK,cAAc,GAAG;AAClD,IAAE,KAAK,MAAM,UAAU;;AAGzB,QAAO,EAAE,SAAS,GAAG,MAAM,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"go.js","names":["generator: SampleGenerator","body: string | undefined"],"sources":["../../../src/requests/generators/go.ts"],"sourcesContent":["'use client';\nimport { ident } from '@/requests/string-utils';\nimport type { SampleGenerator } from '@/requests/types';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const imports = ['fmt', 'net/http', 'io/ioutil'];\n const headers = new Map<string, string>();\n const variables = new Map<string, string>();\n variables.set('url', JSON.stringify(url));\n\n for (const header in data.header) {\n headers.set(header, JSON.stringify(data.header[header].value));\n }\n\n const cookies = Object.entries(data.cookie);\n if (cookies.length > 0) {\n headers.set(\n 'Cookie',\n JSON.stringify(cookies.map(([k, param]) => `${k}=${param.value}`).join('; ')),\n );\n }\n\n let body: string | undefined;\n\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n headers.set('Content-Type', `\"${data.bodyMediaType}\"`);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'go',\n addImport(from) {\n imports.push(from);\n },\n });\n }\n\n return `package main\n\nimport (\n${ident(imports.map((v) => `\"${v}\"`).join('\\n'))}\n)\n\nfunc main() {\n${Array.from(variables.entries())\n .map(([k, v]) => ident(`${k} := ${v}`))\n .join('\\n')}\n${body ? ident(body) : ''}\n req, _ := http.NewRequest(\"${data.method}\", url, ${body ? 'body' : 'nil'})\n${ident(\n Array.from(headers.entries())\n .map(([key, value]) => `req.Header.Add(\"${key}\", ${value})`)\n .join('\\n'),\n)}\n res, _ := http.DefaultClient.Do(req)\n defer res.Body.Close()\n body, _ := ioutil.ReadAll(res.Body)\n\n fmt.Println(res)\n fmt.Println(string(body))\n}`;\n};\n"],"mappings":";;;;;;;AAKA,MAAaA,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAM,UAAU;EAAC;EAAO;EAAY;EAAY;CAChD,MAAM,0BAAU,IAAI,KAAqB;CACzC,MAAM,4BAAY,IAAI,KAAqB;AAC3C,WAAU,IAAI,OAAO,KAAK,UAAU,IAAI,CAAC;AAEzC,MAAK,MAAM,UAAU,KAAK,OACxB,SAAQ,IAAI,QAAQ,KAAK,UAAU,KAAK,OAAO,QAAQ,MAAM,CAAC;CAGhE,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO;AAC3C,KAAI,QAAQ,SAAS,EACnB,SAAQ,IACN,UACA,KAAK,UAAU,QAAQ,KAAK,CAAC,GAAG,WAAW,GAAG,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK,CAAC,CAC9E;CAGH,IAAIC;AAEJ,KAAI,KAAK,QAAQ,KAAK,eAAe;EACnC,MAAM,UAAU,oBAAoB,KAAK,eAAe,cAAc;AACtE,UAAQ,IAAI,gBAAgB,IAAI,KAAK,cAAc,GAAG;AACtD,SAAO,SAAS,gBAAgB,MAA2B;GACzD,MAAM;GACN,UAAU,MAAM;AACd,YAAQ,KAAK,KAAK;;GAErB,CAAC;;AAGJ,QAAO;;;EAGP,MAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;;;;EAI/C,MAAM,KAAK,UAAU,SAAS,CAAC,CAC9B,KAAK,CAAC,GAAG,OAAO,MAAM,GAAG,EAAE,MAAM,IAAI,CAAC,CACtC,KAAK,KAAK,CAAC;EACZ,OAAO,MAAM,KAAK,GAAG,GAAG;+BACK,KAAK,OAAO,UAAU,OAAO,SAAS,MAAM;EACzE,MACA,MAAM,KAAK,QAAQ,SAAS,CAAC,CAC1B,KAAK,CAAC,KAAK,WAAW,mBAAmB,IAAI,KAAK,MAAM,GAAG,CAC3D,KAAK,KAAK,CACd,CAAC"}
1
+ {"version":3,"file":"go.js","names":[],"sources":["../../../src/requests/generators/go.ts"],"sourcesContent":["'use client';\nimport { ident } from '@/requests/string-utils';\nimport type { SampleGenerator } from '@/requests/types';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const imports = ['fmt', 'net/http', 'io/ioutil'];\n const headers = new Map<string, string>();\n const variables = new Map<string, string>();\n variables.set('url', JSON.stringify(url));\n\n for (const header in data.header) {\n headers.set(header, JSON.stringify(data.header[header].value));\n }\n\n const cookies = Object.entries(data.cookie);\n if (cookies.length > 0) {\n headers.set(\n 'Cookie',\n JSON.stringify(cookies.map(([k, param]) => `${k}=${param.value}`).join('; ')),\n );\n }\n\n let body: string | undefined;\n\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n headers.set('Content-Type', `\"${data.bodyMediaType}\"`);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'go',\n addImport(from) {\n imports.push(from);\n },\n });\n }\n\n return `package main\n\nimport (\n${ident(imports.map((v) => `\"${v}\"`).join('\\n'))}\n)\n\nfunc main() {\n${Array.from(variables.entries())\n .map(([k, v]) => ident(`${k} := ${v}`))\n .join('\\n')}\n${body ? ident(body) : ''}\n req, _ := http.NewRequest(\"${data.method}\", url, ${body ? 'body' : 'nil'})\n${ident(\n Array.from(headers.entries())\n .map(([key, value]) => `req.Header.Add(\"${key}\", ${value})`)\n .join('\\n'),\n)}\n res, _ := http.DefaultClient.Do(req)\n defer res.Body.Close()\n body, _ := ioutil.ReadAll(res.Body)\n\n fmt.Println(res)\n fmt.Println(string(body))\n}`;\n};\n"],"mappings":";;;;;;;AAKA,MAAa,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAM,UAAU;EAAC;EAAO;EAAY;EAAY;CAChD,MAAM,0BAAU,IAAI,KAAqB;CACzC,MAAM,4BAAY,IAAI,KAAqB;AAC3C,WAAU,IAAI,OAAO,KAAK,UAAU,IAAI,CAAC;AAEzC,MAAK,MAAM,UAAU,KAAK,OACxB,SAAQ,IAAI,QAAQ,KAAK,UAAU,KAAK,OAAO,QAAQ,MAAM,CAAC;CAGhE,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO;AAC3C,KAAI,QAAQ,SAAS,EACnB,SAAQ,IACN,UACA,KAAK,UAAU,QAAQ,KAAK,CAAC,GAAG,WAAW,GAAG,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK,CAAC,CAC9E;CAGH,IAAI;AAEJ,KAAI,KAAK,QAAQ,KAAK,eAAe;EACnC,MAAM,UAAU,oBAAoB,KAAK,eAAe,cAAc;AACtE,UAAQ,IAAI,gBAAgB,IAAI,KAAK,cAAc,GAAG;AACtD,SAAO,SAAS,gBAAgB,MAA2B;GACzD,MAAM;GACN,UAAU,MAAM;AACd,YAAQ,KAAK,KAAK;;GAErB,CAAC;;AAGJ,QAAO;;;EAGP,MAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;;;;EAI/C,MAAM,KAAK,UAAU,SAAS,CAAC,CAC9B,KAAK,CAAC,GAAG,OAAO,MAAM,GAAG,EAAE,MAAM,IAAI,CAAC,CACtC,KAAK,KAAK,CAAC;EACZ,OAAO,MAAM,KAAK,GAAG,GAAG;+BACK,KAAK,OAAO,UAAU,OAAO,SAAS,MAAM;EACzE,MACA,MAAM,KAAK,QAAQ,SAAS,CAAC,CAC1B,KAAK,CAAC,KAAK,WAAW,mBAAmB,IAAI,KAAK,MAAM,GAAG,CAC3D,KAAK,KAAK,CACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["defaultSamples: CodeUsageGenerator[]","CURL.generator","JS.generator","Go.generator","Python.generator","Java.generator","CSharp.generator"],"sources":["../../../src/requests/generators/index.ts"],"sourcesContent":["import * as CURL from './curl';\nimport * as JS from './javascript';\nimport * as Go from './go';\nimport * as Python from './python';\nimport * as Java from './java';\nimport * as CSharp from './csharp';\nimport type { CodeUsageGenerator } from '@/ui/operation/usage-tabs';\n\nexport const defaultSamples: CodeUsageGenerator[] = [\n {\n id: 'curl',\n label: 'cURL',\n source: CURL.generator,\n lang: 'bash',\n },\n {\n id: 'js',\n label: 'JavaScript',\n source: JS.generator,\n lang: 'js',\n },\n {\n id: 'go',\n label: 'Go',\n source: Go.generator,\n lang: 'go',\n },\n {\n id: 'python',\n label: 'Python',\n source: Python.generator,\n lang: 'python',\n },\n {\n id: 'java',\n label: 'Java',\n source: Java.generator,\n lang: 'java',\n },\n {\n id: 'csharp',\n label: 'C#',\n source: CSharp.generator,\n lang: 'csharp',\n },\n];\n"],"mappings":";;;;;;;;AAQA,MAAaA,iBAAuC;CAClD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACF"}
1
+ {"version":3,"file":"index.js","names":["CURL.generator","JS.generator","Go.generator","Python.generator","Java.generator","CSharp.generator"],"sources":["../../../src/requests/generators/index.ts"],"sourcesContent":["import * as CURL from './curl';\nimport * as JS from './javascript';\nimport * as Go from './go';\nimport * as Python from './python';\nimport * as Java from './java';\nimport * as CSharp from './csharp';\nimport type { CodeUsageGenerator } from '@/ui/operation/usage-tabs';\n\nexport const defaultSamples: CodeUsageGenerator[] = [\n {\n id: 'curl',\n label: 'cURL',\n source: CURL.generator,\n lang: 'bash',\n },\n {\n id: 'js',\n label: 'JavaScript',\n source: JS.generator,\n lang: 'js',\n },\n {\n id: 'go',\n label: 'Go',\n source: Go.generator,\n lang: 'go',\n },\n {\n id: 'python',\n label: 'Python',\n source: Python.generator,\n lang: 'python',\n },\n {\n id: 'java',\n label: 'Java',\n source: Java.generator,\n lang: 'java',\n },\n {\n id: 'csharp',\n label: 'C#',\n source: CSharp.generator,\n lang: 'csharp',\n },\n];\n"],"mappings":";;;;;;;;AAQA,MAAa,iBAAuC;CAClD;EACE,IAAI;EACJ,OAAO;EACP,QAAQA;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACD;EACE,IAAI;EACJ,OAAO;EACP,QAAQC;EACR,MAAM;EACP;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"java.js","names":["generator: SampleGenerator","s: string[]","body: string | undefined"],"sources":["../../../src/requests/generators/java.ts"],"sourcesContent":["'use client';\nimport { ident } from '@/requests/string-utils';\nimport type { SampleGenerator } from '@/requests/types';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const s: string[] = [];\n const headers = { ...data.header };\n const imports = new Set<string>([\n 'java.net.URI',\n 'java.net.http.HttpClient',\n 'java.net.http.HttpRequest',\n 'java.net.http.HttpResponse',\n 'java.net.http.HttpResponse.BodyHandlers',\n 'java.time.Duration',\n ]);\n\n // Handle body if present\n let body: string | undefined;\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'java',\n addImport(specifier) {\n imports.add(specifier);\n },\n });\n }\n\n for (const value of imports.values()) {\n s.push(`import ${value};`);\n }\n s.push('');\n\n if (body) {\n s.push(body);\n }\n\n // Create HttpClient\n s.push('HttpClient client = HttpClient.newBuilder()');\n s.push(ident('.connectTimeout(Duration.ofSeconds(10))'));\n s.push(ident('.build();'));\n s.push('');\n\n // Build request\n s.push('HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()');\n s.push(ident(`.uri(URI.create(${JSON.stringify(url)}))`));\n\n // Add headers\n for (const [key, param] of Object.entries(headers)) {\n s.push(ident(`.header(${JSON.stringify(key)}, ${JSON.stringify(param.value)})`));\n }\n\n if (data.bodyMediaType) {\n s.push(ident(`.header(\"Content-Type\", \"${data.bodyMediaType}\")`));\n }\n\n // Add cookies if present\n const cookies = Object.entries(data.cookie);\n\n if (cookies.length > 0) {\n const cookieString = cookies.map(([key, param]) => `${key}=${param.value}`).join('; ');\n\n s.push(ident(`.header(\"Cookie\", ${JSON.stringify(cookieString)})`));\n }\n\n const arg = body ? 'body' : '';\n s.push(ident(`.${data.method.toUpperCase()}(${arg})`));\n s.push(ident('.build();'));\n s.push('');\n\n // Add response handling\n s.push('try {');\n s.push(\n ident(\n 'HttpResponse<String> response = client.send(requestBuilder.build(), BodyHandlers.ofString());',\n ),\n );\n s.push(ident('System.out.println(\"Status code: \" + response.statusCode());'));\n s.push(ident('System.out.println(\"Response body: \" + response.body());'));\n s.push('} catch (Exception e) {');\n s.push(ident('e.printStackTrace();'));\n s.push('}');\n\n return s.join('\\n');\n};\n"],"mappings":";;;;;;;AAKA,MAAaA,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAMC,IAAc,EAAE;CACtB,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;CAClC,MAAM,UAAU,IAAI,IAAY;EAC9B;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAGF,IAAIC;AACJ,KAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;EACzD,MAAM;EACN,UAAU,WAAW;AACnB,WAAQ,IAAI,UAAU;;EAEzB,CAAC;AAGJ,MAAK,MAAM,SAAS,QAAQ,QAAQ,CAClC,GAAE,KAAK,UAAU,MAAM,GAAG;AAE5B,GAAE,KAAK,GAAG;AAEV,KAAI,KACF,GAAE,KAAK,KAAK;AAId,GAAE,KAAK,8CAA8C;AACrD,GAAE,KAAK,MAAM,0CAA0C,CAAC;AACxD,GAAE,KAAK,MAAM,YAAY,CAAC;AAC1B,GAAE,KAAK,GAAG;AAGV,GAAE,KAAK,gEAAgE;AACvE,GAAE,KAAK,MAAM,mBAAmB,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC;AAGzD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAChD,GAAE,KAAK,MAAM,WAAW,KAAK,UAAU,IAAI,CAAC,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,CAAC;AAGlF,KAAI,KAAK,cACP,GAAE,KAAK,MAAM,4BAA4B,KAAK,cAAc,IAAI,CAAC;CAInE,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO;AAE3C,KAAI,QAAQ,SAAS,GAAG;EACtB,MAAM,eAAe,QAAQ,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK;AAEtF,IAAE,KAAK,MAAM,qBAAqB,KAAK,UAAU,aAAa,CAAC,GAAG,CAAC;;CAGrE,MAAM,MAAM,OAAO,SAAS;AAC5B,GAAE,KAAK,MAAM,IAAI,KAAK,OAAO,aAAa,CAAC,GAAG,IAAI,GAAG,CAAC;AACtD,GAAE,KAAK,MAAM,YAAY,CAAC;AAC1B,GAAE,KAAK,GAAG;AAGV,GAAE,KAAK,QAAQ;AACf,GAAE,KACA,MACE,gGACD,CACF;AACD,GAAE,KAAK,MAAM,iEAA+D,CAAC;AAC7E,GAAE,KAAK,MAAM,6DAA2D,CAAC;AACzE,GAAE,KAAK,0BAA0B;AACjC,GAAE,KAAK,MAAM,uBAAuB,CAAC;AACrC,GAAE,KAAK,IAAI;AAEX,QAAO,EAAE,KAAK,KAAK"}
1
+ {"version":3,"file":"java.js","names":[],"sources":["../../../src/requests/generators/java.ts"],"sourcesContent":["'use client';\nimport { ident } from '@/requests/string-utils';\nimport type { SampleGenerator } from '@/requests/types';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const s: string[] = [];\n const headers = { ...data.header };\n const imports = new Set<string>([\n 'java.net.URI',\n 'java.net.http.HttpClient',\n 'java.net.http.HttpRequest',\n 'java.net.http.HttpResponse',\n 'java.net.http.HttpResponse.BodyHandlers',\n 'java.time.Duration',\n ]);\n\n // Handle body if present\n let body: string | undefined;\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'java',\n addImport(specifier) {\n imports.add(specifier);\n },\n });\n }\n\n for (const value of imports.values()) {\n s.push(`import ${value};`);\n }\n s.push('');\n\n if (body) {\n s.push(body);\n }\n\n // Create HttpClient\n s.push('HttpClient client = HttpClient.newBuilder()');\n s.push(ident('.connectTimeout(Duration.ofSeconds(10))'));\n s.push(ident('.build();'));\n s.push('');\n\n // Build request\n s.push('HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()');\n s.push(ident(`.uri(URI.create(${JSON.stringify(url)}))`));\n\n // Add headers\n for (const [key, param] of Object.entries(headers)) {\n s.push(ident(`.header(${JSON.stringify(key)}, ${JSON.stringify(param.value)})`));\n }\n\n if (data.bodyMediaType) {\n s.push(ident(`.header(\"Content-Type\", \"${data.bodyMediaType}\")`));\n }\n\n // Add cookies if present\n const cookies = Object.entries(data.cookie);\n\n if (cookies.length > 0) {\n const cookieString = cookies.map(([key, param]) => `${key}=${param.value}`).join('; ');\n\n s.push(ident(`.header(\"Cookie\", ${JSON.stringify(cookieString)})`));\n }\n\n const arg = body ? 'body' : '';\n s.push(ident(`.${data.method.toUpperCase()}(${arg})`));\n s.push(ident('.build();'));\n s.push('');\n\n // Add response handling\n s.push('try {');\n s.push(\n ident(\n 'HttpResponse<String> response = client.send(requestBuilder.build(), BodyHandlers.ofString());',\n ),\n );\n s.push(ident('System.out.println(\"Status code: \" + response.statusCode());'));\n s.push(ident('System.out.println(\"Response body: \" + response.body());'));\n s.push('} catch (Exception e) {');\n s.push(ident('e.printStackTrace();'));\n s.push('}');\n\n return s.join('\\n');\n};\n"],"mappings":";;;;;;;AAKA,MAAa,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAM,IAAc,EAAE;CACtB,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;CAClC,MAAM,UAAU,IAAI,IAAY;EAC9B;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAGF,IAAI;AACJ,KAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;EACzD,MAAM;EACN,UAAU,WAAW;AACnB,WAAQ,IAAI,UAAU;;EAEzB,CAAC;AAGJ,MAAK,MAAM,SAAS,QAAQ,QAAQ,CAClC,GAAE,KAAK,UAAU,MAAM,GAAG;AAE5B,GAAE,KAAK,GAAG;AAEV,KAAI,KACF,GAAE,KAAK,KAAK;AAId,GAAE,KAAK,8CAA8C;AACrD,GAAE,KAAK,MAAM,0CAA0C,CAAC;AACxD,GAAE,KAAK,MAAM,YAAY,CAAC;AAC1B,GAAE,KAAK,GAAG;AAGV,GAAE,KAAK,gEAAgE;AACvE,GAAE,KAAK,MAAM,mBAAmB,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC;AAGzD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAChD,GAAE,KAAK,MAAM,WAAW,KAAK,UAAU,IAAI,CAAC,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,CAAC;AAGlF,KAAI,KAAK,cACP,GAAE,KAAK,MAAM,4BAA4B,KAAK,cAAc,IAAI,CAAC;CAInE,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO;AAE3C,KAAI,QAAQ,SAAS,GAAG;EACtB,MAAM,eAAe,QAAQ,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK;AAEtF,IAAE,KAAK,MAAM,qBAAqB,KAAK,UAAU,aAAa,CAAC,GAAG,CAAC;;CAGrE,MAAM,MAAM,OAAO,SAAS;AAC5B,GAAE,KAAK,MAAM,IAAI,KAAK,OAAO,aAAa,CAAC,GAAG,IAAI,GAAG,CAAC;AACtD,GAAE,KAAK,MAAM,YAAY,CAAC;AAC1B,GAAE,KAAK,GAAG;AAGV,GAAE,KAAK,QAAQ;AACf,GAAE,KACA,MACE,gGACD,CACF;AACD,GAAE,KAAK,MAAM,iEAA+D,CAAC;AAC7E,GAAE,KAAK,MAAM,6DAA2D,CAAC;AACzE,GAAE,KAAK,0BAA0B;AACjC,GAAE,KAAK,MAAM,uBAAuB,CAAC;AACrC,GAAE,KAAK,IAAI;AAEX,QAAO,EAAE,KAAK,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"javascript.js","names":["generator: SampleGenerator","s: string[]","headers: Record<string, string>","body: string | undefined"],"sources":["../../../src/requests/generators/javascript.ts"],"sourcesContent":["'use client';\nimport { ident } from '@/requests/string-utils';\nimport type { SampleGenerator } from '@/requests/types';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const s: string[] = [];\n const options = new Map<string, string>();\n const headers: Record<string, string> = {};\n\n options.set('method', JSON.stringify(data.method));\n if (data.bodyMediaType) {\n headers['Content-Type'] = data.bodyMediaType;\n }\n\n for (const [k, v] of Object.entries(data.header)) {\n headers[k] = v.value;\n }\n\n const cookies = Object.entries(data.cookie);\n if (cookies.length > 0) {\n headers['cookie'] = cookies.map(([key, param]) => `${key}=${param.value}`).join('; ');\n }\n\n if (Object.keys(headers).length > 0) {\n options.set('headers', JSON.stringify(headers, null, 2));\n }\n\n let body: string | undefined;\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'js',\n addImport(from, name) {\n s.unshift(`import { ${name} } from \"${from}\"`);\n },\n });\n }\n\n if (body) {\n s.push(body);\n options.set('body', 'body');\n }\n\n const params = [JSON.stringify(url)];\n if (options.size > 0) {\n const str = Array.from(options.entries())\n .map(([k, v]) => ident(k === v ? k : `${k}: ${v}`))\n .join(',\\n');\n\n params.push(`{\\n${str}\\n}`);\n }\n\n s.push(`fetch(${params.join(', ')})`);\n\n return s.join('\\n\\n');\n};\n"],"mappings":";;;;;;;AAKA,MAAaA,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAMC,IAAc,EAAE;CACtB,MAAM,0BAAU,IAAI,KAAqB;CACzC,MAAMC,UAAkC,EAAE;AAE1C,SAAQ,IAAI,UAAU,KAAK,UAAU,KAAK,OAAO,CAAC;AAClD,KAAI,KAAK,cACP,SAAQ,kBAAkB,KAAK;AAGjC,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,OAAO,CAC9C,SAAQ,KAAK,EAAE;CAGjB,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO;AAC3C,KAAI,QAAQ,SAAS,EACnB,SAAQ,YAAY,QAAQ,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK;AAGvF,KAAI,OAAO,KAAK,QAAQ,CAAC,SAAS,EAChC,SAAQ,IAAI,WAAW,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;CAG1D,IAAIC;AACJ,KAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;EACzD,MAAM;EACN,UAAU,MAAM,MAAM;AACpB,KAAE,QAAQ,YAAY,KAAK,WAAW,KAAK,GAAG;;EAEjD,CAAC;AAGJ,KAAI,MAAM;AACR,IAAE,KAAK,KAAK;AACZ,UAAQ,IAAI,QAAQ,OAAO;;CAG7B,MAAM,SAAS,CAAC,KAAK,UAAU,IAAI,CAAC;AACpC,KAAI,QAAQ,OAAO,GAAG;EACpB,MAAM,MAAM,MAAM,KAAK,QAAQ,SAAS,CAAC,CACtC,KAAK,CAAC,GAAG,OAAO,MAAM,MAAM,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,CAClD,KAAK,MAAM;AAEd,SAAO,KAAK,MAAM,IAAI,KAAK;;AAG7B,GAAE,KAAK,SAAS,OAAO,KAAK,KAAK,CAAC,GAAG;AAErC,QAAO,EAAE,KAAK,OAAO"}
1
+ {"version":3,"file":"javascript.js","names":[],"sources":["../../../src/requests/generators/javascript.ts"],"sourcesContent":["'use client';\nimport { ident } from '@/requests/string-utils';\nimport type { SampleGenerator } from '@/requests/types';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const s: string[] = [];\n const options = new Map<string, string>();\n const headers: Record<string, string> = {};\n\n options.set('method', JSON.stringify(data.method));\n if (data.bodyMediaType) {\n headers['Content-Type'] = data.bodyMediaType;\n }\n\n for (const [k, v] of Object.entries(data.header)) {\n headers[k] = v.value;\n }\n\n const cookies = Object.entries(data.cookie);\n if (cookies.length > 0) {\n headers['cookie'] = cookies.map(([key, param]) => `${key}=${param.value}`).join('; ');\n }\n\n if (Object.keys(headers).length > 0) {\n options.set('headers', JSON.stringify(headers, null, 2));\n }\n\n let body: string | undefined;\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'js',\n addImport(from, name) {\n s.unshift(`import { ${name} } from \"${from}\"`);\n },\n });\n }\n\n if (body) {\n s.push(body);\n options.set('body', 'body');\n }\n\n const params = [JSON.stringify(url)];\n if (options.size > 0) {\n const str = Array.from(options.entries())\n .map(([k, v]) => ident(k === v ? k : `${k}: ${v}`))\n .join(',\\n');\n\n params.push(`{\\n${str}\\n}`);\n }\n\n s.push(`fetch(${params.join(', ')})`);\n\n return s.join('\\n\\n');\n};\n"],"mappings":";;;;;;;AAKA,MAAa,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAM,IAAc,EAAE;CACtB,MAAM,0BAAU,IAAI,KAAqB;CACzC,MAAM,UAAkC,EAAE;AAE1C,SAAQ,IAAI,UAAU,KAAK,UAAU,KAAK,OAAO,CAAC;AAClD,KAAI,KAAK,cACP,SAAQ,kBAAkB,KAAK;AAGjC,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,OAAO,CAC9C,SAAQ,KAAK,EAAE;CAGjB,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO;AAC3C,KAAI,QAAQ,SAAS,EACnB,SAAQ,YAAY,QAAQ,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,KAAK;AAGvF,KAAI,OAAO,KAAK,QAAQ,CAAC,SAAS,EAChC,SAAQ,IAAI,WAAW,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;CAG1D,IAAI;AACJ,KAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;EACzD,MAAM;EACN,UAAU,MAAM,MAAM;AACpB,KAAE,QAAQ,YAAY,KAAK,WAAW,KAAK,GAAG;;EAEjD,CAAC;AAGJ,KAAI,MAAM;AACR,IAAE,KAAK,KAAK;AACZ,UAAQ,IAAI,QAAQ,OAAO;;CAG7B,MAAM,SAAS,CAAC,KAAK,UAAU,IAAI,CAAC;AACpC,KAAI,QAAQ,OAAO,GAAG;EACpB,MAAM,MAAM,MAAM,KAAK,QAAQ,SAAS,CAAC,CACtC,KAAK,CAAC,GAAG,OAAO,MAAM,MAAM,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,CAClD,KAAK,MAAM;AAEd,SAAO,KAAK,MAAM,IAAI,KAAK;;AAG7B,GAAE,KAAK,SAAS,OAAO,KAAK,KAAK,CAAC,GAAG;AAErC,QAAO,EAAE,KAAK,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"python.js","names":["generator: SampleGenerator","headers: Record<string, string>","body: string | undefined","cookies: Record<string, string>"],"sources":["../../../src/requests/generators/python.ts"],"sourcesContent":["'use client';\nimport type { SampleGenerator } from '@/requests/types';\nimport { generatePythonObject } from '@/requests/to-python-object';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const headers: Record<string, string> = {};\n const imports = new Set<string>();\n const params = [`\"${data.method}\"`, 'url'];\n let body: string | undefined;\n\n imports.add('requests');\n\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n headers['Content-Type'] = data.bodyMediaType;\n\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'python',\n });\n\n if (body) {\n params.push('data = body');\n }\n }\n\n for (const [k, v] of Object.entries(data.header)) {\n headers[k] = v.value;\n }\n\n if (Object.keys(headers).length > 0) {\n params.push(`headers = ${generatePythonObject(headers, imports)}`);\n }\n\n const inputCookies = Object.entries(data.cookie);\n if (inputCookies.length > 0) {\n const cookies: Record<string, string> = {};\n\n for (const [k, v] of inputCookies) {\n cookies[k] = v.value;\n }\n\n params.push(`cookies = ${generatePythonObject(cookies, imports)}`);\n }\n\n return `${Array.from(imports)\n .map((name) => 'import ' + name)\n .join('\\n')}\n\nurl = ${JSON.stringify(url)}\n${body ?? ''}\nresponse = requests.request(${params.join(', ')})\n\nprint(response.text)`;\n};\n"],"mappings":";;;;;;;AAKA,MAAaA,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAMC,UAAkC,EAAE;CAC1C,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAM,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM;CAC1C,IAAIC;AAEJ,SAAQ,IAAI,WAAW;AAEvB,KAAI,KAAK,QAAQ,KAAK,eAAe;EACnC,MAAM,UAAU,oBAAoB,KAAK,eAAe,cAAc;AACtE,UAAQ,kBAAkB,KAAK;AAE/B,SAAO,SAAS,gBAAgB,MAA2B,EACzD,MAAM,UACP,CAAC;AAEF,MAAI,KACF,QAAO,KAAK,cAAc;;AAI9B,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,OAAO,CAC9C,SAAQ,KAAK,EAAE;AAGjB,KAAI,OAAO,KAAK,QAAQ,CAAC,SAAS,EAChC,QAAO,KAAK,aAAa,qBAAqB,SAAS,QAAQ,GAAG;CAGpE,MAAM,eAAe,OAAO,QAAQ,KAAK,OAAO;AAChD,KAAI,aAAa,SAAS,GAAG;EAC3B,MAAMC,UAAkC,EAAE;AAE1C,OAAK,MAAM,CAAC,GAAG,MAAM,aACnB,SAAQ,KAAK,EAAE;AAGjB,SAAO,KAAK,aAAa,qBAAqB,SAAS,QAAQ,GAAG;;AAGpE,QAAO,GAAG,MAAM,KAAK,QAAQ,CAC1B,KAAK,SAAS,YAAY,KAAK,CAC/B,KAAK,KAAK,CAAC;;QAER,KAAK,UAAU,IAAI,CAAC;EAC1B,QAAQ,GAAG;8BACiB,OAAO,KAAK,KAAK,CAAC"}
1
+ {"version":3,"file":"python.js","names":[],"sources":["../../../src/requests/generators/python.ts"],"sourcesContent":["'use client';\nimport type { SampleGenerator } from '@/requests/types';\nimport { generatePythonObject } from '@/requests/to-python-object';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const generator: SampleGenerator = (url, data, { mediaAdapters }) => {\n const headers: Record<string, string> = {};\n const imports = new Set<string>();\n const params = [`\"${data.method}\"`, 'url'];\n let body: string | undefined;\n\n imports.add('requests');\n\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n headers['Content-Type'] = data.bodyMediaType;\n\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'python',\n });\n\n if (body) {\n params.push('data = body');\n }\n }\n\n for (const [k, v] of Object.entries(data.header)) {\n headers[k] = v.value;\n }\n\n if (Object.keys(headers).length > 0) {\n params.push(`headers = ${generatePythonObject(headers, imports)}`);\n }\n\n const inputCookies = Object.entries(data.cookie);\n if (inputCookies.length > 0) {\n const cookies: Record<string, string> = {};\n\n for (const [k, v] of inputCookies) {\n cookies[k] = v.value;\n }\n\n params.push(`cookies = ${generatePythonObject(cookies, imports)}`);\n }\n\n return `${Array.from(imports)\n .map((name) => 'import ' + name)\n .join('\\n')}\n\nurl = ${JSON.stringify(url)}\n${body ?? ''}\nresponse = requests.request(${params.join(', ')})\n\nprint(response.text)`;\n};\n"],"mappings":";;;;;;;AAKA,MAAa,aAA8B,KAAK,MAAM,EAAE,oBAAoB;CAC1E,MAAM,UAAkC,EAAE;CAC1C,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAM,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM;CAC1C,IAAI;AAEJ,SAAQ,IAAI,WAAW;AAEvB,KAAI,KAAK,QAAQ,KAAK,eAAe;EACnC,MAAM,UAAU,oBAAoB,KAAK,eAAe,cAAc;AACtE,UAAQ,kBAAkB,KAAK;AAE/B,SAAO,SAAS,gBAAgB,MAA2B,EACzD,MAAM,UACP,CAAC;AAEF,MAAI,KACF,QAAO,KAAK,cAAc;;AAI9B,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,OAAO,CAC9C,SAAQ,KAAK,EAAE;AAGjB,KAAI,OAAO,KAAK,QAAQ,CAAC,SAAS,EAChC,QAAO,KAAK,aAAa,qBAAqB,SAAS,QAAQ,GAAG;CAGpE,MAAM,eAAe,OAAO,QAAQ,KAAK,OAAO;AAChD,KAAI,aAAa,SAAS,GAAG;EAC3B,MAAM,UAAkC,EAAE;AAE1C,OAAK,MAAM,CAAC,GAAG,MAAM,aACnB,SAAQ,KAAK,EAAE;AAGjB,SAAO,KAAK,aAAa,qBAAqB,SAAS,QAAQ,GAAG;;AAGpE,QAAO,GAAG,MAAM,KAAK,QAAQ,CAC1B,KAAK,SAAS,YAAY,KAAK,CAC/B,KAAK,KAAK,CAAC;;QAER,KAAK,UAAU,IAAI,CAAC;EAC1B,QAAQ,GAAG;8BACiB,OAAO,KAAK,KAAK,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","names":["s: string[]"],"sources":["../../../src/requests/media/adapter.ts"],"sourcesContent":["import { escapeString, inputToString } from '@/requests/string-utils';\nexport { resolveMediaAdapter, isMediaTypeSupported } from './resolve-adapter';\n// @ts-expect-error -- untyped\nimport js2xml from 'xml-js/lib/js2xml';\n\ninterface BaseContext {\n /**\n * Passed by your custom example generator, for your custom media adapter to receive.\n */\n customData?: Record<string, unknown>;\n}\n\ninterface GoContext extends BaseContext {\n lang: 'go';\n addImport: (name: string) => void;\n}\n\ninterface JavaScriptContext extends BaseContext {\n lang: 'js';\n addImport: (pkg: string, name: string) => void;\n}\n\ninterface JavaContext extends BaseContext {\n lang: 'java';\n addImport: (specifier: string) => void;\n}\n\ninterface CSharpContext extends BaseContext {\n lang: 'csharp';\n addImport: (specifier: string) => void;\n}\n\nexport type MediaContext =\n | JavaContext\n | GoContext\n | JavaScriptContext\n | CSharpContext\n | (BaseContext & { lang: string });\n\nexport interface MediaAdapter {\n /**\n * encode data into specified media type for `fetch()`.\n *\n * Return the encoded form of `data.body` property.\n */\n encode: (data: { body: unknown }) => BodyInit;\n\n /**\n * generate code example for creating the body in a given programming language.\n *\n * @param data - request data.\n * @param lang - name of programming language.\n * @param ctx - context passed from the generator of programming language.\n *\n * @returns code that inits a `body` variable, or undefined if not supported (skip example for that language).\n */\n generateExample: (data: { body: unknown }, ctx: MediaContext) => string | undefined;\n}\n\nexport const defaultAdapters = {\n 'application/json': {\n encode(data) {\n return JSON.stringify(data.body);\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/json', ctx);\n },\n },\n 'application/xml': {\n encode(data) {\n return js2xml(data.body as Record<string, unknown>, {\n compact: true,\n spaces: 2,\n });\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/xml', ctx);\n },\n },\n 'application/x-ndjson': {\n encode(data) {\n if (Array.isArray(data.body)) {\n return data.body.map((v) => JSON.stringify(v)).join('\\n');\n }\n\n return JSON.stringify(data.body);\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/x-ndjson', ctx);\n },\n },\n 'application/x-www-form-urlencoded': {\n encode(data) {\n if (typeof data.body !== 'object')\n throw new Error(`Input value must be object, received: ${typeof data.body}`);\n\n const params = new URLSearchParams();\n for (const key in data.body) {\n params.set(key, String(data.body[key as keyof object]));\n }\n\n return params;\n },\n generateExample(data, ctx) {\n if (ctx.lang === 'js') {\n return `const body = new URLSearchParams(${JSON.stringify(data.body, null, 2)})`;\n }\n\n return str(data.body, 'application/x-www-form-urlencoded', ctx);\n },\n },\n 'multipart/form-data': {\n encode(data) {\n const formData = new FormData();\n const body = data.body as Record<string, unknown>;\n\n if (typeof body !== 'object' || !body) {\n throw new Error(`Unsupported body type: ${typeof body}, expected: object`);\n }\n\n for (const key in body) {\n const prop = body[key];\n\n if (prop === null || prop === undefined || Number.isNaN(prop)) continue;\n\n // Arrays (multi-value field)\n if (Array.isArray(prop)) {\n for (const item of prop) {\n if (item === null || item === undefined) continue;\n if (item instanceof File) {\n formData.append(key, item, item.name);\n } else if (item instanceof Blob) {\n formData.append(key, item, 'blob');\n } else if (typeof item === 'object') {\n formData.append(key, JSON.stringify(item));\n } else {\n formData.append(key, String(item));\n }\n }\n }\n\n // Single File\n else if (prop instanceof File) {\n formData.set(key, prop, prop.name);\n }\n\n // Single Blob\n else if (prop instanceof Blob) {\n formData.set(key, prop, 'blob');\n }\n\n // Any other object (stringify)\n else if (typeof prop === 'object') {\n formData.set(key, JSON.stringify(prop));\n }\n\n // Primitive types\n else {\n formData.set(key, String(prop));\n }\n }\n\n return formData;\n },\n generateExample(data, ctx) {\n if (ctx.lang === 'python') {\n return `body = ${JSON.stringify(data.body, null, 2)}`;\n }\n\n const s: string[] = [];\n if (ctx.lang === 'js') {\n s.push(`const body = new FormData();`);\n\n for (const [key, value] of Object.entries(data.body as object)) {\n s.push(`body.set(${key}, ${JSON.stringify(inputToString(value))})`);\n }\n }\n\n if (ctx.lang === 'go') {\n const { addImport } = ctx as GoContext;\n addImport('mime/multipart');\n addImport('bytes');\n\n s.push('body := new(bytes.Buffer)');\n s.push('mp := multipart.NewWriter(payload)');\n\n for (const [key, value] of Object.entries(data.body as object)) {\n if (!value) continue;\n\n const escaped = escapeString(inputToString(value, 'application/json'), '`');\n\n s.push(`mp.WriteField(\"${key}\", ${escaped})`);\n }\n }\n\n if (ctx.lang === 'java') {\n const { addImport } = ctx as JavaContext;\n addImport('java.net.http.HttpRequest.BodyPublishers');\n\n s.push(`var body = BodyPublishers.ofByteArray(new byte[] { ... });`);\n }\n\n if (ctx.lang === 'csharp') {\n s.push(`var body = new MultipartFormDataContent();`);\n }\n\n if (s.length > 0) return s.join('\\n');\n },\n },\n 'application/octet-stream': {\n encode(data) {\n return data.body as BodyInit;\n },\n generateExample() {\n // not supported\n return undefined;\n },\n },\n} satisfies Record<string, MediaAdapter>;\n\nfunction str(\n init: unknown,\n mediaType:\n | 'application/x-www-form-urlencoded'\n | 'application/x-ndjson'\n | 'application/json'\n | 'application/xml',\n ctx: MediaContext,\n) {\n if (ctx.lang === 'js') {\n if (mediaType === 'application/json') {\n return `const body = JSON.stringify(${JSON.stringify(init, null, 2)})`;\n }\n return `const body = ${escapeString(inputToString(init, mediaType), '`')}`;\n }\n\n if (ctx.lang === 'python') {\n return `body = ${escapeString(inputToString(init, mediaType), '\"\"\"')}`;\n }\n\n if (ctx.lang === 'go') {\n const { addImport } = ctx as GoContext;\n addImport('strings');\n return `body := strings.NewReader(${escapeString(inputToString(init, mediaType), '`')})`;\n }\n\n if (ctx.lang === 'java') {\n const { addImport } = ctx as JavaContext;\n addImport('java.net.http.HttpRequest.BodyPublishers');\n return `var body = BodyPublishers.ofString(${escapeString(inputToString(init, mediaType), '\"\"\"')});`;\n }\n\n if (ctx.lang === 'csharp') {\n const input = `\\n${inputToString(init, mediaType)}\\n`;\n\n return `var body = new StringContent(${escapeString(input, '\"\"\"')}, Encoding.UTF8, \"${mediaType}\");`;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","names":[],"sources":["../../../src/requests/media/adapter.ts"],"sourcesContent":["import { escapeString, inputToString } from '@/requests/string-utils';\nexport { resolveMediaAdapter, isMediaTypeSupported } from './resolve-adapter';\n// @ts-expect-error -- untyped\nimport js2xml from 'xml-js/lib/js2xml';\n\ninterface BaseContext {\n /**\n * Passed by your custom example generator, for your custom media adapter to receive.\n */\n customData?: Record<string, unknown>;\n}\n\ninterface GoContext extends BaseContext {\n lang: 'go';\n addImport: (name: string) => void;\n}\n\ninterface JavaScriptContext extends BaseContext {\n lang: 'js';\n addImport: (pkg: string, name: string) => void;\n}\n\ninterface JavaContext extends BaseContext {\n lang: 'java';\n addImport: (specifier: string) => void;\n}\n\ninterface CSharpContext extends BaseContext {\n lang: 'csharp';\n addImport: (specifier: string) => void;\n}\n\nexport type MediaContext =\n | JavaContext\n | GoContext\n | JavaScriptContext\n | CSharpContext\n | (BaseContext & { lang: string });\n\nexport interface MediaAdapter {\n /**\n * encode data into specified media type for `fetch()`.\n *\n * Return the encoded form of `data.body` property.\n */\n encode: (data: { body: unknown }) => BodyInit;\n\n /**\n * generate code example for creating the body in a given programming language.\n *\n * @param data - request data.\n * @param lang - name of programming language.\n * @param ctx - context passed from the generator of programming language.\n *\n * @returns code that inits a `body` variable, or undefined if not supported (skip example for that language).\n */\n generateExample: (data: { body: unknown }, ctx: MediaContext) => string | undefined;\n}\n\nexport const defaultAdapters = {\n 'application/json': {\n encode(data) {\n return JSON.stringify(data.body);\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/json', ctx);\n },\n },\n 'application/xml': {\n encode(data) {\n return js2xml(data.body as Record<string, unknown>, {\n compact: true,\n spaces: 2,\n });\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/xml', ctx);\n },\n },\n 'application/x-ndjson': {\n encode(data) {\n if (Array.isArray(data.body)) {\n return data.body.map((v) => JSON.stringify(v)).join('\\n');\n }\n\n return JSON.stringify(data.body);\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/x-ndjson', ctx);\n },\n },\n 'application/x-www-form-urlencoded': {\n encode(data) {\n if (typeof data.body !== 'object')\n throw new Error(`Input value must be object, received: ${typeof data.body}`);\n\n const params = new URLSearchParams();\n for (const key in data.body) {\n params.set(key, String(data.body[key as keyof object]));\n }\n\n return params;\n },\n generateExample(data, ctx) {\n if (ctx.lang === 'js') {\n return `const body = new URLSearchParams(${JSON.stringify(data.body, null, 2)})`;\n }\n\n return str(data.body, 'application/x-www-form-urlencoded', ctx);\n },\n },\n 'multipart/form-data': {\n encode(data) {\n const formData = new FormData();\n const body = data.body as Record<string, unknown>;\n\n if (typeof body !== 'object' || !body) {\n throw new Error(`Unsupported body type: ${typeof body}, expected: object`);\n }\n\n for (const key in body) {\n const prop = body[key];\n\n if (prop === null || prop === undefined || Number.isNaN(prop)) continue;\n\n // Arrays (multi-value field)\n if (Array.isArray(prop)) {\n for (const item of prop) {\n if (item === null || item === undefined) continue;\n if (item instanceof File) {\n formData.append(key, item, item.name);\n } else if (item instanceof Blob) {\n formData.append(key, item, 'blob');\n } else if (typeof item === 'object') {\n formData.append(key, JSON.stringify(item));\n } else {\n formData.append(key, String(item));\n }\n }\n }\n\n // Single File\n else if (prop instanceof File) {\n formData.set(key, prop, prop.name);\n }\n\n // Single Blob\n else if (prop instanceof Blob) {\n formData.set(key, prop, 'blob');\n }\n\n // Any other object (stringify)\n else if (typeof prop === 'object') {\n formData.set(key, JSON.stringify(prop));\n }\n\n // Primitive types\n else {\n formData.set(key, String(prop));\n }\n }\n\n return formData;\n },\n generateExample(data, ctx) {\n if (ctx.lang === 'python') {\n return `body = ${JSON.stringify(data.body, null, 2)}`;\n }\n\n const s: string[] = [];\n if (ctx.lang === 'js') {\n s.push(`const body = new FormData();`);\n\n for (const [key, value] of Object.entries(data.body as object)) {\n s.push(`body.set(${key}, ${JSON.stringify(inputToString(value))})`);\n }\n }\n\n if (ctx.lang === 'go') {\n const { addImport } = ctx as GoContext;\n addImport('mime/multipart');\n addImport('bytes');\n\n s.push('body := new(bytes.Buffer)');\n s.push('mp := multipart.NewWriter(payload)');\n\n for (const [key, value] of Object.entries(data.body as object)) {\n if (!value) continue;\n\n const escaped = escapeString(inputToString(value, 'application/json'), '`');\n\n s.push(`mp.WriteField(\"${key}\", ${escaped})`);\n }\n }\n\n if (ctx.lang === 'java') {\n const { addImport } = ctx as JavaContext;\n addImport('java.net.http.HttpRequest.BodyPublishers');\n\n s.push(`var body = BodyPublishers.ofByteArray(new byte[] { ... });`);\n }\n\n if (ctx.lang === 'csharp') {\n s.push(`var body = new MultipartFormDataContent();`);\n }\n\n if (s.length > 0) return s.join('\\n');\n },\n },\n 'application/octet-stream': {\n encode(data) {\n return data.body as BodyInit;\n },\n generateExample() {\n // not supported\n return undefined;\n },\n },\n} satisfies Record<string, MediaAdapter>;\n\nfunction str(\n init: unknown,\n mediaType:\n | 'application/x-www-form-urlencoded'\n | 'application/x-ndjson'\n | 'application/json'\n | 'application/xml',\n ctx: MediaContext,\n) {\n if (ctx.lang === 'js') {\n if (mediaType === 'application/json') {\n return `const body = JSON.stringify(${JSON.stringify(init, null, 2)})`;\n }\n return `const body = ${escapeString(inputToString(init, mediaType), '`')}`;\n }\n\n if (ctx.lang === 'python') {\n return `body = ${escapeString(inputToString(init, mediaType), '\"\"\"')}`;\n }\n\n if (ctx.lang === 'go') {\n const { addImport } = ctx as GoContext;\n addImport('strings');\n return `body := strings.NewReader(${escapeString(inputToString(init, mediaType), '`')})`;\n }\n\n if (ctx.lang === 'java') {\n const { addImport } = ctx as JavaContext;\n addImport('java.net.http.HttpRequest.BodyPublishers');\n return `var body = BodyPublishers.ofString(${escapeString(inputToString(init, mediaType), '\"\"\"')});`;\n }\n\n if (ctx.lang === 'csharp') {\n const input = `\\n${inputToString(init, mediaType)}\\n`;\n\n return `var body = new StringContent(${escapeString(input, '\"\"\"')}, Encoding.UTF8, \"${mediaType}\");`;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"encode.js","names":["result: RequestData","field: NoReference<ParameterObject>"],"sources":["../../../src/requests/media/encode.ts"],"sourcesContent":["import type { MediaAdapter } from '@/requests/media/adapter';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\nimport type { NoReference } from '@/utils/schema';\nimport type { ParameterObject } from '@/types';\nimport type { RawRequestData, RequestData } from '@/requests/types';\n\nexport interface EncodedParameter {\n readonly value: string;\n}\n\nexport interface EncodedParameterMultiple {\n readonly values: string[];\n}\n\n/**\n * serialize parameters, see https://swagger.io/docs/specification/v3_0/serialization.\n */\nexport function encodeRequestData(\n from: RawRequestData,\n adapters: Record<string, MediaAdapter>,\n parameters: NoReference<ParameterObject>[],\n): RequestData {\n const result: RequestData = {\n method: from.method,\n body: from.body,\n bodyMediaType: from.bodyMediaType,\n cookie: {},\n header: {},\n path: {},\n query: {},\n };\n\n for (const type of ['cookie', 'query', 'header', 'path'] as const) {\n for (const key in from[type]) {\n const value = from[type][key];\n if (value == null) continue;\n\n const field: NoReference<ParameterObject> = parameters.find(\n (p) => p.name === key && p.in === type,\n ) ?? {\n name: key,\n in: type,\n };\n\n const encoder = getMediaEncoder(field, adapters);\n if (encoder) {\n result[type][key] = { value: encoder(value) };\n continue;\n }\n\n switch (type) {\n case 'path':\n serializePathParameter(field, value, result.path);\n break;\n case 'query':\n serializeQueryParameter(field, value, result.query);\n break;\n case 'header': {\n result.header[key] = {\n value: serializeSimple(value, field.explode ?? false),\n };\n break;\n }\n case 'cookie':\n serializeCookieParameter(field, value, result.cookie);\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction getMediaEncoder(\n field: NoReference<ParameterObject>,\n adapters: Record<string, MediaAdapter>,\n) {\n if (!field.content) return;\n\n for (const k in field.content) {\n const adapter = resolveMediaAdapter(k, adapters);\n if (adapter) {\n return (v: unknown) => String(adapter.encode({ body: v }));\n }\n }\n}\n\nfunction serializeSimple(value: NonNullable<unknown>, explode: boolean): string {\n if (Array.isArray(value)) {\n return value.join(',');\n }\n if (typeof value === 'object') {\n return explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n : Object.entries(value).flat().join(',');\n }\n return String(value);\n}\n\nfunction serializePathParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n): void {\n const { explode = false, name } = field;\n\n switch (field.style) {\n case 'label':\n if (Array.isArray(value)) {\n output[field.name] = {\n value: '.' + value.join(explode ? '.' : ','),\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name] = {\n value:\n '.' +\n (explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n : Object.entries(value).flat().join(',')),\n };\n break;\n }\n output[field.name] = {\n value: `.${value}`,\n };\n break;\n case 'matrix': {\n const specifier = `;${name}=`;\n\n if (Array.isArray(value)) {\n output[field.name] = {\n value: explode\n ? `${specifier}${value.join(',')}`\n : `${specifier}${value.join(specifier)}`,\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name] = {\n value: explode\n ? Object.entries(value)\n .map(([k, v]) => `;${k}=${v}`)\n .join('')\n : specifier + Object.entries(value).flat().join(','),\n };\n break;\n }\n\n output[field.name] = {\n value: `${specifier}${value}`,\n };\n break;\n }\n // simple\n default:\n output[field.name] = {\n value: serializeSimple(value, explode),\n };\n }\n}\n\nfunction serializeQueryParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameterMultiple>,\n): void {\n const { explode = true } = field;\n\n switch (field.style) {\n case 'spaceDelimited':\n if (!explode && Array.isArray(value)) {\n output[field.name] = {\n values: [value.join(' ')],\n };\n break;\n }\n case 'pipeDelimited':\n if (!explode && Array.isArray(value)) {\n output[field.name] = {\n values: [value.join('|')],\n };\n break;\n }\n case 'deepObject':\n if (!Array.isArray(value) && typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n output[`${field.name}[${k}]`] = {\n // note: the behaviour of nested array is undefined, we do this to avoid edge cases\n values: Array.isArray(v) ? v : [String(v)],\n };\n }\n break;\n }\n // form\n default:\n if (Array.isArray(value)) {\n output[field.name] = {\n values: explode ? value : [value.join(',')],\n };\n break;\n }\n\n if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n values: [String(v)],\n };\n }\n break;\n }\n\n if (typeof value === 'object') {\n output[field.name] = {\n values: [Object.entries(value).flat().join(',')],\n };\n break;\n }\n\n output[field.name] = {\n values: [String(value)],\n };\n }\n}\n\nfunction serializeCookieParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n) {\n const { explode = true } = field;\n\n // form\n if (Array.isArray(value)) {\n output[field.name] = {\n value: explode ? value.map((v) => `${field.name}=${v}`).join('&') : value.join(','),\n };\n } else if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n value: String(v),\n };\n }\n } else if (typeof value === 'object') {\n output[field.name] = {\n value: Object.entries(value).flat().join(','),\n };\n } else {\n output[field.name] = {\n value: String(value),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"encode.js","names":[],"sources":["../../../src/requests/media/encode.ts"],"sourcesContent":["import type { MediaAdapter } from '@/requests/media/adapter';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\nimport type { NoReference } from '@/utils/schema';\nimport type { ParameterObject } from '@/types';\nimport type { RawRequestData, RequestData } from '@/requests/types';\n\nexport interface EncodedParameter {\n readonly value: string;\n}\n\nexport interface EncodedParameterMultiple {\n readonly values: string[];\n}\n\n/**\n * serialize parameters, see https://swagger.io/docs/specification/v3_0/serialization.\n */\nexport function encodeRequestData(\n from: RawRequestData,\n adapters: Record<string, MediaAdapter>,\n parameters: NoReference<ParameterObject>[],\n): RequestData {\n const result: RequestData = {\n method: from.method,\n body: from.body,\n bodyMediaType: from.bodyMediaType,\n cookie: {},\n header: {},\n path: {},\n query: {},\n };\n\n for (const type of ['cookie', 'query', 'header', 'path'] as const) {\n for (const key in from[type]) {\n const value = from[type][key];\n if (value == null) continue;\n\n const field: NoReference<ParameterObject> = parameters.find(\n (p) => p.name === key && p.in === type,\n ) ?? {\n name: key,\n in: type,\n };\n\n const encoder = getMediaEncoder(field, adapters);\n if (encoder) {\n result[type][key] = { value: encoder(value) };\n continue;\n }\n\n switch (type) {\n case 'path':\n serializePathParameter(field, value, result.path);\n break;\n case 'query':\n serializeQueryParameter(field, value, result.query);\n break;\n case 'header': {\n result.header[key] = {\n value: serializeSimple(value, field.explode ?? false),\n };\n break;\n }\n case 'cookie':\n serializeCookieParameter(field, value, result.cookie);\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction getMediaEncoder(\n field: NoReference<ParameterObject>,\n adapters: Record<string, MediaAdapter>,\n) {\n if (!field.content) return;\n\n for (const k in field.content) {\n const adapter = resolveMediaAdapter(k, adapters);\n if (adapter) {\n return (v: unknown) => String(adapter.encode({ body: v }));\n }\n }\n}\n\nfunction serializeSimple(value: NonNullable<unknown>, explode: boolean): string {\n if (Array.isArray(value)) {\n return value.join(',');\n }\n if (typeof value === 'object') {\n return explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n : Object.entries(value).flat().join(',');\n }\n return String(value);\n}\n\nfunction serializePathParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n): void {\n const { explode = false, name } = field;\n\n switch (field.style) {\n case 'label':\n if (Array.isArray(value)) {\n output[field.name] = {\n value: '.' + value.join(explode ? '.' : ','),\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name] = {\n value:\n '.' +\n (explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n : Object.entries(value).flat().join(',')),\n };\n break;\n }\n output[field.name] = {\n value: `.${value}`,\n };\n break;\n case 'matrix': {\n const specifier = `;${name}=`;\n\n if (Array.isArray(value)) {\n output[field.name] = {\n value: explode\n ? `${specifier}${value.join(',')}`\n : `${specifier}${value.join(specifier)}`,\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name] = {\n value: explode\n ? Object.entries(value)\n .map(([k, v]) => `;${k}=${v}`)\n .join('')\n : specifier + Object.entries(value).flat().join(','),\n };\n break;\n }\n\n output[field.name] = {\n value: `${specifier}${value}`,\n };\n break;\n }\n // simple\n default:\n output[field.name] = {\n value: serializeSimple(value, explode),\n };\n }\n}\n\nfunction serializeQueryParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameterMultiple>,\n): void {\n const { explode = true } = field;\n\n switch (field.style) {\n case 'spaceDelimited':\n if (!explode && Array.isArray(value)) {\n output[field.name] = {\n values: [value.join(' ')],\n };\n break;\n }\n case 'pipeDelimited':\n if (!explode && Array.isArray(value)) {\n output[field.name] = {\n values: [value.join('|')],\n };\n break;\n }\n case 'deepObject':\n if (!Array.isArray(value) && typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n output[`${field.name}[${k}]`] = {\n // note: the behaviour of nested array is undefined, we do this to avoid edge cases\n values: Array.isArray(v) ? v : [String(v)],\n };\n }\n break;\n }\n // form\n default:\n if (Array.isArray(value)) {\n output[field.name] = {\n values: explode ? value : [value.join(',')],\n };\n break;\n }\n\n if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n values: [String(v)],\n };\n }\n break;\n }\n\n if (typeof value === 'object') {\n output[field.name] = {\n values: [Object.entries(value).flat().join(',')],\n };\n break;\n }\n\n output[field.name] = {\n values: [String(value)],\n };\n }\n}\n\nfunction serializeCookieParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n) {\n const { explode = true } = field;\n\n // form\n if (Array.isArray(value)) {\n output[field.name] = {\n value: explode ? value.map((v) => `${field.name}=${v}`).join('&') : value.join(','),\n };\n } else if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n value: String(v),\n };\n }\n } else if (typeof value === 'object') {\n output[field.name] = {\n value: Object.entries(value).flat().join(','),\n };\n } else {\n output[field.name] = {\n value: String(value),\n };\n }\n}\n"],"mappings":"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"}
@@ -16,6 +16,10 @@ function resolveMediaAdapter(mediaType, adapters) {
16
16
  const baseType = `${match.groups.dir}/${match.groups.variant}`;
17
17
  if (baseType in adapters) return adapters[baseType];
18
18
  }
19
+ if (mediaType === "text/plain") {
20
+ console.warn("there is no defined behaviour for encoding form values into \"text/plain\", using JSON encoder for now.");
21
+ return adapters["application/json"];
22
+ }
19
23
  }
20
24
  /**
21
25
  * Check if a media type is supported by the given adapters.
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-adapter.js","names":[],"sources":["../../../src/requests/media/resolve-adapter.ts"],"sourcesContent":["import type { MediaAdapter } from './adapter';\n\nconst VariantMediaTypeRegex =\n /^(?<dir>[a-zA-Z0-9._-]+)\\/(?<content>[a-zA-Z0-9._-]+)\\+(?<variant>[a-zA-Z0-9._-]+)$/;\n\n/**\n * Resolve a media adapter for a given media type.\n * Supports exact matches and pattern matching (e.g., +json suffix).\n *\n * @param mediaType - The media type to resolve (e.g., \"application/json\", \"application/json-patch+json\")\n * @param adapters - Record of media adapters\n * @returns The resolved adapter or undefined if not found\n */\nexport function resolveMediaAdapter(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): MediaAdapter | undefined {\n // Normalize media type (remove parameters like charset)\n const normalized = mediaType.split(';', 2)[0].trim().toLowerCase();\n\n if (normalized in adapters) {\n return adapters[normalized];\n }\n\n const match = VariantMediaTypeRegex.exec(normalized);\n if (match?.groups) {\n const baseType = `${match.groups.dir}/${match.groups.variant}`;\n\n if (baseType in adapters) {\n return adapters[baseType];\n }\n }\n}\n\n/**\n * Check if a media type is supported by the given adapters.\n *\n * @param mediaType - The media type to check\n * @param adapters - Record of media adapters\n * @returns true if the media type is supported\n */\nexport function isMediaTypeSupported(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): boolean {\n return resolveMediaAdapter(mediaType, adapters) !== undefined;\n}\n"],"mappings":";AAEA,MAAM,wBACJ;;;;;;;;;AAUF,SAAgB,oBACd,WACA,UAC0B;CAE1B,MAAM,aAAa,UAAU,MAAM,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,aAAa;AAElE,KAAI,cAAc,SAChB,QAAO,SAAS;CAGlB,MAAM,QAAQ,sBAAsB,KAAK,WAAW;AACpD,KAAI,OAAO,QAAQ;EACjB,MAAM,WAAW,GAAG,MAAM,OAAO,IAAI,GAAG,MAAM,OAAO;AAErD,MAAI,YAAY,SACd,QAAO,SAAS;;;;;;;;;;AAYtB,SAAgB,qBACd,WACA,UACS;AACT,QAAO,oBAAoB,WAAW,SAAS,KAAK"}
1
+ {"version":3,"file":"resolve-adapter.js","names":[],"sources":["../../../src/requests/media/resolve-adapter.ts"],"sourcesContent":["import type { MediaAdapter } from './adapter';\n\nconst VariantMediaTypeRegex =\n /^(?<dir>[a-zA-Z0-9._-]+)\\/(?<content>[a-zA-Z0-9._-]+)\\+(?<variant>[a-zA-Z0-9._-]+)$/;\n\n/**\n * Resolve a media adapter for a given media type.\n * Supports exact matches and pattern matching (e.g., +json suffix).\n *\n * @param mediaType - The media type to resolve (e.g., \"application/json\", \"application/json-patch+json\")\n * @param adapters - Record of media adapters\n * @returns The resolved adapter or undefined if not found\n */\nexport function resolveMediaAdapter(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): MediaAdapter | undefined {\n // Normalize media type (remove parameters like charset)\n const normalized = mediaType.split(';', 2)[0].trim().toLowerCase();\n\n if (normalized in adapters) {\n return adapters[normalized];\n }\n\n const match = VariantMediaTypeRegex.exec(normalized);\n if (match?.groups) {\n const baseType = `${match.groups.dir}/${match.groups.variant}`;\n\n if (baseType in adapters) {\n return adapters[baseType];\n }\n }\n\n if (mediaType === 'text/plain') {\n console.warn(\n 'there is no defined behaviour for encoding form values into \"text/plain\", using JSON encoder for now.',\n );\n return adapters['application/json'];\n }\n}\n\n/**\n * Check if a media type is supported by the given adapters.\n *\n * @param mediaType - The media type to check\n * @param adapters - Record of media adapters\n * @returns true if the media type is supported\n */\nexport function isMediaTypeSupported(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): boolean {\n return resolveMediaAdapter(mediaType, adapters) !== undefined;\n}\n"],"mappings":";AAEA,MAAM,wBACJ;;;;;;;;;AAUF,SAAgB,oBACd,WACA,UAC0B;CAE1B,MAAM,aAAa,UAAU,MAAM,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,aAAa;AAElE,KAAI,cAAc,SAChB,QAAO,SAAS;CAGlB,MAAM,QAAQ,sBAAsB,KAAK,WAAW;AACpD,KAAI,OAAO,QAAQ;EACjB,MAAM,WAAW,GAAG,MAAM,OAAO,IAAI,GAAG,MAAM,OAAO;AAErD,MAAI,YAAY,SACd,QAAO,SAAS;;AAIpB,KAAI,cAAc,cAAc;AAC9B,UAAQ,KACN,0GACD;AACD,SAAO,SAAS;;;;;;;;;;AAWpB,SAAgB,qBACd,WACA,UACS;AACT,QAAO,oBAAoB,WAAW,SAAS,KAAK"}