cursedbelt 1.0.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/dist/client/index.js +1 -1
  2. package/dist/core/category/index.d.ts.map +1 -1
  3. package/dist/core/category/index.js +2 -1
  4. package/dist/core/category/index.js.map +1 -1
  5. package/dist/core/category/types.js +1 -1
  6. package/dist/core/category/types.js.map +1 -1
  7. package/dist/core/file-tree/fileTreeModel.d.ts +49 -0
  8. package/dist/core/file-tree/fileTreeModel.d.ts.map +1 -1
  9. package/dist/core/file-tree/fileTreeModel.js +84 -0
  10. package/dist/core/file-tree/fileTreeModel.js.map +1 -1
  11. package/dist/core/layout/index.js +1 -1
  12. package/dist/core/layout/index.js.map +1 -1
  13. package/dist/core/media/index.js +1 -1
  14. package/dist/core/media/index.js.map +1 -1
  15. package/dist/core/media/types.js +1 -1
  16. package/dist/core/media/types.js.map +1 -1
  17. package/dist/core/media/uploadLimits.js +1 -1
  18. package/dist/core/media/uploadLimits.js.map +1 -1
  19. package/dist/core/sharing/model.d.ts +1 -1
  20. package/dist/ctgr/index.js +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/react/activity-bar/ActivityBar.d.ts +17 -0
  24. package/dist/react/activity-bar/ActivityBar.d.ts.map +1 -1
  25. package/dist/react/activity-bar/ActivityBar.js.map +1 -1
  26. package/dist/react/analytics/index.d.ts +1 -1
  27. package/dist/react/analytics/index.js +1 -1
  28. package/dist/react/chat/MessageComposer.d.ts.map +1 -1
  29. package/dist/react/chat/MessageComposer.js +5 -4
  30. package/dist/react/chat/MessageComposer.js.map +1 -1
  31. package/dist/react/components/Button.d.ts.map +1 -1
  32. package/dist/react/components/Button.js +3 -2
  33. package/dist/react/components/Button.js.map +1 -1
  34. package/dist/react/components/Checkbox.d.ts +19 -3
  35. package/dist/react/components/Checkbox.d.ts.map +1 -1
  36. package/dist/react/components/Checkbox.js +29 -12
  37. package/dist/react/components/Checkbox.js.map +1 -1
  38. package/dist/react/components/CodeArea.d.ts.map +1 -1
  39. package/dist/react/components/CodeArea.js +2 -1
  40. package/dist/react/components/CodeArea.js.map +1 -1
  41. package/dist/react/components/Collapsible.d.ts.map +1 -1
  42. package/dist/react/components/Collapsible.js +2 -1
  43. package/dist/react/components/Collapsible.js.map +1 -1
  44. package/dist/react/components/ComboboxField.d.ts.map +1 -1
  45. package/dist/react/components/ComboboxField.js +3 -2
  46. package/dist/react/components/ComboboxField.js.map +1 -1
  47. package/dist/react/components/CopyButton.d.ts.map +1 -1
  48. package/dist/react/components/CopyButton.js +2 -1
  49. package/dist/react/components/CopyButton.js.map +1 -1
  50. package/dist/react/components/DataTable/ColumnChecklist.d.ts.map +1 -1
  51. package/dist/react/components/DataTable/ColumnChecklist.js +2 -1
  52. package/dist/react/components/DataTable/ColumnChecklist.js.map +1 -1
  53. package/dist/react/components/DataTable/Pagination.d.ts.map +1 -1
  54. package/dist/react/components/DataTable/Pagination.js +2 -1
  55. package/dist/react/components/DataTable/Pagination.js.map +1 -1
  56. package/dist/react/components/DataTable/SortHeader.d.ts.map +1 -1
  57. package/dist/react/components/DataTable/SortHeader.js +2 -1
  58. package/dist/react/components/DataTable/SortHeader.js.map +1 -1
  59. package/dist/react/components/DataTable/TableFilterBuilder.d.ts +61 -0
  60. package/dist/react/components/DataTable/TableFilterBuilder.d.ts.map +1 -0
  61. package/dist/react/components/DataTable/{FilterBuilder.js → TableFilterBuilder.js} +26 -3
  62. package/dist/react/components/DataTable/TableFilterBuilder.js.map +1 -0
  63. package/dist/react/components/DataTable/Toolbar.d.ts +1 -1
  64. package/dist/react/components/DataTable/Toolbar.js +3 -3
  65. package/dist/react/components/DataTable/Toolbar.js.map +1 -1
  66. package/dist/react/components/DataTable/cells/LinkCell.d.ts.map +1 -1
  67. package/dist/react/components/DataTable/cells/LinkCell.js +2 -1
  68. package/dist/react/components/DataTable/cells/LinkCell.js.map +1 -1
  69. package/dist/react/components/DataTable/index.d.ts +1 -1
  70. package/dist/react/components/DataTable/index.d.ts.map +1 -1
  71. package/dist/react/components/DataTable/index.js +4 -1
  72. package/dist/react/components/DataTable/index.js.map +1 -1
  73. package/dist/react/components/DragHandle.d.ts.map +1 -1
  74. package/dist/react/components/DragHandle.js +2 -1
  75. package/dist/react/components/DragHandle.js.map +1 -1
  76. package/dist/react/components/EmojiField.d.ts.map +1 -1
  77. package/dist/react/components/EmojiField.js +2 -1
  78. package/dist/react/components/EmojiField.js.map +1 -1
  79. package/dist/react/components/EventTimeline.d.ts +3 -2
  80. package/dist/react/components/EventTimeline.d.ts.map +1 -1
  81. package/dist/react/components/EventTimeline.js +3 -2
  82. package/dist/react/components/EventTimeline.js.map +1 -1
  83. package/dist/react/components/IconButton.d.ts +1 -1
  84. package/dist/react/components/IconButton.js +1 -1
  85. package/dist/react/components/InfoHint.d.ts.map +1 -1
  86. package/dist/react/components/InfoHint.js +5 -4
  87. package/dist/react/components/InfoHint.js.map +1 -1
  88. package/dist/react/components/InheritBadge.js +1 -1
  89. package/dist/react/components/InheritBadge.js.map +1 -1
  90. package/dist/react/components/InlineEditableText.d.ts.map +1 -1
  91. package/dist/react/components/InlineEditableText.js +2 -1
  92. package/dist/react/components/InlineEditableText.js.map +1 -1
  93. package/dist/react/components/MeterList.d.ts.map +1 -1
  94. package/dist/react/components/MeterList.js +2 -1
  95. package/dist/react/components/MeterList.js.map +1 -1
  96. package/dist/react/components/PathText.d.ts +2 -2
  97. package/dist/react/components/PathText.d.ts.map +1 -1
  98. package/dist/react/components/PathText.js +2 -1
  99. package/dist/react/components/PathText.js.map +1 -1
  100. package/dist/react/components/RatingField.d.ts.map +1 -1
  101. package/dist/react/components/RatingField.js +2 -1
  102. package/dist/react/components/RatingField.js.map +1 -1
  103. package/dist/react/components/SecretInput.js +3 -2
  104. package/dist/react/components/SecretInput.js.map +1 -1
  105. package/dist/react/components/SegmentedControl.d.ts.map +1 -1
  106. package/dist/react/components/SegmentedControl.js +2 -1
  107. package/dist/react/components/SegmentedControl.js.map +1 -1
  108. package/dist/react/components/StarRating.d.ts.map +1 -1
  109. package/dist/react/components/StarRating.js +9 -5
  110. package/dist/react/components/StarRating.js.map +1 -1
  111. package/dist/react/components/StatStrip.d.ts.map +1 -1
  112. package/dist/react/components/StatStrip.js +2 -1
  113. package/dist/react/components/StatStrip.js.map +1 -1
  114. package/dist/react/components/StatTile.d.ts.map +1 -1
  115. package/dist/react/components/StatTile.js +3 -2
  116. package/dist/react/components/StatTile.js.map +1 -1
  117. package/dist/react/components/Tabs.d.ts.map +1 -1
  118. package/dist/react/components/Tabs.js +2 -1
  119. package/dist/react/components/Tabs.js.map +1 -1
  120. package/dist/react/components/TruncatedText.d.ts +2 -1
  121. package/dist/react/components/TruncatedText.d.ts.map +1 -1
  122. package/dist/react/components/TruncatedText.js +2 -1
  123. package/dist/react/components/TruncatedText.js.map +1 -1
  124. package/dist/react/components/calendar/MonthGrid.d.ts.map +1 -1
  125. package/dist/react/components/calendar/MonthGrid.js +2 -1
  126. package/dist/react/components/calendar/MonthGrid.js.map +1 -1
  127. package/dist/react/components/calendar/WeekView.d.ts.map +1 -1
  128. package/dist/react/components/calendar/WeekView.js +2 -1
  129. package/dist/react/components/calendar/WeekView.js.map +1 -1
  130. package/dist/react/components/revealOnHover.d.ts.map +1 -1
  131. package/dist/react/components/revealOnHover.js +2 -1
  132. package/dist/react/components/revealOnHover.js.map +1 -1
  133. package/dist/react/file-tree/FileTree.d.ts +50 -1
  134. package/dist/react/file-tree/FileTree.d.ts.map +1 -1
  135. package/dist/react/file-tree/FileTree.js +234 -6
  136. package/dist/react/file-tree/FileTree.js.map +1 -1
  137. package/dist/react/file-tree/fileTree.css +52 -0
  138. package/dist/react/filter-rail/FilterRail.d.ts.map +1 -1
  139. package/dist/react/filter-rail/FilterRail.js +5 -4
  140. package/dist/react/filter-rail/FilterRail.js.map +1 -1
  141. package/dist/react/folder-tree/FolderTreeRail.d.ts.map +1 -1
  142. package/dist/react/folder-tree/FolderTreeRail.js +2 -1
  143. package/dist/react/folder-tree/FolderTreeRail.js.map +1 -1
  144. package/dist/react/index.d.ts +5 -1
  145. package/dist/react/index.d.ts.map +1 -1
  146. package/dist/react/index.js +5 -1
  147. package/dist/react/index.js.map +1 -1
  148. package/dist/react/layoutEngine/index.js +1 -1
  149. package/dist/react/layoutEngine/index.js.map +1 -1
  150. package/dist/react/lib/field.d.ts.map +1 -1
  151. package/dist/react/lib/field.js +3 -2
  152. package/dist/react/lib/field.js.map +1 -1
  153. package/dist/react/lib/floatingStyles.d.ts.map +1 -1
  154. package/dist/react/lib/floatingStyles.js +2 -1
  155. package/dist/react/lib/floatingStyles.js.map +1 -1
  156. package/dist/react/lib/tapTarget.d.ts +96 -0
  157. package/dist/react/lib/tapTarget.d.ts.map +1 -0
  158. package/dist/react/lib/tapTarget.js +96 -0
  159. package/dist/react/lib/tapTarget.js.map +1 -0
  160. package/dist/react/media/VideoTrimmer.d.ts +1 -1
  161. package/dist/react/media/VideoTrimmer.js +1 -1
  162. package/dist/react/media/denseGallery.css +3 -3
  163. package/dist/react/media/ffmpegWasm.js +2 -2
  164. package/dist/react/media/ffmpegWasm.js.map +1 -1
  165. package/dist/react/media/videoPlayer.css +42 -0
  166. package/dist/react/namespace/NamespaceTargetCapsule.d.ts +2 -2
  167. package/dist/react/namespace/NamespaceTargetCapsule.d.ts.map +1 -1
  168. package/dist/react/nav/BreadcrumbTrail.d.ts.map +1 -1
  169. package/dist/react/nav/BreadcrumbTrail.js +4 -3
  170. package/dist/react/nav/BreadcrumbTrail.js.map +1 -1
  171. package/dist/react/nav/HubTileGrid.d.ts.map +1 -1
  172. package/dist/react/nav/HubTileGrid.js +2 -1
  173. package/dist/react/nav/HubTileGrid.js.map +1 -1
  174. package/dist/react/nav/SideNav.d.ts.map +1 -1
  175. package/dist/react/nav/SideNav.js +4 -3
  176. package/dist/react/nav/SideNav.js.map +1 -1
  177. package/dist/react/nav/SideNavCustomize.d.ts.map +1 -1
  178. package/dist/react/nav/SideNavCustomize.js +2 -1
  179. package/dist/react/nav/SideNavCustomize.js.map +1 -1
  180. package/dist/react/palette/CommandPalette.d.ts.map +1 -1
  181. package/dist/react/palette/CommandPalette.js +3 -2
  182. package/dist/react/palette/CommandPalette.js.map +1 -1
  183. package/dist/server/drivers/pooledControlStores.pg.test.js +1 -0
  184. package/dist/server/drivers/pooledControlStores.pg.test.js.map +1 -1
  185. package/dist/server/drivers/pooledIdentityStore.pg.test.js +1 -0
  186. package/dist/server/drivers/pooledIdentityStore.pg.test.js.map +1 -1
  187. package/dist/server/drivers/retentionPolicy.pg.test.js +1 -0
  188. package/dist/server/drivers/retentionPolicy.pg.test.js.map +1 -1
  189. package/dist/server/guard/argon2Binding.d.ts +1 -1
  190. package/dist/server/guard/argon2Binding.js +1 -1
  191. package/dist/server/incidents/store.d.ts +3 -3
  192. package/dist/server/index.js +1 -1
  193. package/dist/server/index.js.map +1 -1
  194. package/dist/server/master-lock/masterLock.d.ts +1 -1
  195. package/dist/server/media-bun/index.js +1 -1
  196. package/dist/server/media-bun/index.js.map +1 -1
  197. package/dist/server/paths/appDataHome.d.ts +20 -0
  198. package/dist/server/paths/appDataHome.d.ts.map +1 -0
  199. package/dist/server/paths/appDataHome.js +69 -0
  200. package/dist/server/paths/appDataHome.js.map +1 -0
  201. package/dist/server/retention/archive.d.ts +3 -4
  202. package/dist/server/retention/archive.d.ts.map +1 -1
  203. package/dist/server/retention/archive.js +20 -15
  204. package/dist/server/retention/archive.js.map +1 -1
  205. package/dist/server/retention/index.d.ts +1 -1
  206. package/dist/server/retention/index.js +1 -1
  207. package/dist/server/retention/policy.d.ts +2 -2
  208. package/dist/server/retention/policy.d.ts.map +1 -1
  209. package/dist/server/retention/policy.js +1 -1
  210. package/dist/server/retention/store.d.ts.map +1 -1
  211. package/dist/server/retention/store.js +27 -20
  212. package/dist/server/retention/store.js.map +1 -1
  213. package/dist/server/runtime/localHost.d.ts +10 -5
  214. package/dist/server/runtime/localHost.d.ts.map +1 -1
  215. package/dist/server/runtime/localHost.js +12 -8
  216. package/dist/server/runtime/localHost.js.map +1 -1
  217. package/dist/server/runtime/meterRollup.pg.test.js +1 -0
  218. package/dist/server/runtime/meterRollup.pg.test.js.map +1 -1
  219. package/dist/server/runtime/recipe.d.ts +4 -4
  220. package/dist/server/runtime/retentionJob.pg.test.js +1 -0
  221. package/dist/server/runtime/retentionJob.pg.test.js.map +1 -1
  222. package/dist/server/search/pgSearchProvider.pg.test.js +1 -0
  223. package/dist/server/search/pgSearchProvider.pg.test.js.map +1 -1
  224. package/dist/shared/errors.d.ts +1 -1
  225. package/dist/shared/errors.js +1 -1
  226. package/dist/styles-static.css +391 -0
  227. package/dist/styles.css +27 -0
  228. package/package.json +19 -167
  229. package/scripts/generateStaticStyles.ts +122 -0
  230. package/scripts/publicSurface.ts +455 -0
  231. package/scripts/testTmpRoot.ts +34 -5
  232. package/src/client/index.ts +1 -1
  233. package/src/core/category/index.ts +2 -1
  234. package/src/core/category/types.ts +1 -1
  235. package/src/core/file-tree/fileTreeModel.spec.ts +134 -0
  236. package/src/core/file-tree/fileTreeModel.ts +104 -0
  237. package/src/core/layout/index.ts +1 -1
  238. package/src/core/media/index.ts +1 -1
  239. package/src/core/media/types.ts +1 -1
  240. package/src/core/media/uploadLimits.ts +1 -1
  241. package/src/core/sharing/model.ts +1 -1
  242. package/src/ctgr/index.ts +1 -1
  243. package/src/declaredDepsAreImported.spec.ts +87 -0
  244. package/src/demoFixture.spec.ts +133 -0
  245. package/src/index.ts +1 -1
  246. package/src/lockfileIsTracked.spec.ts +50 -0
  247. package/src/namedSubpathsResolve.spec.ts +119 -0
  248. package/src/publicSurface.spec.ts +72 -0
  249. package/src/react/activity-bar/ActivityBar.tsx +17 -0
  250. package/src/react/analytics/index.ts +1 -1
  251. package/src/react/chat/MessageComposer.tsx +5 -4
  252. package/src/react/components/Button.tsx +3 -2
  253. package/src/react/components/Checkbox.spec.tsx +51 -0
  254. package/src/react/components/Checkbox.tsx +68 -26
  255. package/src/react/components/CodeArea.tsx +2 -1
  256. package/src/react/components/CodeChip.spec.tsx +2 -2
  257. package/src/react/components/Collapsible.tsx +2 -1
  258. package/src/react/components/ComboboxField.tsx +3 -2
  259. package/src/react/components/CopyButton.tsx +2 -1
  260. package/src/react/components/CopyableText.spec.tsx +1 -1
  261. package/src/react/components/DataTable/ColumnChecklist.tsx +2 -1
  262. package/src/react/components/DataTable/Pagination.tsx +2 -1
  263. package/src/react/components/DataTable/SortHeader.tsx +2 -1
  264. package/src/react/components/DataTable/{FilterBuilder.tsx → TableFilterBuilder.tsx} +33 -5
  265. package/src/react/components/DataTable/Toolbar.tsx +3 -3
  266. package/src/react/components/DataTable/cells/LinkCell.tsx +2 -1
  267. package/src/react/components/DataTable/index.ts +8 -1
  268. package/src/react/components/DragHandle.tsx +2 -1
  269. package/src/react/components/EmojiField.tsx +2 -1
  270. package/src/react/components/EventTimeline.tsx +3 -2
  271. package/src/react/components/FileLocation.spec.tsx +1 -1
  272. package/src/react/components/IconButton.tsx +1 -1
  273. package/src/react/components/InfoHint.tsx +5 -4
  274. package/src/react/components/InheritBadge.tsx +1 -1
  275. package/src/react/components/InlineEditableText.tsx +2 -1
  276. package/src/react/components/MeterList.tsx +2 -1
  277. package/src/react/components/PathText.tsx +4 -3
  278. package/src/react/components/RatingField.tsx +2 -1
  279. package/src/react/components/SecretInput.tsx +3 -3
  280. package/src/react/components/SegmentedControl.tsx +2 -2
  281. package/src/react/components/StarRating.spec.tsx +2 -2
  282. package/src/react/components/StarRating.tsx +9 -5
  283. package/src/react/components/StatStrip.tsx +2 -1
  284. package/src/react/components/StatTile.tsx +3 -3
  285. package/src/react/components/Tabs.spec.tsx +3 -2
  286. package/src/react/components/Tabs.tsx +2 -1
  287. package/src/react/components/TruncatedText.tsx +2 -1
  288. package/src/react/components/calendar/MonthGrid.spec.tsx +2 -1
  289. package/src/react/components/calendar/MonthGrid.tsx +2 -1
  290. package/src/react/components/calendar/WeekView.tsx +2 -1
  291. package/src/react/components/revealOnHover.ts +3 -2
  292. package/src/react/file-tree/FileTree.spec.tsx +248 -0
  293. package/src/react/file-tree/FileTree.tsx +304 -4
  294. package/src/react/file-tree/fileTree.css +52 -0
  295. package/src/react/file-tree/fileTreeGeometry.fixture.json +151 -0
  296. package/src/react/file-tree/fileTreeGeometry.spec.ts +33 -52
  297. package/src/react/filter-rail/FilterRail.spec.tsx +2 -1
  298. package/src/react/filter-rail/FilterRail.tsx +5 -4
  299. package/src/react/folder-tree/FolderTreeRail.tsx +2 -1
  300. package/src/react/index.ts +13 -3
  301. package/src/react/layoutEngine/index.ts +1 -1
  302. package/src/react/layoutEngine/types.ts +1 -1
  303. package/src/react/lib/field.ts +4 -2
  304. package/src/react/lib/floatingStyles.spec.ts +2 -1
  305. package/src/react/lib/floatingStyles.ts +3 -1
  306. package/src/react/lib/tapTarget.ts +100 -0
  307. package/src/react/media/MaskPainter.tsx +2 -2
  308. package/src/react/media/VideoTrimmer.tsx +1 -1
  309. package/src/react/media/denseGallery.css +3 -3
  310. package/src/react/media/ffmpegWasm.ts +2 -2
  311. package/src/react/media/videoPlayer.css +42 -0
  312. package/src/react/namespace/NamespaceTargetCapsule.tsx +2 -2
  313. package/src/react/nav/BreadcrumbTrail.tsx +4 -3
  314. package/src/react/nav/HubTileGrid.tsx +2 -1
  315. package/src/react/nav/SideNav.tsx +4 -3
  316. package/src/react/nav/SideNavCustomize.tsx +2 -1
  317. package/src/react/palette/CommandPalette.tsx +3 -2
  318. package/src/server/ctgr.ts +1 -1
  319. package/src/server/drivers/pooledControlStores.pg.test.ts +1 -0
  320. package/src/server/drivers/pooledIdentityStore.pg.test.ts +1 -0
  321. package/src/server/drivers/retentionPolicy.pg.test.ts +1 -0
  322. package/src/server/guard/argon2Binding.ts +1 -1
  323. package/src/server/incidents/store.ts +3 -3
  324. package/src/server/index.ts +1 -1
  325. package/src/server/master-lock/masterLock.spec.ts +18 -2
  326. package/src/server/master-lock/masterLock.ts +1 -1
  327. package/src/server/media-bun/image.spec.ts +1 -0
  328. package/src/server/media-bun/index.ts +1 -1
  329. package/src/server/media-bun/video.spec.ts +1 -0
  330. package/src/server/paths/appDataHome.spec.ts +87 -0
  331. package/src/server/paths/appDataHome.ts +84 -0
  332. package/src/server/retention/archive.spec.ts +26 -4
  333. package/src/server/retention/archive.ts +20 -15
  334. package/src/server/retention/index.ts +1 -1
  335. package/src/server/retention/policy.ts +2 -2
  336. package/src/server/retention/store.spec.ts +38 -10
  337. package/src/server/retention/store.ts +26 -19
  338. package/src/server/runtime/localHost.spec.ts +22 -3
  339. package/src/server/runtime/localHost.ts +12 -9
  340. package/src/server/runtime/meterRollup.pg.test.ts +1 -0
  341. package/src/server/runtime/recipe.ts +4 -4
  342. package/src/server/runtime/retentionJob.pg.test.ts +1 -0
  343. package/src/server/search/pgSearchProvider.pg.test.ts +1 -0
  344. package/src/server/storage/binaryServerProcessing.integration.spec.ts +6 -2
  345. package/src/server/storage/chunked.integration.spec.ts +5 -2
  346. package/src/server/storage/fileUploadClient-chunked.integration.spec.ts +5 -2
  347. package/src/server/storage/files/adapter.photo.display.spec.ts +1 -0
  348. package/src/server/storage/imageThumbnail.spec.ts +1 -0
  349. package/src/server/storage/transcode.integration.spec.ts +5 -2
  350. package/src/server/storage/videoProcessor.posterOnly.spec.ts +1 -0
  351. package/src/shared/errors.ts +1 -1
  352. package/src/skippedTestsAreAnswered.spec.ts +215 -0
  353. package/src/styles-static.css +391 -0
  354. package/src/styles.css +27 -0
  355. package/src/stylesStaticMatches.spec.ts +134 -0
  356. package/src/tapTargetStylesheet.spec.ts +150 -0
  357. package/src/testTmpRoot.spec.ts +102 -0
  358. package/dist/core/duplicates/index.d.ts +0 -116
  359. package/dist/core/duplicates/index.d.ts.map +0 -1
  360. package/dist/core/duplicates/index.js +0 -178
  361. package/dist/core/duplicates/index.js.map +0 -1
  362. package/dist/core/namespace/helpers.d.ts +0 -14
  363. package/dist/core/namespace/helpers.d.ts.map +0 -1
  364. package/dist/core/namespace/helpers.js +0 -29
  365. package/dist/core/namespace/helpers.js.map +0 -1
  366. package/dist/core/namespace/index.d.ts +0 -4
  367. package/dist/core/namespace/index.d.ts.map +0 -1
  368. package/dist/core/namespace/index.js +0 -6
  369. package/dist/core/namespace/index.js.map +0 -1
  370. package/dist/core/namespace/memoryStore.d.ts +0 -19
  371. package/dist/core/namespace/memoryStore.d.ts.map +0 -1
  372. package/dist/core/namespace/memoryStore.js +0 -70
  373. package/dist/core/namespace/memoryStore.js.map +0 -1
  374. package/dist/core/namespace/types.d.ts +0 -44
  375. package/dist/core/namespace/types.d.ts.map +0 -1
  376. package/dist/core/namespace/types.js +0 -8
  377. package/dist/core/namespace/types.js.map +0 -1
  378. package/dist/game/core/DisposeRegistry.d.ts +0 -42
  379. package/dist/game/core/DisposeRegistry.d.ts.map +0 -1
  380. package/dist/game/core/DisposeRegistry.js +0 -67
  381. package/dist/game/core/DisposeRegistry.js.map +0 -1
  382. package/dist/game/core/drawBudget.d.ts +0 -26
  383. package/dist/game/core/drawBudget.d.ts.map +0 -1
  384. package/dist/game/core/drawBudget.js +0 -55
  385. package/dist/game/core/drawBudget.js.map +0 -1
  386. package/dist/game/core/fixedTimestep.d.ts +0 -38
  387. package/dist/game/core/fixedTimestep.d.ts.map +0 -1
  388. package/dist/game/core/fixedTimestep.js +0 -47
  389. package/dist/game/core/fixedTimestep.js.map +0 -1
  390. package/dist/game/core/index.d.ts +0 -9
  391. package/dist/game/core/index.d.ts.map +0 -1
  392. package/dist/game/core/index.js +0 -8
  393. package/dist/game/core/index.js.map +0 -1
  394. package/dist/game/core/inputCollector.d.ts +0 -82
  395. package/dist/game/core/inputCollector.d.ts.map +0 -1
  396. package/dist/game/core/inputCollector.js +0 -176
  397. package/dist/game/core/inputCollector.js.map +0 -1
  398. package/dist/game/core/resizeCanvas.d.ts +0 -19
  399. package/dist/game/core/resizeCanvas.d.ts.map +0 -1
  400. package/dist/game/core/resizeCanvas.js +0 -29
  401. package/dist/game/core/resizeCanvas.js.map +0 -1
  402. package/dist/game/react/index.d.ts +0 -3
  403. package/dist/game/react/index.d.ts.map +0 -1
  404. package/dist/game/react/index.js +0 -5
  405. package/dist/game/react/index.js.map +0 -1
  406. package/dist/game/react/useGameEngine.d.ts +0 -64
  407. package/dist/game/react/useGameEngine.d.ts.map +0 -1
  408. package/dist/game/react/useGameEngine.js +0 -78
  409. package/dist/game/react/useGameEngine.js.map +0 -1
  410. package/dist/react/canvas/CanvasNavHUD.d.ts +0 -64
  411. package/dist/react/canvas/CanvasNavHUD.d.ts.map +0 -1
  412. package/dist/react/canvas/CanvasNavHUD.js +0 -58
  413. package/dist/react/canvas/CanvasNavHUD.js.map +0 -1
  414. package/dist/react/canvas/fitLabel.d.ts +0 -53
  415. package/dist/react/canvas/fitLabel.d.ts.map +0 -1
  416. package/dist/react/canvas/fitLabel.js +0 -104
  417. package/dist/react/canvas/fitLabel.js.map +0 -1
  418. package/dist/react/canvas/index.d.ts +0 -4
  419. package/dist/react/canvas/index.d.ts.map +0 -1
  420. package/dist/react/canvas/index.js +0 -4
  421. package/dist/react/canvas/index.js.map +0 -1
  422. package/dist/react/canvas/lod.d.ts +0 -40
  423. package/dist/react/canvas/lod.d.ts.map +0 -1
  424. package/dist/react/canvas/lod.js +0 -37
  425. package/dist/react/canvas/lod.js.map +0 -1
  426. package/dist/react/components/DataTable/FilterBuilder.d.ts +0 -38
  427. package/dist/react/components/DataTable/FilterBuilder.d.ts.map +0 -1
  428. package/dist/react/components/DataTable/FilterBuilder.js.map +0 -1
  429. package/dist/react/seo/HeadProvider.d.ts +0 -14
  430. package/dist/react/seo/HeadProvider.d.ts.map +0 -1
  431. package/dist/react/seo/HeadProvider.js +0 -44
  432. package/dist/react/seo/HeadProvider.js.map +0 -1
  433. package/dist/react/seo/applyHeadToDocument.d.ts +0 -3
  434. package/dist/react/seo/applyHeadToDocument.d.ts.map +0 -1
  435. package/dist/react/seo/applyHeadToDocument.js +0 -66
  436. package/dist/react/seo/applyHeadToDocument.js.map +0 -1
  437. package/dist/react/seo/index.d.ts +0 -3
  438. package/dist/react/seo/index.d.ts.map +0 -1
  439. package/dist/react/seo/index.js +0 -7
  440. package/dist/react/seo/index.js.map +0 -1
  441. package/dist/react/timeline/ClipView.d.ts +0 -29
  442. package/dist/react/timeline/ClipView.d.ts.map +0 -1
  443. package/dist/react/timeline/ClipView.js +0 -53
  444. package/dist/react/timeline/ClipView.js.map +0 -1
  445. package/dist/react/timeline/Playhead.d.ts +0 -16
  446. package/dist/react/timeline/Playhead.d.ts.map +0 -1
  447. package/dist/react/timeline/Playhead.js +0 -26
  448. package/dist/react/timeline/Playhead.js.map +0 -1
  449. package/dist/react/timeline/TimeRuler.d.ts +0 -21
  450. package/dist/react/timeline/TimeRuler.d.ts.map +0 -1
  451. package/dist/react/timeline/TimeRuler.js +0 -31
  452. package/dist/react/timeline/TimeRuler.js.map +0 -1
  453. package/dist/react/timeline/TimelineSurface.d.ts +0 -29
  454. package/dist/react/timeline/TimelineSurface.d.ts.map +0 -1
  455. package/dist/react/timeline/TimelineSurface.js +0 -56
  456. package/dist/react/timeline/TimelineSurface.js.map +0 -1
  457. package/dist/react/timeline/TrackLane.d.ts +0 -31
  458. package/dist/react/timeline/TrackLane.d.ts.map +0 -1
  459. package/dist/react/timeline/TrackLane.js +0 -32
  460. package/dist/react/timeline/TrackLane.js.map +0 -1
  461. package/dist/react/timeline/index.d.ts +0 -6
  462. package/dist/react/timeline/index.d.ts.map +0 -1
  463. package/dist/react/timeline/index.js +0 -12
  464. package/dist/react/timeline/index.js.map +0 -1
  465. package/dist/server/private-media/index.d.ts +0 -7
  466. package/dist/server/private-media/index.d.ts.map +0 -1
  467. package/dist/server/private-media/index.js +0 -13
  468. package/dist/server/private-media/index.js.map +0 -1
  469. package/dist/server/seo/index.d.ts +0 -3
  470. package/dist/server/seo/index.d.ts.map +0 -1
  471. package/dist/server/seo/index.js +0 -6
  472. package/dist/server/seo/index.js.map +0 -1
  473. package/dist/server/seo/mountSeoRoutes.d.ts +0 -9
  474. package/dist/server/seo/mountSeoRoutes.d.ts.map +0 -1
  475. package/dist/server/seo/mountSeoRoutes.js +0 -19
  476. package/dist/server/seo/mountSeoRoutes.js.map +0 -1
  477. package/dist/server/seo/serveHeadInjectedIndex.d.ts +0 -9
  478. package/dist/server/seo/serveHeadInjectedIndex.d.ts.map +0 -1
  479. package/dist/server/seo/serveHeadInjectedIndex.js +0 -20
  480. package/dist/server/seo/serveHeadInjectedIndex.js.map +0 -1
  481. package/dist/upload.d.ts +0 -148
  482. package/dist/upload.d.ts.map +0 -1
  483. package/dist/upload.js +0 -159
  484. package/dist/upload.js.map +0 -1
  485. package/dist/verify/runtime/index.d.ts +0 -16
  486. package/dist/verify/runtime/index.d.ts.map +0 -1
  487. package/dist/verify/runtime/index.js +0 -16
  488. package/dist/verify/runtime/index.js.map +0 -1
  489. package/scripts/demoCheck.ts +0 -42
  490. package/src/core/duplicates/index.spec.ts +0 -116
  491. package/src/core/duplicates/index.ts +0 -203
  492. package/src/core/namespace/helpers.ts +0 -31
  493. package/src/core/namespace/index.ts +0 -12
  494. package/src/core/namespace/memoryStore.ts +0 -77
  495. package/src/core/namespace/namespace.spec.ts +0 -117
  496. package/src/core/namespace/types.ts +0 -53
  497. package/src/game/core/DisposeRegistry.spec.ts +0 -53
  498. package/src/game/core/DisposeRegistry.ts +0 -70
  499. package/src/game/core/drawBudget.spec.ts +0 -51
  500. package/src/game/core/drawBudget.ts +0 -75
  501. package/src/game/core/fixedTimestep.spec.ts +0 -91
  502. package/src/game/core/fixedTimestep.ts +0 -79
  503. package/src/game/core/index.ts +0 -16
  504. package/src/game/core/inputCollector.spec.ts +0 -29
  505. package/src/game/core/inputCollector.ts +0 -245
  506. package/src/game/core/resizeCanvas.ts +0 -31
  507. package/src/game/react/index.ts +0 -10
  508. package/src/game/react/useGameEngine.ts +0 -125
  509. package/src/react/canvas/CanvasNavHUD.spec.tsx +0 -62
  510. package/src/react/canvas/CanvasNavHUD.tsx +0 -210
  511. package/src/react/canvas/fitLabel.spec.ts +0 -82
  512. package/src/react/canvas/fitLabel.ts +0 -150
  513. package/src/react/canvas/index.ts +0 -15
  514. package/src/react/canvas/lod.ts +0 -53
  515. package/src/react/seo/HeadProvider.tsx +0 -67
  516. package/src/react/seo/applyHeadToDocument.ts +0 -73
  517. package/src/react/seo/index.ts +0 -12
  518. package/src/react/seo/seo.spec.tsx +0 -101
  519. package/src/react/timeline/ClipView.tsx +0 -146
  520. package/src/react/timeline/Playhead.tsx +0 -63
  521. package/src/react/timeline/TimeRuler.tsx +0 -85
  522. package/src/react/timeline/TimelineSurface.tsx +0 -157
  523. package/src/react/timeline/TrackLane.tsx +0 -87
  524. package/src/react/timeline/index.ts +0 -12
  525. package/src/react/timeline/timeline.spec.tsx +0 -175
  526. package/src/server/private-media/index.ts +0 -45
  527. package/src/server/seo/index.ts +0 -8
  528. package/src/server/seo/mountSeoRoutes.ts +0 -37
  529. package/src/server/seo/seo.spec.ts +0 -128
  530. package/src/server/seo/serveHeadInjectedIndex.ts +0 -36
  531. package/src/upload.spec.ts +0 -300
  532. package/src/upload.ts +0 -288
  533. package/src/verify/runtime/index.ts +0 -64
@@ -1,175 +0,0 @@
1
- import { afterEach, describe, expect, test } from 'bun:test';
2
- import { cleanup, createEvent, fireEvent, render } from '@testing-library/react';
3
- import type { TimelineClip, TimelineTrack } from 'cwip/timeline';
4
- import { ClipView } from './ClipView';
5
- import { TimelineSurface } from './TimelineSurface';
6
- import { TimeRuler } from './TimeRuler';
7
- import { TrackLane } from './TrackLane';
8
-
9
- afterEach(cleanup);
10
-
11
- const clip = (partial: Partial<TimelineClip> & { id: string }): TimelineClip => ({
12
- name: partial.id,
13
- sourceAssetId: 'a1',
14
- trackIn: 0,
15
- trackOut: 10,
16
- timelineStart: 0,
17
- timelineEnd: 10,
18
- speed: 1,
19
- volume: 1,
20
- ...partial,
21
- });
22
-
23
- const track = (
24
- id: string,
25
- clips: TimelineClip[] = [],
26
- type: 'video' | 'audio' = 'video',
27
- ): TimelineTrack => ({
28
- id,
29
- name: id,
30
- type,
31
- clips,
32
- });
33
-
34
- const noopClipHandlers = {
35
- onSelect: () => {},
36
- onMovePreview: () => {},
37
- onMoveCommit: () => {},
38
- onTrimPreview: () => {},
39
- onTrimCommit: () => {},
40
- };
41
-
42
- describe('ClipView', () => {
43
- test('positions by timeline seconds × zoom and shows name + source window', () => {
44
- const c = clip({ id: 'intro', timelineStart: 2, timelineEnd: 6, trackIn: 1, trackOut: 5 });
45
- const { getByRole, getByText } = render(
46
- <ClipView clip={c} zoomScale={25} selected={false} {...noopClipHandlers} />,
47
- );
48
- const block = getByRole('button', { name: 'Clip intro' });
49
- expect(block.style.left).toBe('50px');
50
- expect(block.style.width).toBe('98px'); // 100px minus the 2px seam
51
- expect(getByText('intro')).toBeDefined();
52
- expect(getByText('0:01–0:05')).toBeDefined();
53
- });
54
-
55
- test('click selects (and stops at the clip, not the lane behind)', () => {
56
- let selected = 0;
57
- let laneClicks = 0;
58
- const { getByRole } = render(
59
- <TrackLane
60
- track={track('v1')}
61
- zoomScale={25}
62
- durationSeconds={20}
63
- onRunwayClick={() => {
64
- laneClicks += 1;
65
- }}
66
- >
67
- <ClipView
68
- clip={clip({ id: 'c1' })}
69
- zoomScale={25}
70
- selected={false}
71
- {...noopClipHandlers}
72
- onSelect={() => {
73
- selected += 1;
74
- }}
75
- />
76
- </TrackLane>,
77
- );
78
- fireEvent.click(getByRole('button', { name: 'Clip c1' }));
79
- expect(selected).toBe(1);
80
- expect(laneClicks).toBe(0);
81
- });
82
-
83
- test('shows a speed badge only when speed ≠ 1', () => {
84
- const { queryByText, rerender } = render(
85
- <ClipView clip={clip({ id: 'c1' })} zoomScale={25} selected={false} {...noopClipHandlers} />,
86
- );
87
- expect(queryByText('1x')).toBeNull();
88
- rerender(
89
- <ClipView
90
- clip={clip({ id: 'c1', speed: 2, timelineEnd: 5 })}
91
- zoomScale={25}
92
- selected={false}
93
- {...noopClipHandlers}
94
- />,
95
- );
96
- expect(queryByText('2x')).toBeDefined();
97
- });
98
- });
99
-
100
- describe('TimeRuler', () => {
101
- test('thins tick labels as zoom drops', () => {
102
- const dense = render(<TimeRuler durationSeconds={10} zoomScale={100} onScrub={() => {}} />);
103
- // 100 px/s → 1s ticks: 0..10 = 11 labels
104
- expect(dense.container.querySelectorAll('span').length).toBe(11);
105
- dense.unmount();
106
- const sparse = render(<TimeRuler durationSeconds={10} zoomScale={10} onScrub={() => {}} />);
107
- // 10 px/s → 10s ticks: 0, 10
108
- expect(sparse.container.querySelectorAll('span').length).toBe(2);
109
- });
110
- });
111
-
112
- describe('TrackLane', () => {
113
- test('reports drops in seconds using the runway rect and zoom', () => {
114
- let dropped: { atSeconds: number } | null = null;
115
- const { container } = render(
116
- <TrackLane
117
- track={track('v1')}
118
- zoomScale={25}
119
- durationSeconds={20}
120
- onDropData={(payload) => {
121
- dropped = payload;
122
- }}
123
- >
124
- <div />
125
- </TrackLane>,
126
- );
127
- const runway = container.querySelector('[data-track-id="v1"]') as HTMLElement;
128
- runway.getBoundingClientRect = () =>
129
- ({
130
- left: 100,
131
- top: 0,
132
- width: 500,
133
- height: 64,
134
- right: 600,
135
- bottom: 64,
136
- x: 100,
137
- y: 0,
138
- }) as DOMRect;
139
- // happy-dom's DragEvent constructor ignores mouse-init fields — set them directly
140
- const drop = createEvent.drop(runway);
141
- Object.defineProperty(drop, 'clientX', { value: 200 });
142
- Object.defineProperty(drop, 'dataTransfer', { value: { getData: () => '' } });
143
- fireEvent(runway, drop);
144
- expect(dropped).not.toBeNull();
145
- expect((dropped as unknown as { atSeconds: number }).atSeconds).toBe(4); // (200-100)/25
146
- });
147
- });
148
-
149
- describe('TimelineSurface', () => {
150
- test('renders ruler, lanes, playhead, and zoom controls together', () => {
151
- const tracks = [track('v1', [clip({ id: 'c1' })]), track('a1', [], 'audio')];
152
- const { getByRole, getAllByRole, getByText } = render(
153
- <TimelineSurface
154
- tracks={tracks}
155
- zoomScale={25}
156
- currentTime={3}
157
- onScrub={() => {}}
158
- onZoomChange={() => {}}
159
- renderTrack={(t, duration) => (
160
- <TrackLane key={t.id} track={t} zoomScale={25} durationSeconds={duration}>
161
- {t.clips.map((c) => (
162
- <ClipView key={c.id} clip={c} zoomScale={25} selected={false} {...noopClipHandlers} />
163
- ))}
164
- </TrackLane>
165
- )}
166
- />,
167
- );
168
- expect(getByRole('slider', { name: 'Timeline position' })).toBeDefined();
169
- expect(getByRole('slider', { name: 'Playhead' })).toBeDefined();
170
- expect(getByRole('button', { name: 'Zoom in' })).toBeDefined();
171
- expect(getByText('v1')).toBeDefined();
172
- expect(getByText('a1')).toBeDefined();
173
- expect(getAllByRole('button', { name: 'Clip c1' })).toHaveLength(1);
174
- });
175
- });
@@ -1,45 +0,0 @@
1
- // cursedbelt/server/private-media — encrypted private media: a multi-password, semi-deniable
2
- // layer over server/storage. Bytes are AES-128-encrypted HLS (fast, edge-cacheable, client-
3
- // decrypted); the per-item content key is wrapped under a set key that is either server-held
4
- // (standard, recoverable) or password-derived (deniable, zero-knowledge). A clear index exposes
5
- // only size + created-at so users can prune forgotten-password media; title/thumb/notes stay in
6
- // an encrypted envelope revealed only by the right password. Builds on cwip secretBox (scrypt +
7
- // AES-GCM) + server/auth (jose) + server/media (the encrypted-HLS pipeline).
8
-
9
- export type { ContentKey, KeyMode } from './crypto';
10
- export {
11
- cryptBlobStream,
12
- derivePasswordSetKey,
13
- deriveServerSetKey,
14
- generateContentKey,
15
- generateUserSalt,
16
- openMeta,
17
- sealMeta,
18
- unwrapContentKey,
19
- wrapContentKey,
20
- } from './crypto';
21
- export {
22
- createMemoryPrivateIndex,
23
- type PrivateIndex,
24
- type PrivateIndexRow,
25
- type PrivateItem,
26
- toPublic,
27
- } from './index-store';
28
- export {
29
- type CorsResolver,
30
- type MountPrivateOptions,
31
- mountPrivateRoutes,
32
- } from './mountPrivateRoutes';
33
- export {
34
- type PrivateBlobResult,
35
- type PrivateProcessOptions,
36
- type PrivateProcessResult,
37
- processPrivateBlob,
38
- processPrivateVideo,
39
- } from './pipeline';
40
- export {
41
- createUnlockService,
42
- type UnlockGrant,
43
- type UnlockPasswordPolicy,
44
- type UnlockService,
45
- } from './unlock';
@@ -1,8 +0,0 @@
1
- // cursedbelt/server/seo — Hono wiring for cwip's SEO core: sitemap.xml/robots.txt
2
- // routes and a static-HTML head-injection handler. See seo-reusable-plan.md for the
3
- // wider architecture (visibility model, delivery targets, cursedshell aggregation).
4
- export { type MountSeoOptions, mountSeoRoutes } from './mountSeoRoutes';
5
- export {
6
- type ServeHeadInjectedIndexOptions,
7
- serveHeadInjectedIndex,
8
- } from './serveHeadInjectedIndex';
@@ -1,37 +0,0 @@
1
- import type { SeoPolicy } from 'cwip/seo';
2
- import { buildRobots, buildSitemap } from 'cwip/seo';
3
- import type { Hono } from 'hono';
4
-
5
- export interface MountSeoOptions {
6
- // Path the sitemap is served at (default '/sitemap.xml'); also what buildRobots
7
- // points its `Sitemap:` line at.
8
- sitemapPath?: string;
9
- // Path robots.txt is served at (default '/robots.txt').
10
- robotsPath?: string;
11
- // Cache-Control header applied to both responses (default 'public, max-age=3600').
12
- cacheControl?: string;
13
- }
14
-
15
- // Registers GET /sitemap.xml and GET /robots.txt from a SeoPolicy. These serve raw
16
- // text bytes, so — per cursedbelt STANDARDS.md §5 — they are registered DIRECTLY
17
- // with `app.get`, never through `buildRoutes`: routing them through the ctgr
18
- // GET-tunnel would base64url-encode the response body instead of serving it as-is.
19
- export const mountSeoRoutes = (
20
- app: Hono,
21
- policy: SeoPolicy,
22
- options: MountSeoOptions = {},
23
- ): void => {
24
- const sitemapPath = options.sitemapPath ?? '/sitemap.xml';
25
- const robotsPath = options.robotsPath ?? '/robots.txt';
26
- const cacheControl = options.cacheControl ?? 'public, max-age=3600';
27
-
28
- app.get(sitemapPath, (c) => {
29
- c.header('Cache-Control', cacheControl);
30
- return c.body(buildSitemap(policy), 200, { 'Content-Type': 'application/xml' });
31
- });
32
-
33
- app.get(robotsPath, (c) => {
34
- c.header('Cache-Control', cacheControl);
35
- return c.body(buildRobots(policy, { sitemapPath }), 200, { 'Content-Type': 'text/plain' });
36
- });
37
- };
@@ -1,128 +0,0 @@
1
- import { describe, expect, test } from 'bun:test';
2
- import type { SeoPolicy } from 'cwip/seo';
3
- import { Hono } from 'hono';
4
- import { mountSeoRoutes } from './mountSeoRoutes';
5
- import { serveHeadInjectedIndex } from './serveHeadInjectedIndex';
6
-
7
- const policy: SeoPolicy = {
8
- siteUrl: 'https://example.com',
9
- defaultVisibility: 'private',
10
- disallow: ['/api'],
11
- entries: [
12
- {
13
- path: '/',
14
- visibility: 'public',
15
- head: { title: 'Home', description: 'Welcome' },
16
- },
17
- {
18
- path: '/articles/free-monads',
19
- visibility: 'public',
20
- head: {
21
- title: 'Free monads',
22
- description: 'An article about free monads',
23
- openGraph: { type: 'article' },
24
- },
25
- lastmod: '2026-01-01',
26
- },
27
- { path: '/notes', visibility: 'private' },
28
- ],
29
- };
30
-
31
- describe('mountSeoRoutes', () => {
32
- test('serves sitemap.xml with public entries and the right content-type', async () => {
33
- const app = new Hono();
34
- mountSeoRoutes(app, policy);
35
- const res = await app.request('/sitemap.xml');
36
- expect(res.status).toBe(200);
37
- expect(res.headers.get('Content-Type')).toContain('application/xml');
38
- const body = await res.text();
39
- expect(body).toContain('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">');
40
- expect(body).toContain('https://example.com/articles/free-monads');
41
- expect(body).not.toContain('/notes');
42
- });
43
-
44
- test('serves robots.txt disallowing private entries and explicit paths', async () => {
45
- const app = new Hono();
46
- mountSeoRoutes(app, policy);
47
- const res = await app.request('/robots.txt');
48
- expect(res.status).toBe(200);
49
- expect(res.headers.get('Content-Type')).toContain('text/plain');
50
- const body = await res.text();
51
- expect(body).toContain('Disallow: /api');
52
- expect(body).toContain('Disallow: /notes');
53
- expect(body).toContain('Sitemap: https://example.com/sitemap.xml');
54
- });
55
-
56
- test('honors custom sitemapPath/robotsPath/cacheControl', async () => {
57
- const app = new Hono();
58
- mountSeoRoutes(app, policy, {
59
- sitemapPath: '/custom-sitemap.xml',
60
- robotsPath: '/custom-robots.txt',
61
- cacheControl: 'no-cache',
62
- });
63
- const sitemap = await app.request('/custom-sitemap.xml');
64
- const robots = await app.request('/custom-robots.txt');
65
- expect(sitemap.status).toBe(200);
66
- expect(sitemap.headers.get('Cache-Control')).toBe('no-cache');
67
- expect(robots.status).toBe(200);
68
- expect(await robots.text()).toContain('Sitemap: https://example.com/custom-sitemap.xml');
69
- });
70
- });
71
-
72
- const baseHtml = `<!doctype html>
73
- <html>
74
- <head>
75
- <title>Base Title</title>
76
- <meta name="description" content="Base description">
77
- </head>
78
- <body><div id="root"></div></body>
79
- </html>
80
- `;
81
-
82
- describe('serveHeadInjectedIndex', () => {
83
- test('injects the resolved head and strips the base title/description for a mapped path', async () => {
84
- const app = new Hono();
85
- app.get('*', (c) =>
86
- serveHeadInjectedIndex({
87
- html: baseHtml,
88
- resolve: (path) =>
89
- path === '/articles/free-monads'
90
- ? { title: 'Free monads', description: 'An article about free monads' }
91
- : undefined,
92
- })(c),
93
- );
94
- const res = await app.request('/articles/free-monads');
95
- const body = await res.text();
96
- expect(body).toContain('<title data-cwip-seo>Free monads</title>');
97
- expect(body).toContain('An article about free monads');
98
- expect(body).not.toContain('Base Title');
99
- expect(body).not.toContain('Base description');
100
- });
101
-
102
- test('serves the base shell untouched for an unmapped path', async () => {
103
- const app = new Hono();
104
- app.get('*', (c) =>
105
- serveHeadInjectedIndex({
106
- html: baseHtml,
107
- resolve: () => undefined,
108
- })(c),
109
- );
110
- const res = await app.request('/some/authorized/path');
111
- const body = await res.text();
112
- expect(body).toContain('<title>Base Title</title>');
113
- expect(body).toContain('Base description');
114
- });
115
-
116
- test('accepts an async html loader', async () => {
117
- const app = new Hono();
118
- app.get('*', (c) =>
119
- serveHeadInjectedIndex({
120
- html: async () => baseHtml,
121
- resolve: () => ({ title: 'Loaded' }),
122
- })(c),
123
- );
124
- const res = await app.request('/');
125
- const body = await res.text();
126
- expect(body).toContain('Loaded');
127
- });
128
- });
@@ -1,36 +0,0 @@
1
- import type { HeadModel } from 'cwip/seo';
2
- import { injectHead, renderHead, stripBaseTitleAndDescription } from 'cwip/seo';
3
- import type { Context } from 'hono';
4
-
5
- export interface ServeHeadInjectedIndexOptions {
6
- // The SPA's index.html, or a (possibly async) loader for it — read once per
7
- // request so a caller can hot-reload the file in dev without restarting.
8
- html: string | (() => string | Promise<string>);
9
- // Looks up the HeadModel for a request path; return undefined to serve the base
10
- // shell untouched (no injection) for an unmapped route.
11
- resolve: (path: string) => HeadModel | undefined;
12
- // Strip the base <title>/<meta name="description"> out of the shell before
13
- // injecting the route's own (default true) — otherwise the shell's baseline
14
- // title/description would sit alongside the injected ones.
15
- stripBase?: boolean;
16
- }
17
-
18
- // Builds a Hono handler that serves `opts.html` with a per-route HeadModel spliced
19
- // into <head> via cwip's `injectHead`/`renderHead` — a pure string transform, so it
20
- // runs anywhere Bun does (this repo's Hono/Bun.serve host). An HTMLRewriter-based
21
- // streaming variant for Cloudflare Workers/Pages Functions can reuse the exact same
22
- // `renderHead` output later; that seam is intentionally left for a future target
23
- // rather than built here (see seo-reusable-plan.md §4/§6).
24
- export const serveHeadInjectedIndex = (opts: ServeHeadInjectedIndexOptions) => {
25
- const stripBase = opts.stripBase ?? true;
26
-
27
- return async (c: Context) => {
28
- const html = typeof opts.html === 'function' ? await opts.html() : opts.html;
29
- const model = opts.resolve(c.req.path);
30
- if (!model) return c.html(html);
31
-
32
- const shell = stripBase ? stripBaseTitleAndDescription(html) : html;
33
- const headHtml = renderHead(model, { marker: true, indent: ' ' });
34
- return c.html(injectHead(shell, headHtml));
35
- };
36
- };