@geekity/cms 0.28.0 → 0.29.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.
- package/README.md +303 -53
- package/admin/pages/comments/all.njk +3 -1
- package/admin/pages/federation/followers.njk +8 -2
- package/dist/admin/comments.d.ts +2 -0
- package/dist/admin/comments.d.ts.map +1 -1
- package/dist/admin/comments.js +19 -49
- package/dist/admin/comments.js.map +1 -1
- package/dist/admin/documents.d.ts +5 -0
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +45 -17
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/federation.d.ts +21 -1
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +17 -7
- package/dist/admin/federation.js.map +1 -1
- package/dist/admin/store.d.ts +64 -10
- package/dist/admin/store.d.ts.map +1 -1
- package/dist/admin/store.js +166 -17
- package/dist/admin/store.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/comments/form.d.ts +3 -1
- package/dist/comments/form.d.ts.map +1 -1
- package/dist/comments/form.js +2 -1
- package/dist/comments/form.js.map +1 -1
- package/dist/comments/index.d.ts +2 -2
- package/dist/comments/index.d.ts.map +1 -1
- package/dist/comments/index.js +1 -1
- package/dist/comments/index.js.map +1 -1
- package/dist/comments/records.d.ts +24 -20
- package/dist/comments/records.d.ts.map +1 -1
- package/dist/comments/records.js +74 -23
- package/dist/comments/records.js.map +1 -1
- package/dist/comments/reply-notices.d.ts +42 -0
- package/dist/comments/reply-notices.d.ts.map +1 -0
- package/dist/comments/reply-notices.js +76 -0
- package/dist/comments/reply-notices.js.map +1 -0
- package/dist/comments/reply-post.d.ts +49 -0
- package/dist/comments/reply-post.d.ts.map +1 -0
- package/dist/comments/reply-post.js +66 -0
- package/dist/comments/reply-post.js.map +1 -0
- package/dist/comments/routes.d.ts +6 -1
- package/dist/comments/routes.d.ts.map +1 -1
- package/dist/comments/routes.js +49 -21
- package/dist/comments/routes.js.map +1 -1
- package/dist/comments/submission.d.ts +8 -25
- package/dist/comments/submission.d.ts.map +1 -1
- package/dist/comments/submission.js +19 -38
- package/dist/comments/submission.js.map +1 -1
- package/dist/comments/viewer.d.ts.map +1 -1
- package/dist/comments/viewer.js +1 -0
- package/dist/comments/viewer.js.map +1 -1
- package/dist/content/citation.d.ts +1 -0
- package/dist/content/citation.d.ts.map +1 -1
- package/dist/content/citation.js +2 -0
- package/dist/content/citation.js.map +1 -1
- package/dist/content/original.d.ts +6 -1
- package/dist/content/original.d.ts.map +1 -1
- package/dist/content/original.js +7 -4
- package/dist/content/original.js.map +1 -1
- package/dist/content/store.d.ts +43 -11
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js +170 -10
- package/dist/content/store.js.map +1 -1
- package/dist/content/sync.d.ts +8 -0
- package/dist/content/sync.d.ts.map +1 -1
- package/dist/content/sync.js +164 -71
- package/dist/content/sync.js.map +1 -1
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +2 -1
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/backfill.d.ts +114 -0
- package/dist/federation/backfill.d.ts.map +1 -0
- package/dist/federation/backfill.js +312 -0
- package/dist/federation/backfill.js.map +1 -0
- package/dist/federation/inbox.js +1 -1
- package/dist/federation/inbox.js.map +1 -1
- package/dist/federation/records.d.ts +13 -0
- package/dist/federation/records.d.ts.map +1 -1
- package/dist/federation/records.js +49 -10
- package/dist/federation/records.js.map +1 -1
- package/dist/federation/replies.d.ts +6 -0
- package/dist/federation/replies.d.ts.map +1 -1
- package/dist/federation/replies.js +18 -1
- package/dist/federation/replies.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +79 -10
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +1 -7
- package/dist/init.js.map +1 -1
- package/dist/web/context.d.ts +18 -3
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +17 -4
- package/dist/web/context.js.map +1 -1
- package/dist/web/conversation.d.ts +155 -16
- package/dist/web/conversation.d.ts.map +1 -1
- package/dist/web/conversation.js +602 -135
- package/dist/web/conversation.js.map +1 -1
- package/dist/web/documents.d.ts +0 -22
- package/dist/web/documents.d.ts.map +1 -1
- package/dist/web/documents.js +1 -34
- package/dist/web/documents.js.map +1 -1
- package/dist/web/feed-item.d.ts +12 -8
- package/dist/web/feed-item.d.ts.map +1 -1
- package/dist/web/feed-item.js +10 -10
- package/dist/web/feed-item.js.map +1 -1
- package/dist/web/feed-rss.d.ts.map +1 -1
- package/dist/web/feed-rss.js +34 -10
- package/dist/web/feed-rss.js.map +1 -1
- package/dist/web/feed-source.d.ts +30 -1
- package/dist/web/feed-source.d.ts.map +1 -1
- package/dist/web/feed-source.js +25 -0
- package/dist/web/feed-source.js.map +1 -1
- package/dist/web/feeds.d.ts +1 -1
- package/dist/web/feeds.d.ts.map +1 -1
- package/dist/web/feeds.js +7 -2
- package/dist/web/feeds.js.map +1 -1
- package/dist/web/guids.d.ts +59 -0
- package/dist/web/guids.d.ts.map +1 -0
- package/dist/web/guids.js +79 -0
- package/dist/web/guids.js.map +1 -0
- package/dist/web/index.d.ts +5 -6
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +3 -3
- package/dist/web/index.js.map +1 -1
- package/dist/web/redirects.d.ts +12 -0
- package/dist/web/redirects.d.ts.map +1 -1
- package/dist/web/redirects.js +16 -4
- package/dist/web/redirects.js.map +1 -1
- package/dist/web/render.d.ts +19 -9
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +44 -42
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts +2 -2
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +94 -31
- package/dist/web/routes.js.map +1 -1
- package/dist/webmention/index.d.ts +1 -1
- package/dist/webmention/index.d.ts.map +1 -1
- package/dist/webmention/index.js +1 -1
- package/dist/webmention/index.js.map +1 -1
- package/dist/webmention/links.d.ts +55 -0
- package/dist/webmention/links.d.ts.map +1 -1
- package/dist/webmention/links.js +162 -0
- package/dist/webmention/links.js.map +1 -1
- package/dist/webmention/microformats.d.ts +15 -0
- package/dist/webmention/microformats.d.ts.map +1 -1
- package/dist/webmention/microformats.js +63 -1
- package/dist/webmention/microformats.js.map +1 -1
- package/dist/webmention/pingback.js +2 -1
- package/dist/webmention/pingback.js.map +1 -1
- package/dist/webmention/receive.d.ts +5 -0
- package/dist/webmention/receive.d.ts.map +1 -1
- package/dist/webmention/receive.js +99 -3
- package/dist/webmention/receive.js.map +1 -1
- package/dist/webmention/reply-context.d.ts +15 -0
- package/dist/webmention/reply-context.d.ts.map +1 -1
- package/dist/webmention/reply-context.js +29 -0
- package/dist/webmention/reply-context.js.map +1 -1
- package/dist/webmention/reply-contexts.d.ts +6 -0
- package/dist/webmention/reply-contexts.d.ts.map +1 -1
- package/dist/webmention/reply-contexts.js +16 -10
- package/dist/webmention/reply-contexts.js.map +1 -1
- package/dist/webmention/routes.d.ts.map +1 -1
- package/dist/webmention/routes.js +2 -1
- package/dist/webmention/routes.js.map +1 -1
- package/dist/webmention/service.d.ts +30 -1
- package/dist/webmention/service.d.ts.map +1 -1
- package/dist/webmention/service.js +172 -32
- package/dist/webmention/service.js.map +1 -1
- package/package.json +1 -2
- package/themes/default/README.md +242 -78
- package/themes/default/layouts/base.njk +8 -0
- package/themes/default/layouts/comment.njk +90 -0
- package/themes/default/layouts/front-page.njk +9 -47
- package/themes/default/layouts/page.njk +2 -0
- package/themes/default/layouts/post.njk +14 -2
- package/themes/default/partials/backlinks.njk +19 -0
- package/themes/default/partials/cited-page.njk +3 -1
- package/themes/default/partials/comment-form.njk +10 -0
- package/themes/default/partials/comment.njk +79 -0
- package/themes/default/partials/conversation.njk +14 -59
- package/themes/default/src/style.css +42 -0
- package/themes/default/static/style.css +67 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../../src/comments/submission.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../../src/comments/submission.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,12 @@ export const COMMENT_FIELDS = {
|
|
|
62
62
|
* actually send mail (TASK-55).
|
|
63
63
|
*/
|
|
64
64
|
notify: 'notify',
|
|
65
|
+
/**
|
|
66
|
+
* "Include in posts and feeds", which only the signed-in form carries
|
|
67
|
+
* (TASK-300): ticked, the reply post is Public; left empty, Unlisted. A
|
|
68
|
+
* stranger's form has no such box, and one sent anyway is never read.
|
|
69
|
+
*/
|
|
70
|
+
listed: 'listed',
|
|
65
71
|
};
|
|
66
72
|
/** How many comments one address may post before it has to wait. */
|
|
67
73
|
export const COMMENT_RATE_LIMIT = 5;
|
|
@@ -121,47 +127,28 @@ export function commentProblems(form, signedIn = false) {
|
|
|
121
127
|
export async function submitComment(options) {
|
|
122
128
|
const { records, document, form, throttle } = options;
|
|
123
129
|
const now = options.now ?? new Date();
|
|
124
|
-
// Whether the site knows who this is. It decides the attribution, the two
|
|
125
|
-
// cheap defences and where the comment lands, so it is read once.
|
|
126
|
-
const signedIn = options.author;
|
|
127
130
|
// The honeypot first, because it costs one comparison and because a
|
|
128
131
|
// submission that tripped it should not reach anything that could tell it so.
|
|
129
|
-
|
|
130
|
-
// session is better evidence than an empty box.
|
|
131
|
-
if (signedIn === undefined && trapped(form.trap))
|
|
132
|
+
if (trapped(form.trap))
|
|
132
133
|
return refused({ kind: 'discarded' });
|
|
133
|
-
const problems = commentProblems(form
|
|
134
|
+
const problems = commentProblems(form);
|
|
134
135
|
if (Object.keys(problems).length > 0)
|
|
135
136
|
return refused({ kind: 'invalid', problems });
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const timing = formTimingRefusal(form.loaded, now);
|
|
140
|
-
if (timing !== undefined)
|
|
141
|
-
return refused({ kind: timing });
|
|
142
|
-
}
|
|
143
|
-
// The rate limit stays either way. It is not about proving somebody is a
|
|
144
|
-
// person; it is about what one address may do in ten minutes, and a stolen
|
|
145
|
-
// session is exactly the case it would be wanted for.
|
|
137
|
+
const timing = formTimingRefusal(form.loaded, now);
|
|
138
|
+
if (timing !== undefined)
|
|
139
|
+
return refused({ kind: timing });
|
|
146
140
|
const keys = commentKeys(options.address);
|
|
147
141
|
const wait = throttle.retryAfter(keys);
|
|
148
142
|
if (wait !== undefined)
|
|
149
143
|
return refused({ kind: 'rate-limited', retryAfter: wait });
|
|
150
144
|
const markdown = form.body.trim();
|
|
151
|
-
const author =
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
: {
|
|
160
|
-
name: signedIn.name,
|
|
161
|
-
url: signedIn.url,
|
|
162
|
-
email: signedIn.email,
|
|
163
|
-
avatar: null,
|
|
164
|
-
};
|
|
145
|
+
const author = {
|
|
146
|
+
name: form.name.trim(),
|
|
147
|
+
url: normalizeWebsite(form.url.trim()) ?? null,
|
|
148
|
+
email: form.email.trim() === '' ? null : form.email.trim(),
|
|
149
|
+
// A form asks for no picture: only a webmention brings one (TASK-51).
|
|
150
|
+
avatar: null,
|
|
151
|
+
};
|
|
165
152
|
const proposed = {
|
|
166
153
|
slug: document.slug,
|
|
167
154
|
permalink: document.permalink,
|
|
@@ -180,13 +167,7 @@ export async function submitComment(options) {
|
|
|
180
167
|
};
|
|
181
168
|
const outcome = await intakeComment({
|
|
182
169
|
records,
|
|
183
|
-
|
|
184
|
-
// post and approve any comment. A comment of theirs waiting in a queue for
|
|
185
|
-
// them to approve would be theatre, and a spam service has no say in what
|
|
186
|
-
// the owner of the site says — so a signed-in comment arrives at the
|
|
187
|
-
// intake as exactly what it is, the site's own author writing, and is
|
|
188
|
-
// approved on arrival with no call to the checker (TASK-103).
|
|
189
|
-
origin: signedIn === undefined ? 'form' : 'moderator',
|
|
170
|
+
origin: 'form',
|
|
190
171
|
comment: proposed,
|
|
191
172
|
post: {
|
|
192
173
|
title: postLabel(document, options.cited),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submission.js","sourceRoot":"","sources":["../../src/comments/submission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,OAAO,GACR,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,6EAA6E;AAC7E,6EAA6E;AAC7E,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAEnD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,gDAAgD;IAChD,IAAI,EAAE,MAAM;IACZ,sCAAsC;IACtC,IAAI,EAAE,MAAM;IACZ,8CAA8C;IAC9C,KAAK,EAAE,OAAO;IACd,+BAA+B;IAC/B,GAAG,EAAE,KAAK;IACV,iDAAiD;IACjD,IAAI,EAAE,MAAM;IACZ,uEAAuE;IACvE,SAAS,EAAE,aAAa;IACxB,sEAAsE;IACtE,IAAI,EAAE,eAAe;IACrB,yDAAyD;IACzD,MAAM,EAAE,iBAAiB;IACzB;;;;;OAKG;IACH,IAAI,EAAE,UAAU;IAChB;;;;;;OAMG;IACH,MAAM,EAAE,QAAQ;CACR,CAAC;
|
|
1
|
+
{"version":3,"file":"submission.js","sourceRoot":"","sources":["../../src/comments/submission.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../src/comments/viewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,aAAa,GAAG,SAAS,CAGnF;AAED,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,eAAe,GAAG,SAAS,CAgBnF;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,eAAe,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../src/comments/viewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,aAAa,GAAG,SAAS,CAGnF;AAED,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,eAAe,GAAG,SAAS,CAgBnF;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,eAAe,GAAG,aAAa,CAW/E"}
|
package/dist/comments/viewer.js
CHANGED
|
@@ -48,6 +48,7 @@ export function commenterOf({ user, csrfToken }) {
|
|
|
48
48
|
// What a byline would print for them, on the same rule: a user who has
|
|
49
49
|
// written no display name is called by their username, which is what
|
|
50
50
|
// their archive is under anyway.
|
|
51
|
+
username: user.username,
|
|
51
52
|
name: user.profile?.displayName ?? user.username,
|
|
52
53
|
url: authorHref(user.username),
|
|
53
54
|
email: user.email ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/comments/viewer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAsB;IACtD,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAClE,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,CAAsB;IACpD,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEvC,wEAAwE;IACxE,yEAAyE;IACzE,6EAA6E;IAC7E,0EAA0E;IAC1E,kCAAkC;IAClC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,OAAO,EAAE,MAAM,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAE9C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAmB;IAC9D,OAAO;QACL,uEAAuE;QACvE,qEAAqE;QACrE,iCAAiC;QACjC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ;QAChD,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QACzB,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/comments/viewer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAsB;IACtD,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAClE,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,CAAsB;IACpD,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEvC,wEAAwE;IACxE,yEAAyE;IACzE,6EAA6E;IAC7E,0EAA0E;IAC1E,kCAAkC;IAClC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,OAAO,EAAE,MAAM,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAE9C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAmB;IAC9D,OAAO;QACL,uEAAuE;QACvE,qEAAqE;QACrE,iCAAiC;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ;QAChD,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QACzB,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -18,6 +18,7 @@ export declare function citedImageAlt(document: Pick<Document, 'extra' | 'title'
|
|
|
18
18
|
export declare function citedHost(url: string): string;
|
|
19
19
|
export interface CitedPage {
|
|
20
20
|
readonly name?: string;
|
|
21
|
+
readonly comment?: true;
|
|
21
22
|
readonly author?: {
|
|
22
23
|
readonly name: string;
|
|
23
24
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"citation.d.ts","sourceRoot":"","sources":["../../src/content/citation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAElD,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAE9E;AAED,eAAO,MAAM,0BAA0B,cAAc,CAAC;AAEtD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,MAAM,CAGjF;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM7C;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;AAErE,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAIxD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"citation.d.ts","sourceRoot":"","sources":["../../src/content/citation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAElD,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAE9E;AAED,eAAO,MAAM,0BAA0B,cAAc,CAAC;AAEtD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,MAAM,CAGjF;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM7C;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;AAErE,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAIxD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAMjF;AAED,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAIrE,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,mBAAmB,YAAI,WAAW,EAAE,SAAS,EAAE,aAAa,CAAU,CAAC;AAEpF,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,sCAAsC;AACtC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,QAAQ,EAAE,CAKhF;AAED,+DAA+D;AAC/D,wBAAgB,UAAU,CACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EACjC,QAAQ,EAAE,gBAAgB,GACzB,MAAM,GAAG,SAAS,CAEpB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGnD"}
|
package/dist/content/citation.js
CHANGED
|
@@ -22,6 +22,8 @@ export function citesAnImage(context) {
|
|
|
22
22
|
export function citedPageName(url, context) {
|
|
23
23
|
if (context?.name !== undefined)
|
|
24
24
|
return context.name;
|
|
25
|
+
if (context?.comment === true)
|
|
26
|
+
return 'a comment';
|
|
25
27
|
if (context?.author !== undefined)
|
|
26
28
|
return 'a post';
|
|
27
29
|
const image = context !== undefined && citesAnImage(context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"citation.js","sourceRoot":"","sources":["../../src/content/citation.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,SAAS,CAAC;AAElD,MAAM,UAAU,YAAY,CAAC,KAAwC;IACnE,OAAO,KAAK,CAAC,wBAAwB,CAAC,KAAK,KAAK,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,WAAW,CAAC;AAEtD,MAAM,UAAU,aAAa,CAAC,QAA2C;IACvE,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACvD,OAAO,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"citation.js","sourceRoot":"","sources":["../../src/content/citation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
export declare const ORIGINAL_FRONT_MATTER_KEY = "canonical_href";
|
|
2
|
-
export declare
|
|
2
|
+
export declare const ORIGINAL_NAME_FRONT_MATTER_KEY = "canonical_name";
|
|
3
|
+
export interface OriginalPublication {
|
|
4
|
+
url: string;
|
|
5
|
+
name?: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare function originalOf(extra: Readonly<Record<string, unknown>>): OriginalPublication | undefined;
|
|
3
8
|
//# sourceMappingURL=original.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"original.d.ts","sourceRoot":"","sources":["../../src/content/original.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"original.d.ts","sourceRoot":"","sources":["../../src/content/original.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAC1D,eAAO,MAAM,8BAA8B,mBAAmB,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,mBAAmB,GAAG,SAAS,CAQjC"}
|
package/dist/content/original.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { isWebUrl } from './enclosure.js';
|
|
2
|
-
// The key an Eleventy site in the wild already used, so its files keep their
|
|
3
|
-
// values.
|
|
4
2
|
export const ORIGINAL_FRONT_MATTER_KEY = 'canonical_href';
|
|
5
|
-
export
|
|
3
|
+
export const ORIGINAL_NAME_FRONT_MATTER_KEY = 'canonical_name';
|
|
4
|
+
export function originalOf(extra) {
|
|
6
5
|
const value = extra[ORIGINAL_FRONT_MATTER_KEY];
|
|
7
6
|
if (typeof value !== 'string')
|
|
8
7
|
return undefined;
|
|
9
8
|
const url = value.trim();
|
|
10
|
-
|
|
9
|
+
if (!isWebUrl(url))
|
|
10
|
+
return undefined;
|
|
11
|
+
const name = extra[ORIGINAL_NAME_FRONT_MATTER_KEY];
|
|
12
|
+
const trimmed = typeof name === 'string' ? name.trim() : '';
|
|
13
|
+
return trimmed === '' ? { url } : { url, name: trimmed };
|
|
11
14
|
}
|
|
12
15
|
//# sourceMappingURL=original.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"original.js","sourceRoot":"","sources":["../../src/content/original.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,
|
|
1
|
+
{"version":3,"file":"original.js","sourceRoot":"","sources":["../../src/content/original.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AAC1D,MAAM,CAAC,MAAM,8BAA8B,GAAG,gBAAgB,CAAC;AAO/D,MAAM,UAAU,UAAU,CACxB,KAAwC;IAExC,MAAM,KAAK,GAAG,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3D,CAAC"}
|
package/dist/content/store.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Document, DocumentType } from './document.ts';
|
|
2
|
+
import type { RedirectTable } from '../web/redirects.ts';
|
|
2
3
|
export { DATABASE_FILE } from '../cache.ts';
|
|
3
4
|
/** Directory name that marks a document as thrown away but not yet deleted. */
|
|
4
5
|
export declare const TRASH_DIRECTORY = "_trash";
|
|
@@ -20,6 +21,19 @@ export interface OpenContentStoreOptions {
|
|
|
20
21
|
* to {@link systemClock}; a test hands one it can move.
|
|
21
22
|
*/
|
|
22
23
|
now?: Clock | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* The site's base URL, which the `/replies/` keys of a document are worked
|
|
26
|
+
* out against (TASK-327). Opening with a different one than last time works
|
|
27
|
+
* every key out again; opening with none leaves new rows without keys.
|
|
28
|
+
*/
|
|
29
|
+
baseUrl?: string | undefined;
|
|
30
|
+
}
|
|
31
|
+
/** What, beyond the index, decides which links land on a document. */
|
|
32
|
+
export interface BacklinkSite {
|
|
33
|
+
/** The site's declared redirects, as they are now. */
|
|
34
|
+
readonly redirects?: RedirectTable | undefined;
|
|
35
|
+
/** Whether the document is the page the Reading setting shows at `/`. */
|
|
36
|
+
readonly home?: boolean | undefined;
|
|
23
37
|
}
|
|
24
38
|
/**
|
|
25
39
|
* The derived index over the Markdown files.
|
|
@@ -110,17 +124,6 @@ export interface ContentStore {
|
|
|
110
124
|
getBySlug(slug: string): Document | undefined;
|
|
111
125
|
/** Published, untrashed, already-due, listed posts, newest first. */
|
|
112
126
|
listPosts(options?: ListOptions): Document[];
|
|
113
|
-
/**
|
|
114
|
-
* Published, untrashed, already-due posts dated at or after an instant,
|
|
115
|
-
* newest first: everything since the start of a month, or a week, or a year.
|
|
116
|
-
*
|
|
117
|
-
* A query of its own rather than an option on {@link ContentStore.listPosts}
|
|
118
|
-
* because it is a different question — "what has been written lately", not
|
|
119
|
-
* "the front of the archive" — and because an option honoured by one listing
|
|
120
|
-
* and silently dropped by the counts beside it would be a trap. The instant
|
|
121
|
-
* is a {@link dateSortKey}, so the comparison is between two UTC ISO strings.
|
|
122
|
-
*/
|
|
123
|
-
listPostsSince(instant: string): Document[];
|
|
124
127
|
/**
|
|
125
128
|
* The published posts either side of one by date: what a theme links as
|
|
126
129
|
* previous and next under an entry.
|
|
@@ -200,6 +203,35 @@ export interface ContentStore {
|
|
|
200
203
|
* which is the same thing as whether a follower holds a copy.
|
|
201
204
|
*/
|
|
202
205
|
listFederated(options?: ListOptions): Document[];
|
|
206
|
+
/**
|
|
207
|
+
* Served posts whose `in-reply-to` is exactly one of these URLs, unlisted
|
|
208
|
+
* ones included, newest first (TASK-300): the reply posts a thread shows.
|
|
209
|
+
* Naming nothing returns nothing.
|
|
210
|
+
*/
|
|
211
|
+
listRepliesTo(targets: readonly string[]): Document[];
|
|
212
|
+
/** Served posts with an `in-reply-to`, unlisted ones included, newest first. */
|
|
213
|
+
listReplyPosts(options?: ListOptions): Document[];
|
|
214
|
+
/**
|
|
215
|
+
* The served documents a `/replies/` key names (TASK-327): the ones whose
|
|
216
|
+
* feed guid has that key, and the reply posts whose object id has it. One
|
|
217
|
+
* indexed lookup, so a key that names nothing costs nothing else.
|
|
218
|
+
*/
|
|
219
|
+
listByRepliesKey(key: string): Document[];
|
|
220
|
+
/**
|
|
221
|
+
* The listed posts and pages whose body links to `document`, newest first
|
|
222
|
+
* (TASK-322): its backlinks.
|
|
223
|
+
*
|
|
224
|
+
* A link names a path rather than a document, and is matched to one here,
|
|
225
|
+
* on read: a link to the document's permalink, or to a `redirect_from` of it
|
|
226
|
+
* that still leads to it, whichever way the link was spelled; to `/` when
|
|
227
|
+
* `home` says the document is the homepage; and to any URL the site answers
|
|
228
|
+
* with a redirect that ends on one of those (TASK-330). So a link written
|
|
229
|
+
* before its target existed counts once the target does, a post that
|
|
230
|
+
* becomes public later counts from then, and an edited redirect file moves
|
|
231
|
+
* a backlink, with nothing rewritten. A document linking to itself is not
|
|
232
|
+
* its own backlink.
|
|
233
|
+
*/
|
|
234
|
+
listBacklinks(document: Document, site?: BacklinkSite): Document[];
|
|
203
235
|
/** Every indexed path, sorted. What a sync compares the content tree against. */
|
|
204
236
|
listPaths(): string[];
|
|
205
237
|
/** How many documents there are of each kind. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/content/store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAuB,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/content/store.ts"],"names":[],"mappings":"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"}
|
package/dist/content/store.js
CHANGED
|
@@ -3,6 +3,11 @@ import { featuredPosts, PINNED_FRONT_MATTER_KEY } from './pinned.js';
|
|
|
3
3
|
import { searchExpression, searchText, SNIPPET_CLOSE, SNIPPET_OPEN } from './search.js';
|
|
4
4
|
import { tagKey, uniqueTags } from './tags.js';
|
|
5
5
|
import { VISIBILITIES, VISIBILITY_FRONT_MATTER_KEY } from './visibility.js';
|
|
6
|
+
import { repliesKey } from '../web/feed-source.js';
|
|
7
|
+
import { feedGuid, postObjectId } from '../web/guids.js';
|
|
8
|
+
import { absoluteUrl } from '../web/negotiate.js';
|
|
9
|
+
import { NO_REDIRECTS } from '../web/redirects.js';
|
|
10
|
+
import { linksInto, ownSiteLinks, siteLinkKey, spelling } from '../webmention/links.js';
|
|
6
11
|
export { DATABASE_FILE } from '../cache.js';
|
|
7
12
|
/** Directory name that marks a document as thrown away but not yet deleted. */
|
|
8
13
|
export const TRASH_DIRECTORY = '_trash';
|
|
@@ -124,10 +129,12 @@ export function openContentStore(options) {
|
|
|
124
129
|
insert: db.prepare(`
|
|
125
130
|
INSERT INTO documents (
|
|
126
131
|
path, type, slug, permalink, title, date, date_sort, updated, draft, trashed,
|
|
127
|
-
description, author, in_reply_to, activitypub, extra, body, html, hash
|
|
132
|
+
description, author, in_reply_to, activitypub, extra, body, html, hash,
|
|
133
|
+
replies_key, reply_post_key, keys_base
|
|
128
134
|
) VALUES (
|
|
129
135
|
:path, :type, :slug, :permalink, :title, :date, :date_sort, :updated, :draft, :trashed,
|
|
130
|
-
:description, :author, :in_reply_to, :activitypub, :extra, :body, :html, :hash
|
|
136
|
+
:description, :author, :in_reply_to, :activitypub, :extra, :body, :html, :hash,
|
|
137
|
+
:replies_key, :reply_post_key, :keys_base
|
|
131
138
|
)
|
|
132
139
|
ON CONFLICT (path) DO UPDATE SET
|
|
133
140
|
type = excluded.type,
|
|
@@ -146,7 +153,21 @@ export function openContentStore(options) {
|
|
|
146
153
|
extra = excluded.extra,
|
|
147
154
|
body = excluded.body,
|
|
148
155
|
html = excluded.html,
|
|
149
|
-
hash = excluded.hash
|
|
156
|
+
hash = excluded.hash,
|
|
157
|
+
replies_key = excluded.replies_key,
|
|
158
|
+
reply_post_key = excluded.reply_post_key,
|
|
159
|
+
keys_base = excluded.keys_base
|
|
160
|
+
`),
|
|
161
|
+
rowsKeyedElsewhere: db.prepare('SELECT * FROM documents WHERE keys_base IS NOT ?'),
|
|
162
|
+
writeKeys: db.prepare(`
|
|
163
|
+
UPDATE documents
|
|
164
|
+
SET replies_key = :replies_key, reply_post_key = :reply_post_key, keys_base = :keys_base
|
|
165
|
+
WHERE path = :path
|
|
166
|
+
`),
|
|
167
|
+
byRepliesKey: db.prepare(`
|
|
168
|
+
SELECT * FROM documents
|
|
169
|
+
WHERE (replies_key = ?1 OR reply_post_key = ?1) AND ${SERVED_CLAUSE}
|
|
170
|
+
ORDER BY replies_key = ?1 DESC, date_sort DESC, path DESC
|
|
150
171
|
`),
|
|
151
172
|
deleteTags: db.prepare('DELETE FROM document_tags WHERE path = ?'),
|
|
152
173
|
insertTag: db.prepare('INSERT INTO document_tags (path, tag, key, position) VALUES (?, ?, ?, ?)'),
|
|
@@ -156,6 +177,9 @@ export function openContentStore(options) {
|
|
|
156
177
|
remove: db.prepare('DELETE FROM documents WHERE path = ?'),
|
|
157
178
|
byPath: db.prepare('SELECT * FROM documents WHERE path = ?'),
|
|
158
179
|
byPermalink: db.prepare('SELECT * FROM documents WHERE permalink = ? ORDER BY trashed, path DESC LIMIT 1'),
|
|
180
|
+
deleteLinks: db.prepare('DELETE FROM document_links WHERE path = ?'),
|
|
181
|
+
insertLink: db.prepare('INSERT INTO document_links (path, target, query) VALUES (?, ?, ?)'),
|
|
182
|
+
servedAt: db.prepare(`SELECT 1 FROM documents WHERE permalink = ? AND ${SERVED_CLAUSE} LIMIT 1`),
|
|
159
183
|
deleteRedirects: db.prepare('DELETE FROM document_redirects WHERE path = ?'),
|
|
160
184
|
insertRedirect: db.prepare('INSERT INTO document_redirects (path, url, position) VALUES (?, ?, ?)'),
|
|
161
185
|
redirectsFor: db.prepare('SELECT url FROM document_redirects WHERE path = ? ORDER BY position'),
|
|
@@ -226,6 +250,27 @@ export function openContentStore(options) {
|
|
|
226
250
|
`),
|
|
227
251
|
};
|
|
228
252
|
let open = true;
|
|
253
|
+
/**
|
|
254
|
+
* Work out again everything worked out against another base, or none: the
|
|
255
|
+
* `/replies/` keys and the links to the site's own pages.
|
|
256
|
+
*/
|
|
257
|
+
function refreshAgainstBase(baseUrl) {
|
|
258
|
+
db.exec('BEGIN');
|
|
259
|
+
try {
|
|
260
|
+
for (const row of statements.rowsKeyedElsewhere.all(baseUrl)) {
|
|
261
|
+
const document = toDocument(row, [], []);
|
|
262
|
+
statements.writeKeys.run({ path: document.path, ...repliesKeysOf(document, baseUrl) });
|
|
263
|
+
writeLinks(document, baseUrl);
|
|
264
|
+
}
|
|
265
|
+
db.exec('COMMIT');
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
db.exec('ROLLBACK');
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (options.baseUrl !== undefined)
|
|
273
|
+
refreshAgainstBase(options.baseUrl);
|
|
229
274
|
let cachedSpellings;
|
|
230
275
|
const staleKeys = new Set();
|
|
231
276
|
const MOST_KEYS_REFRESHED = 500;
|
|
@@ -285,13 +330,32 @@ export function openContentStore(options) {
|
|
|
285
330
|
function hydrateAll(rows) {
|
|
286
331
|
return rows.map(hydrateOne);
|
|
287
332
|
}
|
|
333
|
+
function writeLinks(document, baseUrl) {
|
|
334
|
+
statements.deleteLinks.run(document.path);
|
|
335
|
+
if (baseUrl === undefined)
|
|
336
|
+
return;
|
|
337
|
+
const pageUrl = absoluteUrl(document.permalink, baseUrl);
|
|
338
|
+
for (const { path, query } of ownSiteLinks(document.html, pageUrl, baseUrl)) {
|
|
339
|
+
statements.insertLink.run(document.path, path, query);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* The paths a link to `document` may name: its permalink, and each of its
|
|
344
|
+
* former ones that the site still answers with it rather than with a live
|
|
345
|
+
* document holding it now or another document claiming it.
|
|
346
|
+
*/
|
|
347
|
+
function linkKeysOf(document) {
|
|
348
|
+
const former = (document.redirectFrom ?? []).filter((url) => statements.byPermalink.get(url) === undefined &&
|
|
349
|
+
text(statements.byFormerPermalink.get(url, nowKey())?.['path']) === document.path);
|
|
350
|
+
return [...new Set([document.permalink, ...former].map(siteLinkKey))];
|
|
351
|
+
}
|
|
288
352
|
function writeOne(document) {
|
|
289
353
|
const contentPath = document.path;
|
|
290
354
|
markTagsStaleBeforeWrite(contentPath);
|
|
291
355
|
for (const tag of document.tags)
|
|
292
356
|
staleKeys.add(tagKey(tag));
|
|
293
357
|
try {
|
|
294
|
-
statements.insert.run(toRow(document));
|
|
358
|
+
statements.insert.run({ ...toRow(document), ...repliesKeysOf(document, options.baseUrl) });
|
|
295
359
|
}
|
|
296
360
|
catch (error) {
|
|
297
361
|
throw translateWriteError(error, document, statements.pathForPermalink);
|
|
@@ -308,6 +372,7 @@ export function openContentStore(options) {
|
|
|
308
372
|
(document.redirectFrom ?? []).forEach((url, position) => {
|
|
309
373
|
statements.insertRedirect.run(contentPath, url, position);
|
|
310
374
|
});
|
|
375
|
+
writeLinks(document, options.baseUrl);
|
|
311
376
|
// The words it is found by. Replaced rather than updated, because an FTS5
|
|
312
377
|
// table has no key to conflict on: the path is only a column in it.
|
|
313
378
|
const words = searchText(document);
|
|
@@ -408,6 +473,7 @@ export function openContentStore(options) {
|
|
|
408
473
|
db.exec('DELETE FROM document_tags');
|
|
409
474
|
db.exec('DELETE FROM document_categories');
|
|
410
475
|
db.exec('DELETE FROM document_redirects');
|
|
476
|
+
db.exec('DELETE FROM document_links');
|
|
411
477
|
db.exec('DELETE FROM documents');
|
|
412
478
|
db.exec('COMMIT');
|
|
413
479
|
}
|
|
@@ -436,12 +502,6 @@ export function openContentStore(options) {
|
|
|
436
502
|
listPosts(options = {}) {
|
|
437
503
|
return select(["type = 'post'", LISTED_CLAUSE], [nowKey()], options);
|
|
438
504
|
},
|
|
439
|
-
listPostsSince(instant) {
|
|
440
|
-
const since = dateSortKey(instant);
|
|
441
|
-
if (since === null)
|
|
442
|
-
return [];
|
|
443
|
-
return select(["type = 'post'", LISTED_CLAUSE, 'date_sort >= ?'], [nowKey(), since], {});
|
|
444
|
-
},
|
|
445
505
|
neighbours(document) {
|
|
446
506
|
// A page is nobody's neighbour, and neither is a document the archive
|
|
447
507
|
// does not order: without a date there is no place in the sequence to be
|
|
@@ -515,6 +575,46 @@ export function openContentStore(options) {
|
|
|
515
575
|
listFederated(options = {}) {
|
|
516
576
|
return select([`type = 'post'`, FEDERATED_CLAUSE], [], options);
|
|
517
577
|
},
|
|
578
|
+
listRepliesTo(targets) {
|
|
579
|
+
const wanted = [...new Set(targets)];
|
|
580
|
+
if (wanted.length === 0)
|
|
581
|
+
return [];
|
|
582
|
+
return select(["type = 'post'", SERVED_CLAUSE, `in_reply_to IN (${wanted.map(() => '?').join(', ')})`], [nowKey(), ...wanted], {});
|
|
583
|
+
},
|
|
584
|
+
listReplyPosts(options = {}) {
|
|
585
|
+
return select(["type = 'post'", SERVED_CLAUSE, 'in_reply_to IS NOT NULL'], [nowKey()], options);
|
|
586
|
+
},
|
|
587
|
+
listByRepliesKey(key) {
|
|
588
|
+
return hydrateAll(statements.byRepliesKey.all(key, nowKey()));
|
|
589
|
+
},
|
|
590
|
+
listBacklinks(document, site = {}) {
|
|
591
|
+
const now = nowKey();
|
|
592
|
+
const answeredAt = linkKeysOf(document);
|
|
593
|
+
if (site.home === true)
|
|
594
|
+
answeredAt.push('/');
|
|
595
|
+
const into = linksInto(site.redirects ?? NO_REDIRECTS, answeredAt, (sitePath) => [sitePath, `${sitePath}/`].some((url) => statements.servedAt.get(url, now) !== undefined ||
|
|
596
|
+
statements.byFormerPermalink.get(url, now) !== undefined));
|
|
597
|
+
return select([
|
|
598
|
+
LISTED_CLAUSE,
|
|
599
|
+
'path <> ?',
|
|
600
|
+
`path IN (
|
|
601
|
+
SELECT path FROM document_links
|
|
602
|
+
WHERE target IN (SELECT value FROM json_each(?))
|
|
603
|
+
AND (query = '' OR target || '?' || query NOT IN (SELECT value FROM json_each(?)))
|
|
604
|
+
UNION
|
|
605
|
+
SELECT path FROM document_links
|
|
606
|
+
WHERE target IN (SELECT value FROM json_each(?))
|
|
607
|
+
AND target || '?' || query IN (SELECT value FROM json_each(?))
|
|
608
|
+
)`,
|
|
609
|
+
], [
|
|
610
|
+
now,
|
|
611
|
+
document.path,
|
|
612
|
+
JSON.stringify(into.paths),
|
|
613
|
+
JSON.stringify(into.intercepted),
|
|
614
|
+
JSON.stringify(into.queries.map((link) => link.path)),
|
|
615
|
+
JSON.stringify(into.queries.map(spelling)),
|
|
616
|
+
], {});
|
|
617
|
+
},
|
|
518
618
|
listPaths() {
|
|
519
619
|
return statements.paths.all().map((row) => String(row['path']));
|
|
520
620
|
},
|
|
@@ -688,6 +788,23 @@ function limitParams(options) {
|
|
|
688
788
|
return [];
|
|
689
789
|
return [options.limit ?? -1, options.offset ?? 0];
|
|
690
790
|
}
|
|
791
|
+
/**
|
|
792
|
+
* The `/replies/` keys of a document (TASK-327): its feed guid's, and for a
|
|
793
|
+
* reply post its object id's, which is what it is named by in the thread it
|
|
794
|
+
* answers. The two differ only for a reply post with a stored `guid`. Both are
|
|
795
|
+
* worked out against `baseUrl`, which is recorded beside them so a change of
|
|
796
|
+
* site URL is noticed on the next open; with no base there are no keys.
|
|
797
|
+
*/
|
|
798
|
+
function repliesKeysOf(document, baseUrl) {
|
|
799
|
+
if (baseUrl === undefined)
|
|
800
|
+
return { replies_key: null, reply_post_key: null, keys_base: null };
|
|
801
|
+
const isReplyPost = document.type === 'post' && document.inReplyTo !== undefined;
|
|
802
|
+
return {
|
|
803
|
+
replies_key: repliesKey(feedGuid(document, baseUrl)),
|
|
804
|
+
reply_post_key: isReplyPost ? repliesKey(postObjectId(document, baseUrl)) : null,
|
|
805
|
+
keys_base: baseUrl,
|
|
806
|
+
};
|
|
807
|
+
}
|
|
691
808
|
/** A {@link Document} as the columns of the `documents` table. */
|
|
692
809
|
function toRow(document) {
|
|
693
810
|
return {
|
|
@@ -932,5 +1049,48 @@ const MIGRATIONS = [
|
|
|
932
1049
|
DELETE FROM documents;
|
|
933
1050
|
`,
|
|
934
1051
|
},
|
|
1052
|
+
{
|
|
1053
|
+
version: 9,
|
|
1054
|
+
sql: `
|
|
1055
|
+
-- A thread finds the reply posts answering it by their \`in-reply-to\`
|
|
1056
|
+
-- (TASK-300).
|
|
1057
|
+
CREATE INDEX documents_in_reply_to ON documents (in_reply_to);
|
|
1058
|
+
`,
|
|
1059
|
+
},
|
|
1060
|
+
{
|
|
1061
|
+
version: 10,
|
|
1062
|
+
sql: `
|
|
1063
|
+
-- What a \`/replies/\` key names (TASK-327), so resolving one is a lookup
|
|
1064
|
+
-- rather than a walk of the site. The keys hang off the base URL, which
|
|
1065
|
+
-- a migration does not know: the rows are filled when the store is
|
|
1066
|
+
-- opened with one, as they are whenever that base changes.
|
|
1067
|
+
ALTER TABLE documents ADD COLUMN replies_key TEXT;
|
|
1068
|
+
ALTER TABLE documents ADD COLUMN reply_post_key TEXT;
|
|
1069
|
+
ALTER TABLE documents ADD COLUMN keys_base TEXT;
|
|
1070
|
+
CREATE INDEX documents_replies_key ON documents (replies_key);
|
|
1071
|
+
CREATE INDEX documents_reply_post_key ON documents (reply_post_key);
|
|
1072
|
+
`,
|
|
1073
|
+
},
|
|
1074
|
+
{
|
|
1075
|
+
version: 11,
|
|
1076
|
+
sql: `
|
|
1077
|
+
-- The pages of the site each document links to (TASK-322), as the paths
|
|
1078
|
+
-- the links name rather than the documents they lead to, which are
|
|
1079
|
+
-- matched when a document's backlinks are read. A link keeps its query
|
|
1080
|
+
-- (TASK-330), sorted as a redirect source's is, because the site answers
|
|
1081
|
+
-- \`/?p=7\` with a redirect rather than with \`/\`. Like the \`/replies/\`
|
|
1082
|
+
-- keys they are read against the base URL, so forgetting every row's
|
|
1083
|
+
-- base is what makes the next open with one fill them from the stored
|
|
1084
|
+
-- HTML, with no scan of the files.
|
|
1085
|
+
CREATE TABLE document_links (
|
|
1086
|
+
path TEXT NOT NULL REFERENCES documents (path) ON DELETE CASCADE,
|
|
1087
|
+
target TEXT NOT NULL,
|
|
1088
|
+
query TEXT NOT NULL DEFAULT '',
|
|
1089
|
+
PRIMARY KEY (path, target, query)
|
|
1090
|
+
);
|
|
1091
|
+
CREATE INDEX document_links_target ON document_links (target);
|
|
1092
|
+
UPDATE documents SET keys_base = NULL;
|
|
1093
|
+
`,
|
|
1094
|
+
},
|
|
935
1095
|
];
|
|
936
1096
|
//# sourceMappingURL=store.js.map
|