@brainfish-ai/devdoc 0.1.21

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 (268) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +415 -0
  3. package/bin/devdoc.js +13 -0
  4. package/dist/cli/commands/build.d.ts +5 -0
  5. package/dist/cli/commands/build.js +87 -0
  6. package/dist/cli/commands/check.d.ts +1 -0
  7. package/dist/cli/commands/check.js +143 -0
  8. package/dist/cli/commands/create.d.ts +24 -0
  9. package/dist/cli/commands/create.js +387 -0
  10. package/dist/cli/commands/deploy.d.ts +9 -0
  11. package/dist/cli/commands/deploy.js +433 -0
  12. package/dist/cli/commands/dev.d.ts +6 -0
  13. package/dist/cli/commands/dev.js +139 -0
  14. package/dist/cli/commands/init.d.ts +11 -0
  15. package/dist/cli/commands/init.js +238 -0
  16. package/dist/cli/commands/keys.d.ts +12 -0
  17. package/dist/cli/commands/keys.js +165 -0
  18. package/dist/cli/commands/start.d.ts +5 -0
  19. package/dist/cli/commands/start.js +56 -0
  20. package/dist/cli/commands/upload.d.ts +13 -0
  21. package/dist/cli/commands/upload.js +238 -0
  22. package/dist/cli/commands/whoami.d.ts +8 -0
  23. package/dist/cli/commands/whoami.js +91 -0
  24. package/dist/cli/index.d.ts +1 -0
  25. package/dist/cli/index.js +106 -0
  26. package/dist/config/index.d.ts +80 -0
  27. package/dist/config/index.js +133 -0
  28. package/dist/constants.d.ts +9 -0
  29. package/dist/constants.js +13 -0
  30. package/dist/index.d.ts +7 -0
  31. package/dist/index.js +12 -0
  32. package/dist/utils/logger.d.ts +16 -0
  33. package/dist/utils/logger.js +61 -0
  34. package/dist/utils/paths.d.ts +16 -0
  35. package/dist/utils/paths.js +50 -0
  36. package/package.json +51 -0
  37. package/renderer/app/api/assets/[...path]/route.ts +123 -0
  38. package/renderer/app/api/assets/route.ts +124 -0
  39. package/renderer/app/api/assets/upload/route.ts +177 -0
  40. package/renderer/app/api/auth-schemes/route.ts +77 -0
  41. package/renderer/app/api/chat/route.ts +858 -0
  42. package/renderer/app/api/codegen/route.ts +72 -0
  43. package/renderer/app/api/collections/route.ts +1016 -0
  44. package/renderer/app/api/debug/route.ts +53 -0
  45. package/renderer/app/api/deploy/route.ts +234 -0
  46. package/renderer/app/api/device/route.ts +42 -0
  47. package/renderer/app/api/docs/route.ts +187 -0
  48. package/renderer/app/api/keys/regenerate/route.ts +80 -0
  49. package/renderer/app/api/openapi-spec/route.ts +151 -0
  50. package/renderer/app/api/projects/[slug]/route.ts +153 -0
  51. package/renderer/app/api/projects/[slug]/stats/route.ts +96 -0
  52. package/renderer/app/api/projects/register/route.ts +152 -0
  53. package/renderer/app/api/proxy/route.ts +149 -0
  54. package/renderer/app/api/proxy-stream/route.ts +168 -0
  55. package/renderer/app/api/redirects/route.ts +47 -0
  56. package/renderer/app/api/schema/route.ts +65 -0
  57. package/renderer/app/api/subdomains/check/route.ts +172 -0
  58. package/renderer/app/api/suggestions/route.ts +144 -0
  59. package/renderer/app/favicon.ico +0 -0
  60. package/renderer/app/globals.css +1103 -0
  61. package/renderer/app/layout.tsx +47 -0
  62. package/renderer/app/llms-full.txt/route.ts +346 -0
  63. package/renderer/app/llms.txt/route.ts +279 -0
  64. package/renderer/app/page.tsx +14 -0
  65. package/renderer/app/robots.txt/route.ts +84 -0
  66. package/renderer/app/sitemap.xml/route.ts +199 -0
  67. package/renderer/components/docs/index.ts +12 -0
  68. package/renderer/components/docs/mdx/accordion.tsx +169 -0
  69. package/renderer/components/docs/mdx/badge.tsx +132 -0
  70. package/renderer/components/docs/mdx/callouts.tsx +154 -0
  71. package/renderer/components/docs/mdx/cards.tsx +213 -0
  72. package/renderer/components/docs/mdx/changelog.tsx +120 -0
  73. package/renderer/components/docs/mdx/code-block.tsx +186 -0
  74. package/renderer/components/docs/mdx/code-group.tsx +421 -0
  75. package/renderer/components/docs/mdx/file-embeds.tsx +105 -0
  76. package/renderer/components/docs/mdx/frame.tsx +112 -0
  77. package/renderer/components/docs/mdx/highlight.tsx +151 -0
  78. package/renderer/components/docs/mdx/iframe.tsx +134 -0
  79. package/renderer/components/docs/mdx/image.tsx +235 -0
  80. package/renderer/components/docs/mdx/index.ts +204 -0
  81. package/renderer/components/docs/mdx/mermaid.tsx +240 -0
  82. package/renderer/components/docs/mdx/param-field.tsx +200 -0
  83. package/renderer/components/docs/mdx/steps.tsx +113 -0
  84. package/renderer/components/docs/mdx/tabs.tsx +86 -0
  85. package/renderer/components/docs/mdx-renderer.tsx +100 -0
  86. package/renderer/components/docs/navigation/breadcrumbs.tsx +76 -0
  87. package/renderer/components/docs/navigation/index.ts +8 -0
  88. package/renderer/components/docs/navigation/page-nav.tsx +64 -0
  89. package/renderer/components/docs/navigation/sidebar.tsx +515 -0
  90. package/renderer/components/docs/navigation/toc.tsx +113 -0
  91. package/renderer/components/docs/notice.tsx +105 -0
  92. package/renderer/components/docs-header.tsx +274 -0
  93. package/renderer/components/docs-viewer/agent/agent-chat.tsx +2076 -0
  94. package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +90 -0
  95. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +49 -0
  96. package/renderer/components/docs-viewer/agent/cards/index.tsx +50 -0
  97. package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +212 -0
  98. package/renderer/components/docs-viewer/agent/cards/types.ts +84 -0
  99. package/renderer/components/docs-viewer/agent/chat-message.tsx +17 -0
  100. package/renderer/components/docs-viewer/agent/index.tsx +6 -0
  101. package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +119 -0
  102. package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +46 -0
  103. package/renderer/components/docs-viewer/agent/messages/index.ts +17 -0
  104. package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +721 -0
  105. package/renderer/components/docs-viewer/agent/messages/types.ts +61 -0
  106. package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +24 -0
  107. package/renderer/components/docs-viewer/agent/messages/user-message.tsx +51 -0
  108. package/renderer/components/docs-viewer/code-editor/index.tsx +2 -0
  109. package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +1283 -0
  110. package/renderer/components/docs-viewer/content/changelog-page.tsx +331 -0
  111. package/renderer/components/docs-viewer/content/doc-page.tsx +285 -0
  112. package/renderer/components/docs-viewer/content/documentation-viewer.tsx +17 -0
  113. package/renderer/components/docs-viewer/content/index.tsx +29 -0
  114. package/renderer/components/docs-viewer/content/introduction.tsx +21 -0
  115. package/renderer/components/docs-viewer/content/request-details.tsx +330 -0
  116. package/renderer/components/docs-viewer/content/sections/auth.tsx +69 -0
  117. package/renderer/components/docs-viewer/content/sections/body.tsx +66 -0
  118. package/renderer/components/docs-viewer/content/sections/headers.tsx +43 -0
  119. package/renderer/components/docs-viewer/content/sections/overview.tsx +40 -0
  120. package/renderer/components/docs-viewer/content/sections/parameters.tsx +43 -0
  121. package/renderer/components/docs-viewer/content/sections/responses.tsx +87 -0
  122. package/renderer/components/docs-viewer/global-auth-modal.tsx +352 -0
  123. package/renderer/components/docs-viewer/index.tsx +1466 -0
  124. package/renderer/components/docs-viewer/playground/auth-editor.tsx +280 -0
  125. package/renderer/components/docs-viewer/playground/body-editor.tsx +221 -0
  126. package/renderer/components/docs-viewer/playground/code-editor.tsx +224 -0
  127. package/renderer/components/docs-viewer/playground/code-snippet.tsx +387 -0
  128. package/renderer/components/docs-viewer/playground/graphql-playground.tsx +745 -0
  129. package/renderer/components/docs-viewer/playground/index.tsx +671 -0
  130. package/renderer/components/docs-viewer/playground/key-value-editor.tsx +261 -0
  131. package/renderer/components/docs-viewer/playground/method-selector.tsx +60 -0
  132. package/renderer/components/docs-viewer/playground/request-builder.tsx +179 -0
  133. package/renderer/components/docs-viewer/playground/request-tabs.tsx +237 -0
  134. package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +21 -0
  135. package/renderer/components/docs-viewer/playground/response-cards/index.tsx +93 -0
  136. package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +16 -0
  137. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +23 -0
  138. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +268 -0
  139. package/renderer/components/docs-viewer/playground/response-cards/types.ts +82 -0
  140. package/renderer/components/docs-viewer/playground/response-viewer.tsx +43 -0
  141. package/renderer/components/docs-viewer/search/index.ts +2 -0
  142. package/renderer/components/docs-viewer/search/search-dialog.tsx +331 -0
  143. package/renderer/components/docs-viewer/search/use-search.ts +117 -0
  144. package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +431 -0
  145. package/renderer/components/docs-viewer/shared/method-badge.tsx +41 -0
  146. package/renderer/components/docs-viewer/shared/schema-viewer.tsx +349 -0
  147. package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +239 -0
  148. package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +316 -0
  149. package/renderer/components/docs-viewer/sidebar/index.tsx +343 -0
  150. package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +202 -0
  151. package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +118 -0
  152. package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +226 -0
  153. package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +52 -0
  154. package/renderer/components/theme-provider.tsx +11 -0
  155. package/renderer/components/theme-toggle.tsx +76 -0
  156. package/renderer/components/ui/badge.tsx +46 -0
  157. package/renderer/components/ui/button.tsx +59 -0
  158. package/renderer/components/ui/dialog.tsx +118 -0
  159. package/renderer/components/ui/dropdown-menu.tsx +257 -0
  160. package/renderer/components/ui/input.tsx +21 -0
  161. package/renderer/components/ui/label.tsx +24 -0
  162. package/renderer/components/ui/navigation-menu.tsx +168 -0
  163. package/renderer/components/ui/select.tsx +190 -0
  164. package/renderer/components/ui/spinner.tsx +114 -0
  165. package/renderer/components/ui/tabs.tsx +66 -0
  166. package/renderer/components/ui/tooltip.tsx +61 -0
  167. package/renderer/hooks/use-code-copy.ts +88 -0
  168. package/renderer/hooks/use-openapi-title.ts +44 -0
  169. package/renderer/lib/api-docs/agent/index.ts +6 -0
  170. package/renderer/lib/api-docs/agent/indexer.ts +323 -0
  171. package/renderer/lib/api-docs/agent/spec-summary.ts +335 -0
  172. package/renderer/lib/api-docs/agent/types.ts +116 -0
  173. package/renderer/lib/api-docs/auth/auth-context.tsx +225 -0
  174. package/renderer/lib/api-docs/auth/auth-storage.ts +87 -0
  175. package/renderer/lib/api-docs/auth/crypto.ts +89 -0
  176. package/renderer/lib/api-docs/auth/index.ts +4 -0
  177. package/renderer/lib/api-docs/code-editor/db.ts +164 -0
  178. package/renderer/lib/api-docs/code-editor/hooks.ts +266 -0
  179. package/renderer/lib/api-docs/code-editor/index.ts +6 -0
  180. package/renderer/lib/api-docs/code-editor/mode-context.tsx +207 -0
  181. package/renderer/lib/api-docs/code-editor/types.ts +105 -0
  182. package/renderer/lib/api-docs/codegen/definitions.ts +297 -0
  183. package/renderer/lib/api-docs/codegen/har.ts +251 -0
  184. package/renderer/lib/api-docs/codegen/index.ts +159 -0
  185. package/renderer/lib/api-docs/factories.ts +151 -0
  186. package/renderer/lib/api-docs/index.ts +17 -0
  187. package/renderer/lib/api-docs/mobile-context.tsx +112 -0
  188. package/renderer/lib/api-docs/navigation-context.tsx +88 -0
  189. package/renderer/lib/api-docs/parsers/graphql/README.md +129 -0
  190. package/renderer/lib/api-docs/parsers/graphql/index.ts +91 -0
  191. package/renderer/lib/api-docs/parsers/graphql/parser.ts +491 -0
  192. package/renderer/lib/api-docs/parsers/graphql/transformer.ts +246 -0
  193. package/renderer/lib/api-docs/parsers/graphql/types.ts +283 -0
  194. package/renderer/lib/api-docs/parsers/openapi/README.md +32 -0
  195. package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +60 -0
  196. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +574 -0
  197. package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +403 -0
  198. package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +232 -0
  199. package/renderer/lib/api-docs/parsers/openapi/index.ts +171 -0
  200. package/renderer/lib/api-docs/parsers/openapi/transformer.ts +277 -0
  201. package/renderer/lib/api-docs/parsers/openapi/validator.ts +31 -0
  202. package/renderer/lib/api-docs/playground/context.tsx +107 -0
  203. package/renderer/lib/api-docs/playground/navigation-context.tsx +124 -0
  204. package/renderer/lib/api-docs/playground/request-builder.ts +223 -0
  205. package/renderer/lib/api-docs/playground/request-runner.ts +282 -0
  206. package/renderer/lib/api-docs/playground/types.ts +35 -0
  207. package/renderer/lib/api-docs/types.ts +269 -0
  208. package/renderer/lib/api-docs/utils.ts +311 -0
  209. package/renderer/lib/cache.ts +193 -0
  210. package/renderer/lib/docs/config/index.ts +29 -0
  211. package/renderer/lib/docs/config/loader.ts +142 -0
  212. package/renderer/lib/docs/config/schema.ts +298 -0
  213. package/renderer/lib/docs/index.ts +12 -0
  214. package/renderer/lib/docs/mdx/compiler.ts +176 -0
  215. package/renderer/lib/docs/mdx/frontmatter.ts +80 -0
  216. package/renderer/lib/docs/mdx/index.ts +26 -0
  217. package/renderer/lib/docs/navigation/generator.ts +348 -0
  218. package/renderer/lib/docs/navigation/index.ts +12 -0
  219. package/renderer/lib/docs/navigation/types.ts +123 -0
  220. package/renderer/lib/docs-navigation-context.tsx +80 -0
  221. package/renderer/lib/multi-tenant/context.ts +105 -0
  222. package/renderer/lib/storage/blob.ts +845 -0
  223. package/renderer/lib/utils.ts +6 -0
  224. package/renderer/next.config.ts +76 -0
  225. package/renderer/package.json +66 -0
  226. package/renderer/postcss.config.mjs +5 -0
  227. package/renderer/public/assets/images/screenshot.png +0 -0
  228. package/renderer/public/assets/logo/dark.svg +9 -0
  229. package/renderer/public/assets/logo/light.svg +9 -0
  230. package/renderer/public/assets/logo.svg +9 -0
  231. package/renderer/public/file.svg +1 -0
  232. package/renderer/public/globe.svg +1 -0
  233. package/renderer/public/icon.png +0 -0
  234. package/renderer/public/logo.svg +9 -0
  235. package/renderer/public/window.svg +1 -0
  236. package/renderer/tsconfig.json +28 -0
  237. package/templates/basic/README.md +139 -0
  238. package/templates/basic/assets/favicon.svg +4 -0
  239. package/templates/basic/assets/logo.svg +9 -0
  240. package/templates/basic/docs.json +47 -0
  241. package/templates/basic/guides/configuration.mdx +149 -0
  242. package/templates/basic/guides/overview.mdx +96 -0
  243. package/templates/basic/index.mdx +39 -0
  244. package/templates/basic/package.json +14 -0
  245. package/templates/basic/quickstart.mdx +92 -0
  246. package/templates/basic/vercel.json +6 -0
  247. package/templates/graphql/README.md +139 -0
  248. package/templates/graphql/api-reference/schema.graphql +305 -0
  249. package/templates/graphql/assets/favicon.svg +4 -0
  250. package/templates/graphql/assets/logo.svg +9 -0
  251. package/templates/graphql/docs.json +54 -0
  252. package/templates/graphql/guides/configuration.mdx +149 -0
  253. package/templates/graphql/guides/overview.mdx +96 -0
  254. package/templates/graphql/index.mdx +39 -0
  255. package/templates/graphql/package.json +14 -0
  256. package/templates/graphql/quickstart.mdx +92 -0
  257. package/templates/graphql/vercel.json +6 -0
  258. package/templates/openapi/README.md +139 -0
  259. package/templates/openapi/api-reference/openapi.json +419 -0
  260. package/templates/openapi/assets/favicon.svg +4 -0
  261. package/templates/openapi/assets/logo.svg +9 -0
  262. package/templates/openapi/docs.json +61 -0
  263. package/templates/openapi/guides/configuration.mdx +149 -0
  264. package/templates/openapi/guides/overview.mdx +96 -0
  265. package/templates/openapi/index.mdx +39 -0
  266. package/templates/openapi/package.json +14 -0
  267. package/templates/openapi/quickstart.mdx +92 -0
  268. package/templates/openapi/vercel.json +6 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Navigation Types
3
+ *
4
+ * Types for the documentation navigation system
5
+ */
6
+
7
+ /**
8
+ * A navigation item representing a single page
9
+ */
10
+ export interface NavItem {
11
+ /** Display title */
12
+ title: string
13
+ /** URL path to the page */
14
+ href: string
15
+ /** Icon name (Phosphor icons) */
16
+ icon?: string
17
+ /** Whether the page is marked as deprecated */
18
+ deprecated?: boolean
19
+ /** Whether this is an external link */
20
+ external?: boolean
21
+ /** Optional badge text */
22
+ badge?: string
23
+ }
24
+
25
+ /**
26
+ * A group of navigation items
27
+ */
28
+ export interface NavGroup {
29
+ /** Group title */
30
+ title: string
31
+ /** Icon for the group */
32
+ icon?: string
33
+ /** Pages in this group (can include nested groups) */
34
+ items: (NavItem | NavGroup)[]
35
+ /** Whether the group is collapsible */
36
+ collapsible?: boolean
37
+ /** Default collapsed state */
38
+ defaultCollapsed?: boolean
39
+ }
40
+
41
+ /**
42
+ * A navigation tab (top-level section)
43
+ */
44
+ export interface NavTab {
45
+ /** Tab title */
46
+ title: string
47
+ /** URL segment for this tab */
48
+ slug: string
49
+ /** Groups within this tab */
50
+ groups: NavGroup[]
51
+ /** Icon for the tab */
52
+ icon?: string
53
+ }
54
+
55
+ /**
56
+ * Complete navigation structure
57
+ */
58
+ export interface Navigation {
59
+ /** Navigation tabs (if using tabbed navigation) */
60
+ tabs?: NavTab[]
61
+ /** Groups (if using single-page navigation) */
62
+ groups?: NavGroup[]
63
+ /** Global anchors (shown on all pages) */
64
+ anchors?: NavItem[]
65
+ }
66
+
67
+ /**
68
+ * Breadcrumb item
69
+ */
70
+ export interface BreadcrumbItem {
71
+ title: string
72
+ href: string
73
+ }
74
+
75
+ /**
76
+ * Page navigation context
77
+ */
78
+ export interface PageNavContext {
79
+ /** Current page's breadcrumbs */
80
+ breadcrumbs: BreadcrumbItem[]
81
+ /** Previous page in navigation */
82
+ prev?: NavItem
83
+ /** Next page in navigation */
84
+ next?: NavItem
85
+ /** Current tab (if using tabs) */
86
+ currentTab?: NavTab
87
+ /** Current group */
88
+ currentGroup?: NavGroup
89
+ /** Current item */
90
+ currentItem?: NavItem
91
+ }
92
+
93
+ /**
94
+ * Table of contents item (from page headings)
95
+ */
96
+ export interface TocItem {
97
+ id: string
98
+ title: string
99
+ level: number
100
+ children?: TocItem[]
101
+ }
102
+
103
+ /**
104
+ * Page metadata for navigation
105
+ */
106
+ export interface PageMeta {
107
+ /** File path relative to content directory */
108
+ filePath: string
109
+ /** URL path */
110
+ urlPath: string
111
+ /** Page title from frontmatter */
112
+ title: string
113
+ /** Page description */
114
+ description?: string
115
+ /** Sidebar title (shorter) */
116
+ sidebarTitle?: string
117
+ /** Icon name */
118
+ icon?: string
119
+ /** Whether the page is hidden from navigation */
120
+ hidden?: boolean
121
+ /** Page order within group */
122
+ order?: number
123
+ }
@@ -0,0 +1,80 @@
1
+ 'use client'
2
+
3
+ import React, { createContext, useContext, useCallback } from 'react'
4
+
5
+ /**
6
+ * Docs Navigation Context
7
+ *
8
+ * Provides navigation functions for doc components (like Card) to use
9
+ * the correct navigation method based on the current view.
10
+ *
11
+ * In ApiDocs view: Uses hash-based navigation
12
+ * In standalone /docs view: Uses Next.js router
13
+ */
14
+
15
+ interface DocsNavigationContextValue {
16
+ // Navigate to a doc page by slug
17
+ navigateToPage: (slug: string) => void
18
+ // Navigate to an endpoint by ID
19
+ navigateToEndpoint: (endpointId: string) => void
20
+ // Switch to a different tab
21
+ switchToTab: (tabId: string) => void
22
+ // Check if we're in the integrated ApiDocs view
23
+ isApiDocsView: boolean
24
+ // Current active tab
25
+ activeTab?: string
26
+ }
27
+
28
+ const DocsNavigationContext = createContext<DocsNavigationContextValue | null>(null)
29
+
30
+ interface DocsNavigationProviderProps {
31
+ children: React.ReactNode
32
+ onNavigateToPage?: (slug: string) => void
33
+ onNavigateToEndpoint?: (endpointId: string) => void
34
+ onSwitchTab?: (tabId: string) => void
35
+ activeTab?: string
36
+ }
37
+
38
+ export function DocsNavigationProvider({
39
+ children,
40
+ onNavigateToPage,
41
+ onNavigateToEndpoint,
42
+ onSwitchTab,
43
+ activeTab,
44
+ }: DocsNavigationProviderProps) {
45
+ const navigateToPage = useCallback((slug: string) => {
46
+ if (onNavigateToPage) {
47
+ onNavigateToPage(slug)
48
+ }
49
+ }, [onNavigateToPage])
50
+
51
+ const navigateToEndpoint = useCallback((endpointId: string) => {
52
+ if (onNavigateToEndpoint) {
53
+ onNavigateToEndpoint(endpointId)
54
+ }
55
+ }, [onNavigateToEndpoint])
56
+
57
+ const switchToTab = useCallback((tabId: string) => {
58
+ if (onSwitchTab) {
59
+ onSwitchTab(tabId)
60
+ }
61
+ }, [onSwitchTab])
62
+
63
+ return (
64
+ <DocsNavigationContext.Provider
65
+ value={{
66
+ navigateToPage,
67
+ navigateToEndpoint,
68
+ switchToTab,
69
+ isApiDocsView: !!onNavigateToPage,
70
+ activeTab,
71
+ }}
72
+ >
73
+ {children}
74
+ </DocsNavigationContext.Provider>
75
+ )
76
+ }
77
+
78
+ export function useDocsNavigation() {
79
+ return useContext(DocsNavigationContext)
80
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Multi-tenant project context utilities
3
+ * Handles extracting project slug from hostname and managing project context
4
+ */
5
+
6
+ export interface ProjectContext {
7
+ slug: string
8
+ isMultiTenant: boolean
9
+ hostname: string
10
+ }
11
+
12
+ /**
13
+ * Known hostnames that should use local file system (not multi-tenant)
14
+ */
15
+ const LOCAL_HOSTNAMES = [
16
+ 'localhost',
17
+ '127.0.0.1',
18
+ '0.0.0.0',
19
+ ]
20
+
21
+ /**
22
+ * The main platform domain
23
+ */
24
+ const PLATFORM_DOMAIN = process.env.DEVDOC_PLATFORM_DOMAIN || 'devdoc.sh'
25
+
26
+ /**
27
+ * Extract project context from hostname
28
+ *
29
+ * Examples:
30
+ * - my-docs.devdoc.sh -> { slug: 'my-docs', isMultiTenant: true }
31
+ * - localhost:3000 -> { slug: null, isMultiTenant: false }
32
+ * - docs.company.com -> { slug: lookup from custom domains, isMultiTenant: true }
33
+ */
34
+ export function extractProjectContext(hostname: string): ProjectContext {
35
+ // Remove port if present
36
+ const host = hostname.split(':')[0]
37
+
38
+ // Check if it's a local development hostname
39
+ if (LOCAL_HOSTNAMES.includes(host)) {
40
+ return {
41
+ slug: '',
42
+ isMultiTenant: false,
43
+ hostname: host,
44
+ }
45
+ }
46
+
47
+ // Check if it's a subdomain of the platform domain
48
+ if (host.endsWith(`.${PLATFORM_DOMAIN}`)) {
49
+ const slug = host.replace(`.${PLATFORM_DOMAIN}`, '')
50
+ return {
51
+ slug,
52
+ isMultiTenant: true,
53
+ hostname: host,
54
+ }
55
+ }
56
+
57
+ // Check if it's the main platform domain
58
+ if (host === PLATFORM_DOMAIN || host === `www.${PLATFORM_DOMAIN}`) {
59
+ return {
60
+ slug: '',
61
+ isMultiTenant: false,
62
+ hostname: host,
63
+ }
64
+ }
65
+
66
+ // Custom domain - need to lookup in database
67
+ // For now, return the full hostname as slug placeholder
68
+ // This will be resolved via the domains API
69
+ return {
70
+ slug: host, // Will be resolved to actual slug via custom domains lookup
71
+ isMultiTenant: true,
72
+ hostname: host,
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Check if running in multi-tenant mode
78
+ */
79
+ export function isMultiTenantMode(): boolean {
80
+ return process.env.MULTI_TENANT_MODE === 'true'
81
+ }
82
+
83
+ /**
84
+ * Get the current project slug from environment or context
85
+ */
86
+ export function getCurrentProjectSlug(): string | null {
87
+ return process.env.DEVDOC_PROJECT_SLUG || null
88
+ }
89
+
90
+ /**
91
+ * Build the URL for a project's docs
92
+ */
93
+ export function getProjectUrl(slug: string): string {
94
+ const protocol = process.env.NODE_ENV === 'production' ? 'https' : 'http'
95
+ return `${protocol}://${slug}.${PLATFORM_DOMAIN}`
96
+ }
97
+
98
+ /**
99
+ * Validate a project slug format
100
+ */
101
+ export function isValidSlug(slug: string): boolean {
102
+ // Must be lowercase alphanumeric with hyphens, 3-50 chars
103
+ const slugRegex = /^[a-z0-9][a-z0-9-]{1,48}[a-z0-9]$/
104
+ return slugRegex.test(slug)
105
+ }