@geekity/cms 0.23.0 → 0.25.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 (192) hide show
  1. package/README.md +96 -160
  2. package/admin/pages/documents/editor.njk +45 -0
  3. package/admin/pages/federation/settings.njk +1 -59
  4. package/admin/pages/plugins/installed.njk +113 -0
  5. package/admin/pages/plugins/screen.njk +129 -0
  6. package/admin/static/admin.css +136 -4
  7. package/admin/static/editor-actions.js +192 -0
  8. package/admin/static/editor.js +1 -1
  9. package/dist/admin/accounts.d.ts +18 -39
  10. package/dist/admin/accounts.d.ts.map +1 -1
  11. package/dist/admin/accounts.js +19 -48
  12. package/dist/admin/accounts.js.map +1 -1
  13. package/dist/admin/documents.d.ts +5 -0
  14. package/dist/admin/documents.d.ts.map +1 -1
  15. package/dist/admin/documents.js +17 -8
  16. package/dist/admin/documents.js.map +1 -1
  17. package/dist/admin/editor-actions.d.ts +35 -0
  18. package/dist/admin/editor-actions.d.ts.map +1 -0
  19. package/dist/admin/editor-actions.js +168 -0
  20. package/dist/admin/editor-actions.js.map +1 -0
  21. package/dist/admin/federation.d.ts +4 -5
  22. package/dist/admin/federation.d.ts.map +1 -1
  23. package/dist/admin/federation.js +4 -5
  24. package/dist/admin/federation.js.map +1 -1
  25. package/dist/admin/index.d.ts +1 -1
  26. package/dist/admin/index.d.ts.map +1 -1
  27. package/dist/admin/index.js +1 -1
  28. package/dist/admin/index.js.map +1 -1
  29. package/dist/admin/menu.d.ts +1 -1
  30. package/dist/admin/menu.d.ts.map +1 -1
  31. package/dist/admin/menu.js +10 -3
  32. package/dist/admin/menu.js.map +1 -1
  33. package/dist/admin/plugins.d.ts +24 -0
  34. package/dist/admin/plugins.d.ts.map +1 -0
  35. package/dist/admin/plugins.js +312 -0
  36. package/dist/admin/plugins.js.map +1 -0
  37. package/dist/admin/routes.d.ts.map +1 -1
  38. package/dist/admin/routes.js +5 -1
  39. package/dist/admin/routes.js.map +1 -1
  40. package/dist/admin/settings-federation.d.ts +0 -25
  41. package/dist/admin/settings-federation.d.ts.map +1 -1
  42. package/dist/admin/settings-federation.js +1 -54
  43. package/dist/admin/settings-federation.js.map +1 -1
  44. package/dist/admin/settings.d.ts +2 -14
  45. package/dist/admin/settings.d.ts.map +1 -1
  46. package/dist/admin/settings.js +1 -21
  47. package/dist/admin/settings.js.map +1 -1
  48. package/dist/admin/store.d.ts +8 -1
  49. package/dist/admin/store.d.ts.map +1 -1
  50. package/dist/admin/store.js +7 -3
  51. package/dist/admin/store.js.map +1 -1
  52. package/dist/admin/templates.d.ts +2 -0
  53. package/dist/admin/templates.d.ts.map +1 -1
  54. package/dist/admin/templates.js +2 -0
  55. package/dist/admin/templates.js.map +1 -1
  56. package/dist/cli.d.ts +2 -3
  57. package/dist/cli.d.ts.map +1 -1
  58. package/dist/cli.js +278 -212
  59. package/dist/cli.js.map +1 -1
  60. package/dist/config.d.ts +20 -0
  61. package/dist/config.d.ts.map +1 -1
  62. package/dist/config.js +6 -0
  63. package/dist/config.js.map +1 -1
  64. package/dist/content/store.d.ts +6 -0
  65. package/dist/content/store.d.ts.map +1 -1
  66. package/dist/content/store.js +3 -0
  67. package/dist/content/store.js.map +1 -1
  68. package/dist/drain.d.ts +28 -0
  69. package/dist/drain.d.ts.map +1 -0
  70. package/dist/drain.js +106 -0
  71. package/dist/drain.js.map +1 -0
  72. package/dist/env.d.ts +11 -0
  73. package/dist/env.d.ts.map +1 -1
  74. package/dist/federation/federation.d.ts +4 -2
  75. package/dist/federation/federation.d.ts.map +1 -1
  76. package/dist/federation/federation.js +16 -21
  77. package/dist/federation/federation.js.map +1 -1
  78. package/dist/federation/inbox.d.ts +23 -3
  79. package/dist/federation/inbox.d.ts.map +1 -1
  80. package/dist/federation/inbox.js +63 -1
  81. package/dist/federation/inbox.js.map +1 -1
  82. package/dist/federation/index.d.ts +0 -4
  83. package/dist/federation/index.d.ts.map +1 -1
  84. package/dist/federation/index.js +0 -2
  85. package/dist/federation/index.js.map +1 -1
  86. package/dist/federation/mount.d.ts +6 -12
  87. package/dist/federation/mount.d.ts.map +1 -1
  88. package/dist/federation/mount.js +3 -50
  89. package/dist/federation/mount.js.map +1 -1
  90. package/dist/federation/queue.d.ts +22 -0
  91. package/dist/federation/queue.d.ts.map +1 -0
  92. package/dist/federation/queue.js +58 -0
  93. package/dist/federation/queue.js.map +1 -0
  94. package/dist/files/atomic.d.ts +13 -0
  95. package/dist/files/atomic.d.ts.map +1 -1
  96. package/dist/files/atomic.js +45 -0
  97. package/dist/files/atomic.js.map +1 -1
  98. package/dist/index.d.ts +30 -3
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +156 -79
  101. package/dist/index.js.map +1 -1
  102. package/dist/plugin.d.ts +513 -0
  103. package/dist/plugin.d.ts.map +1 -0
  104. package/dist/plugin.js +23 -0
  105. package/dist/plugin.js.map +1 -0
  106. package/dist/plugins/enabled.d.ts +23 -0
  107. package/dist/plugins/enabled.d.ts.map +1 -0
  108. package/dist/plugins/enabled.js +49 -0
  109. package/dist/plugins/enabled.js.map +1 -0
  110. package/dist/plugins/federation.d.ts +26 -0
  111. package/dist/plugins/federation.d.ts.map +1 -0
  112. package/dist/plugins/federation.js +114 -0
  113. package/dist/plugins/federation.js.map +1 -0
  114. package/dist/plugins/fetch.d.ts +15 -0
  115. package/dist/plugins/fetch.d.ts.map +1 -0
  116. package/dist/plugins/fetch.js +33 -0
  117. package/dist/plugins/fetch.js.map +1 -0
  118. package/dist/plugins/folder.d.ts +50 -0
  119. package/dist/plugins/folder.d.ts.map +1 -0
  120. package/dist/plugins/folder.js +171 -0
  121. package/dist/plugins/folder.js.map +1 -0
  122. package/dist/plugins/install.d.ts +45 -0
  123. package/dist/plugins/install.d.ts.map +1 -0
  124. package/dist/plugins/install.js +275 -0
  125. package/dist/plugins/install.js.map +1 -0
  126. package/dist/plugins/mount.d.ts +17 -0
  127. package/dist/plugins/mount.d.ts.map +1 -0
  128. package/dist/plugins/mount.js +44 -0
  129. package/dist/plugins/mount.js.map +1 -0
  130. package/dist/plugins/registry.d.ts +110 -0
  131. package/dist/plugins/registry.d.ts.map +1 -0
  132. package/dist/plugins/registry.js +447 -0
  133. package/dist/plugins/registry.js.map +1 -0
  134. package/dist/plugins/settings.d.ts +64 -0
  135. package/dist/plugins/settings.d.ts.map +1 -0
  136. package/dist/plugins/settings.js +219 -0
  137. package/dist/plugins/settings.js.map +1 -0
  138. package/dist/plugins/site.d.ts +17 -0
  139. package/dist/plugins/site.d.ts.map +1 -0
  140. package/dist/plugins/site.js +67 -0
  141. package/dist/plugins/site.js.map +1 -0
  142. package/dist/supervisor/primary.d.ts +47 -0
  143. package/dist/supervisor/primary.d.ts.map +1 -0
  144. package/dist/supervisor/primary.js +208 -0
  145. package/dist/supervisor/primary.js.map +1 -0
  146. package/dist/supervisor/protocol.d.ts +37 -0
  147. package/dist/supervisor/protocol.d.ts.map +1 -0
  148. package/dist/supervisor/protocol.js +29 -0
  149. package/dist/supervisor/protocol.js.map +1 -0
  150. package/dist/supervisor/supervision.d.ts +25 -0
  151. package/dist/supervisor/supervision.d.ts.map +1 -0
  152. package/dist/supervisor/supervision.js +7 -0
  153. package/dist/supervisor/supervision.js.map +1 -0
  154. package/dist/supervisor/worker.d.ts +29 -0
  155. package/dist/supervisor/worker.d.ts.map +1 -0
  156. package/dist/supervisor/worker.js +97 -0
  157. package/dist/supervisor/worker.js.map +1 -0
  158. package/dist/web/errors.d.ts.map +1 -1
  159. package/dist/web/errors.js +5 -3
  160. package/dist/web/errors.js.map +1 -1
  161. package/dist/web/llms.d.ts +8 -0
  162. package/dist/web/llms.d.ts.map +1 -1
  163. package/dist/web/llms.js +25 -7
  164. package/dist/web/llms.js.map +1 -1
  165. package/dist/web/maintenance.d.ts +2 -2
  166. package/dist/web/maintenance.d.ts.map +1 -1
  167. package/dist/web/maintenance.js +7 -4
  168. package/dist/web/maintenance.js.map +1 -1
  169. package/dist/web/negotiate.d.ts +8 -5
  170. package/dist/web/negotiate.d.ts.map +1 -1
  171. package/dist/web/negotiate.js +21 -10
  172. package/dist/web/negotiate.js.map +1 -1
  173. package/dist/web/routes.d.ts.map +1 -1
  174. package/dist/web/routes.js +84 -36
  175. package/dist/web/routes.js.map +1 -1
  176. package/package.json +11 -5
  177. package/dist/comments/conversation.d.ts +0 -29
  178. package/dist/comments/conversation.d.ts.map +0 -1
  179. package/dist/comments/conversation.js +0 -60
  180. package/dist/comments/conversation.js.map +0 -1
  181. package/dist/federation/import-wordpress.d.ts +0 -128
  182. package/dist/federation/import-wordpress.d.ts.map +0 -1
  183. package/dist/federation/import-wordpress.js +0 -426
  184. package/dist/federation/import-wordpress.js.map +0 -1
  185. package/dist/federation/wordpress.d.ts +0 -131
  186. package/dist/federation/wordpress.d.ts.map +0 -1
  187. package/dist/federation/wordpress.js +0 -342
  188. package/dist/federation/wordpress.js.map +0 -1
  189. package/dist/web/comments.d.ts +0 -60
  190. package/dist/web/comments.d.ts.map +0 -1
  191. package/dist/web/comments.js +0 -207
  192. package/dist/web/comments.js.map +0 -1
@@ -1,207 +0,0 @@
1
- import { commentAnchor } from '../comments/conversation.js';
2
- import { FEDERATION_PREFIX } from '../federation/paths.js';
3
- import { replyFrom } from '../federation/replies.js';
4
- import { activityStreamsId, isPublicDocument } from './documents.js';
5
- import { absoluteUrl } from './negotiate.js';
6
- /**
7
- * How many candidates a site-wide page reads for each one it keeps.
8
- *
9
- * Replies to a post that has since been unpublished are dropped after the
10
- * database has already counted them, so the query has to over-read. Four is
11
- * generous for a site whose posts mostly stay published and bounded for one
12
- * whose posts do not.
13
- */
14
- const OVERSCAN = 4;
15
- /**
16
- * One post's comments, newest first, from both sources.
17
- *
18
- * A post that has never been delivered has no object id and so can have no
19
- * fediverse replies — nothing out there has a name for it yet — but it can
20
- * still have native ones, which are found by its slug.
21
- */
22
- export function postComments(context, document, limit) {
23
- const objectId = activityStreamsId(document, context.baseUrl);
24
- const naming = authorNaming(context.admin);
25
- const federated = objectId === undefined
26
- ? []
27
- : context.admin
28
- .listRepliesTo(objectId, { limit })
29
- .map((activity) => replyFrom(activity, naming))
30
- .filter((reply) => reply !== undefined);
31
- return newestFirst([...federated, ...nativeComments(context, document)], limit);
32
- }
33
- /**
34
- * Every post's comments, newest first, each with the post it answers.
35
- *
36
- * One about a post that has since been unpublished or trashed is left out,
37
- * because the post it is about is not there to read: the feed would be showing
38
- * a conversation about nothing. That filtering happens after the database has
39
- * paged, so the pages are read until enough survive.
40
- */
41
- export function siteComments(context, limit) {
42
- const naming = authorNaming(context.admin);
43
- const posts = new PostsByObjectId(context);
44
- const comments = [];
45
- for (let offset = 0; comments.length < limit;) {
46
- const page = context.admin.listReplies({ limit: limit * OVERSCAN, offset });
47
- if (page.length === 0)
48
- break;
49
- offset += page.length;
50
- for (const activity of page) {
51
- const reply = replyFrom(activity, naming);
52
- if (reply === undefined)
53
- continue;
54
- const post = posts.get(reply.inReplyTo);
55
- if (post === undefined)
56
- continue;
57
- comments.push({ ...reply, post });
58
- if (comments.length === limit)
59
- break;
60
- }
61
- }
62
- // The native comments are over-read for the same reason the replies are: one
63
- // on a post that has since been unpublished is dropped after the index has
64
- // already counted it.
65
- for (const stored of context.admin.listComments({
66
- status: 'approved',
67
- limit: limit * OVERSCAN,
68
- })) {
69
- const post = context.store.getBySlug(stored.slug);
70
- if (post === undefined || !isPublicDocument(post, context.store.now()))
71
- continue;
72
- comments.push({ ...feedCommentOf(stored, post, context.baseUrl), post });
73
- }
74
- return newestFirst(comments, limit);
75
- }
76
- /**
77
- * How many comments each of these documents has, by permalink: the fediverse
78
- * replies and the approved native ones together, which is what a reader
79
- * following `source:comments` would actually find on the page.
80
- *
81
- * Resolved rather than counted on demand, because the number goes into the
82
- * feed's own validator: a feed whose comment counts moved is a changed feed,
83
- * and a reader holding the old one should be told so.
84
- */
85
- export function commentCounts(context, documents) {
86
- const counts = new Map();
87
- for (const document of documents) {
88
- const objectId = activityStreamsId(document, context.baseUrl);
89
- const federated = objectId === undefined ? 0 : context.admin.countRepliesTo(objectId);
90
- counts.set(document.permalink, federated + context.admin.countCommentsFor(document.slug, 'approved'));
91
- }
92
- return counts;
93
- }
94
- /** One post's approved native comments, in the shape a feed item wants. */
95
- function nativeComments(context, document) {
96
- return context.admin
97
- .listCommentsFor(document.slug)
98
- .filter((comment) => comment.status === 'approved')
99
- .map((comment) => feedCommentOf(comment, document, context.baseUrl));
100
- }
101
- /**
102
- * One stored comment as a feed item.
103
- *
104
- * Its `url` is where a reader can actually read it — this page, at the
105
- * comment's own anchor — and its `id` is the comment's own name, which is what
106
- * a `guid isPermaLink="false"` is for: a reader that has seen it once does not
107
- * see it again if the post moves.
108
- */
109
- function feedCommentOf(comment, post, baseUrl) {
110
- return {
111
- id: comment.id,
112
- url: `${absoluteUrl(post.permalink, baseUrl)}#${commentAnchor(comment.id)}`,
113
- author: comment.author.name,
114
- published: new Date(comment.submitted),
115
- html: comment.content.html,
116
- };
117
- }
118
- /** The newest `limit` of a mixed list, which is the order every feed shows. */
119
- function newestFirst(comments, limit) {
120
- return comments
121
- .sort((left, right) => right.published.getTime() - left.published.getTime())
122
- .slice(0, limit);
123
- }
124
- /** The name to show for an actor: the follower profile the site holds, if any. */
125
- function authorNaming(admin) {
126
- const known = new Map();
127
- return (actorId) => {
128
- if (!known.has(actorId)) {
129
- const follower = admin.getFollower(actorId);
130
- known.set(actorId, follower?.name ?? follower?.handle ?? undefined);
131
- }
132
- return known.get(actorId);
133
- };
134
- }
135
- /**
136
- * The public post an ActivityStreams object id names, memoised.
137
- *
138
- * Almost every id is the one the slug implies, so the slug is tried first and
139
- * the answer is checked against the document's own id — a post that has been
140
- * renamed keeps the id it was first delivered under, which no slug spells any
141
- * more. Only when that fails is the whole index read, once, to find it.
142
- */
143
- class PostsByObjectId {
144
- #context;
145
- #found = new Map();
146
- #all;
147
- constructor(context) {
148
- this.#context = context;
149
- }
150
- get(objectId) {
151
- if (!this.#found.has(objectId))
152
- this.#found.set(objectId, this.#resolve(objectId));
153
- return this.#found.get(objectId);
154
- }
155
- #resolve(objectId) {
156
- const slug = slugOfObjectId(objectId, this.#context.baseUrl);
157
- if (slug !== undefined) {
158
- const document = this.#context.store.getBySlug(slug);
159
- if (document !== undefined &&
160
- activityStreamsId(document, this.#context.baseUrl) === objectId) {
161
- return document;
162
- }
163
- }
164
- return this.#everything().get(objectId);
165
- }
166
- #everything() {
167
- if (this.#all === undefined) {
168
- this.#all = new Map();
169
- for (const document of this.#context.store.listPosts()) {
170
- const id = activityStreamsId(document, this.#context.baseUrl);
171
- if (id !== undefined)
172
- this.#all.set(id, document);
173
- }
174
- }
175
- return this.#all;
176
- }
177
- }
178
- /**
179
- * The slug an object id names, when it is one this site would have minted.
180
- *
181
- * An id from another host, or one under some other path, belongs to no post
182
- * here however it is spelled.
183
- */
184
- function slugOfObjectId(objectId, baseUrl) {
185
- let url;
186
- try {
187
- url = new URL(objectId);
188
- }
189
- catch {
190
- return undefined;
191
- }
192
- if (url.origin !== new URL(baseUrl).origin)
193
- return undefined;
194
- const prefix = `${FEDERATION_PREFIX}/posts/`;
195
- if (!url.pathname.startsWith(prefix))
196
- return undefined;
197
- const slug = url.pathname.slice(prefix.length);
198
- if (slug === '' || slug.includes('/'))
199
- return undefined;
200
- try {
201
- return decodeURIComponent(slug);
202
- }
203
- catch {
204
- return undefined;
205
- }
206
- }
207
- //# sourceMappingURL=comments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/web/comments.ts"],"names":[],"mappings":"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"}