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
@@ -0,0 +1,110 @@
1
+ import { Tree } from '#lib/tree/index'
2
+ import { Str } from '@wollybeard/kit'
3
+ import * as FileRouter from '../file-router.ts'
4
+ import type { RouteTreeNode } from '../scan-tree.ts'
5
+ import type { ItemLink, ItemSection, Sidebar } from './types.ts'
6
+
7
+ export * from './types.ts'
8
+
9
+ /**
10
+ * Build sidebar from tree structure
11
+ */
12
+ export const buildFromTree = (routeTree: RouteTreeNode, basePath: FileRouter.Path): Sidebar => {
13
+ const links: ItemLink[] = []
14
+ const sections: ItemSection[] = []
15
+
16
+ // Process only the children of the root node
17
+ for (const child of routeTree.children) {
18
+ processNode(child, basePath, [], links, sections)
19
+ }
20
+
21
+ const items = [...links, ...sections]
22
+
23
+ return {
24
+ items,
25
+ }
26
+ }
27
+
28
+ const processNode = (
29
+ node: RouteTreeNode,
30
+ basePath: FileRouter.Path,
31
+ parentPath: string[],
32
+ links: ItemLink[],
33
+ sections: ItemSection[],
34
+ ): void => {
35
+ const currentPath = [...parentPath, node.value.name]
36
+
37
+ if (node.value.type === 'directory') {
38
+ // This is a directory - create a section
39
+ const sectionPath = [...basePath, ...currentPath]
40
+ const sectionPathExp = FileRouter.pathToExpression(sectionPath)
41
+ const sectionTitle = Str.titlizeSlug(node.value.name)
42
+
43
+ const section: ItemSection = {
44
+ type: `ItemSection`,
45
+ title: sectionTitle,
46
+ pathExp: sectionPathExp.startsWith('/') ? sectionPathExp.slice(1) : sectionPathExp,
47
+ isLinkToo: false,
48
+ links: [],
49
+ }
50
+
51
+ // Check if this directory has an index file
52
+ const indexChild = node.children.find(child => child.value.type === 'file' && child.value.name === 'index')
53
+ if (indexChild) {
54
+ section.isLinkToo = true
55
+ }
56
+
57
+ // Process all non-index children as links for this section
58
+ for (const child of node.children) {
59
+ if (child.value.type === 'file' && child.value.name !== 'index' && child.value.route) {
60
+ // Pass the parent path of the route, not the section path
61
+ const routeParentPath = child.value.route.logical.path.slice(0, -1)
62
+ section.links.push(routeToItemLink(child.value.route, routeParentPath))
63
+ } else if (child.value.type === 'directory') {
64
+ // Recursively process subdirectories
65
+ // Note: This creates nested sections which the original implementation doesn't support
66
+ // For now, we'll just add the files from subdirectories to the parent section
67
+ collectFilesFromDirectory(child, child.value.route?.logical.path || [], section.links)
68
+ }
69
+ }
70
+
71
+ sections.push(section)
72
+ } else if (node.value.type === 'file' && node.value.route) {
73
+ // This is a top-level file - add as nav
74
+ if (node.value.name !== 'index') {
75
+ links.push(routeToItemLink(node.value.route, basePath))
76
+ }
77
+ }
78
+ }
79
+
80
+ const collectFilesFromDirectory = (
81
+ node: RouteTreeNode,
82
+ basePath: FileRouter.Path,
83
+ links: ItemLink[],
84
+ ): void => {
85
+ Tree.visit(node, (n) => {
86
+ if (n.value.type === 'file' && n.value.route && n.value.name !== 'index') {
87
+ // Use the route's parent path for relative title generation
88
+ const routeParentPath = n.value.route.logical.path.slice(0, -1)
89
+ links.push(routeToItemLink(n.value.route, routeParentPath))
90
+ }
91
+ })
92
+ }
93
+
94
+ const routeToItemLink = (route: FileRouter.Route, basePath: FileRouter.Path): ItemLink => {
95
+ const pagePathExp = FileRouter.routeToPathExpression(route)
96
+ const pageRelative = FileRouter.makeRelativeUnsafe(route, basePath)
97
+ const pageRelativePathExp = FileRouter.routeToPathExpression(pageRelative)
98
+
99
+ // Remove leading slash for title generation
100
+ const titlePath = pageRelativePathExp.startsWith('/') ? pageRelativePathExp.slice(1) : pageRelativePathExp
101
+
102
+ // Use only the last segment for the title
103
+ const titleSegment = pageRelative.logical.path[pageRelative.logical.path.length - 1] || titlePath
104
+
105
+ return {
106
+ type: `ItemLink`,
107
+ pathExp: pagePathExp.startsWith('/') ? pagePathExp.slice(1) : pagePathExp,
108
+ title: Str.titlizeSlug(titleSegment),
109
+ }
110
+ }
@@ -0,0 +1,19 @@
1
+ export interface Sidebar {
2
+ items: Item[]
3
+ }
4
+
5
+ export type Item = ItemLink | ItemSection
6
+
7
+ export interface ItemLink {
8
+ type: `ItemLink`
9
+ title: string
10
+ pathExp: string
11
+ }
12
+
13
+ export interface ItemSection {
14
+ type: `ItemSection`
15
+ title: string
16
+ pathExp: string
17
+ isLinkToo: boolean
18
+ links: ItemLink[]
19
+ }
@@ -61,7 +61,7 @@ describe('property-based tests', () => {
61
61
  test('objPolicyFilter allow/deny are complementary', () => {
62
62
  fc.assert(
63
63
  fc.property(
64
- fc.object(),
64
+ fc.dictionary(fc.string(), fc.anything()),
65
65
  fc.array(fc.string()),
66
66
  (obj, keys) => {
67
67
  const allowed = objPolicyFilter('allow', obj, keys)
@@ -74,13 +74,8 @@ describe('property-based tests', () => {
74
74
  expect(inAllowed).toBe(!inDenied)
75
75
  })
76
76
 
77
- // Combined they reconstruct the original object (only own properties)
78
- const reconstructed = { ...allowed, ...denied }
79
- const ownPropsObj = Object.keys(obj).reduce((acc, key) => {
80
- acc[key] = obj[key]
81
- return acc
82
- }, {} as any)
83
- expect(reconstructed).toEqual(ownPropsObj)
77
+ // Combined they reconstruct the original object
78
+ expect({ ...allowed, ...denied }).toEqual(obj)
84
79
  },
85
80
  ),
86
81
  )
@@ -89,17 +84,10 @@ describe('property-based tests', () => {
89
84
  test('objFilter preserves values unchanged', () => {
90
85
  fc.assert(
91
86
  fc.property(
92
- fc.object(),
87
+ fc.dictionary(fc.string(), fc.anything()),
93
88
  (obj) => {
94
89
  const filtered = objFilter(obj, () => true)
95
-
96
- // Object.keys doesn't include __proto__, so we need to handle it specially
97
- const objWithoutProto = Object.keys(obj).reduce((acc, key) => {
98
- acc[key] = obj[key]
99
- return acc
100
- }, {} as any)
101
-
102
- expect(filtered).toEqual(objWithoutProto)
90
+ expect(filtered).toEqual(obj)
103
91
 
104
92
  // Values are the same reference
105
93
  Object.keys(filtered).forEach(key => {
@@ -113,7 +101,7 @@ describe('property-based tests', () => {
113
101
  test('objPolicyFilter is immutable', () => {
114
102
  fc.assert(
115
103
  fc.property(
116
- fc.object(),
104
+ fc.dictionary(fc.string(), fc.anything()),
117
105
  fc.array(fc.string()),
118
106
  fc.oneof(fc.constant('allow' as const), fc.constant('deny' as const)),
119
107
  (obj, keys, mode) => {
@@ -128,7 +116,7 @@ describe('property-based tests', () => {
128
116
  test('empty keys behavior', () => {
129
117
  fc.assert(
130
118
  fc.property(
131
- fc.object(),
119
+ fc.dictionary(fc.string(), fc.anything()),
132
120
  (obj) => {
133
121
  expect(objPolicyFilter('allow', obj, [])).toEqual({})
134
122
  expect(objPolicyFilter('deny', obj, [])).toEqual(obj)
@@ -12,8 +12,10 @@
12
12
  //
13
13
  //
14
14
 
15
- import { Arr, Err, Fs, Http, Path, Undefined } from '@wollybeard/kit'
15
+ import { Arr, Err, Fs, Http, Path, type Ts, Undefined } from '@wollybeard/kit'
16
+ import { never } from '@wollybeard/kit/language'
16
17
  import type { ResolveHookContext } from 'node:module'
18
+ import type { IsNever } from 'type-fest'
17
19
 
18
20
  export const arrayEquals = (a: any[], b: any[]) => {
19
21
  if (a.length !== b.length) return false
@@ -107,7 +109,7 @@ export const objPolicyFilter = <
107
109
  if (mode === 'allow') {
108
110
  // For allow mode, only add specified keys
109
111
  for (const key of keys) {
110
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
112
+ if (key in obj) {
111
113
  // @ts-expect-error
112
114
  result[key] = obj[key]
113
115
  }
@@ -141,9 +143,7 @@ export const objFilter = <T extends object>(
141
143
  predicate: (key: keyof T, value: T[keyof T], obj: T) => boolean,
142
144
  ): Partial<T> => {
143
145
  const result = {} as Partial<T>
144
- // Use Object.keys to get all enumerable own properties
145
- // This matches the behavior of for...in but only for own properties
146
- for (const key of Object.keys(obj) as (keyof T)[]) {
146
+ for (const key in obj) {
147
147
  if (predicate(key, obj[key], obj)) {
148
148
  result[key] = obj[key]
149
149
  }
@@ -218,305 +218,3 @@ export type ExtendsExact<$Input, $Constraint> =
218
218
  ? $Input
219
219
  : never
220
220
  : never
221
-
222
- /**
223
- * Split an array into chunks of specified size
224
- *
225
- * @param array - The array to chunk
226
- * @param size - The size of each chunk
227
- * @returns Array of chunks
228
- *
229
- * @example
230
- * ```ts
231
- * chunk([1, 2, 3, 4, 5], 2) // [[1, 2], [3, 4], [5]]
232
- * chunk(['a', 'b', 'c'], 3) // [['a', 'b', 'c']]
233
- * ```
234
- */
235
- export const chunk = <T>(array: readonly T[], size: number): T[][] => {
236
- if (size <= 0) throw new Error('Chunk size must be greater than 0')
237
- if (array.length === 0) return []
238
-
239
- const chunks: T[][] = []
240
- for (let i = 0; i < array.length; i += size) {
241
- chunks.push(array.slice(i, i + size))
242
- }
243
- return chunks
244
- }
245
-
246
- export interface AsyncParallelOptions {
247
- /**
248
- * Maximum number of items to process concurrently
249
- * @default 10
250
- */
251
- concurrency?: number
252
-
253
- /**
254
- * If true, stops processing on first error
255
- * If false, continues processing all items even if some fail
256
- * @default false
257
- */
258
- failFast?: boolean
259
-
260
- /**
261
- * Size of batches to process items in
262
- * If not specified, all items are processed with the specified concurrency
263
- */
264
- batchSize?: number
265
- }
266
-
267
- export interface AsyncParallelResult<T, R> {
268
- /** Successfully processed results */
269
- results: R[]
270
- /** Errors that occurred during processing */
271
- errors: (Error & { item: T })[]
272
- /** Whether all items were processed successfully */
273
- success: boolean
274
- }
275
-
276
- /**
277
- * Process items in parallel with configurable options
278
- *
279
- * @param items - Items to process
280
- * @param operation - Async function to apply to each item (with optional index)
281
- * @param options - Configuration options
282
- * @returns Results and errors from processing
283
- *
284
- * @example
285
- * ```ts
286
- * const items = [1, 2, 3, 4, 5]
287
- * const result = await asyncParallel(items, async (n, index) => n * 2, {
288
- * concurrency: 2,
289
- * batchSize: 3,
290
- * failFast: false
291
- * })
292
- * // result.results: [2, 4, 6, 8, 10]
293
- * // result.errors: []
294
- * // result.success: true
295
- * ```
296
- */
297
- export const asyncParallel = async <T, R>(
298
- items: readonly T[],
299
- operation: (item: T, index: number) => Promise<R>,
300
- options: AsyncParallelOptions = {},
301
- ): Promise<AsyncParallelResult<T, R>> => {
302
- const { concurrency = 10, failFast = false, batchSize } = options
303
-
304
- if (items.length === 0) {
305
- return { results: [], errors: [], success: true }
306
- }
307
-
308
- const allResults: R[] = []
309
- const allErrors: (Error & { item: T })[] = []
310
-
311
- // If batchSize is specified, process in batches
312
- if (batchSize !== undefined) {
313
- const batches = chunk(items, batchSize)
314
- let globalIndex = 0
315
-
316
- for (const batch of batches) {
317
- const batchResult = await processBatch(batch, operation, concurrency, failFast, globalIndex)
318
- allResults.push(...batchResult.results)
319
- allErrors.push(...batchResult.errors)
320
- globalIndex += batch.length
321
-
322
- if (failFast && batchResult.errors.length > 0) {
323
- break
324
- }
325
- }
326
- } else {
327
- // Process all items with specified concurrency
328
- const result = await processBatch(items, operation, concurrency, failFast, 0)
329
- allResults.push(...result.results)
330
- allErrors.push(...result.errors)
331
- }
332
-
333
- return {
334
- results: allResults,
335
- errors: allErrors,
336
- success: allErrors.length === 0,
337
- }
338
- }
339
-
340
- /**
341
- * Process a batch of items with limited concurrency
342
- */
343
- const processBatch = async <T, R>(
344
- items: readonly T[],
345
- operation: (item: T, index: number) => Promise<R>,
346
- concurrency: number,
347
- failFast: boolean,
348
- startIndex: number = 0,
349
- ): Promise<AsyncParallelResult<T, R>> => {
350
- const results: R[] = []
351
- const errors: (Error & { item: T })[] = []
352
-
353
- // Process items in chunks based on concurrency limit
354
- const chunks = chunk(items, concurrency)
355
- let currentIndex = startIndex
356
-
357
- for (const chunkItems of chunks) {
358
- const promises = chunkItems.map(async (item, chunkIndex) => {
359
- const globalIndex = currentIndex + chunkIndex
360
- try {
361
- const result = await operation(item, globalIndex)
362
- return { success: true, result, item }
363
- } catch (error) {
364
- const enhancedError = error instanceof Error ? error : new Error(String(error))
365
- Object.assign(enhancedError, { item })
366
- return { success: false, error: enhancedError as Error & { item: T }, item }
367
- }
368
- })
369
-
370
- currentIndex += chunkItems.length
371
-
372
- const chunkResults = await Promise.allSettled(promises)
373
-
374
- for (const promiseResult of chunkResults) {
375
- if (promiseResult.status === 'fulfilled') {
376
- const { success, result, error, item } = promiseResult.value
377
- if (success) {
378
- results.push(result!)
379
- } else {
380
- errors.push(error!)
381
- if (failFast) {
382
- return { results, errors, success: false }
383
- }
384
- }
385
- } else {
386
- // This shouldn't happen since we're catching errors above
387
- // But handle it just in case
388
- const error = new Error('Unexpected promise rejection') as Error & { item: any }
389
- errors.push(error)
390
- if (failFast) {
391
- return { results, errors, success: false }
392
- }
393
- }
394
- }
395
- }
396
-
397
- return { results, errors, success: errors.length === 0 }
398
- }
399
-
400
- // /**
401
- // * Reduce an array asynchronously, processing each item in sequence
402
- // *
403
- // * @param items - Array of items to process
404
- // * @param reducer - Async function that takes accumulator and current item
405
- // * @param initial - Initial value for the accumulator
406
- // * @returns Final accumulated value
407
- // *
408
- // * @example
409
- // * ```ts
410
- // * const numbers = [1, 2, 3, 4]
411
- // * const sum = await asyncReduce(numbers, async (acc, n) => acc + n, 0)
412
- // * // sum: 10
413
- // *
414
- // * const transforms = [addHeader, addFooter, minify]
415
- // * const html = await asyncReduce(transforms, async (html, transform) => transform(html), initialHtml)
416
- // * ```
417
- // */
418
- // export const asyncReduce = async <T, R>(
419
- // items: readonly T[],
420
- // reducer: (accumulator: R, current: T, index: number) => Promise<R> | R,
421
- // initial: R,
422
- // ): Promise<R> => {
423
- // let result = initial
424
- // for (let i = 0; i < items.length; i++) {
425
- // const item = items[i]!
426
- // result = await reducer(result, item, i)
427
- // }
428
- // return result
429
- // }
430
-
431
- // /**
432
- // * Curried version of asyncReduce for functions that transform a value
433
- // *
434
- // * @param transformers - Array of transformer functions
435
- // * @returns A function that takes an initial value and applies all transformers
436
- // *
437
- // * @example
438
- // * ```ts
439
- // * const transformers = [addHeader, addFooter, minify]
440
- // * const applyTransforms = asyncReduceWith(transformers)
441
- // * const finalHtml = await applyTransforms(initialHtml)
442
- // *
443
- // * // For simple pipelines where each function transforms the same type
444
- // * const htmlPipeline = asyncReduceWith([
445
- // * (html) => html.replace('foo', 'bar'),
446
- // * async (html) => await prettify(html),
447
- // * (html) => html.trim()
448
- // * ])
449
- // * ```
450
- // */
451
- // export const asyncReduceWith = <T>(
452
- // transformers: readonly ((value: T) => Promise<T> | T)[],
453
- // ) => {
454
- // return async (initial: T): Promise<T> => {
455
- // return asyncReduce(transformers, (value, transform) => transform(value), initial)
456
- // }
457
- // }
458
-
459
- /**
460
- * Reduce an array asynchronously with context, processing each item in sequence
461
- *
462
- * @param items - Array of items to process
463
- * @param reducer - Async function that takes accumulator, current item, and context
464
- * @param initial - Initial value for the accumulator
465
- * @param context - Context object passed to each reducer call
466
- * @returns Final accumulated value
467
- *
468
- * @example
469
- * ```ts
470
- * const transformers = [transformer1, transformer2]
471
- * const ctx = { request: req, response: res }
472
- * const result = await asyncReduceWithContext(
473
- * transformers,
474
- * async (html, transformer) => transformer(html, ctx),
475
- * initialHtml,
476
- * ctx
477
- * )
478
- * ```
479
- */
480
- export const asyncReduce = async <T, R, C>(
481
- items: readonly T[],
482
- reducer: (accumulator: R, current: T, context: C, index: number) => Promise<R> | R,
483
- initial: R,
484
- context: C,
485
- ): Promise<R> => {
486
- let result = initial
487
- for (let i = 0; i < items.length; i++) {
488
- const item = items[i]!
489
- result = await reducer(result, item, context, i)
490
- }
491
- return result
492
- }
493
-
494
- /**
495
- * Curried version of asyncReduceWithContext for functions that transform a value with context
496
- *
497
- * @param transformers - Array of transformer functions that take value and context
498
- * @returns A function that takes an initial value and context, and applies all transformers
499
- *
500
- * @example
501
- * ```ts
502
- * const transformers = [
503
- * (html, ctx) => html.replace('{{url}}', ctx.req.url),
504
- * async (html, ctx) => await ctx.minify(html),
505
- * ]
506
- * const applyTransforms = asyncReduceWithContextWith(transformers)
507
- * const finalHtml = await applyTransforms(initialHtml, ctx)
508
- * ```
509
- */
510
- export const asyncReduceWith = <T, C>(
511
- transformers: readonly ((value: T, context: C) => Promise<T> | T)[],
512
- context: C,
513
- ) => {
514
- return async (initial: T): Promise<T> => {
515
- return asyncReduce(
516
- transformers,
517
- (value, transform, ctx) => transform(value, ctx),
518
- initial,
519
- context,
520
- )
521
- }
522
- }
@@ -137,10 +137,10 @@ describe('runAndExit', () => {
137
137
  const double = async (x: number) => x * 2
138
138
 
139
139
  await expect(() => Task.runAndExit(double, 5, { name: 'double' })).rejects.toThrow('process.exit called')
140
-
140
+
141
141
  expect(mockExit).toHaveBeenCalledWith(0)
142
142
  expect(mockLog).toHaveBeenCalled()
143
-
143
+
144
144
  // Verify the logged output contains expected content
145
145
  const loggedOutput = mockLog.mock.calls[0]?.[0]
146
146
  expect(loggedOutput).toContain('double')
@@ -161,7 +161,7 @@ describe('runAndExit', () => {
161
161
  }
162
162
 
163
163
  await expect(() => Task.runAndExit(failing, null, { name: 'failing' })).rejects.toThrow('process.exit called')
164
-
164
+
165
165
  expect(mockExit).toHaveBeenCalledWith(1)
166
166
  expect(mockLog).toHaveBeenCalled()
167
167
 
@@ -0,0 +1,2 @@
1
+ export * as Tree from './tree.ts'
2
+ export type { TreeMapper, TreeNode, TreePredicate, TreeVisitor } from './tree.ts'
@@ -0,0 +1,117 @@
1
+ import { describe, expect, test } from 'vitest'
2
+ import * as Tree from './tree.ts'
3
+
4
+ describe('Tree', () => {
5
+ const sampleTree = Tree.node('root', [
6
+ Tree.node('a', [
7
+ Tree.node('a1'),
8
+ Tree.node('a2'),
9
+ ]),
10
+ Tree.node('b', [
11
+ Tree.node('b1'),
12
+ ]),
13
+ Tree.node('c'),
14
+ ])
15
+
16
+ test('node creates a tree node', () => {
17
+ const leaf = Tree.node('leaf')
18
+ expect(leaf).toEqual({ value: 'leaf', children: [] })
19
+
20
+ const parent = Tree.node('parent', [leaf])
21
+ expect(parent).toEqual({ value: 'parent', children: [leaf] })
22
+ })
23
+
24
+ test('map transforms node values', () => {
25
+ const upperTree = Tree.map(sampleTree, value => value.toUpperCase())
26
+
27
+ expect(upperTree.value).toBe('ROOT')
28
+ expect(upperTree.children[0]!.value).toBe('A')
29
+ expect(upperTree.children[0]!.children[0]!.value).toBe('A1')
30
+ })
31
+
32
+ test('map provides depth and path', () => {
33
+ const depths: number[] = []
34
+ const paths: string[][] = []
35
+
36
+ Tree.map(sampleTree, (value, depth, path) => {
37
+ depths.push(depth)
38
+ paths.push(path)
39
+ return value
40
+ })
41
+
42
+ expect(depths).toEqual([0, 1, 2, 2, 1, 2, 1])
43
+ expect(paths[0]).toEqual([])
44
+ expect(paths[1]).toEqual(['root'])
45
+ expect(paths[2]).toEqual(['root', 'a'])
46
+ })
47
+
48
+ test('visit traverses all nodes', () => {
49
+ const visited: string[] = []
50
+ Tree.visit(sampleTree, node => visited.push(node.value))
51
+
52
+ expect(visited).toEqual(['root', 'a', 'a1', 'a2', 'b', 'b1', 'c'])
53
+ })
54
+
55
+ test('find locates node', () => {
56
+ const found = Tree.find(sampleTree, value => value === 'b1')
57
+ expect(found?.value).toBe('b1')
58
+
59
+ const notFound = Tree.find(sampleTree, value => value === 'x')
60
+ expect(notFound).toBeUndefined()
61
+ })
62
+
63
+ test('filter removes non-matching nodes', () => {
64
+ const filtered = Tree.filter(sampleTree, value => !value.includes('2'))
65
+
66
+ expect(filtered).toBeDefined()
67
+ expect(Tree.flatten(filtered!)).toEqual(['root', 'a', 'a1', 'b', 'b1', 'c'])
68
+ })
69
+
70
+ test('sort orders children', () => {
71
+ const sorted = Tree.sort(sampleTree, (a, b) => b.localeCompare(a))
72
+
73
+ expect(sorted.children.map(c => c.value)).toEqual(['c', 'b', 'a'])
74
+ expect(sorted.children[2]!.children.map(c => c.value)).toEqual(['a2', 'a1'])
75
+ })
76
+
77
+ test('flatten returns all values', () => {
78
+ const flat = Tree.flatten(sampleTree)
79
+ expect(flat).toEqual(['root', 'a', 'a1', 'a2', 'b', 'b1', 'c'])
80
+ })
81
+
82
+ test('depth calculates tree depth', () => {
83
+ expect(Tree.depth(Tree.node('single'))).toBe(0)
84
+ expect(Tree.depth(sampleTree)).toBe(2)
85
+ })
86
+
87
+ test('count counts all nodes', () => {
88
+ expect(Tree.count(Tree.node('single'))).toBe(1)
89
+ expect(Tree.count(sampleTree)).toBe(7)
90
+ })
91
+
92
+ test('isLeaf identifies leaf nodes', () => {
93
+ expect(Tree.isLeaf(sampleTree)).toBe(false)
94
+ expect(Tree.isLeaf(sampleTree.children[0]!)).toBe(false)
95
+ expect(Tree.isLeaf(sampleTree.children[0]!.children[0]!)).toBe(true)
96
+ })
97
+
98
+ test('leaves gets all leaf nodes', () => {
99
+ const leafNodes = Tree.leaves(sampleTree)
100
+ expect(leafNodes.map(n => n.value)).toEqual(['a1', 'a2', 'b1', 'c'])
101
+ })
102
+
103
+ test('fromList builds tree from flat list', () => {
104
+ const items = [
105
+ { id: '1', name: 'root' },
106
+ { id: '2', parentId: '1', name: 'child1' },
107
+ { id: '3', parentId: '1', name: 'child2' },
108
+ { id: '4', parentId: '2', name: 'grandchild' },
109
+ ]
110
+
111
+ const trees = Tree.fromList(items, undefined)
112
+ expect(trees).toHaveLength(1)
113
+ expect(trees[0]!.value.name).toBe('root')
114
+ expect(trees[0]!.children).toHaveLength(2)
115
+ expect(trees[0]!.children[0]!.children[0]!.value.name).toBe('grandchild')
116
+ })
117
+ })