@geekity/cms 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/README.md +2217 -214
  2. package/admin/components/fields.njk +165 -0
  3. package/admin/layouts/base.njk +1 -1
  4. package/admin/layouts/settings-page.njk +26 -0
  5. package/admin/layouts/shell.njk +17 -3
  6. package/admin/pages/account/forgot.njk +47 -0
  7. package/admin/pages/account/login.njk +26 -0
  8. package/admin/pages/account/reset.njk +38 -0
  9. package/admin/pages/account/setup.njk +28 -0
  10. package/admin/pages/appearance/themes.njk +69 -0
  11. package/admin/pages/comments/all.njk +133 -0
  12. package/admin/{layouts/dashboard.njk → pages/dashboard/home.njk} +8 -15
  13. package/admin/{layouts/document-conflict.njk → pages/documents/conflict.njk} +1 -0
  14. package/admin/{layouts/document-editor.njk → pages/documents/editor.njk} +75 -59
  15. package/admin/{layouts/document-list.njk → pages/documents/list.njk} +19 -2
  16. package/admin/pages/documents/taxonomy.njk +95 -0
  17. package/admin/pages/federation/followers.njk +238 -0
  18. package/admin/pages/federation/settings.njk +77 -0
  19. package/admin/pages/media/library.njk +160 -0
  20. package/admin/pages/messages/all.njk +110 -0
  21. package/admin/pages/navigation/menus.njk +129 -0
  22. package/admin/{layouts → pages}/placeholder.njk +5 -1
  23. package/admin/pages/settings/discussion.njk +99 -0
  24. package/admin/pages/settings/email.njk +203 -0
  25. package/admin/pages/settings/general.njk +29 -0
  26. package/admin/pages/settings/permalinks.njk +50 -0
  27. package/admin/pages/settings/reading.njk +64 -0
  28. package/admin/pages/tools/content-index.njk +89 -0
  29. package/admin/pages/users/edit.njk +239 -0
  30. package/admin/pages/users/list.njk +51 -0
  31. package/admin/pages/users/new.njk +41 -0
  32. package/admin/static/admin.css +558 -3
  33. package/admin/static/copy.js +52 -0
  34. package/admin/static/editor.js +16 -16
  35. package/admin/static/slug.js +61 -0
  36. package/dist/access-log.d.ts +44 -0
  37. package/dist/access-log.d.ts.map +1 -0
  38. package/dist/access-log.js +71 -0
  39. package/dist/access-log.js.map +1 -0
  40. package/dist/admin/accounts.d.ts +413 -0
  41. package/dist/admin/accounts.d.ts.map +1 -0
  42. package/dist/admin/accounts.js +680 -0
  43. package/dist/admin/accounts.js.map +1 -0
  44. package/dist/admin/appearance.d.ts +80 -0
  45. package/dist/admin/appearance.d.ts.map +1 -0
  46. package/dist/admin/appearance.js +136 -0
  47. package/dist/admin/appearance.js.map +1 -0
  48. package/dist/admin/comments.d.ts +90 -0
  49. package/dist/admin/comments.d.ts.map +1 -0
  50. package/dist/admin/comments.js +244 -0
  51. package/dist/admin/comments.js.map +1 -0
  52. package/dist/admin/credentials.d.ts +26 -2
  53. package/dist/admin/credentials.d.ts.map +1 -1
  54. package/dist/admin/credentials.js +35 -2
  55. package/dist/admin/credentials.js.map +1 -1
  56. package/dist/admin/documents.d.ts +117 -10
  57. package/dist/admin/documents.d.ts.map +1 -1
  58. package/dist/admin/documents.js +328 -41
  59. package/dist/admin/documents.js.map +1 -1
  60. package/dist/admin/federation.d.ts +161 -50
  61. package/dist/admin/federation.d.ts.map +1 -1
  62. package/dist/admin/federation.js +235 -93
  63. package/dist/admin/federation.js.map +1 -1
  64. package/dist/admin/formatting.d.ts +20 -0
  65. package/dist/admin/formatting.d.ts.map +1 -0
  66. package/dist/admin/formatting.js +72 -0
  67. package/dist/admin/formatting.js.map +1 -0
  68. package/dist/admin/headers.d.ts +65 -0
  69. package/dist/admin/headers.d.ts.map +1 -0
  70. package/dist/admin/headers.js +104 -0
  71. package/dist/admin/headers.js.map +1 -0
  72. package/dist/admin/index.d.ts +38 -12
  73. package/dist/admin/index.d.ts.map +1 -1
  74. package/dist/admin/index.js +25 -7
  75. package/dist/admin/index.js.map +1 -1
  76. package/dist/admin/media.d.ts +168 -0
  77. package/dist/admin/media.d.ts.map +1 -0
  78. package/dist/admin/media.js +295 -0
  79. package/dist/admin/media.js.map +1 -0
  80. package/dist/admin/menu.d.ts +79 -0
  81. package/dist/admin/menu.d.ts.map +1 -0
  82. package/dist/admin/menu.js +143 -0
  83. package/dist/admin/menu.js.map +1 -0
  84. package/dist/admin/messages.d.ts +80 -0
  85. package/dist/admin/messages.d.ts.map +1 -0
  86. package/dist/admin/messages.js +152 -0
  87. package/dist/admin/messages.js.map +1 -0
  88. package/dist/admin/navigation.d.ts +155 -0
  89. package/dist/admin/navigation.d.ts.map +1 -0
  90. package/dist/admin/navigation.js +292 -0
  91. package/dist/admin/navigation.js.map +1 -0
  92. package/dist/admin/preview.d.ts.map +1 -1
  93. package/dist/admin/preview.js +31 -7
  94. package/dist/admin/preview.js.map +1 -1
  95. package/dist/admin/recovery.d.ts +92 -0
  96. package/dist/admin/recovery.d.ts.map +1 -0
  97. package/dist/admin/recovery.js +229 -0
  98. package/dist/admin/recovery.js.map +1 -0
  99. package/dist/admin/routes.d.ts +0 -20
  100. package/dist/admin/routes.d.ts.map +1 -1
  101. package/dist/admin/routes.js +164 -105
  102. package/dist/admin/routes.js.map +1 -1
  103. package/dist/admin/session.d.ts +17 -3
  104. package/dist/admin/session.d.ts.map +1 -1
  105. package/dist/admin/session.js +19 -5
  106. package/dist/admin/session.js.map +1 -1
  107. package/dist/admin/settings-discussion.d.ts +37 -0
  108. package/dist/admin/settings-discussion.d.ts.map +1 -0
  109. package/dist/admin/settings-discussion.js +117 -0
  110. package/dist/admin/settings-discussion.js.map +1 -0
  111. package/dist/admin/settings-email.d.ts +54 -0
  112. package/dist/admin/settings-email.d.ts.map +1 -0
  113. package/dist/admin/settings-email.js +189 -0
  114. package/dist/admin/settings-email.js.map +1 -0
  115. package/dist/admin/settings-federation.d.ts +48 -0
  116. package/dist/admin/settings-federation.d.ts.map +1 -0
  117. package/dist/admin/settings-federation.js +123 -0
  118. package/dist/admin/settings-federation.js.map +1 -0
  119. package/dist/admin/settings-general.d.ts +12 -0
  120. package/dist/admin/settings-general.d.ts.map +1 -0
  121. package/dist/admin/settings-general.js +48 -0
  122. package/dist/admin/settings-general.js.map +1 -0
  123. package/dist/admin/settings-page.d.ts +119 -0
  124. package/dist/admin/settings-page.d.ts.map +1 -0
  125. package/dist/admin/settings-page.js +132 -0
  126. package/dist/admin/settings-page.js.map +1 -0
  127. package/dist/admin/settings-pages.d.ts +30 -0
  128. package/dist/admin/settings-pages.d.ts.map +1 -0
  129. package/dist/admin/settings-pages.js +43 -0
  130. package/dist/admin/settings-pages.js.map +1 -0
  131. package/dist/admin/settings-permalinks.d.ts +16 -0
  132. package/dist/admin/settings-permalinks.d.ts.map +1 -0
  133. package/dist/admin/settings-permalinks.js +32 -0
  134. package/dist/admin/settings-permalinks.js.map +1 -0
  135. package/dist/admin/settings-reading.d.ts +34 -0
  136. package/dist/admin/settings-reading.d.ts.map +1 -0
  137. package/dist/admin/settings-reading.js +49 -0
  138. package/dist/admin/settings-reading.js.map +1 -0
  139. package/dist/admin/settings.d.ts +339 -96
  140. package/dist/admin/settings.d.ts.map +1 -1
  141. package/dist/admin/settings.js +600 -308
  142. package/dist/admin/settings.js.map +1 -1
  143. package/dist/admin/store.d.ts +606 -152
  144. package/dist/admin/store.d.ts.map +1 -1
  145. package/dist/admin/store.js +863 -268
  146. package/dist/admin/store.js.map +1 -1
  147. package/dist/admin/taxonomy.d.ts +114 -0
  148. package/dist/admin/taxonomy.d.ts.map +1 -0
  149. package/dist/admin/taxonomy.js +289 -0
  150. package/dist/admin/taxonomy.js.map +1 -0
  151. package/dist/admin/templates.d.ts +46 -14
  152. package/dist/admin/templates.d.ts.map +1 -1
  153. package/dist/admin/templates.js +46 -14
  154. package/dist/admin/templates.js.map +1 -1
  155. package/dist/admin/throttle.d.ts +84 -0
  156. package/dist/admin/throttle.d.ts.map +1 -0
  157. package/dist/admin/throttle.js +143 -0
  158. package/dist/admin/throttle.js.map +1 -0
  159. package/dist/admin/tools.d.ts +111 -0
  160. package/dist/admin/tools.d.ts.map +1 -0
  161. package/dist/admin/tools.js +182 -0
  162. package/dist/admin/tools.js.map +1 -0
  163. package/dist/admin/uploads.d.ts +28 -2
  164. package/dist/admin/uploads.d.ts.map +1 -1
  165. package/dist/admin/uploads.js +43 -4
  166. package/dist/admin/uploads.js.map +1 -1
  167. package/dist/admin/users.d.ts +100 -13
  168. package/dist/admin/users.d.ts.map +1 -1
  169. package/dist/admin/users.js +412 -39
  170. package/dist/admin/users.js.map +1 -1
  171. package/dist/cache.d.ts +141 -0
  172. package/dist/cache.d.ts.map +1 -0
  173. package/dist/cache.js +207 -0
  174. package/dist/cache.js.map +1 -0
  175. package/dist/cli.d.ts +14 -2
  176. package/dist/cli.d.ts.map +1 -1
  177. package/dist/cli.js +429 -21
  178. package/dist/cli.js.map +1 -1
  179. package/dist/comments/akismet.d.ts +130 -0
  180. package/dist/comments/akismet.d.ts.map +1 -0
  181. package/dist/comments/akismet.js +274 -0
  182. package/dist/comments/akismet.js.map +1 -0
  183. package/dist/comments/conversation.d.ts +29 -0
  184. package/dist/comments/conversation.d.ts.map +1 -0
  185. package/dist/comments/conversation.js +60 -0
  186. package/dist/comments/conversation.js.map +1 -0
  187. package/dist/comments/form.d.ts +123 -0
  188. package/dist/comments/form.d.ts.map +1 -0
  189. package/dist/comments/form.js +79 -0
  190. package/dist/comments/form.js.map +1 -0
  191. package/dist/comments/index.d.ts +16 -0
  192. package/dist/comments/index.d.ts.map +1 -0
  193. package/dist/comments/index.js +10 -0
  194. package/dist/comments/index.js.map +1 -0
  195. package/dist/comments/markdown.d.ts +8 -0
  196. package/dist/comments/markdown.d.ts.map +1 -0
  197. package/dist/comments/markdown.js +85 -0
  198. package/dist/comments/markdown.js.map +1 -0
  199. package/dist/comments/moderate.d.ts +71 -0
  200. package/dist/comments/moderate.d.ts.map +1 -0
  201. package/dist/comments/moderate.js +88 -0
  202. package/dist/comments/moderate.js.map +1 -0
  203. package/dist/comments/policy.d.ts +57 -0
  204. package/dist/comments/policy.d.ts.map +1 -0
  205. package/dist/comments/policy.js +80 -0
  206. package/dist/comments/policy.js.map +1 -0
  207. package/dist/comments/records.d.ts +266 -0
  208. package/dist/comments/records.d.ts.map +1 -0
  209. package/dist/comments/records.js +487 -0
  210. package/dist/comments/records.js.map +1 -0
  211. package/dist/comments/routes.d.ts +60 -0
  212. package/dist/comments/routes.d.ts.map +1 -0
  213. package/dist/comments/routes.js +212 -0
  214. package/dist/comments/routes.js.map +1 -0
  215. package/dist/comments/submission.d.ts +297 -0
  216. package/dist/comments/submission.d.ts.map +1 -0
  217. package/dist/comments/submission.js +280 -0
  218. package/dist/comments/submission.js.map +1 -0
  219. package/dist/comments/viewer.d.ts +21 -0
  220. package/dist/comments/viewer.d.ts.map +1 -0
  221. package/dist/comments/viewer.js +45 -0
  222. package/dist/comments/viewer.js.map +1 -0
  223. package/dist/config.d.ts +225 -5
  224. package/dist/config.d.ts.map +1 -1
  225. package/dist/config.js +121 -6
  226. package/dist/config.js.map +1 -1
  227. package/dist/contact/delivery.d.ts +60 -0
  228. package/dist/contact/delivery.d.ts.map +1 -0
  229. package/dist/contact/delivery.js +87 -0
  230. package/dist/contact/delivery.js.map +1 -0
  231. package/dist/contact/form.d.ts +130 -0
  232. package/dist/contact/form.d.ts.map +1 -0
  233. package/dist/contact/form.js +163 -0
  234. package/dist/contact/form.js.map +1 -0
  235. package/dist/contact/index.d.ts +17 -0
  236. package/dist/contact/index.d.ts.map +1 -0
  237. package/dist/contact/index.js +13 -0
  238. package/dist/contact/index.js.map +1 -0
  239. package/dist/contact/records.d.ts +124 -0
  240. package/dist/contact/records.d.ts.map +1 -0
  241. package/dist/contact/records.js +218 -0
  242. package/dist/contact/records.js.map +1 -0
  243. package/dist/contact/routes.d.ts +17 -0
  244. package/dist/contact/routes.d.ts.map +1 -0
  245. package/dist/contact/routes.js +127 -0
  246. package/dist/contact/routes.js.map +1 -0
  247. package/dist/contact/submission.d.ts +103 -0
  248. package/dist/contact/submission.d.ts.map +1 -0
  249. package/dist/contact/submission.js +166 -0
  250. package/dist/contact/submission.js.map +1 -0
  251. package/dist/content/document.d.ts +7 -2
  252. package/dist/content/document.d.ts.map +1 -1
  253. package/dist/content/document.js +1 -0
  254. package/dist/content/document.js.map +1 -1
  255. package/dist/content/index.d.ts +7 -2
  256. package/dist/content/index.d.ts.map +1 -1
  257. package/dist/content/index.js +4 -1
  258. package/dist/content/index.js.map +1 -1
  259. package/dist/content/markdown.d.ts.map +1 -1
  260. package/dist/content/markdown.js +24 -2
  261. package/dist/content/markdown.js.map +1 -1
  262. package/dist/content/parser.d.ts.map +1 -1
  263. package/dist/content/parser.js +11 -4
  264. package/dist/content/parser.js.map +1 -1
  265. package/dist/content/save.d.ts +5 -0
  266. package/dist/content/save.d.ts.map +1 -1
  267. package/dist/content/save.js +44 -1
  268. package/dist/content/save.js.map +1 -1
  269. package/dist/content/schedule.d.ts +125 -0
  270. package/dist/content/schedule.d.ts.map +1 -0
  271. package/dist/content/schedule.js +207 -0
  272. package/dist/content/schedule.js.map +1 -0
  273. package/dist/content/search.d.ts +64 -0
  274. package/dist/content/search.d.ts.map +1 -0
  275. package/dist/content/search.js +136 -0
  276. package/dist/content/search.js.map +1 -0
  277. package/dist/content/store.d.ts +220 -7
  278. package/dist/content/store.d.ts.map +1 -1
  279. package/dist/content/store.js +392 -67
  280. package/dist/content/store.js.map +1 -1
  281. package/dist/content/sync.d.ts +7 -1
  282. package/dist/content/sync.d.ts.map +1 -1
  283. package/dist/content/sync.js +18 -10
  284. package/dist/content/sync.js.map +1 -1
  285. package/dist/content/time.d.ts +56 -0
  286. package/dist/content/time.d.ts.map +1 -0
  287. package/dist/content/time.js +141 -0
  288. package/dist/content/time.js.map +1 -0
  289. package/dist/content/writer.d.ts.map +1 -1
  290. package/dist/content/writer.js +3 -0
  291. package/dist/content/writer.js.map +1 -1
  292. package/dist/env.d.ts +70 -5
  293. package/dist/env.d.ts.map +1 -1
  294. package/dist/federation/actor.d.ts +95 -41
  295. package/dist/federation/actor.d.ts.map +1 -1
  296. package/dist/federation/actor.js +180 -53
  297. package/dist/federation/actor.js.map +1 -1
  298. package/dist/federation/article.d.ts +44 -17
  299. package/dist/federation/article.d.ts.map +1 -1
  300. package/dist/federation/article.js +98 -46
  301. package/dist/federation/article.js.map +1 -1
  302. package/dist/federation/delivery.d.ts +63 -15
  303. package/dist/federation/delivery.d.ts.map +1 -1
  304. package/dist/federation/delivery.js +154 -80
  305. package/dist/federation/delivery.js.map +1 -1
  306. package/dist/federation/federation.d.ts +22 -17
  307. package/dist/federation/federation.d.ts.map +1 -1
  308. package/dist/federation/federation.js +98 -77
  309. package/dist/federation/federation.js.map +1 -1
  310. package/dist/federation/followers.d.ts +3 -2
  311. package/dist/federation/followers.d.ts.map +1 -1
  312. package/dist/federation/followers.js +6 -5
  313. package/dist/federation/followers.js.map +1 -1
  314. package/dist/federation/import-wordpress.d.ts +128 -0
  315. package/dist/federation/import-wordpress.d.ts.map +1 -0
  316. package/dist/federation/import-wordpress.js +426 -0
  317. package/dist/federation/import-wordpress.js.map +1 -0
  318. package/dist/federation/inbox.d.ts +36 -13
  319. package/dist/federation/inbox.d.ts.map +1 -1
  320. package/dist/federation/inbox.js +120 -49
  321. package/dist/federation/inbox.js.map +1 -1
  322. package/dist/federation/index.d.ts +22 -10
  323. package/dist/federation/index.d.ts.map +1 -1
  324. package/dist/federation/index.js +13 -8
  325. package/dist/federation/index.js.map +1 -1
  326. package/dist/federation/keys.d.ts +98 -20
  327. package/dist/federation/keys.d.ts.map +1 -1
  328. package/dist/federation/keys.js +269 -39
  329. package/dist/federation/keys.js.map +1 -1
  330. package/dist/federation/mount.d.ts +46 -10
  331. package/dist/federation/mount.d.ts.map +1 -1
  332. package/dist/federation/mount.js +300 -28
  333. package/dist/federation/mount.js.map +1 -1
  334. package/dist/federation/paths.d.ts +23 -35
  335. package/dist/federation/paths.d.ts.map +1 -1
  336. package/dist/federation/paths.js +26 -39
  337. package/dist/federation/paths.js.map +1 -1
  338. package/dist/federation/records.d.ts +223 -0
  339. package/dist/federation/records.d.ts.map +1 -0
  340. package/dist/federation/records.js +506 -0
  341. package/dist/federation/records.js.map +1 -0
  342. package/dist/federation/relays.d.ts +114 -0
  343. package/dist/federation/relays.d.ts.map +1 -0
  344. package/dist/federation/relays.js +290 -0
  345. package/dist/federation/relays.js.map +1 -0
  346. package/dist/federation/replies.d.ts +80 -0
  347. package/dist/federation/replies.d.ts.map +1 -0
  348. package/dist/federation/replies.js +166 -0
  349. package/dist/federation/replies.js.map +1 -0
  350. package/dist/federation/wordpress.d.ts +131 -0
  351. package/dist/federation/wordpress.d.ts.map +1 -0
  352. package/dist/federation/wordpress.js +341 -0
  353. package/dist/federation/wordpress.js.map +1 -0
  354. package/dist/files/atomic.d.ts +103 -0
  355. package/dist/files/atomic.d.ts.map +1 -0
  356. package/dist/files/atomic.js +150 -0
  357. package/dist/files/atomic.js.map +1 -0
  358. package/dist/files/index.d.ts +3 -0
  359. package/dist/files/index.d.ts.map +1 -0
  360. package/dist/files/index.js +2 -0
  361. package/dist/files/index.js.map +1 -0
  362. package/dist/forms/protection.d.ts +85 -0
  363. package/dist/forms/protection.d.ts.map +1 -0
  364. package/dist/forms/protection.js +116 -0
  365. package/dist/forms/protection.js.map +1 -0
  366. package/dist/images/icons.d.ts +59 -0
  367. package/dist/images/icons.d.ts.map +1 -0
  368. package/dist/images/icons.js +131 -0
  369. package/dist/images/icons.js.map +1 -0
  370. package/dist/images/index.d.ts +7 -0
  371. package/dist/images/index.d.ts.map +1 -0
  372. package/dist/images/index.js +4 -0
  373. package/dist/images/index.js.map +1 -0
  374. package/dist/images/markup.d.ts +47 -0
  375. package/dist/images/markup.d.ts.map +1 -0
  376. package/dist/images/markup.js +175 -0
  377. package/dist/images/markup.js.map +1 -0
  378. package/dist/images/paths.d.ts +34 -0
  379. package/dist/images/paths.d.ts.map +1 -0
  380. package/dist/images/paths.js +41 -0
  381. package/dist/images/paths.js.map +1 -0
  382. package/dist/images/variants.d.ts +104 -0
  383. package/dist/images/variants.d.ts.map +1 -0
  384. package/dist/images/variants.js +320 -0
  385. package/dist/images/variants.js.map +1 -0
  386. package/dist/index.d.ts +123 -19
  387. package/dist/index.d.ts.map +1 -1
  388. package/dist/index.js +344 -25
  389. package/dist/index.js.map +1 -1
  390. package/dist/init.d.ts +18 -0
  391. package/dist/init.d.ts.map +1 -1
  392. package/dist/init.js +34 -3
  393. package/dist/init.js.map +1 -1
  394. package/dist/mail/brevo.d.ts +35 -0
  395. package/dist/mail/brevo.d.ts.map +1 -0
  396. package/dist/mail/brevo.js +85 -0
  397. package/dist/mail/brevo.js.map +1 -0
  398. package/dist/mail/credentials.d.ts +62 -0
  399. package/dist/mail/credentials.d.ts.map +1 -0
  400. package/dist/mail/credentials.js +86 -0
  401. package/dist/mail/credentials.js.map +1 -0
  402. package/dist/mail/index.d.ts +15 -0
  403. package/dist/mail/index.d.ts.map +1 -0
  404. package/dist/mail/index.js +8 -0
  405. package/dist/mail/index.js.map +1 -0
  406. package/dist/mail/memory.d.ts +35 -0
  407. package/dist/mail/memory.d.ts.map +1 -0
  408. package/dist/mail/memory.js +29 -0
  409. package/dist/mail/memory.js.map +1 -0
  410. package/dist/mail/provider.d.ts +80 -0
  411. package/dist/mail/provider.d.ts.map +1 -0
  412. package/dist/mail/provider.js +23 -0
  413. package/dist/mail/provider.js.map +1 -0
  414. package/dist/mail/service.d.ts +156 -0
  415. package/dist/mail/service.d.ts.map +1 -0
  416. package/dist/mail/service.js +265 -0
  417. package/dist/mail/service.js.map +1 -0
  418. package/dist/mail/smtp.d.ts +39 -0
  419. package/dist/mail/smtp.d.ts.map +1 -0
  420. package/dist/mail/smtp.js +58 -0
  421. package/dist/mail/smtp.js.map +1 -0
  422. package/dist/mail/templates.d.ts +91 -0
  423. package/dist/mail/templates.d.ts.map +1 -0
  424. package/dist/mail/templates.js +69 -0
  425. package/dist/mail/templates.js.map +1 -0
  426. package/dist/notifications/comments.d.ts +66 -0
  427. package/dist/notifications/comments.d.ts.map +1 -0
  428. package/dist/notifications/comments.js +151 -0
  429. package/dist/notifications/comments.js.map +1 -0
  430. package/dist/notifications/digest.d.ts +135 -0
  431. package/dist/notifications/digest.d.ts.map +1 -0
  432. package/dist/notifications/digest.js +287 -0
  433. package/dist/notifications/digest.js.map +1 -0
  434. package/dist/notifications/index.d.ts +13 -0
  435. package/dist/notifications/index.d.ts.map +1 -0
  436. package/dist/notifications/index.js +8 -0
  437. package/dist/notifications/index.js.map +1 -0
  438. package/dist/notifications/links.d.ts +60 -0
  439. package/dist/notifications/links.d.ts.map +1 -0
  440. package/dist/notifications/links.js +63 -0
  441. package/dist/notifications/links.js.map +1 -0
  442. package/dist/notifications/optouts.d.ts +48 -0
  443. package/dist/notifications/optouts.d.ts.map +1 -0
  444. package/dist/notifications/optouts.js +93 -0
  445. package/dist/notifications/optouts.js.map +1 -0
  446. package/dist/notifications/preferences.d.ts +158 -0
  447. package/dist/notifications/preferences.d.ts.map +1 -0
  448. package/dist/notifications/preferences.js +195 -0
  449. package/dist/notifications/preferences.js.map +1 -0
  450. package/dist/notifications/routes.d.ts +28 -0
  451. package/dist/notifications/routes.d.ts.map +1 -0
  452. package/dist/notifications/routes.js +184 -0
  453. package/dist/notifications/routes.js.map +1 -0
  454. package/dist/notifications/tokens.d.ts +60 -0
  455. package/dist/notifications/tokens.d.ts.map +1 -0
  456. package/dist/notifications/tokens.js +125 -0
  457. package/dist/notifications/tokens.js.map +1 -0
  458. package/dist/notify.d.ts +84 -0
  459. package/dist/notify.d.ts.map +1 -0
  460. package/dist/notify.js +149 -0
  461. package/dist/notify.js.map +1 -0
  462. package/dist/web/archive.d.ts +49 -0
  463. package/dist/web/archive.d.ts.map +1 -0
  464. package/dist/web/archive.js +59 -0
  465. package/dist/web/archive.js.map +1 -0
  466. package/dist/web/assets.d.ts +6 -5
  467. package/dist/web/assets.d.ts.map +1 -1
  468. package/dist/web/assets.js +5 -7
  469. package/dist/web/assets.js.map +1 -1
  470. package/dist/web/authors.d.ts +143 -0
  471. package/dist/web/authors.d.ts.map +1 -0
  472. package/dist/web/authors.js +178 -0
  473. package/dist/web/authors.js.map +1 -0
  474. package/dist/web/comments.d.ts +60 -0
  475. package/dist/web/comments.d.ts.map +1 -0
  476. package/dist/web/comments.js +207 -0
  477. package/dist/web/comments.js.map +1 -0
  478. package/dist/web/context.d.ts +162 -28
  479. package/dist/web/context.d.ts.map +1 -1
  480. package/dist/web/context.js +123 -26
  481. package/dist/web/context.js.map +1 -1
  482. package/dist/web/conversation.d.ts +209 -0
  483. package/dist/web/conversation.d.ts.map +1 -0
  484. package/dist/web/conversation.js +557 -0
  485. package/dist/web/conversation.js.map +1 -0
  486. package/dist/web/documents.d.ts +36 -6
  487. package/dist/web/documents.d.ts.map +1 -1
  488. package/dist/web/documents.js +52 -10
  489. package/dist/web/documents.js.map +1 -1
  490. package/dist/web/feed-atom.d.ts +22 -0
  491. package/dist/web/feed-atom.d.ts.map +1 -0
  492. package/dist/web/feed-atom.js +83 -0
  493. package/dist/web/feed-atom.js.map +1 -0
  494. package/dist/web/feed-item.d.ts +145 -0
  495. package/dist/web/feed-item.d.ts.map +1 -0
  496. package/dist/web/feed-item.js +120 -0
  497. package/dist/web/feed-item.js.map +1 -0
  498. package/dist/web/feed-json.d.ts +79 -0
  499. package/dist/web/feed-json.d.ts.map +1 -0
  500. package/dist/web/feed-json.js +53 -0
  501. package/dist/web/feed-json.js.map +1 -0
  502. package/dist/web/feed-rss.d.ts +26 -0
  503. package/dist/web/feed-rss.d.ts.map +1 -0
  504. package/dist/web/feed-rss.js +203 -0
  505. package/dist/web/feed-rss.js.map +1 -0
  506. package/dist/web/feed-source.d.ts +244 -0
  507. package/dist/web/feed-source.d.ts.map +1 -0
  508. package/dist/web/feed-source.js +201 -0
  509. package/dist/web/feed-source.js.map +1 -0
  510. package/dist/web/feed-xml.d.ts +63 -0
  511. package/dist/web/feed-xml.d.ts.map +1 -0
  512. package/dist/web/feed-xml.js +116 -0
  513. package/dist/web/feed-xml.js.map +1 -0
  514. package/dist/web/feeds.d.ts +31 -96
  515. package/dist/web/feeds.d.ts.map +1 -1
  516. package/dist/web/feeds.js +94 -198
  517. package/dist/web/feeds.js.map +1 -1
  518. package/dist/web/health.d.ts +31 -0
  519. package/dist/web/health.d.ts.map +1 -0
  520. package/dist/web/health.js +44 -0
  521. package/dist/web/health.js.map +1 -0
  522. package/dist/web/index.d.ts +30 -10
  523. package/dist/web/index.d.ts.map +1 -1
  524. package/dist/web/index.js +18 -7
  525. package/dist/web/index.js.map +1 -1
  526. package/dist/web/navigation.d.ts +195 -0
  527. package/dist/web/navigation.d.ts.map +1 -0
  528. package/dist/web/navigation.js +300 -0
  529. package/dist/web/navigation.js.map +1 -0
  530. package/dist/web/negotiate.d.ts +31 -0
  531. package/dist/web/negotiate.d.ts.map +1 -1
  532. package/dist/web/negotiate.js +31 -11
  533. package/dist/web/negotiate.js.map +1 -1
  534. package/dist/web/recent.d.ts +43 -0
  535. package/dist/web/recent.d.ts.map +1 -0
  536. package/dist/web/recent.js +37 -0
  537. package/dist/web/recent.js.map +1 -0
  538. package/dist/web/render.d.ts +203 -9
  539. package/dist/web/render.d.ts.map +1 -1
  540. package/dist/web/render.js +341 -17
  541. package/dist/web/render.js.map +1 -1
  542. package/dist/web/routes.d.ts +25 -8
  543. package/dist/web/routes.d.ts.map +1 -1
  544. package/dist/web/routes.js +854 -93
  545. package/dist/web/routes.js.map +1 -1
  546. package/dist/web/sanitize.d.ts +19 -0
  547. package/dist/web/sanitize.d.ts.map +1 -0
  548. package/dist/web/sanitize.js +272 -0
  549. package/dist/web/sanitize.js.map +1 -0
  550. package/dist/web/search.d.ts +79 -0
  551. package/dist/web/search.d.ts.map +1 -0
  552. package/dist/web/search.js +94 -0
  553. package/dist/web/search.js.map +1 -0
  554. package/dist/web/sitemap.d.ts +120 -0
  555. package/dist/web/sitemap.d.ts.map +1 -0
  556. package/dist/web/sitemap.js +199 -0
  557. package/dist/web/sitemap.js.map +1 -0
  558. package/dist/web/taxonomy.d.ts +152 -0
  559. package/dist/web/taxonomy.d.ts.map +1 -0
  560. package/dist/web/taxonomy.js +237 -0
  561. package/dist/web/taxonomy.js.map +1 -0
  562. package/dist/web/templates.d.ts +54 -16
  563. package/dist/web/templates.d.ts.map +1 -1
  564. package/dist/web/templates.js +109 -28
  565. package/dist/web/templates.js.map +1 -1
  566. package/dist/web/themes.d.ts +226 -0
  567. package/dist/web/themes.d.ts.map +1 -0
  568. package/dist/web/themes.js +314 -0
  569. package/dist/web/themes.js.map +1 -0
  570. package/dist/webmention/discovery.d.ts +51 -0
  571. package/dist/webmention/discovery.d.ts.map +1 -0
  572. package/dist/webmention/discovery.js +176 -0
  573. package/dist/webmention/discovery.js.map +1 -0
  574. package/dist/webmention/html.d.ts +71 -0
  575. package/dist/webmention/html.d.ts.map +1 -0
  576. package/dist/webmention/html.js +285 -0
  577. package/dist/webmention/html.js.map +1 -0
  578. package/dist/webmention/index.d.ts +12 -0
  579. package/dist/webmention/index.d.ts.map +1 -0
  580. package/dist/webmention/index.js +8 -0
  581. package/dist/webmention/index.js.map +1 -0
  582. package/dist/webmention/links.d.ts +18 -0
  583. package/dist/webmention/links.d.ts.map +1 -0
  584. package/dist/webmention/links.js +64 -0
  585. package/dist/webmention/links.js.map +1 -0
  586. package/dist/webmention/microformats.d.ts +93 -0
  587. package/dist/webmention/microformats.d.ts.map +1 -0
  588. package/dist/webmention/microformats.js +376 -0
  589. package/dist/webmention/microformats.js.map +1 -0
  590. package/dist/webmention/receive.d.ts +141 -0
  591. package/dist/webmention/receive.d.ts.map +1 -0
  592. package/dist/webmention/receive.js +264 -0
  593. package/dist/webmention/receive.js.map +1 -0
  594. package/dist/webmention/routes.d.ts +37 -0
  595. package/dist/webmention/routes.d.ts.map +1 -0
  596. package/dist/webmention/routes.js +75 -0
  597. package/dist/webmention/routes.js.map +1 -0
  598. package/dist/webmention/service.d.ts +94 -0
  599. package/dist/webmention/service.d.ts.map +1 -0
  600. package/dist/webmention/service.js +207 -0
  601. package/dist/webmention/service.js.map +1 -0
  602. package/package.json +11 -6
  603. package/templates/site/content/_data/site.json +8 -0
  604. package/templates/site/content/pages/about.md +7 -0
  605. package/templates/site/content/posts/2026-01-01-hello-world.md +5 -3
  606. package/templates/site/geekity.config.ts +11 -1
  607. package/templates/site/tsconfig.json +1 -1
  608. package/themes/default/README.md +1216 -50
  609. package/themes/default/layouts/404.njk +2 -3
  610. package/themes/default/layouts/author.njk +36 -0
  611. package/themes/default/layouts/base.njk +161 -31
  612. package/themes/default/layouts/category.njk +27 -0
  613. package/themes/default/layouts/front-page.njk +56 -0
  614. package/themes/default/layouts/home.njk +17 -1
  615. package/themes/default/layouts/page.njk +57 -5
  616. package/themes/default/layouts/post.njk +78 -19
  617. package/themes/default/layouts/search.njk +57 -0
  618. package/themes/default/layouts/tag.njk +3 -6
  619. package/themes/default/mail/comment-digest.html.njk +37 -0
  620. package/themes/default/mail/comment-digest.subject.njk +3 -0
  621. package/themes/default/mail/comment-digest.txt.njk +40 -0
  622. package/themes/default/mail/comment-pending.html.njk +27 -0
  623. package/themes/default/mail/comment-pending.subject.njk +2 -0
  624. package/themes/default/mail/comment-pending.txt.njk +24 -0
  625. package/themes/default/mail/comment-reply.html.njk +21 -0
  626. package/themes/default/mail/comment-reply.subject.njk +2 -0
  627. package/themes/default/mail/comment-reply.txt.njk +22 -0
  628. package/themes/default/mail/contact-message.html.njk +24 -0
  629. package/themes/default/mail/contact-message.subject.njk +5 -0
  630. package/themes/default/mail/contact-message.txt.njk +20 -0
  631. package/themes/default/mail/password-changed.html.njk +18 -0
  632. package/themes/default/mail/password-changed.subject.njk +2 -0
  633. package/themes/default/mail/password-changed.txt.njk +17 -0
  634. package/themes/default/mail/password-reset.html.njk +22 -0
  635. package/themes/default/mail/password-reset.subject.njk +2 -0
  636. package/themes/default/mail/password-reset.txt.njk +18 -0
  637. package/themes/default/mail/test.html.njk +14 -0
  638. package/themes/default/mail/test.subject.njk +2 -0
  639. package/themes/default/mail/test.txt.njk +12 -0
  640. package/themes/default/partials/archive.njk +27 -0
  641. package/themes/default/partials/bio.njk +71 -0
  642. package/themes/default/partials/comment-form.njk +137 -0
  643. package/themes/default/partials/contact-form.njk +88 -0
  644. package/themes/default/partials/conversation.njk +139 -0
  645. package/themes/default/partials/feeds.njk +26 -0
  646. package/themes/default/partials/jsonld.njk +120 -0
  647. package/themes/default/partials/menu.njk +32 -0
  648. package/themes/default/partials/pagination.njk +12 -6
  649. package/themes/default/partials/post-list.njk +51 -18
  650. package/themes/default/partials/search-form.njk +22 -0
  651. package/themes/default/partials/tags.njk +26 -5
  652. package/themes/default/static/highlight.js +4 -0
  653. package/themes/default/static/style.css +1142 -194
  654. package/themes/default/theme.json +9 -0
  655. package/admin/layouts/federation.njk +0 -145
  656. package/admin/layouts/login.njk +0 -23
  657. package/admin/layouts/settings.njk +0 -116
  658. package/admin/layouts/setup.njk +0 -27
  659. package/admin/layouts/users.njk +0 -91
  660. /package/admin/{layouts/_flash.njk → components/flash.njk} +0 -0
@@ -0,0 +1,61 @@
1
+ /* The one bit of progressive enhancement doc-5 asks for: the slug follows the
2
+ title until somebody types a slug of their own, and the permalink follows
3
+ the slug on the same terms. Without this the form still works — an empty
4
+ slug is derived from the title on the server.
5
+
6
+ It is a file rather than an inline <script> so the admin's
7
+ Content-Security-Policy can say `script-src 'self'` and mean it: no nonce,
8
+ no 'unsafe-inline', and nothing an HTML injection could ever get to run. It
9
+ is loaded with `defer`, so the form is in the document by the time it runs.
10
+
11
+ Plain ES5-shaped browser JavaScript, checked by eslint's browser config and
12
+ left alone by the TypeScript build: it is served as it is written. */
13
+ (function () {
14
+ var title = document.getElementById('editor-title');
15
+ var slug = document.getElementById('editor-slug');
16
+ var permalink = document.getElementById('editor-permalink');
17
+ if (!title || !slug) return;
18
+
19
+ var date = document.getElementById('editor-date');
20
+ var slugFollows = slug.value === '';
21
+ var permalinkFollows = !permalink || permalink.value === '';
22
+
23
+ function slugify(value) {
24
+ return value
25
+ .normalize('NFKD')
26
+ .toLowerCase()
27
+ .replace(/[\u0300-\u036f]/g, '')
28
+ .replace(/[^a-z0-9]+/g, '-')
29
+ .replace(/^-+|-+$/g, '');
30
+ }
31
+
32
+ /* The same shape defaultPermalink() writes on the server: a post lives under
33
+ the year and month of its date, a page at the top level. */
34
+ function syncPermalink() {
35
+ if (!permalink || !permalinkFollows) return;
36
+ if (slug.value === '') {
37
+ permalink.value = '';
38
+ return;
39
+ }
40
+ var month = date ? /^(\d{4})-(\d{2})/.exec(date.value) : null;
41
+ var prefix = month ? '/' + month[1] + '/' + month[2] + '/' : '/';
42
+ permalink.value = prefix + slug.value + '/';
43
+ }
44
+
45
+ slug.addEventListener('input', function () {
46
+ slugFollows = false;
47
+ syncPermalink();
48
+ });
49
+
50
+ if (permalink) {
51
+ permalink.addEventListener('input', function () {
52
+ permalinkFollows = false;
53
+ });
54
+ }
55
+
56
+ title.addEventListener('input', function () {
57
+ if (!slugFollows) return;
58
+ slug.value = slugify(title.value);
59
+ syncPermalink();
60
+ });
61
+ })();
@@ -0,0 +1,44 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import type { ResolvedConfig } from './config.ts';
3
+ import type { GeekityEnv } from './env.ts';
4
+ /**
5
+ * Where one access-log line goes.
6
+ *
7
+ * The line arrives without a trailing newline; the sink decides the framing.
8
+ * The default sink is stdout — what a container collects, what dockge shows
9
+ * and what journald keeps — and a test hands in one that keeps the lines.
10
+ */
11
+ export type AccessLogWriter = (line: string) => void;
12
+ /** What {@link createAccessLog} needs to know. */
13
+ export interface AccessLogOptions {
14
+ /**
15
+ * Whether a client address goes on the line, and which one is right. Read
16
+ * once, at boot: the log is registered before the context is, so it cannot
17
+ * read the config off a request.
18
+ */
19
+ config: Pick<ResolvedConfig, 'accessLogAddress' | 'trustProxy'>;
20
+ /** Where the lines go. Defaults to stdout. */
21
+ write?: AccessLogWriter;
22
+ }
23
+ /**
24
+ * One line per request: what was asked, what was answered, and how long it
25
+ * took.
26
+ *
27
+ * ```
28
+ * GET /.well-known/webfinger?resource=acct:ada@example.com 200 3.1ms
29
+ * ```
30
+ *
31
+ * The fields are in a fixed order and separated by spaces, so the status is
32
+ * always the third and a line is readable by eye, by `grep` and by `awk`
33
+ * alike. The client address, when the site asks for one, goes last for that
34
+ * reason — turning it on moves nothing else.
35
+ *
36
+ * Only the request line is ever read: no body is touched, so nothing is
37
+ * buffered and no password posted to the login form can reach the log, and no
38
+ * header but the forwarded address a site has said to believe is looked at, so
39
+ * no cookie and no `Authorization` can either. The query string is logged as
40
+ * it arrived, because it is what a peer's WebFinger lookup carries and what a
41
+ * question about who asked for what is answered with.
42
+ */
43
+ export declare function createAccessLog(options: AccessLogOptions): MiddlewareHandler<GeekityEnv>;
44
+ //# sourceMappingURL=access-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAG9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAErD,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,kBAAkB,GAAG,YAAY,CAAC,CAAC;IAChE,8CAA8C;IAC9C,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAsBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC,CA4BxF"}
@@ -0,0 +1,71 @@
1
+ import { clientAddress } from './admin/throttle.js';
2
+ /** The default sink: one write per line, the newline included, like the CLI's. */
3
+ function writeToStdout(line) {
4
+ process.stdout.write(`${line}\n`);
5
+ }
6
+ /**
7
+ * The path and query string of a request, taken out of its URL by hand.
8
+ *
9
+ * `new URL(...)` per request would parse and allocate the whole of an address
10
+ * this only ever wants the tail of, and this runs on every request the site
11
+ * answers. There is nothing to escape: Node's HTTP parser refuses a request
12
+ * target with a control character in it, so whatever survives to here is one
13
+ * line's worth of text.
14
+ */
15
+ function requestTarget(url) {
16
+ const afterScheme = url.indexOf('://');
17
+ const start = afterScheme < 0 ? -1 : url.indexOf('/', afterScheme + 3);
18
+ return start < 0 ? '/' : url.slice(start);
19
+ }
20
+ /**
21
+ * One line per request: what was asked, what was answered, and how long it
22
+ * took.
23
+ *
24
+ * ```
25
+ * GET /.well-known/webfinger?resource=acct:ada@example.com 200 3.1ms
26
+ * ```
27
+ *
28
+ * The fields are in a fixed order and separated by spaces, so the status is
29
+ * always the third and a line is readable by eye, by `grep` and by `awk`
30
+ * alike. The client address, when the site asks for one, goes last for that
31
+ * reason — turning it on moves nothing else.
32
+ *
33
+ * Only the request line is ever read: no body is touched, so nothing is
34
+ * buffered and no password posted to the login form can reach the log, and no
35
+ * header but the forwarded address a site has said to believe is looked at, so
36
+ * no cookie and no `Authorization` can either. The query string is logged as
37
+ * it arrived, because it is what a peer's WebFinger lookup carries and what a
38
+ * question about who asked for what is answered with.
39
+ */
40
+ export function createAccessLog(options) {
41
+ const write = options.write ?? writeToStdout;
42
+ const { accessLogAddress, trustProxy } = options.config;
43
+ return async function accessLog(c, next) {
44
+ const started = performance.now();
45
+ let threw = false;
46
+ try {
47
+ await next();
48
+ }
49
+ catch (error) {
50
+ // A handler that threw has no response of its own: the error is on its
51
+ // way up to Hono's error handler, which answers 500, and `c.res` would
52
+ // hand back a freshly made 200 if asked. A request that failed is the
53
+ // one most worth having a line for, so it gets the status it will be
54
+ // answered with rather than the one it never had.
55
+ threw = true;
56
+ throw error;
57
+ }
58
+ finally {
59
+ const elapsed = (performance.now() - started).toFixed(1);
60
+ const status = threw ? 500 : c.res.status;
61
+ let line = `${c.req.method} ${requestTarget(c.req.url)} ${String(status)} ${elapsed}ms`;
62
+ if (accessLogAddress) {
63
+ const address = clientAddress(c, { trustProxy });
64
+ if (address !== undefined)
65
+ line += ` ${address}`;
66
+ }
67
+ write(line);
68
+ }
69
+ };
70
+ }
71
+ //# sourceMappingURL=access-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-log.js","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAyBpD,kFAAkF;AAClF,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;IACvE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC;IAC7C,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAExD,OAAO,KAAK,UAAU,SAAS,CAAC,CAAC,EAAE,IAAI;QACrC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uEAAuE;YACvE,uEAAuE;YACvE,sEAAsE;YACtE,qEAAqE;YACrE,kDAAkD;YAClD,KAAK,GAAG,IAAI,CAAC;YACb,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAC1C,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,IAAI,CAAC;YACxF,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;gBACjD,IAAI,OAAO,KAAK,SAAS;oBAAE,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;YACnD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,413 @@
1
+ import type { AdminStore } from './store.ts';
2
+ /**
3
+ * Who may sign in: `data/users.json`, and everything that reads or writes it.
4
+ *
5
+ * decision-9 puts every piece of irreducible state in a file, and a login is
6
+ * as irreducible as state gets — an account cannot be derived from anything,
7
+ * and a site that lost its users would fall back into first-run setup with the
8
+ * door open to whoever reached it first. So the file is the truth and the
9
+ * database is a cache: `data/geekity.db` may be deleted at rest, and the next
10
+ * boot still knows exactly who may sign in.
11
+ *
12
+ * It lives in `data/` rather than `content/`, unlike `site.json`, because
13
+ * `content/` is published with the site and in git, and an argon2 hash is not
14
+ * something to hand a reader or a mirror. The file is written 0600 for the
15
+ * same reason; it sits directly in `dataDir`, so there is no private directory
16
+ * around it to lean on.
17
+ *
18
+ * Reads are synchronous and per call, exactly as `readSiteSettings` reads
19
+ * `site.json` per call: the file is a few hundred bytes and nothing anywhere
20
+ * can then be holding a stale copy of who exists. Writes go through
21
+ * {@link updateFileAtomically}, which puts the read inside the same queue as
22
+ * the write, so the uniqueness rule that used to be a `UNIQUE` index is
23
+ * checked and acted on as one step.
24
+ */
25
+ /** The file, relative to `dataDir`. */
26
+ export declare const USERS_FILE = "users.json";
27
+ /** The permissions the file is written with: nobody but the site's own user. */
28
+ export declare const USERS_FILE_MODE = 384;
29
+ /** Where the users file lives for a given data directory. */
30
+ export declare function usersFile(dataDir: string): string;
31
+ /** An admin user. There is one role, so there is nothing else to say about one. */
32
+ export interface User {
33
+ /** Its id, stable for the life of the user, and what a session names. */
34
+ readonly id: number;
35
+ /** Login name, unique and compared case sensitively. */
36
+ readonly username: string;
37
+ /**
38
+ * Where the site can reach this person, or `undefined` when nobody has said.
39
+ *
40
+ * Optional on purpose (TASK-54): a login is a username and a password, and a
41
+ * site that never sends email has no use for this. What it buys is a
42
+ * password that can be recovered without a shell, and, once TASK-55 lands,
43
+ * somewhere to send the notices an admin would otherwise have to go looking
44
+ * for. Not unique, and not a second login name: it is only ever matched
45
+ * against by the forgot-password form, which answers the same either way.
46
+ */
47
+ readonly email?: string | undefined;
48
+ /**
49
+ * Which notices this user has turned off, when they have turned any off
50
+ * (TASK-55).
51
+ *
52
+ * Absent for almost everybody, because it holds only what somebody actually
53
+ * changed: an event nothing says anything about is at the default
54
+ * `src/notifications/preferences.ts` gives it, which is what lets a new
55
+ * notice start working without anybody visiting the users screen. Keyed by
56
+ * event name, so adding an event adds no field here.
57
+ */
58
+ readonly notifications?: Readonly<Record<string, boolean>> | undefined;
59
+ /**
60
+ * How often each notice arrives, for the events that offer a choice and the
61
+ * users who have made one (TASK-60).
62
+ *
63
+ * A second map beside {@link User.notifications} rather than a widening of
64
+ * it, because the two answer different questions — whether, and how often —
65
+ * and a user who wants no notice at all is not a user with a delivery mode.
66
+ * Absent for almost everybody, on the same rule: `immediately` is the
67
+ * default and the default is never written down. Keyed by event name, so
68
+ * adding an event adds no field here either.
69
+ */
70
+ readonly notificationModes?: Readonly<Record<string, string>> | undefined;
71
+ /**
72
+ * What the public site says about this person, when somebody has filled any
73
+ * of it in (TASK-67).
74
+ *
75
+ * decision-14 makes a user an actor at their author URL, so the URL has to
76
+ * be a page before it can be an actor, and a page needs something to say.
77
+ * Absent for a user nobody has written a profile for, on the rule the two
78
+ * maps above follow: the file holds what somebody actually filled in, and a
79
+ * user with no profile still has an archive under their username.
80
+ */
81
+ readonly profile?: UserProfile | undefined;
82
+ /**
83
+ * The ActivityStreams id this person was published under somewhere else,
84
+ * when they were (TASK-69).
85
+ *
86
+ * decision-14 calls this identity rather than cache: a follower's server
87
+ * keys the account by it for as long as the follow lasts, and a document
88
+ * served under it with a different `id` reads as a different person, not as
89
+ * a moved one. So a site arriving from the WordPress ActivityPub plugin
90
+ * keeps the `https://example.com/?author=2` its followers already hold, for
91
+ * the life of the user.
92
+ *
93
+ * The CMS never mints one — a user born here is an actor at their author URL
94
+ * and has no second name to keep — and no screen writes one: it arrives with
95
+ * the import (TASK-71) or is typed into the file by hand. The whole URL is
96
+ * stored, query string and all, because that is what has to be matched.
97
+ */
98
+ readonly actorId?: string | undefined;
99
+ /**
100
+ * The number the WordPress ActivityPub plugin gave this person's actor, when
101
+ * they had one (TASK-70).
102
+ *
103
+ * The WordPress user id, which is what the plugin puts in the paths it
104
+ * publishes: `/wp-json/activitypub/1.0/actors/2/inbox` is user 2. Unlike
105
+ * {@link User.actorId} this is cache rather than identity — a follower's
106
+ * server replaces those paths the next time it refetches the actor — so it
107
+ * is only ever read behind the `wordpressActivityPub` site setting, and it
108
+ * is what maps a delivery arriving at one of those paths to a person.
109
+ *
110
+ * The CMS never mints one. It arrives with the import (TASK-71) or is typed
111
+ * into the file by hand, beside the stored actor id the same migration sets.
112
+ */
113
+ readonly wordpressActorId?: number | undefined;
114
+ /** When the user was created, as an ISO 8601 instant. */
115
+ readonly createdAt: string;
116
+ }
117
+ /**
118
+ * One thing a profile points at: somewhere else this person is.
119
+ *
120
+ * A label and a URL rather than a bare URL, because the label is what a theme
121
+ * prints and what an ActivityPub `attachment` calls the property (TASK-68).
122
+ */
123
+ export interface ProfileLink {
124
+ /** What the link says. */
125
+ readonly label: string;
126
+ /** Where it goes. */
127
+ readonly href: string;
128
+ }
129
+ /**
130
+ * The public face of a user: what their archive is headed with and what their
131
+ * actor will carry.
132
+ *
133
+ * Every field is optional, and one that is empty is not stored at all: a
134
+ * profile is something somebody chose to write, and a user who has written
135
+ * none of it is not a user with four empty strings.
136
+ */
137
+ export interface UserProfile {
138
+ /** The name to print instead of the username, when they gave one. */
139
+ readonly displayName?: string | undefined;
140
+ /** A few sentences about them. */
141
+ readonly bio?: string | undefined;
142
+ /** A picture, as the path or URL it is served at. */
143
+ readonly avatar?: string | undefined;
144
+ /**
145
+ * What they do, when they said: the line a theme prints under the name in a
146
+ * bio, and the `jobTitle` of the JSON-LD `Person` it emits (decision-16).
147
+ */
148
+ readonly jobTitle?: string | undefined;
149
+ /** Where they are, as they wrote it: "Madison, Wisconsin", "Somewhere wet". */
150
+ readonly location?: string | undefined;
151
+ /** Somewhere else they are, in the order they listed them. */
152
+ readonly links?: readonly ProfileLink[] | undefined;
153
+ }
154
+ /** A user with the field no screen may render: its password hash. */
155
+ export interface StoredUser extends User {
156
+ /** The PHC-encoded argon2id hash. */
157
+ readonly passwordHash: string;
158
+ }
159
+ /** What {@link createUser} is given. */
160
+ export interface CreateUserInput {
161
+ /** Which site's users file to add to. */
162
+ dataDir: string;
163
+ /** The name they will sign in with. Compared exactly, as it always was. */
164
+ username: string;
165
+ /** The plain password. It is hashed on the way in and never stored. */
166
+ password: string;
167
+ /** Where to reach them. Left off, or empty, is a user with no email. */
168
+ email?: string | undefined;
169
+ }
170
+ /** Thrown when a username is already taken. Usernames are the login key. */
171
+ export declare class DuplicateUsernameError extends Error {
172
+ readonly name = "DuplicateUsernameError";
173
+ /** The name that was already in use. */
174
+ readonly username: string;
175
+ constructor(username: string);
176
+ }
177
+ /**
178
+ * Every user, by name, without password hashes.
179
+ *
180
+ * Sorted by code unit rather than by locale, which is how the `ORDER BY
181
+ * username` over a `BINARY` column this replaces sorted them: a listing that
182
+ * changed order with the server's locale would be a listing nobody could
183
+ * describe.
184
+ */
185
+ export declare function listUsers(dataDir: string): User[];
186
+ /**
187
+ * The site's first account: the lowest id, which is the one the first run
188
+ * made.
189
+ *
190
+ * decision-14 leaves the site with no actor of its own, and two things still
191
+ * have to be somebody's: a relay subscription, which is an instance-wide
192
+ * agreement rather than one person's, and a post whose `author` names nobody
193
+ * this site knows. Both fall to the first account, because a site's first
194
+ * account is the one that has always existed and the only one that can be
195
+ * chosen without asking. `undefined` before anybody has signed up, which is
196
+ * first-run setup and federates nothing.
197
+ */
198
+ export declare function primaryUser(dataDir: string): User | undefined;
199
+ /** How many users exist. Zero is what puts the admin into first-run setup. */
200
+ export declare function countUsers(dataDir: string): number;
201
+ /**
202
+ * One user with its password hash, or `undefined`. For auth, not for screens.
203
+ */
204
+ export declare function findUser(dataDir: string, username: string): StoredUser | undefined;
205
+ /** The user behind a session's `userId`, or `undefined`. */
206
+ export declare function findUserById(dataDir: string, id: number): User | undefined;
207
+ /**
208
+ * The user a forgot-password form named, by either of the two things somebody
209
+ * might type: their username or their email address.
210
+ *
211
+ * The username is compared exactly, because that is how logging in compares it
212
+ * and a second, looser rule would let one person's name match another's
213
+ * account. The email is folded to lower case on both sides, because an address
214
+ * is case-insensitive in practice and nobody remembers how they capitalised
215
+ * one. A user is matched by username first, so a site where somebody's address
216
+ * happens to be another person's username still resolves the way logging in
217
+ * would. The empty string matches nobody, however many users have no email.
218
+ */
219
+ export declare function findUserByIdentifier(dataDir: string, identifier: string): User | undefined;
220
+ /**
221
+ * Hash the password and add the user to the file.
222
+ *
223
+ * Throws {@link DuplicateUsernameError} when the name is taken. The check is
224
+ * inside the write, not before it, which is what makes it the rule the
225
+ * `UNIQUE` index used to be: two requests adding the same name at the same
226
+ * moment queue behind one another on the file, so the second one reads the
227
+ * first one's work and is refused.
228
+ */
229
+ export declare function createUser(input: CreateUserInput): Promise<User>;
230
+ /**
231
+ * Hash a new password and put it on a user, replacing the old one. Returns
232
+ * `false` when there is no such user. Sessions are left alone; deciding which
233
+ * of them a password change should end is the caller's business.
234
+ */
235
+ export declare function setUserPassword(input: {
236
+ /** Which site's users file to write. */
237
+ dataDir: string;
238
+ /** Whose password. */
239
+ userId: number;
240
+ /** The new plain password, hashed on the way in. */
241
+ password: string;
242
+ }): Promise<boolean>;
243
+ /**
244
+ * Put an email address on a user, or take the one they had off.
245
+ *
246
+ * The empty string is how an address is removed, so one form field can do
247
+ * both: a box somebody cleared means "I do not want to be emailed", and there
248
+ * is nothing else it could mean. Returns `false` when there is no such user.
249
+ * The address is stored as it was typed, capitals and all — it is what a
250
+ * message is addressed to, and only the matching is case-insensitive.
251
+ */
252
+ export declare function setUserEmail(input: {
253
+ /** Which site's users file to write. */
254
+ dataDir: string;
255
+ /** Whose address. */
256
+ userId: number;
257
+ /** The address, or the empty string to remove it. */
258
+ email: string;
259
+ }): Promise<boolean>;
260
+ /**
261
+ * Write a user's profile, replacing whatever was there.
262
+ *
263
+ * The whole profile at once rather than a field at a time, because that is
264
+ * what the form on the users screen submits: four boxes and a Save, and a
265
+ * field somebody cleared is a field they no longer want. {@link cleanProfile}
266
+ * drops the empties, so a profile with nothing left in it leaves the user with
267
+ * no `profile` key rather than with an empty object. Returns `false` when
268
+ * there is no such user.
269
+ */
270
+ export declare function setUserProfile(input: {
271
+ /** Which site's users file to write. */
272
+ dataDir: string;
273
+ /** Whose profile. */
274
+ userId: number;
275
+ /** Everything the profile should say from now on. */
276
+ profile: UserProfile;
277
+ }): Promise<boolean>;
278
+ /**
279
+ * A profile with the empties taken out, or `undefined` when nothing is left.
280
+ *
281
+ * Trimming here rather than at the form is what makes a hand-edited file and a
282
+ * saved one read the same: a bio of three spaces is a bio nobody wrote, and a
283
+ * link with no URL is not somewhere this person is.
284
+ */
285
+ export declare function cleanProfile(profile: UserProfile): UserProfile | undefined;
286
+ /**
287
+ * Turn one notice on or off for one user.
288
+ *
289
+ * The map holds only what somebody changed, so this writes through
290
+ * {@link withNotification} and drops the key altogether when the answer is the
291
+ * default again. An event this version has never heard of changes nothing:
292
+ * there would be no switch to reach it with and no sender to read it. Returns
293
+ * `false` when there is no such user.
294
+ */
295
+ export declare function setUserNotification(input: {
296
+ /** Which site's users file to write. */
297
+ dataDir: string;
298
+ /** Whose preference. */
299
+ userId: number;
300
+ /** Which notice, by its name in the registry. */
301
+ event: string;
302
+ /** Whether they want it. */
303
+ on: boolean;
304
+ }): Promise<boolean>;
305
+ /**
306
+ * Say how often one notice reaches one user.
307
+ *
308
+ * The twin of {@link setUserNotification}, and it writes on the same rule:
309
+ * through {@link withNotificationMode}, which drops the key when the answer is
310
+ * the default again, when the mode is one this version does not know, and when
311
+ * the event does not offer a choice at all. So a form submitting nonsense
312
+ * leaves the file saying nothing rather than saying something unreachable.
313
+ * Returns `false` when there is no such user.
314
+ */
315
+ export declare function setUserNotificationMode(input: {
316
+ /** Which site's users file to write. */
317
+ dataDir: string;
318
+ /** Whose preference. */
319
+ userId: number;
320
+ /** Which notice, by its name in the registry. */
321
+ event: string;
322
+ /** How often they want it. */
323
+ mode: string;
324
+ }): Promise<boolean>;
325
+ /**
326
+ * Thrown when the id being imported already belongs to somebody else.
327
+ *
328
+ * Two accounts answering to one actor id is two people with one identity, and
329
+ * two carrying one WordPress number is a delivery to the plugin's old inbox
330
+ * that could go to either. Neither is something to pick a winner for, so the
331
+ * import stops and says whose it is.
332
+ */
333
+ export declare class ConflictingActorIdError extends Error {
334
+ readonly name = "ConflictingActorIdError";
335
+ /** The user who already has it. */
336
+ readonly username: string;
337
+ constructor(username: string, what: string);
338
+ }
339
+ /**
340
+ * Write the two ids a site arriving from the WordPress ActivityPub plugin
341
+ * carries: the actor id its followers hold, and the number its paths are built
342
+ * from (TASK-69, TASK-70).
343
+ *
344
+ * The only writer of either field, and it is not a screen: doc-4 makes a
345
+ * stored actor id identity for the life of the account, and identity is not
346
+ * something a form should be able to retype. `geekity import wordpress-actor`
347
+ * is what calls this.
348
+ *
349
+ * Both ids have to be unique across the file, and the check is inside the
350
+ * write for the reason {@link createUser}'s duplicate check is: it is a rule
351
+ * about the file rather than about one user, so it is read and acted on as one
352
+ * step. Returns whether anything changed — a second run with the same ids
353
+ * writes nothing, which is what makes the import idempotent.
354
+ */
355
+ export declare function setUserWordPressActor(input: {
356
+ /** Which site's users file to write. */
357
+ dataDir: string;
358
+ /** Whose record, by login name. */
359
+ username: string;
360
+ /** The id WordPress published them under, query string and all. */
361
+ actorId: string;
362
+ /** The WordPress user id. */
363
+ wordpressActorId: number;
364
+ }): Promise<boolean>;
365
+ /** Thrown when a command names a user this site does not have. */
366
+ export declare class UnknownUserError extends Error {
367
+ readonly name = "UnknownUserError";
368
+ /** The name that was asked for. */
369
+ readonly username: string;
370
+ constructor(username: string);
371
+ }
372
+ /**
373
+ * Take a user out of the file. Returns `false` when there was nothing to take.
374
+ *
375
+ * Their sessions are not ended here: sessions are in the database, and the
376
+ * screen that deletes a user ends them itself. A session that outlives this —
377
+ * one in a database restored from a backup, say — names a user the file no
378
+ * longer holds, and the admin guard turns that into no session at all.
379
+ */
380
+ export declare function deleteUser(input: {
381
+ dataDir: string;
382
+ userId: number;
383
+ }): Promise<boolean>;
384
+ /**
385
+ * The user, when the password is theirs; `undefined` when it is not, or when
386
+ * there is no such user. The two failures are deliberately indistinguishable.
387
+ */
388
+ export declare function verifyUserPassword(dataDir: string, username: string, password: string): User | undefined;
389
+ /**
390
+ * Turn an older site's users rows into `data/users.json`, once, and drop the
391
+ * table.
392
+ *
393
+ * TASK-9 put the accounts in SQLite; decision-9 made the database disposable,
394
+ * and a site upgrading across the two has rows nothing would ever read again.
395
+ * So the first boot of this version writes them out — ids and hashes exactly
396
+ * as they stand, because a session names its user by id and a hash is not
397
+ * something to re-encode on the way past.
398
+ *
399
+ * The file wins, as it does everywhere else: a `users.json` that is already
400
+ * there is left alone, so a database restored from a backup taken before the
401
+ * upgrade cannot bring deleted accounts back or undo a password change. The
402
+ * table is dropped either way, because a fresh database gets it from migration
403
+ * 1 — which has shipped, and so is never edited — and a site that has been
404
+ * migrated must not be asked again.
405
+ *
406
+ * Synchronous because `createCms` is: it runs before the server is listening
407
+ * and before anything else has touched the file.
408
+ */
409
+ export declare function migrateUsersToFile(options: {
410
+ admin: AdminStore;
411
+ dataDir: string;
412
+ }): void;
413
+ //# sourceMappingURL=accounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/admin/accounts.ts"],"names":[],"mappings":"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"}