fumadocs-openapi 10.6.3 → 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 +8 -17
- package/dist/_openapi/types.d.ts +1 -2
- package/dist/generate-file.d.ts +3 -4
- 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 +12 -22
- package/dist/playground/client.js +37 -18
- 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 +25 -37
- 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 +1 -3
- package/dist/server/proxy.d.ts +1 -2
- package/dist/server/proxy.js +0 -2
- package/dist/server/source-api.d.ts +3 -4
- package/dist/server/source-api.js +0 -2
- package/dist/types.d.ts +5 -6
- package/dist/ui/api-page.d.ts +1 -2
- package/dist/ui/api-page.js +0 -2
- package/dist/ui/base.d.ts +10 -10
- package/dist/ui/base.js +22 -2
- 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 +18 -15
- 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 +2 -4
- package/dist/ui/operation/index.js +5 -8
- package/dist/ui/operation/request-tabs.js +0 -2
- package/dist/ui/operation/response-tabs.d.ts +2 -3
- 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 +8 -6
- package/dist/utils/document/dereference.d.ts +17 -0
- package/dist/utils/document/dereference.js +19 -0
- package/dist/utils/document/process.d.ts +6 -0
- package/dist/utils/{process-document.js → document/process.js} +4 -19
- package/dist/utils/id-to-title.js +0 -2
- package/dist/utils/is-plain-object.js +8 -0
- package/dist/utils/pages/builder.d.ts +5 -6
- package/dist/utils/pages/builder.js +0 -2
- package/dist/utils/pages/preset-auto.d.ts +3 -4
- 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 +10 -10
- package/dist/utils/schema/dereference.js +22 -14
- package/dist/utils/schema/index.d.ts +7 -7
- package/dist/utils/schema/index.js +21 -4
- package/dist/utils/{merge-schema.js → schema/merge.js} +2 -4
- package/dist/utils/schema/pick.js +44 -0
- package/dist/utils/schema/ref.js +35 -0
- package/dist/utils/schema/resolve-ref.js +4 -14
- 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 +3 -4
- 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/index.d.ts +0 -22
- package/dist/playground/index.d.ts.map +0 -1
- package/dist/playground/index.js +0 -118
- package/dist/playground/index.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/id-to-title.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/process-document.d.ts +0 -18
- package/dist/utils/process-document.d.ts.map +0 -1
- package/dist/utils/process-document.js.map +0 -1
- package/dist/utils/remove-undefined.js.map +0 -1
- package/dist/utils/schema/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/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":"types.d.ts","names":["OpenAPI","T","OpenAPIV2","Document","OpenAPIV3","OpenAPIV3_1","OpenAPIV3_2","OperationObject","ResponseObject","HeaderObject","ReferenceObject","ParameterObject","Parameter","ExampleObject","SchemaObject","HttpMethods","Operation","Request","body","headers","params","query","Parameters","HttpMethod","R","P","Omit","PathsObject","PathItemObject","Record","ComponentsObject","ServerObject","TagObject","PathsWebhooksComponents","Pick","Partial","Modify","RequestBodyObject","ResponsesObject","CallbackObject","ParameterStyle","ParameterLocation","MediaTypeObject","NonArraySchemaObjectType","ArraySchemaObjectType","ArraySchemaObject","NonArraySchemaObject","MixedSchemaObject","BaseSchemaObject","DiscriminatorObject","XMLObject","XMLNodeType","EncodingObject","LinkObject","SecuritySchemeObject","HttpSecurityScheme","ApiKeySecurityScheme","OAuth2SecurityScheme","OpenIdSecurityScheme","OAuthFlows","OAuthFlowBase","OAuthFlowTokenUrlTrait","paths","webhooks","components","openapi","swagger","servers","$self","tags","name","method","additionalOperations","parameters","requestBody","responses","callbacks","style","in","schema","examples","media","content","type","items","discriminator","xml","defaultMapping","nodeType","dataValue","serializedValue","encoding","itemSchema","itemEncoding","prefixEncoding","header","links","link","summary","server","schemas","requestBodies","securitySchemes","pathItems","mediaTypes","deprecated","deviceAuthorization","deviceAuthorizationUrl","flows","parent","kind","InfoObject","LicenseObject","ContactObject","ServerVariableObject","ExternalDocumentationObject","ParameterBaseObject","SecurityRequirementObject","info","jsonSchemaDialect","license","identifier","url","description","variables","enum","exclusiveMinimum","exclusiveMaximum","contentMediaType","$schema","additionalProperties","properties","patternProperties","allOf","oneOf","anyOf","not","externalDocs","const","OAuthFlowAuthorizationUrlTrait","security","title","termsOfService","contact","version","email","variable","default","pattern","$ref","operationId","callback","required","allowEmptyValue","explode","allowReserved","example","format","multipleOf","maximum","minimum","maxLength","minLength","maxItems","minItems","uniqueItems","maxProperties","minProperties","nullable","readOnly","writeOnly","propertyName","mapping","value","namespace","prefix","attribute","wrapped","externalValue","contentType","code","operationRef","parameter","key","scheme","bearerFormat","scopes","scope","refreshUrl","authorizationUrl","tokenUrl","implicit","password","clientCredentials","authorizationCode","openIdConnectUrl","MimeTypes","DefinitionsObject","ParametersDefinitionsObject","ResponsesDefinitionsObject","SecurityDefinitionsObject","SecuritySchemeObjectBase","SecuritySchemeOauth2Implicit","SecuritySchemeOauth2AccessCode","SecuritySchemeOauth2Password","SecuritySchemeOauth2Application","ScopesObject","SecuritySchemeOauth2Base","SecuritySchemeBasic","SecuritySchemeApiKey","SecuritySchemeOauth2","Schema","HeadersObject","ItemsObject","Response","InBodyParameterObject","GeneralParameterObject","IJsonSchema","basePath","consumes","definitions","host","produces","schemes","securityDefinitions","index","flow","collectionFormat","id","additionalItems","dependencies"],"sources":["../../src/_openapi/types.d.ts"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-file.d.ts","names":[],"sources":["../src/generate-file.ts"],"mappings":";;;;;;;;UAUiB,UAAA;EACf,IAAA;EACA,OAAA;AAAA;AAAA,UAGQ,WAAA;EACR,KAAA,EAAO,SAAA,OAAgB,GAAA,EAAK,kBAAA,KAAuB,SAAA;EALnD;;AAED;EAQC,GAAA,IACM,QAAA;IAEA,OAAA;IARC;;;IAYD,UAAA;EAAA;AAAA;AAAA,UAIE,SAAA;EAhBoB;EAkB5B,IAAA;EACA,KAAA;EACA,WAAA;EAdM;;;;;EAqBN,IAAA;AAAA;AAAA,UAGQ,mBAAA,SAA4B,kBAAA;EAdnB;;;EAkBjB,KAAA,EAAO,aAAA;EAPP;;;EAYA,MAAA;EAT4B;;;EAc5B,KAAA,GAAQ,WAAA;EAOS;;;;;EAAjB,IAAA,aAAiB,WAAA;EArBqC;;;EA0BtD,WAAA,IAAe,IAAA,EAAM,kBAAA,EAAoB,KAAA,EAAO,UAAA,cAAwB,OAAA;AAAA;AAAA,UAGhE,WAAA;EACR,UAAA;AAAA;AAAA,KAGU,MAAA,GAAS,oBAAA,GACnB,mBAAA;EARA;;;;;EAcE,KAAA;AAAA;AAAA,UAGM,kBAAA;EAAA,SACC,SAAA,EAAW,MAAA,SAAe,UAAA;EAAA,SAC1B,gBAAA,EAAkB,MAAA,SAAe,WAAA;EAAA,SACjC,SAAA,EAAW,MAAA,SAAe,iBAAA;AAAA;AAAA,iBAGf,aAAA,CAAc,OAAA,EAAS,MAAA,GAAS,OAAA;AAAA,iBA2BhC,iBAAA,CACpB,OAAA,EAAS,gBAAA,CAAiB,MAAA,cACzB,OAAA,CAAQ,UAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-file.js","names":["path"],"sources":["../src/generate-file.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { generateDocument, type PagesToTextOptions, toText } from './utils/pages/to-text';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport type { OpenAPIServer } from '@/server';\nimport { createGetUrl, getSlugs, PathUtils } from 'fumadocs-core/source';\nimport { createAutoPreset, type SchemaToPagesOptions } from '@/utils/pages/preset-auto';\nimport { fromSchema, type OutputGroup, type OutputEntry } from '@/utils/pages/builder';\nimport type { DistributiveOmit } from './types';\n\nexport interface OutputFile {\n path: string;\n content: string;\n}\n\ninterface IndexConfig {\n items: IndexItem[] | ((ctx: BeforeWriteContext) => IndexItem[]);\n\n /**\n * Generate URLs for cards\n */\n url:\n | ((filePath: string) => string)\n | {\n baseUrl: string;\n /**\n * Base content directory\n */\n contentDir: string;\n };\n}\n\ninterface IndexItem {\n /** output path of index page */\n path: string;\n title?: string;\n description?: string;\n\n /**\n * Specify linked pages:\n * - items in `inputs` to include all generated pages of a specific schema.\n * - file paths (using forward slash).\n */\n only?: string[];\n}\n\ninterface GenerateFilesConfig extends PagesToTextOptions {\n /**\n * the OpenAPI server object\n */\n input: OpenAPIServer;\n\n /**\n * Output directory\n */\n output: string;\n\n /**\n * Generate index files with cards linking to generated pages.\n */\n index?: IndexConfig;\n\n /**\n * Generate `meta.json` files.\n *\n * Note: for flexibility, it's recommended to define them on your own.\n */\n meta?: boolean | MetaOptions;\n\n /**\n * Can add/change/remove output files before writing to file system\n **/\n beforeWrite?: (this: BeforeWriteContext, files: OutputFile[]) => void | Promise<void>;\n}\n\ninterface MetaOptions {\n groupStyle?: 'folder' | 'separator';\n}\n\nexport type Config = SchemaToPagesOptions &\n GenerateFilesConfig & {\n /**\n * Re-generate when **schema files are changed**, ignores custom input functions & URLs.\n *\n * Note: it is recommended to configure & use `chokidar` on your own, this is only for simple cases.\n */\n watch?: boolean;\n };\n\ninterface BeforeWriteContext {\n readonly generated: Record<string, OutputFile[]>;\n readonly generatedEntries: Record<string, OutputEntry[]>;\n readonly documents: Record<string, ProcessedDocument>;\n}\n\nexport async function generateFiles(options: Config): Promise<void> {\n if (options.watch) {\n const { watch } = await import('chokidar');\n const subOptions: Config = { ...options, watch: false };\n\n await generateFiles(subOptions);\n const targets = options.input._getWatchPaths();\n console.log(`[Fumadocs OpenAPI] watching ${targets.join(', ')}`);\n watch(targets, {\n ignoreInitial: true,\n }).on('all', () => generateFiles(subOptions));\n return;\n }\n\n const files = await generateFilesOnly(options);\n\n await Promise.all(\n files.map(async (file) => {\n const filePath = path.join(options.output, file.path);\n\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, file.content);\n console.log(`Generated: ${filePath}`);\n }),\n );\n}\n\nexport async function generateFilesOnly(\n options: DistributiveOmit<Config, 'output'>,\n): Promise<OutputFile[]> {\n const schemas = await options.input.getSchemas();\n\n const files: OutputFile[] = [];\n const generated: Record<string, OutputFile[]> = {};\n const generatedEntries: 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 const preset = createAutoPreset(options);\n for (const [id, schema] of entries) {\n const entries = fromSchema(id, schema, preset);\n const schemaFiles: OutputFile[] = [];\n\n generatedEntries[id] = entries;\n function scan(entry: OutputEntry) {\n if (entry.type === 'group') {\n for (const child of entry.entries) scan(child);\n return;\n }\n\n schemaFiles.push({\n path: entry.path,\n content: toText(entry, schema, options),\n });\n }\n\n for (const entry of entries) scan(entry);\n generated[id] = schemaFiles;\n files.push(...schemaFiles);\n }\n\n const context: BeforeWriteContext = {\n generated,\n generatedEntries,\n documents: schemas,\n };\n\n if (options.index) {\n files.push(...writeIndexFiles(context, options));\n }\n\n if (options.meta) {\n files.push(...generateMeta(context, options.meta === true ? {} : options.meta));\n }\n\n await options.beforeWrite?.call(context, files);\n return files;\n}\n\nfunction generateMeta(context: BeforeWriteContext, options: MetaOptions): OutputFile[] {\n const files: OutputFile[] = [];\n const { groupStyle = 'folder' } = options;\n\n function scan(entries: OutputEntry[], parent?: OutputGroup) {\n const pages: string[] = [];\n\n for (const entry of entries) {\n const relativePath = PathUtils.slash(\n parent ? path.relative(parent.path, entry.path) : entry.path,\n );\n\n if (entry.type === 'group') {\n scan(entry.entries, entry);\n\n if (groupStyle === 'folder') {\n pages.push(relativePath);\n } else {\n pages.push(`---${entry.info.title}---`, `...${relativePath}`);\n }\n } else {\n pages.push(relativePath.slice(0, -path.extname(entry.path).length));\n }\n }\n\n if (pages.length === 0) return;\n files.push({\n path: parent ? path.join(parent.path, 'meta.json') : 'meta.json',\n content: JSON.stringify(\n {\n title: parent?.info.title,\n description: parent?.info.description,\n pages,\n },\n null,\n 2,\n ),\n });\n }\n\n for (const entries of Object.values(context.generatedEntries)) {\n scan(entries);\n }\n\n return files;\n}\n\nfunction writeIndexFiles(\n context: BeforeWriteContext,\n options: SchemaToPagesOptions & Omit<GenerateFilesConfig, 'output'>,\n): OutputFile[] {\n const files: OutputFile[] = [];\n const { generatedEntries } = context;\n const pathToEntry = new Map<string, OutputEntry>();\n const { items, url } = options.index!;\n\n function indexEntry(entry: OutputEntry) {\n pathToEntry.set(PathUtils.slash(entry.path), entry);\n if (entry.type === 'group') {\n for (const child of entry.entries) {\n indexEntry(child);\n }\n }\n }\n\n let urlFn: (path: string) => string;\n if (typeof url === 'object') {\n const getUrl = createGetUrl(url.baseUrl);\n\n urlFn = (file) => getUrl(getSlugs(path.relative(url.contentDir, file)));\n } else {\n urlFn = url;\n }\n\n function fileContent(index: IndexItem): string {\n const content: string[] = [];\n content.push('<Cards>');\n const outputEntries: OutputEntry[] = [];\n const only = index.only ?? Object.keys(context.generated);\n\n for (const item of only) {\n if (generatedEntries[item]) {\n for (const entry of generatedEntries[item]) {\n outputEntries.push(entry);\n }\n } else {\n const match = pathToEntry.get(item);\n if (!match) {\n throw new Error(\n `${item} does not exist on \"input\", available: ${Object.keys(generatedEntries).join(', ')}.`,\n );\n }\n\n outputEntries.push(match);\n }\n }\n\n for (const entry of outputEntries) {\n // cannot link to groups\n if (entry.type === 'group') continue;\n const descriptionAttr = entry.info.description\n ? `description=${JSON.stringify(entry.info.description)} `\n : '';\n content.push(\n `<Card href=\"${urlFn(entry.path)}\" title=${JSON.stringify(entry.info.title)} ${descriptionAttr}/>`,\n );\n }\n\n content.push('</Cards>');\n return generateDocument(\n {\n title: index.title ?? 'Overview',\n description: index.description,\n },\n content.join('\\n'),\n options,\n );\n }\n\n for (const list of Object.values(context.generatedEntries)) {\n for (const item of list) indexEntry(item);\n }\n\n for (const item of typeof items === 'function' ? items(context) : items) {\n files.push({\n path: path.extname(item.path).length === 0 ? `${item.path}.mdx` : item.path,\n content: fileContent(item),\n });\n }\n\n return files;\n}\n"],"mappings":"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"}
|
package/dist/i18n.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","names":[],"sources":["../src/i18n.ts"],"mappings":";;;cAIa,mBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuHD,YAAA,UAAsB,mBAAA;AAAA,iBAElB,iBAAA,0BAAA,CACd,MAAA,EAAQ,YAAA,CAAa,SAAA,GACrB,YAAA,EAAc,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,SAAA,GAAY,OAAA,CAAQ,YAAA,MACxD,YAAA,CAAa,SAAA"}
|
package/dist/i18n.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","names":[],"sources":["../src/i18n.ts"],"sourcesContent":["import type { I18nUIConfig } from 'fumadocs-ui/i18n';\nimport { deepmerge } from '@fastify/deepmerge';\nimport type { TranslationsOption } from 'fumadocs-ui/contexts/i18n';\n\nexport const defaultTranslations = {\n // General\n loading: 'loading...',\n empty: 'Empty',\n copy: 'Copy',\n send: 'Send',\n authorization: 'Authorization',\n cookies: 'Cookies',\n query: 'Query',\n path: 'Path',\n header: 'Header',\n body: 'Body',\n deprecated: 'Deprecated',\n submit: 'Submit',\n unsupported: 'Unsupported',\n close: 'Close',\n inputPlaceholder: 'Enter value',\n\n // Request tabs\n titleRequestTabs: 'Example Requests',\n requestTabNameDefault: 'Default',\n queryParameters: 'Query Parameters',\n pathParameters: 'Path Parameters',\n headerParameters: 'Header Parameters',\n cookieParameters: 'Cookie Parameters',\n\n // Operation sections\n titleRequestBody: 'Request Body',\n titleResponseBody: 'Response Body',\n titleCallbacks: 'Callbacks',\n\n // Auth scheme\n authBasicTokenExample: 'Basic <token>',\n authBearerTokenExample: 'Bearer <token>',\n openIdConnect: 'OpenID Connect',\n authTokenIn: 'In',\n authScope: 'Scope',\n\n // TypeScript panel\n typeScriptDefinitions: 'TypeScript Definitions',\n useTypeInTypeScript: 'Use the {name} type in TypeScript.',\n\n // Schema info tags\n schemaDefault: 'Default',\n schemaMatch: 'Match',\n schemaFormat: 'Format',\n schemaMultipleOf: 'Multiple Of',\n schemaRange: 'Range',\n schemaLength: 'Length',\n schemaProperties: 'Properties',\n schemaItems: 'Items',\n schemaValueIn: 'Value in',\n schemaExample: 'Example',\n\n // Response tabs\n responseTabName: 'Example {key}',\n responseTabNameDefault: 'Example',\n\n // Playground\n closeJsonEditor: 'Close JSON Editor',\n openJsonEditor: 'Open JSON Editor',\n accessToken: 'Access Token',\n authorize: 'Authorize',\n openIdUnsupported:\n 'OpenID Connect is not supported at the moment, you can still set an access token here.',\n\n // Status info\n statusBadRequest: 'Bad Request',\n statusUnauthorized: 'Unauthorized',\n statusForbidden: 'Forbidden',\n statusNotFound: 'Not Found',\n statusInternalServerError: 'Internal Server Error',\n statusSuccessful: 'Successful',\n statusError: 'Error',\n statusNoDescription: 'No Description',\n\n // OAuth dialog\n obtainAccessToken: 'Obtain the access token for API.',\n resourceOwnerPassword: 'Resource Owner Password Flow',\n resourceOwnerPasswordDesc: 'Authenticate using username and password.',\n clientCredentials: 'Client Credentials',\n clientCredentialsDesc: 'Intended for the server-to-server authentication.',\n authorizationCode: 'Authorization code',\n authorizationCodeDesc: 'Authenticate with 3rd party services',\n implicit: 'Implicit',\n implicitDesc: 'Retrieve the access token directly.',\n deviceAuthorization: 'Device Authorization',\n deviceAuthorizationDesc: 'Authenticate with device.',\n clientId: 'Client ID',\n clientIdHint: 'The client ID of your OAuth application.',\n clientSecret: 'Client Secret',\n clientSecretHint: 'The client secret of your OAuth application.',\n usernameField: 'Username',\n passwordField: 'Password',\n fetchingToken: 'Fetching token...',\n\n // Server select\n serverUrl: 'Server URL',\n serverUrlDescription: 'The base URL of your API endpoint.',\n serverUrlFieldPlaceholder: 'Enter Value',\n\n // Schema UI\n schemaShowArray: 'Array Item',\n schemaHideArray: 'Array Item',\n schemaFilterPropertiesPlaceholder: 'Filter Properties',\n schemaFilterPropertiesEmpty: 'No property matching',\n\n // Inputs (playground)\n playgroundShowProperty: 'Show Property',\n playgroundPropertyPlaceholder: 'Enter Property Name',\n playgroundNewProperty: 'New',\n playgroundNewItem: 'New Item',\n playgroundRemoveItem: 'Remove Item',\n playgroundSelectPlaceholder: 'Select',\n playgroundSelected: 'Selected',\n playgroundInputUpload: 'Upload',\n playgroundInputUnset: 'Unset',\n};\n\nexport type Translations = typeof defaultTranslations;\n\nexport function defineI18nOpenAPI<Languages extends string>(\n config: I18nUIConfig<Languages>,\n translations: Partial<Record<NoInfer<Languages>, Partial<Translations>>>,\n): I18nUIConfig<Languages> {\n const dm = deepmerge();\n return {\n ...config,\n provider(locale = config.defaultLanguage) {\n const out = config.provider(locale);\n const data = translations[locale as Languages];\n if (data) {\n out.translations ??= {};\n out.translations.openapi = dm(defaultTranslations, data) as TranslationsOption;\n }\n return out;\n },\n };\n}\n"],"mappings":";;AAIA,MAAa,sBAAsB;CAEjC,SAAS;CACT,OAAO;CACP,MAAM;CACN,MAAM;CACN,eAAe;CACf,SAAS;CACT,OAAO;CACP,MAAM;CACN,QAAQ;CACR,MAAM;CACN,YAAY;CACZ,QAAQ;CACR,aAAa;CACb,OAAO;CACP,kBAAkB;CAGlB,kBAAkB;CAClB,uBAAuB;CACvB,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;CAGlB,kBAAkB;CAClB,mBAAmB;CACnB,gBAAgB;CAGhB,uBAAuB;CACvB,wBAAwB;CACxB,eAAe;CACf,aAAa;CACb,WAAW;CAGX,uBAAuB;CACvB,qBAAqB;CAGrB,eAAe;CACf,aAAa;CACb,cAAc;CACd,kBAAkB;CAClB,aAAa;CACb,cAAc;CACd,kBAAkB;CAClB,aAAa;CACb,eAAe;CACf,eAAe;CAGf,iBAAiB;CACjB,wBAAwB;CAGxB,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,WAAW;CACX,mBACE;CAGF,kBAAkB;CAClB,oBAAoB;CACpB,iBAAiB;CACjB,gBAAgB;CAChB,2BAA2B;CAC3B,kBAAkB;CAClB,aAAa;CACb,qBAAqB;CAGrB,mBAAmB;CACnB,uBAAuB;CACvB,2BAA2B;CAC3B,mBAAmB;CACnB,uBAAuB;CACvB,mBAAmB;CACnB,uBAAuB;CACvB,UAAU;CACV,cAAc;CACd,qBAAqB;CACrB,yBAAyB;CACzB,UAAU;CACV,cAAc;CACd,cAAc;CACd,kBAAkB;CAClB,eAAe;CACf,eAAe;CACf,eAAe;CAGf,WAAW;CACX,sBAAsB;CACtB,2BAA2B;CAG3B,iBAAiB;CACjB,iBAAiB;CACjB,mCAAmC;CACnC,6BAA6B;CAG7B,wBAAwB;CACxB,+BAA+B;CAC/B,uBAAuB;CACvB,mBAAmB;CACnB,sBAAsB;CACtB,6BAA6B;CAC7B,oBAAoB;CACpB,uBAAuB;CACvB,sBAAsB;CACvB;AAID,SAAgB,kBACd,QACA,cACyB;CACzB,MAAM,KAAK,WAAW;AACtB,QAAO;EACL,GAAG;EACH,SAAS,SAAS,OAAO,iBAAiB;GACxC,MAAM,MAAM,OAAO,SAAS,OAAO;GACnC,MAAM,OAAO,aAAa;AAC1B,OAAI,MAAM;AACR,QAAI,iBAAiB,EAAE;AACvB,QAAI,aAAa,UAAU,GAAG,qBAAqB,KAAK;;AAE1D,UAAO;;EAEV"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","names":[],"sources":["../../src/playground/client.tsx"],"mappings":";;;;;;;;;;;UAwDiB,UAAA,SAAmB,MAAA;EAClC,IAAA,EAAM,MAAA;EACN,KAAA,EAAO,MAAA;EACP,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,MAAA;EACR,IAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,cAAA,UAAwB,WAAA;EACrE,KAAA;EACA,MAAA;EACA,UAAA,GAAa,eAAA;EACb,UAAA,EAAY,aAAA;EACZ,IAAA;IACE,MAAA,EAAQ,YAAA;IACR,SAAA;EAAA;EAbF;;;EAkBA,UAAA,EAAY,MAAA,SAAe,YAAA;EAC3B,QAAA;AAAA;AAAA,UAGe,kBAAA,SAA2B,cAAA;EAC1C,IAAA,EAAM,WAAA;EACN,KAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,IAAA,CAAK,cAAA,QAAsB,WAAA;EACxE,WAAA,6BAAwC,SAAA;EACxC,KAAA,EAAO,SAAA;AAAA;AAAA,UAGQ,uBAAA;EAdY;;;EAkB3B,mBAAA,IAAuB,MAAA,EAAQ,SAAA,OAAgB,SAAA;EAE/C,YAAA,GAAe,qBAAA;EAhCiE;;;;EAsChF,cAAA;EAEA,UAAA;IACE,aAAA,GAAgB,EAAA,CAAG,kBAAA;IACnB,gBAAA,GAAmB,EAAA,CAAG,qBAAA;EAAA;EArCxB;;;;;;;;EAgDA,oBAAA,IAAwB,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,eAAA,KAAoB,SAAA;EAxChE;AAGV;;;;EA4CE,eAAA,IACE,SAAA,UACA,IAAA;IACE,MAAA,EAAQ,YAAA;IACR,SAAA;EAAA,MAEC,SAAA;AAAA;AAAA,iBAGiB,gBAAA,CAAA;EACtB,KAAA;EACA,MAAA;EACA,UAAA;EACA,UAAA;EACA,IAAA;EACA,UAAA;EACA,QAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,qBAAA,GAAqB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cA4OlB,UAAA;AAAA,KACD,SAAA,WAAoB,UAAA;AAAA,UAiHR,SAAA;EACf,SAAA,EAAW,QAAA;EACX,YAAA;EAEA,QAAA,GAAW,aAAA;EACX,QAAA,EAAU,SAAA;EAEV,SAAA,IAAa,MAAA;AAAA;AAAA,iBA8MC,oBAAA,CAAA;EAAuB,IAAA;EAAM,KAAA;EAAA,GAAU;AAAA,GAAQ,kBAAA,GAAkB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAoCjE,uBAAA,CAAA;EAA0B,KAAA;EAAO,QAAA;EAAA,GAAa;AAAA,GAAS,qBAAA,GAAqB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAc/E,MAAA;2BAEE,QAAA,EAAQ,OAAA;IAEjB,YAAA;EAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../src/playground/client.tsx"],"sourcesContent":["'use client';\nimport {\n type FC,\n Fragment,\n type ReactNode,\n useEffect,\n useMemo,\n useState,\n type ComponentProps,\n useRef,\n} from 'react';\nimport { useApiContext, useServerContext } from '@/ui/contexts/api';\nimport type { BrowserFetcherOptions, FetchResult } from '@/playground/fetcher';\nimport type { SecurityEntry } from '@/playground/index';\nimport { getStatusInfo } from './status-info';\nimport { joinURL, resolveRequestData, resolveServerUrl, withBase } from '@/utils/url';\nimport { MethodLabel } from '@/ui/components/method-label';\nimport { useQuery } from '@/utils/use-query';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from 'fumadocs-ui/components/ui/collapsible';\nimport { ChevronDown, LoaderCircle } from 'lucide-react';\nimport { encodeRequestData } from '@/requests/media/encode';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { cn } from '@/utils/cn';\nimport { anyFields, SchemaProvider, SchemaScope, useResolvedSchema } from '@/playground/schema';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\nimport { labelVariants } from '@/ui/components/input';\nimport type { ParsedSchema } from '@/utils/schema';\nimport ServerSelect from './components/server-select';\nimport { useStorageKey } from '@/ui/client/storage-key';\nimport {\n FieldKey,\n Stf,\n StfProvider,\n useDataEngine,\n useFieldValue,\n useListener,\n useStf,\n} from '@fumari/stf';\nimport { objectGet, objectSet, stringifyFieldKey } from '@fumari/stf/lib/utils';\nimport { FieldInput, FieldSet, JsonInput, ObjectInput } from './components/inputs';\nimport type { ParameterObject } from '@/types';\nimport { ClientCodeBlock } from '@/ui/components/codeblock';\nimport { useTranslations } from '@/ui/client/i18n';\nimport { useOperationContext } from '@/ui/operation/client';\nimport { OauthDialog, OauthDialogTrigger } from './components/oauth-dialog';\n\nexport interface FormValues extends Record<string, unknown> {\n path: Record<string, unknown>;\n query: Record<string, unknown>;\n header: Record<string, unknown>;\n cookie: Record<string, unknown>;\n body: unknown;\n}\n\nexport interface PlaygroundClientProps extends ComponentProps<'form'>, SchemaScope {\n route: string;\n method: string;\n parameters?: ParameterObject[];\n securities: SecurityEntry[][];\n body?: {\n schema: ParsedSchema;\n mediaType: string;\n };\n /**\n * Resolver for $ref schemas you've passed\n */\n references: Record<string, ParsedSchema>;\n proxyUrl?: string;\n}\n\nexport interface ResultDisplayProps extends ComponentProps<'div'> {\n data: FetchResult;\n reset: () => void;\n}\n\nexport interface CollapsiblePanelProps extends Omit<ComponentProps<typeof Collapsible>, 'title'> {\n 'data-type': 'authorization' | 'body' | ParamType;\n title: ReactNode;\n}\n\nexport interface PlaygroundClientOptions {\n /**\n * transform fields for auth-specific parameters (e.g. header)\n */\n transformAuthInputs?: (fields: AuthField[]) => AuthField[];\n\n fetchOptions?: BrowserFetcherOptions;\n\n /**\n * Request timeout in seconds (default: 10s)\n * @deprecated use `fetchOptions.requestTimeout` instead.\n */\n requestTimeout?: number;\n\n components?: {\n ResultDisplay?: FC<ResultDisplayProps>;\n CollapsiblePanel?: FC<CollapsiblePanelProps>;\n };\n\n /**\n * render the parameter inputs of API endpoint.\n *\n * for updating values, use:\n * - the `Custom.useController()` from `fumadocs-openapi/playground/client`.\n *\n * Recommended types packages: `json-schema-typed`, `openapi-types`.\n */\n renderParameterField?: (fieldName: FieldKey, param: ParameterObject) => ReactNode;\n\n /**\n * render the input for API endpoint body.\n *\n * @see renderParameterField for customisation tips\n */\n renderBodyField?: (\n fieldName: 'body',\n info: {\n schema: ParsedSchema;\n mediaType: string;\n },\n ) => ReactNode;\n}\n\nexport default function PlaygroundClient({\n route,\n method = 'GET',\n securities,\n parameters = [],\n body,\n references,\n proxyUrl,\n writeOnly,\n readOnly,\n ...rest\n}: PlaygroundClientProps) {\n const t = useTranslations();\n const { example: exampleId, examples, setExampleData } = useOperationContext();\n const { server } = useServerContext();\n const storageKeys = useStorageKey();\n const {\n mediaAdapters,\n client: {\n playground: {\n components: { ResultDisplay = DefaultResultDisplay } = {},\n requestTimeout,\n fetchOptions = { requestTimeout },\n transformAuthInputs,\n } = {},\n },\n } = useApiContext();\n const [securityId, setSecurityId] = useState(() => {\n const idx = securities.findIndex((s) => s.every((entry) => !entry.deprecated));\n return idx === -1 ? 0 : idx;\n });\n const { inputs, mapInputs, initAuthValues } = useAuthInputs(\n securities[securityId],\n transformAuthInputs,\n );\n\n const defaultValues: FormValues = useMemo(() => {\n const requestData = examples.find((example) => example.id === exampleId)?.data;\n\n return {\n path: requestData?.path ?? {},\n query: requestData?.query ?? {},\n header: requestData?.header ?? {},\n body: requestData?.body ?? {},\n cookie: requestData?.cookie ?? {},\n };\n }, [examples, exampleId]);\n\n const stf = useStf({\n // it is fine to modify `defaultValues` in place\n // because we already try to persist the form values via `setExampleData`.\n defaultValues,\n });\n\n const testQuery = useQuery(async (input: FormValues) => {\n const fetcher = await import('./fetcher').then((mod) =>\n mod.createBrowserFetcher(mediaAdapters, { proxyUrl, ...fetchOptions }),\n );\n const encoded = encodeRequestData(\n { ...mapInputs(input), method, bodyMediaType: body?.mediaType },\n mediaAdapters,\n parameters,\n );\n return fetcher.fetch(\n joinURL(\n withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n window.location.origin,\n ),\n resolveRequestData(route, encoded),\n ),\n encoded,\n );\n });\n\n const timerRef = useRef<number | null>(null);\n useListener({\n stf,\n onUpdate() {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(\n () => {\n const values = stf.dataEngine.getData() as FormValues;\n for (const item of inputs) {\n const value = stf.dataEngine.get(item.fieldName);\n\n if (value) {\n localStorage.setItem(storageKeys.AuthField(item), JSON.stringify(value));\n }\n }\n\n const data = {\n ...mapInputs(values),\n method,\n bodyMediaType: body?.mediaType,\n };\n setExampleData(data, encodeRequestData(data, mediaAdapters, parameters));\n },\n timerRef.current ? 400 : 0,\n );\n },\n });\n\n useEffect(() => {\n // same object reference = unchanged\n if (stf.dataEngine.getData() === defaultValues) return;\n\n stf.dataEngine.reset(defaultValues);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- ignore other parts\n }, [defaultValues]);\n\n useEffect(() => {\n return initAuthValues(stf);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- ignore other parts\n }, [defaultValues, inputs]);\n\n return (\n <StfProvider value={stf}>\n <SchemaProvider references={references} writeOnly={writeOnly} readOnly={readOnly}>\n <form\n {...rest}\n className={cn(\n 'not-prose flex flex-col rounded-xl border shadow-md overflow-hidden bg-fd-card text-fd-card-foreground',\n rest.className,\n )}\n onSubmit={(e) => {\n testQuery.start(mapInputs(stf.dataEngine.getData() as FormValues));\n e.preventDefault();\n }}\n >\n <ServerSelect className=\"border-b\" />\n <div className=\"flex flex-row items-center gap-2 text-sm p-3 not-last:pb-0\">\n <MethodLabel>{method}</MethodLabel>\n <Route route={route} className=\"flex-1\" />\n <button\n type=\"submit\"\n className={cn(buttonVariants({ color: 'primary', size: 'sm' }), 'w-14 py-1.5')}\n disabled={testQuery.isLoading}\n >\n {testQuery.isLoading ? <LoaderCircle className=\"size-4 animate-spin\" /> : t.send}\n </button>\n </div>\n {testQuery.data ? <ResultDisplay data={testQuery.data} reset={testQuery.reset} /> : null}\n\n {securities.length > 0 && (\n <SecurityTabs\n securities={securities}\n securityId={securityId}\n setSecurityId={setSecurityId}\n >\n {inputs.map((input) => (\n <Fragment key={stringifyFieldKey(input.fieldName)}>{input.children}</Fragment>\n ))}\n </SecurityTabs>\n )}\n <FormBody body={body} parameters={parameters} />\n </form>\n </SchemaProvider>\n </StfProvider>\n );\n}\n\nfunction SecurityTabsSelectItem({ security }: { security: SecurityEntry[] }) {\n return (\n <div className=\"flex flex-col gap-2 max-w-[600px]\">\n {security.map((item) => (\n <div key={item.id}>\n <p\n className={cn(\n 'font-mono font-medium',\n item.deprecated && 'text-fd-muted-foreground line-through',\n )}\n >\n {item.id}\n </p>\n <p className=\"text-fd-muted-foreground whitespace-pre-wrap\">{item.description}</p>\n </div>\n ))}\n </div>\n );\n}\n\nfunction SecurityTabs({\n securities,\n setSecurityId,\n securityId,\n children,\n}: {\n securities: SecurityEntry[][];\n securityId: number;\n setSecurityId: (value: number) => void;\n children: ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const engine = useDataEngine();\n const t = useTranslations();\n const { CollapsiblePanel = DefaultCollapsiblePanel } =\n useApiContext().client.playground?.components ?? {};\n\n const result = (\n <CollapsiblePanel title={t.authorization} data-type=\"authorization\">\n <Select value={securityId.toString()} onValueChange={(v) => setSecurityId(Number(v))}>\n <SelectTrigger>\n <SelectValue>\n <SecurityTabsSelectItem security={securities[securityId]} />\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {securities.map((security, i) => (\n <SelectItem key={i} value={i.toString()}>\n <SecurityTabsSelectItem security={security} />\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {children}\n </CollapsiblePanel>\n );\n\n for (let i = 0; i < securities.length; i++) {\n const security = securities[i];\n\n for (const item of security) {\n if (item.type === 'oauth2') {\n return (\n <OauthDialog\n scheme={item}\n scopes={item.scopes}\n open={open}\n setOpen={(v) => {\n setOpen(v);\n if (v) {\n setSecurityId(i);\n }\n }}\n setToken={(token) => engine.update(['header', 'Authorization'], token)}\n >\n {result}\n </OauthDialog>\n );\n }\n }\n }\n\n return result;\n}\n\nconst ParamTypes = ['path', 'header', 'cookie', 'query'] as const;\ntype ParamType = (typeof ParamTypes)[number];\n\nfunction FormBodyItem({ type, parameters }: { type: ParamType; parameters: ParameterObject[] }) {\n const { renderParameterField } = useApiContext().client.playground ?? {};\n\n return parameters.map((field) => {\n const fieldName: FieldKey = [type, field.name!];\n if (renderParameterField) {\n return renderParameterField(fieldName, field);\n }\n\n const contentTypes = field.content && Object.keys(field.content);\n const schema =\n field.content && contentTypes && contentTypes.length > 0\n ? field.content[contentTypes[0]].schema\n : field.schema;\n\n return (\n <FieldSet\n key={stringifyFieldKey(fieldName)}\n name={field.name}\n fieldName={fieldName}\n field={(schema ?? anyFields) as ParsedSchema}\n isRequired={field.required}\n />\n );\n });\n}\n\nfunction FormBody({ parameters = [], body }: Pick<PlaygroundClientProps, 'parameters' | 'body'>) {\n const { renderBodyField, components: { CollapsiblePanel = DefaultCollapsiblePanel } = {} } =\n useApiContext().client.playground ?? {};\n const t = useTranslations();\n const displayNames = {\n header: t.header,\n cookie: t.cookies,\n query: t.query,\n path: t.path,\n };\n\n return (\n <>\n {ParamTypes.map((type) => {\n const items = parameters.filter((v) => v.in === type);\n if (items.length === 0) return;\n\n return (\n <CollapsiblePanel key={type} data-type={type} title={displayNames[type]}>\n <FormBodyItem parameters={items} type={type} />\n </CollapsiblePanel>\n );\n })}\n {body && (\n <CollapsiblePanel data-type=\"body\" title={t.body}>\n {renderBodyField ? renderBodyField('body', body) : <BodyInput field={body.schema} />}\n </CollapsiblePanel>\n )}\n </>\n );\n}\n\nfunction BodyInput({ field: _field }: { field: ParsedSchema }) {\n const field = useResolvedSchema(_field);\n const [isJson, setIsJson] = useState(false);\n const t = useTranslations();\n\n if (field.format === 'binary') return <FieldSet field={field} fieldName={['body']} isRequired />;\n\n if (isJson)\n return (\n <>\n <button\n className={cn(\n buttonVariants({\n color: 'secondary',\n size: 'sm',\n className: 'w-fit font-mono p-2',\n }),\n )}\n onClick={() => setIsJson(false)}\n type=\"button\"\n >\n {t.closeJsonEditor}\n </button>\n <JsonInput fieldName={['body']} />\n </>\n );\n\n return (\n <FieldSet\n field={field}\n fieldName={['body']}\n collapsible={false}\n isRequired\n name={\n <button\n type=\"button\"\n className={cn(\n buttonVariants({\n color: 'secondary',\n size: 'sm',\n className: 'p-2',\n }),\n )}\n onClick={() => setIsJson(true)}\n >\n {t.openJsonEditor}\n </button>\n }\n />\n );\n}\n\nexport interface AuthField {\n fieldName: FieldKey;\n defaultValue: unknown;\n\n original?: SecurityEntry;\n children: ReactNode;\n\n mapOutput?: (values: unknown) => unknown;\n}\n\nfunction useAuthInputs(\n securities?: SecurityEntry[],\n transform?: (fields: AuthField[]) => AuthField[],\n) {\n const storageKeys = useStorageKey();\n const t = useTranslations();\n const inputs = useMemo(() => {\n const result: AuthField[] = [];\n if (!securities) return result;\n\n for (const security of securities) {\n if (security.type === 'http' && security.scheme === 'basic') {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n original: security,\n defaultValue: {\n username: '',\n password: '',\n },\n mapOutput(out) {\n if (out && typeof out === 'object') {\n const obj = out as Record<string, unknown>;\n return `Basic ${btoa(`${obj.username ?? ''}:${obj.password ?? ''}`)}`;\n }\n\n return out;\n },\n children: (\n <ObjectInput\n field={{\n type: 'object',\n properties: {\n username: {\n type: 'string',\n },\n password: {\n type: 'string',\n },\n },\n }}\n fieldName={fieldName}\n />\n ),\n });\n } else if (security.type === 'oauth2') {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n original: security,\n defaultValue: 'Bearer ',\n children: (\n <fieldset className=\"flex flex-col gap-2\">\n <label htmlFor={stringifyFieldKey(fieldName)} className={cn(labelVariants())}>\n {t.accessToken}\n </label>\n <div className=\"flex gap-2\">\n <FieldInput\n fieldName={fieldName}\n field={{\n type: 'string',\n }}\n className=\"flex-1\"\n />\n\n <OauthDialogTrigger\n type=\"button\"\n className={cn(\n buttonVariants({\n size: 'sm',\n color: 'secondary',\n }),\n )}\n >\n {t.authorize}\n </OauthDialogTrigger>\n </div>\n </fieldset>\n ),\n });\n } else if (security.type === 'http') {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n original: security,\n defaultValue: 'Bearer ',\n children: (\n <FieldSet\n name={`${t.authorization} (${t.header})`}\n fieldName={fieldName}\n field={{\n type: 'string',\n }}\n />\n ),\n });\n } else if (security.type === 'apiKey') {\n const fieldName: FieldKey = [security.in!, security.name!];\n\n result.push({\n fieldName,\n defaultValue: '',\n original: security,\n children: (\n <FieldSet\n fieldName={fieldName}\n name={`${security.name} (${security.in})`}\n field={{\n type: 'string',\n }}\n />\n ),\n });\n } else {\n const fieldName: FieldKey = ['header', 'Authorization'];\n\n result.push({\n fieldName,\n defaultValue: '',\n original: security,\n children: (\n <>\n <FieldSet\n name={`${t.authorization} (${t.header})`}\n fieldName={fieldName}\n field={{\n type: 'string',\n }}\n />\n <p className=\"text-fd-muted-foreground text-xs\">{t.openIdUnsupported}</p>\n </>\n ),\n });\n }\n }\n\n return transform ? transform(result) : result;\n }, [securities, transform, t]);\n\n const mapInputs = (values: FormValues) => {\n const cloned = structuredClone(values);\n\n for (const item of inputs) {\n if (!item.mapOutput) continue;\n objectSet(cloned, item.fieldName, item.mapOutput(objectGet(cloned, item.fieldName)));\n }\n\n return cloned;\n };\n\n const initAuthValues = (stf: Stf) => {\n const { dataEngine } = stf;\n for (const item of inputs) {\n const stored = localStorage.getItem(storageKeys.AuthField(item));\n\n if (stored) {\n const parsed = JSON.parse(stored);\n if (typeof parsed === typeof item.defaultValue) {\n dataEngine.init(item.fieldName, parsed);\n continue;\n }\n }\n\n dataEngine.init(item.fieldName, item.defaultValue);\n }\n\n // reset\n return () => {\n for (const item of inputs) {\n stf.dataEngine.delete(item.fieldName);\n }\n };\n };\n\n return { inputs, mapInputs, initAuthValues };\n}\n\nfunction Route({ route, ...props }: ComponentProps<'div'> & { route: string }) {\n return (\n <div\n {...props}\n className={cn(\n 'flex flex-row items-center gap-0.5 overflow-auto text-nowrap',\n props.className,\n )}\n >\n {route.split('/').map((part, index) => (\n <Fragment key={index}>\n {index > 0 && <span className=\"text-fd-muted-foreground\">/</span>}\n {part.startsWith('{') && part.endsWith('}') ? (\n <code className=\"bg-fd-primary/10 text-fd-primary\">{part}</code>\n ) : (\n <code className=\"text-fd-foreground\">{part}</code>\n )}\n </Fragment>\n ))}\n </div>\n );\n}\n\nexport function DefaultResultDisplay({ data, reset, ...rest }: ResultDisplayProps) {\n const t = useTranslations();\n const statusInfo = useMemo(() => getStatusInfo(data.status, t), [data.status, t]);\n\n return (\n <div\n {...rest}\n className={cn(\n 'flex flex-col gap-3 mt-2 px-3 py-2 border-y bg-fd-secondary text-fd-secondary-foreground',\n rest.className,\n )}\n >\n <div className=\"flex justify-between items-center\">\n <div className=\"inline-flex items-center gap-1.5 text-sm font-medium\">\n <statusInfo.icon className={cn('size-4', statusInfo.color)} />\n {statusInfo.description}\n </div>\n <button\n type=\"button\"\n className={cn(buttonVariants({ size: 'sm', variant: 'outline' }))}\n onClick={() => reset()}\n >\n {t.close}\n </button>\n </div>\n <p className=\"text-sm text-fd-muted-foreground\">{data.status}</p>\n {data.data !== undefined && (\n <ClientCodeBlock\n lang={typeof data.data === 'string' && data.data.length > 50000 ? 'text' : data.type}\n code={typeof data.data === 'string' ? data.data : JSON.stringify(data.data, null, 2)}\n />\n )}\n </div>\n );\n}\n\nexport function DefaultCollapsiblePanel({ title, children, ...props }: CollapsiblePanelProps) {\n return (\n <Collapsible {...props} className={cn('border-b last:border-b-0', props.className)}>\n <CollapsibleTrigger className=\"group w-full flex items-center gap-2 p-3 text-sm font-medium\">\n {title}\n <ChevronDown className=\"ms-auto size-3.5 text-fd-muted-foreground group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"flex flex-col gap-3 p-3 pt-1\">{children}</div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nexport const Custom = {\n useController(\n fieldName: FieldKey,\n options?: {\n defaultValue?: unknown;\n },\n ) {\n const [value, setValue] = useFieldValue(fieldName, options);\n return {\n value,\n setValue,\n };\n },\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inputs.js","names":[],"sources":["../../../src/playground/components/inputs.tsx"],"sourcesContent":["'use client';\nimport { type ComponentProps, type HTMLAttributes, type ReactNode, useState } from 'react';\nimport { ChevronRight, Plus, Trash2, X } from 'lucide-react';\nimport { FieldKey, useArray, useDataEngine, useFieldValue, useObject } from '@fumari/stf';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\nimport { Input, labelVariants } from '@/ui/components/input';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { FormatFlags } from '@/utils/schema/to-string';\nimport {\n anyFields,\n useFieldInfo,\n useSchemaUtils,\n useSchemaScope,\n useResolvedSchema,\n} from '@/playground/schema';\nimport type { ParsedSchema } from '@/utils/schema';\nimport { stringifyFieldKey } from '@fumari/stf/lib/utils';\nimport { cva } from 'class-variance-authority';\nimport { useTranslations } from '@/ui/client/i18n';\n\nconst fieldLabelVariants = cva('w-full inline-flex items-center gap-0.5');\n\nfunction FieldLabelType(props: ComponentProps<'code'>) {\n return (\n <code {...props} className={cn('text-xs text-fd-muted-foreground', props.className)}>\n {props.children}\n </code>\n );\n}\n\nexport function ObjectInput({\n field: _field,\n fieldName,\n ...props\n}: {\n field: Exclude<ParsedSchema, boolean>;\n fieldName: FieldKey;\n} & ComponentProps<'div'>) {\n const { generateDefault } = useSchemaUtils();\n const field = useResolvedSchema(_field);\n const schemaPropKeys = field.properties ? Object.keys(field.properties) : [];\n const {\n patternProperties = {},\n additionalProperties,\n 'x-playground-lazy': isLazy = schemaPropKeys.length > 100,\n } = field;\n const isDynamic = Object.keys(patternProperties).length > 0 || additionalProperties;\n\n const [nextName, setNextName] = useState('');\n const { properties, onAppend, onDelete, _objectKeys } = useObject(fieldName, {\n lazy: isLazy,\n defaultValue: () => generateDefault(field) as object,\n properties: field.properties ?? {},\n fallback: additionalProperties,\n patternProperties: patternProperties,\n });\n\n const hiddenProperties = isLazy ? schemaPropKeys.filter((key) => !_objectKeys.includes(key)) : [];\n const t = useTranslations();\n\n return (\n <div\n {...props}\n className={cn(\n 'grid grid-cols-1 gap-4 @md:grid-cols-2 *:data-[collapsible=true]:order-last',\n props.className,\n )}\n >\n {isLazy && hiddenProperties.length > 0 && (\n <Select value=\"\" onValueChange={onAppend}>\n <SelectTrigger className=\"col-span-full\">\n <SelectValue placeholder={t.playgroundShowProperty} />\n </SelectTrigger>\n <SelectContent>\n {hiddenProperties.map((key) => (\n <SelectItem key={key} value={key}>\n {key}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n\n {properties.map((child) => {\n let toolbar: ReactNode = null;\n if (child.kind === 'pattern' || child.kind === 'fallback') {\n toolbar = (\n <button\n type=\"button\"\n aria-label={t.playgroundRemoveItem}\n className={cn(\n buttonVariants({\n color: 'outline',\n size: 'icon-xs',\n }),\n )}\n onClick={() => {\n onDelete(child.key);\n }}\n >\n <Trash2 />\n </button>\n );\n }\n\n return (\n <FieldSet\n key={child.key}\n name={child.key}\n field={child.info}\n fieldName={child.field}\n isRequired={field.required?.includes(child.key)}\n toolbar={toolbar}\n />\n );\n })}\n {isDynamic && (\n <div className=\"flex gap-2 order-last col-span-full\">\n <Input\n value={nextName}\n placeholder={t.playgroundPropertyPlaceholder}\n onChange={(e) => setNextName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n setNextName('');\n onAppend(nextName);\n e.preventDefault();\n }\n }}\n />\n <button\n type=\"button\"\n className={cn(buttonVariants({ color: 'secondary', size: 'sm' }), 'px-4')}\n onClick={() => {\n onAppend(nextName);\n setNextName('');\n }}\n >\n {t.playgroundNewProperty}\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport function JsonInput({ fieldName }: { fieldName: FieldKey }) {\n const engine = useDataEngine();\n const [error, setError] = useState<string | null>(null);\n const [value, setValue] = useState(() => JSON.stringify(engine.init(fieldName, {}), null, 2));\n\n return (\n <div className=\"flex flex-col bg-fd-secondary text-fd-secondary-foreground overflow-hidden border rounded-lg\">\n <textarea\n value={value}\n className=\"p-2 h-[240px] text-sm font-mono resize-none focus-visible:outline-none\"\n onChange={(v) => {\n setValue(v.target.value);\n try {\n engine.update(fieldName, JSON.parse(v.target.value));\n setError(null);\n } catch (e) {\n if (e instanceof Error) setError(e.message);\n }\n }}\n />\n <p className=\"p-2 text-xs font-mono border-t text-red-400 empty:hidden\">{error}</p>\n </div>\n );\n}\n\nexport function FieldInput({\n field,\n fieldName,\n isRequired,\n ...props\n}: HTMLAttributes<HTMLElement> & {\n field: Exclude<ParsedSchema, boolean>;\n isRequired?: boolean;\n fieldName: FieldKey;\n}) {\n const [value, setValue] = useFieldValue(fieldName);\n const id = stringifyFieldKey(fieldName);\n const t = useTranslations();\n if (field.type === 'null') return;\n\n if (field.type === 'string' && field.format === 'binary') {\n return (\n <>\n <label\n htmlFor={id}\n className={cn(\n buttonVariants({\n color: 'secondary',\n className: 'w-full h-9 gap-2 truncate',\n }),\n )}\n >\n {value instanceof File ? (\n <>\n <span className=\"text-fd-muted-foreground text-xs\">{t.playgroundSelected}</span>\n <span className=\"truncate w-0 flex-1 text-end\">{value.name}</span>\n </>\n ) : (\n <span className=\"text-fd-muted-foreground\">{t.playgroundInputUpload}</span>\n )}\n </label>\n <input\n id={id}\n type=\"file\"\n multiple={false}\n onChange={(e) => {\n if (!e.target.files || e.target.files.length === 0) return;\n setValue(e.target.files.item(0));\n }}\n hidden\n />\n </>\n );\n }\n\n if (field.enum && field.enum.length > 0) {\n const idx = field.enum.indexOf(value);\n\n return (\n <Select\n value={idx === -1 && isRequired ? '' : String(idx)}\n onValueChange={(v) => setValue(field.enum![Number(v)])}\n >\n <SelectTrigger id={id} {...props}>\n <SelectValue placeholder={t.playgroundSelectPlaceholder} />\n </SelectTrigger>\n <SelectContent>\n {field.enum.map((item, i) => (\n <SelectItem key={i} value={String(i)}>\n {typeof item === 'string' ? item : JSON.stringify(item, null, 2)}\n </SelectItem>\n ))}\n {!isRequired && <SelectItem value=\"-1\">{t.playgroundInputUnset}</SelectItem>}\n </SelectContent>\n </Select>\n );\n }\n\n if (field.type === 'boolean') {\n return (\n <Select\n value={String(value)}\n onValueChange={(value) => setValue(value === 'undefined' ? undefined : value === 'true')}\n >\n <SelectTrigger id={id} {...props}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"true\">True</SelectItem>\n <SelectItem value=\"false\">False</SelectItem>\n {!isRequired && <SelectItem value=\"undefined\">{t.playgroundInputUnset}</SelectItem>}\n </SelectContent>\n </Select>\n );\n }\n\n const isNumber = field.type === 'integer' || field.type === 'number';\n return (\n <Input\n id={id}\n placeholder={t.inputPlaceholder}\n type={isNumber ? 'number' : 'text'}\n step={field.type === 'integer' ? 1 : undefined}\n value={String(value ?? '')}\n onChange={(e) => {\n if (isNumber) {\n setValue(Number.isNaN(e.target.valueAsNumber) ? undefined : e.target.valueAsNumber);\n } else if (!isNumber) {\n setValue(e.target.value);\n }\n }}\n />\n );\n}\n\nexport function FieldSet({\n field: _field,\n fieldName,\n toolbar,\n name,\n isRequired,\n depth = 0,\n slotType,\n collapsible = true,\n ...props\n}: HTMLAttributes<HTMLElement> & {\n isRequired?: boolean;\n name?: ReactNode;\n field: ParsedSchema;\n fieldName: FieldKey;\n depth?: number;\n\n slotType?: ReactNode;\n toolbar?: ReactNode;\n collapsible?: boolean;\n}) {\n const { readOnly, writeOnly } = useSchemaScope();\n const { generateDefault, schemaToString } = useSchemaUtils();\n const field = useResolvedSchema(_field);\n const [show, setShow] = useState(!collapsible);\n const { info, updateInfo } = useFieldInfo(fieldName, field, depth);\n const id = stringifyFieldKey(fieldName);\n const dataEngine = useDataEngine();\n const [isDefined] = useFieldValue(fieldName, {\n compute(currentValue) {\n return currentValue !== undefined;\n },\n });\n\n if (_field === false) return;\n if (field.readOnly && !readOnly) return;\n if (field.writeOnly && !writeOnly) return;\n\n if (collapsible && !isDefined && show) setShow(false);\n\n function renderLabelTrigger(schema = field) {\n if (!collapsible) return renderLabelName();\n\n return (\n <button\n type=\"button\"\n className={cn(labelVariants(), 'inline-flex items-center gap-1 font-mono me-auto')}\n onClick={() => {\n dataEngine.init(fieldName, generateDefault(schema));\n setShow((prev) => !prev);\n }}\n >\n <ChevronRight className={cn('size-3.5 text-fd-muted-foreground', show && 'rotate-90')} />\n {name}\n {isRequired && <span className=\"text-red-400/80\">*</span>}\n </button>\n );\n }\n\n function renderLabelName() {\n return (\n <span className={cn(labelVariants(), 'font-mono me-auto')}>\n {name}\n {isRequired && <span className=\"text-red-400/80 mx-1\">*</span>}\n </span>\n );\n }\n\n function renderUnsetButton() {\n return (\n <button\n type=\"button\"\n onClick={() => dataEngine.delete(fieldName)}\n className=\"text-fd-muted-foreground hover:text-fd-accent-foreground\"\n >\n <X className=\"size-3.5\" />\n </button>\n );\n }\n\n if (info.unionField && field[info.unionField] && field[info.unionField]!.length > 0) {\n const union = field[info.unionField]!;\n const showSelect = union.length > 1;\n\n return (\n <FieldSet\n {...props}\n name={name}\n fieldName={fieldName}\n isRequired={isRequired}\n field={union[info.oneOf]}\n depth={depth + 1}\n slotType={showSelect ? false : slotType}\n collapsible={collapsible}\n toolbar={\n <>\n {showSelect && (\n <select\n className=\"text-xs font-mono\"\n value={info.oneOf}\n onChange={(e) => {\n updateInfo({\n oneOf: Number(e.target.value),\n });\n }}\n >\n {union.map((item, i) => (\n <option key={i} value={i} className=\"bg-fd-popover text-fd-popover-foreground\">\n {schemaToString(item, FormatFlags.UseAlias)}\n </option>\n ))}\n </select>\n )}\n {toolbar}\n </>\n }\n />\n );\n }\n\n if (Array.isArray(field.type)) {\n const showSelect = field.type.length > 1;\n\n return (\n <FieldSet\n {...props}\n name={name}\n fieldName={fieldName}\n isRequired={isRequired}\n field={{\n ...field,\n type: info.selectedType,\n }}\n collapsible={collapsible}\n depth={depth + 1}\n slotType={showSelect ? false : slotType}\n toolbar={\n <>\n {showSelect && (\n <select\n className=\"text-xs font-mono\"\n value={info.selectedType}\n onChange={(e) => {\n updateInfo({\n selectedType: e.target.value,\n });\n }}\n >\n {field.type.map((item) => (\n <option\n key={item}\n value={item}\n className=\"bg-fd-popover text-fd-popover-foreground\"\n >\n {item}\n </option>\n ))}\n </select>\n )}\n {toolbar}\n </>\n }\n />\n );\n }\n\n if (field.type === 'object') {\n return (\n <fieldset\n {...props}\n data-collapsible={collapsible}\n className={cn('flex flex-col gap-1.5 col-span-full @container', props.className)}\n >\n <div className={fieldLabelVariants()}>\n {renderLabelTrigger(field)}\n {slotType ?? <FieldLabelType>{schemaToString(field)}</FieldLabelType>}\n {toolbar}\n {!isRequired && isDefined && renderUnsetButton()}\n </div>\n {show && (\n <ObjectInput\n field={field}\n fieldName={fieldName}\n className=\"rounded-lg border border-fd-primary/20 bg-fd-background/50 p-2 shadow-sm\"\n />\n )}\n </fieldset>\n );\n }\n\n if (field.type === 'array') {\n return (\n <fieldset\n {...props}\n data-collapsible={collapsible}\n className={cn('flex flex-col gap-1.5 col-span-full', props.className)}\n >\n <div className={fieldLabelVariants()}>\n {renderLabelTrigger()}\n {slotType ?? <FieldLabelType>{schemaToString(field)}</FieldLabelType>}\n {toolbar}\n {!isRequired && isDefined && renderUnsetButton()}\n </div>\n {show && (\n <ArrayInput\n fieldName={fieldName}\n items={field.items ?? anyFields}\n className=\"rounded-lg border border-fd-primary/20 bg-fd-background/50 p-2 shadow-sm\"\n />\n )}\n </fieldset>\n );\n }\n\n return (\n <fieldset {...props} className={cn('flex flex-col gap-1.5', props.className)}>\n <label className={fieldLabelVariants()} htmlFor={id}>\n {renderLabelName()}\n {slotType ?? <FieldLabelType>{schemaToString(field)}</FieldLabelType>}\n {toolbar}\n {!isRequired && isDefined && renderUnsetButton()}\n </label>\n <FieldInput field={field} fieldName={fieldName} isRequired={isRequired} />\n </fieldset>\n );\n}\n\nfunction ArrayInput({\n fieldName,\n items: itemSchema,\n ...props\n}: {\n fieldName: FieldKey;\n items: ParsedSchema;\n} & ComponentProps<'div'>) {\n const name = fieldName.at(-1) ?? '';\n const { generateDefault } = useSchemaUtils();\n const { items, insertItem, removeItem } = useArray(fieldName);\n const t = useTranslations();\n\n return (\n <div {...props} className={cn('flex flex-col gap-2', props.className)}>\n {items.map((item) => (\n <FieldSet\n key={item.index}\n name={\n <span className=\"text-fd-muted-foreground\">\n {name}[{item.index}]\n </span>\n }\n field={itemSchema}\n isRequired\n fieldName={item.field}\n toolbar={\n <button\n type=\"button\"\n aria-label={t.playgroundRemoveItem}\n className={cn(\n buttonVariants({\n color: 'outline',\n size: 'icon-xs',\n }),\n )}\n onClick={() => removeItem(item.index)}\n >\n <Trash2 />\n </button>\n }\n />\n ))}\n <button\n type=\"button\"\n className={cn(\n buttonVariants({\n color: 'secondary',\n className: 'gap-1.5 py-2',\n size: 'sm',\n }),\n )}\n onClick={() => {\n insertItem(generateDefault(itemSchema));\n }}\n >\n <Plus className=\"size-4\" />\n {t.playgroundNewItem}\n </button>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-dialog.js","names":[],"sources":["../../../src/playground/components/oauth-dialog.tsx"],"sourcesContent":["import {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@/ui/components/dialog';\nimport { useForm } from 'react-hook-form';\nimport { Input, labelVariants } from '@/ui/components/input';\nimport { useQuery } from '@/utils/use-query';\nimport { type ReactNode, useEffect, useMemo, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\nimport type { OAuth2SecurityScheme } from '@/types';\nimport { useTranslations } from '@/ui/client/i18n';\n\ntype FlowType = keyof NonNullable<OAuth2SecurityScheme['flows']>;\n\nexport interface AuthDialogProps {\n scheme: OAuth2SecurityScheme;\n scopes: string[];\n\n open: boolean;\n setOpen: (v: boolean) => void;\n setToken: (token: string) => void;\n children: ReactNode;\n}\n\ninterface FormValues {\n clientId: string;\n clientSecret: string;\n username: string;\n password: string;\n}\n\ninterface AuthCodeState {\n redirect_uri: string;\n client_id: string;\n client_secret: string;\n}\n\ninterface ImplicitState {\n redirect_uri: string;\n client_id: string;\n}\n\ninterface FlowInfo {\n name: ReactNode;\n description: ReactNode;\n supported: boolean;\n}\n\nexport function OauthDialog({\n scheme,\n scopes,\n setToken,\n children,\n open,\n setOpen,\n}: AuthDialogProps) {\n const [type, setType] = useState(() => {\n return Object.keys(scheme.flows!)[0] as FlowType;\n });\n const t = useTranslations();\n const allFlows: Record<FlowType, FlowInfo> = useMemo(\n () => ({\n password: {\n name: t.resourceOwnerPassword,\n description: t.resourceOwnerPasswordDesc,\n supported: true,\n },\n clientCredentials: {\n name: t.clientCredentials,\n description: t.clientCredentialsDesc,\n supported: true,\n },\n authorizationCode: {\n name: t.authorizationCode,\n description: t.authorizationCodeDesc,\n supported: true,\n },\n implicit: {\n name: t.implicit,\n description: t.implicitDesc,\n supported: true,\n },\n deviceAuthorization: {\n name: t.deviceAuthorization,\n description: t.deviceAuthorizationDesc,\n supported: false,\n },\n }),\n [t],\n );\n\n const form = useForm<FormValues>({\n defaultValues: {\n clientId: '',\n clientSecret: '',\n username: '',\n password: '',\n },\n });\n\n const authCodeCallback = useQuery(async (code: string, state: AuthCodeState) => {\n const value = scheme.flows!.authorizationCode!;\n\n const res = await fetch(value.tokenUrl!, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n // note: `state` could be invalid, but server will check it\n redirect_uri: state.redirect_uri,\n client_id: state.client_id,\n client_secret: state.client_secret,\n }),\n });\n\n if (!res.ok) throw new Error(await res.text());\n const { access_token, token_type = 'Bearer' } = (await res.json()) as {\n access_token: string;\n token_type?: string;\n };\n\n setToken(`${token_type} ${access_token}`);\n setOpen(false);\n });\n\n useEffect(() => {\n if (scheme.flows!.authorizationCode) {\n const params = new URLSearchParams(window.location.search);\n const state = params.get('state');\n const code = params.get('code');\n\n if (state && code) {\n const parsedState = JSON.parse(state) as AuthCodeState;\n setOpen(true);\n\n form.setValue('clientId', parsedState.client_id);\n form.setValue('clientSecret', parsedState.client_secret);\n authCodeCallback.start(code, parsedState);\n window.history.replaceState(null, '', window.location.pathname);\n return;\n }\n }\n\n if (scheme.flows!.implicit && window.location.hash.length > 1) {\n const params = new URLSearchParams(window.location.hash.slice(1));\n const state = params.get('state');\n const token = params.get('access_token');\n const type = params.get('token_type') ?? 'Bearer';\n\n if (state && token) {\n const parsedState = JSON.parse(state) as ImplicitState;\n\n form.setValue('clientId', parsedState.client_id);\n setToken(`${type} ${token}`);\n window.history.replaceState(null, '', window.location.pathname);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- first page load only\n }, []);\n\n const authorize = useQuery(async (values: FormValues) => {\n if (type === 'implicit') {\n const value = scheme.flows![type]!;\n\n const params = new URLSearchParams();\n params.set('response_type', 'token');\n params.set('client_id', values.clientId);\n params.set('redirect_uri', window.location.href);\n params.set('scope', scopes.join('+'));\n params.set(\n 'state',\n JSON.stringify({\n client_id: values.clientId,\n redirect_uri: window.location.href,\n } satisfies ImplicitState),\n );\n\n window.location.replace(`${value.authorizationUrl}?${params.toString()}`);\n return;\n }\n if (type === 'authorizationCode') {\n const value = scheme.flows![type]!;\n\n const params = new URLSearchParams();\n params.set('response_type', 'code');\n params.set('client_id', values.clientId);\n params.set('redirect_uri', window.location.href);\n params.set('scope', scopes.join('+'));\n params.set(\n 'state',\n JSON.stringify({\n client_id: values.clientId,\n client_secret: values.clientSecret,\n redirect_uri: window.location.href,\n } satisfies AuthCodeState),\n );\n\n window.location.replace(`${value.authorizationUrl}?${params.toString()}`);\n return;\n }\n\n let res;\n if (type === 'password') {\n const value = scheme.flows![type]!;\n\n res = await fetch(value.tokenUrl!, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'password',\n username: values.username,\n password: values.password,\n scope: scopes.join('+'),\n }),\n });\n }\n\n if (type === 'clientCredentials') {\n const value = scheme.flows![type]!;\n\n res = await fetch(value.tokenUrl!, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: values.clientId,\n client_secret: values.clientSecret,\n scope: scopes.join('+'),\n }),\n });\n }\n\n if (res) {\n if (!res.ok) throw new Error(await res.text());\n\n const { access_token, token_type = 'Bearer' } = (await res.json()) as {\n access_token: string;\n token_type?: string;\n };\n\n setToken(`${token_type} ${access_token}`);\n setOpen(false);\n }\n });\n\n const onSubmit = form.handleSubmit((values) => {\n return authorize.start(values);\n });\n\n const isLoading = authorize.isLoading || authCodeCallback.isLoading;\n const error = authCodeCallback.error ?? authorize.error;\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n {children}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{t.authorization}</DialogTitle>\n <DialogDescription>{t.obtainAccessToken}</DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-6\"\n onSubmit={(e) => {\n void onSubmit(e);\n e.stopPropagation();\n }}\n >\n <Select value={type} onValueChange={setType as (s: string) => void}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {Object.keys(scheme.flows!).map((key) => {\n const { name, description } = allFlows[key as FlowType];\n\n return (\n <SelectItem key={key} value={key}>\n <p className=\"font-medium\">{name}</p>\n <p className=\"text-fd-muted-foreground\">{description}</p>\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n\n {(type === 'authorizationCode' ||\n type === 'clientCredentials' ||\n type === 'implicit') && (\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"client_id\" className={cn(labelVariants())}>\n {t.clientId}\n </label>\n <p className=\"text-fd-muted-foreground text-sm\">{t.clientIdHint}</p>\n <Input\n id=\"client_id\"\n placeholder={t.inputPlaceholder}\n type=\"text\"\n autoComplete=\"off\"\n disabled={isLoading}\n {...form.register('clientId', { required: true })}\n />\n </fieldset>\n )}\n {(type === 'authorizationCode' || type === 'clientCredentials') && (\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"client_secret\" className={cn(labelVariants())}>\n {t.clientSecret}\n </label>\n <p className=\"text-fd-muted-foreground text-sm\">{t.clientSecretHint}</p>\n <Input\n id=\"client_secret\"\n placeholder={t.inputPlaceholder}\n type=\"password\"\n autoComplete=\"off\"\n disabled={isLoading}\n {...form.register('clientSecret', { required: true })}\n />\n </fieldset>\n )}\n {type === 'password' && (\n <>\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"username\" className={cn(labelVariants())}>\n {t.usernameField}\n </label>\n <Input\n id=\"username\"\n placeholder={t.inputPlaceholder}\n type=\"text\"\n disabled={isLoading}\n autoComplete=\"off\"\n {...form.register('username', { required: true })}\n />\n </fieldset>\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"password\" className={cn(labelVariants())}>\n {t.clientSecret}\n </label>\n <Input\n id=\"password\"\n placeholder={t.inputPlaceholder}\n type=\"password\"\n autoComplete=\"off\"\n disabled={isLoading}\n {...form.register('password', { required: true })}\n />\n </fieldset>\n </>\n )}\n {allFlows[type].supported ? (\n <>\n {error ? <p className=\"text-red-400 font-medium text-sm\">{String(error)}</p> : null}\n <button\n type=\"submit\"\n disabled={isLoading}\n className={cn(\n buttonVariants({\n color: 'primary',\n }),\n )}\n >\n {authCodeCallback.isLoading ? t.fetchingToken : t.submit}\n </button>\n </>\n ) : (\n <p className=\"text-fd-muted-foreground bg-fd-muted p-2 rounded-lg border\">\n {t.unsupported}\n </p>\n )}\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport const OauthDialogTrigger = DialogTrigger;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-select.js","names":[],"sources":["../../../src/playground/components/server-select.tsx"],"sourcesContent":["'use client';\nimport { useServerContext } from '@/ui/contexts/api';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\nimport { Input, labelVariants } from '@/ui/components/input';\nimport { useEffect, useState, useRef, type ComponentProps } from 'react';\nimport { cn } from '@/utils/cn';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@/ui/components/dialog';\nimport { resolveServerUrl, withBase } from '@/utils/url';\nimport type { ServerVariableObject } from '@/types';\nimport type { NoReference } from '@/utils/schema';\nimport { StfProvider, useFieldValue, useListener, useStf } from '@fumari/stf';\nimport { EditIcon } from 'lucide-react';\nimport { useTranslations } from '@/ui/client/i18n';\n\nexport default function ServerSelect(props: ComponentProps<typeof DialogTrigger>) {\n const { servers, server, setServer, setServerVariables } = useServerContext();\n const [open, setOpen] = useState(false);\n const [isMounted, setIsMounted] = useState(false);\n const t = useTranslations();\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n if (!servers || servers.length <= 0) return;\n const serverSchema = server ? servers.find((obj) => obj.url === server.url) : null;\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger\n {...props}\n className={cn(\n 'flex items-center gap-2 text-sm text-start px-3 py-2 bg-fd-muted text-fd-muted-foreground transition-colors hover:bg-fd-accent hover:text-fd-accent-foreground',\n props.className,\n )}\n >\n <span className=\"px-2 py-0.5 -ms-2 font-medium rounded-lg border bg-fd-secondary text-fd-secondary-foreground shadow-sm\">\n {server?.name ?? t.serverUrl}\n </span>\n <code className=\"truncate min-w-0 flex-1\">\n {isMounted\n ? withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n window.location.origin,\n )\n : t.loading}\n </code>\n <EditIcon className=\"size-4\" />\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{t.serverUrl}</DialogTitle>\n <DialogDescription>{t.serverUrlDescription}</DialogDescription>\n </DialogHeader>\n <Select value={server?.url} onValueChange={setServer}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {servers.map((item) => (\n <SelectItem key={item.url} value={item.url!}>\n <code className=\"text-[0.8125rem]\">{item.url}</code>\n <p className=\"text-fd-muted-foreground\">{item.description}</p>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {server?.variables && serverSchema?.variables && (\n <ServerSelectContent\n key={server.url}\n defaultValues={server.variables}\n schema={serverSchema.variables}\n onChange={setServerVariables}\n />\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ServerSelectContent({\n defaultValues,\n onChange,\n schema,\n}: {\n defaultValues: Record<string, string>;\n onChange: (values: Record<string, string>) => void;\n schema: Record<string, NoReference<ServerVariableObject>>;\n}) {\n const stf = useStf({\n defaultValues: () => structuredClone(defaultValues),\n });\n const timerRef = useRef<number | null>(null);\n useListener({\n stf,\n onUpdate() {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current);\n\n timerRef.current = window.setTimeout(\n () => onChange(stf.dataEngine.getData() as Record<string, string>),\n 500,\n );\n },\n });\n\n return (\n <StfProvider value={stf}>\n <div className=\"flex flex-col gap-4\">\n {Object.entries(schema).map(([key, variable]) => {\n return (\n <fieldset key={key} className=\"flex flex-col gap-1\">\n <label className={cn(labelVariants())} htmlFor={key}>\n {key}\n </label>\n <p className=\"text-xs text-fd-muted-foreground empty:hidden\">\n {variable.description}\n </p>\n <Field fieldName={key} variable={variable} />\n </fieldset>\n );\n })}\n </div>\n </StfProvider>\n );\n}\n\nfunction Field({\n fieldName,\n variable,\n}: {\n variable: NoReference<ServerVariableObject>;\n fieldName: string;\n}) {\n const t = useTranslations();\n const [value, setValue] = useFieldValue([fieldName], {\n compute(currentValue) {\n return typeof currentValue === 'string' ? currentValue : undefined;\n },\n });\n\n if (variable.enum) {\n return (\n <Select value={value} onValueChange={setValue}>\n <SelectTrigger id={fieldName}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {variable.enum.map((value) => (\n <SelectItem key={value} value={String(value)}>\n {value}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n return (\n <Input\n id={fieldName}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={t.serverUrlFieldPlaceholder}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.d.ts","names":[],"sources":["../../src/playground/fetcher.ts"],"mappings":";;;UAKiB,WAAA;EACf,MAAA;EACA,IAAA;EACA,IAAA;AAAA;AAAA,UAYe,qBAAA;EAiByC;;;EAbxD,cAAA;EAEA,QAAA;EAAA;;;;;EAMA,kBAAA;EAKwD;;;EAAxD,aAAA,IAAiB,WAAA,EAAa,WAAA,KAAgB,SAAA,CAAU,WAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.js","names":[],"sources":["../../src/playground/fetcher.ts"],"sourcesContent":["import type { RequestData } from '@/requests/types';\nimport type { MediaAdapter } from '@/requests/media/adapter';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\nimport type { Awaitable } from '@/types';\n\nexport interface FetchResult {\n status: number;\n type: 'json' | 'html' | 'text';\n data: unknown;\n}\n\nexport interface Fetcher {\n /**\n * This method will not apply the path & search parameters from `options` to given `url`.\n *\n * @param url - The full URL of request.\n */\n fetch: (url: string, data: RequestData) => Promise<FetchResult>;\n}\n\nexport interface BrowserFetcherOptions {\n /**\n * Request timeout in seconds (default: 10s)\n */\n requestTimeout?: number | false;\n\n proxyUrl?: string;\n /**\n * Forward cookies via search parameters when API proxy is configured.\n *\n * @default true\n */\n proxyForwardCookie?: boolean;\n\n /**\n * transform the request options before sending.\n */\n onRequestInit?: (requestInit: RequestInit) => Awaitable<RequestInit>;\n}\n\nexport function createBrowserFetcher(\n adapters: Record<string, MediaAdapter>,\n {\n proxyUrl,\n proxyForwardCookie = true,\n requestTimeout = 10,\n onRequestInit,\n }: BrowserFetcherOptions = {},\n): Fetcher {\n return {\n async fetch(url, data) {\n let requestUrl = new URL(url, document.baseURI);\n let requestInit: RequestInit = {\n method: data.method,\n cache: 'no-cache',\n signal:\n typeof requestTimeout === 'number'\n ? AbortSignal.timeout(requestTimeout * 1000)\n : undefined,\n };\n\n const headers = (requestInit.headers = new Headers());\n\n for (const key in data.header) {\n const param = data.header[key];\n headers.append(key, param.value);\n }\n\n if (proxyUrl) {\n requestUrl = new URL(proxyUrl, document.baseURI);\n requestUrl.searchParams.append('url', url);\n }\n\n if (data.bodyMediaType && data.body) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, adapters);\n if (!adapter)\n return {\n status: 400,\n type: 'text',\n data: `[Fumadocs] No adapter for ${data.bodyMediaType}, you need to specify one from 'createOpenAPI()'.`,\n };\n\n if (data.bodyMediaType !== 'multipart/form-data') {\n headers.append('Content-Type', data.bodyMediaType);\n }\n\n requestInit.body = adapter.encode(data as { body: unknown });\n }\n\n // cookies\n if (proxyUrl && proxyForwardCookie) {\n const encoded = Object.entries(data.cookie)\n .map(([k, v]) => `${k}=${encodeURIComponent(v.value)}`)\n .join('; ');\n requestUrl.searchParams.set('cookie', encoded);\n requestInit.credentials = 'omit';\n } else {\n for (const key in data.cookie) {\n const param = data.cookie[key];\n const segs: string[] = [`${key}=${encodeURIComponent(param.value)}`];\n\n if (proxyUrl && requestUrl.origin !== window.location.origin)\n segs.push(`domain=${requestUrl.host}`);\n segs.push('path=/', 'max-age=30');\n\n document.cookie = segs.join('; ');\n }\n }\n\n if (onRequestInit) requestInit = await onRequestInit(requestInit);\n\n return fetch(requestUrl, requestInit)\n .then(async (res) => {\n const contentType = res.headers.get('Content-Type') ?? '';\n let type: FetchResult['type'];\n let data: unknown;\n\n if (contentType.startsWith('application/json')) {\n type = 'json';\n data = await res.json();\n } else {\n type = contentType.startsWith('text/html') ? 'html' : 'text';\n data = await res.text();\n }\n\n return { status: res.status, type, data };\n })\n .catch((e) => {\n const message = e instanceof Error ? `[${e.name}] ${e.message}` : e.toString();\n\n return {\n status: 400,\n type: 'text',\n data: `Client side error: ${message}`,\n };\n });\n },\n };\n}\n"],"mappings":";;;AAwCA,SAAgB,qBACd,UACA,EACE,UACA,qBAAqB,MACrB,iBAAiB,IACjB,kBACyB,EAAE,EACpB;AACT,QAAO,EACL,MAAM,MAAM,KAAK,MAAM;EACrB,IAAI,aAAa,IAAI,IAAI,KAAK,SAAS,QAAQ;EAC/C,IAAI,cAA2B;GAC7B,QAAQ,KAAK;GACb,OAAO;GACP,QACE,OAAO,mBAAmB,WACtB,YAAY,QAAQ,iBAAiB,IAAK,GAC1C,KAAA;GACP;EAED,MAAM,UAAW,YAAY,UAAU,IAAI,SAAS;AAEpD,OAAK,MAAM,OAAO,KAAK,QAAQ;GAC7B,MAAM,QAAQ,KAAK,OAAO;AAC1B,WAAQ,OAAO,KAAK,MAAM,MAAM;;AAGlC,MAAI,UAAU;AACZ,gBAAa,IAAI,IAAI,UAAU,SAAS,QAAQ;AAChD,cAAW,aAAa,OAAO,OAAO,IAAI;;AAG5C,MAAI,KAAK,iBAAiB,KAAK,MAAM;GACnC,MAAM,UAAU,oBAAoB,KAAK,eAAe,SAAS;AACjE,OAAI,CAAC,QACH,QAAO;IACL,QAAQ;IACR,MAAM;IACN,MAAM,6BAA6B,KAAK,cAAc;IACvD;AAEH,OAAI,KAAK,kBAAkB,sBACzB,SAAQ,OAAO,gBAAgB,KAAK,cAAc;AAGpD,eAAY,OAAO,QAAQ,OAAO,KAA0B;;AAI9D,MAAI,YAAY,oBAAoB;GAClC,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO,CACxC,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,mBAAmB,EAAE,MAAM,GAAG,CACtD,KAAK,KAAK;AACb,cAAW,aAAa,IAAI,UAAU,QAAQ;AAC9C,eAAY,cAAc;QAE1B,MAAK,MAAM,OAAO,KAAK,QAAQ;GAC7B,MAAM,QAAQ,KAAK,OAAO;GAC1B,MAAM,OAAiB,CAAC,GAAG,IAAI,GAAG,mBAAmB,MAAM,MAAM,GAAG;AAEpE,OAAI,YAAY,WAAW,WAAW,OAAO,SAAS,OACpD,MAAK,KAAK,UAAU,WAAW,OAAO;AACxC,QAAK,KAAK,UAAU,aAAa;AAEjC,YAAS,SAAS,KAAK,KAAK,KAAK;;AAIrC,MAAI,cAAe,eAAc,MAAM,cAAc,YAAY;AAEjE,SAAO,MAAM,YAAY,YAAY,CAClC,KAAK,OAAO,QAAQ;GACnB,MAAM,cAAc,IAAI,QAAQ,IAAI,eAAe,IAAI;GACvD,IAAI;GACJ,IAAI;AAEJ,OAAI,YAAY,WAAW,mBAAmB,EAAE;AAC9C,WAAO;AACP,WAAO,MAAM,IAAI,MAAM;UAClB;AACL,WAAO,YAAY,WAAW,YAAY,GAAG,SAAS;AACtD,WAAO,MAAM,IAAI,MAAM;;AAGzB,UAAO;IAAE,QAAQ,IAAI;IAAQ;IAAM;IAAM;IACzC,CACD,OAAO,MAAM;AAGZ,UAAO;IACL,QAAQ;IACR,MAAM;IACN,MAAM,sBALQ,aAAa,QAAQ,IAAI,EAAE,KAAK,IAAI,EAAE,YAAY,EAAE,UAAU;IAM7E;IACD;IAEP"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { MethodInformation, RenderContext, SecuritySchemeObject } from "../types.js";
|
|
2
|
-
import * as _$react from "react";
|
|
3
|
-
import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
|
-
|
|
5
|
-
//#region src/playground/index.d.ts
|
|
6
|
-
interface APIPlaygroundProps {
|
|
7
|
-
path: string;
|
|
8
|
-
method: MethodInformation;
|
|
9
|
-
ctx: RenderContext;
|
|
10
|
-
}
|
|
11
|
-
type SecurityEntry = SecuritySchemeObject & {
|
|
12
|
-
scopes: string[];
|
|
13
|
-
id: string;
|
|
14
|
-
};
|
|
15
|
-
declare function APIPlayground({
|
|
16
|
-
path,
|
|
17
|
-
method,
|
|
18
|
-
ctx
|
|
19
|
-
}: APIPlaygroundProps): string | number | bigint | boolean | _$react_jsx_runtime0.JSX.Element | Iterable<_$react.ReactNode> | Promise<_$react.ReactNode> | null | undefined;
|
|
20
|
-
//#endregion
|
|
21
|
-
export { APIPlayground, APIPlaygroundProps, SecurityEntry };
|
|
22
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/playground/index.tsx"],"mappings":";;;;;UAgBiB,kBAAA;EACf,IAAA;EACA,MAAA,EAAQ,iBAAA;EACR,GAAA,EAAK,aAAA;AAAA;AAAA,KAGK,aAAA,GAAgB,oBAAA;EAC1B,MAAA;EACA,EAAA;AAAA;AAAA,iBAGc,aAAA,CAAA;EAAgB,IAAA;EAAM,MAAA;EAAQ;AAAA,GAAO,kBAAA,wCAAkB,oBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,OAAA,CAAA,SAAA,IAAA,OAAA,CAAA,OAAA,CAAA,SAAA"}
|
package/dist/playground/index.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { getPreferredType } from "../utils/schema/index.js";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
//#region src/playground/index.tsx
|
|
4
|
-
function APIPlayground({ path, method, ctx }) {
|
|
5
|
-
if (ctx.playground?.render) return ctx.playground.render({
|
|
6
|
-
path,
|
|
7
|
-
method,
|
|
8
|
-
ctx
|
|
9
|
-
});
|
|
10
|
-
const bodyContent = method.requestBody?.content;
|
|
11
|
-
const mediaType = bodyContent ? getPreferredType(bodyContent) : void 0;
|
|
12
|
-
const takenIds = /* @__PURE__ */ new Map();
|
|
13
|
-
const context = {
|
|
14
|
-
references: {},
|
|
15
|
-
id(schema) {
|
|
16
|
-
let name = "r";
|
|
17
|
-
if (schema) {
|
|
18
|
-
const ref = ctx.schema.getRawRef(schema)?.split("/");
|
|
19
|
-
if (ref && ref.length > 0) name = ref[ref.length - 1];
|
|
20
|
-
}
|
|
21
|
-
const count = takenIds.get(name) ?? 0;
|
|
22
|
-
takenIds.set(name, count + 1);
|
|
23
|
-
return count === 0 ? name : `${name}${count}`;
|
|
24
|
-
},
|
|
25
|
-
registered: /* @__PURE__ */ new WeakMap()
|
|
26
|
-
};
|
|
27
|
-
const props = {
|
|
28
|
-
securities: parseSecurities(method, ctx),
|
|
29
|
-
method: method.method,
|
|
30
|
-
route: path,
|
|
31
|
-
parameters: method.parameters?.map((param) => {
|
|
32
|
-
if (param.schema !== void 0) return {
|
|
33
|
-
...param,
|
|
34
|
-
schema: writeReferences(param.schema, context)
|
|
35
|
-
};
|
|
36
|
-
if (param.content !== void 0) {
|
|
37
|
-
const content = {};
|
|
38
|
-
for (const k in param.content) {
|
|
39
|
-
const original = param.content[k];
|
|
40
|
-
if (!original || original.schema === void 0) continue;
|
|
41
|
-
content[k] = {
|
|
42
|
-
...original,
|
|
43
|
-
schema: writeReferences(original.schema, context)
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
return {
|
|
47
|
-
...param,
|
|
48
|
-
content
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
return param;
|
|
52
|
-
}),
|
|
53
|
-
body: bodyContent && mediaType ? {
|
|
54
|
-
schema: writeReferences(bodyContent[mediaType].schema, context),
|
|
55
|
-
mediaType
|
|
56
|
-
} : void 0,
|
|
57
|
-
references: context.references,
|
|
58
|
-
proxyUrl: ctx.proxyUrl,
|
|
59
|
-
writeOnly: true,
|
|
60
|
-
readOnly: false
|
|
61
|
-
};
|
|
62
|
-
return /* @__PURE__ */ jsx(ctx.clientBoundary.PlaygroundClient, { ...props });
|
|
63
|
-
}
|
|
64
|
-
function writeReferences(schema, ctx, stack = /* @__PURE__ */ new WeakMap()) {
|
|
65
|
-
if (typeof schema !== "object" || !schema) return schema;
|
|
66
|
-
if (stack.has(schema)) {
|
|
67
|
-
const out = stack.get(schema);
|
|
68
|
-
const id = ctx.id(schema);
|
|
69
|
-
ctx.references[id] = out;
|
|
70
|
-
return { $ref: `#/${id}` };
|
|
71
|
-
}
|
|
72
|
-
const output = { ...schema };
|
|
73
|
-
stack.set(schema, output);
|
|
74
|
-
for (const _n in output) {
|
|
75
|
-
const name = _n;
|
|
76
|
-
if (!output[name]) continue;
|
|
77
|
-
switch (name) {
|
|
78
|
-
case "oneOf":
|
|
79
|
-
case "allOf":
|
|
80
|
-
case "anyOf":
|
|
81
|
-
output[name] = output[name].map((item) => writeReferences(item, ctx, stack));
|
|
82
|
-
continue;
|
|
83
|
-
case "items":
|
|
84
|
-
case "additionalProperties":
|
|
85
|
-
case "not":
|
|
86
|
-
output[name] = writeReferences(output[name], ctx, stack);
|
|
87
|
-
continue;
|
|
88
|
-
case "properties":
|
|
89
|
-
case "patternProperties":
|
|
90
|
-
output[name] = { ...output[name] };
|
|
91
|
-
for (const key in output[name]) output[name][key] = writeReferences(output[name][key], ctx, stack);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return output;
|
|
95
|
-
}
|
|
96
|
-
function parseSecurities(method, { schema: { dereferenced } }) {
|
|
97
|
-
const result = [];
|
|
98
|
-
const security = method.security ?? dereferenced.security ?? [];
|
|
99
|
-
if (security.length === 0) return result;
|
|
100
|
-
for (const map of security) {
|
|
101
|
-
const list = [];
|
|
102
|
-
for (const [key, scopes] of Object.entries(map)) {
|
|
103
|
-
const scheme = dereferenced.components?.securitySchemes?.[key];
|
|
104
|
-
if (!scheme) continue;
|
|
105
|
-
list.push({
|
|
106
|
-
...scheme,
|
|
107
|
-
scopes,
|
|
108
|
-
id: key
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
if (list.length > 0) result.push(list);
|
|
112
|
-
}
|
|
113
|
-
return result;
|
|
114
|
-
}
|
|
115
|
-
//#endregion
|
|
116
|
-
export { APIPlayground };
|
|
117
|
-
|
|
118
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/playground/index.tsx"],"sourcesContent":["import type {\n MediaTypeObject,\n MethodInformation,\n ParameterObject,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { getPreferredType, NoReference, type ParsedSchema } from '@/utils/schema';\nimport { type PlaygroundClientProps } from './client';\n\ninterface Context {\n references: Record<string, ParsedSchema>;\n registered: WeakMap<Exclude<ParsedSchema, boolean>, string>;\n id: (schema?: object) => string;\n}\n\nexport interface APIPlaygroundProps {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n}\n\nexport type SecurityEntry = SecuritySchemeObject & {\n scopes: string[];\n id: string;\n};\n\nexport function APIPlayground({ path, method, ctx }: APIPlaygroundProps) {\n if (ctx.playground?.render) {\n return ctx.playground.render({ path, method, ctx });\n }\n\n const bodyContent = method.requestBody?.content;\n const mediaType = bodyContent ? getPreferredType(bodyContent) : undefined;\n const takenIds = new Map<string, number>();\n\n const context: Context = {\n references: {},\n id(schema) {\n let name = 'r';\n if (schema) {\n const ref = ctx.schema.getRawRef(schema)?.split('/');\n if (ref && ref.length > 0) name = ref[ref.length - 1];\n }\n\n const count = takenIds.get(name) ?? 0;\n takenIds.set(name, count + 1);\n return count === 0 ? name : `${name}${count}`;\n },\n registered: new WeakMap(),\n };\n\n const props: PlaygroundClientProps = {\n securities: parseSecurities(method, ctx),\n method: method.method,\n route: path,\n parameters: method.parameters?.map((param: NoReference<ParameterObject>): ParameterObject => {\n if (param.schema !== undefined) {\n return {\n ...param,\n schema: writeReferences(param.schema, context),\n } as ParameterObject;\n }\n\n if (param.content !== undefined) {\n const content: Record<string, MediaTypeObject> = {};\n\n for (const k in param.content) {\n const original = param.content[k] as NoReference<MediaTypeObject>;\n if (!original || original.schema === undefined) continue;\n\n content[k] = {\n ...original,\n schema: writeReferences(original.schema, context),\n } as MediaTypeObject;\n }\n\n return {\n ...param,\n content,\n } as ParameterObject;\n }\n\n return param;\n }),\n body:\n bodyContent && mediaType\n ? ({\n schema: writeReferences(bodyContent[mediaType].schema as ParsedSchema, context),\n mediaType,\n } as PlaygroundClientProps['body'])\n : undefined,\n references: context.references,\n proxyUrl: ctx.proxyUrl,\n writeOnly: true,\n readOnly: false,\n };\n\n return <ctx.clientBoundary.PlaygroundClient {...props} />;\n}\n\nfunction writeReferences(\n schema: ParsedSchema,\n ctx: Context,\n stack: WeakMap<object, object> = new WeakMap(),\n): ParsedSchema {\n if (typeof schema !== 'object' || !schema) return schema;\n if (stack.has(schema)) {\n const out = stack.get(schema)!;\n const id = ctx.id(schema);\n ctx.references[id] = out;\n\n return {\n $ref: `#/${id}`,\n };\n }\n\n const output = { ...schema };\n stack.set(schema, output);\n for (const _n in output) {\n const name = _n as keyof typeof output;\n if (!output[name]) continue;\n\n switch (name) {\n case 'oneOf':\n case 'allOf':\n case 'anyOf':\n output[name] = output[name].map((item) => writeReferences(item, ctx, stack));\n continue;\n case 'items':\n case 'additionalProperties':\n case 'not':\n output[name] = writeReferences(output[name], ctx, stack);\n continue;\n case 'properties':\n case 'patternProperties':\n output[name] = { ...output[name] };\n\n for (const key in output[name]) {\n output[name][key] = writeReferences(output[name][key], ctx, stack);\n }\n }\n }\n\n return output;\n}\n\nfunction parseSecurities(\n method: MethodInformation,\n { schema: { dereferenced } }: RenderContext,\n): PlaygroundClientProps['securities'] {\n const result: PlaygroundClientProps['securities'] = [];\n const security = method.security ?? dereferenced.security ?? [];\n if (security.length === 0) return result;\n\n for (const map of security) {\n const list: PlaygroundClientProps['securities'][number] = [];\n\n for (const [key, scopes] of Object.entries(map)) {\n const scheme = dereferenced.components?.securitySchemes?.[key];\n if (!scheme) continue;\n\n list.push({\n ...scheme,\n scopes,\n id: key,\n });\n }\n\n if (list.length > 0) result.push(list);\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/playground/schema.tsx"],"mappings":";;;;;UAeiB,WAAA;;;;EAIf,SAAA;;;;EAKA,QAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../src/playground/schema.tsx"],"sourcesContent":["import { Ajv2020 } from 'ajv/dist/2020';\nimport { createContext, ReactNode, use, useMemo } from 'react';\nimport type { ParsedSchema, ResolvedSchema } from '@/utils/schema';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport { FieldKey, useDataEngine, useFieldValue, useNamespace } from '@fumari/stf';\nimport { stringifyFieldKey } from '@fumari/stf/lib/utils';\nimport { sample } from 'openapi-sampler';\nimport { FormatFlags, schemaToString } from '@/utils/schema/to-string';\nimport { resolveRefSync } from '@/utils/schema/resolve-ref';\n\ninterface SchemaContextType extends SchemaScope {\n references: Record<string, ParsedSchema>;\n ajv: Ajv2020;\n}\n\nexport interface SchemaScope {\n /**\n * show write only fields\n */\n writeOnly: boolean;\n\n /**\n * show read only fields\n */\n readOnly: boolean;\n}\n\ntype UnionField = 'anyOf' | 'oneOf';\n\nexport interface FieldInfo {\n selectedType?: string;\n oneOf: number;\n\n /**\n * The actual field that represents union members.\n */\n unionField?: UnionField;\n}\n\nconst SchemaContext = createContext<SchemaContextType | undefined>(undefined);\nexport const anyFields = {\n type: ['string', 'number', 'boolean', 'array', 'object'],\n items: true,\n additionalProperties: true,\n} satisfies ParsedSchema;\n\nexport function SchemaProvider({\n references,\n readOnly,\n writeOnly,\n children,\n}: Omit<SchemaContextType, 'ajv'> & { children: ReactNode }) {\n const ajv = useMemo(\n () =>\n new Ajv2020({\n strict: false,\n validateSchema: false,\n validateFormats: false,\n }),\n [],\n );\n\n return (\n <SchemaContext.Provider\n value={useMemo(\n () => ({ references, ajv, readOnly, writeOnly }),\n [references, ajv, readOnly, writeOnly],\n )}\n >\n {children}\n </SchemaContext.Provider>\n );\n}\n\nexport function useSchemaScope(): SchemaScope {\n return use(SchemaContext)!;\n}\n\n/**\n * A hook to store dynamic info of a field, such as selected schema of `oneOf`.\n *\n * @param fieldName - field name of form.\n * @param schema - The **resolved** JSON Schema to generate initial values.\n * @param depth - The depth to avoid duplicated field name with same schema (e.g. nested `oneOf`).\n */\nexport function useFieldInfo(\n fieldName: FieldKey,\n schema: Exclude<ParsedSchema, boolean>,\n depth = 0,\n): {\n info: FieldInfo;\n schema: Exclude<ParsedSchema, boolean>;\n updateInfo: (value: Partial<FieldInfo>) => void;\n} {\n const { ajv, references } = use(SchemaContext)!;\n const engine = useDataEngine();\n const { generateDefault } = useSchemaUtils();\n const fieldData = useNamespace({\n namespace: `field-info:${depth}:${stringifyFieldKey(fieldName)}`,\n initial(): FieldInfo {\n const value = engine.get(fieldName);\n const out: FieldInfo = {\n oneOf: -1,\n };\n const union = getUnion(schema);\n if (union) {\n const [members, field] = union;\n\n out.oneOf = members.findIndex((item) =>\n ajv.validate(typeof item === 'object' ? { ...item, ...references } : item, value),\n );\n if (out.oneOf === -1) out.oneOf = 0;\n out.unionField = field;\n }\n\n if (Array.isArray(schema.type)) {\n const types = schema.type;\n\n out.selectedType =\n types.find((type) => {\n return ajv.validate({ ...schema, ...references, type }, value);\n }) ?? types[0];\n }\n\n return out;\n },\n });\n const [info, setInfo] = useFieldValue<FieldInfo>([], {\n stf: fieldData,\n });\n\n return {\n info,\n schema,\n updateInfo(value) {\n const updated = {\n ...info,\n ...value,\n };\n\n if (updated.oneOf === info.oneOf && updated.selectedType === info.selectedType) return;\n\n setInfo(updated);\n\n let valueSchema: ParsedSchema = schema;\n if (updated.unionField) {\n valueSchema = schema[updated.unionField]![updated.oneOf];\n } else if (updated.selectedType) {\n // must remove to `examples` to avoid invalid default values\n valueSchema = { ...schema, type: updated.selectedType, examples: undefined };\n }\n\n engine.update(fieldName, generateDefault(valueSchema));\n },\n };\n}\n\nexport function useSchemaUtils() {\n const { references } = use(SchemaContext)!;\n\n return {\n generateDefault(schema: ParsedSchema): unknown {\n return sample(\n schema as never,\n { skipNonRequired: true, skipReadOnly: true, quiet: true },\n references,\n );\n },\n schemaToString(value: ResolvedSchema, flags?: FormatFlags) {\n return schemaToString(\n value,\n (s) => ({ dereferenced: dereference(s, references), raw: s }),\n flags,\n );\n },\n };\n}\n\n/**\n * resolve $ref & merge `allOf`.\n */\nexport function useResolvedSchema(raw: ParsedSchema): Exclude<ParsedSchema, boolean> {\n const { references } = use(SchemaContext)!;\n\n return useMemo(() => {\n const schema = dereference(raw, references);\n if (typeof schema === 'boolean') return anyFields;\n\n if (schema.allOf) {\n const merged = mergeAllOf(schema, {\n dereference(schema) {\n return dereference(schema, references);\n },\n });\n if (typeof merged === 'boolean') return anyFields;\n return merged;\n }\n\n return schema;\n }, [raw, references]);\n}\n\nfunction dereference(schema: ParsedSchema, references: Record<string, ParsedSchema>): ParsedSchema {\n if (typeof schema === 'boolean') return schema;\n if (schema.$ref) {\n return resolveRefSync(schema.$ref, references) as ParsedSchema;\n }\n\n return schema;\n}\n\nfunction getUnion(\n schema: Exclude<ParsedSchema, boolean>,\n): [readonly ParsedSchema[], UnionField] | undefined {\n if (schema.anyOf) {\n return [schema.anyOf, 'anyOf'];\n }\n\n if (schema.oneOf) return [schema.oneOf, 'oneOf'];\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status-info.js","names":[],"sources":["../../src/playground/status-info.tsx"],"sourcesContent":["import { CircleCheck, CircleX } from 'lucide-react';\nimport type { Translations } from '@/i18n';\n\ninterface StatusInfo {\n description: string;\n color: string;\n icon: React.ElementType;\n}\n\nconst statusKeys: Record<\n number,\n { key: keyof Translations; color: string; icon: React.ElementType }\n> = {\n 400: { key: 'statusBadRequest', color: 'text-red-500', icon: CircleX },\n 401: { key: 'statusUnauthorized', color: 'text-red-500', icon: CircleX },\n 403: { key: 'statusForbidden', color: 'text-red-500', icon: CircleX },\n 404: { key: 'statusNotFound', color: 'text-fd-muted-foreground', icon: CircleX },\n 500: { key: 'statusInternalServerError', color: 'text-red-500', icon: CircleX },\n};\n\nexport function getStatusInfo(status: number, t: Translations): StatusInfo {\n if (status in statusKeys) {\n const { key, color, icon } = statusKeys[status];\n return { description: t[key], color, icon };\n }\n\n if (status >= 200 && status < 300) {\n return {\n description: t.statusSuccessful,\n color: 'text-green-500',\n icon: CircleCheck,\n };\n }\n\n if (status >= 400) {\n return { description: t.statusError, color: 'text-red-500', icon: CircleX };\n }\n\n return {\n description: t.statusNoDescription,\n color: 'text-fd-muted-foreground',\n icon: CircleX,\n };\n}\n"],"mappings":";;AASA,MAAM,aAGF;CACF,KAAK;EAAE,KAAK;EAAoB,OAAO;EAAgB,MAAM;EAAS;CACtE,KAAK;EAAE,KAAK;EAAsB,OAAO;EAAgB,MAAM;EAAS;CACxE,KAAK;EAAE,KAAK;EAAmB,OAAO;EAAgB,MAAM;EAAS;CACrE,KAAK;EAAE,KAAK;EAAkB,OAAO;EAA4B,MAAM;EAAS;CAChF,KAAK;EAAE,KAAK;EAA6B,OAAO;EAAgB,MAAM;EAAS;CAChF;AAED,SAAgB,cAAc,QAAgB,GAA6B;AACzE,KAAI,UAAU,YAAY;EACxB,MAAM,EAAE,KAAK,OAAO,SAAS,WAAW;AACxC,SAAO;GAAE,aAAa,EAAE;GAAM;GAAO;GAAM;;AAG7C,KAAI,UAAU,OAAO,SAAS,IAC5B,QAAO;EACL,aAAa,EAAE;EACf,OAAO;EACP,MAAM;EACP;AAGH,KAAI,UAAU,IACZ,QAAO;EAAE,aAAa,EAAE;EAAa,OAAO;EAAgB,MAAM;EAAS;AAG7E,QAAO;EACL,aAAa,EAAE;EACf,OAAO;EACP,MAAM;EACP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"all.d.ts","names":[],"sources":["../../../src/requests/generators/all.ts"],"mappings":";;;iBAQgB,eAAA,CAAgB,QAAA,EAAU,0BAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"all.js","names":[],"sources":["../../../src/requests/generators/all.ts"],"sourcesContent":["import type { CodeUsageGeneratorRegistry } from '.';\nimport { csharp } from './csharp';\nimport { curl } from './curl';\nimport { go } from './go';\nimport { java } from './java';\nimport { javascript } from './javascript';\nimport { python } from './python';\n\nexport function registerDefault(registry: CodeUsageGeneratorRegistry) {\n registry.add('curl', curl);\n registry.add('js', javascript);\n registry.add('go', go);\n registry.add('python', python);\n registry.add('java', java);\n registry.add('csharp', csharp);\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,gBAAgB,UAAsC;AACpE,UAAS,IAAI,QAAQ,KAAK;AAC1B,UAAS,IAAI,MAAM,WAAW;AAC9B,UAAS,IAAI,MAAM,GAAG;AACtB,UAAS,IAAI,UAAU,OAAO;AAC9B,UAAS,IAAI,QAAQ,KAAK;AAC1B,UAAS,IAAI,UAAU,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"csharp.d.ts","names":[],"sources":["../../../src/requests/generators/csharp.ts"],"mappings":";;;cAGa,MAAA,EAAQ,kBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"csharp.js","names":[],"sources":["../../../src/requests/generators/csharp.ts"],"sourcesContent":["import type { CodeUsageGenerator } from '@/requests/generators';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\n\nexport const csharp: CodeUsageGenerator = {\n label: 'C#',\n lang: 'csharp',\n generate(url, data, { mediaAdapters }) {\n const s: string[] = [];\n const imports = new Set<string>(['System', 'System.Net.Http', 'System.Text']);\n const headers = { ...data.header };\n\n // Handle request body\n let body: string | undefined;\n if (data.body && data.bodyMediaType) {\n const adapter = resolveMediaAdapter(data.bodyMediaType, mediaAdapters);\n body = adapter?.generateExample(data as { body: unknown }, {\n lang: 'csharp',\n addImport(from) {\n imports.add(from);\n },\n });\n }\n\n for (const specifier of imports) {\n s.push(`using ${specifier};`);\n }\n\n s.push('');\n\n if (body) {\n s.push(body, '');\n }\n\n s.push('var client = new HttpClient();');\n const headerLines: string[] = [];\n\n function addHeader(key: string, value: string) {\n headerLines.push(`client.DefaultRequestHeaders.Add(\"${key}\", ${JSON.stringify(value)});`);\n }\n for (const k in headers) {\n addHeader(k, headers[k].value);\n }\n\n // Add cookie header if cookies are present\n if (Object.keys(data.cookie).length > 0) {\n const cookie = Object.entries(data.cookie)\n .map(([key, param]) => `${key}=${param.value}`)\n .join('; ');\n\n addHeader('cookie', cookie);\n }\n\n s.push(...headerLines);\n\n // Build the request\n const method = data.method[0].toUpperCase() + data.method.slice(1).toLowerCase() + 'Async';\n\n if (body) {\n s.push(`var response = await client.${method}(\"${url}\", body);`);\n } else {\n s.push(`var response = await client.${method}(\"${url}\");`);\n }\n\n // Add response handling\n s.push('var responseBody = await response.Content.ReadAsStringAsync();');\n\n return s.join('\\n');\n },\n};\n"],"mappings":";;;AAGA,MAAa,SAA6B;CACxC,OAAO;CACP,MAAM;CACN,SAAS,KAAK,MAAM,EAAE,iBAAiB;EACrC,MAAM,IAAc,EAAE;EACtB,MAAM,UAAU,IAAI,IAAY;GAAC;GAAU;GAAmB;GAAc,CAAC;EAC7E,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;EAGlC,IAAI;AACJ,MAAI,KAAK,QAAQ,KAAK,cAEpB,QADgB,oBAAoB,KAAK,eAAe,cAAc,EACtD,gBAAgB,MAA2B;GACzD,MAAM;GACN,UAAU,MAAM;AACd,YAAQ,IAAI,KAAK;;GAEpB,CAAC;AAGJ,OAAK,MAAM,aAAa,QACtB,GAAE,KAAK,SAAS,UAAU,GAAG;AAG/B,IAAE,KAAK,GAAG;AAEV,MAAI,KACF,GAAE,KAAK,MAAM,GAAG;AAGlB,IAAE,KAAK,iCAAiC;EACxC,MAAM,cAAwB,EAAE;EAEhC,SAAS,UAAU,KAAa,OAAe;AAC7C,eAAY,KAAK,qCAAqC,IAAI,KAAK,KAAK,UAAU,MAAM,CAAC,IAAI;;AAE3F,OAAK,MAAM,KAAK,QACd,WAAU,GAAG,QAAQ,GAAG,MAAM;AAIhC,MAAI,OAAO,KAAK,KAAK,OAAO,CAAC,SAAS,EAKpC,WAAU,UAJK,OAAO,QAAQ,KAAK,OAAO,CACvC,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,CAC9C,KAAK,KAAK,CAEc;AAG7B,IAAE,KAAK,GAAG,YAAY;EAGtB,MAAM,SAAS,KAAK,OAAO,GAAG,aAAa,GAAG,KAAK,OAAO,MAAM,EAAE,CAAC,aAAa,GAAG;AAEnF,MAAI,KACF,GAAE,KAAK,+BAA+B,OAAO,IAAI,IAAI,WAAW;MAEhE,GAAE,KAAK,+BAA+B,OAAO,IAAI,IAAI,KAAK;AAI5D,IAAE,KAAK,iEAAiE;AAExE,SAAO,EAAE,KAAK,KAAK;;CAEtB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"curl.d.ts","names":[],"sources":["../../../src/requests/generators/curl.ts"],"mappings":";;;cAGa,IAAA,EAAM,kBAAA"}
|