@djangocfg/ui-tools 2.1.285 → 2.1.286
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DocsLayout-BCVU6TTX.cjs +2027 -0
- package/dist/DocsLayout-BCVU6TTX.cjs.map +1 -0
- package/dist/DocsLayout-ERETJLLV.mjs +2020 -0
- package/dist/DocsLayout-ERETJLLV.mjs.map +1 -0
- package/dist/{PlaygroundLayout-O52C6HK5.css → DocsLayout-MBFIB4NO.css} +1 -1
- package/dist/{PrettyCode.client-SGDGQTYT.cjs → PrettyCode.client-5GABIN2I.cjs} +57 -35
- package/dist/PrettyCode.client-5GABIN2I.cjs.map +1 -0
- package/dist/{PrettyCode.client-DW5LTG47.mjs → PrettyCode.client-IZTXXYHG.mjs} +57 -35
- package/dist/PrettyCode.client-IZTXXYHG.mjs.map +1 -0
- package/dist/chunk-IULI4XII.cjs +1129 -0
- package/dist/chunk-IULI4XII.cjs.map +1 -0
- package/dist/chunk-VZGQC3NG.mjs +1100 -0
- package/dist/chunk-VZGQC3NG.mjs.map +1 -0
- package/dist/index.cjs +88 -552
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -6
- package/dist/index.d.ts +18 -6
- package/dist/index.mjs +25 -496
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/src/tools/OpenapiViewer/.claude/.sidecar/activity.jsonl +4 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/map_cache.json +30 -0
- package/src/tools/OpenapiViewer/.claude/.sidecar/usage.json +5 -0
- package/src/tools/OpenapiViewer/.claude/project-map.md +23 -0
- package/src/tools/OpenapiViewer/OpenapiViewer.story.tsx +28 -2
- package/src/tools/OpenapiViewer/README.md +104 -51
- package/src/tools/OpenapiViewer/components/DocsLayout/ApiIntroSection.tsx +64 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/DocsView.tsx +137 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc.tsx +268 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/SchemaCopyMenu.tsx +139 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar.tsx +211 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/SlideInPlayground.tsx +101 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/TryItSheet.tsx +57 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/anchor.ts +11 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/grouping.ts +71 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/index.tsx +166 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/schemaFields.ts +121 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/sidebarLabel.ts +60 -0
- package/src/tools/OpenapiViewer/components/index.ts +5 -2
- package/src/tools/OpenapiViewer/components/shared/BodyFormEditor.tsx +422 -0
- package/src/tools/OpenapiViewer/components/shared/EndpointDraftSync.tsx +108 -0
- package/src/tools/OpenapiViewer/components/shared/EndpointResetButton.tsx +50 -0
- package/src/tools/OpenapiViewer/components/{PlaygroundLayout → shared}/RequestPanel.tsx +174 -87
- package/src/tools/OpenapiViewer/components/shared/SendButton.tsx +91 -0
- package/src/tools/OpenapiViewer/components/{PlaygroundLayout → shared}/ui.tsx +5 -4
- package/src/tools/OpenapiViewer/context/PlaygroundContext.tsx +82 -8
- package/src/tools/OpenapiViewer/hooks/useEndpointDraft.ts +142 -0
- package/src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts +126 -13
- package/src/tools/OpenapiViewer/index.tsx +3 -7
- package/src/tools/OpenapiViewer/lazy.tsx +6 -27
- package/src/tools/OpenapiViewer/types.ts +44 -0
- package/src/tools/OpenapiViewer/utils/formatters.ts +2 -23
- package/src/tools/OpenapiViewer/utils/index.ts +3 -1
- package/src/tools/OpenapiViewer/utils/schemaExport.ts +206 -0
- package/src/tools/OpenapiViewer/utils/url.ts +202 -0
- package/src/tools/PrettyCode/PrettyCode.client.tsx +42 -8
- package/src/tools/PrettyCode/index.tsx +6 -0
- package/dist/PlaygroundLayout-DHUATCHB.cjs +0 -798
- package/dist/PlaygroundLayout-DHUATCHB.cjs.map +0 -1
- package/dist/PlaygroundLayout-NONWOVQR.mjs +0 -791
- package/dist/PlaygroundLayout-NONWOVQR.mjs.map +0 -1
- package/dist/PrettyCode.client-DW5LTG47.mjs.map +0 -1
- package/dist/PrettyCode.client-SGDGQTYT.cjs.map +0 -1
- package/dist/chunk-5FKE7OME.cjs +0 -369
- package/dist/chunk-5FKE7OME.cjs.map +0 -1
- package/dist/chunk-BKWDHJKF.mjs +0 -356
- package/dist/chunk-BKWDHJKF.mjs.map +0 -1
- package/src/tools/OpenapiViewer/components/PlaygroundLayout/EndpointList.tsx +0 -228
- package/src/tools/OpenapiViewer/components/PlaygroundLayout/index.tsx +0 -107
- /package/dist/{PlaygroundLayout-O52C6HK5.css.map → DocsLayout-MBFIB4NO.css.map} +0 -0
- /package/src/tools/OpenapiViewer/components/{PlaygroundLayout → shared}/ResponsePanel.tsx +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/OpenapiViewer/hooks/useMobile.ts","../src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts","../src/tools/OpenapiViewer/components/PlaygroundLayout/ui.tsx","../src/tools/OpenapiViewer/components/PlaygroundLayout/EndpointList.tsx","../src/tools/OpenapiViewer/components/PlaygroundLayout/RequestPanel.tsx","../src/tools/OpenapiViewer/components/PlaygroundLayout/ResponsePanel.tsx","../src/tools/OpenapiViewer/components/PlaygroundLayout/index.tsx"],"names":["React","cn","jsxs","jsx","ChevronRight","useState","useEffect","useMemo","Input","Fragment","Combobox","Loader2","Terminal","Send","CopyButton"],"mappings":"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","file":"PlaygroundLayout-NONWOVQR.mjs","sourcesContent":["import { useIsMobile } from '@djangocfg/ui-core/hooks';\n\nexport const useMobile = () => {\n const isMobile = useIsMobile();\n\n return {\n isMobile,\n isDesktop: !isMobile,\n };\n}; ","'use client';\n\nimport consola from 'consola';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { ApiEndpoint, OpenApiSchema, SchemaSource, UseOpenApiSchemaReturn } from '../types';\n\n// HTTP methods to extract from OpenAPI schema\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\n// Extract endpoints from OpenAPI schema (all methods)\nconst extractEndpoints = (schema: OpenApiSchema): ApiEndpoint[] => {\n const endpoints: ApiEndpoint[] = [];\n\n if (!schema.paths) return [];\n\n // Get base URL from servers\n const baseUrl = schema.servers && schema.servers.length > 0 ? schema.servers[0].url : '';\n\n for (const [path, methods] of Object.entries(schema.paths)) {\n for (const method of HTTP_METHODS) {\n const op = (methods as any)[method];\n if (!op) continue;\n\n const methodUpper = method.toUpperCase();\n const description = op.description || op.summary || `${methodUpper} ${path}`;\n const category = op.tags?.[0] || 'Other';\n\n const parameters: Array<{\n name: string;\n type: string;\n required: boolean;\n description?: string;\n }> = [];\n\n // Collect parameters (path-level + operation-level)\n const allParams = [...((methods as any).parameters || []), ...(op.parameters || [])];\n for (const param of allParams) {\n parameters.push({\n name: param.name,\n type: param.schema?.type || 'string',\n required: param.required || false,\n description: param.description,\n });\n }\n\n // Collect responses\n const responses: Array<{\n code: string;\n description: string;\n }> = [];\n\n if (op.responses) {\n for (const [code, response] of Object.entries(op.responses)) {\n responses.push({\n code,\n description: (response as any).description || `Response ${code}`,\n });\n }\n }\n\n // Extract request body info\n let requestBody: { type: string; description?: string } | undefined;\n if (op.requestBody) {\n const content = op.requestBody.content;\n const mediaType = content?.['application/json'] || content?.[Object.keys(content || {})[0]];\n requestBody = {\n type: mediaType?.schema?.type || 'object',\n description: op.requestBody.description,\n };\n }\n\n const endpoint: ApiEndpoint = {\n name: path.split('/').pop() || path,\n method: methodUpper,\n path: baseUrl + path,\n description,\n category,\n parameters: parameters.length > 0 ? parameters : undefined,\n requestBody,\n responses: responses.length > 0 ? responses : undefined,\n };\n\n endpoints.push(endpoint);\n }\n }\n\n return endpoints;\n};\n\n// Get unique categories from endpoints\nconst getCategories = (endpoints: ApiEndpoint[]): string[] => {\n const categories = new Set<string>();\n endpoints.forEach((endpoint) => categories.add(endpoint.category));\n return Array.from(categories).sort();\n};\n\n// Fetch schema from URL\nconst fetchSchema = async (url: string): Promise<OpenApiSchema> => {\n const response = await fetch(url, {\n headers: {\n 'Accept': 'application/json',\n },\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch schema: ${response.statusText}`);\n }\n return response.json();\n};\n\ninterface UseOpenApiSchemaProps {\n schemas: SchemaSource[];\n defaultSchemaId?: string;\n}\n\nexport default function useOpenApiSchema({\n schemas,\n defaultSchemaId,\n}: UseOpenApiSchemaProps): UseOpenApiSchemaReturn {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [currentSchemaId, setCurrentSchemaId] = useState<string>(\n defaultSchemaId || schemas[0]?.id\n );\n const [loadedSchemas, setLoadedSchemas] = useState<Map<string, OpenApiSchema>>(\n new Map()\n );\n\n const currentSchema = useMemo(\n () => schemas.find((s) => s.id === currentSchemaId) || null,\n [schemas, currentSchemaId]\n );\n\n const currentOpenApiSchema = useMemo(\n () => (currentSchemaId ? loadedSchemas.get(currentSchemaId) : null),\n [loadedSchemas, currentSchemaId]\n );\n\n const endpoints = useMemo(\n () => (currentOpenApiSchema ? extractEndpoints(currentOpenApiSchema) : []),\n [currentOpenApiSchema]\n );\n\n const categories = useMemo(() => getCategories(endpoints), [endpoints]);\n\n // Load schema when current schema changes\n useEffect(() => {\n if (!currentSchema) return;\n\n // Skip if already loaded\n if (loadedSchemas.has(currentSchema.id)) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n fetchSchema(currentSchema.url)\n .then((schema) => {\n setLoadedSchemas((prev) => new Map(prev).set(currentSchema.id, schema));\n consola.success(`Schema loaded: ${currentSchema.name}`);\n setLoading(false);\n })\n .catch((err) => {\n consola.error(`Error loading schema from ${currentSchema.url}:`, err);\n setError(err instanceof Error ? err.message : 'Failed to load schema');\n setLoading(false);\n });\n }, [currentSchema, loadedSchemas]);\n\n const setCurrentSchema = useCallback((schemaId: string) => {\n setCurrentSchemaId(schemaId);\n }, []);\n\n const refresh = useCallback(() => {\n if (!currentSchema) return;\n\n setLoading(true);\n setError(null);\n\n // Remove from cache to force reload\n setLoadedSchemas((prev) => {\n const next = new Map(prev);\n next.delete(currentSchema.id);\n return next;\n });\n\n fetchSchema(currentSchema.url)\n .then((schema) => {\n setLoadedSchemas((prev) => new Map(prev).set(currentSchema.id, schema));\n consola.success(`Schema refreshed: ${currentSchema.name}`);\n setLoading(false);\n })\n .catch((err) => {\n consola.error(`Error refreshing schema from ${currentSchema.url}:`, err);\n setError(err instanceof Error ? err.message : 'Failed to refresh schema');\n setLoading(false);\n });\n }, [currentSchema]);\n\n return {\n loading,\n error,\n endpoints,\n categories,\n schemas,\n currentSchema,\n setCurrentSchema,\n refresh,\n };\n}\n","'use client';\n\n/**\n * Shared primitive UI components used across all PlaygroundLayout panels.\n * Keep this file free of any business logic or context reads.\n */\n\nimport { ChevronRight } from 'lucide-react';\nimport React from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\n// ─── Style helpers ────────────────────────────────────────────────────────────\n\nconst METHOD_STYLES: Record<string, string> = {\n GET: 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/25',\n POST: 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/25',\n PUT: 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/25',\n PATCH: 'bg-orange-500/10 text-orange-600 dark:text-orange-400 border-orange-500/25',\n DELETE: 'bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/25',\n} as const;\n\nconst METHOD_FALLBACK = 'bg-muted text-muted-foreground border-border';\n\nexport function getMethodStyle(method: string): string {\n return METHOD_STYLES[method.toUpperCase()] ?? METHOD_FALLBACK;\n}\n\nexport function getStatusStyle(status: number): string {\n if (status >= 500) return 'bg-red-500/10 text-red-500 dark:text-red-400 border-red-500/25';\n if (status >= 400) return 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/25';\n if (status >= 300) return 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/25';\n return 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/25';\n}\n\nexport function relativePath(full: string): string {\n try { return new URL(full).pathname; } catch { return full; }\n}\n\n// ─── Atoms ────────────────────────────────────────────────────────────────────\n\nexport function MethodBadge({ method }: { method: string }) {\n return (\n <span className={cn(\n 'inline-flex shrink-0 items-center rounded border px-1.5 py-px',\n 'font-mono text-[10px] font-bold uppercase tracking-wider leading-none',\n getMethodStyle(method),\n )}>\n {method}\n </span>\n );\n}\n\nexport function StatusBadge({ status }: { status: number }) {\n return (\n <span className={cn(\n 'inline-flex items-center rounded border px-1.5 py-px',\n 'font-mono text-[11px] font-bold leading-none',\n getStatusStyle(status),\n )}>\n {status}\n </span>\n );\n}\n\nexport function SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60 select-none\">\n {children}\n </p>\n );\n}\n\nexport function Panel({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div className={cn('flex flex-col min-h-0 overflow-hidden', className)}>\n {children}\n </div>\n );\n}\n\nexport function ScrollArea({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div className={cn('flex-1 overflow-y-auto min-h-0', className)}>\n {children}\n </div>\n );\n}\n\nexport function PanelHeader({ title }: { title: string }) {\n return (\n <div className=\"shrink-0 border-b px-4 h-10 flex items-center\">\n <span className=\"text-[11px] font-semibold uppercase tracking-widest text-muted-foreground/50\">\n {title}\n </span>\n </div>\n );\n}\n\nexport function EmptyState({\n icon: Icon,\n text,\n className,\n}: {\n icon: React.ElementType;\n text: string;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center h-full gap-3 px-6 text-center',\n className,\n )}\n >\n <Icon className=\"h-7 w-7 text-muted-foreground/25\" />\n <p className=\"text-xs text-muted-foreground\">{text}</p>\n </div>\n );\n}\n\nexport function CollapsibleSection({\n label,\n action,\n children,\n defaultOpen = false,\n}: {\n label: React.ReactNode;\n action?: React.ReactNode;\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) {\n const [open, setOpen] = React.useState(defaultOpen);\n return (\n <div className=\"space-y-0\">\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60 hover:text-muted-foreground transition-colors py-1\"\n >\n <ChevronRight className={cn('h-3 w-3 transition-transform', open && 'rotate-90')} />\n {label}\n </button>\n {action && <div className=\"shrink-0\">{action}</div>}\n </div>\n {open && <div>{children}</div>}\n </div>\n );\n}\n","'use client';\n\nimport { ChevronRight, Filter, Search } from 'lucide-react';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport {\n Combobox,\n DownloadButton,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Input,\n Skeleton,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport useOpenApiSchema from '../../hooks/useOpenApiSchema';\nimport { deduplicateEndpoints } from '../../utils/versionManager';\nimport { MethodBadge, ScrollArea, relativePath } from './ui';\n\n// ─── Endpoint row ─────────────────────────────────────────────────────────────\n\nfunction EndpointRow({\n method,\n path,\n description,\n isActive,\n onClick,\n}: {\n method: string;\n path: string;\n description: string;\n isActive: boolean;\n onClick: () => void;\n}) {\n const displayPath = relativePath(path);\n const rowCls = cn(\n 'group w-full text-left flex items-start gap-2.5 px-3 py-2.5 transition-colors hover:bg-muted/40',\n isActive && 'bg-primary/[0.06] hover:bg-primary/[0.09]',\n );\n const arrowCls = cn(\n 'h-3.5 w-3.5 shrink-0 mt-px transition-opacity',\n isActive ? 'text-primary opacity-100' : 'opacity-0 group-hover:opacity-30',\n );\n\n return (\n <button className={rowCls} onClick={onClick}>\n <MethodBadge method={method} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-mono text-[11px] text-foreground/75 truncate leading-tight\">\n {displayPath}\n </p>\n {description && (\n <p className=\"text-[10px] text-muted-foreground/60 truncate leading-tight mt-0.5\">\n {description}\n </p>\n )}\n </div>\n <ChevronRight className={arrowCls} />\n </button>\n );\n}\n\n// ─── EndpointList ─────────────────────────────────────────────────────────────\n\nexport function EndpointList() {\n const { state, config, setSelectedEndpoint, setSelectedCategory, setSearchTerm } =\n usePlaygroundContext();\n const { endpoints, categories, loading, error, schemas, currentSchema, setCurrentSchema } =\n useOpenApiSchema({ schemas: config.schemas, defaultSchemaId: config.defaultSchemaId });\n\n // ── Debounced search ──────────────────────────────────────────────────────\n const [debouncedSearch, setDebouncedSearch] = useState(state.searchTerm);\n useEffect(() => {\n const id = setTimeout(() => setDebouncedSearch(state.searchTerm), 150);\n return () => clearTimeout(id);\n }, [state.searchTerm]);\n\n // ── Data ──────────────────────────────────────────────────────────────────\n const schemaOptions = useMemo(\n () => schemas.map((s) => ({ value: s.id, label: s.name })),\n [schemas],\n );\n\n const filtered = useMemo(() => {\n let list = deduplicateEndpoints(endpoints, state.selectedVersion);\n if (state.selectedCategory !== 'All') {\n list = list.filter((e) => e.category === state.selectedCategory);\n }\n if (debouncedSearch) {\n const q = debouncedSearch.toLowerCase();\n list = list.filter((e) =>\n e.name.toLowerCase().includes(q) ||\n e.description.toLowerCase().includes(q) ||\n e.path.toLowerCase().includes(q),\n );\n }\n return list;\n }, [endpoints, state.selectedCategory, debouncedSearch, state.selectedVersion]);\n\n // ── Derived ───────────────────────────────────────────────────────────────\n const isFiltered = state.selectedCategory !== 'All';\n const hasCategories = categories.length > 0;\n const hasMultipleSchemas = schemas.length > 1;\n const endpointLabel = `${filtered.length} endpoint${filtered.length !== 1 ? 's' : ''}`;\n const downloadFilename = currentSchema ? `${currentSchema.id}-openapi.json` : 'openapi.json';\n\n // ── Early returns ─────────────────────────────────────────────────────────\n if (loading) {\n return (\n <div className=\"p-3 space-y-1.5\">\n {Array.from({ length: 12 }).map((_, i) => (\n <Skeleton key={i} className=\"h-10 w-full rounded\" />\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"p-4\">\n <p className=\"text-xs text-destructive\">Failed to load schema: {error}</p>\n </div>\n );\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n return (\n <>\n {/* Toolbar */}\n <div className=\"shrink-0 border-b px-2.5 py-2 space-y-2\">\n {hasMultipleSchemas && (\n <Combobox\n options={schemaOptions}\n value={currentSchema?.id ?? ''}\n onValueChange={(id) => id && setCurrentSchema(id)}\n placeholder=\"Select API\"\n searchPlaceholder=\"Search APIs…\"\n emptyText=\"No APIs found\"\n className=\"w-full h-8 text-xs\"\n />\n )}\n\n <div className=\"flex gap-1.5\">\n <div className=\"relative flex-1 min-w-0\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground/50 pointer-events-none\" />\n <Input\n placeholder=\"Search endpoints…\"\n value={state.searchTerm}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearchTerm(e.target.value)}\n className=\"pl-8 h-8 text-xs\"\n />\n </div>\n\n {hasCategories && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button className={cn(\n 'relative shrink-0 flex items-center justify-center h-8 w-8 rounded-md border transition-colors',\n isFiltered\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-input bg-background text-muted-foreground hover:text-foreground hover:bg-muted/50',\n )}>\n <Filter className=\"h-3.5 w-3.5\" />\n {isFiltered && (\n <span className=\"absolute -top-1 -right-1 h-2 w-2 rounded-full bg-primary\" />\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-[160px] max-h-72 overflow-y-auto\">\n {['All', ...categories].map((c) => (\n <DropdownMenuItem\n key={c}\n onClick={() => setSelectedCategory(c)}\n className={cn('text-xs', state.selectedCategory === c && 'bg-accent font-medium')}\n >\n {c}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n {/* Meta row */}\n <div className=\"shrink-0 flex items-center justify-between px-3 py-1 border-b bg-muted/20\">\n <span className=\"text-[10px] text-muted-foreground/50 tabular-nums\">{endpointLabel}</span>\n {currentSchema && (\n <DownloadButton\n url={currentSchema.url}\n filename={downloadFilename}\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-[10px] text-muted-foreground/50 hover:text-foreground\"\n >\n JSON\n </DownloadButton>\n )}\n </div>\n\n {/* List */}\n <ScrollArea>\n {filtered.length === 0 ? (\n <div className=\"py-10 text-center text-xs text-muted-foreground\">No endpoints found</div>\n ) : (\n <div className=\"divide-y divide-border/40\">\n {filtered.map((ep) => (\n <EndpointRow\n key={`${ep.method}-${ep.path}`}\n method={ep.method}\n path={ep.path}\n description={ep.description}\n isActive={\n state.selectedEndpoint?.path === ep.path &&\n state.selectedEndpoint?.method === ep.method\n }\n onClick={() => setSelectedEndpoint(ep)}\n />\n ))}\n </div>\n )}\n </ScrollArea>\n </>\n );\n}\n","'use client';\n\nimport { Key, Loader2, Send, Sparkles, Terminal } from 'lucide-react';\nimport React, { useMemo } from 'react';\n\nimport {\n Button,\n Combobox,\n type ComboboxOption,\n CopyButton,\n Input,\n Textarea,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport PrettyCode from '../../../PrettyCode';\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { findApiKeyById, isValidJson, parseRequestHeaders } from '../../utils';\nimport {\n CollapsibleSection,\n EmptyState,\n MethodBadge,\n ScrollArea,\n SectionLabel,\n StatusBadge,\n relativePath,\n} from './ui';\n\n// ─── Param fields ─────────────────────────────────────────────────────────────\n\ntype Param = { name: string; type: string; required: boolean; description?: string };\n\nfunction ParamFields({ label, params }: { label: string; params: Param[] }) {\n const { state, setParameters } = usePlaygroundContext();\n\n function handleChange(name: string, value: string) {\n setParameters({ ...state.parameters, [name]: value });\n }\n\n return (\n <div className=\"space-y-2\">\n <SectionLabel>{label}</SectionLabel>\n <div className=\"space-y-2\">\n {params.map((p) => {\n const value = state.parameters[p.name] ?? '';\n const placeholder = p.description || p.name;\n return (\n <div key={p.name} className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"font-mono text-[11px] text-foreground/80\">{p.name}</span>\n {p.required && (\n <span className=\"text-[9px] text-destructive font-bold leading-none\">*</span>\n )}\n <span className=\"font-mono text-[10px] text-muted-foreground/50\">{p.type}</span>\n </div>\n <Input\n value={value}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleChange(p.name, e.target.value)\n }\n placeholder={placeholder}\n className=\"h-8 text-xs font-mono\"\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ─── RequestPanel ─────────────────────────────────────────────────────────────\n\nexport function RequestPanel() {\n const {\n state,\n apiKeys,\n apiKeysLoading,\n setRequestBody,\n setRequestHeaders,\n setSelectedApiKey,\n setManualApiToken,\n sendRequest,\n } = usePlaygroundContext();\n\n // Pre-compute every per-key view-model so the JSX stays a flat\n // render — no boolean math in the markup.\n const apiKeyOptions: ComboboxOption[] = useMemo(\n () =>\n apiKeys.map((k) => ({\n value: k.id,\n label: k.name || 'Unnamed key',\n // Surface the first 8 chars of the secret so the user\n // can tell two similarly-named keys apart at a glance.\n description: k.secret\n ? `${k.secret.slice(0, 8)}…`\n : undefined,\n })),\n [apiKeys],\n );\n const hasApiKeys = apiKeyOptions.length > 0;\n\n const ep = state.selectedEndpoint;\n\n // ── Data (hooks must not be conditional) ─────────────────────────────────\n const isJsonValid = state.requestBody ? isValidJson(state.requestBody) : true;\n\n const curlCommand = useMemo(() => {\n if (!state.requestUrl) return '';\n const apiKey = state.selectedApiKey ? findApiKeyById(apiKeys, state.selectedApiKey) : null;\n const hdrs = parseRequestHeaders(state.requestHeaders);\n // Use ``secret`` (the raw key) for the cURL header — matches\n // what the playground sends over the wire. Fall back to\n // ``id`` for legacy callers still on the old ApiKey shape.\n if (apiKey) hdrs['X-API-Key'] = apiKey.secret || apiKey.id;\n let cmd = `curl -X ${state.requestMethod} \"${state.requestUrl}\"`;\n Object.entries(hdrs).forEach(([k, v]) => { cmd += ` \\\\\\n -H \"${k}: ${v}\"`; });\n if (state.requestBody && state.requestMethod !== 'GET' && isJsonValid) {\n cmd += ` \\\\\\n -d '${state.requestBody}'`;\n }\n return cmd;\n }, [state, apiKeys, isJsonValid]);\n\n const pathParams = useMemo(\n () => ep?.parameters?.filter((p) => ep.path.includes(`{${p.name}}`)) ?? [],\n [ep],\n );\n const queryParams = useMemo(\n () => ep?.parameters?.filter((p) => !ep.path.includes(`{${p.name}}`)) ?? [],\n [ep],\n );\n\n // ── Derived ───────────────────────────────────────────────────────────────\n const isSendDisabled = state.loading || !state.requestUrl || !isJsonValid;\n const displayUrl = state.requestUrl || ep?.path || '';\n const hasBody = ep?.method !== 'GET';\n const bodyType = ep?.requestBody?.type ?? '';\n const hasPathParams = pathParams.length > 0;\n const hasQueryParams = queryParams.length > 0;\n const hasCurl = Boolean(curlCommand);\n const epPath = ep ? relativePath(ep.path) : '';\n const urlChanged = displayUrl !== epPath;\n\n // ── Early return ──────────────────────────────────────────────────────────\n if (!ep) {\n return <EmptyState icon={Send} text=\"Select an endpoint to build a request\" />;\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n return (\n <>\n {/* Endpoint header */}\n <div className=\"shrink-0 border-b px-4 py-3 bg-muted/20 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <MethodBadge method={ep.method} />\n <span className=\"font-mono text-xs text-foreground/70 truncate min-w-0 flex-1\">{epPath}</span>\n <Button\n onClick={sendRequest}\n disabled={isSendDisabled}\n size=\"sm\"\n className=\"shrink-0 gap-1.5 h-7 text-xs px-3\"\n >\n {state.loading\n ? <><Loader2 className=\"h-3 w-3 animate-spin\" /> Sending…</>\n : <><Send className=\"h-3 w-3\" /> Send</>\n }\n </Button>\n </div>\n {urlChanged && (\n <div className=\"font-mono text-[10px] text-muted-foreground/50 break-all leading-snug pl-0.5\">\n {displayUrl}\n </div>\n )}\n </div>\n\n {/* Scrollable fields */}\n <ScrollArea className=\"px-4 py-3 space-y-3\">\n\n {hasPathParams && <ParamFields label=\"Path Parameters\" params={pathParams} />}\n {hasQueryParams && <ParamFields label=\"Query Parameters\" params={queryParams} />}\n\n {/* Body */}\n {hasBody && (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-baseline gap-2\">\n <SectionLabel>Body</SectionLabel>\n {bodyType && (\n <span className=\"text-[10px] text-muted-foreground/40 font-mono\">{bodyType}</span>\n )}\n </div>\n {isJsonValid && state.requestBody && (\n <button\n type=\"button\"\n onClick={() => {\n try {\n setRequestBody(JSON.stringify(JSON.parse(state.requestBody), null, 2));\n } catch {}\n }}\n className=\"inline-flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Sparkles className=\"h-2.5 w-2.5\" />\n Format\n </button>\n )}\n </div>\n <Textarea\n placeholder={'{\\n \"key\": \"value\"\\n}'}\n value={state.requestBody}\n onChange={(e) => setRequestBody(e.target.value)}\n className={cn(\n 'font-mono text-[11px] min-h-[90px] resize-y',\n !isJsonValid && 'border-destructive focus-visible:ring-destructive/30',\n )}\n rows={4}\n />\n {!isJsonValid && <p className=\"text-[10px] text-destructive\">Invalid JSON</p>}\n </div>\n )}\n\n {/* Auth & Headers — collapsed by default */}\n <CollapsibleSection\n label={\n <span className=\"inline-flex items-center gap-1\">\n <Key className=\"h-2.5 w-2.5\" />\n Auth & Headers\n </span>\n }\n >\n <div className=\"space-y-3 pt-2\">\n <div className=\"space-y-1.5\">\n <SectionLabel>API Key</SectionLabel>\n <Combobox\n options={apiKeyOptions}\n value={state.selectedApiKey ?? ''}\n onValueChange={(v) => setSelectedApiKey(v || null)}\n placeholder={\n apiKeysLoading\n ? 'Loading keys…'\n : hasApiKeys\n ? 'Select an API key'\n : 'No API keys yet'\n }\n searchPlaceholder=\"Search keys…\"\n emptyText=\"No matching key\"\n disabled={apiKeysLoading || !hasApiKeys}\n className=\"h-8\"\n />\n <p className=\"text-[10px] text-muted-foreground\">\n Picks are sent via the{' '}\n <span className=\"font-mono\">X-API-Key</span> header.\n </p>\n </div>\n <div className=\"space-y-1.5\">\n <SectionLabel>Bearer Token</SectionLabel>\n <Input\n type=\"password\"\n placeholder=\"Leave empty to use JWT from localStorage\"\n value={state.manualApiToken}\n onChange={(e) => setManualApiToken(e.target.value)}\n className=\"font-mono text-xs h-8\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <SectionLabel>Headers</SectionLabel>\n <Textarea\n value={state.requestHeaders}\n onChange={(e) => setRequestHeaders(e.target.value)}\n className=\"font-mono text-[11px] min-h-[60px] resize-y\"\n rows={3}\n />\n </div>\n </div>\n </CollapsibleSection>\n\n {/* cURL — collapsed by default */}\n {hasCurl && (\n <CollapsibleSection\n label={\n <span className=\"inline-flex items-center gap-1\">\n <Terminal className=\"h-2.5 w-2.5\" />\n cURL\n </span>\n }\n action={\n <CopyButton value={curlCommand} variant=\"ghost\" size=\"sm\" className=\"h-5 px-2 text-[10px] text-muted-foreground\">\n Copy\n </CopyButton>\n }\n >\n <div className=\"rounded-md overflow-hidden mt-2\">\n <PrettyCode data={curlCommand} language=\"bash\" isCompact />\n </div>\n </CollapsibleSection>\n )}\n\n <div className=\"h-1\" />\n </ScrollArea>\n\n {/* Send footer */}\n <div className=\"shrink-0 border-t px-4 py-3 bg-background/95 backdrop-blur-sm\">\n <Button onClick={sendRequest} disabled={isSendDisabled} size=\"sm\" className=\"w-full gap-2 h-9\">\n {state.loading\n ? <><Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> Sending…</>\n : <><Send className=\"h-3.5 w-3.5\" /> Send Request</>\n }\n </Button>\n </div>\n </>\n );\n}\n","'use client';\n\nimport { Loader2, Send, Terminal, WifiOff } from 'lucide-react';\nimport { useMemo } from 'react';\n\nimport { CopyButton } from '@djangocfg/ui-core/components';\n\nimport JsonTree from '../../../JsonTree';\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { EmptyState, ScrollArea, StatusBadge } from './ui';\n\n// ─── JsonTree config (static, no re-creation on render) ──────────────────────\n\nconst JSON_TREE_CONFIG = {\n maxAutoExpandDepth: 2,\n maxAutoExpandArrayItems: 10,\n maxAutoExpandObjectKeys: 5,\n maxStringLength: 200,\n collectionLimit: 50,\n showCollectionInfo: true,\n showExpandControls: true,\n showActionButtons: false,\n preserveKeyOrder: true,\n className: 'border-0 rounded-none',\n} as const;\n\n// ─── ResponsePanel ────────────────────────────────────────────────────────────\n\nexport function ResponsePanel() {\n const { state } = usePlaygroundContext();\n const { response, loading, selectedEndpoint } = state;\n\n // ── Normalise response data ───────────────────────────────────────────────\n // Always try to parse as JSON first so JsonTree gets an object, not a string.\n // Falls back to raw text for non-JSON responses (HTML errors, plain text, etc.)\n const { treeData, rawText } = useMemo(() => {\n const d = response?.data;\n if (d == null) return { treeData: null, rawText: '' };\n\n if (typeof d === 'string') {\n try {\n return { treeData: JSON.parse(d), rawText: d };\n } catch {\n return { treeData: null, rawText: d };\n }\n }\n\n return { treeData: d, rawText: JSON.stringify(d, null, 2) };\n }, [response?.data]);\n\n // ── Derived ───────────────────────────────────────────────────────────────\n const sizeKb = rawText ? `${(rawText.length / 1024).toFixed(1)} KB` : '';\n const duration = response?.duration != null ? `${response.duration}ms` : '';\n const hasError = Boolean(response?.error);\n const hasStatus = response?.status != null;\n const hasCopy = Boolean(rawText);\n\n // ── Early returns ─────────────────────────────────────────────────────────\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">Sending…</span>\n </div>\n );\n }\n\n if (!selectedEndpoint) return <EmptyState icon={Terminal} text=\"Response will appear here\" />;\n if (!response) return <EmptyState icon={Send} text='Press \"Send Request\" to see the response' />;\n\n // Pure network error (no HTTP response at all — CORS, offline, timeout)\n if (hasError && !hasStatus) {\n return (\n <EmptyState\n icon={WifiOff}\n text={response.error!}\n className=\"text-destructive [&_svg]:text-destructive\"\n />\n );\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n return (\n <>\n {/* Status bar */}\n <div className=\"shrink-0 border-b px-4 py-2 flex items-center justify-between gap-3 bg-muted/20\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {hasStatus && <StatusBadge status={response.status!} />}\n {response.statusText && (\n <span className=\"text-xs text-muted-foreground truncate\">{response.statusText}</span>\n )}\n {sizeKb && (\n <span className=\"text-[10px] text-muted-foreground/50 tabular-nums shrink-0\">{sizeKb}</span>\n )}\n {duration && (\n <span className=\"text-[10px] text-muted-foreground/50 tabular-nums shrink-0\">{duration}</span>\n )}\n </div>\n {hasCopy && (\n <CopyButton value={rawText} variant=\"ghost\" size=\"sm\" className=\"h-6 px-2 text-[10px] text-muted-foreground shrink-0\">\n Copy\n </CopyButton>\n )}\n </div>\n\n {/* HTTP-level error body (4xx/5xx — has status but also error flag) */}\n {hasError && (\n <div className=\"shrink-0 mx-4 mt-3 rounded border border-destructive/20 bg-destructive/5 px-3 py-2\">\n <p className=\"text-xs text-destructive\">{response.error}</p>\n </div>\n )}\n\n {/* Body */}\n <ScrollArea>\n {treeData != null ? (\n <JsonTree title=\"Response Body\" data={treeData} config={JSON_TREE_CONFIG} />\n ) : rawText ? (\n <pre className=\"p-4 text-[11px] font-mono text-foreground/70 whitespace-pre-wrap break-all leading-relaxed\">\n {rawText}\n </pre>\n ) : (\n <div className=\"py-10 text-center text-xs text-muted-foreground\">Empty response body</div>\n )}\n </ScrollArea>\n </>\n );\n}\n","'use client';\n\nimport React from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useMobile } from '../../hooks/useMobile';\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { EndpointList } from './EndpointList';\nimport { RequestPanel } from './RequestPanel';\nimport { ResponsePanel } from './ResponsePanel';\nimport { Panel, PanelHeader } from './ui';\n\n// ─── Mobile tab layout ────────────────────────────────────────────────────────\n\ntype MobileTab = 'endpoints' | 'request' | 'response';\n\nconst MOBILE_TABS: { id: MobileTab; label: string }[] = [\n { id: 'endpoints', label: 'Endpoints' },\n { id: 'request', label: 'Request' },\n { id: 'response', label: 'Response' },\n];\n\nfunction MobileView() {\n const { state } = usePlaygroundContext();\n const [tab, setTab] = React.useState<MobileTab>('endpoints');\n\n React.useEffect(() => {\n if (state.selectedEndpoint) setTab('request');\n }, [state.selectedEndpoint?.path, state.selectedEndpoint?.method]);\n\n React.useEffect(() => {\n if (state.response && !state.loading) setTab('response');\n }, [state.response, state.loading]);\n\n const hasResponse = Boolean(state.response) && !state.loading;\n\n return (\n <Panel className=\"h-full\">\n <div className=\"shrink-0 flex border-b\">\n {MOBILE_TABS.map((t) => {\n const isActive = tab === t.id;\n const showDot = t.id === 'response' && hasResponse;\n return (\n <button\n key={t.id}\n onClick={() => setTab(t.id)}\n className={cn(\n 'flex-1 py-2.5 text-xs font-medium transition-colors border-b-2 -mb-px relative',\n isActive\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground',\n )}\n >\n {t.label}\n {showDot && (\n <span className=\"absolute top-2 right-[calc(50%-16px)] h-1.5 w-1.5 rounded-full bg-primary\" />\n )}\n </button>\n );\n })}\n </div>\n\n <Panel className=\"flex-1\">\n {tab === 'endpoints' && <EndpointList />}\n {tab === 'request' && <RequestPanel />}\n {tab === 'response' && <ResponsePanel />}\n </Panel>\n </Panel>\n );\n}\n\n// ─── Desktop 3-column layout ─────────────────────────────────────────────────\n\nfunction DesktopView() {\n return (\n <div className=\"grid grid-cols-[260px_1fr_1fr] divide-x h-full min-h-0 overflow-hidden\">\n <Panel>\n <PanelHeader title=\"Endpoints\" />\n <EndpointList />\n </Panel>\n <Panel>\n <PanelHeader title=\"Request\" />\n <RequestPanel />\n </Panel>\n <Panel>\n <PanelHeader title=\"Response\" />\n <ResponsePanel />\n </Panel>\n </div>\n );\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nexport const PlaygroundLayout: React.FC = () => {\n const { isMobile } = useMobile();\n\n return (\n <div\n className=\"flex flex-col overflow-hidden\"\n style={{ height: 'calc(100dvh - var(--navbar-height, 64px))' }}\n >\n {isMobile ? <MobileView /> : <DesktopView />}\n </div>\n );\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/PrettyCode/PrettyCode.client.tsx"],"names":["className"],"mappings":"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","file":"PrettyCode.client-DW5LTG47.mjs","sourcesContent":["'use client';\n\nimport { Highlight, Language, themes } from 'prism-react-renderer';\nimport React, { useMemo, useRef } from 'react';\n\nimport { useAppT } from '@djangocfg/i18n';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\nimport { FloatingToolbar } from '../../components/FloatingToolbar';\nimport { CopyAction } from '../../components/FloatingToolbar/actions';\n\ninterface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string; // Custom background class\n isCompact?: boolean; // Compact mode for smaller font sizes\n scrollIsolation?: boolean; // Block scroll capture until user clicks (default: true)\n}\n\nconst PrettyCode = ({ data, language, className, mode, inline = false, customBg, isCompact = false, scrollIsolation }: PrettyCodeProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const t = useAppT();\n const detectedTheme = useResolvedTheme();\n\n const labels = useMemo(() => ({\n copyCode: t('tools.code.copyCode'),\n noContent: t('tools.code.noContent'),\n }), [t]);\n\n // Font size based on compact mode\n const fontSize = isCompact ? '0.75rem' : '0.875rem'; // 12px vs 14px\n\n // Use provided mode or fall back to detected theme\n const currentTheme = mode || detectedTheme;\n const isDarkMode = currentTheme === 'dark';\n\n // Select the Prism theme based on the current theme\n const prismTheme = isDarkMode ? themes.vsDark : themes.vsLight;\n\n // Convert form object to JSON string with proper formatting\n const contentJson = typeof data === 'string' ? data : JSON.stringify(data || {}, null, 2);\n \n // Handle empty content\n if (!contentJson || contentJson.trim() === '') {\n const emptyBgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const emptyBorderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n return (\n <div className={`relative h-full ${emptyBgClass} rounded-sm border ${emptyBorderClass} ${className || ''}`}>\n <div className=\"h-full overflow-auto p-4\">\n <p className=\"text-muted-foreground text-sm italic\">{labels.noContent}</p>\n </div>\n </div>\n );\n }\n\n // Get display name for language badge\n const getLanguageDisplayName = (lang: string): string => {\n switch (lang.toLowerCase()) {\n case 'bash':\n case 'shell':\n return 'Bash';\n case 'python':\n case 'py':\n return 'Python';\n case 'javascript':\n case 'js':\n return 'JavaScript';\n case 'typescript':\n case 'ts':\n return 'TypeScript';\n case 'json':\n return 'JSON';\n case 'yaml':\n case 'yml':\n return 'YAML';\n case 'html':\n return 'HTML';\n case 'css':\n return 'CSS';\n case 'sql':\n return 'SQL';\n case 'xml':\n return 'XML';\n case 'markdown':\n case 'md':\n return 'Markdown';\n case 'plaintext':\n case 'text':\n return 'Text';\n case 'mermaid':\n return 'Mermaid';\n default:\n return lang.charAt(0).toUpperCase() + lang.slice(1);\n }\n };\n\n // Normalize language for Prism - use only basic supported languages\n const normalizedLanguage = (() => {\n const lang = language.toLowerCase();\n \n // Try basic languages that are definitely supported\n switch (lang) {\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'typescript':\n case 'ts':\n return 'typescript'; // Try TypeScript first\n case 'python':\n case 'py':\n return 'python';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n case 'html':\n return 'markup';\n case 'xml':\n return 'markup';\n case 'bash':\n case 'shell':\n return 'bash';\n case 'sql':\n return 'sql';\n case 'yaml':\n case 'yml':\n return 'yaml';\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'mermaid':\n return 'text'; // Mermaid is handled separately in MarkdownMessage\n default:\n // For unknown languages, try to use the original name first\n // If it doesn't work, Prism will fallback to plain text\n return lang || 'text';\n }\n })();\n\n const displayLanguage = getLanguageDisplayName(language);\n\n if (inline) {\n const inlineBgClass = customBg || (isDarkMode ? 'bg-zinc-800' : 'bg-zinc-100');\n return (\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getTokenProps }) => (\n <code\n className={`${className} ${inlineBgClass} px-2 py-1 rounded ${isCompact ? 'text-xs' : 'text-sm'} font-mono inline-block`}\n style={{\n ...style,\n fontSize,\n fontFamily: 'monospace',\n }}\n >\n {tokens.map((line) => (\n line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))\n ))}\n </code>\n )}\n </Highlight>\n );\n }\n\n // Different backgrounds for dark/light - light mode uses white for better contrast with vsLight theme\n const bgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const borderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n\n return (\n <div ref={containerRef} className={`group relative h-full ${bgClass} rounded-lg border ${borderClass} ${className || ''}`}>\n {/* Toolbar: hidden by default, appears on hover. Absolute overlay so it doesn't shift layout. */}\n <div className=\"absolute inset-0 pointer-events-none opacity-0 group-hover:opacity-100 transition-opacity duration-150 z-30\">\n <div className=\"pointer-events-auto\">\n <FloatingToolbar\n containerRef={containerRef}\n scrollIsolation={scrollIsolation}\n label={\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-muted/80 text-muted-foreground border border-border/50 backdrop-blur-sm\">\n {displayLanguage}\n </span>\n }\n >\n <CopyAction value={contentJson} title={labels.copyCode} />\n </FloatingToolbar>\n </div>\n </div>\n\n <div className=\"h-full overflow-auto\">\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getLineProps, getTokenProps }) => {\n // Remove background from Prism theme - we use our own via CSS\n const { backgroundColor: _bg, ...restStyle } = style;\n return (\n <pre\n className={`${className} rounded-lg`}\n style={{\n ...restStyle,\n margin: 0,\n padding: '2.5rem 1rem 1rem 1rem',\n fontSize,\n lineHeight: isCompact ? 1.4 : 1.5,\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n }}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}}\n </Highlight>\n </div>\n </div>\n );\n};\n\nexport default PrettyCode; "]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/PrettyCode/PrettyCode.client.tsx"],"names":["__name","useRef","useAppT","useResolvedTheme","useMemo","themes","jsx","Highlight","className","jsxs","FloatingToolbar","CopyAction"],"mappings":"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","file":"PrettyCode.client-SGDGQTYT.cjs","sourcesContent":["'use client';\n\nimport { Highlight, Language, themes } from 'prism-react-renderer';\nimport React, { useMemo, useRef } from 'react';\n\nimport { useAppT } from '@djangocfg/i18n';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\nimport { FloatingToolbar } from '../../components/FloatingToolbar';\nimport { CopyAction } from '../../components/FloatingToolbar/actions';\n\ninterface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string; // Custom background class\n isCompact?: boolean; // Compact mode for smaller font sizes\n scrollIsolation?: boolean; // Block scroll capture until user clicks (default: true)\n}\n\nconst PrettyCode = ({ data, language, className, mode, inline = false, customBg, isCompact = false, scrollIsolation }: PrettyCodeProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const t = useAppT();\n const detectedTheme = useResolvedTheme();\n\n const labels = useMemo(() => ({\n copyCode: t('tools.code.copyCode'),\n noContent: t('tools.code.noContent'),\n }), [t]);\n\n // Font size based on compact mode\n const fontSize = isCompact ? '0.75rem' : '0.875rem'; // 12px vs 14px\n\n // Use provided mode or fall back to detected theme\n const currentTheme = mode || detectedTheme;\n const isDarkMode = currentTheme === 'dark';\n\n // Select the Prism theme based on the current theme\n const prismTheme = isDarkMode ? themes.vsDark : themes.vsLight;\n\n // Convert form object to JSON string with proper formatting\n const contentJson = typeof data === 'string' ? data : JSON.stringify(data || {}, null, 2);\n \n // Handle empty content\n if (!contentJson || contentJson.trim() === '') {\n const emptyBgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const emptyBorderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n return (\n <div className={`relative h-full ${emptyBgClass} rounded-sm border ${emptyBorderClass} ${className || ''}`}>\n <div className=\"h-full overflow-auto p-4\">\n <p className=\"text-muted-foreground text-sm italic\">{labels.noContent}</p>\n </div>\n </div>\n );\n }\n\n // Get display name for language badge\n const getLanguageDisplayName = (lang: string): string => {\n switch (lang.toLowerCase()) {\n case 'bash':\n case 'shell':\n return 'Bash';\n case 'python':\n case 'py':\n return 'Python';\n case 'javascript':\n case 'js':\n return 'JavaScript';\n case 'typescript':\n case 'ts':\n return 'TypeScript';\n case 'json':\n return 'JSON';\n case 'yaml':\n case 'yml':\n return 'YAML';\n case 'html':\n return 'HTML';\n case 'css':\n return 'CSS';\n case 'sql':\n return 'SQL';\n case 'xml':\n return 'XML';\n case 'markdown':\n case 'md':\n return 'Markdown';\n case 'plaintext':\n case 'text':\n return 'Text';\n case 'mermaid':\n return 'Mermaid';\n default:\n return lang.charAt(0).toUpperCase() + lang.slice(1);\n }\n };\n\n // Normalize language for Prism - use only basic supported languages\n const normalizedLanguage = (() => {\n const lang = language.toLowerCase();\n \n // Try basic languages that are definitely supported\n switch (lang) {\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'typescript':\n case 'ts':\n return 'typescript'; // Try TypeScript first\n case 'python':\n case 'py':\n return 'python';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n case 'html':\n return 'markup';\n case 'xml':\n return 'markup';\n case 'bash':\n case 'shell':\n return 'bash';\n case 'sql':\n return 'sql';\n case 'yaml':\n case 'yml':\n return 'yaml';\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'mermaid':\n return 'text'; // Mermaid is handled separately in MarkdownMessage\n default:\n // For unknown languages, try to use the original name first\n // If it doesn't work, Prism will fallback to plain text\n return lang || 'text';\n }\n })();\n\n const displayLanguage = getLanguageDisplayName(language);\n\n if (inline) {\n const inlineBgClass = customBg || (isDarkMode ? 'bg-zinc-800' : 'bg-zinc-100');\n return (\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getTokenProps }) => (\n <code\n className={`${className} ${inlineBgClass} px-2 py-1 rounded ${isCompact ? 'text-xs' : 'text-sm'} font-mono inline-block`}\n style={{\n ...style,\n fontSize,\n fontFamily: 'monospace',\n }}\n >\n {tokens.map((line) => (\n line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))\n ))}\n </code>\n )}\n </Highlight>\n );\n }\n\n // Different backgrounds for dark/light - light mode uses white for better contrast with vsLight theme\n const bgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const borderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n\n return (\n <div ref={containerRef} className={`group relative h-full ${bgClass} rounded-lg border ${borderClass} ${className || ''}`}>\n {/* Toolbar: hidden by default, appears on hover. Absolute overlay so it doesn't shift layout. */}\n <div className=\"absolute inset-0 pointer-events-none opacity-0 group-hover:opacity-100 transition-opacity duration-150 z-30\">\n <div className=\"pointer-events-auto\">\n <FloatingToolbar\n containerRef={containerRef}\n scrollIsolation={scrollIsolation}\n label={\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-muted/80 text-muted-foreground border border-border/50 backdrop-blur-sm\">\n {displayLanguage}\n </span>\n }\n >\n <CopyAction value={contentJson} title={labels.copyCode} />\n </FloatingToolbar>\n </div>\n </div>\n\n <div className=\"h-full overflow-auto\">\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getLineProps, getTokenProps }) => {\n // Remove background from Prism theme - we use our own via CSS\n const { backgroundColor: _bg, ...restStyle } = style;\n return (\n <pre\n className={`${className} rounded-lg`}\n style={{\n ...restStyle,\n margin: 0,\n padding: '2.5rem 1rem 1rem 1rem',\n fontSize,\n lineHeight: isCompact ? 1.4 : 1.5,\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n }}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}}\n </Highlight>\n </div>\n </div>\n );\n};\n\nexport default PrettyCode; "]}
|
package/dist/chunk-5FKE7OME.cjs
DELETED
|
@@ -1,369 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
|
|
4
|
-
var React2 = require('react');
|
|
5
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
var consola = require('consola');
|
|
7
|
-
|
|
8
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
-
|
|
10
|
-
var React2__default = /*#__PURE__*/_interopDefault(React2);
|
|
11
|
-
var consola__default = /*#__PURE__*/_interopDefault(consola);
|
|
12
|
-
|
|
13
|
-
var PrettyCodeClient = React2.lazy(() => import('./PrettyCode.client-SGDGQTYT.cjs'));
|
|
14
|
-
var LoadingFallback = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
15
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20" }),
|
|
16
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Loading code..." })
|
|
17
|
-
] }) }) }), "LoadingFallback");
|
|
18
|
-
var PrettyCode = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((props) => {
|
|
19
|
-
return /* @__PURE__ */ jsxRuntime.jsx(React2.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx(LoadingFallback, {}), children: /* @__PURE__ */ jsxRuntime.jsx(PrettyCodeClient, { ...props }) });
|
|
20
|
-
}, "PrettyCode");
|
|
21
|
-
var PrettyCode_default = PrettyCode;
|
|
22
|
-
|
|
23
|
-
// src/tools/OpenapiViewer/utils/apiKeyManager.ts
|
|
24
|
-
function findApiKeyById(apiKeys, keyId) {
|
|
25
|
-
return apiKeys.find((key) => key.id === keyId) || null;
|
|
26
|
-
}
|
|
27
|
-
chunkWGEGR3DF_cjs.__name(findApiKeyById, "findApiKeyById");
|
|
28
|
-
|
|
29
|
-
// src/tools/OpenapiViewer/utils/versionManager.ts
|
|
30
|
-
var API_VERSIONS = [
|
|
31
|
-
{
|
|
32
|
-
id: "v1",
|
|
33
|
-
name: "v1",
|
|
34
|
-
description: "Current stable version",
|
|
35
|
-
isDefault: true
|
|
36
|
-
}
|
|
37
|
-
];
|
|
38
|
-
var detectEndpointVersion = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((path) => {
|
|
39
|
-
const versionMatch = path.match(/\/api\/[^/]+\/(v\d+)\//);
|
|
40
|
-
if (versionMatch && versionMatch[1]) {
|
|
41
|
-
return versionMatch[1];
|
|
42
|
-
}
|
|
43
|
-
return "v1";
|
|
44
|
-
}, "detectEndpointVersion");
|
|
45
|
-
var isEndpointInVersion = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((endpoint, version) => {
|
|
46
|
-
const endpointVersion = detectEndpointVersion(endpoint.path);
|
|
47
|
-
return endpointVersion === version;
|
|
48
|
-
}, "isEndpointInVersion");
|
|
49
|
-
var deduplicateEndpoints = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((endpoints, preferredVersion) => {
|
|
50
|
-
const endpointMap = /* @__PURE__ */ new Map();
|
|
51
|
-
const groupedEndpoints = /* @__PURE__ */ new Map();
|
|
52
|
-
endpoints.forEach((endpoint) => {
|
|
53
|
-
const normalizedPath = normalizeEndpointPath(endpoint.path);
|
|
54
|
-
if (!groupedEndpoints.has(normalizedPath)) {
|
|
55
|
-
groupedEndpoints.set(normalizedPath, []);
|
|
56
|
-
}
|
|
57
|
-
groupedEndpoints.get(normalizedPath).push(endpoint);
|
|
58
|
-
});
|
|
59
|
-
groupedEndpoints.forEach((endpointGroup, normalizedPath) => {
|
|
60
|
-
let selectedEndpoint = null;
|
|
61
|
-
const versionEndpoint = endpointGroup.find((ep) => isEndpointInVersion(ep, preferredVersion));
|
|
62
|
-
if (versionEndpoint) {
|
|
63
|
-
selectedEndpoint = versionEndpoint;
|
|
64
|
-
} else if (endpointGroup.length > 0) {
|
|
65
|
-
selectedEndpoint = endpointGroup[0] || null;
|
|
66
|
-
}
|
|
67
|
-
if (selectedEndpoint) {
|
|
68
|
-
endpointMap.set(normalizedPath, selectedEndpoint);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
return Array.from(endpointMap.values());
|
|
72
|
-
}, "deduplicateEndpoints");
|
|
73
|
-
var normalizeEndpointPath = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((path) => {
|
|
74
|
-
return path.replace(/\/v\d+\//, "/");
|
|
75
|
-
}, "normalizeEndpointPath");
|
|
76
|
-
var getDefaultVersion = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => {
|
|
77
|
-
const defaultVersion = API_VERSIONS.find((v) => v.isDefault);
|
|
78
|
-
if (defaultVersion) {
|
|
79
|
-
return defaultVersion;
|
|
80
|
-
}
|
|
81
|
-
if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {
|
|
82
|
-
return API_VERSIONS[0];
|
|
83
|
-
}
|
|
84
|
-
throw new Error("No API versions defined");
|
|
85
|
-
}, "getDefaultVersion");
|
|
86
|
-
|
|
87
|
-
// src/tools/OpenapiViewer/utils/formatters.ts
|
|
88
|
-
var isValidJson = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((str) => {
|
|
89
|
-
if (!str || typeof str !== "string") return false;
|
|
90
|
-
try {
|
|
91
|
-
JSON.parse(str);
|
|
92
|
-
return true;
|
|
93
|
-
} catch {
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
}, "isValidJson");
|
|
97
|
-
var parseRequestHeaders = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((headersString) => {
|
|
98
|
-
if (!headersString || typeof headersString !== "string") {
|
|
99
|
-
return { "Content-Type": "application/json" };
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
const parsed = JSON.parse(headersString);
|
|
103
|
-
return typeof parsed === "object" && parsed !== null ? parsed : { "Content-Type": "application/json" };
|
|
104
|
-
} catch {
|
|
105
|
-
return { "Content-Type": "application/json" };
|
|
106
|
-
}
|
|
107
|
-
}, "parseRequestHeaders");
|
|
108
|
-
var substituteUrlParameters = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((url, parameters) => {
|
|
109
|
-
let substitutedUrl = url;
|
|
110
|
-
Object.entries(parameters).forEach(([key, value]) => {
|
|
111
|
-
if (value && value.trim() !== "") {
|
|
112
|
-
const patterns = [
|
|
113
|
-
new RegExp(`\\{${key}\\}`, "g"),
|
|
114
|
-
new RegExp(`%7B${key}%7D`, "gi")
|
|
115
|
-
];
|
|
116
|
-
patterns.forEach((pattern) => {
|
|
117
|
-
substitutedUrl = substitutedUrl.replace(pattern, encodeURIComponent(value));
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
return substitutedUrl;
|
|
122
|
-
}, "substituteUrlParameters");
|
|
123
|
-
var createInitialState = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => ({
|
|
124
|
-
currentStep: "endpoints",
|
|
125
|
-
steps: ["endpoints", "request", "response"],
|
|
126
|
-
selectedEndpoint: null,
|
|
127
|
-
selectedCategory: "All",
|
|
128
|
-
searchTerm: "",
|
|
129
|
-
selectedVersion: getDefaultVersion().id,
|
|
130
|
-
requestUrl: "",
|
|
131
|
-
requestMethod: "GET",
|
|
132
|
-
requestHeaders: '{\n "Content-Type": "application/json"\n}',
|
|
133
|
-
requestBody: "",
|
|
134
|
-
selectedApiKey: null,
|
|
135
|
-
manualApiToken: "",
|
|
136
|
-
parameters: {},
|
|
137
|
-
response: null,
|
|
138
|
-
loading: false,
|
|
139
|
-
sidebarOpen: false
|
|
140
|
-
}), "createInitialState");
|
|
141
|
-
function reducer(state, action) {
|
|
142
|
-
switch (action.type) {
|
|
143
|
-
case "SET_STEP":
|
|
144
|
-
return { ...state, currentStep: action.step };
|
|
145
|
-
case "NEXT_STEP": {
|
|
146
|
-
const i = state.steps.indexOf(state.currentStep);
|
|
147
|
-
return i < state.steps.length - 1 ? { ...state, currentStep: state.steps[i + 1] } : state;
|
|
148
|
-
}
|
|
149
|
-
case "PREV_STEP": {
|
|
150
|
-
const i = state.steps.indexOf(state.currentStep);
|
|
151
|
-
return i > 0 ? { ...state, currentStep: state.steps[i - 1] } : state;
|
|
152
|
-
}
|
|
153
|
-
case "SELECT_ENDPOINT":
|
|
154
|
-
if (!action.endpoint) return { ...state, selectedEndpoint: null };
|
|
155
|
-
return {
|
|
156
|
-
...state,
|
|
157
|
-
selectedEndpoint: action.endpoint,
|
|
158
|
-
requestMethod: action.endpoint.method,
|
|
159
|
-
requestUrl: action.endpoint.path,
|
|
160
|
-
parameters: {},
|
|
161
|
-
currentStep: "request"
|
|
162
|
-
};
|
|
163
|
-
case "SET_CATEGORY":
|
|
164
|
-
return { ...state, selectedCategory: action.category };
|
|
165
|
-
case "SET_SEARCH":
|
|
166
|
-
return { ...state, searchTerm: action.term };
|
|
167
|
-
case "SET_VERSION":
|
|
168
|
-
return { ...state, selectedVersion: action.version };
|
|
169
|
-
case "SET_REQUEST_URL":
|
|
170
|
-
return { ...state, requestUrl: action.url };
|
|
171
|
-
case "SET_REQUEST_METHOD":
|
|
172
|
-
return { ...state, requestMethod: action.method };
|
|
173
|
-
case "SET_REQUEST_HEADERS":
|
|
174
|
-
return { ...state, requestHeaders: action.headers };
|
|
175
|
-
case "SET_REQUEST_BODY":
|
|
176
|
-
return { ...state, requestBody: action.body };
|
|
177
|
-
case "SET_API_KEY":
|
|
178
|
-
return { ...state, selectedApiKey: action.apiKeyId };
|
|
179
|
-
case "SET_MANUAL_TOKEN":
|
|
180
|
-
return { ...state, manualApiToken: action.token };
|
|
181
|
-
case "SET_PARAMETERS":
|
|
182
|
-
return { ...state, parameters: action.parameters };
|
|
183
|
-
case "SET_RESPONSE":
|
|
184
|
-
return { ...state, response: action.response };
|
|
185
|
-
case "SET_LOADING":
|
|
186
|
-
return { ...state, loading: action.loading };
|
|
187
|
-
case "REQUEST_START":
|
|
188
|
-
return { ...state, loading: true, response: null };
|
|
189
|
-
case "REQUEST_SUCCESS":
|
|
190
|
-
return { ...state, loading: false, response: action.response, currentStep: "response" };
|
|
191
|
-
case "REQUEST_ERROR":
|
|
192
|
-
return { ...state, loading: false, response: action.response };
|
|
193
|
-
case "SET_SIDEBAR":
|
|
194
|
-
return { ...state, sidebarOpen: action.open };
|
|
195
|
-
case "SYNC_API_KEY_HEADER":
|
|
196
|
-
return { ...state, requestHeaders: action.headers };
|
|
197
|
-
case "CLEAR_API_KEY_SELECTION":
|
|
198
|
-
return { ...state, selectedApiKey: null };
|
|
199
|
-
case "SYNC_URL":
|
|
200
|
-
return { ...state, requestUrl: action.url };
|
|
201
|
-
case "RESET":
|
|
202
|
-
return createInitialState();
|
|
203
|
-
default:
|
|
204
|
-
return state;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
chunkWGEGR3DF_cjs.__name(reducer, "reducer");
|
|
208
|
-
var PlaygroundContext = React2.createContext(void 0);
|
|
209
|
-
var usePlaygroundContext = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => {
|
|
210
|
-
const context = React2.useContext(PlaygroundContext);
|
|
211
|
-
if (!context) throw new Error("usePlaygroundContext must be used within a PlaygroundProvider");
|
|
212
|
-
return context;
|
|
213
|
-
}, "usePlaygroundContext");
|
|
214
|
-
var PlaygroundProvider = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ children, config }) => {
|
|
215
|
-
const [state, dispatch] = React2.useReducer(reducer, void 0, createInitialState);
|
|
216
|
-
const abortControllerRef = React2.useRef(null);
|
|
217
|
-
const apiKeys = React2__default.default.useMemo(
|
|
218
|
-
() => config.apiKeys ?? [],
|
|
219
|
-
[config.apiKeys]
|
|
220
|
-
);
|
|
221
|
-
const isLoadingApiKeys = config.apiKeysLoading ?? false;
|
|
222
|
-
React2.useEffect(() => {
|
|
223
|
-
if (!isLoadingApiKeys && apiKeys.length > 0 && !state.selectedApiKey) {
|
|
224
|
-
dispatch({ type: "SET_API_KEY", apiKeyId: apiKeys[0]?.id || null });
|
|
225
|
-
}
|
|
226
|
-
}, [apiKeys, isLoadingApiKeys, state.selectedApiKey]);
|
|
227
|
-
React2.useEffect(() => {
|
|
228
|
-
try {
|
|
229
|
-
const headers = parseRequestHeaders(state.requestHeaders);
|
|
230
|
-
if (state.selectedApiKey) {
|
|
231
|
-
const apiKey = apiKeys.find((k) => k.id === state.selectedApiKey);
|
|
232
|
-
if (!apiKey) {
|
|
233
|
-
dispatch({ type: "CLEAR_API_KEY_SELECTION" });
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
const keyValue = apiKey.secret || apiKey.id;
|
|
237
|
-
if (headers["X-API-Key"] !== keyValue) {
|
|
238
|
-
headers["X-API-Key"] = keyValue;
|
|
239
|
-
dispatch({ type: "SYNC_API_KEY_HEADER", headers: JSON.stringify(headers, null, 2) });
|
|
240
|
-
}
|
|
241
|
-
} else if (headers["X-API-Key"]) {
|
|
242
|
-
delete headers["X-API-Key"];
|
|
243
|
-
dispatch({ type: "SYNC_API_KEY_HEADER", headers: JSON.stringify(headers, null, 2) });
|
|
244
|
-
}
|
|
245
|
-
} catch (error) {
|
|
246
|
-
consola__default.default.error("Error updating headers:", error);
|
|
247
|
-
}
|
|
248
|
-
}, [state.selectedApiKey, apiKeys]);
|
|
249
|
-
React2.useEffect(() => {
|
|
250
|
-
if (!state.selectedEndpoint) return;
|
|
251
|
-
const updated = substituteUrlParameters(state.selectedEndpoint.path, state.parameters);
|
|
252
|
-
if (updated !== state.requestUrl) {
|
|
253
|
-
dispatch({ type: "SYNC_URL", url: updated });
|
|
254
|
-
}
|
|
255
|
-
}, [state.parameters, state.selectedEndpoint]);
|
|
256
|
-
const setCurrentStep = React2.useCallback((step) => dispatch({ type: "SET_STEP", step }), []);
|
|
257
|
-
const goToNextStep = React2.useCallback(() => dispatch({ type: "NEXT_STEP" }), []);
|
|
258
|
-
const goToPreviousStep = React2.useCallback(() => dispatch({ type: "PREV_STEP" }), []);
|
|
259
|
-
const setSelectedEndpoint = React2.useCallback((endpoint) => dispatch({ type: "SELECT_ENDPOINT", endpoint }), []);
|
|
260
|
-
const setSelectedCategory = React2.useCallback((category) => dispatch({ type: "SET_CATEGORY", category }), []);
|
|
261
|
-
const setSearchTerm = React2.useCallback((term) => dispatch({ type: "SET_SEARCH", term }), []);
|
|
262
|
-
const setSelectedVersion = React2.useCallback((version) => dispatch({ type: "SET_VERSION", version }), []);
|
|
263
|
-
const setRequestUrl = React2.useCallback((url) => dispatch({ type: "SET_REQUEST_URL", url }), []);
|
|
264
|
-
const setRequestMethod = React2.useCallback((method) => dispatch({ type: "SET_REQUEST_METHOD", method }), []);
|
|
265
|
-
const setRequestHeaders = React2.useCallback((headers) => dispatch({ type: "SET_REQUEST_HEADERS", headers }), []);
|
|
266
|
-
const setRequestBody = React2.useCallback((body) => dispatch({ type: "SET_REQUEST_BODY", body }), []);
|
|
267
|
-
const setSelectedApiKey = React2.useCallback((apiKeyId) => dispatch({ type: "SET_API_KEY", apiKeyId }), []);
|
|
268
|
-
const setManualApiToken = React2.useCallback((token) => dispatch({ type: "SET_MANUAL_TOKEN", token }), []);
|
|
269
|
-
const setParameters = React2.useCallback((parameters) => dispatch({ type: "SET_PARAMETERS", parameters }), []);
|
|
270
|
-
const setResponse = React2.useCallback((response) => dispatch({ type: "SET_RESPONSE", response }), []);
|
|
271
|
-
const setLoading = React2.useCallback((loading) => dispatch({ type: "SET_LOADING", loading }), []);
|
|
272
|
-
const setSidebarOpen = React2.useCallback((open) => dispatch({ type: "SET_SIDEBAR", open }), []);
|
|
273
|
-
const clearAll = React2.useCallback(() => dispatch({ type: "RESET" }), []);
|
|
274
|
-
const sendRequest = React2.useCallback(async () => {
|
|
275
|
-
if (!state.requestUrl) {
|
|
276
|
-
consola__default.default.error("No URL provided");
|
|
277
|
-
return;
|
|
278
|
-
}
|
|
279
|
-
abortControllerRef.current?.abort();
|
|
280
|
-
const controller = new AbortController();
|
|
281
|
-
abortControllerRef.current = controller;
|
|
282
|
-
dispatch({ type: "REQUEST_START" });
|
|
283
|
-
const startTime = Date.now();
|
|
284
|
-
try {
|
|
285
|
-
const headers = parseRequestHeaders(state.requestHeaders);
|
|
286
|
-
let bearerToken = null;
|
|
287
|
-
if (state.manualApiToken) {
|
|
288
|
-
bearerToken = state.manualApiToken;
|
|
289
|
-
} else if (typeof window !== "undefined") {
|
|
290
|
-
bearerToken = window.localStorage.getItem("auth_token");
|
|
291
|
-
}
|
|
292
|
-
if (bearerToken) headers["Authorization"] = `Bearer ${bearerToken}`;
|
|
293
|
-
const requestOptions = {
|
|
294
|
-
method: state.requestMethod,
|
|
295
|
-
headers,
|
|
296
|
-
signal: controller.signal
|
|
297
|
-
};
|
|
298
|
-
if (state.requestBody && state.requestMethod !== "GET") {
|
|
299
|
-
requestOptions.body = state.requestBody;
|
|
300
|
-
}
|
|
301
|
-
const response = await fetch(state.requestUrl, requestOptions);
|
|
302
|
-
const duration = Date.now() - startTime;
|
|
303
|
-
const responseText = await response.text();
|
|
304
|
-
let responseData;
|
|
305
|
-
try {
|
|
306
|
-
responseData = JSON.parse(responseText);
|
|
307
|
-
} catch {
|
|
308
|
-
responseData = responseText;
|
|
309
|
-
}
|
|
310
|
-
dispatch({
|
|
311
|
-
type: "REQUEST_SUCCESS",
|
|
312
|
-
response: {
|
|
313
|
-
status: response.status,
|
|
314
|
-
statusText: response.statusText,
|
|
315
|
-
headers: Object.fromEntries(response.headers.entries()),
|
|
316
|
-
data: responseData,
|
|
317
|
-
duration
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
consola__default.default.success(`${state.requestMethod} ${state.requestUrl} \u2192 ${response.status} (${duration}ms)`);
|
|
321
|
-
} catch (error) {
|
|
322
|
-
if (error instanceof DOMException && error.name === "AbortError") return;
|
|
323
|
-
consola__default.default.error("Request failed:", error);
|
|
324
|
-
dispatch({
|
|
325
|
-
type: "REQUEST_ERROR",
|
|
326
|
-
response: {
|
|
327
|
-
error: error instanceof Error ? error.message : "Request failed",
|
|
328
|
-
duration: Date.now() - startTime
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
}, [state.requestUrl, state.requestHeaders, state.manualApiToken, state.requestMethod, state.requestBody]);
|
|
333
|
-
const contextValue = {
|
|
334
|
-
state,
|
|
335
|
-
config,
|
|
336
|
-
apiKeys,
|
|
337
|
-
apiKeysLoading: isLoadingApiKeys,
|
|
338
|
-
setCurrentStep,
|
|
339
|
-
goToNextStep,
|
|
340
|
-
goToPreviousStep,
|
|
341
|
-
setSelectedEndpoint,
|
|
342
|
-
setSelectedCategory,
|
|
343
|
-
setSearchTerm,
|
|
344
|
-
setSelectedVersion,
|
|
345
|
-
setRequestUrl,
|
|
346
|
-
setRequestMethod,
|
|
347
|
-
setRequestHeaders,
|
|
348
|
-
setRequestBody,
|
|
349
|
-
setSelectedApiKey,
|
|
350
|
-
setManualApiToken,
|
|
351
|
-
setParameters,
|
|
352
|
-
setResponse,
|
|
353
|
-
setLoading,
|
|
354
|
-
setSidebarOpen,
|
|
355
|
-
clearAll,
|
|
356
|
-
sendRequest
|
|
357
|
-
};
|
|
358
|
-
return /* @__PURE__ */ jsxRuntime.jsx(PlaygroundContext.Provider, { value: contextValue, children });
|
|
359
|
-
}, "PlaygroundProvider");
|
|
360
|
-
|
|
361
|
-
exports.PlaygroundProvider = PlaygroundProvider;
|
|
362
|
-
exports.PrettyCode_default = PrettyCode_default;
|
|
363
|
-
exports.deduplicateEndpoints = deduplicateEndpoints;
|
|
364
|
-
exports.findApiKeyById = findApiKeyById;
|
|
365
|
-
exports.isValidJson = isValidJson;
|
|
366
|
-
exports.parseRequestHeaders = parseRequestHeaders;
|
|
367
|
-
exports.usePlaygroundContext = usePlaygroundContext;
|
|
368
|
-
//# sourceMappingURL=chunk-5FKE7OME.cjs.map
|
|
369
|
-
//# sourceMappingURL=chunk-5FKE7OME.cjs.map
|