fumadocs-openapi 10.6.4 → 10.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/generated/shared.css +2 -2
- package/dist/_openapi/types.d.ts +1 -2
- package/dist/generate-file.d.ts +1 -2
- package/dist/generate-file.js +0 -2
- package/dist/i18n.d.ts +1 -2
- package/dist/i18n.js +0 -2
- package/dist/playground/client.d.ts +3 -9
- package/dist/playground/client.js +27 -20
- package/dist/playground/components/inputs.js +0 -2
- package/dist/playground/components/oauth-dialog.js +0 -2
- package/dist/playground/components/server-select.js +0 -2
- package/dist/playground/fetcher.d.ts +1 -2
- package/dist/playground/fetcher.js +0 -2
- package/dist/playground/schema.d.ts +1 -2
- package/dist/playground/schema.js +24 -15
- package/dist/playground/status-info.js +0 -2
- package/dist/requests/generators/all.d.ts +1 -2
- package/dist/requests/generators/all.js +0 -2
- package/dist/requests/generators/csharp.d.ts +1 -2
- package/dist/requests/generators/csharp.js +0 -2
- package/dist/requests/generators/curl.d.ts +1 -2
- package/dist/requests/generators/curl.js +0 -2
- package/dist/requests/generators/go.d.ts +1 -2
- package/dist/requests/generators/go.js +0 -2
- package/dist/requests/generators/index.d.ts +1 -2
- package/dist/requests/generators/index.js +0 -2
- package/dist/requests/generators/java.d.ts +1 -2
- package/dist/requests/generators/java.js +0 -2
- package/dist/requests/generators/javascript.d.ts +1 -2
- package/dist/requests/generators/javascript.js +0 -2
- package/dist/requests/generators/python.d.ts +1 -2
- package/dist/requests/generators/python.js +0 -2
- package/dist/requests/media/adapter.d.ts +1 -2
- package/dist/requests/media/adapter.js +0 -2
- package/dist/requests/media/encode.d.ts +1 -2
- package/dist/requests/media/encode.js +0 -2
- package/dist/requests/media/resolve-adapter.js +0 -2
- package/dist/requests/string-utils.js +0 -2
- package/dist/requests/types.d.ts +1 -2
- package/dist/scalar/client.js +0 -2
- package/dist/scalar/index.d.ts +1 -2
- package/dist/scalar/index.js +0 -2
- package/dist/server/create.d.ts +2 -3
- package/dist/server/create.js +0 -2
- package/dist/server/proxy.d.ts +1 -2
- package/dist/server/proxy.js +0 -2
- package/dist/server/source-api.d.ts +1 -2
- package/dist/server/source-api.js +0 -2
- package/dist/types.d.ts +1 -2
- package/dist/ui/api-page.d.ts +1 -2
- package/dist/ui/api-page.js +0 -2
- package/dist/ui/base.d.ts +1 -2
- package/dist/ui/base.js +3 -5
- package/dist/ui/client/boundary.d.ts +1 -2
- package/dist/ui/client/boundary.js +0 -2
- package/dist/ui/client/boundary.lazy.js +0 -2
- package/dist/ui/client/full.js +0 -2
- package/dist/ui/client/i18n.js +0 -2
- package/dist/ui/client/index.d.ts +1 -2
- package/dist/ui/client/index.js +0 -2
- package/dist/ui/client/storage-key.js +0 -2
- package/dist/ui/components/accordion.js +0 -2
- package/dist/ui/components/codeblock.d.ts +1 -2
- package/dist/ui/components/codeblock.js +0 -2
- package/dist/ui/components/dialog.js +0 -2
- package/dist/ui/components/input.js +0 -2
- package/dist/ui/components/method-label.js +0 -2
- package/dist/ui/components/select-tab.js +0 -2
- package/dist/ui/components/select.js +0 -2
- package/dist/ui/contexts/api.d.ts +1 -2
- package/dist/ui/contexts/api.js +0 -2
- package/dist/ui/create-client.d.ts +1 -2
- package/dist/ui/create-client.js +1 -3
- package/dist/ui/index.d.ts +1 -2
- package/dist/ui/index.js +0 -2
- package/dist/ui/operation/client.js +0 -2
- package/dist/ui/operation/get-example-requests.d.ts +1 -2
- package/dist/ui/operation/get-example-requests.js +0 -2
- package/dist/ui/operation/index.js +0 -2
- package/dist/ui/operation/request-tabs.js +0 -2
- package/dist/ui/operation/response-tabs.d.ts +1 -2
- package/dist/ui/operation/response-tabs.js +0 -2
- package/dist/ui/operation/usage-tabs/client.d.ts +1 -2
- package/dist/ui/operation/usage-tabs/client.js +0 -2
- package/dist/ui/operation/usage-tabs/index.js +0 -2
- package/dist/ui/schema/client.d.ts +1 -2
- package/dist/ui/schema/client.js +0 -2
- package/dist/ui/schema/index.d.ts +3 -4
- package/dist/ui/schema/index.js +1 -3
- package/dist/utils/deep-equal.js +0 -2
- package/dist/utils/document/dereference.d.ts +1 -2
- package/dist/utils/document/dereference.js +0 -2
- package/dist/utils/document/process.d.ts +1 -2
- package/dist/utils/document/process.js +0 -2
- package/dist/utils/id-to-title.js +0 -2
- package/dist/utils/is-plain-object.js +0 -2
- package/dist/utils/pages/builder.d.ts +1 -2
- package/dist/utils/pages/builder.js +0 -2
- package/dist/utils/pages/preset-auto.d.ts +1 -2
- package/dist/utils/pages/preset-auto.js +0 -2
- package/dist/utils/pages/to-static-data.js +0 -2
- package/dist/utils/pages/to-text.d.ts +1 -2
- package/dist/utils/pages/to-text.js +0 -2
- package/dist/utils/remove-undefined.js +0 -2
- package/dist/utils/schema/dereference.js +22 -14
- package/dist/utils/schema/index.d.ts +1 -6
- package/dist/utils/schema/index.js +0 -2
- package/dist/utils/{merge-schema.js → schema/merge.js} +2 -4
- package/dist/utils/schema/pick.js +0 -2
- package/dist/utils/schema/ref.js +0 -2
- package/dist/utils/schema/resolve-ref.js +0 -2
- package/dist/utils/schema/to-string.js +4 -7
- package/dist/utils/url.js +0 -2
- package/dist/utils/use-query.js +0 -2
- package/package.json +1 -1
- package/dist/_openapi/types.d.ts.map +0 -1
- package/dist/generate-file.d.ts.map +0 -1
- package/dist/generate-file.js.map +0 -1
- package/dist/i18n.d.ts.map +0 -1
- package/dist/i18n.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/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/all.d.ts.map +0 -1
- package/dist/requests/generators/all.js.map +0 -1
- package/dist/requests/generators/csharp.d.ts.map +0 -1
- package/dist/requests/generators/csharp.js.map +0 -1
- package/dist/requests/generators/curl.d.ts.map +0 -1
- package/dist/requests/generators/curl.js.map +0 -1
- package/dist/requests/generators/go.d.ts.map +0 -1
- package/dist/requests/generators/go.js.map +0 -1
- package/dist/requests/generators/index.d.ts.map +0 -1
- package/dist/requests/generators/index.js.map +0 -1
- package/dist/requests/generators/java.d.ts.map +0 -1
- package/dist/requests/generators/java.js.map +0 -1
- package/dist/requests/generators/javascript.d.ts.map +0 -1
- package/dist/requests/generators/javascript.js.map +0 -1
- package/dist/requests/generators/python.d.ts.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/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/base.d.ts.map +0 -1
- package/dist/ui/base.js.map +0 -1
- package/dist/ui/client/boundary.d.ts.map +0 -1
- package/dist/ui/client/boundary.js.map +0 -1
- package/dist/ui/client/boundary.lazy.js.map +0 -1
- package/dist/ui/client/full.js.map +0 -1
- package/dist/ui/client/i18n.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/codeblock.d.ts.map +0 -1
- package/dist/ui/components/codeblock.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-tab.js.map +0 -1
- package/dist/ui/components/select.js.map +0 -1
- package/dist/ui/contexts/api.d.ts.map +0 -1
- package/dist/ui/contexts/api.js.map +0 -1
- package/dist/ui/create-client.d.ts.map +0 -1
- package/dist/ui/create-client.js.map +0 -1
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/operation/client.js.map +0 -1
- package/dist/ui/operation/get-example-requests.d.ts.map +0 -1
- package/dist/ui/operation/get-example-requests.js.map +0 -1
- package/dist/ui/operation/index.js.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.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/client.js.map +0 -1
- package/dist/ui/operation/usage-tabs/index.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/utils/deep-equal.js.map +0 -1
- package/dist/utils/document/dereference.d.ts.map +0 -1
- package/dist/utils/document/dereference.js.map +0 -1
- package/dist/utils/document/process.d.ts.map +0 -1
- package/dist/utils/document/process.js.map +0 -1
- package/dist/utils/id-to-title.js.map +0 -1
- package/dist/utils/is-plain-object.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-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/remove-undefined.js.map +0 -1
- package/dist/utils/schema/dereference.js.map +0 -1
- package/dist/utils/schema/index.d.ts.map +0 -1
- package/dist/utils/schema/index.js.map +0 -1
- package/dist/utils/schema/pick.js.map +0 -1
- package/dist/utils/schema/ref.js.map +0 -1
- package/dist/utils/schema/resolve-ref.js.map +0 -1
- package/dist/utils/schema/to-string.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":"index.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/index.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport {\n type CodeUsageGeneratorRegistry,\n createCodeUsageGeneratorRegistry,\n} from '@/requests/generators';\nimport {\n CodeBlockTab,\n CodeBlockTabs,\n CodeBlockTabsList,\n CodeBlockTabsTrigger,\n} from 'fumadocs-ui/components/codeblock';\nimport { ResponseTabs } from '../response-tabs';\nimport { registerDefault } from '@/requests/generators/all';\nimport { useMemo } from 'react';\n\nexport function UsageTabs({ method, ctx }: { method: MethodInformation; ctx: RenderContext }) {\n let { renderAPIExampleUsageTabs, renderAPIExampleLayout } = ctx.content ?? {};\n\n renderAPIExampleLayout ??= (slots) => {\n return (\n <div className=\"prose-no-margin\">\n {slots.selector}\n {slots.usageTabs}\n {slots.responseTabs}\n </div>\n );\n };\n\n renderAPIExampleUsageTabs ??= (registry) => {\n const map = Array.from(registry.map().entries());\n if (map.length === 0) return null;\n\n return (\n <CodeBlockTabs groupId=\"fumadocs_openapi_requests\" defaultValue={map[0][0]}>\n <CodeBlockTabsList>\n {map.map(([id, item]) => (\n <CodeBlockTabsTrigger key={id} value={id}>\n {item.label ?? item.lang}\n </CodeBlockTabsTrigger>\n ))}\n </CodeBlockTabsList>\n {map.map(([id, item]) => (\n <CodeBlockTab key={id} value={id}>\n <ctx.clientBoundary.UsageTab id={id} lang={item.lang} _client={item._client} />\n </CodeBlockTab>\n ))}\n </CodeBlockTabs>\n );\n };\n\n const registry = useMemo(() => {\n let registry: CodeUsageGeneratorRegistry;\n\n if (ctx.codeUsages) {\n registry = createCodeUsageGeneratorRegistry(ctx.codeUsages);\n } else {\n registry = createCodeUsageGeneratorRegistry();\n registerDefault(registry);\n }\n\n for (const gen of ctx.generateCodeSamples?.(method) ?? []) {\n registry.addInline(gen);\n }\n\n if (method['x-codeSamples']) {\n for (const sample of method['x-codeSamples']) {\n registry.addInline(sample);\n }\n }\n\n return registry;\n }, [ctx, method]);\n\n return renderAPIExampleLayout(\n {\n selector: method['x-exclusiveCodeSample'] ? null : <ctx.clientBoundary.UsageTabsSelector />,\n usageTabs: renderAPIExampleUsageTabs(registry, ctx),\n responseTabs: <ResponseTabs operation={method} ctx={ctx} />,\n },\n ctx,\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,UAAU,EAAE,QAAQ,OAA0D;CAC5F,IAAI,EAAE,2BAA2B,2BAA2B,IAAI,WAAW,EAAE;AAE7E,6BAA4B,UAAU;AACpC,SACE,qBAAC,OAAD;GAAK,WAAU;aAAf;IACG,MAAM;IACN,MAAM;IACN,MAAM;IACH;;;AAIV,gCAA+B,aAAa;EAC1C,MAAM,MAAM,MAAM,KAAK,SAAS,KAAK,CAAC,SAAS,CAAC;AAChD,MAAI,IAAI,WAAW,EAAG,QAAO;AAE7B,SACE,qBAAC,eAAD;GAAe,SAAQ;GAA4B,cAAc,IAAI,GAAG;aAAxE,CACE,oBAAC,mBAAD,EAAA,UACG,IAAI,KAAK,CAAC,IAAI,UACb,oBAAC,sBAAD;IAA+B,OAAO;cACnC,KAAK,SAAS,KAAK;IACC,EAFI,GAEJ,CACvB,EACgB,CAAA,EACnB,IAAI,KAAK,CAAC,IAAI,UACb,oBAAC,cAAD;IAAuB,OAAO;cAC5B,oBAAC,IAAI,eAAe,UAApB;KAAiC;KAAI,MAAM,KAAK;KAAM,SAAS,KAAK;KAAW,CAAA;IAClE,EAFI,GAEJ,CACf,CACY;;;CAIpB,MAAM,WAAW,cAAc;EAC7B,IAAI;AAEJ,MAAI,IAAI,WACN,YAAW,iCAAiC,IAAI,WAAW;OACtD;AACL,cAAW,kCAAkC;AAC7C,mBAAgB,SAAS;;AAG3B,OAAK,MAAM,OAAO,IAAI,sBAAsB,OAAO,IAAI,EAAE,CACvD,UAAS,UAAU,IAAI;AAGzB,MAAI,OAAO,iBACT,MAAK,MAAM,UAAU,OAAO,iBAC1B,UAAS,UAAU,OAAO;AAI9B,SAAO;IACN,CAAC,KAAK,OAAO,CAAC;AAEjB,QAAO,uBACL;EACE,UAAU,OAAO,2BAA2B,OAAO,oBAAC,IAAI,eAAe,mBAApB,EAAwC,CAAA;EAC3F,WAAW,0BAA0B,UAAU,IAAI;EACnD,cAAc,oBAAC,cAAD;GAAc,WAAW;GAAa;GAAO,CAAA;EAC5D,EACD,IACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","names":[],"sources":["../../../src/ui/schema/client.tsx"],"mappings":";;;;UAkEiB,aAAA;EACf,IAAA;EACA,QAAA;EACA,EAAA;EAEA,SAAA,EAAW,qBAAA;AAAA;AAAA,iBAGG,QAAA,CAAA;EAAW,IAAA;EAAM,QAAA;EAAkB,EAAA;EAAiB;AAAA,GAAa,aAAA,GAAa,oBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deep-equal.js","names":[],"sources":["../../src/utils/deep-equal.ts"],"sourcesContent":["import { isPlainObject } from './is-plain-object';\n\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) {\n return true;\n }\n\n if (a == null || b == null) {\n return false;\n }\n\n if (typeof a !== 'object' || typeof b !== 'object') {\n return false;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((item, index) => deepEqual(item, b[index]));\n }\n\n if (Array.isArray(a) || Array.isArray(b)) {\n return false;\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n return keysA.every((key) => key in b && deepEqual(a[key], b[key]));\n }\n\n return false;\n}\n"],"mappings":";;AAEA,SAAgB,UAAU,GAAY,GAAqB;AACzD,KAAI,MAAM,EACR,QAAO;AAGT,KAAI,KAAK,QAAQ,KAAK,KACpB,QAAO;AAGT,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,QAAO;AAGT,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;AACxC,MAAI,EAAE,WAAW,EAAE,OACjB,QAAO;AAET,SAAO,EAAE,OAAO,MAAM,UAAU,UAAU,MAAM,EAAE,OAAO,CAAC;;AAG5D,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,CACtC,QAAO;AAGT,KAAI,cAAc,EAAE,IAAI,cAAc,EAAE,EAAE;EACxC,MAAM,QAAQ,OAAO,KAAK,EAAE;EAC5B,MAAM,QAAQ,OAAO,KAAK,EAAE;AAE5B,MAAI,MAAM,WAAW,MAAM,OACzB,QAAO;AAGT,SAAO,MAAM,OAAO,QAAQ,OAAO,KAAK,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC;;AAGpE,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dereference.d.ts","names":[],"sources":["../../../src/utils/document/dereference.ts"],"mappings":";;;;UAKiB,oBAAA;;AAAjB;;EAIE,YAAA,EAAc,WAAA,CAAY,QAAA;EAAA;;;EAK1B,SAAA,GAAY,GAAA;EAEZ,OAAA,EAAS,QAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dereference.js","names":[],"sources":["../../../src/utils/document/dereference.ts"],"sourcesContent":["import type { JSONSchema } from 'json-schema-typed/draft-2020-12';\nimport type { NoReference } from '../schema';\nimport { dereferenceSync } from '../schema/dereference';\nimport type { Document } from '@/types';\n\nexport interface DereferencedDocument {\n /**\n * dereferenced document\n */\n dereferenced: NoReference<Document>;\n\n /**\n * Get raw $ref from dereferenced object\n */\n getRawRef: (obj: object) => string | undefined;\n\n bundled: Document;\n}\n\nexport function dereferenceDocument(bundled: Document): DereferencedDocument {\n /**\n * Dereferenced value and its original `$ref` value\n */\n const dereferenceMap = new Map<object, string>();\n\n return {\n bundled,\n dereferenced: dereferenceSync(bundled as JSONSchema, (schema, ref) => {\n dereferenceMap.set(schema as object, ref);\n }) as NoReference<Document>,\n getRawRef(obj: object) {\n return dereferenceMap.get(obj);\n },\n };\n}\n"],"mappings":";;AAmBA,SAAgB,oBAAoB,SAAyC;;;;CAI3E,MAAM,iCAAiB,IAAI,KAAqB;AAEhD,QAAO;EACL;EACA,cAAc,gBAAgB,UAAwB,QAAQ,QAAQ;AACpE,kBAAe,IAAI,QAAkB,IAAI;IACzC;EACF,UAAU,KAAa;AACrB,UAAO,eAAe,IAAI,IAAI;;EAEjC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process.d.ts","names":[],"sources":["../../../src/utils/document/process.ts"],"mappings":";;;KAMY,iBAAA,GAAoB,oBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","names":[],"sources":["../../../src/utils/document/process.ts"],"sourcesContent":["import type { Document } from '@/types';\nimport { bundle } from '@scalar/json-magic/bundle';\nimport { upgrade } from '@scalar/openapi-upgrader';\nimport { fetchUrls, readFiles } from '@scalar/json-magic/bundle/plugins/node';\nimport { dereferenceDocument, type DereferencedDocument } from './dereference';\n\nexport type ProcessedDocument = DereferencedDocument;\n\n/**\n * process & reference input document to a Fumadocs OpenAPI compatible format\n */\nexport async function processDocument(input: string | Document): Promise<ProcessedDocument> {\n const bundled: Document = await bundle(input, {\n plugins: [fetchUrls(), readFiles()],\n treeShake: true,\n hooks: {\n onResolveError(node) {\n throw new Error(`Failed to resolve ${node.$ref}`);\n },\n },\n })\n .then((v) => upgrade(v as never, '3.2') as Document)\n .catch((e) => {\n throw new Error(`[OpenAPI] Failed to resolve input: ${input}`, {\n cause: e,\n });\n });\n return dereferenceDocument(bundled);\n}\n"],"mappings":";;;;;;;;AAWA,eAAsB,gBAAgB,OAAsD;AAgB1F,QAAO,oBAfmB,MAAM,OAAO,OAAO;EAC5C,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC;EACnC,WAAW;EACX,OAAO,EACL,eAAe,MAAM;AACnB,SAAM,IAAI,MAAM,qBAAqB,KAAK,OAAO;KAEpD;EACF,CAAC,CACC,MAAM,MAAM,QAAQ,GAAY,MAAM,CAAa,CACnD,OAAO,MAAM;AACZ,QAAM,IAAI,MAAM,sCAAsC,SAAS,EAC7D,OAAO,GACR,CAAC;GACF,CAC+B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id-to-title.js","names":[],"sources":["../../src/utils/id-to-title.ts"],"sourcesContent":["export function idToTitle(id: string): string {\n let result: string[] = [];\n\n for (const c of id) {\n if (result.length === 0) result.push(c.toLocaleUpperCase());\n // ignore the other parts surrounded with '.', like 'migrations.dev' -> 'dev'\n else if (c === '.') result = [];\n else if (/^[A-Z]$/.test(c) && result.at(-1) !== ' ') result.push(' ', c);\n else if (c === '-') result.push(' ');\n else result.push(c);\n }\n\n return result.join('');\n}\n"],"mappings":";AAAA,SAAgB,UAAU,IAAoB;CAC5C,IAAI,SAAmB,EAAE;AAEzB,MAAK,MAAM,KAAK,GACd,KAAI,OAAO,WAAW,EAAG,QAAO,KAAK,EAAE,mBAAmB,CAAC;UAElD,MAAM,IAAK,UAAS,EAAE;UACtB,UAAU,KAAK,EAAE,IAAI,OAAO,GAAG,GAAG,KAAK,IAAK,QAAO,KAAK,KAAK,EAAE;UAC/D,MAAM,IAAK,QAAO,KAAK,IAAI;KAC/B,QAAO,KAAK,EAAE;AAGrB,QAAO,OAAO,KAAK,GAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"is-plain-object.js","names":[],"sources":["../../src/utils/is-plain-object.ts"],"sourcesContent":["export function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return (\n prototype === null ||\n prototype === Object.prototype ||\n Object.getPrototypeOf(prototype) === null\n );\n}\n"],"mappings":";AAAA,SAAgB,cAAc,OAAkD;AAC9E,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO;CAGT,MAAM,YAAY,OAAO,eAAe,MAAM;AAC9C,QACE,cAAc,QACd,cAAc,OAAO,aACrB,OAAO,eAAe,UAAU,KAAK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-schema.js","names":[],"sources":["../../src/utils/merge-schema.ts"],"sourcesContent":["import { type ParsedSchema } from '@/utils/schema';\nimport { deepEqual } from './deep-equal';\n\ninterface Options {\n dereference?: (schema: ParsedSchema) => ParsedSchema | undefined;\n}\n\n/**\n * Merge `allOf` object schema\n */\nexport function mergeAllOf(schema: ParsedSchema, options: Options = {}): ParsedSchema {\n if (typeof schema === 'boolean') return schema;\n\n const { dereference } = options;\n if (dereference && '$ref' in schema && typeof schema.$ref === 'string') {\n schema = dereference(schema) ?? schema;\n }\n\n if (typeof schema === 'boolean' || !schema.allOf) return schema;\n\n const { allOf, ...rest } = schema;\n let result: ParsedSchema = rest;\n for (const item of allOf) {\n result = intersection(result, item, options);\n }\n return result;\n}\n\nfunction intersection(a: ParsedSchema, b: ParsedSchema, options: Options): ParsedSchema {\n a = mergeAllOf(a, options);\n b = mergeAllOf(b, options);\n if (typeof a === 'boolean' && typeof b === 'boolean') return a && b;\n if (typeof a === 'boolean') return a;\n if (typeof b === 'boolean') return b;\n\n for (const unionField of ['anyOf', 'oneOf'] as const) {\n if (a[unionField] === undefined && b[unionField] !== undefined) {\n return {\n ...b,\n [unionField]: b[unionField].map((item) => intersection(item, a, options)),\n };\n }\n if (a[unionField] !== undefined && b[unionField] === undefined) {\n return {\n ...a,\n [unionField]: a[unionField].map((item) => intersection(item, b, options)),\n };\n }\n }\n\n const result: ParsedSchema = { ...a };\n for (const _k in b) {\n const key = _k as keyof typeof b;\n\n switch (key) {\n case '$id':\n case '$comment':\n case 'description':\n case 'examples':\n case 'allOf':\n case 'writeOnly':\n case 'readOnly':\n // ignored\n break;\n case 'title': {\n const value = b[key];\n if (value === undefined) break;\n if (result[key]) {\n result[key] = `${result[key]} & ${value}`;\n } else {\n result[key] = value;\n }\n break;\n }\n case 'minItems':\n case 'minimum':\n case 'exclusiveMinimum':\n case 'minProperties':\n case 'minContains':\n case 'minLength': {\n const value = b[key];\n if (value === undefined) break;\n result[key] = result[key] === undefined ? value : Math.max(result[key], value);\n break;\n }\n case 'maxContains':\n case 'maxItems':\n case 'maxLength':\n case 'maxProperties':\n case 'maximum':\n case 'exclusiveMaximum': {\n const value = b[key];\n if (value === undefined) break;\n result[key] = result[key] === undefined ? value : Math.min(result[key], value);\n break;\n }\n case 'enum': {\n const value = b[key];\n if (value === undefined) break;\n\n result[key] = result[key] === undefined ? value : intersectArray(result[key], value);\n break;\n }\n case 'anyOf':\n case 'oneOf': {\n const value = b[key];\n if (value !== undefined && result[key] !== undefined) {\n // Cross-product: each combination of items from both arrays\n const product: ParsedSchema[] = [];\n for (const aItem of result[key]) {\n for (const bItem of value) {\n const merged = intersection(aItem, bItem, options);\n if (merged !== false) product.push(merged);\n }\n }\n result[key] = product;\n }\n break;\n }\n // require same\n case 'format':\n case 'const':\n case 'type': {\n const value = b[key];\n if (value === undefined) break;\n result[key] ??= value;\n\n if (!deepEqual(result[key], value)) return false;\n break;\n }\n // add\n case 'required': {\n const value = b[key];\n if (value === undefined) break;\n result[key] = [...(result[key] ?? []), ...value];\n break;\n }\n case 'properties':\n case 'patternProperties': {\n const value = b[key];\n if (value === undefined) break;\n\n if (result[key] === undefined) {\n result[key] = value;\n break;\n }\n\n const out: Record<string, ParsedSchema> = {};\n const allProps = new Set<string>();\n for (const k in result[key]) allProps.add(k);\n for (const k in value) allProps.add(k);\n\n for (const prop of allProps) {\n const aProp = result[key][prop];\n const bProp = value[prop];\n if (aProp === undefined) {\n out[prop] = bProp;\n } else if (bProp === undefined) {\n out[prop] = aProp;\n } else {\n out[prop] = intersection(aProp, bProp, options);\n }\n }\n\n result[key] = out;\n break;\n }\n case 'additionalProperties':\n case 'additionalItems':\n case 'contains':\n case 'items': {\n const value = b[key];\n if (value === undefined) break;\n\n result[key] = result[key] === undefined ? value : intersection(result[key], value, options);\n break;\n }\n case 'not': {\n const value = b[key];\n if (value === undefined) break;\n\n if (result[key] && value) {\n result.not = { anyOf: [result[key], value] };\n } else if (value) {\n result.not = value;\n }\n break;\n }\n default:\n result[key] = b[key];\n }\n }\n\n return result;\n}\n\nfunction intersectArray<T>(a: readonly T[], b: readonly T[]): T[] {\n const out = new Set<T>();\n for (const item of a) {\n if (b.includes(item)) out.add(item);\n }\n for (const item of b) {\n if (a.includes(item)) out.add(item);\n }\n return Array.from(out);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","names":[],"sources":["../../../src/utils/pages/builder.ts"],"mappings":";;;;;;;UAOU,SAAA;EACR,IAAA;EACA,QAAA;EACA,IAAA;IACE,KAAA;IACA,WAAA;EAAA;AAAA;AAAA,UAIa,eAAA,SAAwB,SAAA;EACvC,IAAA;EACA,IAAA,EAAM,aAAA;AAAA;AAAA,UAGS,aAAA,SAAsB,SAAA;EACrC,IAAA;EACA,IAAA,EAAM,WAAA;AAAA;AAAA,UAGS,UAAA,SAAmB,SAAA;EAClC,IAAA;EACA,UAAA,EAAY,aAAA;EACZ,QAAA,EAAU,WAAA;EAXV;EAaA,GAAA,GAAM,SAAA;AAAA;AAAA,UAGS,WAAA,SAAoB,SAAA;EACnC,IAAA;EACA,OAAA,EAAS,WAAA;;EAET,GAAA,GAAM,SAAA;AAAA;AAAA,KAGI,WAAA,GAAc,UAAA,GAAa,eAAA,GAAkB,aAAA,GAAgB,WAAA;AAAA,UAExD,kBAAA;EACf,OAAA,GAAU,OAAA,EAAS,YAAA;AAAA;AAAA,UAGJ,YAAA;EArBA;;;EAyBf,EAAA;EACA,QAAA,EAAU,oBAAA;EArBJ;;;EAyBN,MAAA,GAAS,KAAA,EAAO,WAAA;EA9BkB;;;EAmClC,mBAAA,GAAsB,IAAA;EAhCtB;;;EAqCA,OAAA,QAAe,aAAA;EACf,oBAAA,GAAuB,IAAA,EAAM,WAAA;IAAA,IAEnB,WAAA;IACJ,QAAA,EAAU,WAAA,CAAY,cAAA;IACtB,SAAA,EAAW,WAAA,CAAY,eAAA;EAAA;EAG7B,sBAAA,GAAyB,IAAA,EAAM,aAAA;IAAA,IAErB,WAAA;IACJ,QAAA,EAAU,WAAA,CAAY,cAAA;IACtB,SAAA,EAAW,WAAA,CAAY,eAAA;EAAA;EAG7B,OAAA,GAAU,GAAA,EAAK,SAAA;IAAA,IACT,WAAA;EAAA;EAEN,WAAA,GAAc,GAAA;IAER,IAAA,EAAM,SAAA;IAAA,IACF,WAAA;EAAA;AAAA;AAAA,UAKF,aAAA;EACR,QAAA,GAAW,WAAA;IAAgB,IAAA;EAAA;EAC3B,UAAA,GAAa,aAAA;IACX,IAAA;EAAA;AAAA;AAAA,iBAIkB,UAAA,CACpB,MAAA,EAAQ,aAAA,EACR,MAAA,EAAQ,kBAAA,GACP,OAAA,CAAQ,MAAA,SAAe,WAAA;AAAA,iBAgBV,UAAA,CACd,QAAA,UACA,SAAA,EAAW,oBAAA,EACX,MAAA,EAAQ,kBAAA,GACP,WAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","names":[],"sources":["../../../src/utils/pages/builder.ts"],"sourcesContent":["import type { DereferencedDocument } from '@/utils/document/dereference';\nimport type { OpenAPIServer } from '@/server';\nimport type { OperationItem, WebhookItem } from '@/ui/api-page';\nimport type { OperationObject, PathItemObject, TagObject } from '@/types';\nimport { getTagDisplayName, methodKeys, type NoReference } from '@/utils/schema';\nimport { idToTitle } from '@/utils/id-to-title';\n\ninterface BaseEntry {\n path: string;\n schemaId: string;\n info: {\n title: string;\n description?: string;\n };\n}\n\nexport interface OperationOutput extends BaseEntry {\n type: 'operation';\n item: OperationItem;\n}\n\nexport interface WebhookOutput extends BaseEntry {\n type: 'webhook';\n item: WebhookItem;\n}\n\nexport interface PageOutput extends BaseEntry {\n type: 'page';\n operations: OperationItem[];\n webhooks: WebhookItem[];\n /** tag info if the page is generated from a tag. */\n tag?: TagObject;\n}\n\nexport interface OutputGroup extends BaseEntry {\n type: 'group';\n entries: OutputEntry[];\n /** tag info if the group is generated from a tag. */\n tag?: TagObject;\n}\n\nexport type OutputEntry = PageOutput | OperationOutput | WebhookOutput | OutputGroup;\n\nexport interface PagesBuilderConfig {\n toPages: (builder: PagesBuilder) => void;\n}\n\nexport interface PagesBuilder {\n /**\n * the input ID in OpenAPI server\n */\n id: string;\n document: DereferencedDocument;\n /**\n * add output entry.\n */\n create: (entry: OutputEntry) => void;\n\n /**\n * get file path from operation path, useful for generating output paths.\n */\n routePathToFilePath: (path: string) => string;\n\n /**\n * Extract useful info for rendering\n */\n extract: () => ExtractedInfo;\n fromExtractedWebhook: (item: WebhookItem) =>\n | {\n get displayName(): string;\n pathItem: NoReference<PathItemObject>;\n operation: NoReference<OperationObject>;\n }\n | undefined;\n fromExtractedOperation: (item: OperationItem) =>\n | {\n get displayName(): string;\n pathItem: NoReference<PathItemObject>;\n operation: NoReference<OperationObject>;\n }\n | undefined;\n fromTag: (tag: TagObject) => {\n get displayName(): string;\n };\n fromTagName: (tag: string) =>\n | {\n info: TagObject;\n get displayName(): string;\n }\n | undefined;\n}\n\ninterface ExtractedInfo {\n webhooks: (WebhookItem & { tags?: string[] })[];\n operations: (OperationItem & {\n tags?: string[];\n })[];\n}\n\nexport async function fromServer(\n server: OpenAPIServer,\n config: PagesBuilderConfig,\n): Promise<Record<string, OutputEntry[]>> {\n const schemas = await server.getSchemas();\n const generated: Record<string, OutputEntry[]> = {};\n\n const entries = Object.entries(schemas);\n if (entries.length === 0) {\n throw new Error('No input files found.');\n }\n\n for (const [id, schema] of entries) {\n generated[id] = fromSchema(id, schema, config);\n }\n\n return generated;\n}\n\nexport function fromSchema(\n schemaId: string,\n processed: DereferencedDocument,\n config: PagesBuilderConfig,\n): OutputEntry[] {\n const files: OutputEntry[] = [];\n const { toPages } = config;\n const { dereferenced } = processed;\n\n toPages({\n id: schemaId,\n document: processed,\n create(entry) {\n files.push(entry);\n },\n extract() {\n const result: ExtractedInfo = { webhooks: [], operations: [] };\n\n for (const [path, pathItem] of Object.entries(dereferenced.paths ?? {})) {\n if (!pathItem) continue;\n\n for (const methodKey of methodKeys) {\n if (!pathItem[methodKey]) continue;\n\n result.operations.push({\n method: methodKey,\n path,\n tags: pathItem[methodKey]?.tags,\n });\n }\n }\n\n for (const [name, pathItem] of Object.entries(dereferenced.webhooks ?? {})) {\n if (!pathItem) continue;\n\n for (const methodKey of methodKeys) {\n if (!pathItem[methodKey]) continue;\n\n result.webhooks.push({\n method: methodKey,\n name,\n tags: pathItem[methodKey]?.tags,\n });\n }\n }\n\n return result;\n },\n routePathToFilePath(path) {\n return path\n .toLowerCase()\n .replaceAll('.', '-')\n .split('/')\n .flatMap((v) => {\n if (v.startsWith('{') && v.endsWith('}')) return v.slice(1, -1);\n if (v.length === 0) return [];\n return v;\n })\n .join('/');\n },\n fromExtractedWebhook(item) {\n const pathItem = dereferenced.webhooks?.[item.name];\n if (!pathItem) return;\n const operation = pathItem?.[item.method];\n if (!operation) return;\n return {\n pathItem,\n operation,\n get displayName() {\n return operation.summary || pathItem.summary || idToTitle(item.name);\n },\n };\n },\n fromExtractedOperation(item) {\n const pathItem = dereferenced.paths?.[item.path];\n if (!pathItem) return;\n const operation = pathItem?.[item.method];\n if (!operation) return;\n return {\n pathItem,\n operation,\n get displayName() {\n return (\n operation.summary ||\n pathItem.summary ||\n (operation.operationId ? idToTitle(operation.operationId) : item.path)\n );\n },\n };\n },\n fromTag(tag) {\n return {\n get displayName() {\n return getTagDisplayName(tag);\n },\n };\n },\n fromTagName(name) {\n const tag = dereferenced.tags?.find((item) => item.name === name);\n if (!tag) return;\n\n return {\n info: tag,\n ...this.fromTag(tag),\n };\n },\n });\n\n return files;\n}\n"],"mappings":";;;AAmGA,eAAsB,WACpB,QACA,QACwC;CACxC,MAAM,UAAU,MAAM,OAAO,YAAY;CACzC,MAAM,YAA2C,EAAE;CAEnD,MAAM,UAAU,OAAO,QAAQ,QAAQ;AACvC,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,wBAAwB;AAG1C,MAAK,MAAM,CAAC,IAAI,WAAW,QACzB,WAAU,MAAM,WAAW,IAAI,QAAQ,OAAO;AAGhD,QAAO;;AAGT,SAAgB,WACd,UACA,WACA,QACe;CACf,MAAM,QAAuB,EAAE;CAC/B,MAAM,EAAE,YAAY;CACpB,MAAM,EAAE,iBAAiB;AAEzB,SAAQ;EACN,IAAI;EACJ,UAAU;EACV,OAAO,OAAO;AACZ,SAAM,KAAK,MAAM;;EAEnB,UAAU;GACR,MAAM,SAAwB;IAAE,UAAU,EAAE;IAAE,YAAY,EAAE;IAAE;AAE9D,QAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,aAAa,SAAS,EAAE,CAAC,EAAE;AACvE,QAAI,CAAC,SAAU;AAEf,SAAK,MAAM,aAAa,YAAY;AAClC,SAAI,CAAC,SAAS,WAAY;AAE1B,YAAO,WAAW,KAAK;MACrB,QAAQ;MACR;MACA,MAAM,SAAS,YAAY;MAC5B,CAAC;;;AAIN,QAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,aAAa,YAAY,EAAE,CAAC,EAAE;AAC1E,QAAI,CAAC,SAAU;AAEf,SAAK,MAAM,aAAa,YAAY;AAClC,SAAI,CAAC,SAAS,WAAY;AAE1B,YAAO,SAAS,KAAK;MACnB,QAAQ;MACR;MACA,MAAM,SAAS,YAAY;MAC5B,CAAC;;;AAIN,UAAO;;EAET,oBAAoB,MAAM;AACxB,UAAO,KACJ,aAAa,CACb,WAAW,KAAK,IAAI,CACpB,MAAM,IAAI,CACV,SAAS,MAAM;AACd,QAAI,EAAE,WAAW,IAAI,IAAI,EAAE,SAAS,IAAI,CAAE,QAAO,EAAE,MAAM,GAAG,GAAG;AAC/D,QAAI,EAAE,WAAW,EAAG,QAAO,EAAE;AAC7B,WAAO;KACP,CACD,KAAK,IAAI;;EAEd,qBAAqB,MAAM;GACzB,MAAM,WAAW,aAAa,WAAW,KAAK;AAC9C,OAAI,CAAC,SAAU;GACf,MAAM,YAAY,WAAW,KAAK;AAClC,OAAI,CAAC,UAAW;AAChB,UAAO;IACL;IACA;IACA,IAAI,cAAc;AAChB,YAAO,UAAU,WAAW,SAAS,WAAW,UAAU,KAAK,KAAK;;IAEvE;;EAEH,uBAAuB,MAAM;GAC3B,MAAM,WAAW,aAAa,QAAQ,KAAK;AAC3C,OAAI,CAAC,SAAU;GACf,MAAM,YAAY,WAAW,KAAK;AAClC,OAAI,CAAC,UAAW;AAChB,UAAO;IACL;IACA;IACA,IAAI,cAAc;AAChB,YACE,UAAU,WACV,SAAS,YACR,UAAU,cAAc,UAAU,UAAU,YAAY,GAAG,KAAK;;IAGtE;;EAEH,QAAQ,KAAK;AACX,UAAO,EACL,IAAI,cAAc;AAChB,WAAO,kBAAkB,IAAI;MAEhC;;EAEH,YAAY,MAAM;GAChB,MAAM,MAAM,aAAa,MAAM,MAAM,SAAS,KAAK,SAAS,KAAK;AACjE,OAAI,CAAC,IAAK;AAEV,UAAO;IACL,MAAM;IACN,GAAG,KAAK,QAAQ,IAAI;IACrB;;EAEJ,CAAC;AAEF,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preset-auto.d.ts","names":[],"sources":["../../../src/utils/pages/preset-auto.ts"],"mappings":";;;;;UAcU,eAAA,SAAwB,UAAA;;AAFc;;EAM9C,GAAA;EAe8B;;;;;;;;;EAJ9B,OAAA,gCAIM,KAAA,EAAO,gBAAA,CAAiB,eAAA,GAAkB,aAAA;EAnBhB;;;EAwBhC,IAAA,GAAO,MAAA,CAAO,eAAA,GAAkB,aAAA,IAAiB,aAAA;AAAA;AAAA,UAGzC,SAAA,SAAkB,UAAA;EARpB;;;EAYN,GAAA;EAPgC;;;EAYhC,IAAA,GAAO,MAAA,CAAO,UAAA,IAAc,aAAA;AAAA;AAAA,UAGpB,YAAA,SAAqB,UAAA;;;;EAI7B,GAAA;EAhB0B;;;EAqB1B,IAAA,GAAO,MAAA,CAAO,UAAA,IAAc,aAAA;AAAA;AAAA,KAGlB,oBAAA,GACR,YAAA,GACA,SAAA,GACA,eAAA;EAEE,GAAA;AAAA,IACE,kBAAA;AAAA,KAEH,MAAA,eACW,eAAA,GAAkB,aAAA,GAAgB,UAAA,GAC5C,eAAA,GACA,aAAA,GACA,UAAA,KAEJ,IAAA,EAAM,YAAA,EACN,MAAA,EAAQ,gBAAA,CAAiB,KAAA,WACzB,QAAA,EAAU,oBAAA;AAAA,UAGF,aAAA;EAlCiC;AAAA;;;;;;;EA2CzC,SAAA;AAAA;AAAA,UAGQ,UAAA;EAvCR;;;;;EA6CA,OAAA,IAAW,IAAA;AAAA;AAAA,iBAGG,gBAAA,CAAiB,OAAA,EAAS,oBAAA,GAAuB,kBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preset-auto.js","names":["path"],"sources":["../../../src/utils/pages/preset-auto.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { DereferencedDocument } from '@/utils/document/dereference';\nimport type {\n OperationOutput,\n OutputEntry,\n OutputGroup,\n PageOutput,\n PagesBuilder,\n PagesBuilderConfig,\n WebhookOutput,\n} from '@/utils/pages/builder';\nimport { isUrl } from '@/utils/url';\nimport type { DistributiveOmit } from '@/types';\n\ninterface OperationConfig extends BaseConfig {\n /**\n * Generate a page for each API endpoint/operation (default).\n */\n per?: 'operation';\n\n /**\n * Group output using folders (Only works on `operation` mode)\n * - tag: `{tag}/{file}`\n * - route: `{endpoint}/{method}` (it will ignore the `name` option)\n * - none: `{file}` (default)\n * - a function that aligns group name (folder path) to each entry\n *\n * @defaultValue 'none'\n */\n groupBy?:\n | 'tag'\n | 'route'\n | 'none'\n | ((entry: DistributiveOmit<OperationOutput | WebhookOutput, 'path'>) => string);\n\n /**\n * Specify name for output file\n */\n name?: NameFn<OperationOutput | WebhookOutput> | NameFnOptions;\n}\n\ninterface TagConfig extends BaseConfig {\n /**\n * Generate a page for each tag.\n */\n per: 'tag';\n\n /**\n * Specify name for output file\n */\n name?: NameFn<PageOutput> | NameFnOptions;\n}\n\ninterface SchemaConfig extends BaseConfig {\n /**\n * Generate a page for each schema file.\n */\n per: 'file';\n\n /**\n * Specify name for output file\n */\n name?: NameFn<PageOutput> | NameFnOptions;\n}\n\nexport type SchemaToPagesOptions =\n | SchemaConfig\n | TagConfig\n | OperationConfig\n | ({\n per: 'custom';\n } & PagesBuilderConfig);\n\ntype NameFn<\n Entry extends OperationOutput | WebhookOutput | PageOutput =\n | OperationOutput\n | WebhookOutput\n | PageOutput,\n> = (\n this: PagesBuilder,\n output: DistributiveOmit<Entry, 'path'>,\n document: DereferencedDocument['dereferenced'],\n) => string;\n\ninterface NameFnOptions {\n /**\n * The version of algorithm used to generate file paths.\n *\n * v1: Fumadocs OpenAPI v8\n * v2: Fumadocs OpenAPI v9\n *\n * @defaultValue v2\n */\n algorithm?: 'v2' | 'v1';\n}\n\ninterface BaseConfig {\n /**\n * Custom function to convert names into file names.\n *\n * By default, it only escapes whitespaces and upper case (English) characters\n */\n slugify?: (name: string) => string;\n}\n\nexport function createAutoPreset(options: SchemaToPagesOptions): PagesBuilderConfig {\n if (options.per === 'custom') return options;\n const {\n slugify = (s) => {\n return s.replace(/\\s+/g, '-').toLowerCase();\n },\n } = options;\n let nameFn: NameFn;\n\n if (typeof options.name === 'function') {\n nameFn = options.name as NameFn;\n } else {\n const { algorithm = 'v2' } = options.name ?? {};\n\n nameFn = function (result, document) {\n if (result.type === 'page') {\n if (result.tag) return slugify(result.tag.name!);\n const schemaId = result.schemaId;\n\n return isUrl(schemaId) ? 'index' : path.basename(schemaId, path.extname(schemaId));\n }\n\n if (result.type === 'operation') {\n const operation = document.paths![result.item.path]![result.item.method]!;\n\n if (algorithm === 'v2' && operation.operationId) {\n return operation.operationId;\n }\n\n return path.join(\n this.routePathToFilePath(result.item.path),\n result.item.method.toLowerCase(),\n );\n }\n\n const hook = document.webhooks![result.item.name][result.item.method]!;\n\n if (algorithm === 'v2' && hook.operationId) {\n return hook.operationId;\n }\n\n return slugify(result.item.name);\n };\n }\n\n function group(\n builder: PagesBuilder,\n entries: DistributiveOmit<OperationOutput | WebhookOutput, 'path'>[],\n ): OutputEntry[] {\n const groups = new Map<string, OutputGroup>();\n const rest: OutputEntry[] = [];\n const { dereferenced } = builder.document;\n const { groupBy = 'none' } = options as OperationConfig;\n\n for (const entry of entries) {\n switch (groupBy) {\n case 'route': {\n const groupName = builder.routePathToFilePath(\n entry.type === 'operation' ? entry.item.path : entry.item.name,\n );\n\n let group = groups.get(groupName);\n if (!group) {\n group = {\n type: 'group',\n info: { title: groupName },\n entries: [],\n schemaId: builder.id,\n path: groupName,\n };\n groups.set(groupName, group);\n }\n\n group.entries.push({\n ...entry,\n path: path.join(groupName, `${entry.item.method.toLowerCase()}.mdx`),\n });\n break;\n }\n case 'tag': {\n let tags =\n entry.type === 'operation'\n ? dereferenced.paths![entry.item.path]![entry.item.method]!.tags\n : dereferenced.webhooks![entry.item.name][entry.item.method]!.tags;\n\n if (!tags || tags.length === 0) {\n console.warn(\n 'When `groupBy` is set to `tag`, make sure a `tags` is defined for every operation schema.',\n );\n\n tags = ['unknown'];\n }\n\n for (const tag of tags) {\n const groupName = slugify(tag);\n const { displayName, info } = builder.fromTagName(tag)!;\n let group = groups.get(groupName);\n if (!group) {\n group = {\n type: 'group',\n info: { title: displayName, description: info.description },\n tag: info,\n entries: [],\n schemaId: builder.id,\n path: groupName,\n };\n groups.set(groupName, group);\n }\n\n group.entries.push({\n ...entry,\n path: path.join(groupName, `${nameFn.call(builder, entry, dereferenced)}.mdx`),\n });\n }\n\n break;\n }\n default: {\n const fileName = `${nameFn.call(builder, entry, dereferenced)}.mdx`;\n\n if (typeof groupBy === 'function') {\n const groupDisplayName = groupBy(entry);\n const groupName = slugify(groupDisplayName);\n\n let group = groups.get(groupName);\n if (!group) {\n group = {\n type: 'group',\n info: { title: groupDisplayName },\n entries: [],\n schemaId: builder.id,\n path: groupName,\n };\n groups.set(groupName, group);\n }\n\n group.entries.push({\n ...entry,\n path: path.join(groupName, fileName),\n });\n break;\n }\n\n rest.push({\n ...entry,\n path: fileName,\n });\n }\n }\n }\n\n rest.push(...groups.values());\n return rest;\n }\n\n return {\n toPages(builder) {\n const { dereferenced } = builder.document;\n const items = builder.extract();\n\n if (options.per === 'file') {\n const entry: PageOutput = {\n type: 'page',\n schemaId: builder.id,\n path: '',\n info: {\n title: dereferenced.info?.title ?? 'Unknown',\n description: dereferenced.info?.description,\n },\n ...items,\n };\n entry.path = `${nameFn.call(builder, entry, dereferenced)}.mdx`;\n builder.create(entry);\n return;\n }\n\n if (options.per === 'tag') {\n const tags = dereferenced.tags ?? [];\n\n for (const tag of tags) {\n const { displayName } = builder.fromTag(tag);\n const entry: PageOutput = {\n type: 'page',\n path: '',\n schemaId: builder.id,\n info: {\n title: displayName,\n description: tag.description,\n },\n webhooks: items.webhooks.filter((webhook) => webhook.tags?.includes(tag.name!)),\n operations: items.operations.filter((op) => op.tags?.includes(tag.name!)),\n tag,\n };\n\n entry.path = `${nameFn.call(builder, entry, dereferenced)}.mdx`;\n builder.create(entry);\n }\n\n return;\n }\n\n const entries: DistributiveOmit<OperationOutput | WebhookOutput, 'path'>[] = [];\n for (const op of items.operations) {\n const { pathItem, operation, displayName } = builder.fromExtractedOperation(op)!;\n\n entries.push({\n type: 'operation',\n schemaId: builder.id,\n item: op,\n info: {\n title: displayName,\n description: operation.description ?? pathItem.description,\n },\n });\n }\n\n for (const webhook of items.webhooks) {\n const { pathItem, operation, displayName } = builder.fromExtractedWebhook(webhook)!;\n\n entries.push({\n type: 'webhook',\n schemaId: builder.id,\n info: {\n title: displayName,\n description: operation.description ?? pathItem.description,\n },\n item: webhook,\n });\n }\n\n for (const entry of group(builder, entries)) {\n builder.create(entry);\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-static-data.js","names":[],"sources":["../../../src/utils/pages/to-static-data.ts"],"sourcesContent":["import type { NoReference } from '@/utils/schema';\nimport type { Document, OperationObject } from '@/types';\nimport Slugger from 'github-slugger';\nimport { idToTitle } from '@/utils/id-to-title';\nimport type { TOCItemType } from 'fumadocs-core/toc';\nimport type { StructuredData } from 'fumadocs-core/mdx-plugins';\nimport type { ApiPageProps } from '@/ui';\n\nexport function toStaticData(\n page: ApiPageProps,\n dereferenced: NoReference<Document>,\n): {\n toc: TOCItemType[];\n structuredData: StructuredData;\n} {\n const slugger = new Slugger();\n const toc: TOCItemType[] = [];\n const structuredData: StructuredData = { headings: [], contents: [] };\n\n function pathItem(item: NoReference<OperationObject>, defaultTitle: string) {\n if (page.showTitle && item.operationId) {\n const title = item.summary || (item.operationId ? idToTitle(item.operationId) : defaultTitle);\n const id = slugger.slug(title);\n\n toc.push({\n depth: 2,\n title,\n url: `#${id}`,\n });\n structuredData.headings.push({\n content: title,\n id,\n });\n }\n\n if (item.description)\n structuredData.contents.push({\n content: item.description,\n heading: structuredData.headings.at(-1)?.id,\n });\n }\n\n for (const item of page.operations ?? []) {\n const operation = dereferenced.paths?.[item.path]?.[item.method];\n if (!operation) continue;\n\n pathItem(operation, item.path);\n }\n\n for (const item of page.webhooks ?? []) {\n const webhook = dereferenced.webhooks?.[item.name]?.[item.method];\n if (!webhook) continue;\n\n pathItem(webhook, item.name);\n }\n\n return { toc, structuredData };\n}\n"],"mappings":";;;AAQA,SAAgB,aACd,MACA,cAIA;CACA,MAAM,UAAU,IAAI,SAAS;CAC7B,MAAM,MAAqB,EAAE;CAC7B,MAAM,iBAAiC;EAAE,UAAU,EAAE;EAAE,UAAU,EAAE;EAAE;CAErE,SAAS,SAAS,MAAoC,cAAsB;AAC1E,MAAI,KAAK,aAAa,KAAK,aAAa;GACtC,MAAM,QAAQ,KAAK,YAAY,KAAK,cAAc,UAAU,KAAK,YAAY,GAAG;GAChF,MAAM,KAAK,QAAQ,KAAK,MAAM;AAE9B,OAAI,KAAK;IACP,OAAO;IACP;IACA,KAAK,IAAI;IACV,CAAC;AACF,kBAAe,SAAS,KAAK;IAC3B,SAAS;IACT;IACD,CAAC;;AAGJ,MAAI,KAAK,YACP,gBAAe,SAAS,KAAK;GAC3B,SAAS,KAAK;GACd,SAAS,eAAe,SAAS,GAAG,GAAG,EAAE;GAC1C,CAAC;;AAGN,MAAK,MAAM,QAAQ,KAAK,cAAc,EAAE,EAAE;EACxC,MAAM,YAAY,aAAa,QAAQ,KAAK,QAAQ,KAAK;AACzD,MAAI,CAAC,UAAW;AAEhB,WAAS,WAAW,KAAK,KAAK;;AAGhC,MAAK,MAAM,QAAQ,KAAK,YAAY,EAAE,EAAE;EACtC,MAAM,UAAU,aAAa,WAAW,KAAK,QAAQ,KAAK;AAC1D,MAAI,CAAC,QAAS;AAEd,WAAS,SAAS,KAAK,KAAK;;AAG9B,QAAO;EAAE;EAAK;EAAgB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-text.d.ts","names":[],"sources":["../../../src/utils/pages/to-text.ts"],"mappings":";;UASiB,kBAAA;;AAAjB;;EAIE,OAAA;IACE,KAAA;IACA,IAAA;EAAA;EAAA;;;;;EAQF,WAAA,IACE,KAAA,UACA,WAAA,sBACA,OAAA,EAAS,eAAA,KACN,MAAA;EAAA;;;;;AAqHP;;EA5GE,kBAAA;EA+GkB;;;;;;;;EArGlB,mBAAA;AAAA;AAAA,KAkGU,eAAA;EAEN,IAAA;EACA,GAAA,EAAK,SAAA;AAAA;EAGL,IAAA;AAAA;EAGA,IAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-text.js","names":[],"sources":["../../../src/utils/pages/to-text.ts"],"sourcesContent":["import type { ApiPageProps, OperationItem, WebhookItem } from '@/ui/api-page';\nimport type { DereferencedDocument } from '@/utils/document/dereference';\nimport type { TagObject } from '@/types';\nimport { dump } from 'js-yaml';\nimport { removeUndefined } from '@/utils/remove-undefined';\nimport type { OperationOutput, PageOutput, WebhookOutput } from '@/utils/pages/builder';\nimport type { InternalOpenAPIMeta } from '@/server/source-api';\nimport { toStaticData } from '@/utils/pages/to-static-data';\n\nexport interface PagesToTextOptions {\n /**\n * Additional imports of your MDX components.\n */\n imports?: {\n names: string[];\n from: string;\n }[];\n\n /**\n * Customise frontmatter.\n *\n * A `full: true` property will be added by default.\n */\n frontmatter?: (\n title: string,\n description: string | undefined,\n context: DocumentContext,\n ) => Record<string, unknown>;\n\n /**\n * Add description to document body.\n *\n * We recommend but don't enable it by default because some OpenAPI schemas have invalid description that breaks MDX syntax.\n *\n * @defaultValue false\n */\n includeDescription?: boolean;\n\n /**\n * Add a comment to the top of generated files indicating they are auto-generated.\n * - `true`: Adds a standardized comment\n * - `false`: No comment is added\n * - `string`: Adds the provided custom comment\n *\n * @defaultValue true\n */\n addGeneratedComment?: boolean | string;\n}\n\nexport function toText(\n entry: PageOutput | OperationOutput | WebhookOutput,\n processed: DereferencedDocument,\n options: PagesToTextOptions = {},\n) {\n switch (entry.type) {\n case 'operation':\n return generatePage(\n entry.schemaId,\n processed,\n {\n operations: [entry.item],\n },\n {\n ...options,\n ...entry.info,\n },\n {\n type: 'operation',\n },\n );\n case 'page':\n return generatePage(\n entry.schemaId,\n processed,\n {\n operations: entry.operations,\n webhooks: entry.webhooks,\n showTitle: true,\n },\n {\n ...options,\n ...entry.info,\n },\n entry.tag\n ? {\n type: 'tag',\n tag: entry.tag,\n }\n : {\n type: 'file',\n },\n );\n case 'webhook':\n return generatePage(\n entry.schemaId,\n processed,\n {\n webhooks: [entry.item],\n },\n {\n ...options,\n ...entry.info,\n },\n {\n type: 'operation',\n },\n );\n }\n}\n\nexport function generateDocument(\n frontmatter: unknown,\n content: string,\n options: PagesToTextOptions,\n): string {\n const { addGeneratedComment = true, imports } = options;\n const out: string[] = [];\n const banner = dump(removeUndefined(frontmatter as object)).trimEnd();\n if (banner.length > 0) out.push(`---\\n${banner}\\n---`);\n\n if (addGeneratedComment) {\n let commentContent =\n 'This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again.';\n\n if (typeof addGeneratedComment === 'string') {\n commentContent = addGeneratedComment;\n }\n\n commentContent = commentContent.replaceAll('/', '\\\\/');\n out.push(`{/* ${commentContent} */}`);\n }\n\n if (imports) {\n out.push(\n ...imports\n .map((item) => `import { ${item.names.join(', ')} } from ${JSON.stringify(item.from)};`)\n .join('\\n'),\n );\n }\n\n out.push(content);\n return out.join('\\n\\n');\n}\n\nexport type DocumentContext =\n | {\n type: 'tag';\n tag: TagObject | undefined;\n }\n | {\n type: 'operation';\n }\n | {\n type: 'file';\n };\n\nfunction generatePage(\n schemaId: string,\n processed: DereferencedDocument,\n pageProps: Omit<ApiPageProps, 'document'>,\n options: PagesToTextOptions & {\n title: string;\n description?: string;\n },\n context: DocumentContext,\n): string {\n const { frontmatter, includeDescription = false } = options;\n const extend = frontmatter?.(options.title, options.description, context);\n const page: ApiPageProps = {\n ...pageProps,\n document: schemaId,\n };\n\n let meta: InternalOpenAPIMeta | undefined;\n if (page.operations?.length === 1) {\n const operation = page.operations[0];\n\n meta = {\n method: operation.method.toUpperCase(),\n };\n } else if (page.webhooks?.length === 1) {\n const webhook = page.webhooks[0];\n\n meta = {\n method: webhook.method.toUpperCase(),\n webhook: true,\n };\n }\n\n const data = toStaticData(page, processed.dereferenced);\n const content: string[] = [];\n\n if (options.description && includeDescription) content.push(options.description);\n content.push(pageContent(page));\n\n return generateDocument(\n {\n title: options.title,\n description: !includeDescription ? options.description : undefined,\n full: true,\n ...extend,\n _openapi: {\n ...meta,\n ...data,\n ...(extend?._openapi as object | undefined),\n },\n },\n content.join('\\n\\n'),\n options,\n );\n}\n\nfunction pageContent({\n showTitle,\n showDescription,\n document,\n webhooks,\n operations,\n}: ApiPageProps): string {\n const propStrs: string[] = [`document={${JSON.stringify(document)}}`];\n\n // filter extra properties in props\n if (webhooks) {\n propStrs.push(\n `webhooks={${JSON.stringify(\n webhooks.map(\n (item) =>\n ({\n name: item.name,\n method: item.method,\n }) satisfies WebhookItem,\n ),\n )}}`,\n );\n }\n if (operations) {\n propStrs.push(\n `operations={${JSON.stringify(\n operations.map(\n (item) =>\n ({\n path: item.path,\n method: item.method,\n }) satisfies OperationItem,\n ),\n )}}`,\n );\n }\n if (showTitle) {\n propStrs.push(`showTitle={${JSON.stringify(showTitle)}}`);\n }\n if (showDescription) {\n propStrs.push(`showDescription={${JSON.stringify(showDescription)}}`);\n }\n\n return `<APIPage ${propStrs.join(' ')} />`;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remove-undefined.js","names":[],"sources":["../../src/utils/remove-undefined.ts"],"sourcesContent":["import { isPlainObject } from './is-plain-object';\n\nexport function removeUndefined<T extends object>(value: T, deep = false): T {\n if (!isPlainObject(value)) return value;\n\n for (const key in value) {\n const prop = value[key];\n if (prop === undefined) {\n delete value[key];\n continue;\n }\n\n if (deep) {\n if (Array.isArray(prop)) {\n for (const item of prop) removeUndefined(item, deep);\n }\n\n if (isPlainObject(prop)) {\n removeUndefined(prop, deep);\n }\n }\n }\n\n return value;\n}\n"],"mappings":";;AAEA,SAAgB,gBAAkC,OAAU,OAAO,OAAU;AAC3E,KAAI,CAAC,cAAc,MAAM,CAAE,QAAO;AAElC,MAAK,MAAM,OAAO,OAAO;EACvB,MAAM,OAAO,MAAM;AACnB,MAAI,SAAS,KAAA,GAAW;AACtB,UAAO,MAAM;AACb;;AAGF,MAAI,MAAM;AACR,OAAI,MAAM,QAAQ,KAAK,CACrB,MAAK,MAAM,QAAQ,KAAM,iBAAgB,MAAM,KAAK;AAGtD,OAAI,cAAc,KAAK,CACrB,iBAAgB,MAAM,KAAK;;;AAKjC,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dereference.js","names":[],"sources":["../../../src/utils/schema/dereference.ts"],"sourcesContent":["import type { JSONSchema } from 'json-schema-typed/draft-2020-12';\nimport { resolveRefSync } from './resolve-ref';\n\n/**\n * Resolves all $ref pointers in a schema and returns a new schema without any $ref pointers.\n */\nexport function dereferenceSync(\n schema: JSONSchema,\n setOriginalRef: (schema: JSONSchema, ref: string) => void,\n): JSONSchema {\n if (typeof schema === 'boolean') return schema;\n const visitedNodes = new Set<unknown>();\n const cloned = structuredClone(schema);\n\n function resolve(current: unknown): JSONSchema {\n if (typeof current === 'object' && current !== null) {\n // make sure we don't visit the same node twice\n if (visitedNodes.has(current)) {\n return current;\n }\n visitedNodes.add(current);\n\n if (Array.isArray(current)) {\n // array\n for (let index = 0; index < current.length; index++) {\n current[index] = resolve(current[index]);\n }\n\n return current as JSONSchema;\n }\n\n const obj = current as Record<string, unknown>;\n\n // object\n if ('$ref' in current && typeof current['$ref'] === 'string') {\n const ref = current['$ref'];\n delete current['$ref'];\n const resolved = resolve(resolveRefSync(ref, cloned) as JSONSchema);\n setOriginalRef(resolved, ref);\n setOriginalRef(current as JSONSchema, ref);\n\n if (typeof resolved === 'boolean') throw new Error('invalid schema');\n for (const k in resolved) {\n if (!(k in current)) {\n obj[k] = resolved[k as never];\n }\n }\n }\n\n for (const key in current) {\n obj[key] = resolve(obj[key]);\n }\n }\n\n return current as JSONSchema;\n }\n\n return resolve(cloned);\n}\n"],"mappings":";;;;;AAMA,SAAgB,gBACd,QACA,gBACY;AACZ,KAAI,OAAO,WAAW,UAAW,QAAO;CACxC,MAAM,+BAAe,IAAI,KAAc;CACvC,MAAM,SAAS,gBAAgB,OAAO;CAEtC,SAAS,QAAQ,SAA8B;AAC7C,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AAEnD,OAAI,aAAa,IAAI,QAAQ,CAC3B,QAAO;AAET,gBAAa,IAAI,QAAQ;AAEzB,OAAI,MAAM,QAAQ,QAAQ,EAAE;AAE1B,SAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,QAC1C,SAAQ,SAAS,QAAQ,QAAQ,OAAO;AAG1C,WAAO;;GAGT,MAAM,MAAM;AAGZ,OAAI,UAAU,WAAW,OAAO,QAAQ,YAAY,UAAU;IAC5D,MAAM,MAAM,QAAQ;AACpB,WAAO,QAAQ;IACf,MAAM,WAAW,QAAQ,eAAe,KAAK,OAAO,CAAe;AACnE,mBAAe,UAAU,IAAI;AAC7B,mBAAe,SAAuB,IAAI;AAE1C,QAAI,OAAO,aAAa,UAAW,OAAM,IAAI,MAAM,iBAAiB;AACpE,SAAK,MAAM,KAAK,SACd,KAAI,EAAE,KAAK,SACT,KAAI,KAAK,SAAS;;AAKxB,QAAK,MAAM,OAAO,QAChB,KAAI,OAAO,QAAQ,IAAI,KAAK;;AAIhC,SAAO;;AAGT,QAAO,QAAQ,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/utils/schema/index.ts"],"mappings":";;;;KAiBY,WAAA,MAAiB,CAAA,uBACzB,WAAA,CAAY,CAAA,MACZ,CAAA,SAAU,eAAA,GACR,OAAA,CAAQ,CAAA,EAAG,eAAA,IACX,CAAA,gCAEgB,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,OAEhC,CAAA;AAAA,KAEH,qBAAA,MAA2B,CAAA,uBAC5B,WAAA,CAAY,CAAA,MACZ,CAAA;EAAY,IAAA;AAAA,IACV,IAAA,CAAK,CAAA,YACL,CAAA;AAAA,KAEM,YAAA,IACP,UAAA;EACC,mBAAA;AAAA;AAAA,KAGM,cAAA,GAAiB,qBAAA,CAAsB,YAAA;;KAkEvC,aAAA,GAAgB,oBAAA;EAC1B,MAAA;EACA,EAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/utils/schema/index.ts"],"sourcesContent":["import type { JSONSchema } from 'json-schema-typed/draft-2020-12';\nimport type {\n Document,\n ExampleObject,\n HttpMethods,\n MediaTypeObject,\n MethodInformation,\n OperationObject,\n PathItemObject,\n ReferenceObject,\n SecuritySchemeObject,\n TagObject,\n} from '@/types';\nimport { idToTitle } from '@/utils/id-to-title';\n\nexport const methodKeys = ['get', 'post', 'patch', 'delete', 'head', 'put'] as const;\n\nexport type NoReference<T> = T extends (infer I)[]\n ? NoReference<I>[]\n : T extends ReferenceObject\n ? Exclude<T, ReferenceObject>\n : T extends object\n ? {\n [K in keyof T]: NoReference<T[K]>;\n }\n : T;\n\ntype NoReferenceJSONSchema<T> = T extends (infer I)[]\n ? NoReference<I>[]\n : T extends { $ref?: string }\n ? Omit<T, '$ref'>\n : T;\n\nexport type ParsedSchema =\n | (JSONSchema & {\n 'x-playground-lazy'?: boolean;\n })\n | boolean;\nexport type ResolvedSchema = NoReferenceJSONSchema<ParsedSchema>;\n\nexport function getPreferredType(body: Record<string, unknown>): string | undefined {\n if ('application/json' in body) return 'application/json';\n\n return Object.keys(body)[0];\n}\n\nexport function getTagDisplayName(tag: TagObject): string {\n if ('x-displayName' in tag && typeof tag['x-displayName'] === 'string')\n return tag['x-displayName'];\n\n if (tag.summary) return tag.summary;\n return idToTitle(tag.name!);\n}\n\n/**\n * Summarize method endpoint information\n */\nexport function createMethod(\n method: HttpMethods,\n path: NoReference<PathItemObject>,\n operation: NoReference<OperationObject>,\n): MethodInformation {\n return {\n description: path.description,\n summary: path.summary,\n ...operation,\n servers: operation.servers ?? path.servers,\n parameters: [...(operation.parameters ?? []), ...(path.parameters ?? [])],\n method,\n };\n}\n\ninterface ExampleLike {\n example?: unknown;\n examples?: {\n [media: string]: ExampleObject;\n };\n content?: {\n [media: string]: MediaTypeObject;\n };\n}\n\nexport function pickExample(value: ExampleLike): unknown | undefined {\n if (value.example !== undefined) {\n return value.example;\n }\n\n if (value.content) {\n const type = getPreferredType(value.content);\n const content = type ? value.content[type] : undefined;\n\n if (type && content) {\n const out = value.examples?.[type].value ?? pickExample(content);\n if (out !== undefined) return out;\n }\n }\n\n if (value.examples) {\n const examples = Object.values(value.examples);\n if (examples.length > 0) return examples[0].value;\n }\n}\n\n/** parsed security scheme objects */\nexport type SecurityEntry = SecuritySchemeObject & {\n scopes: string[];\n id: string;\n};\n\nexport function parseSecurities(\n method: MethodInformation,\n dereferenced: NoReference<Document>,\n): SecurityEntry[][] {\n const result: SecurityEntry[][] = [];\n const security = method.security ?? dereferenced.security ?? [];\n if (security.length === 0) return result;\n\n for (const map of security) {\n const list: SecurityEntry[] = [];\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":";;AAeA,MAAa,aAAa;CAAC;CAAO;CAAQ;CAAS;CAAU;CAAQ;CAAM;AAyB3E,SAAgB,iBAAiB,MAAmD;AAClF,KAAI,sBAAsB,KAAM,QAAO;AAEvC,QAAO,OAAO,KAAK,KAAK,CAAC;;AAG3B,SAAgB,kBAAkB,KAAwB;AACxD,KAAI,mBAAmB,OAAO,OAAO,IAAI,qBAAqB,SAC5D,QAAO,IAAI;AAEb,KAAI,IAAI,QAAS,QAAO,IAAI;AAC5B,QAAO,UAAU,IAAI,KAAM;;;;;AAM7B,SAAgB,aACd,QACA,MACA,WACmB;AACnB,QAAO;EACL,aAAa,KAAK;EAClB,SAAS,KAAK;EACd,GAAG;EACH,SAAS,UAAU,WAAW,KAAK;EACnC,YAAY,CAAC,GAAI,UAAU,cAAc,EAAE,EAAG,GAAI,KAAK,cAAc,EAAE,CAAE;EACzE;EACD;;AAaH,SAAgB,YAAY,OAAyC;AACnE,KAAI,MAAM,YAAY,KAAA,EACpB,QAAO,MAAM;AAGf,KAAI,MAAM,SAAS;EACjB,MAAM,OAAO,iBAAiB,MAAM,QAAQ;EAC5C,MAAM,UAAU,OAAO,MAAM,QAAQ,QAAQ,KAAA;AAE7C,MAAI,QAAQ,SAAS;GACnB,MAAM,MAAM,MAAM,WAAW,MAAM,SAAS,YAAY,QAAQ;AAChE,OAAI,QAAQ,KAAA,EAAW,QAAO;;;AAIlC,KAAI,MAAM,UAAU;EAClB,MAAM,WAAW,OAAO,OAAO,MAAM,SAAS;AAC9C,MAAI,SAAS,SAAS,EAAG,QAAO,SAAS,GAAG;;;AAUhD,SAAgB,gBACd,QACA,cACmB;CACnB,MAAM,SAA4B,EAAE;CACpC,MAAM,WAAW,OAAO,YAAY,aAAa,YAAY,EAAE;AAC/D,KAAI,SAAS,WAAW,EAAG,QAAO;AAElC,MAAK,MAAM,OAAO,UAAU;EAC1B,MAAM,OAAwB,EAAE;AAEhC,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":"pick.js","names":[],"sources":["../../../src/utils/schema/pick.ts"],"sourcesContent":["import { isPlainObject } from '../is-plain-object';\nimport { decodeInternalRef } from './ref';\nimport { resolveRefSync } from './resolve-ref';\n\n/**\n * return a filtered object that only contains the given `$ref` & its referenced fields.\n */\nexport function pickSchema(root: object, $ref: string): object {\n const out: object = {};\n const scanned = new Set<string>();\n\n function scan(next: unknown) {\n if (isPlainObject(next)) {\n if (typeof next.$ref === 'string') {\n if (scanned.has(next.$ref)) return;\n\n const resolved = resolveRefSync(next.$ref, root);\n scanned.add(next.$ref);\n scan(resolved);\n setField(out, decodeInternalRef(next.$ref), resolved);\n }\n\n for (const k in next) scan(next[k]);\n return;\n }\n\n if (Array.isArray(next)) {\n for (const item of next) scan(item);\n }\n }\n\n scan({ $ref });\n return out;\n}\n\nfunction setField(obj: unknown, field: string[], value: unknown): unknown {\n if (field.length === 0) return value;\n\n const out: Record<string, unknown> = isPlainObject(obj) ? obj : {};\n let current = out;\n\n for (let i = 0; i < field.length; i++) {\n const k = field[i];\n\n if (i === field.length - 1) {\n current[k] = value;\n } else {\n const v = current[k];\n\n if (isPlainObject(v)) {\n current = v;\n } else {\n current = current[k] = {};\n }\n }\n }\n\n return out;\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,WAAW,MAAc,MAAsB;CAC7D,MAAM,MAAc,EAAE;CACtB,MAAM,0BAAU,IAAI,KAAa;CAEjC,SAAS,KAAK,MAAe;AAC3B,MAAI,cAAc,KAAK,EAAE;AACvB,OAAI,OAAO,KAAK,SAAS,UAAU;AACjC,QAAI,QAAQ,IAAI,KAAK,KAAK,CAAE;IAE5B,MAAM,WAAW,eAAe,KAAK,MAAM,KAAK;AAChD,YAAQ,IAAI,KAAK,KAAK;AACtB,SAAK,SAAS;AACd,aAAS,KAAK,kBAAkB,KAAK,KAAK,EAAE,SAAS;;AAGvD,QAAK,MAAM,KAAK,KAAM,MAAK,KAAK,GAAG;AACnC;;AAGF,MAAI,MAAM,QAAQ,KAAK,CACrB,MAAK,MAAM,QAAQ,KAAM,MAAK,KAAK;;AAIvC,MAAK,EAAE,MAAM,CAAC;AACd,QAAO;;AAGT,SAAS,SAAS,KAAc,OAAiB,OAAyB;AACxE,KAAI,MAAM,WAAW,EAAG,QAAO;CAE/B,MAAM,MAA+B,cAAc,IAAI,GAAG,MAAM,EAAE;CAClE,IAAI,UAAU;AAEd,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,IAAI,MAAM;AAEhB,MAAI,MAAM,MAAM,SAAS,EACvB,SAAQ,KAAK;OACR;GACL,MAAM,IAAI,QAAQ;AAElB,OAAI,cAAc,EAAE,CAClB,WAAU;OAEV,WAAU,QAAQ,KAAK,EAAE;;;AAK/B,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ref.js","names":[],"sources":["../../../src/utils/schema/ref.ts"],"sourcesContent":["/**\n * RFC 6901 reference-token encoding for JSON Pointer fragments used in in-document `$ref` (`#/…`).\n *\n * @see https://datatracker.ietf.org/doc/html/rfc6901\n */\n\nfunction encodeSegment(segment: string): string {\n return segment.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\nfunction decodeSegment(segment: string): string {\n return segment.replace(/~1/g, '/').replace(/~0/g, '~');\n}\n\n/**\n * Build an in-document `$ref` string from logical path segments (e.g. `['components','schemas','Pet']` → `#/components/schemas/Pet`).\n */\nexport function encodeInternalRef(segments: readonly string[]): string {\n if (segments.length === 0) return '#/';\n return `#/${segments.map(encodeSegment).join('/')}`;\n}\n\n/**\n * Parse an in-document `$ref` (`#/…`) into decoded path segments for walking the root document.\n */\nexport function decodeInternalRef(ref: string): string[] {\n if (!ref.startsWith('#')) {\n throw new Error('expected in-document $ref starting with `#`');\n }\n\n const raw = ref.slice(1);\n const out: string[] = [];\n if (raw.length === 0) return out;\n\n for (const token of raw.split('/')) {\n if (token.length === 0) continue;\n out.push(decodeSegment(token));\n }\n\n return out;\n}\n"],"mappings":";;;;;;AAMA,SAAS,cAAc,SAAyB;AAC9C,QAAO,QAAQ,QAAQ,MAAM,KAAK,CAAC,QAAQ,OAAO,KAAK;;AAGzD,SAAS,cAAc,SAAyB;AAC9C,QAAO,QAAQ,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI;;;;;AAMxD,SAAgB,kBAAkB,UAAqC;AACrE,KAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAO,KAAK,SAAS,IAAI,cAAc,CAAC,KAAK,IAAI;;;;;AAMnD,SAAgB,kBAAkB,KAAuB;AACvD,KAAI,CAAC,IAAI,WAAW,IAAI,CACtB,OAAM,IAAI,MAAM,8CAA8C;CAGhE,MAAM,MAAM,IAAI,MAAM,EAAE;CACxB,MAAM,MAAgB,EAAE;AACxB,KAAI,IAAI,WAAW,EAAG,QAAO;AAE7B,MAAK,MAAM,SAAS,IAAI,MAAM,IAAI,EAAE;AAClC,MAAI,MAAM,WAAW,EAAG;AACxB,MAAI,KAAK,cAAc,MAAM,CAAC;;AAGhC,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-ref.js","names":[],"sources":["../../../src/utils/schema/resolve-ref.ts"],"sourcesContent":["import { isPlainObject } from '../is-plain-object';\nimport { decodeInternalRef } from './ref';\n\nexport function resolveRefSync(ref: string, schema: unknown): unknown | undefined {\n let current = schema;\n\n for (const seg of decodeInternalRef(ref)) {\n if (isPlainObject(current)) current = current[seg];\n else return;\n }\n\n return current;\n}\n"],"mappings":";;;AAGA,SAAgB,eAAe,KAAa,QAAsC;CAChF,IAAI,UAAU;AAEd,MAAK,MAAM,OAAO,kBAAkB,IAAI,CACtC,KAAI,cAAc,QAAQ,CAAE,WAAU,QAAQ;KACzC;AAGP,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-string.js","names":[],"sources":["../../../src/utils/schema/to-string.ts"],"sourcesContent":["import type { ParsedSchema, ResolvedSchema } from '@/utils/schema';\nimport type { DereferencedDocument } from '@/utils/document/dereference';\n\nexport enum FormatFlags {\n None = 0,\n UseAlias = 1 << 0,\n}\n\ntype Resolver = (schema: ResolvedSchema) => {\n dereferenced: ResolvedSchema;\n raw?: ParsedSchema;\n};\n\nexport function schemaToString(\n value: ResolvedSchema,\n _resolver?: DereferencedDocument | Resolver,\n flags: FormatFlags = FormatFlags.None,\n): string {\n const resolver: Resolver =\n typeof _resolver === 'function'\n ? _resolver\n : (schema) => {\n const ref =\n _resolver && typeof schema === 'object' ? _resolver.getRawRef(schema) : undefined;\n\n return {\n dereferenced: schema,\n raw: ref ? { $ref: ref } : undefined,\n };\n };\n function union(union: readonly ResolvedSchema[], sep: string, flags: FormatFlags) {\n const members = new Set();\n let nullable = false;\n\n for (const item of union) {\n const result = run(item, flags | FormatFlags.UseAlias);\n\n if (result === 'null') {\n nullable = true;\n } else if (result !== 'unknown') {\n members.add(result);\n }\n }\n\n const result = Array.from(members).join(sep);\n return nullable ? `${result} | null` : result;\n }\n\n function run(schema: ResolvedSchema, flags: FormatFlags): string {\n const resolved = resolver(schema);\n schema = resolved.dereferenced;\n\n if (schema === true) return 'any';\n else if (schema === false) return 'never';\n\n if ((flags & FormatFlags.UseAlias) === FormatFlags.UseAlias) {\n if (schema.title) return schema.title;\n\n if (typeof resolved.raw === 'object' && resolved.raw.$ref) {\n const ref = resolved.raw.$ref.split('/');\n if (ref.length > 0) return ref[ref.length - 1];\n }\n }\n\n if (Array.isArray(schema.type)) {\n return union(\n schema.type.map((type) => ({\n ...schema,\n type,\n })),\n ' | ',\n flags,\n );\n }\n\n if (schema.type === 'array')\n return `array<${schema.items ? run(schema.items, flags | FormatFlags.UseAlias) : 'unknown'}>`;\n\n const or = schema.oneOf ?? schema.anyOf;\n if (schema.oneOf && schema.anyOf) {\n return `(${union(schema.oneOf, ' | ', flags)}) & (${union(schema.anyOf, ' | ', flags)})`;\n } else if (or) {\n return union(or, ' | ', flags);\n }\n\n if (schema.allOf) {\n return union(schema.allOf, ' & ', flags);\n }\n\n if (schema.not) return `not ${run(schema.not, flags)}`;\n if (schema.type === 'string' && schema.format === 'binary') return 'file';\n\n if (schema.type && Array.isArray(schema.type)) {\n return schema.type.filter((v) => v !== 'null').join(' | ');\n }\n\n if (schema.type) {\n return schema.type as string;\n }\n\n return 'unknown';\n }\n\n return run(value, flags);\n}\n"],"mappings":";AAGA,IAAY,cAAL,yBAAA,aAAA;AACL,aAAA,YAAA,UAAA,KAAA;AACA,aAAA,YAAA,cAAA,KAAA;;KACD;AAOD,SAAgB,eACd,OACA,WACA,QAAqB,YAAY,MACzB;CACR,MAAM,WACJ,OAAO,cAAc,aACjB,aACC,WAAW;EACV,MAAM,MACJ,aAAa,OAAO,WAAW,WAAW,UAAU,UAAU,OAAO,GAAG,KAAA;AAE1E,SAAO;GACL,cAAc;GACd,KAAK,MAAM,EAAE,MAAM,KAAK,GAAG,KAAA;GAC5B;;CAET,SAAS,MAAM,OAAkC,KAAa,OAAoB;EAChF,MAAM,0BAAU,IAAI,KAAK;EACzB,IAAI,WAAW;AAEf,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,SAAS,IAAI,MAAM,QAAQ,YAAY,SAAS;AAEtD,OAAI,WAAW,OACb,YAAW;YACF,WAAW,UACpB,SAAQ,IAAI,OAAO;;EAIvB,MAAM,SAAS,MAAM,KAAK,QAAQ,CAAC,KAAK,IAAI;AAC5C,SAAO,WAAW,GAAG,OAAO,WAAW;;CAGzC,SAAS,IAAI,QAAwB,OAA4B;EAC/D,MAAM,WAAW,SAAS,OAAO;AACjC,WAAS,SAAS;AAElB,MAAI,WAAW,KAAM,QAAO;WACnB,WAAW,MAAO,QAAO;AAElC,OAAK,QAAQ,YAAY,cAAc,YAAY,UAAU;AAC3D,OAAI,OAAO,MAAO,QAAO,OAAO;AAEhC,OAAI,OAAO,SAAS,QAAQ,YAAY,SAAS,IAAI,MAAM;IACzD,MAAM,MAAM,SAAS,IAAI,KAAK,MAAM,IAAI;AACxC,QAAI,IAAI,SAAS,EAAG,QAAO,IAAI,IAAI,SAAS;;;AAIhD,MAAI,MAAM,QAAQ,OAAO,KAAK,CAC5B,QAAO,MACL,OAAO,KAAK,KAAK,UAAU;GACzB,GAAG;GACH;GACD,EAAE,EACH,OACA,MACD;AAGH,MAAI,OAAO,SAAS,QAClB,QAAO,SAAS,OAAO,QAAQ,IAAI,OAAO,OAAO,QAAQ,YAAY,SAAS,GAAG,UAAU;EAE7F,MAAM,KAAK,OAAO,SAAS,OAAO;AAClC,MAAI,OAAO,SAAS,OAAO,MACzB,QAAO,IAAI,MAAM,OAAO,OAAO,OAAO,MAAM,CAAC,OAAO,MAAM,OAAO,OAAO,OAAO,MAAM,CAAC;WAC7E,GACT,QAAO,MAAM,IAAI,OAAO,MAAM;AAGhC,MAAI,OAAO,MACT,QAAO,MAAM,OAAO,OAAO,OAAO,MAAM;AAG1C,MAAI,OAAO,IAAK,QAAO,OAAO,IAAI,OAAO,KAAK,MAAM;AACpD,MAAI,OAAO,SAAS,YAAY,OAAO,WAAW,SAAU,QAAO;AAEnE,MAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,CAC3C,QAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,OAAO,CAAC,KAAK,MAAM;AAG5D,MAAI,OAAO,KACT,QAAO,OAAO;AAGhB,SAAO;;AAGT,QAAO,IAAI,OAAO,MAAM"}
|
package/dist/utils/url.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","names":[],"sources":["../../src/utils/url.ts"],"sourcesContent":["import type { RequestData } from '@/requests/types';\n\nexport function isUrl(schemaId: string): boolean {\n return schemaId.startsWith('https://') || schemaId.startsWith('http://');\n}\n\nexport function joinURL(base: string, pathname: string): string {\n if (pathname.startsWith('/')) pathname = pathname.slice(1);\n if (base.endsWith('/')) base = base.slice(0, -1);\n\n if (pathname.length > 0) return base + '/' + pathname;\n else return base;\n}\n\n/**\n * @param url - URL (can be relative)\n * @param base - the base URL (must be absolute)\n */\nexport function withBase(url: string, base: string): string {\n if (!url.startsWith('https://') && !url.startsWith('http://')) {\n return joinURL(base, url);\n }\n\n return url;\n}\n\nexport function resolveServerUrl(template: string, variables: Record<string, string>): string {\n for (const [key, value] of Object.entries(variables)) {\n template = template.replaceAll(`{${key}}`, value);\n }\n\n return template;\n}\n\nexport function resolveRequestData(pathname: string, { path, query }: RequestData): string {\n // First, resolve path parameters in the pathname\n for (const key in path) {\n const param = path[key];\n\n pathname = pathname.replace(`{${key}}`, param.value);\n }\n\n // Check if pathname already contains query parameters (legacy API support)\n const [pathPart, existingQueryString] = pathname.split('?', 2);\n\n // Parse existing query parameters from the pathname if they exist\n const searchParams = new URLSearchParams(existingQueryString || '');\n\n // Add new query parameters from the RequestData\n for (const key in query) {\n const param = query[key];\n if (!param || param.values.length === 0) continue;\n\n // Remove existing parameter first to avoid duplicates\n searchParams.delete(key);\n for (const item of param.values) {\n searchParams.append(key, item);\n }\n }\n\n // Return the reconstructed URL\n return searchParams.size > 0 ? `${pathPart}?${searchParams}` : pathPart;\n}\n"],"mappings":";AAEA,SAAgB,MAAM,UAA2B;AAC/C,QAAO,SAAS,WAAW,WAAW,IAAI,SAAS,WAAW,UAAU;;AAG1E,SAAgB,QAAQ,MAAc,UAA0B;AAC9D,KAAI,SAAS,WAAW,IAAI,CAAE,YAAW,SAAS,MAAM,EAAE;AAC1D,KAAI,KAAK,SAAS,IAAI,CAAE,QAAO,KAAK,MAAM,GAAG,GAAG;AAEhD,KAAI,SAAS,SAAS,EAAG,QAAO,OAAO,MAAM;KACxC,QAAO;;;;;;AAOd,SAAgB,SAAS,KAAa,MAAsB;AAC1D,KAAI,CAAC,IAAI,WAAW,WAAW,IAAI,CAAC,IAAI,WAAW,UAAU,CAC3D,QAAO,QAAQ,MAAM,IAAI;AAG3B,QAAO;;AAGT,SAAgB,iBAAiB,UAAkB,WAA2C;AAC5F,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,CAClD,YAAW,SAAS,WAAW,IAAI,IAAI,IAAI,MAAM;AAGnD,QAAO;;AAGT,SAAgB,mBAAmB,UAAkB,EAAE,MAAM,SAA8B;AAEzF,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,KAAK;AAEnB,aAAW,SAAS,QAAQ,IAAI,IAAI,IAAI,MAAM,MAAM;;CAItD,MAAM,CAAC,UAAU,uBAAuB,SAAS,MAAM,KAAK,EAAE;CAG9D,MAAM,eAAe,IAAI,gBAAgB,uBAAuB,GAAG;AAGnE,MAAK,MAAM,OAAO,OAAO;EACvB,MAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,OAAO,WAAW,EAAG;AAGzC,eAAa,OAAO,IAAI;AACxB,OAAK,MAAM,QAAQ,MAAM,OACvB,cAAa,OAAO,KAAK,KAAK;;AAKlC,QAAO,aAAa,OAAO,IAAI,GAAG,SAAS,GAAG,iBAAiB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-query.js","names":[],"sources":["../../src/utils/use-query.ts"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\n\nexport function useQuery<I extends unknown[], T>(\n fn: (...input: I) => Promise<T>,\n): {\n start: (...input: I) => void;\n reset: () => void;\n data?: T;\n error?: unknown;\n isLoading: boolean;\n} {\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<T>();\n const [error, setError] = useState<T>();\n const fnRef = useRef(fn);\n fnRef.current = fn;\n\n return useMemo(\n () => ({\n isLoading: loading,\n data,\n error,\n start(...input) {\n setLoading(true);\n\n void fnRef\n .current(...input)\n .then((res) => {\n setData(res);\n setError(undefined);\n })\n .catch((err) => {\n setData(undefined);\n setError(err);\n })\n .finally(() => {\n setLoading(false);\n });\n },\n reset() {\n setData(undefined);\n setError(undefined);\n setLoading(false);\n },\n }),\n [error, data, loading],\n );\n}\n"],"mappings":";;AAEA,SAAgB,SACd,IAOA;CACA,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,CAAC,MAAM,WAAW,UAAa;CACrC,MAAM,CAAC,OAAO,YAAY,UAAa;CACvC,MAAM,QAAQ,OAAO,GAAG;AACxB,OAAM,UAAU;AAEhB,QAAO,eACE;EACL,WAAW;EACX;EACA;EACA,MAAM,GAAG,OAAO;AACd,cAAW,KAAK;AAEX,SACF,QAAQ,GAAG,MAAM,CACjB,MAAM,QAAQ;AACb,YAAQ,IAAI;AACZ,aAAS,KAAA,EAAU;KACnB,CACD,OAAO,QAAQ;AACd,YAAQ,KAAA,EAAU;AAClB,aAAS,IAAI;KACb,CACD,cAAc;AACb,eAAW,MAAM;KACjB;;EAEN,QAAQ;AACN,WAAQ,KAAA,EAAU;AAClB,YAAS,KAAA,EAAU;AACnB,cAAW,MAAM;;EAEpB,GACD;EAAC;EAAO;EAAM;EAAQ,CACvB"}
|