@brainfish-ai/devdoc 0.1.42 → 0.1.44

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 (398) hide show
  1. package/dist/cli/commands/create.js +2 -2
  2. package/dist/cli/commands/dev.js +19 -10
  3. package/package.json +3 -2
  4. package/renderer/app/api/assets/[...path]/route.js +108 -0
  5. package/renderer/app/api/assets/route.js +114 -0
  6. package/renderer/app/api/assets/upload/route.js +163 -0
  7. package/renderer/app/api/auth-schemes/route.js +58 -0
  8. package/renderer/app/api/chat/route.js +759 -0
  9. package/renderer/app/api/codegen/route.js +52 -0
  10. package/renderer/app/api/collections/route.js +706 -0
  11. package/renderer/app/api/debug/route.js +47 -0
  12. package/renderer/app/api/deploy/route.js +199 -0
  13. package/renderer/app/api/device/route.js +36 -0
  14. package/renderer/app/api/docs/route.js +205 -0
  15. package/renderer/app/api/domains/add/route.js +121 -0
  16. package/renderer/app/api/domains/lookup/route.js +43 -0
  17. package/renderer/app/api/domains/remove/route.js +89 -0
  18. package/renderer/app/api/domains/status/route.js +140 -0
  19. package/renderer/app/api/domains/verify/route.js +168 -0
  20. package/renderer/app/api/keys/regenerate/route.js +71 -0
  21. package/renderer/app/api/local-assets/[...path]/route.js +108 -0
  22. package/renderer/app/api/openapi-spec/route.js +73 -0
  23. package/renderer/app/api/projects/[slug]/route.js +129 -0
  24. package/renderer/app/api/projects/[slug]/stats/route.js +80 -0
  25. package/renderer/app/api/projects/register/route.js +176 -0
  26. package/renderer/app/api/proxy/route.js +139 -0
  27. package/renderer/app/api/proxy-stream/route.js +156 -0
  28. package/renderer/app/api/redirects/route.js +35 -0
  29. package/renderer/app/api/schema/route.js +85 -0
  30. package/renderer/app/api/subdomains/check/route.js +158 -0
  31. package/renderer/app/api/suggestions/route.js +195 -0
  32. package/renderer/app/globals.css +69 -0
  33. package/renderer/app/layout.js +47 -0
  34. package/renderer/app/llms-full.txt/route.js +266 -0
  35. package/renderer/app/llms.txt/route.js +228 -0
  36. package/renderer/app/page.js +12 -0
  37. package/renderer/app/robots.txt/route.js +66 -0
  38. package/renderer/app/sitemap.xml/route.js +155 -0
  39. package/renderer/components/docs/index.js +8 -0
  40. package/renderer/components/docs/mdx/accordion.js +113 -0
  41. package/renderer/components/docs/mdx/badge.js +72 -0
  42. package/renderer/components/docs/mdx/callouts.js +137 -0
  43. package/renderer/components/docs/mdx/cards.js +175 -0
  44. package/renderer/components/docs/mdx/changelog.js +100 -0
  45. package/renderer/components/docs/mdx/code-block.js +147 -0
  46. package/renderer/components/docs/mdx/code-group.js +287 -0
  47. package/renderer/components/docs/mdx/file-embeds.js +82 -0
  48. package/renderer/components/docs/mdx/frame.js +59 -0
  49. package/renderer/components/docs/mdx/highlight.js +90 -0
  50. package/renderer/components/docs/mdx/iframe.js +69 -0
  51. package/renderer/components/docs/mdx/image.js +135 -0
  52. package/renderer/components/docs/mdx/index.js +134 -0
  53. package/renderer/components/docs/mdx/landing.js +317 -0
  54. package/renderer/components/docs/mdx/mermaid.js +212 -0
  55. package/renderer/components/docs/mdx/param-field.js +112 -0
  56. package/renderer/components/docs/mdx/steps.js +74 -0
  57. package/renderer/components/docs/mdx/tabs.js +50 -0
  58. package/renderer/components/docs/mdx-renderer.js +77 -0
  59. package/renderer/components/docs/navigation/breadcrumbs.js +64 -0
  60. package/renderer/components/docs/navigation/index.js +6 -0
  61. package/renderer/components/docs/navigation/page-nav.js +57 -0
  62. package/renderer/components/docs/navigation/sidebar.js +375 -0
  63. package/renderer/components/docs/navigation/toc.js +89 -0
  64. package/renderer/components/docs/notice.js +77 -0
  65. package/renderer/components/docs-header.js +202 -0
  66. package/renderer/components/docs-viewer/agent/agent-chat.js +1831 -0
  67. package/renderer/components/docs-viewer/agent/agent-popup-button.js +99 -0
  68. package/renderer/components/docs-viewer/agent/cards/debug-context-card.js +107 -0
  69. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.js +57 -0
  70. package/renderer/components/docs-viewer/agent/cards/index.js +45 -0
  71. package/renderer/components/docs-viewer/agent/cards/response-options-card.js +154 -0
  72. package/renderer/components/docs-viewer/agent/cards/types.js +22 -0
  73. package/renderer/components/docs-viewer/agent/chat-message.js +2 -0
  74. package/renderer/components/docs-viewer/agent/index.js +7 -0
  75. package/renderer/components/docs-viewer/agent/messages/assistant-message.js +108 -0
  76. package/renderer/components/docs-viewer/agent/messages/chat-message.js +34 -0
  77. package/renderer/components/docs-viewer/agent/messages/index.js +6 -0
  78. package/renderer/components/docs-viewer/agent/messages/tool-call-display.js +1065 -0
  79. package/renderer/components/docs-viewer/agent/messages/types.js +2 -0
  80. package/renderer/components/docs-viewer/agent/messages/typing-indicator.js +26 -0
  81. package/renderer/components/docs-viewer/agent/messages/user-message.js +37 -0
  82. package/renderer/components/docs-viewer/code-editor/{index.tsx → index.js} +1 -1
  83. package/renderer/components/docs-viewer/code-editor/notes-mode.js +1338 -0
  84. package/renderer/components/docs-viewer/content/changelog-page.js +297 -0
  85. package/renderer/components/docs-viewer/content/content-router.js +182 -0
  86. package/renderer/components/docs-viewer/content/doc-page.js +290 -0
  87. package/renderer/components/docs-viewer/content/documentation-viewer.js +14 -0
  88. package/renderer/components/docs-viewer/content/index.js +31 -0
  89. package/renderer/components/docs-viewer/content/not-found-page.js +300 -0
  90. package/renderer/components/docs-viewer/content/request-details.js +528 -0
  91. package/renderer/components/docs-viewer/content/sections/auth.js +108 -0
  92. package/renderer/components/docs-viewer/content/sections/body.js +80 -0
  93. package/renderer/components/docs-viewer/content/sections/headers.js +64 -0
  94. package/renderer/components/docs-viewer/content/sections/overview.js +56 -0
  95. package/renderer/components/docs-viewer/content/sections/parameters.js +64 -0
  96. package/renderer/components/docs-viewer/content/sections/responses.js +91 -0
  97. package/renderer/components/docs-viewer/global-auth-modal.js +427 -0
  98. package/renderer/components/docs-viewer/index.js +1448 -0
  99. package/renderer/components/docs-viewer/playground/auth-editor.js +418 -0
  100. package/renderer/components/docs-viewer/playground/body-editor.js +240 -0
  101. package/renderer/components/docs-viewer/playground/code-editor.js +135 -0
  102. package/renderer/components/docs-viewer/playground/code-snippet.js +393 -0
  103. package/renderer/components/docs-viewer/playground/graphql-playground.js +936 -0
  104. package/renderer/components/docs-viewer/playground/index.js +682 -0
  105. package/renderer/components/docs-viewer/playground/key-value-editor.js +317 -0
  106. package/renderer/components/docs-viewer/playground/method-selector.js +65 -0
  107. package/renderer/components/docs-viewer/playground/request-builder.js +181 -0
  108. package/renderer/components/docs-viewer/playground/request-tabs.js +240 -0
  109. package/renderer/components/docs-viewer/playground/response-cards/idle-card.js +42 -0
  110. package/renderer/components/docs-viewer/playground/response-cards/index.js +72 -0
  111. package/renderer/components/docs-viewer/playground/response-cards/loading-card.js +24 -0
  112. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.js +28 -0
  113. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.js +308 -0
  114. package/renderer/components/docs-viewer/playground/response-cards/types.js +9 -0
  115. package/renderer/components/docs-viewer/playground/response-viewer.js +18 -0
  116. package/renderer/components/docs-viewer/search/index.js +2 -0
  117. package/renderer/components/docs-viewer/search/search-dialog.js +367 -0
  118. package/renderer/components/docs-viewer/search/use-search.js +89 -0
  119. package/renderer/components/docs-viewer/shared/markdown-renderer.js +423 -0
  120. package/renderer/components/docs-viewer/shared/method-badge.js +23 -0
  121. package/renderer/components/docs-viewer/shared/schema-viewer.js +321 -0
  122. package/renderer/components/docs-viewer/sidebar/collection-tree.js +222 -0
  123. package/renderer/components/docs-viewer/sidebar/endpoint-options.js +512 -0
  124. package/renderer/components/docs-viewer/sidebar/index.js +196 -0
  125. package/renderer/components/docs-viewer/sidebar/right-sidebar.js +159 -0
  126. package/renderer/components/docs-viewer/sidebar/sidebar-group.js +87 -0
  127. package/renderer/components/docs-viewer/sidebar/sidebar-item.js +172 -0
  128. package/renderer/components/docs-viewer/sidebar/sidebar-section.js +31 -0
  129. package/renderer/components/theme-provider.js +10 -0
  130. package/renderer/components/theme-toggle.js +86 -0
  131. package/renderer/components/ui/badge.js +29 -0
  132. package/renderer/components/ui/button.js +40 -0
  133. package/renderer/components/ui/dialog.js +50 -0
  134. package/renderer/components/ui/dropdown-menu.js +143 -0
  135. package/renderer/components/ui/input.js +12 -0
  136. package/renderer/components/ui/label.js +13 -0
  137. package/renderer/components/ui/navigation-menu.js +83 -0
  138. package/renderer/components/ui/select.js +116 -0
  139. package/renderer/components/ui/spinner.js +92 -0
  140. package/renderer/components/ui/tabs.js +34 -0
  141. package/renderer/components/ui/tooltip.js +43 -0
  142. package/renderer/hooks/use-code-copy.js +76 -0
  143. package/renderer/hooks/use-openapi-title.js +33 -0
  144. package/renderer/hooks/use-route-state.js +159 -0
  145. package/renderer/lib/api-docs/agent/index.js +4 -0
  146. package/renderer/lib/api-docs/agent/indexer.js +254 -0
  147. package/renderer/lib/api-docs/agent/spec-summary.js +227 -0
  148. package/renderer/lib/api-docs/agent/types.js +5 -0
  149. package/renderer/lib/api-docs/agent/use-suggestions.js +97 -0
  150. package/renderer/lib/api-docs/auth/auth-context.js +157 -0
  151. package/renderer/lib/api-docs/auth/auth-storage.js +66 -0
  152. package/renderer/lib/api-docs/auth/crypto.js +64 -0
  153. package/renderer/lib/api-docs/auth/index.js +3 -0
  154. package/renderer/lib/api-docs/code-editor/db.js +145 -0
  155. package/renderer/lib/api-docs/code-editor/hooks.js +254 -0
  156. package/renderer/lib/api-docs/code-editor/{index.ts → index.js} +3 -4
  157. package/renderer/lib/api-docs/code-editor/mode-context.js +126 -0
  158. package/renderer/lib/api-docs/code-editor/types.js +53 -0
  159. package/renderer/lib/api-docs/codegen/definitions.js +258 -0
  160. package/renderer/lib/api-docs/codegen/har.js +171 -0
  161. package/renderer/lib/api-docs/codegen/index.js +118 -0
  162. package/renderer/lib/api-docs/factories.js +136 -0
  163. package/renderer/lib/api-docs/{index.ts → index.js} +5 -10
  164. package/renderer/lib/api-docs/mobile-context.js +116 -0
  165. package/renderer/lib/api-docs/navigation-context.js +62 -0
  166. package/renderer/lib/api-docs/parsers/graphql/index.js +50 -0
  167. package/renderer/lib/api-docs/parsers/graphql/parser.js +350 -0
  168. package/renderer/lib/api-docs/parsers/graphql/transformer.js +215 -0
  169. package/renderer/lib/api-docs/parsers/graphql/types.js +46 -0
  170. package/renderer/lib/api-docs/parsers/openapi/dereferencer.js +43 -0
  171. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.js +486 -0
  172. package/renderer/lib/api-docs/parsers/openapi/extractors/body.js +295 -0
  173. package/renderer/lib/api-docs/parsers/openapi/extractors/index.js +132 -0
  174. package/renderer/lib/api-docs/parsers/openapi/index.js +127 -0
  175. package/renderer/lib/api-docs/parsers/openapi/transformer.js +192 -0
  176. package/renderer/lib/api-docs/parsers/openapi/validator.js +24 -0
  177. package/renderer/lib/api-docs/playground/context.js +65 -0
  178. package/renderer/lib/api-docs/playground/navigation-context.js +74 -0
  179. package/renderer/lib/api-docs/playground/request-builder.js +163 -0
  180. package/renderer/lib/api-docs/playground/request-runner.js +224 -0
  181. package/renderer/lib/api-docs/playground/types.js +5 -0
  182. package/renderer/lib/api-docs/types.js +23 -0
  183. package/renderer/lib/api-docs/utils.js +212 -0
  184. package/renderer/lib/cache.js +157 -0
  185. package/renderer/lib/docs/config/domain-schema.js +161 -0
  186. package/renderer/lib/docs/config/environment.js +38 -0
  187. package/renderer/lib/docs/config/index.js +6 -0
  188. package/renderer/lib/docs/config/loader.js +113 -0
  189. package/renderer/lib/docs/config/schema.js +281 -0
  190. package/renderer/lib/docs/index.js +8 -0
  191. package/renderer/lib/docs/mdx/compiler.js +131 -0
  192. package/renderer/lib/docs/mdx/frontmatter.js +73 -0
  193. package/renderer/lib/docs/mdx/index.js +10 -0
  194. package/renderer/lib/docs/mdx/remark-mermaid.js +63 -0
  195. package/renderer/lib/docs/navigation/generator.js +269 -0
  196. package/renderer/lib/docs/navigation/index.js +3 -0
  197. package/renderer/lib/docs/navigation/types.js +11 -0
  198. package/renderer/lib/docs-navigation-context.js +40 -0
  199. package/renderer/lib/docs-navigation.js +140 -0
  200. package/renderer/lib/multi-tenant/context.js +80 -0
  201. package/renderer/lib/storage/blob.js +767 -0
  202. package/renderer/lib/utils/icons.js +30 -0
  203. package/renderer/lib/utils.js +5 -0
  204. package/renderer/next.config.js +62 -0
  205. package/renderer/package.json +1 -0
  206. package/renderer/tsconfig.json +23 -5
  207. package/renderer/app/api/assets/[...path]/route.ts +0 -123
  208. package/renderer/app/api/assets/route.ts +0 -124
  209. package/renderer/app/api/assets/upload/route.ts +0 -177
  210. package/renderer/app/api/auth-schemes/route.ts +0 -77
  211. package/renderer/app/api/chat/route.ts +0 -858
  212. package/renderer/app/api/codegen/route.ts +0 -72
  213. package/renderer/app/api/collections/route.ts +0 -1002
  214. package/renderer/app/api/debug/route.ts +0 -53
  215. package/renderer/app/api/deploy/route.ts +0 -234
  216. package/renderer/app/api/device/route.ts +0 -42
  217. package/renderer/app/api/docs/route.ts +0 -201
  218. package/renderer/app/api/domains/add/route.ts +0 -132
  219. package/renderer/app/api/domains/lookup/route.ts +0 -43
  220. package/renderer/app/api/domains/remove/route.ts +0 -100
  221. package/renderer/app/api/domains/status/route.ts +0 -158
  222. package/renderer/app/api/domains/verify/route.ts +0 -181
  223. package/renderer/app/api/keys/regenerate/route.ts +0 -80
  224. package/renderer/app/api/local-assets/[...path]/route.ts +0 -122
  225. package/renderer/app/api/openapi-spec/route.ts +0 -151
  226. package/renderer/app/api/projects/[slug]/route.ts +0 -153
  227. package/renderer/app/api/projects/[slug]/stats/route.ts +0 -96
  228. package/renderer/app/api/projects/register/route.ts +0 -152
  229. package/renderer/app/api/proxy/route.ts +0 -149
  230. package/renderer/app/api/proxy-stream/route.ts +0 -168
  231. package/renderer/app/api/redirects/route.ts +0 -47
  232. package/renderer/app/api/schema/route.ts +0 -73
  233. package/renderer/app/api/subdomains/check/route.ts +0 -172
  234. package/renderer/app/api/suggestions/route.ts +0 -144
  235. package/renderer/app/layout.tsx +0 -54
  236. package/renderer/app/llms-full.txt/route.ts +0 -346
  237. package/renderer/app/llms.txt/route.ts +0 -279
  238. package/renderer/app/page.tsx +0 -14
  239. package/renderer/app/robots.txt/route.ts +0 -84
  240. package/renderer/app/sitemap.xml/route.ts +0 -199
  241. package/renderer/components/docs/index.ts +0 -12
  242. package/renderer/components/docs/mdx/accordion.tsx +0 -169
  243. package/renderer/components/docs/mdx/badge.tsx +0 -132
  244. package/renderer/components/docs/mdx/callouts.tsx +0 -154
  245. package/renderer/components/docs/mdx/cards.tsx +0 -241
  246. package/renderer/components/docs/mdx/changelog.tsx +0 -120
  247. package/renderer/components/docs/mdx/code-block.tsx +0 -186
  248. package/renderer/components/docs/mdx/code-group.tsx +0 -421
  249. package/renderer/components/docs/mdx/file-embeds.tsx +0 -105
  250. package/renderer/components/docs/mdx/frame.tsx +0 -112
  251. package/renderer/components/docs/mdx/highlight.tsx +0 -151
  252. package/renderer/components/docs/mdx/iframe.tsx +0 -134
  253. package/renderer/components/docs/mdx/image.tsx +0 -235
  254. package/renderer/components/docs/mdx/index.ts +0 -237
  255. package/renderer/components/docs/mdx/landing.tsx +0 -684
  256. package/renderer/components/docs/mdx/mermaid.tsx +0 -240
  257. package/renderer/components/docs/mdx/param-field.tsx +0 -200
  258. package/renderer/components/docs/mdx/steps.tsx +0 -113
  259. package/renderer/components/docs/mdx/tabs.tsx +0 -86
  260. package/renderer/components/docs/mdx-renderer.tsx +0 -100
  261. package/renderer/components/docs/navigation/breadcrumbs.tsx +0 -76
  262. package/renderer/components/docs/navigation/index.ts +0 -8
  263. package/renderer/components/docs/navigation/page-nav.tsx +0 -64
  264. package/renderer/components/docs/navigation/sidebar.tsx +0 -515
  265. package/renderer/components/docs/navigation/toc.tsx +0 -113
  266. package/renderer/components/docs/notice.tsx +0 -105
  267. package/renderer/components/docs-header.tsx +0 -278
  268. package/renderer/components/docs-viewer/agent/agent-chat.tsx +0 -2076
  269. package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +0 -90
  270. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +0 -49
  271. package/renderer/components/docs-viewer/agent/cards/index.tsx +0 -50
  272. package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +0 -212
  273. package/renderer/components/docs-viewer/agent/cards/types.ts +0 -84
  274. package/renderer/components/docs-viewer/agent/chat-message.tsx +0 -17
  275. package/renderer/components/docs-viewer/agent/index.tsx +0 -6
  276. package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +0 -119
  277. package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +0 -46
  278. package/renderer/components/docs-viewer/agent/messages/index.ts +0 -17
  279. package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +0 -721
  280. package/renderer/components/docs-viewer/agent/messages/types.ts +0 -61
  281. package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +0 -24
  282. package/renderer/components/docs-viewer/agent/messages/user-message.tsx +0 -51
  283. package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +0 -1283
  284. package/renderer/components/docs-viewer/content/changelog-page.tsx +0 -331
  285. package/renderer/components/docs-viewer/content/doc-page.tsx +0 -367
  286. package/renderer/components/docs-viewer/content/documentation-viewer.tsx +0 -17
  287. package/renderer/components/docs-viewer/content/index.tsx +0 -29
  288. package/renderer/components/docs-viewer/content/not-found-page.tsx +0 -330
  289. package/renderer/components/docs-viewer/content/request-details.tsx +0 -330
  290. package/renderer/components/docs-viewer/content/sections/auth.tsx +0 -69
  291. package/renderer/components/docs-viewer/content/sections/body.tsx +0 -66
  292. package/renderer/components/docs-viewer/content/sections/headers.tsx +0 -43
  293. package/renderer/components/docs-viewer/content/sections/overview.tsx +0 -40
  294. package/renderer/components/docs-viewer/content/sections/parameters.tsx +0 -43
  295. package/renderer/components/docs-viewer/content/sections/responses.tsx +0 -87
  296. package/renderer/components/docs-viewer/global-auth-modal.tsx +0 -352
  297. package/renderer/components/docs-viewer/index.tsx +0 -1670
  298. package/renderer/components/docs-viewer/playground/auth-editor.tsx +0 -280
  299. package/renderer/components/docs-viewer/playground/body-editor.tsx +0 -221
  300. package/renderer/components/docs-viewer/playground/code-editor.tsx +0 -224
  301. package/renderer/components/docs-viewer/playground/code-snippet.tsx +0 -387
  302. package/renderer/components/docs-viewer/playground/graphql-playground.tsx +0 -745
  303. package/renderer/components/docs-viewer/playground/index.tsx +0 -671
  304. package/renderer/components/docs-viewer/playground/key-value-editor.tsx +0 -261
  305. package/renderer/components/docs-viewer/playground/method-selector.tsx +0 -60
  306. package/renderer/components/docs-viewer/playground/request-builder.tsx +0 -179
  307. package/renderer/components/docs-viewer/playground/request-tabs.tsx +0 -237
  308. package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +0 -21
  309. package/renderer/components/docs-viewer/playground/response-cards/index.tsx +0 -93
  310. package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +0 -16
  311. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +0 -23
  312. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +0 -268
  313. package/renderer/components/docs-viewer/playground/response-cards/types.ts +0 -82
  314. package/renderer/components/docs-viewer/playground/response-viewer.tsx +0 -43
  315. package/renderer/components/docs-viewer/search/index.ts +0 -2
  316. package/renderer/components/docs-viewer/search/search-dialog.tsx +0 -331
  317. package/renderer/components/docs-viewer/search/use-search.ts +0 -117
  318. package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +0 -431
  319. package/renderer/components/docs-viewer/shared/method-badge.tsx +0 -41
  320. package/renderer/components/docs-viewer/shared/schema-viewer.tsx +0 -349
  321. package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +0 -259
  322. package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +0 -316
  323. package/renderer/components/docs-viewer/sidebar/index.tsx +0 -282
  324. package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +0 -202
  325. package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +0 -118
  326. package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +0 -212
  327. package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +0 -38
  328. package/renderer/components/theme-provider.tsx +0 -11
  329. package/renderer/components/theme-toggle.tsx +0 -76
  330. package/renderer/components/ui/badge.tsx +0 -46
  331. package/renderer/components/ui/button.tsx +0 -59
  332. package/renderer/components/ui/dialog.tsx +0 -118
  333. package/renderer/components/ui/dropdown-menu.tsx +0 -257
  334. package/renderer/components/ui/input.tsx +0 -21
  335. package/renderer/components/ui/label.tsx +0 -24
  336. package/renderer/components/ui/navigation-menu.tsx +0 -168
  337. package/renderer/components/ui/select.tsx +0 -190
  338. package/renderer/components/ui/spinner.tsx +0 -114
  339. package/renderer/components/ui/tabs.tsx +0 -66
  340. package/renderer/components/ui/tooltip.tsx +0 -61
  341. package/renderer/hooks/use-code-copy.ts +0 -88
  342. package/renderer/hooks/use-openapi-title.ts +0 -44
  343. package/renderer/lib/api-docs/agent/index.ts +0 -6
  344. package/renderer/lib/api-docs/agent/indexer.ts +0 -323
  345. package/renderer/lib/api-docs/agent/spec-summary.ts +0 -335
  346. package/renderer/lib/api-docs/agent/types.ts +0 -116
  347. package/renderer/lib/api-docs/auth/auth-context.tsx +0 -225
  348. package/renderer/lib/api-docs/auth/auth-storage.ts +0 -87
  349. package/renderer/lib/api-docs/auth/crypto.ts +0 -89
  350. package/renderer/lib/api-docs/auth/index.ts +0 -4
  351. package/renderer/lib/api-docs/code-editor/db.ts +0 -164
  352. package/renderer/lib/api-docs/code-editor/hooks.ts +0 -266
  353. package/renderer/lib/api-docs/code-editor/mode-context.tsx +0 -207
  354. package/renderer/lib/api-docs/code-editor/types.ts +0 -105
  355. package/renderer/lib/api-docs/codegen/definitions.ts +0 -297
  356. package/renderer/lib/api-docs/codegen/har.ts +0 -251
  357. package/renderer/lib/api-docs/codegen/index.ts +0 -159
  358. package/renderer/lib/api-docs/factories.ts +0 -170
  359. package/renderer/lib/api-docs/mobile-context.tsx +0 -112
  360. package/renderer/lib/api-docs/navigation-context.tsx +0 -88
  361. package/renderer/lib/api-docs/parsers/graphql/README.md +0 -129
  362. package/renderer/lib/api-docs/parsers/graphql/index.ts +0 -91
  363. package/renderer/lib/api-docs/parsers/graphql/parser.ts +0 -491
  364. package/renderer/lib/api-docs/parsers/graphql/transformer.ts +0 -246
  365. package/renderer/lib/api-docs/parsers/graphql/types.ts +0 -283
  366. package/renderer/lib/api-docs/parsers/openapi/README.md +0 -32
  367. package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +0 -60
  368. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +0 -574
  369. package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +0 -403
  370. package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +0 -232
  371. package/renderer/lib/api-docs/parsers/openapi/index.ts +0 -171
  372. package/renderer/lib/api-docs/parsers/openapi/transformer.ts +0 -278
  373. package/renderer/lib/api-docs/parsers/openapi/validator.ts +0 -31
  374. package/renderer/lib/api-docs/playground/context.tsx +0 -107
  375. package/renderer/lib/api-docs/playground/navigation-context.tsx +0 -124
  376. package/renderer/lib/api-docs/playground/request-builder.ts +0 -223
  377. package/renderer/lib/api-docs/playground/request-runner.ts +0 -282
  378. package/renderer/lib/api-docs/playground/types.ts +0 -35
  379. package/renderer/lib/api-docs/types.ts +0 -269
  380. package/renderer/lib/api-docs/utils.ts +0 -311
  381. package/renderer/lib/cache.ts +0 -193
  382. package/renderer/lib/docs/config/domain-schema.ts +0 -260
  383. package/renderer/lib/docs/config/index.ts +0 -43
  384. package/renderer/lib/docs/config/loader.ts +0 -142
  385. package/renderer/lib/docs/config/schema.ts +0 -308
  386. package/renderer/lib/docs/index.ts +0 -12
  387. package/renderer/lib/docs/mdx/compiler.ts +0 -176
  388. package/renderer/lib/docs/mdx/frontmatter.ts +0 -91
  389. package/renderer/lib/docs/mdx/index.ts +0 -26
  390. package/renderer/lib/docs/navigation/generator.ts +0 -348
  391. package/renderer/lib/docs/navigation/index.ts +0 -12
  392. package/renderer/lib/docs/navigation/types.ts +0 -123
  393. package/renderer/lib/docs-navigation-context.tsx +0 -80
  394. package/renderer/lib/multi-tenant/context.ts +0 -105
  395. package/renderer/lib/storage/blob.ts +0 -1083
  396. package/renderer/lib/utils/icons.ts +0 -48
  397. package/renderer/lib/utils.ts +0 -6
  398. package/renderer/next.config.ts +0 -76
@@ -1,348 +0,0 @@
1
- import { relative, basename, extname } from 'path'
2
- import {
3
- type DocsConfig,
4
- type NavigationTab,
5
- type NavigationGroup,
6
- resolvePagePath,
7
- loadPageContent,
8
- } from '../config'
9
- import { extractFrontmatter, safeParseFrontmatter } from '../mdx'
10
- import type {
11
- Navigation,
12
- NavTab,
13
- NavGroup,
14
- NavItem,
15
- PageNavContext,
16
- BreadcrumbItem,
17
- PageMeta,
18
- } from './types'
19
-
20
- /**
21
- * Navigation Generator
22
- *
23
- * Builds navigation structure from docs.json configuration
24
- */
25
-
26
- /**
27
- * Generate navigation from configuration
28
- */
29
- export function generateNavigation(
30
- config: DocsConfig,
31
- docsDir: string
32
- ): Navigation {
33
- const nav = config.navigation
34
- const navigation: Navigation = {}
35
-
36
- // Handle tabbed navigation
37
- if (nav.tabs && nav.tabs.length > 0) {
38
- navigation.tabs = nav.tabs.map(tab => buildNavTab(tab, docsDir))
39
- }
40
-
41
- // Handle single-page navigation (no tabs)
42
- if (nav.groups && nav.groups.length > 0) {
43
- navigation.groups = nav.groups.map(group => buildNavGroup(group, docsDir))
44
- }
45
-
46
- // Add global anchors
47
- if (nav.global?.anchors) {
48
- navigation.anchors = nav.global.anchors.map(anchor => ({
49
- title: anchor.anchor,
50
- href: anchor.href,
51
- icon: anchor.icon,
52
- external: anchor.href.startsWith('http'),
53
- }))
54
- }
55
-
56
- return navigation
57
- }
58
-
59
- /**
60
- * Build a navigation tab
61
- */
62
- function buildNavTab(
63
- tab: NavigationTab,
64
- docsDir: string
65
- ): NavTab {
66
- const slug = tab.tab.toLowerCase().replace(/\s+/g, '-')
67
-
68
- // Only docs tabs have groups
69
- if ('groups' in tab && tab.groups) {
70
- const groups = tab.groups.map(group => buildNavGroup(group, docsDir))
71
- return {
72
- title: tab.tab,
73
- slug,
74
- groups,
75
- }
76
- }
77
-
78
- // For openapi/changelog tabs, return empty groups
79
- return {
80
- title: tab.tab,
81
- slug,
82
- groups: [],
83
- }
84
- }
85
-
86
- /**
87
- * Build a navigation group
88
- */
89
- function buildNavGroup(
90
- group: NavigationGroup,
91
- docsDir: string
92
- ): NavGroup {
93
- const items = group.pages
94
- .map(page => buildNavItemOrGroup(page, docsDir))
95
- .filter((item): item is NavItem | NavGroup => item !== null)
96
-
97
- return {
98
- title: group.group,
99
- icon: group.icon,
100
- items,
101
- collapsible: true,
102
- defaultCollapsed: false,
103
- }
104
- }
105
-
106
- /**
107
- * Build a navigation item or nested group from a page reference
108
- */
109
- function buildNavItemOrGroup(
110
- pageRef: string | { group: string; pages: (string | object)[] },
111
- docsDir: string
112
- ): NavItem | NavGroup | null {
113
- // Handle nested groups
114
- if (typeof pageRef === 'object' && 'group' in pageRef) {
115
- const nestedItems = pageRef.pages
116
- .map(p => buildNavItemOrGroup(p as string | { group: string; pages: (string | object)[] }, docsDir))
117
- .filter((item): item is NavItem | NavGroup => item !== null)
118
-
119
- return {
120
- title: pageRef.group,
121
- items: nestedItems,
122
- collapsible: true,
123
- defaultCollapsed: false,
124
- }
125
- }
126
-
127
- return buildNavItem(pageRef, docsDir)
128
- }
129
-
130
- /**
131
- * Build a navigation item from a page reference
132
- */
133
- function buildNavItem(
134
- pageRef: string,
135
- docsDir: string
136
- ): NavItem | null {
137
- // Check if it's an external link
138
- if (pageRef.startsWith('http://') || pageRef.startsWith('https://')) {
139
- return {
140
- title: pageRef,
141
- href: pageRef,
142
- external: true,
143
- }
144
- }
145
-
146
- // Resolve the page file
147
- const filePath = resolvePagePath(docsDir, pageRef)
148
-
149
- if (!filePath) {
150
- console.warn(`Page not found: ${pageRef}`)
151
- return {
152
- title: pageRef,
153
- href: `/${pageRef}`,
154
- }
155
- }
156
-
157
- // Load and parse frontmatter
158
- try {
159
- const content = loadPageContent(filePath)
160
- const { data } = extractFrontmatter(content)
161
- const frontmatter = safeParseFrontmatter(data)
162
-
163
- // Build URL path
164
- const urlPath = pageRef === 'index' ? '/' : `/${pageRef}`
165
-
166
- return {
167
- title: frontmatter?.sidebarTitle || frontmatter?.title || pageRef,
168
- href: urlPath,
169
- icon: frontmatter?.icon,
170
- deprecated: frontmatter?.deprecated,
171
- }
172
- } catch (error) {
173
- console.warn(`Failed to load page metadata: ${pageRef}`, error)
174
- return {
175
- title: pageRef,
176
- href: `/${pageRef}`,
177
- }
178
- }
179
- }
180
-
181
- /**
182
- * Helper to check if an item is a NavItem (has href)
183
- */
184
- function isNavItem(item: NavItem | NavGroup): item is NavItem {
185
- return 'href' in item && typeof item.href === 'string'
186
- }
187
-
188
- /**
189
- * Recursively collect all NavItems from items array (handles nested groups)
190
- */
191
- function collectNavItems(items: (NavItem | NavGroup)[]): NavItem[] {
192
- const result: NavItem[] = []
193
- for (const item of items) {
194
- if (isNavItem(item)) {
195
- result.push(item)
196
- } else if ('items' in item && Array.isArray(item.items)) {
197
- result.push(...collectNavItems(item.items))
198
- }
199
- }
200
- return result
201
- }
202
-
203
- /**
204
- * Find navigation context for a specific page
205
- */
206
- export function findPageNavContext(
207
- navigation: Navigation,
208
- currentPath: string
209
- ): PageNavContext {
210
- const breadcrumbs: BreadcrumbItem[] = []
211
- let prev: NavItem | undefined
212
- let next: NavItem | undefined
213
- let currentTab: NavTab | undefined
214
- let currentGroup: NavGroup | undefined
215
- let currentItem: NavItem | undefined
216
-
217
- // Normalize path
218
- const normalizedPath = currentPath.startsWith('/') ? currentPath : `/${currentPath}`
219
-
220
- // Flatten all items for prev/next calculation
221
- const allItems: NavItem[] = []
222
-
223
- // Search in tabs
224
- if (navigation.tabs) {
225
- for (const tab of navigation.tabs) {
226
- for (const group of tab.groups) {
227
- const groupItems = collectNavItems(group.items)
228
- allItems.push(...groupItems)
229
-
230
- for (const item of groupItems) {
231
- if (item.href === normalizedPath) {
232
- currentTab = tab
233
- currentGroup = group
234
- currentItem = item
235
-
236
- // Build breadcrumbs
237
- breadcrumbs.push({ title: tab.title, href: `/${tab.slug}` })
238
- breadcrumbs.push({ title: group.title, href: '#' })
239
- breadcrumbs.push({ title: item.title, href: item.href })
240
- }
241
- }
242
- }
243
- }
244
- }
245
-
246
- // Search in groups (non-tabbed)
247
- if (navigation.groups) {
248
- for (const group of navigation.groups) {
249
- const groupItems = collectNavItems(group.items)
250
- allItems.push(...groupItems)
251
-
252
- for (const item of groupItems) {
253
- if (item.href === normalizedPath) {
254
- currentGroup = group
255
- currentItem = item
256
-
257
- // Build breadcrumbs
258
- breadcrumbs.push({ title: group.title, href: '#' })
259
- breadcrumbs.push({ title: item.title, href: item.href })
260
- }
261
- }
262
- }
263
- }
264
-
265
- // Find prev/next
266
- const currentIndex = allItems.findIndex(item => item.href === normalizedPath)
267
- if (currentIndex > 0) {
268
- prev = allItems[currentIndex - 1]
269
- }
270
- if (currentIndex >= 0 && currentIndex < allItems.length - 1) {
271
- next = allItems[currentIndex + 1]
272
- }
273
-
274
- return {
275
- breadcrumbs,
276
- prev,
277
- next,
278
- currentTab,
279
- currentGroup,
280
- currentItem,
281
- }
282
- }
283
-
284
- /**
285
- * Get all page paths from navigation
286
- */
287
- export function getAllPagePaths(navigation: Navigation): string[] {
288
- const paths: string[] = []
289
-
290
- if (navigation.tabs) {
291
- for (const tab of navigation.tabs) {
292
- for (const group of tab.groups) {
293
- const items = collectNavItems(group.items)
294
- for (const item of items) {
295
- if (!item.external) {
296
- paths.push(item.href)
297
- }
298
- }
299
- }
300
- }
301
- }
302
-
303
- if (navigation.groups) {
304
- for (const group of navigation.groups) {
305
- const items = collectNavItems(group.items)
306
- for (const item of items) {
307
- if (!item.external) {
308
- paths.push(item.href)
309
- }
310
- }
311
- }
312
- }
313
-
314
- return paths
315
- }
316
-
317
- /**
318
- * Load page metadata from file
319
- */
320
- export function loadPageMeta(
321
- filePath: string,
322
- docsDir: string
323
- ): PageMeta | null {
324
- try {
325
- const content = loadPageContent(filePath)
326
- const { data } = extractFrontmatter(content)
327
- const frontmatter = safeParseFrontmatter(data)
328
-
329
- // Calculate URL path from file path
330
- const relativePath = relative(docsDir, filePath)
331
- const urlPath = '/' + relativePath
332
- .replace(/\.(mdx?|md)$/, '')
333
- .replace(/\/index$/, '')
334
- .replace(/^index$/, '')
335
-
336
- return {
337
- filePath: relativePath,
338
- urlPath: urlPath || '/',
339
- title: frontmatter?.title || basename(filePath, extname(filePath)),
340
- description: frontmatter?.description,
341
- sidebarTitle: frontmatter?.sidebarTitle,
342
- icon: frontmatter?.icon,
343
- hidden: frontmatter?.hidden,
344
- }
345
- } catch {
346
- return null
347
- }
348
- }
@@ -1,12 +0,0 @@
1
- /**
2
- * Navigation Module Exports
3
- */
4
-
5
- export * from './types'
6
-
7
- export {
8
- generateNavigation,
9
- findPageNavContext,
10
- getAllPagePaths,
11
- loadPageMeta,
12
- } from './generator'
@@ -1,123 +0,0 @@
1
- /**
2
- * Navigation Types
3
- *
4
- * Types for the documentation navigation system
5
- */
6
-
7
- /**
8
- * A navigation item representing a single page
9
- */
10
- export interface NavItem {
11
- /** Display title */
12
- title: string
13
- /** URL path to the page */
14
- href: string
15
- /** Icon name (Phosphor icons) */
16
- icon?: string
17
- /** Whether the page is marked as deprecated */
18
- deprecated?: boolean
19
- /** Whether this is an external link */
20
- external?: boolean
21
- /** Optional badge text */
22
- badge?: string
23
- }
24
-
25
- /**
26
- * A group of navigation items
27
- */
28
- export interface NavGroup {
29
- /** Group title */
30
- title: string
31
- /** Icon for the group */
32
- icon?: string
33
- /** Pages in this group (can include nested groups) */
34
- items: (NavItem | NavGroup)[]
35
- /** Whether the group is collapsible */
36
- collapsible?: boolean
37
- /** Default collapsed state */
38
- defaultCollapsed?: boolean
39
- }
40
-
41
- /**
42
- * A navigation tab (top-level section)
43
- */
44
- export interface NavTab {
45
- /** Tab title */
46
- title: string
47
- /** URL segment for this tab */
48
- slug: string
49
- /** Groups within this tab */
50
- groups: NavGroup[]
51
- /** Icon for the tab */
52
- icon?: string
53
- }
54
-
55
- /**
56
- * Complete navigation structure
57
- */
58
- export interface Navigation {
59
- /** Navigation tabs (if using tabbed navigation) */
60
- tabs?: NavTab[]
61
- /** Groups (if using single-page navigation) */
62
- groups?: NavGroup[]
63
- /** Global anchors (shown on all pages) */
64
- anchors?: NavItem[]
65
- }
66
-
67
- /**
68
- * Breadcrumb item
69
- */
70
- export interface BreadcrumbItem {
71
- title: string
72
- href: string
73
- }
74
-
75
- /**
76
- * Page navigation context
77
- */
78
- export interface PageNavContext {
79
- /** Current page's breadcrumbs */
80
- breadcrumbs: BreadcrumbItem[]
81
- /** Previous page in navigation */
82
- prev?: NavItem
83
- /** Next page in navigation */
84
- next?: NavItem
85
- /** Current tab (if using tabs) */
86
- currentTab?: NavTab
87
- /** Current group */
88
- currentGroup?: NavGroup
89
- /** Current item */
90
- currentItem?: NavItem
91
- }
92
-
93
- /**
94
- * Table of contents item (from page headings)
95
- */
96
- export interface TocItem {
97
- id: string
98
- title: string
99
- level: number
100
- children?: TocItem[]
101
- }
102
-
103
- /**
104
- * Page metadata for navigation
105
- */
106
- export interface PageMeta {
107
- /** File path relative to content directory */
108
- filePath: string
109
- /** URL path */
110
- urlPath: string
111
- /** Page title from frontmatter */
112
- title: string
113
- /** Page description */
114
- description?: string
115
- /** Sidebar title (shorter) */
116
- sidebarTitle?: string
117
- /** Icon name */
118
- icon?: string
119
- /** Whether the page is hidden from navigation */
120
- hidden?: boolean
121
- /** Page order within group */
122
- order?: number
123
- }
@@ -1,80 +0,0 @@
1
- 'use client'
2
-
3
- import React, { createContext, useContext, useCallback } from 'react'
4
-
5
- /**
6
- * Docs Navigation Context
7
- *
8
- * Provides navigation functions for doc components (like Card) to use
9
- * the correct navigation method based on the current view.
10
- *
11
- * In ApiDocs view: Uses hash-based navigation
12
- * In standalone /docs view: Uses Next.js router
13
- */
14
-
15
- interface DocsNavigationContextValue {
16
- // Navigate to a doc page by slug
17
- navigateToPage: (slug: string) => void
18
- // Navigate to an endpoint by ID
19
- navigateToEndpoint: (endpointId: string) => void
20
- // Switch to a different tab
21
- switchToTab: (tabId: string) => void
22
- // Check if we're in the integrated ApiDocs view
23
- isApiDocsView: boolean
24
- // Current active tab
25
- activeTab?: string
26
- }
27
-
28
- const DocsNavigationContext = createContext<DocsNavigationContextValue | null>(null)
29
-
30
- interface DocsNavigationProviderProps {
31
- children: React.ReactNode
32
- onNavigateToPage?: (slug: string) => void
33
- onNavigateToEndpoint?: (endpointId: string) => void
34
- onSwitchTab?: (tabId: string) => void
35
- activeTab?: string
36
- }
37
-
38
- export function DocsNavigationProvider({
39
- children,
40
- onNavigateToPage,
41
- onNavigateToEndpoint,
42
- onSwitchTab,
43
- activeTab,
44
- }: DocsNavigationProviderProps) {
45
- const navigateToPage = useCallback((slug: string) => {
46
- if (onNavigateToPage) {
47
- onNavigateToPage(slug)
48
- }
49
- }, [onNavigateToPage])
50
-
51
- const navigateToEndpoint = useCallback((endpointId: string) => {
52
- if (onNavigateToEndpoint) {
53
- onNavigateToEndpoint(endpointId)
54
- }
55
- }, [onNavigateToEndpoint])
56
-
57
- const switchToTab = useCallback((tabId: string) => {
58
- if (onSwitchTab) {
59
- onSwitchTab(tabId)
60
- }
61
- }, [onSwitchTab])
62
-
63
- return (
64
- <DocsNavigationContext.Provider
65
- value={{
66
- navigateToPage,
67
- navigateToEndpoint,
68
- switchToTab,
69
- isApiDocsView: !!onNavigateToPage,
70
- activeTab,
71
- }}
72
- >
73
- {children}
74
- </DocsNavigationContext.Provider>
75
- )
76
- }
77
-
78
- export function useDocsNavigation() {
79
- return useContext(DocsNavigationContext)
80
- }
@@ -1,105 +0,0 @@
1
- /**
2
- * Multi-tenant project context utilities
3
- * Handles extracting project slug from hostname and managing project context
4
- */
5
-
6
- export interface ProjectContext {
7
- slug: string
8
- isMultiTenant: boolean
9
- hostname: string
10
- }
11
-
12
- /**
13
- * Known hostnames that should use local file system (not multi-tenant)
14
- */
15
- const LOCAL_HOSTNAMES = [
16
- 'localhost',
17
- '127.0.0.1',
18
- '0.0.0.0',
19
- ]
20
-
21
- /**
22
- * The main platform domain
23
- */
24
- const PLATFORM_DOMAIN = process.env.DEVDOC_PLATFORM_DOMAIN || 'devdoc.sh'
25
-
26
- /**
27
- * Extract project context from hostname
28
- *
29
- * Examples:
30
- * - my-docs.devdoc.sh -> { slug: 'my-docs', isMultiTenant: true }
31
- * - localhost:3000 -> { slug: null, isMultiTenant: false }
32
- * - docs.company.com -> { slug: lookup from custom domains, isMultiTenant: true }
33
- */
34
- export function extractProjectContext(hostname: string): ProjectContext {
35
- // Remove port if present
36
- const host = hostname.split(':')[0]
37
-
38
- // Check if it's a local development hostname
39
- if (LOCAL_HOSTNAMES.includes(host)) {
40
- return {
41
- slug: '',
42
- isMultiTenant: false,
43
- hostname: host,
44
- }
45
- }
46
-
47
- // Check if it's a subdomain of the platform domain
48
- if (host.endsWith(`.${PLATFORM_DOMAIN}`)) {
49
- const slug = host.replace(`.${PLATFORM_DOMAIN}`, '')
50
- return {
51
- slug,
52
- isMultiTenant: true,
53
- hostname: host,
54
- }
55
- }
56
-
57
- // Check if it's the main platform domain
58
- if (host === PLATFORM_DOMAIN || host === `www.${PLATFORM_DOMAIN}`) {
59
- return {
60
- slug: '',
61
- isMultiTenant: false,
62
- hostname: host,
63
- }
64
- }
65
-
66
- // Custom domain - need to lookup in database
67
- // For now, return the full hostname as slug placeholder
68
- // This will be resolved via the domains API
69
- return {
70
- slug: host, // Will be resolved to actual slug via custom domains lookup
71
- isMultiTenant: true,
72
- hostname: host,
73
- }
74
- }
75
-
76
- /**
77
- * Check if running in multi-tenant mode
78
- */
79
- export function isMultiTenantMode(): boolean {
80
- return process.env.MULTI_TENANT_MODE === 'true'
81
- }
82
-
83
- /**
84
- * Get the current project slug from environment or context
85
- */
86
- export function getCurrentProjectSlug(): string | null {
87
- return process.env.DEVDOC_PROJECT_SLUG || null
88
- }
89
-
90
- /**
91
- * Build the URL for a project's docs
92
- */
93
- export function getProjectUrl(slug: string): string {
94
- const protocol = process.env.NODE_ENV === 'production' ? 'https' : 'http'
95
- return `${protocol}://${slug}.${PLATFORM_DOMAIN}`
96
- }
97
-
98
- /**
99
- * Validate a project slug format
100
- */
101
- export function isValidSlug(slug: string): boolean {
102
- // Must be lowercase alphanumeric with hyphens, 3-50 chars
103
- const slugRegex = /^[a-z0-9][a-z0-9-]{1,48}[a-z0-9]$/
104
- return slugRegex.test(slug)
105
- }