@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
@@ -1,48 +1,139 @@
1
1
  import { randomInt } from 'node:crypto';
2
- import { passwordProblem, usernameProblem } from './credentials.js';
2
+ import { authorHref } from '../web/authors.js';
3
+ import { DEFAULT_DELIVERY_MODE, deliveryMode, notificationEvent, notificationSwitches, } from '../notifications/preferences.js';
4
+ import { countUsers, createUser, deleteUser, DuplicateUsernameError, findUserById, listUsers, setUserEmail, setUserNotification, setUserNotificationMode, setUserPassword, setUserProfile, verifyUserPassword, } from './accounts.js';
5
+ import { emailProblem, passwordProblem, usernameProblem } from './credentials.js';
3
6
  import { flash } from './flash.js';
4
7
  import { ADMIN_PREFIX } from './session.js';
5
- import { DuplicateUsernameError } from './store.js';
8
+ import { toldFollowers } from './settings-page.js';
6
9
  import { ADMIN_TEMPLATES } from './templates.js';
7
- /** Where the users screen lives. The add form posts here too. */
10
+ /** Where the list of users lives. */
8
11
  export const USERS_PATH = `${ADMIN_PREFIX}/users`;
12
+ /**
13
+ * Where the add form lives, and where it posts.
14
+ *
15
+ * A screen of its own rather than a panel under the table, because the menu
16
+ * says Users > Add new and a menu entry has to be somewhere to go. It is also
17
+ * what keeps a refused add on a page about adding somebody instead of at the
18
+ * top of a list of everybody.
19
+ */
20
+ export const ADD_USER_PATH = `${USERS_PATH}/new`;
21
+ /**
22
+ * Where one user is edited.
23
+ *
24
+ * The split documents.ts already makes between a listing and `basePath/:slug`
25
+ * (TASK-97): the table says who there is, and one screen per person holds
26
+ * every field that person has, each with a label beside it. A row of
27
+ * unlabelled boxes in a table cell could not.
28
+ */
29
+ export function editUserPath(id) {
30
+ return `${USERS_PATH}/${String(id)}`;
31
+ }
32
+ /**
33
+ * The id in `/admin/users/<id>`, or `undefined` for a segment that is not one.
34
+ *
35
+ * Digits only, so `new`, `password` and the other named paths under
36
+ * `/admin/users/` can never be read as somebody's id — and so a URL somebody
37
+ * typed answers 404 rather than `NaN`.
38
+ */
39
+ function pathId(segment) {
40
+ if (!/^\d+$/.test(segment))
41
+ return undefined;
42
+ return Number(segment);
43
+ }
9
44
  /** Where the signed-in admin's change-password form posts. */
10
45
  export const CHANGE_PASSWORD_PATH = `${USERS_PATH}/password`;
11
- /** Where a row's delete button posts. */
46
+ /** Where a delete button posts, on the list or on the user's own screen. */
12
47
  export const DELETE_USER_PATH = `${USERS_PATH}/delete`;
13
- /** The fields the three forms on the screen submit. */
48
+ /** Where the email address on the Account panel posts. */
49
+ export const USER_EMAIL_PATH = `${USERS_PATH}/email`;
50
+ /**
51
+ * Where the Profile panel posts.
52
+ *
53
+ * A path of its own rather than a second half of the email form, because the
54
+ * two are about different audiences: an email address is private to the site
55
+ * and a profile is the public face decision-14 puts at the author URL. One
56
+ * form that saved both would mean an admin correcting a colleague's address
57
+ * also republishing their bio.
58
+ */
59
+ export const USER_PROFILE_PATH = `${USERS_PATH}/profile`;
60
+ /** Where the notice switches post. */
61
+ export const USER_NOTIFICATIONS_PATH = `${USERS_PATH}/notifications`;
62
+ /**
63
+ * Where the how-often selects post.
64
+ *
65
+ * A path of its own rather than a second field on the switch, because the two
66
+ * forms answer different questions and a switch is a button while a mode is a
67
+ * select and a Save: one handler that had to work out which of the two it had
68
+ * been given would be guessing at something the URL can simply say.
69
+ */
70
+ export const USER_NOTIFICATION_MODE_PATH = `${USER_NOTIFICATIONS_PATH}/mode`;
71
+ /** The fields the forms on these screens submit. */
14
72
  export const USER_FIELDS = {
15
73
  username: 'username',
16
74
  password: 'password',
75
+ email: 'email',
17
76
  generate: 'generate',
18
77
  currentPassword: 'current_password',
19
78
  newPassword: 'new_password',
20
79
  newPasswordConfirmation: 'new_password_confirmation',
21
80
  userId: 'user_id',
81
+ /** Which notice a switch is about, by its name in the registry. */
82
+ event: 'event',
83
+ /**
84
+ * Whether that notice is wanted.
85
+ *
86
+ * A checkbox, so a form that turns one off submits nothing at all under this
87
+ * name — which is why the switch is a form of its own per event rather than
88
+ * one form with a checkbox per event: a browser sends no field for an
89
+ * unticked box, and one form could not tell "turned this off" from "did not
90
+ * mention it".
91
+ */
92
+ on: 'on',
93
+ /** How often that notice should arrive, for an event that offers a choice. */
94
+ mode: 'mode',
95
+ /** The name to print instead of the login (TASK-67). */
96
+ displayName: 'display_name',
97
+ /** A few sentences about this person. */
98
+ bio: 'bio',
99
+ /** Their picture, as a path or a URL. */
100
+ avatar: 'avatar',
101
+ /** What they do, printed beside the name in a bio (TASK-79). */
102
+ jobTitle: 'job_title',
103
+ /** Where they are, as they write it. */
104
+ location: 'location',
105
+ /** Somewhere else they are: one `Label | URL` per line. */
106
+ links: 'links',
22
107
  };
23
108
  /**
24
- * Register the users screen: the list, the add form, and the change-password
25
- * form for whoever is signed in.
109
+ * Register the users screens: the list, the add form, and one screen per user
110
+ * where everything about that person is edited.
26
111
  *
27
- * There is one role, so there is nothing to edit about somebody else: an admin
28
- * can add a user, delete one, and change their own password. Changing
29
- * somebody else's is deliberately not offered — resetting a colleague's
30
- * password from under them is what `geekity user add` and a fresh account are
31
- * for, and it keeps the current-password check honest.
112
+ * The same split documents.ts makes (TASK-97). The table says who there is;
113
+ * a person's own screen holds their email address, their public profile, what
114
+ * they are emailed about, and — where the account can go — the delete. Every
115
+ * save lands back on that screen, so it shows its own result.
116
+ *
117
+ * One thing is still only ever your own: the password. Changing somebody
118
+ * else's is deliberately not offered — resetting a colleague's password from
119
+ * under them is what `geekity user add` and a fresh account are for, and it
120
+ * keeps the current-password check honest.
32
121
  */
33
122
  export function mountUsers(app, options) {
34
123
  const { render } = options;
35
- app.get(USERS_PATH, (c) => render(c, ADMIN_TEMPLATES.users, screen(c)));
36
- app.post(USERS_PATH, async (c) => {
124
+ app.get(USERS_PATH, (c) => render(c, ADMIN_TEMPLATES.usersList, screen(c)));
125
+ app.get(ADD_USER_PATH, (c) => render(c, ADMIN_TEMPLATES.usersNew, addScreen(c)));
126
+ app.post(ADD_USER_PATH, async (c) => {
37
127
  const body = await c.req.parseBody();
38
128
  const username = field(body[USER_FIELDS.username]).trim();
39
129
  const supplied = field(body[USER_FIELDS.password]);
130
+ const email = field(body[USER_FIELDS.email]).trim();
40
131
  const generate = field(body[USER_FIELDS.generate]) !== '';
41
132
  const password = generate ? generatePassword() : supplied;
42
- const problems = addUserProblems(username, password, generate);
133
+ const problems = addUserProblems(username, password, generate, email);
43
134
  if (Object.keys(problems).length === 0) {
44
135
  try {
45
- c.var.admin.createUser({ username, password });
136
+ await createUser({ dataDir: c.var.config.dataDir, username, password, email });
46
137
  }
47
138
  catch (error) {
48
139
  if (!(error instanceof DuplicateUsernameError))
@@ -52,7 +143,8 @@ export function mountUsers(app, options) {
52
143
  }
53
144
  if (Object.keys(problems).length > 0) {
54
145
  c.status(400);
55
- return render(c, ADMIN_TEMPLATES.users, screen(c, { addForm: { username, generate }, addProblems: problems }));
146
+ // Back onto the form that was refused, with what was typed still in it.
147
+ return render(c, ADMIN_TEMPLATES.usersNew, addScreen(c, { addForm: { username, email, generate }, addProblems: problems }));
56
148
  }
57
149
  // A generated password is shown once, here, and never stored in the clear.
58
150
  // The flash lives on the session row, so it is not in the URL, in a cookie
@@ -68,7 +160,7 @@ export function mountUsers(app, options) {
68
160
  const session = c.var.session;
69
161
  const user = session?.userId === null || session === undefined
70
162
  ? undefined
71
- : c.var.admin.getUserById(session.userId);
163
+ : findUserById(c.var.config.dataDir, session.userId);
72
164
  if (session === undefined || user === undefined)
73
165
  return c.redirect(USERS_PATH, 303);
74
166
  const body = await c.req.parseBody();
@@ -76,17 +168,18 @@ export function mountUsers(app, options) {
76
168
  const next = field(body[USER_FIELDS.newPassword]);
77
169
  const confirmation = field(body[USER_FIELDS.newPasswordConfirmation]);
78
170
  const problems = changePasswordProblems({
79
- correct: c.var.admin.verifyPassword(user.username, current) !== undefined,
171
+ correct: verifyUserPassword(c.var.config.dataDir, user.username, current) !== undefined,
80
172
  next,
81
173
  confirmation,
82
174
  });
83
175
  if (Object.keys(problems).length > 0) {
84
176
  c.status(400);
85
- // Nothing that was typed is echoed back: every field on this form is a
86
- // password, and a password does not belong in rendered HTML.
87
- return render(c, ADMIN_TEMPLATES.users, screen(c, { passwordProblems: problems }));
177
+ // Back onto your own page, where the form is. Nothing that was typed is
178
+ // echoed back: every field on this form is a password, and a password
179
+ // does not belong in rendered HTML.
180
+ return render(c, ADMIN_TEMPLATES.usersEdit, userScreen(c, user, { passwordProblems: problems }));
88
181
  }
89
- c.var.admin.setPassword(user.id, next);
182
+ await setUserPassword({ dataDir: c.var.config.dataDir, userId: user.id, password: next });
90
183
  // Every browser that was signed in as this user is signed out, because the
91
184
  // usual reason to change a password is that somebody else may have it. The
92
185
  // one doing the changing is spared, so the admin is not thrown out of the
@@ -95,28 +188,193 @@ export function mountUsers(app, options) {
95
188
  flash(c, 'notice', ended === 0
96
189
  ? 'Your password was changed.'
97
190
  : `Your password was changed, and ${signedOut(ended)} signed out.`);
98
- return c.redirect(USERS_PATH, 303);
191
+ return c.redirect(editUserPath(user.id), 303);
192
+ });
193
+ /**
194
+ * Put an email address on a user, or take one off.
195
+ *
196
+ * Anybody's, not only your own. There is one role, so every user already has
197
+ * every power there is — including deleting somebody and adding them back —
198
+ * and a screen where an admin could see a colleague's address but not
199
+ * correct a typo in it would be a rule with nothing behind it. It is also
200
+ * what makes a site usable: an admin who has just added a colleague can put
201
+ * their address in without waiting for them to sign in and do it.
202
+ *
203
+ * A flash and a redirect back to that person's screen rather than a 400 with
204
+ * the form redrawn, unlike the two forms above: nothing here is a secret, so
205
+ * there is no reason not to show the refusal beside the box it is about with
206
+ * what is stored back in it.
207
+ */
208
+ app.post(USER_EMAIL_PATH, async (c) => {
209
+ const dataDir = c.var.config.dataDir;
210
+ const body = await c.req.parseBody();
211
+ const id = Number(field(body[USER_FIELDS.userId]));
212
+ const email = field(body[USER_FIELDS.email]).trim();
213
+ const target = Number.isInteger(id) ? findUserById(dataDir, id) : undefined;
214
+ if (target === undefined) {
215
+ flash(c, 'error', 'That user is already gone.');
216
+ return c.redirect(USERS_PATH, 303);
217
+ }
218
+ const problem = emailProblem(email);
219
+ if (problem !== undefined) {
220
+ flash(c, 'error', problem);
221
+ return c.redirect(editUserPath(target.id), 303);
222
+ }
223
+ await setUserEmail({ dataDir, userId: target.id, email });
224
+ flash(c, 'notice', email === ''
225
+ ? `${target.username} has no email address any more.`
226
+ : `${target.username} will be emailed at ${email}.`);
227
+ return c.redirect(editUserPath(target.id), 303);
228
+ });
229
+ /**
230
+ * Write a user's public profile (TASK-67).
231
+ *
232
+ * Anybody's, for the reason the email field is anybody's: one role, and an
233
+ * admin who has just added a colleague should be able to put a name and a
234
+ * line about them on their archive without waiting for them to sign in. The
235
+ * whole profile at once, because that is what the panel is — six boxes and
236
+ * one Save — and a box somebody cleared is a field they no longer want.
237
+ *
238
+ * A flash and a redirect back to that person's screen rather than a 400,
239
+ * because nothing here can be wrong enough to refuse. A link line with no
240
+ * URL is dropped on the way in rather than reported.
241
+ */
242
+ app.post(USER_PROFILE_PATH, async (c) => {
243
+ const dataDir = c.var.config.dataDir;
244
+ const body = await c.req.parseBody();
245
+ const id = Number(field(body[USER_FIELDS.userId]));
246
+ const target = Number.isInteger(id) ? findUserById(dataDir, id) : undefined;
247
+ if (target === undefined) {
248
+ flash(c, 'error', 'That user is already gone.');
249
+ return c.redirect(USERS_PATH, 303);
250
+ }
251
+ const changed = await setUserProfile({
252
+ dataDir,
253
+ userId: target.id,
254
+ profile: {
255
+ displayName: field(body[USER_FIELDS.displayName]),
256
+ bio: field(body[USER_FIELDS.bio]),
257
+ avatar: field(body[USER_FIELDS.avatar]),
258
+ jobTitle: field(body[USER_FIELDS.jobTitle]),
259
+ location: field(body[USER_FIELDS.location]),
260
+ links: parseProfileLinks(field(body[USER_FIELDS.links])),
261
+ },
262
+ });
263
+ // The profile is the actor's profile now (decision-14), so saving it is
264
+ // also an announcement: a follower's copy of somebody's name, bio and
265
+ // picture is only as fresh as the last `Update` they were sent. The user
266
+ // is read back rather than assumed, so the actor that goes out is built
267
+ // from the file exactly as a peer fetching it would be.
268
+ const saved = changed ? findUserById(dataDir, target.id) : undefined;
269
+ const told = saved === undefined ? undefined : await c.var.delivery.updateActor(saved);
270
+ flash(c, 'notice', `Saved ${target.username}’s profile.${toldFollowers(told)}`);
271
+ return c.redirect(editUserPath(target.id), 303);
272
+ });
273
+ /**
274
+ * Turn one notice on or off for one user.
275
+ *
276
+ * Anybody's, for the reason the email field is anybody's: one role, and an
277
+ * admin who has just given a colleague an address should be able to say what
278
+ * goes to it. An event nothing in this version knows is a no-op rather than an
279
+ * error, because the only way to submit one is a form this CMS did not
280
+ * render.
281
+ */
282
+ app.post(USER_NOTIFICATIONS_PATH, async (c) => {
283
+ const dataDir = c.var.config.dataDir;
284
+ const body = await c.req.parseBody();
285
+ const id = Number(field(body[USER_FIELDS.userId]));
286
+ const target = Number.isInteger(id) ? findUserById(dataDir, id) : undefined;
287
+ if (target === undefined) {
288
+ flash(c, 'error', 'That user is already gone.');
289
+ return c.redirect(USERS_PATH, 303);
290
+ }
291
+ const name = field(body[USER_FIELDS.event]);
292
+ const event = notificationEvent(name);
293
+ if (event === undefined) {
294
+ flash(c, 'error', 'That is not something this site can tell anybody about.');
295
+ return c.redirect(editUserPath(target.id), 303);
296
+ }
297
+ // An unticked checkbox submits no field at all, so its absence is the
298
+ // answer rather than a missing one.
299
+ const on = field(body[USER_FIELDS.on]) !== '';
300
+ await setUserNotification({ dataDir, userId: target.id, event: name, on });
301
+ flash(c, 'notice', on
302
+ ? `${target.username} will be emailed about ${event.label.toLowerCase()}.`
303
+ : `${target.username} will not be emailed about ${event.label.toLowerCase()}.`);
304
+ return c.redirect(editUserPath(target.id), 303);
305
+ });
306
+ /**
307
+ * Say how often one notice reaches one user.
308
+ *
309
+ * Anybody's, for the reason the switch beside it is anybody's. A mode this
310
+ * version does not know, or an event that offers no choice, changes nothing
311
+ * and says so: the only way to submit either is a form this CMS did not
312
+ * render.
313
+ */
314
+ app.post(USER_NOTIFICATION_MODE_PATH, async (c) => {
315
+ const dataDir = c.var.config.dataDir;
316
+ const body = await c.req.parseBody();
317
+ const id = Number(field(body[USER_FIELDS.userId]));
318
+ const target = Number.isInteger(id) ? findUserById(dataDir, id) : undefined;
319
+ if (target === undefined) {
320
+ flash(c, 'error', 'That user is already gone.');
321
+ return c.redirect(USERS_PATH, 303);
322
+ }
323
+ const name = field(body[USER_FIELDS.event]);
324
+ const event = notificationEvent(name);
325
+ if (event === undefined || !event.batched) {
326
+ flash(c, 'error', 'That is not a notice this site can batch up.');
327
+ return c.redirect(editUserPath(target.id), 303);
328
+ }
329
+ const wanted = deliveryMode(field(body[USER_FIELDS.mode]));
330
+ if (wanted === undefined) {
331
+ flash(c, 'error', 'That is not one of the choices.');
332
+ return c.redirect(editUserPath(target.id), 303);
333
+ }
334
+ await setUserNotificationMode({ dataDir, userId: target.id, event: name, mode: wanted });
335
+ flash(c, 'notice', wanted === DEFAULT_DELIVERY_MODE
336
+ ? `${target.username} will hear about ${event.label.toLowerCase()} as they arrive.`
337
+ : `${target.username} will get one ${wanted === 'daily' ? 'daily' : 'hourly'} digest of ` +
338
+ `${event.label.toLowerCase()}.`);
339
+ return c.redirect(editUserPath(target.id), 303);
99
340
  });
100
341
  app.post(DELETE_USER_PATH, async (c) => {
101
- const admin = c.var.admin;
342
+ const dataDir = c.var.config.dataDir;
102
343
  const body = await c.req.parseBody();
103
344
  const id = Number(field(body[USER_FIELDS.userId]));
104
- const target = Number.isInteger(id) ? admin.getUserById(id) : undefined;
345
+ const target = Number.isInteger(id) ? findUserById(dataDir, id) : undefined;
105
346
  const refusal = deleteUserRefusal({
106
347
  target,
107
348
  signedInAs: c.var.session?.userId ?? null,
108
- total: admin.countUsers(),
349
+ total: countUsers(dataDir),
109
350
  });
110
351
  if (refusal !== undefined) {
111
352
  flash(c, 'error', refusal);
112
353
  return c.redirect(USERS_PATH, 303);
113
354
  }
114
- // Their sessions go with them: the foreign key cascades, and the
115
- // connection runs with `PRAGMA foreign_keys = ON`.
116
- admin.deleteUser(target.id);
355
+ await deleteUser({ dataDir, userId: target.id });
356
+ // Their sessions go with them. The foreign key that used to do this went
357
+ // with the users table (decision-9), so it is done here — and a session
358
+ // that outlives this one, in a database restored from a backup, is not a
359
+ // login either: the guard refuses one whose user the file does not hold.
360
+ c.var.admin.deleteSessionsForUser(target.id);
117
361
  flash(c, 'notice', `Deleted ${target.username}.`);
118
362
  return c.redirect(USERS_PATH, 303);
119
363
  });
364
+ /**
365
+ * One user's screen (TASK-97).
366
+ *
367
+ * Registered last, after every named path under `/admin/users/`, and matched
368
+ * only when the segment is digits — so Add new keeps its URL and a stray
369
+ * `/admin/users/anything` is a 404 rather than a screen about nobody.
370
+ */
371
+ app.get(`${USERS_PATH}/:id`, (c) => {
372
+ const id = pathId(c.req.param('id'));
373
+ const user = id === undefined ? undefined : findUserById(c.var.config.dataDir, id);
374
+ if (user === undefined)
375
+ return c.notFound();
376
+ return render(c, ADMIN_TEMPLATES.usersEdit, userScreen(c, user));
377
+ });
120
378
  }
121
379
  /**
122
380
  * Delete a user.
@@ -167,9 +425,10 @@ function signedOut(count) {
167
425
  * `/admin/setup` and `geekity user add` would both have accepted. A generated
168
426
  * password is not checked against them — it is made to satisfy them — and the
169
427
  * password field is not read at all when the box is ticked, so a stale value
170
- * left in it cannot be what is refused.
428
+ * left in it cannot be what is refused. An empty email is not a problem: it is
429
+ * an optional field, and most users will never have one.
171
430
  */
172
- export function addUserProblems(username, password, generate = false) {
431
+ export function addUserProblems(username, password, generate = false, email = '') {
173
432
  const problems = {};
174
433
  const name = usernameProblem(username);
175
434
  if (name !== undefined)
@@ -179,6 +438,9 @@ export function addUserProblems(username, password, generate = false) {
179
438
  if (secret !== undefined)
180
439
  problems.password = secret;
181
440
  }
441
+ const address = emailProblem(email);
442
+ if (address !== undefined)
443
+ problems.email = address;
182
444
  return problems;
183
445
  }
184
446
  /**
@@ -196,20 +458,72 @@ export function generatePassword() {
196
458
  }
197
459
  return password;
198
460
  }
199
- /** Everything the users template renders. */
200
- function screen(c, extra = {}) {
461
+ /**
462
+ * The Add new screen: the same context the listing is drawn from, rendered
463
+ * through `pages/users/new.njk` instead. The two screens are the same chrome
464
+ * around one of two things, and which of them it is is the route's business
465
+ * rather than a flag the template has to read.
466
+ */
467
+ function addScreen(c, extra = {}) {
468
+ return screen(c, { child: 'new', ...extra });
469
+ }
470
+ /**
471
+ * Everything one user's screen renders (TASK-97).
472
+ *
473
+ * The same forms the table used to hold, one per panel and each with its
474
+ * fields labelled: the account, the public profile, what this person is
475
+ * emailed about, the password — only on your own page — and the delete, or the
476
+ * sentence saying why this account cannot go.
477
+ */
478
+ function userScreen(c, user, extra = {}) {
201
479
  const signedInAs = c.var.session?.userId ?? null;
202
- const users = c.var.admin.listUsers();
480
+ const total = countUsers(c.var.config.dataDir);
203
481
  return {
204
482
  section: 'users',
483
+ // The list's entry stays marked: an edit screen is where a row goes, not a
484
+ // sixth thing in the menu.
485
+ child: 'all',
205
486
  usersUrl: USERS_PATH,
487
+ userProfileUrl: USER_PROFILE_PATH,
206
488
  changePasswordUrl: CHANGE_PASSWORD_PATH,
207
489
  deleteUserUrl: DELETE_USER_PATH,
490
+ userEmailUrl: USER_EMAIL_PATH,
491
+ userNotificationsUrl: USER_NOTIFICATIONS_PATH,
492
+ userNotificationModeUrl: USER_NOTIFICATION_MODE_PATH,
493
+ fields: USER_FIELDS,
494
+ // `account` rather than `user`, which the chrome already holds: the bar
495
+ // says who is signed in, and this screen is about somebody who may well be
496
+ // anybody else.
497
+ account: row(user, { signedInAs, total }),
498
+ // Why this account cannot go, where it cannot, so the screen says it
499
+ // instead of offering a button it is about to refuse.
500
+ deleteRefusal: deleteUserRefusal({ target: user, signedInAs, total }),
501
+ passwordProblems: {},
502
+ mailConfigured: c.var.mail.configured(),
503
+ ...extra,
504
+ };
505
+ }
506
+ /**
507
+ * Everything the users screens render: the listing, and the fields the add
508
+ * form is drawn from.
509
+ *
510
+ * Nothing about editing a user is here any more (TASK-97). A row says who
511
+ * somebody is and links to their screen; the only form in the table is the
512
+ * delete, which is an action rather than a field.
513
+ */
514
+ function screen(c, extra = {}) {
515
+ const signedInAs = c.var.session?.userId ?? null;
516
+ const users = listUsers(c.var.config.dataDir);
517
+ return {
518
+ section: 'users',
519
+ child: 'all',
520
+ usersUrl: USERS_PATH,
521
+ addUserUrl: ADD_USER_PATH,
522
+ deleteUserUrl: DELETE_USER_PATH,
208
523
  fields: USER_FIELDS,
209
524
  users: users.map((user) => row(user, { signedInAs, total: users.length })),
210
- addForm: { username: '', generate: false },
525
+ addForm: { username: '', email: '', generate: false },
211
526
  addProblems: {},
212
- passwordProblems: {},
213
527
  ...extra,
214
528
  };
215
529
  }
@@ -217,16 +531,75 @@ function screen(c, extra = {}) {
217
531
  function field(value) {
218
532
  return typeof value === 'string' ? value : '';
219
533
  }
220
- /** One user as the table renders it. */
534
+ /**
535
+ * A textarea of links as the list a profile stores: one per line, `Label |
536
+ * URL`, or a bare URL that labels itself.
537
+ *
538
+ * A textarea rather than a repeating fieldset because a profile has two or
539
+ * three links and a table row has no space for a widget; the separator is a
540
+ * pipe because it is the one character nobody puts in a link label by
541
+ * accident. Blank lines are skipped and the empties are dropped inside
542
+ * `setUserProfile`, so a list somebody emptied leaves no key behind.
543
+ */
544
+ export function parseProfileLinks(value) {
545
+ const links = [];
546
+ for (const line of value.split('\n')) {
547
+ const trimmed = line.trim();
548
+ if (trimmed === '')
549
+ continue;
550
+ const separator = trimmed.indexOf('|');
551
+ if (separator === -1) {
552
+ links.push({ label: trimmed, href: trimmed });
553
+ continue;
554
+ }
555
+ links.push({
556
+ label: trimmed.slice(0, separator).trim(),
557
+ href: trimmed.slice(separator + 1).trim(),
558
+ });
559
+ }
560
+ return links;
561
+ }
562
+ /** A stored list of links back as the textarea shows it. */
563
+ export function formatProfileLinks(links) {
564
+ return (links ?? [])
565
+ .map((link) => (link.label === link.href ? link.href : `${link.label} | ${link.href}`))
566
+ .join('\n');
567
+ }
568
+ /** One user, as the table lists them and as their own screen edits them. */
221
569
  function row(user, context) {
222
570
  const you = user.id === context.signedInAs;
223
571
  return {
224
572
  id: user.id,
225
573
  username: user.username,
574
+ email: user.email ?? '',
575
+ // Where the row goes, and where every save about this person lands.
576
+ editUrl: editUserPath(user.id),
577
+ // The public half of this person (TASK-67): what the archive at
578
+ // `archiveUrl` is headed with, and — after TASK-68 — what their actor
579
+ // carries.
580
+ profile: {
581
+ displayName: user.profile?.displayName ?? '',
582
+ bio: user.profile?.bio ?? '',
583
+ avatar: user.profile?.avatar ?? '',
584
+ jobTitle: user.profile?.jobTitle ?? '',
585
+ location: user.profile?.location ?? '',
586
+ links: formatProfileLinks(user.profile?.links),
587
+ },
588
+ archiveUrl: authorHref(user.username),
589
+ // The id this person was published under before they were here (TASK-69).
590
+ // Shown on their screen rather than edited: it is identity, not a
591
+ // preference — the import writes it, or somebody editing
592
+ // `data/users.json` does — and a box that let it be changed would be a box
593
+ // that could break every follow this person has. Empty for almost
594
+ // everybody, and then the screen says nothing about it at all.
595
+ storedActorId: user.actorId ?? '',
596
+ // One switch per registered event, so the screen loops rather than naming
597
+ // the notices it happens to know about (TASK-55).
598
+ notifications: notificationSwitches(user),
226
599
  createdAt: user.createdAt,
227
600
  you,
228
601
  // The button is rendered for everybody the signed-in admin may actually
229
- // delete, so the screen never offers an action it is about to refuse.
602
+ // delete, so neither screen offers an action it is about to refuse.
230
603
  deletable: !you && context.total > 1,
231
604
  };
232
605
  }
@@ -1 +1 @@
1
- {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/admin/users.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/admin/users.ts"],"names":[],"mappings":"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"}