polen 0.10.0-next.14 → 0.10.0-next.4

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 (525) hide show
  1. package/README.md +1 -2
  2. package/build/api/builder/builder.js +1 -1
  3. package/build/api/builder/builder.js.map +1 -1
  4. package/build/api/config/load.js +6 -6
  5. package/build/api/config/load.js.map +1 -1
  6. package/build/api/config-resolver/resolve.js +2 -2
  7. package/build/api/config-resolver/resolve.js.map +1 -1
  8. package/build/api/schema/data-sources/schema-directory/schema-directory.js +1 -1
  9. package/build/api/schema/data-sources/schema-directory/schema-directory.js.map +1 -1
  10. package/build/api/vite/plugins/branding/index.js +4 -4
  11. package/build/api/vite/plugins/branding/index.js.map +1 -1
  12. package/build/api/vite/plugins/build.d.ts.map +1 -1
  13. package/build/api/vite/plugins/build.js +4 -12
  14. package/build/api/vite/plugins/build.js.map +1 -1
  15. package/build/api/vite/plugins/core.d.ts +2 -2
  16. package/build/api/vite/plugins/core.d.ts.map +1 -1
  17. package/build/api/vite/plugins/core.js +13 -13
  18. package/build/api/vite/plugins/core.js.map +1 -1
  19. package/build/api/vite/plugins/pages.d.ts +14 -8
  20. package/build/api/vite/plugins/pages.d.ts.map +1 -1
  21. package/build/api/vite/plugins/pages.js +185 -111
  22. package/build/api/vite/plugins/pages.js.map +1 -1
  23. package/build/api/vite/plugins/serve.d.ts.map +1 -1
  24. package/build/api/vite/plugins/serve.js +12 -52
  25. package/build/api/vite/plugins/serve.js.map +1 -1
  26. package/build/cli/_/self-contained-mode.js +5 -5
  27. package/build/cli/_/self-contained-mode.js.map +1 -1
  28. package/build/lib/demos/config-schema.d.ts +20 -20
  29. package/build/lib/file-router/diagnostic-reporter.js +2 -2
  30. package/build/lib/file-router/diagnostic-reporter.js.map +1 -1
  31. package/build/lib/file-router/file-router.d.ts +2 -0
  32. package/build/lib/file-router/file-router.d.ts.map +1 -1
  33. package/build/lib/file-router/file-router.js +2 -0
  34. package/build/lib/file-router/file-router.js.map +1 -1
  35. package/build/lib/file-router/route.d.ts +0 -2
  36. package/build/lib/file-router/route.d.ts.map +1 -1
  37. package/build/lib/file-router/route.js.map +1 -1
  38. package/build/lib/file-router/scan-tree.d.ts +20 -0
  39. package/build/lib/file-router/scan-tree.d.ts.map +1 -0
  40. package/build/lib/file-router/scan-tree.js +158 -0
  41. package/build/lib/file-router/scan-tree.js.map +1 -0
  42. package/build/lib/file-router/scan.d.ts.map +1 -1
  43. package/build/lib/file-router/scan.js +13 -22
  44. package/build/lib/file-router/scan.js.map +1 -1
  45. package/build/lib/file-router/sidebar/index.d.ts +3 -0
  46. package/build/lib/file-router/sidebar/index.d.ts.map +1 -0
  47. package/build/lib/file-router/sidebar/index.js +4 -0
  48. package/build/lib/file-router/sidebar/index.js.map +1 -0
  49. package/build/lib/file-router/sidebar/sidebar-tree.d.ts +9 -0
  50. package/build/lib/file-router/sidebar/sidebar-tree.d.ts.map +1 -0
  51. package/build/lib/file-router/sidebar/sidebar-tree.js +85 -0
  52. package/build/lib/file-router/sidebar/sidebar-tree.js.map +1 -0
  53. package/build/lib/file-router/sidebar/types.d.ts +17 -0
  54. package/build/lib/file-router/sidebar/types.d.ts.map +1 -0
  55. package/build/lib/file-router/sidebar/types.js.map +1 -0
  56. package/build/lib/github-actions/runner.js +2 -2
  57. package/build/lib/github-actions/runner.js.map +1 -1
  58. package/build/lib/github-actions/schemas/context.d.ts +2 -2
  59. package/build/lib/kit-temp.d.ts +0 -103
  60. package/build/lib/kit-temp.d.ts.map +1 -1
  61. package/build/lib/kit-temp.js +3 -239
  62. package/build/lib/kit-temp.js.map +1 -1
  63. package/build/lib/tree/index.d.ts +3 -0
  64. package/build/lib/tree/index.d.ts.map +1 -0
  65. package/build/lib/tree/index.js +2 -0
  66. package/build/lib/tree/index.js.map +1 -0
  67. package/build/lib/tree/tree.d.ts +62 -0
  68. package/build/lib/tree/tree.d.ts.map +1 -0
  69. package/build/lib/tree/tree.js +134 -0
  70. package/build/lib/tree/tree.js.map +1 -0
  71. package/build/lib/vite-plugin-reactive-data/vite-plugin-reactive-data.d.ts +8 -1
  72. package/build/lib/vite-plugin-reactive-data/vite-plugin-reactive-data.d.ts.map +1 -1
  73. package/build/lib/vite-plugin-reactive-data/vite-plugin-reactive-data.js +53 -48
  74. package/build/lib/vite-plugin-reactive-data/vite-plugin-reactive-data.js.map +1 -1
  75. package/build/package-paths.js +3 -3
  76. package/build/package-paths.js.map +1 -1
  77. package/build/sandbox.js +2 -17
  78. package/build/sandbox.js.map +1 -1
  79. package/build/singletons/debug.d.ts +1 -1
  80. package/build/singletons/debug.d.ts.map +1 -1
  81. package/build/singletons/debug.js +1 -1
  82. package/build/singletons/debug.js.map +1 -1
  83. package/build/template/components/ArgumentAnnotation.jsx +16 -0
  84. package/build/template/components/ArgumentAnnotation.jsx.map +1 -0
  85. package/build/template/components/ArgumentList.jsx +16 -0
  86. package/build/template/components/ArgumentList.jsx.map +1 -0
  87. package/build/template/components/ArgumentListAnnotation.jsx +23 -0
  88. package/build/template/components/ArgumentListAnnotation.jsx.map +1 -0
  89. package/build/template/components/Changelog.jsx +68 -0
  90. package/build/template/components/Changelog.jsx.map +1 -0
  91. package/build/template/components/{CodeBlock.js → CodeBlock.jsx} +5 -4
  92. package/build/template/components/{CodeBlock.js.map → CodeBlock.jsx.map} +1 -1
  93. package/build/template/components/DeprecationReason.jsx +10 -0
  94. package/build/template/components/DeprecationReason.jsx.map +1 -0
  95. package/build/template/components/Description.jsx +10 -0
  96. package/build/template/components/Description.jsx.map +1 -0
  97. package/build/template/components/Field.jsx +22 -0
  98. package/build/template/components/Field.jsx.map +1 -0
  99. package/build/template/components/{FieldList.js → FieldList.jsx} +5 -4
  100. package/build/template/components/FieldList.jsx.map +1 -0
  101. package/build/template/components/{FieldListSection.js → FieldListSection.jsx} +6 -4
  102. package/build/template/components/FieldListSection.jsx.map +1 -0
  103. package/build/template/components/Link.d.ts +2 -2
  104. package/build/template/components/Link.d.ts.map +1 -1
  105. package/build/template/components/{Link.js → Link.jsx} +9 -17
  106. package/build/template/components/Link.jsx.map +1 -0
  107. package/build/template/components/Logo.jsx +29 -0
  108. package/build/template/components/Logo.jsx.map +1 -0
  109. package/build/template/components/{Markdown.js → Markdown.jsx} +2 -3
  110. package/build/template/components/Markdown.jsx.map +1 -0
  111. package/build/template/components/MissingSchema.d.ts +1 -1
  112. package/build/template/components/MissingSchema.d.ts.map +1 -1
  113. package/build/template/components/MissingSchema.jsx +4 -0
  114. package/build/template/components/MissingSchema.jsx.map +1 -0
  115. package/build/template/components/NamedType.jsx +17 -0
  116. package/build/template/components/NamedType.jsx.map +1 -0
  117. package/build/template/components/{RadixLink.js → RadixLink.jsx} +1 -1
  118. package/build/template/components/RadixLink.jsx.map +1 -0
  119. package/build/template/components/Texts/{MinorHeading.js → MinorHeading.jsx} +3 -4
  120. package/build/template/components/Texts/MinorHeading.jsx.map +1 -0
  121. package/build/template/components/Texts/texts.js +1 -1
  122. package/build/template/components/Texts/texts.js.map +1 -1
  123. package/build/template/components/{TypeAnnotation.js → TypeAnnotation.jsx} +18 -8
  124. package/build/template/components/TypeAnnotation.jsx.map +1 -0
  125. package/build/template/components/TypeFieldsLinkList.jsx +17 -0
  126. package/build/template/components/TypeFieldsLinkList.jsx.map +1 -0
  127. package/build/template/components/TypeIndex.jsx +27 -0
  128. package/build/template/components/TypeIndex.jsx.map +1 -0
  129. package/build/template/components/graphql/graphql.d.ts +2 -2
  130. package/build/template/components/graphql/graphql.jsx +3 -0
  131. package/build/template/components/graphql/graphql.jsx.map +1 -0
  132. package/build/template/components/graphql/index.d.ts +1 -1
  133. package/build/template/components/graphql/index.js +1 -1
  134. package/build/template/components/graphql/index.js.map +1 -1
  135. package/build/template/components/graphql/{type-kind-icon.js → type-kind-icon.jsx} +2 -3
  136. package/build/template/components/graphql/type-kind-icon.jsx.map +1 -0
  137. package/build/template/components/graphql/type-link.jsx +16 -0
  138. package/build/template/components/graphql/type-link.jsx.map +1 -0
  139. package/build/template/components/sidebar/Sidebar.d.ts +3 -3
  140. package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
  141. package/build/template/components/sidebar/Sidebar.jsx +15 -0
  142. package/build/template/components/sidebar/Sidebar.jsx.map +1 -0
  143. package/build/template/components/sidebar/SidebarItem.d.ts +3 -3
  144. package/build/template/components/sidebar/SidebarItem.d.ts.map +1 -1
  145. package/build/template/components/sidebar/{SidebarItem.js → SidebarItem.jsx} +35 -18
  146. package/build/template/components/sidebar/SidebarItem.jsx.map +1 -0
  147. package/build/template/components/sidebar/ToggleButton.d.ts +1 -1
  148. package/build/template/components/sidebar/ToggleButton.d.ts.map +1 -1
  149. package/build/template/components/sidebar/ToggleButton.jsx +6 -0
  150. package/build/template/components/sidebar/ToggleButton.jsx.map +1 -0
  151. package/build/template/entry.client.d.ts +0 -1
  152. package/build/template/entry.client.d.ts.map +1 -1
  153. package/build/template/{entry.client.js → entry.client.jsx} +9 -5
  154. package/build/template/entry.client.jsx.map +1 -0
  155. package/build/template/routes/changelog.d.ts +1 -1
  156. package/build/template/routes/{changelog.js → changelog.jsx} +4 -5
  157. package/build/template/routes/changelog.jsx.map +1 -0
  158. package/build/template/routes/{index.js → index.jsx} +2 -3
  159. package/build/template/routes/index.jsx.map +1 -0
  160. package/build/template/routes/reference.$type.$field.d.ts +1 -1
  161. package/build/template/routes/{reference.$type.$field.js → reference.$type.$field.jsx} +5 -6
  162. package/build/template/routes/reference.$type.$field.jsx.map +1 -0
  163. package/build/template/routes/reference.$type.d.ts +1 -1
  164. package/build/template/routes/{reference.$type.js → reference.$type.jsx} +5 -6
  165. package/build/template/routes/reference.$type.jsx.map +1 -0
  166. package/build/template/routes/reference.d.ts +2 -2
  167. package/build/template/routes/reference.d.ts.map +1 -1
  168. package/build/template/routes/{reference.js → reference.jsx} +12 -7
  169. package/build/template/routes/reference.jsx.map +1 -0
  170. package/build/template/routes/root.d.ts +2 -2
  171. package/build/template/routes/root.d.ts.map +1 -1
  172. package/build/template/routes/root.jsx +188 -0
  173. package/build/template/routes/root.jsx.map +1 -0
  174. package/build/template/routes.jsx +5 -0
  175. package/build/template/routes.jsx.map +1 -0
  176. package/build/template/server/app.d.ts +1 -8
  177. package/build/template/server/app.d.ts.map +1 -1
  178. package/build/template/server/app.js +21 -21
  179. package/build/template/server/app.js.map +1 -1
  180. package/build/template/server/main.js +1 -2
  181. package/build/template/server/main.js.map +1 -1
  182. package/build/template/server/render-page.d.ts +3 -0
  183. package/build/template/server/render-page.d.ts.map +1 -0
  184. package/build/template/server/{create-page-html-response.js → render-page.jsx} +17 -11
  185. package/build/template/server/render-page.jsx.map +1 -0
  186. package/build/template/server/ssg/generate.d.ts.map +1 -1
  187. package/build/template/server/ssg/generate.js +34 -33
  188. package/build/template/server/ssg/generate.js.map +1 -1
  189. package/build/template/server/ssg/get-route-paths.js +1 -1
  190. package/build/template/server/ssg/get-route-paths.js.map +1 -1
  191. package/build/template/server/view.js +1 -1
  192. package/build/template/server/view.js.map +1 -1
  193. package/package.json +9 -66
  194. package/src/api/config/load.ts +5 -5
  195. package/src/api/config-resolver/resolve.ts +2 -2
  196. package/src/api/schema/data-sources/schema-directory/schema-directory.ts +1 -1
  197. package/src/api/singletons/markdown/markdown.test.ts +1 -1
  198. package/src/api/vite/plugins/branding/index.ts +4 -4
  199. package/src/api/vite/plugins/build.ts +89 -97
  200. package/src/api/vite/plugins/core.ts +16 -18
  201. package/src/api/vite/plugins/pages.ts +209 -135
  202. package/src/api/vite/plugins/serve.ts +14 -67
  203. package/src/cli/_/self-contained-mode.ts +5 -5
  204. package/src/lib/deployment/$$.ts +1 -1
  205. package/src/lib/deployment/$.test.ts +3 -3
  206. package/src/lib/deployment/$.ts +1 -1
  207. package/src/lib/file-router/diagnostic-reporter.ts +2 -2
  208. package/src/lib/file-router/file-router.ts +2 -0
  209. package/src/lib/file-router/linter.test.ts +0 -2
  210. package/src/lib/file-router/route.ts +0 -2
  211. package/src/lib/file-router/scan-tree.test.ts +189 -0
  212. package/src/lib/file-router/scan-tree.ts +205 -0
  213. package/src/lib/file-router/scan.ts +14 -26
  214. package/src/lib/file-router/sidebar/index.ts +3 -0
  215. package/src/lib/file-router/sidebar/sidebar-tree.test.ts +123 -0
  216. package/src/lib/file-router/sidebar/sidebar-tree.ts +110 -0
  217. package/src/lib/file-router/sidebar/types.ts +19 -0
  218. package/src/lib/kit-temp.test.ts +7 -19
  219. package/src/lib/kit-temp.ts +5 -307
  220. package/src/lib/task/$.test.ts +3 -3
  221. package/src/lib/tree/index.ts +2 -0
  222. package/src/lib/tree/tree.test.ts +117 -0
  223. package/src/lib/tree/tree.ts +183 -0
  224. package/src/lib/version-history/index.test.ts +4 -12
  225. package/src/lib/vite-plugin-reactive-data/vite-plugin-reactive-data.ts +58 -52
  226. package/src/package-paths.ts +3 -3
  227. package/src/sandbox.ts +1 -20
  228. package/src/singletons/debug.ts +1 -1
  229. package/src/template/components/ArgumentAnnotation.tsx +1 -1
  230. package/src/template/components/ArgumentList.tsx +1 -1
  231. package/src/template/components/ArgumentListAnnotation.tsx +2 -2
  232. package/src/template/components/DeprecationReason.tsx +1 -1
  233. package/src/template/components/Description.tsx +1 -1
  234. package/src/template/components/Field.tsx +4 -4
  235. package/src/template/components/FieldList.tsx +1 -1
  236. package/src/template/components/FieldListSection.tsx +1 -1
  237. package/src/template/components/Link.tsx +14 -22
  238. package/src/template/components/NamedType.tsx +2 -2
  239. package/src/template/components/TypeAnnotation.tsx +1 -1
  240. package/src/template/components/TypeFieldsLinkList.tsx +1 -1
  241. package/src/template/components/TypeIndex.tsx +1 -1
  242. package/src/template/components/graphql/graphql.tsx +2 -2
  243. package/src/template/components/graphql/index.ts +1 -1
  244. package/src/template/components/graphql/type-link.tsx +2 -2
  245. package/src/template/components/sidebar/Sidebar.tsx +2 -2
  246. package/src/template/components/sidebar/SidebarItem.tsx +14 -14
  247. package/src/template/entry.client.tsx +5 -2
  248. package/src/template/routes/changelog.tsx +1 -1
  249. package/src/template/routes/reference.$type.$field.tsx +3 -3
  250. package/src/template/routes/reference.$type.tsx +3 -3
  251. package/src/template/routes/reference.tsx +10 -6
  252. package/src/template/routes/root.tsx +108 -112
  253. package/src/template/routes.tsx +1 -1
  254. package/src/template/server/app.ts +23 -33
  255. package/src/template/server/main.ts +1 -2
  256. package/src/template/server/{create-page-html-response.ts → render-page.tsx} +16 -19
  257. package/src/template/server/ssg/generate.ts +72 -68
  258. package/src/template/server/ssg/get-route-paths.ts +1 -1
  259. package/src/template/server/view.ts +1 -1
  260. package/src/template/styles/code-block.css +0 -32
  261. package/build/api/content/$$.d.ts +0 -7
  262. package/build/api/content/$$.d.ts.map +0 -1
  263. package/build/api/content/$$.js +0 -7
  264. package/build/api/content/$$.js.map +0 -1
  265. package/build/api/content/$.d.ts +0 -2
  266. package/build/api/content/$.d.ts.map +0 -1
  267. package/build/api/content/$.js +0 -2
  268. package/build/api/content/$.js.map +0 -1
  269. package/build/api/content/metadata.d.ts +0 -10
  270. package/build/api/content/metadata.d.ts.map +0 -1
  271. package/build/api/content/metadata.js +0 -9
  272. package/build/api/content/metadata.js.map +0 -1
  273. package/build/api/content/navbar.d.ts +0 -10
  274. package/build/api/content/navbar.d.ts.map +0 -1
  275. package/build/api/content/navbar.js +0 -45
  276. package/build/api/content/navbar.js.map +0 -1
  277. package/build/api/content/page.d.ts +0 -11
  278. package/build/api/content/page.d.ts.map +0 -1
  279. package/build/api/content/page.js +0 -2
  280. package/build/api/content/page.js.map +0 -1
  281. package/build/api/content/scan.d.ts +0 -19
  282. package/build/api/content/scan.d.ts.map +0 -1
  283. package/build/api/content/scan.js +0 -90
  284. package/build/api/content/scan.js.map +0 -1
  285. package/build/api/content/sidebar.d.ts +0 -104
  286. package/build/api/content/sidebar.d.ts.map +0 -1
  287. package/build/api/content/sidebar.js +0 -166
  288. package/build/api/content/sidebar.js.map +0 -1
  289. package/build/api/content/utils.d.ts +0 -5
  290. package/build/api/content/utils.d.ts.map +0 -1
  291. package/build/api/content/utils.js +0 -8
  292. package/build/api/content/utils.js.map +0 -1
  293. package/build/exports/components.d.ts +0 -5
  294. package/build/exports/components.d.ts.map +0 -1
  295. package/build/exports/components.js +0 -5
  296. package/build/exports/components.js.map +0 -1
  297. package/build/lib/graphql-document/$$.d.ts +0 -5
  298. package/build/lib/graphql-document/$$.d.ts.map +0 -1
  299. package/build/lib/graphql-document/$$.js +0 -5
  300. package/build/lib/graphql-document/$$.js.map +0 -1
  301. package/build/lib/graphql-document/$.d.ts +0 -2
  302. package/build/lib/graphql-document/$.d.ts.map +0 -1
  303. package/build/lib/graphql-document/$.js +0 -2
  304. package/build/lib/graphql-document/$.js.map +0 -1
  305. package/build/lib/graphql-document/analysis.d.ts +0 -44
  306. package/build/lib/graphql-document/analysis.d.ts.map +0 -1
  307. package/build/lib/graphql-document/analysis.js +0 -361
  308. package/build/lib/graphql-document/analysis.js.map +0 -1
  309. package/build/lib/graphql-document/components/CopyButton.d.ts +0 -19
  310. package/build/lib/graphql-document/components/CopyButton.d.ts.map +0 -1
  311. package/build/lib/graphql-document/components/CopyButton.js +0 -43
  312. package/build/lib/graphql-document/components/CopyButton.js.map +0 -1
  313. package/build/lib/graphql-document/components/GraphQLDocument.d.ts +0 -38
  314. package/build/lib/graphql-document/components/GraphQLDocument.d.ts.map +0 -1
  315. package/build/lib/graphql-document/components/GraphQLDocument.js +0 -142
  316. package/build/lib/graphql-document/components/GraphQLDocument.js.map +0 -1
  317. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts +0 -7
  318. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.d.ts.map +0 -1
  319. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js +0 -45
  320. package/build/lib/graphql-document/components/GraphQLDocumentWithSchema.js.map +0 -1
  321. package/build/lib/graphql-document/components/GraphQLIdentifierPopover.d.ts +0 -33
  322. package/build/lib/graphql-document/components/GraphQLIdentifierPopover.d.ts.map +0 -1
  323. package/build/lib/graphql-document/components/GraphQLIdentifierPopover.js +0 -48
  324. package/build/lib/graphql-document/components/GraphQLIdentifierPopover.js.map +0 -1
  325. package/build/lib/graphql-document/components/IdentifierLink.d.ts +0 -39
  326. package/build/lib/graphql-document/components/IdentifierLink.d.ts.map +0 -1
  327. package/build/lib/graphql-document/components/IdentifierLink.js +0 -75
  328. package/build/lib/graphql-document/components/IdentifierLink.js.map +0 -1
  329. package/build/lib/graphql-document/components/graphql-document-styles.d.ts +0 -5
  330. package/build/lib/graphql-document/components/graphql-document-styles.d.ts.map +0 -1
  331. package/build/lib/graphql-document/components/graphql-document-styles.js +0 -167
  332. package/build/lib/graphql-document/components/graphql-document-styles.js.map +0 -1
  333. package/build/lib/graphql-document/components/index.d.ts +0 -6
  334. package/build/lib/graphql-document/components/index.d.ts.map +0 -1
  335. package/build/lib/graphql-document/components/index.js +0 -6
  336. package/build/lib/graphql-document/components/index.js.map +0 -1
  337. package/build/lib/graphql-document/example.d.ts +0 -25
  338. package/build/lib/graphql-document/example.d.ts.map +0 -1
  339. package/build/lib/graphql-document/example.js +0 -140
  340. package/build/lib/graphql-document/example.js.map +0 -1
  341. package/build/lib/graphql-document/graphql-document.d.ts +0 -35
  342. package/build/lib/graphql-document/graphql-document.d.ts.map +0 -1
  343. package/build/lib/graphql-document/graphql-document.js +0 -36
  344. package/build/lib/graphql-document/graphql-document.js.map +0 -1
  345. package/build/lib/graphql-document/hooks/use-tooltip-state.d.ts +0 -43
  346. package/build/lib/graphql-document/hooks/use-tooltip-state.d.ts.map +0 -1
  347. package/build/lib/graphql-document/hooks/use-tooltip-state.js +0 -132
  348. package/build/lib/graphql-document/hooks/use-tooltip-state.js.map +0 -1
  349. package/build/lib/graphql-document/positioning-simple.d.ts +0 -63
  350. package/build/lib/graphql-document/positioning-simple.d.ts.map +0 -1
  351. package/build/lib/graphql-document/positioning-simple.js +0 -185
  352. package/build/lib/graphql-document/positioning-simple.js.map +0 -1
  353. package/build/lib/graphql-document/schema-context.d.ts +0 -8
  354. package/build/lib/graphql-document/schema-context.d.ts.map +0 -1
  355. package/build/lib/graphql-document/schema-context.js +0 -11
  356. package/build/lib/graphql-document/schema-context.js.map +0 -1
  357. package/build/lib/graphql-document/schema-integration-example.d.ts +0 -27
  358. package/build/lib/graphql-document/schema-integration-example.d.ts.map +0 -1
  359. package/build/lib/graphql-document/schema-integration-example.js +0 -297
  360. package/build/lib/graphql-document/schema-integration-example.js.map +0 -1
  361. package/build/lib/graphql-document/schema-integration.d.ts +0 -135
  362. package/build/lib/graphql-document/schema-integration.d.ts.map +0 -1
  363. package/build/lib/graphql-document/schema-integration.js +0 -328
  364. package/build/lib/graphql-document/schema-integration.js.map +0 -1
  365. package/build/lib/graphql-document/types.d.ts +0 -117
  366. package/build/lib/graphql-document/types.d.ts.map +0 -1
  367. package/build/lib/graphql-document/types.js.map +0 -1
  368. package/build/template/components/ArgumentAnnotation.js +0 -10
  369. package/build/template/components/ArgumentAnnotation.js.map +0 -1
  370. package/build/template/components/ArgumentList.js +0 -9
  371. package/build/template/components/ArgumentList.js.map +0 -1
  372. package/build/template/components/ArgumentListAnnotation.js +0 -15
  373. package/build/template/components/ArgumentListAnnotation.js.map +0 -1
  374. package/build/template/components/Changelog.js +0 -44
  375. package/build/template/components/Changelog.js.map +0 -1
  376. package/build/template/components/CodeBlockEnhancer.d.ts +0 -2
  377. package/build/template/components/CodeBlockEnhancer.d.ts.map +0 -1
  378. package/build/template/components/CodeBlockEnhancer.js +0 -175
  379. package/build/template/components/CodeBlockEnhancer.js.map +0 -1
  380. package/build/template/components/DeprecationReason.js +0 -9
  381. package/build/template/components/DeprecationReason.js.map +0 -1
  382. package/build/template/components/Description.js +0 -9
  383. package/build/template/components/Description.js.map +0 -1
  384. package/build/template/components/Field.js +0 -14
  385. package/build/template/components/Field.js.map +0 -1
  386. package/build/template/components/FieldList.js.map +0 -1
  387. package/build/template/components/FieldListSection.js.map +0 -1
  388. package/build/template/components/HamburgerMenu.d.ts +0 -9
  389. package/build/template/components/HamburgerMenu.d.ts.map +0 -1
  390. package/build/template/components/HamburgerMenu.js +0 -30
  391. package/build/template/components/HamburgerMenu.js.map +0 -1
  392. package/build/template/components/Link.js.map +0 -1
  393. package/build/template/components/Logo.js +0 -20
  394. package/build/template/components/Logo.js.map +0 -1
  395. package/build/template/components/MDXComponents.d.ts +0 -11
  396. package/build/template/components/MDXComponents.d.ts.map +0 -1
  397. package/build/template/components/MDXComponents.js +0 -70
  398. package/build/template/components/MDXComponents.js.map +0 -1
  399. package/build/template/components/Markdown.js.map +0 -1
  400. package/build/template/components/MissingSchema.js +0 -5
  401. package/build/template/components/MissingSchema.js.map +0 -1
  402. package/build/template/components/NamedType.js +0 -12
  403. package/build/template/components/NamedType.js.map +0 -1
  404. package/build/template/components/NotFound.d.ts +0 -2
  405. package/build/template/components/NotFound.d.ts.map +0 -1
  406. package/build/template/components/NotFound.js +0 -7
  407. package/build/template/components/NotFound.js.map +0 -1
  408. package/build/template/components/RadixLink.js.map +0 -1
  409. package/build/template/components/TestComponent.d.ts +0 -5
  410. package/build/template/components/TestComponent.d.ts.map +0 -1
  411. package/build/template/components/TestComponent.js +0 -7
  412. package/build/template/components/TestComponent.js.map +0 -1
  413. package/build/template/components/Texts/MinorHeading.js.map +0 -1
  414. package/build/template/components/ThemeToggle.d.ts +0 -3
  415. package/build/template/components/ThemeToggle.d.ts.map +0 -1
  416. package/build/template/components/ThemeToggle.js +0 -9
  417. package/build/template/components/ThemeToggle.js.map +0 -1
  418. package/build/template/components/TypeAnnotation.js.map +0 -1
  419. package/build/template/components/TypeFieldsLinkList.js +0 -9
  420. package/build/template/components/TypeFieldsLinkList.js.map +0 -1
  421. package/build/template/components/TypeIndex.js +0 -17
  422. package/build/template/components/TypeIndex.js.map +0 -1
  423. package/build/template/components/content/$$.d.ts +0 -3
  424. package/build/template/components/content/$$.d.ts.map +0 -1
  425. package/build/template/components/content/$$.js +0 -3
  426. package/build/template/components/content/$$.js.map +0 -1
  427. package/build/template/components/content/GraphQLDocumentWithSchema.d.ts +0 -8
  428. package/build/template/components/content/GraphQLDocumentWithSchema.d.ts.map +0 -1
  429. package/build/template/components/content/GraphQLDocumentWithSchema.js +0 -13
  430. package/build/template/components/content/GraphQLDocumentWithSchema.js.map +0 -1
  431. package/build/template/components/content/GraphQLDocumentWrapper.d.ts +0 -7
  432. package/build/template/components/content/GraphQLDocumentWrapper.d.ts.map +0 -1
  433. package/build/template/components/content/GraphQLDocumentWrapper.js +0 -63
  434. package/build/template/components/content/GraphQLDocumentWrapper.js.map +0 -1
  435. package/build/template/components/graphql/graphql.js +0 -3
  436. package/build/template/components/graphql/graphql.js.map +0 -1
  437. package/build/template/components/graphql/type-kind-icon.js.map +0 -1
  438. package/build/template/components/graphql/type-link.js +0 -11
  439. package/build/template/components/graphql/type-link.js.map +0 -1
  440. package/build/template/components/sidebar/Sidebar.js +0 -11
  441. package/build/template/components/sidebar/Sidebar.js.map +0 -1
  442. package/build/template/components/sidebar/SidebarItem.js.map +0 -1
  443. package/build/template/components/sidebar/ToggleButton.js +0 -5
  444. package/build/template/components/sidebar/ToggleButton.js.map +0 -1
  445. package/build/template/contexts/ThemeContext.d.ts +0 -12
  446. package/build/template/contexts/ThemeContext.d.ts.map +0 -1
  447. package/build/template/contexts/ThemeContext.js +0 -40
  448. package/build/template/contexts/ThemeContext.js.map +0 -1
  449. package/build/template/entry.client.js.map +0 -1
  450. package/build/template/hooks/useClientOnly.d.ts +0 -9
  451. package/build/template/hooks/useClientOnly.d.ts.map +0 -1
  452. package/build/template/hooks/useClientOnly.js +0 -16
  453. package/build/template/hooks/useClientOnly.js.map +0 -1
  454. package/build/template/routes/changelog.js.map +0 -1
  455. package/build/template/routes/index.js.map +0 -1
  456. package/build/template/routes/reference.$type.$field.js.map +0 -1
  457. package/build/template/routes/reference.$type.js.map +0 -1
  458. package/build/template/routes/reference.js.map +0 -1
  459. package/build/template/routes/root.js +0 -138
  460. package/build/template/routes/root.js.map +0 -1
  461. package/build/template/routes.js +0 -5
  462. package/build/template/routes.js.map +0 -1
  463. package/build/template/server/create-page-html-response.d.ts +0 -7
  464. package/build/template/server/create-page-html-response.d.ts.map +0 -1
  465. package/build/template/server/create-page-html-response.js.map +0 -1
  466. package/build/template/server/middleware/page.d.ts +0 -4
  467. package/build/template/server/middleware/page.d.ts.map +0 -1
  468. package/build/template/server/middleware/page.js +0 -15
  469. package/build/template/server/middleware/page.js.map +0 -1
  470. package/build/template/server/middleware/unsupported-assets.d.ts +0 -10
  471. package/build/template/server/middleware/unsupported-assets.d.ts.map +0 -1
  472. package/build/template/server/middleware/unsupported-assets.js +0 -21
  473. package/build/template/server/middleware/unsupported-assets.js.map +0 -1
  474. package/build/template/styles/code-block.css +0 -218
  475. package/src/api/content/$$.ts +0 -6
  476. package/src/api/content/$.test.ts +0 -72
  477. package/src/api/content/$.ts +0 -1
  478. package/src/api/content/metadata.ts +0 -11
  479. package/src/api/content/navbar.test.ts +0 -55
  480. package/src/api/content/navbar.ts +0 -61
  481. package/src/api/content/page.ts +0 -12
  482. package/src/api/content/scan.ts +0 -117
  483. package/src/api/content/sidebar.test.ts +0 -297
  484. package/src/api/content/sidebar.ts +0 -283
  485. package/src/api/content/utils.ts +0 -7
  486. package/src/exports/components.ts +0 -4
  487. package/src/lib/graphql-document/$$.ts +0 -4
  488. package/src/lib/graphql-document/$.test.ts +0 -132
  489. package/src/lib/graphql-document/$.ts +0 -1
  490. package/src/lib/graphql-document/README.md +0 -102
  491. package/src/lib/graphql-document/analysis.ts +0 -415
  492. package/src/lib/graphql-document/components/CopyButton.tsx +0 -76
  493. package/src/lib/graphql-document/components/GraphQLDocument.tsx +0 -262
  494. package/src/lib/graphql-document/components/GraphQLDocument.unit.test.ts +0 -188
  495. package/src/lib/graphql-document/components/GraphQLDocumentWithSchema.tsx +0 -70
  496. package/src/lib/graphql-document/components/GraphQLIdentifierPopover.tsx +0 -197
  497. package/src/lib/graphql-document/components/IdentifierLink.tsx +0 -160
  498. package/src/lib/graphql-document/components/graphql-document-styles.ts +0 -167
  499. package/src/lib/graphql-document/components/index.ts +0 -5
  500. package/src/lib/graphql-document/demo.md +0 -155
  501. package/src/lib/graphql-document/example.ts +0 -163
  502. package/src/lib/graphql-document/graphql-document.ts +0 -37
  503. package/src/lib/graphql-document/hooks/use-tooltip-state.test.ts +0 -76
  504. package/src/lib/graphql-document/hooks/use-tooltip-state.ts +0 -191
  505. package/src/lib/graphql-document/positioning-simple.test.ts +0 -248
  506. package/src/lib/graphql-document/positioning-simple.ts +0 -260
  507. package/src/lib/graphql-document/schema-context.tsx +0 -20
  508. package/src/lib/graphql-document/schema-integration-example.ts +0 -341
  509. package/src/lib/graphql-document/schema-integration.test.ts +0 -365
  510. package/src/lib/graphql-document/schema-integration.ts +0 -497
  511. package/src/lib/graphql-document/types.ts +0 -129
  512. package/src/template/components/CodeBlockEnhancer.tsx +0 -192
  513. package/src/template/components/HamburgerMenu.tsx +0 -96
  514. package/src/template/components/MDXComponents.tsx +0 -101
  515. package/src/template/components/NotFound.tsx +0 -28
  516. package/src/template/components/TestComponent.tsx +0 -6
  517. package/src/template/components/ThemeToggle.tsx +0 -21
  518. package/src/template/components/content/$$.ts +0 -2
  519. package/src/template/components/content/GraphQLDocumentWithSchema.tsx +0 -13
  520. package/src/template/components/content/GraphQLDocumentWrapper.tsx +0 -89
  521. package/src/template/contexts/ThemeContext.tsx +0 -60
  522. package/src/template/hooks/useClientOnly.ts +0 -21
  523. package/src/template/server/middleware/page.ts +0 -19
  524. package/src/template/server/middleware/unsupported-assets.ts +0 -25
  525. /package/build/lib/{graphql-document → file-router/sidebar}/types.js +0 -0
@@ -13,10 +13,10 @@ export const reportDiagnostics = (diagnostics: Diagnostic[]) => {
13
13
  infos.length > 0 && `${infos.length} info${infos.length === 1 ? '' : 's'}`,
14
14
  ].filter(Boolean).join(', ')
15
15
 
16
- console.warn(`\nPolen found ${summary}:\n`)
16
+ console.warn(`\n🔍 Polen found ${summary}:\n`)
17
17
 
18
18
  diagnostics.forEach((diagnostic, index) => {
19
- const icon = diagnostic.severity === 'error' ? '' : diagnostic.severity === 'warning' ? '' : ''
19
+ const icon = diagnostic.severity === 'error' ? '' : diagnostic.severity === 'warning' ? '⚠️ ' : 'ℹ️ '
20
20
  console.warn(`${icon} ${index + 1}. ${diagnostic.message}\n`)
21
21
  })
22
22
  }
@@ -1,3 +1,5 @@
1
1
  export * from './linter.ts'
2
2
  export * from './route.ts'
3
+ export * from './scan-tree.ts'
3
4
  export * from './scan.ts'
5
+ export * from './sidebar/index.ts'
@@ -28,8 +28,6 @@ const createRoute = (path: string[], order?: number, isIndex = false): Route =>
28
28
  },
29
29
  },
30
30
  },
31
- id: `/project/pages/${path.join('/')}/${name}.md`,
32
- parentId: path.length > 1 ? `/project/pages/${path.slice(0, -1).join('/')}` : null,
33
31
  }
34
32
  }
35
33
 
@@ -36,8 +36,6 @@ export const pathToExpression = (path: Path) => {
36
36
  export interface Route {
37
37
  logical: RouteLogical
38
38
  file: RouteFile
39
- id: string // Absolute file path for unique identification
40
- parentId: string | null // Parent directory path, null for root-level files
41
39
  }
42
40
 
43
41
  export interface RouteLogical {
@@ -0,0 +1,189 @@
1
+ import { Tree } from '#lib/tree/index'
2
+ import { describe, expect, test } from 'vitest'
3
+ import type { RouteTreeNode } from './scan-tree.ts'
4
+
5
+ // Helper to create a mock route tree structure for testing
6
+ const mockRouteTree = (structure: Record<string, any>): RouteTreeNode => {
7
+ const sortNodes = (nodes: RouteTreeNode[]): RouteTreeNode[] => {
8
+ return nodes.sort((a, b) => {
9
+ // If both have orders, sort by order
10
+ if (a.value.order !== undefined && b.value.order !== undefined) {
11
+ return a.value.order - b.value.order
12
+ }
13
+ // If only one has order, it comes first
14
+ if (a.value.order !== undefined) return -1
15
+ if (b.value.order !== undefined) return 1
16
+ // Otherwise sort alphabetically
17
+ return a.value.name.localeCompare(b.value.name)
18
+ })
19
+ }
20
+
21
+ const buildNode = (name: string, value: any): RouteTreeNode => {
22
+ const parsed = name.match(/^(?<order>\d+)[_-](?<name>.+)$/)
23
+ const nodeName = parsed?.groups?.[`name`] ?? name
24
+ const order = parsed?.groups?.[`order`] ? parseInt(parsed.groups[`order`], 10) : undefined
25
+
26
+ if (typeof value === 'object' && !value.isFile) {
27
+ // Directory node
28
+ const children = Object.entries(value).map(([childName, childValue]) => buildNode(childName, childValue))
29
+ return Tree.node(
30
+ { name: nodeName, order, type: 'directory' },
31
+ sortNodes(children),
32
+ )
33
+ } else {
34
+ // File node - strip extension (but keep 'index' as is)
35
+ const nameWithoutExtension = nodeName.replace(/\.(md|mdx)$/, '')
36
+ return Tree.node({ name: nameWithoutExtension, order, type: 'file', route: value })
37
+ }
38
+ }
39
+
40
+ const children = Object.entries(structure).map(([name, value]) => buildNode(name, value))
41
+ return Tree.node(
42
+ { name: 'root', type: 'directory' },
43
+ sortNodes(children),
44
+ )
45
+ }
46
+
47
+ describe('scan-tree structure', () => {
48
+ test('builds tree from flat file structure', () => {
49
+ const tree = mockRouteTree({
50
+ 'getting-started.md': { isFile: true },
51
+ 'guide': {
52
+ 'introduction.md': { isFile: true },
53
+ 'basics.md': { isFile: true },
54
+ },
55
+ 'api': {
56
+ 'reference.md': { isFile: true },
57
+ },
58
+ })
59
+
60
+ expect(tree.value.name).toBe('root')
61
+ expect(tree.children).toHaveLength(3)
62
+
63
+ const guide = tree.children.find(c => c.value.name === 'guide')
64
+ expect(guide).toBeDefined()
65
+ expect(guide!.children).toHaveLength(2)
66
+ })
67
+
68
+ test('handles numbered prefixes on files', () => {
69
+ const tree = mockRouteTree({
70
+ '10_getting-started.md': { isFile: true },
71
+ '20_configuration.md': { isFile: true },
72
+ '30_advanced.md': { isFile: true },
73
+ })
74
+
75
+ const children = tree.children
76
+ expect(children[0]!.value).toMatchObject({ name: 'getting-started', order: 10 })
77
+ expect(children[1]!.value).toMatchObject({ name: 'configuration', order: 20 })
78
+ expect(children[2]!.value).toMatchObject({ name: 'advanced', order: 30 })
79
+ })
80
+
81
+ test('handles numbered prefixes on directories', () => {
82
+ const tree = mockRouteTree({
83
+ '10_guide': {
84
+ 'intro.md': { isFile: true },
85
+ },
86
+ '20_api': {
87
+ 'reference.md': { isFile: true },
88
+ },
89
+ '05_quickstart': {
90
+ 'index.md': { isFile: true },
91
+ },
92
+ })
93
+
94
+ const children = tree.children
95
+ expect(children[0]!.value).toMatchObject({ name: 'quickstart', order: 5 })
96
+ expect(children[1]!.value).toMatchObject({ name: 'guide', order: 10 })
97
+ expect(children[2]!.value).toMatchObject({ name: 'api', order: 20 })
98
+ })
99
+
100
+ test('handles mixed numbered and non-numbered items', () => {
101
+ const tree = mockRouteTree({
102
+ '10_guide': {
103
+ 'intro.md': { isFile: true },
104
+ },
105
+ 'troubleshooting': {
106
+ 'common.md': { isFile: true },
107
+ },
108
+ '05_quickstart': {
109
+ 'index.md': { isFile: true },
110
+ },
111
+ 'api': {
112
+ 'reference.md': { isFile: true },
113
+ },
114
+ })
115
+
116
+ // After sorting: numbered items first (5, 10), then alphabetical (api, troubleshooting)
117
+ const childNames = tree.children.map(c => c.value.name)
118
+ expect(childNames).toEqual(['quickstart', 'guide', 'api', 'troubleshooting'])
119
+ })
120
+
121
+ test('handles nested numbered prefixes', () => {
122
+ const tree = mockRouteTree({
123
+ '10_guide': {
124
+ '10_getting-started.md': { isFile: true },
125
+ '20_basics.md': { isFile: true },
126
+ 'troubleshooting.md': { isFile: true },
127
+ '05_prerequisites.md': { isFile: true },
128
+ },
129
+ })
130
+
131
+ const guide = tree.children[0]!
132
+ expect(guide.value.name).toBe('guide')
133
+
134
+ const guideChildNames = guide.children.map(c => c.value.name)
135
+ expect(guideChildNames).toEqual(['prerequisites', 'getting-started', 'basics', 'troubleshooting'])
136
+ })
137
+
138
+ test('handles index files', () => {
139
+ const tree = mockRouteTree({
140
+ 'guide': {
141
+ 'index.md': { isFile: true },
142
+ 'intro.md': { isFile: true },
143
+ },
144
+ })
145
+
146
+ const guide = tree.children[0]!
147
+ expect(guide.children).toHaveLength(2)
148
+ expect(guide.children.map(c => c.value.name)).toContain('index')
149
+ expect(guide.children.map(c => c.value.name)).toContain('intro')
150
+ })
151
+
152
+ test('creates directory nodes with correct type', () => {
153
+ const tree = mockRouteTree({
154
+ '10_guide': {
155
+ 'intro.md': { isFile: true },
156
+ },
157
+ 'api-reference.md': { isFile: true },
158
+ })
159
+
160
+ expect(tree.value.type).toBe('directory')
161
+
162
+ const guide = tree.children.find(c => c.value.name === 'guide')
163
+ expect(guide?.value.type).toBe('directory')
164
+ expect(guide?.value.order).toBe(10)
165
+
166
+ const apiRef = tree.children.find(c => c.value.name === 'api-reference')
167
+ expect(apiRef?.value.type).toBe('file')
168
+ })
169
+
170
+ test('handles file collisions with same order number - last wins', () => {
171
+ // This test simulates what would happen if the scanner processes files in order
172
+ // The mock doesn't actually test the scanner logic but documents expected behavior
173
+ const tree = mockRouteTree({
174
+ '10_about.md': { isFile: true, processedFirst: true },
175
+ '10-about.md': { isFile: true, processedLast: true }, // Same order, same logical name
176
+ })
177
+
178
+ // In the real scanner, only one 'about' node would exist
179
+ // The test structure above would result in duplicate nodes in our mock
180
+ // Document the expected behavior: last processed file should win
181
+ const aboutNodes = tree.children.filter(c => c.value.name === 'about')
182
+
183
+ // Note: This mock creates duplicates; real scanner would replace
184
+ expect(aboutNodes.length).toBeGreaterThan(0)
185
+
186
+ // Document that when orders are equal, last file processed wins
187
+ // This aligns with the linter message about "file processed later is being kept"
188
+ })
189
+ })
@@ -0,0 +1,205 @@
1
+ import { TinyGlobby } from '#dep/tiny-globby/index'
2
+ import { Tree, type TreeNode } from '#lib/tree/index'
3
+ import { Path, Str } from '@wollybeard/kit'
4
+ import type { Diagnostic } from './linter.ts'
5
+ import type { Route, RouteFile } from './route.ts'
6
+
7
+ //
8
+ // Types
9
+ //
10
+
11
+ export type RouteTreeNodeType = 'directory' | 'file'
12
+
13
+ export interface RouteTreeNodeValue {
14
+ name: string
15
+ order?: number
16
+ type: RouteTreeNodeType
17
+ route?: Route // Only present for file nodes
18
+ }
19
+
20
+ export type RouteTreeNode = TreeNode<RouteTreeNodeValue>
21
+
22
+ export interface ScanTreeResult {
23
+ routeTree: RouteTreeNode
24
+ diagnostics: Diagnostic[]
25
+ }
26
+
27
+ //
28
+ // Constants
29
+ //
30
+
31
+ const conventions = {
32
+ index: {
33
+ name: `index`,
34
+ },
35
+ numberedPrefix: {
36
+ pattern: Str.pattern<{ groups: ['order', 'name'] }>(/^(?<order>\d+)[_-](?<name>.+)$/),
37
+ },
38
+ }
39
+
40
+ //
41
+ // Helpers
42
+ //
43
+
44
+ const parseSegment = (segment: string): { name: string; order?: number } => {
45
+ const match = Str.match(segment, conventions.numberedPrefix.pattern)
46
+ if (match) {
47
+ return {
48
+ name: match.groups.name,
49
+ order: parseInt(match.groups.order, 10),
50
+ }
51
+ }
52
+ return { name: segment }
53
+ }
54
+
55
+ const buildRouteTreeFromPaths = async (paths: string[], rootDir: string): Promise<RouteTreeNode> => {
56
+ // Root node (represents the pages directory itself)
57
+ const root = Tree.node<RouteTreeNodeValue>({
58
+ name: 'root',
59
+ type: 'directory',
60
+ })
61
+
62
+ // Process each file path
63
+ for (const filePath of paths) {
64
+ const relativePath = Path.relative(rootDir, filePath)
65
+
66
+ // Split the path into segments
67
+ const segments = relativePath.split(Path.sep).filter(s => s.length > 0)
68
+ if (segments.length === 0) continue // Skip root directory
69
+
70
+ // Navigate/create path in tree
71
+ let currentNode = root
72
+
73
+ for (let i = 0; i < segments.length; i++) {
74
+ const segment = segments[i]!
75
+ const isLast = i === segments.length - 1
76
+
77
+ // Parse segment for ordering
78
+ let segmentName = segment
79
+ // Strip extension for files
80
+ if (isLast && (segment.endsWith('.md') || segment.endsWith('.mdx'))) {
81
+ segmentName = segment.replace(/\.(md|mdx)$/, '')
82
+ }
83
+ const parsed = parseSegment(segmentName)
84
+
85
+ // Find existing child
86
+ const existingChildIndex = currentNode.children.findIndex(child => child.value.name === parsed.name)
87
+ let childNode = existingChildIndex >= 0 ? currentNode.children[existingChildIndex] : undefined
88
+
89
+ if (!childNode) {
90
+ // Create new node
91
+ if (isLast) {
92
+ // This is a file
93
+ const route = filePathToRoute(filePath, rootDir)
94
+ childNode = Tree.node<RouteTreeNodeValue>({
95
+ name: parsed.name,
96
+ order: parsed.order,
97
+ type: 'file',
98
+ route,
99
+ })
100
+ } else {
101
+ // This is a directory (implicit from file path)
102
+ childNode = Tree.node<RouteTreeNodeValue>({
103
+ name: parsed.name,
104
+ order: parsed.order,
105
+ type: 'directory',
106
+ })
107
+ }
108
+ currentNode.children.push(childNode)
109
+ } else if (isLast && childNode.value.type === 'file') {
110
+ // Handle collision for files with same name
111
+ // If new file has higher or equal order, replace the existing one (last wins for ties)
112
+ if (
113
+ parsed.order !== undefined
114
+ && (childNode.value.order === undefined || parsed.order >= childNode.value.order)
115
+ ) {
116
+ const route = filePathToRoute(filePath, rootDir)
117
+ const newNode = Tree.node<RouteTreeNodeValue>({
118
+ name: parsed.name,
119
+ order: parsed.order,
120
+ type: 'file',
121
+ route,
122
+ })
123
+ currentNode.children[existingChildIndex] = newNode
124
+ childNode = newNode
125
+ }
126
+ // Otherwise keep the existing node (when existing has higher order)
127
+ }
128
+
129
+ currentNode = childNode
130
+ }
131
+ }
132
+
133
+ // Sort the tree
134
+ return sortRouteTree(root)
135
+ }
136
+
137
+ const sortRouteTree = (tree: RouteTreeNode): RouteTreeNode => {
138
+ return Tree.sort(tree, (a, b) => {
139
+ // If both have orders, sort by order
140
+ if (a.order !== undefined && b.order !== undefined) {
141
+ return a.order - b.order
142
+ }
143
+ // If only one has order, it comes first
144
+ if (a.order !== undefined) return -1
145
+ if (b.order !== undefined) return 1
146
+ // Otherwise sort alphabetically
147
+ return a.name.localeCompare(b.name)
148
+ })
149
+ }
150
+
151
+ //
152
+ // Main scan function
153
+ //
154
+
155
+ export const scanTree = async (parameters: {
156
+ dir: string
157
+ glob?: string
158
+ }): Promise<ScanTreeResult> => {
159
+ const { dir, glob = `**/*` } = parameters
160
+
161
+ // Get all files
162
+ const filePaths = await TinyGlobby.glob(glob, {
163
+ absolute: true,
164
+ cwd: dir,
165
+ onlyFiles: true,
166
+ })
167
+
168
+ // Build tree structure (directories will be created implicitly)
169
+ const routeTree = await buildRouteTreeFromPaths(filePaths, dir)
170
+
171
+ // TODO: Implement tree-based linting
172
+ const diagnostics: Diagnostic[] = []
173
+
174
+ return {
175
+ routeTree,
176
+ diagnostics,
177
+ }
178
+ }
179
+
180
+ // Reuse existing route creation logic
181
+ const filePathToRoute = (filePathExpression: string, rootDir: string): Route => {
182
+ const file: RouteFile = {
183
+ path: {
184
+ absolute: Path.parse(filePathExpression),
185
+ relative: Path.parse(Path.relative(rootDir, filePathExpression)),
186
+ },
187
+ }
188
+
189
+ const dirPath = Str.split(Str.removeSurrounding(file.path.relative.dir, Path.sep), Path.sep)
190
+
191
+ // Parse numbered prefix from filename
192
+ const prefixMatch = file.path.relative.name.match(conventions.numberedPrefix.pattern)
193
+ const order = prefixMatch?.groups?.[`order`] ? parseInt(prefixMatch.groups[`order`], 10) : undefined
194
+ const nameWithoutPrefix = prefixMatch?.groups?.[`name`] ?? file.path.relative.name
195
+
196
+ const logical = {
197
+ path: nameWithoutPrefix === conventions.index.name ? dirPath : dirPath.concat(nameWithoutPrefix),
198
+ order,
199
+ }
200
+
201
+ return {
202
+ logical,
203
+ file,
204
+ }
205
+ }
@@ -1,7 +1,9 @@
1
1
  import { TinyGlobby } from '#dep/tiny-globby/index'
2
+ import { Tree } from '#lib/tree/index'
2
3
  import { Path, Str } from '@wollybeard/kit'
3
4
  import { type Diagnostic, lint } from './linter.ts'
4
- import { type Route, type RouteFile, type RouteLogical } from './route.ts'
5
+ import { type Route, type RouteFile, type RouteLogical, routeToPathExpression } from './route.ts'
6
+ import { scanTree } from './scan-tree.ts'
5
7
 
6
8
  //
7
9
  //
@@ -45,21 +47,21 @@ export const scan = async (parameters: {
45
47
  dir: string
46
48
  glob?: string
47
49
  }): Promise<ScanResult> => {
48
- const { dir, glob = `**/*.{md,mdx}` } = parameters
49
-
50
- // Get all files directly
51
- const filePaths = await TinyGlobby.glob(glob, {
52
- absolute: true,
53
- cwd: dir,
54
- onlyFiles: true,
50
+ // Use tree-based scanner
51
+ const treeResult = await scanTree(parameters)
52
+
53
+ // Flatten tree to get routes
54
+ const routes: Route[] = []
55
+ Tree.visit(treeResult.routeTree, (node) => {
56
+ if (node.value.type === 'file' && node.value.route) {
57
+ routes.push(node.value.route)
58
+ }
55
59
  })
56
60
 
57
- // Convert to routes
58
- const routes = filePaths.map(filePath => filePathToRoute(filePath, dir))
59
-
60
61
  // Apply linting
61
62
  const lintResult = lint(routes)
62
63
 
64
+ // Routes are already sorted by the tree structure
63
65
  return lintResult
64
66
  }
65
67
 
@@ -72,28 +74,14 @@ export const filePathToRoute = (filePathExpression: string, rootDir: string): Ro
72
74
  }
73
75
  const logical = filePathToRouteLogical(file.path.relative)
74
76
 
75
- // Generate id and parentId for tree building
76
- const id = filePathExpression // Use absolute path as unique ID
77
- const relativePath = Path.relative(rootDir, filePathExpression)
78
- const parentDir = Path.dirname(relativePath)
79
- const parentId = parentDir === '.' ? null : Path.join(rootDir, parentDir)
80
-
81
77
  return {
82
78
  logical,
83
79
  file,
84
- id,
85
- parentId,
86
80
  }
87
81
  }
88
82
 
89
83
  export const filePathToRouteLogical = (filePath: Path.Parsed): RouteLogical => {
90
- const dirSegments = Str.split(Str.removeSurrounding(filePath.dir, Path.sep), Path.sep)
91
-
92
- // Parse numbered prefixes from directory segments
93
- const dirPath = dirSegments.map(segment => {
94
- const prefixMatch = Str.match(segment, conventions.numberedPrefix.pattern)
95
- return prefixMatch?.groups.name ?? segment
96
- })
84
+ const dirPath = Str.split(Str.removeSurrounding(filePath.dir, Path.sep), Path.sep)
97
85
 
98
86
  // Parse numbered prefix from filename
99
87
  const prefixMatch = Str.match(filePath.name, conventions.numberedPrefix.pattern)
@@ -0,0 +1,3 @@
1
+ export * as SidebarTree from './sidebar-tree.ts'
2
+ // Re-export SidebarTree as Sidebar for backward compatibility
3
+ export * as Sidebar from './sidebar-tree.ts'
@@ -0,0 +1,123 @@
1
+ import { Tree } from '#lib/tree/index'
2
+ import { describe, expect, test } from 'vitest'
3
+ import type { RouteTreeNode, RouteTreeNodeValue } from '../scan-tree.ts'
4
+ import { buildFromTree } from './sidebar-tree.ts'
5
+
6
+ // Helper to create mock routes
7
+ const mockRoute = (path: string[]) => ({
8
+ logical: { path },
9
+ file: {
10
+ path: {
11
+ absolute: { root: '/', dir: '/', base: 'file.md', ext: '.md', name: 'file' },
12
+ relative: { root: '', dir: '', base: 'file.md', ext: '.md', name: 'file' },
13
+ },
14
+ },
15
+ })
16
+
17
+ // Helper to create file node
18
+ const fileNode = (name: string, route: any): RouteTreeNode =>
19
+ Tree.node<RouteTreeNodeValue>({ name, type: 'file', route })
20
+
21
+ // Helper to create directory node
22
+ const dirNode = (name: string, children: RouteTreeNode[] = []): RouteTreeNode =>
23
+ Tree.node<RouteTreeNodeValue>({ name, type: 'directory' }, children)
24
+
25
+ describe('sidebar-tree', () => {
26
+ test('builds sidebar from simple tree', () => {
27
+ const tree = dirNode('root', [
28
+ fileNode('getting-started', mockRoute(['getting-started'])),
29
+ dirNode('guide', [
30
+ fileNode('introduction', mockRoute(['guide', 'introduction'])),
31
+ fileNode('basics', mockRoute(['guide', 'basics'])),
32
+ ]),
33
+ ])
34
+
35
+ const sidebar = buildFromTree(tree, [])
36
+
37
+ expect(sidebar.items).toHaveLength(2)
38
+ expect(sidebar.items[0]).toMatchObject({
39
+ type: 'ItemLink',
40
+ pathExp: 'getting-started',
41
+ title: 'Getting Started',
42
+ })
43
+ const section = sidebar.items[1]
44
+ expect(section).toBeDefined()
45
+ expect(section!.type).toBe('ItemSection')
46
+ if (section!.type === 'ItemSection') {
47
+ expect(section).toMatchObject({
48
+ type: 'ItemSection',
49
+ title: 'Guide',
50
+ pathExp: 'guide',
51
+ isLinkToo: false,
52
+ })
53
+ expect(section!.links).toHaveLength(2)
54
+ }
55
+ })
56
+
57
+ test('handles index files correctly', () => {
58
+ const tree = dirNode('root', [
59
+ dirNode('guide', [
60
+ fileNode('index', mockRoute(['guide'])),
61
+ fileNode('introduction', mockRoute(['guide', 'introduction'])),
62
+ ]),
63
+ ])
64
+
65
+ const sidebar = buildFromTree(tree, [])
66
+
67
+ expect(sidebar.items).toHaveLength(1)
68
+ const section = sidebar.items[0]
69
+ expect(section).toBeDefined()
70
+ expect(section!.type).toBe('ItemSection')
71
+ if (section!.type === 'ItemSection') {
72
+ expect(section).toMatchObject({
73
+ type: 'ItemSection',
74
+ title: 'Guide',
75
+ pathExp: 'guide',
76
+ isLinkToo: true, // Should be true because of index file
77
+ })
78
+ expect(section!.links).toHaveLength(1) // Only introduction, not index
79
+ }
80
+ })
81
+
82
+ test('respects node ordering from tree', () => {
83
+ const tree = dirNode('root', [
84
+ Tree.node<RouteTreeNodeValue>({ name: 'quickstart', order: 5, type: 'file', route: mockRoute(['quickstart']) }),
85
+ Tree.node<RouteTreeNodeValue>({ name: 'guide', order: 10, type: 'file', route: mockRoute(['guide']) }),
86
+ fileNode('api', mockRoute(['api'])),
87
+ fileNode('troubleshooting', mockRoute(['troubleshooting'])),
88
+ ])
89
+
90
+ const sidebar = buildFromTree(tree, [])
91
+
92
+ // Tree should already be sorted, so sidebar should maintain that order
93
+ const titles = sidebar.items.map(item => item.title)
94
+ expect(titles).toEqual(['Quickstart', 'Guide', 'Api', 'Troubleshooting'])
95
+ })
96
+
97
+ test('handles nested directories', () => {
98
+ const tree = dirNode('root', [
99
+ dirNode('guide', [
100
+ fileNode('intro', mockRoute(['guide', 'intro'])),
101
+ dirNode('advanced', [
102
+ fileNode('performance', mockRoute(['guide', 'advanced', 'performance'])),
103
+ fileNode('optimization', mockRoute(['guide', 'advanced', 'optimization'])),
104
+ ]),
105
+ ]),
106
+ ])
107
+
108
+ const sidebar = buildFromTree(tree, [])
109
+
110
+ expect(sidebar.items).toHaveLength(1)
111
+ const guideSection = sidebar.items[0]
112
+ expect(guideSection).toBeDefined()
113
+ expect(guideSection!.type).toBe('ItemSection')
114
+ if (guideSection!.type === 'ItemSection') {
115
+ expect(guideSection!.links).toHaveLength(3) // intro + 2 from advanced subdirectory
116
+
117
+ const navTitles = guideSection!.links.map(nav => nav.title)
118
+ expect(navTitles).toContain('Intro')
119
+ expect(navTitles).toContain('Performance')
120
+ expect(navTitles).toContain('Optimization')
121
+ }
122
+ })
123
+ })