@geekity/cms 0.3.0 → 0.4.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 (637) hide show
  1. package/README.md +2091 -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/pages/documents/editor.njk +196 -0
  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/media/library.njk +160 -0
  19. package/admin/pages/messages/all.njk +110 -0
  20. package/admin/{layouts → pages}/placeholder.njk +5 -1
  21. package/admin/pages/settings/discussion.njk +99 -0
  22. package/admin/pages/settings/email.njk +203 -0
  23. package/admin/pages/settings/federation.njk +75 -0
  24. package/admin/pages/settings/general.njk +29 -0
  25. package/admin/pages/settings/permalinks.njk +50 -0
  26. package/admin/pages/settings/reading.njk +72 -0
  27. package/admin/pages/users/edit.njk +239 -0
  28. package/admin/pages/users/list.njk +48 -0
  29. package/admin/pages/users/new.njk +41 -0
  30. package/admin/static/admin.css +498 -3
  31. package/admin/static/copy.js +52 -0
  32. package/admin/static/editor.js +16 -16
  33. package/admin/static/slug.js +61 -0
  34. package/dist/admin/accounts.d.ts +413 -0
  35. package/dist/admin/accounts.d.ts.map +1 -0
  36. package/dist/admin/accounts.js +680 -0
  37. package/dist/admin/accounts.js.map +1 -0
  38. package/dist/admin/appearance.d.ts +80 -0
  39. package/dist/admin/appearance.d.ts.map +1 -0
  40. package/dist/admin/appearance.js +136 -0
  41. package/dist/admin/appearance.js.map +1 -0
  42. package/dist/admin/comments.d.ts +90 -0
  43. package/dist/admin/comments.d.ts.map +1 -0
  44. package/dist/admin/comments.js +244 -0
  45. package/dist/admin/comments.js.map +1 -0
  46. package/dist/admin/credentials.d.ts +26 -2
  47. package/dist/admin/credentials.d.ts.map +1 -1
  48. package/dist/admin/credentials.js +35 -2
  49. package/dist/admin/credentials.js.map +1 -1
  50. package/dist/admin/documents.d.ts +127 -10
  51. package/dist/admin/documents.d.ts.map +1 -1
  52. package/dist/admin/documents.js +360 -41
  53. package/dist/admin/documents.js.map +1 -1
  54. package/dist/admin/federation.d.ts +151 -50
  55. package/dist/admin/federation.d.ts.map +1 -1
  56. package/dist/admin/federation.js +225 -93
  57. package/dist/admin/federation.js.map +1 -1
  58. package/dist/admin/formatting.d.ts +20 -0
  59. package/dist/admin/formatting.d.ts.map +1 -0
  60. package/dist/admin/formatting.js +72 -0
  61. package/dist/admin/formatting.js.map +1 -0
  62. package/dist/admin/headers.d.ts +65 -0
  63. package/dist/admin/headers.d.ts.map +1 -0
  64. package/dist/admin/headers.js +104 -0
  65. package/dist/admin/headers.js.map +1 -0
  66. package/dist/admin/index.d.ts +38 -12
  67. package/dist/admin/index.d.ts.map +1 -1
  68. package/dist/admin/index.js +25 -7
  69. package/dist/admin/index.js.map +1 -1
  70. package/dist/admin/media.d.ts +168 -0
  71. package/dist/admin/media.d.ts.map +1 -0
  72. package/dist/admin/media.js +295 -0
  73. package/dist/admin/media.js.map +1 -0
  74. package/dist/admin/menu.d.ts +79 -0
  75. package/dist/admin/menu.d.ts.map +1 -0
  76. package/dist/admin/menu.js +126 -0
  77. package/dist/admin/menu.js.map +1 -0
  78. package/dist/admin/messages.d.ts +80 -0
  79. package/dist/admin/messages.d.ts.map +1 -0
  80. package/dist/admin/messages.js +152 -0
  81. package/dist/admin/messages.js.map +1 -0
  82. package/dist/admin/preview.d.ts.map +1 -1
  83. package/dist/admin/preview.js +31 -7
  84. package/dist/admin/preview.js.map +1 -1
  85. package/dist/admin/recovery.d.ts +92 -0
  86. package/dist/admin/recovery.d.ts.map +1 -0
  87. package/dist/admin/recovery.js +229 -0
  88. package/dist/admin/recovery.js.map +1 -0
  89. package/dist/admin/routes.d.ts +0 -20
  90. package/dist/admin/routes.d.ts.map +1 -1
  91. package/dist/admin/routes.js +155 -105
  92. package/dist/admin/routes.js.map +1 -1
  93. package/dist/admin/settings-discussion.d.ts +37 -0
  94. package/dist/admin/settings-discussion.d.ts.map +1 -0
  95. package/dist/admin/settings-discussion.js +117 -0
  96. package/dist/admin/settings-discussion.js.map +1 -0
  97. package/dist/admin/settings-email.d.ts +54 -0
  98. package/dist/admin/settings-email.d.ts.map +1 -0
  99. package/dist/admin/settings-email.js +189 -0
  100. package/dist/admin/settings-email.js.map +1 -0
  101. package/dist/admin/settings-federation.d.ts +39 -0
  102. package/dist/admin/settings-federation.d.ts.map +1 -0
  103. package/dist/admin/settings-federation.js +103 -0
  104. package/dist/admin/settings-federation.js.map +1 -0
  105. package/dist/admin/settings-general.d.ts +12 -0
  106. package/dist/admin/settings-general.d.ts.map +1 -0
  107. package/dist/admin/settings-general.js +48 -0
  108. package/dist/admin/settings-general.js.map +1 -0
  109. package/dist/admin/settings-page.d.ts +102 -0
  110. package/dist/admin/settings-page.d.ts.map +1 -0
  111. package/dist/admin/settings-page.js +126 -0
  112. package/dist/admin/settings-page.js.map +1 -0
  113. package/dist/admin/settings-pages.d.ts +19 -0
  114. package/dist/admin/settings-pages.d.ts.map +1 -0
  115. package/dist/admin/settings-pages.js +33 -0
  116. package/dist/admin/settings-pages.js.map +1 -0
  117. package/dist/admin/settings-permalinks.d.ts +16 -0
  118. package/dist/admin/settings-permalinks.d.ts.map +1 -0
  119. package/dist/admin/settings-permalinks.js +32 -0
  120. package/dist/admin/settings-permalinks.js.map +1 -0
  121. package/dist/admin/settings-reading.d.ts +33 -0
  122. package/dist/admin/settings-reading.d.ts.map +1 -0
  123. package/dist/admin/settings-reading.js +48 -0
  124. package/dist/admin/settings-reading.js.map +1 -0
  125. package/dist/admin/settings.d.ts +325 -96
  126. package/dist/admin/settings.d.ts.map +1 -1
  127. package/dist/admin/settings.js +650 -308
  128. package/dist/admin/settings.js.map +1 -1
  129. package/dist/admin/store.d.ts +606 -152
  130. package/dist/admin/store.d.ts.map +1 -1
  131. package/dist/admin/store.js +863 -268
  132. package/dist/admin/store.js.map +1 -1
  133. package/dist/admin/taxonomy.d.ts +114 -0
  134. package/dist/admin/taxonomy.d.ts.map +1 -0
  135. package/dist/admin/taxonomy.js +289 -0
  136. package/dist/admin/taxonomy.js.map +1 -0
  137. package/dist/admin/templates.d.ts +44 -14
  138. package/dist/admin/templates.d.ts.map +1 -1
  139. package/dist/admin/templates.js +44 -14
  140. package/dist/admin/templates.js.map +1 -1
  141. package/dist/admin/throttle.d.ts +84 -0
  142. package/dist/admin/throttle.d.ts.map +1 -0
  143. package/dist/admin/throttle.js +143 -0
  144. package/dist/admin/throttle.js.map +1 -0
  145. package/dist/admin/uploads.d.ts +28 -2
  146. package/dist/admin/uploads.d.ts.map +1 -1
  147. package/dist/admin/uploads.js +43 -4
  148. package/dist/admin/uploads.js.map +1 -1
  149. package/dist/admin/users.d.ts +100 -13
  150. package/dist/admin/users.d.ts.map +1 -1
  151. package/dist/admin/users.js +412 -39
  152. package/dist/admin/users.js.map +1 -1
  153. package/dist/cache.d.ts +141 -0
  154. package/dist/cache.d.ts.map +1 -0
  155. package/dist/cache.js +207 -0
  156. package/dist/cache.js.map +1 -0
  157. package/dist/cli.d.ts +14 -2
  158. package/dist/cli.d.ts.map +1 -1
  159. package/dist/cli.js +424 -21
  160. package/dist/cli.js.map +1 -1
  161. package/dist/comments/akismet.d.ts +130 -0
  162. package/dist/comments/akismet.d.ts.map +1 -0
  163. package/dist/comments/akismet.js +274 -0
  164. package/dist/comments/akismet.js.map +1 -0
  165. package/dist/comments/conversation.d.ts +29 -0
  166. package/dist/comments/conversation.d.ts.map +1 -0
  167. package/dist/comments/conversation.js +60 -0
  168. package/dist/comments/conversation.js.map +1 -0
  169. package/dist/comments/form.d.ts +75 -0
  170. package/dist/comments/form.d.ts.map +1 -0
  171. package/dist/comments/form.js +64 -0
  172. package/dist/comments/form.js.map +1 -0
  173. package/dist/comments/index.d.ts +15 -0
  174. package/dist/comments/index.d.ts.map +1 -0
  175. package/dist/comments/index.js +9 -0
  176. package/dist/comments/index.js.map +1 -0
  177. package/dist/comments/markdown.d.ts +8 -0
  178. package/dist/comments/markdown.d.ts.map +1 -0
  179. package/dist/comments/markdown.js +85 -0
  180. package/dist/comments/markdown.js.map +1 -0
  181. package/dist/comments/moderate.d.ts +71 -0
  182. package/dist/comments/moderate.d.ts.map +1 -0
  183. package/dist/comments/moderate.js +88 -0
  184. package/dist/comments/moderate.js.map +1 -0
  185. package/dist/comments/policy.d.ts +57 -0
  186. package/dist/comments/policy.d.ts.map +1 -0
  187. package/dist/comments/policy.js +80 -0
  188. package/dist/comments/policy.js.map +1 -0
  189. package/dist/comments/records.d.ts +266 -0
  190. package/dist/comments/records.d.ts.map +1 -0
  191. package/dist/comments/records.js +487 -0
  192. package/dist/comments/records.js.map +1 -0
  193. package/dist/comments/routes.d.ts +58 -0
  194. package/dist/comments/routes.d.ts.map +1 -0
  195. package/dist/comments/routes.js +177 -0
  196. package/dist/comments/routes.js.map +1 -0
  197. package/dist/comments/submission.d.ts +263 -0
  198. package/dist/comments/submission.d.ts.map +1 -0
  199. package/dist/comments/submission.js +241 -0
  200. package/dist/comments/submission.js.map +1 -0
  201. package/dist/config.d.ts +190 -5
  202. package/dist/config.d.ts.map +1 -1
  203. package/dist/config.js +118 -6
  204. package/dist/config.js.map +1 -1
  205. package/dist/contact/delivery.d.ts +60 -0
  206. package/dist/contact/delivery.d.ts.map +1 -0
  207. package/dist/contact/delivery.js +87 -0
  208. package/dist/contact/delivery.js.map +1 -0
  209. package/dist/contact/form.d.ts +130 -0
  210. package/dist/contact/form.d.ts.map +1 -0
  211. package/dist/contact/form.js +163 -0
  212. package/dist/contact/form.js.map +1 -0
  213. package/dist/contact/index.d.ts +17 -0
  214. package/dist/contact/index.d.ts.map +1 -0
  215. package/dist/contact/index.js +13 -0
  216. package/dist/contact/index.js.map +1 -0
  217. package/dist/contact/records.d.ts +124 -0
  218. package/dist/contact/records.d.ts.map +1 -0
  219. package/dist/contact/records.js +218 -0
  220. package/dist/contact/records.js.map +1 -0
  221. package/dist/contact/routes.d.ts +17 -0
  222. package/dist/contact/routes.d.ts.map +1 -0
  223. package/dist/contact/routes.js +127 -0
  224. package/dist/contact/routes.js.map +1 -0
  225. package/dist/contact/submission.d.ts +103 -0
  226. package/dist/contact/submission.d.ts.map +1 -0
  227. package/dist/contact/submission.js +166 -0
  228. package/dist/contact/submission.js.map +1 -0
  229. package/dist/content/document.d.ts +7 -2
  230. package/dist/content/document.d.ts.map +1 -1
  231. package/dist/content/document.js +1 -0
  232. package/dist/content/document.js.map +1 -1
  233. package/dist/content/index.d.ts +7 -2
  234. package/dist/content/index.d.ts.map +1 -1
  235. package/dist/content/index.js +4 -1
  236. package/dist/content/index.js.map +1 -1
  237. package/dist/content/markdown.d.ts.map +1 -1
  238. package/dist/content/markdown.js +24 -2
  239. package/dist/content/markdown.js.map +1 -1
  240. package/dist/content/parser.d.ts.map +1 -1
  241. package/dist/content/parser.js +11 -4
  242. package/dist/content/parser.js.map +1 -1
  243. package/dist/content/save.d.ts +5 -0
  244. package/dist/content/save.d.ts.map +1 -1
  245. package/dist/content/save.js +44 -1
  246. package/dist/content/save.js.map +1 -1
  247. package/dist/content/schedule.d.ts +125 -0
  248. package/dist/content/schedule.d.ts.map +1 -0
  249. package/dist/content/schedule.js +207 -0
  250. package/dist/content/schedule.js.map +1 -0
  251. package/dist/content/search.d.ts +64 -0
  252. package/dist/content/search.d.ts.map +1 -0
  253. package/dist/content/search.js +136 -0
  254. package/dist/content/search.js.map +1 -0
  255. package/dist/content/store.d.ts +202 -7
  256. package/dist/content/store.d.ts.map +1 -1
  257. package/dist/content/store.js +374 -67
  258. package/dist/content/store.js.map +1 -1
  259. package/dist/content/sync.d.ts +7 -1
  260. package/dist/content/sync.d.ts.map +1 -1
  261. package/dist/content/sync.js +18 -10
  262. package/dist/content/sync.js.map +1 -1
  263. package/dist/content/time.d.ts +56 -0
  264. package/dist/content/time.d.ts.map +1 -0
  265. package/dist/content/time.js +141 -0
  266. package/dist/content/time.js.map +1 -0
  267. package/dist/content/writer.d.ts.map +1 -1
  268. package/dist/content/writer.js +3 -0
  269. package/dist/content/writer.js.map +1 -1
  270. package/dist/env.d.ts +58 -4
  271. package/dist/env.d.ts.map +1 -1
  272. package/dist/federation/actor.d.ts +95 -41
  273. package/dist/federation/actor.d.ts.map +1 -1
  274. package/dist/federation/actor.js +180 -53
  275. package/dist/federation/actor.js.map +1 -1
  276. package/dist/federation/article.d.ts +44 -17
  277. package/dist/federation/article.d.ts.map +1 -1
  278. package/dist/federation/article.js +98 -46
  279. package/dist/federation/article.js.map +1 -1
  280. package/dist/federation/delivery.d.ts +63 -15
  281. package/dist/federation/delivery.d.ts.map +1 -1
  282. package/dist/federation/delivery.js +154 -80
  283. package/dist/federation/delivery.js.map +1 -1
  284. package/dist/federation/federation.d.ts +22 -17
  285. package/dist/federation/federation.d.ts.map +1 -1
  286. package/dist/federation/federation.js +98 -77
  287. package/dist/federation/federation.js.map +1 -1
  288. package/dist/federation/followers.d.ts +3 -2
  289. package/dist/federation/followers.d.ts.map +1 -1
  290. package/dist/federation/followers.js +6 -5
  291. package/dist/federation/followers.js.map +1 -1
  292. package/dist/federation/import-wordpress.d.ts +128 -0
  293. package/dist/federation/import-wordpress.d.ts.map +1 -0
  294. package/dist/federation/import-wordpress.js +426 -0
  295. package/dist/federation/import-wordpress.js.map +1 -0
  296. package/dist/federation/inbox.d.ts +36 -13
  297. package/dist/federation/inbox.d.ts.map +1 -1
  298. package/dist/federation/inbox.js +120 -49
  299. package/dist/federation/inbox.js.map +1 -1
  300. package/dist/federation/index.d.ts +22 -10
  301. package/dist/federation/index.d.ts.map +1 -1
  302. package/dist/federation/index.js +13 -8
  303. package/dist/federation/index.js.map +1 -1
  304. package/dist/federation/keys.d.ts +98 -20
  305. package/dist/federation/keys.d.ts.map +1 -1
  306. package/dist/federation/keys.js +269 -39
  307. package/dist/federation/keys.js.map +1 -1
  308. package/dist/federation/mount.d.ts +42 -10
  309. package/dist/federation/mount.d.ts.map +1 -1
  310. package/dist/federation/mount.js +266 -26
  311. package/dist/federation/mount.js.map +1 -1
  312. package/dist/federation/paths.d.ts +23 -35
  313. package/dist/federation/paths.d.ts.map +1 -1
  314. package/dist/federation/paths.js +26 -39
  315. package/dist/federation/paths.js.map +1 -1
  316. package/dist/federation/records.d.ts +223 -0
  317. package/dist/federation/records.d.ts.map +1 -0
  318. package/dist/federation/records.js +506 -0
  319. package/dist/federation/records.js.map +1 -0
  320. package/dist/federation/relays.d.ts +114 -0
  321. package/dist/federation/relays.d.ts.map +1 -0
  322. package/dist/federation/relays.js +290 -0
  323. package/dist/federation/relays.js.map +1 -0
  324. package/dist/federation/replies.d.ts +80 -0
  325. package/dist/federation/replies.d.ts.map +1 -0
  326. package/dist/federation/replies.js +166 -0
  327. package/dist/federation/replies.js.map +1 -0
  328. package/dist/federation/wordpress.d.ts +131 -0
  329. package/dist/federation/wordpress.d.ts.map +1 -0
  330. package/dist/federation/wordpress.js +341 -0
  331. package/dist/federation/wordpress.js.map +1 -0
  332. package/dist/files/atomic.d.ts +103 -0
  333. package/dist/files/atomic.d.ts.map +1 -0
  334. package/dist/files/atomic.js +150 -0
  335. package/dist/files/atomic.js.map +1 -0
  336. package/dist/files/index.d.ts +3 -0
  337. package/dist/files/index.d.ts.map +1 -0
  338. package/dist/files/index.js +2 -0
  339. package/dist/files/index.js.map +1 -0
  340. package/dist/forms/protection.d.ts +85 -0
  341. package/dist/forms/protection.d.ts.map +1 -0
  342. package/dist/forms/protection.js +116 -0
  343. package/dist/forms/protection.js.map +1 -0
  344. package/dist/images/icons.d.ts +59 -0
  345. package/dist/images/icons.d.ts.map +1 -0
  346. package/dist/images/icons.js +131 -0
  347. package/dist/images/icons.js.map +1 -0
  348. package/dist/images/index.d.ts +7 -0
  349. package/dist/images/index.d.ts.map +1 -0
  350. package/dist/images/index.js +4 -0
  351. package/dist/images/index.js.map +1 -0
  352. package/dist/images/markup.d.ts +47 -0
  353. package/dist/images/markup.d.ts.map +1 -0
  354. package/dist/images/markup.js +175 -0
  355. package/dist/images/markup.js.map +1 -0
  356. package/dist/images/paths.d.ts +34 -0
  357. package/dist/images/paths.d.ts.map +1 -0
  358. package/dist/images/paths.js +41 -0
  359. package/dist/images/paths.js.map +1 -0
  360. package/dist/images/variants.d.ts +104 -0
  361. package/dist/images/variants.d.ts.map +1 -0
  362. package/dist/images/variants.js +320 -0
  363. package/dist/images/variants.js.map +1 -0
  364. package/dist/index.d.ts +123 -19
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +327 -25
  367. package/dist/index.js.map +1 -1
  368. package/dist/init.d.ts +18 -0
  369. package/dist/init.d.ts.map +1 -1
  370. package/dist/init.js +34 -3
  371. package/dist/init.js.map +1 -1
  372. package/dist/mail/brevo.d.ts +35 -0
  373. package/dist/mail/brevo.d.ts.map +1 -0
  374. package/dist/mail/brevo.js +85 -0
  375. package/dist/mail/brevo.js.map +1 -0
  376. package/dist/mail/credentials.d.ts +62 -0
  377. package/dist/mail/credentials.d.ts.map +1 -0
  378. package/dist/mail/credentials.js +86 -0
  379. package/dist/mail/credentials.js.map +1 -0
  380. package/dist/mail/index.d.ts +15 -0
  381. package/dist/mail/index.d.ts.map +1 -0
  382. package/dist/mail/index.js +8 -0
  383. package/dist/mail/index.js.map +1 -0
  384. package/dist/mail/memory.d.ts +35 -0
  385. package/dist/mail/memory.d.ts.map +1 -0
  386. package/dist/mail/memory.js +29 -0
  387. package/dist/mail/memory.js.map +1 -0
  388. package/dist/mail/provider.d.ts +80 -0
  389. package/dist/mail/provider.d.ts.map +1 -0
  390. package/dist/mail/provider.js +23 -0
  391. package/dist/mail/provider.js.map +1 -0
  392. package/dist/mail/service.d.ts +156 -0
  393. package/dist/mail/service.d.ts.map +1 -0
  394. package/dist/mail/service.js +265 -0
  395. package/dist/mail/service.js.map +1 -0
  396. package/dist/mail/smtp.d.ts +39 -0
  397. package/dist/mail/smtp.d.ts.map +1 -0
  398. package/dist/mail/smtp.js +58 -0
  399. package/dist/mail/smtp.js.map +1 -0
  400. package/dist/mail/templates.d.ts +91 -0
  401. package/dist/mail/templates.d.ts.map +1 -0
  402. package/dist/mail/templates.js +69 -0
  403. package/dist/mail/templates.js.map +1 -0
  404. package/dist/notifications/comments.d.ts +66 -0
  405. package/dist/notifications/comments.d.ts.map +1 -0
  406. package/dist/notifications/comments.js +151 -0
  407. package/dist/notifications/comments.js.map +1 -0
  408. package/dist/notifications/digest.d.ts +135 -0
  409. package/dist/notifications/digest.d.ts.map +1 -0
  410. package/dist/notifications/digest.js +287 -0
  411. package/dist/notifications/digest.js.map +1 -0
  412. package/dist/notifications/index.d.ts +13 -0
  413. package/dist/notifications/index.d.ts.map +1 -0
  414. package/dist/notifications/index.js +8 -0
  415. package/dist/notifications/index.js.map +1 -0
  416. package/dist/notifications/links.d.ts +60 -0
  417. package/dist/notifications/links.d.ts.map +1 -0
  418. package/dist/notifications/links.js +63 -0
  419. package/dist/notifications/links.js.map +1 -0
  420. package/dist/notifications/optouts.d.ts +48 -0
  421. package/dist/notifications/optouts.d.ts.map +1 -0
  422. package/dist/notifications/optouts.js +93 -0
  423. package/dist/notifications/optouts.js.map +1 -0
  424. package/dist/notifications/preferences.d.ts +158 -0
  425. package/dist/notifications/preferences.d.ts.map +1 -0
  426. package/dist/notifications/preferences.js +195 -0
  427. package/dist/notifications/preferences.js.map +1 -0
  428. package/dist/notifications/routes.d.ts +28 -0
  429. package/dist/notifications/routes.d.ts.map +1 -0
  430. package/dist/notifications/routes.js +184 -0
  431. package/dist/notifications/routes.js.map +1 -0
  432. package/dist/notifications/tokens.d.ts +60 -0
  433. package/dist/notifications/tokens.d.ts.map +1 -0
  434. package/dist/notifications/tokens.js +125 -0
  435. package/dist/notifications/tokens.js.map +1 -0
  436. package/dist/notify.d.ts +84 -0
  437. package/dist/notify.d.ts.map +1 -0
  438. package/dist/notify.js +149 -0
  439. package/dist/notify.js.map +1 -0
  440. package/dist/web/archive.d.ts +49 -0
  441. package/dist/web/archive.d.ts.map +1 -0
  442. package/dist/web/archive.js +59 -0
  443. package/dist/web/archive.js.map +1 -0
  444. package/dist/web/assets.d.ts +6 -5
  445. package/dist/web/assets.d.ts.map +1 -1
  446. package/dist/web/assets.js +5 -7
  447. package/dist/web/assets.js.map +1 -1
  448. package/dist/web/authors.d.ts +143 -0
  449. package/dist/web/authors.d.ts.map +1 -0
  450. package/dist/web/authors.js +178 -0
  451. package/dist/web/authors.js.map +1 -0
  452. package/dist/web/comments.d.ts +60 -0
  453. package/dist/web/comments.d.ts.map +1 -0
  454. package/dist/web/comments.js +207 -0
  455. package/dist/web/comments.js.map +1 -0
  456. package/dist/web/context.d.ts +162 -28
  457. package/dist/web/context.d.ts.map +1 -1
  458. package/dist/web/context.js +123 -26
  459. package/dist/web/context.js.map +1 -1
  460. package/dist/web/conversation.d.ts +209 -0
  461. package/dist/web/conversation.d.ts.map +1 -0
  462. package/dist/web/conversation.js +557 -0
  463. package/dist/web/conversation.js.map +1 -0
  464. package/dist/web/documents.d.ts +36 -6
  465. package/dist/web/documents.d.ts.map +1 -1
  466. package/dist/web/documents.js +52 -10
  467. package/dist/web/documents.js.map +1 -1
  468. package/dist/web/feed-atom.d.ts +22 -0
  469. package/dist/web/feed-atom.d.ts.map +1 -0
  470. package/dist/web/feed-atom.js +83 -0
  471. package/dist/web/feed-atom.js.map +1 -0
  472. package/dist/web/feed-item.d.ts +145 -0
  473. package/dist/web/feed-item.d.ts.map +1 -0
  474. package/dist/web/feed-item.js +120 -0
  475. package/dist/web/feed-item.js.map +1 -0
  476. package/dist/web/feed-json.d.ts +79 -0
  477. package/dist/web/feed-json.d.ts.map +1 -0
  478. package/dist/web/feed-json.js +53 -0
  479. package/dist/web/feed-json.js.map +1 -0
  480. package/dist/web/feed-rss.d.ts +26 -0
  481. package/dist/web/feed-rss.d.ts.map +1 -0
  482. package/dist/web/feed-rss.js +203 -0
  483. package/dist/web/feed-rss.js.map +1 -0
  484. package/dist/web/feed-source.d.ts +244 -0
  485. package/dist/web/feed-source.d.ts.map +1 -0
  486. package/dist/web/feed-source.js +201 -0
  487. package/dist/web/feed-source.js.map +1 -0
  488. package/dist/web/feed-xml.d.ts +63 -0
  489. package/dist/web/feed-xml.d.ts.map +1 -0
  490. package/dist/web/feed-xml.js +116 -0
  491. package/dist/web/feed-xml.js.map +1 -0
  492. package/dist/web/feeds.d.ts +31 -96
  493. package/dist/web/feeds.d.ts.map +1 -1
  494. package/dist/web/feeds.js +94 -198
  495. package/dist/web/feeds.js.map +1 -1
  496. package/dist/web/health.d.ts +31 -0
  497. package/dist/web/health.d.ts.map +1 -0
  498. package/dist/web/health.js +44 -0
  499. package/dist/web/health.js.map +1 -0
  500. package/dist/web/index.d.ts +30 -10
  501. package/dist/web/index.d.ts.map +1 -1
  502. package/dist/web/index.js +18 -7
  503. package/dist/web/index.js.map +1 -1
  504. package/dist/web/navigation.d.ts +73 -0
  505. package/dist/web/navigation.d.ts.map +1 -0
  506. package/dist/web/navigation.js +110 -0
  507. package/dist/web/navigation.js.map +1 -0
  508. package/dist/web/negotiate.d.ts +9 -0
  509. package/dist/web/negotiate.d.ts.map +1 -1
  510. package/dist/web/negotiate.js +6 -1
  511. package/dist/web/negotiate.js.map +1 -1
  512. package/dist/web/recent.d.ts +43 -0
  513. package/dist/web/recent.d.ts.map +1 -0
  514. package/dist/web/recent.js +37 -0
  515. package/dist/web/recent.js.map +1 -0
  516. package/dist/web/render.d.ts +197 -9
  517. package/dist/web/render.d.ts.map +1 -1
  518. package/dist/web/render.js +334 -17
  519. package/dist/web/render.js.map +1 -1
  520. package/dist/web/routes.d.ts +25 -8
  521. package/dist/web/routes.d.ts.map +1 -1
  522. package/dist/web/routes.js +845 -93
  523. package/dist/web/routes.js.map +1 -1
  524. package/dist/web/sanitize.d.ts +19 -0
  525. package/dist/web/sanitize.d.ts.map +1 -0
  526. package/dist/web/sanitize.js +272 -0
  527. package/dist/web/sanitize.js.map +1 -0
  528. package/dist/web/search.d.ts +79 -0
  529. package/dist/web/search.d.ts.map +1 -0
  530. package/dist/web/search.js +94 -0
  531. package/dist/web/search.js.map +1 -0
  532. package/dist/web/sitemap.d.ts +120 -0
  533. package/dist/web/sitemap.d.ts.map +1 -0
  534. package/dist/web/sitemap.js +199 -0
  535. package/dist/web/sitemap.js.map +1 -0
  536. package/dist/web/taxonomy.d.ts +152 -0
  537. package/dist/web/taxonomy.d.ts.map +1 -0
  538. package/dist/web/taxonomy.js +237 -0
  539. package/dist/web/taxonomy.js.map +1 -0
  540. package/dist/web/templates.d.ts +54 -16
  541. package/dist/web/templates.d.ts.map +1 -1
  542. package/dist/web/templates.js +109 -28
  543. package/dist/web/templates.js.map +1 -1
  544. package/dist/web/themes.d.ts +205 -0
  545. package/dist/web/themes.d.ts.map +1 -0
  546. package/dist/web/themes.js +277 -0
  547. package/dist/web/themes.js.map +1 -0
  548. package/dist/webmention/discovery.d.ts +51 -0
  549. package/dist/webmention/discovery.d.ts.map +1 -0
  550. package/dist/webmention/discovery.js +176 -0
  551. package/dist/webmention/discovery.js.map +1 -0
  552. package/dist/webmention/html.d.ts +71 -0
  553. package/dist/webmention/html.d.ts.map +1 -0
  554. package/dist/webmention/html.js +285 -0
  555. package/dist/webmention/html.js.map +1 -0
  556. package/dist/webmention/index.d.ts +12 -0
  557. package/dist/webmention/index.d.ts.map +1 -0
  558. package/dist/webmention/index.js +8 -0
  559. package/dist/webmention/index.js.map +1 -0
  560. package/dist/webmention/links.d.ts +18 -0
  561. package/dist/webmention/links.d.ts.map +1 -0
  562. package/dist/webmention/links.js +64 -0
  563. package/dist/webmention/links.js.map +1 -0
  564. package/dist/webmention/microformats.d.ts +93 -0
  565. package/dist/webmention/microformats.d.ts.map +1 -0
  566. package/dist/webmention/microformats.js +376 -0
  567. package/dist/webmention/microformats.js.map +1 -0
  568. package/dist/webmention/receive.d.ts +141 -0
  569. package/dist/webmention/receive.d.ts.map +1 -0
  570. package/dist/webmention/receive.js +264 -0
  571. package/dist/webmention/receive.js.map +1 -0
  572. package/dist/webmention/routes.d.ts +37 -0
  573. package/dist/webmention/routes.d.ts.map +1 -0
  574. package/dist/webmention/routes.js +75 -0
  575. package/dist/webmention/routes.js.map +1 -0
  576. package/dist/webmention/service.d.ts +94 -0
  577. package/dist/webmention/service.d.ts.map +1 -0
  578. package/dist/webmention/service.js +207 -0
  579. package/dist/webmention/service.js.map +1 -0
  580. package/package.json +11 -6
  581. package/templates/site/content/_data/site.json +1 -0
  582. package/templates/site/content/posts/2026-01-01-hello-world.md +5 -3
  583. package/templates/site/geekity.config.ts +11 -1
  584. package/templates/site/tsconfig.json +1 -1
  585. package/themes/default/README.md +1096 -50
  586. package/themes/default/layouts/404.njk +2 -3
  587. package/themes/default/layouts/author.njk +37 -0
  588. package/themes/default/layouts/base.njk +172 -31
  589. package/themes/default/layouts/category.njk +27 -0
  590. package/themes/default/layouts/front-page.njk +57 -0
  591. package/themes/default/layouts/home.njk +17 -1
  592. package/themes/default/layouts/page.njk +57 -5
  593. package/themes/default/layouts/post.njk +78 -19
  594. package/themes/default/layouts/search.njk +57 -0
  595. package/themes/default/layouts/tag.njk +3 -6
  596. package/themes/default/mail/comment-digest.html.njk +37 -0
  597. package/themes/default/mail/comment-digest.subject.njk +3 -0
  598. package/themes/default/mail/comment-digest.txt.njk +40 -0
  599. package/themes/default/mail/comment-pending.html.njk +27 -0
  600. package/themes/default/mail/comment-pending.subject.njk +2 -0
  601. package/themes/default/mail/comment-pending.txt.njk +24 -0
  602. package/themes/default/mail/comment-reply.html.njk +21 -0
  603. package/themes/default/mail/comment-reply.subject.njk +2 -0
  604. package/themes/default/mail/comment-reply.txt.njk +22 -0
  605. package/themes/default/mail/contact-message.html.njk +24 -0
  606. package/themes/default/mail/contact-message.subject.njk +5 -0
  607. package/themes/default/mail/contact-message.txt.njk +20 -0
  608. package/themes/default/mail/password-changed.html.njk +18 -0
  609. package/themes/default/mail/password-changed.subject.njk +2 -0
  610. package/themes/default/mail/password-changed.txt.njk +17 -0
  611. package/themes/default/mail/password-reset.html.njk +22 -0
  612. package/themes/default/mail/password-reset.subject.njk +2 -0
  613. package/themes/default/mail/password-reset.txt.njk +18 -0
  614. package/themes/default/mail/test.html.njk +14 -0
  615. package/themes/default/mail/test.subject.njk +2 -0
  616. package/themes/default/mail/test.txt.njk +12 -0
  617. package/themes/default/partials/archive.njk +27 -0
  618. package/themes/default/partials/bio.njk +77 -0
  619. package/themes/default/partials/comment-form.njk +109 -0
  620. package/themes/default/partials/contact-form.njk +88 -0
  621. package/themes/default/partials/conversation.njk +139 -0
  622. package/themes/default/partials/feeds.njk +26 -0
  623. package/themes/default/partials/jsonld.njk +120 -0
  624. package/themes/default/partials/pagination.njk +12 -6
  625. package/themes/default/partials/post-list.njk +51 -18
  626. package/themes/default/partials/search-form.njk +17 -0
  627. package/themes/default/partials/tags.njk +26 -5
  628. package/themes/default/static/highlight.js +4 -0
  629. package/themes/default/static/style.css +1119 -194
  630. package/themes/default/theme.json +5 -0
  631. package/admin/layouts/document-editor.njk +0 -167
  632. package/admin/layouts/federation.njk +0 -145
  633. package/admin/layouts/login.njk +0 -23
  634. package/admin/layouts/settings.njk +0 -116
  635. package/admin/layouts/setup.njk +0 -27
  636. package/admin/layouts/users.njk +0 -91
  637. /package/admin/{layouts/_flash.njk → components/flash.njk} +0 -0
@@ -0,0 +1,201 @@
1
+ /** Every format, RSS first, in the order a page should advertise them. */
2
+ export const FEED_FORMATS = ['rss', 'atom', 'json'];
3
+ /** The segment every feed URL hangs off its listing root by: `/feed/…`. */
4
+ export const FEED_SEGMENT = 'feed';
5
+ /**
6
+ * The segment under `feed/` each format lives at.
7
+ *
8
+ * RSS has none, so the bare `/feed/` is RSS 2.0 — WordPress's layout, and the
9
+ * URL every existing subscriber of a migrated site already polls.
10
+ */
11
+ export const FEED_SEGMENTS = {
12
+ rss: '',
13
+ atom: 'atom',
14
+ json: 'json',
15
+ };
16
+ /**
17
+ * Spellings WordPress also answered on, which this site redirects rather than
18
+ * serves. `/feed/rss/` was its alias for the RSS 2.0 feed.
19
+ */
20
+ export const FEED_ALIASES = {
21
+ rss: 'rss',
22
+ };
23
+ /**
24
+ * The root the site-wide comments feed hangs off, so `/comments/feed/` is the
25
+ * URL WordPress served it at. It is a listing root like any other as far as
26
+ * {@link feedPathUnder} is concerned; nothing is served at the root itself.
27
+ */
28
+ export const COMMENTS_ROOT = '/comments/';
29
+ /** What a post's comments feed calls itself, before the post's title. */
30
+ export const COMMENTS_TITLE_PREFIX = 'Comments on: ';
31
+ /** What each format is labelled with on the wire. */
32
+ export const FEED_CONTENT_TYPES = {
33
+ rss: 'application/rss+xml; charset=utf-8',
34
+ atom: 'application/atom+xml; charset=utf-8',
35
+ json: 'application/feed+json; charset=utf-8',
36
+ };
37
+ /**
38
+ * The URL of one format's feed under a listing root.
39
+ *
40
+ * The root is any listing URL ending in `/` — the site root, a taxonomy
41
+ * archive, and in time a post's permalink for its comments feed — so this is
42
+ * the one place the `/feed/…/` shape is spelled.
43
+ */
44
+ export function feedPathUnder(root, format) {
45
+ const segment = FEED_SEGMENTS[format];
46
+ return `${root}${FEED_SEGMENT}/${segment === '' ? '' : `${segment}/`}`;
47
+ }
48
+ /**
49
+ * The URL of a comments feed: one post's, or — with no permalink — the whole
50
+ * site's.
51
+ *
52
+ * WordPress's URLs, so a site migrated from it keeps both. There is one format,
53
+ * RSS 2.0, because that is what a comments feed is read in.
54
+ */
55
+ export function commentsFeedPath(permalink) {
56
+ return feedPathUnder(permalink ?? COMMENTS_ROOT, 'rss');
57
+ }
58
+ /**
59
+ * A path as the feed it names, or `undefined` when it names none.
60
+ *
61
+ * The inverse of {@link feedPathUnder}, and deliberately ignorant of what the
62
+ * root turns out to be: the caller decides whether `/tag/x/` is a listing it
63
+ * serves. Only the slashed form parses; the bare `/feed` is handled by the
64
+ * canonical redirect, like every other missing trailing slash on the site.
65
+ */
66
+ export function splitFeedPath(pathname) {
67
+ if (!pathname.endsWith('/'))
68
+ return undefined;
69
+ const segments = pathname.slice(0, -1).split('/');
70
+ const last = segments.pop() ?? '';
71
+ if (last === FEED_SEGMENT) {
72
+ return { root: `${segments.join('/')}/`, format: 'rss', canonical: true };
73
+ }
74
+ if (segments.pop() !== FEED_SEGMENT)
75
+ return undefined;
76
+ const root = `${segments.join('/')}/`;
77
+ for (const format of FEED_FORMATS) {
78
+ if (FEED_SEGMENTS[format] === last)
79
+ return { root, format, canonical: true };
80
+ }
81
+ const alias = FEED_ALIASES[last];
82
+ return alias === undefined ? undefined : { root, format: alias, canonical: false };
83
+ }
84
+ /** The media type a format is labelled with, without the charset. */
85
+ export function contentTypeOf(format) {
86
+ return FEED_CONTENT_TYPES[format].split(';')[0] ?? '';
87
+ }
88
+ /**
89
+ * The notify server a site advertises and pings when it has not said
90
+ * otherwise: the one this CMS's author runs, which speaks both rssCloud and
91
+ * WebSub, so one server covers every real-time subscriber a feed has.
92
+ */
93
+ export const DEFAULT_NOTIFY_SERVER = 'https://rpc.rsscloud.io';
94
+ /** The three paths a notify server answers on, under whatever URL it lives at. */
95
+ export const NOTIFY_PATHS = {
96
+ /** Where a subscriber registers for rssCloud notifications. */
97
+ pleaseNotify: 'pleaseNotify',
98
+ /** The WebSub hub: where a subscriber subscribes, and a publisher publishes. */
99
+ hub: 'websub',
100
+ /** Where this site says a feed changed. */
101
+ ping: 'ping',
102
+ };
103
+ /**
104
+ * The port and protocol the legacy `<cloud>` element carries, whatever scheme
105
+ * the server itself is reached over.
106
+ *
107
+ * rpc.rsscloud.io's quick start prescribes exactly these: the element predates
108
+ * TLS being the default, and a reader that understands it is looking for the
109
+ * shape rather than for a port to dial.
110
+ */
111
+ export const NOTIFY_CLOUD_PORT = 80;
112
+ /** The `protocol` of that same element. */
113
+ export const NOTIFY_CLOUD_PROTOCOL = 'http-post';
114
+ /**
115
+ * One notify server URL as everything derived from it, or `undefined` when
116
+ * there is no server: an empty setting is how a site turns the whole feature
117
+ * off, and a value that is not an absolute http(s) URL is treated the same way
118
+ * rather than published as nonsense.
119
+ */
120
+ export function notifyEndpoints(server) {
121
+ const trimmed = server.trim();
122
+ if (trimmed === '')
123
+ return undefined;
124
+ let url;
125
+ try {
126
+ url = new URL(trimmed);
127
+ }
128
+ catch {
129
+ return undefined;
130
+ }
131
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
132
+ return undefined;
133
+ const path = url.pathname.endsWith('/') ? url.pathname.slice(0, -1) : url.pathname;
134
+ const base = url.origin + path;
135
+ return {
136
+ base,
137
+ pleaseNotify: `${base}/${NOTIFY_PATHS.pleaseNotify}`,
138
+ hub: `${base}/${NOTIFY_PATHS.hub}`,
139
+ ping: `${base}/${NOTIFY_PATHS.ping}`,
140
+ cloud: {
141
+ domain: url.hostname,
142
+ port: NOTIFY_CLOUD_PORT,
143
+ path: `${path}/${NOTIFY_PATHS.pleaseNotify}`,
144
+ registerProcedure: '',
145
+ protocol: NOTIFY_CLOUD_PROTOCOL,
146
+ },
147
+ };
148
+ }
149
+ /**
150
+ * The notify server this site's feeds advertise, from `notifyServer` in
151
+ * `content/_data/site.json`.
152
+ *
153
+ * An empty value is a site that turned real-time notification off; a missing
154
+ * key is a site that has never said, and gets {@link DEFAULT_NOTIFY_SERVER}.
155
+ * That is the same rule the settings read the file by, so the server the feeds
156
+ * advertise is always the server the CMS pings.
157
+ */
158
+ export function notifyServerOf(site) {
159
+ const configured = site['notifyServer'];
160
+ if (configured === undefined)
161
+ return notifyEndpoints(DEFAULT_NOTIFY_SERVER);
162
+ return typeof configured === 'string' ? notifyEndpoints(configured) : undefined;
163
+ }
164
+ /** How many entries a feed carries when the site does not say. */
165
+ export const DEFAULT_FEED_SIZE = 20;
166
+ /** What the feeds name themselves as. */
167
+ export const FEED_GENERATOR = 'Geekity';
168
+ /** Where a reader can go to find out what wrote the feed. */
169
+ export const FEED_GENERATOR_URI = 'https://www.npmjs.com/package/@geekity/cms';
170
+ /**
171
+ * How many entries a feed carries.
172
+ *
173
+ * `feedSize` in `content/_data/site.json` wins; without it a feed is longer
174
+ * than an archive page, because a reader that polls once a day should not miss
175
+ * a post on a site that publishes several.
176
+ */
177
+ export function feedSize(site) {
178
+ const configured = site['feedSize'];
179
+ if (typeof configured === 'number' && Number.isInteger(configured) && configured > 0) {
180
+ return configured;
181
+ }
182
+ return DEFAULT_FEED_SIZE;
183
+ }
184
+ /** The language a feed declares when the site does not name one. */
185
+ export const DEFAULT_FEED_LANGUAGE = 'en';
186
+ /** The language tag a feed declares: the site's, or {@link DEFAULT_FEED_LANGUAGE}. */
187
+ export function feedLanguage(site) {
188
+ const configured = site['language'];
189
+ return typeof configured === 'string' && configured.trim() !== ''
190
+ ? configured.trim()
191
+ : DEFAULT_FEED_LANGUAGE;
192
+ }
193
+ /**
194
+ * The instant a feed reports as its own `updated`.
195
+ *
196
+ * An empty feed still has to carry one, and it has to be the same on every
197
+ * request or the ETag would change while nothing did, so it is the epoch
198
+ * rather than the clock.
199
+ */
200
+ export const EMPTY_FEED_UPDATED = new Date(0);
201
+ //# sourceMappingURL=feed-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-source.js","sourceRoot":"","sources":["../../src/web/feed-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The XML a feed is written with: escaping, CDATA, indented elements, links
3
+ * and authors, and the namespaces the vocabularies live in.
4
+ *
5
+ * Nothing here knows what a feed is. It is the plumbing the RSS and Atom
6
+ * serialisers share, kept apart from them so that a question about escaping is
7
+ * answered in one file rather than three, and so the serialisers read as the
8
+ * shape of a document rather than as string handling.
9
+ */
10
+ /**
11
+ * Dave Winer's `source` namespace, which RSS 2.0 feeds here declare so an item
12
+ * can carry the Markdown it was written from. TASK-38's `source:cloud` is the
13
+ * same namespace.
14
+ */
15
+ export declare const SOURCE_NAMESPACE = "https://source.scripting.com/";
16
+ /** Dublin Core, which is where an RSS item's `creator` comes from. */
17
+ export declare const DC_NAMESPACE = "http://purl.org/dc/elements/1.1/";
18
+ /**
19
+ * The Well-Formed Web comment API, whose `commentRss` is how an RSS reader is
20
+ * told where one item's comments are. WordPress puts it on every item, so a
21
+ * reader that already understands a WordPress feed understands this one.
22
+ */
23
+ export declare const WFW_NAMESPACE = "http://wellformedweb.org/CommentAPI/";
24
+ /**
25
+ * A date as RFC 822, which is what RSS 2.0's `pubDate` and `lastBuildDate`
26
+ * are. `toUTCString` writes exactly that spelling, `GMT` zone included.
27
+ */
28
+ export declare function rfc822(date: Date): string;
29
+ /**
30
+ * XML character data, escaped.
31
+ *
32
+ * `<` and `&` have to go; `>` follows them because `]]>` in text is not
33
+ * allowed and spotting it is not worth the trouble. Quotes are escaped too so
34
+ * one function serves attribute values as well as text. Characters XML 1.0
35
+ * cannot represent at all — the C0 controls other than tab, newline and
36
+ * carriage return — are dropped rather than escaped, because there is no
37
+ * spelling of them that would parse.
38
+ */
39
+ export declare function escapeXml(value: string): string;
40
+ /**
41
+ * Character data as a CDATA section, which is how a feed carries markup a
42
+ * reader is meant to render rather than display.
43
+ *
44
+ * The only sequence a section may not contain is its own terminator, so a
45
+ * `]]>` in the text is split across two sections; the parser rejoins them and
46
+ * the reader sees the original bytes. Characters XML 1.0 cannot represent are
47
+ * dropped, exactly as {@link escapeXml} drops them, because CDATA suspends
48
+ * escaping and not the character set.
49
+ */
50
+ export declare function cdata(value: string): string;
51
+ /** An element holding text, indented. */
52
+ export declare function element(name: string, text: string, depth?: number): string;
53
+ /** The same, or nothing at all when there is no value. */
54
+ export declare function optionalElement(name: string, text: string | undefined, depth?: number): string[];
55
+ /** An Atom `<link>`. The `type` is left off when there is nothing to declare. */
56
+ export declare function link(attributes: {
57
+ rel: string;
58
+ type?: string;
59
+ href: string;
60
+ }, depth?: number): string;
61
+ /** An Atom `<author>`, or nothing when nobody is named. */
62
+ export declare function author(name: string | undefined, depth: number): string[];
63
+ //# sourceMappingURL=feed-xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-xml.d.ts","sourceRoot":"","sources":["../../src/web/feed-xml.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,kCAAkC,CAAC;AAEhE,sEAAsE;AACtE,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,aAAa,yCAAyC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEzC;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAwB/C;AAED;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3C;AAWD,yCAAyC;AACzC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,CAErE;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAE3F;AAED,iFAAiF;AACjF,wBAAgB,IAAI,CAAC,UAAU,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,SAAI,GAAG,MAAM,CAKhG;AAED,2DAA2D;AAC3D,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAIxE"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * The XML a feed is written with: escaping, CDATA, indented elements, links
3
+ * and authors, and the namespaces the vocabularies live in.
4
+ *
5
+ * Nothing here knows what a feed is. It is the plumbing the RSS and Atom
6
+ * serialisers share, kept apart from them so that a question about escaping is
7
+ * answered in one file rather than three, and so the serialisers read as the
8
+ * shape of a document rather than as string handling.
9
+ */
10
+ /**
11
+ * Dave Winer's `source` namespace, which RSS 2.0 feeds here declare so an item
12
+ * can carry the Markdown it was written from. TASK-38's `source:cloud` is the
13
+ * same namespace.
14
+ */
15
+ export const SOURCE_NAMESPACE = 'https://source.scripting.com/';
16
+ /** Dublin Core, which is where an RSS item's `creator` comes from. */
17
+ export const DC_NAMESPACE = 'http://purl.org/dc/elements/1.1/';
18
+ /**
19
+ * The Well-Formed Web comment API, whose `commentRss` is how an RSS reader is
20
+ * told where one item's comments are. WordPress puts it on every item, so a
21
+ * reader that already understands a WordPress feed understands this one.
22
+ */
23
+ export const WFW_NAMESPACE = 'http://wellformedweb.org/CommentAPI/';
24
+ /**
25
+ * A date as RFC 822, which is what RSS 2.0's `pubDate` and `lastBuildDate`
26
+ * are. `toUTCString` writes exactly that spelling, `GMT` zone included.
27
+ */
28
+ export function rfc822(date) {
29
+ return date.toUTCString();
30
+ }
31
+ /**
32
+ * XML character data, escaped.
33
+ *
34
+ * `<` and `&` have to go; `>` follows them because `]]>` in text is not
35
+ * allowed and spotting it is not worth the trouble. Quotes are escaped too so
36
+ * one function serves attribute values as well as text. Characters XML 1.0
37
+ * cannot represent at all — the C0 controls other than tab, newline and
38
+ * carriage return — are dropped rather than escaped, because there is no
39
+ * spelling of them that would parse.
40
+ */
41
+ export function escapeXml(value) {
42
+ let out = '';
43
+ for (const character of value) {
44
+ switch (character) {
45
+ case '&':
46
+ out += '&amp;';
47
+ break;
48
+ case '<':
49
+ out += '&lt;';
50
+ break;
51
+ case '>':
52
+ out += '&gt;';
53
+ break;
54
+ case '"':
55
+ out += '&quot;';
56
+ break;
57
+ case "'":
58
+ out += '&apos;';
59
+ break;
60
+ default:
61
+ if (isValidXmlChar(character))
62
+ out += character;
63
+ }
64
+ }
65
+ return out;
66
+ }
67
+ /**
68
+ * Character data as a CDATA section, which is how a feed carries markup a
69
+ * reader is meant to render rather than display.
70
+ *
71
+ * The only sequence a section may not contain is its own terminator, so a
72
+ * `]]>` in the text is split across two sections; the parser rejoins them and
73
+ * the reader sees the original bytes. Characters XML 1.0 cannot represent are
74
+ * dropped, exactly as {@link escapeXml} drops them, because CDATA suspends
75
+ * escaping and not the character set.
76
+ */
77
+ export function cdata(value) {
78
+ let text = '';
79
+ for (const character of value) {
80
+ if (isValidXmlChar(character))
81
+ text += character;
82
+ }
83
+ return `<![CDATA[${text.replaceAll(']]>', ']]]]><![CDATA[>')}]]>`;
84
+ }
85
+ /** Whether a character is one XML 1.0 allows in a document at all. */
86
+ function isValidXmlChar(character) {
87
+ const code = character.codePointAt(0) ?? 0;
88
+ if (code === 0x9 || code === 0xa || code === 0xd)
89
+ return true;
90
+ if (code >= 0x20 && code <= 0xd7ff)
91
+ return true;
92
+ if (code >= 0xe000 && code <= 0xfffd)
93
+ return true;
94
+ return code >= 0x10000 && code <= 0x10ffff;
95
+ }
96
+ /** An element holding text, indented. */
97
+ export function element(name, text, depth = 1) {
98
+ return `${' '.repeat(depth)}<${name}>${escapeXml(text)}</${name}>`;
99
+ }
100
+ /** The same, or nothing at all when there is no value. */
101
+ export function optionalElement(name, text, depth = 1) {
102
+ return text === undefined ? [] : [element(name, text, depth)];
103
+ }
104
+ /** An Atom `<link>`. The `type` is left off when there is nothing to declare. */
105
+ export function link(attributes, depth = 1) {
106
+ const type = attributes.type === undefined ? '' : ` type="${escapeXml(attributes.type)}"`;
107
+ return `${' '.repeat(depth)}<link rel="${escapeXml(attributes.rel)}"${type} href="${escapeXml(attributes.href)}"/>`;
108
+ }
109
+ /** An Atom `<author>`, or nothing when nobody is named. */
110
+ export function author(name, depth) {
111
+ if (name === undefined)
112
+ return [];
113
+ const indent = ' '.repeat(depth);
114
+ return [`${indent}<author>`, element('name', name, depth + 1), `${indent}</author>`];
115
+ }
116
+ //# sourceMappingURL=feed-xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-xml.js","sourceRoot":"","sources":["../../src/web/feed-xml.ts"],"names":[],"mappings":"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"}
@@ -1,95 +1,25 @@
1
- import type { Document } from '../content/document.ts';
2
- import type { SiteData } from './context.ts';
1
+ import type { CommentFeedSource, FeedFormat, FeedIdentity, FeedSource } from './feed-source.ts';
3
2
  import type { ConditionalHeaders } from './negotiate.ts';
4
3
  /**
5
- * The two syndication formats the public site serves.
4
+ * How a feed is served: its validator, its headers, and which serialiser
5
+ * writes its body.
6
6
  *
7
- * Feeds are fixed routes rather than representations (doc-3): a feed reader
8
- * sends whatever `Accept` header its HTTP library happened to default to, so
9
- * the URL has to say which format it wants.
7
+ * The feed itself is spread over four modules below this one — what a feed is
8
+ * (`feed-source.ts`), the item every format renders (`feed-item.ts`), the
9
+ * three serialisers (`feed-rss.ts`, `feed-atom.ts`, `feed-json.ts`) and the
10
+ * XML plumbing they share (`feed-xml.ts`). This file re-exports all of it, so
11
+ * everything that used to import from `./feeds.ts` still can and there is one
12
+ * name for the whole subject.
10
13
  */
11
- export type FeedFormat = 'atom' | 'json';
12
- /** The file name each format is served under, at the site root and per tag. */
13
- export declare const FEED_FILES: Readonly<Record<FeedFormat, string>>;
14
- /** What each format is labelled with on the wire. */
15
- export declare const FEED_CONTENT_TYPES: Readonly<Record<FeedFormat, string>>;
16
- /** The `version` every JSON Feed this CMS writes declares. */
17
- export declare const JSON_FEED_VERSION = "https://jsonfeed.org/version/1.1";
18
- /** How many entries a feed carries when the site does not say. */
19
- export declare const DEFAULT_FEED_SIZE = 20;
20
- /** What the feeds name themselves as. */
21
- export declare const FEED_GENERATOR = "Geekity";
22
- /** Where a reader can go to find out what wrote the feed. */
23
- export declare const FEED_GENERATOR_URI = "https://www.npmjs.com/package/@geekity/cms";
24
- /**
25
- * How many entries a feed carries.
26
- *
27
- * `feedSize` in `content/_data/site.json` wins; without it a feed is longer
28
- * than an archive page, because a reader that polls once a day should not miss
29
- * a post on a site that publishes several.
30
- */
31
- export declare function feedSize(site: SiteData): number;
32
- /** Everything one feed is built from, whichever format it ends up in. */
33
- export interface FeedSource {
34
- /** Site-wide data, for the title, subtitle and author. */
35
- site: SiteData;
36
- /** The entries, newest first. Already filtered to what the public may see. */
37
- documents: readonly Document[];
38
- /** Title of this feed. The site title, or the site title and the tag. */
39
- title: string;
40
- /** Path of the HTML page this feed syndicates: `/` or `/tags/{tag}/`. */
41
- href: string;
42
- /** Path of the feed itself, for the self link. */
43
- feedHref: string;
44
- /** The site's public origin, for absolute ids and links. */
45
- baseUrl: string;
46
- }
47
- /** One feed as an Atom 1.0 document. */
48
- export declare function atomFeed(source: FeedSource): string;
49
- /** A JSON Feed 1.1 document. */
50
- export interface JsonFeed {
51
- /** {@link JSON_FEED_VERSION}. */
52
- version: string;
53
- /** The feed's name. */
54
- title: string;
55
- /** The HTML page this feed syndicates. */
56
- home_page_url: string;
57
- /** Where this feed itself lives. */
58
- feed_url: string;
59
- /** The site's tagline, when it has one. */
60
- description?: string;
61
- /** Site-level authors, when the site names one. */
62
- authors?: JsonFeedAuthor[];
63
- /** The entries, newest first. */
64
- items: JsonFeedItem[];
65
- }
66
- /** An author, as JSON Feed 1.1 models one. */
67
- export interface JsonFeedAuthor {
68
- name: string;
69
- }
70
- /** One entry of a {@link JsonFeed}. */
71
- export interface JsonFeedItem {
72
- /** Permanent identifier: the document's absolute URL. */
73
- id: string;
74
- /** Where the entry can be read. */
75
- url: string;
76
- /** Display title. */
77
- title: string;
78
- /** The rendered body. */
79
- content_html: string;
80
- /** The document's description, when it has one. */
81
- summary?: string;
82
- /** Publish date, RFC 3339. */
83
- date_published?: string;
84
- /** Last modification date, RFC 3339. */
85
- date_modified?: string;
86
- /** The document's tags, in file order. */
87
- tags?: string[];
88
- /** The document's own author, when it names one. */
89
- authors?: JsonFeedAuthor[];
90
- }
91
- /** One feed as a JSON Feed 1.1 document. */
92
- export declare function jsonFeed(source: FeedSource): JsonFeed;
14
+ export { COMMENTS_ROOT, COMMENTS_TITLE_PREFIX, commentsFeedPath, contentTypeOf, DEFAULT_FEED_LANGUAGE, DEFAULT_FEED_SIZE, DEFAULT_NOTIFY_SERVER, EMPTY_FEED_UPDATED, FEED_ALIASES, FEED_CONTENT_TYPES, FEED_FORMATS, FEED_GENERATOR, FEED_GENERATOR_URI, FEED_SEGMENT, FEED_SEGMENTS, feedLanguage, feedPathUnder, feedSize, NOTIFY_CLOUD_PORT, NOTIFY_CLOUD_PROTOCOL, NOTIFY_PATHS, notifyEndpoints, notifyServerOf, splitFeedPath, } from './feed-source.ts';
15
+ export type { CommentFeedSource, FeedComment, FeedFormat, FeedIdentity, FeedPath, FeedSource, NotifyServer, } from './feed-source.ts';
16
+ export { EXCERPT_WORDS, excerptFromHtml, FEED_ITEM_REVISION, feedExcerpt, feedItem, feedItems, } from './feed-item.ts';
17
+ export type { FeedItem, FeedItemComments, FeedItemContext } from './feed-item.ts';
18
+ export { cdata, DC_NAMESPACE, escapeXml, rfc822, SOURCE_NAMESPACE, WFW_NAMESPACE, } from './feed-xml.ts';
19
+ export { commentsRssFeed, rssFeed, rssItem } from './feed-rss.ts';
20
+ export { atomEntry, atomFeed } from './feed-atom.ts';
21
+ export { JSON_FEED_HUB_TYPE, JSON_FEED_VERSION, jsonFeed, jsonFeedItem } from './feed-json.ts';
22
+ export type { JsonFeed, JsonFeedAuthor, JsonFeedHub, JsonFeedItem } from './feed-json.ts';
93
23
  /** Everything one feed response needs. */
94
24
  export interface FeedResponseOptions {
95
25
  /** Which format the body is. */
@@ -109,14 +39,19 @@ export interface FeedResponseOptions {
109
39
  */
110
40
  export declare function feedResponse(options: FeedResponseOptions): Response;
111
41
  /**
112
- * XML character data, escaped.
42
+ * One comments feed as an HTTP response.
43
+ *
44
+ * Comments arrive from other people's servers rather than from the site's own
45
+ * files, so the validator is built from the comments themselves; a feed with
46
+ * none still has one, which is what makes an empty comments feed cheap to poll.
47
+ */
48
+ export declare function commentsFeedResponse(source: CommentFeedSource, conditional?: ConditionalHeaders): Response;
49
+ /**
50
+ * WebSub's discovery header: the hub and the feed's own URL, in that order.
113
51
  *
114
- * `<` and `&` have to go; `>` follows them because `]]>` in text is not
115
- * allowed and spotting it is not worth the trouble. Quotes are escaped too so
116
- * one function serves attribute values as well as text. Characters XML 1.0
117
- * cannot represent at all — the C0 controls other than tab, newline and
118
- * carriage return — are dropped rather than escaped, because there is no
119
- * spelling of them that would parse.
52
+ * A subscriber is meant to find both without parsing the body, which is the
53
+ * only way a JSON Feed or a 304 could tell it anything at all. `undefined`
54
+ * when the site names no notify server.
120
55
  */
121
- export declare function escapeXml(value: string): string;
56
+ export declare function feedLinkHeader(source: FeedIdentity): string | undefined;
122
57
  //# sourceMappingURL=feeds.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feeds.d.ts","sourceRoot":"","sources":["../../src/web/feeds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feeds.d.ts","sourceRoot":"","sources":["../../src/web/feeds.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEhG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD;;;;;;;;;;GAUG;AAEH,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,QAAQ,EACR,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAElF,OAAO,EACL,KAAK,EACL,YAAY,EACZ,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/F,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1F,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,yEAAyE;IACzE,MAAM,EAAE,UAAU,CAAC;IACnB,sDAAsD;IACtD,WAAW,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,QAAQ,CAsBnE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,EACzB,WAAW,CAAC,EAAE,kBAAkB,GAC/B,QAAQ,CAWV;AAoBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAMvE"}