@geekity/cms 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/README.md +2217 -214
  2. package/admin/components/fields.njk +165 -0
  3. package/admin/layouts/base.njk +1 -1
  4. package/admin/layouts/settings-page.njk +26 -0
  5. package/admin/layouts/shell.njk +17 -3
  6. package/admin/pages/account/forgot.njk +47 -0
  7. package/admin/pages/account/login.njk +26 -0
  8. package/admin/pages/account/reset.njk +38 -0
  9. package/admin/pages/account/setup.njk +28 -0
  10. package/admin/pages/appearance/themes.njk +69 -0
  11. package/admin/pages/comments/all.njk +133 -0
  12. package/admin/{layouts/dashboard.njk → pages/dashboard/home.njk} +8 -15
  13. package/admin/{layouts/document-conflict.njk → pages/documents/conflict.njk} +1 -0
  14. package/admin/{layouts/document-editor.njk → pages/documents/editor.njk} +75 -59
  15. package/admin/{layouts/document-list.njk → pages/documents/list.njk} +19 -2
  16. package/admin/pages/documents/taxonomy.njk +95 -0
  17. package/admin/pages/federation/followers.njk +238 -0
  18. package/admin/pages/federation/settings.njk +77 -0
  19. package/admin/pages/media/library.njk +160 -0
  20. package/admin/pages/messages/all.njk +110 -0
  21. package/admin/pages/navigation/menus.njk +129 -0
  22. package/admin/{layouts → pages}/placeholder.njk +5 -1
  23. package/admin/pages/settings/discussion.njk +99 -0
  24. package/admin/pages/settings/email.njk +203 -0
  25. package/admin/pages/settings/general.njk +29 -0
  26. package/admin/pages/settings/permalinks.njk +50 -0
  27. package/admin/pages/settings/reading.njk +64 -0
  28. package/admin/pages/tools/content-index.njk +89 -0
  29. package/admin/pages/users/edit.njk +239 -0
  30. package/admin/pages/users/list.njk +51 -0
  31. package/admin/pages/users/new.njk +41 -0
  32. package/admin/static/admin.css +558 -3
  33. package/admin/static/copy.js +52 -0
  34. package/admin/static/editor.js +16 -16
  35. package/admin/static/slug.js +61 -0
  36. package/dist/access-log.d.ts +44 -0
  37. package/dist/access-log.d.ts.map +1 -0
  38. package/dist/access-log.js +71 -0
  39. package/dist/access-log.js.map +1 -0
  40. package/dist/admin/accounts.d.ts +413 -0
  41. package/dist/admin/accounts.d.ts.map +1 -0
  42. package/dist/admin/accounts.js +680 -0
  43. package/dist/admin/accounts.js.map +1 -0
  44. package/dist/admin/appearance.d.ts +80 -0
  45. package/dist/admin/appearance.d.ts.map +1 -0
  46. package/dist/admin/appearance.js +136 -0
  47. package/dist/admin/appearance.js.map +1 -0
  48. package/dist/admin/comments.d.ts +90 -0
  49. package/dist/admin/comments.d.ts.map +1 -0
  50. package/dist/admin/comments.js +244 -0
  51. package/dist/admin/comments.js.map +1 -0
  52. package/dist/admin/credentials.d.ts +26 -2
  53. package/dist/admin/credentials.d.ts.map +1 -1
  54. package/dist/admin/credentials.js +35 -2
  55. package/dist/admin/credentials.js.map +1 -1
  56. package/dist/admin/documents.d.ts +117 -10
  57. package/dist/admin/documents.d.ts.map +1 -1
  58. package/dist/admin/documents.js +328 -41
  59. package/dist/admin/documents.js.map +1 -1
  60. package/dist/admin/federation.d.ts +161 -50
  61. package/dist/admin/federation.d.ts.map +1 -1
  62. package/dist/admin/federation.js +235 -93
  63. package/dist/admin/federation.js.map +1 -1
  64. package/dist/admin/formatting.d.ts +20 -0
  65. package/dist/admin/formatting.d.ts.map +1 -0
  66. package/dist/admin/formatting.js +72 -0
  67. package/dist/admin/formatting.js.map +1 -0
  68. package/dist/admin/headers.d.ts +65 -0
  69. package/dist/admin/headers.d.ts.map +1 -0
  70. package/dist/admin/headers.js +104 -0
  71. package/dist/admin/headers.js.map +1 -0
  72. package/dist/admin/index.d.ts +38 -12
  73. package/dist/admin/index.d.ts.map +1 -1
  74. package/dist/admin/index.js +25 -7
  75. package/dist/admin/index.js.map +1 -1
  76. package/dist/admin/media.d.ts +168 -0
  77. package/dist/admin/media.d.ts.map +1 -0
  78. package/dist/admin/media.js +295 -0
  79. package/dist/admin/media.js.map +1 -0
  80. package/dist/admin/menu.d.ts +79 -0
  81. package/dist/admin/menu.d.ts.map +1 -0
  82. package/dist/admin/menu.js +143 -0
  83. package/dist/admin/menu.js.map +1 -0
  84. package/dist/admin/messages.d.ts +80 -0
  85. package/dist/admin/messages.d.ts.map +1 -0
  86. package/dist/admin/messages.js +152 -0
  87. package/dist/admin/messages.js.map +1 -0
  88. package/dist/admin/navigation.d.ts +155 -0
  89. package/dist/admin/navigation.d.ts.map +1 -0
  90. package/dist/admin/navigation.js +292 -0
  91. package/dist/admin/navigation.js.map +1 -0
  92. package/dist/admin/preview.d.ts.map +1 -1
  93. package/dist/admin/preview.js +31 -7
  94. package/dist/admin/preview.js.map +1 -1
  95. package/dist/admin/recovery.d.ts +92 -0
  96. package/dist/admin/recovery.d.ts.map +1 -0
  97. package/dist/admin/recovery.js +229 -0
  98. package/dist/admin/recovery.js.map +1 -0
  99. package/dist/admin/routes.d.ts +0 -20
  100. package/dist/admin/routes.d.ts.map +1 -1
  101. package/dist/admin/routes.js +164 -105
  102. package/dist/admin/routes.js.map +1 -1
  103. package/dist/admin/session.d.ts +17 -3
  104. package/dist/admin/session.d.ts.map +1 -1
  105. package/dist/admin/session.js +19 -5
  106. package/dist/admin/session.js.map +1 -1
  107. package/dist/admin/settings-discussion.d.ts +37 -0
  108. package/dist/admin/settings-discussion.d.ts.map +1 -0
  109. package/dist/admin/settings-discussion.js +117 -0
  110. package/dist/admin/settings-discussion.js.map +1 -0
  111. package/dist/admin/settings-email.d.ts +54 -0
  112. package/dist/admin/settings-email.d.ts.map +1 -0
  113. package/dist/admin/settings-email.js +189 -0
  114. package/dist/admin/settings-email.js.map +1 -0
  115. package/dist/admin/settings-federation.d.ts +48 -0
  116. package/dist/admin/settings-federation.d.ts.map +1 -0
  117. package/dist/admin/settings-federation.js +123 -0
  118. package/dist/admin/settings-federation.js.map +1 -0
  119. package/dist/admin/settings-general.d.ts +12 -0
  120. package/dist/admin/settings-general.d.ts.map +1 -0
  121. package/dist/admin/settings-general.js +48 -0
  122. package/dist/admin/settings-general.js.map +1 -0
  123. package/dist/admin/settings-page.d.ts +119 -0
  124. package/dist/admin/settings-page.d.ts.map +1 -0
  125. package/dist/admin/settings-page.js +132 -0
  126. package/dist/admin/settings-page.js.map +1 -0
  127. package/dist/admin/settings-pages.d.ts +30 -0
  128. package/dist/admin/settings-pages.d.ts.map +1 -0
  129. package/dist/admin/settings-pages.js +43 -0
  130. package/dist/admin/settings-pages.js.map +1 -0
  131. package/dist/admin/settings-permalinks.d.ts +16 -0
  132. package/dist/admin/settings-permalinks.d.ts.map +1 -0
  133. package/dist/admin/settings-permalinks.js +32 -0
  134. package/dist/admin/settings-permalinks.js.map +1 -0
  135. package/dist/admin/settings-reading.d.ts +34 -0
  136. package/dist/admin/settings-reading.d.ts.map +1 -0
  137. package/dist/admin/settings-reading.js +49 -0
  138. package/dist/admin/settings-reading.js.map +1 -0
  139. package/dist/admin/settings.d.ts +339 -96
  140. package/dist/admin/settings.d.ts.map +1 -1
  141. package/dist/admin/settings.js +600 -308
  142. package/dist/admin/settings.js.map +1 -1
  143. package/dist/admin/store.d.ts +606 -152
  144. package/dist/admin/store.d.ts.map +1 -1
  145. package/dist/admin/store.js +863 -268
  146. package/dist/admin/store.js.map +1 -1
  147. package/dist/admin/taxonomy.d.ts +114 -0
  148. package/dist/admin/taxonomy.d.ts.map +1 -0
  149. package/dist/admin/taxonomy.js +289 -0
  150. package/dist/admin/taxonomy.js.map +1 -0
  151. package/dist/admin/templates.d.ts +46 -14
  152. package/dist/admin/templates.d.ts.map +1 -1
  153. package/dist/admin/templates.js +46 -14
  154. package/dist/admin/templates.js.map +1 -1
  155. package/dist/admin/throttle.d.ts +84 -0
  156. package/dist/admin/throttle.d.ts.map +1 -0
  157. package/dist/admin/throttle.js +143 -0
  158. package/dist/admin/throttle.js.map +1 -0
  159. package/dist/admin/tools.d.ts +111 -0
  160. package/dist/admin/tools.d.ts.map +1 -0
  161. package/dist/admin/tools.js +182 -0
  162. package/dist/admin/tools.js.map +1 -0
  163. package/dist/admin/uploads.d.ts +28 -2
  164. package/dist/admin/uploads.d.ts.map +1 -1
  165. package/dist/admin/uploads.js +43 -4
  166. package/dist/admin/uploads.js.map +1 -1
  167. package/dist/admin/users.d.ts +100 -13
  168. package/dist/admin/users.d.ts.map +1 -1
  169. package/dist/admin/users.js +412 -39
  170. package/dist/admin/users.js.map +1 -1
  171. package/dist/cache.d.ts +141 -0
  172. package/dist/cache.d.ts.map +1 -0
  173. package/dist/cache.js +207 -0
  174. package/dist/cache.js.map +1 -0
  175. package/dist/cli.d.ts +14 -2
  176. package/dist/cli.d.ts.map +1 -1
  177. package/dist/cli.js +429 -21
  178. package/dist/cli.js.map +1 -1
  179. package/dist/comments/akismet.d.ts +130 -0
  180. package/dist/comments/akismet.d.ts.map +1 -0
  181. package/dist/comments/akismet.js +274 -0
  182. package/dist/comments/akismet.js.map +1 -0
  183. package/dist/comments/conversation.d.ts +29 -0
  184. package/dist/comments/conversation.d.ts.map +1 -0
  185. package/dist/comments/conversation.js +60 -0
  186. package/dist/comments/conversation.js.map +1 -0
  187. package/dist/comments/form.d.ts +123 -0
  188. package/dist/comments/form.d.ts.map +1 -0
  189. package/dist/comments/form.js +79 -0
  190. package/dist/comments/form.js.map +1 -0
  191. package/dist/comments/index.d.ts +16 -0
  192. package/dist/comments/index.d.ts.map +1 -0
  193. package/dist/comments/index.js +10 -0
  194. package/dist/comments/index.js.map +1 -0
  195. package/dist/comments/markdown.d.ts +8 -0
  196. package/dist/comments/markdown.d.ts.map +1 -0
  197. package/dist/comments/markdown.js +85 -0
  198. package/dist/comments/markdown.js.map +1 -0
  199. package/dist/comments/moderate.d.ts +71 -0
  200. package/dist/comments/moderate.d.ts.map +1 -0
  201. package/dist/comments/moderate.js +88 -0
  202. package/dist/comments/moderate.js.map +1 -0
  203. package/dist/comments/policy.d.ts +57 -0
  204. package/dist/comments/policy.d.ts.map +1 -0
  205. package/dist/comments/policy.js +80 -0
  206. package/dist/comments/policy.js.map +1 -0
  207. package/dist/comments/records.d.ts +266 -0
  208. package/dist/comments/records.d.ts.map +1 -0
  209. package/dist/comments/records.js +487 -0
  210. package/dist/comments/records.js.map +1 -0
  211. package/dist/comments/routes.d.ts +60 -0
  212. package/dist/comments/routes.d.ts.map +1 -0
  213. package/dist/comments/routes.js +212 -0
  214. package/dist/comments/routes.js.map +1 -0
  215. package/dist/comments/submission.d.ts +297 -0
  216. package/dist/comments/submission.d.ts.map +1 -0
  217. package/dist/comments/submission.js +280 -0
  218. package/dist/comments/submission.js.map +1 -0
  219. package/dist/comments/viewer.d.ts +21 -0
  220. package/dist/comments/viewer.d.ts.map +1 -0
  221. package/dist/comments/viewer.js +45 -0
  222. package/dist/comments/viewer.js.map +1 -0
  223. package/dist/config.d.ts +225 -5
  224. package/dist/config.d.ts.map +1 -1
  225. package/dist/config.js +121 -6
  226. package/dist/config.js.map +1 -1
  227. package/dist/contact/delivery.d.ts +60 -0
  228. package/dist/contact/delivery.d.ts.map +1 -0
  229. package/dist/contact/delivery.js +87 -0
  230. package/dist/contact/delivery.js.map +1 -0
  231. package/dist/contact/form.d.ts +130 -0
  232. package/dist/contact/form.d.ts.map +1 -0
  233. package/dist/contact/form.js +163 -0
  234. package/dist/contact/form.js.map +1 -0
  235. package/dist/contact/index.d.ts +17 -0
  236. package/dist/contact/index.d.ts.map +1 -0
  237. package/dist/contact/index.js +13 -0
  238. package/dist/contact/index.js.map +1 -0
  239. package/dist/contact/records.d.ts +124 -0
  240. package/dist/contact/records.d.ts.map +1 -0
  241. package/dist/contact/records.js +218 -0
  242. package/dist/contact/records.js.map +1 -0
  243. package/dist/contact/routes.d.ts +17 -0
  244. package/dist/contact/routes.d.ts.map +1 -0
  245. package/dist/contact/routes.js +127 -0
  246. package/dist/contact/routes.js.map +1 -0
  247. package/dist/contact/submission.d.ts +103 -0
  248. package/dist/contact/submission.d.ts.map +1 -0
  249. package/dist/contact/submission.js +166 -0
  250. package/dist/contact/submission.js.map +1 -0
  251. package/dist/content/document.d.ts +7 -2
  252. package/dist/content/document.d.ts.map +1 -1
  253. package/dist/content/document.js +1 -0
  254. package/dist/content/document.js.map +1 -1
  255. package/dist/content/index.d.ts +7 -2
  256. package/dist/content/index.d.ts.map +1 -1
  257. package/dist/content/index.js +4 -1
  258. package/dist/content/index.js.map +1 -1
  259. package/dist/content/markdown.d.ts.map +1 -1
  260. package/dist/content/markdown.js +24 -2
  261. package/dist/content/markdown.js.map +1 -1
  262. package/dist/content/parser.d.ts.map +1 -1
  263. package/dist/content/parser.js +11 -4
  264. package/dist/content/parser.js.map +1 -1
  265. package/dist/content/save.d.ts +5 -0
  266. package/dist/content/save.d.ts.map +1 -1
  267. package/dist/content/save.js +44 -1
  268. package/dist/content/save.js.map +1 -1
  269. package/dist/content/schedule.d.ts +125 -0
  270. package/dist/content/schedule.d.ts.map +1 -0
  271. package/dist/content/schedule.js +207 -0
  272. package/dist/content/schedule.js.map +1 -0
  273. package/dist/content/search.d.ts +64 -0
  274. package/dist/content/search.d.ts.map +1 -0
  275. package/dist/content/search.js +136 -0
  276. package/dist/content/search.js.map +1 -0
  277. package/dist/content/store.d.ts +220 -7
  278. package/dist/content/store.d.ts.map +1 -1
  279. package/dist/content/store.js +392 -67
  280. package/dist/content/store.js.map +1 -1
  281. package/dist/content/sync.d.ts +7 -1
  282. package/dist/content/sync.d.ts.map +1 -1
  283. package/dist/content/sync.js +18 -10
  284. package/dist/content/sync.js.map +1 -1
  285. package/dist/content/time.d.ts +56 -0
  286. package/dist/content/time.d.ts.map +1 -0
  287. package/dist/content/time.js +141 -0
  288. package/dist/content/time.js.map +1 -0
  289. package/dist/content/writer.d.ts.map +1 -1
  290. package/dist/content/writer.js +3 -0
  291. package/dist/content/writer.js.map +1 -1
  292. package/dist/env.d.ts +70 -5
  293. package/dist/env.d.ts.map +1 -1
  294. package/dist/federation/actor.d.ts +95 -41
  295. package/dist/federation/actor.d.ts.map +1 -1
  296. package/dist/federation/actor.js +180 -53
  297. package/dist/federation/actor.js.map +1 -1
  298. package/dist/federation/article.d.ts +44 -17
  299. package/dist/federation/article.d.ts.map +1 -1
  300. package/dist/federation/article.js +98 -46
  301. package/dist/federation/article.js.map +1 -1
  302. package/dist/federation/delivery.d.ts +63 -15
  303. package/dist/federation/delivery.d.ts.map +1 -1
  304. package/dist/federation/delivery.js +154 -80
  305. package/dist/federation/delivery.js.map +1 -1
  306. package/dist/federation/federation.d.ts +22 -17
  307. package/dist/federation/federation.d.ts.map +1 -1
  308. package/dist/federation/federation.js +98 -77
  309. package/dist/federation/federation.js.map +1 -1
  310. package/dist/federation/followers.d.ts +3 -2
  311. package/dist/federation/followers.d.ts.map +1 -1
  312. package/dist/federation/followers.js +6 -5
  313. package/dist/federation/followers.js.map +1 -1
  314. package/dist/federation/import-wordpress.d.ts +128 -0
  315. package/dist/federation/import-wordpress.d.ts.map +1 -0
  316. package/dist/federation/import-wordpress.js +426 -0
  317. package/dist/federation/import-wordpress.js.map +1 -0
  318. package/dist/federation/inbox.d.ts +36 -13
  319. package/dist/federation/inbox.d.ts.map +1 -1
  320. package/dist/federation/inbox.js +120 -49
  321. package/dist/federation/inbox.js.map +1 -1
  322. package/dist/federation/index.d.ts +22 -10
  323. package/dist/federation/index.d.ts.map +1 -1
  324. package/dist/federation/index.js +13 -8
  325. package/dist/federation/index.js.map +1 -1
  326. package/dist/federation/keys.d.ts +98 -20
  327. package/dist/federation/keys.d.ts.map +1 -1
  328. package/dist/federation/keys.js +269 -39
  329. package/dist/federation/keys.js.map +1 -1
  330. package/dist/federation/mount.d.ts +46 -10
  331. package/dist/federation/mount.d.ts.map +1 -1
  332. package/dist/federation/mount.js +300 -28
  333. package/dist/federation/mount.js.map +1 -1
  334. package/dist/federation/paths.d.ts +23 -35
  335. package/dist/federation/paths.d.ts.map +1 -1
  336. package/dist/federation/paths.js +26 -39
  337. package/dist/federation/paths.js.map +1 -1
  338. package/dist/federation/records.d.ts +223 -0
  339. package/dist/federation/records.d.ts.map +1 -0
  340. package/dist/federation/records.js +506 -0
  341. package/dist/federation/records.js.map +1 -0
  342. package/dist/federation/relays.d.ts +114 -0
  343. package/dist/federation/relays.d.ts.map +1 -0
  344. package/dist/federation/relays.js +290 -0
  345. package/dist/federation/relays.js.map +1 -0
  346. package/dist/federation/replies.d.ts +80 -0
  347. package/dist/federation/replies.d.ts.map +1 -0
  348. package/dist/federation/replies.js +166 -0
  349. package/dist/federation/replies.js.map +1 -0
  350. package/dist/federation/wordpress.d.ts +131 -0
  351. package/dist/federation/wordpress.d.ts.map +1 -0
  352. package/dist/federation/wordpress.js +341 -0
  353. package/dist/federation/wordpress.js.map +1 -0
  354. package/dist/files/atomic.d.ts +103 -0
  355. package/dist/files/atomic.d.ts.map +1 -0
  356. package/dist/files/atomic.js +150 -0
  357. package/dist/files/atomic.js.map +1 -0
  358. package/dist/files/index.d.ts +3 -0
  359. package/dist/files/index.d.ts.map +1 -0
  360. package/dist/files/index.js +2 -0
  361. package/dist/files/index.js.map +1 -0
  362. package/dist/forms/protection.d.ts +85 -0
  363. package/dist/forms/protection.d.ts.map +1 -0
  364. package/dist/forms/protection.js +116 -0
  365. package/dist/forms/protection.js.map +1 -0
  366. package/dist/images/icons.d.ts +59 -0
  367. package/dist/images/icons.d.ts.map +1 -0
  368. package/dist/images/icons.js +131 -0
  369. package/dist/images/icons.js.map +1 -0
  370. package/dist/images/index.d.ts +7 -0
  371. package/dist/images/index.d.ts.map +1 -0
  372. package/dist/images/index.js +4 -0
  373. package/dist/images/index.js.map +1 -0
  374. package/dist/images/markup.d.ts +47 -0
  375. package/dist/images/markup.d.ts.map +1 -0
  376. package/dist/images/markup.js +175 -0
  377. package/dist/images/markup.js.map +1 -0
  378. package/dist/images/paths.d.ts +34 -0
  379. package/dist/images/paths.d.ts.map +1 -0
  380. package/dist/images/paths.js +41 -0
  381. package/dist/images/paths.js.map +1 -0
  382. package/dist/images/variants.d.ts +104 -0
  383. package/dist/images/variants.d.ts.map +1 -0
  384. package/dist/images/variants.js +320 -0
  385. package/dist/images/variants.js.map +1 -0
  386. package/dist/index.d.ts +123 -19
  387. package/dist/index.d.ts.map +1 -1
  388. package/dist/index.js +344 -25
  389. package/dist/index.js.map +1 -1
  390. package/dist/init.d.ts +18 -0
  391. package/dist/init.d.ts.map +1 -1
  392. package/dist/init.js +34 -3
  393. package/dist/init.js.map +1 -1
  394. package/dist/mail/brevo.d.ts +35 -0
  395. package/dist/mail/brevo.d.ts.map +1 -0
  396. package/dist/mail/brevo.js +85 -0
  397. package/dist/mail/brevo.js.map +1 -0
  398. package/dist/mail/credentials.d.ts +62 -0
  399. package/dist/mail/credentials.d.ts.map +1 -0
  400. package/dist/mail/credentials.js +86 -0
  401. package/dist/mail/credentials.js.map +1 -0
  402. package/dist/mail/index.d.ts +15 -0
  403. package/dist/mail/index.d.ts.map +1 -0
  404. package/dist/mail/index.js +8 -0
  405. package/dist/mail/index.js.map +1 -0
  406. package/dist/mail/memory.d.ts +35 -0
  407. package/dist/mail/memory.d.ts.map +1 -0
  408. package/dist/mail/memory.js +29 -0
  409. package/dist/mail/memory.js.map +1 -0
  410. package/dist/mail/provider.d.ts +80 -0
  411. package/dist/mail/provider.d.ts.map +1 -0
  412. package/dist/mail/provider.js +23 -0
  413. package/dist/mail/provider.js.map +1 -0
  414. package/dist/mail/service.d.ts +156 -0
  415. package/dist/mail/service.d.ts.map +1 -0
  416. package/dist/mail/service.js +265 -0
  417. package/dist/mail/service.js.map +1 -0
  418. package/dist/mail/smtp.d.ts +39 -0
  419. package/dist/mail/smtp.d.ts.map +1 -0
  420. package/dist/mail/smtp.js +58 -0
  421. package/dist/mail/smtp.js.map +1 -0
  422. package/dist/mail/templates.d.ts +91 -0
  423. package/dist/mail/templates.d.ts.map +1 -0
  424. package/dist/mail/templates.js +69 -0
  425. package/dist/mail/templates.js.map +1 -0
  426. package/dist/notifications/comments.d.ts +66 -0
  427. package/dist/notifications/comments.d.ts.map +1 -0
  428. package/dist/notifications/comments.js +151 -0
  429. package/dist/notifications/comments.js.map +1 -0
  430. package/dist/notifications/digest.d.ts +135 -0
  431. package/dist/notifications/digest.d.ts.map +1 -0
  432. package/dist/notifications/digest.js +287 -0
  433. package/dist/notifications/digest.js.map +1 -0
  434. package/dist/notifications/index.d.ts +13 -0
  435. package/dist/notifications/index.d.ts.map +1 -0
  436. package/dist/notifications/index.js +8 -0
  437. package/dist/notifications/index.js.map +1 -0
  438. package/dist/notifications/links.d.ts +60 -0
  439. package/dist/notifications/links.d.ts.map +1 -0
  440. package/dist/notifications/links.js +63 -0
  441. package/dist/notifications/links.js.map +1 -0
  442. package/dist/notifications/optouts.d.ts +48 -0
  443. package/dist/notifications/optouts.d.ts.map +1 -0
  444. package/dist/notifications/optouts.js +93 -0
  445. package/dist/notifications/optouts.js.map +1 -0
  446. package/dist/notifications/preferences.d.ts +158 -0
  447. package/dist/notifications/preferences.d.ts.map +1 -0
  448. package/dist/notifications/preferences.js +195 -0
  449. package/dist/notifications/preferences.js.map +1 -0
  450. package/dist/notifications/routes.d.ts +28 -0
  451. package/dist/notifications/routes.d.ts.map +1 -0
  452. package/dist/notifications/routes.js +184 -0
  453. package/dist/notifications/routes.js.map +1 -0
  454. package/dist/notifications/tokens.d.ts +60 -0
  455. package/dist/notifications/tokens.d.ts.map +1 -0
  456. package/dist/notifications/tokens.js +125 -0
  457. package/dist/notifications/tokens.js.map +1 -0
  458. package/dist/notify.d.ts +84 -0
  459. package/dist/notify.d.ts.map +1 -0
  460. package/dist/notify.js +149 -0
  461. package/dist/notify.js.map +1 -0
  462. package/dist/web/archive.d.ts +49 -0
  463. package/dist/web/archive.d.ts.map +1 -0
  464. package/dist/web/archive.js +59 -0
  465. package/dist/web/archive.js.map +1 -0
  466. package/dist/web/assets.d.ts +6 -5
  467. package/dist/web/assets.d.ts.map +1 -1
  468. package/dist/web/assets.js +5 -7
  469. package/dist/web/assets.js.map +1 -1
  470. package/dist/web/authors.d.ts +143 -0
  471. package/dist/web/authors.d.ts.map +1 -0
  472. package/dist/web/authors.js +178 -0
  473. package/dist/web/authors.js.map +1 -0
  474. package/dist/web/comments.d.ts +60 -0
  475. package/dist/web/comments.d.ts.map +1 -0
  476. package/dist/web/comments.js +207 -0
  477. package/dist/web/comments.js.map +1 -0
  478. package/dist/web/context.d.ts +162 -28
  479. package/dist/web/context.d.ts.map +1 -1
  480. package/dist/web/context.js +123 -26
  481. package/dist/web/context.js.map +1 -1
  482. package/dist/web/conversation.d.ts +209 -0
  483. package/dist/web/conversation.d.ts.map +1 -0
  484. package/dist/web/conversation.js +557 -0
  485. package/dist/web/conversation.js.map +1 -0
  486. package/dist/web/documents.d.ts +36 -6
  487. package/dist/web/documents.d.ts.map +1 -1
  488. package/dist/web/documents.js +52 -10
  489. package/dist/web/documents.js.map +1 -1
  490. package/dist/web/feed-atom.d.ts +22 -0
  491. package/dist/web/feed-atom.d.ts.map +1 -0
  492. package/dist/web/feed-atom.js +83 -0
  493. package/dist/web/feed-atom.js.map +1 -0
  494. package/dist/web/feed-item.d.ts +145 -0
  495. package/dist/web/feed-item.d.ts.map +1 -0
  496. package/dist/web/feed-item.js +120 -0
  497. package/dist/web/feed-item.js.map +1 -0
  498. package/dist/web/feed-json.d.ts +79 -0
  499. package/dist/web/feed-json.d.ts.map +1 -0
  500. package/dist/web/feed-json.js +53 -0
  501. package/dist/web/feed-json.js.map +1 -0
  502. package/dist/web/feed-rss.d.ts +26 -0
  503. package/dist/web/feed-rss.d.ts.map +1 -0
  504. package/dist/web/feed-rss.js +203 -0
  505. package/dist/web/feed-rss.js.map +1 -0
  506. package/dist/web/feed-source.d.ts +244 -0
  507. package/dist/web/feed-source.d.ts.map +1 -0
  508. package/dist/web/feed-source.js +201 -0
  509. package/dist/web/feed-source.js.map +1 -0
  510. package/dist/web/feed-xml.d.ts +63 -0
  511. package/dist/web/feed-xml.d.ts.map +1 -0
  512. package/dist/web/feed-xml.js +116 -0
  513. package/dist/web/feed-xml.js.map +1 -0
  514. package/dist/web/feeds.d.ts +31 -96
  515. package/dist/web/feeds.d.ts.map +1 -1
  516. package/dist/web/feeds.js +94 -198
  517. package/dist/web/feeds.js.map +1 -1
  518. package/dist/web/health.d.ts +31 -0
  519. package/dist/web/health.d.ts.map +1 -0
  520. package/dist/web/health.js +44 -0
  521. package/dist/web/health.js.map +1 -0
  522. package/dist/web/index.d.ts +30 -10
  523. package/dist/web/index.d.ts.map +1 -1
  524. package/dist/web/index.js +18 -7
  525. package/dist/web/index.js.map +1 -1
  526. package/dist/web/navigation.d.ts +195 -0
  527. package/dist/web/navigation.d.ts.map +1 -0
  528. package/dist/web/navigation.js +300 -0
  529. package/dist/web/navigation.js.map +1 -0
  530. package/dist/web/negotiate.d.ts +31 -0
  531. package/dist/web/negotiate.d.ts.map +1 -1
  532. package/dist/web/negotiate.js +31 -11
  533. package/dist/web/negotiate.js.map +1 -1
  534. package/dist/web/recent.d.ts +43 -0
  535. package/dist/web/recent.d.ts.map +1 -0
  536. package/dist/web/recent.js +37 -0
  537. package/dist/web/recent.js.map +1 -0
  538. package/dist/web/render.d.ts +203 -9
  539. package/dist/web/render.d.ts.map +1 -1
  540. package/dist/web/render.js +341 -17
  541. package/dist/web/render.js.map +1 -1
  542. package/dist/web/routes.d.ts +25 -8
  543. package/dist/web/routes.d.ts.map +1 -1
  544. package/dist/web/routes.js +854 -93
  545. package/dist/web/routes.js.map +1 -1
  546. package/dist/web/sanitize.d.ts +19 -0
  547. package/dist/web/sanitize.d.ts.map +1 -0
  548. package/dist/web/sanitize.js +272 -0
  549. package/dist/web/sanitize.js.map +1 -0
  550. package/dist/web/search.d.ts +79 -0
  551. package/dist/web/search.d.ts.map +1 -0
  552. package/dist/web/search.js +94 -0
  553. package/dist/web/search.js.map +1 -0
  554. package/dist/web/sitemap.d.ts +120 -0
  555. package/dist/web/sitemap.d.ts.map +1 -0
  556. package/dist/web/sitemap.js +199 -0
  557. package/dist/web/sitemap.js.map +1 -0
  558. package/dist/web/taxonomy.d.ts +152 -0
  559. package/dist/web/taxonomy.d.ts.map +1 -0
  560. package/dist/web/taxonomy.js +237 -0
  561. package/dist/web/taxonomy.js.map +1 -0
  562. package/dist/web/templates.d.ts +54 -16
  563. package/dist/web/templates.d.ts.map +1 -1
  564. package/dist/web/templates.js +109 -28
  565. package/dist/web/templates.js.map +1 -1
  566. package/dist/web/themes.d.ts +226 -0
  567. package/dist/web/themes.d.ts.map +1 -0
  568. package/dist/web/themes.js +314 -0
  569. package/dist/web/themes.js.map +1 -0
  570. package/dist/webmention/discovery.d.ts +51 -0
  571. package/dist/webmention/discovery.d.ts.map +1 -0
  572. package/dist/webmention/discovery.js +176 -0
  573. package/dist/webmention/discovery.js.map +1 -0
  574. package/dist/webmention/html.d.ts +71 -0
  575. package/dist/webmention/html.d.ts.map +1 -0
  576. package/dist/webmention/html.js +285 -0
  577. package/dist/webmention/html.js.map +1 -0
  578. package/dist/webmention/index.d.ts +12 -0
  579. package/dist/webmention/index.d.ts.map +1 -0
  580. package/dist/webmention/index.js +8 -0
  581. package/dist/webmention/index.js.map +1 -0
  582. package/dist/webmention/links.d.ts +18 -0
  583. package/dist/webmention/links.d.ts.map +1 -0
  584. package/dist/webmention/links.js +64 -0
  585. package/dist/webmention/links.js.map +1 -0
  586. package/dist/webmention/microformats.d.ts +93 -0
  587. package/dist/webmention/microformats.d.ts.map +1 -0
  588. package/dist/webmention/microformats.js +376 -0
  589. package/dist/webmention/microformats.js.map +1 -0
  590. package/dist/webmention/receive.d.ts +141 -0
  591. package/dist/webmention/receive.d.ts.map +1 -0
  592. package/dist/webmention/receive.js +264 -0
  593. package/dist/webmention/receive.js.map +1 -0
  594. package/dist/webmention/routes.d.ts +37 -0
  595. package/dist/webmention/routes.d.ts.map +1 -0
  596. package/dist/webmention/routes.js +75 -0
  597. package/dist/webmention/routes.js.map +1 -0
  598. package/dist/webmention/service.d.ts +94 -0
  599. package/dist/webmention/service.d.ts.map +1 -0
  600. package/dist/webmention/service.js +207 -0
  601. package/dist/webmention/service.js.map +1 -0
  602. package/package.json +11 -6
  603. package/templates/site/content/_data/site.json +8 -0
  604. package/templates/site/content/pages/about.md +7 -0
  605. package/templates/site/content/posts/2026-01-01-hello-world.md +5 -3
  606. package/templates/site/geekity.config.ts +11 -1
  607. package/templates/site/tsconfig.json +1 -1
  608. package/themes/default/README.md +1216 -50
  609. package/themes/default/layouts/404.njk +2 -3
  610. package/themes/default/layouts/author.njk +36 -0
  611. package/themes/default/layouts/base.njk +161 -31
  612. package/themes/default/layouts/category.njk +27 -0
  613. package/themes/default/layouts/front-page.njk +56 -0
  614. package/themes/default/layouts/home.njk +17 -1
  615. package/themes/default/layouts/page.njk +57 -5
  616. package/themes/default/layouts/post.njk +78 -19
  617. package/themes/default/layouts/search.njk +57 -0
  618. package/themes/default/layouts/tag.njk +3 -6
  619. package/themes/default/mail/comment-digest.html.njk +37 -0
  620. package/themes/default/mail/comment-digest.subject.njk +3 -0
  621. package/themes/default/mail/comment-digest.txt.njk +40 -0
  622. package/themes/default/mail/comment-pending.html.njk +27 -0
  623. package/themes/default/mail/comment-pending.subject.njk +2 -0
  624. package/themes/default/mail/comment-pending.txt.njk +24 -0
  625. package/themes/default/mail/comment-reply.html.njk +21 -0
  626. package/themes/default/mail/comment-reply.subject.njk +2 -0
  627. package/themes/default/mail/comment-reply.txt.njk +22 -0
  628. package/themes/default/mail/contact-message.html.njk +24 -0
  629. package/themes/default/mail/contact-message.subject.njk +5 -0
  630. package/themes/default/mail/contact-message.txt.njk +20 -0
  631. package/themes/default/mail/password-changed.html.njk +18 -0
  632. package/themes/default/mail/password-changed.subject.njk +2 -0
  633. package/themes/default/mail/password-changed.txt.njk +17 -0
  634. package/themes/default/mail/password-reset.html.njk +22 -0
  635. package/themes/default/mail/password-reset.subject.njk +2 -0
  636. package/themes/default/mail/password-reset.txt.njk +18 -0
  637. package/themes/default/mail/test.html.njk +14 -0
  638. package/themes/default/mail/test.subject.njk +2 -0
  639. package/themes/default/mail/test.txt.njk +12 -0
  640. package/themes/default/partials/archive.njk +27 -0
  641. package/themes/default/partials/bio.njk +71 -0
  642. package/themes/default/partials/comment-form.njk +137 -0
  643. package/themes/default/partials/contact-form.njk +88 -0
  644. package/themes/default/partials/conversation.njk +139 -0
  645. package/themes/default/partials/feeds.njk +26 -0
  646. package/themes/default/partials/jsonld.njk +120 -0
  647. package/themes/default/partials/menu.njk +32 -0
  648. package/themes/default/partials/pagination.njk +12 -6
  649. package/themes/default/partials/post-list.njk +51 -18
  650. package/themes/default/partials/search-form.njk +22 -0
  651. package/themes/default/partials/tags.njk +26 -5
  652. package/themes/default/static/highlight.js +4 -0
  653. package/themes/default/static/style.css +1142 -194
  654. package/themes/default/theme.json +9 -0
  655. package/admin/layouts/federation.njk +0 -145
  656. package/admin/layouts/login.njk +0 -23
  657. package/admin/layouts/settings.njk +0 -116
  658. package/admin/layouts/setup.njk +0 -27
  659. package/admin/layouts/users.njk +0 -91
  660. /package/admin/{layouts/_flash.njk → components/flash.njk} +0 -0
@@ -1,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 { NavigationMenus } 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,188 @@ 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).
62
108
  *
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.
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.
66
113
  */
67
- avatar: string;
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).
191
+ *
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.
199
+ */
200
+ wordpressActivityPub: boolean;
201
+ /**
202
+ * Every menu the site holds, by name: `site.json`'s `menus`, each an ordered
203
+ * list of items a theme renders wherever it declares an area of that name
204
+ * and an Eleventy build reads out of the same file.
205
+ *
206
+ * Not a field of the settings form, and deliberately: a menu is content a
207
+ * site arranges rather than a switch it sets, and which menus there are to
208
+ * edit comes from the active theme. The Navigation screen is what writes
209
+ * them (TASK-108); a settings page carries them through a save untouched,
210
+ * the way it carries the archive renames.
211
+ */
212
+ menus: NavigationMenus;
213
+ /**
214
+ * The taxonomy archives that have moved: one `{ taxonomy, from, to }` per
215
+ * term the taxonomy screens renamed or merged away, so the URL it used to
216
+ * live at can point at the one it lives at now.
217
+ *
218
+ * Not a field of the settings form: it is a record of what happened rather
219
+ * than a preference, and the taxonomy screens are what write it. Chains are collapsed as they are
220
+ * recorded, so the list answers every old URL in one hop.
221
+ */
222
+ taxonomyRedirects: readonly TaxonomyRedirect[];
68
223
  }
69
224
  /**
70
225
  * The settings the form on the settings screen carries.
71
226
  *
72
- * Every setting but the avatar, which is a file rather than a field; see
73
- * {@link SiteSettings.avatar}.
227
+ * Every setting but the two that a screen of its own writes: the recorded
228
+ * archive renames, which the taxonomy screens write, and the menus, which the
229
+ * Navigation screen writes. See {@link CarriedSettings}.
74
230
  */
75
- export type SettingsField = Exclude<keyof SiteSettings, 'avatar'>;
231
+ export type SettingsField = Exclude<keyof SiteSettings, 'taxonomyRedirects' | 'menus'>;
232
+ /**
233
+ * The settings no settings form carries, as a save takes them from the file.
234
+ *
235
+ * Both are records of what another screen did rather than preferences typed
236
+ * into a box, so a save of the title reads them off `site.json` as it stands
237
+ * inside the write rather than off the form — which is what makes a menu
238
+ * edited while the settings page was open survive the save.
239
+ */
240
+ export type CarriedSettings = Partial<Pick<SiteSettings, 'taxonomyRedirects' | 'menus'>>;
76
241
  /**
77
242
  * What a site is worth before anybody has said otherwise.
78
243
  *
@@ -86,64 +251,125 @@ export declare const SETTINGS_FIELDS: {
86
251
  readonly tagline: 'tagline';
87
252
  readonly baseUrl: 'base_url';
88
253
  readonly timezone: 'timezone';
254
+ readonly language: 'language';
89
255
  readonly postsPerPage: 'posts_per_page';
256
+ readonly homepage: 'homepage';
257
+ readonly postsPage: 'posts_page';
90
258
  readonly author: 'author';
91
- readonly actorHandle: 'actor_handle';
92
- readonly actorType: 'actor_type';
259
+ readonly theme: 'theme';
260
+ readonly tagBase: 'tag_base';
261
+ readonly categoryBase: 'category_base';
262
+ readonly comments: 'comments';
263
+ readonly commentsCloseAfterDays: 'comments_close_after_days';
264
+ readonly webmentionsSend: 'webmentions_send';
265
+ readonly webmentionsReceive: 'webmentions_receive';
266
+ readonly notifyServer: 'notify_server';
267
+ readonly mailProvider: 'mail_provider';
268
+ readonly mailFromName: 'mail_from_name';
269
+ readonly mailFromAddress: 'mail_from_address';
270
+ readonly mailReplyTo: 'mail_reply_to';
271
+ readonly contactEmail: 'contact_email';
272
+ readonly relays: 'relays';
273
+ readonly wordpressActivityPub: 'wordpress_activitypub';
93
274
  };
94
275
  /** A submitted settings form, before it is known to be valid. */
95
276
  export type SettingsForm = Record<SettingsField, string>;
96
277
  /** One message per field that is wrong. An empty object is a valid form. */
97
278
  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
279
  /**
103
- * The settings as the `site` global, for the theme and for the JSON mirror.
280
+ * A site's settings, as its `content/_data/site.json` says them right now.
104
281
  *
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.
282
+ * Read on every request that needs one rather than cached, which is what a
283
+ * source of truth being a file is worth: a hand edit shows on the public site,
284
+ * on the settings screen and in the actor document without a restart and
285
+ * without anything being told. The file is a few hundred bytes, so the read
286
+ * costs less than the parse of the template that is about to use it.
287
+ *
288
+ * A file that is missing, or one that will not parse, is the defaults rather
289
+ * than an error: a typo in `site.json` should leave a site up and answerable,
290
+ * with the settings screen there to put it right.
108
291
  */
109
- export declare function settingsSiteData(settings: SiteSettings): Partial<SiteData>;
292
+ export declare function readSiteSettings(contentDir: string): SiteSettings;
293
+ /**
294
+ * `content/_data/site.json` as the settings it names, defaults filled in.
295
+ *
296
+ * Read tolerantly, key by key, because the file is public, in git and editable
297
+ * by hand: a key of the wrong type, or one a site has never written, falls
298
+ * back to the default rather than taking the site down. The empty string is a
299
+ * value of its own for `tagline`, `author` and `notifyServer`, where empty is
300
+ * a decision — no tagline, no author, notifications off — and not for
301
+ * `title`, `timezone`, `language` or the two archive bases, where it is a hole
302
+ * only a default can fill.
303
+ */
304
+ export declare function settingsFromSiteJson(file: Record<string, unknown>): SiteSettings;
305
+ /** The two archive bases the settings hold, as the URL builders want them. */
306
+ export declare function taxonomyBasesFromSettings(settings: SiteSettings): TaxonomyBases;
110
307
  /**
111
308
  * `content/_data/site.json` as it should read for these settings.
112
309
  *
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.
310
+ * Every key the settings model is written whether or not it has a value, so
311
+ * the file's shape is stable and an Eleventy template may reference
312
+ * `site.author` without guarding it. Every other key the file already had is
313
+ * kept: a site may put anything in there and reach it from its templates, and
314
+ * the settings form is not going to be the thing that throws it away.
315
+ *
316
+ * `homepage` and `postsPage` are the one exception, and they earn it: a site
317
+ * showing its latest posts has no static front page at all rather than an
318
+ * empty one, so the keys are absent rather than empty — which is also how a
319
+ * `site.json` written before this version reads, and what it should mean.
118
320
  */
119
321
  export declare function siteJsonFor(settings: SiteSettings, existing?: Record<string, unknown>): Record<string, unknown>;
120
322
  /** The absolute path of one site's `content/_data/site.json`. */
121
323
  export declare function siteDataPath(contentDir: string): string;
122
324
  /**
123
- * Rewrite `content/_data/site.json` from the settings.
325
+ * Rewrite `content/_data/site.json` as these settings, keeping the keys they
326
+ * do not model.
124
327
  *
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.
328
+ * {@link updateSiteSettings} for a caller whose new settings depend on the old
329
+ * ones, which every screen's is: this is for the callers that have the whole
330
+ * object already, a test's set-up among them.
129
331
  */
130
332
  export declare function writeSiteJson(options: {
131
333
  contentDir: string;
132
334
  settings: SiteSettings;
133
335
  }): Promise<void>;
134
336
  /**
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.
337
+ * Change the settings: re-read the file, apply the change, write it back, with
338
+ * nothing able to write that file in between ({@link updateFileAtomically}).
138
339
  *
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.
340
+ * The re-read is what makes the file win the way it wins for a post
341
+ * (decision-9). Two people with the settings screen open both save what they
342
+ * see, and the second save is applied to what the first one actually wrote
343
+ * rather than to what the second one had on screen — so a change to a field
344
+ * the second person did not touch survives. The write is a temporary file and
345
+ * a rename, so a reader — an Eleventy build, the site data source, another
346
+ * process entirely — never sees a half-written file. Keys the settings do not
347
+ * model, `feedSize` and anything a site added, are kept.
142
348
  */
143
- export declare function seedSiteSettings(options: {
144
- store: AdminStore;
145
- config: Pick<ResolvedConfig, 'contentDir' | 'baseUrl' | 'baseUrlSource'>;
146
- }): SiteSettings;
349
+ export declare function updateSiteSettings(options: {
350
+ contentDir: string;
351
+ change: (current: SiteSettings) => SiteSettings;
352
+ }): Promise<SiteSettings>;
353
+ /**
354
+ * Turn an older site's settings rows into `content/_data/site.json`, once, and
355
+ * drop the table.
356
+ *
357
+ * TASK-14 made SQLite the source and the file its mirror; decision-9 reversed
358
+ * that, and a site upgrading across the two has rows nothing would ever read
359
+ * again. So the first boot of this version writes them out. Which side wins
360
+ * when both have something to say is decided the way it is decided everywhere
361
+ * else: the file wins when it was written after the last save, because that is
362
+ * a hand edit or a restored checkout, and the rows win otherwise. Either way
363
+ * the actor handle and type come from the rows, because `site.json` never
364
+ * carried them and losing them would rename the site's actor.
365
+ *
366
+ * Synchronous because `createCms` is: it runs before the server is listening
367
+ * and before anything else has touched the file.
368
+ */
369
+ export declare function migrateSettingsToFile(options: {
370
+ admin: AdminStore;
371
+ contentDir: string;
372
+ }): void;
147
373
  /**
148
374
  * The base URL actually in effect, and why.
149
375
  *
@@ -154,41 +380,58 @@ export declare function seedSiteSettings(options: {
154
380
  * offering a field that would quietly do nothing.
155
381
  */
156
382
  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;
383
+ /**
384
+ * What a check may need to know beyond the form itself.
385
+ *
386
+ * One field has anything here, and it is the theme: whether a name is a theme
387
+ * is a question about the file system rather than about the string, and only
388
+ * the config knows where this site's themes are. A check given no context does
389
+ * what it can — the theme's is still a name it can refuse — so a caller with
390
+ * no config in hand is not blocked.
391
+ */
392
+ export interface SettingsContext {
393
+ /** Where the site's themes are: {@link ResolvedConfig.themesDir}. */
394
+ themesDir?: string | undefined;
395
+ }
396
+ /** Every field of the settings, in the order the form fields name them. */
397
+ export declare const SETTINGS_FIELD_NAMES: readonly SettingsField[];
398
+ /**
399
+ * What is wrong with a submitted settings form, one message per field.
400
+ *
401
+ * `fields` is what a page carries: it validates its own fields and says
402
+ * nothing about the rest, so a page cannot refuse a save over a field it does
403
+ * not show and gives no way to fix. `context` is what a check needs beyond the
404
+ * form; see {@link SettingsContext}.
405
+ */
406
+ export declare function settingsProblems(form: SettingsForm, fields?: readonly SettingsField[], context?: SettingsContext): SettingsProblems;
159
407
  /**
160
408
  * A validated form as settings. Only call it on a form
161
409
  * {@link settingsProblems} found nothing wrong with.
162
410
  *
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.
411
+ * The archive renames and the menus are carried in rather than read off the
412
+ * form, because they are not on it: the taxonomy screens write the one and the
413
+ * Navigation screen the other, and a save of the fields that are on the form
414
+ * keeps whatever is stored. Passing the settings read inside the write is all
415
+ * a caller has to do, since they hold both.
166
416
  */
167
- export declare function settingsFromForm(form: SettingsForm, avatar?: string): SiteSettings;
417
+ export declare function settingsFromForm(form: SettingsForm, carried?: CarriedSettings): SiteSettings;
168
418
  /** The settings as the form shows them. */
169
419
  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
420
  /**
176
- * Register the settings screen.
421
+ * A relay textarea as the list of inboxes it names: normalised, in the order
422
+ * they were given, with repeats dropped.
177
423
  *
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.
424
+ * Exported because the same parsing turns a stored setting, a submitted form
425
+ * and a `site.json` array into the one list; a second spelling of it would let
426
+ * the file and the database disagree about what a site subscribes to.
181
427
  */
182
- export declare function mountSettings(app: Hono<GeekityEnv>, options: MountSettingsOptions): void;
428
+ export declare function relayList(value: string): string[];
183
429
  /**
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.
430
+ * A relay inbox URL, or `undefined` when it is not an absolute http(s) one.
188
431
  *
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.
432
+ * Unlike {@link normalizeBaseUrl} this keeps the whole URL bar a trailing
433
+ * slash: a relay inbox is a path — `/user/_____relay_____/inbox` — rather than
434
+ * an origin, and some relays hang one off a query string.
192
435
  */
193
- export declare function profileChanged(before: SiteSettings, after: SiteSettings): boolean;
436
+ export declare function normalizeRelayInbox(value: string): string | undefined;
194
437
  //# 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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"}