@brainfish-ai/devdoc 0.1.42 → 0.1.43

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 (388) hide show
  1. package/dist/cli/commands/dev.js +19 -10
  2. package/package.json +3 -2
  3. package/renderer/app/api/assets/[...path]/route.js +108 -0
  4. package/renderer/app/api/assets/route.js +114 -0
  5. package/renderer/app/api/assets/upload/route.js +163 -0
  6. package/renderer/app/api/auth-schemes/route.js +58 -0
  7. package/renderer/app/api/chat/route.js +759 -0
  8. package/renderer/app/api/codegen/route.js +52 -0
  9. package/renderer/app/api/collections/route.js +675 -0
  10. package/renderer/app/api/debug/route.js +47 -0
  11. package/renderer/app/api/deploy/route.js +199 -0
  12. package/renderer/app/api/device/route.js +36 -0
  13. package/renderer/app/api/docs/route.js +205 -0
  14. package/renderer/app/api/domains/add/route.js +121 -0
  15. package/renderer/app/api/domains/lookup/route.js +43 -0
  16. package/renderer/app/api/domains/remove/route.js +89 -0
  17. package/renderer/app/api/domains/status/route.js +140 -0
  18. package/renderer/app/api/domains/verify/route.js +168 -0
  19. package/renderer/app/api/keys/regenerate/route.js +71 -0
  20. package/renderer/app/api/local-assets/[...path]/route.js +108 -0
  21. package/renderer/app/api/openapi-spec/route.js +73 -0
  22. package/renderer/app/api/projects/[slug]/route.js +129 -0
  23. package/renderer/app/api/projects/[slug]/stats/route.js +80 -0
  24. package/renderer/app/api/projects/register/route.js +176 -0
  25. package/renderer/app/api/proxy/route.js +139 -0
  26. package/renderer/app/api/proxy-stream/route.js +156 -0
  27. package/renderer/app/api/redirects/route.js +35 -0
  28. package/renderer/app/api/schema/route.js +85 -0
  29. package/renderer/app/api/subdomains/check/route.js +158 -0
  30. package/renderer/app/api/suggestions/route.js +175 -0
  31. package/renderer/app/layout.js +47 -0
  32. package/renderer/app/llms-full.txt/route.js +257 -0
  33. package/renderer/app/llms.txt/route.js +219 -0
  34. package/renderer/app/page.js +12 -0
  35. package/renderer/app/robots.txt/route.js +66 -0
  36. package/renderer/app/sitemap.xml/route.js +145 -0
  37. package/renderer/components/docs/index.js +8 -0
  38. package/renderer/components/docs/mdx/accordion.js +113 -0
  39. package/renderer/components/docs/mdx/badge.js +72 -0
  40. package/renderer/components/docs/mdx/callouts.js +137 -0
  41. package/renderer/components/docs/mdx/cards.js +175 -0
  42. package/renderer/components/docs/mdx/changelog.js +100 -0
  43. package/renderer/components/docs/mdx/code-block.js +147 -0
  44. package/renderer/components/docs/mdx/code-group.js +287 -0
  45. package/renderer/components/docs/mdx/file-embeds.js +82 -0
  46. package/renderer/components/docs/mdx/frame.js +59 -0
  47. package/renderer/components/docs/mdx/highlight.js +90 -0
  48. package/renderer/components/docs/mdx/iframe.js +69 -0
  49. package/renderer/components/docs/mdx/image.js +135 -0
  50. package/renderer/components/docs/mdx/index.js +134 -0
  51. package/renderer/components/docs/mdx/landing.js +315 -0
  52. package/renderer/components/docs/mdx/mermaid.js +212 -0
  53. package/renderer/components/docs/mdx/param-field.js +112 -0
  54. package/renderer/components/docs/mdx/steps.js +74 -0
  55. package/renderer/components/docs/mdx/tabs.js +50 -0
  56. package/renderer/components/docs/mdx-renderer.js +77 -0
  57. package/renderer/components/docs/navigation/breadcrumbs.js +64 -0
  58. package/renderer/components/docs/navigation/index.js +6 -0
  59. package/renderer/components/docs/navigation/page-nav.js +57 -0
  60. package/renderer/components/docs/navigation/sidebar.js +375 -0
  61. package/renderer/components/docs/navigation/toc.js +89 -0
  62. package/renderer/components/docs/notice.js +77 -0
  63. package/renderer/components/docs-header.js +202 -0
  64. package/renderer/components/docs-viewer/agent/agent-chat.js +1930 -0
  65. package/renderer/components/docs-viewer/agent/cards/debug-context-card.js +107 -0
  66. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.js +57 -0
  67. package/renderer/components/docs-viewer/agent/cards/index.js +45 -0
  68. package/renderer/components/docs-viewer/agent/cards/response-options-card.js +154 -0
  69. package/renderer/components/docs-viewer/agent/cards/types.js +22 -0
  70. package/renderer/components/docs-viewer/agent/chat-message.js +2 -0
  71. package/renderer/components/docs-viewer/agent/index.js +4 -0
  72. package/renderer/components/docs-viewer/agent/messages/assistant-message.js +108 -0
  73. package/renderer/components/docs-viewer/agent/messages/chat-message.js +34 -0
  74. package/renderer/components/docs-viewer/agent/messages/index.js +6 -0
  75. package/renderer/components/docs-viewer/agent/messages/tool-call-display.js +1065 -0
  76. package/renderer/components/docs-viewer/agent/messages/types.js +2 -0
  77. package/renderer/components/docs-viewer/agent/messages/typing-indicator.js +26 -0
  78. package/renderer/components/docs-viewer/agent/messages/user-message.js +37 -0
  79. package/renderer/components/docs-viewer/code-editor/{index.tsx → index.js} +1 -1
  80. package/renderer/components/docs-viewer/code-editor/notes-mode.js +1338 -0
  81. package/renderer/components/docs-viewer/content/changelog-page.js +297 -0
  82. package/renderer/components/docs-viewer/content/doc-page.js +264 -0
  83. package/renderer/components/docs-viewer/content/documentation-viewer.js +14 -0
  84. package/renderer/components/docs-viewer/content/index.js +29 -0
  85. package/renderer/components/docs-viewer/content/not-found-page.js +300 -0
  86. package/renderer/components/docs-viewer/content/request-details.js +528 -0
  87. package/renderer/components/docs-viewer/content/sections/auth.js +108 -0
  88. package/renderer/components/docs-viewer/content/sections/body.js +80 -0
  89. package/renderer/components/docs-viewer/content/sections/headers.js +64 -0
  90. package/renderer/components/docs-viewer/content/sections/overview.js +56 -0
  91. package/renderer/components/docs-viewer/content/sections/parameters.js +64 -0
  92. package/renderer/components/docs-viewer/content/sections/responses.js +91 -0
  93. package/renderer/components/docs-viewer/global-auth-modal.js +427 -0
  94. package/renderer/components/docs-viewer/index.js +1552 -0
  95. package/renderer/components/docs-viewer/playground/auth-editor.js +418 -0
  96. package/renderer/components/docs-viewer/playground/body-editor.js +240 -0
  97. package/renderer/components/docs-viewer/playground/code-editor.js +135 -0
  98. package/renderer/components/docs-viewer/playground/code-snippet.js +393 -0
  99. package/renderer/components/docs-viewer/playground/graphql-playground.js +734 -0
  100. package/renderer/components/docs-viewer/playground/index.js +682 -0
  101. package/renderer/components/docs-viewer/playground/key-value-editor.js +317 -0
  102. package/renderer/components/docs-viewer/playground/method-selector.js +65 -0
  103. package/renderer/components/docs-viewer/playground/request-builder.js +181 -0
  104. package/renderer/components/docs-viewer/playground/request-tabs.js +240 -0
  105. package/renderer/components/docs-viewer/playground/response-cards/idle-card.js +42 -0
  106. package/renderer/components/docs-viewer/playground/response-cards/index.js +72 -0
  107. package/renderer/components/docs-viewer/playground/response-cards/loading-card.js +24 -0
  108. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.js +28 -0
  109. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.js +308 -0
  110. package/renderer/components/docs-viewer/playground/response-cards/types.js +9 -0
  111. package/renderer/components/docs-viewer/playground/response-viewer.js +18 -0
  112. package/renderer/components/docs-viewer/search/index.js +2 -0
  113. package/renderer/components/docs-viewer/search/search-dialog.js +367 -0
  114. package/renderer/components/docs-viewer/search/use-search.js +89 -0
  115. package/renderer/components/docs-viewer/shared/markdown-renderer.js +423 -0
  116. package/renderer/components/docs-viewer/shared/method-badge.js +23 -0
  117. package/renderer/components/docs-viewer/shared/schema-viewer.js +321 -0
  118. package/renderer/components/docs-viewer/sidebar/collection-tree.js +222 -0
  119. package/renderer/components/docs-viewer/sidebar/endpoint-options.js +512 -0
  120. package/renderer/components/docs-viewer/sidebar/index.js +196 -0
  121. package/renderer/components/docs-viewer/sidebar/right-sidebar.js +163 -0
  122. package/renderer/components/docs-viewer/sidebar/sidebar-group.js +87 -0
  123. package/renderer/components/docs-viewer/sidebar/sidebar-item.js +172 -0
  124. package/renderer/components/docs-viewer/sidebar/sidebar-section.js +31 -0
  125. package/renderer/components/theme-provider.js +10 -0
  126. package/renderer/components/theme-toggle.js +106 -0
  127. package/renderer/components/ui/badge.js +29 -0
  128. package/renderer/components/ui/button.js +40 -0
  129. package/renderer/components/ui/dialog.js +50 -0
  130. package/renderer/components/ui/dropdown-menu.js +143 -0
  131. package/renderer/components/ui/input.js +12 -0
  132. package/renderer/components/ui/label.js +13 -0
  133. package/renderer/components/ui/navigation-menu.js +83 -0
  134. package/renderer/components/ui/select.js +116 -0
  135. package/renderer/components/ui/spinner.js +92 -0
  136. package/renderer/components/ui/tabs.js +34 -0
  137. package/renderer/components/ui/tooltip.js +43 -0
  138. package/renderer/hooks/use-code-copy.js +76 -0
  139. package/renderer/hooks/use-openapi-title.js +33 -0
  140. package/renderer/lib/api-docs/agent/index.js +4 -0
  141. package/renderer/lib/api-docs/agent/indexer.js +254 -0
  142. package/renderer/lib/api-docs/agent/spec-summary.js +227 -0
  143. package/renderer/lib/api-docs/agent/types.js +5 -0
  144. package/renderer/lib/api-docs/auth/auth-context.js +157 -0
  145. package/renderer/lib/api-docs/auth/auth-storage.js +66 -0
  146. package/renderer/lib/api-docs/auth/crypto.js +64 -0
  147. package/renderer/lib/api-docs/auth/index.js +3 -0
  148. package/renderer/lib/api-docs/code-editor/db.js +145 -0
  149. package/renderer/lib/api-docs/code-editor/hooks.js +254 -0
  150. package/renderer/lib/api-docs/code-editor/{index.ts → index.js} +3 -4
  151. package/renderer/lib/api-docs/code-editor/mode-context.js +154 -0
  152. package/renderer/lib/api-docs/code-editor/types.js +53 -0
  153. package/renderer/lib/api-docs/codegen/definitions.js +258 -0
  154. package/renderer/lib/api-docs/codegen/har.js +171 -0
  155. package/renderer/lib/api-docs/codegen/index.js +118 -0
  156. package/renderer/lib/api-docs/factories.js +136 -0
  157. package/renderer/lib/api-docs/{index.ts → index.js} +5 -10
  158. package/renderer/lib/api-docs/mobile-context.js +79 -0
  159. package/renderer/lib/api-docs/navigation-context.js +62 -0
  160. package/renderer/lib/api-docs/parsers/graphql/index.js +50 -0
  161. package/renderer/lib/api-docs/parsers/graphql/parser.js +350 -0
  162. package/renderer/lib/api-docs/parsers/graphql/transformer.js +215 -0
  163. package/renderer/lib/api-docs/parsers/graphql/types.js +46 -0
  164. package/renderer/lib/api-docs/parsers/openapi/dereferencer.js +43 -0
  165. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.js +486 -0
  166. package/renderer/lib/api-docs/parsers/openapi/extractors/body.js +295 -0
  167. package/renderer/lib/api-docs/parsers/openapi/extractors/index.js +132 -0
  168. package/renderer/lib/api-docs/parsers/openapi/index.js +127 -0
  169. package/renderer/lib/api-docs/parsers/openapi/transformer.js +192 -0
  170. package/renderer/lib/api-docs/parsers/openapi/validator.js +24 -0
  171. package/renderer/lib/api-docs/playground/context.js +65 -0
  172. package/renderer/lib/api-docs/playground/navigation-context.js +74 -0
  173. package/renderer/lib/api-docs/playground/request-builder.js +163 -0
  174. package/renderer/lib/api-docs/playground/request-runner.js +224 -0
  175. package/renderer/lib/api-docs/playground/types.js +5 -0
  176. package/renderer/lib/api-docs/types.js +23 -0
  177. package/renderer/lib/api-docs/utils.js +212 -0
  178. package/renderer/lib/cache.js +157 -0
  179. package/renderer/lib/docs/config/domain-schema.js +161 -0
  180. package/renderer/lib/docs/config/index.js +5 -0
  181. package/renderer/lib/docs/config/loader.js +113 -0
  182. package/renderer/lib/docs/config/schema.js +269 -0
  183. package/renderer/lib/docs/index.js +8 -0
  184. package/renderer/lib/docs/mdx/compiler.js +128 -0
  185. package/renderer/lib/docs/mdx/frontmatter.js +73 -0
  186. package/renderer/lib/docs/mdx/index.js +8 -0
  187. package/renderer/lib/docs/navigation/generator.js +269 -0
  188. package/renderer/lib/docs/navigation/index.js +4 -0
  189. package/renderer/lib/docs/navigation/types.js +9 -0
  190. package/renderer/lib/docs-navigation-context.js +40 -0
  191. package/renderer/lib/multi-tenant/context.js +80 -0
  192. package/renderer/lib/storage/blob.js +767 -0
  193. package/renderer/lib/utils/icons.js +30 -0
  194. package/renderer/lib/utils.js +5 -0
  195. package/renderer/next.config.js +62 -0
  196. package/renderer/tsconfig.json +23 -5
  197. package/renderer/app/api/assets/[...path]/route.ts +0 -123
  198. package/renderer/app/api/assets/route.ts +0 -124
  199. package/renderer/app/api/assets/upload/route.ts +0 -177
  200. package/renderer/app/api/auth-schemes/route.ts +0 -77
  201. package/renderer/app/api/chat/route.ts +0 -858
  202. package/renderer/app/api/codegen/route.ts +0 -72
  203. package/renderer/app/api/collections/route.ts +0 -1002
  204. package/renderer/app/api/debug/route.ts +0 -53
  205. package/renderer/app/api/deploy/route.ts +0 -234
  206. package/renderer/app/api/device/route.ts +0 -42
  207. package/renderer/app/api/docs/route.ts +0 -201
  208. package/renderer/app/api/domains/add/route.ts +0 -132
  209. package/renderer/app/api/domains/lookup/route.ts +0 -43
  210. package/renderer/app/api/domains/remove/route.ts +0 -100
  211. package/renderer/app/api/domains/status/route.ts +0 -158
  212. package/renderer/app/api/domains/verify/route.ts +0 -181
  213. package/renderer/app/api/keys/regenerate/route.ts +0 -80
  214. package/renderer/app/api/local-assets/[...path]/route.ts +0 -122
  215. package/renderer/app/api/openapi-spec/route.ts +0 -151
  216. package/renderer/app/api/projects/[slug]/route.ts +0 -153
  217. package/renderer/app/api/projects/[slug]/stats/route.ts +0 -96
  218. package/renderer/app/api/projects/register/route.ts +0 -152
  219. package/renderer/app/api/proxy/route.ts +0 -149
  220. package/renderer/app/api/proxy-stream/route.ts +0 -168
  221. package/renderer/app/api/redirects/route.ts +0 -47
  222. package/renderer/app/api/schema/route.ts +0 -73
  223. package/renderer/app/api/subdomains/check/route.ts +0 -172
  224. package/renderer/app/api/suggestions/route.ts +0 -144
  225. package/renderer/app/layout.tsx +0 -54
  226. package/renderer/app/llms-full.txt/route.ts +0 -346
  227. package/renderer/app/llms.txt/route.ts +0 -279
  228. package/renderer/app/page.tsx +0 -14
  229. package/renderer/app/robots.txt/route.ts +0 -84
  230. package/renderer/app/sitemap.xml/route.ts +0 -199
  231. package/renderer/components/docs/index.ts +0 -12
  232. package/renderer/components/docs/mdx/accordion.tsx +0 -169
  233. package/renderer/components/docs/mdx/badge.tsx +0 -132
  234. package/renderer/components/docs/mdx/callouts.tsx +0 -154
  235. package/renderer/components/docs/mdx/cards.tsx +0 -241
  236. package/renderer/components/docs/mdx/changelog.tsx +0 -120
  237. package/renderer/components/docs/mdx/code-block.tsx +0 -186
  238. package/renderer/components/docs/mdx/code-group.tsx +0 -421
  239. package/renderer/components/docs/mdx/file-embeds.tsx +0 -105
  240. package/renderer/components/docs/mdx/frame.tsx +0 -112
  241. package/renderer/components/docs/mdx/highlight.tsx +0 -151
  242. package/renderer/components/docs/mdx/iframe.tsx +0 -134
  243. package/renderer/components/docs/mdx/image.tsx +0 -235
  244. package/renderer/components/docs/mdx/index.ts +0 -237
  245. package/renderer/components/docs/mdx/landing.tsx +0 -684
  246. package/renderer/components/docs/mdx/mermaid.tsx +0 -240
  247. package/renderer/components/docs/mdx/param-field.tsx +0 -200
  248. package/renderer/components/docs/mdx/steps.tsx +0 -113
  249. package/renderer/components/docs/mdx/tabs.tsx +0 -86
  250. package/renderer/components/docs/mdx-renderer.tsx +0 -100
  251. package/renderer/components/docs/navigation/breadcrumbs.tsx +0 -76
  252. package/renderer/components/docs/navigation/index.ts +0 -8
  253. package/renderer/components/docs/navigation/page-nav.tsx +0 -64
  254. package/renderer/components/docs/navigation/sidebar.tsx +0 -515
  255. package/renderer/components/docs/navigation/toc.tsx +0 -113
  256. package/renderer/components/docs/notice.tsx +0 -105
  257. package/renderer/components/docs-header.tsx +0 -278
  258. package/renderer/components/docs-viewer/agent/agent-chat.tsx +0 -2076
  259. package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +0 -90
  260. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +0 -49
  261. package/renderer/components/docs-viewer/agent/cards/index.tsx +0 -50
  262. package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +0 -212
  263. package/renderer/components/docs-viewer/agent/cards/types.ts +0 -84
  264. package/renderer/components/docs-viewer/agent/chat-message.tsx +0 -17
  265. package/renderer/components/docs-viewer/agent/index.tsx +0 -6
  266. package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +0 -119
  267. package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +0 -46
  268. package/renderer/components/docs-viewer/agent/messages/index.ts +0 -17
  269. package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +0 -721
  270. package/renderer/components/docs-viewer/agent/messages/types.ts +0 -61
  271. package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +0 -24
  272. package/renderer/components/docs-viewer/agent/messages/user-message.tsx +0 -51
  273. package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +0 -1283
  274. package/renderer/components/docs-viewer/content/changelog-page.tsx +0 -331
  275. package/renderer/components/docs-viewer/content/doc-page.tsx +0 -367
  276. package/renderer/components/docs-viewer/content/documentation-viewer.tsx +0 -17
  277. package/renderer/components/docs-viewer/content/index.tsx +0 -29
  278. package/renderer/components/docs-viewer/content/not-found-page.tsx +0 -330
  279. package/renderer/components/docs-viewer/content/request-details.tsx +0 -330
  280. package/renderer/components/docs-viewer/content/sections/auth.tsx +0 -69
  281. package/renderer/components/docs-viewer/content/sections/body.tsx +0 -66
  282. package/renderer/components/docs-viewer/content/sections/headers.tsx +0 -43
  283. package/renderer/components/docs-viewer/content/sections/overview.tsx +0 -40
  284. package/renderer/components/docs-viewer/content/sections/parameters.tsx +0 -43
  285. package/renderer/components/docs-viewer/content/sections/responses.tsx +0 -87
  286. package/renderer/components/docs-viewer/global-auth-modal.tsx +0 -352
  287. package/renderer/components/docs-viewer/index.tsx +0 -1670
  288. package/renderer/components/docs-viewer/playground/auth-editor.tsx +0 -280
  289. package/renderer/components/docs-viewer/playground/body-editor.tsx +0 -221
  290. package/renderer/components/docs-viewer/playground/code-editor.tsx +0 -224
  291. package/renderer/components/docs-viewer/playground/code-snippet.tsx +0 -387
  292. package/renderer/components/docs-viewer/playground/graphql-playground.tsx +0 -745
  293. package/renderer/components/docs-viewer/playground/index.tsx +0 -671
  294. package/renderer/components/docs-viewer/playground/key-value-editor.tsx +0 -261
  295. package/renderer/components/docs-viewer/playground/method-selector.tsx +0 -60
  296. package/renderer/components/docs-viewer/playground/request-builder.tsx +0 -179
  297. package/renderer/components/docs-viewer/playground/request-tabs.tsx +0 -237
  298. package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +0 -21
  299. package/renderer/components/docs-viewer/playground/response-cards/index.tsx +0 -93
  300. package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +0 -16
  301. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +0 -23
  302. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +0 -268
  303. package/renderer/components/docs-viewer/playground/response-cards/types.ts +0 -82
  304. package/renderer/components/docs-viewer/playground/response-viewer.tsx +0 -43
  305. package/renderer/components/docs-viewer/search/index.ts +0 -2
  306. package/renderer/components/docs-viewer/search/search-dialog.tsx +0 -331
  307. package/renderer/components/docs-viewer/search/use-search.ts +0 -117
  308. package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +0 -431
  309. package/renderer/components/docs-viewer/shared/method-badge.tsx +0 -41
  310. package/renderer/components/docs-viewer/shared/schema-viewer.tsx +0 -349
  311. package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +0 -259
  312. package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +0 -316
  313. package/renderer/components/docs-viewer/sidebar/index.tsx +0 -282
  314. package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +0 -202
  315. package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +0 -118
  316. package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +0 -212
  317. package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +0 -38
  318. package/renderer/components/theme-provider.tsx +0 -11
  319. package/renderer/components/theme-toggle.tsx +0 -76
  320. package/renderer/components/ui/badge.tsx +0 -46
  321. package/renderer/components/ui/button.tsx +0 -59
  322. package/renderer/components/ui/dialog.tsx +0 -118
  323. package/renderer/components/ui/dropdown-menu.tsx +0 -257
  324. package/renderer/components/ui/input.tsx +0 -21
  325. package/renderer/components/ui/label.tsx +0 -24
  326. package/renderer/components/ui/navigation-menu.tsx +0 -168
  327. package/renderer/components/ui/select.tsx +0 -190
  328. package/renderer/components/ui/spinner.tsx +0 -114
  329. package/renderer/components/ui/tabs.tsx +0 -66
  330. package/renderer/components/ui/tooltip.tsx +0 -61
  331. package/renderer/hooks/use-code-copy.ts +0 -88
  332. package/renderer/hooks/use-openapi-title.ts +0 -44
  333. package/renderer/lib/api-docs/agent/index.ts +0 -6
  334. package/renderer/lib/api-docs/agent/indexer.ts +0 -323
  335. package/renderer/lib/api-docs/agent/spec-summary.ts +0 -335
  336. package/renderer/lib/api-docs/agent/types.ts +0 -116
  337. package/renderer/lib/api-docs/auth/auth-context.tsx +0 -225
  338. package/renderer/lib/api-docs/auth/auth-storage.ts +0 -87
  339. package/renderer/lib/api-docs/auth/crypto.ts +0 -89
  340. package/renderer/lib/api-docs/auth/index.ts +0 -4
  341. package/renderer/lib/api-docs/code-editor/db.ts +0 -164
  342. package/renderer/lib/api-docs/code-editor/hooks.ts +0 -266
  343. package/renderer/lib/api-docs/code-editor/mode-context.tsx +0 -207
  344. package/renderer/lib/api-docs/code-editor/types.ts +0 -105
  345. package/renderer/lib/api-docs/codegen/definitions.ts +0 -297
  346. package/renderer/lib/api-docs/codegen/har.ts +0 -251
  347. package/renderer/lib/api-docs/codegen/index.ts +0 -159
  348. package/renderer/lib/api-docs/factories.ts +0 -170
  349. package/renderer/lib/api-docs/mobile-context.tsx +0 -112
  350. package/renderer/lib/api-docs/navigation-context.tsx +0 -88
  351. package/renderer/lib/api-docs/parsers/graphql/README.md +0 -129
  352. package/renderer/lib/api-docs/parsers/graphql/index.ts +0 -91
  353. package/renderer/lib/api-docs/parsers/graphql/parser.ts +0 -491
  354. package/renderer/lib/api-docs/parsers/graphql/transformer.ts +0 -246
  355. package/renderer/lib/api-docs/parsers/graphql/types.ts +0 -283
  356. package/renderer/lib/api-docs/parsers/openapi/README.md +0 -32
  357. package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +0 -60
  358. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +0 -574
  359. package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +0 -403
  360. package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +0 -232
  361. package/renderer/lib/api-docs/parsers/openapi/index.ts +0 -171
  362. package/renderer/lib/api-docs/parsers/openapi/transformer.ts +0 -278
  363. package/renderer/lib/api-docs/parsers/openapi/validator.ts +0 -31
  364. package/renderer/lib/api-docs/playground/context.tsx +0 -107
  365. package/renderer/lib/api-docs/playground/navigation-context.tsx +0 -124
  366. package/renderer/lib/api-docs/playground/request-builder.ts +0 -223
  367. package/renderer/lib/api-docs/playground/request-runner.ts +0 -282
  368. package/renderer/lib/api-docs/playground/types.ts +0 -35
  369. package/renderer/lib/api-docs/types.ts +0 -269
  370. package/renderer/lib/api-docs/utils.ts +0 -311
  371. package/renderer/lib/cache.ts +0 -193
  372. package/renderer/lib/docs/config/domain-schema.ts +0 -260
  373. package/renderer/lib/docs/config/index.ts +0 -43
  374. package/renderer/lib/docs/config/loader.ts +0 -142
  375. package/renderer/lib/docs/config/schema.ts +0 -308
  376. package/renderer/lib/docs/index.ts +0 -12
  377. package/renderer/lib/docs/mdx/compiler.ts +0 -176
  378. package/renderer/lib/docs/mdx/frontmatter.ts +0 -91
  379. package/renderer/lib/docs/mdx/index.ts +0 -26
  380. package/renderer/lib/docs/navigation/generator.ts +0 -348
  381. package/renderer/lib/docs/navigation/index.ts +0 -12
  382. package/renderer/lib/docs/navigation/types.ts +0 -123
  383. package/renderer/lib/docs-navigation-context.tsx +0 -80
  384. package/renderer/lib/multi-tenant/context.ts +0 -105
  385. package/renderer/lib/storage/blob.ts +0 -1083
  386. package/renderer/lib/utils/icons.ts +0 -48
  387. package/renderer/lib/utils.ts +0 -6
  388. 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
- }