blodemd 0.1.0 → 0.2.0

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 (289) hide show
  1. package/dist/cli.mjs +50 -174
  2. package/dist/cli.mjs.map +1 -1
  3. package/package.json +3 -36
  4. package/dev-server/app/[[...slug]]/page.tsx +0 -140
  5. package/dev-server/app/blodemd-dev/invalidate/route.ts +0 -12
  6. package/dev-server/app/blodemd-dev/static/[...path]/route.ts +0 -32
  7. package/dev-server/app/blodemd-dev/version/route.ts +0 -14
  8. package/dev-server/app/blodemd-internal/proxy/route.ts +0 -86
  9. package/dev-server/app/error.tsx +0 -24
  10. package/dev-server/app/favicon.ico +0 -0
  11. package/dev-server/app/globals.css +0 -4
  12. package/dev-server/app/layout.tsx +0 -38
  13. package/dev-server/app/not-found.tsx +0 -18
  14. package/dev-server/app/search/route.ts +0 -17
  15. package/dev-server/components/dev-reload-script.tsx +0 -86
  16. package/dev-server/components/providers.tsx +0 -15
  17. package/dev-server/lib/dev-state.ts +0 -8
  18. package/dev-server/lib/local-content-source.ts +0 -103
  19. package/dev-server/lib/local-runtime.tsx +0 -555
  20. package/dev-server/next-env.d.ts +0 -5
  21. package/dev-server/next.config.js +0 -54
  22. package/dev-server/package.json +0 -61
  23. package/dev-server/postcss.config.mjs +0 -7
  24. package/dev-server/public/glide-variable.woff2 +0 -0
  25. package/dev-server/tsconfig.json +0 -50
  26. package/docs/app/globals.css +0 -471
  27. package/docs/components/animate-ui/primitives/buttons/button.tsx +0 -14
  28. package/docs/components/api/api-playground.tsx +0 -467
  29. package/docs/components/api/api-reference.tsx +0 -157
  30. package/docs/components/content/collection-index.tsx +0 -114
  31. package/docs/components/docs/contextual-menu.tsx +0 -495
  32. package/docs/components/docs/copy-page-menu.tsx +0 -364
  33. package/docs/components/docs/doc-header.tsx +0 -223
  34. package/docs/components/docs/doc-shell.tsx +0 -355
  35. package/docs/components/docs/doc-sidebar.tsx +0 -256
  36. package/docs/components/docs/doc-toc.tsx +0 -46
  37. package/docs/components/docs/mobile-nav.tsx +0 -195
  38. package/docs/components/docs/sidebar-active-highlight.tsx +0 -34
  39. package/docs/components/docs/sidebar-scroll-area.tsx +0 -63
  40. package/docs/components/git/repo-picker.tsx +0 -529
  41. package/docs/components/icons/doc-icon.tsx +0 -96
  42. package/docs/components/mdx/accordion.tsx +0 -83
  43. package/docs/components/mdx/agent-instructions.tsx +0 -17
  44. package/docs/components/mdx/badge.tsx +0 -79
  45. package/docs/components/mdx/callout.tsx +0 -88
  46. package/docs/components/mdx/card.tsx +0 -110
  47. package/docs/components/mdx/code-block.tsx +0 -80
  48. package/docs/components/mdx/code-group.tsx +0 -203
  49. package/docs/components/mdx/color.tsx +0 -87
  50. package/docs/components/mdx/columns.tsx +0 -25
  51. package/docs/components/mdx/expandable.tsx +0 -45
  52. package/docs/components/mdx/field-layout.tsx +0 -77
  53. package/docs/components/mdx/frame.tsx +0 -23
  54. package/docs/components/mdx/get-text-content.ts +0 -18
  55. package/docs/components/mdx/icon.tsx +0 -12
  56. package/docs/components/mdx/iframe.tsx +0 -62
  57. package/docs/components/mdx/index.tsx +0 -121
  58. package/docs/components/mdx/installer.tsx +0 -20
  59. package/docs/components/mdx/panel.tsx +0 -11
  60. package/docs/components/mdx/param-field.tsx +0 -56
  61. package/docs/components/mdx/preview.tsx +0 -36
  62. package/docs/components/mdx/prompt.tsx +0 -63
  63. package/docs/components/mdx/request-example.tsx +0 -27
  64. package/docs/components/mdx/response-field.tsx +0 -42
  65. package/docs/components/mdx/steps.tsx +0 -92
  66. package/docs/components/mdx/tabs.tsx +0 -193
  67. package/docs/components/mdx/tile.tsx +0 -43
  68. package/docs/components/mdx/tooltip.tsx +0 -71
  69. package/docs/components/mdx/tree.tsx +0 -120
  70. package/docs/components/mdx/type-table.tsx +0 -71
  71. package/docs/components/mdx/update.tsx +0 -44
  72. package/docs/components/mdx/video.tsx +0 -45
  73. package/docs/components/mdx/view.tsx +0 -66
  74. package/docs/components/posthog-provider.tsx +0 -42
  75. package/docs/components/providers.tsx +0 -15
  76. package/docs/components/tenant-analytics.tsx +0 -49
  77. package/docs/components/third-parties.tsx +0 -32
  78. package/docs/components/ui/badge.tsx +0 -61
  79. package/docs/components/ui/breadcrumb.tsx +0 -112
  80. package/docs/components/ui/button-group.tsx +0 -83
  81. package/docs/components/ui/button.tsx +0 -65
  82. package/docs/components/ui/card.tsx +0 -92
  83. package/docs/components/ui/command.tsx +0 -167
  84. package/docs/components/ui/copy-button.tsx +0 -129
  85. package/docs/components/ui/dialog.tsx +0 -146
  86. package/docs/components/ui/field.tsx +0 -237
  87. package/docs/components/ui/input.tsx +0 -23
  88. package/docs/components/ui/kbd.tsx +0 -98
  89. package/docs/components/ui/label.tsx +0 -22
  90. package/docs/components/ui/morph-icon.tsx +0 -79
  91. package/docs/components/ui/popover.tsx +0 -267
  92. package/docs/components/ui/search-dialog.tsx +0 -431
  93. package/docs/components/ui/search.tsx +0 -101
  94. package/docs/components/ui/separator.tsx +0 -26
  95. package/docs/components/ui/sheet.tsx +0 -133
  96. package/docs/components/ui/sidebar.tsx +0 -758
  97. package/docs/components/ui/skeleton.tsx +0 -11
  98. package/docs/components/ui/switch.tsx +0 -32
  99. package/docs/components/ui/tabs.tsx +0 -138
  100. package/docs/components/ui/theme-toggle.tsx +0 -62
  101. package/docs/components/ui/tooltip.tsx +0 -53
  102. package/docs/components/web-mcp.tsx +0 -115
  103. package/docs/lib/agent-skills.ts +0 -48
  104. package/docs/lib/api-client.ts +0 -72
  105. package/docs/lib/config.ts +0 -6
  106. package/docs/lib/content-root.ts +0 -33
  107. package/docs/lib/content-source.ts +0 -70
  108. package/docs/lib/contextual-options.ts +0 -222
  109. package/docs/lib/dashboard-session.ts +0 -167
  110. package/docs/lib/db.ts +0 -13
  111. package/docs/lib/docs-collection.ts +0 -7
  112. package/docs/lib/docs-runtime.tsx +0 -745
  113. package/docs/lib/edge-config.ts +0 -95
  114. package/docs/lib/env.ts +0 -23
  115. package/docs/lib/etag.ts +0 -22
  116. package/docs/lib/github-install.ts +0 -33
  117. package/docs/lib/llms-full.ts +0 -82
  118. package/docs/lib/marketing-markdown.ts +0 -79
  119. package/docs/lib/marketing-site.ts +0 -31
  120. package/docs/lib/mdx.ts +0 -98
  121. package/docs/lib/navigation.ts +0 -288
  122. package/docs/lib/openapi-proxy.ts +0 -88
  123. package/docs/lib/openapi.ts +0 -158
  124. package/docs/lib/platform-config.ts +0 -6
  125. package/docs/lib/project-authz.ts +0 -46
  126. package/docs/lib/routes.ts +0 -103
  127. package/docs/lib/server-cache.ts +0 -83
  128. package/docs/lib/shiki.ts +0 -44
  129. package/docs/lib/supabase.ts +0 -37
  130. package/docs/lib/tenancy.ts +0 -364
  131. package/docs/lib/tenant-headers.ts +0 -43
  132. package/docs/lib/tenant-static.ts +0 -705
  133. package/docs/lib/tenant-utility-context.ts +0 -62
  134. package/docs/lib/tenants.ts +0 -72
  135. package/docs/lib/theme.ts +0 -29
  136. package/docs/lib/time-ago.ts +0 -24
  137. package/docs/lib/toc.ts +0 -2
  138. package/docs/lib/use-mobile.ts +0 -19
  139. package/docs/lib/use-tab-observer.ts +0 -71
  140. package/docs/lib/utils.ts +0 -5
  141. package/packages/@repo/common/dist/index.d.ts +0 -16
  142. package/packages/@repo/common/dist/index.d.ts.map +0 -1
  143. package/packages/@repo/common/dist/index.js +0 -84
  144. package/packages/@repo/common/package.json +0 -34
  145. package/packages/@repo/common/src/index.ts +0 -101
  146. package/packages/@repo/contracts/dist/analytics.d.ts +0 -21
  147. package/packages/@repo/contracts/dist/analytics.d.ts.map +0 -1
  148. package/packages/@repo/contracts/dist/analytics.js +0 -18
  149. package/packages/@repo/contracts/dist/api-key.d.ts +0 -27
  150. package/packages/@repo/contracts/dist/api-key.d.ts.map +0 -1
  151. package/packages/@repo/contracts/dist/api-key.js +0 -20
  152. package/packages/@repo/contracts/dist/dates.d.ts +0 -4
  153. package/packages/@repo/contracts/dist/dates.d.ts.map +0 -1
  154. package/packages/@repo/contracts/dist/dates.js +0 -2
  155. package/packages/@repo/contracts/dist/deployment.d.ts +0 -71
  156. package/packages/@repo/contracts/dist/deployment.d.ts.map +0 -1
  157. package/packages/@repo/contracts/dist/deployment.js +0 -46
  158. package/packages/@repo/contracts/dist/domain.d.ts +0 -94
  159. package/packages/@repo/contracts/dist/domain.d.ts.map +0 -1
  160. package/packages/@repo/contracts/dist/domain.js +0 -36
  161. package/packages/@repo/contracts/dist/git.d.ts +0 -28
  162. package/packages/@repo/contracts/dist/git.d.ts.map +0 -1
  163. package/packages/@repo/contracts/dist/git.js +0 -24
  164. package/packages/@repo/contracts/dist/ids.d.ts +0 -14
  165. package/packages/@repo/contracts/dist/ids.d.ts.map +0 -1
  166. package/packages/@repo/contracts/dist/ids.js +0 -11
  167. package/packages/@repo/contracts/dist/index.d.ts +0 -12
  168. package/packages/@repo/contracts/dist/index.d.ts.map +0 -1
  169. package/packages/@repo/contracts/dist/index.js +0 -13
  170. package/packages/@repo/contracts/dist/pagination.d.ts +0 -23
  171. package/packages/@repo/contracts/dist/pagination.d.ts.map +0 -1
  172. package/packages/@repo/contracts/dist/pagination.js +0 -15
  173. package/packages/@repo/contracts/dist/project.d.ts +0 -42
  174. package/packages/@repo/contracts/dist/project.d.ts.map +0 -1
  175. package/packages/@repo/contracts/dist/project.js +0 -25
  176. package/packages/@repo/contracts/dist/tenant.d.ts +0 -147
  177. package/packages/@repo/contracts/dist/tenant.d.ts.map +0 -1
  178. package/packages/@repo/contracts/dist/tenant.js +0 -58
  179. package/packages/@repo/contracts/dist/user.d.ts +0 -9
  180. package/packages/@repo/contracts/dist/user.d.ts.map +0 -1
  181. package/packages/@repo/contracts/dist/user.js +0 -9
  182. package/packages/@repo/contracts/package.json +0 -37
  183. package/packages/@repo/contracts/src/analytics.ts +0 -33
  184. package/packages/@repo/contracts/src/api-key.ts +0 -27
  185. package/packages/@repo/contracts/src/dates.ts +0 -4
  186. package/packages/@repo/contracts/src/deployment.ts +0 -73
  187. package/packages/@repo/contracts/src/domain.ts +0 -51
  188. package/packages/@repo/contracts/src/git.ts +0 -31
  189. package/packages/@repo/contracts/src/ids.ts +0 -23
  190. package/packages/@repo/contracts/src/index.ts +0 -13
  191. package/packages/@repo/contracts/src/pagination.ts +0 -21
  192. package/packages/@repo/contracts/src/project.ts +0 -32
  193. package/packages/@repo/contracts/src/tenant.ts +0 -94
  194. package/packages/@repo/contracts/src/user.ts +0 -12
  195. package/packages/@repo/models/dist/docs-config.d.ts +0 -961
  196. package/packages/@repo/models/dist/docs-config.d.ts.map +0 -1
  197. package/packages/@repo/models/dist/docs-config.js +0 -531
  198. package/packages/@repo/models/dist/index.d.ts +0 -3
  199. package/packages/@repo/models/dist/index.d.ts.map +0 -1
  200. package/packages/@repo/models/dist/index.js +0 -3
  201. package/packages/@repo/models/dist/tenant.d.ts +0 -37
  202. package/packages/@repo/models/dist/tenant.d.ts.map +0 -1
  203. package/packages/@repo/models/dist/tenant.js +0 -1
  204. package/packages/@repo/models/package.json +0 -37
  205. package/packages/@repo/models/src/docs-config.ts +0 -629
  206. package/packages/@repo/models/src/index.ts +0 -3
  207. package/packages/@repo/models/src/tenant.ts +0 -44
  208. package/packages/@repo/prebuild/dist/index.d.ts +0 -2
  209. package/packages/@repo/prebuild/dist/index.d.ts.map +0 -1
  210. package/packages/@repo/prebuild/dist/index.js +0 -2
  211. package/packages/@repo/prebuild/dist/openapi.d.ts +0 -43
  212. package/packages/@repo/prebuild/dist/openapi.d.ts.map +0 -1
  213. package/packages/@repo/prebuild/dist/openapi.js +0 -86
  214. package/packages/@repo/prebuild/package.json +0 -39
  215. package/packages/@repo/prebuild/src/index.ts +0 -2
  216. package/packages/@repo/prebuild/src/openapi.ts +0 -154
  217. package/packages/@repo/previewing/dist/blob-source.d.ts +0 -16
  218. package/packages/@repo/previewing/dist/blob-source.d.ts.map +0 -1
  219. package/packages/@repo/previewing/dist/blob-source.js +0 -128
  220. package/packages/@repo/previewing/dist/config-loader.d.ts +0 -134
  221. package/packages/@repo/previewing/dist/config-loader.d.ts.map +0 -1
  222. package/packages/@repo/previewing/dist/config-loader.js +0 -231
  223. package/packages/@repo/previewing/dist/constants.d.ts +0 -15
  224. package/packages/@repo/previewing/dist/constants.d.ts.map +0 -1
  225. package/packages/@repo/previewing/dist/constants.js +0 -14
  226. package/packages/@repo/previewing/dist/content-index.d.ts +0 -7
  227. package/packages/@repo/previewing/dist/content-index.d.ts.map +0 -1
  228. package/packages/@repo/previewing/dist/content-index.js +0 -291
  229. package/packages/@repo/previewing/dist/content-source.d.ts +0 -12
  230. package/packages/@repo/previewing/dist/content-source.d.ts.map +0 -1
  231. package/packages/@repo/previewing/dist/content-source.js +0 -1
  232. package/packages/@repo/previewing/dist/fs-source.d.ts +0 -11
  233. package/packages/@repo/previewing/dist/fs-source.d.ts.map +0 -1
  234. package/packages/@repo/previewing/dist/fs-source.js +0 -71
  235. package/packages/@repo/previewing/dist/index.d.ts +0 -16
  236. package/packages/@repo/previewing/dist/index.d.ts.map +0 -1
  237. package/packages/@repo/previewing/dist/index.js +0 -13
  238. package/packages/@repo/previewing/dist/markdown/agent-markdown.d.ts +0 -3
  239. package/packages/@repo/previewing/dist/markdown/agent-markdown.d.ts.map +0 -1
  240. package/packages/@repo/previewing/dist/markdown/agent-markdown.js +0 -176
  241. package/packages/@repo/previewing/dist/markdown/format.d.ts +0 -8
  242. package/packages/@repo/previewing/dist/markdown/format.d.ts.map +0 -1
  243. package/packages/@repo/previewing/dist/markdown/format.js +0 -43
  244. package/packages/@repo/previewing/dist/markdown/links.d.ts +0 -3
  245. package/packages/@repo/previewing/dist/markdown/links.d.ts.map +0 -1
  246. package/packages/@repo/previewing/dist/markdown/links.js +0 -31
  247. package/packages/@repo/previewing/dist/openapi-pages.d.ts +0 -7
  248. package/packages/@repo/previewing/dist/openapi-pages.d.ts.map +0 -1
  249. package/packages/@repo/previewing/dist/openapi-pages.js +0 -200
  250. package/packages/@repo/previewing/dist/search-index.d.ts +0 -4
  251. package/packages/@repo/previewing/dist/search-index.d.ts.map +0 -1
  252. package/packages/@repo/previewing/dist/search-index.js +0 -23
  253. package/packages/@repo/previewing/dist/serialization.d.ts +0 -13
  254. package/packages/@repo/previewing/dist/serialization.d.ts.map +0 -1
  255. package/packages/@repo/previewing/dist/serialization.js +0 -108
  256. package/packages/@repo/previewing/dist/toc-index.d.ts +0 -5
  257. package/packages/@repo/previewing/dist/toc-index.d.ts.map +0 -1
  258. package/packages/@repo/previewing/dist/toc-index.js +0 -53
  259. package/packages/@repo/previewing/dist/types.d.ts +0 -92
  260. package/packages/@repo/previewing/dist/types.d.ts.map +0 -1
  261. package/packages/@repo/previewing/dist/types.js +0 -1
  262. package/packages/@repo/previewing/dist/utility-index.d.ts +0 -7
  263. package/packages/@repo/previewing/dist/utility-index.d.ts.map +0 -1
  264. package/packages/@repo/previewing/dist/utility-index.js +0 -201
  265. package/packages/@repo/previewing/package.json +0 -41
  266. package/packages/@repo/previewing/src/blob-source.ts +0 -185
  267. package/packages/@repo/previewing/src/config-loader.ts +0 -316
  268. package/packages/@repo/previewing/src/constants.ts +0 -16
  269. package/packages/@repo/previewing/src/content-index.ts +0 -384
  270. package/packages/@repo/previewing/src/content-source.ts +0 -12
  271. package/packages/@repo/previewing/src/fs-source.ts +0 -103
  272. package/packages/@repo/previewing/src/index.ts +0 -71
  273. package/packages/@repo/previewing/src/markdown/agent-markdown.ts +0 -254
  274. package/packages/@repo/previewing/src/markdown/format.ts +0 -63
  275. package/packages/@repo/previewing/src/markdown/links.ts +0 -46
  276. package/packages/@repo/previewing/src/openapi-pages.ts +0 -319
  277. package/packages/@repo/previewing/src/search-index.ts +0 -38
  278. package/packages/@repo/previewing/src/serialization.ts +0 -191
  279. package/packages/@repo/previewing/src/toc-index.ts +0 -72
  280. package/packages/@repo/previewing/src/types.ts +0 -105
  281. package/packages/@repo/previewing/src/utility-index.ts +0 -304
  282. package/packages/@repo/validation/dist/index.d.ts +0 -12
  283. package/packages/@repo/validation/dist/index.d.ts.map +0 -1
  284. package/packages/@repo/validation/dist/index.js +0 -30
  285. package/packages/@repo/validation/package.json +0 -38
  286. package/packages/@repo/validation/src/blodemd-docs-schema.json +0 -3575
  287. package/packages/@repo/validation/src/index.ts +0 -59
  288. package/scripts/prepare-package.mjs +0 -53
  289. package/scripts/repo-packages.mjs +0 -8
@@ -1,288 +0,0 @@
1
- import { normalizePath } from "@repo/common";
2
- import type { DocsNavigation } from "@repo/models";
3
- import type { PageMetadata } from "@repo/previewing";
4
-
5
- import type { OpenApiRegistry } from "./openapi";
6
- import { resolveHref, toDocHref } from "./routes";
7
-
8
- export interface NavPage {
9
- type: "page";
10
- title: string;
11
- path: string;
12
- source: "mdx" | "openapi";
13
- identifier?: string;
14
- sidebarTitle?: string;
15
- icon?: string;
16
- iconType?: string;
17
- tag?: string;
18
- hidden?: boolean;
19
- deprecated?: boolean;
20
- url?: string;
21
- hideApiMarker?: boolean;
22
- }
23
-
24
- export interface NavGroup {
25
- type: "group";
26
- title: string;
27
- items: NavPage[];
28
- expanded?: boolean;
29
- hidden?: boolean;
30
- }
31
-
32
- export type NavEntry = NavGroup | NavPage;
33
-
34
- export const getNavPageTitle = (page: NavPage): string =>
35
- page.sidebarTitle ?? page.title;
36
-
37
- export const getNavPageHref = (page: NavPage, basePath: string): string =>
38
- page.url ? resolveHref(page.url, basePath) : toDocHref(page.path, basePath);
39
-
40
- const titleFromSlug = (slug: string) => {
41
- const clean = slug.replaceAll("-", " ").split("/").pop() ?? slug;
42
- if (clean === "index") {
43
- return "Overview";
44
- }
45
- return clean.replaceAll(/\b\w/g, (char) => char.toUpperCase());
46
- };
47
-
48
- const createPageItem = (
49
- page: string,
50
- registry: OpenApiRegistry,
51
- slugPrefix: string
52
- ): NavPage => {
53
- const entry = registry.byIdentifier.get(page);
54
- if (entry) {
55
- return {
56
- identifier: entry.identifier,
57
- path: entry.slug,
58
- source: "openapi",
59
- title: entry.operation.summary ?? entry.identifier,
60
- type: "page",
61
- };
62
- }
63
-
64
- const normalized = normalizePath(page);
65
- const path = slugPrefix
66
- ? normalizePath(`${slugPrefix}/${normalized}`)
67
- : normalized;
68
-
69
- return {
70
- path,
71
- source: "mdx",
72
- title: titleFromSlug(page),
73
- type: "page",
74
- };
75
- };
76
-
77
- // oxlint-disable-next-line eslint/complexity
78
- export const buildNavigation = (
79
- navigation: DocsNavigation | undefined,
80
- registry: OpenApiRegistry,
81
- slugPrefix = ""
82
- ) => {
83
- const entries: NavEntry[] = [];
84
- const groups = navigation?.groups ?? [];
85
- const hiddenPages = new Set(navigation?.hidden);
86
-
87
- for (const group of groups) {
88
- const title = group.group ?? "Untitled";
89
- const items: NavPage[] = [];
90
- const groupHidden = group.hidden === true;
91
-
92
- if (group.pages?.length) {
93
- for (const page of group.pages) {
94
- const item = createPageItem(page, registry, slugPrefix);
95
- if (groupHidden || hiddenPages.has(page)) {
96
- item.hidden = true;
97
- }
98
- items.push(item);
99
- }
100
- } else if (group.openapi) {
101
- const sourceKey =
102
- typeof group.openapi === "string"
103
- ? `${group.openapi}::::`
104
- : `${group.openapi.source}::${group.openapi.directory ?? ""}::${(
105
- group.openapi.include ?? []
106
- ).join("|")}`;
107
- const sourceEntries = registry.bySource.get(sourceKey) ?? [];
108
- for (const entry of sourceEntries) {
109
- items.push({
110
- hidden: groupHidden || undefined,
111
- identifier: entry.identifier,
112
- path: entry.slug,
113
- source: "openapi",
114
- title: entry.operation.summary ?? entry.identifier,
115
- type: "page",
116
- });
117
- }
118
- }
119
-
120
- if (items.length) {
121
- entries.push({
122
- expanded: group.expanded,
123
- hidden: groupHidden || undefined,
124
- items,
125
- title,
126
- type: "group",
127
- });
128
- }
129
- }
130
-
131
- const topPages = navigation?.pages ?? [];
132
- for (const page of topPages) {
133
- const item = createPageItem(page, registry, slugPrefix);
134
- if (hiddenPages.has(page)) {
135
- item.hidden = true;
136
- }
137
- entries.push(item);
138
- }
139
-
140
- return entries;
141
- };
142
-
143
- const enrichPage = (
144
- page: NavPage,
145
- metadataMap: Map<string, PageMetadata>
146
- ): NavPage => {
147
- const meta = metadataMap.get(page.path);
148
- if (!meta) {
149
- return page;
150
- }
151
- return {
152
- ...page,
153
- deprecated: meta.deprecated ?? page.deprecated,
154
- hidden: meta.hidden ?? page.hidden,
155
- hideApiMarker: meta.hideApiMarker ?? page.hideApiMarker,
156
- icon: meta.icon ?? page.icon,
157
- iconType: meta.iconType ?? page.iconType,
158
- sidebarTitle: meta.sidebarTitle ?? page.sidebarTitle,
159
- tag: meta.tag ?? page.tag,
160
- title: meta.title ?? page.title,
161
- url: meta.url ?? page.url,
162
- };
163
- };
164
-
165
- export const enrichNavWithMetadata = (
166
- entries: NavEntry[],
167
- metadataMap: Map<string, PageMetadata>
168
- ): NavEntry[] =>
169
- entries.map((entry) => {
170
- if (entry.type === "page") {
171
- return enrichPage(entry, metadataMap);
172
- }
173
- return {
174
- ...entry,
175
- items: entry.items.map((item) => enrichPage(item, metadataMap)),
176
- };
177
- });
178
-
179
- export const getVisibleNavigation = (entries: NavEntry[]): NavEntry[] => {
180
- const visible: NavEntry[] = [];
181
- for (const entry of entries) {
182
- if (entry.hidden) {
183
- continue;
184
- }
185
- if (entry.type === "group") {
186
- const visibleItems = entry.items.filter((item) => !item.hidden);
187
- if (visibleItems.length) {
188
- visible.push({ ...entry, items: visibleItems });
189
- }
190
- } else {
191
- visible.push(entry);
192
- }
193
- }
194
- return visible;
195
- };
196
-
197
- export const flattenNav = (entries: NavEntry[]): NavPage[] => {
198
- const pages: NavPage[] = [];
199
- for (const entry of entries) {
200
- if (entry.type === "page") {
201
- pages.push(entry);
202
- } else {
203
- pages.push(...entry.items);
204
- }
205
- }
206
- return pages;
207
- };
208
-
209
- export interface NavTab {
210
- label: string;
211
- icon?: string;
212
- href?: string;
213
- entries: NavEntry[];
214
- slugPrefix?: string;
215
- }
216
-
217
- export const buildTabbedNavigation = (
218
- navigation: DocsNavigation | undefined,
219
- registry: OpenApiRegistry,
220
- slugPrefix = ""
221
- ): NavTab[] | null => {
222
- if (!navigation?.tabs?.length) {
223
- return null;
224
- }
225
- const { tabs } = navigation;
226
-
227
- return tabs.map((tab) => {
228
- if (tab.href) {
229
- return {
230
- entries: [],
231
- href: tab.href,
232
- icon: tab.icon,
233
- label: tab.label,
234
- };
235
- }
236
-
237
- const tabNav: DocsNavigation = {
238
- groups: tab.groups,
239
- hidden: navigation.hidden,
240
- pages: tab.pages,
241
- };
242
- const entries = buildNavigation(tabNav, registry, slugPrefix);
243
- const [firstPage] = flattenNav(entries);
244
-
245
- return {
246
- entries,
247
- icon: tab.icon,
248
- label: tab.label,
249
- slugPrefix: firstPage?.path,
250
- };
251
- });
252
- };
253
-
254
- export const findActiveTabIndex = (
255
- tabs: NavTab[],
256
- currentPath: string
257
- ): number => {
258
- const normalized = normalizePath(currentPath);
259
- for (const [index, tab] of tabs.entries()) {
260
- if (tab.href) {
261
- continue;
262
- }
263
- const pages = flattenNav(tab.entries);
264
- if (pages.some((page) => page.path === normalized)) {
265
- return index;
266
- }
267
- }
268
- return 0;
269
- };
270
-
271
- export const findBreadcrumbs = (entries: NavEntry[], path: string) => {
272
- const normalized = normalizePath(path);
273
- for (const entry of entries) {
274
- if (entry.type === "page" && entry.path === normalized) {
275
- return [{ label: getNavPageTitle(entry), path: entry.path }];
276
- }
277
- if (entry.type === "group") {
278
- const found = entry.items.find((item) => item.path === normalized);
279
- if (found) {
280
- return [
281
- { label: entry.title, path: "" },
282
- { label: getNavPageTitle(found), path: found.path },
283
- ];
284
- }
285
- }
286
- }
287
- return [] as { label: string; path: string }[];
288
- };
@@ -1,88 +0,0 @@
1
- import type { Tenant } from "@repo/models";
2
- import { loadSiteConfig } from "@repo/previewing";
3
-
4
- import { getTenantContentSource } from "@/lib/content-source";
5
- import { getDocsCollectionWithNavigation } from "@/lib/docs-collection";
6
- import { loadOpenApiRegistry } from "@/lib/openapi";
7
- import { createTimedPromiseCache } from "@/lib/server-cache";
8
-
9
- const OPENAPI_PROXY_CACHE_TTL_MS = 30 * 60 * 1000;
10
-
11
- interface OpenApiProxyConfig {
12
- allowedHosts: string[];
13
- enabled: boolean;
14
- }
15
-
16
- const openApiProxyConfigCache = createTimedPromiseCache<
17
- string,
18
- OpenApiProxyConfig | null
19
- >({
20
- maxEntries: 512,
21
- ttlMs: OPENAPI_PROXY_CACHE_TTL_MS,
22
- });
23
-
24
- const getOpenApiProxyCacheKey = (tenant: Tenant) =>
25
- [
26
- tenant.id,
27
- tenant.slug,
28
- tenant.activeDeploymentId ?? "",
29
- tenant.activeDeploymentManifestUrl ?? "",
30
- tenant.docsPath ?? "",
31
- ].join(":");
32
-
33
- const normalizeAllowedHosts = (hosts: string[]): string[] => [
34
- ...new Set(hosts.map((host) => host.trim().toLowerCase()).filter(Boolean)),
35
- ];
36
-
37
- export const clearOpenApiProxyConfigCache = () => {
38
- openApiProxyConfigCache.clear();
39
- };
40
-
41
- export const clearOpenApiProxyConfigCacheForTenant = (tenantId: string) => {
42
- openApiProxyConfigCache.deleteByPrefix(tenantId);
43
- };
44
-
45
- export const loadOpenApiProxyConfig = async (
46
- tenant: Tenant
47
- ): Promise<OpenApiProxyConfig | null> => {
48
- const cacheKey = getOpenApiProxyCacheKey(tenant);
49
-
50
- return await openApiProxyConfigCache.getOrCreate(cacheKey, async () => {
51
- const contentSource = getTenantContentSource(tenant);
52
- const configResult = await loadSiteConfig(contentSource);
53
- if (!configResult.ok) {
54
- return null;
55
- }
56
-
57
- const configuredHosts = normalizeAllowedHosts(
58
- configResult.config.openapiProxy?.allowedHosts ?? []
59
- );
60
- if (!configResult.config.openapiProxy?.enabled || configuredHosts.length) {
61
- return {
62
- allowedHosts: configuredHosts,
63
- enabled: configResult.config.openapiProxy?.enabled === true,
64
- };
65
- }
66
-
67
- const registry = await loadOpenApiRegistry(
68
- getDocsCollectionWithNavigation(configResult.config),
69
- contentSource
70
- );
71
- const derivedHosts = normalizeAllowedHosts(
72
- registry.entries.flatMap((entry) =>
73
- (entry.spec.servers ?? []).flatMap((server) => {
74
- try {
75
- return [new URL(server.url).hostname];
76
- } catch {
77
- return [];
78
- }
79
- })
80
- )
81
- );
82
-
83
- return {
84
- allowedHosts: derivedHosts,
85
- enabled: true,
86
- };
87
- });
88
- };
@@ -1,158 +0,0 @@
1
- import { ensureArray, normalizePath } from "@repo/common";
2
- import type { CollectionConfig, DocsOpenApiSource } from "@repo/models";
3
- import {
4
- extractOpenApiOperations,
5
- openApiIdentifier,
6
- openApiSlug,
7
- parseOpenApiSpec,
8
- } from "@repo/prebuild";
9
- import type { OpenApiOperation, OpenApiSpec } from "@repo/prebuild";
10
- import { loadPrebuiltOpenApiIndex } from "@repo/previewing";
11
- import type { ContentSource, PrebuiltOpenApiEntry } from "@repo/previewing";
12
-
13
- export interface OpenApiEntry {
14
- slug: string;
15
- identifier: string;
16
- operation: OpenApiOperation;
17
- spec: OpenApiSpec;
18
- source: DocsOpenApiSource;
19
- sourceKey: string;
20
- }
21
-
22
- export interface OpenApiRegistry {
23
- entries: OpenApiEntry[];
24
- bySlug: Map<string, OpenApiEntry>;
25
- byIdentifier: Map<string, OpenApiEntry>;
26
- bySource: Map<string, OpenApiEntry[]>;
27
- }
28
-
29
- const toRegistry = (entries: OpenApiEntry[]): OpenApiRegistry => {
30
- const bySlug = new Map<string, OpenApiEntry>();
31
- const byIdentifier = new Map<string, OpenApiEntry>();
32
- const bySource = new Map<string, OpenApiEntry[]>();
33
-
34
- for (const entry of entries) {
35
- bySlug.set(entry.slug, entry);
36
- byIdentifier.set(entry.identifier, entry);
37
- if (!bySource.has(entry.sourceKey)) {
38
- bySource.set(entry.sourceKey, []);
39
- }
40
- bySource.get(entry.sourceKey)?.push(entry);
41
- }
42
-
43
- return { byIdentifier, bySlug, bySource, entries };
44
- };
45
-
46
- export const fromPrebuiltOpenApiEntries = (
47
- entries: PrebuiltOpenApiEntry[]
48
- ): OpenApiRegistry => toRegistry(entries);
49
-
50
- const getOpenApiSourceKey = (source: DocsOpenApiSource): string =>
51
- `${source.source}::${source.directory ?? ""}::${(source.include ?? []).join(
52
- "|"
53
- )}`;
54
-
55
- const toSourceObject = (
56
- value: string | DocsOpenApiSource
57
- ): DocsOpenApiSource => {
58
- if (typeof value === "string") {
59
- return { source: value };
60
- }
61
- return value;
62
- };
63
-
64
- const collectOpenApiSources = (collection?: CollectionConfig) => {
65
- const sources: DocsOpenApiSource[] = [];
66
-
67
- for (const item of ensureArray(collection?.openapi)) {
68
- if (!item) {
69
- continue;
70
- }
71
- sources.push(toSourceObject(item));
72
- }
73
-
74
- const groups = collection?.navigation?.groups ?? [];
75
- for (const group of groups) {
76
- if (!group.openapi) {
77
- continue;
78
- }
79
- sources.push(toSourceObject(group.openapi));
80
- }
81
-
82
- const seen = new Set<string>();
83
- return sources.filter((source) => {
84
- const key = getOpenApiSourceKey(source);
85
- if (seen.has(key)) {
86
- return false;
87
- }
88
- seen.add(key);
89
- return true;
90
- });
91
- };
92
-
93
- export const buildOpenApiRegistry = async (
94
- collection: CollectionConfig | undefined,
95
- contentSource: ContentSource
96
- ): Promise<OpenApiRegistry> => {
97
- if (!collection || collection.type !== "docs") {
98
- return toRegistry([]);
99
- }
100
-
101
- const entries: OpenApiEntry[] = [];
102
- const slugPrefix = normalizePath(collection.slugPrefix ?? "");
103
-
104
- const sources = collectOpenApiSources(collection);
105
- const resolved = await Promise.all(
106
- sources.map(async (source) => {
107
- const rawSpec = await contentSource.readFile(source.source);
108
- const spec = parseOpenApiSpec(rawSpec, source.source);
109
- const directory = source.directory ?? "api";
110
- const { operations } = extractOpenApiOperations(spec, directory);
111
- return { directory, operations, source, spec };
112
- })
113
- );
114
-
115
- for (const { directory, operations, source, spec } of resolved) {
116
- const sourceKey = getOpenApiSourceKey(source);
117
- const includeIdentifiers = source.include?.length
118
- ? new Set(source.include)
119
- : null;
120
-
121
- for (const operation of operations) {
122
- const identifier = openApiIdentifier(operation.method, operation.path);
123
- if (includeIdentifiers && !includeIdentifiers.has(identifier)) {
124
- continue;
125
- }
126
-
127
- const baseSlug = normalizePath(
128
- openApiSlug(operation.method, operation.path, directory)
129
- );
130
- const slug = slugPrefix
131
- ? normalizePath(`${slugPrefix}/${baseSlug}`)
132
- : baseSlug;
133
- const entry: OpenApiEntry = {
134
- identifier,
135
- operation,
136
- slug: normalizePath(slug),
137
- source,
138
- sourceKey,
139
- spec,
140
- };
141
- entries.push(entry);
142
- }
143
- }
144
-
145
- return toRegistry(entries);
146
- };
147
-
148
- export const loadOpenApiRegistry = async (
149
- collection: CollectionConfig | undefined,
150
- contentSource: ContentSource
151
- ): Promise<OpenApiRegistry> => {
152
- const prebuilt = await loadPrebuiltOpenApiIndex(contentSource);
153
- if (prebuilt) {
154
- return fromPrebuiltOpenApiEntries(prebuilt);
155
- }
156
-
157
- return await buildOpenApiRegistry(collection, contentSource);
158
- };
@@ -1,6 +0,0 @@
1
- import { platformAssetPrefix, platformRootDomain } from "./env";
2
-
3
- export const platformConfig = {
4
- assetPrefix: platformAssetPrefix,
5
- rootDomain: platformRootDomain,
6
- };
@@ -1,46 +0,0 @@
1
- import type { ProjectRecord, UserRecord } from "@repo/db";
2
- import { cache } from "react";
3
-
4
- import { getDashboardSession } from "./dashboard-session";
5
- import { projectDao, userDao } from "./db";
6
-
7
- export interface AuthorizedProjectContext {
8
- accessToken: string;
9
- project: ProjectRecord;
10
- user: UserRecord;
11
- }
12
-
13
- export const resolveCurrentUser = cache(
14
- async (): Promise<{
15
- accessToken: string;
16
- user: UserRecord;
17
- } | null> => {
18
- const session = await getDashboardSession();
19
- if (!session) {
20
- return null;
21
- }
22
- const user = await userDao.getByAuthId(session.authId);
23
- if (!user) {
24
- return null;
25
- }
26
- return { accessToken: session.accessToken, user };
27
- }
28
- );
29
-
30
- export const getAuthorizedProjectBySlug = cache(
31
- async (slug: string): Promise<AuthorizedProjectContext | null> => {
32
- const session = await getDashboardSession();
33
- if (!session) {
34
- return null;
35
- }
36
- const result = await projectDao.getAuthorizedBySlug(session.authId, slug);
37
- if (!result) {
38
- return null;
39
- }
40
- return {
41
- accessToken: session.accessToken,
42
- project: result.project,
43
- user: result.user,
44
- };
45
- }
46
- );
@@ -1,103 +0,0 @@
1
- import { normalizePath, withLeadingSlash } from "@repo/common";
2
-
3
- const ABSOLUTE_URL_REGEX = /^[a-z][a-z\d+.-]*:/i;
4
- const MARKDOWN_EXPORT_EXTENSIONS = [".md", ".mdx"] as const;
5
-
6
- export const stripBasePath = (value: string, basePath: string) => {
7
- if (!basePath) {
8
- return value;
9
- }
10
- if (value === basePath) {
11
- return "/";
12
- }
13
- if (value.startsWith(`${basePath}/`)) {
14
- return value.slice(basePath.length) || "/";
15
- }
16
- return value;
17
- };
18
-
19
- export const toDocHref = (path: string, basePath = "") => {
20
- const clean = normalizePath(path);
21
- const base = basePath ? withLeadingSlash(basePath) : "";
22
- if (!clean || clean === "index") {
23
- return base || "/";
24
- }
25
- return `${base}/${clean}`.replaceAll(/\/+/g, "/");
26
- };
27
-
28
- export const toMarkdownDocHref = (path: string, basePath = "") => {
29
- const href = toDocHref(path, basePath);
30
- // Index pages use /index.md, not just .md appended to the path
31
- if (href === "/" || href === basePath) {
32
- return `${href}/index.md`.replaceAll(/\/+/g, "/");
33
- }
34
- return `${href}.md`;
35
- };
36
-
37
- export const getMarkdownExportSourcePath = (pathname: string) => {
38
- for (const extension of MARKDOWN_EXPORT_EXTENSIONS) {
39
- if (pathname.endsWith(extension)) {
40
- return pathname.slice(0, -extension.length) || "/";
41
- }
42
- }
43
-
44
- return null;
45
- };
46
-
47
- export const getMarkdownExportSlug = (pathname: string, basePath = "") => {
48
- const sourcePath = getMarkdownExportSourcePath(pathname);
49
- if (sourcePath === null) {
50
- return null;
51
- }
52
-
53
- const relativePath = stripBasePath(sourcePath, basePath);
54
- return relativePath === "/" ? "" : relativePath.slice(1);
55
- };
56
-
57
- export const isExternalHref = (href: string) =>
58
- ABSOLUTE_URL_REGEX.test(href) || href.startsWith("//");
59
-
60
- const isDotRelativeHref = (href: string) =>
61
- href.startsWith("./") || href.startsWith("../");
62
-
63
- const resolveDotRelativePath = (pathPart: string, currentPath: string) => {
64
- const cleanCurrentPath = normalizePath(currentPath);
65
- const currentDirectory = cleanCurrentPath.includes("/")
66
- ? cleanCurrentPath.slice(0, cleanCurrentPath.lastIndexOf("/") + 1)
67
- : "";
68
- const resolved = new URL(pathPart, `https://docs.local/${currentDirectory}`);
69
- return normalizePath(resolved.pathname) || "index";
70
- };
71
-
72
- export const resolveHref = (href: string, basePath = "", currentPath = "") => {
73
- if (
74
- !href ||
75
- href.startsWith("#") ||
76
- href.startsWith("?") ||
77
- isExternalHref(href)
78
- ) {
79
- return href;
80
- }
81
-
82
- const suffixIndex = href.search(/[?#]/);
83
- const pathPart = suffixIndex === -1 ? href : href.slice(0, suffixIndex);
84
- const suffix = suffixIndex === -1 ? "" : href.slice(suffixIndex);
85
- const resolvedPath =
86
- currentPath && isDotRelativeHref(pathPart)
87
- ? resolveDotRelativePath(pathPart, currentPath)
88
- : pathPart;
89
- const normalizedBase = basePath
90
- ? withLeadingSlash(basePath).replaceAll(/\/+$/g, "")
91
- : "";
92
- const normalizedPath = withLeadingSlash(resolvedPath || "/");
93
-
94
- if (
95
- normalizedBase &&
96
- (normalizedPath === normalizedBase ||
97
- normalizedPath.startsWith(`${normalizedBase}/`))
98
- ) {
99
- return `${normalizedPath}${suffix}`;
100
- }
101
-
102
- return `${toDocHref(resolvedPath || "index", basePath)}${suffix}`;
103
- };