fumadocs-openapi 10.2.6 → 10.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generate-file.d.ts +1 -2
- package/dist/generate-file.js +1 -2
- package/dist/playground/client.d.ts +1 -2
- package/dist/playground/client.js +1 -2
- package/dist/playground/components/inputs.js +34 -54
- package/dist/playground/components/oauth-dialog.js +1 -2
- package/dist/playground/components/server-select.js +1 -2
- package/dist/playground/fetcher.d.ts +1 -2
- package/dist/playground/fetcher.js +1 -2
- package/dist/playground/get-default-values.js +1 -2
- package/dist/playground/index.d.ts +1 -2
- package/dist/playground/index.js +1 -2
- package/dist/playground/lazy.js +1 -2
- package/dist/playground/schema.d.ts +1 -2
- package/dist/playground/schema.js +1 -2
- package/dist/playground/status-info.js +1 -2
- package/dist/requests/generators/csharp.js +1 -2
- package/dist/requests/generators/curl.js +1 -2
- package/dist/requests/generators/go.js +1 -2
- package/dist/requests/generators/index.js +1 -2
- package/dist/requests/generators/java.js +1 -2
- package/dist/requests/generators/javascript.js +1 -2
- package/dist/requests/generators/python.js +1 -2
- package/dist/requests/media/adapter.d.ts +1 -2
- package/dist/requests/media/adapter.js +1 -2
- package/dist/requests/media/encode.d.ts +1 -2
- package/dist/requests/media/encode.js +1 -2
- package/dist/requests/media/resolve-adapter.js +1 -2
- package/dist/requests/string-utils.js +1 -2
- package/dist/requests/to-python-object.js +1 -2
- package/dist/requests/types.d.ts +1 -2
- package/dist/scalar/client.js +1 -2
- package/dist/scalar/index.d.ts +1 -2
- package/dist/scalar/index.js +1 -2
- package/dist/server/create.d.ts +1 -2
- package/dist/server/create.js +1 -2
- package/dist/server/proxy.d.ts +1 -2
- package/dist/server/proxy.js +1 -2
- package/dist/server/source-api.d.ts +1 -2
- package/dist/server/source-api.js +1 -2
- package/dist/types.d.ts +1 -2
- package/dist/ui/api-page.d.ts +1 -2
- package/dist/ui/api-page.js +1 -2
- package/dist/ui/client/index.d.ts +1 -2
- package/dist/ui/client/index.js +1 -2
- package/dist/ui/client/storage-key.js +1 -2
- package/dist/ui/components/accordion.js +1 -2
- package/dist/ui/components/dialog.js +1 -2
- package/dist/ui/components/input.js +1 -2
- package/dist/ui/components/method-label.js +1 -2
- package/dist/ui/components/select.js +1 -2
- package/dist/ui/contexts/api.js +1 -2
- package/dist/ui/contexts/api.lazy.js +1 -2
- package/dist/ui/operation/client.js +1 -2
- package/dist/ui/operation/index.js +1 -2
- package/dist/ui/operation/request-tabs.d.ts +1 -2
- package/dist/ui/operation/request-tabs.js +1 -2
- package/dist/ui/operation/response-tabs.d.ts +1 -2
- package/dist/ui/operation/response-tabs.js +1 -2
- package/dist/ui/operation/usage-tabs/client.js +1 -2
- package/dist/ui/operation/usage-tabs/index.d.ts +1 -2
- package/dist/ui/operation/usage-tabs/index.js +1 -2
- package/dist/ui/operation/usage-tabs/lazy.js +1 -2
- package/dist/ui/schema/client.d.ts +1 -2
- package/dist/ui/schema/client.js +34 -3
- package/dist/ui/schema/index.d.ts +6 -3
- package/dist/ui/schema/index.js +42 -25
- package/dist/ui/schema/lazy.js +1 -2
- package/dist/utils/deep-equal.js +1 -2
- package/dist/utils/get-typescript-schema.js +1 -2
- package/dist/utils/id-to-title.js +1 -2
- package/dist/utils/lazy.js +1 -2
- package/dist/utils/merge-schema.js +1 -2
- package/dist/utils/pages/builder.d.ts +1 -2
- package/dist/utils/pages/builder.js +1 -2
- package/dist/utils/pages/preset-auto.d.ts +1 -2
- package/dist/utils/pages/preset-auto.js +1 -2
- package/dist/utils/pages/to-body.js +1 -2
- package/dist/utils/pages/to-static-data.js +1 -2
- package/dist/utils/pages/to-text.d.ts +1 -2
- package/dist/utils/pages/to-text.js +1 -2
- package/dist/utils/process-document.d.ts +1 -2
- package/dist/utils/process-document.js +1 -2
- package/dist/utils/remove-undefined.js +1 -2
- package/dist/utils/schema-to-string.js +1 -2
- package/dist/utils/schema.d.ts +1 -2
- package/dist/utils/schema.js +1 -2
- package/dist/utils/url.js +1 -2
- package/dist/utils/use-query.js +1 -2
- package/package.json +10 -10
- package/dist/generate-file.d.ts.map +0 -1
- package/dist/generate-file.js.map +0 -1
- package/dist/playground/client.d.ts.map +0 -1
- package/dist/playground/client.js.map +0 -1
- package/dist/playground/components/inputs.js.map +0 -1
- package/dist/playground/components/oauth-dialog.js.map +0 -1
- package/dist/playground/components/server-select.js.map +0 -1
- package/dist/playground/fetcher.d.ts.map +0 -1
- package/dist/playground/fetcher.js.map +0 -1
- package/dist/playground/get-default-values.js.map +0 -1
- package/dist/playground/index.d.ts.map +0 -1
- package/dist/playground/index.js.map +0 -1
- package/dist/playground/lazy.js.map +0 -1
- package/dist/playground/schema.d.ts.map +0 -1
- package/dist/playground/schema.js.map +0 -1
- package/dist/playground/status-info.js.map +0 -1
- package/dist/requests/generators/csharp.js.map +0 -1
- package/dist/requests/generators/curl.js.map +0 -1
- package/dist/requests/generators/go.js.map +0 -1
- package/dist/requests/generators/index.js.map +0 -1
- package/dist/requests/generators/java.js.map +0 -1
- package/dist/requests/generators/javascript.js.map +0 -1
- package/dist/requests/generators/python.js.map +0 -1
- package/dist/requests/media/adapter.d.ts.map +0 -1
- package/dist/requests/media/adapter.js.map +0 -1
- package/dist/requests/media/encode.d.ts.map +0 -1
- package/dist/requests/media/encode.js.map +0 -1
- package/dist/requests/media/resolve-adapter.js.map +0 -1
- package/dist/requests/string-utils.js.map +0 -1
- package/dist/requests/to-python-object.js.map +0 -1
- package/dist/requests/types.d.ts.map +0 -1
- package/dist/scalar/client.js.map +0 -1
- package/dist/scalar/index.d.ts.map +0 -1
- package/dist/scalar/index.js.map +0 -1
- package/dist/server/create.d.ts.map +0 -1
- package/dist/server/create.js.map +0 -1
- package/dist/server/proxy.d.ts.map +0 -1
- package/dist/server/proxy.js.map +0 -1
- package/dist/server/source-api.d.ts.map +0 -1
- package/dist/server/source-api.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/ui/api-page.d.ts.map +0 -1
- package/dist/ui/api-page.js.map +0 -1
- package/dist/ui/client/index.d.ts.map +0 -1
- package/dist/ui/client/index.js.map +0 -1
- package/dist/ui/client/storage-key.js.map +0 -1
- package/dist/ui/components/accordion.js.map +0 -1
- package/dist/ui/components/dialog.js.map +0 -1
- package/dist/ui/components/input.js.map +0 -1
- package/dist/ui/components/method-label.js.map +0 -1
- package/dist/ui/components/select.js.map +0 -1
- package/dist/ui/contexts/api.js.map +0 -1
- package/dist/ui/contexts/api.lazy.js.map +0 -1
- package/dist/ui/operation/client.js.map +0 -1
- package/dist/ui/operation/index.js.map +0 -1
- package/dist/ui/operation/request-tabs.d.ts.map +0 -1
- package/dist/ui/operation/request-tabs.js.map +0 -1
- package/dist/ui/operation/response-tabs.d.ts.map +0 -1
- package/dist/ui/operation/response-tabs.js.map +0 -1
- package/dist/ui/operation/usage-tabs/client.js.map +0 -1
- package/dist/ui/operation/usage-tabs/index.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/index.js.map +0 -1
- package/dist/ui/operation/usage-tabs/lazy.js.map +0 -1
- package/dist/ui/schema/client.d.ts.map +0 -1
- package/dist/ui/schema/client.js.map +0 -1
- package/dist/ui/schema/index.d.ts.map +0 -1
- package/dist/ui/schema/index.js.map +0 -1
- package/dist/ui/schema/lazy.js.map +0 -1
- package/dist/utils/deep-equal.js.map +0 -1
- package/dist/utils/get-typescript-schema.js.map +0 -1
- package/dist/utils/id-to-title.js.map +0 -1
- package/dist/utils/lazy.js.map +0 -1
- package/dist/utils/merge-schema.js.map +0 -1
- package/dist/utils/pages/builder.d.ts.map +0 -1
- package/dist/utils/pages/builder.js.map +0 -1
- package/dist/utils/pages/preset-auto.d.ts.map +0 -1
- package/dist/utils/pages/preset-auto.js.map +0 -1
- package/dist/utils/pages/to-body.js.map +0 -1
- package/dist/utils/pages/to-static-data.js.map +0 -1
- package/dist/utils/pages/to-text.d.ts.map +0 -1
- package/dist/utils/pages/to-text.js.map +0 -1
- package/dist/utils/process-document.d.ts.map +0 -1
- package/dist/utils/process-document.js.map +0 -1
- package/dist/utils/remove-undefined.js.map +0 -1
- package/dist/utils/schema-to-string.js.map +0 -1
- package/dist/utils/schema.d.ts.map +0 -1
- package/dist/utils/schema.js.map +0 -1
- package/dist/utils/url.js.map +0 -1
- package/dist/utils/use-query.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-dialog.js","names":["type"],"sources":["../../../src/playground/components/oauth-dialog.tsx"],"sourcesContent":["import {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@/ui/components/dialog';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport { useForm } from 'react-hook-form';\nimport { Input, labelVariants } from '@/ui/components/input';\nimport { useQuery } from '@/utils/use-query';\nimport { type ReactNode, useEffect, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\n\ntype FlowType = keyof OpenAPIV3_1.OAuth2SecurityScheme['flows'];\n\nexport interface AuthDialogProps {\n scheme: OpenAPIV3_1.OAuth2SecurityScheme;\n scopes: string[];\n\n open: boolean;\n setOpen: (v: boolean) => void;\n setToken: (token: string) => void;\n children: ReactNode;\n}\n\ninterface FormValues {\n clientId: string;\n clientSecret: string;\n username: string;\n password: string;\n}\n\ninterface AuthCodeState {\n redirect_uri: string;\n client_id: string;\n client_secret: string;\n}\n\ninterface ImplicitState {\n redirect_uri: string;\n client_id: string;\n}\n\nconst FlowTypes = {\n password: {\n name: 'Resource Owner Password Flow',\n description: 'Authenticate using username and password.',\n },\n clientCredentials: {\n name: 'Client Credentials',\n description: 'Intended for the server-to-server authentication.',\n },\n authorizationCode: {\n name: 'Authorization code',\n description: 'Authenticate with 3rd party services',\n },\n implicit: {\n name: 'Implicit',\n description: 'Retrieve the access token directly.',\n },\n} as const;\n\nexport function OauthDialog({\n scheme,\n scopes,\n setToken,\n children,\n open,\n setOpen,\n}: AuthDialogProps) {\n const [type, setType] = useState(() => {\n return Object.keys(scheme.flows)[0] as FlowType;\n });\n\n const form = useForm<FormValues>({\n defaultValues: {\n clientId: '',\n clientSecret: '',\n username: '',\n password: '',\n },\n });\n\n const authCodeCallback = useQuery(async (code: string, state: AuthCodeState) => {\n const value = scheme.flows.authorizationCode!;\n\n const res = await fetch(value.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n // note: `state` could be invalid, but server will check it\n redirect_uri: state.redirect_uri,\n client_id: state.client_id,\n client_secret: state.client_secret,\n }),\n });\n\n if (!res.ok) throw new Error(await res.text());\n const { access_token, token_type = 'Bearer' } = (await res.json()) as {\n access_token: string;\n token_type?: string;\n };\n\n setToken(`${token_type} ${access_token}`);\n setOpen(false);\n });\n\n useEffect(() => {\n if (scheme.flows.authorizationCode) {\n const params = new URLSearchParams(window.location.search);\n const state = params.get('state');\n const code = params.get('code');\n\n if (state && code) {\n const parsedState = JSON.parse(state) as AuthCodeState;\n setOpen(true);\n\n form.setValue('clientId', parsedState.client_id);\n form.setValue('clientSecret', parsedState.client_secret);\n authCodeCallback.start(code, parsedState);\n window.history.replaceState(null, '', window.location.pathname);\n return;\n }\n }\n\n if (scheme.flows.implicit && window.location.hash.length > 1) {\n const params = new URLSearchParams(window.location.hash.slice(1));\n const state = params.get('state');\n const token = params.get('access_token');\n const type = params.get('token_type') ?? 'Bearer';\n\n if (state && token) {\n const parsedState = JSON.parse(state) as ImplicitState;\n\n form.setValue('clientId', parsedState.client_id);\n setToken(`${type} ${token}`);\n window.history.replaceState(null, '', window.location.pathname);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- first page load only\n }, []);\n\n const authorize = useQuery(async (values: FormValues) => {\n if (type === 'implicit') {\n const value = scheme.flows[type]!;\n\n const params = new URLSearchParams();\n params.set('response_type', 'token');\n params.set('client_id', values.clientId);\n params.set('redirect_uri', window.location.href);\n params.set('scope', scopes.join('+'));\n params.set(\n 'state',\n JSON.stringify({\n client_id: values.clientId,\n redirect_uri: window.location.href,\n } satisfies ImplicitState),\n );\n\n window.location.replace(`${value.authorizationUrl}?${params.toString()}`);\n return;\n }\n if (type === 'authorizationCode') {\n const value = scheme.flows[type]!;\n\n const params = new URLSearchParams();\n params.set('response_type', 'code');\n params.set('client_id', values.clientId);\n params.set('redirect_uri', window.location.href);\n params.set('scope', scopes.join('+'));\n params.set(\n 'state',\n JSON.stringify({\n client_id: values.clientId,\n client_secret: values.clientSecret,\n redirect_uri: window.location.href,\n } satisfies AuthCodeState),\n );\n\n window.location.replace(`${value.authorizationUrl}?${params.toString()}`);\n return;\n }\n\n let res;\n if (type === 'password') {\n const value = scheme.flows[type]!;\n\n res = await fetch(value.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'password',\n username: values.username,\n password: values.password,\n scope: scopes.join('+'),\n }),\n });\n }\n\n if (type === 'clientCredentials') {\n const value = scheme.flows[type]!;\n\n res = await fetch(value.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: values.clientId,\n client_secret: values.clientSecret,\n scope: scopes.join('+'),\n }),\n });\n }\n\n if (res) {\n if (!res.ok) throw new Error(await res.text());\n\n const { access_token, token_type = 'Bearer' } = (await res.json()) as {\n access_token: string;\n token_type?: string;\n };\n\n setToken(`${token_type} ${access_token}`);\n setOpen(false);\n }\n });\n\n const onSubmit = form.handleSubmit((values) => {\n return authorize.start(values);\n });\n\n const isLoading = authorize.isLoading || authCodeCallback.isLoading;\n const error = authCodeCallback.error ?? authorize.error;\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n {children}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Authorization</DialogTitle>\n <DialogDescription>Obtain the access token for API.</DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-6\"\n onSubmit={(e) => {\n void onSubmit(e);\n e.stopPropagation();\n }}\n >\n <Select value={type} onValueChange={setType as (s: string) => void}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {Object.keys(scheme.flows).map((key) => {\n const { name, description } = FlowTypes[key as FlowType];\n\n return (\n <SelectItem key={key} value={key}>\n <p className=\"font-medium\">{name}</p>\n <p className=\"text-fd-muted-foreground\">{description}</p>\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n\n {(type === 'authorizationCode' ||\n type === 'clientCredentials' ||\n type === 'implicit') && (\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"client_id\" className={cn(labelVariants())}>\n Client ID\n </label>\n <p className=\"text-fd-muted-foreground text-sm\">\n The client ID of your OAuth application.\n </p>\n <Input\n id=\"client_id\"\n placeholder=\"Enter value\"\n type=\"text\"\n autoComplete=\"off\"\n disabled={isLoading}\n {...form.register('clientId', { required: true })}\n />\n </fieldset>\n )}\n {(type === 'authorizationCode' || type === 'clientCredentials') && (\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"client_secret\" className={cn(labelVariants())}>\n Client Secret\n </label>\n <p className=\"text-fd-muted-foreground text-sm\">\n The client secret of your OAuth application.\n </p>\n <Input\n id=\"client_secret\"\n placeholder=\"Enter value\"\n type=\"password\"\n autoComplete=\"off\"\n disabled={isLoading}\n {...form.register('clientSecret', { required: true })}\n />\n </fieldset>\n )}\n {type === 'password' && (\n <>\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"username\" className={cn(labelVariants())}>\n Username\n </label>\n <Input\n id=\"username\"\n placeholder=\"Enter value\"\n type=\"text\"\n disabled={isLoading}\n autoComplete=\"off\"\n {...form.register('username', { required: true })}\n />\n </fieldset>\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"password\" className={cn(labelVariants())}>\n Client Secret\n </label>\n <Input\n id=\"password\"\n placeholder=\"Enter value\"\n type=\"password\"\n autoComplete=\"off\"\n disabled={isLoading}\n {...form.register('password', { required: true })}\n />\n </fieldset>\n </>\n )}\n {error ? <p className=\"text-red-400 font-medium text-sm\">{String(error)}</p> : null}\n <button\n type=\"submit\"\n disabled={isLoading}\n className={cn(\n buttonVariants({\n color: 'primary',\n }),\n )}\n >\n {authCodeCallback.isLoading ? 'Fetching token...' : 'Submit'}\n </button>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport const OauthDialogTrigger = DialogTrigger;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.d.ts","names":[],"sources":["../../src/playground/fetcher.ts"],"sourcesContent":[],"mappings":";;;;UAQiB,WAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-default-values.js","names":[],"sources":["../../src/playground/get-default-values.ts"],"sourcesContent":["import type { ParsedSchema } from '@/utils/schema';\n\nexport function getDefaultValue(schema: ParsedSchema): unknown {\n if (typeof schema === 'boolean') return null;\n\n const type = schema.type;\n if (Array.isArray(type))\n return getDefaultValue({\n ...schema,\n type: type[0],\n });\n\n if (type === 'object' && typeof schema === 'object')\n return Object.fromEntries(\n Object.entries(schema.properties ?? {}).map(([key, prop]) => {\n return [key, getDefaultValue(prop)];\n }),\n );\n\n if (type === 'array') return [];\n if (type === 'null') return null;\n if (type === 'string') {\n if (typeof schema === 'object' && schema.format === 'binary') return undefined;\n\n return '';\n }\n if (type === 'number' || type === 'integer') return 0;\n if (type === 'boolean') return false;\n}\n"],"mappings":";AAEA,SAAgB,gBAAgB,QAA+B;AAC7D,KAAI,OAAO,WAAW,UAAW,QAAO;CAExC,MAAM,OAAO,OAAO;AACpB,KAAI,MAAM,QAAQ,KAAK,CACrB,QAAO,gBAAgB;EACrB,GAAG;EACH,MAAM,KAAK;EACZ,CAAC;AAEJ,KAAI,SAAS,YAAY,OAAO,WAAW,SACzC,QAAO,OAAO,YACZ,OAAO,QAAQ,OAAO,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,UAAU;AAC3D,SAAO,CAAC,KAAK,gBAAgB,KAAK,CAAC;GACnC,CACH;AAEH,KAAI,SAAS,QAAS,QAAO,EAAE;AAC/B,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAI,SAAS,UAAU;AACrB,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,SAAU,QAAO;AAErE,SAAO;;AAET,KAAI,SAAS,YAAY,SAAS,UAAW,QAAO;AACpD,KAAI,SAAS,UAAW,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/playground/index.tsx"],"sourcesContent":[],"mappings":";;;;;;KAUY,cAAA,GAAiB,YAAY;UAC/B;;;AADE,UAWK,kBAAA,CAXS;EAAe,IAAA,EAAA,MAAA;EAAZ,MAAA,EAanB,iBAbmB;EACnB,GAAA,EAaH,aAbG;;AAUO,KAML,aAAA,GAAgB,oBAJlB,GAAA;EAIE,MAAA,EAAA,MAAA,EAAa;EAKH,EAAA,EAAA,MAAA;CAAgB;AAAM,iBAAtB,aAAA,CAAsB;EAAA,IAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EAAe,kBAAf,CAAA,EAAiC,OAAjC,CAAA,MAAA,GAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAAiC,kBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAjC,CAAiC,MAAA,CAAA,SAAA,CAAjC,GAAA,IAAA,GAAA,SAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","names":[],"sources":["../../src/playground/lazy.ts"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../utils/lazy';\n\nexport const ClientLazy = wrapLazy(() => import('./client'));\n"],"mappings":";;;;;AAGA,MAAa,aAAa,eAAe,OAAO,eAAY"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/playground/schema.tsx"],"sourcesContent":[],"mappings":";;;;;;;;UAYiB,WAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","names":[],"sources":["../../../src/requests/media/adapter.ts"],"sourcesContent":[],"mappings":";AAC8E,UAIpE,WAAA,CAAW;EAOX;AAA6B;AAKQ;EAUrC,UAAA,CAAA,EAlBK,MAkBS,CAAA,MAAA,EAAA,OAAQ,CAAA;AAKhC;UApBU,SAAA,SAAkB,WAqBxB,CAAA;EACA,IAAA,EAAA,IAAA;EACA,SAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,IAAA;;UAlBM,iBAAA,SAA0B,WAoB/B,CAAA;EAAW,IAAA,EAAA,IAAA;EAEC,SAAA,EAAA,CAAA,GAAY,EAAA,MAAA,EAAA,IAMU,EAAA,MAAA,EAWW,GAAA,IAAA;;UAlCxC,WAAA,SAAoB;;;;UAKpB,aAAA,SAAsB;;;;KAKpB,YAAA,GACR,cACA,YACA,oBACA,iBACC;;;UAEY,YAAA;;;;;;;;QAMsB;;;;;;;;;;;;UAWW"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encode.d.ts","names":[],"sources":["../../../src/requests/media/encode.ts"],"sourcesContent":[],"mappings":";;;;;UAMiB,gBAAA;EAAA,SAAA,KAAA,EAAA,MAAgB;AAIjC;UAAiB,wBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"string-utils.js","names":[],"sources":["../../src/requests/string-utils.ts"],"sourcesContent":["// @ts-expect-error -- nothing\nimport js2xml from 'xml-js/lib/js2xml';\n\n/**\n * Convert input value to hardcoded string (with quotes)\n */\nexport function inputToString(\n value: unknown,\n format:\n | 'application/x-www-form-urlencoded'\n | 'application/x-ndjson'\n | 'application/json'\n | 'application/xml' = 'application/json',\n): string {\n if (typeof value === 'string') return value;\n\n if (format === 'application/json') {\n return JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-ndjson') {\n return Array.isArray(value)\n ? value.map((v) => JSON.stringify(v)).join('\\n')\n : JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-www-form-urlencoded') {\n const params = new URLSearchParams();\n if (typeof value !== 'object')\n throw new Error(\n `For url encoded data, \\`value\\` must be an object, but received: ${typeof value}`,\n );\n\n for (const key in value) {\n if (value[key as keyof object]) params.set(key, String(value[key as keyof object]));\n }\n\n return params.toString();\n }\n\n return js2xml(value, { compact: true, spaces: 2 });\n}\n\nexport function escapeString(str: string, delimit?: string): string {\n if (!delimit) return JSON.stringify(str);\n\n return `${delimit}${str.replaceAll(delimit, `\\\\${delimit}`)}${delimit}`;\n}\n\nexport function ident(code: string, tab: number = 1) {\n return code\n .split('\\n')\n .map((v) => ' '.repeat(tab) + v)\n .join('\\n');\n}\n"],"mappings":";;;;;;AAMA,SAAgB,cACd,OACA,SAIwB,oBAChB;AACR,KAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,KAAI,WAAW,mBACb,QAAO,KAAK,UAAU,OAAO,MAAM,EAAE;AAGvC,KAAI,WAAW,uBACb,QAAO,MAAM,QAAQ,MAAM,GACvB,MAAM,KAAK,MAAM,KAAK,UAAU,EAAE,CAAC,CAAC,KAAK,KAAK,GAC9C,KAAK,UAAU,OAAO,MAAM,EAAE;AAGpC,KAAI,WAAW,qCAAqC;EAClD,MAAM,SAAS,IAAI,iBAAiB;AACpC,MAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MACR,oEAAoE,OAAO,QAC5E;AAEH,OAAK,MAAM,OAAO,MAChB,KAAI,MAAM,KAAsB,QAAO,IAAI,KAAK,OAAO,MAAM,KAAqB,CAAC;AAGrF,SAAO,OAAO,UAAU;;AAG1B,QAAO,OAAO,OAAO;EAAE,SAAS;EAAM,QAAQ;EAAG,CAAC;;AAGpD,SAAgB,aAAa,KAAa,SAA0B;AAClE,KAAI,CAAC,QAAS,QAAO,KAAK,UAAU,IAAI;AAExC,QAAO,GAAG,UAAU,IAAI,WAAW,SAAS,KAAK,UAAU,GAAG;;AAGhE,SAAgB,MAAM,MAAc,MAAc,GAAG;AACnD,QAAO,KACJ,MAAM,KAAK,CACX,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,EAAE,CAChC,KAAK,KAAK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-python-object.js","names":[],"sources":["../../src/requests/to-python-object.ts"],"sourcesContent":["export function generatePythonObject(v: unknown, imports = new Set()): string {\n if (v === null) {\n return 'None';\n } else if (typeof v === 'boolean') {\n return v ? 'True' : 'False';\n } else if (typeof v === 'string') {\n return JSON.stringify(v);\n } else if (typeof v === 'number') {\n return v.toString();\n } else if (Array.isArray(v)) {\n const items = v.map((item) => generatePythonObject(item, imports));\n return `[${items.join(', ')}]`;\n } else if (v instanceof Date) {\n imports.add('datetime');\n return `datetime.datetime(${v.getFullYear()}, ${v.getMonth() + 1}, ${v.getDate()}, ${v.getHours()}, ${v.getMinutes()}, ${v.getSeconds()}, ${v.getMilliseconds()})`;\n } else if (typeof v === 'object') {\n const entries = Object.entries(v).map(\n ([key, value]) => ` ${JSON.stringify(key)}: ${generatePythonObject(value, imports)}`,\n );\n return `{\\n${entries.join(', \\n')}\\n}`;\n } else {\n throw new Error(`Unsupported type: ${typeof v}`);\n }\n}\n"],"mappings":";AAAA,SAAgB,qBAAqB,GAAY,0BAAU,IAAI,KAAK,EAAU;AAC5E,KAAI,MAAM,KACR,QAAO;UACE,OAAO,MAAM,UACtB,QAAO,IAAI,SAAS;UACX,OAAO,MAAM,SACtB,QAAO,KAAK,UAAU,EAAE;UACf,OAAO,MAAM,SACtB,QAAO,EAAE,UAAU;UACV,MAAM,QAAQ,EAAE,CAEzB,QAAO,IADO,EAAE,KAAK,SAAS,qBAAqB,MAAM,QAAQ,CAAC,CACjD,KAAK,KAAK,CAAC;UACnB,aAAa,MAAM;AAC5B,UAAQ,IAAI,WAAW;AACvB,SAAO,qBAAqB,EAAE,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;YACvJ,OAAO,MAAM,SAItB,QAAO,MAHS,OAAO,QAAQ,EAAE,CAAC,KAC/B,CAAC,KAAK,WAAW,KAAK,KAAK,UAAU,IAAI,CAAC,IAAI,qBAAqB,OAAO,QAAQ,GACpF,CACoB,KAAK,OAAO,CAAC;KAElC,OAAM,IAAI,MAAM,qBAAqB,OAAO,IAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/requests/types.ts"],"sourcesContent":[],"mappings":";;;;KAGY,+DAEJ;iBAEW,eAAe;EAJtB,MAAA,EAKA,aALe;CAEnB,EAAA,GAAA,MAAA;AAE0B,UAKjB,cAAA,CALiB;EAAf,MAAA,EAAA,MAAA;EACP,IAAA,EAOJ,MAPI,CAAA,MAAA,EAAA,OAAA,CAAA;EAAa,KAAA,EAQhB,MARgB,CAAA,MAAA,EAAA,OAAA,CAAA;EAIR,MAAA,EAKP,MALO,CAAA,MAAc,EAAA,OAAA,CAAA;EAGvB,MAAA,EAGE,MAHF,CAAA,MAAA,EAAA,OAAA,CAAA;EACC,IAAA,CAAA,EAAA,OAAA;EACC,aAAA,CAAA,EAAA,MAAA;;AACM,UAMC,WAAA,CAND;EAMC,MAAA,EAAA,MAAW;EAGL,IAAA,EAAf,MAAe,CAAA,MAAA,EAAA,gBAAA,CAAA;EAAf,KAAA,EACC,MADD,CAAA,MAAA,EACgB,wBADhB,CAAA;EACgB,MAAA,EACd,MADc,CAAA,MAAA,EACC,gBADD,CAAA;EAAf,MAAA,EAEC,MAFD,CAAA,MAAA,EAEgB,gBAFhB,CAAA;EACgB,IAAA,CAAA,EAAA,OAAA;EAAf,aAAA,CAAA,EAAA,MAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../src/scalar/client.tsx"],"sourcesContent":["'use client';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { ApiClientModalProvider, useApiClientModal } from '@scalar/api-client-react';\nimport { MethodLabel } from '@/ui/components/method-label';\nimport { useTheme } from 'next-themes';\nimport { useEffect, useState } from 'react';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport '@scalar/api-client-react/style.css';\n\nexport default function ScalarPlayground({\n path,\n method,\n spec,\n}: {\n spec: object;\n path: string;\n method: string;\n}) {\n const { resolvedTheme } = useTheme();\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <div\n className={cn(\n 'flex flex-row items-center gap-2.5 p-3 rounded-xl border bg-fd-card text-fd-card-foreground not-prose',\n mounted ? `${resolvedTheme}-mode` : null,\n )}\n >\n <MethodLabel className=\"text-xs\">{method}</MethodLabel>\n <code className=\"flex-1 overflow-auto text-nowrap text-[0.8125rem] text-fd-muted-foreground\">\n {path}\n </code>\n <ApiClientModalProvider\n configuration={{\n theme: 'moon',\n content: spec,\n }}\n >\n <Trigger path={path} method={method} />\n </ApiClientModalProvider>\n </div>\n );\n}\n\nfunction Trigger({ path, method }: { path: string; method: string }) {\n const client = useApiClientModal();\n\n return (\n <button\n type=\"submit\"\n className={cn(buttonVariants({ color: 'primary', size: 'sm' }), 'px-3 py-1.5')}\n onClick={() => client?.open({ path, method: method as OpenAPIV3_1.HttpMethods })}\n >\n Test\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAUA,SAAwB,iBAAiB,EACvC,MACA,QACA,QAKC;CACD,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;AAE7C,iBAAgB;AACd,aAAW,KAAK;IACf,EAAE,CAAC;AAEN,QACE,qBAAC;EACC,WAAW,GACT,yGACA,UAAU,GAAG,cAAc,SAAS,KACrC;;GAED,oBAAC;IAAY,WAAU;cAAW;KAAqB;GACvD,oBAAC;IAAK,WAAU;cACb;KACI;GACP,oBAAC;IACC,eAAe;KACb,OAAO;KACP,SAAS;KACV;cAED,oBAAC;KAAc;KAAc;MAAU;KAChB;;GACrB;;AAIV,SAAS,QAAQ,EAAE,MAAM,UAA4C;CACnE,MAAM,SAAS,mBAAmB;AAElC,QACE,oBAAC;EACC,MAAK;EACL,WAAW,GAAG,eAAe;GAAE,OAAO;GAAW,MAAM;GAAM,CAAC,EAAE,cAAc;EAC9E,eAAe,QAAQ,KAAK;GAAE;GAAc;GAAmC,CAAC;YACjF;GAEQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/scalar/index.tsx"],"sourcesContent":[],"mappings":";;;;;;;;AAuBA;;iBAAgB,UAAA,WAAoB,uBAA4B"}
|
package/dist/scalar/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/scalar/index.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport type { CreateAPIPageOptions } from '@/ui';\nimport { lazy } from 'react';\n\nconst Client = lazy(() => import('./client'));\n\nfunction APIPlayground({\n path,\n method,\n ctx,\n}: {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n}) {\n return <Client method={method.method} path={path} spec={ctx.schema.bundled} />;\n}\n\n/**\n * Enable Scalar for API playgrounds by wrapping your options inside.\n *\n * Requires `@scalar/api-client-react` to be installed, it imports the styles automatically.\n */\nexport function withScalar(options: CreateAPIPageOptions = {}): CreateAPIPageOptions {\n return {\n ...options,\n playground: {\n ...options.playground,\n render(props) {\n return <APIPlayground {...props} />;\n },\n },\n };\n}\n"],"mappings":";;;;AAIA,MAAM,SAAS,WAAW,OAAO,eAAY;AAE7C,SAAS,cAAc,EACrB,MACA,QACA,OAKC;AACD,QAAO,oBAAC;EAAO,QAAQ,OAAO;EAAc;EAAM,MAAM,IAAI,OAAO;GAAW;;;;;;;AAQhF,SAAgB,WAAW,UAAgC,EAAE,EAAwB;AACnF,QAAO;EACL,GAAG;EACH,YAAY;GACV,GAAG,QAAQ;GACX,OAAO,OAAO;AACZ,WAAO,oBAAC,iBAAc,GAAI,QAAS;;GAEtC;EACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","names":[],"sources":["../../src/server/create.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;AAGoE;KAK/D,SAAA,GAAY,MAAoC,CAAA,MAAA,EAAA,MAAA,GAAZ,WAAA,CAAY,QAAA,GAAW,SAAA,CAAU,QAArB,CAAA;KAChD,kBAAA,GAAqB,MADgD,CAAA,MAAA,EACjC,iBADiC,CAAA;AAAzD,UAGA,cAAA,CAHA;EAAM;AAAA;AAGvB;;;;EAO+C,KAAA,CAAA,EAAA,MAAA,EAAA,GAAA,CAAA,GAAA,GAAnB,SAAmB,GAAP,OAAO,CAAC,SAAD,CAAA,CAAA;EAU9B,YAAA,CAAA,EAAA,OAAa;EACR;;;EAEqB,QAAA,CAAA,EAAA,MAAA;;AACvB,UAJH,aAAA,CAIG;EAAc,WAAA,EAAA,OAHZ,WAGY;EAGlB,UAAA,EAAA,GAAA,GALI,OAKS,CALD,kBAKiC,CAAA;EA6C7C,SAAA,EAAA,CAAA,QAAgB,EAAA,MAAA,EAAA,GAjDG,OAiDH,CAjDW,iBAiDX,CAAA;EAAwC,SAAA,OAAA,EAhDpD,cAgDoD;;AAA3B,iBA7C7B,aAAA,CA6C6B,OAAA,CAAA,EA7CN,cA6CM,CAAA,EA7CgB,aA6ChB;AAAiC,iBAA9D,gBAA8D,CAAA,CAAA,CAAA,CAAA,OAAA,EAAjC,OAAiC,CAAzB,kBAAyB,CAAN,CAAM,CAAA,CAAA,CAAA,EAAA,kBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","names":["schemas"],"sources":["../../src/server/create.tsx"],"sourcesContent":["import { createProxy } from '@/server/proxy';\nimport type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport { processDocument, type ProcessedDocument } from '@/utils/process-document';\nimport type { CodeUsageGenerator } from '@/ui/operation/usage-tabs';\n\n/**\n * schema id -> file path, URL, or downloaded schema object\n */\ntype SchemaMap = Record<string, string | OpenAPIV3_1.Document | OpenAPIV3.Document>;\ntype ProcessedSchemaMap = Record<string, ProcessedDocument>;\n\nexport interface OpenAPIOptions {\n /**\n * Schema files, can be:\n * - URL\n * - file path\n * - a function returning records of downloaded schemas.\n */\n input?: string[] | (() => SchemaMap | Promise<SchemaMap>);\n\n disableCache?: boolean;\n\n /**\n * The url of proxy to avoid CORS issues\n */\n proxyUrl?: string;\n}\n\nexport interface OpenAPIServer {\n createProxy: typeof createProxy;\n getSchemas: () => Promise<ProcessedSchemaMap>;\n getSchema: (document: string) => Promise<ProcessedDocument>;\n readonly options: OpenAPIOptions;\n}\n\nexport function createOpenAPI(options: OpenAPIOptions = {}): OpenAPIServer {\n const { input = [], disableCache = false } = options;\n let schemas: Promise<ProcessedSchemaMap> | undefined;\n\n async function getSchemas() {\n const out: ProcessedSchemaMap = {};\n\n if (Array.isArray(input)) {\n await Promise.all(\n input.map(async (item) => {\n out[item] = await processDocument(item);\n }),\n );\n } else {\n await Promise.all(\n Object.entries(await input()).map(async ([k, v]) => {\n out[k] = await processDocument(v);\n }),\n );\n }\n\n return out;\n }\n\n return {\n options,\n createProxy,\n async getSchema(document) {\n const schemas = await this.getSchemas();\n if (document in schemas) return schemas[document];\n\n console.warn(\n `[Fumadocs OpenAPI] the document \"${document}\" is not listed in the input array, this may not be expected.`,\n );\n // do not cache unlisted documents\n return processDocument(document);\n },\n async getSchemas() {\n if (disableCache) return getSchemas();\n\n return (schemas ??= getSchemas());\n },\n };\n}\n\nexport function createCodeSample<T>(options: Partial<CodeUsageGenerator<T>>): CodeUsageGenerator {\n const { lang = 'unknown', id = lang, ...rest } = options as Partial<CodeUsageGenerator>;\n\n return { id, lang, ...rest };\n}\n"],"mappings":";;;;AAmCA,SAAgB,cAAc,UAA0B,EAAE,EAAiB;CACzE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,UAAU;CAC7C,IAAI;CAEJ,eAAe,aAAa;EAC1B,MAAM,MAA0B,EAAE;AAElC,MAAI,MAAM,QAAQ,MAAM,CACtB,OAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,SAAS;AACxB,OAAI,QAAQ,MAAM,gBAAgB,KAAK;IACvC,CACH;MAED,OAAM,QAAQ,IACZ,OAAO,QAAQ,MAAM,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,OAAO;AAClD,OAAI,KAAK,MAAM,gBAAgB,EAAE;IACjC,CACH;AAGH,SAAO;;AAGT,QAAO;EACL;EACA;EACA,MAAM,UAAU,UAAU;GACxB,MAAMA,YAAU,MAAM,KAAK,YAAY;AACvC,OAAI,YAAYA,UAAS,QAAOA,UAAQ;AAExC,WAAQ,KACN,oCAAoC,SAAS,+DAC9C;AAED,UAAO,gBAAgB,SAAS;;EAElC,MAAM,aAAa;AACjB,OAAI,aAAc,QAAO,YAAY;AAErC,UAAQ,YAAY,YAAY;;EAEnC;;AAGH,SAAgB,iBAAoB,SAA6D;CAC/F,MAAM,EAAE,OAAO,WAAW,KAAK,MAAM,GAAG,SAAS;AAEjD,QAAO;EAAE;EAAI;EAAM,GAAG;EAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","names":[],"sources":["../../src/server/proxy.ts"],"sourcesContent":[],"mappings":";cAAM;KAED,KAAA,GAFkE,QAElE,CAAA,OACW,IADN,CAAA,CAAA,MAAA,CAAA,GAAA,CAAA,GAAA,EAC4B,OAD5B,EAAA,GACwC,OADxC,CACgD,QADhD,CAAA,EACM;UAGN,kBAAA,CAH4B;EAAoB;;;AAAD;;EA2BjC,WAAA,CAAA,EAAA,MAAA,EAAA;EAAY;;;EACW,cAAA,CAAA,EAAA,MAAA,EAAA;EAI/B;;;;;4BAXY;;;;;wBAMJ,YAAY;0BACV,aAAa;;;iBAIvB,WAAA,WAAqB,qBAA0B"}
|
package/dist/server/proxy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","names":[],"sources":["../../src/server/proxy.ts"],"sourcesContent":["const keys = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'] as const;\n\ntype Proxy = {\n [K in (typeof keys)[number]]: (req: Request) => Promise<Response>;\n};\n\ninterface CreateProxyOptions {\n /**\n * Filter by prefixes of request url\n *\n * @deprecated Use `allowedOrigins` for filtering origins, or `filterRequest` for more detailed rules.\n */\n allowedUrls?: string[];\n\n /**\n * List of allowed origins to proxy to.\n */\n allowedOrigins?: string[];\n\n /**\n * Determine if the proxied request is allowed.\n *\n * @returns true if allowed, otherwise forbidden.\n */\n filterRequest?: (request: Request) => boolean;\n\n /**\n * Override proxied request/response with yours\n */\n overrides?: {\n request?: (request: Request) => Request;\n response?: (response: Response) => Response;\n };\n}\n\nexport function createProxy(options: CreateProxyOptions = {}): Proxy {\n const {\n allowedOrigins,\n allowedUrls,\n filterRequest = (req) => {\n return !allowedUrls || allowedUrls.some((item) => req.url.startsWith(item));\n },\n overrides,\n } = options;\n const handlers: Partial<Proxy> = {};\n\n async function handler(req: Request): Promise<Response> {\n const searchParams = new URL(req.url).searchParams;\n const url = searchParams.get('url');\n\n if (!url)\n return Response.json('[Proxy] A `url` query parameter is required for proxy url', {\n status: 400,\n });\n\n const parsedUrl = URL.parse(url);\n if (!parsedUrl)\n return Response.json('[Proxy] Invalid `url` parameter value.', {\n status: 400,\n });\n\n if (allowedOrigins && !allowedOrigins.includes(parsedUrl.origin)) {\n return Response.json(`[Proxy] The origin \"${parsedUrl.origin}\" is not allowed.`, {\n status: 400,\n });\n }\n\n const contentLength = req.headers.get('content-length');\n const hasBody = contentLength && parseInt(contentLength) > 0;\n\n let proxied = new Request(parsedUrl, {\n method: req.method,\n cache: 'no-cache',\n headers: req.headers,\n body:\n hasBody && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(req.method.toUpperCase())\n ? await req.arrayBuffer()\n : undefined,\n });\n\n if (overrides?.request) {\n proxied = overrides.request(proxied);\n }\n\n if (!filterRequest(proxied)) {\n return Response.json('[Proxy] The proxied request is not allowed', {\n status: 403,\n });\n }\n\n proxied.headers.forEach((_value, originalKey) => {\n const key = originalKey.toLowerCase();\n\n if (key === 'origin') {\n proxied.headers.delete(originalKey);\n }\n });\n\n let res = await fetch(proxied).catch((e) => new Error(e.toString()));\n if (res instanceof Error) {\n return Response.json(`[Proxy] Failed to proxy request: ${res.message}`, {\n status: 500,\n });\n }\n\n if (overrides?.response) {\n res = overrides.response(res);\n }\n\n const headers = new Headers(res.headers);\n headers.forEach((_value, originalKey) => {\n const key = originalKey.toLowerCase();\n\n if (key.startsWith('access-control-')) {\n headers.delete(originalKey);\n }\n });\n headers.set('X-Forwarded-Host', res.url);\n\n return new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n }\n\n for (const key of keys) {\n handlers[key] = handler;\n }\n\n return handlers as Proxy;\n}\n"],"mappings":";AAAA,MAAM,OAAO;CAAC;CAAO;CAAQ;CAAO;CAAU;CAAS;CAAO;AAmC9D,SAAgB,YAAY,UAA8B,EAAE,EAAS;CACnE,MAAM,EACJ,gBACA,aACA,iBAAiB,QAAQ;AACvB,SAAO,CAAC,eAAe,YAAY,MAAM,SAAS,IAAI,IAAI,WAAW,KAAK,CAAC;IAE7E,cACE;CACJ,MAAM,WAA2B,EAAE;CAEnC,eAAe,QAAQ,KAAiC;EAEtD,MAAM,MADe,IAAI,IAAI,IAAI,IAAI,CAAC,aACb,IAAI,MAAM;AAEnC,MAAI,CAAC,IACH,QAAO,SAAS,KAAK,6DAA6D,EAChF,QAAQ,KACT,CAAC;EAEJ,MAAM,YAAY,IAAI,MAAM,IAAI;AAChC,MAAI,CAAC,UACH,QAAO,SAAS,KAAK,0CAA0C,EAC7D,QAAQ,KACT,CAAC;AAEJ,MAAI,kBAAkB,CAAC,eAAe,SAAS,UAAU,OAAO,CAC9D,QAAO,SAAS,KAAK,uBAAuB,UAAU,OAAO,oBAAoB,EAC/E,QAAQ,KACT,CAAC;EAGJ,MAAM,gBAAgB,IAAI,QAAQ,IAAI,iBAAiB;EACvD,MAAM,UAAU,iBAAiB,SAAS,cAAc,GAAG;EAE3D,IAAI,UAAU,IAAI,QAAQ,WAAW;GACnC,QAAQ,IAAI;GACZ,OAAO;GACP,SAAS,IAAI;GACb,MACE,WAAW;IAAC;IAAQ;IAAO;IAAS;IAAS,CAAC,SAAS,IAAI,OAAO,aAAa,CAAC,GAC5E,MAAM,IAAI,aAAa,GACvB;GACP,CAAC;AAEF,MAAI,WAAW,QACb,WAAU,UAAU,QAAQ,QAAQ;AAGtC,MAAI,CAAC,cAAc,QAAQ,CACzB,QAAO,SAAS,KAAK,8CAA8C,EACjE,QAAQ,KACT,CAAC;AAGJ,UAAQ,QAAQ,SAAS,QAAQ,gBAAgB;AAG/C,OAFY,YAAY,aAAa,KAEzB,SACV,SAAQ,QAAQ,OAAO,YAAY;IAErC;EAEF,IAAI,MAAM,MAAM,MAAM,QAAQ,CAAC,OAAO,MAAM,IAAI,MAAM,EAAE,UAAU,CAAC,CAAC;AACpE,MAAI,eAAe,MACjB,QAAO,SAAS,KAAK,oCAAoC,IAAI,WAAW,EACtE,QAAQ,KACT,CAAC;AAGJ,MAAI,WAAW,SACb,OAAM,UAAU,SAAS,IAAI;EAG/B,MAAM,UAAU,IAAI,QAAQ,IAAI,QAAQ;AACxC,UAAQ,SAAS,QAAQ,gBAAgB;AAGvC,OAFY,YAAY,aAAa,CAE7B,WAAW,kBAAkB,CACnC,SAAQ,OAAO,YAAY;IAE7B;AACF,UAAQ,IAAI,oBAAoB,IAAI,IAAI;AAExC,SAAO,IAAI,SAAS,IAAI,MAAM;GAC5B,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB;GACD,CAAC;;AAGJ,MAAK,MAAM,OAAO,KAChB,UAAS,OAAO;AAGlB,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"source-api.d.ts","names":[],"sources":["../../src/server/source-api.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;;;IAakE;;;IAOhC,QAAA,CAAA,EAAnB,mBAAmB;EAAA;AAIlC;AAQgB,UARC,mBAAA,CAQgB;EAuCvB,MAAA,CAAA,EAAA,MAAA;EACe,OAAA,CAAA,EAAA,OAAA;;;;;AADiB,iBAvC1B,aAAA,CAAA,CAuC0B,EAvCT,YAuCS;AAU1C,UAVU,eAAA,SAAwB,QAUC,CAAA;EACzB,eAAA,EAAA,GAAA,GAVe,YAUf;EACC,SAAA,EAAA,GAAA,GAAA;IAMG,EAAA,EAAA,MAAA;EAFZ,CAAA,GAdkC,iBAclC;EADC,cAAA,EAZe,cAYf;EAAO,GAAA,EAXH,WAWG,EAAA;AA0DV;;;;iBA/DsB,aAAA,SACZ,yBACC;;IAGR,QACD;;YAEY;;;;;iBAuDE,kBAAA,CAAA,GAAsB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"source-api.js","names":[],"sources":["../../src/server/source-api.tsx"],"sourcesContent":["import { MethodLabel } from '@/ui/components/method-label';\nimport type {\n LoaderPlugin,\n PageData,\n PageTreeTransformer,\n Source,\n VirtualFile,\n} from 'fumadocs-core/source';\nimport type { OpenAPIServer } from '@/server/create';\nimport type { SchemaToPagesOptions } from '@/utils/pages/preset-auto';\nimport type { ApiPageProps } from '@/ui/api-page';\nimport type { StructuredData } from 'fumadocs-core/mdx-plugins';\nimport type { TOCItemType } from 'fumadocs-core/toc';\nimport type { ProcessedDocument } from '@/utils/process-document';\n\ndeclare module 'fumadocs-core/source' {\n export interface PageData {\n /**\n * Added by Fumadocs OpenAPI\n */\n _openapi?: InternalOpenAPIMeta;\n }\n}\n\nexport interface InternalOpenAPIMeta {\n method?: string;\n webhook?: boolean;\n}\n\n/**\n * Fumadocs Source API integration, pass this to `plugins` array in `loader()`.\n */\nexport function openapiPlugin(): LoaderPlugin {\n return {\n name: 'fumadocs:openapi',\n enforce: 'pre',\n transformPageTree: {\n file(node, filePath) {\n if (!filePath) return node;\n const file = this.storage.read(filePath);\n if (!file || file.format !== 'page') return node;\n\n const openApiData = file.data._openapi;\n if (!openApiData || typeof openApiData !== 'object') return node;\n\n if (openApiData.webhook) {\n node.name = (\n <>\n {node.name}{' '}\n <span className=\"ms-auto border border-current px-1 rounded-lg text-xs text-nowrap font-mono\">\n Webhook\n </span>\n </>\n );\n } else if (openApiData.method) {\n node.name = (\n <>\n {node.name}{' '}\n <MethodLabel className=\"ms-auto text-xs text-nowrap\">\n {openApiData.method}\n </MethodLabel>\n </>\n );\n }\n\n return node;\n },\n },\n };\n}\n\ninterface OpenAPIPageData extends PageData {\n getAPIPageProps: () => ApiPageProps;\n getSchema: () => { id: string } & ProcessedDocument;\n structuredData: StructuredData;\n toc: TOCItemType[];\n}\n\n/**\n * Generate virtual pages for Fumadocs Source API\n */\nexport async function openapiSource(\n server: OpenAPIServer,\n options: SchemaToPagesOptions & {\n baseDir?: string;\n } = {},\n): Promise<\n Source<{\n metaData: never;\n pageData: OpenAPIPageData;\n }>\n> {\n const { baseDir = '' } = options;\n const { createAutoPreset } = await import('@/utils/pages/preset-auto');\n const { fromServer } = await import('@/utils/pages/builder');\n const { toBody } = await import('@/utils/pages/to-body');\n const { toStaticData } = await import('@/utils/pages/to-static-data');\n const files: VirtualFile<{\n pageData: OpenAPIPageData;\n metaData: never;\n }>[] = [];\n\n const entries = await fromServer(server, createAutoPreset(options));\n for (const [schemaId, list] of Object.entries(entries)) {\n const processed = await server.getSchema(schemaId);\n for (const entry of list) {\n const props = toBody(entry);\n props.showDescription ??= true;\n\n files.push({\n type: 'page',\n path: `${baseDir}/${entry.path}`,\n data: {\n ...entry.info,\n getAPIPageProps() {\n return props;\n },\n getSchema() {\n return {\n id: schemaId,\n ...processed,\n };\n },\n ...toStaticData(props, processed.dereferenced),\n _openapi: {\n method:\n entry.type === 'operation' || entry.type === 'webhook'\n ? entry.item.method\n : undefined,\n webhook: entry.type === 'webhook',\n },\n },\n });\n }\n }\n\n return {\n files,\n };\n}\n\n/**\n * @deprecated use `openapiPlugin()`\n */\nexport function transformerOpenAPI(): PageTreeTransformer {\n return openapiPlugin().transformPageTree!;\n}\n"],"mappings":";;;;;;;AAgCA,SAAgB,gBAA8B;AAC5C,QAAO;EACL,MAAM;EACN,SAAS;EACT,mBAAmB,EACjB,KAAK,MAAM,UAAU;AACnB,OAAI,CAAC,SAAU,QAAO;GACtB,MAAM,OAAO,KAAK,QAAQ,KAAK,SAAS;AACxC,OAAI,CAAC,QAAQ,KAAK,WAAW,OAAQ,QAAO;GAE5C,MAAM,cAAc,KAAK,KAAK;AAC9B,OAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO;AAE5D,OAAI,YAAY,QACd,MAAK,OACH;IACG,KAAK;IAAM;IACZ,oBAAC;KAAK,WAAU;eAA8E;MAEvF;OACN;YAEI,YAAY,OACrB,MAAK,OACH;IACG,KAAK;IAAM;IACZ,oBAAC;KAAY,WAAU;eACpB,YAAY;MACD;OACb;AAIP,UAAO;KAEV;EACF;;;;;AAaH,eAAsB,cACpB,QACA,UAEI,EAAE,EAMN;CACA,MAAM,EAAE,UAAU,OAAO;CACzB,MAAM,EAAE,qBAAqB,MAAM,OAAO;CAC1C,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,MAAM,EAAE,WAAW,MAAM,OAAO;CAChC,MAAM,EAAE,iBAAiB,MAAM,OAAO;CACtC,MAAM,QAGC,EAAE;CAET,MAAM,UAAU,MAAM,WAAW,QAAQ,iBAAiB,QAAQ,CAAC;AACnE,MAAK,MAAM,CAAC,UAAU,SAAS,OAAO,QAAQ,QAAQ,EAAE;EACtD,MAAM,YAAY,MAAM,OAAO,UAAU,SAAS;AAClD,OAAK,MAAM,SAAS,MAAM;GACxB,MAAM,QAAQ,OAAO,MAAM;AAC3B,SAAM,oBAAoB;AAE1B,SAAM,KAAK;IACT,MAAM;IACN,MAAM,GAAG,QAAQ,GAAG,MAAM;IAC1B,MAAM;KACJ,GAAG,MAAM;KACT,kBAAkB;AAChB,aAAO;;KAET,YAAY;AACV,aAAO;OACL,IAAI;OACJ,GAAG;OACJ;;KAEH,GAAG,aAAa,OAAO,UAAU,aAAa;KAC9C,UAAU;MACR,QACE,MAAM,SAAS,eAAe,MAAM,SAAS,YACzC,MAAM,KAAK,SACX;MACN,SAAS,MAAM,SAAS;MACzB;KACF;IACF,CAAC;;;AAIN,QAAO,EACL,OACD;;;;;AAMH,SAAgB,qBAA0C;AACxD,QAAO,eAAe,CAAC"}
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;KAUY,QAAA,GAAW,WAAA,CAAK;KAChB,eAAA,GAAkB,WAAA,CAAK;KACvB,eAAA,GAAkB,WAAA,CAAK;AAFvB,KAGA,oBAAA,GAAuB,WAAA,CAAK,oBAHJ;AACxB,KAGA,eAAA,GAAkB,WAAA,CAAK,eAHA;AACvB,KAGA,cAAA,GAAiB,WAAA,CAAK,cAHC;AACvB,KAGA,SAAA,GAAY,WAAA,CAAK,SAHG;AACpB,KAGA,YAAA,GAAe,WAAA,CAAK,YAHF;AAClB,KAGA,cAAA,GAAiB,WAAA,CAAK,cAHA;AACtB,KAGA,oBAAA,GAAuB,WAAA,CAAK,oBAHF;AAC1B,KAGA,cAAA,GAAiB,WAAA,CAAK,cAHF;AACpB,KAIA,iBAAA,GAAoB,WAJH,CAIe,eAJV,CAAc,GAAA;EACpC,MAAA,EAAA,MAAA;EACA,eAAA,CAAA,EAIQ,IAJM,CAID,kBAJS,EAAA,IAAA,CAAA,EAAA;EAEtB,sBAAiB,CAAA,EAAA,MAAA;EAAe,uBAAA,CAAA,EAAA,MAAA;CAAZ;AAEP,UAKR,aAAA,SAAsB,IALd,CAKmB,cALnB,EAAA,UAAA,CAAA,EAKgD,oBALhD,CAAA;EAAL,OAAA,EAMT,WANS,CAMG,YANH,CAAA,EAAA;EAAI,OAAA,EAOb,OAPa;EAKP;;;EACN,MAAA,EAMD,iBANC;EACA,aAAA,EAOM,MAPN,CAAA,MAAA,EAOqB,YAPrB,CAAA;EAKD,aAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAOE,cAPF,CAOiB,kBAPjB,CAAA,EAAA,GAQH,SARG;EAEsB,cAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAOI,SAPJ;EAAf,eAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,GAQkC,SARlC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-page.d.ts","names":[],"sources":["../../src/ui/api-page.tsx"],"sourcesContent":[],"mappings":"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"}
|
package/dist/ui/api-page.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-page.js","names":["props"],"sources":["../../src/ui/api-page.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- rehype-react without types */\nimport Slugger from 'github-slugger';\nimport { Operation } from '@/ui/operation';\nimport type { MethodInformation, RenderContext } from '@/types';\nimport { createMethod, type NoReference } from '@/utils/schema';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport { defaultAdapters, MediaAdapter } from '@/requests/media/adapter';\nimport type { FC, ReactNode } from 'react';\nimport {\n highlight,\n type HighlightOptionsCommon,\n type HighlightOptionsThemes,\n} from 'fumadocs-core/highlight';\nimport type { OpenAPIServer } from '@/server';\nimport type { APIPageClientOptions } from './client';\nimport type { CodeUsageGenerator } from './operation/usage-tabs';\nimport { ApiProviderLazy } from './contexts/api.lazy';\nimport { Heading } from 'fumadocs-ui/components/heading';\nimport { rehypeCode, type RehypeCodeOptions } from 'fumadocs-core/mdx-plugins/rehype-code';\nimport { remarkGfm } from 'fumadocs-core/mdx-plugins/remark-gfm';\nimport defaultMdxComponents from 'fumadocs-ui/mdx';\nimport { remark } from 'remark';\nimport remarkRehype from 'remark-rehype';\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport { CodeBlock, Pre } from 'fumadocs-ui/components/codeblock';\nimport type { SchemaUIOptions } from './schema';\nimport type { ResponseTab } from './operation/response-tabs';\nimport type { ExampleRequestItem } from './operation/request-tabs';\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface CreateAPIPageOptions {\n /**\n * Generate TypeScript definitions from response schema.\n *\n * Pass `false` to disable it.\n *\n * @param method - the operation object\n * @param statusCode - status code\n */\n generateTypeScriptSchema?:\n | ((method: NoReference<MethodInformation>, statusCode: string) => Awaitable<string>)\n | false;\n\n /**\n * Generate example code usage for endpoints.\n */\n generateCodeSamples?: (method: MethodInformation) => Awaitable<CodeUsageGenerator[]>;\n\n shikiOptions?: Omit<HighlightOptionsCommon, 'lang' | 'components'> & HighlightOptionsThemes;\n\n /**\n * Show full response schema instead of only example response & Typescript definitions.\n *\n * @default true\n */\n showResponseSchema?: boolean;\n\n /**\n * Support other media types (for server-side generation).\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n\n /**\n * Customise page content\n */\n content?: {\n renderResponseTabs?: (tabs: ResponseTab[], ctx: RenderContext) => Awaitable<ReactNode>;\n\n renderRequestTabs?: (\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n ) => Awaitable<ReactNode>;\n\n renderAPIExampleLayout?: (\n slots: {\n selector: ReactNode;\n usageTabs: ReactNode;\n responseTabs: ReactNode;\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * @param generators - codegens for API example usages\n */\n renderAPIExampleUsageTabs?: (\n generators: CodeUsageGenerator[],\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * renderer of the entire page's layout (containing all operations & webhooks UI)\n */\n renderPageLayout?: (\n slots: {\n operations?: {\n item: OperationItem;\n children: ReactNode;\n }[];\n webhooks?: {\n item: WebhookItem;\n children: ReactNode;\n }[];\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n renderOperationLayout?: (\n slots: {\n header: ReactNode;\n description: ReactNode;\n apiExample: ReactNode;\n apiPlayground: ReactNode;\n\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n },\n ctx: RenderContext,\n method: NoReference<MethodInformation>,\n ) => Awaitable<ReactNode>;\n\n renderWebhookLayout?: (slots: {\n header: ReactNode;\n description: ReactNode;\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n requests: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n }) => Awaitable<ReactNode>;\n };\n\n /**\n * Info UI for JSON schemas\n */\n schemaUI?: {\n render?: (options: SchemaUIOptions, ctx: RenderContext) => Awaitable<ReactNode>;\n\n /**\n * Show examples under the generated content of JSON schemas.\n *\n * @defaultValue false\n */\n showExample?: boolean;\n };\n\n /**\n * Customise API playground\n */\n playground?: {\n /**\n * @defaultValue true\n */\n enabled?: boolean;\n /**\n * replace the server-side renderer\n */\n render?: (props: {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n }) => Awaitable<ReactNode>;\n };\n\n client?: APIPageClientOptions;\n}\n\nexport interface ApiPageProps {\n document: Promise<ProcessedDocument> | string | ProcessedDocument;\n showTitle?: boolean;\n showDescription?: boolean;\n\n /**\n * An array of operations\n */\n operations?: OperationItem[];\n\n webhooks?: WebhookItem[];\n}\n\nexport interface WebhookItem {\n /**\n * webhook name in `webhooks`\n */\n name: string;\n method: OpenAPIV3_1.HttpMethods;\n}\n\nexport interface OperationItem {\n /**\n * the path of operation in `paths`\n */\n path: string;\n /**\n * the HTTP method of operation\n */\n method: OpenAPIV3_1.HttpMethods;\n}\n\nexport function createAPIPage(\n server: OpenAPIServer,\n options: CreateAPIPageOptions = {},\n): FC<ApiPageProps> {\n let processor: ReturnType<typeof createMarkdownProcessor>;\n\n function createMarkdownProcessor() {\n function rehypeReact(this: any) {\n this.compiler = (tree: any, file: any) => {\n return toJsxRuntime(tree, {\n development: false,\n filePath: file.path,\n ...JsxRuntime,\n components: defaultMdxComponents,\n });\n };\n }\n\n return remark()\n .use(remarkGfm)\n .use(remarkRehype)\n .use(rehypeCode, {\n langs: [],\n lazy: true,\n } satisfies Partial<RehypeCodeOptions>)\n .use(rehypeReact);\n }\n\n return async function APIPageWrapper({ document, ...props }) {\n let processed: ProcessedDocument;\n if (typeof document === 'string') {\n processed = await server.getSchema(document);\n } else {\n processed = await document;\n }\n\n const { dereferenced } = processed;\n const servers =\n dereferenced.servers && dereferenced.servers.length > 0\n ? dereferenced.servers\n : [{ url: '/' }];\n\n const slugger = new Slugger();\n\n const ctx: RenderContext = {\n schema: processed,\n proxyUrl: server.options.proxyUrl,\n ...options,\n servers,\n mediaAdapters: {\n ...defaultAdapters,\n ...options.mediaAdapters,\n },\n slugger,\n renderHeading(depth, text, props) {\n const id = slugger.slug(text);\n\n return (\n <Heading id={id} key={id} as={`h${depth}` as `h1`} {...props}>\n {text}\n </Heading>\n );\n },\n async renderMarkdown(text) {\n processor ??= createMarkdownProcessor();\n\n const out = await processor.process({\n value: text,\n });\n\n return out.result as ReactNode;\n },\n async renderCodeBlock(lang, code) {\n const rendered = await highlight(code, {\n lang,\n ...options.shikiOptions,\n components: {\n pre: (props) => <Pre {...props} />,\n },\n });\n\n return <CodeBlock className=\"my-0\">{rendered}</CodeBlock>;\n },\n };\n\n return <APIPage {...props} ctx={ctx} />;\n };\n}\n\nasync function APIPage({\n showTitle: hasHead = false,\n showDescription,\n operations,\n webhooks,\n ctx,\n}: Omit<ApiPageProps, 'document'> & {\n ctx: RenderContext;\n}) {\n const { dereferenced } = ctx.schema;\n let { renderPageLayout } = ctx.content ?? {};\n renderPageLayout ??= (slots) => (\n <div className=\"flex flex-col gap-24 text-sm @container\">\n {slots.operations?.map((op) => op.children)}\n {slots.webhooks?.map((op) => op.children)}\n </div>\n );\n\n const content = await renderPageLayout(\n {\n operations: operations?.map((item) => {\n const pathItem = dereferenced.paths?.[item.path];\n if (!pathItem)\n throw new Error(`[Fumadocs OpenAPI] Path not found in OpenAPI schema: ${item.path}`);\n\n const operation = pathItem[item.method];\n if (!operation)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in operation: ${item.path}`,\n );\n\n const method = createMethod(item.method, pathItem, operation);\n\n return {\n item,\n children: (\n <Operation\n key={`${item.path}:${item.method}`}\n method={method}\n path={item.path}\n ctx={ctx}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n webhooks: webhooks?.map((item) => {\n const webhook = dereferenced.webhooks?.[item.name];\n if (!webhook)\n throw new Error(`[Fumadocs OpenAPI] Webhook not found in OpenAPI schema: ${item.name}`);\n\n const hook = webhook[item.method];\n if (!hook)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in webhook: ${item.name}`,\n );\n\n return {\n item,\n children: (\n <Operation\n type=\"webhook\"\n key={`${item.name}:${item.method}`}\n method={createMethod(item.method, webhook, hook)}\n ctx={ctx}\n path={`/${item.name}`}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n },\n ctx,\n );\n\n return (\n <ApiProviderLazy\n servers={ctx.servers}\n shikiOptions={ctx.shikiOptions}\n client={ctx.client ?? {}}\n >\n {content}\n </ApiProviderLazy>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/ui/client/index.tsx"],"sourcesContent":[],"mappings":";;;;;;UAMiB,oBAAA;eACF;EADE,SAAA,CAAA,EAEH,sBAFuB;EACtB;;;;;AAkBf;AASA;;;;;kBAZkB,eAAe;;UAGhB,sBAAA;uBACM;WACZ;;;;;iBAOK,kBAAA,WAA4B,uBAA4B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/client/index.tsx"],"sourcesContent":["'use client';\nimport type { PlaygroundClientOptions } from '@/playground/client';\nimport type { MediaAdapter } from '@/requests/media/adapter';\nimport type { FC } from 'react';\nimport type { ExampleRequestItem } from '../operation/request-tabs';\n\nexport interface APIPageClientOptions {\n playground?: PlaygroundClientOptions;\n operation?: OperationClientOptions;\n\n /**\n * Set a prefix for `localStorage` keys.\n *\n * Useful when using multiple OpenAPI instances to prevent state conflicts.\n *\n * @defaultValue `fumadocs-openapi-`\n */\n storageKeyPrefix?: string;\n\n /**\n * Support other media types (for client-side serialization)\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n}\n\nexport interface OperationClientOptions {\n APIExampleSelector?: FC<{\n items: ExampleRequestItem[];\n\n value: string | undefined;\n onValueChange: (id: string) => void;\n }>;\n}\n\nexport function defineClientConfig(options: APIPageClientOptions = {}): APIPageClientOptions {\n return options;\n}\n"],"mappings":";;;AAkCA,SAAgB,mBAAmB,UAAgC,EAAE,EAAwB;AAC3F,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage-key.js","names":[],"sources":["../../../src/ui/client/storage-key.ts"],"sourcesContent":["import type { AuthField } from '@/playground/client';\nimport { useApiContext } from '../contexts/api';\nimport { useMemo } from 'react';\n\ntype KeyName = 'server-url' | `auth-${string}`;\n\nexport function useStorageKey() {\n const { storageKeyPrefix } = useApiContext().client;\n\n return useMemo(\n () => ({\n of: (name: KeyName) => getStorageKey(storageKeyPrefix, name),\n AuthField: (field: AuthField) =>\n getStorageKey(storageKeyPrefix, `auth-${field.original?.id ?? field.fieldName}`),\n }),\n [storageKeyPrefix],\n );\n}\n\nexport function getStorageKey(prefix = 'fumadocs-openapi-', name: KeyName) {\n return prefix + name;\n}\n"],"mappings":";;;;AAMA,SAAgB,gBAAgB;CAC9B,MAAM,EAAE,qBAAqB,eAAe,CAAC;AAE7C,QAAO,eACE;EACL,KAAK,SAAkB,cAAc,kBAAkB,KAAK;EAC5D,YAAY,UACV,cAAc,kBAAkB,QAAQ,MAAM,UAAU,MAAM,MAAM,YAAY;EACnF,GACD,CAAC,iBAAiB,CACnB;;AAGH,SAAgB,cAAc,SAAS,qBAAqB,MAAe;AACzE,QAAO,SAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.js","names":[],"sources":["../../../src/ui/components/accordion.tsx"],"sourcesContent":["'use client';\n\nimport * as Primitive from '@radix-ui/react-accordion';\nimport { ChevronRight } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport function Accordions(props: ComponentProps<typeof Primitive.Root>) {\n return <Primitive.Root {...props} className={cn('divide-y divide-fd-border', props.className)} />;\n}\n\nexport function AccordionItem(props: ComponentProps<typeof Primitive.Item>) {\n return (\n <Primitive.Item {...props} className={cn('scroll-m-20', props.className)}>\n {props.children}\n </Primitive.Item>\n );\n}\n\nexport function AccordionContent(props: ComponentProps<typeof Primitive.Content>) {\n return (\n <Primitive.Content\n {...props}\n className={cn(\n 'overflow-hidden data-[state=closed]:animate-fd-accordion-up data-[state=open]:animate-fd-accordion-down',\n props.className,\n )}\n >\n {props.children}\n </Primitive.Content>\n );\n}\n\nexport function AccordionHeader(props: ComponentProps<typeof Primitive.Header>) {\n return (\n <Primitive.Header\n {...props}\n className={cn('not-prose flex py-2 text-fd-foreground font-medium', props.className)}\n >\n {props.children}\n </Primitive.Header>\n );\n}\n\nexport function AccordionTrigger(props: ComponentProps<typeof Primitive.Trigger>) {\n return (\n <Primitive.Trigger\n {...props}\n className={cn(\n 'flex flex-1 items-center gap-1 text-start group/accordion focus-visible:outline-none',\n props.className,\n )}\n >\n <ChevronRight className=\"size-3.5 text-fd-muted-foreground shrink-0 transition-transform group-focus-visible/accordion:text-fd-primary group-data-[state=open]/accordion:rotate-90\" />\n {props.children}\n </Primitive.Trigger>\n );\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,WAAW,OAA8C;AACvE,QAAO,oBAAC,UAAU;EAAK,GAAI;EAAO,WAAW,GAAG,6BAA6B,MAAM,UAAU;GAAI;;AAGnG,SAAgB,cAAc,OAA8C;AAC1E,QACE,oBAAC,UAAU;EAAK,GAAI;EAAO,WAAW,GAAG,eAAe,MAAM,UAAU;YACrE,MAAM;GACQ;;AAIrB,SAAgB,iBAAiB,OAAiD;AAChF,QACE,oBAAC,UAAU;EACT,GAAI;EACJ,WAAW,GACT,2GACA,MAAM,UACP;YAEA,MAAM;GACW;;AAIxB,SAAgB,gBAAgB,OAAgD;AAC9E,QACE,oBAAC,UAAU;EACT,GAAI;EACJ,WAAW,GAAG,sDAAsD,MAAM,UAAU;YAEnF,MAAM;GACU;;AAIvB,SAAgB,iBAAiB,OAAiD;AAChF,QACE,qBAAC,UAAU;EACT,GAAI;EACJ,WAAW,GACT,wFACA,MAAM,UACP;aAED,oBAAC,gBAAa,WAAU,8JAA8J,EACrL,MAAM;GACW"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.js","names":[],"sources":["../../../src/ui/components/dialog.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/30 backdrop-blur-sm data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out',\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-1/2 top-1/2 z-50 flex flex-col gap-4 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 border bg-fd-popover p-4 shadow-lg rounded-xl duration-200 data-[state=open]:animate-fd-dialog-in data-[state=closed]:animate-fd-dialog-out focus-visible:outline-none',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n aria-label=\"Close\"\n className={cn(\n buttonVariants({ size: 'icon-sm', color: 'ghost' }),\n 'absolute end-2 top-2 text-fd-muted-foreground/70',\n )}\n >\n <X />\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col gap-1.5 text-center sm:text-start', className)} {...props} />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-2', className)}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-fd-muted-foreground', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n"],"mappings":";;;;;;;;;;AAQA,MAAM,SAAS,gBAAgB;AAE/B,MAAM,gBAAgB,gBAAgB;AAEtC,MAAM,eAAe,gBAAgB;AAErC,MAAM,cAAc,gBAAgB;AAEpC,MAAM,gBAAgB,MAAM,YAGzB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GACT,gIACA,UACD;CACD,GAAI;EACJ,CACF;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,gBAAgB,MAAM,YAGzB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,qBAAC,2BACC,oBAAC,kBAAgB,EACjB,qBAAC,gBAAgB;CACV;CACL,WAAW,GACT,4QACA,UACD;CACD,GAAI;YAEH,UACD,oBAAC,gBAAgB;EACf,cAAW;EACX,WAAW,GACT,eAAe;GAAE,MAAM;GAAW,OAAO;GAAS,CAAC,EACnD,mDACD;YAED,oBAAC,MAAI;GACiB;EACA,IACb,CACf;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,gBAAgB,EAAE,WAAW,GAAG,YACpC,oBAAC;CAAI,WAAW,GAAG,mDAAmD,UAAU;CAAE,GAAI;EAAS;AAEjG,aAAa,cAAc;AAE3B,MAAM,gBAAgB,EAAE,WAAW,GAAG,YACpC,oBAAC;CACC,WAAW,GAAG,6DAA6D,UAAU;CACrF,GAAI;EACJ;AAEJ,aAAa,cAAc;AAE3B,MAAM,cAAc,MAAM,YAGvB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,qDAAqD,UAAU;CAC7E,GAAI;EACJ,CACF;AACF,YAAY,cAAc,gBAAgB,MAAM;AAEhD,MAAM,oBAAoB,MAAM,YAG7B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,oCAAoC,UAAU;CAC5D,GAAI;EACJ,CACF;AACF,kBAAkB,cAAc,gBAAgB,YAAY"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","names":[],"sources":["../../../src/ui/components/input.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '@/utils/cn';\nimport { cva } from 'class-variance-authority';\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const labelVariants = cva(\n 'text-xs font-medium text-fd-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n);\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-9 w-full rounded-md border bg-fd-secondary px-2 py-1.5 text-[0.8125rem] text-fd-secondary-foreground transition-colors placeholder:text-fd-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-fd-ring disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = 'Input';\n\nexport { Input };\n"],"mappings":";;;;;;AAMA,MAAa,gBAAgB,IAC3B,mGACD;AAED,MAAM,QAAQ,MAAM,YACjB,EAAE,WAAW,MAAM,GAAG,SAAS,QAAQ;AACtC,QACE,oBAAC;EACO;EACN,WAAW,GACT,iSACA,UACD;EACI;EACL,GAAI;GACJ;EAGP;AACD,MAAM,cAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"method-label.js","names":[],"sources":["../../../src/ui/components/method-label.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport type { HTMLAttributes } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport const badgeVariants = cva('font-mono font-medium', {\n variants: {\n color: {\n green: 'text-green-600 dark:text-green-400',\n yellow: 'text-yellow-600 dark:text-yellow-400',\n red: 'text-red-600 dark:text-red-400',\n blue: 'text-blue-600 dark:text-blue-400',\n orange: 'text-orange-600 dark:text-orange-400',\n },\n },\n});\n\nfunction getMethodColor(method: string): VariantProps<typeof badgeVariants>['color'] {\n switch (method.toUpperCase()) {\n case 'PUT':\n return 'yellow';\n case 'PATCH':\n return 'orange';\n case 'POST':\n return 'blue';\n case 'DELETE':\n return 'red';\n default:\n return 'green';\n }\n}\n\nexport function Badge({\n className,\n color,\n ...props\n}: Omit<HTMLAttributes<HTMLSpanElement>, 'color'> & VariantProps<typeof badgeVariants>) {\n return (\n <span\n className={cn(\n badgeVariants({\n color,\n className,\n }),\n )}\n {...props}\n >\n {props.children}\n </span>\n );\n}\n\nexport function MethodLabel({\n children,\n ...props\n}: Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {\n children: string;\n}) {\n return (\n <Badge {...props} color={getMethodColor(children)}>\n {children.toUpperCase()}\n </Badge>\n );\n}\n"],"mappings":";;;;;AAIA,MAAa,gBAAgB,IAAI,yBAAyB,EACxD,UAAU,EACR,OAAO;CACL,OAAO;CACP,QAAQ;CACR,KAAK;CACL,MAAM;CACN,QAAQ;CACT,EACF,EACF,CAAC;AAEF,SAAS,eAAe,QAA6D;AACnF,SAAQ,OAAO,aAAa,EAA5B;EACE,KAAK,MACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAgB,MAAM,EACpB,WACA,OACA,GAAG,SACmF;AACtF,QACE,oBAAC;EACC,WAAW,GACT,cAAc;GACZ;GACA;GACD,CAAC,CACH;EACD,GAAI;YAEH,MAAM;GACF;;AAIX,SAAgB,YAAY,EAC1B,UACA,GAAG,SAGF;AACD,QACE,oBAAC;EAAM,GAAI;EAAO,OAAO,eAAe,SAAS;YAC9C,SAAS,aAAa;GACjB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","names":[],"sources":["../../../src/ui/components/select.tsx"],"sourcesContent":["import * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\nimport React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex items-center w-full rounded-md border p-2 gap-2 text-start text-sm text-fd-secondary-foreground bg-fd-secondary hover:bg-fd-accent focus:outline-none focus:ring focus:ring-fd-ring disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"ms-auto size-3.5 text-fd-muted-foreground shrink-0\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUp className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDown className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position, ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'z-50 overflow-hidden rounded-lg border bg-fd-popover text-fd-popover-foreground shadow-md',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport className=\"p-1\">{children}</SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('py-1.5 pe-2 ps-6 text-sm font-semibold', className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'flex select-none flex-row items-center rounded-md py-1.5 px-2 text-sm outline-none focus:bg-fd-accent focus:text-fd-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator className=\"ms-auto\">\n <Check className=\"size-3.5 text-fd-primary\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('my-1 h-px bg-fd-muted', className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n"],"mappings":";;;;;;;AAKA,MAAM,SAAS,gBAAgB;AAE/B,MAAM,cAAc,gBAAgB;AAEpC,MAAM,cAAc,gBAAgB;AAEpC,MAAM,gBAAgB,YAGnB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,qBAAC,gBAAgB;CACV;CACL,WAAW,GACT,4OACA,UACD;CACD,GAAI;YAEH,UACD,oBAAC,gBAAgB;EAAK;YACpB,oBAAC,eAAY,WAAU,uDAAuD;GACzD;EACC,CAC1B;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,uBAAuB,YAG1B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,yCAAyC,UAAU;CACjE,GAAI;WAEJ,oBAAC,aAAU,WAAU,WAAW;EACD,CACjC;AACF,qBAAqB,cAAc,gBAAgB,eAAe;AAElE,MAAM,yBAAyB,YAG5B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,yCAAyC,UAAU;CACjE,GAAI;WAEJ,oBAAC,eAAY,WAAU,WAAW;EACD,CACnC;AACF,uBAAuB,cAAc,gBAAgB,iBAAiB;AAEtE,MAAM,gBAAgB,YAGnB,EAAE,WAAW,UAAU,UAAU,GAAG,SAAS,QAC9C,oBAAC,gBAAgB,oBACf,qBAAC,gBAAgB;CACV;CACL,WAAW,GACT,6FACA,UACD;CACS;CACV,GAAI;;EAEJ,oBAAC,yBAAuB;EACxB,oBAAC,gBAAgB;GAAS,WAAU;GAAO;IAAoC;EAC/E,oBAAC,2BAAyB;;EACF,GACH,CACzB;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,cAAc,YAGjB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,0CAA0C,UAAU;CAClE,GAAI;EACJ,CACF;AACF,YAAY,cAAc,gBAAgB,MAAM;AAEhD,MAAM,aAAa,YAGhB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,qBAAC,gBAAgB;CACV;CACL,WAAW,GACT,wMACA,UACD;CACD,GAAI;YAEJ,oBAAC,gBAAgB,YAAU,WAAoC,EAC/D,oBAAC,gBAAgB;EAAc,WAAU;YACvC,oBAAC,SAAM,WAAU,6BAA6B;GAChB;EACX,CACvB;AACF,WAAW,cAAc,gBAAgB,KAAK;AAE9C,MAAM,kBAAkB,YAGrB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,yBAAyB,UAAU;CACjD,GAAI;EACJ,CACF;AACF,gBAAgB,cAAc,gBAAgB,UAAU"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":[],"sources":["../../../src/ui/contexts/api.tsx"],"sourcesContent":["'use client';\nimport {\n createContext,\n type ReactNode,\n type RefObject,\n use,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { RenderContext, ServerObject } from '@/types';\nimport { defaultAdapters, type MediaAdapter } from '@/requests/media/adapter';\nimport type { NoReference } from '@/utils/schema';\nimport { useStorageKey } from '../client/storage-key';\n\ntype InheritFromContext = Pick<Required<RenderContext>, 'servers' | 'client'> &\n Pick<RenderContext, 'shikiOptions'>;\n\nexport interface ApiProviderProps extends InheritFromContext {\n /**\n * Base URL for API requests\n */\n defaultBaseUrl?: string;\n}\n\nexport interface SelectedServer {\n url: string;\n variables: Record<string, string>;\n}\n\ninterface ApiContextType extends InheritFromContext {\n /**\n * ref to selected API server (to query)\n */\n serverRef: RefObject<SelectedServer | null>;\n\n mediaAdapters: Record<string, MediaAdapter>;\n}\n\ninterface ServerSelectType {\n server: SelectedServer | null;\n setServer: (value: string) => void;\n setServerVariables: (value: Record<string, string>) => void;\n}\n\nconst ApiContext = createContext<ApiContextType | null>(null);\nconst ServerSelectContext = createContext<ServerSelectType | null>(null);\n\nexport function useApiContext(): ApiContextType {\n const ctx = use(ApiContext);\n if (!ctx) throw new Error('Component must be used under <ApiProvider />');\n\n return ctx;\n}\n\nexport function useServerSelectContext(): ServerSelectType {\n const ctx = use(ServerSelectContext);\n if (!ctx) throw new Error('Component must be used under <ApiProvider />');\n\n return ctx;\n}\n\nexport function ApiProvider({\n defaultBaseUrl,\n children,\n servers,\n shikiOptions,\n client,\n}: ApiProviderProps & { children: ReactNode }) {\n const serverRef = useRef<SelectedServer | null>(null);\n\n return (\n <ApiContext\n value={useMemo(\n () => ({\n serverRef,\n shikiOptions,\n client,\n mediaAdapters: {\n ...defaultAdapters,\n ...client.mediaAdapters,\n },\n servers,\n }),\n [servers, client, shikiOptions],\n )}\n >\n <ServerSelectProvider defaultBaseUrl={defaultBaseUrl}>{children}</ServerSelectProvider>\n </ApiContext>\n );\n}\n\nfunction ServerSelectProvider({\n defaultBaseUrl,\n children,\n}: Pick<ApiProviderProps, 'defaultBaseUrl'> & {\n children: ReactNode;\n}) {\n const { servers, serverRef } = useApiContext();\n const storageKeys = useStorageKey();\n const [server, setServer] = useState<SelectedServer | null>(() => {\n const defaultItem = defaultBaseUrl\n ? servers.find((item) => item.url === defaultBaseUrl)\n : servers[0];\n\n return defaultItem\n ? {\n url: defaultItem.url,\n variables: getDefaultValues(defaultItem),\n }\n : null;\n });\n serverRef.current = server;\n\n useEffect(() => {\n const cached = localStorage.getItem(storageKeys.of('server-url'));\n if (!cached) return;\n\n try {\n const obj = JSON.parse(cached);\n if (!obj || typeof obj !== 'object') return;\n\n setServer(obj);\n } catch {\n // ignore\n }\n }, [storageKeys]);\n\n return (\n <ServerSelectContext\n value={useMemo(\n () => ({\n server,\n setServerVariables(variables) {\n setServer((prev) => {\n if (!prev) return null;\n\n const updated = { ...prev, variables };\n localStorage.setItem(storageKeys.of('server-url'), JSON.stringify(updated));\n return updated;\n });\n },\n setServer(value) {\n const obj = servers.find((item) => item.url === value);\n if (!obj) return;\n\n const result: SelectedServer = {\n url: value,\n variables: getDefaultValues(obj),\n };\n\n localStorage.setItem(storageKeys.of('server-url'), JSON.stringify(result));\n setServer(result);\n },\n }),\n [server, servers, storageKeys],\n )}\n >\n {children}\n </ServerSelectContext>\n );\n}\n\nfunction getDefaultValues(server: NoReference<ServerObject>): Record<string, string> {\n const out: Record<string, string> = {};\n if (!server.variables) return out;\n\n for (const [k, v] of Object.entries(server.variables)) {\n out[k] = v.default;\n }\n\n return out;\n}\n"],"mappings":";;;;;;;;AA8CA,MAAM,aAAa,cAAqC,KAAK;AAC7D,MAAM,sBAAsB,cAAuC,KAAK;AAExE,SAAgB,gBAAgC;CAC9C,MAAM,MAAM,IAAI,WAAW;AAC3B,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+CAA+C;AAEzE,QAAO;;AAGT,SAAgB,yBAA2C;CACzD,MAAM,MAAM,IAAI,oBAAoB;AACpC,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+CAA+C;AAEzE,QAAO;;AAGT,SAAgB,YAAY,EAC1B,gBACA,UACA,SACA,cACA,UAC6C;CAC7C,MAAM,YAAY,OAA8B,KAAK;AAErD,QACE,oBAAC;EACC,OAAO,eACE;GACL;GACA;GACA;GACA,eAAe;IACb,GAAG;IACH,GAAG,OAAO;IACX;GACD;GACD,GACD;GAAC;GAAS;GAAQ;GAAa,CAChC;YAED,oBAAC;GAAqC;GAAiB;IAAgC;GAC5E;;AAIjB,SAAS,qBAAqB,EAC5B,gBACA,YAGC;CACD,MAAM,EAAE,SAAS,cAAc,eAAe;CAC9C,MAAM,cAAc,eAAe;CACnC,MAAM,CAAC,QAAQ,aAAa,eAAsC;EAChE,MAAM,cAAc,iBAChB,QAAQ,MAAM,SAAS,KAAK,QAAQ,eAAe,GACnD,QAAQ;AAEZ,SAAO,cACH;GACE,KAAK,YAAY;GACjB,WAAW,iBAAiB,YAAY;GACzC,GACD;GACJ;AACF,WAAU,UAAU;AAEpB,iBAAgB;EACd,MAAM,SAAS,aAAa,QAAQ,YAAY,GAAG,aAAa,CAAC;AACjE,MAAI,CAAC,OAAQ;AAEb,MAAI;GACF,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,OAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AAErC,aAAU,IAAI;UACR;IAGP,CAAC,YAAY,CAAC;AAEjB,QACE,oBAAC;EACC,OAAO,eACE;GACL;GACA,mBAAmB,WAAW;AAC5B,eAAW,SAAS;AAClB,SAAI,CAAC,KAAM,QAAO;KAElB,MAAM,UAAU;MAAE,GAAG;MAAM;MAAW;AACtC,kBAAa,QAAQ,YAAY,GAAG,aAAa,EAAE,KAAK,UAAU,QAAQ,CAAC;AAC3E,YAAO;MACP;;GAEJ,UAAU,OAAO;IACf,MAAM,MAAM,QAAQ,MAAM,SAAS,KAAK,QAAQ,MAAM;AACtD,QAAI,CAAC,IAAK;IAEV,MAAM,SAAyB;KAC7B,KAAK;KACL,WAAW,iBAAiB,IAAI;KACjC;AAED,iBAAa,QAAQ,YAAY,GAAG,aAAa,EAAE,KAAK,UAAU,OAAO,CAAC;AAC1E,cAAU,OAAO;;GAEpB,GACD;GAAC;GAAQ;GAAS;GAAY,CAC/B;EAEA;GACmB;;AAI1B,SAAS,iBAAiB,QAA2D;CACnF,MAAM,MAA8B,EAAE;AACtC,KAAI,CAAC,OAAO,UAAW,QAAO;AAE9B,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,UAAU,CACnD,KAAI,KAAK,EAAE;AAGb,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.lazy.js","names":[],"sources":["../../../src/ui/contexts/api.lazy.ts"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../utils/lazy';\n\nexport const ApiProviderLazy = wrapLazy(() =>\n import('./api').then((mod) => ({ default: mod.ApiProvider })),\n);\n"],"mappings":";;;;;AAGA,MAAa,kBAAkB,eAC7B,OAAO,YAAS,MAAM,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,CAC9D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../../src/ui/operation/client.tsx"],"sourcesContent":["'use client';\n\nimport { useCopyButton } from 'fumadocs-ui/utils/use-copy-button';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { cn } from '@/utils/cn';\nimport { Check, Copy } from 'lucide-react';\nimport { type ComponentProps, createContext, type ReactNode, use, useMemo, useState } from 'react';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\n\nexport function CopyResponseTypeScript({ code }: { code: string }) {\n const [isChecked, onCopy] = useCopyButton(() => {\n void navigator.clipboard.writeText(code);\n });\n\n return (\n <div className=\"flex items-start justify-between gap-2 bg-fd-card text-fd-card-foreground border rounded-xl p-3 not-prose mb-4 last:mb-0\">\n <div>\n <p className=\"font-medium text-sm mb-2\">TypeScript Definitions</p>\n <p className=\"text-xs text-fd-muted-foreground\">\n Use the response body type in TypeScript.\n </p>\n </div>\n <button\n onClick={onCopy}\n className={cn(\n buttonVariants({\n color: 'secondary',\n className: 'p-2 gap-2',\n size: 'sm',\n }),\n )}\n >\n {isChecked ? <Check className=\"size-3.5\" /> : <Copy className=\"size-3.5\" />}\n Copy\n </button>\n </div>\n );\n}\n\nconst Context = createContext<{\n type: string | null;\n setType: (type: string) => void;\n} | null>(null);\n\nexport function SelectTabs({\n defaultValue,\n children,\n}: {\n defaultValue?: string;\n children: ReactNode;\n}) {\n const [type, setType] = useState<string | null>(defaultValue ?? null);\n\n return <Context value={useMemo(() => ({ type, setType }), [type])}>{children}</Context>;\n}\n\nexport function SelectTab({\n value,\n ...props\n}: ComponentProps<'div'> & {\n value: string;\n}) {\n const ctx = use(Context);\n if (value !== ctx?.type) return;\n\n return <div {...props}>{props.children}</div>;\n}\n\nexport function SelectTabTrigger({\n items,\n className,\n ...props\n}: ComponentProps<typeof SelectTrigger> & {\n items: {\n label: ReactNode;\n value: string;\n }[];\n}) {\n const { type, setType } = use(Context)!;\n\n return (\n <Select value={type ?? ''} onValueChange={setType}>\n <SelectTrigger className={cn('not-prose w-fit min-w-0 *:min-w-0', className)} {...props}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n"],"mappings":";;;;;;;;;;;AAeA,SAAgB,uBAAuB,EAAE,QAA0B;CACjE,MAAM,CAAC,WAAW,UAAU,oBAAoB;AAC9C,EAAK,UAAU,UAAU,UAAU,KAAK;GACxC;AAEF,QACE,qBAAC;EAAI,WAAU;aACb,qBAAC,oBACC,oBAAC;GAAE,WAAU;aAA2B;IAA0B,EAClE,oBAAC;GAAE,WAAU;aAAmC;IAE5C,IACA,EACN,qBAAC;GACC,SAAS;GACT,WAAW,GACT,eAAe;IACb,OAAO;IACP,WAAW;IACX,MAAM;IACP,CAAC,CACH;cAEA,YAAY,oBAAC,SAAM,WAAU,aAAa,GAAG,oBAAC,QAAK,WAAU,aAAa,EAAC;IAErE;GACL;;AAIV,MAAM,UAAU,cAGN,KAAK;AAEf,SAAgB,WAAW,EACzB,cACA,YAIC;CACD,MAAM,CAAC,MAAM,WAAW,SAAwB,gBAAgB,KAAK;AAErE,QAAO,oBAAC;EAAQ,OAAO,eAAe;GAAE;GAAM;GAAS,GAAG,CAAC,KAAK,CAAC;EAAG;GAAmB;;AAGzF,SAAgB,UAAU,EACxB,OACA,GAAG,SAGF;AAED,KAAI,UADQ,IAAI,QAAQ,EACL,KAAM;AAEzB,QAAO,oBAAC;EAAI,GAAI;YAAQ,MAAM;GAAe;;AAG/C,SAAgB,iBAAiB,EAC/B,OACA,WACA,GAAG,SAMF;CACD,MAAM,EAAE,MAAM,YAAY,IAAI,QAAQ;AAEtC,QACE,qBAAC;EAAO,OAAO,QAAQ;EAAI,eAAe;aACxC,oBAAC;GAAc,WAAW,GAAG,qCAAqC,UAAU;GAAE,GAAI;aAChF,oBAAC,gBAAc;IACD,EAChB,oBAAC,2BACE,MAAM,KAAK,EAAE,OAAO,YACnB,oBAAC;GAA8B;aAC5B;KADc,MAEJ,CACb,GACY;GACT"}
|