fumadocs-openapi 10.6.0 → 10.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/generated/shared.css +21 -2
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/playground/client.d.ts +8 -6
- package/dist/playground/client.d.ts.map +1 -1
- package/dist/playground/client.js +22 -20
- package/dist/playground/client.js.map +1 -1
- package/dist/playground/fetcher.d.ts +20 -1
- package/dist/playground/fetcher.d.ts.map +1 -1
- package/dist/playground/fetcher.js +28 -24
- package/dist/playground/fetcher.js.map +1 -1
- package/dist/playground/index.d.ts +3 -3
- package/dist/playground/index.d.ts.map +1 -1
- package/dist/playground/index.js +3 -3
- package/dist/playground/index.js.map +1 -1
- package/dist/playground/schema.d.ts +1 -0
- package/dist/playground/schema.d.ts.map +1 -1
- package/dist/requests/generators/curl.js +2 -2
- package/dist/requests/generators/curl.js.map +1 -1
- package/dist/requests/generators/go.js +5 -5
- package/dist/requests/generators/go.js.map +1 -1
- package/dist/requests/generators/java.js +13 -13
- package/dist/requests/generators/java.js.map +1 -1
- package/dist/requests/generators/javascript.js +2 -2
- package/dist/requests/generators/javascript.js.map +1 -1
- package/dist/requests/string-utils.js +4 -3
- package/dist/requests/string-utils.js.map +1 -1
- package/dist/server/create.d.ts +1 -1
- package/dist/server/proxy.d.ts +5 -2
- package/dist/server/proxy.d.ts.map +1 -1
- package/dist/server/proxy.js +41 -31
- package/dist/server/proxy.js.map +1 -1
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/api-page.d.ts +0 -1
- package/dist/ui/api-page.d.ts.map +1 -1
- package/dist/ui/api-page.js +2 -3
- package/dist/ui/api-page.js.map +1 -1
- package/dist/ui/base.d.ts +3 -3
- package/dist/ui/base.js +9 -0
- package/dist/ui/base.js.map +1 -1
- package/dist/ui/client/boundary.d.ts +12 -0
- package/dist/ui/client/boundary.d.ts.map +1 -0
- package/dist/ui/client/boundary.js +19 -0
- package/dist/ui/client/boundary.js.map +1 -0
- package/dist/ui/client/boundary.lazy.js +20 -0
- package/dist/ui/client/boundary.lazy.js.map +1 -0
- package/dist/ui/client/index.d.ts +1 -1
- package/dist/ui/components/codeblock.d.ts +2 -2
- package/dist/ui/components/codeblock.d.ts.map +1 -1
- package/dist/ui/contexts/api.d.ts +27 -0
- package/dist/ui/contexts/api.d.ts.map +1 -0
- package/dist/ui/create-client.d.ts.map +1 -1
- package/dist/ui/create-client.js +2 -0
- package/dist/ui/create-client.js.map +1 -1
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/operation/index.js +1 -2
- package/dist/ui/operation/index.js.map +1 -1
- package/dist/ui/operation/usage-tabs/client.d.ts +15 -0
- package/dist/ui/operation/usage-tabs/client.d.ts.map +1 -0
- package/dist/ui/operation/usage-tabs/index.js +2 -3
- package/dist/ui/operation/usage-tabs/index.js.map +1 -1
- package/dist/ui/schema/client.d.ts +8 -1
- package/dist/ui/schema/client.d.ts.map +1 -1
- package/dist/ui/schema/client.js +17 -6
- package/dist/ui/schema/client.js.map +1 -1
- package/dist/ui/schema/index.d.ts +0 -1
- package/dist/ui/schema/index.d.ts.map +1 -1
- package/dist/ui/schema/index.js +19 -10
- package/dist/ui/schema/index.js.map +1 -1
- package/package.json +7 -8
- package/dist/playground/lazy.js +0 -8
- package/dist/playground/lazy.js.map +0 -1
- package/dist/ui/contexts/api.lazy.js +0 -9
- package/dist/ui/contexts/api.lazy.js.map +0 -1
- package/dist/ui/operation/usage-tabs/lazy.js +0 -9
- package/dist/ui/operation/usage-tabs/lazy.js.map +0 -1
- package/dist/ui/schema/lazy.js +0 -8
- package/dist/ui/schema/lazy.js.map +0 -1
- package/dist/utils/lazy.js +0 -13
- package/dist/utils/lazy.js.map +0 -1
package/dist/ui/schema/client.js
CHANGED
|
@@ -35,7 +35,7 @@ function SchemaUIProperty({ name, $type, variant = "default", overrides, objectS
|
|
|
35
35
|
const { refs } = useData();
|
|
36
36
|
const schema = refs[$type];
|
|
37
37
|
const renderRef = useRenderRef();
|
|
38
|
-
let type = schema.
|
|
38
|
+
let type = schema.aliasName;
|
|
39
39
|
if ((schema.type === "or" || schema.type === "and") && schema.items.length > 0) {
|
|
40
40
|
if (variant === "expand") return /* @__PURE__ */ jsxs(Tabs, {
|
|
41
41
|
defaultValue: schema.items[0].$type,
|
|
@@ -44,7 +44,6 @@ function SchemaUIProperty({ name, $type, variant = "default", overrides, objectS
|
|
|
44
44
|
children: item.name
|
|
45
45
|
}, item.$type)) }), schema.items.map((item) => /* @__PURE__ */ jsx(TabsContent, {
|
|
46
46
|
value: item.$type,
|
|
47
|
-
forceMount: void 0,
|
|
48
47
|
className: "pt-2 pb-0",
|
|
49
48
|
children: /* @__PURE__ */ jsx(SchemaUIProperty, {
|
|
50
49
|
...item,
|
|
@@ -54,7 +53,8 @@ function SchemaUIProperty({ name, $type, variant = "default", overrides, objectS
|
|
|
54
53
|
});
|
|
55
54
|
type = renderRef({
|
|
56
55
|
pathName: name,
|
|
57
|
-
$ref: $type
|
|
56
|
+
$ref: $type,
|
|
57
|
+
text: schema.aliasName
|
|
58
58
|
});
|
|
59
59
|
} else if (schema.type === "object" && schema.props.length > 0) {
|
|
60
60
|
if (variant === "expand") return /* @__PURE__ */ jsx(ObjectSearch, {
|
|
@@ -63,13 +63,15 @@ function SchemaUIProperty({ name, $type, variant = "default", overrides, objectS
|
|
|
63
63
|
});
|
|
64
64
|
type = renderRef({
|
|
65
65
|
pathName: name,
|
|
66
|
-
$ref: $type
|
|
66
|
+
$ref: $type,
|
|
67
|
+
text: schema.aliasName
|
|
67
68
|
});
|
|
68
69
|
} else if (schema.type === "array") {
|
|
69
70
|
if (variant === "expand") return /* @__PURE__ */ jsx(ArrayItemCollapsible, { schema });
|
|
70
71
|
type = renderRef({
|
|
71
72
|
pathName: name,
|
|
72
|
-
$ref: $type
|
|
73
|
+
$ref: $type,
|
|
74
|
+
text: schema.aliasName
|
|
73
75
|
});
|
|
74
76
|
}
|
|
75
77
|
const child = /* @__PURE__ */ jsxs(Fragment$1, { children: [schema.description, schema.infoTags && schema.infoTags.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
@@ -253,6 +255,10 @@ function useRenderRef() {
|
|
|
253
255
|
const { renderTrigger } = usePopover();
|
|
254
256
|
return function renderRef({ pathName, $ref, text }) {
|
|
255
257
|
const schema = refs[$ref];
|
|
258
|
+
if (!isExpandable(schema)) return /* @__PURE__ */ jsx("span", {
|
|
259
|
+
className: cn(typeVariants()),
|
|
260
|
+
children: text
|
|
261
|
+
});
|
|
256
262
|
if (schema.type === "and" || schema.type === "or") {
|
|
257
263
|
const sep = schema.type === "and" ? "&" : "|";
|
|
258
264
|
return /* @__PURE__ */ jsx("span", {
|
|
@@ -270,6 +276,7 @@ function useRenderRef() {
|
|
|
270
276
|
"array<",
|
|
271
277
|
renderRef({
|
|
272
278
|
pathName: /* @__PURE__ */ jsxs(Fragment$1, { children: [pathName, "[]"] }),
|
|
279
|
+
text: refs[schema.item.$type].aliasName,
|
|
273
280
|
$ref: schema.item.$type
|
|
274
281
|
}),
|
|
275
282
|
">"
|
|
@@ -278,7 +285,7 @@ function useRenderRef() {
|
|
|
278
285
|
return renderTrigger({
|
|
279
286
|
$ref,
|
|
280
287
|
pathName,
|
|
281
|
-
children: text
|
|
288
|
+
children: text
|
|
282
289
|
});
|
|
283
290
|
};
|
|
284
291
|
}
|
|
@@ -344,6 +351,10 @@ function Property({ name, type, required, deprecated, nested = false, className,
|
|
|
344
351
|
})]
|
|
345
352
|
});
|
|
346
353
|
}
|
|
354
|
+
function isExpandable(data) {
|
|
355
|
+
if (data.type !== "primitive") return true;
|
|
356
|
+
return Boolean(data.description || data.infoTags && data.infoTags.length > 0);
|
|
357
|
+
}
|
|
347
358
|
//#endregion
|
|
348
359
|
export { SchemaUI };
|
|
349
360
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../../src/ui/schema/client.tsx"],"sourcesContent":["'use client';\nimport {\n type ComponentProps,\n createContext,\n Fragment,\n type ReactNode,\n type RefObject,\n Suspense,\n use,\n useCallback,\n useDeferredValue,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from 'fumadocs-ui/components/tabs';\nimport { useTranslations } from '@/ui/client/i18n';\nimport type {\n InfoTag,\n SchemaData,\n SchemaDataObjectProperty,\n SchemaUIGeneratedData,\n} from '@/ui/schema';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from 'fumadocs-ui/components/ui/collapsible';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { ChevronDown, FilterIcon } from 'lucide-react';\nimport { Badge } from '@/ui/components/method-label';\nimport { Popover, PopoverContent, PopoverTrigger } from 'fumadocs-ui/components/ui/popover';\nimport { cn } from '@/utils/cn';\nimport { cva } from 'class-variance-authority';\n\ntype DataContextType = SchemaUIGeneratedData;\n\ninterface PopoverContextType {\n renderTrigger: (props: { pathName: ReactNode; $ref: string; children: ReactNode }) => ReactNode;\n}\n\nconst typeVariants = cva('text-sm text-start text-fd-muted-foreground font-mono', {\n variants: {\n variant: {\n trigger:\n 'underline hover:text-fd-accent-foreground data-[state=open]:text-fd-accent-foreground',\n },\n },\n});\n\nconst PopoverContext = createContext<PopoverContextType>({\n renderTrigger: (props) => <RootPopoverTrigger {...props} />,\n});\n\nconst DataContext = createContext<DataContextType | null>(null);\n\nfunction useData() {\n return use(DataContext)!;\n}\n\nfunction usePopover() {\n return use(PopoverContext);\n}\n\nexport interface SchemaUIProps {\n name: string;\n required?: boolean;\n as?: 'property' | 'body';\n\n generated: SchemaUIGeneratedData;\n}\n\nexport function SchemaUI({ name, required = false, as = 'property', generated }: SchemaUIProps) {\n return (\n <DataContext value={generated}>\n <SchemaUIProperty\n name={name}\n $type={generated.$root}\n overrides={{\n required,\n }}\n variant={\n as === 'property' || generated.refs[generated.$root].type === 'primitive'\n ? 'default'\n : 'expand'\n }\n />\n </DataContext>\n );\n}\n\nfunction SchemaUIProperty({\n name,\n $type,\n variant = 'default',\n overrides,\n objectSearchOverrides,\n}: {\n name: ReactNode;\n $type: string;\n variant?: 'default' | 'expand';\n overrides?: Partial<PropertyProps>;\n objectSearchOverrides?: Partial<ObjectSearchProps>;\n}) {\n const { refs } = useData();\n const schema = refs[$type];\n const renderRef = useRenderRef();\n let type: ReactNode = schema.typeName;\n\n if ((schema.type === 'or' || schema.type === 'and') && schema.items.length > 0) {\n if (variant === 'expand')\n return (\n <Tabs defaultValue={schema.items[0].$type}>\n <TabsList>\n {schema.items.map((item) => (\n <TabsTrigger key={item.$type} value={item.$type}>\n {item.name}\n </TabsTrigger>\n ))}\n </TabsList>\n {schema.items.map((item) => (\n <TabsContent\n key={item.$type}\n value={item.$type}\n forceMount={undefined}\n className=\"pt-2 pb-0\"\n >\n <SchemaUIProperty {...item} variant=\"expand\" />\n </TabsContent>\n ))}\n </Tabs>\n );\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n } else if (schema.type === 'object' && schema.props.length > 0) {\n if (variant === 'expand')\n return <ObjectSearch properties={schema.props} {...objectSearchOverrides} />;\n\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n } else if (schema.type === 'array') {\n if (variant === 'expand') return <ArrayItemCollapsible schema={schema} />;\n\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n }\n\n const child = (\n <>\n {schema.description}\n {schema.infoTags && schema.infoTags.length > 0 && (\n <div className=\"flex flex-row gap-2 flex-wrap my-2 not-prose empty:hidden\">\n {schema.infoTags.map((tag, i) => (\n <InfoTag key={i} tag={tag} />\n ))}\n </div>\n )}\n </>\n );\n if (variant === 'expand') return child;\n return (\n <Property name={name} type={type} deprecated={schema.deprecated} {...overrides}>\n {child}\n </Property>\n );\n}\n\nfunction ArrayItemCollapsible({ schema }: { schema: Extract<SchemaData, { type: 'array' }> }) {\n const [open, setOpen] = useState(false);\n const t = useTranslations();\n\n return (\n <Collapsible className=\"my-2\" open={open} onOpenChange={setOpen}>\n <CollapsibleTrigger\n className={cn(\n buttonVariants({ color: 'secondary', size: 'sm' }),\n 'group px-3 py-2 data-[state=open]:rounded-b-none',\n )}\n >\n {open ? t.schemaHideArray : t.schemaShowArray}\n <ChevronDown className=\"size-4 text-fd-muted-foreground group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"-mt-px bg-fd-card px-3 rounded-lg rounded-tl-none border shadow-sm\">\n <SchemaUIProperty name=\"\" $type={schema.item.$type} variant=\"expand\" />\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\ninterface ObjectSearchProps {\n properties: SchemaDataObjectProperty[];\n container?: ComponentProps<'div'>;\n open?: (item: SchemaDataObjectProperty) => void;\n}\n\nfunction ObjectSearch({ properties, container, open }: ObjectSearchProps) {\n const [search, setSearch] = useState('');\n const deferredValue = useDeferredValue(search);\n const firstItemRef = useRef<SchemaDataObjectProperty>(null);\n const prevProperties = useRef(properties);\n const t = useTranslations();\n\n if (prevProperties.current !== properties) {\n prevProperties.current = properties;\n setSearch('');\n }\n\n return (\n <>\n <div\n {...container}\n className={cn(\n 'flex items-center border my-2 rounded-md bg-fd-secondary text-fd-secondary-foreground transition-colors shadow-sm focus-within:ring-2 focus-within:ring-fd-ring',\n container?.className,\n )}\n >\n <FilterIcon className=\"text-fd-muted-foreground ms-2 size-3.5\" />\n <input\n value={search}\n data-object-search-input=\"\"\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t.schemaFilterPropertiesPlaceholder}\n className=\"text-sm ps-2 py-2 flex-1 outline-none placeholder:text-fd-muted-foreground\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && open) {\n if (firstItemRef.current) open(firstItemRef.current);\n e.preventDefault();\n }\n }}\n />\n </div>\n <Suspense>\n <ObjectSearchContent\n search={deferredValue}\n properties={properties}\n firstItemRef={firstItemRef}\n />\n </Suspense>\n </>\n );\n}\n\nfunction ObjectSearchContent({\n search: rawSearch,\n firstItemRef,\n properties,\n}: {\n search: string;\n firstItemRef: RefObject<SchemaDataObjectProperty | null>;\n properties: SchemaDataObjectProperty[];\n}) {\n const t = useTranslations();\n const filtered = useMemo(() => {\n const search = rawSearch.trim().toLowerCase();\n return search.length > 0\n ? properties.filter((prop) => prop.name.toLowerCase().includes(search))\n : properties;\n }, [properties, rawSearch]);\n\n firstItemRef.current = filtered.length > 0 ? filtered[0] : null;\n\n if (filtered.length === 0)\n return (\n <p className=\"text-fd-muted-foreground text-sm px-2\">\n {t.schemaFilterPropertiesEmpty}{' '}\n <span className=\"text-fd-foreground font-medium\">{`\"${rawSearch}\"`}</span>\n </p>\n );\n\n return filtered.map((prop) => (\n <SchemaUIProperty\n key={prop.name}\n name={prop.name}\n $type={prop.$type}\n overrides={{ required: prop.required }}\n />\n ));\n}\n\nfunction InfoTag({ tag }: { tag: InfoTag }) {\n const ref = useRef<HTMLElement>(null);\n const [isTruncated, setTruncated] = useState(false);\n const [open, setOpen] = useState(false);\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n // assume the tag width will never change\n setTruncated(element.scrollWidth !== element.offsetWidth);\n }, []);\n\n return (\n <div className=\"flex flex-row items-start gap-2 bg-fd-secondary border rounded-lg text-xs p-1.5 shadow-md max-w-full\">\n <span className=\"font-medium\">{tag.label}</span>\n <code\n ref={ref}\n className={cn(\n 'min-w-0 flex-1 text-fd-muted-foreground',\n open ? 'wrap-break-word' : 'truncate',\n )}\n >\n {tag.value}\n </code>\n {isTruncated && (\n <button\n className={cn(buttonVariants({ size: 'icon-xs', variant: 'ghost' }))}\n onClick={() => setOpen((prev) => !prev)}\n >\n <ChevronDown />\n </button>\n )}\n </div>\n );\n}\n\ninterface PathItemType {\n name: ReactNode;\n $ref?: string;\n scrollTop?: number;\n}\n\nfunction SchemaUIPopover({\n containerRef,\n initialPath,\n}: {\n containerRef: RefObject<HTMLDivElement | null>;\n initialPath: PathItemType[];\n}) {\n const [path, setPath] = useState(initialPath);\n\n useLayoutEffect(() => {\n const last = path[0];\n const element = containerRef.current;\n if (!element || !last || !element.parentElement) return;\n\n // recover scroll\n element.parentElement.scrollTop = last.scrollTop ?? 0;\n return () => {\n if (element.parentElement) last.scrollTop = element.parentElement.scrollTop;\n };\n }, [containerRef, path]);\n\n const context: PopoverContextType = useMemo(\n () => ({\n renderTrigger: ({ $ref, pathName, children }) => (\n <button\n className={cn(typeVariants({ variant: 'trigger' }))}\n onClick={() => setPath((path) => [...path, { name: pathName, $ref }])}\n >\n {children}\n </button>\n ),\n }),\n [],\n );\n\n const currentRef = path.findLast((item) => item.$ref !== undefined);\n\n return (\n <>\n <div className=\"sticky top-0 -mx-2 flex flex-row flex-wrap items-center text-sm font-medium font-mono bg-fd-popover px-2 h-8 border-b\">\n {path.map((item, i) => {\n const isDuplicated = path.some((other, j) => j < i && other.$ref === item.$ref);\n const className = cn(\n isDuplicated && 'text-orange-400',\n item.$ref && 'hover:underline hover:text-fd-accent-foreground',\n );\n const node = item.$ref ? (\n <button onClick={() => setPath((path) => path.slice(0, i + 1))} className={className}>\n {item.name}\n </button>\n ) : (\n <span className={className}>{item.name}</span>\n );\n\n return (\n <Fragment key={i}>\n {i > 0 && '.'}\n {node}\n </Fragment>\n );\n })}\n </div>\n <PopoverContext value={context}>\n {currentRef?.$ref && (\n <SchemaUIProperty\n name=\"\"\n $type={currentRef.$ref}\n variant=\"expand\"\n objectSearchOverrides={{\n container: {\n className: 'sticky top-10',\n },\n open(item) {\n setPath((path) => [...path, { name: item.name, $ref: item.$type }]);\n },\n }}\n />\n )}\n </PopoverContext>\n </>\n );\n}\n\nfunction useRenderRef() {\n const { refs } = useData();\n const { renderTrigger } = usePopover();\n return function renderRef({\n pathName,\n $ref,\n text,\n }: {\n pathName: ReactNode;\n $ref: string;\n text?: ReactNode;\n }) {\n const schema = refs[$ref];\n\n if (schema.type === 'and' || schema.type === 'or') {\n const sep = schema.type === 'and' ? '&' : '|';\n return (\n <span className={cn(typeVariants(), 'flex flex-row gap-2 items-center flex-wrap')}>\n {schema.items.map((item, i) => (\n <Fragment key={item.$type}>\n {i > 0 && <span>{sep}</span>}\n {renderRef({ pathName, text: item.name, $ref: item.$type })}\n </Fragment>\n ))}\n </span>\n );\n }\n\n if (schema.type === 'array') {\n return (\n <span className={cn(typeVariants(), 'flex flex-row items-center flex-wrap')}>\n {'array<'}\n {renderRef({ pathName: <>{pathName}[]</>, $ref: schema.item.$type })}\n {'>'}\n </span>\n );\n }\n\n return renderTrigger({ $ref, pathName, children: text ?? schema.aliasName });\n };\n}\n\nfunction RootPopoverTrigger({\n $ref,\n pathName,\n children,\n}: {\n pathName: ReactNode;\n $ref: string;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const refCallback = useCallback((element: HTMLDivElement | null) => {\n ref.current = element;\n if (!element || element.style.getPropertyValue('--initial-height')) return;\n\n element.style.setProperty('--initial-height', `${element.clientHeight + 2}px`);\n }, []);\n\n return (\n <Popover>\n <PopoverTrigger className={cn(typeVariants({ variant: 'trigger' }))}>\n {children}\n </PopoverTrigger>\n <PopoverContent\n ref={refCallback}\n onOpenAutoFocus={(e) => {\n if (!ref.current) return;\n const input = ref.current.querySelector('input[data-object-search-input]');\n if (!(input instanceof HTMLInputElement)) return;\n input.focus({ preventScroll: true });\n e.preventDefault();\n }}\n className=\"w-[600px] min-h-(--initial-height,0) max-h-[460px] px-2 py-0\"\n >\n <SchemaUIPopover\n containerRef={ref}\n initialPath={[\n {\n name: pathName,\n $ref: $ref,\n },\n ]}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface PropertyProps {\n name: ReactNode;\n type: ReactNode;\n required?: boolean;\n deprecated?: boolean;\n nested?: boolean;\n\n children?: ReactNode;\n className?: string;\n}\n\nfunction Property({\n name,\n type,\n required,\n deprecated,\n nested = false,\n className,\n ...props\n}: PropertyProps) {\n const t = useTranslations();\n return (\n <div\n className={cn(\n 'text-sm border-t',\n nested\n ? 'p-3 border-x bg-fd-card last:rounded-b-xl first:rounded-tr-xl last:border-b'\n : 'py-4 first:border-t-0',\n className,\n )}\n >\n <div className=\"flex flex-wrap items-center gap-3 not-prose\">\n <span className=\"font-medium font-mono text-fd-primary\">\n {name}\n {required ? (\n <span className=\"text-red-400\">*</span>\n ) : (\n <span className=\"text-fd-muted-foreground\">?</span>\n )}\n </span>\n {typeof type === 'string' ? (\n <span className=\"text-sm font-mono text-fd-muted-foreground\">{type}</span>\n ) : (\n type\n )}\n {deprecated && (\n <Badge color=\"yellow\" className=\"ms-auto text-xs\">\n {t.deprecated}\n </Badge>\n )}\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">{props.children}</div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../../../src/ui/schema/client.tsx"],"sourcesContent":["'use client';\nimport {\n type ComponentProps,\n createContext,\n Fragment,\n type ReactNode,\n type RefObject,\n Suspense,\n use,\n useCallback,\n useDeferredValue,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from 'fumadocs-ui/components/tabs';\nimport { useTranslations } from '@/ui/client/i18n';\nimport type {\n InfoTag,\n SchemaData,\n SchemaDataObjectProperty,\n SchemaUIGeneratedData,\n} from '@/ui/schema';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from 'fumadocs-ui/components/ui/collapsible';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { ChevronDown, FilterIcon } from 'lucide-react';\nimport { Badge } from '@/ui/components/method-label';\nimport { Popover, PopoverContent, PopoverTrigger } from 'fumadocs-ui/components/ui/popover';\nimport { cn } from '@/utils/cn';\nimport { cva } from 'class-variance-authority';\n\ntype DataContextType = SchemaUIGeneratedData;\n\ninterface PopoverContextType {\n renderTrigger: (props: { pathName: ReactNode; $ref: string; children: ReactNode }) => ReactNode;\n}\n\nconst typeVariants = cva('text-sm text-start text-fd-muted-foreground font-mono', {\n variants: {\n variant: {\n trigger:\n 'underline hover:text-fd-accent-foreground data-[state=open]:text-fd-accent-foreground',\n },\n },\n});\n\nconst PopoverContext = createContext<PopoverContextType>({\n renderTrigger: (props) => <RootPopoverTrigger {...props} />,\n});\n\nconst DataContext = createContext<DataContextType | null>(null);\n\nfunction useData() {\n return use(DataContext)!;\n}\n\nfunction usePopover() {\n return use(PopoverContext);\n}\n\nexport interface SchemaUIProps {\n name: string;\n required?: boolean;\n as?: 'property' | 'body';\n\n generated: SchemaUIGeneratedData;\n}\n\nexport function SchemaUI({ name, required = false, as = 'property', generated }: SchemaUIProps) {\n return (\n <DataContext value={generated}>\n <SchemaUIProperty\n name={name}\n $type={generated.$root}\n overrides={{\n required,\n }}\n variant={\n as === 'property' || generated.refs[generated.$root].type === 'primitive'\n ? 'default'\n : 'expand'\n }\n />\n </DataContext>\n );\n}\n\nfunction SchemaUIProperty({\n name,\n $type,\n variant = 'default',\n overrides,\n objectSearchOverrides,\n}: {\n name: ReactNode;\n $type: string;\n variant?: 'default' | 'expand';\n overrides?: Partial<PropertyProps>;\n objectSearchOverrides?: Partial<ObjectSearchProps>;\n}) {\n const { refs } = useData();\n const schema = refs[$type];\n const renderRef = useRenderRef();\n let type: ReactNode = schema.aliasName;\n\n if ((schema.type === 'or' || schema.type === 'and') && schema.items.length > 0) {\n if (variant === 'expand')\n return (\n <Tabs defaultValue={schema.items[0].$type}>\n <TabsList>\n {schema.items.map((item) => (\n <TabsTrigger key={item.$type} value={item.$type}>\n {item.name}\n </TabsTrigger>\n ))}\n </TabsList>\n {schema.items.map((item) => (\n <TabsContent key={item.$type} value={item.$type} className=\"pt-2 pb-0\">\n <SchemaUIProperty {...item} variant=\"expand\" />\n </TabsContent>\n ))}\n </Tabs>\n );\n type = renderRef({\n pathName: name,\n $ref: $type,\n text: schema.aliasName,\n });\n } else if (schema.type === 'object' && schema.props.length > 0) {\n if (variant === 'expand')\n return <ObjectSearch properties={schema.props} {...objectSearchOverrides} />;\n\n type = renderRef({\n pathName: name,\n $ref: $type,\n text: schema.aliasName,\n });\n } else if (schema.type === 'array') {\n if (variant === 'expand') return <ArrayItemCollapsible schema={schema} />;\n\n type = renderRef({\n pathName: name,\n $ref: $type,\n text: schema.aliasName,\n });\n }\n\n const child = (\n <>\n {schema.description}\n {schema.infoTags && schema.infoTags.length > 0 && (\n <div className=\"flex flex-row gap-2 flex-wrap my-2 not-prose empty:hidden\">\n {schema.infoTags.map((tag, i) => (\n <InfoTag key={i} tag={tag} />\n ))}\n </div>\n )}\n </>\n );\n if (variant === 'expand') return child;\n return (\n <Property name={name} type={type} deprecated={schema.deprecated} {...overrides}>\n {child}\n </Property>\n );\n}\n\nfunction ArrayItemCollapsible({ schema }: { schema: Extract<SchemaData, { type: 'array' }> }) {\n const [open, setOpen] = useState(false);\n const t = useTranslations();\n\n return (\n <Collapsible className=\"my-2\" open={open} onOpenChange={setOpen}>\n <CollapsibleTrigger\n className={cn(\n buttonVariants({ color: 'secondary', size: 'sm' }),\n 'group px-3 py-2 data-[state=open]:rounded-b-none',\n )}\n >\n {open ? t.schemaHideArray : t.schemaShowArray}\n <ChevronDown className=\"size-4 text-fd-muted-foreground group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"-mt-px bg-fd-card px-3 rounded-lg rounded-tl-none border shadow-sm\">\n <SchemaUIProperty name=\"\" $type={schema.item.$type} variant=\"expand\" />\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\ninterface ObjectSearchProps {\n properties: SchemaDataObjectProperty[];\n container?: ComponentProps<'div'>;\n open?: (item: SchemaDataObjectProperty) => void;\n}\n\nfunction ObjectSearch({ properties, container, open }: ObjectSearchProps) {\n const [search, setSearch] = useState('');\n const deferredValue = useDeferredValue(search);\n const firstItemRef = useRef<SchemaDataObjectProperty>(null);\n const prevProperties = useRef(properties);\n const t = useTranslations();\n\n if (prevProperties.current !== properties) {\n prevProperties.current = properties;\n setSearch('');\n }\n\n return (\n <>\n <div\n {...container}\n className={cn(\n 'flex items-center border my-2 rounded-md bg-fd-secondary text-fd-secondary-foreground transition-colors shadow-sm focus-within:ring-2 focus-within:ring-fd-ring',\n container?.className,\n )}\n >\n <FilterIcon className=\"text-fd-muted-foreground ms-2 size-3.5\" />\n <input\n value={search}\n data-object-search-input=\"\"\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t.schemaFilterPropertiesPlaceholder}\n className=\"text-sm ps-2 py-2 flex-1 outline-none placeholder:text-fd-muted-foreground\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && open) {\n if (firstItemRef.current) open(firstItemRef.current);\n e.preventDefault();\n }\n }}\n />\n </div>\n <Suspense>\n <ObjectSearchContent\n search={deferredValue}\n properties={properties}\n firstItemRef={firstItemRef}\n />\n </Suspense>\n </>\n );\n}\n\nfunction ObjectSearchContent({\n search: rawSearch,\n firstItemRef,\n properties,\n}: {\n search: string;\n firstItemRef: RefObject<SchemaDataObjectProperty | null>;\n properties: SchemaDataObjectProperty[];\n}) {\n const t = useTranslations();\n const filtered = useMemo(() => {\n const search = rawSearch.trim().toLowerCase();\n return search.length > 0\n ? properties.filter((prop) => prop.name.toLowerCase().includes(search))\n : properties;\n }, [properties, rawSearch]);\n\n firstItemRef.current = filtered.length > 0 ? filtered[0] : null;\n\n if (filtered.length === 0)\n return (\n <p className=\"text-fd-muted-foreground text-sm px-2\">\n {t.schemaFilterPropertiesEmpty}{' '}\n <span className=\"text-fd-foreground font-medium\">{`\"${rawSearch}\"`}</span>\n </p>\n );\n\n return filtered.map((prop) => (\n <SchemaUIProperty\n key={prop.name}\n name={prop.name}\n $type={prop.$type}\n overrides={{ required: prop.required }}\n />\n ));\n}\n\nfunction InfoTag({ tag }: { tag: InfoTag }) {\n const ref = useRef<HTMLElement>(null);\n const [isTruncated, setTruncated] = useState(false);\n const [open, setOpen] = useState(false);\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n // assume the tag width will never change\n setTruncated(element.scrollWidth !== element.offsetWidth);\n }, []);\n\n return (\n <div className=\"flex flex-row items-start gap-2 bg-fd-secondary border rounded-lg text-xs p-1.5 shadow-md max-w-full\">\n <span className=\"font-medium\">{tag.label}</span>\n <code\n ref={ref}\n className={cn(\n 'min-w-0 flex-1 text-fd-muted-foreground',\n open ? 'wrap-break-word' : 'truncate',\n )}\n >\n {tag.value}\n </code>\n {isTruncated && (\n <button\n className={cn(buttonVariants({ size: 'icon-xs', variant: 'ghost' }))}\n onClick={() => setOpen((prev) => !prev)}\n >\n <ChevronDown />\n </button>\n )}\n </div>\n );\n}\n\ninterface PathItemType {\n name: ReactNode;\n $ref?: string;\n scrollTop?: number;\n}\n\nfunction SchemaUIPopover({\n containerRef,\n initialPath,\n}: {\n containerRef: RefObject<HTMLDivElement | null>;\n initialPath: PathItemType[];\n}) {\n const [path, setPath] = useState(initialPath);\n\n useLayoutEffect(() => {\n const last = path[0];\n const element = containerRef.current;\n if (!element || !last || !element.parentElement) return;\n\n // recover scroll\n element.parentElement.scrollTop = last.scrollTop ?? 0;\n return () => {\n if (element.parentElement) last.scrollTop = element.parentElement.scrollTop;\n };\n }, [containerRef, path]);\n\n const context: PopoverContextType = useMemo(\n () => ({\n renderTrigger: ({ $ref, pathName, children }) => (\n <button\n className={cn(typeVariants({ variant: 'trigger' }))}\n onClick={() => setPath((path) => [...path, { name: pathName, $ref }])}\n >\n {children}\n </button>\n ),\n }),\n [],\n );\n\n const currentRef = path.findLast((item) => item.$ref !== undefined);\n\n return (\n <>\n <div className=\"sticky top-0 -mx-2 flex flex-row flex-wrap items-center text-sm font-medium font-mono bg-fd-popover px-2 h-8 border-b\">\n {path.map((item, i) => {\n const isDuplicated = path.some((other, j) => j < i && other.$ref === item.$ref);\n const className = cn(\n isDuplicated && 'text-orange-400',\n item.$ref && 'hover:underline hover:text-fd-accent-foreground',\n );\n const node = item.$ref ? (\n <button onClick={() => setPath((path) => path.slice(0, i + 1))} className={className}>\n {item.name}\n </button>\n ) : (\n <span className={className}>{item.name}</span>\n );\n\n return (\n <Fragment key={i}>\n {i > 0 && '.'}\n {node}\n </Fragment>\n );\n })}\n </div>\n <PopoverContext value={context}>\n {currentRef?.$ref && (\n <SchemaUIProperty\n name=\"\"\n $type={currentRef.$ref}\n variant=\"expand\"\n objectSearchOverrides={{\n container: {\n className: 'sticky top-10',\n },\n open(item) {\n setPath((path) => [...path, { name: item.name, $ref: item.$type }]);\n },\n }}\n />\n )}\n </PopoverContext>\n </>\n );\n}\n\nfunction useRenderRef() {\n const { refs } = useData();\n const { renderTrigger } = usePopover();\n return function renderRef({\n pathName,\n $ref,\n text,\n }: {\n pathName: ReactNode;\n $ref: string;\n text: ReactNode;\n }) {\n const schema = refs[$ref];\n\n if (!isExpandable(schema)) {\n return <span className={cn(typeVariants())}>{text}</span>;\n }\n\n if (schema.type === 'and' || schema.type === 'or') {\n const sep = schema.type === 'and' ? '&' : '|';\n return (\n <span className={cn(typeVariants(), 'flex flex-row gap-2 items-center flex-wrap')}>\n {schema.items.map((item, i) => (\n <Fragment key={item.$type}>\n {i > 0 && <span>{sep}</span>}\n {renderRef({ pathName, text: item.name, $ref: item.$type })}\n </Fragment>\n ))}\n </span>\n );\n }\n\n if (schema.type === 'array') {\n return (\n <span className={cn(typeVariants(), 'flex flex-row items-center flex-wrap')}>\n {'array<'}\n {renderRef({\n pathName: <>{pathName}[]</>,\n text: refs[schema.item.$type].aliasName,\n $ref: schema.item.$type,\n })}\n {'>'}\n </span>\n );\n }\n\n return renderTrigger({ $ref, pathName, children: text });\n };\n}\n\nfunction RootPopoverTrigger({\n $ref,\n pathName,\n children,\n}: {\n pathName: ReactNode;\n $ref: string;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const refCallback = useCallback((element: HTMLDivElement | null) => {\n ref.current = element;\n if (!element || element.style.getPropertyValue('--initial-height')) return;\n\n element.style.setProperty('--initial-height', `${element.clientHeight + 2}px`);\n }, []);\n\n return (\n <Popover>\n <PopoverTrigger className={cn(typeVariants({ variant: 'trigger' }))}>\n {children}\n </PopoverTrigger>\n <PopoverContent\n ref={refCallback}\n onOpenAutoFocus={(e) => {\n if (!ref.current) return;\n const input = ref.current.querySelector('input[data-object-search-input]');\n if (!(input instanceof HTMLInputElement)) return;\n input.focus({ preventScroll: true });\n e.preventDefault();\n }}\n className=\"w-[600px] min-h-(--initial-height,0) max-h-[460px] px-2 py-0\"\n >\n <SchemaUIPopover\n containerRef={ref}\n initialPath={[\n {\n name: pathName,\n $ref: $ref,\n },\n ]}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface PropertyProps {\n name: ReactNode;\n type: ReactNode;\n required?: boolean;\n deprecated?: boolean;\n nested?: boolean;\n\n children?: ReactNode;\n className?: string;\n}\n\nfunction Property({\n name,\n type,\n required,\n deprecated,\n nested = false,\n className,\n ...props\n}: PropertyProps) {\n const t = useTranslations();\n return (\n <div\n className={cn(\n 'text-sm border-t',\n nested\n ? 'p-3 border-x bg-fd-card last:rounded-b-xl first:rounded-tr-xl last:border-b'\n : 'py-4 first:border-t-0',\n className,\n )}\n >\n <div className=\"flex flex-wrap items-center gap-3 not-prose\">\n <span className=\"font-medium font-mono text-fd-primary\">\n {name}\n {required ? (\n <span className=\"text-red-400\">*</span>\n ) : (\n <span className=\"text-fd-muted-foreground\">?</span>\n )}\n </span>\n {typeof type === 'string' ? (\n <span className=\"text-sm font-mono text-fd-muted-foreground\">{type}</span>\n ) : (\n type\n )}\n {deprecated && (\n <Badge color=\"yellow\" className=\"ms-auto text-xs\">\n {t.deprecated}\n </Badge>\n )}\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">{props.children}</div>\n </div>\n );\n}\n\nfunction isExpandable(data: SchemaData): boolean {\n if (data.type !== 'primitive') return true;\n return Boolean(data.description || (data.infoTags && data.infoTags.length > 0));\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/ui/schema/index.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/ui/schema/index.tsx"],"mappings":";;;;UAQiB,SAAA;EACf,WAAA,GAAc,SAAA;EACd,QAAA,GAAW,OAAA;EAEX,QAAA;EACA,SAAA;EAEA,UAAA;AAAA;AAAA,UAGe,OAAA;EACf,KAAA,EAAO,SAAA;EACP,KAAA;AAAA;AAAA,UAGe,wBAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGU,UAAA,GAAa,SAAA;EAGjB,IAAA;AAAA;EAGA,IAAA;EACA,KAAA,EAAO,wBAAA;AAAA;EAGP,IAAA;EACA,IAAA;IACE,KAAA;EAAA;AAAA;EAIF,IAAA;EACA,KAAA;IACE,IAAA;IACA,KAAA;EAAA;AAAA;EAIF,IAAA;EACA,KAAA;IACE,IAAA;IACA,KAAA;EAAA;AAAA;AAAA,UAKO,eAAA;EACf,IAAA,EAAM,cAAA;EACN,MAAA,EAAQ,IAAA,CAAK,aAAA;EA1BA;;;EA+Bb,QAAA;EAtBM;;;EA0BN,SAAA;AAAA;AAAA,UAGe,qBAAA;EACf,KAAA;EACA,IAAA,EAAM,MAAA,SAAe,UAAA;AAAA"}
|
package/dist/ui/schema/index.js
CHANGED
|
@@ -1,19 +1,28 @@
|
|
|
1
1
|
import { mergeAllOf } from "../../utils/merge-schema.js";
|
|
2
2
|
import { FormatFlags, schemaToString } from "../../utils/schema/to-string.js";
|
|
3
3
|
import { I18nLabel } from "../client/i18n.js";
|
|
4
|
-
import { SchemaUILazy } from "./lazy.js";
|
|
5
4
|
import { useMemo } from "react";
|
|
6
5
|
import { jsx } from "react/jsx-runtime";
|
|
7
6
|
//#region src/ui/schema/index.tsx
|
|
8
|
-
function Schema({ ctx,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
function Schema({ ctx, client, root, readOnly, writeOnly }) {
|
|
8
|
+
const generated = useMemo(() => generateSchemaUI(root, readOnly, writeOnly, ctx), [
|
|
9
|
+
root,
|
|
10
|
+
readOnly,
|
|
11
|
+
writeOnly,
|
|
12
|
+
ctx
|
|
13
|
+
]);
|
|
14
|
+
if (ctx.schemaUI?.render) return ctx.schemaUI.render({
|
|
15
|
+
client,
|
|
16
|
+
root,
|
|
17
|
+
readOnly,
|
|
18
|
+
writeOnly
|
|
19
|
+
}, ctx);
|
|
20
|
+
return /* @__PURE__ */ jsx(ctx.clientBoundary.SchemaUI, {
|
|
21
|
+
...client,
|
|
13
22
|
generated
|
|
14
23
|
});
|
|
15
24
|
}
|
|
16
|
-
function generateSchemaUI(
|
|
25
|
+
function generateSchemaUI(root, readOnly = false, writeOnly = false, ctx) {
|
|
17
26
|
const refs = {};
|
|
18
27
|
const { showExample = false } = ctx.schemaUI ?? {};
|
|
19
28
|
function generateInfoTags(schema) {
|
|
@@ -78,8 +87,8 @@ function generateSchemaUI({ root, readOnly, writeOnly }, ctx) {
|
|
|
78
87
|
}
|
|
79
88
|
function isVisible(schema) {
|
|
80
89
|
if (typeof schema === "boolean") return true;
|
|
81
|
-
if (schema.writeOnly) return writeOnly
|
|
82
|
-
if (schema.readOnly) return readOnly
|
|
90
|
+
if (schema.writeOnly) return writeOnly;
|
|
91
|
+
if (schema.readOnly) return readOnly;
|
|
83
92
|
return true;
|
|
84
93
|
}
|
|
85
94
|
function base(schema) {
|
|
@@ -91,7 +100,7 @@ function generateSchemaUI({ root, readOnly, writeOnly }, ctx) {
|
|
|
91
100
|
};
|
|
92
101
|
}
|
|
93
102
|
return {
|
|
94
|
-
description: schema.description
|
|
103
|
+
description: schema.description ? ctx.renderMarkdown(schema.description) : void 0,
|
|
95
104
|
infoTags: generateInfoTags(schema),
|
|
96
105
|
typeName: schemaToString(schema, ctx.schema),
|
|
97
106
|
aliasName: schemaToString(schema, ctx.schema, FormatFlags.UseAlias),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/schema/index.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from 'react';\nimport type { ResolvedSchema } from '@/utils/schema';\nimport type { RenderContext } from '@/types';\nimport { FormatFlags, schemaToString } from '@/utils/schema/to-string';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport type { SchemaUIProps } from '@/ui/schema/client';\nimport { SchemaUILazy } from '@/ui/schema/lazy';\nimport { I18nLabel } from '../client/i18n';\n\nexport interface FieldBase {\n description?: ReactNode;\n infoTags?: InfoTag[];\n\n typeName: string;\n aliasName: string;\n\n deprecated?: boolean;\n}\n\nexport interface InfoTag {\n label: ReactNode;\n value: string;\n}\n\nexport interface SchemaDataObjectProperty {\n name: string;\n $type: string;\n required: boolean;\n}\n\nexport type SchemaData = FieldBase &\n (\n | {\n type: 'primitive';\n }\n | {\n type: 'object';\n props: SchemaDataObjectProperty[];\n }\n | {\n type: 'array';\n item: {\n $type: string;\n };\n }\n | {\n type: 'or';\n items: {\n name: string;\n $type: string;\n }[];\n }\n | {\n type: 'and';\n items: {\n name: string;\n $type: string;\n }[];\n }\n );\n\nexport interface SchemaUIOptions {\n root: ResolvedSchema;\n client: Omit<SchemaUIProps, 'generated'>;\n\n /**\n * include read only props\n */\n readOnly?: boolean;\n /**\n * include write only props\n */\n writeOnly?: boolean;\n}\n\nexport interface SchemaUIGeneratedData {\n $root: string;\n refs: Record<string, SchemaData>;\n}\n\nexport function Schema({\n ctx,\n ...options\n}: SchemaUIOptions & {\n ctx: RenderContext;\n}) {\n if (ctx.schemaUI?.render) {\n return ctx.schemaUI.render(options, ctx);\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks -- assume options unchanged\n const generated = useMemo(() => generateSchemaUI(options, ctx), [ctx, options]);\n return <SchemaUILazy {...options.client} generated={generated} />;\n}\n\nexport function generateSchemaUI(\n { root, readOnly, writeOnly }: SchemaUIOptions,\n ctx: RenderContext,\n): SchemaUIGeneratedData {\n const refs: Record<string, SchemaData> = {};\n const { showExample = false } = ctx.schemaUI ?? {};\n\n function generateInfoTags(schema: Exclude<ResolvedSchema, boolean>) {\n const fields: InfoTag[] = [];\n\n if (schema.default !== undefined) {\n fields.push({\n label: <I18nLabel label=\"schemaDefault\" />,\n value: JSON.stringify(schema.default),\n });\n }\n\n if (schema.pattern) {\n fields.push({ label: <I18nLabel label=\"schemaMatch\" />, value: schema.pattern });\n }\n\n if (schema.format) {\n fields.push({ label: <I18nLabel label=\"schemaFormat\" />, value: schema.format });\n }\n\n if (schema.multipleOf) {\n fields.push({\n label: <I18nLabel label=\"schemaMultipleOf\" />,\n value: schema.multipleOf.toString(),\n });\n }\n\n let range = formatRange(\n 'value',\n schema.minimum,\n schema.exclusiveMinimum,\n schema.maximum,\n schema.exclusiveMaximum,\n );\n if (range) fields.push({ label: <I18nLabel label=\"schemaRange\" />, value: range });\n\n range = formatRange('length', schema.minLength, undefined, schema.maxLength, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaLength\" />, value: range });\n\n range = formatRange(\n 'properties',\n schema.minProperties,\n undefined,\n schema.maxProperties,\n undefined,\n );\n if (range) fields.push({ label: <I18nLabel label=\"schemaProperties\" />, value: range });\n\n range = formatRange('items', schema.minItems, undefined, schema.maxItems, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaItems\" />, value: range });\n\n if (schema.enum) {\n fields.push({\n label: <I18nLabel label=\"schemaValueIn\" />,\n value: schema.enum.map((value) => JSON.stringify(value)).join(' | '),\n });\n }\n\n if (showExample && schema.examples) {\n for (const example of schema.examples) {\n fields.push({\n label: <I18nLabel label=\"schemaExample\" />,\n value: JSON.stringify(example, null, 2),\n });\n }\n }\n\n return fields;\n }\n\n let _counter = 0;\n const autoIds = new WeakMap<Exclude<ResolvedSchema, boolean>, string>();\n function getSchemaId(schema: ResolvedSchema): string {\n if (typeof schema === 'boolean') return String(schema);\n const raw = ctx.schema.getRawRef(schema);\n if (raw) return raw;\n\n const prev = autoIds.get(schema);\n if (prev) return prev;\n\n const generated = `__${_counter++}`;\n autoIds.set(schema, generated);\n return generated;\n }\n\n function isVisible(schema: ResolvedSchema): boolean {\n if (typeof schema === 'boolean') return true;\n if (schema.writeOnly) return writeOnly ?? false;\n if (schema.readOnly) return readOnly ?? false;\n return true;\n }\n\n function base(schema: ResolvedSchema): FieldBase {\n if (typeof schema === 'boolean') {\n const name = schema ? 'any' : 'never';\n return {\n typeName: name,\n aliasName: name,\n };\n }\n\n return {\n description: schema.description && ctx.renderMarkdown(schema.description),\n infoTags: generateInfoTags(schema),\n typeName: schemaToString(schema, ctx.schema),\n aliasName: schemaToString(schema, ctx.schema, FormatFlags.UseAlias),\n deprecated: schema.deprecated,\n };\n }\n\n function scanRefs(id: string, schema: ResolvedSchema) {\n if (id in refs) return;\n if (typeof schema === 'boolean') {\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n return;\n }\n\n if (Array.isArray(schema.type)) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const type of schema.type) {\n const key = `${id}_type:${type}`;\n scanRefs(key, {\n ...schema,\n type,\n });\n out.items.push({\n name: type,\n $type: key,\n });\n }\n return;\n }\n\n if (schema.oneOf && schema.anyOf) {\n const out: SchemaData = {\n type: 'and',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n for (const omit of ['anyOf', 'oneOf'] as const) {\n const $type = `${id}_omit:${omit}`;\n scanRefs($type, { ...schema, [omit]: undefined });\n\n out.items.push({\n name: refs[$type].aliasName,\n $type,\n });\n }\n return;\n }\n\n // display both `oneOf` & `anyOf` as OR for simplified overview\n const union = schema.oneOf ?? schema.anyOf;\n if (union) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const item of union) {\n if (!item || typeof item !== 'object' || !isVisible(item)) continue;\n const itemId = getSchemaId(item);\n const key = `${id}_extends:${itemId}`;\n\n scanRefs(key, {\n ...schema,\n oneOf: undefined,\n anyOf: undefined,\n ...item,\n properties: {\n ...schema.properties,\n ...item.properties,\n },\n });\n out.items.push({\n $type: key,\n name: refs[itemId]?.aliasName ?? schemaToString(item, ctx.schema, FormatFlags.UseAlias),\n });\n }\n return;\n }\n\n if (schema.allOf) {\n scanRefs(id, mergeAllOf(schema));\n return;\n }\n\n if (schema.type === 'object') {\n const out: SchemaData = {\n type: 'object',\n props: [],\n ...base(schema),\n };\n refs[id] = out;\n\n const { properties = {}, patternProperties, additionalProperties } = schema;\n const props = Object.entries(properties);\n if (patternProperties) props.push(...Object.entries(patternProperties));\n\n for (const [key, prop] of props) {\n if (!prop || !isVisible(prop)) continue;\n const $type = getSchemaId(prop);\n scanRefs($type, prop);\n out.props.push({\n $type,\n name: key,\n required: schema.required?.includes(key) ?? false,\n });\n }\n\n if (additionalProperties && isVisible(additionalProperties)) {\n const $type = getSchemaId(additionalProperties);\n scanRefs($type, additionalProperties);\n\n out.props.push({\n $type,\n name: '[key: string]',\n required: false,\n });\n }\n return;\n }\n\n if (schema.type === 'array') {\n const items = schema.items ?? true;\n const $type = getSchemaId(items);\n\n refs[id] = {\n type: 'array',\n item: {\n $type,\n },\n ...base(schema),\n };\n scanRefs($type, items);\n return;\n }\n\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n }\n\n const $root = getSchemaId(root);\n scanRefs($root, root);\n return {\n refs,\n $root,\n };\n}\n\nfunction formatRange(\n value: string,\n min: number | undefined,\n exclusiveMin: number | undefined,\n max: number | undefined,\n exclusiveMax: number | undefined,\n) {\n const out: string[] = [];\n if (min !== undefined) {\n out.push(`${min} <=`);\n } else if (exclusiveMin !== undefined) {\n out.push(`${exclusiveMin} <`);\n }\n\n out.push(value);\n if (max !== undefined) {\n out.push(`<= ${max}`);\n } else if (exclusiveMax !== undefined) {\n out.push(`< ${exclusiveMax}`);\n }\n if (out.length > 1) return out.join(' ');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/schema/index.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from 'react';\nimport type { ResolvedSchema } from '@/utils/schema';\nimport type { RenderContext } from '@/types';\nimport { FormatFlags, schemaToString } from '@/utils/schema/to-string';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport type { SchemaUIProps } from '@/ui/schema/client';\nimport { I18nLabel } from '../client/i18n';\n\nexport interface FieldBase {\n description?: ReactNode;\n infoTags?: InfoTag[];\n\n typeName: string;\n aliasName: string;\n\n deprecated?: boolean;\n}\n\nexport interface InfoTag {\n label: ReactNode;\n value: string;\n}\n\nexport interface SchemaDataObjectProperty {\n name: string;\n $type: string;\n required: boolean;\n}\n\nexport type SchemaData = FieldBase &\n (\n | {\n type: 'primitive';\n }\n | {\n type: 'object';\n props: SchemaDataObjectProperty[];\n }\n | {\n type: 'array';\n item: {\n $type: string;\n };\n }\n | {\n type: 'or';\n items: {\n name: string;\n $type: string;\n }[];\n }\n | {\n type: 'and';\n items: {\n name: string;\n $type: string;\n }[];\n }\n );\n\nexport interface SchemaUIOptions {\n root: ResolvedSchema;\n client: Omit<SchemaUIProps, 'generated'>;\n\n /**\n * include read only props\n */\n readOnly?: boolean;\n /**\n * include write only props\n */\n writeOnly?: boolean;\n}\n\nexport interface SchemaUIGeneratedData {\n $root: string;\n refs: Record<string, SchemaData>;\n}\n\nexport function Schema({\n ctx,\n client,\n root,\n readOnly,\n writeOnly,\n}: SchemaUIOptions & {\n ctx: RenderContext;\n}) {\n const generated = useMemo(\n () => generateSchemaUI(root, readOnly, writeOnly, ctx),\n [root, readOnly, writeOnly, ctx],\n );\n\n if (ctx.schemaUI?.render) {\n return ctx.schemaUI.render({ client, root, readOnly, writeOnly }, ctx);\n }\n\n return <ctx.clientBoundary.SchemaUI {...client} generated={generated} />;\n}\n\nexport function generateSchemaUI(\n root: ResolvedSchema,\n readOnly = false,\n writeOnly = false,\n ctx: RenderContext,\n): SchemaUIGeneratedData {\n const refs: Record<string, SchemaData> = {};\n const { showExample = false } = ctx.schemaUI ?? {};\n\n function generateInfoTags(schema: Exclude<ResolvedSchema, boolean>) {\n const fields: InfoTag[] = [];\n\n if (schema.default !== undefined) {\n fields.push({\n label: <I18nLabel label=\"schemaDefault\" />,\n value: JSON.stringify(schema.default),\n });\n }\n\n if (schema.pattern) {\n fields.push({ label: <I18nLabel label=\"schemaMatch\" />, value: schema.pattern });\n }\n\n if (schema.format) {\n fields.push({ label: <I18nLabel label=\"schemaFormat\" />, value: schema.format });\n }\n\n if (schema.multipleOf) {\n fields.push({\n label: <I18nLabel label=\"schemaMultipleOf\" />,\n value: schema.multipleOf.toString(),\n });\n }\n\n let range = formatRange(\n 'value',\n schema.minimum,\n schema.exclusiveMinimum,\n schema.maximum,\n schema.exclusiveMaximum,\n );\n if (range) fields.push({ label: <I18nLabel label=\"schemaRange\" />, value: range });\n\n range = formatRange('length', schema.minLength, undefined, schema.maxLength, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaLength\" />, value: range });\n\n range = formatRange(\n 'properties',\n schema.minProperties,\n undefined,\n schema.maxProperties,\n undefined,\n );\n if (range) fields.push({ label: <I18nLabel label=\"schemaProperties\" />, value: range });\n\n range = formatRange('items', schema.minItems, undefined, schema.maxItems, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaItems\" />, value: range });\n\n if (schema.enum) {\n fields.push({\n label: <I18nLabel label=\"schemaValueIn\" />,\n value: schema.enum.map((value) => JSON.stringify(value)).join(' | '),\n });\n }\n\n if (showExample && schema.examples) {\n for (const example of schema.examples) {\n fields.push({\n label: <I18nLabel label=\"schemaExample\" />,\n value: JSON.stringify(example, null, 2),\n });\n }\n }\n\n return fields;\n }\n\n let _counter = 0;\n const autoIds = new WeakMap<Exclude<ResolvedSchema, boolean>, string>();\n function getSchemaId(schema: ResolvedSchema): string {\n if (typeof schema === 'boolean') return String(schema);\n const raw = ctx.schema.getRawRef(schema);\n if (raw) return raw;\n\n const prev = autoIds.get(schema);\n if (prev) return prev;\n\n const generated = `__${_counter++}`;\n autoIds.set(schema, generated);\n return generated;\n }\n\n function isVisible(schema: ResolvedSchema): boolean {\n if (typeof schema === 'boolean') return true;\n if (schema.writeOnly) return writeOnly;\n if (schema.readOnly) return readOnly;\n return true;\n }\n\n function base(schema: ResolvedSchema): FieldBase {\n if (typeof schema === 'boolean') {\n const name = schema ? 'any' : 'never';\n return {\n typeName: name,\n aliasName: name,\n };\n }\n\n return {\n description: schema.description ? ctx.renderMarkdown(schema.description) : undefined,\n infoTags: generateInfoTags(schema),\n typeName: schemaToString(schema, ctx.schema),\n aliasName: schemaToString(schema, ctx.schema, FormatFlags.UseAlias),\n deprecated: schema.deprecated,\n };\n }\n\n function scanRefs(id: string, schema: ResolvedSchema) {\n if (id in refs) return;\n if (typeof schema === 'boolean') {\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n return;\n }\n\n if (Array.isArray(schema.type)) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const type of schema.type) {\n const key = `${id}_type:${type}`;\n scanRefs(key, {\n ...schema,\n type,\n });\n out.items.push({\n name: type,\n $type: key,\n });\n }\n return;\n }\n\n if (schema.oneOf && schema.anyOf) {\n const out: SchemaData = {\n type: 'and',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n for (const omit of ['anyOf', 'oneOf'] as const) {\n const $type = `${id}_omit:${omit}`;\n scanRefs($type, { ...schema, [omit]: undefined });\n\n out.items.push({\n name: refs[$type].aliasName,\n $type,\n });\n }\n return;\n }\n\n // display both `oneOf` & `anyOf` as OR for simplified overview\n const union = schema.oneOf ?? schema.anyOf;\n if (union) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const item of union) {\n if (!item || typeof item !== 'object' || !isVisible(item)) continue;\n const itemId = getSchemaId(item);\n const key = `${id}_extends:${itemId}`;\n\n scanRefs(key, {\n ...schema,\n oneOf: undefined,\n anyOf: undefined,\n ...item,\n properties: {\n ...schema.properties,\n ...item.properties,\n },\n });\n out.items.push({\n $type: key,\n name: refs[itemId]?.aliasName ?? schemaToString(item, ctx.schema, FormatFlags.UseAlias),\n });\n }\n return;\n }\n\n if (schema.allOf) {\n scanRefs(id, mergeAllOf(schema));\n return;\n }\n\n if (schema.type === 'object') {\n const out: SchemaData = {\n type: 'object',\n props: [],\n ...base(schema),\n };\n refs[id] = out;\n\n const { properties = {}, patternProperties, additionalProperties } = schema;\n const props = Object.entries(properties);\n if (patternProperties) props.push(...Object.entries(patternProperties));\n\n for (const [key, prop] of props) {\n if (!prop || !isVisible(prop)) continue;\n const $type = getSchemaId(prop);\n scanRefs($type, prop);\n out.props.push({\n $type,\n name: key,\n required: schema.required?.includes(key) ?? false,\n });\n }\n\n if (additionalProperties && isVisible(additionalProperties)) {\n const $type = getSchemaId(additionalProperties);\n scanRefs($type, additionalProperties);\n\n out.props.push({\n $type,\n name: '[key: string]',\n required: false,\n });\n }\n return;\n }\n\n if (schema.type === 'array') {\n const items = schema.items ?? true;\n const $type = getSchemaId(items);\n\n refs[id] = {\n type: 'array',\n item: {\n $type,\n },\n ...base(schema),\n };\n scanRefs($type, items);\n return;\n }\n\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n }\n\n const $root = getSchemaId(root);\n scanRefs($root, root);\n return {\n refs,\n $root,\n };\n}\n\nfunction formatRange(\n value: string,\n min: number | undefined,\n exclusiveMin: number | undefined,\n max: number | undefined,\n exclusiveMax: number | undefined,\n) {\n const out: string[] = [];\n if (min !== undefined) {\n out.push(`${min} <=`);\n } else if (exclusiveMin !== undefined) {\n out.push(`${exclusiveMin} <`);\n }\n\n out.push(value);\n if (max !== undefined) {\n out.push(`<= ${max}`);\n } else if (exclusiveMax !== undefined) {\n out.push(`< ${exclusiveMax}`);\n }\n if (out.length > 1) return out.join(' ');\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fumadocs-openapi",
|
|
3
|
-
"version": "10.6.
|
|
3
|
+
"version": "10.6.2",
|
|
4
4
|
"description": "Generate MDX docs for your OpenAPI spec",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Docs",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"github-slugger": "^2.0.0",
|
|
59
59
|
"hast-util-to-jsx-runtime": "^2.3.6",
|
|
60
60
|
"js-yaml": "^4.1.1",
|
|
61
|
-
"lucide-react": "^1.
|
|
61
|
+
"lucide-react": "^1.7.0",
|
|
62
62
|
"next-themes": "^0.4.6",
|
|
63
63
|
"openapi-sampler": "^1.7.2",
|
|
64
64
|
"react-hook-form": "^7.72.0",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"@fumari/stf": "1.0.3"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@scalar/api-client-react": "^1.4.
|
|
72
|
+
"@scalar/api-client-react": "^1.4.15",
|
|
73
73
|
"@types/js-yaml": "^4.0.9",
|
|
74
74
|
"@types/node": "25.5.0",
|
|
75
75
|
"@types/openapi-sampler": "^1.0.3",
|
|
@@ -77,11 +77,10 @@
|
|
|
77
77
|
"json-schema-typed": "^8.0.2",
|
|
78
78
|
"shiki": "^4.0.2",
|
|
79
79
|
"tailwindcss": "^4.2.2",
|
|
80
|
-
"tsdown": "0.21.
|
|
80
|
+
"tsdown": "0.21.6",
|
|
81
81
|
"@fumadocs/tailwind": "0.0.3",
|
|
82
|
-
"
|
|
83
|
-
"fumadocs-
|
|
84
|
-
"fumadocs-ui": "16.7.7",
|
|
82
|
+
"fumadocs-core": "16.7.8",
|
|
83
|
+
"fumadocs-ui": "16.7.8",
|
|
85
84
|
"tsconfig": "0.0.0"
|
|
86
85
|
},
|
|
87
86
|
"peerDependencies": {
|
|
@@ -112,7 +111,7 @@
|
|
|
112
111
|
"build": "tsdown --config-loader unrun",
|
|
113
112
|
"clean": "rimraf dist",
|
|
114
113
|
"dev": "tsdown --watch --clean false",
|
|
115
|
-
"lint": "
|
|
114
|
+
"lint": "oxlint .",
|
|
116
115
|
"types:check": "tsc --noEmit"
|
|
117
116
|
}
|
|
118
117
|
}
|
package/dist/playground/lazy.js
DELETED
|
@@ -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,9 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { wrapLazy } from "../../utils/lazy.js";
|
|
3
|
-
//#region src/ui/contexts/api.lazy.ts
|
|
4
|
-
const ApiProviderLazy = wrapLazy(() => import("./api.js").then((mod) => ({ default: mod.ApiProvider })));
|
|
5
|
-
const ServerProviderLazy = wrapLazy(() => import("./api.js").then((mod) => ({ default: mod.ServerProvider })));
|
|
6
|
-
//#endregion
|
|
7
|
-
export { ApiProviderLazy, ServerProviderLazy };
|
|
8
|
-
|
|
9
|
-
//# sourceMappingURL=api.lazy.js.map
|
|
@@ -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\nexport const ServerProviderLazy = wrapLazy(() =>\n import('./api').then((mod) => ({ default: mod.ServerProvider })),\n);\n"],"mappings":";;;AAGA,MAAa,kBAAkB,eAC7B,OAAO,YAAS,MAAM,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,CAC9D;AAED,MAAa,qBAAqB,eAChC,OAAO,YAAS,MAAM,SAAS,EAAE,SAAS,IAAI,gBAAgB,EAAE,CACjE"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { wrapLazy } from "../../../utils/lazy.js";
|
|
3
|
-
//#region src/ui/operation/usage-tabs/lazy.tsx
|
|
4
|
-
const UsageTabsSelectorLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTabsSelector })));
|
|
5
|
-
const UsageTabLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTab })));
|
|
6
|
-
//#endregion
|
|
7
|
-
export { UsageTabLazy, UsageTabsSelectorLazy };
|
|
8
|
-
|
|
9
|
-
//# sourceMappingURL=lazy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/lazy.tsx"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../../utils/lazy';\n\nexport const UsageTabsSelectorLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTabsSelector })),\n);\n\nexport const UsageTabLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTab })),\n);\n"],"mappings":";;;AAGA,MAAa,wBAAwB,eACnC,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CACvE;AAED,MAAa,eAAe,eAC1B,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAC9D"}
|
package/dist/ui/schema/lazy.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { wrapLazy } from "../../utils/lazy.js";
|
|
3
|
-
//#region src/ui/schema/lazy.ts
|
|
4
|
-
const SchemaUILazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.SchemaUI })));
|
|
5
|
-
//#endregion
|
|
6
|
-
export { SchemaUILazy };
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=lazy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","names":[],"sources":["../../../src/ui/schema/lazy.ts"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../utils/lazy';\n\nexport const SchemaUILazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.SchemaUI })),\n);\n"],"mappings":";;;AAGA,MAAa,eAAe,eAC1B,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAC9D"}
|
package/dist/utils/lazy.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { lazy } from "react";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
//#region src/utils/lazy.tsx
|
|
4
|
-
function wrapLazy(load) {
|
|
5
|
-
const V = lazy(load);
|
|
6
|
-
return function wrapper(props) {
|
|
7
|
-
return /* @__PURE__ */ jsx(V, { ...props });
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
//#endregion
|
|
11
|
-
export { wrapLazy };
|
|
12
|
-
|
|
13
|
-
//# sourceMappingURL=lazy.js.map
|
package/dist/utils/lazy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","names":[],"sources":["../../src/utils/lazy.tsx"],"sourcesContent":["import { type ComponentType, lazy } from 'react';\n\n// Waku wraps all export functions of a \"use client\" file in `React.lazy`, but `lazy(lazy(() => ...))` causes error.\n// we wrap another layer of component such that it is valid\n// TODO: perhaps we can remove it once Waku migrated to vite-rsc\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- type infer\nexport function wrapLazy<T extends ComponentType<any>>(load: () => Promise<{ default: T }>): T {\n const V = lazy(load);\n\n return function wrapper(props) {\n return <V {...props} />;\n } as T;\n}\n"],"mappings":";;;AAMA,SAAgB,SAAuC,MAAwC;CAC7F,MAAM,IAAI,KAAK,KAAK;AAEpB,QAAO,SAAS,QAAQ,OAAO;AAC7B,SAAO,oBAAC,GAAD,EAAG,GAAI,OAAS,CAAA"}
|