@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,26 @@
1
+ import type { FeedItem } from './feed-item.ts';
2
+ import type { CommentFeedSource, FeedSource } from './feed-source.ts';
3
+ /**
4
+ * RSS 2.0: the post feed, the comments feed, and the channel they share.
5
+ *
6
+ * The items come from {@link FeedItem}s rather than from documents, so what an
7
+ * RSS item says about a post is decided in one place and read here — and says
8
+ * the same as what Atom and JSON Feed say about it, because there is only one
9
+ * id, one term list and one summary on the item to print.
10
+ */
11
+ /** One feed as an RSS 2.0 document. */
12
+ export declare function rssFeed(source: FeedSource): string;
13
+ /**
14
+ * One item as RSS.
15
+ *
16
+ * The `guid` is the item's id, which decision-12 makes every feed's key for
17
+ * the post: after decision-13 that is the permalink itself, or the stored id a
18
+ * migrated post carries. `isPermaLink` tells a reader which of the two it is
19
+ * looking at — `true` when the id is the permalink, so a reader that resolves
20
+ * a guid finds the post, and `false` when it is a stored name like WordPress's
21
+ * `?p=813`, which is the id that post's subscribers already hold.
22
+ */
23
+ export declare function rssItem(item: FeedItem): string[];
24
+ /** One comments feed as an RSS 2.0 document. */
25
+ export declare function commentsRssFeed(source: CommentFeedSource): string;
26
+ //# sourceMappingURL=feed-rss.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-rss.d.ts","sourceRoot":"","sources":["../../src/web/feed-rss.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQ/C,OAAO,KAAK,EAAE,iBAAiB,EAAe,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAanF;;;;;;;GAOG;AAEH,uCAAuC;AACvC,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmClD;AA8CD;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAsBhD;AA2BD,gDAAgD;AAChD,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAgCjE"}
@@ -0,0 +1,203 @@
1
+ import { excerptFromHtml, feedItems } from './feed-item.js';
2
+ import { contentTypeOf, EMPTY_FEED_UPDATED, FEED_GENERATOR, feedLanguage, notifyServerOf, } from './feed-source.js';
3
+ import { cdata, DC_NAMESPACE, element, escapeXml, rfc822, SOURCE_NAMESPACE, WFW_NAMESPACE, } from './feed-xml.js';
4
+ import { absoluteUrl, latestModified } from './negotiate.js';
5
+ import { sanitizeCommentHtml } from './sanitize.js';
6
+ /**
7
+ * RSS 2.0: the post feed, the comments feed, and the channel they share.
8
+ *
9
+ * The items come from {@link FeedItem}s rather than from documents, so what an
10
+ * RSS item says about a post is decided in one place and read here — and says
11
+ * the same as what Atom and JSON Feed say about it, because there is only one
12
+ * id, one term list and one summary on the item to print.
13
+ */
14
+ /** One feed as an RSS 2.0 document. */
15
+ export function rssFeed(source) {
16
+ const { site, documents, baseUrl } = source;
17
+ const link = absoluteUrl(source.href, baseUrl);
18
+ const built = latestModified(documents) ?? EMPTY_FEED_UPDATED;
19
+ const lines = [
20
+ '<?xml version="1.0" encoding="utf-8"?>',
21
+ '<rss version="2.0"',
22
+ ' xmlns:atom="http://www.w3.org/2005/Atom"',
23
+ ' xmlns:content="http://purl.org/rss/1.0/modules/content/"',
24
+ ` xmlns:dc="${DC_NAMESPACE}"`,
25
+ ` xmlns:source="${SOURCE_NAMESPACE}"`,
26
+ ` xmlns:wfw="${WFW_NAMESPACE}">`,
27
+ ' <channel>',
28
+ element('title', source.title, 2),
29
+ element('link', link, 2),
30
+ // Required by the spec even when the site has no tagline, so it is written
31
+ // empty rather than left out.
32
+ element('description', site.tagline ?? '', 2),
33
+ element('language', feedLanguage(site), 2),
34
+ element('lastBuildDate', rfc822(built), 2),
35
+ element('generator', FEED_GENERATOR, 2),
36
+ ` <atom:link rel="self" type="${escapeXml(contentTypeOf('rss'))}" href="${escapeXml(absoluteUrl(source.feedHref, baseUrl))}"/>`,
37
+ ...cloudElements(site),
38
+ ...channelImage(source, link),
39
+ ];
40
+ for (const item of feedItems(documents, source)) {
41
+ lines.push(...rssItem(item));
42
+ }
43
+ lines.push(' </channel>', '</rss>', '');
44
+ return lines.join('\n');
45
+ }
46
+ /**
47
+ * The notify server, said the three ways an RSS channel can say it: the legacy
48
+ * `<cloud>` a 2001 aggregator understands, `<source:cloud>` for one that reads
49
+ * Dave Winer's namespace, and the WebSub `rel="hub"` link.
50
+ *
51
+ * All three name the same server, so a subscriber gets told the moment the
52
+ * feed changes whichever of the protocols it speaks. Nothing at all when the
53
+ * site names no server.
54
+ */
55
+ function cloudElements(site) {
56
+ const notify = notifyServerOf(site);
57
+ if (notify === undefined)
58
+ return [];
59
+ const { cloud } = notify;
60
+ return [
61
+ ` <cloud domain="${escapeXml(cloud.domain)}" port="${String(cloud.port)}"` +
62
+ ` path="${escapeXml(cloud.path)}"` +
63
+ ` registerProcedure="${escapeXml(cloud.registerProcedure)}"` +
64
+ ` protocol="${escapeXml(cloud.protocol)}"/>`,
65
+ element('source:cloud', notify.pleaseNotify, 2),
66
+ ` <atom:link rel="hub" href="${escapeXml(notify.hub)}"/>`,
67
+ ];
68
+ }
69
+ /**
70
+ * The channel's `<image>`, from the site's avatar.
71
+ *
72
+ * RSS wants the title and the link to repeat the channel's own, and a reader
73
+ * that shows a feed icon is showing the site's face; the avatar setting is the
74
+ * only picture a site names.
75
+ */
76
+ function channelImage(source, link) {
77
+ const avatar = source.site.avatar;
78
+ if (avatar === undefined || avatar === '')
79
+ return [];
80
+ return [
81
+ ' <image>',
82
+ element('url', absoluteUrl(avatar, source.baseUrl), 3),
83
+ element('title', source.title, 3),
84
+ element('link', link, 3),
85
+ ' </image>',
86
+ ];
87
+ }
88
+ /**
89
+ * One item as RSS.
90
+ *
91
+ * The `guid` is the item's id, which decision-12 makes every feed's key for
92
+ * the post: after decision-13 that is the permalink itself, or the stored id a
93
+ * migrated post carries. `isPermaLink` tells a reader which of the two it is
94
+ * looking at — `true` when the id is the permalink, so a reader that resolves
95
+ * a guid finds the post, and `false` when it is a stored name like WordPress's
96
+ * `?p=813`, which is the id that post's subscribers already hold.
97
+ */
98
+ export function rssItem(item) {
99
+ return [
100
+ ' <item>',
101
+ element('title', item.title, 3),
102
+ element('link', item.link, 3),
103
+ ` <guid isPermaLink="${item.id === item.link ? 'true' : 'false'}">` +
104
+ `${escapeXml(item.id)}</guid>`,
105
+ ...(item.published === undefined ? [] : [element('pubDate', rfc822(item.published), 3)]),
106
+ ...(item.creator === undefined ? [] : [element('dc:creator', item.creator, 3)]),
107
+ // Every term becomes a category. RSS has one `<category>` and no way to say
108
+ // which vocabulary a term came from, which is exactly how WordPress
109
+ // publishes tags and categories too.
110
+ ...item.terms.map((term) => ` <category>${escapeXml(term)}</category>`),
111
+ ...commentPointers(item),
112
+ element('description', item.summary, 3),
113
+ ` <content:encoded>${cdata(item.html)}</content:encoded>`,
114
+ // The source of the item, per the namespace: a reader that understands
115
+ // Markdown should render from this rather than from the HTML above. It is
116
+ // the same text the ActivityStreams `Article` carries as its `source`.
117
+ ` <source:markdown>${cdata(item.markdown)}</source:markdown>`,
118
+ ' </item>',
119
+ ];
120
+ }
121
+ /**
122
+ * Where one item's comments are, said three ways.
123
+ *
124
+ * `<comments>` is the page a person should read them on and `wfw:commentRss`
125
+ * the feed a reader should poll, which is the pair WordPress publishes and so
126
+ * the pair every reader already understands. `source:comments` is the same
127
+ * feed with the count beside it, so a reader can say "3 comments" without
128
+ * fetching anything.
129
+ *
130
+ * Written only when the item carries them: a feed whose builder did not
131
+ * resolve the counts would otherwise publish "0 comments" about a post with
132
+ * plenty.
133
+ */
134
+ function commentPointers(item) {
135
+ const comments = item.comments;
136
+ if (comments === undefined)
137
+ return [];
138
+ return [
139
+ element('comments', comments.page, 3),
140
+ element('wfw:commentRss', comments.feed, 3),
141
+ ` <source:comments count="${String(comments.count)}" ` +
142
+ `feedUrl="${escapeXml(comments.feed)}"/>`,
143
+ ];
144
+ }
145
+ /** One comments feed as an RSS 2.0 document. */
146
+ export function commentsRssFeed(source) {
147
+ const { site, comments, baseUrl } = source;
148
+ const link = absoluteUrl(source.href, baseUrl);
149
+ const built = comments[0]?.published ?? EMPTY_FEED_UPDATED;
150
+ const lines = [
151
+ '<?xml version="1.0" encoding="utf-8"?>',
152
+ '<rss version="2.0"',
153
+ ' xmlns:atom="http://www.w3.org/2005/Atom"',
154
+ ' xmlns:content="http://purl.org/rss/1.0/modules/content/"',
155
+ ` xmlns:dc="${DC_NAMESPACE}"`,
156
+ ` xmlns:source="${SOURCE_NAMESPACE}">`,
157
+ ' <channel>',
158
+ element('title', source.title, 2),
159
+ element('link', link, 2),
160
+ element('description', site.tagline ?? '', 2),
161
+ element('language', feedLanguage(site), 2),
162
+ element('lastBuildDate', rfc822(built), 2),
163
+ element('generator', FEED_GENERATOR, 2),
164
+ ` <atom:link rel="self" type="${escapeXml(contentTypeOf('rss'))}" href="${escapeXml(absoluteUrl(source.feedHref, baseUrl))}"/>`,
165
+ // A comments feed is polled like any other, so it advertises the same
166
+ // server: a subscriber to one is told a reply arrived rather than finding
167
+ // out on its next poll.
168
+ ...cloudElements(site),
169
+ ];
170
+ for (const comment of comments)
171
+ lines.push(...commentItem(comment));
172
+ lines.push(' </channel>', '</rss>', '');
173
+ return lines.join('\n');
174
+ }
175
+ /**
176
+ * One comment as an RSS item.
177
+ *
178
+ * A comment is not a {@link FeedItem}: it is one entry of the conversation
179
+ * under a post, with its own id, its own author and no taxonomy at all, and
180
+ * the Conversation module is what derives it. The sanitising happens here, at
181
+ * the last moment before the markup a stranger wrote becomes bytes this site
182
+ * publishes, so there is one place to check rather than one per caller.
183
+ */
184
+ function commentItem(comment) {
185
+ const html = sanitizeCommentHtml(comment.html);
186
+ const title = comment.post === undefined ? comment.author : `${comment.author} on ${comment.post.title}`;
187
+ return [
188
+ ' <item>',
189
+ element('title', title, 3),
190
+ element('link', comment.url, 3),
191
+ // A reply's id is a name rather than an address: some servers publish a
192
+ // note at an id nothing dereferences and a `url` somewhere else entirely.
193
+ ` <guid isPermaLink="false">${escapeXml(comment.id)}</guid>`,
194
+ element('pubDate', rfc822(comment.published), 3),
195
+ element('dc:creator', comment.author, 3),
196
+ // A comment never carries a description, so its summary is always an
197
+ // excerpt of what it says.
198
+ element('description', excerptFromHtml(html), 3),
199
+ ` <content:encoded>${cdata(html)}</content:encoded>`,
200
+ ' </item>',
201
+ ];
202
+ }
203
+ //# sourceMappingURL=feed-rss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-rss.js","sourceRoot":"","sources":["../../src/web/feed-rss.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,244 @@
1
+ import type { Document } from '../content/document.ts';
2
+ import type { SiteData } from './context.ts';
3
+ /**
4
+ * What a feed is, before anything has been written: which formats the site
5
+ * serves, where each one lives, what the site's settings say about it, and
6
+ * what one feed is built from.
7
+ *
8
+ * Everything here is a fact about the feed as a whole — its URL, its language,
9
+ * its notify server, its entries — rather than about any one item or any one
10
+ * format. The serialisers and the response layer both read it, which is why it
11
+ * sits below them and imports neither.
12
+ */
13
+ /**
14
+ * The three syndication formats the public site serves.
15
+ *
16
+ * Feeds are fixed routes rather than representations (doc-3): a feed reader
17
+ * sends whatever `Accept` header its HTTP library happened to default to, so
18
+ * the URL has to say which format it wants.
19
+ *
20
+ * RSS is first because it is what the subscribers of a site moving off
21
+ * WordPress actually hold, and it is what the bare `/feed/` serves.
22
+ */
23
+ export type FeedFormat = 'rss' | 'atom' | 'json';
24
+ /** Every format, RSS first, in the order a page should advertise them. */
25
+ export declare const FEED_FORMATS: readonly FeedFormat[];
26
+ /** The segment every feed URL hangs off its listing root by: `/feed/…`. */
27
+ export declare const FEED_SEGMENT = "feed";
28
+ /**
29
+ * The segment under `feed/` each format lives at.
30
+ *
31
+ * RSS has none, so the bare `/feed/` is RSS 2.0 — WordPress's layout, and the
32
+ * URL every existing subscriber of a migrated site already polls.
33
+ */
34
+ export declare const FEED_SEGMENTS: Readonly<Record<FeedFormat, string>>;
35
+ /**
36
+ * Spellings WordPress also answered on, which this site redirects rather than
37
+ * serves. `/feed/rss/` was its alias for the RSS 2.0 feed.
38
+ */
39
+ export declare const FEED_ALIASES: Readonly<Record<string, FeedFormat>>;
40
+ /**
41
+ * The root the site-wide comments feed hangs off, so `/comments/feed/` is the
42
+ * URL WordPress served it at. It is a listing root like any other as far as
43
+ * {@link feedPathUnder} is concerned; nothing is served at the root itself.
44
+ */
45
+ export declare const COMMENTS_ROOT = "/comments/";
46
+ /** What a post's comments feed calls itself, before the post's title. */
47
+ export declare const COMMENTS_TITLE_PREFIX = "Comments on: ";
48
+ /** What each format is labelled with on the wire. */
49
+ export declare const FEED_CONTENT_TYPES: Readonly<Record<FeedFormat, string>>;
50
+ /**
51
+ * The URL of one format's feed under a listing root.
52
+ *
53
+ * The root is any listing URL ending in `/` — the site root, a taxonomy
54
+ * archive, and in time a post's permalink for its comments feed — so this is
55
+ * the one place the `/feed/…/` shape is spelled.
56
+ */
57
+ export declare function feedPathUnder(root: string, format: FeedFormat): string;
58
+ /**
59
+ * The URL of a comments feed: one post's, or — with no permalink — the whole
60
+ * site's.
61
+ *
62
+ * WordPress's URLs, so a site migrated from it keeps both. There is one format,
63
+ * RSS 2.0, because that is what a comments feed is read in.
64
+ */
65
+ export declare function commentsFeedPath(permalink?: string): string;
66
+ /** A feed URL taken apart: which listing it syndicates, and in what format. */
67
+ export interface FeedPath {
68
+ /** The listing root the feed hangs off, ending in `/`. */
69
+ root: string;
70
+ /** Which format the URL asked for. */
71
+ format: FeedFormat;
72
+ /**
73
+ * Whether this is the canonical spelling of that feed. `/feed/rss/` is not:
74
+ * it is a WordPress alias, and it earns a redirect rather than a body.
75
+ */
76
+ canonical: boolean;
77
+ }
78
+ /**
79
+ * A path as the feed it names, or `undefined` when it names none.
80
+ *
81
+ * The inverse of {@link feedPathUnder}, and deliberately ignorant of what the
82
+ * root turns out to be: the caller decides whether `/tag/x/` is a listing it
83
+ * serves. Only the slashed form parses; the bare `/feed` is handled by the
84
+ * canonical redirect, like every other missing trailing slash on the site.
85
+ */
86
+ export declare function splitFeedPath(pathname: string): FeedPath | undefined;
87
+ /** The media type a format is labelled with, without the charset. */
88
+ export declare function contentTypeOf(format: FeedFormat): string;
89
+ /**
90
+ * The notify server a site advertises and pings when it has not said
91
+ * otherwise: the one this CMS's author runs, which speaks both rssCloud and
92
+ * WebSub, so one server covers every real-time subscriber a feed has.
93
+ */
94
+ export declare const DEFAULT_NOTIFY_SERVER = "https://rpc.rsscloud.io";
95
+ /** The three paths a notify server answers on, under whatever URL it lives at. */
96
+ export declare const NOTIFY_PATHS: {
97
+ /** Where a subscriber registers for rssCloud notifications. */
98
+ readonly pleaseNotify: 'pleaseNotify';
99
+ /** The WebSub hub: where a subscriber subscribes, and a publisher publishes. */
100
+ readonly hub: 'websub';
101
+ /** Where this site says a feed changed. */
102
+ readonly ping: 'ping';
103
+ };
104
+ /**
105
+ * The port and protocol the legacy `<cloud>` element carries, whatever scheme
106
+ * the server itself is reached over.
107
+ *
108
+ * rpc.rsscloud.io's quick start prescribes exactly these: the element predates
109
+ * TLS being the default, and a reader that understands it is looking for the
110
+ * shape rather than for a port to dial.
111
+ */
112
+ export declare const NOTIFY_CLOUD_PORT = 80;
113
+ /** The `protocol` of that same element. */
114
+ export declare const NOTIFY_CLOUD_PROTOCOL = "http-post";
115
+ /** One notify server, as the three vocabularies that talk to it spell it. */
116
+ export interface NotifyServer {
117
+ /** The server's URL, without a trailing slash. What the setting holds. */
118
+ base: string;
119
+ /** Where an rssCloud subscriber registers: `source:cloud`. */
120
+ pleaseNotify: string;
121
+ /** The WebSub hub: `atom:link rel="hub"` and JSON Feed's `hubs`. */
122
+ hub: string;
123
+ /** Where this site announces that a feed changed. */
124
+ ping: string;
125
+ /** The same registration endpoint, taken apart for RSS's `<cloud>`. */
126
+ cloud: {
127
+ /** The server's host name. */
128
+ domain: string;
129
+ /** Always {@link NOTIFY_CLOUD_PORT}. */
130
+ port: number;
131
+ /** The registration path, from the root of that host. */
132
+ path: string;
133
+ /** Empty: the REST endpoint takes no procedure name. */
134
+ registerProcedure: string;
135
+ /** Always {@link NOTIFY_CLOUD_PROTOCOL}. */
136
+ protocol: string;
137
+ };
138
+ }
139
+ /**
140
+ * One notify server URL as everything derived from it, or `undefined` when
141
+ * there is no server: an empty setting is how a site turns the whole feature
142
+ * off, and a value that is not an absolute http(s) URL is treated the same way
143
+ * rather than published as nonsense.
144
+ */
145
+ export declare function notifyEndpoints(server: string): NotifyServer | undefined;
146
+ /**
147
+ * The notify server this site's feeds advertise, from `notifyServer` in
148
+ * `content/_data/site.json`.
149
+ *
150
+ * An empty value is a site that turned real-time notification off; a missing
151
+ * key is a site that has never said, and gets {@link DEFAULT_NOTIFY_SERVER}.
152
+ * That is the same rule the settings read the file by, so the server the feeds
153
+ * advertise is always the server the CMS pings.
154
+ */
155
+ export declare function notifyServerOf(site: SiteData): NotifyServer | undefined;
156
+ /** How many entries a feed carries when the site does not say. */
157
+ export declare const DEFAULT_FEED_SIZE = 20;
158
+ /** What the feeds name themselves as. */
159
+ export declare const FEED_GENERATOR = "Geekity";
160
+ /** Where a reader can go to find out what wrote the feed. */
161
+ export declare const FEED_GENERATOR_URI = "https://www.npmjs.com/package/@geekity/cms";
162
+ /**
163
+ * How many entries a feed carries.
164
+ *
165
+ * `feedSize` in `content/_data/site.json` wins; without it a feed is longer
166
+ * than an archive page, because a reader that polls once a day should not miss
167
+ * a post on a site that publishes several.
168
+ */
169
+ export declare function feedSize(site: SiteData): number;
170
+ /** The language a feed declares when the site does not name one. */
171
+ export declare const DEFAULT_FEED_LANGUAGE = "en";
172
+ /** The language tag a feed declares: the site's, or {@link DEFAULT_FEED_LANGUAGE}. */
173
+ export declare function feedLanguage(site: SiteData): string;
174
+ /**
175
+ * The instant a feed reports as its own `updated`.
176
+ *
177
+ * An empty feed still has to carry one, and it has to be the same on every
178
+ * request or the ETag would change while nothing did, so it is the epoch
179
+ * rather than the clock.
180
+ */
181
+ export declare const EMPTY_FEED_UPDATED: Date;
182
+ /** Everything one feed is built from, whichever format it ends up in. */
183
+ export interface FeedSource {
184
+ /** Site-wide data, for the title, subtitle and author. */
185
+ site: SiteData;
186
+ /** The entries, newest first. Already filtered to what the public may see. */
187
+ documents: readonly Document[];
188
+ /** Title of this feed. The site title, or the site title and the tag. */
189
+ title: string;
190
+ /** Path of the HTML page this feed syndicates: `/` or `/tags/{tag}/`. */
191
+ href: string;
192
+ /** Path of the feed itself, for the self link. */
193
+ feedHref: string;
194
+ /** The site's public origin, for absolute ids and links. */
195
+ baseUrl: string;
196
+ /**
197
+ * How many replies each document has, by permalink, for the comment
198
+ * pointers every RSS item carries.
199
+ *
200
+ * Resolved rather than looked up while the feed is written, because the
201
+ * counts are part of the feed's own validator: a post that has been answered
202
+ * since is a changed feed even though no post moved.
203
+ */
204
+ commentCounts?: ReadonlyMap<string, number> | undefined;
205
+ }
206
+ /** Everything one comments feed is built from. */
207
+ export interface CommentFeedSource {
208
+ /** Site-wide data, for the description and the language. */
209
+ site: SiteData;
210
+ /** The comments, newest first. Their HTML is sanitised here, not before. */
211
+ comments: readonly FeedComment[];
212
+ /** Title of this feed: `Comments on: {post}`, or the site's. */
213
+ title: string;
214
+ /** Path of the HTML page these comments are about. */
215
+ href: string;
216
+ /** Path of the feed itself, for the self link. */
217
+ feedHref: string;
218
+ /** The site's public origin, for absolute links. */
219
+ baseUrl: string;
220
+ }
221
+ /** One comment, as a feed shows it. */
222
+ export interface FeedComment {
223
+ /** The reply's own name in the fediverse: the `guid`. */
224
+ id: string;
225
+ /** Where it can be read. */
226
+ url: string;
227
+ /** Who wrote it. */
228
+ author: string;
229
+ /** When it was published. */
230
+ published: Date;
231
+ /** What it says, as its own server rendered it and before sanitising. */
232
+ html: string;
233
+ /**
234
+ * The post it answers, named on every item of the site-wide feed and on none
235
+ * of a post's own — there, every item answers the same post.
236
+ */
237
+ post?: {
238
+ title: string;
239
+ permalink: string;
240
+ } | undefined;
241
+ }
242
+ /** Enough of any feed to say where it lives: what a header needs from one. */
243
+ export type FeedIdentity = Pick<FeedSource, 'site' | 'feedHref' | 'baseUrl'>;
244
+ //# sourceMappingURL=feed-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-source.d.ts","sourceRoot":"","sources":["../../src/web/feed-source.ts"],"names":[],"mappings":"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"}