@geekity/cms 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/README.md +2091 -214
  2. package/admin/components/fields.njk +165 -0
  3. package/admin/layouts/base.njk +1 -1
  4. package/admin/layouts/settings-page.njk +26 -0
  5. package/admin/layouts/shell.njk +17 -3
  6. package/admin/pages/account/forgot.njk +47 -0
  7. package/admin/pages/account/login.njk +26 -0
  8. package/admin/pages/account/reset.njk +38 -0
  9. package/admin/pages/account/setup.njk +28 -0
  10. package/admin/pages/appearance/themes.njk +69 -0
  11. package/admin/pages/comments/all.njk +133 -0
  12. package/admin/{layouts/dashboard.njk → pages/dashboard/home.njk} +8 -15
  13. package/admin/{layouts/document-conflict.njk → pages/documents/conflict.njk} +1 -0
  14. package/admin/pages/documents/editor.njk +196 -0
  15. package/admin/{layouts/document-list.njk → pages/documents/list.njk} +19 -2
  16. package/admin/pages/documents/taxonomy.njk +95 -0
  17. package/admin/pages/federation/followers.njk +238 -0
  18. package/admin/pages/media/library.njk +160 -0
  19. package/admin/pages/messages/all.njk +110 -0
  20. package/admin/{layouts → pages}/placeholder.njk +5 -1
  21. package/admin/pages/settings/discussion.njk +99 -0
  22. package/admin/pages/settings/email.njk +203 -0
  23. package/admin/pages/settings/federation.njk +75 -0
  24. package/admin/pages/settings/general.njk +29 -0
  25. package/admin/pages/settings/permalinks.njk +50 -0
  26. package/admin/pages/settings/reading.njk +72 -0
  27. package/admin/pages/users/edit.njk +239 -0
  28. package/admin/pages/users/list.njk +48 -0
  29. package/admin/pages/users/new.njk +41 -0
  30. package/admin/static/admin.css +498 -3
  31. package/admin/static/copy.js +52 -0
  32. package/admin/static/editor.js +16 -16
  33. package/admin/static/slug.js +61 -0
  34. package/dist/admin/accounts.d.ts +413 -0
  35. package/dist/admin/accounts.d.ts.map +1 -0
  36. package/dist/admin/accounts.js +680 -0
  37. package/dist/admin/accounts.js.map +1 -0
  38. package/dist/admin/appearance.d.ts +80 -0
  39. package/dist/admin/appearance.d.ts.map +1 -0
  40. package/dist/admin/appearance.js +136 -0
  41. package/dist/admin/appearance.js.map +1 -0
  42. package/dist/admin/comments.d.ts +90 -0
  43. package/dist/admin/comments.d.ts.map +1 -0
  44. package/dist/admin/comments.js +244 -0
  45. package/dist/admin/comments.js.map +1 -0
  46. package/dist/admin/credentials.d.ts +26 -2
  47. package/dist/admin/credentials.d.ts.map +1 -1
  48. package/dist/admin/credentials.js +35 -2
  49. package/dist/admin/credentials.js.map +1 -1
  50. package/dist/admin/documents.d.ts +127 -10
  51. package/dist/admin/documents.d.ts.map +1 -1
  52. package/dist/admin/documents.js +360 -41
  53. package/dist/admin/documents.js.map +1 -1
  54. package/dist/admin/federation.d.ts +151 -50
  55. package/dist/admin/federation.d.ts.map +1 -1
  56. package/dist/admin/federation.js +225 -93
  57. package/dist/admin/federation.js.map +1 -1
  58. package/dist/admin/formatting.d.ts +20 -0
  59. package/dist/admin/formatting.d.ts.map +1 -0
  60. package/dist/admin/formatting.js +72 -0
  61. package/dist/admin/formatting.js.map +1 -0
  62. package/dist/admin/headers.d.ts +65 -0
  63. package/dist/admin/headers.d.ts.map +1 -0
  64. package/dist/admin/headers.js +104 -0
  65. package/dist/admin/headers.js.map +1 -0
  66. package/dist/admin/index.d.ts +38 -12
  67. package/dist/admin/index.d.ts.map +1 -1
  68. package/dist/admin/index.js +25 -7
  69. package/dist/admin/index.js.map +1 -1
  70. package/dist/admin/media.d.ts +168 -0
  71. package/dist/admin/media.d.ts.map +1 -0
  72. package/dist/admin/media.js +295 -0
  73. package/dist/admin/media.js.map +1 -0
  74. package/dist/admin/menu.d.ts +79 -0
  75. package/dist/admin/menu.d.ts.map +1 -0
  76. package/dist/admin/menu.js +126 -0
  77. package/dist/admin/menu.js.map +1 -0
  78. package/dist/admin/messages.d.ts +80 -0
  79. package/dist/admin/messages.d.ts.map +1 -0
  80. package/dist/admin/messages.js +152 -0
  81. package/dist/admin/messages.js.map +1 -0
  82. package/dist/admin/preview.d.ts.map +1 -1
  83. package/dist/admin/preview.js +31 -7
  84. package/dist/admin/preview.js.map +1 -1
  85. package/dist/admin/recovery.d.ts +92 -0
  86. package/dist/admin/recovery.d.ts.map +1 -0
  87. package/dist/admin/recovery.js +229 -0
  88. package/dist/admin/recovery.js.map +1 -0
  89. package/dist/admin/routes.d.ts +0 -20
  90. package/dist/admin/routes.d.ts.map +1 -1
  91. package/dist/admin/routes.js +155 -105
  92. package/dist/admin/routes.js.map +1 -1
  93. package/dist/admin/settings-discussion.d.ts +37 -0
  94. package/dist/admin/settings-discussion.d.ts.map +1 -0
  95. package/dist/admin/settings-discussion.js +117 -0
  96. package/dist/admin/settings-discussion.js.map +1 -0
  97. package/dist/admin/settings-email.d.ts +54 -0
  98. package/dist/admin/settings-email.d.ts.map +1 -0
  99. package/dist/admin/settings-email.js +189 -0
  100. package/dist/admin/settings-email.js.map +1 -0
  101. package/dist/admin/settings-federation.d.ts +39 -0
  102. package/dist/admin/settings-federation.d.ts.map +1 -0
  103. package/dist/admin/settings-federation.js +103 -0
  104. package/dist/admin/settings-federation.js.map +1 -0
  105. package/dist/admin/settings-general.d.ts +12 -0
  106. package/dist/admin/settings-general.d.ts.map +1 -0
  107. package/dist/admin/settings-general.js +48 -0
  108. package/dist/admin/settings-general.js.map +1 -0
  109. package/dist/admin/settings-page.d.ts +102 -0
  110. package/dist/admin/settings-page.d.ts.map +1 -0
  111. package/dist/admin/settings-page.js +126 -0
  112. package/dist/admin/settings-page.js.map +1 -0
  113. package/dist/admin/settings-pages.d.ts +19 -0
  114. package/dist/admin/settings-pages.d.ts.map +1 -0
  115. package/dist/admin/settings-pages.js +33 -0
  116. package/dist/admin/settings-pages.js.map +1 -0
  117. package/dist/admin/settings-permalinks.d.ts +16 -0
  118. package/dist/admin/settings-permalinks.d.ts.map +1 -0
  119. package/dist/admin/settings-permalinks.js +32 -0
  120. package/dist/admin/settings-permalinks.js.map +1 -0
  121. package/dist/admin/settings-reading.d.ts +33 -0
  122. package/dist/admin/settings-reading.d.ts.map +1 -0
  123. package/dist/admin/settings-reading.js +48 -0
  124. package/dist/admin/settings-reading.js.map +1 -0
  125. package/dist/admin/settings.d.ts +325 -96
  126. package/dist/admin/settings.d.ts.map +1 -1
  127. package/dist/admin/settings.js +650 -308
  128. package/dist/admin/settings.js.map +1 -1
  129. package/dist/admin/store.d.ts +606 -152
  130. package/dist/admin/store.d.ts.map +1 -1
  131. package/dist/admin/store.js +863 -268
  132. package/dist/admin/store.js.map +1 -1
  133. package/dist/admin/taxonomy.d.ts +114 -0
  134. package/dist/admin/taxonomy.d.ts.map +1 -0
  135. package/dist/admin/taxonomy.js +289 -0
  136. package/dist/admin/taxonomy.js.map +1 -0
  137. package/dist/admin/templates.d.ts +44 -14
  138. package/dist/admin/templates.d.ts.map +1 -1
  139. package/dist/admin/templates.js +44 -14
  140. package/dist/admin/templates.js.map +1 -1
  141. package/dist/admin/throttle.d.ts +84 -0
  142. package/dist/admin/throttle.d.ts.map +1 -0
  143. package/dist/admin/throttle.js +143 -0
  144. package/dist/admin/throttle.js.map +1 -0
  145. package/dist/admin/uploads.d.ts +28 -2
  146. package/dist/admin/uploads.d.ts.map +1 -1
  147. package/dist/admin/uploads.js +43 -4
  148. package/dist/admin/uploads.js.map +1 -1
  149. package/dist/admin/users.d.ts +100 -13
  150. package/dist/admin/users.d.ts.map +1 -1
  151. package/dist/admin/users.js +412 -39
  152. package/dist/admin/users.js.map +1 -1
  153. package/dist/cache.d.ts +141 -0
  154. package/dist/cache.d.ts.map +1 -0
  155. package/dist/cache.js +207 -0
  156. package/dist/cache.js.map +1 -0
  157. package/dist/cli.d.ts +14 -2
  158. package/dist/cli.d.ts.map +1 -1
  159. package/dist/cli.js +424 -21
  160. package/dist/cli.js.map +1 -1
  161. package/dist/comments/akismet.d.ts +130 -0
  162. package/dist/comments/akismet.d.ts.map +1 -0
  163. package/dist/comments/akismet.js +274 -0
  164. package/dist/comments/akismet.js.map +1 -0
  165. package/dist/comments/conversation.d.ts +29 -0
  166. package/dist/comments/conversation.d.ts.map +1 -0
  167. package/dist/comments/conversation.js +60 -0
  168. package/dist/comments/conversation.js.map +1 -0
  169. package/dist/comments/form.d.ts +75 -0
  170. package/dist/comments/form.d.ts.map +1 -0
  171. package/dist/comments/form.js +64 -0
  172. package/dist/comments/form.js.map +1 -0
  173. package/dist/comments/index.d.ts +15 -0
  174. package/dist/comments/index.d.ts.map +1 -0
  175. package/dist/comments/index.js +9 -0
  176. package/dist/comments/index.js.map +1 -0
  177. package/dist/comments/markdown.d.ts +8 -0
  178. package/dist/comments/markdown.d.ts.map +1 -0
  179. package/dist/comments/markdown.js +85 -0
  180. package/dist/comments/markdown.js.map +1 -0
  181. package/dist/comments/moderate.d.ts +71 -0
  182. package/dist/comments/moderate.d.ts.map +1 -0
  183. package/dist/comments/moderate.js +88 -0
  184. package/dist/comments/moderate.js.map +1 -0
  185. package/dist/comments/policy.d.ts +57 -0
  186. package/dist/comments/policy.d.ts.map +1 -0
  187. package/dist/comments/policy.js +80 -0
  188. package/dist/comments/policy.js.map +1 -0
  189. package/dist/comments/records.d.ts +266 -0
  190. package/dist/comments/records.d.ts.map +1 -0
  191. package/dist/comments/records.js +487 -0
  192. package/dist/comments/records.js.map +1 -0
  193. package/dist/comments/routes.d.ts +58 -0
  194. package/dist/comments/routes.d.ts.map +1 -0
  195. package/dist/comments/routes.js +177 -0
  196. package/dist/comments/routes.js.map +1 -0
  197. package/dist/comments/submission.d.ts +263 -0
  198. package/dist/comments/submission.d.ts.map +1 -0
  199. package/dist/comments/submission.js +241 -0
  200. package/dist/comments/submission.js.map +1 -0
  201. package/dist/config.d.ts +190 -5
  202. package/dist/config.d.ts.map +1 -1
  203. package/dist/config.js +118 -6
  204. package/dist/config.js.map +1 -1
  205. package/dist/contact/delivery.d.ts +60 -0
  206. package/dist/contact/delivery.d.ts.map +1 -0
  207. package/dist/contact/delivery.js +87 -0
  208. package/dist/contact/delivery.js.map +1 -0
  209. package/dist/contact/form.d.ts +130 -0
  210. package/dist/contact/form.d.ts.map +1 -0
  211. package/dist/contact/form.js +163 -0
  212. package/dist/contact/form.js.map +1 -0
  213. package/dist/contact/index.d.ts +17 -0
  214. package/dist/contact/index.d.ts.map +1 -0
  215. package/dist/contact/index.js +13 -0
  216. package/dist/contact/index.js.map +1 -0
  217. package/dist/contact/records.d.ts +124 -0
  218. package/dist/contact/records.d.ts.map +1 -0
  219. package/dist/contact/records.js +218 -0
  220. package/dist/contact/records.js.map +1 -0
  221. package/dist/contact/routes.d.ts +17 -0
  222. package/dist/contact/routes.d.ts.map +1 -0
  223. package/dist/contact/routes.js +127 -0
  224. package/dist/contact/routes.js.map +1 -0
  225. package/dist/contact/submission.d.ts +103 -0
  226. package/dist/contact/submission.d.ts.map +1 -0
  227. package/dist/contact/submission.js +166 -0
  228. package/dist/contact/submission.js.map +1 -0
  229. package/dist/content/document.d.ts +7 -2
  230. package/dist/content/document.d.ts.map +1 -1
  231. package/dist/content/document.js +1 -0
  232. package/dist/content/document.js.map +1 -1
  233. package/dist/content/index.d.ts +7 -2
  234. package/dist/content/index.d.ts.map +1 -1
  235. package/dist/content/index.js +4 -1
  236. package/dist/content/index.js.map +1 -1
  237. package/dist/content/markdown.d.ts.map +1 -1
  238. package/dist/content/markdown.js +24 -2
  239. package/dist/content/markdown.js.map +1 -1
  240. package/dist/content/parser.d.ts.map +1 -1
  241. package/dist/content/parser.js +11 -4
  242. package/dist/content/parser.js.map +1 -1
  243. package/dist/content/save.d.ts +5 -0
  244. package/dist/content/save.d.ts.map +1 -1
  245. package/dist/content/save.js +44 -1
  246. package/dist/content/save.js.map +1 -1
  247. package/dist/content/schedule.d.ts +125 -0
  248. package/dist/content/schedule.d.ts.map +1 -0
  249. package/dist/content/schedule.js +207 -0
  250. package/dist/content/schedule.js.map +1 -0
  251. package/dist/content/search.d.ts +64 -0
  252. package/dist/content/search.d.ts.map +1 -0
  253. package/dist/content/search.js +136 -0
  254. package/dist/content/search.js.map +1 -0
  255. package/dist/content/store.d.ts +202 -7
  256. package/dist/content/store.d.ts.map +1 -1
  257. package/dist/content/store.js +374 -67
  258. package/dist/content/store.js.map +1 -1
  259. package/dist/content/sync.d.ts +7 -1
  260. package/dist/content/sync.d.ts.map +1 -1
  261. package/dist/content/sync.js +18 -10
  262. package/dist/content/sync.js.map +1 -1
  263. package/dist/content/time.d.ts +56 -0
  264. package/dist/content/time.d.ts.map +1 -0
  265. package/dist/content/time.js +141 -0
  266. package/dist/content/time.js.map +1 -0
  267. package/dist/content/writer.d.ts.map +1 -1
  268. package/dist/content/writer.js +3 -0
  269. package/dist/content/writer.js.map +1 -1
  270. package/dist/env.d.ts +58 -4
  271. package/dist/env.d.ts.map +1 -1
  272. package/dist/federation/actor.d.ts +95 -41
  273. package/dist/federation/actor.d.ts.map +1 -1
  274. package/dist/federation/actor.js +180 -53
  275. package/dist/federation/actor.js.map +1 -1
  276. package/dist/federation/article.d.ts +44 -17
  277. package/dist/federation/article.d.ts.map +1 -1
  278. package/dist/federation/article.js +98 -46
  279. package/dist/federation/article.js.map +1 -1
  280. package/dist/federation/delivery.d.ts +63 -15
  281. package/dist/federation/delivery.d.ts.map +1 -1
  282. package/dist/federation/delivery.js +154 -80
  283. package/dist/federation/delivery.js.map +1 -1
  284. package/dist/federation/federation.d.ts +22 -17
  285. package/dist/federation/federation.d.ts.map +1 -1
  286. package/dist/federation/federation.js +98 -77
  287. package/dist/federation/federation.js.map +1 -1
  288. package/dist/federation/followers.d.ts +3 -2
  289. package/dist/federation/followers.d.ts.map +1 -1
  290. package/dist/federation/followers.js +6 -5
  291. package/dist/federation/followers.js.map +1 -1
  292. package/dist/federation/import-wordpress.d.ts +128 -0
  293. package/dist/federation/import-wordpress.d.ts.map +1 -0
  294. package/dist/federation/import-wordpress.js +426 -0
  295. package/dist/federation/import-wordpress.js.map +1 -0
  296. package/dist/federation/inbox.d.ts +36 -13
  297. package/dist/federation/inbox.d.ts.map +1 -1
  298. package/dist/federation/inbox.js +120 -49
  299. package/dist/federation/inbox.js.map +1 -1
  300. package/dist/federation/index.d.ts +22 -10
  301. package/dist/federation/index.d.ts.map +1 -1
  302. package/dist/federation/index.js +13 -8
  303. package/dist/federation/index.js.map +1 -1
  304. package/dist/federation/keys.d.ts +98 -20
  305. package/dist/federation/keys.d.ts.map +1 -1
  306. package/dist/federation/keys.js +269 -39
  307. package/dist/federation/keys.js.map +1 -1
  308. package/dist/federation/mount.d.ts +42 -10
  309. package/dist/federation/mount.d.ts.map +1 -1
  310. package/dist/federation/mount.js +266 -26
  311. package/dist/federation/mount.js.map +1 -1
  312. package/dist/federation/paths.d.ts +23 -35
  313. package/dist/federation/paths.d.ts.map +1 -1
  314. package/dist/federation/paths.js +26 -39
  315. package/dist/federation/paths.js.map +1 -1
  316. package/dist/federation/records.d.ts +223 -0
  317. package/dist/federation/records.d.ts.map +1 -0
  318. package/dist/federation/records.js +506 -0
  319. package/dist/federation/records.js.map +1 -0
  320. package/dist/federation/relays.d.ts +114 -0
  321. package/dist/federation/relays.d.ts.map +1 -0
  322. package/dist/federation/relays.js +290 -0
  323. package/dist/federation/relays.js.map +1 -0
  324. package/dist/federation/replies.d.ts +80 -0
  325. package/dist/federation/replies.d.ts.map +1 -0
  326. package/dist/federation/replies.js +166 -0
  327. package/dist/federation/replies.js.map +1 -0
  328. package/dist/federation/wordpress.d.ts +131 -0
  329. package/dist/federation/wordpress.d.ts.map +1 -0
  330. package/dist/federation/wordpress.js +341 -0
  331. package/dist/federation/wordpress.js.map +1 -0
  332. package/dist/files/atomic.d.ts +103 -0
  333. package/dist/files/atomic.d.ts.map +1 -0
  334. package/dist/files/atomic.js +150 -0
  335. package/dist/files/atomic.js.map +1 -0
  336. package/dist/files/index.d.ts +3 -0
  337. package/dist/files/index.d.ts.map +1 -0
  338. package/dist/files/index.js +2 -0
  339. package/dist/files/index.js.map +1 -0
  340. package/dist/forms/protection.d.ts +85 -0
  341. package/dist/forms/protection.d.ts.map +1 -0
  342. package/dist/forms/protection.js +116 -0
  343. package/dist/forms/protection.js.map +1 -0
  344. package/dist/images/icons.d.ts +59 -0
  345. package/dist/images/icons.d.ts.map +1 -0
  346. package/dist/images/icons.js +131 -0
  347. package/dist/images/icons.js.map +1 -0
  348. package/dist/images/index.d.ts +7 -0
  349. package/dist/images/index.d.ts.map +1 -0
  350. package/dist/images/index.js +4 -0
  351. package/dist/images/index.js.map +1 -0
  352. package/dist/images/markup.d.ts +47 -0
  353. package/dist/images/markup.d.ts.map +1 -0
  354. package/dist/images/markup.js +175 -0
  355. package/dist/images/markup.js.map +1 -0
  356. package/dist/images/paths.d.ts +34 -0
  357. package/dist/images/paths.d.ts.map +1 -0
  358. package/dist/images/paths.js +41 -0
  359. package/dist/images/paths.js.map +1 -0
  360. package/dist/images/variants.d.ts +104 -0
  361. package/dist/images/variants.d.ts.map +1 -0
  362. package/dist/images/variants.js +320 -0
  363. package/dist/images/variants.js.map +1 -0
  364. package/dist/index.d.ts +123 -19
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +327 -25
  367. package/dist/index.js.map +1 -1
  368. package/dist/init.d.ts +18 -0
  369. package/dist/init.d.ts.map +1 -1
  370. package/dist/init.js +34 -3
  371. package/dist/init.js.map +1 -1
  372. package/dist/mail/brevo.d.ts +35 -0
  373. package/dist/mail/brevo.d.ts.map +1 -0
  374. package/dist/mail/brevo.js +85 -0
  375. package/dist/mail/brevo.js.map +1 -0
  376. package/dist/mail/credentials.d.ts +62 -0
  377. package/dist/mail/credentials.d.ts.map +1 -0
  378. package/dist/mail/credentials.js +86 -0
  379. package/dist/mail/credentials.js.map +1 -0
  380. package/dist/mail/index.d.ts +15 -0
  381. package/dist/mail/index.d.ts.map +1 -0
  382. package/dist/mail/index.js +8 -0
  383. package/dist/mail/index.js.map +1 -0
  384. package/dist/mail/memory.d.ts +35 -0
  385. package/dist/mail/memory.d.ts.map +1 -0
  386. package/dist/mail/memory.js +29 -0
  387. package/dist/mail/memory.js.map +1 -0
  388. package/dist/mail/provider.d.ts +80 -0
  389. package/dist/mail/provider.d.ts.map +1 -0
  390. package/dist/mail/provider.js +23 -0
  391. package/dist/mail/provider.js.map +1 -0
  392. package/dist/mail/service.d.ts +156 -0
  393. package/dist/mail/service.d.ts.map +1 -0
  394. package/dist/mail/service.js +265 -0
  395. package/dist/mail/service.js.map +1 -0
  396. package/dist/mail/smtp.d.ts +39 -0
  397. package/dist/mail/smtp.d.ts.map +1 -0
  398. package/dist/mail/smtp.js +58 -0
  399. package/dist/mail/smtp.js.map +1 -0
  400. package/dist/mail/templates.d.ts +91 -0
  401. package/dist/mail/templates.d.ts.map +1 -0
  402. package/dist/mail/templates.js +69 -0
  403. package/dist/mail/templates.js.map +1 -0
  404. package/dist/notifications/comments.d.ts +66 -0
  405. package/dist/notifications/comments.d.ts.map +1 -0
  406. package/dist/notifications/comments.js +151 -0
  407. package/dist/notifications/comments.js.map +1 -0
  408. package/dist/notifications/digest.d.ts +135 -0
  409. package/dist/notifications/digest.d.ts.map +1 -0
  410. package/dist/notifications/digest.js +287 -0
  411. package/dist/notifications/digest.js.map +1 -0
  412. package/dist/notifications/index.d.ts +13 -0
  413. package/dist/notifications/index.d.ts.map +1 -0
  414. package/dist/notifications/index.js +8 -0
  415. package/dist/notifications/index.js.map +1 -0
  416. package/dist/notifications/links.d.ts +60 -0
  417. package/dist/notifications/links.d.ts.map +1 -0
  418. package/dist/notifications/links.js +63 -0
  419. package/dist/notifications/links.js.map +1 -0
  420. package/dist/notifications/optouts.d.ts +48 -0
  421. package/dist/notifications/optouts.d.ts.map +1 -0
  422. package/dist/notifications/optouts.js +93 -0
  423. package/dist/notifications/optouts.js.map +1 -0
  424. package/dist/notifications/preferences.d.ts +158 -0
  425. package/dist/notifications/preferences.d.ts.map +1 -0
  426. package/dist/notifications/preferences.js +195 -0
  427. package/dist/notifications/preferences.js.map +1 -0
  428. package/dist/notifications/routes.d.ts +28 -0
  429. package/dist/notifications/routes.d.ts.map +1 -0
  430. package/dist/notifications/routes.js +184 -0
  431. package/dist/notifications/routes.js.map +1 -0
  432. package/dist/notifications/tokens.d.ts +60 -0
  433. package/dist/notifications/tokens.d.ts.map +1 -0
  434. package/dist/notifications/tokens.js +125 -0
  435. package/dist/notifications/tokens.js.map +1 -0
  436. package/dist/notify.d.ts +84 -0
  437. package/dist/notify.d.ts.map +1 -0
  438. package/dist/notify.js +149 -0
  439. package/dist/notify.js.map +1 -0
  440. package/dist/web/archive.d.ts +49 -0
  441. package/dist/web/archive.d.ts.map +1 -0
  442. package/dist/web/archive.js +59 -0
  443. package/dist/web/archive.js.map +1 -0
  444. package/dist/web/assets.d.ts +6 -5
  445. package/dist/web/assets.d.ts.map +1 -1
  446. package/dist/web/assets.js +5 -7
  447. package/dist/web/assets.js.map +1 -1
  448. package/dist/web/authors.d.ts +143 -0
  449. package/dist/web/authors.d.ts.map +1 -0
  450. package/dist/web/authors.js +178 -0
  451. package/dist/web/authors.js.map +1 -0
  452. package/dist/web/comments.d.ts +60 -0
  453. package/dist/web/comments.d.ts.map +1 -0
  454. package/dist/web/comments.js +207 -0
  455. package/dist/web/comments.js.map +1 -0
  456. package/dist/web/context.d.ts +162 -28
  457. package/dist/web/context.d.ts.map +1 -1
  458. package/dist/web/context.js +123 -26
  459. package/dist/web/context.js.map +1 -1
  460. package/dist/web/conversation.d.ts +209 -0
  461. package/dist/web/conversation.d.ts.map +1 -0
  462. package/dist/web/conversation.js +557 -0
  463. package/dist/web/conversation.js.map +1 -0
  464. package/dist/web/documents.d.ts +36 -6
  465. package/dist/web/documents.d.ts.map +1 -1
  466. package/dist/web/documents.js +52 -10
  467. package/dist/web/documents.js.map +1 -1
  468. package/dist/web/feed-atom.d.ts +22 -0
  469. package/dist/web/feed-atom.d.ts.map +1 -0
  470. package/dist/web/feed-atom.js +83 -0
  471. package/dist/web/feed-atom.js.map +1 -0
  472. package/dist/web/feed-item.d.ts +145 -0
  473. package/dist/web/feed-item.d.ts.map +1 -0
  474. package/dist/web/feed-item.js +120 -0
  475. package/dist/web/feed-item.js.map +1 -0
  476. package/dist/web/feed-json.d.ts +79 -0
  477. package/dist/web/feed-json.d.ts.map +1 -0
  478. package/dist/web/feed-json.js +53 -0
  479. package/dist/web/feed-json.js.map +1 -0
  480. package/dist/web/feed-rss.d.ts +26 -0
  481. package/dist/web/feed-rss.d.ts.map +1 -0
  482. package/dist/web/feed-rss.js +203 -0
  483. package/dist/web/feed-rss.js.map +1 -0
  484. package/dist/web/feed-source.d.ts +244 -0
  485. package/dist/web/feed-source.d.ts.map +1 -0
  486. package/dist/web/feed-source.js +201 -0
  487. package/dist/web/feed-source.js.map +1 -0
  488. package/dist/web/feed-xml.d.ts +63 -0
  489. package/dist/web/feed-xml.d.ts.map +1 -0
  490. package/dist/web/feed-xml.js +116 -0
  491. package/dist/web/feed-xml.js.map +1 -0
  492. package/dist/web/feeds.d.ts +31 -96
  493. package/dist/web/feeds.d.ts.map +1 -1
  494. package/dist/web/feeds.js +94 -198
  495. package/dist/web/feeds.js.map +1 -1
  496. package/dist/web/health.d.ts +31 -0
  497. package/dist/web/health.d.ts.map +1 -0
  498. package/dist/web/health.js +44 -0
  499. package/dist/web/health.js.map +1 -0
  500. package/dist/web/index.d.ts +30 -10
  501. package/dist/web/index.d.ts.map +1 -1
  502. package/dist/web/index.js +18 -7
  503. package/dist/web/index.js.map +1 -1
  504. package/dist/web/navigation.d.ts +73 -0
  505. package/dist/web/navigation.d.ts.map +1 -0
  506. package/dist/web/navigation.js +110 -0
  507. package/dist/web/navigation.js.map +1 -0
  508. package/dist/web/negotiate.d.ts +9 -0
  509. package/dist/web/negotiate.d.ts.map +1 -1
  510. package/dist/web/negotiate.js +6 -1
  511. package/dist/web/negotiate.js.map +1 -1
  512. package/dist/web/recent.d.ts +43 -0
  513. package/dist/web/recent.d.ts.map +1 -0
  514. package/dist/web/recent.js +37 -0
  515. package/dist/web/recent.js.map +1 -0
  516. package/dist/web/render.d.ts +197 -9
  517. package/dist/web/render.d.ts.map +1 -1
  518. package/dist/web/render.js +334 -17
  519. package/dist/web/render.js.map +1 -1
  520. package/dist/web/routes.d.ts +25 -8
  521. package/dist/web/routes.d.ts.map +1 -1
  522. package/dist/web/routes.js +845 -93
  523. package/dist/web/routes.js.map +1 -1
  524. package/dist/web/sanitize.d.ts +19 -0
  525. package/dist/web/sanitize.d.ts.map +1 -0
  526. package/dist/web/sanitize.js +272 -0
  527. package/dist/web/sanitize.js.map +1 -0
  528. package/dist/web/search.d.ts +79 -0
  529. package/dist/web/search.d.ts.map +1 -0
  530. package/dist/web/search.js +94 -0
  531. package/dist/web/search.js.map +1 -0
  532. package/dist/web/sitemap.d.ts +120 -0
  533. package/dist/web/sitemap.d.ts.map +1 -0
  534. package/dist/web/sitemap.js +199 -0
  535. package/dist/web/sitemap.js.map +1 -0
  536. package/dist/web/taxonomy.d.ts +152 -0
  537. package/dist/web/taxonomy.d.ts.map +1 -0
  538. package/dist/web/taxonomy.js +237 -0
  539. package/dist/web/taxonomy.js.map +1 -0
  540. package/dist/web/templates.d.ts +54 -16
  541. package/dist/web/templates.d.ts.map +1 -1
  542. package/dist/web/templates.js +109 -28
  543. package/dist/web/templates.js.map +1 -1
  544. package/dist/web/themes.d.ts +205 -0
  545. package/dist/web/themes.d.ts.map +1 -0
  546. package/dist/web/themes.js +277 -0
  547. package/dist/web/themes.js.map +1 -0
  548. package/dist/webmention/discovery.d.ts +51 -0
  549. package/dist/webmention/discovery.d.ts.map +1 -0
  550. package/dist/webmention/discovery.js +176 -0
  551. package/dist/webmention/discovery.js.map +1 -0
  552. package/dist/webmention/html.d.ts +71 -0
  553. package/dist/webmention/html.d.ts.map +1 -0
  554. package/dist/webmention/html.js +285 -0
  555. package/dist/webmention/html.js.map +1 -0
  556. package/dist/webmention/index.d.ts +12 -0
  557. package/dist/webmention/index.d.ts.map +1 -0
  558. package/dist/webmention/index.js +8 -0
  559. package/dist/webmention/index.js.map +1 -0
  560. package/dist/webmention/links.d.ts +18 -0
  561. package/dist/webmention/links.d.ts.map +1 -0
  562. package/dist/webmention/links.js +64 -0
  563. package/dist/webmention/links.js.map +1 -0
  564. package/dist/webmention/microformats.d.ts +93 -0
  565. package/dist/webmention/microformats.d.ts.map +1 -0
  566. package/dist/webmention/microformats.js +376 -0
  567. package/dist/webmention/microformats.js.map +1 -0
  568. package/dist/webmention/receive.d.ts +141 -0
  569. package/dist/webmention/receive.d.ts.map +1 -0
  570. package/dist/webmention/receive.js +264 -0
  571. package/dist/webmention/receive.js.map +1 -0
  572. package/dist/webmention/routes.d.ts +37 -0
  573. package/dist/webmention/routes.d.ts.map +1 -0
  574. package/dist/webmention/routes.js +75 -0
  575. package/dist/webmention/routes.js.map +1 -0
  576. package/dist/webmention/service.d.ts +94 -0
  577. package/dist/webmention/service.d.ts.map +1 -0
  578. package/dist/webmention/service.js +207 -0
  579. package/dist/webmention/service.js.map +1 -0
  580. package/package.json +11 -6
  581. package/templates/site/content/_data/site.json +1 -0
  582. package/templates/site/content/posts/2026-01-01-hello-world.md +5 -3
  583. package/templates/site/geekity.config.ts +11 -1
  584. package/templates/site/tsconfig.json +1 -1
  585. package/themes/default/README.md +1096 -50
  586. package/themes/default/layouts/404.njk +2 -3
  587. package/themes/default/layouts/author.njk +37 -0
  588. package/themes/default/layouts/base.njk +172 -31
  589. package/themes/default/layouts/category.njk +27 -0
  590. package/themes/default/layouts/front-page.njk +57 -0
  591. package/themes/default/layouts/home.njk +17 -1
  592. package/themes/default/layouts/page.njk +57 -5
  593. package/themes/default/layouts/post.njk +78 -19
  594. package/themes/default/layouts/search.njk +57 -0
  595. package/themes/default/layouts/tag.njk +3 -6
  596. package/themes/default/mail/comment-digest.html.njk +37 -0
  597. package/themes/default/mail/comment-digest.subject.njk +3 -0
  598. package/themes/default/mail/comment-digest.txt.njk +40 -0
  599. package/themes/default/mail/comment-pending.html.njk +27 -0
  600. package/themes/default/mail/comment-pending.subject.njk +2 -0
  601. package/themes/default/mail/comment-pending.txt.njk +24 -0
  602. package/themes/default/mail/comment-reply.html.njk +21 -0
  603. package/themes/default/mail/comment-reply.subject.njk +2 -0
  604. package/themes/default/mail/comment-reply.txt.njk +22 -0
  605. package/themes/default/mail/contact-message.html.njk +24 -0
  606. package/themes/default/mail/contact-message.subject.njk +5 -0
  607. package/themes/default/mail/contact-message.txt.njk +20 -0
  608. package/themes/default/mail/password-changed.html.njk +18 -0
  609. package/themes/default/mail/password-changed.subject.njk +2 -0
  610. package/themes/default/mail/password-changed.txt.njk +17 -0
  611. package/themes/default/mail/password-reset.html.njk +22 -0
  612. package/themes/default/mail/password-reset.subject.njk +2 -0
  613. package/themes/default/mail/password-reset.txt.njk +18 -0
  614. package/themes/default/mail/test.html.njk +14 -0
  615. package/themes/default/mail/test.subject.njk +2 -0
  616. package/themes/default/mail/test.txt.njk +12 -0
  617. package/themes/default/partials/archive.njk +27 -0
  618. package/themes/default/partials/bio.njk +77 -0
  619. package/themes/default/partials/comment-form.njk +109 -0
  620. package/themes/default/partials/contact-form.njk +88 -0
  621. package/themes/default/partials/conversation.njk +139 -0
  622. package/themes/default/partials/feeds.njk +26 -0
  623. package/themes/default/partials/jsonld.njk +120 -0
  624. package/themes/default/partials/pagination.njk +12 -6
  625. package/themes/default/partials/post-list.njk +51 -18
  626. package/themes/default/partials/search-form.njk +17 -0
  627. package/themes/default/partials/tags.njk +26 -5
  628. package/themes/default/static/highlight.js +4 -0
  629. package/themes/default/static/style.css +1119 -194
  630. package/themes/default/theme.json +5 -0
  631. package/admin/layouts/document-editor.njk +0 -167
  632. package/admin/layouts/federation.njk +0 -145
  633. package/admin/layouts/login.njk +0 -23
  634. package/admin/layouts/settings.njk +0 -116
  635. package/admin/layouts/setup.njk +0 -27
  636. package/admin/layouts/users.njk +0 -91
  637. /package/admin/{layouts/_flash.njk → components/flash.njk} +0 -0
@@ -1,39 +1,48 @@
1
- import type { Hono } from 'hono';
2
1
  import type { ResolvedConfig } from '../config.ts';
3
- import type { GeekityEnv } from '../env.ts';
4
- import type { SiteData } from '../web/context.ts';
5
- import type { AdminRender } from './documents.ts';
2
+ import type { MailProviderName } from '../mail/provider.ts';
3
+ import type { NavigationItem } from '../web/navigation.ts';
4
+ import type { TaxonomyBases, TaxonomyRedirect } from '../web/taxonomy.ts';
6
5
  import type { AdminStore } from './store.ts';
7
- /** Where the settings screen lives. */
6
+ /**
7
+ * Where the settings live: the General page, and the root every other settings
8
+ * page hangs off ({@link settingsPagePath}).
9
+ */
8
10
  export declare const SETTINGS_PATH = "/admin/settings";
9
- /** Where the avatar's upload form and its Remove button post. */
10
- export declare const AVATAR_PATH = "/admin/settings/avatar";
11
- /** The fields those two forms submit. */
12
- export declare const AVATAR_FIELDS: {
13
- readonly file: 'avatar';
14
- readonly action: 'action';
15
- };
16
- /** The {@link AVATAR_FIELDS.action} that takes the avatar down again. */
17
- export declare const AVATAR_REMOVE = "remove";
18
11
  /**
19
- * The ActivityPub actor types doc-4 allows a site to be.
12
+ * What a language tag may look like: BCP 47's shape rather than its registry —
13
+ * a two or three letter primary subtag followed by dash-separated subtags of
14
+ * letters and digits.
20
15
  *
21
- * `Person` is first because it is the default: some clients hide `Service`
22
- * actors from timelines, which is the wrong thing for a personal blog.
16
+ * Checking the shape and not the registry is deliberate. The value ends up in
17
+ * `<html lang>`, an RSS `<language>` and an Atom `xml:lang`, where a
18
+ * well-formed tag a reader has never heard of is harmless and a malformed one
19
+ * is not; refusing a valid tag because this CMS shipped before it was
20
+ * registered would be worse than accepting one nobody uses.
23
21
  */
24
- export declare const ACTOR_TYPES: readonly string[];
22
+ export declare const LANGUAGE_TAG_PATTERN: RegExp;
25
23
  /**
26
- * What an actor handle may be made of. Tighter than a username: the handle
27
- * becomes the local part of `@handle@host` in WebFinger and in every mention
28
- * somebody types, so it holds no punctuation that would need escaping there.
24
+ * What an email address has to look like before the settings screen will keep
25
+ * it: something, an `@`, and a dotted host.
26
+ *
27
+ * Deliberately loose. The grammar in RFC 5321 allows addresses nobody has ever
28
+ * typed, and the only test that settles whether an address works is sending to
29
+ * it — which is what the Send test email button is for. This catches the
30
+ * typo where a whole field was pasted into the wrong box.
29
31
  */
30
- export declare const ACTOR_HANDLE_PATTERN: RegExp;
32
+ export declare const EMAIL_PATTERN: RegExp;
31
33
  /**
32
- * The settings the admin owns, doc-1's "data that lives only in SQLite".
34
+ * The settings a site holds, as `content/_data/site.json` says them.
35
+ *
36
+ * The file is the source of truth (decision-9): the settings screen reads it,
37
+ * validates the form and writes it back, and nothing else remembers a setting.
38
+ * That is what makes a hand edit of the file — in an editor, from a git
39
+ * checkout, by an Eleventy build's own tooling — show on the very next
40
+ * request, and what makes `data/geekity.db` a cache a site may delete.
33
41
  *
34
- * They are the source of truth once a site has booted once. The public subset
35
- * is mirrored to `content/_data/site.json` on every save so an Eleventy build
36
- * of the same content directory renders with the same values.
42
+ * This shape is the typed view of the file; {@link settingsFromSiteJson} reads
43
+ * it and {@link siteJsonFor} writes it, so the two stay inverses of each
44
+ * other. The file may hold keys this shape does not model — `feedSize`,
45
+ * anything a site put there — and a save keeps every one of them.
37
46
  */
38
47
  export interface SiteSettings {
39
48
  /** Site title, shown in the header, the `<title>` and the feeds. */
@@ -47,32 +56,175 @@ export interface SiteSettings {
47
56
  baseUrl: string;
48
57
  /** An IANA zone name, e.g. `Europe/London`. */
49
58
  timezone: string;
59
+ /**
60
+ * The site's language as a BCP 47 tag, `en` by default. It is the
61
+ * `<html lang>` the theme writes, the RSS channel's `<language>` and the
62
+ * Atom feed's `xml:lang`.
63
+ */
64
+ language: string;
50
65
  /** How many posts a listing page holds. A positive integer. */
51
66
  postsPerPage: number;
67
+ /**
68
+ * The slug of the page served at `/`, or empty when the site shows its
69
+ * latest posts there. WordPress's Reading choice.
70
+ *
71
+ * A slug rather than a permalink, because a permalink is a thing the editor
72
+ * may change and the setting should follow the page rather than the URL it
73
+ * happened to have. A slug naming nothing published — a page drafted,
74
+ * trashed or deleted since — is a site back on its latest posts: the pick is
75
+ * kept so putting the page back puts the front page back with it.
76
+ */
77
+ homepage: string;
78
+ /**
79
+ * The slug of the page whose permalink carries the post listing, or empty
80
+ * for none. Only meaningful beside a {@link SiteSettings.homepage}, and the
81
+ * settings screen refuses one without it, exactly as WordPress does.
82
+ */
83
+ postsPage: string;
52
84
  /** Site author, used as the feed author. May be empty. */
53
85
  author: string;
54
- /** The local part of the ActivityPub handle, `@{handle}@{host}` (doc-4). */
55
- actorHandle: string;
56
- /** Which ActivityPub actor type the site is, one of {@link ACTOR_TYPES}. */
57
- actorType: string;
58
- /**
59
- * The site's avatar, as the public path the upload endpoint handed back —
60
- * `/uploads/2026/09/me.png` — or an absolute URL for one hosted elsewhere.
61
- * Empty when the site has none.
86
+ /**
87
+ * The theme the site renders through: the name of one directory under the
88
+ * configured themes directory, or empty for the theme the package ships
89
+ * (decision-15).
90
+ *
91
+ * A setting rather than a deployment fact, for the reason the tagline is: it
92
+ * is a look somebody chooses on the Appearance screen, and a site moved from
93
+ * one host to another should arrive looking the same. A name that is not a
94
+ * theme is refused here and falls back to the packaged theme out on the
95
+ * site, so a hand-edited file is a warning in the log rather than a 500.
96
+ */
97
+ theme: string;
98
+ /**
99
+ * The first URL segment the tag archives live under, `tag` by default: one
100
+ * URL-safe path segment, no slashes. WordPress's own base, so a site
101
+ * imported from it keeps every archive URL it published.
102
+ */
103
+ tagBase: string;
104
+ /** The same for the category archives, `category` by default. */
105
+ categoryBase: string;
106
+ /**
107
+ * Whether the site takes native comments at all (TASK-50).
108
+ *
109
+ * Off means off everywhere: no form under any post, and every submission
110
+ * refused. It does not touch the fediverse — a reply, a like or a boost
111
+ * arrives because a remote server sent it, and a site cannot stop that or
112
+ * pretend it did not happen.
113
+ */
114
+ comments: boolean;
115
+ /**
116
+ * How many days after its `date` a post stops taking comments. Zero never
117
+ * closes one.
118
+ *
119
+ * The age at which a post stops being a conversation and starts being a spam
120
+ * target; fourteen days is WordPress's own default. A post may say otherwise
121
+ * for itself with `comments: true` or `comments: false` in its front matter.
122
+ */
123
+ commentsCloseAfterDays: number;
124
+ /**
125
+ * Whether the site tells the pages a post links to that it has (TASK-51).
126
+ *
127
+ * On by default, because a link nobody is told about is half a conversation.
128
+ * Off means no webmention is ever sent, including by the Resend button.
129
+ */
130
+ webmentionsSend: boolean;
131
+ /**
132
+ * Whether the site accepts webmentions sent to it (TASK-51).
133
+ *
134
+ * On by default. Off takes the endpoint off every page and answers the
135
+ * endpoint itself with a 404, which is what a site that does not receive
136
+ * them looks like from outside. It does not touch the fediverse, and it does
137
+ * not touch what has already arrived: a webmention already in the queue is
138
+ * still there for a moderator.
139
+ */
140
+ webmentionsReceive: boolean;
141
+ /**
142
+ * Where the site announces that a feed changed, and the server its feeds
143
+ * advertise as their rssCloud endpoint and their WebSub hub. An absolute
144
+ * http(s) URL, {@link DEFAULT_NOTIFY_SERVER} by default; empty turns
145
+ * real-time notification off altogether.
146
+ */
147
+ notifyServer: string;
148
+ /**
149
+ * How the site sends email, or `none` for a site that does not (TASK-53).
150
+ *
151
+ * The name of the provider only. The key or the SMTP password that makes it
152
+ * work is a credential and lives in `data/mail.json`, never here: this file
153
+ * is public, in git and published with the site.
154
+ */
155
+ mailProvider: MailProviderName;
156
+ /** The display name on the From line. Falls back to the site title. */
157
+ mailFromName: string;
158
+ /**
159
+ * The address on the From line. Empty falls back to `no-reply@` at the base
160
+ * URL's host, which is what an unconfigured site would have to send as
161
+ * anyway — but a provider will only accept a sender it has verified, so a
162
+ * site that sends anything real sets this.
163
+ */
164
+ mailFromAddress: string;
165
+ /** Where a reply to the site's mail should go. Empty means the From address. */
166
+ mailReplyTo: string;
167
+ /**
168
+ * Where a message from the contact form is sent (TASK-56).
169
+ *
170
+ * Empty falls back to the first admin with an email, so a site that has
171
+ * never visited this field still has somewhere to write. It is read when a
172
+ * message arrives and is never put on a render context, so it cannot appear
173
+ * in the HTML of the page the form is on however a theme is written.
174
+ */
175
+ contactEmail: string;
176
+ /**
177
+ * The relay inboxes the site subscribes to (FEP-ae0c): a Mastodon-style
178
+ * relay boosts every public post it is sent, which is how a small site
179
+ * reaches instances nobody on it follows.
180
+ *
181
+ * Each is the relay's own inbox URL, absolute and whole — a relay's inbox is
182
+ * a path like `/user/_____relay_____/inbox`, not an origin. The list is
183
+ * edited one per line on the settings screen and held as an array in the
184
+ * file; where each subscription stands is in the database, because the
185
+ * handshake is not the site's to decide.
186
+ */
187
+ relays: readonly string[];
188
+ /**
189
+ * Whether the site also answers the WordPress ActivityPub plugin's inbox and
190
+ * collection paths (TASK-70).
62
191
  *
63
- * It is not a field of the settings form: an image is uploaded and removed
64
- * through {@link AVATAR_PATH}, because a file cannot travel in a urlencoded
65
- * body and because a save of the other fields must not silently drop it.
192
+ * Off, and never written down until somebody turns it on: a site born here
193
+ * has no use for it, and decision-14 calls those paths cache rather than
194
+ * identity. A follower's server delivers to the inbox URL it cached from the
195
+ * actor document and replaces it only when it next refetches the actor, so a
196
+ * site arriving from the plugin keeps receiving at `/wp-json/…` for a while.
197
+ * The CMS carries them until the caches have moved on and no longer, which is
198
+ * why this is a switch a person turns off rather than a permanent fixture.
66
199
  */
67
- avatar: string;
200
+ wordpressActivityPub: boolean;
201
+ /**
202
+ * The site menu: an ordered list of `{ label, url }` the theme renders in
203
+ * the header and an Eleventy build reads out of `site.json`.
204
+ *
205
+ * The list is edited one `Label | URL` per line. A page may put itself on
206
+ * the menu as well, with `navigation: true` in its front matter; those come
207
+ * after these, so the menu a site typed out stays as it was typed.
208
+ */
209
+ navigation: readonly NavigationItem[];
210
+ /**
211
+ * The taxonomy archives that have moved: one `{ taxonomy, from, to }` per
212
+ * term the taxonomy screens renamed or merged away, so the URL it used to
213
+ * live at can point at the one it lives at now.
214
+ *
215
+ * Not a field of the settings form: it is a record of what happened rather
216
+ * than a preference, and the taxonomy screens are what write it. Chains are collapsed as they are
217
+ * recorded, so the list answers every old URL in one hop.
218
+ */
219
+ taxonomyRedirects: readonly TaxonomyRedirect[];
68
220
  }
69
221
  /**
70
222
  * The settings the form on the settings screen carries.
71
223
  *
72
- * Every setting but the avatar, which is a file rather than a field; see
73
- * {@link SiteSettings.avatar}.
224
+ * Every setting but the recorded archive renames, which the taxonomy screens
225
+ * write; see {@link SiteSettings.taxonomyRedirects}.
74
226
  */
75
- export type SettingsField = Exclude<keyof SiteSettings, 'avatar'>;
227
+ export type SettingsField = Exclude<keyof SiteSettings, 'taxonomyRedirects'>;
76
228
  /**
77
229
  * What a site is worth before anybody has said otherwise.
78
230
  *
@@ -86,64 +238,126 @@ export declare const SETTINGS_FIELDS: {
86
238
  readonly tagline: 'tagline';
87
239
  readonly baseUrl: 'base_url';
88
240
  readonly timezone: 'timezone';
241
+ readonly language: 'language';
89
242
  readonly postsPerPage: 'posts_per_page';
243
+ readonly homepage: 'homepage';
244
+ readonly postsPage: 'posts_page';
90
245
  readonly author: 'author';
91
- readonly actorHandle: 'actor_handle';
92
- readonly actorType: 'actor_type';
246
+ readonly theme: 'theme';
247
+ readonly tagBase: 'tag_base';
248
+ readonly categoryBase: 'category_base';
249
+ readonly comments: 'comments';
250
+ readonly commentsCloseAfterDays: 'comments_close_after_days';
251
+ readonly webmentionsSend: 'webmentions_send';
252
+ readonly webmentionsReceive: 'webmentions_receive';
253
+ readonly notifyServer: 'notify_server';
254
+ readonly mailProvider: 'mail_provider';
255
+ readonly mailFromName: 'mail_from_name';
256
+ readonly mailFromAddress: 'mail_from_address';
257
+ readonly mailReplyTo: 'mail_reply_to';
258
+ readonly contactEmail: 'contact_email';
259
+ readonly relays: 'relays';
260
+ readonly wordpressActivityPub: 'wordpress_activitypub';
261
+ readonly navigation: 'navigation';
93
262
  };
94
263
  /** A submitted settings form, before it is known to be valid. */
95
264
  export type SettingsForm = Record<SettingsField, string>;
96
265
  /** One message per field that is wrong. An empty object is a valid form. */
97
266
  export type SettingsProblems = Partial<Record<SettingsField, string>>;
98
- /** The stored settings, with every default filled in. */
99
- export declare function readSiteSettings(store: AdminStore): SiteSettings;
100
- /** Write a whole settings object back to the store. */
101
- export declare function writeSiteSettings(store: AdminStore, settings: SiteSettings): void;
102
267
  /**
103
- * The settings as the `site` global, for the theme and for the JSON mirror.
268
+ * A site's settings, as its `content/_data/site.json` says them right now.
269
+ *
270
+ * Read on every request that needs one rather than cached, which is what a
271
+ * source of truth being a file is worth: a hand edit shows on the public site,
272
+ * on the settings screen and in the actor document without a restart and
273
+ * without anything being told. The file is a few hundred bytes, so the read
274
+ * costs less than the parse of the template that is about to use it.
275
+ *
276
+ * A file that is missing, or one that will not parse, is the defaults rather
277
+ * than an error: a typo in `site.json` should leave a site up and answerable,
278
+ * with the settings screen there to put it right.
279
+ */
280
+ export declare function readSiteSettings(contentDir: string): SiteSettings;
281
+ /**
282
+ * `content/_data/site.json` as the settings it names, defaults filled in.
104
283
  *
105
- * Empty strings are left out rather than written as empty values, so a key a
106
- * site keeps in `site.json` by hand and leaves blank in the form is overlaid
107
- * rather than blanked.
284
+ * Read tolerantly, key by key, because the file is public, in git and editable
285
+ * by hand: a key of the wrong type, or one a site has never written, falls
286
+ * back to the default rather than taking the site down. The empty string is a
287
+ * value of its own for `tagline`, `author` and `notifyServer`, where empty is
288
+ * a decision — no tagline, no author, notifications off — and not for
289
+ * `title`, `timezone`, `language` or the two archive bases, where it is a hole
290
+ * only a default can fill.
108
291
  */
109
- export declare function settingsSiteData(settings: SiteSettings): Partial<SiteData>;
292
+ export declare function settingsFromSiteJson(file: Record<string, unknown>): SiteSettings;
293
+ /** The two archive bases the settings hold, as the URL builders want them. */
294
+ export declare function taxonomyBasesFromSettings(settings: SiteSettings): TaxonomyBases;
110
295
  /**
111
296
  * `content/_data/site.json` as it should read for these settings.
112
297
  *
113
- * Every key the form manages is written whether or not it has a value, so the
114
- * file's shape is stable and an Eleventy template may reference `site.author`
115
- * without guarding it. Every other key the file already had is kept: a site
116
- * may put anything in there and reach it from its templates, and the settings
117
- * form is not going to be the thing that throws it away.
298
+ * Every key the settings model is written whether or not it has a value, so
299
+ * the file's shape is stable and an Eleventy template may reference
300
+ * `site.author` without guarding it. Every other key the file already had is
301
+ * kept: a site may put anything in there and reach it from its templates, and
302
+ * the settings form is not going to be the thing that throws it away.
303
+ *
304
+ * `homepage` and `postsPage` are the one exception, and they earn it: a site
305
+ * showing its latest posts has no static front page at all rather than an
306
+ * empty one, so the keys are absent rather than empty — which is also how a
307
+ * `site.json` written before this version reads, and what it should mean.
118
308
  */
119
309
  export declare function siteJsonFor(settings: SiteSettings, existing?: Record<string, unknown>): Record<string, unknown>;
120
310
  /** The absolute path of one site's `content/_data/site.json`. */
121
311
  export declare function siteDataPath(contentDir: string): string;
122
312
  /**
123
- * Rewrite `content/_data/site.json` from the settings.
313
+ * Rewrite `content/_data/site.json` as these settings, keeping the keys they
314
+ * do not model.
124
315
  *
125
- * Written to a temporary file in the same directory and renamed over the old
126
- * one, so a reader — an Eleventy build, or the CMS's own site data source —
127
- * sees either the whole old file or the whole new one and never a half-written
128
- * one.
316
+ * {@link updateSiteSettings} for a caller whose new settings depend on the old
317
+ * ones, which every screen's is: this is for the callers that have the whole
318
+ * object already, a test's set-up among them.
129
319
  */
130
320
  export declare function writeSiteJson(options: {
131
321
  contentDir: string;
132
322
  settings: SiteSettings;
133
323
  }): Promise<void>;
134
324
  /**
135
- * Fill an empty settings table from `content/_data/site.json`, so a site that
136
- * existed before this screen did — or one `geekity init` just wrote — keeps
137
- * the values it already had.
325
+ * Change the settings: re-read the file, apply the change, write it back, with
326
+ * nothing able to write that file in between ({@link updateFileAtomically}).
138
327
  *
139
- * Runs once, on the boot that finds the table empty. After that SQLite is the
140
- * source and the file is the mirror, so a later hand edit of the file no
141
- * longer wins.
328
+ * The re-read is what makes the file win the way it wins for a post
329
+ * (decision-9). Two people with the settings screen open both save what they
330
+ * see, and the second save is applied to what the first one actually wrote
331
+ * rather than to what the second one had on screen — so a change to a field
332
+ * the second person did not touch survives. The write is a temporary file and
333
+ * a rename, so a reader — an Eleventy build, the site data source, another
334
+ * process entirely — never sees a half-written file. Keys the settings do not
335
+ * model, `feedSize` and anything a site added, are kept.
142
336
  */
143
- export declare function seedSiteSettings(options: {
144
- store: AdminStore;
145
- config: Pick<ResolvedConfig, 'contentDir' | 'baseUrl' | 'baseUrlSource'>;
146
- }): SiteSettings;
337
+ export declare function updateSiteSettings(options: {
338
+ contentDir: string;
339
+ change: (current: SiteSettings) => SiteSettings;
340
+ }): Promise<SiteSettings>;
341
+ /**
342
+ * Turn an older site's settings rows into `content/_data/site.json`, once, and
343
+ * drop the table.
344
+ *
345
+ * TASK-14 made SQLite the source and the file its mirror; decision-9 reversed
346
+ * that, and a site upgrading across the two has rows nothing would ever read
347
+ * again. So the first boot of this version writes them out. Which side wins
348
+ * when both have something to say is decided the way it is decided everywhere
349
+ * else: the file wins when it was written after the last save, because that is
350
+ * a hand edit or a restored checkout, and the rows win otherwise. Either way
351
+ * the actor handle and type come from the rows, because `site.json` never
352
+ * carried them and losing them would rename the site's actor.
353
+ *
354
+ * Synchronous because `createCms` is: it runs before the server is listening
355
+ * and before anything else has touched the file.
356
+ */
357
+ export declare function migrateSettingsToFile(options: {
358
+ admin: AdminStore;
359
+ contentDir: string;
360
+ }): void;
147
361
  /**
148
362
  * The base URL actually in effect, and why.
149
363
  *
@@ -154,41 +368,56 @@ export declare function seedSiteSettings(options: {
154
368
  * offering a field that would quietly do nothing.
155
369
  */
156
370
  export declare function effectiveBaseUrl(config: Pick<ResolvedConfig, 'baseUrl' | 'baseUrlSource'>, settings: SiteSettings): string;
157
- /** What is wrong with a submitted settings form, one message per field. */
158
- export declare function settingsProblems(form: SettingsForm): SettingsProblems;
371
+ /**
372
+ * What a check may need to know beyond the form itself.
373
+ *
374
+ * One field has anything here, and it is the theme: whether a name is a theme
375
+ * is a question about the file system rather than about the string, and only
376
+ * the config knows where this site's themes are. A check given no context does
377
+ * what it can — the theme's is still a name it can refuse — so a caller with
378
+ * no config in hand is not blocked.
379
+ */
380
+ export interface SettingsContext {
381
+ /** Where the site's themes are: {@link ResolvedConfig.themesDir}. */
382
+ themesDir?: string | undefined;
383
+ }
384
+ /** Every field of the settings, in the order the form fields name them. */
385
+ export declare const SETTINGS_FIELD_NAMES: readonly SettingsField[];
386
+ /**
387
+ * What is wrong with a submitted settings form, one message per field.
388
+ *
389
+ * `fields` is what a page carries: it validates its own fields and says
390
+ * nothing about the rest, so a page cannot refuse a save over a field it does
391
+ * not show and gives no way to fix. `context` is what a check needs beyond the
392
+ * form; see {@link SettingsContext}.
393
+ */
394
+ export declare function settingsProblems(form: SettingsForm, fields?: readonly SettingsField[], context?: SettingsContext): SettingsProblems;
159
395
  /**
160
396
  * A validated form as settings. Only call it on a form
161
397
  * {@link settingsProblems} found nothing wrong with.
162
398
  *
163
- * The avatar is carried in rather than read off the form, because it is not on
164
- * it: the image is uploaded and removed through {@link AVATAR_PATH}, and a
165
- * save of the other fields keeps whatever is stored.
399
+ * The recorded archive renames are carried in rather than read off the form,
400
+ * because they are not on it: the taxonomy screens write them, and a save of
401
+ * the other fields keeps whatever is stored.
166
402
  */
167
- export declare function settingsFromForm(form: SettingsForm, avatar?: string): SiteSettings;
403
+ export declare function settingsFromForm(form: SettingsForm, taxonomyRedirects?: readonly TaxonomyRedirect[]): SiteSettings;
168
404
  /** The settings as the form shows them. */
169
405
  export declare function formFromSettings(settings: SiteSettings): SettingsForm;
170
- /** What {@link mountSettings} needs from the admin around it. */
171
- export interface MountSettingsOptions {
172
- /** The admin's renderer, which injects the chrome, the CSRF token and the flash. */
173
- render: AdminRender;
174
- }
175
406
  /**
176
- * Register the settings screen.
407
+ * A relay textarea as the list of inboxes it names: normalised, in the order
408
+ * they were given, with repeats dropped.
177
409
  *
178
- * A save writes SQLite and `content/_data/site.json` in that order, so the
179
- * store — which is what the theme reads — is never behind the file. A form the
180
- * validator has anything to say about is a 400 that writes neither.
410
+ * Exported because the same parsing turns a stored setting, a submitted form
411
+ * and a `site.json` array into the one list; a second spelling of it would let
412
+ * the file and the database disagree about what a site subscribes to.
181
413
  */
182
- export declare function mountSettings(app: Hono<GeekityEnv>, options: MountSettingsOptions): void;
414
+ export declare function relayList(value: string): string[];
183
415
  /**
184
- * Whether a save moved something the ActivityPub actor carries, which is what
185
- * decides whether the followers are told (doc-4: the profile fields come from
186
- * the settings). The rest — the time zone, the page size — is the site's own
187
- * business and nobody else's.
416
+ * A relay inbox URL, or `undefined` when it is not an absolute http(s) one.
188
417
  *
189
- * The base URL is not here either, though the profile is built on it: it is
190
- * settled at boot ({@link effectiveBaseUrl}), so an actor built the moment it
191
- * is saved would carry the old one and say nothing new.
418
+ * Unlike {@link normalizeBaseUrl} this keeps the whole URL bar a trailing
419
+ * slash: a relay inbox is a path — `/user/_____relay_____/inbox` — rather than
420
+ * an origin, and some relays hang one off a query string.
192
421
  */
193
- export declare function profileChanged(before: SiteSettings, after: SiteSettings): boolean;
422
+ export declare function normalizeRelayInbox(value: string): string | undefined;
194
423
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/admin/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/admin/settings.ts"],"names":[],"mappings":"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"}