@djangocfg/ui-tools 2.1.334 → 2.1.336

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.
Files changed (196) hide show
  1. package/README.md +68 -2
  2. package/dist/ChatRoot-IIYQEWUU.mjs +5 -0
  3. package/dist/ChatRoot-IIYQEWUU.mjs.map +1 -0
  4. package/dist/ChatRoot-PNNGQCYF.css +7 -0
  5. package/dist/ChatRoot-PNNGQCYF.css.map +1 -0
  6. package/dist/ChatRoot-UUKTYM4N.cjs +14 -0
  7. package/dist/ChatRoot-UUKTYM4N.cjs.map +1 -0
  8. package/dist/{CronScheduler.client-3O3VU4CI.mjs → CronScheduler.client-DLMXCPAJ.mjs} +4 -4
  9. package/dist/{CronScheduler.client-3O3VU4CI.mjs.map → CronScheduler.client-DLMXCPAJ.mjs.map} +1 -1
  10. package/dist/{CronScheduler.client-A4GO6YBY.cjs → CronScheduler.client-WEJF4PWQ.cjs} +14 -14
  11. package/dist/{CronScheduler.client-A4GO6YBY.cjs.map → CronScheduler.client-WEJF4PWQ.cjs.map} +1 -1
  12. package/dist/{DocsLayout-XLDB6CJ2.cjs → DocsLayout-N5ZJZPBY.cjs} +200 -199
  13. package/dist/DocsLayout-N5ZJZPBY.cjs.map +1 -0
  14. package/dist/{DocsLayout-CTJINVBM.mjs → DocsLayout-VFPPNKSQ.mjs} +7 -6
  15. package/dist/DocsLayout-VFPPNKSQ.mjs.map +1 -0
  16. package/dist/JsonSchemaForm-DD7CLRIG.cjs +13 -0
  17. package/dist/{JsonSchemaForm-OSPUUUHM.cjs.map → JsonSchemaForm-DD7CLRIG.cjs.map} +1 -1
  18. package/dist/JsonSchemaForm-XKUIVELK.mjs +4 -0
  19. package/dist/{JsonSchemaForm-TSLX2GRO.mjs.map → JsonSchemaForm-XKUIVELK.mjs.map} +1 -1
  20. package/dist/JsonTree-55625VVH.mjs +5 -0
  21. package/dist/{JsonTree-F27RMYSI.cjs.map → JsonTree-55625VVH.mjs.map} +1 -1
  22. package/dist/JsonTree-DCM5QGWF.cjs +11 -0
  23. package/dist/{JsonTree-QTJYSHCV.mjs.map → JsonTree-DCM5QGWF.cjs.map} +1 -1
  24. package/dist/{LottiePlayer.client-6WVWDO75.cjs → LottiePlayer.client-2S7ISJ2S.cjs} +6 -6
  25. package/dist/{LottiePlayer.client-6WVWDO75.cjs.map → LottiePlayer.client-2S7ISJ2S.cjs.map} +1 -1
  26. package/dist/{LottiePlayer.client-B4I6WNZM.mjs → LottiePlayer.client-5LDSSJWS.mjs} +4 -4
  27. package/dist/{LottiePlayer.client-B4I6WNZM.mjs.map → LottiePlayer.client-5LDSSJWS.mjs.map} +1 -1
  28. package/dist/{MapContainer-RYG4HPH4.cjs → MapContainer-76YL2JXL.cjs} +8 -8
  29. package/dist/{MapContainer-RYG4HPH4.cjs.map → MapContainer-76YL2JXL.cjs.map} +1 -1
  30. package/dist/{MapContainer-GXQLP5WY.mjs → MapContainer-7HXBI3OH.mjs} +3 -3
  31. package/dist/{MapContainer-GXQLP5WY.mjs.map → MapContainer-7HXBI3OH.mjs.map} +1 -1
  32. package/dist/{Mermaid.client-SXRRI2YW.mjs → Mermaid.client-NL4SVR7F.mjs} +4 -4
  33. package/dist/{Mermaid.client-SXRRI2YW.mjs.map → Mermaid.client-NL4SVR7F.mjs.map} +1 -1
  34. package/dist/{Mermaid.client-W76R5AKJ.cjs → Mermaid.client-NNTI6DFX.cjs} +26 -26
  35. package/dist/{Mermaid.client-W76R5AKJ.cjs.map → Mermaid.client-NNTI6DFX.cjs.map} +1 -1
  36. package/dist/Player-BRV7XTWR.mjs +4 -0
  37. package/dist/{Player-M3GC3VPE.mjs.map → Player-BRV7XTWR.mjs.map} +1 -1
  38. package/dist/Player-PM7F7DD7.cjs +13 -0
  39. package/dist/{Player-ZL2X5LGG.cjs.map → Player-PM7F7DD7.cjs.map} +1 -1
  40. package/dist/{PrettyCode.client-RPDIE5CH.cjs → PrettyCode.client-KOHDVPPN.cjs} +13 -13
  41. package/dist/{PrettyCode.client-RPDIE5CH.cjs.map → PrettyCode.client-KOHDVPPN.cjs.map} +1 -1
  42. package/dist/{PrettyCode.client-SPMTQEG4.mjs → PrettyCode.client-ZGYGKE7G.mjs} +4 -4
  43. package/dist/{PrettyCode.client-SPMTQEG4.mjs.map → PrettyCode.client-ZGYGKE7G.mjs.map} +1 -1
  44. package/dist/TreeRoot-N72OYKXU.cjs +19 -0
  45. package/dist/{TreeRoot-A3J65L6F.mjs.map → TreeRoot-N72OYKXU.cjs.map} +1 -1
  46. package/dist/TreeRoot-VGAIXCUA.mjs +4 -0
  47. package/dist/{TreeRoot-DSK5JILT.cjs.map → TreeRoot-VGAIXCUA.mjs.map} +1 -1
  48. package/dist/chunk-2ZLKZ5VR.mjs +631 -0
  49. package/dist/chunk-2ZLKZ5VR.mjs.map +1 -0
  50. package/dist/{chunk-LFWQ36LJ.mjs → chunk-5G5YBFS6.mjs} +4 -4
  51. package/dist/{chunk-LFWQ36LJ.mjs.map → chunk-5G5YBFS6.mjs.map} +1 -1
  52. package/dist/{chunk-IHAY6FO6.cjs → chunk-5I5QNGUG.cjs} +17 -17
  53. package/dist/{chunk-IHAY6FO6.cjs.map → chunk-5I5QNGUG.cjs.map} +1 -1
  54. package/dist/{chunk-F2CMIIOH.cjs → chunk-76NNDZH6.cjs} +42 -42
  55. package/dist/{chunk-F2CMIIOH.cjs.map → chunk-76NNDZH6.cjs.map} +1 -1
  56. package/dist/chunk-B5AWZOHJ.cjs +649 -0
  57. package/dist/chunk-B5AWZOHJ.cjs.map +1 -0
  58. package/dist/{chunk-KR6B3LVY.mjs → chunk-B6IR5KSC.mjs} +3 -3
  59. package/dist/{chunk-KR6B3LVY.mjs.map → chunk-B6IR5KSC.mjs.map} +1 -1
  60. package/dist/{chunk-5LBDYFWH.mjs → chunk-C6GXVH5J.mjs} +3 -3
  61. package/dist/{chunk-5LBDYFWH.mjs.map → chunk-C6GXVH5J.mjs.map} +1 -1
  62. package/dist/{chunk-4IW7GZFQ.cjs → chunk-FEN5S772.cjs} +74 -48
  63. package/dist/chunk-FEN5S772.cjs.map +1 -0
  64. package/dist/{chunk-2SMCH62O.cjs → chunk-FP2RLYQZ.cjs} +11 -11
  65. package/dist/{chunk-2SMCH62O.cjs.map → chunk-FP2RLYQZ.cjs.map} +1 -1
  66. package/dist/{chunk-MOME6KYD.mjs → chunk-G5IEC7SR.mjs} +3 -3
  67. package/dist/{chunk-MOME6KYD.mjs.map → chunk-G5IEC7SR.mjs.map} +1 -1
  68. package/dist/{chunk-EXGXUK2N.mjs → chunk-GYIO7W7M.mjs} +41 -15
  69. package/dist/chunk-GYIO7W7M.mjs.map +1 -0
  70. package/dist/{chunk-3Z3A7FHA.cjs → chunk-IEEAENLX.cjs} +48 -48
  71. package/dist/{chunk-3Z3A7FHA.cjs.map → chunk-IEEAENLX.cjs.map} +1 -1
  72. package/dist/{chunk-DFTVB66S.cjs → chunk-KNDLV4PI.cjs} +85 -85
  73. package/dist/{chunk-DFTVB66S.cjs.map → chunk-KNDLV4PI.cjs.map} +1 -1
  74. package/dist/{chunk-SSUOENAZ.mjs → chunk-KNEQRUBA.mjs} +3 -3
  75. package/dist/{chunk-SSUOENAZ.mjs.map → chunk-KNEQRUBA.mjs.map} +1 -1
  76. package/dist/chunk-KRETIZU6.mjs +2218 -0
  77. package/dist/chunk-KRETIZU6.mjs.map +1 -0
  78. package/dist/{chunk-CGILA3WO.mjs → chunk-N2XQF2OL.mjs} +5 -3
  79. package/dist/{chunk-CGILA3WO.mjs.map → chunk-N2XQF2OL.mjs.map} +1 -1
  80. package/dist/{chunk-EUADAUBQ.mjs → chunk-N4MZYNR4.mjs} +4 -4
  81. package/dist/{chunk-EUADAUBQ.mjs.map → chunk-N4MZYNR4.mjs.map} +1 -1
  82. package/dist/chunk-NRXYYO5V.cjs +2257 -0
  83. package/dist/chunk-NRXYYO5V.cjs.map +1 -0
  84. package/dist/{chunk-GGKGH5PM.mjs → chunk-OBRSGM64.mjs} +4 -4
  85. package/dist/{chunk-GGKGH5PM.mjs.map → chunk-OBRSGM64.mjs.map} +1 -1
  86. package/dist/{chunk-6JTB2X72.mjs → chunk-ODO4GMW7.mjs} +3 -3
  87. package/dist/{chunk-6JTB2X72.mjs.map → chunk-ODO4GMW7.mjs.map} +1 -1
  88. package/dist/{chunk-WGEGR3DF.cjs → chunk-OLISEQHS.cjs} +5 -2
  89. package/dist/{chunk-WGEGR3DF.cjs.map → chunk-OLISEQHS.cjs.map} +1 -1
  90. package/dist/{chunk-PZKAH7WQ.mjs → chunk-PVAX67JG.mjs} +3 -3
  91. package/dist/{chunk-PZKAH7WQ.mjs.map → chunk-PVAX67JG.mjs.map} +1 -1
  92. package/dist/{chunk-PRPG2T2E.cjs → chunk-QJ6GTUCO.cjs} +6 -6
  93. package/dist/{chunk-PRPG2T2E.cjs.map → chunk-QJ6GTUCO.cjs.map} +1 -1
  94. package/dist/chunk-QW4RBGHN.cjs +961 -0
  95. package/dist/chunk-QW4RBGHN.cjs.map +1 -0
  96. package/dist/{chunk-33AMWFBZ.cjs → chunk-SGP7V2UW.cjs} +15 -15
  97. package/dist/{chunk-33AMWFBZ.cjs.map → chunk-SGP7V2UW.cjs.map} +1 -1
  98. package/dist/{chunk-FX2QFYWF.mjs → chunk-VWQ5WOIL.mjs} +3 -3
  99. package/dist/{chunk-FX2QFYWF.mjs.map → chunk-VWQ5WOIL.mjs.map} +1 -1
  100. package/dist/{chunk-ZLQHUZDU.cjs → chunk-YDPDTOSP.cjs} +139 -139
  101. package/dist/{chunk-ZLQHUZDU.cjs.map → chunk-YDPDTOSP.cjs.map} +1 -1
  102. package/dist/{chunk-77HQWEQ6.cjs → chunk-YW5IVWHQ.cjs} +33 -33
  103. package/dist/{chunk-77HQWEQ6.cjs.map → chunk-YW5IVWHQ.cjs.map} +1 -1
  104. package/dist/{chunk-YXBOAGIM.cjs → chunk-YXZ6GU7H.cjs} +7 -7
  105. package/dist/{chunk-YXBOAGIM.cjs.map → chunk-YXZ6GU7H.cjs.map} +1 -1
  106. package/dist/{chunk-62Y65TGK.mjs → chunk-ZUFTH5IR.mjs} +8 -631
  107. package/dist/chunk-ZUFTH5IR.mjs.map +1 -0
  108. package/dist/components-EHOGXATG.cjs +22 -0
  109. package/dist/{components-5UXYNAKR.cjs.map → components-EHOGXATG.cjs.map} +1 -1
  110. package/dist/components-MQ6DR7TX.cjs +26 -0
  111. package/dist/{components-CFXOEVPN.mjs.map → components-MQ6DR7TX.cjs.map} +1 -1
  112. package/dist/components-XRX7QGLB.mjs +5 -0
  113. package/dist/{components-WYEZL5TE.cjs.map → components-XRX7QGLB.mjs.map} +1 -1
  114. package/dist/components-YATKRWLH.mjs +5 -0
  115. package/dist/{components-ZAGG2PBO.mjs.map → components-YATKRWLH.mjs.map} +1 -1
  116. package/dist/file-icon/index.cjs +6 -6
  117. package/dist/file-icon/index.mjs +1 -1
  118. package/dist/index.cjs +735 -215
  119. package/dist/index.cjs.map +1 -1
  120. package/dist/index.d.cts +972 -39
  121. package/dist/index.d.ts +972 -39
  122. package/dist/index.mjs +387 -31
  123. package/dist/index.mjs.map +1 -1
  124. package/dist/tree/index.cjs +38 -38
  125. package/dist/tree/index.d.cts +2 -2
  126. package/dist/tree/index.d.ts +2 -2
  127. package/dist/tree/index.mjs +3 -3
  128. package/package.json +6 -6
  129. package/src/index.ts +5 -0
  130. package/src/stories/index.ts +3 -1
  131. package/src/tools/Chat/Chat.story.tsx +1006 -0
  132. package/src/tools/Chat/README.md +528 -0
  133. package/src/tools/Chat/components/Attachments.tsx +192 -0
  134. package/src/tools/Chat/components/ChatRoot.tsx +201 -0
  135. package/src/tools/Chat/components/Composer.tsx +134 -0
  136. package/src/tools/Chat/components/EmptyState.tsx +47 -0
  137. package/src/tools/Chat/components/ErrorBanner.tsx +47 -0
  138. package/src/tools/Chat/components/JumpToLatest.tsx +30 -0
  139. package/src/tools/Chat/components/MessageActions.tsx +72 -0
  140. package/src/tools/Chat/components/MessageBubble.tsx +228 -0
  141. package/src/tools/Chat/components/MessageList.tsx +82 -0
  142. package/src/tools/Chat/components/Sources.tsx +55 -0
  143. package/src/tools/Chat/components/StreamingIndicator.tsx +29 -0
  144. package/src/tools/Chat/components/ToolCalls.tsx +172 -0
  145. package/src/tools/Chat/components/index.ts +24 -0
  146. package/src/tools/Chat/config.ts +55 -0
  147. package/src/tools/Chat/context/ChatProvider.tsx +122 -0
  148. package/src/tools/Chat/context/index.ts +9 -0
  149. package/src/tools/Chat/core/audio/audioBus.ts +172 -0
  150. package/src/tools/Chat/core/audio/index.ts +8 -0
  151. package/src/tools/Chat/core/audio/preferences.ts +68 -0
  152. package/src/tools/Chat/core/audio/types.ts +49 -0
  153. package/src/tools/Chat/core/ids.ts +16 -0
  154. package/src/tools/Chat/core/index.ts +5 -0
  155. package/src/tools/Chat/core/markdown.ts +56 -0
  156. package/src/tools/Chat/core/payload-dispatch.ts +54 -0
  157. package/src/tools/Chat/core/persona.ts +35 -0
  158. package/src/tools/Chat/core/reducer.ts +335 -0
  159. package/src/tools/Chat/core/transport/http.ts +167 -0
  160. package/src/tools/Chat/core/transport/index.ts +13 -0
  161. package/src/tools/Chat/core/transport/mock.ts +134 -0
  162. package/src/tools/Chat/core/transport/sse.ts +116 -0
  163. package/src/tools/Chat/core/transport/types.ts +24 -0
  164. package/src/tools/Chat/hooks/index.ts +26 -0
  165. package/src/tools/Chat/hooks/useChat.ts +440 -0
  166. package/src/tools/Chat/hooks/useChatAudio.ts +191 -0
  167. package/src/tools/Chat/hooks/useChatComposer.ts +227 -0
  168. package/src/tools/Chat/hooks/useChatHistory.ts +59 -0
  169. package/src/tools/Chat/hooks/useChatLayout.ts +111 -0
  170. package/src/tools/Chat/hooks/useChatLightbox.ts +34 -0
  171. package/src/tools/Chat/hooks/useChatScroll.ts +132 -0
  172. package/src/tools/Chat/index.ts +158 -0
  173. package/src/tools/Chat/lazy.tsx +14 -0
  174. package/src/tools/Chat/types.ts +237 -0
  175. package/src/tools/Chat/utils/collectImageAttachments.ts +13 -0
  176. package/src/tools/JsonForm/JsonSchemaForm.tsx +32 -1
  177. package/src/tools/Map/README.md +384 -0
  178. package/dist/DocsLayout-CTJINVBM.mjs.map +0 -1
  179. package/dist/DocsLayout-XLDB6CJ2.cjs.map +0 -1
  180. package/dist/JsonSchemaForm-OSPUUUHM.cjs +0 -13
  181. package/dist/JsonSchemaForm-TSLX2GRO.mjs +0 -4
  182. package/dist/JsonTree-F27RMYSI.cjs +0 -11
  183. package/dist/JsonTree-QTJYSHCV.mjs +0 -5
  184. package/dist/Player-M3GC3VPE.mjs +0 -4
  185. package/dist/Player-ZL2X5LGG.cjs +0 -13
  186. package/dist/TreeRoot-A3J65L6F.mjs +0 -4
  187. package/dist/TreeRoot-DSK5JILT.cjs +0 -19
  188. package/dist/chunk-4IW7GZFQ.cjs.map +0 -1
  189. package/dist/chunk-62Y65TGK.mjs.map +0 -1
  190. package/dist/chunk-EXGXUK2N.mjs.map +0 -1
  191. package/dist/chunk-TKSFZHCG.cjs +0 -1597
  192. package/dist/chunk-TKSFZHCG.cjs.map +0 -1
  193. package/dist/components-5UXYNAKR.cjs +0 -22
  194. package/dist/components-CFXOEVPN.mjs +0 -5
  195. package/dist/components-WYEZL5TE.cjs +0 -26
  196. package/dist/components-ZAGG2PBO.mjs +0 -5
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/OpenapiViewer/utils/apiKeyManager.ts","../src/tools/OpenapiViewer/utils/codeSamples.ts","../src/tools/OpenapiViewer/utils/operationToHar.ts","../src/tools/OpenapiViewer/utils/versionManager.ts","../src/tools/OpenapiViewer/utils/formatters.ts","../src/tools/OpenapiViewer/utils/sampler.ts","../src/tools/OpenapiViewer/utils/url.ts","../src/tools/OpenapiViewer/utils/schemaExport.ts","../src/tools/OpenapiViewer/context/PlaygroundContext.tsx"],"names":["__name","openapiSample","consola","createContext","useContext","useReducer","useRef","React","useSessionStorage","useEffect","useCallback"],"mappings":"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","file":"chunk-QW4RBGHN.cjs","sourcesContent":["/**\n * API Key Management Utility\n *\n * Provides centralized functions for managing API keys in headers and requests.\n * This utility can be used across different components that need to handle API keys.\n */\n\nimport type { ApiKey } from '../types';\n\nexport type { ApiKey };\n\nexport interface HeadersWithApiKey {\n [key: string]: string;\n}\n\n/**\n * Add API key to request headers\n * @param headers - Existing headers object\n * @param apiKey - API key object or string\n * @returns Headers with API key added\n */\nexport function addApiKeyToHeaders(headers: HeadersWithApiKey, apiKey: ApiKey | string | null): HeadersWithApiKey {\n if (!apiKey) {\n return headers;\n }\n\n // ``secret`` is the raw key that goes in the X-API-Key header.\n // Falls back to ``id`` for backwards compatibility — older callers\n // only had ``id`` and used it as both selector and secret.\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.secret || apiKey.id || '');\n\n return {\n ...headers,\n 'X-API-Key': keyValue,\n };\n}\n\n/**\n * Remove API key from headers object\n * @param headers - Headers object\n * @returns Headers without API key\n */\nexport function removeApiKeyFromHeaders(headers: HeadersWithApiKey): HeadersWithApiKey {\n const { 'X-API-Key': removed, ...remainingHeaders } = headers;\n return remainingHeaders;\n}\n\n/**\n * Remove API key from headers JSON string\n * @param headersJson - JSON string of headers\n * @returns JSON string without API key\n */\nexport function removeApiKeyFromHeadersJson(headersJson: string): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = removeApiKeyFromHeaders(headers);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Update headers JSON string with API key\n * @param headersJson - JSON string of headers\n * @param apiKey - API key object or string\n * @returns Updated JSON string\n */\nexport function updateHeadersJsonWithApiKey(headersJson: string, apiKey: ApiKey | string | null): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = addApiKeyToHeaders(headers, apiKey);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Find API key by ID in a list of API keys\n * @param apiKeys - Array of API keys\n * @param keyId - ID of the API key to find\n * @returns API key object or null\n */\nexport function findApiKeyById(apiKeys: ApiKey[], keyId: string): ApiKey | null {\n return apiKeys.find((key) => key.id === keyId) || null;\n}\n\n/**\n * Validate API key format\n * @param apiKey - API key string to validate\n * @returns Whether the API key format is valid\n */\nexport function validateApiKeyFormat(apiKey: string): boolean {\n // Basic validation - adjust based on your API key format requirements\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.trim() !== '';\n}\n\n/**\n * Create default headers with API key\n * @param apiKey - API key object or string\n * @returns Default headers with API key\n */\nexport function createDefaultHeaders(apiKey?: ApiKey | string): HeadersWithApiKey {\n const defaultHeaders: HeadersWithApiKey = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n return addApiKeyToHeaders(defaultHeaders, apiKey);\n }\n\n return defaultHeaders;\n}\n\n/**\n * Merge headers with API key\n * @param baseHeaders - Base headers object\n * @param additionalHeaders - Additional headers to merge\n * @param apiKey - API key to add\n * @returns Merged headers with API key\n */\nexport function mergeHeadersWithApiKey(baseHeaders: HeadersWithApiKey, additionalHeaders: HeadersWithApiKey, apiKey?: ApiKey | string): HeadersWithApiKey {\n const mergedHeaders = { ...baseHeaders, ...additionalHeaders };\n\n if (apiKey) {\n return addApiKeyToHeaders(mergedHeaders, apiKey);\n }\n\n return mergedHeaders;\n}\n\n/**\n * Log API key usage (for debugging/analytics)\n * @param apiKey - API key that was used\n * @param endpoint - Endpoint that was called\n * @param success - Whether the request was successful\n */\nexport function logApiKeyUsage(apiKey: ApiKey | string, endpoint: string, success: boolean): void {\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.secret || apiKey.id || '');\n const keyName = typeof apiKey === 'string' ? 'Unknown' : apiKey.name;\n\n console.log(`API Key Usage:`, {\n keyName,\n keyValue: keyValue.substring(0, 8) + '...',\n endpoint,\n success,\n timestamp: new Date().toISOString(),\n });\n}\n","/**\n * Code sample generation.\n *\n * In-house, browser-safe generator for a small catalogue of languages\n * (curl / fetch / Node axios / Python requests / Go / PHP / Ruby /\n * Java OkHttp). We used to wrap Kong's ``httpsnippet`` here but it is\n * Node-only — the bundle referenced ``global`` / ``stream`` /\n * ``string_decoder`` and crashed in Vite dev. Writing our own keeps the\n * chunk small (a few kB vs ~1.5 MB) and avoids runtime polyfills.\n *\n * Adding more targets later is one function plus a row in the catalogue.\n */\n\nimport type { HarRequest } from './operationToHar';\n\n// Prism language ids used by ``prism-react-renderer``. ``bash``,\n// ``ruby``, ``java`` and ``php`` aren't in the library's default\n// bundle, but our ``registerPrismLanguages`` module pulls their\n// grammars from ``prismjs`` at load time so they work as first-class\n// languages here.\nexport const CODE_SAMPLE_TARGETS = [\n { id: 'curl', label: 'cURL', prism: 'bash' },\n { id: 'fetch', label: 'JavaScript', prism: 'javascript' },\n { id: 'axios', label: 'Node (axios)', prism: 'javascript' },\n { id: 'python', label: 'Python', prism: 'python' },\n { id: 'go', label: 'Go', prism: 'go' },\n { id: 'php', label: 'PHP', prism: 'php' },\n { id: 'ruby', label: 'Ruby', prism: 'ruby' },\n { id: 'java', label: 'Java', prism: 'java' },\n] as const;\n\nexport type CodeSampleTargetId = typeof CODE_SAMPLE_TARGETS[number]['id'];\n\n// ─── Body literal helpers ─────────────────────────────────────────────────────\n//\n// Pre-formatted JSON bodies (``JSON.stringify(value, null, 2)``) carry\n// real newlines that we want the snippet to preserve — a one-line\n// escaped string like ``\"{\\n \\\"id\\\": 10,\\n …}\"`` reads as a wall of\n// escape sequences. Each helper below returns a multi-line string\n// literal in the target language's native syntax so the snippet reads\n// like hand-written code.\n\n/** Go raw string literal — uses backticks. Falls back to a double-\n * quoted escaped literal when the body itself contains a backtick. */\nfunction goRawString(s: string): string {\n return s.includes('`') ? JSON.stringify(s) : `\\`${s}\\``;\n}\n\n/** Python triple-quoted string — uses ``\"\"\"``. Falls back to escaped\n * form when the body already contains that sequence. */\nfunction pythonTripleQuote(s: string): string {\n return s.includes('\"\"\"') ? JSON.stringify(s) : `\"\"\"${s}\"\"\"`;\n}\n\n/** Ruby squiggly heredoc — ``<<~JSON`` style strips common leading\n * whitespace. Safe unless the body literally contains ``JSON`` on a\n * line by itself, which is vanishingly rare. */\nfunction rubyHeredoc(s: string): string {\n return `<<~JSON\\n${s}\\nJSON`;\n}\n\n/** PHP heredoc — ``<<<JSON`` style. Same caveat as Ruby's. Trailing\n * ``JSON;`` must sit at column 0 (enforced by this template). */\nfunction phpHeredoc(s: string): string {\n return `<<<JSON\\n${s}\\nJSON`;\n}\n\n/** Java 15+ text block — ``\"\"\"``. Falls back to an escaped literal\n * when the body contains that sequence. */\nfunction javaTextBlock(s: string): string {\n if (s.includes('\"\"\"')) return JSON.stringify(s);\n // Text blocks need the opening ``\"\"\"`` on its own line — the\n // parser strips the newline that immediately follows the delimiter.\n return `\"\"\"\\n${s}\\n\"\"\"`;\n}\n\nfunction fullUrl(har: HarRequest): string {\n if (!har.queryString.length) return har.url;\n const qs = har.queryString\n .map((p) => `${encodeURIComponent(p.name)}=${encodeURIComponent(p.value)}`)\n .join('&');\n const sep = har.url.includes('?') ? '&' : '?';\n return `${har.url}${sep}${qs}`;\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction renderCurl(har: HarRequest): string {\n const lines: string[] = [`curl -X ${har.method} ${shellEscape(fullUrl(har))}`];\n for (const h of har.headers) {\n lines.push(` -H ${shellEscape(`${h.name}: ${h.value}`)}`);\n }\n if (har.postData?.text) {\n lines.push(` -d ${shellEscape(har.postData.text)}`);\n }\n return lines.join(' \\\\\\n');\n}\n\nfunction jsHeadersLiteral(har: HarRequest, indent: string): string {\n if (!har.headers.length) return '{}';\n const entries = har.headers\n .map((h) => `${indent} ${JSON.stringify(h.name)}: ${JSON.stringify(h.value)}`)\n .join(',\\n');\n return `{\\n${entries},\\n${indent}}`;\n}\n\n/** JS template literal — backtick string that preserves newlines and\n * escapes backticks / ``${`` sequences. Makes multi-line JSON body\n * readable inside the fetch() options. */\nfunction jsTemplateLiteral(s: string): string {\n if (/[`$]/.test(s)) return JSON.stringify(s);\n return `\\`${s}\\``;\n}\n\nfunction renderFetch(har: HarRequest): string {\n const url = fullUrl(har);\n const options: string[] = [` method: ${JSON.stringify(har.method)}`];\n if (har.headers.length) {\n options.push(` headers: ${jsHeadersLiteral(har, ' ')}`);\n }\n if (har.postData?.text) {\n options.push(` body: ${jsTemplateLiteral(har.postData.text)}`);\n }\n return `const response = await fetch(${JSON.stringify(url)}, {\\n${options.join(',\\n')},\\n});\\nconst data = await response.json();`;\n}\n\nfunction renderAxios(har: HarRequest): string {\n const url = fullUrl(har);\n const config: string[] = [\n ` method: ${JSON.stringify(har.method.toLowerCase())}`,\n ` url: ${JSON.stringify(url)}`,\n ];\n if (har.headers.length) {\n config.push(` headers: ${jsHeadersLiteral(har, ' ')}`);\n }\n if (har.postData?.text) {\n // Axios auto-serializes objects; we pass the raw JSON string as data.\n config.push(` data: ${har.postData.text}`);\n }\n return `import axios from 'axios';\\n\\nconst { data } = await axios({\\n${config.join(',\\n')},\\n});`;\n}\n\nfunction renderPython(har: HarRequest): string {\n const lines: string[] = [`import requests`, ``];\n lines.push(`url = ${JSON.stringify(fullUrl(har))}`);\n if (har.headers.length) {\n const headerEntries = har.headers\n .map((h) => ` ${JSON.stringify(h.name)}: ${JSON.stringify(h.value)}`)\n .join(',\\n');\n lines.push(`headers = {\\n${headerEntries},\\n}`);\n }\n if (har.postData?.text) {\n // ``json=payload`` on ``requests`` expects a Python object, not\n // a JSON string — so we leave the body as a raw dict literal\n // (which Python parses identically to the JSON source for the\n // shapes we generate). No wrapping helper needed here.\n lines.push(`payload = ${har.postData.text}`);\n }\n const args = [`url`];\n if (har.headers.length) args.push(`headers=headers`);\n if (har.postData?.text) args.push(`json=payload`);\n lines.push(``, `response = requests.${har.method.toLowerCase()}(${args.join(', ')})`);\n lines.push(`data = response.json()`);\n return lines.join('\\n');\n}\n\nfunction renderGo(har: HarRequest): string {\n const url = fullUrl(har);\n const lines: string[] = [\n `package main`,\n ``,\n `import (`,\n ` \"fmt\"`,\n ` \"io\"`,\n ];\n if (har.postData?.text) lines.push(` \"strings\"`);\n lines.push(` \"net/http\"`);\n lines.push(`)`, ``, `func main() {`);\n if (har.postData?.text) {\n lines.push(` payload := strings.NewReader(${goRawString(har.postData.text)})`);\n lines.push(` req, _ := http.NewRequest(${JSON.stringify(har.method)}, ${JSON.stringify(url)}, payload)`);\n } else {\n lines.push(` req, _ := http.NewRequest(${JSON.stringify(har.method)}, ${JSON.stringify(url)}, nil)`);\n }\n for (const h of har.headers) {\n lines.push(` req.Header.Add(${JSON.stringify(h.name)}, ${JSON.stringify(h.value)})`);\n }\n lines.push(\n ``,\n ` res, _ := http.DefaultClient.Do(req)`,\n ` defer res.Body.Close()`,\n ` body, _ := io.ReadAll(res.Body)`,\n ` fmt.Println(string(body))`,\n `}`,\n );\n return lines.join('\\n');\n}\n\nfunction renderPhp(har: HarRequest): string {\n const lines: string[] = [`<?php`, ``, `$curl = curl_init();`, ``, `curl_setopt_array($curl, [`];\n lines.push(` CURLOPT_URL => ${JSON.stringify(fullUrl(har))},`);\n lines.push(` CURLOPT_RETURNTRANSFER => true,`);\n lines.push(` CURLOPT_CUSTOMREQUEST => ${JSON.stringify(har.method)},`);\n if (har.postData?.text) {\n lines.push(` CURLOPT_POSTFIELDS => ${phpHeredoc(har.postData.text)},`);\n }\n if (har.headers.length) {\n const headerList = har.headers\n .map((h) => ` ${JSON.stringify(`${h.name}: ${h.value}`)}`)\n .join(',\\n');\n lines.push(` CURLOPT_HTTPHEADER => [\\n${headerList},\\n ],`);\n }\n lines.push(`]);`, ``, `$response = curl_exec($curl);`, `curl_close($curl);`, `echo $response;`);\n return lines.join('\\n');\n}\n\nfunction renderRuby(har: HarRequest): string {\n const lines: string[] = [\n `require 'net/http'`,\n `require 'uri'`,\n `require 'json'`,\n ``,\n `uri = URI(${JSON.stringify(fullUrl(har))})`,\n `http = Net::HTTP.new(uri.host, uri.port)`,\n `http.use_ssl = uri.scheme == 'https'`,\n ``,\n ];\n const methodClass = har.method.charAt(0) + har.method.slice(1).toLowerCase();\n lines.push(`request = Net::HTTP::${methodClass}.new(uri)`);\n for (const h of har.headers) {\n lines.push(`request[${JSON.stringify(h.name)}] = ${JSON.stringify(h.value)}`);\n }\n if (har.postData?.text) {\n lines.push(`request.body = ${rubyHeredoc(har.postData.text)}`);\n }\n lines.push(``, `response = http.request(request)`, `puts response.body`);\n return lines.join('\\n');\n}\n\nfunction renderJava(har: HarRequest): string {\n const lines: string[] = [\n `OkHttpClient client = new OkHttpClient();`,\n ``,\n ];\n if (har.postData?.text) {\n lines.push(\n `MediaType mediaType = MediaType.parse(\"application/json\");`,\n `RequestBody body = RequestBody.create(mediaType, ${javaTextBlock(har.postData.text)});`,\n ``,\n );\n }\n lines.push(`Request request = new Request.Builder()`);\n lines.push(` .url(${JSON.stringify(fullUrl(har))})`);\n if (har.postData?.text) {\n lines.push(` .method(${JSON.stringify(har.method)}, body)`);\n } else {\n lines.push(` .method(${JSON.stringify(har.method)}, null)`);\n }\n for (const h of har.headers) {\n lines.push(` .addHeader(${JSON.stringify(h.name)}, ${JSON.stringify(h.value)})`);\n }\n lines.push(` .build();`, ``, `Response response = client.newCall(request).execute();`);\n return lines.join('\\n');\n}\n\nconst RENDERERS: Record<CodeSampleTargetId, (har: HarRequest) => string> = {\n curl: renderCurl,\n fetch: renderFetch,\n axios: renderAxios,\n python: renderPython,\n go: renderGo,\n php: renderPhp,\n ruby: renderRuby,\n java: renderJava,\n};\n\nexport function renderSnippet(har: HarRequest, targetId: CodeSampleTargetId): string | null {\n const renderer = RENDERERS[targetId];\n if (!renderer) return null;\n try {\n return renderer(har);\n } catch {\n return null;\n }\n}\n","/**\n * OpenAPI endpoint → HAR request.\n *\n * Our in-house code-sample renderers consume a HAR 1.2-shaped request.\n * This module shapes an ``ApiEndpoint`` + user-provided parameter\n * values into that form — path substitution, query-string assembly,\n * header inference, body formatting.\n *\n * We keep the HAR intermediate (rather than a bespoke type) so the\n * renderers match well-known HAR semantics and stay easy to extend.\n */\n\nimport type { ApiEndpoint } from '../types';\n\n/** HAR 1.2 request subset that our renderers consume. We don't ship\n * the full HAR type surface — just the fields that snippet generators\n * actually read. */\nexport interface HarRequest {\n method: string;\n url: string;\n httpVersion: string;\n headers: Array<{ name: string; value: string }>;\n queryString: Array<{ name: string; value: string }>;\n cookies: Array<{ name: string; value: string }>;\n headersSize: number;\n bodySize: number;\n postData?: {\n mimeType: string;\n text: string;\n };\n}\n\nexport interface BuildHarInput {\n endpoint: ApiEndpoint;\n /** Raw body string — whatever the user typed in the playground or\n * the pre-sampled example. Passed through verbatim; the caller\n * decides the content shape. */\n body?: string;\n /** Path-param + query-param values, keyed by name. We look up each\n * parameter on ``endpoint`` to decide whether it slots into the\n * path or the query string. */\n parameters?: Record<string, string>;\n /** Extra headers to merge in (e.g. ``X-API-Key``, ``Authorization``).\n * Later entries with the same name override earlier ones. */\n headers?: Record<string, string>;\n /** Override the request URL's base. When absent we use\n * ``endpoint.path`` as-is (extractor already prepended base URL). */\n baseUrl?: string;\n}\n\n/** Split a template path into path vs query. Substitutes ``{id}``-style\n * placeholders using the provided parameter map; unused entries flow\n * into the query string. */\nfunction buildUrl(\n endpoint: ApiEndpoint,\n parameters: Record<string, string>,\n baseUrl?: string,\n): { url: string; queryString: HarRequest['queryString'] } {\n const pathParamNames = new Set(\n (endpoint.parameters ?? [])\n .filter((p) => endpoint.path.includes(`{${p.name}}`))\n .map((p) => p.name),\n );\n\n let path = endpoint.path;\n for (const name of pathParamNames) {\n const value = parameters[name];\n if (value === undefined || value === '') continue;\n path = path.replaceAll(`{${name}}`, encodeURIComponent(value));\n }\n\n const queryString: HarRequest['queryString'] = [];\n for (const param of endpoint.parameters ?? []) {\n if (pathParamNames.has(param.name)) continue;\n const value = parameters[param.name];\n if (value === undefined || value === '') continue;\n queryString.push({ name: param.name, value });\n }\n\n const url = baseUrl ? `${baseUrl.replace(/\\/+$/, '')}${path.startsWith('/') ? path : `/${path}`}` : path;\n return { url, queryString };\n}\n\n/** Build a HAR 1.2 request from an API endpoint + current form values. */\nexport function buildHarRequest(input: BuildHarInput): HarRequest {\n const { endpoint, body, parameters = {}, headers = {}, baseUrl } = input;\n const { url, queryString } = buildUrl(endpoint, parameters, baseUrl);\n\n const hasBody = Boolean(body && body.trim().length > 0);\n const bodyMime = hasBody\n ? 'application/json'\n : undefined;\n\n // Merge headers. Caller wins, but we default Content-Type for bodies\n // and Accept for JSON endpoints — snippet consumers expect these.\n const mergedHeaders: Record<string, string> = {};\n if (hasBody && bodyMime) mergedHeaders['Content-Type'] = bodyMime;\n mergedHeaders['Accept'] = 'application/json';\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined || v === '') continue;\n mergedHeaders[k] = v;\n }\n\n const har: HarRequest = {\n method: endpoint.method.toUpperCase(),\n url,\n httpVersion: 'HTTP/1.1',\n headers: Object.entries(mergedHeaders).map(([name, value]) => ({ name, value })),\n queryString,\n cookies: [],\n headersSize: -1,\n bodySize: hasBody ? new TextEncoder().encode(body!).length : 0,\n };\n\n if (hasBody && bodyMime) {\n har.postData = { mimeType: bodyMime, text: body! };\n }\n\n return har;\n}\n","/**\n * API Version Management Utilities\n * Handles version detection, filtering, and URL transformation\n */\n\nimport type { ApiEndpoint } from '../types';\n\nexport interface ApiVersion {\n id: string;\n name: string;\n description: string;\n isDefault: boolean;\n}\n\n// Available API versions\nexport const API_VERSIONS: ApiVersion[] = [\n {\n id: 'v1',\n name: 'v1',\n description: 'Current stable version',\n isDefault: true,\n },\n];\n\n/**\n * Detect version from endpoint path\n */\nexport const detectEndpointVersion = (path: string): string => {\n // Check for versioned paths like /api/vehicles_api/v1/...\n const versionMatch = path.match(/\\/api\\/[^/]+\\/(v\\d+)\\//);\n if (versionMatch && versionMatch[1]) {\n return versionMatch[1];\n }\n \n // If no version found, default to v1\n return 'v1';\n};\n\n/**\n * Check if endpoint belongs to specific version\n */\nexport const isEndpointInVersion = (endpoint: ApiEndpoint, version: string): boolean => {\n const endpointVersion = detectEndpointVersion(endpoint.path);\n return endpointVersion === version;\n};\n\n/**\n * Filter endpoints by version\n */\nexport const filterEndpointsByVersion = (endpoints: ApiEndpoint[], version: string): ApiEndpoint[] => {\n return endpoints.filter(endpoint => isEndpointInVersion(endpoint, version));\n};\n\n/**\n * Remove duplicate endpoints across versions\n * Keeps only the specified version, removes duplicates from other versions\n */\nexport const deduplicateEndpoints = (endpoints: ApiEndpoint[], preferredVersion: string): ApiEndpoint[] => {\n const endpointMap = new Map<string, ApiEndpoint>();\n \n // Group endpoints by normalized path (without version)\n const groupedEndpoints = new Map<string, ApiEndpoint[]>();\n \n endpoints.forEach(endpoint => {\n const normalizedPath = normalizeEndpointPath(endpoint.path);\n if (!groupedEndpoints.has(normalizedPath)) {\n groupedEndpoints.set(normalizedPath, []);\n }\n groupedEndpoints.get(normalizedPath)!.push(endpoint);\n });\n \n // For each group, pick the endpoint from preferred version\n groupedEndpoints.forEach((endpointGroup, normalizedPath) => {\n let selectedEndpoint: ApiEndpoint | null = null;\n \n // Try to find endpoint in preferred version\n const versionEndpoint = endpointGroup.find(ep => isEndpointInVersion(ep, preferredVersion));\n if (versionEndpoint) {\n selectedEndpoint = versionEndpoint;\n } else if (endpointGroup.length > 0) {\n // Fallback to first available endpoint\n selectedEndpoint = endpointGroup[0] || null;\n }\n \n if (selectedEndpoint) {\n endpointMap.set(normalizedPath, selectedEndpoint);\n }\n });\n \n return Array.from(endpointMap.values());\n};\n\n/**\n * Normalize endpoint path by removing version prefix\n * /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/vehicles/\n * /api/vehicles_api/vehicles/ -> /api/vehicles_api/vehicles/\n */\nexport const normalizeEndpointPath = (path: string): string => {\n // Remove version prefix like /v1/, /v2/, etc.\n return path.replace(/\\/v\\d+\\//, '/');\n};\n\n/**\n * Convert endpoint path to specific version\n */\nexport const convertEndpointToVersion = (endpoint: ApiEndpoint, targetVersion: string): ApiEndpoint => {\n const currentVersion = detectEndpointVersion(endpoint.path);\n \n // If already in target version, return as is\n if (currentVersion === targetVersion) {\n return endpoint;\n }\n \n let newPath = endpoint.path;\n \n // Replace version: /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/v2/vehicles/\n newPath = newPath.replace(/\\/v\\d+\\//, `/${targetVersion}/`);\n \n return {\n ...endpoint,\n path: newPath,\n };\n};\n\n/**\n * Get version info by ID\n */\nexport const getVersionById = (versionId: string): ApiVersion | undefined => {\n return API_VERSIONS.find(v => v.id === versionId);\n};\n\n/**\n * Get default version\n */\nexport const getDefaultVersion = (): ApiVersion => {\n const defaultVersion = API_VERSIONS.find(v => v.isDefault);\n if (defaultVersion) {\n return defaultVersion;\n }\n \n // Fallback to first version if no default is set\n if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {\n return API_VERSIONS[0];\n }\n \n // This should never happen, but TypeScript requires it\n throw new Error('No API versions defined');\n};\n\n/**\n * Get version statistics from endpoints\n */\nexport const getVersionStats = (endpoints: ApiEndpoint[]): Record<string, number> => {\n const stats: Record<string, number> = {};\n \n API_VERSIONS.forEach(version => {\n stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;\n });\n \n return stats;\n};\n","import type { ApiKey } from '../types';\nimport { HTTP_METHOD_COLORS, HTTP_STATUS_COLORS } from '../constants';\n\nexport const getMethodColor = (\n method: string\n): 'success' | 'primary' | 'warning' | 'error' | 'default' => {\n return HTTP_METHOD_COLORS[method.toUpperCase() as keyof typeof HTTP_METHOD_COLORS] || 'default';\n};\n\nexport const getStatusColor = (\n status: number\n): 'success' | 'warning' | 'error' | 'default' => {\n const firstDigit = Math.floor(status / 100).toString();\n return HTTP_STATUS_COLORS[firstDigit as keyof typeof HTTP_STATUS_COLORS] || 'default';\n};\n\nexport const formatApiKeyDisplay = (apiKey: ApiKey): string => {\n const preview = apiKey.id.substring(0, 8);\n return `${apiKey.name} (${preview}...)`;\n};\n\nexport const isValidJson = (str: string): boolean => {\n if (!str || typeof str !== 'string') return false;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const formatRequestHeaders = (headers: Record<string, string>): string => {\n return JSON.stringify(headers, null, 2);\n};\n\nexport const parseRequestHeaders = (headersString: string): Record<string, string> => {\n if (!headersString || typeof headersString !== 'string') {\n return { 'Content-Type': 'application/json' };\n }\n\n try {\n const parsed = JSON.parse(headersString);\n return typeof parsed === 'object' && parsed !== null ? parsed : { 'Content-Type': 'application/json' };\n } catch {\n return { 'Content-Type': 'application/json' };\n }\n};\n\n// URL helpers moved to ./url.ts — keep this file focused on non-URL\n// formatters (method/status colour maps, JSON validation, header parsing).\n","/**\n * JSON Schema → example JSON.\n *\n * Thin wrapper over ``openapi-sampler`` (by Redocly — same library Redoc\n * uses internally). Picks deterministic, realistic values from a\n * dereferenced schema: honours ``const`` / ``examples`` / ``enum`` /\n * ``default``, unpacks ``allOf`` / ``oneOf`` / ``anyOf``, respects\n * string ``format`` (email/uuid/date-time/…).\n *\n * Replaces the previous hand-rolled ``exampleFromSchema`` — stricter on\n * spec semantics and cheaper to maintain.\n */\n\nimport consola from 'consola';\nimport { sample as openapiSample } from 'openapi-sampler';\n\ntype JsonSchemaLike = Record<string, unknown>;\n\nexport interface SampleOptions {\n /** Skip properties marked ``readOnly`` — useful when the body will\n * be sent in a request (request body editor). Default ``false``. */\n skipReadOnly?: boolean;\n /** Skip properties marked ``writeOnly`` — useful when rendering a\n * response body (passwords etc. must not leak). Default ``false``. */\n skipWriteOnly?: boolean;\n /** Skip non-required properties. Rarely useful for a viewer — we\n * want to show the full shape. Default ``false``. */\n skipNonRequired?: boolean;\n}\n\n/** Sample a JSON schema into a plain value. Returns ``null`` on failure\n * (malformed schema, circular refs the sampler can't unwind) so the\n * caller can show \"no example\" instead of crashing the page.\n *\n * ``spec`` must be the root OpenAPI document whenever ``schema`` may\n * contain ``$ref`` nodes — ``openapi-sampler`` walks the tree and\n * resolves refs against it. Our own ``dereferenceSchema`` only inlines\n * refs up to a depth limit; anything deeper comes through here as a\n * live ``$ref`` and the sampler throws if ``spec`` is missing. */\nexport function sampleSchema(\n schema: JsonSchemaLike | undefined,\n options: SampleOptions = {},\n spec?: unknown,\n): unknown {\n if (!schema) return null;\n try {\n return openapiSample(schema as never, options, spec as never);\n } catch (err) {\n // Sampler failures used to be silent, which meant \"no example\"\n // in the UI looked like a missing spec entry. Log so we can see\n // the real cause in dev (circular refs, missing type, etc.).\n consola.warn('[OpenapiViewer] sampleSchema failed:', err, { schema });\n return null;\n }\n}\n\n/** Same as ``sampleSchema`` but returns a pre-stringified JSON payload\n * ready to drop into a textarea / code block. Returns ``undefined``\n * when sampling fails so the UI can conditionally hide the example. */\nexport function sampleSchemaJson(\n schema: JsonSchemaLike | undefined,\n options: SampleOptions = {},\n spec?: unknown,\n): string | undefined {\n const value = sampleSchema(schema, options, spec);\n if (value === null || value === undefined) return undefined;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return undefined;\n }\n}\n","/**\n * URL utilities for the OpenAPI playground.\n *\n * Consolidated here to avoid the pre-existing split where\n * ``substituteUrlParameters`` lived in formatters.ts, base URL priority\n * lived inside ``useOpenApiSchema``, query params were never assembled\n * at all (that was a bug), and ``resolveAbsoluteUrl`` was tacked on\n * later.\n *\n * Conceptual model: a request URL is built from four layers, highest\n * priority first:\n *\n * 1. An absolute override URL the user pasted (rare — not plumbed\n * through the UI today, but the shape supports it).\n * 2. ``baseUrl`` — from ``SchemaSource.baseUrl`` → ``PlaygroundConfig.baseUrl``\n * → ``schema.servers[0].url``.\n * 3. Endpoint path template (``/pet/{petId}``) + substituted path params.\n * 4. Query string built from parameters that don't match any path\n * placeholder.\n *\n * Every helper below lives on one of those layers. ``UrlBuilder`` wires\n * them together when the caller has all four; individual functions are\n * exported for cases that only need one step (e.g. ``relativePath``\n * for display in the sidebar).\n */\n\nimport type { ApiEndpoint } from '../types';\n\n// ─── Path substitution ────────────────────────────────────────────────────────\n\nconst PATH_PARAM_RE = /\\{([^{}]+)\\}/g;\n\n/**\n * Return the list of ``{name}`` placeholders in a path template.\n * Preserves order, deduplicates.\n */\nexport function extractPathPlaceholders(template: string): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const match of template.matchAll(PATH_PARAM_RE)) {\n const name = match[1]!;\n if (!seen.has(name)) {\n seen.add(name);\n out.push(name);\n }\n }\n return out;\n}\n\n/**\n * Replace ``{name}`` placeholders with values from ``values``. Values\n * are URL-path-encoded with ``encodeURIComponent`` — safe for single\n * segments but escapes ``/`` too. That's intentional: a user typing\n * ``a/b`` into a path param should get ``a%2Fb`` so the server receives\n * the intended single segment, not two.\n *\n * Values are only substituted when non-empty after trimming.\n */\nexport function substitutePath(template: string, values: Record<string, string>): string {\n return template.replace(PATH_PARAM_RE, (whole, name) => {\n const v = values[name];\n return v && v.trim() !== '' ? encodeURIComponent(v) : whole;\n });\n}\n\n/** Placeholders that have no non-empty value in ``values``. */\nexport function unfilledPlaceholders(\n template: string,\n values: Record<string, string>,\n): string[] {\n return extractPathPlaceholders(template).filter(\n (name) => !(values[name] ?? '').trim(),\n );\n}\n\n// ─── Query assembly ───────────────────────────────────────────────────────────\n\n/**\n * Append a query string to ``url`` from the keys of ``values`` that\n * are not path placeholders in ``pathTemplate``. Existing query strings\n * are preserved: new keys are merged, existing keys are overwritten.\n *\n * Empty values are skipped (a form field that was left blank does not\n * become ``?foo=`` on the wire).\n */\nexport function appendQuery(\n url: string,\n values: Record<string, string>,\n pathTemplate: string,\n): string {\n const pathNames = new Set(extractPathPlaceholders(pathTemplate));\n const queryEntries = Object.entries(values).filter(\n ([name, value]) => !pathNames.has(name) && value && value.trim() !== '',\n );\n if (queryEntries.length === 0) return url;\n\n // Split any existing query so we can merge cleanly.\n const [base, existingQuery = ''] = url.split('?', 2);\n const params = new URLSearchParams(existingQuery);\n for (const [k, v] of queryEntries) params.set(k, v);\n const qs = params.toString();\n return qs ? `${base}?${qs}` : (base ?? url);\n}\n\n// ─── Absolute / relative ──────────────────────────────────────────────────────\n\n/**\n * Prepend ``window.location.origin`` when the URL is relative so the\n * result is runnable from a terminal via curl. No-op on SSR or when\n * already absolute.\n */\nexport function resolveAbsolute(url: string): string {\n if (!url) return url;\n if (/^https?:\\/\\//i.test(url)) return url;\n if (typeof window === 'undefined') return url;\n if (url.startsWith('//')) return `${window.location.protocol}${url}`;\n if (url.startsWith('/')) return `${window.location.origin}${url}`;\n return url;\n}\n\n/** Pull just the path out of any URL (absolute or relative). The\n * ``URL`` parser percent-encodes path segments, which turns OpenAPI\n * template braces (``{id}``) into ``%7Bid%7D``. We restore those so\n * unfilled templates render as the readable form authors wrote. */\nexport function relativePath(url: string): string {\n try {\n return new URL(url).pathname.replace(/%7B/gi, '{').replace(/%7D/gi, '}');\n } catch {\n return url;\n }\n}\n\n/**\n * Concatenate URL segments with exactly one slash between each. Works\n * whether inputs have trailing/leading slashes or not.\n *\n * joinUrl('https://api.example.com/', '/v3', 'pet') → 'https://api.example.com/v3/pet'\n */\nexport function joinUrl(...parts: string[]): string {\n return parts\n .filter((p) => p !== undefined && p !== null && p !== '')\n .map((p, i) => {\n if (i === 0) return String(p).replace(/\\/+$/, '');\n return String(p).replace(/^\\/+|\\/+$/g, '');\n })\n .filter((p) => p !== '')\n .join('/');\n}\n\n// ─── Base URL resolution ──────────────────────────────────────────────────────\n\nexport interface BaseUrlSources {\n /** Highest priority — per-schema override. */\n schemaSource?: string;\n /** Global config-level override. */\n config?: string;\n /** Fallback from the OpenAPI document itself. */\n fromServers?: string;\n}\n\n/**\n * Apply the documented priority chain:\n * ``schemaSource → config → fromServers → ''``.\n */\nexport function resolveBaseUrl(sources: BaseUrlSources): string {\n return sources.schemaSource || sources.config || sources.fromServers || '';\n}\n\n// ─── UrlBuilder ───────────────────────────────────────────────────────────────\n\n/**\n * End-to-end builder that takes an endpoint + user-entered parameters\n * and produces both the fetch URL and a copy-paste-friendly preview.\n */\nexport class UrlBuilder {\n constructor(\n private readonly endpoint: ApiEndpoint,\n private readonly parameters: Record<string, string>,\n ) {}\n\n /** What ``fetch()`` receives: substituted path + query string. Origin\n * is whatever the endpoint template already had (relative paths\n * stay relative so the browser resolves them against the page). */\n build(): string {\n const substituted = substitutePath(this.endpoint.path, this.parameters);\n return appendQuery(substituted, this.parameters, this.endpoint.path);\n }\n\n /** Same as ``build()`` but guaranteed absolute — for curl snippets\n * and anywhere the URL leaves the browser context. */\n buildAbsolute(): string {\n return resolveAbsolute(this.build());\n }\n\n /** Names of required path/query params still empty. */\n missingRequired(): string[] {\n if (!this.endpoint.parameters) return [];\n return this.endpoint.parameters\n .filter((p) => p.required && !(this.parameters[p.name] ?? '').trim())\n .map((p) => p.name);\n }\n\n /** Placeholders in the template with no matching value. Usually a\n * superset of ``missingRequired`` — catches schemas that forgot\n * to flag a path param as required. */\n unfilledPlaceholders(): string[] {\n return unfilledPlaceholders(this.endpoint.path, this.parameters);\n }\n}\n","/**\n * Export the current OpenAPI schema in formats friendly for LLM agents.\n *\n * Three flavours:\n * - raw: JSON.stringify(schema) — full fidelity, largest.\n * - compact: dereferenced + pruned (no xml/examples, short descriptions,\n * no whitespace). Usually 30–50% of raw.\n * - markdown: prose summary of endpoints + params + responses. Smallest,\n * best for small prompts. Drops response body schemas.\n *\n * Per-endpoint markdown is also exported so a Copy-for-AI button on a\n * single endpoint stays cheap and does not leak unrelated paths.\n *\n * ``baseUrl`` resolution is done by the caller; we just substitute the\n * resolved value into ``servers[0]`` so the copied schema points at the\n * live API, not at whatever ``schema.servers`` originally held.\n */\n\nimport type { ApiEndpoint, OpenApiSchema } from '../types';\nimport { relativePath, resolveBaseUrl } from './url';\n\n// ─── Dereference ──────────────────────────────────────────────────────────────\n\n/**\n * Walk a JSON object and replace every ``$ref`` with the resolved value.\n * Shallow circular-ref protection: stops at ``maxDepth`` to avoid infinite\n * recursion on self-referential schemas (common in recursive OpenAPI types).\n */\nexport function dereferenceSchema(schema: OpenApiSchema, maxDepth = 10): OpenApiSchema {\n const root = schema as unknown as Record<string, unknown>;\n\n function resolveRef(ref: string): unknown {\n // Only handle local refs (#/components/schemas/Foo). External refs are\n // out of scope — the schema we have in memory is already a single file.\n if (!ref.startsWith('#/')) return null;\n const parts = ref.slice(2).split('/');\n let node: unknown = root;\n for (const part of parts) {\n if (node && typeof node === 'object' && part in (node as Record<string, unknown>)) {\n node = (node as Record<string, unknown>)[part];\n } else {\n return null;\n }\n }\n return node;\n }\n\n function walk(value: unknown, depth: number): unknown {\n if (depth > maxDepth) return value;\n if (Array.isArray(value)) return value.map((v) => walk(v, depth + 1));\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (typeof obj.$ref === 'string') {\n const resolved = resolveRef(obj.$ref);\n if (resolved === null) return obj;\n return walk(resolved, depth + 1);\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) out[k] = walk(v, depth + 1);\n return out;\n }\n return value;\n }\n\n return walk(schema, 0) as OpenApiSchema;\n}\n\n// ─── Pruning helpers ──────────────────────────────────────────────────────────\n\nconst NOISY_KEYS = new Set(['xml', 'example', 'examples', 'externalDocs']);\nconst MAX_DESCRIPTION_LEN = 500;\n\n/**\n * In-place-friendly pruner (returns a new tree). Drops keys that only\n * add bytes without giving the LLM new semantic info, and truncates\n * very long prose descriptions.\n */\nfunction pruneForCompact(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(pruneForCompact);\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (NOISY_KEYS.has(k)) continue;\n if (k === 'description' && typeof v === 'string' && v.length > MAX_DESCRIPTION_LEN) {\n out[k] = v.slice(0, MAX_DESCRIPTION_LEN).trimEnd() + '…';\n continue;\n }\n out[k] = pruneForCompact(v);\n }\n return out;\n }\n return value;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/** Overwrite ``servers[0]`` with the resolved base URL if provided. */\nfunction withResolvedBaseUrl(schema: OpenApiSchema, baseUrl: string | undefined): OpenApiSchema {\n if (!baseUrl) return schema;\n return { ...schema, servers: [{ url: baseUrl }] };\n}\n\nexport function toRawJson(schema: OpenApiSchema, baseUrl?: string): string {\n return JSON.stringify(withResolvedBaseUrl(schema, baseUrl), null, 2);\n}\n\nexport function toCompactJson(schema: OpenApiSchema, baseUrl?: string): string {\n const resolved = dereferenceSchema(withResolvedBaseUrl(schema, baseUrl));\n const pruned = pruneForCompact(resolved);\n return JSON.stringify(pruned);\n}\n\n// ─── Markdown ────────────────────────────────────────────────────────────────\n\n\nexport function endpointToMarkdown(ep: ApiEndpoint): string {\n const lines: string[] = [];\n lines.push(`### ${ep.method} ${ep.path}`);\n if (ep.description) lines.push(ep.description);\n\n const pathParams = ep.parameters?.filter((p) => ep.path.includes(`{${p.name}}`)) ?? [];\n const queryParams = ep.parameters?.filter((p) => !ep.path.includes(`{${p.name}}`)) ?? [];\n\n if (pathParams.length > 0) {\n lines.push('', '**Path parameters**');\n for (const p of pathParams) {\n const req = p.required ? ' (required)' : '';\n const desc = p.description ? ` — ${p.description}` : '';\n lines.push(`- \\`${p.name}\\`: ${p.type}${req}${desc}`);\n }\n }\n if (queryParams.length > 0) {\n lines.push('', '**Query parameters**');\n for (const p of queryParams) {\n const req = p.required ? ' (required)' : '';\n const desc = p.description ? ` — ${p.description}` : '';\n lines.push(`- \\`${p.name}\\`: ${p.type}${req}${desc}`);\n }\n }\n if (ep.requestBody) {\n const desc = ep.requestBody.description ? ` — ${ep.requestBody.description}` : '';\n lines.push('', `**Request body:** ${ep.requestBody.type}${desc}`);\n }\n if (ep.responses && ep.responses.length > 0) {\n lines.push('', '**Responses**');\n for (const r of ep.responses) {\n lines.push(`- \\`${r.code}\\` — ${r.description}`);\n }\n }\n return lines.join('\\n');\n}\n\nexport function toMarkdown(\n schema: OpenApiSchema,\n endpoints: ApiEndpoint[],\n baseUrl?: string,\n): string {\n const lines: string[] = [];\n const info = schema.info;\n const resolvedBase = resolveBaseUrl({\n config: baseUrl,\n fromServers: schema.servers?.[0]?.url,\n });\n\n lines.push(`# ${info?.title ?? 'API'}${info?.version ? ` (v${info.version})` : ''}`);\n if (resolvedBase) lines.push('', `**Base URL:** \\`${resolvedBase}\\``);\n if (info?.description) lines.push('', info.description.trim());\n\n // Group by tag/category for readable output.\n const grouped = new Map<string, ApiEndpoint[]>();\n for (const ep of endpoints) {\n const arr = grouped.get(ep.category) ?? [];\n arr.push(ep);\n grouped.set(ep.category, arr);\n }\n\n const categories = Array.from(grouped.keys()).sort((a, b) => {\n if (a === 'Other') return 1;\n if (b === 'Other') return -1;\n return a.localeCompare(b);\n });\n\n for (const category of categories) {\n lines.push('', `## ${category}`);\n const list = grouped.get(category)!;\n for (const ep of list) {\n // Use relativePath for section headers to keep markdown compact —\n // the full URL is already available as \"Base URL\" above.\n const displayPath = relativePath(ep.path);\n const sub = endpointToMarkdown({ ...ep, path: displayPath });\n lines.push('', sub);\n }\n }\n\n return lines.join('\\n');\n}\n\n// ─── Size helper ──────────────────────────────────────────────────────────────\n\n/** Human-readable byte count: ``12.3 KB``, ``480 B``. */\nexport function formatBytes(s: string): string {\n const bytes = new Blob([s]).size;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n","'use client';\n\nimport consola from 'consola';\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useReducer, useRef\n} from 'react';\n\nimport { useSessionStorage } from '@djangocfg/ui-core/hooks';\n\nimport type {\n ApiEndpoint, ApiResponse, PlaygroundConfig, PlaygroundContextType, PlaygroundState,\n PlaygroundStep\n} from '../types';\nimport { parseRequestHeaders } from '../utils';\nimport { UrlBuilder } from '../utils/url';\nimport { getDefaultVersion } from '../utils/versionManager';\n\n// Session-scoped auth persistence. sessionStorage (not localStorage) so\n// the token dies when the browser tab closes — safer default for secrets.\nconst AUTH_KEY_STORAGE = 'openapi-playground:auth:apiKeyId';\nconst AUTH_BEARER_STORAGE = 'openapi-playground:auth:bearer';\n\n// ─── Initial state ────────────────────────────────────────────────────────────\n\nconst createInitialState = (): PlaygroundState => ({\n currentStep: 'endpoints',\n steps: ['endpoints', 'request', 'response'],\n selectedEndpoint: null,\n selectedCategory: 'All',\n searchTerm: '',\n selectedVersion: getDefaultVersion().id,\n requestUrl: '',\n requestMethod: 'GET',\n requestHeaders: '{\\n \"Content-Type\": \"application/json\"\\n}',\n requestBody: '',\n selectedApiKey: null,\n manualApiToken: '',\n parameters: {},\n response: null,\n loading: false,\n sidebarOpen: false,\n activeSchemaId: null,\n});\n\n// ─── Actions ──────────────────────────────────────────────────────────────────\n\ntype Action =\n | { type: 'SET_STEP'; step: PlaygroundStep }\n | { type: 'NEXT_STEP' }\n | { type: 'PREV_STEP' }\n | { type: 'SELECT_ENDPOINT'; endpoint: ApiEndpoint | null }\n | { type: 'SET_CATEGORY'; category: string }\n | { type: 'SET_SEARCH'; term: string }\n | { type: 'SET_VERSION'; version: string }\n | { type: 'SET_REQUEST_URL'; url: string }\n | { type: 'SET_REQUEST_METHOD'; method: string }\n | { type: 'SET_REQUEST_HEADERS'; headers: string }\n | { type: 'SET_REQUEST_BODY'; body: string }\n | { type: 'SET_API_KEY'; apiKeyId: string | null }\n | { type: 'SET_MANUAL_TOKEN'; token: string }\n | { type: 'SET_PARAMETERS'; parameters: Record<string, string> }\n | { type: 'SET_RESPONSE'; response: ApiResponse | null }\n | { type: 'SET_LOADING'; loading: boolean }\n // Batched: set loading + clear response atomically (avoids two renders on send)\n | { type: 'REQUEST_START' }\n // Batched: set response + loading=false + advance step atomically (avoids three renders)\n | { type: 'REQUEST_SUCCESS'; response: ApiResponse }\n // Batched: set error response + loading=false atomically\n | { type: 'REQUEST_ERROR'; response: ApiResponse }\n | { type: 'SET_SIDEBAR'; open: boolean }\n | { type: 'SET_ACTIVE_SCHEMA_ID'; id: string | null }\n | { type: 'SYNC_API_KEY_HEADER'; headers: string }\n | { type: 'CLEAR_API_KEY_SELECTION' }\n | { type: 'SYNC_URL'; url: string }\n | { type: 'RESET' };\n\n// ─── Reducer ──────────────────────────────────────────────────────────────────\n\nfunction reducer(state: PlaygroundState, action: Action): PlaygroundState {\n switch (action.type) {\n case 'SET_STEP':\n return { ...state, currentStep: action.step };\n\n case 'NEXT_STEP': {\n const i = state.steps.indexOf(state.currentStep);\n return i < state.steps.length - 1\n ? { ...state, currentStep: state.steps[i + 1]! }\n : state;\n }\n\n case 'PREV_STEP': {\n const i = state.steps.indexOf(state.currentStep);\n return i > 0 ? { ...state, currentStep: state.steps[i - 1]! } : state;\n }\n\n case 'SELECT_ENDPOINT': {\n if (!action.endpoint) return { ...state, selectedEndpoint: null };\n // Guard: selecting the same endpoint is a no-op for response state.\n // Without this, clicking \"Try it\" on the already-loaded endpoint\n // would wipe its response for no reason.\n const same =\n state.selectedEndpoint?.method === action.endpoint.method &&\n state.selectedEndpoint?.path === action.endpoint.path;\n // Pre-fill request body from the OpenAPI example when available.\n // For a brand-new endpoint selection, a realistic example is more\n // useful than the {\"key\":\"value\"} placeholder. If the user already\n // has a saved draft, EndpointDraftSync will overwrite this with the\n // persisted value once it hydrates.\n const exampleBody = action.endpoint.requestBody?.example ?? '';\n return {\n ...state,\n selectedEndpoint: action.endpoint,\n requestMethod: action.endpoint.method,\n requestUrl: action.endpoint.path,\n parameters: same ? state.parameters : {},\n requestBody: same ? state.requestBody : exampleBody,\n // Switching to a different endpoint: the previous response no\n // longer belongs here. Clear it so the playground panel collapses\n // back to single-column until the user sends a new request.\n response: same ? state.response : null,\n currentStep: 'request',\n };\n }\n\n case 'SET_CATEGORY': return { ...state, selectedCategory: action.category };\n case 'SET_SEARCH': return { ...state, searchTerm: action.term };\n case 'SET_VERSION': return { ...state, selectedVersion: action.version };\n case 'SET_REQUEST_URL': return { ...state, requestUrl: action.url };\n case 'SET_REQUEST_METHOD': return { ...state, requestMethod: action.method };\n case 'SET_REQUEST_HEADERS': return { ...state, requestHeaders: action.headers };\n case 'SET_REQUEST_BODY': return { ...state, requestBody: action.body };\n case 'SET_API_KEY': return { ...state, selectedApiKey: action.apiKeyId };\n case 'SET_MANUAL_TOKEN': return { ...state, manualApiToken: action.token };\n case 'SET_PARAMETERS': return { ...state, parameters: action.parameters };\n case 'SET_RESPONSE': return { ...state, response: action.response };\n case 'SET_LOADING': return { ...state, loading: action.loading };\n\n case 'REQUEST_START':\n return { ...state, loading: true, response: null };\n\n case 'REQUEST_SUCCESS':\n return { ...state, loading: false, response: action.response, currentStep: 'response' };\n\n case 'REQUEST_ERROR':\n return { ...state, loading: false, response: action.response };\n\n case 'SET_SIDEBAR': return { ...state, sidebarOpen: action.open };\n case 'SET_ACTIVE_SCHEMA_ID': return { ...state, activeSchemaId: action.id };\n case 'SYNC_API_KEY_HEADER': return { ...state, requestHeaders: action.headers };\n case 'CLEAR_API_KEY_SELECTION': return { ...state, selectedApiKey: null };\n case 'SYNC_URL': return { ...state, requestUrl: action.url };\n case 'RESET': return createInitialState();\n\n default: return state;\n }\n}\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nconst PlaygroundContext = createContext<PlaygroundContextType | undefined>(undefined);\n\nexport const usePlaygroundContext = () => {\n const context = useContext(PlaygroundContext);\n if (!context) throw new Error('usePlaygroundContext must be used within a PlaygroundProvider');\n return context;\n};\n\n// ─── Provider ─────────────────────────────────────────────────────────────────\n\ninterface PlaygroundProviderProps {\n children: ReactNode;\n config: PlaygroundConfig;\n}\n\nexport const PlaygroundProvider: React.FC<PlaygroundProviderProps> = ({ children, config }) => {\n const [state, dispatch] = useReducer(reducer, undefined, createInitialState);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // API keys come from the caller via ``config.apiKeys``. Empty\n // fallback keeps the playground working when the caller hasn't\n // wired any keys yet (public docs / unauthenticated demo).\n const apiKeys = React.useMemo(\n () => config.apiKeys ?? [],\n [config.apiKeys],\n );\n const isLoadingApiKeys = config.apiKeysLoading ?? false;\n\n // ── Auth persistence (session-scoped) ─────────────────────────────────────\n // Use sessionStorage so the chosen API key / bearer token survive reload\n // within the same tab but die when the tab closes. That matches how\n // users expect auth sessions to work and keeps secrets out of localStorage.\n const [storedApiKeyId, setStoredApiKeyId] = useSessionStorage<string | null>(\n AUTH_KEY_STORAGE,\n null,\n );\n const [storedBearer, setStoredBearer] = useSessionStorage<string>(\n AUTH_BEARER_STORAGE,\n '',\n );\n const hasHydratedAuthRef = useRef(false);\n\n // Hydrate auth state from sessionStorage exactly once.\n useEffect(() => {\n if (hasHydratedAuthRef.current) return;\n hasHydratedAuthRef.current = true;\n if (storedApiKeyId) dispatch({ type: 'SET_API_KEY', apiKeyId: storedApiKeyId });\n if (storedBearer) dispatch({ type: 'SET_MANUAL_TOKEN', token: storedBearer });\n // We intentionally don't depend on the stored values — this effect\n // runs once on mount; later changes are written out by the effects\n // below, not re-hydrated.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Persist selection → sessionStorage as it changes.\n useEffect(() => {\n if (!hasHydratedAuthRef.current) return;\n setStoredApiKeyId(state.selectedApiKey);\n }, [state.selectedApiKey, setStoredApiKeyId]);\n\n useEffect(() => {\n if (!hasHydratedAuthRef.current) return;\n setStoredBearer(state.manualApiToken);\n }, [state.manualApiToken, setStoredBearer]);\n\n // Auto-select first API key — only when there's no persisted selection\n // to restore. Otherwise the first-render auto-pick would clobber a\n // session that had a non-first key chosen.\n useEffect(() => {\n if (!hasHydratedAuthRef.current) return;\n if (!isLoadingApiKeys && apiKeys.length > 0 && !state.selectedApiKey && !storedApiKeyId) {\n dispatch({ type: 'SET_API_KEY', apiKeyId: apiKeys[0]?.id || null });\n }\n }, [apiKeys, isLoadingApiKeys, state.selectedApiKey, storedApiKeyId]);\n\n // Sync X-API-Key header when selected key changes\n useEffect(() => {\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n if (state.selectedApiKey) {\n const apiKey = apiKeys.find((k) => k.id === state.selectedApiKey);\n if (!apiKey) {\n dispatch({ type: 'CLEAR_API_KEY_SELECTION' });\n return;\n }\n // Header carries the raw ``secret`` (not the row id) — that's\n // what the server validates. Falls back to ``id`` for legacy\n // callers still on the old ApiKey shape.\n const keyValue = apiKey.secret || apiKey.id;\n if (headers['X-API-Key'] !== keyValue) {\n headers['X-API-Key'] = keyValue;\n dispatch({ type: 'SYNC_API_KEY_HEADER', headers: JSON.stringify(headers, null, 2) });\n }\n } else if (headers['X-API-Key']) {\n delete headers['X-API-Key'];\n dispatch({ type: 'SYNC_API_KEY_HEADER', headers: JSON.stringify(headers, null, 2) });\n }\n } catch (error) {\n consola.error('Error updating headers:', error);\n }\n }, [state.selectedApiKey, apiKeys]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Sync URL when path parameters or query parameters change. UrlBuilder\n // handles BOTH path substitution and query string assembly — the old\n // implementation only did the former, which silently dropped every\n // non-path parameter the user entered.\n useEffect(() => {\n if (!state.selectedEndpoint) return;\n const updated = new UrlBuilder(state.selectedEndpoint, state.parameters).build();\n if (updated !== state.requestUrl) {\n dispatch({ type: 'SYNC_URL', url: updated });\n }\n }, [state.parameters, state.selectedEndpoint]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Stable action dispatchers ─────────────────────────────────────────────\n\n const setCurrentStep = useCallback((step: PlaygroundStep) => dispatch({ type: 'SET_STEP', step }), []);\n const goToNextStep = useCallback(() => dispatch({ type: 'NEXT_STEP' }), []);\n const goToPreviousStep = useCallback(() => dispatch({ type: 'PREV_STEP' }), []);\n\n const setSelectedEndpoint = useCallback((endpoint: ApiEndpoint | null) =>\n dispatch({ type: 'SELECT_ENDPOINT', endpoint }), []);\n\n const setSelectedCategory = useCallback((category: string) =>\n dispatch({ type: 'SET_CATEGORY', category }), []);\n\n const setSearchTerm = useCallback((term: string) => dispatch({ type: 'SET_SEARCH', term }), []);\n const setSelectedVersion = useCallback((version: string) => dispatch({ type: 'SET_VERSION', version }), []);\n const setRequestUrl = useCallback((url: string) => dispatch({ type: 'SET_REQUEST_URL', url }), []);\n const setRequestMethod = useCallback((method: string) => dispatch({ type: 'SET_REQUEST_METHOD', method }), []);\n const setRequestHeaders = useCallback((headers: string) => dispatch({ type: 'SET_REQUEST_HEADERS', headers }), []);\n const setRequestBody = useCallback((body: string) => dispatch({ type: 'SET_REQUEST_BODY', body }), []);\n const setSelectedApiKey = useCallback((apiKeyId: string | null) => dispatch({ type: 'SET_API_KEY', apiKeyId }), []);\n const setManualApiToken = useCallback((token: string) => dispatch({ type: 'SET_MANUAL_TOKEN', token }), []);\n const setParameters = useCallback((parameters: Record<string, string>) =>\n dispatch({ type: 'SET_PARAMETERS', parameters }), []);\n const setResponse = useCallback((response: ApiResponse | null) =>\n dispatch({ type: 'SET_RESPONSE', response }), []);\n const setLoading = useCallback((loading: boolean) => dispatch({ type: 'SET_LOADING', loading }), []);\n const setSidebarOpen = useCallback((open: boolean) => dispatch({ type: 'SET_SIDEBAR', open }), []);\n const setActiveSchemaId = useCallback((id: string | null) => dispatch({ type: 'SET_ACTIVE_SCHEMA_ID', id }), []);\n const clearAll = useCallback(() => dispatch({ type: 'RESET' }), []);\n\n // ── Send request ──────────────────────────────────────────────────────────\n\n const sendRequest = useCallback(async () => {\n if (!state.requestUrl) {\n consola.error('No URL provided');\n return;\n }\n\n abortControllerRef.current?.abort();\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n // Single dispatch: loading=true + clear response\n dispatch({ type: 'REQUEST_START' });\n\n const startTime = Date.now();\n\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n let bearerToken: string | null = null;\n if (state.manualApiToken) {\n bearerToken = state.manualApiToken;\n } else if (typeof window !== 'undefined') {\n bearerToken = window.localStorage.getItem('auth_token');\n }\n\n if (bearerToken) headers['Authorization'] = `Bearer ${bearerToken}`;\n\n const requestOptions: RequestInit = {\n method: state.requestMethod,\n headers,\n signal: controller.signal,\n };\n\n if (state.requestBody && state.requestMethod !== 'GET') {\n requestOptions.body = state.requestBody;\n }\n\n const response = await fetch(state.requestUrl, requestOptions);\n const duration = Date.now() - startTime;\n const responseText = await response.text();\n\n let responseData: unknown;\n try { responseData = JSON.parse(responseText); }\n catch { responseData = responseText; }\n\n // Single dispatch: response + loading=false + step='response'\n dispatch({\n type: 'REQUEST_SUCCESS',\n response: {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data: responseData,\n duration,\n },\n });\n\n consola.success(`${state.requestMethod} ${state.requestUrl} → ${response.status} (${duration}ms)`);\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') return;\n consola.error('Request failed:', error);\n\n // Single dispatch: error response + loading=false\n dispatch({\n type: 'REQUEST_ERROR',\n response: {\n error: error instanceof Error ? error.message : 'Request failed',\n duration: Date.now() - startTime,\n },\n });\n }\n }, [state.requestUrl, state.requestHeaders, state.manualApiToken, state.requestMethod, state.requestBody]);\n\n // ── Context value ─────────────────────────────────────────────────────────\n\n const contextValue: PlaygroundContextType = {\n state,\n config,\n apiKeys,\n apiKeysLoading: isLoadingApiKeys,\n setCurrentStep,\n goToNextStep,\n goToPreviousStep,\n setSelectedEndpoint,\n setSelectedCategory,\n setSearchTerm,\n setSelectedVersion,\n setRequestUrl,\n setRequestMethod,\n setRequestHeaders,\n setRequestBody,\n setSelectedApiKey,\n setManualApiToken,\n setParameters,\n setResponse,\n setLoading,\n setSidebarOpen,\n setActiveSchemaId,\n clearAll,\n sendRequest,\n };\n\n return <PlaygroundContext.Provider value={contextValue}>{children}</PlaygroundContext.Provider>;\n};\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunk2SMCH62O_cjs = require('./chunk-2SMCH62O.cjs');
4
- var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
3
+ var chunkFP2RLYQZ_cjs = require('./chunk-FP2RLYQZ.cjs');
4
+ var chunkOLISEQHS_cjs = require('./chunk-OLISEQHS.cjs');
5
5
  var react = require('react');
6
6
  var reactJsonTree = require('react-json-tree');
7
7
  var jsxRuntime = require('react/jsx-runtime');
@@ -33,7 +33,7 @@ var JSON_TREE_THEME = {
33
33
  base0F: "#f43f5e"
34
34
  // deprecations
35
35
  };
36
- var JsonContent = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
36
+ var JsonContent = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({
37
37
  data,
38
38
  renderKey,
39
39
  title,
@@ -62,13 +62,13 @@ var JsonContent = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
62
62
  }
63
63
  return null;
64
64
  } : () => null;
65
- const postprocessValue = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((value) => {
65
+ const postprocessValue = /* @__PURE__ */ chunkOLISEQHS_cjs.__name((value) => {
66
66
  if (typeof value === "string" && value.length > maxStringLength) {
67
67
  return value.substring(0, maxStringLength) + "... (truncated)";
68
68
  }
69
69
  return value;
70
70
  }, "postprocessValue");
71
- const isCustomNode = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((value) => typeof value === "string" && (value.startsWith("http://") || value.startsWith("https://")), "isCustomNode");
71
+ const isCustomNode = /* @__PURE__ */ chunkOLISEQHS_cjs.__name((value) => typeof value === "string" && (value.startsWith("http://") || value.startsWith("https://")), "isCustomNode");
72
72
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `overflow-auto h-full ${padding}`, style: fontSize ? { fontSize } : void 0, children: [
73
73
  showTitle && title && /* @__PURE__ */ jsxRuntime.jsx("h6", { className: "text-sm font-semibold text-foreground mb-2", children: title }),
74
74
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -98,11 +98,11 @@ function useJsonExpand({
98
98
  const [expandAll, setExpandAll] = react.useState(null);
99
99
  const [renderKey, setRenderKey] = react.useState(0);
100
100
  const isExpanded = expandAll === true || expandAll === null && maxAutoExpandDepth > 0;
101
- const toggle = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => {
101
+ const toggle = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(() => {
102
102
  setExpandAll(isExpanded ? false : true);
103
103
  setRenderKey((prev) => prev + 1);
104
104
  }, "toggle");
105
- const shouldExpandNodeInitially = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((_keyPath, nodeData, level) => {
105
+ const shouldExpandNodeInitially = /* @__PURE__ */ chunkOLISEQHS_cjs.__name((_keyPath, nodeData, level) => {
106
106
  if (expandAll === true) return true;
107
107
  if (expandAll === false) return false;
108
108
  if (level <= maxAutoExpandDepth) return true;
@@ -114,7 +114,7 @@ function useJsonExpand({
114
114
  }, "shouldExpandNodeInitially");
115
115
  return { isExpanded, toggle, renderKey, shouldExpandNodeInitially };
116
116
  }
117
- chunkWGEGR3DF_cjs.__name(useJsonExpand, "useJsonExpand");
117
+ chunkOLISEQHS_cjs.__name(useJsonExpand, "useJsonExpand");
118
118
 
119
119
  // src/tools/JsonTree/types.ts
120
120
  var MODE_PRESETS = {
@@ -139,7 +139,7 @@ var MODE_PRESETS = {
139
139
  maxAutoExpandDepth: 1
140
140
  }
141
141
  };
142
- var JsonTreeComponent = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
142
+ var JsonTreeComponent = /* @__PURE__ */ chunkOLISEQHS_cjs.__name(({
143
143
  title,
144
144
  data,
145
145
  mode = "full",
@@ -181,11 +181,11 @@ var JsonTreeComponent = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
181
181
  const contentPadding = mode === "full" ? "p-4" : mode === "compact" ? "p-2" : "p-1";
182
182
  const showControls = (showExpandControls || showActionButtons) && mode === "full";
183
183
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: containerClasses, children: [
184
- showControls && /* @__PURE__ */ jsxRuntime.jsxs(chunk2SMCH62O_cjs.FloatingToolbar, { containerRef, children: [
185
- showExpandControls && /* @__PURE__ */ jsxRuntime.jsx(chunk2SMCH62O_cjs.ExpandAction, { isExpanded, onToggle: toggle }),
184
+ showControls && /* @__PURE__ */ jsxRuntime.jsxs(chunkFP2RLYQZ_cjs.FloatingToolbar, { containerRef, children: [
185
+ showExpandControls && /* @__PURE__ */ jsxRuntime.jsx(chunkFP2RLYQZ_cjs.ExpandAction, { isExpanded, onToggle: toggle }),
186
186
  showActionButtons && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
187
- /* @__PURE__ */ jsxRuntime.jsx(chunk2SMCH62O_cjs.CopyAction, { value: jsonString, title: "Copy JSON" }),
188
- /* @__PURE__ */ jsxRuntime.jsx(chunk2SMCH62O_cjs.DownloadAction, { value: jsonString, filename: "data.json", mimeType: "application/json", title: "Download JSON" })
187
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFP2RLYQZ_cjs.CopyAction, { value: jsonString, title: "Copy JSON" }),
188
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFP2RLYQZ_cjs.DownloadAction, { value: jsonString, filename: "data.json", mimeType: "application/json", title: "Download JSON" })
189
189
  ] })
190
190
  ] }),
191
191
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -210,5 +210,5 @@ var JsonTreeComponent = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
210
210
  var JsonTree_default = JsonTreeComponent;
211
211
 
212
212
  exports.JsonTree_default = JsonTree_default;
213
- //# sourceMappingURL=chunk-33AMWFBZ.cjs.map
214
- //# sourceMappingURL=chunk-33AMWFBZ.cjs.map
213
+ //# sourceMappingURL=chunk-SGP7V2UW.cjs.map
214
+ //# sourceMappingURL=chunk-SGP7V2UW.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/JsonTree/components/JsonContent.tsx","../src/tools/JsonTree/hooks/useJsonExpand.ts","../src/tools/JsonTree/types.ts","../src/tools/JsonTree/index.tsx"],"names":["__name","jsxs","jsx","JSONTree","useState","useRef","useMemo","FloatingToolbar","ExpandAction","Fragment","CopyAction","DownloadAction"],"mappings":"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","file":"chunk-33AMWFBZ.cjs","sourcesContent":["'use client';\n\nimport React from 'react';\nimport { CommonExternalProps, JSONTree } from 'react-json-tree';\n\nconst JSON_TREE_THEME = {\n scheme: 'djangocfg-dark',\n base00: 'transparent',\n base01: '#1a1a1a',\n base02: '#2a2a2a',\n base03: '#6b7280',\n base04: '#9ca3af',\n base05: '#e5e7eb',\n base06: '#f3f4f6',\n base07: '#ffffff',\n base08: '#ef4444', // null, undefined\n base09: '#f97316', // numbers\n base0A: '#eab308', // strings\n base0B: '#22c55e', // booleans\n base0C: '#06b6d4', // dates, regex\n base0D: '#3b82f6', // keys\n base0E: '#a855f7', // functions\n base0F: '#f43f5e', // deprecations\n};\n\ninterface JsonContentProps {\n data: unknown;\n renderKey: number;\n title?: string;\n showTitle: boolean;\n padding: string;\n collectionLimit: number;\n preserveKeyOrder: boolean;\n showCollectionInfo: boolean;\n maxStringLength: number;\n fontSize?: string;\n shouldExpandNodeInitially: (keyPath: readonly (string | number)[], nodeData: unknown, level: number) => boolean;\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport const JsonContent: React.FC<JsonContentProps> = ({\n data,\n renderKey,\n title,\n showTitle,\n padding,\n collectionLimit,\n preserveKeyOrder,\n showCollectionInfo,\n maxStringLength,\n fontSize,\n shouldExpandNodeInitially,\n jsonTreeProps = {},\n}) => {\n const getItemString = showCollectionInfo\n ? (nodeType: string, nodeData: unknown) => {\n if (nodeType === 'Array') {\n const length = Array.isArray(nodeData) ? nodeData.length : 0;\n return length > 0 ? <span className=\"text-muted-foreground text-xs\">({length})</span> : null;\n }\n if (nodeType === 'Object') {\n const keys = nodeData && typeof nodeData === 'object' ? Object.keys(nodeData) : [];\n return keys.length > 0 ? <span className=\"text-muted-foreground text-xs\">{`{${keys.length}}`}</span> : null;\n }\n return null;\n }\n : () => null;\n\n const postprocessValue = (value: unknown) => {\n if (typeof value === 'string' && value.length > maxStringLength) {\n return value.substring(0, maxStringLength) + '... (truncated)';\n }\n return value;\n };\n\n const isCustomNode = (value: unknown) =>\n typeof value === 'string' && (value.startsWith('http://') || value.startsWith('https://'));\n\n return (\n <div className={`overflow-auto h-full ${padding}`} style={fontSize ? { fontSize } : undefined}>\n {showTitle && title && (\n <h6 className=\"text-sm font-semibold text-foreground mb-2\">{title}</h6>\n )}\n <JSONTree\n key={renderKey}\n data={data}\n theme={JSON_TREE_THEME}\n invertTheme={false}\n hideRoot={true}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n getItemString={getItemString}\n postprocessValue={postprocessValue}\n isCustomNode={isCustomNode}\n collectionLimit={collectionLimit}\n sortObjectKeys={!preserveKeyOrder}\n {...jsonTreeProps}\n />\n </div>\n );\n};\n","'use client';\n\nimport { useState } from 'react';\n\ninterface UseJsonExpandOptions {\n maxAutoExpandDepth: number;\n maxAutoExpandArrayItems: number;\n maxAutoExpandObjectKeys: number;\n}\n\n/**\n * Manages expand/collapse state for JsonTree.\n * null = smart auto-expand mode (uses depth/size heuristics)\n * true = all expanded (user override)\n * false = all collapsed (user override)\n */\nexport function useJsonExpand({\n maxAutoExpandDepth,\n maxAutoExpandArrayItems,\n maxAutoExpandObjectKeys,\n}: UseJsonExpandOptions) {\n const [expandAll, setExpandAll] = useState<boolean | null>(null);\n const [renderKey, setRenderKey] = useState(0);\n\n // Reflects the effective visual state — used to show correct icon\n const isExpanded = expandAll === true || (expandAll === null && maxAutoExpandDepth > 0);\n\n const toggle = () => {\n setExpandAll(isExpanded ? false : true);\n setRenderKey(prev => prev + 1);\n };\n\n const shouldExpandNodeInitially = (\n _keyPath: readonly (string | number)[],\n nodeData: unknown,\n level: number,\n ): boolean => {\n if (expandAll === true) return true;\n if (expandAll === false) return false;\n // null = auto mode\n if (level <= maxAutoExpandDepth) return true;\n if (Array.isArray(nodeData) && nodeData.length <= maxAutoExpandArrayItems) return true;\n if (nodeData && typeof nodeData === 'object' && !Array.isArray(nodeData)) {\n return Object.keys(nodeData).length <= maxAutoExpandObjectKeys;\n }\n return false;\n };\n\n return { isExpanded, toggle, renderKey, shouldExpandNodeInitially };\n}\n","import { CommonExternalProps } from 'react-json-tree';\n\nexport type JsonTreeMode = 'full' | 'compact' | 'inline';\n\nexport interface JsonTreeConfig {\n /** Maximum depth to expand automatically (default: 2) */\n maxAutoExpandDepth?: number;\n /** Maximum items in array to auto-expand (default: 10) */\n maxAutoExpandArrayItems?: number;\n /** Maximum object keys to auto-expand (default: 5) */\n maxAutoExpandObjectKeys?: number;\n /** Maximum string length before truncation (default: 200) */\n maxStringLength?: number;\n /** Collection limit for performance (default: 50) */\n collectionLimit?: number;\n /** Whether to show collection info (array length, object keys count) */\n showCollectionInfo?: boolean;\n /** Whether to show expand/collapse all buttons */\n showExpandControls?: boolean;\n /** Whether to show copy/download buttons */\n showActionButtons?: boolean;\n /** Custom CSS classes for the container */\n className?: string;\n /** Whether to preserve object key order (default: true) */\n preserveKeyOrder?: boolean;\n /** Font size for tree nodes (default: '12px' for compact/inline, '13px' for full) */\n fontSize?: string;\n}\n\nexport interface JsonTreeComponentProps {\n title?: string;\n data: unknown;\n /**\n * Extra top offset in px for the floating toolbar — use when your layout\n * has a non-sticky header that useNavbarHeight cannot auto-detect.\n * Adds to the auto-detected navbar height.\n */\n toolbarOffset?: number;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n /** Override for react-json-tree props */\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport const MODE_PRESETS: Record<JsonTreeMode, Partial<JsonTreeConfig>> = {\n full: {\n showExpandControls: true,\n showActionButtons: true,\n showCollectionInfo: true,\n fontSize: '13px',\n },\n compact: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: true,\n fontSize: '11px',\n maxAutoExpandDepth: 1,\n },\n inline: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: false,\n fontSize: '11px',\n maxAutoExpandDepth: 1,\n },\n};\n","'use client';\n\nimport React, { useMemo, useRef } from 'react';\n\nimport { FloatingToolbar } from '../../components/FloatingToolbar';\nimport { CopyAction, DownloadAction, ExpandAction } from '../../components/FloatingToolbar/actions';\nimport { JsonContent } from './components/JsonContent';\nimport { useJsonExpand } from './hooks/useJsonExpand';\nimport { JsonTreeComponentProps, MODE_PRESETS } from './types';\n\nexport type { Language } from 'prism-react-renderer';\nexport type { JsonTreeConfig, JsonTreeComponentProps, JsonTreeMode } from './types';\n\nconst JsonTreeComponent = ({\n title,\n data,\n mode = 'full',\n config = {},\n jsonTreeProps = {},\n}: JsonTreeComponentProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const mergedConfig = useMemo(() => ({ ...MODE_PRESETS[mode], ...config }), [mode, config]);\n\n const {\n maxAutoExpandDepth = 2,\n maxAutoExpandArrayItems = 10,\n maxAutoExpandObjectKeys = 5,\n maxStringLength = 200,\n collectionLimit = 50,\n showCollectionInfo = true,\n showExpandControls = true,\n showActionButtons = true,\n className = '',\n preserveKeyOrder = true,\n fontSize,\n } = mergedConfig;\n\n const { isExpanded, toggle, renderKey, shouldExpandNodeInitially } = useJsonExpand({\n maxAutoExpandDepth,\n maxAutoExpandArrayItems,\n maxAutoExpandObjectKeys,\n });\n\n const jsonString = useMemo(() => JSON.stringify(data, null, 2), [data]);\n\n const containerClasses = useMemo(() => {\n const base = 'relative w-full';\n switch (mode) {\n case 'full': return `${base} border border-border rounded-sm ${className}`;\n case 'compact': return `${base} border border-border/50 rounded-md ${className}`;\n default: return `${base} ${className}`;\n }\n }, [mode, className]);\n\n const contentPadding = mode === 'full' ? 'p-4' : mode === 'compact' ? 'p-2' : 'p-1';\n const showControls = (showExpandControls || showActionButtons) && mode === 'full';\n\n return (\n <div ref={containerRef} className={containerClasses}>\n {showControls && (\n <FloatingToolbar containerRef={containerRef}>\n {showExpandControls && <ExpandAction isExpanded={isExpanded} onToggle={toggle} />}\n {showActionButtons && (\n <>\n <CopyAction value={jsonString} title=\"Copy JSON\" />\n <DownloadAction value={jsonString} filename=\"data.json\" mimeType=\"application/json\" title=\"Download JSON\" />\n </>\n )}\n </FloatingToolbar>\n )}\n\n <JsonContent\n data={data}\n renderKey={renderKey}\n title={title}\n showTitle={mode === 'full'}\n padding={contentPadding}\n collectionLimit={collectionLimit}\n preserveKeyOrder={preserveKeyOrder}\n showCollectionInfo={showCollectionInfo}\n maxStringLength={maxStringLength}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n fontSize={fontSize}\n jsonTreeProps={jsonTreeProps}\n />\n </div>\n );\n};\n\nexport default JsonTreeComponent;\n"]}
1
+ {"version":3,"sources":["../src/tools/JsonTree/components/JsonContent.tsx","../src/tools/JsonTree/hooks/useJsonExpand.ts","../src/tools/JsonTree/types.ts","../src/tools/JsonTree/index.tsx"],"names":["__name","jsxs","jsx","JSONTree","useState","useRef","useMemo","FloatingToolbar","ExpandAction","Fragment","CopyAction","DownloadAction"],"mappings":"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","file":"chunk-SGP7V2UW.cjs","sourcesContent":["'use client';\n\nimport React from 'react';\nimport { CommonExternalProps, JSONTree } from 'react-json-tree';\n\nconst JSON_TREE_THEME = {\n scheme: 'djangocfg-dark',\n base00: 'transparent',\n base01: '#1a1a1a',\n base02: '#2a2a2a',\n base03: '#6b7280',\n base04: '#9ca3af',\n base05: '#e5e7eb',\n base06: '#f3f4f6',\n base07: '#ffffff',\n base08: '#ef4444', // null, undefined\n base09: '#f97316', // numbers\n base0A: '#eab308', // strings\n base0B: '#22c55e', // booleans\n base0C: '#06b6d4', // dates, regex\n base0D: '#3b82f6', // keys\n base0E: '#a855f7', // functions\n base0F: '#f43f5e', // deprecations\n};\n\ninterface JsonContentProps {\n data: unknown;\n renderKey: number;\n title?: string;\n showTitle: boolean;\n padding: string;\n collectionLimit: number;\n preserveKeyOrder: boolean;\n showCollectionInfo: boolean;\n maxStringLength: number;\n fontSize?: string;\n shouldExpandNodeInitially: (keyPath: readonly (string | number)[], nodeData: unknown, level: number) => boolean;\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport const JsonContent: React.FC<JsonContentProps> = ({\n data,\n renderKey,\n title,\n showTitle,\n padding,\n collectionLimit,\n preserveKeyOrder,\n showCollectionInfo,\n maxStringLength,\n fontSize,\n shouldExpandNodeInitially,\n jsonTreeProps = {},\n}) => {\n const getItemString = showCollectionInfo\n ? (nodeType: string, nodeData: unknown) => {\n if (nodeType === 'Array') {\n const length = Array.isArray(nodeData) ? nodeData.length : 0;\n return length > 0 ? <span className=\"text-muted-foreground text-xs\">({length})</span> : null;\n }\n if (nodeType === 'Object') {\n const keys = nodeData && typeof nodeData === 'object' ? Object.keys(nodeData) : [];\n return keys.length > 0 ? <span className=\"text-muted-foreground text-xs\">{`{${keys.length}}`}</span> : null;\n }\n return null;\n }\n : () => null;\n\n const postprocessValue = (value: unknown) => {\n if (typeof value === 'string' && value.length > maxStringLength) {\n return value.substring(0, maxStringLength) + '... (truncated)';\n }\n return value;\n };\n\n const isCustomNode = (value: unknown) =>\n typeof value === 'string' && (value.startsWith('http://') || value.startsWith('https://'));\n\n return (\n <div className={`overflow-auto h-full ${padding}`} style={fontSize ? { fontSize } : undefined}>\n {showTitle && title && (\n <h6 className=\"text-sm font-semibold text-foreground mb-2\">{title}</h6>\n )}\n <JSONTree\n key={renderKey}\n data={data}\n theme={JSON_TREE_THEME}\n invertTheme={false}\n hideRoot={true}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n getItemString={getItemString}\n postprocessValue={postprocessValue}\n isCustomNode={isCustomNode}\n collectionLimit={collectionLimit}\n sortObjectKeys={!preserveKeyOrder}\n {...jsonTreeProps}\n />\n </div>\n );\n};\n","'use client';\n\nimport { useState } from 'react';\n\ninterface UseJsonExpandOptions {\n maxAutoExpandDepth: number;\n maxAutoExpandArrayItems: number;\n maxAutoExpandObjectKeys: number;\n}\n\n/**\n * Manages expand/collapse state for JsonTree.\n * null = smart auto-expand mode (uses depth/size heuristics)\n * true = all expanded (user override)\n * false = all collapsed (user override)\n */\nexport function useJsonExpand({\n maxAutoExpandDepth,\n maxAutoExpandArrayItems,\n maxAutoExpandObjectKeys,\n}: UseJsonExpandOptions) {\n const [expandAll, setExpandAll] = useState<boolean | null>(null);\n const [renderKey, setRenderKey] = useState(0);\n\n // Reflects the effective visual state — used to show correct icon\n const isExpanded = expandAll === true || (expandAll === null && maxAutoExpandDepth > 0);\n\n const toggle = () => {\n setExpandAll(isExpanded ? false : true);\n setRenderKey(prev => prev + 1);\n };\n\n const shouldExpandNodeInitially = (\n _keyPath: readonly (string | number)[],\n nodeData: unknown,\n level: number,\n ): boolean => {\n if (expandAll === true) return true;\n if (expandAll === false) return false;\n // null = auto mode\n if (level <= maxAutoExpandDepth) return true;\n if (Array.isArray(nodeData) && nodeData.length <= maxAutoExpandArrayItems) return true;\n if (nodeData && typeof nodeData === 'object' && !Array.isArray(nodeData)) {\n return Object.keys(nodeData).length <= maxAutoExpandObjectKeys;\n }\n return false;\n };\n\n return { isExpanded, toggle, renderKey, shouldExpandNodeInitially };\n}\n","import { CommonExternalProps } from 'react-json-tree';\n\nexport type JsonTreeMode = 'full' | 'compact' | 'inline';\n\nexport interface JsonTreeConfig {\n /** Maximum depth to expand automatically (default: 2) */\n maxAutoExpandDepth?: number;\n /** Maximum items in array to auto-expand (default: 10) */\n maxAutoExpandArrayItems?: number;\n /** Maximum object keys to auto-expand (default: 5) */\n maxAutoExpandObjectKeys?: number;\n /** Maximum string length before truncation (default: 200) */\n maxStringLength?: number;\n /** Collection limit for performance (default: 50) */\n collectionLimit?: number;\n /** Whether to show collection info (array length, object keys count) */\n showCollectionInfo?: boolean;\n /** Whether to show expand/collapse all buttons */\n showExpandControls?: boolean;\n /** Whether to show copy/download buttons */\n showActionButtons?: boolean;\n /** Custom CSS classes for the container */\n className?: string;\n /** Whether to preserve object key order (default: true) */\n preserveKeyOrder?: boolean;\n /** Font size for tree nodes (default: '12px' for compact/inline, '13px' for full) */\n fontSize?: string;\n}\n\nexport interface JsonTreeComponentProps {\n title?: string;\n data: unknown;\n /**\n * Extra top offset in px for the floating toolbar — use when your layout\n * has a non-sticky header that useNavbarHeight cannot auto-detect.\n * Adds to the auto-detected navbar height.\n */\n toolbarOffset?: number;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n /** Override for react-json-tree props */\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport const MODE_PRESETS: Record<JsonTreeMode, Partial<JsonTreeConfig>> = {\n full: {\n showExpandControls: true,\n showActionButtons: true,\n showCollectionInfo: true,\n fontSize: '13px',\n },\n compact: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: true,\n fontSize: '11px',\n maxAutoExpandDepth: 1,\n },\n inline: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: false,\n fontSize: '11px',\n maxAutoExpandDepth: 1,\n },\n};\n","'use client';\n\nimport React, { useMemo, useRef } from 'react';\n\nimport { FloatingToolbar } from '../../components/FloatingToolbar';\nimport { CopyAction, DownloadAction, ExpandAction } from '../../components/FloatingToolbar/actions';\nimport { JsonContent } from './components/JsonContent';\nimport { useJsonExpand } from './hooks/useJsonExpand';\nimport { JsonTreeComponentProps, MODE_PRESETS } from './types';\n\nexport type { Language } from 'prism-react-renderer';\nexport type { JsonTreeConfig, JsonTreeComponentProps, JsonTreeMode } from './types';\n\nconst JsonTreeComponent = ({\n title,\n data,\n mode = 'full',\n config = {},\n jsonTreeProps = {},\n}: JsonTreeComponentProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const mergedConfig = useMemo(() => ({ ...MODE_PRESETS[mode], ...config }), [mode, config]);\n\n const {\n maxAutoExpandDepth = 2,\n maxAutoExpandArrayItems = 10,\n maxAutoExpandObjectKeys = 5,\n maxStringLength = 200,\n collectionLimit = 50,\n showCollectionInfo = true,\n showExpandControls = true,\n showActionButtons = true,\n className = '',\n preserveKeyOrder = true,\n fontSize,\n } = mergedConfig;\n\n const { isExpanded, toggle, renderKey, shouldExpandNodeInitially } = useJsonExpand({\n maxAutoExpandDepth,\n maxAutoExpandArrayItems,\n maxAutoExpandObjectKeys,\n });\n\n const jsonString = useMemo(() => JSON.stringify(data, null, 2), [data]);\n\n const containerClasses = useMemo(() => {\n const base = 'relative w-full';\n switch (mode) {\n case 'full': return `${base} border border-border rounded-sm ${className}`;\n case 'compact': return `${base} border border-border/50 rounded-md ${className}`;\n default: return `${base} ${className}`;\n }\n }, [mode, className]);\n\n const contentPadding = mode === 'full' ? 'p-4' : mode === 'compact' ? 'p-2' : 'p-1';\n const showControls = (showExpandControls || showActionButtons) && mode === 'full';\n\n return (\n <div ref={containerRef} className={containerClasses}>\n {showControls && (\n <FloatingToolbar containerRef={containerRef}>\n {showExpandControls && <ExpandAction isExpanded={isExpanded} onToggle={toggle} />}\n {showActionButtons && (\n <>\n <CopyAction value={jsonString} title=\"Copy JSON\" />\n <DownloadAction value={jsonString} filename=\"data.json\" mimeType=\"application/json\" title=\"Download JSON\" />\n </>\n )}\n </FloatingToolbar>\n )}\n\n <JsonContent\n data={data}\n renderKey={renderKey}\n title={title}\n showTitle={mode === 'full'}\n padding={contentPadding}\n collectionLimit={collectionLimit}\n preserveKeyOrder={preserveKeyOrder}\n showCollectionInfo={showCollectionInfo}\n maxStringLength={maxStringLength}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n fontSize={fontSize}\n jsonTreeProps={jsonTreeProps}\n />\n </div>\n );\n};\n\nexport default JsonTreeComponent;\n"]}
@@ -1,4 +1,4 @@
1
- import { __name } from './chunk-CGILA3WO.mjs';
1
+ import { __name } from './chunk-N2XQF2OL.mjs';
2
2
  import { createContext, forwardRef, useSyncExternalStore, useId, useState, useEffect, useRef, useMemo, useContext, useCallback, useImperativeHandle } from 'react';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
  import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@djangocfg/ui-core/components';
@@ -2055,5 +2055,5 @@ var Player = forwardRef(/* @__PURE__ */ __name(function Player2(props, ref) {
2055
2055
  Player.displayName = "AudioPlayer";
2056
2056
 
2057
2057
  export { Player };
2058
- //# sourceMappingURL=chunk-FX2QFYWF.mjs.map
2059
- //# sourceMappingURL=chunk-FX2QFYWF.mjs.map
2058
+ //# sourceMappingURL=chunk-VWQ5WOIL.mjs.map
2059
+ //# sourceMappingURL=chunk-VWQ5WOIL.mjs.map