@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.
- package/LICENSE +33 -0
- package/README.md +415 -0
- package/bin/devdoc.js +13 -0
- package/dist/cli/commands/build.d.ts +5 -0
- package/dist/cli/commands/build.js +87 -0
- package/dist/cli/commands/check.d.ts +1 -0
- package/dist/cli/commands/check.js +143 -0
- package/dist/cli/commands/create.d.ts +24 -0
- package/dist/cli/commands/create.js +387 -0
- package/dist/cli/commands/deploy.d.ts +9 -0
- package/dist/cli/commands/deploy.js +433 -0
- package/dist/cli/commands/dev.d.ts +6 -0
- package/dist/cli/commands/dev.js +139 -0
- package/dist/cli/commands/init.d.ts +11 -0
- package/dist/cli/commands/init.js +238 -0
- package/dist/cli/commands/keys.d.ts +12 -0
- package/dist/cli/commands/keys.js +165 -0
- package/dist/cli/commands/start.d.ts +5 -0
- package/dist/cli/commands/start.js +56 -0
- package/dist/cli/commands/upload.d.ts +13 -0
- package/dist/cli/commands/upload.js +238 -0
- package/dist/cli/commands/whoami.d.ts +8 -0
- package/dist/cli/commands/whoami.js +91 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +106 -0
- package/dist/config/index.d.ts +80 -0
- package/dist/config/index.js +133 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.js +13 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +12 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.js +61 -0
- package/dist/utils/paths.d.ts +16 -0
- package/dist/utils/paths.js +50 -0
- package/package.json +51 -0
- package/renderer/app/api/assets/[...path]/route.ts +123 -0
- package/renderer/app/api/assets/route.ts +124 -0
- package/renderer/app/api/assets/upload/route.ts +177 -0
- package/renderer/app/api/auth-schemes/route.ts +77 -0
- package/renderer/app/api/chat/route.ts +858 -0
- package/renderer/app/api/codegen/route.ts +72 -0
- package/renderer/app/api/collections/route.ts +1016 -0
- package/renderer/app/api/debug/route.ts +53 -0
- package/renderer/app/api/deploy/route.ts +234 -0
- package/renderer/app/api/device/route.ts +42 -0
- package/renderer/app/api/docs/route.ts +187 -0
- package/renderer/app/api/keys/regenerate/route.ts +80 -0
- package/renderer/app/api/openapi-spec/route.ts +151 -0
- package/renderer/app/api/projects/[slug]/route.ts +153 -0
- package/renderer/app/api/projects/[slug]/stats/route.ts +96 -0
- package/renderer/app/api/projects/register/route.ts +152 -0
- package/renderer/app/api/proxy/route.ts +149 -0
- package/renderer/app/api/proxy-stream/route.ts +168 -0
- package/renderer/app/api/redirects/route.ts +47 -0
- package/renderer/app/api/schema/route.ts +65 -0
- package/renderer/app/api/subdomains/check/route.ts +172 -0
- package/renderer/app/api/suggestions/route.ts +144 -0
- package/renderer/app/favicon.ico +0 -0
- package/renderer/app/globals.css +1103 -0
- package/renderer/app/layout.tsx +47 -0
- package/renderer/app/llms-full.txt/route.ts +346 -0
- package/renderer/app/llms.txt/route.ts +279 -0
- package/renderer/app/page.tsx +14 -0
- package/renderer/app/robots.txt/route.ts +84 -0
- package/renderer/app/sitemap.xml/route.ts +199 -0
- package/renderer/components/docs/index.ts +12 -0
- package/renderer/components/docs/mdx/accordion.tsx +169 -0
- package/renderer/components/docs/mdx/badge.tsx +132 -0
- package/renderer/components/docs/mdx/callouts.tsx +154 -0
- package/renderer/components/docs/mdx/cards.tsx +213 -0
- package/renderer/components/docs/mdx/changelog.tsx +120 -0
- package/renderer/components/docs/mdx/code-block.tsx +186 -0
- package/renderer/components/docs/mdx/code-group.tsx +421 -0
- package/renderer/components/docs/mdx/file-embeds.tsx +105 -0
- package/renderer/components/docs/mdx/frame.tsx +112 -0
- package/renderer/components/docs/mdx/highlight.tsx +151 -0
- package/renderer/components/docs/mdx/iframe.tsx +134 -0
- package/renderer/components/docs/mdx/image.tsx +235 -0
- package/renderer/components/docs/mdx/index.ts +204 -0
- package/renderer/components/docs/mdx/mermaid.tsx +240 -0
- package/renderer/components/docs/mdx/param-field.tsx +200 -0
- package/renderer/components/docs/mdx/steps.tsx +113 -0
- package/renderer/components/docs/mdx/tabs.tsx +86 -0
- package/renderer/components/docs/mdx-renderer.tsx +100 -0
- package/renderer/components/docs/navigation/breadcrumbs.tsx +76 -0
- package/renderer/components/docs/navigation/index.ts +8 -0
- package/renderer/components/docs/navigation/page-nav.tsx +64 -0
- package/renderer/components/docs/navigation/sidebar.tsx +515 -0
- package/renderer/components/docs/navigation/toc.tsx +113 -0
- package/renderer/components/docs/notice.tsx +105 -0
- package/renderer/components/docs-header.tsx +274 -0
- package/renderer/components/docs-viewer/agent/agent-chat.tsx +2076 -0
- package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +90 -0
- package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +49 -0
- package/renderer/components/docs-viewer/agent/cards/index.tsx +50 -0
- package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +212 -0
- package/renderer/components/docs-viewer/agent/cards/types.ts +84 -0
- package/renderer/components/docs-viewer/agent/chat-message.tsx +17 -0
- package/renderer/components/docs-viewer/agent/index.tsx +6 -0
- package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +119 -0
- package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +46 -0
- package/renderer/components/docs-viewer/agent/messages/index.ts +17 -0
- package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +721 -0
- package/renderer/components/docs-viewer/agent/messages/types.ts +61 -0
- package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +24 -0
- package/renderer/components/docs-viewer/agent/messages/user-message.tsx +51 -0
- package/renderer/components/docs-viewer/code-editor/index.tsx +2 -0
- package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +1283 -0
- package/renderer/components/docs-viewer/content/changelog-page.tsx +331 -0
- package/renderer/components/docs-viewer/content/doc-page.tsx +285 -0
- package/renderer/components/docs-viewer/content/documentation-viewer.tsx +17 -0
- package/renderer/components/docs-viewer/content/index.tsx +29 -0
- package/renderer/components/docs-viewer/content/introduction.tsx +21 -0
- package/renderer/components/docs-viewer/content/request-details.tsx +330 -0
- package/renderer/components/docs-viewer/content/sections/auth.tsx +69 -0
- package/renderer/components/docs-viewer/content/sections/body.tsx +66 -0
- package/renderer/components/docs-viewer/content/sections/headers.tsx +43 -0
- package/renderer/components/docs-viewer/content/sections/overview.tsx +40 -0
- package/renderer/components/docs-viewer/content/sections/parameters.tsx +43 -0
- package/renderer/components/docs-viewer/content/sections/responses.tsx +87 -0
- package/renderer/components/docs-viewer/global-auth-modal.tsx +352 -0
- package/renderer/components/docs-viewer/index.tsx +1466 -0
- package/renderer/components/docs-viewer/playground/auth-editor.tsx +280 -0
- package/renderer/components/docs-viewer/playground/body-editor.tsx +221 -0
- package/renderer/components/docs-viewer/playground/code-editor.tsx +224 -0
- package/renderer/components/docs-viewer/playground/code-snippet.tsx +387 -0
- package/renderer/components/docs-viewer/playground/graphql-playground.tsx +745 -0
- package/renderer/components/docs-viewer/playground/index.tsx +671 -0
- package/renderer/components/docs-viewer/playground/key-value-editor.tsx +261 -0
- package/renderer/components/docs-viewer/playground/method-selector.tsx +60 -0
- package/renderer/components/docs-viewer/playground/request-builder.tsx +179 -0
- package/renderer/components/docs-viewer/playground/request-tabs.tsx +237 -0
- package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +21 -0
- package/renderer/components/docs-viewer/playground/response-cards/index.tsx +93 -0
- package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +16 -0
- package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +23 -0
- package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +268 -0
- package/renderer/components/docs-viewer/playground/response-cards/types.ts +82 -0
- package/renderer/components/docs-viewer/playground/response-viewer.tsx +43 -0
- package/renderer/components/docs-viewer/search/index.ts +2 -0
- package/renderer/components/docs-viewer/search/search-dialog.tsx +331 -0
- package/renderer/components/docs-viewer/search/use-search.ts +117 -0
- package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +431 -0
- package/renderer/components/docs-viewer/shared/method-badge.tsx +41 -0
- package/renderer/components/docs-viewer/shared/schema-viewer.tsx +349 -0
- package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +239 -0
- package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +316 -0
- package/renderer/components/docs-viewer/sidebar/index.tsx +343 -0
- package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +202 -0
- package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +118 -0
- package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +226 -0
- package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +52 -0
- package/renderer/components/theme-provider.tsx +11 -0
- package/renderer/components/theme-toggle.tsx +76 -0
- package/renderer/components/ui/badge.tsx +46 -0
- package/renderer/components/ui/button.tsx +59 -0
- package/renderer/components/ui/dialog.tsx +118 -0
- package/renderer/components/ui/dropdown-menu.tsx +257 -0
- package/renderer/components/ui/input.tsx +21 -0
- package/renderer/components/ui/label.tsx +24 -0
- package/renderer/components/ui/navigation-menu.tsx +168 -0
- package/renderer/components/ui/select.tsx +190 -0
- package/renderer/components/ui/spinner.tsx +114 -0
- package/renderer/components/ui/tabs.tsx +66 -0
- package/renderer/components/ui/tooltip.tsx +61 -0
- package/renderer/hooks/use-code-copy.ts +88 -0
- package/renderer/hooks/use-openapi-title.ts +44 -0
- package/renderer/lib/api-docs/agent/index.ts +6 -0
- package/renderer/lib/api-docs/agent/indexer.ts +323 -0
- package/renderer/lib/api-docs/agent/spec-summary.ts +335 -0
- package/renderer/lib/api-docs/agent/types.ts +116 -0
- package/renderer/lib/api-docs/auth/auth-context.tsx +225 -0
- package/renderer/lib/api-docs/auth/auth-storage.ts +87 -0
- package/renderer/lib/api-docs/auth/crypto.ts +89 -0
- package/renderer/lib/api-docs/auth/index.ts +4 -0
- package/renderer/lib/api-docs/code-editor/db.ts +164 -0
- package/renderer/lib/api-docs/code-editor/hooks.ts +266 -0
- package/renderer/lib/api-docs/code-editor/index.ts +6 -0
- package/renderer/lib/api-docs/code-editor/mode-context.tsx +207 -0
- package/renderer/lib/api-docs/code-editor/types.ts +105 -0
- package/renderer/lib/api-docs/codegen/definitions.ts +297 -0
- package/renderer/lib/api-docs/codegen/har.ts +251 -0
- package/renderer/lib/api-docs/codegen/index.ts +159 -0
- package/renderer/lib/api-docs/factories.ts +151 -0
- package/renderer/lib/api-docs/index.ts +17 -0
- package/renderer/lib/api-docs/mobile-context.tsx +112 -0
- package/renderer/lib/api-docs/navigation-context.tsx +88 -0
- package/renderer/lib/api-docs/parsers/graphql/README.md +129 -0
- package/renderer/lib/api-docs/parsers/graphql/index.ts +91 -0
- package/renderer/lib/api-docs/parsers/graphql/parser.ts +491 -0
- package/renderer/lib/api-docs/parsers/graphql/transformer.ts +246 -0
- package/renderer/lib/api-docs/parsers/graphql/types.ts +283 -0
- package/renderer/lib/api-docs/parsers/openapi/README.md +32 -0
- package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +60 -0
- package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +574 -0
- package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +403 -0
- package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +232 -0
- package/renderer/lib/api-docs/parsers/openapi/index.ts +171 -0
- package/renderer/lib/api-docs/parsers/openapi/transformer.ts +277 -0
- package/renderer/lib/api-docs/parsers/openapi/validator.ts +31 -0
- package/renderer/lib/api-docs/playground/context.tsx +107 -0
- package/renderer/lib/api-docs/playground/navigation-context.tsx +124 -0
- package/renderer/lib/api-docs/playground/request-builder.ts +223 -0
- package/renderer/lib/api-docs/playground/request-runner.ts +282 -0
- package/renderer/lib/api-docs/playground/types.ts +35 -0
- package/renderer/lib/api-docs/types.ts +269 -0
- package/renderer/lib/api-docs/utils.ts +311 -0
- package/renderer/lib/cache.ts +193 -0
- package/renderer/lib/docs/config/index.ts +29 -0
- package/renderer/lib/docs/config/loader.ts +142 -0
- package/renderer/lib/docs/config/schema.ts +298 -0
- package/renderer/lib/docs/index.ts +12 -0
- package/renderer/lib/docs/mdx/compiler.ts +176 -0
- package/renderer/lib/docs/mdx/frontmatter.ts +80 -0
- package/renderer/lib/docs/mdx/index.ts +26 -0
- package/renderer/lib/docs/navigation/generator.ts +348 -0
- package/renderer/lib/docs/navigation/index.ts +12 -0
- package/renderer/lib/docs/navigation/types.ts +123 -0
- package/renderer/lib/docs-navigation-context.tsx +80 -0
- package/renderer/lib/multi-tenant/context.ts +105 -0
- package/renderer/lib/storage/blob.ts +845 -0
- package/renderer/lib/utils.ts +6 -0
- package/renderer/next.config.ts +76 -0
- package/renderer/package.json +66 -0
- package/renderer/postcss.config.mjs +5 -0
- package/renderer/public/assets/images/screenshot.png +0 -0
- package/renderer/public/assets/logo/dark.svg +9 -0
- package/renderer/public/assets/logo/light.svg +9 -0
- package/renderer/public/assets/logo.svg +9 -0
- package/renderer/public/file.svg +1 -0
- package/renderer/public/globe.svg +1 -0
- package/renderer/public/icon.png +0 -0
- package/renderer/public/logo.svg +9 -0
- package/renderer/public/window.svg +1 -0
- package/renderer/tsconfig.json +28 -0
- package/templates/basic/README.md +139 -0
- package/templates/basic/assets/favicon.svg +4 -0
- package/templates/basic/assets/logo.svg +9 -0
- package/templates/basic/docs.json +47 -0
- package/templates/basic/guides/configuration.mdx +149 -0
- package/templates/basic/guides/overview.mdx +96 -0
- package/templates/basic/index.mdx +39 -0
- package/templates/basic/package.json +14 -0
- package/templates/basic/quickstart.mdx +92 -0
- package/templates/basic/vercel.json +6 -0
- package/templates/graphql/README.md +139 -0
- package/templates/graphql/api-reference/schema.graphql +305 -0
- package/templates/graphql/assets/favicon.svg +4 -0
- package/templates/graphql/assets/logo.svg +9 -0
- package/templates/graphql/docs.json +54 -0
- package/templates/graphql/guides/configuration.mdx +149 -0
- package/templates/graphql/guides/overview.mdx +96 -0
- package/templates/graphql/index.mdx +39 -0
- package/templates/graphql/package.json +14 -0
- package/templates/graphql/quickstart.mdx +92 -0
- package/templates/graphql/vercel.json +6 -0
- package/templates/openapi/README.md +139 -0
- package/templates/openapi/api-reference/openapi.json +419 -0
- package/templates/openapi/assets/favicon.svg +4 -0
- package/templates/openapi/assets/logo.svg +9 -0
- package/templates/openapi/docs.json +61 -0
- package/templates/openapi/guides/configuration.mdx +149 -0
- package/templates/openapi/guides/overview.mdx +96 -0
- package/templates/openapi/index.mdx +39 -0
- package/templates/openapi/package.json +14 -0
- package/templates/openapi/quickstart.mdx +92 -0
- 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
|
+
}
|