@geekity/cms 0.35.0 → 0.37.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 (269) hide show
  1. package/admin/components/blocks.njk +250 -0
  2. package/admin/components/card.njk +4 -2
  3. package/admin/components/job-status.njk +15 -10
  4. package/admin/components/upload.njk +26 -0
  5. package/admin/pages/comments/all.njk +1 -1
  6. package/admin/pages/dashboard/home.njk +33 -32
  7. package/admin/pages/documents/editor.njk +34 -19
  8. package/admin/pages/federation/followers.njk +3 -2
  9. package/admin/pages/media/file.njk +5 -4
  10. package/admin/pages/media/library.njk +7 -3
  11. package/admin/pages/plugins/screen.njk +5 -35
  12. package/admin/pages/settings/general.njk +4 -1
  13. package/admin/pages/tools/export.njk +54 -51
  14. package/admin/pages/tools/maintenance.njk +2 -1
  15. package/admin/pages/users/edit.njk +3 -0
  16. package/admin/src/admin.css +1 -0
  17. package/admin/static/admin.css +374 -0
  18. package/admin/static/job-status.js +158 -0
  19. package/admin/static/upload-drop.js +225 -0
  20. package/dist/admin/blocks.d.ts +133 -0
  21. package/dist/admin/blocks.d.ts.map +1 -0
  22. package/dist/admin/blocks.js +454 -0
  23. package/dist/admin/blocks.js.map +1 -0
  24. package/dist/admin/core-widgets.d.ts +3 -0
  25. package/dist/admin/core-widgets.d.ts.map +1 -0
  26. package/dist/admin/core-widgets.js +17 -0
  27. package/dist/admin/core-widgets.js.map +1 -0
  28. package/dist/admin/documents.d.ts.map +1 -1
  29. package/dist/admin/documents.js +0 -2
  30. package/dist/admin/documents.js.map +1 -1
  31. package/dist/admin/engagement.d.ts +16 -0
  32. package/dist/admin/engagement.d.ts.map +1 -0
  33. package/dist/admin/engagement.js +38 -0
  34. package/dist/admin/engagement.js.map +1 -0
  35. package/dist/admin/federation.d.ts +2 -0
  36. package/dist/admin/federation.d.ts.map +1 -1
  37. package/dist/admin/federation.js +2 -1
  38. package/dist/admin/federation.js.map +1 -1
  39. package/dist/admin/formatting.d.ts +1 -0
  40. package/dist/admin/formatting.d.ts.map +1 -1
  41. package/dist/admin/formatting.js +18 -0
  42. package/dist/admin/formatting.js.map +1 -1
  43. package/dist/admin/index.d.ts +2 -2
  44. package/dist/admin/index.d.ts.map +1 -1
  45. package/dist/admin/index.js +2 -2
  46. package/dist/admin/index.js.map +1 -1
  47. package/dist/admin/job-status.d.ts +1 -0
  48. package/dist/admin/job-status.d.ts.map +1 -1
  49. package/dist/admin/job-status.js +1 -0
  50. package/dist/admin/job-status.js.map +1 -1
  51. package/dist/admin/media.d.ts +6 -9
  52. package/dist/admin/media.d.ts.map +1 -1
  53. package/dist/admin/media.js +85 -27
  54. package/dist/admin/media.js.map +1 -1
  55. package/dist/admin/posts-by-path.d.ts +11 -0
  56. package/dist/admin/posts-by-path.d.ts.map +1 -0
  57. package/dist/admin/posts-by-path.js +59 -0
  58. package/dist/admin/posts-by-path.js.map +1 -0
  59. package/dist/admin/routes.d.ts +0 -2
  60. package/dist/admin/routes.d.ts.map +1 -1
  61. package/dist/admin/routes.js +24 -12
  62. package/dist/admin/routes.js.map +1 -1
  63. package/dist/admin/templates.d.ts.map +1 -1
  64. package/dist/admin/templates.js +2 -0
  65. package/dist/admin/templates.js.map +1 -1
  66. package/dist/admin/tools.js +1 -1
  67. package/dist/admin/tools.js.map +1 -1
  68. package/dist/admin/uploads.d.ts +2 -1
  69. package/dist/admin/uploads.d.ts.map +1 -1
  70. package/dist/admin/uploads.js +5 -2
  71. package/dist/admin/uploads.js.map +1 -1
  72. package/dist/admin/widget-fediverse.d.ts +3 -0
  73. package/dist/admin/widget-fediverse.d.ts.map +1 -0
  74. package/dist/admin/widget-fediverse.js +49 -0
  75. package/dist/admin/widget-fediverse.js.map +1 -0
  76. package/dist/admin/widget-followers.d.ts +3 -0
  77. package/dist/admin/widget-followers.d.ts.map +1 -0
  78. package/dist/admin/widget-followers.js +37 -0
  79. package/dist/admin/widget-followers.js.map +1 -0
  80. package/dist/admin/widget-health.d.ts +3 -0
  81. package/dist/admin/widget-health.d.ts.map +1 -0
  82. package/dist/admin/widget-health.js +103 -0
  83. package/dist/admin/widget-health.js.map +1 -0
  84. package/dist/admin/widget-interactions.d.ts +4 -0
  85. package/dist/admin/widget-interactions.d.ts.map +1 -0
  86. package/dist/admin/widget-interactions.js +99 -0
  87. package/dist/admin/widget-interactions.js.map +1 -0
  88. package/dist/admin/widget-posting.d.ts +3 -0
  89. package/dist/admin/widget-posting.d.ts.map +1 -0
  90. package/dist/admin/widget-posting.js +111 -0
  91. package/dist/admin/widget-posting.js.map +1 -0
  92. package/dist/admin/widget-scheduled.d.ts +4 -0
  93. package/dist/admin/widget-scheduled.d.ts.map +1 -0
  94. package/dist/admin/widget-scheduled.js +30 -0
  95. package/dist/admin/widget-scheduled.js.map +1 -0
  96. package/dist/admin/widget-top-posts.d.ts +4 -0
  97. package/dist/admin/widget-top-posts.d.ts.map +1 -0
  98. package/dist/admin/widget-top-posts.js +55 -0
  99. package/dist/admin/widget-top-posts.js.map +1 -0
  100. package/dist/admin/widgets.d.ts +35 -0
  101. package/dist/admin/widgets.d.ts.map +1 -0
  102. package/dist/admin/widgets.js +103 -0
  103. package/dist/admin/widgets.js.map +1 -0
  104. package/dist/cms/app.d.ts.map +1 -1
  105. package/dist/cms/app.js +2 -1
  106. package/dist/cms/app.js.map +1 -1
  107. package/dist/cms/boot.d.ts.map +1 -1
  108. package/dist/cms/boot.js +3 -2
  109. package/dist/cms/boot.js.map +1 -1
  110. package/dist/cms/services.d.ts.map +1 -1
  111. package/dist/cms/services.js +19 -0
  112. package/dist/cms/services.js.map +1 -1
  113. package/dist/content/alt-text.d.ts +1 -0
  114. package/dist/content/alt-text.d.ts.map +1 -1
  115. package/dist/content/alt-text.js +26 -1
  116. package/dist/content/alt-text.js.map +1 -1
  117. package/dist/content/sqlite/catalog.d.ts.map +1 -1
  118. package/dist/content/sqlite/catalog.js +15 -2
  119. package/dist/content/sqlite/catalog.js.map +1 -1
  120. package/dist/content/store.d.ts +10 -0
  121. package/dist/content/store.d.ts.map +1 -1
  122. package/dist/content/store.js.map +1 -1
  123. package/dist/content/write.d.ts.map +1 -1
  124. package/dist/content/write.js +3 -1
  125. package/dist/content/write.js.map +1 -1
  126. package/dist/federation/backfill.d.ts +1 -1
  127. package/dist/federation/backfill.d.ts.map +1 -1
  128. package/dist/federation/backfill.js +5 -1
  129. package/dist/federation/backfill.js.map +1 -1
  130. package/dist/federation/follower-history.d.ts +16 -0
  131. package/dist/federation/follower-history.d.ts.map +1 -0
  132. package/dist/federation/follower-history.js +61 -0
  133. package/dist/federation/follower-history.js.map +1 -0
  134. package/dist/federation/inbox.d.ts.map +1 -1
  135. package/dist/federation/inbox.js +2 -1
  136. package/dist/federation/inbox.js.map +1 -1
  137. package/dist/federation/records.d.ts +1 -0
  138. package/dist/federation/records.d.ts.map +1 -1
  139. package/dist/federation/records.js +24 -6
  140. package/dist/federation/records.js.map +1 -1
  141. package/dist/files/data-files.d.ts +1 -0
  142. package/dist/files/data-files.d.ts.map +1 -1
  143. package/dist/files/data-files.js +6 -0
  144. package/dist/files/data-files.js.map +1 -1
  145. package/dist/jobs/queue.d.ts.map +1 -1
  146. package/dist/jobs/queue.js +5 -0
  147. package/dist/jobs/queue.js.map +1 -1
  148. package/dist/jobs/types.d.ts +7 -0
  149. package/dist/jobs/types.d.ts.map +1 -1
  150. package/dist/jobs/types.js.map +1 -1
  151. package/dist/media/library.d.ts +9 -0
  152. package/dist/media/library.d.ts.map +1 -1
  153. package/dist/media/library.js +25 -1
  154. package/dist/media/library.js.map +1 -1
  155. package/dist/plugin.d.ts +275 -21
  156. package/dist/plugin.d.ts.map +1 -1
  157. package/dist/plugin.js +9 -8
  158. package/dist/plugin.js.map +1 -1
  159. package/dist/plugins/fetch.d.ts +0 -5
  160. package/dist/plugins/fetch.d.ts.map +1 -1
  161. package/dist/plugins/fetch.js +31 -7
  162. package/dist/plugins/fetch.js.map +1 -1
  163. package/dist/plugins/host-api.d.ts +3 -0
  164. package/dist/plugins/host-api.d.ts.map +1 -0
  165. package/dist/plugins/host-api.js +8 -0
  166. package/dist/plugins/host-api.js.map +1 -0
  167. package/dist/plugins/install.d.ts.map +1 -1
  168. package/dist/plugins/install.js +4 -2
  169. package/dist/plugins/install.js.map +1 -1
  170. package/dist/plugins/page-tags.d.ts +8 -0
  171. package/dist/plugins/page-tags.d.ts.map +1 -0
  172. package/dist/plugins/page-tags.js +73 -0
  173. package/dist/plugins/page-tags.js.map +1 -0
  174. package/dist/plugins/registry.d.ts +4 -1
  175. package/dist/plugins/registry.d.ts.map +1 -1
  176. package/dist/plugins/registry.js +50 -9
  177. package/dist/plugins/registry.js.map +1 -1
  178. package/dist/plugins/site.js +1 -1
  179. package/dist/plugins/site.js.map +1 -1
  180. package/dist/store/admin-store.d.ts +2 -2
  181. package/dist/store/admin-store.d.ts.map +1 -1
  182. package/dist/store/admin-store.js.map +1 -1
  183. package/dist/store/comments.d.ts +7 -0
  184. package/dist/store/comments.d.ts.map +1 -1
  185. package/dist/store/comments.js +21 -0
  186. package/dist/store/comments.js.map +1 -1
  187. package/dist/store/deliveries.d.ts +1 -0
  188. package/dist/store/deliveries.d.ts.map +1 -1
  189. package/dist/store/deliveries.js +6 -0
  190. package/dist/store/deliveries.js.map +1 -1
  191. package/dist/store/inbox.d.ts +16 -0
  192. package/dist/store/inbox.d.ts.map +1 -1
  193. package/dist/store/inbox.js +62 -0
  194. package/dist/store/inbox.js.map +1 -1
  195. package/dist/store/queue-database.d.ts +6 -0
  196. package/dist/store/queue-database.d.ts.map +1 -1
  197. package/dist/store/queue-database.js +16 -1
  198. package/dist/store/queue-database.js.map +1 -1
  199. package/dist/store/webmentions.d.ts +1 -0
  200. package/dist/store/webmentions.d.ts.map +1 -1
  201. package/dist/store/webmentions.js +6 -0
  202. package/dist/store/webmentions.js.map +1 -1
  203. package/dist/web/env.d.ts +3 -0
  204. package/dist/web/env.d.ts.map +1 -1
  205. package/dist/web/feed-item.d.ts +4 -3
  206. package/dist/web/feed-item.d.ts.map +1 -1
  207. package/dist/web/feed-item.js +8 -2
  208. package/dist/web/feed-item.js.map +1 -1
  209. package/dist/web/listing-pages.d.ts.map +1 -1
  210. package/dist/web/listing-pages.js +7 -2
  211. package/dist/web/listing-pages.js.map +1 -1
  212. package/dist/web/page-tags.d.ts +4 -0
  213. package/dist/web/page-tags.d.ts.map +1 -0
  214. package/dist/web/page-tags.js +39 -0
  215. package/dist/web/page-tags.js.map +1 -0
  216. package/dist/web/render.d.ts +2 -0
  217. package/dist/web/render.d.ts.map +1 -1
  218. package/dist/web/render.js +14 -0
  219. package/dist/web/render.js.map +1 -1
  220. package/dist/web/routes.d.ts +2 -1
  221. package/dist/web/routes.d.ts.map +1 -1
  222. package/dist/web/routes.js +3 -1
  223. package/dist/web/routes.js.map +1 -1
  224. package/package.json +6 -1
  225. package/themes/default/layouts/base.njk +6 -4
  226. package/dist/comments/routes.d.ts +0 -65
  227. package/dist/comments/routes.d.ts.map +0 -1
  228. package/dist/comments/routes.js +0 -235
  229. package/dist/comments/routes.js.map +0 -1
  230. package/dist/content/media.d.ts +0 -85
  231. package/dist/content/media.d.ts.map +0 -1
  232. package/dist/content/media.js +0 -237
  233. package/dist/content/media.js.map +0 -1
  234. package/dist/content/read-form.d.ts +0 -31
  235. package/dist/content/read-form.d.ts.map +0 -1
  236. package/dist/content/read-form.js +0 -157
  237. package/dist/content/read-form.js.map +0 -1
  238. package/dist/content/read.d.ts +0 -29
  239. package/dist/content/read.d.ts.map +0 -1
  240. package/dist/content/read.js +0 -82
  241. package/dist/content/read.js.map +0 -1
  242. package/dist/export/export-archives.d.ts +0 -29
  243. package/dist/export/export-archives.d.ts.map +0 -1
  244. package/dist/export/export-archives.js +0 -88
  245. package/dist/export/export-archives.js.map +0 -1
  246. package/dist/federation/mount.d.ts +0 -53
  247. package/dist/federation/mount.d.ts.map +0 -1
  248. package/dist/federation/mount.js +0 -344
  249. package/dist/federation/mount.js.map +0 -1
  250. package/dist/mail/credentials.d.ts +0 -62
  251. package/dist/mail/credentials.d.ts.map +0 -1
  252. package/dist/mail/credentials.js +0 -86
  253. package/dist/mail/credentials.js.map +0 -1
  254. package/dist/site/setting-rows.d.ts +0 -45
  255. package/dist/site/setting-rows.d.ts.map +0 -1
  256. package/dist/site/setting-rows.js +0 -361
  257. package/dist/site/setting-rows.js.map +0 -1
  258. package/dist/site/settings-form.d.ts +0 -30
  259. package/dist/site/settings-form.d.ts.map +0 -1
  260. package/dist/site/settings-form.js +0 -54
  261. package/dist/site/settings-form.js.map +0 -1
  262. package/dist/site/site-json.d.ts +0 -38
  263. package/dist/site/site-json.d.ts.map +0 -1
  264. package/dist/site/site-json.js +0 -69
  265. package/dist/site/site-json.js.map +0 -1
  266. package/dist/webmention/routes.d.ts +0 -37
  267. package/dist/webmention/routes.d.ts.map +0 -1
  268. package/dist/webmention/routes.js +0 -75
  269. package/dist/webmention/routes.js.map +0 -1
@@ -1,38 +0,0 @@
1
- import type { SiteSettings } from './settings.ts';
2
- export declare function parseSiteJson(source: string): Record<string, unknown>;
3
- /** The absolute path of one site's `content/_data/site.json`. */
4
- export declare function siteDataPath(contentDir: string): string;
5
- export declare function settingsFromSiteJson(file: Record<string, unknown>): SiteSettings;
6
- export declare function siteJsonFor(settings: SiteSettings, existing?: Record<string, unknown>): Record<string, unknown>;
7
- /** The bytes of one settings object, as the file holds them. */
8
- export declare function siteJsonText(settings: SiteSettings, existing: Record<string, unknown>): string;
9
- /**
10
- * Rewrite `content/_data/site.json` as these settings, keeping the keys they
11
- * do not model.
12
- *
13
- * {@link updateSiteSettings} for a caller whose new settings depend on the old
14
- * ones, which every screen's is: this is for the callers that have the whole
15
- * object already, a test's set-up among them.
16
- */
17
- export declare function writeSiteJson(options: {
18
- contentDir: string;
19
- settings: SiteSettings;
20
- }): Promise<void>;
21
- /**
22
- * Change the settings: re-read the file, apply the change, write it back, with
23
- * nothing able to write that file in between ({@link updateFileAtomically}).
24
- *
25
- * The re-read is what makes the file win the way it wins for a post
26
- * (decision-9). Two people with the settings screen open both save what they
27
- * see, and the second save is applied to what the first one actually wrote
28
- * rather than to what the second one had on screen — so a change to a field
29
- * the second person did not touch survives. The write is a temporary file and
30
- * a rename, so a reader — an Eleventy build, the site data source, another
31
- * process entirely — never sees a half-written file. Keys the settings do not
32
- * model, `feedSize` and anything a site added, are kept.
33
- */
34
- export declare function updateSiteSettings(options: {
35
- contentDir: string;
36
- change: (current: SiteSettings) => SiteSettings;
37
- }): Promise<SiteSettings>;
38
- //# sourceMappingURL=site-json.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"site-json.d.ts","sourceRoot":"","sources":["../../src/site/site-json.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQrE;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAEhF;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIzB;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAE9F;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,YAAY,CAAC;CACjD,GAAG,OAAO,CAAC,YAAY,CAAC,CAUxB"}
@@ -1,69 +0,0 @@
1
- import path from 'node:path';
2
- import { updateFileAtomically } from '../files/atomic.js';
3
- import { fileWith, storedValues } from '../settings/registry.js';
4
- import { isRecord } from '../util/guards.js';
5
- import { SITE_DATA_FILE } from '../theme/site-data.js';
6
- import { SITE } from './namespace.js';
7
- import { DEFAULT_SITE_SETTINGS } from './settings.js';
8
- const RETIRED_KEYS = ['navigation', 'soloAuthor'];
9
- export function parseSiteJson(source) {
10
- let parsed;
11
- try {
12
- parsed = JSON.parse(source);
13
- }
14
- catch {
15
- return {};
16
- }
17
- return isRecord(parsed) ? parsed : {};
18
- }
19
- /** The absolute path of one site's `content/_data/site.json`. */
20
- export function siteDataPath(contentDir) {
21
- return path.join(contentDir, ...SITE_DATA_FILE.split('/'));
22
- }
23
- export function settingsFromSiteJson(file) {
24
- return storedValues(SITE, file);
25
- }
26
- export function siteJsonFor(settings, existing = {}) {
27
- const file = fileWith(SITE, settings, existing);
28
- for (const key of RETIRED_KEYS)
29
- delete file[key];
30
- return file;
31
- }
32
- /** The bytes of one settings object, as the file holds them. */
33
- export function siteJsonText(settings, existing) {
34
- return `${JSON.stringify(siteJsonFor(settings, existing), null, 2)}\n`;
35
- }
36
- /**
37
- * Rewrite `content/_data/site.json` as these settings, keeping the keys they
38
- * do not model.
39
- *
40
- * {@link updateSiteSettings} for a caller whose new settings depend on the old
41
- * ones, which every screen's is: this is for the callers that have the whole
42
- * object already, a test's set-up among them.
43
- */
44
- export async function writeSiteJson(options) {
45
- await updateSiteSettings({ contentDir: options.contentDir, change: () => options.settings });
46
- }
47
- /**
48
- * Change the settings: re-read the file, apply the change, write it back, with
49
- * nothing able to write that file in between ({@link updateFileAtomically}).
50
- *
51
- * The re-read is what makes the file win the way it wins for a post
52
- * (decision-9). Two people with the settings screen open both save what they
53
- * see, and the second save is applied to what the first one actually wrote
54
- * rather than to what the second one had on screen — so a change to a field
55
- * the second person did not touch survives. The write is a temporary file and
56
- * a rename, so a reader — an Eleventy build, the site data source, another
57
- * process entirely — never sees a half-written file. Keys the settings do not
58
- * model, `feedSize` and anything a site added, are kept.
59
- */
60
- export async function updateSiteSettings(options) {
61
- let written = DEFAULT_SITE_SETTINGS;
62
- await updateFileAtomically(siteDataPath(options.contentDir), (current) => {
63
- const existing = parseSiteJson(current ?? '');
64
- written = options.change(settingsFromSiteJson(existing));
65
- return siteJsonText(written, existing);
66
- });
67
- return written;
68
- }
69
- //# sourceMappingURL=site-json.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"site-json.js","sourceRoot":"","sources":["../../src/site/site-json.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,YAAY,CAAU,CAAC;AAE3D,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAA6B;IAChE,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAAsB,EACtB,QAAQ,GAA4B,EAAE;IAEtC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,YAAY;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,QAAsB,EAAE,QAAiC;IACpF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAGnC;IACC,MAAM,kBAAkB,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAGxC;IACC,IAAI,OAAO,GAAG,qBAAqB,CAAC;IAEpC,MAAM,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE;QACvE,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzD,OAAO,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,37 +0,0 @@
1
- import type { Hono } from 'hono';
2
- import type { GeekityEnv } from '../web/env.ts';
3
- /**
4
- * The one public endpoint webmentions add.
5
- *
6
- * A single path under `/_geekity/`, like the comment form's, so it is out of
7
- * the way of every permalink a site might ever mint and the route table does
8
- * not grow with the site. It is what the `Link` header and the `<link>` in
9
- * every post's head point at, and it takes nothing but a form with a `source`
10
- * and a `target` in it.
11
- */
12
- /** Where a webmention is sent. */
13
- export declare const WEBMENTION_PATH = "/_geekity/webmention";
14
- /** The fields a webmention carries, which the spec fixes. */
15
- export declare const WEBMENTION_FIELDS: {
16
- readonly source: 'source';
17
- readonly target: 'target';
18
- };
19
- /**
20
- * The endpoint a page should advertise, or `undefined` when the site is not
21
- * taking webmentions.
22
- *
23
- * Read off the site data the renderer already has rather than the settings, so
24
- * a template asks one question and gets the same answer the endpoint gives.
25
- * A file that does not mention the setting is a site that takes them: that is
26
- * the default, and an older `site.json` should not quietly stop.
27
- */
28
- export declare function webmentionEndpointFor(site: Record<string, unknown>): string | undefined;
29
- /**
30
- * Register the webmention endpoint. Mounted by the public site.
31
- *
32
- * The answer is a 202 for anything worth going and looking at and a 400 for
33
- * anything that is not, and the looking happens afterwards — see
34
- * `receive.ts` for why that split is the whole design.
35
- */
36
- export declare function mountWebmentions(app: Hono<GeekityEnv>): void;
37
- //# sourceMappingURL=routes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/webmention/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAOhD;;;;;;;;GAQG;AAEH,kCAAkC;AAClC,eAAO,MAAM,eAAe,yBAAyB,CAAC;AAEtD,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB;aAAK,MAAM,EAAE,QAAQ;aAAE,MAAM,EAAE,QAAQ;CAAW,CAAC;AAEjF;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAEvF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CA4C5D"}
@@ -1,75 +0,0 @@
1
- import { clientAddress } from '../web/throttle.js';
2
- import { readSiteSettings } from '../site/site-json.js';
3
- import { stringOrEmpty } from '../util/forms.js';
4
- import { publicDocumentAt } from '../content/permalinks.js';
5
- import { checkWebmentionRequest } from './receive.js';
6
- import { postSyndicatedAt, syndicationCopies } from './syndication.js';
7
- /**
8
- * The one public endpoint webmentions add.
9
- *
10
- * A single path under `/_geekity/`, like the comment form's, so it is out of
11
- * the way of every permalink a site might ever mint and the route table does
12
- * not grow with the site. It is what the `Link` header and the `<link>` in
13
- * every post's head point at, and it takes nothing but a form with a `source`
14
- * and a `target` in it.
15
- */
16
- /** Where a webmention is sent. */
17
- export const WEBMENTION_PATH = '/_geekity/webmention';
18
- /** The fields a webmention carries, which the spec fixes. */
19
- export const WEBMENTION_FIELDS = { source: 'source', target: 'target' };
20
- /**
21
- * The endpoint a page should advertise, or `undefined` when the site is not
22
- * taking webmentions.
23
- *
24
- * Read off the site data the renderer already has rather than the settings, so
25
- * a template asks one question and gets the same answer the endpoint gives.
26
- * A file that does not mention the setting is a site that takes them: that is
27
- * the default, and an older `site.json` should not quietly stop.
28
- */
29
- export function webmentionEndpointFor(site) {
30
- return site['webmentionsReceive'] === false ? undefined : WEBMENTION_PATH;
31
- }
32
- /**
33
- * Register the webmention endpoint. Mounted by the public site.
34
- *
35
- * The answer is a 202 for anything worth going and looking at and a 400 for
36
- * anything that is not, and the looking happens afterwards — see
37
- * `receive.ts` for why that split is the whole design.
38
- */
39
- export function mountWebmentions(app) {
40
- app.post(WEBMENTION_PATH, async (c) => {
41
- const { store, config, webmentions, conversation } = c.var;
42
- if (!readSiteSettings(config.contentDir).webmentionsReceive) {
43
- // A 404 rather than a 403: a site that does not take webmentions has no
44
- // endpoint, and that is what having no endpoint looks like.
45
- return c.text('This site does not take webmentions.', 404);
46
- }
47
- const body = await c.req.parseBody();
48
- const checked = checkWebmentionRequest(stringOrEmpty(body[WEBMENTION_FIELDS.source]), stringOrEmpty(body[WEBMENTION_FIELDS.target]), {
49
- baseUrl: config.baseUrl,
50
- documentAt: (pathname) => publicDocumentAt(store, pathname),
51
- syndicatedAt: (url) => postSyndicatedAt(url, store, syndicationCopies(config.contentDir)),
52
- conversation,
53
- });
54
- if (!checked.ok)
55
- return c.text(checked.message, 400);
56
- // Nothing waits for the check: the sender is answered now and the source
57
- // is fetched afterwards, and `receive` never rejects.
58
- void webmentions.receive({
59
- source: checked.source,
60
- target: checked.target,
61
- document: checked.document,
62
- address: clientAddress(c, config),
63
- userAgent: c.req.header('user-agent'),
64
- referrer: c.req.header('referer'),
65
- });
66
- return c.text('Accepted. The source will be checked shortly.', 202);
67
- });
68
- // A GET on the endpoint is somebody looking rather than sending, and saying
69
- // so is friendlier than a 404 on a URL that is really there.
70
- app.get(WEBMENTION_PATH, (c) => {
71
- c.header('allow', 'POST');
72
- return c.text('Send a webmention here with a POST carrying source and target.', 405);
73
- });
74
- }
75
- //# sourceMappingURL=routes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/webmention/routes.ts"],"names":[],"mappings":"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"}