@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,53 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { headers } from 'next/headers'
3
- import { getProjectContent, projectExists } from '@/lib/storage/blob'
4
-
5
- /**
6
- * Debug endpoint to check multi-tenant routing
7
- *
8
- * GET /api/debug?slug=acme-api-docs-i2rjwv
9
- */
10
- export async function GET(request: NextRequest) {
11
- const headersList = await headers()
12
- const { searchParams } = new URL(request.url)
13
- const testSlug = searchParams.get('slug')
14
-
15
- // Collect all headers
16
- const allHeaders: Record<string, string> = {}
17
- headersList.forEach((value, key) => {
18
- allHeaders[key] = value
19
- })
20
-
21
- // Check for project header
22
- const projectSlug = headersList.get('x-devdoc-project')
23
-
24
- // Test Blob storage if slug provided
25
- let blobTest = null
26
- if (testSlug) {
27
- try {
28
- const exists = await projectExists(testSlug)
29
- const content = exists ? await getProjectContent(testSlug) : null
30
- blobTest = {
31
- slug: testSlug,
32
- exists,
33
- hasContent: !!content,
34
- filesCount: content?.files?.length || 0,
35
- projectName: content?.name || null,
36
- }
37
- } catch (error) {
38
- blobTest = {
39
- slug: testSlug,
40
- error: String(error),
41
- }
42
- }
43
- }
44
-
45
- return NextResponse.json({
46
- timestamp: new Date().toISOString(),
47
- host: headersList.get('host'),
48
- projectSlug,
49
- hasBlobToken: !!process.env.BLOB_READ_WRITE_TOKEN,
50
- blobTest,
51
- headers: allHeaders,
52
- })
53
- }
@@ -1,234 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import {
3
- storeProjectContent,
4
- updateProjectContent,
5
- projectExists,
6
- generateProjectSlug,
7
- generateApiKey,
8
- storeProjectApiKey,
9
- validateApiKey,
10
- getProjectApiKey,
11
- type ProjectFile
12
- } from '@/lib/storage/blob'
13
- import { getProjectUrl, isValidSlug } from '@/lib/multi-tenant/context'
14
-
15
- /**
16
- * Deploy API - receives content from CLI and stores in Vercel Blob
17
- *
18
- * POST /api/deploy
19
- * Headers:
20
- * Authorization: Bearer <api_key> // Required for updates
21
- * Body: {
22
- * name: string, // Project name from docs.json
23
- * slug?: string, // Optional: existing slug for updates
24
- * docsJson: object, // The docs.json configuration
25
- * files: Array<{ // MDX and other content files
26
- * path: string,
27
- * content: string
28
- * }>
29
- * }
30
- */
31
- export async function POST(request: NextRequest) {
32
- try {
33
- const body = await request.json()
34
-
35
- // Validate request body
36
- const { name, slug: existingSlug, docsJson, files } = body
37
-
38
- if (!name || typeof name !== 'string') {
39
- return NextResponse.json(
40
- { error: 'Missing or invalid project name' },
41
- { status: 400 }
42
- )
43
- }
44
-
45
- if (!docsJson || typeof docsJson !== 'object') {
46
- return NextResponse.json(
47
- { error: 'Missing or invalid docs.json configuration' },
48
- { status: 400 }
49
- )
50
- }
51
-
52
- if (!files || !Array.isArray(files)) {
53
- return NextResponse.json(
54
- { error: 'Missing or invalid files array' },
55
- { status: 400 }
56
- )
57
- }
58
-
59
- // Validate files structure
60
- const validFiles: ProjectFile[] = []
61
- for (const file of files) {
62
- if (!file.path || typeof file.path !== 'string') {
63
- return NextResponse.json(
64
- { error: `Invalid file entry: missing path` },
65
- { status: 400 }
66
- )
67
- }
68
- if (typeof file.content !== 'string') {
69
- return NextResponse.json(
70
- { error: `Invalid file entry for ${file.path}: content must be a string` },
71
- { status: 400 }
72
- )
73
- }
74
- validFiles.push({
75
- path: file.path,
76
- content: file.content,
77
- })
78
- }
79
-
80
- let slug: string
81
- let isUpdate = false
82
- let apiKey: string | null = null
83
-
84
- // Check if this is an update to an existing project
85
- if (existingSlug) {
86
- if (!isValidSlug(existingSlug)) {
87
- return NextResponse.json(
88
- { error: 'Invalid project slug format' },
89
- { status: 400 }
90
- )
91
- }
92
-
93
- const exists = await projectExists(existingSlug)
94
- if (!exists) {
95
- return NextResponse.json(
96
- { error: `Project with slug "${existingSlug}" not found` },
97
- { status: 404 }
98
- )
99
- }
100
-
101
- // For updates, validate API key
102
- const authHeader = request.headers.get('Authorization')
103
- const providedKey = authHeader?.replace('Bearer ', '') || body.apiKey
104
-
105
- if (!providedKey) {
106
- return NextResponse.json(
107
- { error: 'API key required for project updates. Provide via Authorization header or apiKey field.' },
108
- { status: 401 }
109
- )
110
- }
111
-
112
- const validatedSlug = await validateApiKey(providedKey)
113
- if (validatedSlug !== existingSlug) {
114
- return NextResponse.json(
115
- { error: 'Invalid API key for this project' },
116
- { status: 403 }
117
- )
118
- }
119
-
120
- slug = existingSlug
121
- isUpdate = true
122
- } else {
123
- // Generate a new unique slug
124
- slug = generateProjectSlug(name)
125
-
126
- // Ensure it doesn't already exist (very unlikely but possible)
127
- let attempts = 0
128
- while (await projectExists(slug) && attempts < 5) {
129
- slug = generateProjectSlug(name)
130
- attempts++
131
- }
132
-
133
- if (attempts >= 5) {
134
- return NextResponse.json(
135
- { error: 'Failed to generate unique project slug' },
136
- { status: 500 }
137
- )
138
- }
139
-
140
- // Generate API key for new project
141
- apiKey = generateApiKey()
142
- }
143
-
144
- // Store or update content
145
- let result
146
- if (isUpdate) {
147
- result = await updateProjectContent(slug, docsJson, validFiles)
148
- } else {
149
- result = await storeProjectContent(slug, name, docsJson, validFiles)
150
- // Store the API key for new projects
151
- if (apiKey) {
152
- await storeProjectApiKey(slug, apiKey)
153
- }
154
- }
155
-
156
- // Build response
157
- const projectUrl = getProjectUrl(slug)
158
-
159
- // For new projects, include the API key in response
160
- const response: {
161
- success: boolean
162
- slug: string
163
- url: string
164
- blobUrl: string
165
- isUpdate: boolean
166
- filesCount: number
167
- apiKey?: string
168
- } = {
169
- success: true,
170
- slug,
171
- url: projectUrl,
172
- blobUrl: result.url,
173
- isUpdate,
174
- filesCount: validFiles.length,
175
- }
176
-
177
- if (apiKey) {
178
- response.apiKey = apiKey
179
- }
180
-
181
- return NextResponse.json(response)
182
-
183
- } catch (error) {
184
- console.error('[Deploy API] Error:', error)
185
- const message = error instanceof Error ? error.message : String(error)
186
-
187
- // Provide clearer error messages for common issues
188
- let userMessage = 'Deployment failed'
189
- if (message.includes('blob already exists')) {
190
- userMessage = 'Storage conflict - please try again'
191
- } else if (message.includes('network') || message.includes('fetch')) {
192
- userMessage = 'Network error connecting to storage'
193
- } else if (message.includes('unauthorized') || message.includes('401')) {
194
- userMessage = 'Authentication failed'
195
- }
196
-
197
- return NextResponse.json(
198
- { error: userMessage, details: message },
199
- { status: 500 }
200
- )
201
- }
202
- }
203
-
204
- /**
205
- * GET /api/deploy - Check deployment status or get project info
206
- */
207
- export async function GET(request: NextRequest) {
208
- const { searchParams } = new URL(request.url)
209
- const slug = searchParams.get('slug')
210
-
211
- if (!slug) {
212
- return NextResponse.json(
213
- { error: 'Missing slug parameter' },
214
- { status: 400 }
215
- )
216
- }
217
-
218
- const exists = await projectExists(slug)
219
-
220
- if (!exists) {
221
- return NextResponse.json(
222
- { exists: false, slug },
223
- { status: 404 }
224
- )
225
- }
226
-
227
- const projectUrl = getProjectUrl(slug)
228
-
229
- return NextResponse.json({
230
- exists: true,
231
- slug,
232
- url: projectUrl,
233
- })
234
- }
@@ -1,42 +0,0 @@
1
- import { NextResponse } from 'next/server'
2
- import { cookies } from 'next/headers'
3
-
4
- const DEVICE_COOKIE_NAME = 'bf_device_id'
5
- const COOKIE_MAX_AGE = 60 * 60 * 24 * 365 // 1 year
6
-
7
- /**
8
- * Generate a unique device ID
9
- * Uses crypto.randomUUID for secure random generation
10
- */
11
- function generateDeviceId(): string {
12
- return crypto.randomUUID()
13
- }
14
-
15
- /**
16
- * GET /api/device
17
- * Returns or creates a unique device ID for the client
18
- * The device ID is stored in an httpOnly cookie for security
19
- */
20
- export async function GET() {
21
- const cookieStore = await cookies()
22
- let deviceId = cookieStore.get(DEVICE_COOKIE_NAME)?.value
23
-
24
- // Generate new device ID if not exists
25
- if (!deviceId) {
26
- deviceId = generateDeviceId()
27
- }
28
-
29
- // Create response with device ID
30
- const response = NextResponse.json({ deviceId })
31
-
32
- // Set/refresh the httpOnly cookie
33
- response.cookies.set(DEVICE_COOKIE_NAME, deviceId, {
34
- httpOnly: true,
35
- secure: process.env.NODE_ENV === 'production',
36
- sameSite: 'strict',
37
- maxAge: COOKIE_MAX_AGE,
38
- path: '/',
39
- })
40
-
41
- return response
42
- }
@@ -1,201 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { readFileSync, existsSync } from 'fs'
3
- import { join, isAbsolute } from 'path'
4
- import matter from 'gray-matter'
5
- import { serialize } from 'next-mdx-remote/serialize'
6
- import remarkGfm from 'remark-gfm'
7
- import rehypeSlug from 'rehype-slug'
8
- // Note: rehype-pretty-code is dynamically imported to handle serverless environments
9
- // where shiki may not be fully available
10
- import { getProjectFile } from '@/lib/storage/blob'
11
-
12
- const STARTER_PATH = process.env.STARTER_PATH || 'devdoc-docs'
13
-
14
- // Helper to get content root - supports both relative and absolute paths
15
- function getContentRoot(): string {
16
- if (isAbsolute(STARTER_PATH)) {
17
- return STARTER_PATH
18
- }
19
- return join(process.cwd(), STARTER_PATH)
20
- }
21
-
22
- // Shiki theme options for syntax highlighting
23
- const prettyCodeOptions = {
24
- theme: 'github-dark',
25
- keepBackground: true,
26
- defaultLang: 'plaintext',
27
- }
28
-
29
- export async function GET(request: NextRequest) {
30
- const searchParams = request.nextUrl.searchParams
31
- const slug = searchParams.get('slug')
32
- const is404Request = searchParams.get('is404') === 'true'
33
-
34
- if (!slug) {
35
- return NextResponse.json(
36
- { error: 'Missing slug parameter' },
37
- { status: 400 }
38
- )
39
- }
40
-
41
- // Check for multi-tenant mode (project slug from middleware)
42
- const projectSlug = request.headers.get('x-devdoc-project')
43
-
44
- // If multi-tenant, fetch from Blob Storage
45
- if (projectSlug && !projectSlug.startsWith('custom:')) {
46
- return handleMultiTenantDocs(projectSlug, slug, is404Request)
47
- }
48
-
49
- try {
50
- const starterDir = getContentRoot()
51
-
52
- // Try .mdx then .md
53
- let fullPath = join(starterDir, `${slug}.mdx`)
54
- if (!existsSync(fullPath)) {
55
- fullPath = join(starterDir, `${slug}.md`)
56
- }
57
-
58
- if (!existsSync(fullPath)) {
59
- // For 404 page requests, return 404 status (not a server error)
60
- // The client will handle showing the default 404 if custom doesn't exist
61
- return NextResponse.json(
62
- { error: 'Page not found' },
63
- { status: 404 }
64
- )
65
- }
66
-
67
- const fileContent = readFileSync(fullPath, 'utf-8')
68
- const { data: frontmatter, content } = matter(fileContent)
69
-
70
- // Serialize MDX for client-side rendering
71
- // Note: rehype-pretty-code is dynamically imported to handle cases where shiki
72
- // may not be available in serverless environments
73
- let mdxSource
74
- try {
75
- // Try with syntax highlighting first
76
- const rehypePrettyCodeModule = await import('rehype-pretty-code')
77
- const rehypePrettyCode = rehypePrettyCodeModule.default
78
-
79
- mdxSource = await serialize(content, {
80
- mdxOptions: {
81
- remarkPlugins: [remarkGfm],
82
- rehypePlugins: [
83
- rehypeSlug,
84
- [rehypePrettyCode, prettyCodeOptions],
85
- ],
86
- },
87
- parseFrontmatter: false,
88
- })
89
- } catch (syntaxError) {
90
- // Fallback: serialize without syntax highlighting if shiki is unavailable
91
- console.warn('[Docs API] Syntax highlighting unavailable, using fallback:', syntaxError)
92
- mdxSource = await serialize(content, {
93
- mdxOptions: {
94
- remarkPlugins: [remarkGfm],
95
- rehypePlugins: [rehypeSlug],
96
- },
97
- parseFrontmatter: false,
98
- })
99
- }
100
-
101
- return NextResponse.json({
102
- slug,
103
- frontmatter: {
104
- title: frontmatter.title || slug,
105
- description: frontmatter.description,
106
- icon: frontmatter.icon,
107
- // Page mode and layout options
108
- mode: frontmatter.mode || 'default',
109
- hideHeader: frontmatter.hideHeader || false,
110
- fullWidth: frontmatter.fullWidth || false,
111
- background: frontmatter.background,
112
- },
113
- mdxSource,
114
- rawContent: content, // Include raw content for changelog version extraction
115
- })
116
- } catch (error) {
117
- console.error('[Docs API] Error loading page:', error)
118
- return NextResponse.json(
119
- { error: 'Failed to load page', details: error instanceof Error ? error.message : String(error) },
120
- { status: 500 }
121
- )
122
- }
123
- }
124
-
125
- /**
126
- * Handle multi-tenant docs request - fetch from Blob Storage
127
- */
128
- async function handleMultiTenantDocs(projectSlug: string, slug: string, is404Request: boolean = false): Promise<Response> {
129
- try {
130
- // Try .mdx then .md
131
- let fileContent = await getProjectFile(projectSlug, `${slug}.mdx`)
132
- if (!fileContent) {
133
- fileContent = await getProjectFile(projectSlug, `${slug}.md`)
134
- }
135
-
136
- if (!fileContent) {
137
- // For 404 page requests, return 404 status
138
- return NextResponse.json(
139
- { error: 'Page not found' },
140
- { status: 404 }
141
- )
142
- }
143
-
144
- const { data: frontmatter, content } = matter(fileContent)
145
-
146
- // Serialize MDX for client-side rendering
147
- // Note: rehype-pretty-code is dynamically imported to handle cases where shiki
148
- // may not be available in serverless environments
149
- let mdxSource
150
- try {
151
- // Try with syntax highlighting first
152
- const rehypePrettyCodeModule = await import('rehype-pretty-code')
153
- const rehypePrettyCode = rehypePrettyCodeModule.default
154
-
155
- mdxSource = await serialize(content, {
156
- mdxOptions: {
157
- remarkPlugins: [remarkGfm],
158
- rehypePlugins: [
159
- rehypeSlug,
160
- [rehypePrettyCode, prettyCodeOptions],
161
- ],
162
- },
163
- parseFrontmatter: false,
164
- })
165
- } catch (syntaxError) {
166
- // Fallback: serialize without syntax highlighting if shiki is unavailable
167
- console.warn('[Docs API] Multi-tenant syntax highlighting unavailable:', syntaxError)
168
- mdxSource = await serialize(content, {
169
- mdxOptions: {
170
- remarkPlugins: [remarkGfm],
171
- rehypePlugins: [rehypeSlug],
172
- },
173
- parseFrontmatter: false,
174
- })
175
- }
176
-
177
- return NextResponse.json({
178
- slug,
179
- frontmatter: {
180
- title: frontmatter.title || slug,
181
- description: frontmatter.description,
182
- icon: frontmatter.icon,
183
- // Page mode and layout options
184
- mode: frontmatter.mode || 'default',
185
- hideHeader: frontmatter.hideHeader || false,
186
- fullWidth: frontmatter.fullWidth || false,
187
- background: frontmatter.background,
188
- },
189
- mdxSource,
190
- rawContent: content,
191
- isMultiTenant: true,
192
- projectSlug,
193
- })
194
- } catch (error) {
195
- console.error('[Docs API] Multi-tenant error:', error)
196
- return NextResponse.json(
197
- { error: 'Failed to load page', details: error instanceof Error ? error.message : String(error) },
198
- { status: 500 }
199
- )
200
- }
201
- }
@@ -1,132 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import {
3
- validateApiKey,
4
- addCustomDomain,
5
- isCustomDomainRegistered,
6
- } from '@/lib/storage/blob'
7
- import { isValidDomain, normalizeDomain, getDnsInstructions } from '@/lib/docs/config'
8
-
9
- /**
10
- * POST /api/domains/add
11
- *
12
- * Add a custom domain to a project.
13
- * Each project can have ONE custom domain (free).
14
- *
15
- * Headers:
16
- * Authorization: Bearer <api_key>
17
- *
18
- * Body:
19
- * { customDomain: "docs.example.com" }
20
- *
21
- * Response:
22
- * {
23
- * success: true,
24
- * domain: "docs.example.com",
25
- * status: "pending",
26
- * verification: {
27
- * cname: { name: "docs", value: "cname.devdoc-dns.com" },
28
- * txt: { name: "_devdoc-verify.docs.example.com", value: "devdoc-verify=xxx" }
29
- * }
30
- * }
31
- */
32
- export async function POST(request: NextRequest) {
33
- try {
34
- // Validate API key
35
- const authHeader = request.headers.get('Authorization')
36
- const apiKey = authHeader?.replace('Bearer ', '')
37
-
38
- if (!apiKey) {
39
- return NextResponse.json(
40
- { error: 'API key required. Provide via Authorization header.' },
41
- { status: 401 }
42
- )
43
- }
44
-
45
- const projectSlug = await validateApiKey(apiKey)
46
- if (!projectSlug) {
47
- return NextResponse.json(
48
- { error: 'Invalid API key' },
49
- { status: 403 }
50
- )
51
- }
52
-
53
- // Parse request body
54
- const body = await request.json()
55
- const { customDomain: rawDomain } = body
56
-
57
- if (!rawDomain || typeof rawDomain !== 'string') {
58
- return NextResponse.json(
59
- { error: 'Missing customDomain in request body' },
60
- { status: 400 }
61
- )
62
- }
63
-
64
- // Normalize and validate domain
65
- const customDomain = normalizeDomain(rawDomain)
66
- const validation = isValidDomain(customDomain)
67
-
68
- if (!validation.valid) {
69
- return NextResponse.json(
70
- { error: validation.error },
71
- { status: 400 }
72
- )
73
- }
74
-
75
- // Check if domain is already registered
76
- const isRegistered = await isCustomDomainRegistered(customDomain)
77
- if (isRegistered) {
78
- return NextResponse.json(
79
- { error: `Domain ${customDomain} is already registered to another project.` },
80
- { status: 409 }
81
- )
82
- }
83
-
84
- // Add the custom domain
85
- const result = await addCustomDomain(projectSlug, customDomain)
86
-
87
- if (!result.success) {
88
- return NextResponse.json(
89
- { error: result.error },
90
- { status: 400 }
91
- )
92
- }
93
-
94
- // Get DNS instructions
95
- const dnsInstructions = getDnsInstructions(customDomain)
96
-
97
- // Add verification token to TXT record
98
- dnsInstructions.txt.value = result.entry!.verificationToken || ''
99
-
100
- return NextResponse.json({
101
- success: true,
102
- domain: customDomain,
103
- projectSlug,
104
- status: result.entry!.status,
105
- verification: {
106
- cname: dnsInstructions.cname,
107
- txt: dnsInstructions.txt,
108
- },
109
- instructions: [
110
- 'Add the following DNS records to your domain:',
111
- '',
112
- `1. CNAME Record:`,
113
- ` Name: ${dnsInstructions.cname.name}`,
114
- ` Value: ${dnsInstructions.cname.value}`,
115
- '',
116
- `2. TXT Record (for verification):`,
117
- ` Name: ${dnsInstructions.txt.name}`,
118
- ` Value: ${dnsInstructions.txt.value}`,
119
- '',
120
- 'After adding DNS records, run "devdoc domain verify" to verify.',
121
- ],
122
- })
123
-
124
- } catch (error) {
125
- console.error('[Domains API] Error adding domain:', error)
126
- const message = error instanceof Error ? error.message : String(error)
127
- return NextResponse.json(
128
- { error: 'Failed to add domain', details: message },
129
- { status: 500 }
130
- )
131
- }
132
- }
@@ -1,43 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { lookupCustomDomain } from '@/lib/storage/blob'
3
-
4
- /**
5
- * GET /api/domains/lookup
6
- *
7
- * Internal API for middleware to look up custom domains.
8
- * Returns the project slug for an active custom domain.
9
- *
10
- * Query:
11
- * ?domain=docs.example.com
12
- *
13
- * Response:
14
- * { found: true, projectSlug: "my-project" }
15
- * or
16
- * { found: false }
17
- */
18
- export async function GET(request: NextRequest) {
19
- try {
20
- const { searchParams } = new URL(request.url)
21
- const domain = searchParams.get('domain')
22
-
23
- if (!domain) {
24
- return NextResponse.json({ found: false, error: 'Missing domain parameter' })
25
- }
26
-
27
- const entry = await lookupCustomDomain(domain)
28
-
29
- if (entry) {
30
- return NextResponse.json({
31
- found: true,
32
- projectSlug: entry.projectSlug,
33
- status: entry.status,
34
- })
35
- }
36
-
37
- return NextResponse.json({ found: false })
38
-
39
- } catch (error) {
40
- console.error('[Domains Lookup] Error:', error)
41
- return NextResponse.json({ found: false })
42
- }
43
- }