@geekity/cms 0.3.0 → 0.5.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 (660) hide show
  1. package/README.md +2217 -214
  2. package/admin/components/fields.njk +165 -0
  3. package/admin/layouts/base.njk +1 -1
  4. package/admin/layouts/settings-page.njk +26 -0
  5. package/admin/layouts/shell.njk +17 -3
  6. package/admin/pages/account/forgot.njk +47 -0
  7. package/admin/pages/account/login.njk +26 -0
  8. package/admin/pages/account/reset.njk +38 -0
  9. package/admin/pages/account/setup.njk +28 -0
  10. package/admin/pages/appearance/themes.njk +69 -0
  11. package/admin/pages/comments/all.njk +133 -0
  12. package/admin/{layouts/dashboard.njk → pages/dashboard/home.njk} +8 -15
  13. package/admin/{layouts/document-conflict.njk → pages/documents/conflict.njk} +1 -0
  14. package/admin/{layouts/document-editor.njk → pages/documents/editor.njk} +75 -59
  15. package/admin/{layouts/document-list.njk → pages/documents/list.njk} +19 -2
  16. package/admin/pages/documents/taxonomy.njk +95 -0
  17. package/admin/pages/federation/followers.njk +238 -0
  18. package/admin/pages/federation/settings.njk +77 -0
  19. package/admin/pages/media/library.njk +160 -0
  20. package/admin/pages/messages/all.njk +110 -0
  21. package/admin/pages/navigation/menus.njk +129 -0
  22. package/admin/{layouts → pages}/placeholder.njk +5 -1
  23. package/admin/pages/settings/discussion.njk +99 -0
  24. package/admin/pages/settings/email.njk +203 -0
  25. package/admin/pages/settings/general.njk +29 -0
  26. package/admin/pages/settings/permalinks.njk +50 -0
  27. package/admin/pages/settings/reading.njk +64 -0
  28. package/admin/pages/tools/content-index.njk +89 -0
  29. package/admin/pages/users/edit.njk +239 -0
  30. package/admin/pages/users/list.njk +51 -0
  31. package/admin/pages/users/new.njk +41 -0
  32. package/admin/static/admin.css +558 -3
  33. package/admin/static/copy.js +52 -0
  34. package/admin/static/editor.js +16 -16
  35. package/admin/static/slug.js +61 -0
  36. package/dist/access-log.d.ts +44 -0
  37. package/dist/access-log.d.ts.map +1 -0
  38. package/dist/access-log.js +71 -0
  39. package/dist/access-log.js.map +1 -0
  40. package/dist/admin/accounts.d.ts +413 -0
  41. package/dist/admin/accounts.d.ts.map +1 -0
  42. package/dist/admin/accounts.js +680 -0
  43. package/dist/admin/accounts.js.map +1 -0
  44. package/dist/admin/appearance.d.ts +80 -0
  45. package/dist/admin/appearance.d.ts.map +1 -0
  46. package/dist/admin/appearance.js +136 -0
  47. package/dist/admin/appearance.js.map +1 -0
  48. package/dist/admin/comments.d.ts +90 -0
  49. package/dist/admin/comments.d.ts.map +1 -0
  50. package/dist/admin/comments.js +244 -0
  51. package/dist/admin/comments.js.map +1 -0
  52. package/dist/admin/credentials.d.ts +26 -2
  53. package/dist/admin/credentials.d.ts.map +1 -1
  54. package/dist/admin/credentials.js +35 -2
  55. package/dist/admin/credentials.js.map +1 -1
  56. package/dist/admin/documents.d.ts +117 -10
  57. package/dist/admin/documents.d.ts.map +1 -1
  58. package/dist/admin/documents.js +328 -41
  59. package/dist/admin/documents.js.map +1 -1
  60. package/dist/admin/federation.d.ts +161 -50
  61. package/dist/admin/federation.d.ts.map +1 -1
  62. package/dist/admin/federation.js +235 -93
  63. package/dist/admin/federation.js.map +1 -1
  64. package/dist/admin/formatting.d.ts +20 -0
  65. package/dist/admin/formatting.d.ts.map +1 -0
  66. package/dist/admin/formatting.js +72 -0
  67. package/dist/admin/formatting.js.map +1 -0
  68. package/dist/admin/headers.d.ts +65 -0
  69. package/dist/admin/headers.d.ts.map +1 -0
  70. package/dist/admin/headers.js +104 -0
  71. package/dist/admin/headers.js.map +1 -0
  72. package/dist/admin/index.d.ts +38 -12
  73. package/dist/admin/index.d.ts.map +1 -1
  74. package/dist/admin/index.js +25 -7
  75. package/dist/admin/index.js.map +1 -1
  76. package/dist/admin/media.d.ts +168 -0
  77. package/dist/admin/media.d.ts.map +1 -0
  78. package/dist/admin/media.js +295 -0
  79. package/dist/admin/media.js.map +1 -0
  80. package/dist/admin/menu.d.ts +79 -0
  81. package/dist/admin/menu.d.ts.map +1 -0
  82. package/dist/admin/menu.js +143 -0
  83. package/dist/admin/menu.js.map +1 -0
  84. package/dist/admin/messages.d.ts +80 -0
  85. package/dist/admin/messages.d.ts.map +1 -0
  86. package/dist/admin/messages.js +152 -0
  87. package/dist/admin/messages.js.map +1 -0
  88. package/dist/admin/navigation.d.ts +155 -0
  89. package/dist/admin/navigation.d.ts.map +1 -0
  90. package/dist/admin/navigation.js +292 -0
  91. package/dist/admin/navigation.js.map +1 -0
  92. package/dist/admin/preview.d.ts.map +1 -1
  93. package/dist/admin/preview.js +31 -7
  94. package/dist/admin/preview.js.map +1 -1
  95. package/dist/admin/recovery.d.ts +92 -0
  96. package/dist/admin/recovery.d.ts.map +1 -0
  97. package/dist/admin/recovery.js +229 -0
  98. package/dist/admin/recovery.js.map +1 -0
  99. package/dist/admin/routes.d.ts +0 -20
  100. package/dist/admin/routes.d.ts.map +1 -1
  101. package/dist/admin/routes.js +164 -105
  102. package/dist/admin/routes.js.map +1 -1
  103. package/dist/admin/session.d.ts +17 -3
  104. package/dist/admin/session.d.ts.map +1 -1
  105. package/dist/admin/session.js +19 -5
  106. package/dist/admin/session.js.map +1 -1
  107. package/dist/admin/settings-discussion.d.ts +37 -0
  108. package/dist/admin/settings-discussion.d.ts.map +1 -0
  109. package/dist/admin/settings-discussion.js +117 -0
  110. package/dist/admin/settings-discussion.js.map +1 -0
  111. package/dist/admin/settings-email.d.ts +54 -0
  112. package/dist/admin/settings-email.d.ts.map +1 -0
  113. package/dist/admin/settings-email.js +189 -0
  114. package/dist/admin/settings-email.js.map +1 -0
  115. package/dist/admin/settings-federation.d.ts +48 -0
  116. package/dist/admin/settings-federation.d.ts.map +1 -0
  117. package/dist/admin/settings-federation.js +123 -0
  118. package/dist/admin/settings-federation.js.map +1 -0
  119. package/dist/admin/settings-general.d.ts +12 -0
  120. package/dist/admin/settings-general.d.ts.map +1 -0
  121. package/dist/admin/settings-general.js +48 -0
  122. package/dist/admin/settings-general.js.map +1 -0
  123. package/dist/admin/settings-page.d.ts +119 -0
  124. package/dist/admin/settings-page.d.ts.map +1 -0
  125. package/dist/admin/settings-page.js +132 -0
  126. package/dist/admin/settings-page.js.map +1 -0
  127. package/dist/admin/settings-pages.d.ts +30 -0
  128. package/dist/admin/settings-pages.d.ts.map +1 -0
  129. package/dist/admin/settings-pages.js +43 -0
  130. package/dist/admin/settings-pages.js.map +1 -0
  131. package/dist/admin/settings-permalinks.d.ts +16 -0
  132. package/dist/admin/settings-permalinks.d.ts.map +1 -0
  133. package/dist/admin/settings-permalinks.js +32 -0
  134. package/dist/admin/settings-permalinks.js.map +1 -0
  135. package/dist/admin/settings-reading.d.ts +34 -0
  136. package/dist/admin/settings-reading.d.ts.map +1 -0
  137. package/dist/admin/settings-reading.js +49 -0
  138. package/dist/admin/settings-reading.js.map +1 -0
  139. package/dist/admin/settings.d.ts +339 -96
  140. package/dist/admin/settings.d.ts.map +1 -1
  141. package/dist/admin/settings.js +600 -308
  142. package/dist/admin/settings.js.map +1 -1
  143. package/dist/admin/store.d.ts +606 -152
  144. package/dist/admin/store.d.ts.map +1 -1
  145. package/dist/admin/store.js +863 -268
  146. package/dist/admin/store.js.map +1 -1
  147. package/dist/admin/taxonomy.d.ts +114 -0
  148. package/dist/admin/taxonomy.d.ts.map +1 -0
  149. package/dist/admin/taxonomy.js +289 -0
  150. package/dist/admin/taxonomy.js.map +1 -0
  151. package/dist/admin/templates.d.ts +46 -14
  152. package/dist/admin/templates.d.ts.map +1 -1
  153. package/dist/admin/templates.js +46 -14
  154. package/dist/admin/templates.js.map +1 -1
  155. package/dist/admin/throttle.d.ts +84 -0
  156. package/dist/admin/throttle.d.ts.map +1 -0
  157. package/dist/admin/throttle.js +143 -0
  158. package/dist/admin/throttle.js.map +1 -0
  159. package/dist/admin/tools.d.ts +111 -0
  160. package/dist/admin/tools.d.ts.map +1 -0
  161. package/dist/admin/tools.js +182 -0
  162. package/dist/admin/tools.js.map +1 -0
  163. package/dist/admin/uploads.d.ts +28 -2
  164. package/dist/admin/uploads.d.ts.map +1 -1
  165. package/dist/admin/uploads.js +43 -4
  166. package/dist/admin/uploads.js.map +1 -1
  167. package/dist/admin/users.d.ts +100 -13
  168. package/dist/admin/users.d.ts.map +1 -1
  169. package/dist/admin/users.js +412 -39
  170. package/dist/admin/users.js.map +1 -1
  171. package/dist/cache.d.ts +141 -0
  172. package/dist/cache.d.ts.map +1 -0
  173. package/dist/cache.js +207 -0
  174. package/dist/cache.js.map +1 -0
  175. package/dist/cli.d.ts +14 -2
  176. package/dist/cli.d.ts.map +1 -1
  177. package/dist/cli.js +429 -21
  178. package/dist/cli.js.map +1 -1
  179. package/dist/comments/akismet.d.ts +130 -0
  180. package/dist/comments/akismet.d.ts.map +1 -0
  181. package/dist/comments/akismet.js +274 -0
  182. package/dist/comments/akismet.js.map +1 -0
  183. package/dist/comments/conversation.d.ts +29 -0
  184. package/dist/comments/conversation.d.ts.map +1 -0
  185. package/dist/comments/conversation.js +60 -0
  186. package/dist/comments/conversation.js.map +1 -0
  187. package/dist/comments/form.d.ts +123 -0
  188. package/dist/comments/form.d.ts.map +1 -0
  189. package/dist/comments/form.js +79 -0
  190. package/dist/comments/form.js.map +1 -0
  191. package/dist/comments/index.d.ts +16 -0
  192. package/dist/comments/index.d.ts.map +1 -0
  193. package/dist/comments/index.js +10 -0
  194. package/dist/comments/index.js.map +1 -0
  195. package/dist/comments/markdown.d.ts +8 -0
  196. package/dist/comments/markdown.d.ts.map +1 -0
  197. package/dist/comments/markdown.js +85 -0
  198. package/dist/comments/markdown.js.map +1 -0
  199. package/dist/comments/moderate.d.ts +71 -0
  200. package/dist/comments/moderate.d.ts.map +1 -0
  201. package/dist/comments/moderate.js +88 -0
  202. package/dist/comments/moderate.js.map +1 -0
  203. package/dist/comments/policy.d.ts +57 -0
  204. package/dist/comments/policy.d.ts.map +1 -0
  205. package/dist/comments/policy.js +80 -0
  206. package/dist/comments/policy.js.map +1 -0
  207. package/dist/comments/records.d.ts +266 -0
  208. package/dist/comments/records.d.ts.map +1 -0
  209. package/dist/comments/records.js +487 -0
  210. package/dist/comments/records.js.map +1 -0
  211. package/dist/comments/routes.d.ts +60 -0
  212. package/dist/comments/routes.d.ts.map +1 -0
  213. package/dist/comments/routes.js +212 -0
  214. package/dist/comments/routes.js.map +1 -0
  215. package/dist/comments/submission.d.ts +297 -0
  216. package/dist/comments/submission.d.ts.map +1 -0
  217. package/dist/comments/submission.js +280 -0
  218. package/dist/comments/submission.js.map +1 -0
  219. package/dist/comments/viewer.d.ts +21 -0
  220. package/dist/comments/viewer.d.ts.map +1 -0
  221. package/dist/comments/viewer.js +45 -0
  222. package/dist/comments/viewer.js.map +1 -0
  223. package/dist/config.d.ts +225 -5
  224. package/dist/config.d.ts.map +1 -1
  225. package/dist/config.js +121 -6
  226. package/dist/config.js.map +1 -1
  227. package/dist/contact/delivery.d.ts +60 -0
  228. package/dist/contact/delivery.d.ts.map +1 -0
  229. package/dist/contact/delivery.js +87 -0
  230. package/dist/contact/delivery.js.map +1 -0
  231. package/dist/contact/form.d.ts +130 -0
  232. package/dist/contact/form.d.ts.map +1 -0
  233. package/dist/contact/form.js +163 -0
  234. package/dist/contact/form.js.map +1 -0
  235. package/dist/contact/index.d.ts +17 -0
  236. package/dist/contact/index.d.ts.map +1 -0
  237. package/dist/contact/index.js +13 -0
  238. package/dist/contact/index.js.map +1 -0
  239. package/dist/contact/records.d.ts +124 -0
  240. package/dist/contact/records.d.ts.map +1 -0
  241. package/dist/contact/records.js +218 -0
  242. package/dist/contact/records.js.map +1 -0
  243. package/dist/contact/routes.d.ts +17 -0
  244. package/dist/contact/routes.d.ts.map +1 -0
  245. package/dist/contact/routes.js +127 -0
  246. package/dist/contact/routes.js.map +1 -0
  247. package/dist/contact/submission.d.ts +103 -0
  248. package/dist/contact/submission.d.ts.map +1 -0
  249. package/dist/contact/submission.js +166 -0
  250. package/dist/contact/submission.js.map +1 -0
  251. package/dist/content/document.d.ts +7 -2
  252. package/dist/content/document.d.ts.map +1 -1
  253. package/dist/content/document.js +1 -0
  254. package/dist/content/document.js.map +1 -1
  255. package/dist/content/index.d.ts +7 -2
  256. package/dist/content/index.d.ts.map +1 -1
  257. package/dist/content/index.js +4 -1
  258. package/dist/content/index.js.map +1 -1
  259. package/dist/content/markdown.d.ts.map +1 -1
  260. package/dist/content/markdown.js +24 -2
  261. package/dist/content/markdown.js.map +1 -1
  262. package/dist/content/parser.d.ts.map +1 -1
  263. package/dist/content/parser.js +11 -4
  264. package/dist/content/parser.js.map +1 -1
  265. package/dist/content/save.d.ts +5 -0
  266. package/dist/content/save.d.ts.map +1 -1
  267. package/dist/content/save.js +44 -1
  268. package/dist/content/save.js.map +1 -1
  269. package/dist/content/schedule.d.ts +125 -0
  270. package/dist/content/schedule.d.ts.map +1 -0
  271. package/dist/content/schedule.js +207 -0
  272. package/dist/content/schedule.js.map +1 -0
  273. package/dist/content/search.d.ts +64 -0
  274. package/dist/content/search.d.ts.map +1 -0
  275. package/dist/content/search.js +136 -0
  276. package/dist/content/search.js.map +1 -0
  277. package/dist/content/store.d.ts +220 -7
  278. package/dist/content/store.d.ts.map +1 -1
  279. package/dist/content/store.js +392 -67
  280. package/dist/content/store.js.map +1 -1
  281. package/dist/content/sync.d.ts +7 -1
  282. package/dist/content/sync.d.ts.map +1 -1
  283. package/dist/content/sync.js +18 -10
  284. package/dist/content/sync.js.map +1 -1
  285. package/dist/content/time.d.ts +56 -0
  286. package/dist/content/time.d.ts.map +1 -0
  287. package/dist/content/time.js +141 -0
  288. package/dist/content/time.js.map +1 -0
  289. package/dist/content/writer.d.ts.map +1 -1
  290. package/dist/content/writer.js +3 -0
  291. package/dist/content/writer.js.map +1 -1
  292. package/dist/env.d.ts +70 -5
  293. package/dist/env.d.ts.map +1 -1
  294. package/dist/federation/actor.d.ts +95 -41
  295. package/dist/federation/actor.d.ts.map +1 -1
  296. package/dist/federation/actor.js +180 -53
  297. package/dist/federation/actor.js.map +1 -1
  298. package/dist/federation/article.d.ts +44 -17
  299. package/dist/federation/article.d.ts.map +1 -1
  300. package/dist/federation/article.js +98 -46
  301. package/dist/federation/article.js.map +1 -1
  302. package/dist/federation/delivery.d.ts +63 -15
  303. package/dist/federation/delivery.d.ts.map +1 -1
  304. package/dist/federation/delivery.js +154 -80
  305. package/dist/federation/delivery.js.map +1 -1
  306. package/dist/federation/federation.d.ts +22 -17
  307. package/dist/federation/federation.d.ts.map +1 -1
  308. package/dist/federation/federation.js +98 -77
  309. package/dist/federation/federation.js.map +1 -1
  310. package/dist/federation/followers.d.ts +3 -2
  311. package/dist/federation/followers.d.ts.map +1 -1
  312. package/dist/federation/followers.js +6 -5
  313. package/dist/federation/followers.js.map +1 -1
  314. package/dist/federation/import-wordpress.d.ts +128 -0
  315. package/dist/federation/import-wordpress.d.ts.map +1 -0
  316. package/dist/federation/import-wordpress.js +426 -0
  317. package/dist/federation/import-wordpress.js.map +1 -0
  318. package/dist/federation/inbox.d.ts +36 -13
  319. package/dist/federation/inbox.d.ts.map +1 -1
  320. package/dist/federation/inbox.js +120 -49
  321. package/dist/federation/inbox.js.map +1 -1
  322. package/dist/federation/index.d.ts +22 -10
  323. package/dist/federation/index.d.ts.map +1 -1
  324. package/dist/federation/index.js +13 -8
  325. package/dist/federation/index.js.map +1 -1
  326. package/dist/federation/keys.d.ts +98 -20
  327. package/dist/federation/keys.d.ts.map +1 -1
  328. package/dist/federation/keys.js +269 -39
  329. package/dist/federation/keys.js.map +1 -1
  330. package/dist/federation/mount.d.ts +46 -10
  331. package/dist/federation/mount.d.ts.map +1 -1
  332. package/dist/federation/mount.js +300 -28
  333. package/dist/federation/mount.js.map +1 -1
  334. package/dist/federation/paths.d.ts +23 -35
  335. package/dist/federation/paths.d.ts.map +1 -1
  336. package/dist/federation/paths.js +26 -39
  337. package/dist/federation/paths.js.map +1 -1
  338. package/dist/federation/records.d.ts +223 -0
  339. package/dist/federation/records.d.ts.map +1 -0
  340. package/dist/federation/records.js +506 -0
  341. package/dist/federation/records.js.map +1 -0
  342. package/dist/federation/relays.d.ts +114 -0
  343. package/dist/federation/relays.d.ts.map +1 -0
  344. package/dist/federation/relays.js +290 -0
  345. package/dist/federation/relays.js.map +1 -0
  346. package/dist/federation/replies.d.ts +80 -0
  347. package/dist/federation/replies.d.ts.map +1 -0
  348. package/dist/federation/replies.js +166 -0
  349. package/dist/federation/replies.js.map +1 -0
  350. package/dist/federation/wordpress.d.ts +131 -0
  351. package/dist/federation/wordpress.d.ts.map +1 -0
  352. package/dist/federation/wordpress.js +341 -0
  353. package/dist/federation/wordpress.js.map +1 -0
  354. package/dist/files/atomic.d.ts +103 -0
  355. package/dist/files/atomic.d.ts.map +1 -0
  356. package/dist/files/atomic.js +150 -0
  357. package/dist/files/atomic.js.map +1 -0
  358. package/dist/files/index.d.ts +3 -0
  359. package/dist/files/index.d.ts.map +1 -0
  360. package/dist/files/index.js +2 -0
  361. package/dist/files/index.js.map +1 -0
  362. package/dist/forms/protection.d.ts +85 -0
  363. package/dist/forms/protection.d.ts.map +1 -0
  364. package/dist/forms/protection.js +116 -0
  365. package/dist/forms/protection.js.map +1 -0
  366. package/dist/images/icons.d.ts +59 -0
  367. package/dist/images/icons.d.ts.map +1 -0
  368. package/dist/images/icons.js +131 -0
  369. package/dist/images/icons.js.map +1 -0
  370. package/dist/images/index.d.ts +7 -0
  371. package/dist/images/index.d.ts.map +1 -0
  372. package/dist/images/index.js +4 -0
  373. package/dist/images/index.js.map +1 -0
  374. package/dist/images/markup.d.ts +47 -0
  375. package/dist/images/markup.d.ts.map +1 -0
  376. package/dist/images/markup.js +175 -0
  377. package/dist/images/markup.js.map +1 -0
  378. package/dist/images/paths.d.ts +34 -0
  379. package/dist/images/paths.d.ts.map +1 -0
  380. package/dist/images/paths.js +41 -0
  381. package/dist/images/paths.js.map +1 -0
  382. package/dist/images/variants.d.ts +104 -0
  383. package/dist/images/variants.d.ts.map +1 -0
  384. package/dist/images/variants.js +320 -0
  385. package/dist/images/variants.js.map +1 -0
  386. package/dist/index.d.ts +123 -19
  387. package/dist/index.d.ts.map +1 -1
  388. package/dist/index.js +344 -25
  389. package/dist/index.js.map +1 -1
  390. package/dist/init.d.ts +18 -0
  391. package/dist/init.d.ts.map +1 -1
  392. package/dist/init.js +34 -3
  393. package/dist/init.js.map +1 -1
  394. package/dist/mail/brevo.d.ts +35 -0
  395. package/dist/mail/brevo.d.ts.map +1 -0
  396. package/dist/mail/brevo.js +85 -0
  397. package/dist/mail/brevo.js.map +1 -0
  398. package/dist/mail/credentials.d.ts +62 -0
  399. package/dist/mail/credentials.d.ts.map +1 -0
  400. package/dist/mail/credentials.js +86 -0
  401. package/dist/mail/credentials.js.map +1 -0
  402. package/dist/mail/index.d.ts +15 -0
  403. package/dist/mail/index.d.ts.map +1 -0
  404. package/dist/mail/index.js +8 -0
  405. package/dist/mail/index.js.map +1 -0
  406. package/dist/mail/memory.d.ts +35 -0
  407. package/dist/mail/memory.d.ts.map +1 -0
  408. package/dist/mail/memory.js +29 -0
  409. package/dist/mail/memory.js.map +1 -0
  410. package/dist/mail/provider.d.ts +80 -0
  411. package/dist/mail/provider.d.ts.map +1 -0
  412. package/dist/mail/provider.js +23 -0
  413. package/dist/mail/provider.js.map +1 -0
  414. package/dist/mail/service.d.ts +156 -0
  415. package/dist/mail/service.d.ts.map +1 -0
  416. package/dist/mail/service.js +265 -0
  417. package/dist/mail/service.js.map +1 -0
  418. package/dist/mail/smtp.d.ts +39 -0
  419. package/dist/mail/smtp.d.ts.map +1 -0
  420. package/dist/mail/smtp.js +58 -0
  421. package/dist/mail/smtp.js.map +1 -0
  422. package/dist/mail/templates.d.ts +91 -0
  423. package/dist/mail/templates.d.ts.map +1 -0
  424. package/dist/mail/templates.js +69 -0
  425. package/dist/mail/templates.js.map +1 -0
  426. package/dist/notifications/comments.d.ts +66 -0
  427. package/dist/notifications/comments.d.ts.map +1 -0
  428. package/dist/notifications/comments.js +151 -0
  429. package/dist/notifications/comments.js.map +1 -0
  430. package/dist/notifications/digest.d.ts +135 -0
  431. package/dist/notifications/digest.d.ts.map +1 -0
  432. package/dist/notifications/digest.js +287 -0
  433. package/dist/notifications/digest.js.map +1 -0
  434. package/dist/notifications/index.d.ts +13 -0
  435. package/dist/notifications/index.d.ts.map +1 -0
  436. package/dist/notifications/index.js +8 -0
  437. package/dist/notifications/index.js.map +1 -0
  438. package/dist/notifications/links.d.ts +60 -0
  439. package/dist/notifications/links.d.ts.map +1 -0
  440. package/dist/notifications/links.js +63 -0
  441. package/dist/notifications/links.js.map +1 -0
  442. package/dist/notifications/optouts.d.ts +48 -0
  443. package/dist/notifications/optouts.d.ts.map +1 -0
  444. package/dist/notifications/optouts.js +93 -0
  445. package/dist/notifications/optouts.js.map +1 -0
  446. package/dist/notifications/preferences.d.ts +158 -0
  447. package/dist/notifications/preferences.d.ts.map +1 -0
  448. package/dist/notifications/preferences.js +195 -0
  449. package/dist/notifications/preferences.js.map +1 -0
  450. package/dist/notifications/routes.d.ts +28 -0
  451. package/dist/notifications/routes.d.ts.map +1 -0
  452. package/dist/notifications/routes.js +184 -0
  453. package/dist/notifications/routes.js.map +1 -0
  454. package/dist/notifications/tokens.d.ts +60 -0
  455. package/dist/notifications/tokens.d.ts.map +1 -0
  456. package/dist/notifications/tokens.js +125 -0
  457. package/dist/notifications/tokens.js.map +1 -0
  458. package/dist/notify.d.ts +84 -0
  459. package/dist/notify.d.ts.map +1 -0
  460. package/dist/notify.js +149 -0
  461. package/dist/notify.js.map +1 -0
  462. package/dist/web/archive.d.ts +49 -0
  463. package/dist/web/archive.d.ts.map +1 -0
  464. package/dist/web/archive.js +59 -0
  465. package/dist/web/archive.js.map +1 -0
  466. package/dist/web/assets.d.ts +6 -5
  467. package/dist/web/assets.d.ts.map +1 -1
  468. package/dist/web/assets.js +5 -7
  469. package/dist/web/assets.js.map +1 -1
  470. package/dist/web/authors.d.ts +143 -0
  471. package/dist/web/authors.d.ts.map +1 -0
  472. package/dist/web/authors.js +178 -0
  473. package/dist/web/authors.js.map +1 -0
  474. package/dist/web/comments.d.ts +60 -0
  475. package/dist/web/comments.d.ts.map +1 -0
  476. package/dist/web/comments.js +207 -0
  477. package/dist/web/comments.js.map +1 -0
  478. package/dist/web/context.d.ts +162 -28
  479. package/dist/web/context.d.ts.map +1 -1
  480. package/dist/web/context.js +123 -26
  481. package/dist/web/context.js.map +1 -1
  482. package/dist/web/conversation.d.ts +209 -0
  483. package/dist/web/conversation.d.ts.map +1 -0
  484. package/dist/web/conversation.js +557 -0
  485. package/dist/web/conversation.js.map +1 -0
  486. package/dist/web/documents.d.ts +36 -6
  487. package/dist/web/documents.d.ts.map +1 -1
  488. package/dist/web/documents.js +52 -10
  489. package/dist/web/documents.js.map +1 -1
  490. package/dist/web/feed-atom.d.ts +22 -0
  491. package/dist/web/feed-atom.d.ts.map +1 -0
  492. package/dist/web/feed-atom.js +83 -0
  493. package/dist/web/feed-atom.js.map +1 -0
  494. package/dist/web/feed-item.d.ts +145 -0
  495. package/dist/web/feed-item.d.ts.map +1 -0
  496. package/dist/web/feed-item.js +120 -0
  497. package/dist/web/feed-item.js.map +1 -0
  498. package/dist/web/feed-json.d.ts +79 -0
  499. package/dist/web/feed-json.d.ts.map +1 -0
  500. package/dist/web/feed-json.js +53 -0
  501. package/dist/web/feed-json.js.map +1 -0
  502. package/dist/web/feed-rss.d.ts +26 -0
  503. package/dist/web/feed-rss.d.ts.map +1 -0
  504. package/dist/web/feed-rss.js +203 -0
  505. package/dist/web/feed-rss.js.map +1 -0
  506. package/dist/web/feed-source.d.ts +244 -0
  507. package/dist/web/feed-source.d.ts.map +1 -0
  508. package/dist/web/feed-source.js +201 -0
  509. package/dist/web/feed-source.js.map +1 -0
  510. package/dist/web/feed-xml.d.ts +63 -0
  511. package/dist/web/feed-xml.d.ts.map +1 -0
  512. package/dist/web/feed-xml.js +116 -0
  513. package/dist/web/feed-xml.js.map +1 -0
  514. package/dist/web/feeds.d.ts +31 -96
  515. package/dist/web/feeds.d.ts.map +1 -1
  516. package/dist/web/feeds.js +94 -198
  517. package/dist/web/feeds.js.map +1 -1
  518. package/dist/web/health.d.ts +31 -0
  519. package/dist/web/health.d.ts.map +1 -0
  520. package/dist/web/health.js +44 -0
  521. package/dist/web/health.js.map +1 -0
  522. package/dist/web/index.d.ts +30 -10
  523. package/dist/web/index.d.ts.map +1 -1
  524. package/dist/web/index.js +18 -7
  525. package/dist/web/index.js.map +1 -1
  526. package/dist/web/navigation.d.ts +195 -0
  527. package/dist/web/navigation.d.ts.map +1 -0
  528. package/dist/web/navigation.js +300 -0
  529. package/dist/web/navigation.js.map +1 -0
  530. package/dist/web/negotiate.d.ts +31 -0
  531. package/dist/web/negotiate.d.ts.map +1 -1
  532. package/dist/web/negotiate.js +31 -11
  533. package/dist/web/negotiate.js.map +1 -1
  534. package/dist/web/recent.d.ts +43 -0
  535. package/dist/web/recent.d.ts.map +1 -0
  536. package/dist/web/recent.js +37 -0
  537. package/dist/web/recent.js.map +1 -0
  538. package/dist/web/render.d.ts +203 -9
  539. package/dist/web/render.d.ts.map +1 -1
  540. package/dist/web/render.js +341 -17
  541. package/dist/web/render.js.map +1 -1
  542. package/dist/web/routes.d.ts +25 -8
  543. package/dist/web/routes.d.ts.map +1 -1
  544. package/dist/web/routes.js +854 -93
  545. package/dist/web/routes.js.map +1 -1
  546. package/dist/web/sanitize.d.ts +19 -0
  547. package/dist/web/sanitize.d.ts.map +1 -0
  548. package/dist/web/sanitize.js +272 -0
  549. package/dist/web/sanitize.js.map +1 -0
  550. package/dist/web/search.d.ts +79 -0
  551. package/dist/web/search.d.ts.map +1 -0
  552. package/dist/web/search.js +94 -0
  553. package/dist/web/search.js.map +1 -0
  554. package/dist/web/sitemap.d.ts +120 -0
  555. package/dist/web/sitemap.d.ts.map +1 -0
  556. package/dist/web/sitemap.js +199 -0
  557. package/dist/web/sitemap.js.map +1 -0
  558. package/dist/web/taxonomy.d.ts +152 -0
  559. package/dist/web/taxonomy.d.ts.map +1 -0
  560. package/dist/web/taxonomy.js +237 -0
  561. package/dist/web/taxonomy.js.map +1 -0
  562. package/dist/web/templates.d.ts +54 -16
  563. package/dist/web/templates.d.ts.map +1 -1
  564. package/dist/web/templates.js +109 -28
  565. package/dist/web/templates.js.map +1 -1
  566. package/dist/web/themes.d.ts +226 -0
  567. package/dist/web/themes.d.ts.map +1 -0
  568. package/dist/web/themes.js +314 -0
  569. package/dist/web/themes.js.map +1 -0
  570. package/dist/webmention/discovery.d.ts +51 -0
  571. package/dist/webmention/discovery.d.ts.map +1 -0
  572. package/dist/webmention/discovery.js +176 -0
  573. package/dist/webmention/discovery.js.map +1 -0
  574. package/dist/webmention/html.d.ts +71 -0
  575. package/dist/webmention/html.d.ts.map +1 -0
  576. package/dist/webmention/html.js +285 -0
  577. package/dist/webmention/html.js.map +1 -0
  578. package/dist/webmention/index.d.ts +12 -0
  579. package/dist/webmention/index.d.ts.map +1 -0
  580. package/dist/webmention/index.js +8 -0
  581. package/dist/webmention/index.js.map +1 -0
  582. package/dist/webmention/links.d.ts +18 -0
  583. package/dist/webmention/links.d.ts.map +1 -0
  584. package/dist/webmention/links.js +64 -0
  585. package/dist/webmention/links.js.map +1 -0
  586. package/dist/webmention/microformats.d.ts +93 -0
  587. package/dist/webmention/microformats.d.ts.map +1 -0
  588. package/dist/webmention/microformats.js +376 -0
  589. package/dist/webmention/microformats.js.map +1 -0
  590. package/dist/webmention/receive.d.ts +141 -0
  591. package/dist/webmention/receive.d.ts.map +1 -0
  592. package/dist/webmention/receive.js +264 -0
  593. package/dist/webmention/receive.js.map +1 -0
  594. package/dist/webmention/routes.d.ts +37 -0
  595. package/dist/webmention/routes.d.ts.map +1 -0
  596. package/dist/webmention/routes.js +75 -0
  597. package/dist/webmention/routes.js.map +1 -0
  598. package/dist/webmention/service.d.ts +94 -0
  599. package/dist/webmention/service.d.ts.map +1 -0
  600. package/dist/webmention/service.js +207 -0
  601. package/dist/webmention/service.js.map +1 -0
  602. package/package.json +11 -6
  603. package/templates/site/content/_data/site.json +8 -0
  604. package/templates/site/content/pages/about.md +7 -0
  605. package/templates/site/content/posts/2026-01-01-hello-world.md +5 -3
  606. package/templates/site/geekity.config.ts +11 -1
  607. package/templates/site/tsconfig.json +1 -1
  608. package/themes/default/README.md +1216 -50
  609. package/themes/default/layouts/404.njk +2 -3
  610. package/themes/default/layouts/author.njk +36 -0
  611. package/themes/default/layouts/base.njk +161 -31
  612. package/themes/default/layouts/category.njk +27 -0
  613. package/themes/default/layouts/front-page.njk +56 -0
  614. package/themes/default/layouts/home.njk +17 -1
  615. package/themes/default/layouts/page.njk +57 -5
  616. package/themes/default/layouts/post.njk +78 -19
  617. package/themes/default/layouts/search.njk +57 -0
  618. package/themes/default/layouts/tag.njk +3 -6
  619. package/themes/default/mail/comment-digest.html.njk +37 -0
  620. package/themes/default/mail/comment-digest.subject.njk +3 -0
  621. package/themes/default/mail/comment-digest.txt.njk +40 -0
  622. package/themes/default/mail/comment-pending.html.njk +27 -0
  623. package/themes/default/mail/comment-pending.subject.njk +2 -0
  624. package/themes/default/mail/comment-pending.txt.njk +24 -0
  625. package/themes/default/mail/comment-reply.html.njk +21 -0
  626. package/themes/default/mail/comment-reply.subject.njk +2 -0
  627. package/themes/default/mail/comment-reply.txt.njk +22 -0
  628. package/themes/default/mail/contact-message.html.njk +24 -0
  629. package/themes/default/mail/contact-message.subject.njk +5 -0
  630. package/themes/default/mail/contact-message.txt.njk +20 -0
  631. package/themes/default/mail/password-changed.html.njk +18 -0
  632. package/themes/default/mail/password-changed.subject.njk +2 -0
  633. package/themes/default/mail/password-changed.txt.njk +17 -0
  634. package/themes/default/mail/password-reset.html.njk +22 -0
  635. package/themes/default/mail/password-reset.subject.njk +2 -0
  636. package/themes/default/mail/password-reset.txt.njk +18 -0
  637. package/themes/default/mail/test.html.njk +14 -0
  638. package/themes/default/mail/test.subject.njk +2 -0
  639. package/themes/default/mail/test.txt.njk +12 -0
  640. package/themes/default/partials/archive.njk +27 -0
  641. package/themes/default/partials/bio.njk +71 -0
  642. package/themes/default/partials/comment-form.njk +137 -0
  643. package/themes/default/partials/contact-form.njk +88 -0
  644. package/themes/default/partials/conversation.njk +139 -0
  645. package/themes/default/partials/feeds.njk +26 -0
  646. package/themes/default/partials/jsonld.njk +120 -0
  647. package/themes/default/partials/menu.njk +32 -0
  648. package/themes/default/partials/pagination.njk +12 -6
  649. package/themes/default/partials/post-list.njk +51 -18
  650. package/themes/default/partials/search-form.njk +22 -0
  651. package/themes/default/partials/tags.njk +26 -5
  652. package/themes/default/static/highlight.js +4 -0
  653. package/themes/default/static/style.css +1142 -194
  654. package/themes/default/theme.json +9 -0
  655. package/admin/layouts/federation.njk +0 -145
  656. package/admin/layouts/login.njk +0 -23
  657. package/admin/layouts/settings.njk +0 -116
  658. package/admin/layouts/setup.njk +0 -27
  659. package/admin/layouts/users.njk +0 -91
  660. /package/admin/{layouts/_flash.njk → components/flash.njk} +0 -0
@@ -0,0 +1,557 @@
1
+ import { actorHandle, replyFrom, REPLY_ACTIVITY_TYPE } from '../federation/replies.js';
2
+ import { activityStreamsId, isPublicDocument } from './documents.js';
3
+ import { absoluteUrl } from './negotiate.js';
4
+ import { sanitizeCommentHtml } from './sanitize.js';
5
+ /**
6
+ * The reader over one site's two indexes.
7
+ *
8
+ * The methods are properties rather than prototype methods so that one of them
9
+ * can be handed out on its own — the renderer is given `conversation.thread`
10
+ * and nothing else — without anybody having to wrap it in a closure to keep
11
+ * `this`.
12
+ */
13
+ export function createConversation(context) {
14
+ return {
15
+ thread: (document) => postConversation(context, document),
16
+ counts: (documents) => commentCounts(context, documents),
17
+ latest: (limit) => siteConversation(context, limit),
18
+ };
19
+ }
20
+ /** A conversation with nothing in it, which is what most posts have. */
21
+ const NOTHING = {
22
+ replies: [],
23
+ likes: [],
24
+ boosts: [],
25
+ mentions: [],
26
+ counts: { replies: 0, likes: 0, boosts: 0, mentions: 0, total: 0 },
27
+ };
28
+ /**
29
+ * The conversation under one post: everything said about it, from every source
30
+ * the site has, threaded into one.
31
+ *
32
+ * A post that has never been delivered has no ActivityStreams id and so can
33
+ * have no fediverse replies — nothing out there has a name for it yet — but it
34
+ * can still have native comments, which hang off its permalink instead.
35
+ */
36
+ function postConversation(context, document) {
37
+ const objectId = activityStreamsId(document, context.baseUrl);
38
+ // What a top-level answer names. The object id when the post has one, and
39
+ // the permalink otherwise: a post that has never been delivered can still
40
+ // have native comments, and they have to hang off something.
41
+ const root = objectId ?? document.permalink;
42
+ const activities = objectId === undefined ? [] : activitiesAround(context.admin, objectId);
43
+ const native = approvedComments(context.admin, document);
44
+ if (activities.length === 0 && native.length === 0)
45
+ return NOTHING;
46
+ const naming = authorNaming(context.admin);
47
+ const withdrawn = withdrawnBy(activities);
48
+ const written = [];
49
+ const likes = [];
50
+ const boosts = [];
51
+ const mentions = [];
52
+ const reacted = new Set();
53
+ for (const activity of activities) {
54
+ const kind = REACTIONS[activity.activityType];
55
+ if (kind !== undefined) {
56
+ // Only a reaction to the post itself: a like of one of the replies
57
+ // belongs to that reply's own conversation, wherever it is shown.
58
+ if (activity.objectId !== objectId)
59
+ continue;
60
+ // One like per actor, however many times it was delivered, and none at
61
+ // all once its actor has taken it back.
62
+ const key = `${kind}\0${activity.actorId}`;
63
+ if (reacted.has(key))
64
+ continue;
65
+ if (activity.activityId !== null && withdrawn.has(activity.activityId))
66
+ continue;
67
+ reacted.add(key);
68
+ const author = naming(activity.actorId);
69
+ (kind === 'like' ? likes : boosts).push({
70
+ id: activity.activityId ?? `${activity.actorId}#${kind}`,
71
+ source: 'activitypub',
72
+ kind,
73
+ author,
74
+ url: author.url,
75
+ content: '',
76
+ published: new Date(activity.receivedAt),
77
+ inReplyTo: null,
78
+ status: 'published',
79
+ replies: [],
80
+ });
81
+ continue;
82
+ }
83
+ const reply = replyFrom(activity);
84
+ if (reply === undefined)
85
+ continue;
86
+ written.push(federatedInteraction(reply, naming(activity.actorId)));
87
+ }
88
+ for (const comment of native) {
89
+ // A repost joins the boosts, because a reader looking at the page is being
90
+ // told the same thing by both; a mention is its own group, because it is
91
+ // neither an answer nor a reaction.
92
+ const group = comment.kind === 'reply'
93
+ ? written
94
+ : comment.kind === 'like'
95
+ ? likes
96
+ : comment.kind === 'mention'
97
+ ? mentions
98
+ : boosts;
99
+ group.push({ ...comment, replies: [] });
100
+ }
101
+ // Sorted before threading rather than after, because a thread is built by
102
+ // walking this list: two sources' entries would otherwise interleave in the
103
+ // order the code happened to read them rather than in the order they were
104
+ // written.
105
+ written.sort(byPublished);
106
+ const replies = threadOf(written, root, withdrawn);
107
+ sortThread(replies);
108
+ likes.sort(byPublished);
109
+ boosts.sort(byPublished);
110
+ mentions.sort(byPublished);
111
+ const counted = countReplies(replies);
112
+ return {
113
+ replies,
114
+ likes,
115
+ boosts,
116
+ mentions,
117
+ counts: {
118
+ replies: counted,
119
+ likes: likes.length,
120
+ boosts: boosts.length,
121
+ mentions: mentions.length,
122
+ total: counted + likes.length + boosts.length + mentions.length,
123
+ },
124
+ };
125
+ }
126
+ /**
127
+ * The whole site's latest answers, newest first, each with its post.
128
+ *
129
+ * Read per source and merged rather than threaded: a site-wide list is a list
130
+ * of what has just been said, and an answer to an answer is as much news as an
131
+ * answer to a post. Both sides are over-read for the same reason — one about a
132
+ * post that has since been unpublished is dropped after the index has already
133
+ * counted it — and the merged list is cut to size at the end.
134
+ */
135
+ function siteConversation(context, limit) {
136
+ const naming = authorNaming(context.admin);
137
+ const posts = new PostsByObjectId(context);
138
+ const said = [];
139
+ for (let offset = 0; said.length < limit;) {
140
+ const page = context.admin.listReplies({ limit: limit * OVERSCAN, offset });
141
+ if (page.length === 0)
142
+ break;
143
+ offset += page.length;
144
+ for (const activity of page) {
145
+ const reply = replyFrom(activity);
146
+ if (reply === undefined)
147
+ continue;
148
+ const post = posts.get(reply.inReplyTo);
149
+ if (post === undefined)
150
+ continue;
151
+ said.push({ ...federatedInteraction(reply, naming(activity.actorId)), post });
152
+ if (said.length === limit)
153
+ break;
154
+ }
155
+ }
156
+ for (const stored of context.admin.listComments({
157
+ status: 'approved',
158
+ limit: limit * OVERSCAN,
159
+ })) {
160
+ const post = context.store.getBySlug(stored.slug);
161
+ if (post === undefined || !isPublicDocument(post, context.store.now()))
162
+ continue;
163
+ said.push({ ...interactionOf(stored, post.permalink), post });
164
+ }
165
+ return newestFirst(said, limit);
166
+ }
167
+ /** How many answers each of these posts has, by permalink. */
168
+ function commentCounts(context, documents) {
169
+ const counts = new Map();
170
+ for (const document of documents) {
171
+ const objectId = activityStreamsId(document, context.baseUrl);
172
+ const federated = objectId === undefined ? 0 : context.admin.countRepliesTo(objectId);
173
+ counts.set(document.permalink, federated + context.admin.countCommentsFor(document.slug, 'approved'));
174
+ }
175
+ return counts;
176
+ }
177
+ /**
178
+ * How many candidates a site-wide page reads for each one it keeps.
179
+ *
180
+ * Answers to a post that has since been unpublished are dropped after the
181
+ * index has already counted them, so the query has to over-read. Four is
182
+ * generous for a site whose posts mostly stay published and bounded for one
183
+ * whose posts do not.
184
+ */
185
+ const OVERSCAN = 4;
186
+ /** One logged fediverse reply as the thread's own shape. */
187
+ function federatedInteraction(reply, author) {
188
+ return {
189
+ id: reply.id,
190
+ source: 'activitypub',
191
+ kind: 'reply',
192
+ author,
193
+ url: reply.url,
194
+ // Sanitised here, at the edge of the site, so the page and the feed
195
+ // republish the same checked markup rather than each checking for itself.
196
+ content: sanitizeCommentHtml(reply.html),
197
+ published: reply.published,
198
+ inReplyTo: reply.inReplyTo,
199
+ status: 'published',
200
+ replies: [],
201
+ };
202
+ }
203
+ /**
204
+ * The approved native comments on a post, as interactions, oldest first.
205
+ *
206
+ * Only approved ones. A comment waiting for a moderator and one filed as spam
207
+ * are both in the file and both in the index, and neither is anything a reader
208
+ * should be shown — which is the whole difference between this and what the
209
+ * moderation screen asks for.
210
+ */
211
+ function approvedComments(admin, document) {
212
+ return admin
213
+ .listCommentsFor(document.slug)
214
+ .filter((comment) => comment.status === 'approved')
215
+ .map((comment) => interactionOf(comment, document.permalink));
216
+ }
217
+ /** One stored comment as the thread's own shape. */
218
+ function interactionOf(comment, permalink) {
219
+ return {
220
+ id: comment.id,
221
+ source: comment.source,
222
+ kind: comment.kind,
223
+ author: {
224
+ name: comment.author.name,
225
+ // A commenter has no fediverse identity: they gave a name, maybe a
226
+ // website, and nothing that names them anywhere else.
227
+ handle: null,
228
+ url: comment.author.url,
229
+ // Only a webmention has one: it came out of the source page's `h-card`,
230
+ // and a form asks nobody for a picture.
231
+ avatar: comment.author.avatar,
232
+ actorId: null,
233
+ },
234
+ // Where it can be read. A comment written here lives here, at its own
235
+ // anchor; a webmention lives on the page it was sent from, and its `url`
236
+ // says so. A theme that prints `url` for a fediverse reply prints a
237
+ // working link for either, and so does a feed.
238
+ url: comment.url ?? `${permalink}#${commentAnchor(comment.id)}`,
239
+ content: comment.content.html,
240
+ published: new Date(comment.submitted),
241
+ inReplyTo: comment.inReplyTo,
242
+ status: comment.status,
243
+ replies: [],
244
+ };
245
+ }
246
+ /**
247
+ * The `id` a comment is anchored at on the page.
248
+ *
249
+ * Prefixed rather than bare so a comment can never collide with a heading
250
+ * anchor the post's own Markdown produced.
251
+ */
252
+ export function commentAnchor(id) {
253
+ return `comment-${id}`;
254
+ }
255
+ /**
256
+ * Everything said in a conversation, at every depth and in no order: the
257
+ * replies and the mentions.
258
+ *
259
+ * The likes and the boosts are left out because they say nothing. A feed item
260
+ * is somebody's words, and "@ada liked this" has none to carry — a reader
261
+ * polling a comments feed would get an entry with an empty body and no way to
262
+ * tell what it was for.
263
+ */
264
+ export function spokenIn(conversation) {
265
+ const said = [...conversation.mentions];
266
+ const walk = (replies) => {
267
+ for (const reply of replies) {
268
+ said.push(reply);
269
+ walk(reply.replies);
270
+ }
271
+ };
272
+ walk(conversation.replies);
273
+ return said;
274
+ }
275
+ /**
276
+ * Interactions as a comments feed carries them: newest first, at most `limit`,
277
+ * and every link absolute.
278
+ *
279
+ * The one place an interaction becomes a feed item, so the post's feed and the
280
+ * site's cannot disagree about what a comment's `guid` or `link` is. The HTML
281
+ * is handed over as it stands and sanitised by the feed itself, at the last
282
+ * moment before it becomes bytes this site publishes.
283
+ */
284
+ export function feedComments(said, options) {
285
+ return newestFirst([...said], options.limit).map((entry) => ({
286
+ id: entry.id,
287
+ url: absoluteUrl(entry.url ?? '/', options.baseUrl),
288
+ author: entry.author.name,
289
+ published: entry.published,
290
+ html: entry.content,
291
+ ...(entry.post === undefined
292
+ ? {}
293
+ : { post: { title: entry.post.title, permalink: entry.post.permalink } }),
294
+ }));
295
+ }
296
+ /** The newest `limit` of a mixed list, which is the order every feed shows. */
297
+ function newestFirst(said, limit) {
298
+ return said
299
+ .sort((left, right) => right.published.getTime() - left.published.getTime())
300
+ .slice(0, limit);
301
+ }
302
+ /**
303
+ * The public post an ActivityStreams object id names, memoised.
304
+ *
305
+ * Almost every id is the post's permalink (decision-13), so the permalink is
306
+ * looked up first and the answer is checked against the document's own id — a
307
+ * post that is no longer public has no id at all. Only when that fails is the
308
+ * whole index read, once, to find the post whose file names this id: a post
309
+ * migrated from WordPress keeps the `?p=813` its followers already hold, and
310
+ * no permalink spells that.
311
+ */
312
+ class PostsByObjectId {
313
+ #context;
314
+ #found = new Map();
315
+ #all;
316
+ constructor(context) {
317
+ this.#context = context;
318
+ }
319
+ get(objectId) {
320
+ if (!this.#found.has(objectId))
321
+ this.#found.set(objectId, this.#resolve(objectId));
322
+ return this.#found.get(objectId);
323
+ }
324
+ #resolve(objectId) {
325
+ const permalink = permalinkOfObjectId(objectId, this.#context.baseUrl);
326
+ if (permalink !== undefined) {
327
+ const document = this.#context.store.getByPermalink(permalink);
328
+ if (document !== undefined &&
329
+ activityStreamsId(document, this.#context.baseUrl) === objectId) {
330
+ return document;
331
+ }
332
+ }
333
+ return this.#everything().get(objectId);
334
+ }
335
+ #everything() {
336
+ if (this.#all === undefined) {
337
+ this.#all = new Map();
338
+ for (const document of this.#context.store.listPosts()) {
339
+ const id = activityStreamsId(document, this.#context.baseUrl);
340
+ if (id !== undefined)
341
+ this.#all.set(id, document);
342
+ }
343
+ }
344
+ return this.#all;
345
+ }
346
+ }
347
+ /**
348
+ * The permalink an object id names, when it is one this site would have
349
+ * minted: the path, with the base URL's own directory taken off it.
350
+ *
351
+ * An id from another host belongs to no post here however it is spelled, and
352
+ * neither does one carrying a query string — a permalink has none, so an id
353
+ * like `?p=813` is a stored one and is found by the walk instead.
354
+ */
355
+ function permalinkOfObjectId(objectId, baseUrl) {
356
+ let url;
357
+ let base;
358
+ try {
359
+ url = new URL(objectId);
360
+ base = new URL(baseUrl);
361
+ }
362
+ catch {
363
+ return undefined;
364
+ }
365
+ if (url.origin !== base.origin || url.search !== '')
366
+ return undefined;
367
+ const directory = base.pathname === '/' ? '' : base.pathname.replace(/\/$/, '');
368
+ if (directory !== '' && !url.pathname.startsWith(`${directory}/`))
369
+ return undefined;
370
+ const pathname = url.pathname.slice(directory.length);
371
+ try {
372
+ return decodeURIComponent(pathname);
373
+ }
374
+ catch {
375
+ return pathname;
376
+ }
377
+ }
378
+ /**
379
+ * The replies as a thread: those answering the post at the top, each carrying
380
+ * the replies that answer it, oldest first at every level.
381
+ *
382
+ * Three things decide where a reply goes, and all three are what somebody
383
+ * reading the page would expect:
384
+ *
385
+ * - A reply whose target is gone — deleted by its author — is shown under
386
+ * whatever *that* was answering, rather than disappearing with it. The
387
+ * conversation stays readable and only the withdrawn note is missing.
388
+ * - A reply answering something that is no part of this conversation is left
389
+ * out. The log holds it because it named something this walk asked about — a
390
+ * note answering the like of a post is the shape of that — but the post is
391
+ * not what it is talking about.
392
+ * - A note the site was told about twice is one reply, because the map is
393
+ * keyed by the note's own id.
394
+ */
395
+ function threadOf(written, objectId, withdrawn) {
396
+ const byId = new Map();
397
+ const targets = new Map();
398
+ for (const reply of written) {
399
+ targets.set(reply.id, reply.inReplyTo ?? objectId);
400
+ if (!withdrawn.has(reply.id))
401
+ byId.set(reply.id, reply);
402
+ }
403
+ const top = [];
404
+ for (const reply of byId.values()) {
405
+ const parent = surviving(reply, targets, byId, objectId);
406
+ if (parent === undefined)
407
+ continue;
408
+ (parent === null ? top : parent.replies).push(reply);
409
+ }
410
+ return top;
411
+ }
412
+ /**
413
+ * The reply a reply hangs under: `null` for the post itself, the nearest
414
+ * surviving ancestor for one whose own target was deleted, and `undefined` for
415
+ * a note that is answering something else entirely.
416
+ *
417
+ * The walk is bounded by the number of notes, so a log carrying a cycle — two
418
+ * notes each claiming to answer the other, which nothing stops a remote server
419
+ * from sending — ends rather than hangs.
420
+ */
421
+ function surviving(reply, targets, byId, objectId) {
422
+ let target = targets.get(reply.id);
423
+ for (let step = 0; step <= targets.size; step += 1) {
424
+ if (target === undefined)
425
+ return undefined;
426
+ if (target === objectId)
427
+ return null;
428
+ const parent = byId.get(target);
429
+ if (parent !== undefined)
430
+ return parent === reply ? undefined : parent;
431
+ // The target is not a reply the site is showing: either a note its author
432
+ // deleted, whose own target this reply moves to, or nothing to do with the
433
+ // post at all.
434
+ target = targets.get(target);
435
+ }
436
+ return undefined;
437
+ }
438
+ /** Oldest first, which is the order a conversation reads in. */
439
+ function byPublished(left, right) {
440
+ return left.published.getTime() - right.published.getTime();
441
+ }
442
+ /** Put every level of a thread in time order, all the way down. */
443
+ function sortThread(replies) {
444
+ replies.sort(byPublished);
445
+ for (const reply of replies)
446
+ sortThread(reply.replies);
447
+ }
448
+ /** How many replies a thread holds, counting all the way down. */
449
+ function countReplies(replies) {
450
+ let total = 0;
451
+ for (const reply of replies)
452
+ total += 1 + countReplies(reply.replies);
453
+ return total;
454
+ }
455
+ /** The two reactions, as the activity types they arrive as. */
456
+ const REACTIONS = {
457
+ Like: 'like',
458
+ Announce: 'boost',
459
+ };
460
+ /**
461
+ * Every logged activity that has anything to do with a post, oldest first.
462
+ *
463
+ * The log is walked outwards rather than queried once: a reply names the post,
464
+ * a reply to that reply names the reply, and a `Delete` or an `Undo` names the
465
+ * activity it takes back. Each round asks about everything the last round
466
+ * turned up — the object an activity carried and the activity's own id — and
467
+ * stops when a round finds nothing new, which it must, because a row is
468
+ * collected once and there are finitely many.
469
+ */
470
+ function activitiesAround(admin, objectId) {
471
+ const collected = new Map();
472
+ const asked = new Set([objectId]);
473
+ let frontier = [objectId];
474
+ while (frontier.length > 0) {
475
+ const next = [];
476
+ for (const activity of admin.listActivitiesAbout(frontier)) {
477
+ if (collected.has(activity.id))
478
+ continue;
479
+ collected.set(activity.id, activity);
480
+ for (const id of [activity.objectId, activity.activityId]) {
481
+ if (id === null || asked.has(id))
482
+ continue;
483
+ asked.add(id);
484
+ next.push(id);
485
+ }
486
+ }
487
+ frontier = next;
488
+ }
489
+ // Row ids are the order things arrived in, and the rounds above return them
490
+ // out of that order.
491
+ return [...collected.values()].sort((left, right) => left.id - right.id);
492
+ }
493
+ /**
494
+ * The ids of everything an actor has taken back: the likes and boosts undone,
495
+ * and the notes deleted.
496
+ *
497
+ * Only by the actor that did it in the first place. Without that check any
498
+ * signed actor could delete somebody else's comment off this page, since the
499
+ * activity carrying the instruction is signed by its sender and says nothing
500
+ * about who the thing it names belonged to — which is the rule the inbox
501
+ * already applies to an `Undo(Follow)`.
502
+ */
503
+ function withdrawnBy(activities) {
504
+ const owners = new Map();
505
+ for (const activity of activities) {
506
+ if (activity.activityId !== null)
507
+ owners.set(activity.activityId, activity.actorId);
508
+ if (activity.objectId !== null && activity.activityType === REPLY_ACTIVITY_TYPE) {
509
+ owners.set(activity.objectId, activity.actorId);
510
+ }
511
+ }
512
+ const withdrawn = new Set();
513
+ for (const activity of activities) {
514
+ if (activity.activityType !== 'Undo' && activity.activityType !== 'Delete')
515
+ continue;
516
+ if (activity.objectId === null)
517
+ continue;
518
+ if (owners.get(activity.objectId) !== activity.actorId)
519
+ continue;
520
+ withdrawn.add(activity.objectId);
521
+ }
522
+ return withdrawn;
523
+ }
524
+ /**
525
+ * How an actor is named, memoised for the length of one conversation.
526
+ *
527
+ * A follower is named from the profile it published when it followed; everyone
528
+ * else is named by the handle their actor URL implies, which is a guess and
529
+ * deliberately so — naming them properly would mean dereferencing the actor,
530
+ * a network round trip per comment on the page.
531
+ */
532
+ function authorNaming(admin) {
533
+ const known = new Map();
534
+ // Read once, on the first unknown actor, rather than per actor: the
535
+ // followers are one row per (user, actor) now (decision-14), so the same
536
+ // stranger may be on the list several times and any of those rows names them
537
+ // the same way — the columns read here are the actor's own name and picture.
538
+ let profiles;
539
+ return (actorId) => {
540
+ const held = known.get(actorId);
541
+ if (held !== undefined)
542
+ return held;
543
+ profiles ??= new Map(admin.listFollowers().map((entry) => [entry.actorId, entry]));
544
+ const follower = profiles.get(actorId);
545
+ const handle = follower?.handle ?? actorHandle(actorId) ?? null;
546
+ const author = {
547
+ name: follower?.name ?? handle ?? actorId,
548
+ handle,
549
+ url: follower?.url ?? actorId,
550
+ avatar: follower?.iconUrl ?? null,
551
+ actorId,
552
+ };
553
+ known.set(actorId, author);
554
+ return author;
555
+ };
556
+ }
557
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/web/conversation.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,17 @@ import type { ContentStore } from '../content/store.ts';
3
3
  /**
4
4
  * Whether the public site may show a document.
5
5
  *
6
- * Two things hide one: `draft: true` in the front matter, and living under
7
- * `_trash/`. Both stay indexed so the admin can find them; neither is ever
8
- * served, listed, or fed.
6
+ * Three things hide one: `draft: true` in the front matter, living under
7
+ * `_trash/`, and a date that has not arrived yet. All three stay indexed so
8
+ * the admin can find them; none is ever served, listed, or fed.
9
+ *
10
+ * This is the predicate the index answers in SQL, so anything that has to
11
+ * decide about a single document in hand — a permalink, a View link, the
12
+ * sitemap — asks it here rather than deriving the rule again. The clock
13
+ * defaults to the system one; a caller with a store should pass
14
+ * {@link ContentStore.now} so the answer matches the listings it came from.
9
15
  */
10
- export declare function isPublicDocument(document: Document): boolean;
16
+ export declare function isPublicDocument(document: Document, now?: Date): boolean;
11
17
  /**
12
18
  * The document a public URL resolves to, or `undefined`.
13
19
  *
@@ -16,13 +22,37 @@ export declare function isPublicDocument(document: Document): boolean;
16
22
  * same document found the same way, so they cannot disagree about what exists.
17
23
  */
18
24
  export declare function publicDocumentAt(store: ContentStore, permalink: string): Document | undefined;
25
+ /**
26
+ * A post's ActivityStreams object id: its permalink, absolute on the site's
27
+ * base URL, or the id its file already names.
28
+ *
29
+ * decision-13. A permalink is by name permanent, and the fediverse id is the
30
+ * same promise made to a different audience, so one URL answers both: a
31
+ * browser gets the page and a peer gets the `Article`, by content negotiation.
32
+ * There is no second URL to mint and none to keep in step.
33
+ *
34
+ * A stored `activitypub.id` wins, for the life of the post. That is not a
35
+ * cache: it is what lets a post migrated from WordPress keep the
36
+ * `https://example.com/?p=813` id its followers, its replies and its RSS
37
+ * subscribers already hold (decision-14), so the CMS serves the object there
38
+ * too and names it in every `Update` and `Delete`. A hand-written
39
+ * `activitypub.id` that is not a URL is not an id, and the permalink is used
40
+ * instead.
41
+ *
42
+ * Unlike {@link activityStreamsId} this answers for any post, published or
43
+ * not: a draft that was announced before it was withdrawn still has the name
44
+ * its followers filed it under, and a `Delete` has to say it.
45
+ */
46
+ export declare function postObjectId(document: Document, baseUrl: string): string;
19
47
  /**
20
48
  * The ActivityStreams id of a document, or `undefined` when it has none.
21
49
  *
22
50
  * Only a published post federates (doc-4), so only a published post has an id
23
51
  * to advertise. This is what the theme's `<link rel="alternate">` points at,
24
- * and it is deliberately the same string the object dispatcher answers under:
25
- * the page and the object agree about the post's name in the fediverse.
52
+ * what every feed keys the post by (decision-12) and what the permalink
53
+ * answers an ActivityStreams request with: the page, the feed item and the
54
+ * object all agree about the post's name in the fediverse, because after
55
+ * decision-13 they are the same URL.
26
56
  */
27
57
  export declare function activityStreamsId(document: Document, baseUrl: string): string | undefined;
28
58
  //# sourceMappingURL=documents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/web/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAI7F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzF"}
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/web/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAEpF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAI7F;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAUxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzF"}