fumadocs-openapi 10.5.0 → 10.6.0
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 +26 -21
- package/dist/generate-file.d.ts +10 -2
- package/dist/generate-file.d.ts.map +1 -1
- package/dist/generate-file.js +15 -3
- package/dist/generate-file.js.map +1 -1
- package/dist/playground/client.d.ts +27 -7
- package/dist/playground/client.d.ts.map +1 -1
- package/dist/playground/client.js +51 -44
- package/dist/playground/client.js.map +1 -1
- package/dist/playground/components/inputs.js +1 -1
- package/dist/playground/components/inputs.js.map +1 -1
- package/dist/playground/components/server-select.js +3 -4
- package/dist/playground/components/server-select.js.map +1 -1
- package/dist/playground/index.d.ts +1 -1
- package/dist/playground/index.d.ts.map +1 -1
- package/dist/playground/index.js +2 -2
- package/dist/playground/index.js.map +1 -1
- package/dist/playground/schema.d.ts.map +1 -1
- package/dist/playground/schema.js +10 -12
- package/dist/playground/schema.js.map +1 -1
- package/dist/requests/generators/python.d.ts +2 -1
- package/dist/requests/generators/python.d.ts.map +1 -1
- package/dist/requests/generators/python.js +13 -2
- package/dist/requests/generators/python.js.map +1 -1
- package/dist/scalar/index.d.ts +2 -1
- package/dist/scalar/index.d.ts.map +1 -1
- package/dist/server/create.d.ts +2 -0
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/create.js +11 -8
- package/dist/server/create.js.map +1 -1
- package/dist/server/source-api.d.ts +2 -0
- package/dist/server/source-api.d.ts.map +1 -1
- package/dist/server/source-api.js +10 -1
- package/dist/server/source-api.js.map +1 -1
- package/dist/types.d.ts +2 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/api-page.d.ts +1 -2
- package/dist/ui/api-page.d.ts.map +1 -1
- package/dist/ui/api-page.js +4 -6
- package/dist/ui/api-page.js.map +1 -1
- package/dist/ui/base.d.ts +20 -16
- package/dist/ui/base.d.ts.map +1 -1
- package/dist/ui/base.js +18 -9
- package/dist/ui/base.js.map +1 -1
- package/dist/ui/{full.client.js → client/full.js} +3 -3
- package/dist/ui/client/full.js.map +1 -0
- package/dist/ui/client/index.d.ts +1 -1
- package/dist/ui/client/index.js.map +1 -1
- package/dist/ui/client/storage-key.js.map +1 -1
- package/dist/ui/components/server-tab.js +43 -0
- package/dist/ui/components/server-tab.js.map +1 -0
- package/dist/ui/contexts/api.js +18 -35
- package/dist/ui/contexts/api.js.map +1 -1
- package/dist/ui/create-client.d.ts +26 -0
- package/dist/ui/create-client.d.ts.map +1 -0
- package/dist/ui/create-client.js +132 -0
- package/dist/ui/create-client.js.map +1 -0
- package/dist/ui/index.d.ts +10 -2
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +21 -1
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/operation/client.js +44 -36
- package/dist/ui/operation/client.js.map +1 -1
- package/dist/ui/operation/{request-tabs.d.ts → get-example-requests.d.ts} +2 -4
- package/dist/ui/operation/get-example-requests.d.ts.map +1 -0
- package/dist/ui/operation/get-example-requests.js +83 -0
- package/dist/ui/operation/get-example-requests.js.map +1 -0
- package/dist/ui/operation/index.js +101 -63
- package/dist/ui/operation/index.js.map +1 -1
- package/dist/ui/operation/request-tabs.js +3 -81
- package/dist/ui/operation/request-tabs.js.map +1 -1
- package/dist/ui/operation/response-tabs.d.ts +1 -1
- package/dist/ui/operation/response-tabs.js +57 -54
- package/dist/ui/operation/response-tabs.js.map +1 -1
- package/dist/ui/operation/usage-tabs/client.js +7 -48
- package/dist/ui/operation/usage-tabs/client.js.map +1 -1
- package/dist/ui/operation/usage-tabs/index.js +14 -10
- package/dist/ui/operation/usage-tabs/index.js.map +1 -1
- package/dist/ui/operation/usage-tabs/lazy.js +1 -2
- package/dist/ui/operation/usage-tabs/lazy.js.map +1 -1
- package/dist/ui/schema/index.d.ts +1 -1
- package/dist/ui/schema/index.js +4 -2
- package/dist/ui/schema/index.js.map +1 -1
- package/dist/utils/pages/builder.d.ts +1 -1
- package/dist/utils/pages/builder.js +1 -1
- package/dist/utils/process-document.d.ts +1 -1
- package/dist/utils/process-document.js +1 -32
- package/dist/utils/process-document.js.map +1 -1
- package/dist/utils/schema/dereference.js +37 -0
- package/dist/utils/schema/dereference.js.map +1 -0
- package/dist/utils/{schema.d.ts → schema/index.d.ts} +3 -3
- package/dist/utils/schema/index.d.ts.map +1 -0
- package/dist/utils/{schema.js → schema/index.js} +3 -3
- package/dist/utils/schema/index.js.map +1 -0
- package/dist/utils/schema/resolve-ref.js +21 -0
- package/dist/utils/schema/resolve-ref.js.map +1 -0
- package/dist/utils/{schema-to-string.js → schema/to-string.js} +2 -2
- package/dist/utils/schema/to-string.js.map +1 -0
- package/package.json +5 -4
- package/dist/requests/to-python-object.js +0 -17
- package/dist/requests/to-python-object.js.map +0 -1
- package/dist/ui/full.client.js.map +0 -1
- package/dist/ui/full.d.ts +0 -11
- package/dist/ui/full.d.ts.map +0 -1
- package/dist/ui/full.js +0 -36
- package/dist/ui/full.js.map +0 -1
- package/dist/ui/operation/request-tabs.d.ts.map +0 -1
- package/dist/utils/schema-to-string.js.map +0 -1
- package/dist/utils/schema.d.ts.map +0 -1
- package/dist/utils/schema.js.map +0 -1
- /package/dist/utils/{schema-to-string.d.ts → schema/to-string.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/schema/index.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { ResolvedSchema } from '@/utils/schema';\nimport type { RenderContext } from '@/types';\nimport { FormatFlags, schemaToString } from '@/utils/schema-to-string';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport type { SchemaUIProps } from '@/ui/schema/client';\nimport { SchemaUILazy } from '@/ui/schema/lazy';\nimport { I18nLabel } from '../client/i18n';\n\nexport interface FieldBase {\n description?: ReactNode;\n infoTags?: InfoTag[];\n\n typeName: string;\n aliasName: string;\n\n deprecated?: boolean;\n}\n\nexport interface InfoTag {\n label: ReactNode;\n value: string;\n}\n\nexport interface SchemaDataObjectProperty {\n name: string;\n $type: string;\n required: boolean;\n}\n\nexport type SchemaData = FieldBase &\n (\n | {\n type: 'primitive';\n }\n | {\n type: 'object';\n props: SchemaDataObjectProperty[];\n }\n | {\n type: 'array';\n item: {\n $type: string;\n };\n }\n | {\n type: 'or';\n items: {\n name: string;\n $type: string;\n }[];\n }\n | {\n type: 'and';\n items: {\n name: string;\n $type: string;\n }[];\n }\n );\n\nexport interface SchemaUIOptions {\n root: ResolvedSchema;\n client: Omit<SchemaUIProps, 'generated'>;\n\n /**\n * include read only props\n */\n readOnly?: boolean;\n /**\n * include write only props\n */\n writeOnly?: boolean;\n}\n\nexport interface SchemaUIGeneratedData {\n $root: string;\n refs: Record<string, SchemaData>;\n}\n\nexport function Schema({\n ctx,\n ...options\n}: SchemaUIOptions & {\n ctx: RenderContext;\n}) {\n if (ctx.schemaUI?.render) {\n return ctx.schemaUI.render(options, ctx);\n }\n\n return <SchemaUILazy {...options.client} generated={generateSchemaUI(options, ctx)} />;\n}\n\nexport function generateSchemaUI(\n { root, readOnly, writeOnly }: SchemaUIOptions,\n ctx: RenderContext,\n): SchemaUIGeneratedData {\n const refs: Record<string, SchemaData> = {};\n const { showExample = false } = ctx.schemaUI ?? {};\n\n function generateInfoTags(schema: Exclude<ResolvedSchema, boolean>) {\n const fields: InfoTag[] = [];\n\n if (schema.default !== undefined) {\n fields.push({\n label: <I18nLabel label=\"schemaDefault\" />,\n value: JSON.stringify(schema.default),\n });\n }\n\n if (schema.pattern) {\n fields.push({ label: <I18nLabel label=\"schemaMatch\" />, value: schema.pattern });\n }\n\n if (schema.format) {\n fields.push({ label: <I18nLabel label=\"schemaFormat\" />, value: schema.format });\n }\n\n if (schema.multipleOf) {\n fields.push({\n label: <I18nLabel label=\"schemaMultipleOf\" />,\n value: schema.multipleOf.toString(),\n });\n }\n\n let range = formatRange(\n 'value',\n schema.minimum,\n schema.exclusiveMinimum,\n schema.maximum,\n schema.exclusiveMaximum,\n );\n if (range) fields.push({ label: <I18nLabel label=\"schemaRange\" />, value: range });\n\n range = formatRange('length', schema.minLength, undefined, schema.maxLength, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaLength\" />, value: range });\n\n range = formatRange(\n 'properties',\n schema.minProperties,\n undefined,\n schema.maxProperties,\n undefined,\n );\n if (range) fields.push({ label: <I18nLabel label=\"schemaProperties\" />, value: range });\n\n range = formatRange('items', schema.minItems, undefined, schema.maxItems, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaItems\" />, value: range });\n\n if (schema.enum) {\n fields.push({\n label: <I18nLabel label=\"schemaValueIn\" />,\n value: schema.enum.map((value) => JSON.stringify(value)).join(' | '),\n });\n }\n\n if (showExample && schema.examples) {\n for (const example of schema.examples) {\n fields.push({\n label: <I18nLabel label=\"schemaExample\" />,\n value: JSON.stringify(example, null, 2),\n });\n }\n }\n\n return fields;\n }\n\n let _counter = 0;\n const autoIds = new WeakMap<Exclude<ResolvedSchema, boolean>, string>();\n function getSchemaId(schema: ResolvedSchema): string {\n if (typeof schema === 'boolean') return String(schema);\n const raw = ctx.schema.getRawRef(schema);\n if (raw) return raw;\n\n const prev = autoIds.get(schema);\n if (prev) return prev;\n\n const generated = `__${_counter++}`;\n autoIds.set(schema, generated);\n return generated;\n }\n\n function isVisible(schema: ResolvedSchema): boolean {\n if (typeof schema === 'boolean') return true;\n if (schema.writeOnly) return writeOnly ?? false;\n if (schema.readOnly) return readOnly ?? false;\n return true;\n }\n\n function base(schema: ResolvedSchema): FieldBase {\n if (typeof schema === 'boolean') {\n const name = schema ? 'any' : 'never';\n return {\n typeName: name,\n aliasName: name,\n };\n }\n\n return {\n description: schema.description && ctx.renderMarkdown(schema.description),\n infoTags: generateInfoTags(schema),\n typeName: schemaToString(schema, ctx.schema),\n aliasName: schemaToString(schema, ctx.schema, FormatFlags.UseAlias),\n deprecated: schema.deprecated,\n };\n }\n\n function scanRefs(id: string, schema: ResolvedSchema) {\n if (id in refs) return;\n if (typeof schema === 'boolean') {\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n return;\n }\n\n if (Array.isArray(schema.type)) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const type of schema.type) {\n const key = `${id}_type:${type}`;\n scanRefs(key, {\n ...schema,\n type,\n });\n out.items.push({\n name: type,\n $type: key,\n });\n }\n return;\n }\n\n if (schema.oneOf && schema.anyOf) {\n const out: SchemaData = {\n type: 'and',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n for (const omit of ['anyOf', 'oneOf'] as const) {\n const $type = `${id}_omit:${omit}`;\n scanRefs($type, { ...schema, [omit]: undefined });\n\n out.items.push({\n name: refs[$type].aliasName,\n $type,\n });\n }\n return;\n }\n\n // display both `oneOf` & `anyOf` as OR for simplified overview\n const union = schema.oneOf ?? schema.anyOf;\n if (union) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const item of union) {\n if (!item || typeof item !== 'object' || !isVisible(item)) continue;\n const itemId = getSchemaId(item);\n const key = `${id}_extends:${itemId}`;\n\n scanRefs(key, {\n ...schema,\n oneOf: undefined,\n anyOf: undefined,\n ...item,\n properties: {\n ...schema.properties,\n ...item.properties,\n },\n });\n out.items.push({\n $type: key,\n name: refs[itemId]?.aliasName ?? schemaToString(item, ctx.schema, FormatFlags.UseAlias),\n });\n }\n return;\n }\n\n if (schema.allOf) {\n scanRefs(id, mergeAllOf(schema));\n return;\n }\n\n if (schema.type === 'object') {\n const out: SchemaData = {\n type: 'object',\n props: [],\n ...base(schema),\n };\n refs[id] = out;\n\n const { properties = {}, patternProperties, additionalProperties } = schema;\n const props = Object.entries(properties);\n if (patternProperties) props.push(...Object.entries(patternProperties));\n\n for (const [key, prop] of props) {\n if (!prop || !isVisible(prop)) continue;\n const $type = getSchemaId(prop);\n scanRefs($type, prop);\n out.props.push({\n $type,\n name: key,\n required: schema.required?.includes(key) ?? false,\n });\n }\n\n if (additionalProperties && isVisible(additionalProperties)) {\n const $type = getSchemaId(additionalProperties);\n scanRefs($type, additionalProperties);\n\n out.props.push({\n $type,\n name: '[key: string]',\n required: false,\n });\n }\n return;\n }\n\n if (schema.type === 'array') {\n const items = schema.items ?? true;\n const $type = getSchemaId(items);\n\n refs[id] = {\n type: 'array',\n item: {\n $type,\n },\n ...base(schema),\n };\n scanRefs($type, items);\n return;\n }\n\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n }\n\n const $root = getSchemaId(root);\n scanRefs($root, root);\n return {\n refs,\n $root,\n };\n}\n\nfunction formatRange(\n value: string,\n min: number | undefined,\n exclusiveMin: number | undefined,\n max: number | undefined,\n exclusiveMax: number | undefined,\n) {\n const out: string[] = [];\n if (min !== undefined) {\n out.push(`${min} <=`);\n } else if (exclusiveMin !== undefined) {\n out.push(`${exclusiveMin} <`);\n }\n\n out.push(value);\n if (max !== undefined) {\n out.push(`<= ${max}`);\n } else if (exclusiveMax !== undefined) {\n out.push(`< ${exclusiveMax}`);\n }\n if (out.length > 1) return out.join(' ');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/schema/index.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from 'react';\nimport type { ResolvedSchema } from '@/utils/schema';\nimport type { RenderContext } from '@/types';\nimport { FormatFlags, schemaToString } from '@/utils/schema/to-string';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport type { SchemaUIProps } from '@/ui/schema/client';\nimport { SchemaUILazy } from '@/ui/schema/lazy';\nimport { I18nLabel } from '../client/i18n';\n\nexport interface FieldBase {\n description?: ReactNode;\n infoTags?: InfoTag[];\n\n typeName: string;\n aliasName: string;\n\n deprecated?: boolean;\n}\n\nexport interface InfoTag {\n label: ReactNode;\n value: string;\n}\n\nexport interface SchemaDataObjectProperty {\n name: string;\n $type: string;\n required: boolean;\n}\n\nexport type SchemaData = FieldBase &\n (\n | {\n type: 'primitive';\n }\n | {\n type: 'object';\n props: SchemaDataObjectProperty[];\n }\n | {\n type: 'array';\n item: {\n $type: string;\n };\n }\n | {\n type: 'or';\n items: {\n name: string;\n $type: string;\n }[];\n }\n | {\n type: 'and';\n items: {\n name: string;\n $type: string;\n }[];\n }\n );\n\nexport interface SchemaUIOptions {\n root: ResolvedSchema;\n client: Omit<SchemaUIProps, 'generated'>;\n\n /**\n * include read only props\n */\n readOnly?: boolean;\n /**\n * include write only props\n */\n writeOnly?: boolean;\n}\n\nexport interface SchemaUIGeneratedData {\n $root: string;\n refs: Record<string, SchemaData>;\n}\n\nexport function Schema({\n ctx,\n ...options\n}: SchemaUIOptions & {\n ctx: RenderContext;\n}) {\n if (ctx.schemaUI?.render) {\n return ctx.schemaUI.render(options, ctx);\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks -- assume options unchanged\n const generated = useMemo(() => generateSchemaUI(options, ctx), [ctx, options]);\n return <SchemaUILazy {...options.client} generated={generated} />;\n}\n\nexport function generateSchemaUI(\n { root, readOnly, writeOnly }: SchemaUIOptions,\n ctx: RenderContext,\n): SchemaUIGeneratedData {\n const refs: Record<string, SchemaData> = {};\n const { showExample = false } = ctx.schemaUI ?? {};\n\n function generateInfoTags(schema: Exclude<ResolvedSchema, boolean>) {\n const fields: InfoTag[] = [];\n\n if (schema.default !== undefined) {\n fields.push({\n label: <I18nLabel label=\"schemaDefault\" />,\n value: JSON.stringify(schema.default),\n });\n }\n\n if (schema.pattern) {\n fields.push({ label: <I18nLabel label=\"schemaMatch\" />, value: schema.pattern });\n }\n\n if (schema.format) {\n fields.push({ label: <I18nLabel label=\"schemaFormat\" />, value: schema.format });\n }\n\n if (schema.multipleOf) {\n fields.push({\n label: <I18nLabel label=\"schemaMultipleOf\" />,\n value: schema.multipleOf.toString(),\n });\n }\n\n let range = formatRange(\n 'value',\n schema.minimum,\n schema.exclusiveMinimum,\n schema.maximum,\n schema.exclusiveMaximum,\n );\n if (range) fields.push({ label: <I18nLabel label=\"schemaRange\" />, value: range });\n\n range = formatRange('length', schema.minLength, undefined, schema.maxLength, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaLength\" />, value: range });\n\n range = formatRange(\n 'properties',\n schema.minProperties,\n undefined,\n schema.maxProperties,\n undefined,\n );\n if (range) fields.push({ label: <I18nLabel label=\"schemaProperties\" />, value: range });\n\n range = formatRange('items', schema.minItems, undefined, schema.maxItems, undefined);\n if (range) fields.push({ label: <I18nLabel label=\"schemaItems\" />, value: range });\n\n if (schema.enum) {\n fields.push({\n label: <I18nLabel label=\"schemaValueIn\" />,\n value: schema.enum.map((value) => JSON.stringify(value)).join(' | '),\n });\n }\n\n if (showExample && schema.examples) {\n for (const example of schema.examples) {\n fields.push({\n label: <I18nLabel label=\"schemaExample\" />,\n value: JSON.stringify(example, null, 2),\n });\n }\n }\n\n return fields;\n }\n\n let _counter = 0;\n const autoIds = new WeakMap<Exclude<ResolvedSchema, boolean>, string>();\n function getSchemaId(schema: ResolvedSchema): string {\n if (typeof schema === 'boolean') return String(schema);\n const raw = ctx.schema.getRawRef(schema);\n if (raw) return raw;\n\n const prev = autoIds.get(schema);\n if (prev) return prev;\n\n const generated = `__${_counter++}`;\n autoIds.set(schema, generated);\n return generated;\n }\n\n function isVisible(schema: ResolvedSchema): boolean {\n if (typeof schema === 'boolean') return true;\n if (schema.writeOnly) return writeOnly ?? false;\n if (schema.readOnly) return readOnly ?? false;\n return true;\n }\n\n function base(schema: ResolvedSchema): FieldBase {\n if (typeof schema === 'boolean') {\n const name = schema ? 'any' : 'never';\n return {\n typeName: name,\n aliasName: name,\n };\n }\n\n return {\n description: schema.description && ctx.renderMarkdown(schema.description),\n infoTags: generateInfoTags(schema),\n typeName: schemaToString(schema, ctx.schema),\n aliasName: schemaToString(schema, ctx.schema, FormatFlags.UseAlias),\n deprecated: schema.deprecated,\n };\n }\n\n function scanRefs(id: string, schema: ResolvedSchema) {\n if (id in refs) return;\n if (typeof schema === 'boolean') {\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n return;\n }\n\n if (Array.isArray(schema.type)) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const type of schema.type) {\n const key = `${id}_type:${type}`;\n scanRefs(key, {\n ...schema,\n type,\n });\n out.items.push({\n name: type,\n $type: key,\n });\n }\n return;\n }\n\n if (schema.oneOf && schema.anyOf) {\n const out: SchemaData = {\n type: 'and',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n for (const omit of ['anyOf', 'oneOf'] as const) {\n const $type = `${id}_omit:${omit}`;\n scanRefs($type, { ...schema, [omit]: undefined });\n\n out.items.push({\n name: refs[$type].aliasName,\n $type,\n });\n }\n return;\n }\n\n // display both `oneOf` & `anyOf` as OR for simplified overview\n const union = schema.oneOf ?? schema.anyOf;\n if (union) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const item of union) {\n if (!item || typeof item !== 'object' || !isVisible(item)) continue;\n const itemId = getSchemaId(item);\n const key = `${id}_extends:${itemId}`;\n\n scanRefs(key, {\n ...schema,\n oneOf: undefined,\n anyOf: undefined,\n ...item,\n properties: {\n ...schema.properties,\n ...item.properties,\n },\n });\n out.items.push({\n $type: key,\n name: refs[itemId]?.aliasName ?? schemaToString(item, ctx.schema, FormatFlags.UseAlias),\n });\n }\n return;\n }\n\n if (schema.allOf) {\n scanRefs(id, mergeAllOf(schema));\n return;\n }\n\n if (schema.type === 'object') {\n const out: SchemaData = {\n type: 'object',\n props: [],\n ...base(schema),\n };\n refs[id] = out;\n\n const { properties = {}, patternProperties, additionalProperties } = schema;\n const props = Object.entries(properties);\n if (patternProperties) props.push(...Object.entries(patternProperties));\n\n for (const [key, prop] of props) {\n if (!prop || !isVisible(prop)) continue;\n const $type = getSchemaId(prop);\n scanRefs($type, prop);\n out.props.push({\n $type,\n name: key,\n required: schema.required?.includes(key) ?? false,\n });\n }\n\n if (additionalProperties && isVisible(additionalProperties)) {\n const $type = getSchemaId(additionalProperties);\n scanRefs($type, additionalProperties);\n\n out.props.push({\n $type,\n name: '[key: string]',\n required: false,\n });\n }\n return;\n }\n\n if (schema.type === 'array') {\n const items = schema.items ?? true;\n const $type = getSchemaId(items);\n\n refs[id] = {\n type: 'array',\n item: {\n $type,\n },\n ...base(schema),\n };\n scanRefs($type, items);\n return;\n }\n\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n }\n\n const $root = getSchemaId(root);\n scanRefs($root, root);\n return {\n refs,\n $root,\n };\n}\n\nfunction formatRange(\n value: string,\n min: number | undefined,\n exclusiveMin: number | undefined,\n max: number | undefined,\n exclusiveMax: number | undefined,\n) {\n const out: string[] = [];\n if (min !== undefined) {\n out.push(`${min} <=`);\n } else if (exclusiveMin !== undefined) {\n out.push(`${exclusiveMin} <`);\n }\n\n out.push(value);\n if (max !== undefined) {\n out.push(`<= ${max}`);\n } else if (exclusiveMax !== undefined) {\n out.push(`< ${exclusiveMax}`);\n }\n if (out.length > 1) return out.join(' ');\n}\n"],"mappings":";;;;;;;AAgFA,SAAgB,OAAO,EACrB,KACA,GAAG,WAGF;AACD,KAAI,IAAI,UAAU,OAChB,QAAO,IAAI,SAAS,OAAO,SAAS,IAAI;CAI1C,MAAM,YAAY,cAAc,iBAAiB,SAAS,IAAI,EAAE,CAAC,KAAK,QAAQ,CAAC;AAC/E,QAAO,oBAAC,cAAD;EAAc,GAAI,QAAQ;EAAmB;EAAa,CAAA;;AAGnE,SAAgB,iBACd,EAAE,MAAM,UAAU,aAClB,KACuB;CACvB,MAAM,OAAmC,EAAE;CAC3C,MAAM,EAAE,cAAc,UAAU,IAAI,YAAY,EAAE;CAElD,SAAS,iBAAiB,QAA0C;EAClE,MAAM,SAAoB,EAAE;AAE5B,MAAI,OAAO,YAAY,KAAA,EACrB,QAAO,KAAK;GACV,OAAO,oBAAC,WAAD,EAAW,OAAM,iBAAkB,CAAA;GAC1C,OAAO,KAAK,UAAU,OAAO,QAAQ;GACtC,CAAC;AAGJ,MAAI,OAAO,QACT,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,eAAgB,CAAA;GAAE,OAAO,OAAO;GAAS,CAAC;AAGlF,MAAI,OAAO,OACT,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,gBAAiB,CAAA;GAAE,OAAO,OAAO;GAAQ,CAAC;AAGlF,MAAI,OAAO,WACT,QAAO,KAAK;GACV,OAAO,oBAAC,WAAD,EAAW,OAAM,oBAAqB,CAAA;GAC7C,OAAO,OAAO,WAAW,UAAU;GACpC,CAAC;EAGJ,IAAI,QAAQ,YACV,SACA,OAAO,SACP,OAAO,kBACP,OAAO,SACP,OAAO,iBACR;AACD,MAAI,MAAO,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,eAAgB,CAAA;GAAE,OAAO;GAAO,CAAC;AAElF,UAAQ,YAAY,UAAU,OAAO,WAAW,KAAA,GAAW,OAAO,WAAW,KAAA,EAAU;AACvF,MAAI,MAAO,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,gBAAiB,CAAA;GAAE,OAAO;GAAO,CAAC;AAEnF,UAAQ,YACN,cACA,OAAO,eACP,KAAA,GACA,OAAO,eACP,KAAA,EACD;AACD,MAAI,MAAO,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,oBAAqB,CAAA;GAAE,OAAO;GAAO,CAAC;AAEvF,UAAQ,YAAY,SAAS,OAAO,UAAU,KAAA,GAAW,OAAO,UAAU,KAAA,EAAU;AACpF,MAAI,MAAO,QAAO,KAAK;GAAE,OAAO,oBAAC,WAAD,EAAW,OAAM,eAAgB,CAAA;GAAE,OAAO;GAAO,CAAC;AAElF,MAAI,OAAO,KACT,QAAO,KAAK;GACV,OAAO,oBAAC,WAAD,EAAW,OAAM,iBAAkB,CAAA;GAC1C,OAAO,OAAO,KAAK,KAAK,UAAU,KAAK,UAAU,MAAM,CAAC,CAAC,KAAK,MAAM;GACrE,CAAC;AAGJ,MAAI,eAAe,OAAO,SACxB,MAAK,MAAM,WAAW,OAAO,SAC3B,QAAO,KAAK;GACV,OAAO,oBAAC,WAAD,EAAW,OAAM,iBAAkB,CAAA;GAC1C,OAAO,KAAK,UAAU,SAAS,MAAM,EAAE;GACxC,CAAC;AAIN,SAAO;;CAGT,IAAI,WAAW;CACf,MAAM,0BAAU,IAAI,SAAmD;CACvE,SAAS,YAAY,QAAgC;AACnD,MAAI,OAAO,WAAW,UAAW,QAAO,OAAO,OAAO;EACtD,MAAM,MAAM,IAAI,OAAO,UAAU,OAAO;AACxC,MAAI,IAAK,QAAO;EAEhB,MAAM,OAAO,QAAQ,IAAI,OAAO;AAChC,MAAI,KAAM,QAAO;EAEjB,MAAM,YAAY,KAAK;AACvB,UAAQ,IAAI,QAAQ,UAAU;AAC9B,SAAO;;CAGT,SAAS,UAAU,QAAiC;AAClD,MAAI,OAAO,WAAW,UAAW,QAAO;AACxC,MAAI,OAAO,UAAW,QAAO,aAAa;AAC1C,MAAI,OAAO,SAAU,QAAO,YAAY;AACxC,SAAO;;CAGT,SAAS,KAAK,QAAmC;AAC/C,MAAI,OAAO,WAAW,WAAW;GAC/B,MAAM,OAAO,SAAS,QAAQ;AAC9B,UAAO;IACL,UAAU;IACV,WAAW;IACZ;;AAGH,SAAO;GACL,aAAa,OAAO,eAAe,IAAI,eAAe,OAAO,YAAY;GACzE,UAAU,iBAAiB,OAAO;GAClC,UAAU,eAAe,QAAQ,IAAI,OAAO;GAC5C,WAAW,eAAe,QAAQ,IAAI,QAAQ,YAAY,SAAS;GACnE,YAAY,OAAO;GACpB;;CAGH,SAAS,SAAS,IAAY,QAAwB;AACpD,MAAI,MAAM,KAAM;AAChB,MAAI,OAAO,WAAW,WAAW;AAC/B,QAAK,MAAM;IACT,MAAM;IACN,GAAG,KAAK,OAAO;IAChB;AACD;;AAGF,MAAI,MAAM,QAAQ,OAAO,KAAK,EAAE;GAC9B,MAAM,MAAkB;IACtB,MAAM;IACN,OAAO,EAAE;IACT,GAAG,KAAK,OAAO;IAChB;AACD,QAAK,MAAM;AAEX,QAAK,MAAM,QAAQ,OAAO,MAAM;IAC9B,MAAM,MAAM,GAAG,GAAG,QAAQ;AAC1B,aAAS,KAAK;KACZ,GAAG;KACH;KACD,CAAC;AACF,QAAI,MAAM,KAAK;KACb,MAAM;KACN,OAAO;KACR,CAAC;;AAEJ;;AAGF,MAAI,OAAO,SAAS,OAAO,OAAO;GAChC,MAAM,MAAkB;IACtB,MAAM;IACN,OAAO,EAAE;IACT,GAAG,KAAK,OAAO;IAChB;AACD,QAAK,MAAM;AACX,QAAK,MAAM,QAAQ,CAAC,SAAS,QAAQ,EAAW;IAC9C,MAAM,QAAQ,GAAG,GAAG,QAAQ;AAC5B,aAAS,OAAO;KAAE,GAAG;MAAS,OAAO,KAAA;KAAW,CAAC;AAEjD,QAAI,MAAM,KAAK;KACb,MAAM,KAAK,OAAO;KAClB;KACD,CAAC;;AAEJ;;EAIF,MAAM,QAAQ,OAAO,SAAS,OAAO;AACrC,MAAI,OAAO;GACT,MAAM,MAAkB;IACtB,MAAM;IACN,OAAO,EAAE;IACT,GAAG,KAAK,OAAO;IAChB;AACD,QAAK,MAAM;AAEX,QAAK,MAAM,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,UAAU,KAAK,CAAE;IAC3D,MAAM,SAAS,YAAY,KAAK;IAChC,MAAM,MAAM,GAAG,GAAG,WAAW;AAE7B,aAAS,KAAK;KACZ,GAAG;KACH,OAAO,KAAA;KACP,OAAO,KAAA;KACP,GAAG;KACH,YAAY;MACV,GAAG,OAAO;MACV,GAAG,KAAK;MACT;KACF,CAAC;AACF,QAAI,MAAM,KAAK;KACb,OAAO;KACP,MAAM,KAAK,SAAS,aAAa,eAAe,MAAM,IAAI,QAAQ,YAAY,SAAS;KACxF,CAAC;;AAEJ;;AAGF,MAAI,OAAO,OAAO;AAChB,YAAS,IAAI,WAAW,OAAO,CAAC;AAChC;;AAGF,MAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,MAAkB;IACtB,MAAM;IACN,OAAO,EAAE;IACT,GAAG,KAAK,OAAO;IAChB;AACD,QAAK,MAAM;GAEX,MAAM,EAAE,aAAa,EAAE,EAAE,mBAAmB,yBAAyB;GACrE,MAAM,QAAQ,OAAO,QAAQ,WAAW;AACxC,OAAI,kBAAmB,OAAM,KAAK,GAAG,OAAO,QAAQ,kBAAkB,CAAC;AAEvE,QAAK,MAAM,CAAC,KAAK,SAAS,OAAO;AAC/B,QAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAE;IAC/B,MAAM,QAAQ,YAAY,KAAK;AAC/B,aAAS,OAAO,KAAK;AACrB,QAAI,MAAM,KAAK;KACb;KACA,MAAM;KACN,UAAU,OAAO,UAAU,SAAS,IAAI,IAAI;KAC7C,CAAC;;AAGJ,OAAI,wBAAwB,UAAU,qBAAqB,EAAE;IAC3D,MAAM,QAAQ,YAAY,qBAAqB;AAC/C,aAAS,OAAO,qBAAqB;AAErC,QAAI,MAAM,KAAK;KACb;KACA,MAAM;KACN,UAAU;KACX,CAAC;;AAEJ;;AAGF,MAAI,OAAO,SAAS,SAAS;GAC3B,MAAM,QAAQ,OAAO,SAAS;GAC9B,MAAM,QAAQ,YAAY,MAAM;AAEhC,QAAK,MAAM;IACT,MAAM;IACN,MAAM,EACJ,OACD;IACD,GAAG,KAAK,OAAO;IAChB;AACD,YAAS,OAAO,MAAM;AACtB;;AAGF,OAAK,MAAM;GACT,MAAM;GACN,GAAG,KAAK,OAAO;GAChB;;CAGH,MAAM,QAAQ,YAAY,KAAK;AAC/B,UAAS,OAAO,KAAK;AACrB,QAAO;EACL;EACA;EACD;;AAGH,SAAS,YACP,OACA,KACA,cACA,KACA,cACA;CACA,MAAM,MAAgB,EAAE;AACxB,KAAI,QAAQ,KAAA,EACV,KAAI,KAAK,GAAG,IAAI,KAAK;UACZ,iBAAiB,KAAA,EAC1B,KAAI,KAAK,GAAG,aAAa,IAAI;AAG/B,KAAI,KAAK,MAAM;AACf,KAAI,QAAQ,KAAA,EACV,KAAI,KAAK,MAAM,MAAM;UACZ,iBAAiB,KAAA,EAC1B,KAAI,KAAK,KAAK,eAAe;AAE/B,KAAI,IAAI,SAAS,EAAG,QAAO,IAAI,KAAK,IAAI"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NoReference } from "../schema.js";
|
|
1
|
+
import { NoReference } from "../schema/index.js";
|
|
2
2
|
import { OpenAPIServer } from "../../server/create.js";
|
|
3
3
|
import { OperationItem, WebhookItem } from "../../ui/api-page.js";
|
|
4
4
|
import { OperationObject, PathItemObject, TagObject } from "../../types.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { idToTitle } from "../id-to-title.js";
|
|
2
|
-
import { getTagDisplayName, methodKeys } from "../schema.js";
|
|
2
|
+
import { getTagDisplayName, methodKeys } from "../schema/index.js";
|
|
3
3
|
//#region src/utils/pages/builder.ts
|
|
4
4
|
async function fromServer(server, config) {
|
|
5
5
|
const schemas = await server.getSchemas();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { dereferenceSync } from "./schema/dereference.js";
|
|
1
2
|
import { bundle } from "@scalar/json-magic/bundle";
|
|
2
3
|
import { upgrade } from "@scalar/openapi-upgrader";
|
|
3
4
|
import { fetchUrls, readFiles } from "@scalar/json-magic/bundle/plugins/node";
|
|
4
|
-
import dereference from "dereference-json-schema";
|
|
5
5
|
//#region src/utils/process-document.ts
|
|
6
6
|
/**
|
|
7
7
|
* process & reference input document to a Fumadocs OpenAPI compatible format
|
|
@@ -30,37 +30,6 @@ async function processDocument(input) {
|
|
|
30
30
|
bundled
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Resolves all $ref pointers in a schema and returns a new schema without any $ref pointers.
|
|
35
|
-
*/
|
|
36
|
-
function dereferenceSync(schema, setOriginalRef) {
|
|
37
|
-
if (typeof schema === "boolean") return schema;
|
|
38
|
-
const visitedNodes = /* @__PURE__ */ new Set();
|
|
39
|
-
const cloned = structuredClone(schema);
|
|
40
|
-
function resolve(current) {
|
|
41
|
-
if (typeof current === "object" && current !== null) {
|
|
42
|
-
if (visitedNodes.has(current)) return current;
|
|
43
|
-
visitedNodes.add(current);
|
|
44
|
-
if (Array.isArray(current)) {
|
|
45
|
-
for (let index = 0; index < current.length; index++) current[index] = resolve(current[index]);
|
|
46
|
-
return current;
|
|
47
|
-
}
|
|
48
|
-
const obj = current;
|
|
49
|
-
if ("$ref" in current && typeof current["$ref"] === "string") {
|
|
50
|
-
const ref = current["$ref"];
|
|
51
|
-
delete current["$ref"];
|
|
52
|
-
const resolved = resolve(dereference.resolveRefSync(cloned, ref));
|
|
53
|
-
setOriginalRef(resolved, ref);
|
|
54
|
-
setOriginalRef(current, ref);
|
|
55
|
-
if (typeof resolved === "boolean") throw new Error("invalid schema");
|
|
56
|
-
for (const k in resolved) if (!(k in current)) obj[k] = resolved[k];
|
|
57
|
-
}
|
|
58
|
-
for (const key in current) obj[key] = resolve(obj[key]);
|
|
59
|
-
}
|
|
60
|
-
return current;
|
|
61
|
-
}
|
|
62
|
-
return resolve(cloned);
|
|
63
|
-
}
|
|
64
33
|
//#endregion
|
|
65
34
|
export { processDocument };
|
|
66
35
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-document.js","names":[],"sources":["../../src/utils/process-document.ts"],"sourcesContent":["import type { Document } from '@/types';\nimport type { NoReference } from '@/utils/schema';\nimport { bundle } from '@scalar/json-magic/bundle';\nimport { upgrade } from '@scalar/openapi-upgrader';\nimport { fetchUrls, readFiles } from '@scalar/json-magic/bundle/plugins/node';\nimport type { JSONSchema } from 'json-schema-typed/draft-2020-12';\nimport
|
|
1
|
+
{"version":3,"file":"process-document.js","names":[],"sources":["../../src/utils/process-document.ts"],"sourcesContent":["import type { Document } from '@/types';\nimport type { NoReference } from '@/utils/schema';\nimport { bundle } from '@scalar/json-magic/bundle';\nimport { upgrade } from '@scalar/openapi-upgrader';\nimport { fetchUrls, readFiles } from '@scalar/json-magic/bundle/plugins/node';\nimport type { JSONSchema } from 'json-schema-typed/draft-2020-12';\nimport { dereferenceSync } from './schema/dereference';\n\nexport interface ProcessedDocument {\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\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\n /**\n * Dereferenced value and its original `$ref` value\n */\n const dereferenceMap = new Map<object, string>();\n\n return {\n dereferenced: dereferenceSync(bundled as JSONSchema, (schema, ref) => {\n dereferenceMap.set(schema as object, ref);\n }) as NoReference<Document>,\n getRawRef(obj) {\n return dereferenceMap.get(obj);\n },\n bundled,\n };\n}\n"],"mappings":";;;;;;;;AAyBA,eAAsB,gBAAgB,OAAsD;CAC1F,MAAM,UAAoB,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;;;;CAKJ,MAAM,iCAAiB,IAAI,KAAqB;AAEhD,QAAO;EACL,cAAc,gBAAgB,UAAwB,QAAQ,QAAQ;AACpE,kBAAe,IAAI,QAAkB,IAAI;IACzC;EACF,UAAU,KAAK;AACb,UAAO,eAAe,IAAI,IAAI;;EAEhC;EACD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { resolveRefSync } from "./resolve-ref.js";
|
|
2
|
+
//#region src/utils/schema/dereference.ts
|
|
3
|
+
/**
|
|
4
|
+
* Resolves all $ref pointers in a schema and returns a new schema without any $ref pointers.
|
|
5
|
+
*/
|
|
6
|
+
function dereferenceSync(schema, setOriginalRef) {
|
|
7
|
+
if (typeof schema === "boolean") return schema;
|
|
8
|
+
const visitedNodes = /* @__PURE__ */ new Set();
|
|
9
|
+
const cloned = structuredClone(schema);
|
|
10
|
+
function resolve(current) {
|
|
11
|
+
if (typeof current === "object" && current !== null) {
|
|
12
|
+
if (visitedNodes.has(current)) return current;
|
|
13
|
+
visitedNodes.add(current);
|
|
14
|
+
if (Array.isArray(current)) {
|
|
15
|
+
for (let index = 0; index < current.length; index++) current[index] = resolve(current[index]);
|
|
16
|
+
return current;
|
|
17
|
+
}
|
|
18
|
+
const obj = current;
|
|
19
|
+
if ("$ref" in current && typeof current["$ref"] === "string") {
|
|
20
|
+
const ref = current["$ref"];
|
|
21
|
+
delete current["$ref"];
|
|
22
|
+
const resolved = resolve(resolveRefSync(ref, cloned));
|
|
23
|
+
setOriginalRef(resolved, ref);
|
|
24
|
+
setOriginalRef(current, ref);
|
|
25
|
+
if (typeof resolved === "boolean") throw new Error("invalid schema");
|
|
26
|
+
for (const k in resolved) if (!(k in current)) obj[k] = resolved[k];
|
|
27
|
+
}
|
|
28
|
+
for (const key in current) obj[key] = resolve(obj[key]);
|
|
29
|
+
}
|
|
30
|
+
return current;
|
|
31
|
+
}
|
|
32
|
+
return resolve(cloned);
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { dereferenceSync };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=dereference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,7 +1,7 @@
|
|
|
1
|
-
import { ReferenceObject } from "
|
|
1
|
+
import { ReferenceObject } from "../../types.js";
|
|
2
2
|
import { JSONSchema } from "json-schema-typed/draft-2020-12";
|
|
3
3
|
|
|
4
|
-
//#region src/utils/schema.d.ts
|
|
4
|
+
//#region src/utils/schema/index.d.ts
|
|
5
5
|
type NoReference<T> = T extends (infer I)[] ? NoReference<I>[] : T extends ReferenceObject ? Exclude<T, ReferenceObject> : T extends object ? { [K in keyof T]: NoReference<T[K]> } : T;
|
|
6
6
|
type NoReferenceJSONSchema<T> = T extends (infer I)[] ? NoReference<I>[] : T extends {
|
|
7
7
|
$ref?: string;
|
|
@@ -12,4 +12,4 @@ type ParsedSchema = (JSONSchema & {
|
|
|
12
12
|
type ResolvedSchema = NoReferenceJSONSchema<ParsedSchema>;
|
|
13
13
|
//#endregion
|
|
14
14
|
export { NoReference, ParsedSchema, ResolvedSchema };
|
|
15
|
-
//# sourceMappingURL=
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/utils/schema/index.ts"],"mappings":";;;;KAcY,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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { idToTitle } from "
|
|
2
|
-
//#region src/utils/schema.ts
|
|
1
|
+
import { idToTitle } from "../id-to-title.js";
|
|
2
|
+
//#region src/utils/schema/index.ts
|
|
3
3
|
const methodKeys = [
|
|
4
4
|
"get",
|
|
5
5
|
"post",
|
|
@@ -48,4 +48,4 @@ function pickExample(value) {
|
|
|
48
48
|
//#endregion
|
|
49
49
|
export { createMethod, getPreferredType, getTagDisplayName, methodKeys, pickExample };
|
|
50
50
|
|
|
51
|
-
//# sourceMappingURL=
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 ExampleObject,\n MediaTypeObject,\n MethodInformation,\n OperationObject,\n PathItemObject,\n ReferenceObject,\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: string,\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: method.toUpperCase(),\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"],"mappings":";;AAYA,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,QAAQ,OAAO,aAAa;EAC7B;;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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/utils/schema/resolve-ref.ts
|
|
2
|
+
function resolveRefSync(ref, schema) {
|
|
3
|
+
if (!ref.startsWith("#")) return;
|
|
4
|
+
const segments = ref.slice(1).split("/");
|
|
5
|
+
let current = schema;
|
|
6
|
+
for (const seg of segments) {
|
|
7
|
+
if (seg.length === 0) continue;
|
|
8
|
+
if (isPlainObject(current)) current = current[seg];
|
|
9
|
+
else return;
|
|
10
|
+
}
|
|
11
|
+
return current;
|
|
12
|
+
}
|
|
13
|
+
function isPlainObject(value) {
|
|
14
|
+
if (typeof value !== "object" || value === null) return false;
|
|
15
|
+
const prototype = Object.getPrototypeOf(value);
|
|
16
|
+
return prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { resolveRefSync };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=resolve-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-ref.js","names":[],"sources":["../../../src/utils/schema/resolve-ref.ts"],"sourcesContent":["import type { JSONSchema } from 'json-schema-typed/draft-2020-12';\n\nexport function resolveRefSync(ref: string, schema: JSONSchema): unknown | undefined {\n if (!ref.startsWith('#')) return;\n const segments = ref.slice(1).split('/');\n let current: unknown = schema;\n\n for (const seg of segments) {\n if (seg.length === 0) continue;\n\n if (isPlainObject(current)) current = current[seg];\n else return;\n }\n\n return current;\n}\n\nfunction 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":";AAEA,SAAgB,eAAe,KAAa,QAAyC;AACnF,KAAI,CAAC,IAAI,WAAW,IAAI,CAAE;CAC1B,MAAM,WAAW,IAAI,MAAM,EAAE,CAAC,MAAM,IAAI;CACxC,IAAI,UAAmB;AAEvB,MAAK,MAAM,OAAO,UAAU;AAC1B,MAAI,IAAI,WAAW,EAAG;AAEtB,MAAI,cAAc,QAAQ,CAAE,WAAU,QAAQ;MACzC;;AAGP,QAAO;;AAGT,SAAS,cAAc,OAAkD;AACvE,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,4 +1,4 @@
|
|
|
1
|
-
//#region src/utils/schema
|
|
1
|
+
//#region src/utils/schema/to-string.ts
|
|
2
2
|
let FormatFlags = /* @__PURE__ */ function(FormatFlags) {
|
|
3
3
|
FormatFlags[FormatFlags["None"] = 0] = "None";
|
|
4
4
|
FormatFlags[FormatFlags["UseAlias"] = 1] = "UseAlias";
|
|
@@ -55,4 +55,4 @@ function schemaToString(value, _resolver, flags = FormatFlags.None) {
|
|
|
55
55
|
//#endregion
|
|
56
56
|
export { FormatFlags, schemaToString };
|
|
57
57
|
|
|
58
|
-
//# sourceMappingURL=
|
|
58
|
+
//# sourceMappingURL=to-string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 { ProcessedDocument } from '@/utils/process-document';\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?: ProcessedDocument | 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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fumadocs-openapi",
|
|
3
|
-
"version": "10.
|
|
3
|
+
"version": "10.6.0",
|
|
4
4
|
"description": "Generate MDX docs for your OpenAPI spec",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Docs",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"./ui": "./dist/ui/index.js",
|
|
37
37
|
"./ui/base": "./dist/ui/base.js",
|
|
38
38
|
"./ui/client": "./dist/ui/client/index.js",
|
|
39
|
+
"./ui/create-client": "./dist/ui/create-client.js",
|
|
39
40
|
"./package.json": "./package.json",
|
|
40
41
|
"./css/*": "./css/*"
|
|
41
42
|
},
|
|
@@ -52,8 +53,8 @@
|
|
|
52
53
|
"@scalar/json-magic": "^0.12.4",
|
|
53
54
|
"@scalar/openapi-upgrader": "^0.2.2",
|
|
54
55
|
"ajv": "^8.18.0",
|
|
56
|
+
"chokidar": "^5.0.0",
|
|
55
57
|
"class-variance-authority": "^0.7.1",
|
|
56
|
-
"dereference-json-schema": "^0.2.2",
|
|
57
58
|
"github-slugger": "^2.0.0",
|
|
58
59
|
"hast-util-to-jsx-runtime": "^2.3.6",
|
|
59
60
|
"js-yaml": "^4.1.1",
|
|
@@ -79,8 +80,8 @@
|
|
|
79
80
|
"tsdown": "0.21.5",
|
|
80
81
|
"@fumadocs/tailwind": "0.0.3",
|
|
81
82
|
"eslint-config-custom": "0.0.0",
|
|
82
|
-
"fumadocs-core": "16.7.
|
|
83
|
-
"fumadocs-ui": "16.7.
|
|
83
|
+
"fumadocs-core": "16.7.7",
|
|
84
|
+
"fumadocs-ui": "16.7.7",
|
|
84
85
|
"tsconfig": "0.0.0"
|
|
85
86
|
},
|
|
86
87
|
"peerDependencies": {
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
//#region src/requests/to-python-object.ts
|
|
2
|
-
function generatePythonObject(v, imports = /* @__PURE__ */ new Set()) {
|
|
3
|
-
if (v === null) return "None";
|
|
4
|
-
else if (typeof v === "boolean") return v ? "True" : "False";
|
|
5
|
-
else if (typeof v === "string") return JSON.stringify(v);
|
|
6
|
-
else if (typeof v === "number") return v.toString();
|
|
7
|
-
else if (Array.isArray(v)) return `[${v.map((item) => generatePythonObject(item, imports)).join(", ")}]`;
|
|
8
|
-
else if (v instanceof Date) {
|
|
9
|
-
imports.add("datetime");
|
|
10
|
-
return `datetime.datetime(${v.getFullYear()}, ${v.getMonth() + 1}, ${v.getDate()}, ${v.getHours()}, ${v.getMinutes()}, ${v.getSeconds()}, ${v.getMilliseconds()})`;
|
|
11
|
-
} else if (typeof v === "object") return `{\n${Object.entries(v).map(([key, value]) => ` ${JSON.stringify(key)}: ${generatePythonObject(value, imports)}`).join(", \n")}\n}`;
|
|
12
|
-
else throw new Error(`Unsupported type: ${typeof v}`);
|
|
13
|
-
}
|
|
14
|
-
//#endregion
|
|
15
|
-
export { generatePythonObject };
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=to-python-object.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-python-object.js","names":[],"sources":["../../src/requests/to-python-object.ts"],"sourcesContent":["export function generatePythonObject(v: unknown, imports = new Set()): string {\n if (v === null) {\n return 'None';\n } else if (typeof v === 'boolean') {\n return v ? 'True' : 'False';\n } else if (typeof v === 'string') {\n return JSON.stringify(v);\n } else if (typeof v === 'number') {\n return v.toString();\n } else if (Array.isArray(v)) {\n const items = v.map((item) => generatePythonObject(item, imports));\n return `[${items.join(', ')}]`;\n } else if (v instanceof Date) {\n imports.add('datetime');\n return `datetime.datetime(${v.getFullYear()}, ${v.getMonth() + 1}, ${v.getDate()}, ${v.getHours()}, ${v.getMinutes()}, ${v.getSeconds()}, ${v.getMilliseconds()})`;\n } else if (typeof v === 'object') {\n const entries = Object.entries(v).map(\n ([key, value]) => ` ${JSON.stringify(key)}: ${generatePythonObject(value, imports)}`,\n );\n return `{\\n${entries.join(', \\n')}\\n}`;\n } else {\n throw new Error(`Unsupported type: ${typeof v}`);\n }\n}\n"],"mappings":";AAAA,SAAgB,qBAAqB,GAAY,0BAAU,IAAI,KAAK,EAAU;AAC5E,KAAI,MAAM,KACR,QAAO;UACE,OAAO,MAAM,UACtB,QAAO,IAAI,SAAS;UACX,OAAO,MAAM,SACtB,QAAO,KAAK,UAAU,EAAE;UACf,OAAO,MAAM,SACtB,QAAO,EAAE,UAAU;UACV,MAAM,QAAQ,EAAE,CAEzB,QAAO,IADO,EAAE,KAAK,SAAS,qBAAqB,MAAM,QAAQ,CAAC,CACjD,KAAK,KAAK,CAAC;UACnB,aAAa,MAAM;AAC5B,UAAQ,IAAI,WAAW;AACvB,SAAO,qBAAqB,EAAE,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;YACvJ,OAAO,MAAM,SAItB,QAAO,MAHS,OAAO,QAAQ,EAAE,CAAC,KAC/B,CAAC,KAAK,WAAW,KAAK,KAAK,UAAU,IAAI,CAAC,IAAI,qBAAqB,OAAO,QAAQ,GACpF,CACoB,KAAK,OAAO,CAAC;KAElC,OAAM,IAAI,MAAM,qBAAqB,OAAO,IAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"full.client.js","names":[],"sources":["../../src/ui/full.client.tsx"],"sourcesContent":["'use client';\nimport type { ReactNode } from 'react';\nimport { ClientCodeBlockProvider } from './components/codeblock';\nimport { defaultShikiFactory } from 'fumadocs-core/highlight/shiki/full';\n\nexport function FullProvider({ children }: { children: ReactNode }) {\n return (\n <ClientCodeBlockProvider factory={defaultShikiFactory}>{children}</ClientCodeBlockProvider>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,aAAa,EAAE,YAAqC;AAClE,QACE,oBAAC,yBAAD;EAAyB,SAAS;EAAsB;EAAmC,CAAA"}
|
package/dist/ui/full.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { OpenAPIServer } from "../server/create.js";
|
|
2
|
-
import { ApiPageProps } from "./api-page.js";
|
|
3
|
-
import { CreateAPIPageOptions as CreateAPIPageOptions$1 } from "./base.js";
|
|
4
|
-
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
5
|
-
|
|
6
|
-
//#region src/ui/full.d.ts
|
|
7
|
-
type CreateAPIPageOptions = Partial<CreateAPIPageOptions$1>;
|
|
8
|
-
declare function createAPIPage(server: OpenAPIServer, options?: CreateAPIPageOptions): (props: ApiPageProps) => react_jsx_runtime0.JSX.Element;
|
|
9
|
-
//#endregion
|
|
10
|
-
export { CreateAPIPageOptions, createAPIPage };
|
|
11
|
-
//# sourceMappingURL=full.d.ts.map
|
package/dist/ui/full.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"full.d.ts","names":[],"sources":["../../src/ui/full.tsx"],"mappings":";;;;;;KAMY,oBAAA,GAAuB,OAAA,CAAQ,sBAAA;AAAA,iBAE3B,aAAA,CAAc,MAAA,EAAQ,aAAA,EAAe,OAAA,GAAS,oBAAA,IAsBhC,KAAA,EAAO,YAAA,KAAY,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
package/dist/ui/full.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { createAPIPage as createAPIPage$1 } from "./base.js";
|
|
2
|
-
import { FullProvider } from "./full.client.js";
|
|
3
|
-
import { jsx } from "react/jsx-runtime";
|
|
4
|
-
import { defaultShikiFactory } from "fumadocs-core/highlight/shiki/full";
|
|
5
|
-
//#region src/ui/full.tsx
|
|
6
|
-
function createAPIPage(server, options = {}) {
|
|
7
|
-
const APIPage = createAPIPage$1(server, {
|
|
8
|
-
shiki: defaultShikiFactory,
|
|
9
|
-
shikiOptions: { themes: {
|
|
10
|
-
light: "github-light",
|
|
11
|
-
dark: "github-dark"
|
|
12
|
-
} },
|
|
13
|
-
async generateTypeScriptDefinitions(schema, ctx) {
|
|
14
|
-
if (typeof schema !== "object") return;
|
|
15
|
-
const { compile } = await import("@fumari/json-schema-ts");
|
|
16
|
-
try {
|
|
17
|
-
return compile(schema, {
|
|
18
|
-
name: "Response",
|
|
19
|
-
readOnly: ctx.readOnly,
|
|
20
|
-
writeOnly: ctx.writeOnly,
|
|
21
|
-
getSchemaId: ctx.schema.getRawRef
|
|
22
|
-
});
|
|
23
|
-
} catch (e) {
|
|
24
|
-
console.warn("Failed to generate typescript schema:", e);
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
...options
|
|
28
|
-
});
|
|
29
|
-
return function APIPageFull(props) {
|
|
30
|
-
return /* @__PURE__ */ jsx(FullProvider, { children: /* @__PURE__ */ jsx(APIPage, { ...props }) });
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
//#endregion
|
|
34
|
-
export { createAPIPage };
|
|
35
|
-
|
|
36
|
-
//# sourceMappingURL=full.js.map
|
package/dist/ui/full.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"full.js","names":["base.createAPIPage"],"sources":["../../src/ui/full.tsx"],"sourcesContent":["import type { OpenAPIServer } from '@/server';\nimport * as base from './base';\nimport type { ApiPageProps } from './api-page';\nimport { defaultShikiFactory } from 'fumadocs-core/highlight/shiki/full';\nimport { FullProvider } from './full.client';\n\nexport type CreateAPIPageOptions = Partial<base.CreateAPIPageOptions>;\n\nexport function createAPIPage(server: OpenAPIServer, options: CreateAPIPageOptions = {}) {\n const APIPage = base.createAPIPage(server, {\n shiki: defaultShikiFactory,\n shikiOptions: { themes: { light: 'github-light', dark: 'github-dark' } },\n async generateTypeScriptDefinitions(schema, ctx) {\n if (typeof schema !== 'object') return;\n const { compile } = await import('@fumari/json-schema-ts');\n\n try {\n return compile(schema, {\n name: 'Response',\n readOnly: ctx.readOnly,\n writeOnly: ctx.writeOnly,\n getSchemaId: ctx.schema.getRawRef,\n });\n } catch (e) {\n console.warn('Failed to generate typescript schema:', e);\n }\n },\n ...options,\n });\n\n return function APIPageFull(props: ApiPageProps) {\n return (\n <FullProvider>\n <APIPage {...props} />\n </FullProvider>\n );\n };\n}\n"],"mappings":";;;;;AAQA,SAAgB,cAAc,QAAuB,UAAgC,EAAE,EAAE;CACvF,MAAM,UAAUA,gBAAmB,QAAQ;EACzC,OAAO;EACP,cAAc,EAAE,QAAQ;GAAE,OAAO;GAAgB,MAAM;GAAe,EAAE;EACxE,MAAM,8BAA8B,QAAQ,KAAK;AAC/C,OAAI,OAAO,WAAW,SAAU;GAChC,MAAM,EAAE,YAAY,MAAM,OAAO;AAEjC,OAAI;AACF,WAAO,QAAQ,QAAQ;KACrB,MAAM;KACN,UAAU,IAAI;KACd,WAAW,IAAI;KACf,aAAa,IAAI,OAAO;KACzB,CAAC;YACK,GAAG;AACV,YAAQ,KAAK,yCAAyC,EAAE;;;EAG5D,GAAG;EACJ,CAAC;AAEF,QAAO,SAAS,YAAY,OAAqB;AAC/C,SACE,oBAAC,cAAD,EAAA,UACE,oBAAC,SAAD,EAAS,GAAI,OAAS,CAAA,EACT,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"mappings":";;;;UAkBiB,kBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA,EAAM,cAAA;EACN,OAAA,EAAS,WAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema-to-string.js","names":[],"sources":["../../src/utils/schema-to-string.ts"],"sourcesContent":["import type { ParsedSchema, ResolvedSchema } from '@/utils/schema';\nimport type { ProcessedDocument } from '@/utils/process-document';\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?: ProcessedDocument | 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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/utils/schema.ts"],"mappings":";;;;KAcY,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"}
|
package/dist/utils/schema.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../src/utils/schema.ts"],"sourcesContent":["import type { JSONSchema } from 'json-schema-typed/draft-2020-12';\nimport type {\n ExampleObject,\n MediaTypeObject,\n MethodInformation,\n OperationObject,\n PathItemObject,\n ReferenceObject,\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: string,\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: method.toUpperCase(),\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"],"mappings":";;AAYA,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,QAAQ,OAAO,aAAa;EAC7B;;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"}
|
|
File without changes
|