@geekity/cms 0.28.0 → 0.30.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 (195) hide show
  1. package/README.md +355 -53
  2. package/admin/pages/comments/all.njk +3 -1
  3. package/admin/pages/federation/followers.njk +8 -2
  4. package/dist/admin/comments.d.ts +2 -0
  5. package/dist/admin/comments.d.ts.map +1 -1
  6. package/dist/admin/comments.js +19 -49
  7. package/dist/admin/comments.js.map +1 -1
  8. package/dist/admin/documents.d.ts +5 -0
  9. package/dist/admin/documents.d.ts.map +1 -1
  10. package/dist/admin/documents.js +45 -17
  11. package/dist/admin/documents.js.map +1 -1
  12. package/dist/admin/federation.d.ts +21 -1
  13. package/dist/admin/federation.d.ts.map +1 -1
  14. package/dist/admin/federation.js +17 -7
  15. package/dist/admin/federation.js.map +1 -1
  16. package/dist/admin/store.d.ts +95 -14
  17. package/dist/admin/store.d.ts.map +1 -1
  18. package/dist/admin/store.js +206 -17
  19. package/dist/admin/store.js.map +1 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +8 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/comments/form.d.ts +3 -1
  24. package/dist/comments/form.d.ts.map +1 -1
  25. package/dist/comments/form.js +2 -1
  26. package/dist/comments/form.js.map +1 -1
  27. package/dist/comments/index.d.ts +3 -3
  28. package/dist/comments/index.d.ts.map +1 -1
  29. package/dist/comments/index.js +1 -1
  30. package/dist/comments/index.js.map +1 -1
  31. package/dist/comments/records.d.ts +56 -24
  32. package/dist/comments/records.d.ts.map +1 -1
  33. package/dist/comments/records.js +255 -31
  34. package/dist/comments/records.js.map +1 -1
  35. package/dist/comments/reply-notices.d.ts +42 -0
  36. package/dist/comments/reply-notices.d.ts.map +1 -0
  37. package/dist/comments/reply-notices.js +76 -0
  38. package/dist/comments/reply-notices.js.map +1 -0
  39. package/dist/comments/reply-post.d.ts +49 -0
  40. package/dist/comments/reply-post.d.ts.map +1 -0
  41. package/dist/comments/reply-post.js +66 -0
  42. package/dist/comments/reply-post.js.map +1 -0
  43. package/dist/comments/routes.d.ts +6 -1
  44. package/dist/comments/routes.d.ts.map +1 -1
  45. package/dist/comments/routes.js +49 -21
  46. package/dist/comments/routes.js.map +1 -1
  47. package/dist/comments/submission.d.ts +8 -25
  48. package/dist/comments/submission.d.ts.map +1 -1
  49. package/dist/comments/submission.js +19 -38
  50. package/dist/comments/submission.js.map +1 -1
  51. package/dist/comments/viewer.d.ts.map +1 -1
  52. package/dist/comments/viewer.js +1 -0
  53. package/dist/comments/viewer.js.map +1 -1
  54. package/dist/content/citation.d.ts +1 -0
  55. package/dist/content/citation.d.ts.map +1 -1
  56. package/dist/content/citation.js +2 -0
  57. package/dist/content/citation.js.map +1 -1
  58. package/dist/content/original.d.ts +6 -1
  59. package/dist/content/original.d.ts.map +1 -1
  60. package/dist/content/original.js +7 -4
  61. package/dist/content/original.js.map +1 -1
  62. package/dist/content/store.d.ts +43 -11
  63. package/dist/content/store.d.ts.map +1 -1
  64. package/dist/content/store.js +170 -10
  65. package/dist/content/store.js.map +1 -1
  66. package/dist/content/sync.d.ts +8 -0
  67. package/dist/content/sync.d.ts.map +1 -1
  68. package/dist/content/sync.js +164 -71
  69. package/dist/content/sync.js.map +1 -1
  70. package/dist/federation/article.d.ts.map +1 -1
  71. package/dist/federation/article.js +2 -1
  72. package/dist/federation/article.js.map +1 -1
  73. package/dist/federation/backfill.d.ts +114 -0
  74. package/dist/federation/backfill.d.ts.map +1 -0
  75. package/dist/federation/backfill.js +314 -0
  76. package/dist/federation/backfill.js.map +1 -0
  77. package/dist/federation/inbox.js +1 -1
  78. package/dist/federation/inbox.js.map +1 -1
  79. package/dist/federation/records.d.ts +13 -0
  80. package/dist/federation/records.d.ts.map +1 -1
  81. package/dist/federation/records.js +49 -10
  82. package/dist/federation/records.js.map +1 -1
  83. package/dist/federation/replies.d.ts +6 -0
  84. package/dist/federation/replies.d.ts.map +1 -1
  85. package/dist/federation/replies.js +18 -1
  86. package/dist/federation/replies.js.map +1 -1
  87. package/dist/index.d.ts +12 -4
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +81 -11
  90. package/dist/index.js.map +1 -1
  91. package/dist/init.d.ts +1 -1
  92. package/dist/init.d.ts.map +1 -1
  93. package/dist/init.js +1 -7
  94. package/dist/init.js.map +1 -1
  95. package/dist/plugin.d.ts +28 -2
  96. package/dist/plugin.d.ts.map +1 -1
  97. package/dist/plugin.js +10 -2
  98. package/dist/plugin.js.map +1 -1
  99. package/dist/plugins/site.d.ts.map +1 -1
  100. package/dist/plugins/site.js +7 -1
  101. package/dist/plugins/site.js.map +1 -1
  102. package/dist/web/context.d.ts +18 -3
  103. package/dist/web/context.d.ts.map +1 -1
  104. package/dist/web/context.js +17 -4
  105. package/dist/web/context.js.map +1 -1
  106. package/dist/web/conversation.d.ts +191 -28
  107. package/dist/web/conversation.d.ts.map +1 -1
  108. package/dist/web/conversation.js +670 -172
  109. package/dist/web/conversation.js.map +1 -1
  110. package/dist/web/documents.d.ts +0 -22
  111. package/dist/web/documents.d.ts.map +1 -1
  112. package/dist/web/documents.js +1 -34
  113. package/dist/web/documents.js.map +1 -1
  114. package/dist/web/feed-item.d.ts +12 -8
  115. package/dist/web/feed-item.d.ts.map +1 -1
  116. package/dist/web/feed-item.js +10 -10
  117. package/dist/web/feed-item.js.map +1 -1
  118. package/dist/web/feed-rss.d.ts.map +1 -1
  119. package/dist/web/feed-rss.js +34 -10
  120. package/dist/web/feed-rss.js.map +1 -1
  121. package/dist/web/feed-source.d.ts +33 -1
  122. package/dist/web/feed-source.d.ts.map +1 -1
  123. package/dist/web/feed-source.js +33 -0
  124. package/dist/web/feed-source.js.map +1 -1
  125. package/dist/web/feeds.d.ts +1 -1
  126. package/dist/web/feeds.d.ts.map +1 -1
  127. package/dist/web/feeds.js +7 -2
  128. package/dist/web/feeds.js.map +1 -1
  129. package/dist/web/guids.d.ts +47 -0
  130. package/dist/web/guids.d.ts.map +1 -0
  131. package/dist/web/guids.js +67 -0
  132. package/dist/web/guids.js.map +1 -0
  133. package/dist/web/index.d.ts +5 -6
  134. package/dist/web/index.d.ts.map +1 -1
  135. package/dist/web/index.js +3 -3
  136. package/dist/web/index.js.map +1 -1
  137. package/dist/web/redirects.d.ts +12 -0
  138. package/dist/web/redirects.d.ts.map +1 -1
  139. package/dist/web/redirects.js +16 -4
  140. package/dist/web/redirects.js.map +1 -1
  141. package/dist/web/render.d.ts +19 -9
  142. package/dist/web/render.d.ts.map +1 -1
  143. package/dist/web/render.js +44 -42
  144. package/dist/web/render.js.map +1 -1
  145. package/dist/web/routes.d.ts +2 -2
  146. package/dist/web/routes.d.ts.map +1 -1
  147. package/dist/web/routes.js +157 -84
  148. package/dist/web/routes.js.map +1 -1
  149. package/dist/webmention/index.d.ts +1 -1
  150. package/dist/webmention/index.d.ts.map +1 -1
  151. package/dist/webmention/index.js +1 -1
  152. package/dist/webmention/index.js.map +1 -1
  153. package/dist/webmention/links.d.ts +55 -0
  154. package/dist/webmention/links.d.ts.map +1 -1
  155. package/dist/webmention/links.js +162 -0
  156. package/dist/webmention/links.js.map +1 -1
  157. package/dist/webmention/microformats.d.ts +15 -0
  158. package/dist/webmention/microformats.d.ts.map +1 -1
  159. package/dist/webmention/microformats.js +63 -1
  160. package/dist/webmention/microformats.js.map +1 -1
  161. package/dist/webmention/pingback.js +2 -1
  162. package/dist/webmention/pingback.js.map +1 -1
  163. package/dist/webmention/receive.d.ts +5 -0
  164. package/dist/webmention/receive.d.ts.map +1 -1
  165. package/dist/webmention/receive.js +99 -3
  166. package/dist/webmention/receive.js.map +1 -1
  167. package/dist/webmention/reply-context.d.ts +15 -0
  168. package/dist/webmention/reply-context.d.ts.map +1 -1
  169. package/dist/webmention/reply-context.js +29 -0
  170. package/dist/webmention/reply-context.js.map +1 -1
  171. package/dist/webmention/reply-contexts.d.ts +6 -0
  172. package/dist/webmention/reply-contexts.d.ts.map +1 -1
  173. package/dist/webmention/reply-contexts.js +16 -10
  174. package/dist/webmention/reply-contexts.js.map +1 -1
  175. package/dist/webmention/routes.d.ts.map +1 -1
  176. package/dist/webmention/routes.js +2 -1
  177. package/dist/webmention/routes.js.map +1 -1
  178. package/dist/webmention/service.d.ts +30 -1
  179. package/dist/webmention/service.d.ts.map +1 -1
  180. package/dist/webmention/service.js +172 -32
  181. package/dist/webmention/service.js.map +1 -1
  182. package/package.json +1 -2
  183. package/themes/default/README.md +269 -95
  184. package/themes/default/layouts/base.njk +8 -0
  185. package/themes/default/layouts/comment.njk +90 -0
  186. package/themes/default/layouts/front-page.njk +9 -47
  187. package/themes/default/layouts/page.njk +2 -0
  188. package/themes/default/layouts/post.njk +14 -2
  189. package/themes/default/partials/backlinks.njk +19 -0
  190. package/themes/default/partials/cited-page.njk +3 -1
  191. package/themes/default/partials/comment-form.njk +10 -0
  192. package/themes/default/partials/comment.njk +79 -0
  193. package/themes/default/partials/conversation.njk +14 -59
  194. package/themes/default/src/style.css +42 -0
  195. package/themes/default/static/style.css +67 -0
@@ -1,4 +1,5 @@
1
- import type { AdminStore } from '../admin/store.ts';
1
+ import type { User } from '../admin/accounts.ts';
2
+ import type { AdminStore, PostComment } from '../admin/store.ts';
2
3
  import type { Document } from '../content/document.ts';
3
4
  import type { CitedPageReader } from '../content/citation.ts';
4
5
  import type { RsvpValue } from '../content/rsvp.ts';
@@ -30,11 +31,12 @@ import type { FeedComment } from './feeds.ts';
30
31
  *
31
32
  * `activitypub` is a reply, a like or a boost the site's inbox was sent.
32
33
  * `comment` is the form under the post (TASK-50). `webmention` is another
33
- * site's post pointing at this one (TASK-51). All three are the same shape and
34
- * thread together, which is the whole point of naming the source rather than
35
- * keeping three lists.
34
+ * site's post pointing at this one (TASK-51). `post` is a reply post a user of
35
+ * this site wrote, whose `in-reply-to` names the post or something said under
36
+ * it (TASK-300). All four are the same shape and thread together, which is the
37
+ * whole point of naming the source rather than keeping four lists.
36
38
  */
37
- export type InteractionSource = 'activitypub' | 'comment' | 'webmention';
39
+ export type InteractionSource = 'activitypub' | 'comment' | 'webmention' | 'post';
38
40
  /**
39
41
  * What an interaction is.
40
42
  *
@@ -71,11 +73,41 @@ export interface InteractionAuthor {
71
73
  readonly avatar: string | null;
72
74
  /** Their id, which is what identifies them however they are named. */
73
75
  readonly actorId: string | null;
76
+ /**
77
+ * Where to follow what they publish, when the site knows (TASK-324): a
78
+ * webmention author's h-card or site, or a site user's author feed. A
79
+ * visitor's own website is only what they typed, and a fediverse actor
80
+ * publishes no feed the site knows of, so both are `null`.
81
+ */
82
+ readonly feed: string | null;
83
+ /**
84
+ * The site user they are, by username, else `null`: whoever a reply post
85
+ * is by, or whoever a stored comment names (TASK-337). A theme vouches for
86
+ * the link of a site user and of nobody else.
87
+ */
88
+ readonly username: string | null;
74
89
  }
75
90
  /** One thing somebody did to a post: a reply, a like or a boost. */
76
91
  export interface Interaction {
77
92
  /** What it is called: the note's id, and what a reply to it names. */
78
93
  readonly id: string;
94
+ /**
95
+ * Its key (decision-51): a stored comment's id, else the key of its guid.
96
+ * The one thing in its anchor, `#comment-{key}`, and its replies feed,
97
+ * `/replies/{key}/`.
98
+ */
99
+ readonly key: string;
100
+ /**
101
+ * What the comments feeds call it, and what a reply to it names in
102
+ * `source:inReplyTo`: a stored form comment's page, a stored comment's
103
+ * origin or else its url, and anything else's id.
104
+ */
105
+ readonly guid: string;
106
+ /**
107
+ * Whether it was imported from another system (TASK-336): shown in the
108
+ * thread like any other, and carried by no feed and no reply count.
109
+ */
110
+ readonly migrated: boolean;
79
111
  /** Where it came from. */
80
112
  readonly source: InteractionSource;
81
113
  /** Which of the three it is. */
@@ -93,7 +125,7 @@ export interface Interaction {
93
125
  /** Whether a reader may see it. */
94
126
  readonly status: InteractionStatus;
95
127
  /** The replies to this one, oldest first. */
96
- readonly replies: Interaction[];
128
+ readonly replies: ThreadReply[];
97
129
  /**
98
130
  * What a reply that is an RSVP says (TASK-198): its `rsvp` value and the
99
131
  * words for it. A webmention carries one, and so does a fediverse answer
@@ -104,6 +136,23 @@ export interface Interaction {
104
136
  readonly label: string;
105
137
  };
106
138
  }
139
+ /**
140
+ * A comment a reader may not see, standing in the thread for the replies to it
141
+ * that a reader may (TASK-325): it is waiting for a moderator, filed as spam or
142
+ * deleted. It names nobody and says nothing, and there is one only while a
143
+ * visible reply sits under it.
144
+ */
145
+ export interface WithheldReply {
146
+ /** The hidden comment's id. */
147
+ readonly id: string;
148
+ /** Its key, so its anchor on the post is still there. */
149
+ readonly key: string;
150
+ readonly withheld: true;
151
+ /** The replies under it, oldest first, at least one of them visible. */
152
+ readonly replies: ThreadReply[];
153
+ }
154
+ /** One entry of a thread: a reply, or the placeholder for a hidden one. */
155
+ export type ThreadReply = Interaction | WithheldReply;
107
156
  /** How many of each a conversation holds. */
108
157
  export interface InteractionCounts {
109
158
  /** Replies, counted through the whole thread rather than the top of it. */
@@ -122,7 +171,7 @@ export interface InteractionCounts {
122
171
  /** Everything under one post. */
123
172
  export interface Conversation {
124
173
  /** The replies to the post itself, oldest first, each carrying its own. */
125
- readonly replies: Interaction[];
174
+ readonly replies: ThreadReply[];
126
175
  /** The likes, oldest first. */
127
176
  readonly likes: Interaction[];
128
177
  /** The boosts and the reposts, oldest first and in one list. */
@@ -145,10 +194,27 @@ export interface RsvpGroup {
145
194
  /** Each person's latest answer, oldest first, each an RSVP interaction. */
146
195
  readonly people: Interaction[];
147
196
  }
197
+ /**
198
+ * Something said in a conversation, with the reply it sits under (TASK-324):
199
+ * what the comments feeds name as what it answers.
200
+ */
201
+ export interface Placed extends Interaction {
202
+ /**
203
+ * The visible reply it answers, or `null` for the post. A hidden comment in
204
+ * between is passed over, the way the thread already passes over a
205
+ * withdrawn note, so a reader walking the feeds reaches every visible reply.
206
+ */
207
+ readonly parent: Interaction | null;
208
+ }
148
209
  /** One interaction with the post it is about, which a site-wide list needs. */
149
- export interface SiteInteraction extends Interaction {
210
+ export interface SiteInteraction extends Placed {
150
211
  /** The post it answers. */
151
212
  readonly post: Document;
213
+ /**
214
+ * Who wrote the reply it answers, when it answers one a reader can see
215
+ * (TASK-318), and `null` for an answer to the post itself.
216
+ */
217
+ readonly replyingTo: string | null;
152
218
  }
153
219
  /** What reading a conversation needs: both indexes and the site's origin. */
154
220
  export interface ConversationContext {
@@ -166,6 +232,8 @@ export interface ConversationContext {
166
232
  readonly contentDir: string;
167
233
  /** The site's public origin, for the post's object id. */
168
234
  readonly baseUrl: string;
235
+ /** Who may sign in, for naming the author of a reply post (TASK-300). */
236
+ readonly users: () => readonly User[];
169
237
  }
170
238
  /**
171
239
  * The three questions anything showing a conversation asks.
@@ -180,13 +248,10 @@ export interface ConversationReader {
180
248
  /** Everything said about one post, threaded. */
181
249
  readonly thread: (document: Document) => Conversation;
182
250
  /**
183
- * How many answers each of these posts has, by permalink: the fediverse
184
- * replies and the approved native ones together, which is what a reader
185
- * following `source:comments` would actually find on the page.
186
- *
187
- * Counted off the indexes rather than by reading each thread, because the
188
- * number goes into a feed's own validator: a feed whose comment counts moved
189
- * is a changed feed, and that has to be cheap for every item of a page.
251
+ * How many visible replies answer each of these documents directly, by
252
+ * permalink: what a reader following `source:comments` finds in its
253
+ * `/replies/` feed (TASK-324). Read off each thread, since that is the only
254
+ * reading that knows which replies a reader sees and where they sit.
190
255
  */
191
256
  readonly counts: (documents: readonly Document[]) => Map<string, number>;
192
257
  /**
@@ -198,6 +263,92 @@ export interface ConversationReader {
198
263
  * indexes have paged, so the pages are read until enough survive.
199
264
  */
200
265
  readonly latest: (limit: number) => SiteInteraction[];
266
+ /**
267
+ * One native comment as its own page reads it (TASK-318), or `undefined`
268
+ * for an id that names no approved comment written on this site. The post
269
+ * comes back in whatever state it is in, so the page can answer as the post
270
+ * itself would.
271
+ */
272
+ readonly comment: (id: string) => CommentThread | undefined;
273
+ /**
274
+ * The reply on a post that a URL names, or `undefined` (TASK-319):
275
+ * a comment by its own page or by the post's `#comment-` anchor, a
276
+ * webmention by the page it was sent from, a fediverse reply by its url or
277
+ * its id. Every stored comment counts whatever its status, because what a
278
+ * reply answers is a fact about it, and whether a reader may see the one it
279
+ * answers is decided when the thread is read.
280
+ */
281
+ readonly replyNamed: (document: Document, url: string) => Interaction | undefined;
282
+ /**
283
+ * What a URL names on this site, while a reader may see it: a reply (a
284
+ * comment by its page or its anchor, a webmention by the page it was sent
285
+ * from, a fediverse reply by its id or url, a reply post by its permalink)
286
+ * with the post it is on, or a served post or page itself (TASK-300,
287
+ * TASK-326). What a reply post answering it cites, instead of fetching a page.
288
+ */
289
+ readonly heldAt: (url: string) => HeldAt | undefined;
290
+ /**
291
+ * What a key names and its direct replies (TASK-324, decision-51), or
292
+ * `undefined`: a served post or page, or a reply a reader can see.
293
+ */
294
+ readonly repliesTo: (key: string) => RepliesOf | undefined;
295
+ /**
296
+ * The document whose conversation a URL is in (TASK-320): the post a
297
+ * comment's page or anchor is on, the post a webmention was sent to, the
298
+ * post a fediverse reply answers however deep, or the document at the URL.
299
+ */
300
+ readonly documentOf: (url: string) => Document | undefined;
301
+ /**
302
+ * Every page in the conversation a document is in that answers something
303
+ * off this site, with what a reader sees under it (TASK-320): what a
304
+ * salmention is sent from. A reply post answers its `in-reply-to`; a
305
+ * comment's own page answers the webmention reply it is under. One
306
+ * answering something here has nobody to tell: this site already knows.
307
+ */
308
+ readonly upstreams: (document: Document) => Upstream[];
309
+ }
310
+ /** One page of this site's answering a page elsewhere (TASK-320). */
311
+ export interface Upstream {
312
+ /** The document the page is, or that the comment is on. */
313
+ readonly post: Document;
314
+ /** The page, absolute: a reply post's permalink or a comment's own page. */
315
+ readonly source: string;
316
+ /** What it answers, off this site. */
317
+ readonly target: string;
318
+ /** The replies a reader sees under it, as its page prints them. */
319
+ readonly replies: readonly ThreadReply[];
320
+ }
321
+ /** What one `/replies/` feed is about, and what is in it (TASK-324). */
322
+ export interface RepliesOf {
323
+ /** The document whose conversation it is. */
324
+ readonly post: Document;
325
+ /** The reply whose replies these are, or `null` for the document's own. */
326
+ readonly reply: Interaction | null;
327
+ /** The visible replies directly under it, each carrying its own. */
328
+ readonly replies: Placed[];
329
+ }
330
+ /** What {@link ConversationReader.heldAt} found: a reply and the post it is on, or a post. */
331
+ export type HeldAt = {
332
+ readonly kind: 'reply';
333
+ readonly post: Document;
334
+ readonly reply: Interaction;
335
+ } | {
336
+ readonly kind: 'document';
337
+ readonly post: Document;
338
+ readonly author: InteractionAuthor;
339
+ };
340
+ /** A native comment, what it answers and what answers it (TASK-318). */
341
+ export interface CommentThread {
342
+ /** The post it is on. */
343
+ readonly post: Document;
344
+ /** The comment, carrying its replies at every depth as the thread does. */
345
+ readonly comment: Interaction;
346
+ /**
347
+ * What it answers, from the top-level comment down to its parent. `null`
348
+ * is an ancestor a reader may not see: one waiting for a moderator, filed
349
+ * as spam, deleted or withdrawn.
350
+ */
351
+ readonly ancestors: readonly (Interaction | null)[];
201
352
  }
202
353
  /**
203
354
  * The reader over one site's two indexes.
@@ -209,22 +360,29 @@ export interface ConversationReader {
209
360
  */
210
361
  export declare function createConversation(context: ConversationContext): ConversationReader;
211
362
  /**
212
- * The `id` a comment is anchored at on the page.
213
- *
214
- * Prefixed rather than bare so a comment can never collide with a heading
215
- * anchor the post's own Markdown produced.
363
+ * The URLs a reply post can answer a native comment by: its own page, and its
364
+ * anchor on the post at this absolute permalink.
365
+ */
366
+ export declare function commentNames(id: string, permalink: string, baseUrl: string): string[];
367
+ /**
368
+ * The stored comment holding a fediverse note or activity id as its origin:
369
+ * one imported from the site this one replaced, keyed by that id as it would
370
+ * have been had it arrived here (TASK-336). A delivery or a fetch of the same
371
+ * id is that comment again, and the stored one wins, since it is the one the
372
+ * moderator decided on and the thread anchors.
216
373
  */
217
- export declare function commentAnchor(id: string): string;
374
+ export declare function heldComment(admin: AdminStore, id: string): PostComment | undefined;
218
375
  /**
219
- * Everything said in a conversation, at every depth and in no order: the
220
- * replies and the mentions.
376
+ * The `id` a thread entry is anchored at on the page, by its key.
221
377
  *
222
- * The likes and the boosts are left out because they say nothing. A feed item
223
- * is somebody's words, and "@ada liked this" has none to carry — a reader
224
- * polling a comments feed would get an entry with an empty body and no way to
225
- * tell what it was for.
378
+ * Prefixed rather than bare so a comment can never collide with a heading
379
+ * anchor the post's own Markdown produced.
226
380
  */
227
- export declare function spokenIn(conversation: Conversation): Interaction[];
381
+ export declare function commentAnchor(key: string): string;
382
+ /** The key of the comment whose page a path is, or `undefined` (TASK-319). */
383
+ export declare function commentKeyAt(pathname: string): string | undefined;
384
+ /** What a post's comments feed carries, at every depth and in no order. */
385
+ export declare function spokenIn(conversation: Conversation): Placed[];
228
386
  /**
229
387
  * Interactions as a comments feed carries them: newest first, at most `limit`,
230
388
  * and every link absolute.
@@ -234,11 +392,16 @@ export declare function spokenIn(conversation: Conversation): Interaction[];
234
392
  * is handed over as it stands and sanitised by the feed itself, at the last
235
393
  * moment before it becomes bytes this site publishes.
236
394
  */
237
- export declare function feedComments(said: readonly (Interaction & {
395
+ export declare function feedComments(said: readonly (Placed & {
238
396
  post?: Document | undefined;
397
+ replyingTo?: string | null | undefined;
239
398
  })[], options: {
240
399
  baseUrl: string;
241
400
  limit: number;
242
401
  cited: CitedPageReader;
402
+ post?: Document | undefined;
243
403
  }): FeedComment[];
404
+ /** The entry of a thread with this key that a reader can see, at any depth. */
405
+ export declare function visibleReply(replies: readonly ThreadReply[], key: string): Interaction | undefined;
406
+ export declare function isWithheld(reply: ThreadReply): reply is WithheldReply;
244
407
  //# sourceMappingURL=conversation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/web/conversation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/web/conversation.ts"],"names":[],"mappings":"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"}