@geekity/cms 0.15.0 → 0.17.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 +108 -0
- package/admin/pages/documents/editor.njk +51 -0
- package/admin/pages/documents/syndication.njk +110 -0
- package/admin/pages/federation/followers.njk +7 -0
- package/admin/pages/users/activity-entry.njk +58 -0
- package/admin/pages/users/activity.njk +66 -0
- package/admin/static/admin.css +11 -0
- package/dist/admin/documents.d.ts +101 -0
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +199 -67
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/federation.d.ts +15 -0
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +19 -0
- package/dist/admin/federation.js.map +1 -1
- package/dist/admin/menu.d.ts.map +1 -1
- package/dist/admin/menu.js +7 -1
- package/dist/admin/menu.js.map +1 -1
- package/dist/admin/photo-field.d.ts +39 -0
- package/dist/admin/photo-field.d.ts.map +1 -0
- package/dist/admin/photo-field.js +91 -0
- package/dist/admin/photo-field.js.map +1 -0
- package/dist/admin/preview.d.ts.map +1 -1
- package/dist/admin/preview.js +6 -1
- package/dist/admin/preview.js.map +1 -1
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +8 -0
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/syndication-targets.d.ts +57 -0
- package/dist/admin/syndication-targets.d.ts.map +1 -0
- package/dist/admin/syndication-targets.js +266 -0
- package/dist/admin/syndication-targets.js.map +1 -0
- package/dist/admin/templates.d.ts +3 -0
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +3 -0
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/uploads.d.ts +6 -0
- package/dist/admin/uploads.d.ts.map +1 -1
- package/dist/admin/uploads.js +1 -1
- package/dist/admin/uploads.js.map +1 -1
- package/dist/admin/users.d.ts +8 -0
- package/dist/admin/users.d.ts.map +1 -1
- package/dist/admin/users.js +8 -0
- package/dist/admin/users.js.map +1 -1
- package/dist/content/citation.d.ts +36 -0
- package/dist/content/citation.d.ts.map +1 -0
- package/dist/content/citation.js +31 -0
- package/dist/content/citation.js.map +1 -0
- package/dist/content/index.d.ts +2 -0
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +1 -0
- package/dist/content/index.js.map +1 -1
- package/dist/content/photo.d.ts +45 -0
- package/dist/content/photo.d.ts.map +1 -0
- package/dist/content/photo.js +55 -0
- package/dist/content/photo.js.map +1 -0
- package/dist/content/post-type.d.ts +20 -8
- package/dist/content/post-type.d.ts.map +1 -1
- package/dist/content/post-type.js +17 -0
- package/dist/content/post-type.js.map +1 -1
- package/dist/env.d.ts +7 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +59 -5
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/citations.d.ts +38 -0
- package/dist/federation/citations.d.ts.map +1 -0
- package/dist/federation/citations.js +98 -0
- package/dist/federation/citations.js.map +1 -0
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +79 -31
- package/dist/federation/delivery.js.map +1 -1
- package/dist/images/alt-text.d.ts +6 -0
- package/dist/images/alt-text.d.ts.map +1 -1
- package/dist/images/alt-text.js +10 -0
- package/dist/images/alt-text.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -2
- package/dist/index.js.map +1 -1
- package/dist/indieauth/activity-log.d.ts +112 -0
- package/dist/indieauth/activity-log.d.ts.map +1 -0
- package/dist/indieauth/activity-log.js +325 -0
- package/dist/indieauth/activity-log.js.map +1 -0
- package/dist/indieauth/app-activity.d.ts +14 -0
- package/dist/indieauth/app-activity.d.ts.map +1 -0
- package/dist/indieauth/app-activity.js +106 -0
- package/dist/indieauth/app-activity.js.map +1 -0
- package/dist/indieauth/bearer.d.ts +6 -1
- package/dist/indieauth/bearer.d.ts.map +1 -1
- package/dist/indieauth/bearer.js +40 -12
- package/dist/indieauth/bearer.js.map +1 -1
- package/dist/indieauth/consent.d.ts.map +1 -1
- package/dist/indieauth/consent.js +5 -2
- package/dist/indieauth/consent.js.map +1 -1
- package/dist/indieauth/discovery.d.ts +10 -4
- package/dist/indieauth/discovery.d.ts.map +1 -1
- package/dist/indieauth/discovery.js +22 -7
- package/dist/indieauth/discovery.js.map +1 -1
- package/dist/indieauth/token.d.ts.map +1 -1
- package/dist/indieauth/token.js +3 -1
- package/dist/indieauth/token.js.map +1 -1
- package/dist/micropub/create.d.ts +56 -0
- package/dist/micropub/create.d.ts.map +1 -0
- package/dist/micropub/create.js +200 -0
- package/dist/micropub/create.js.map +1 -0
- package/dist/micropub/endpoint.d.ts +21 -0
- package/dist/micropub/endpoint.d.ts.map +1 -0
- package/dist/micropub/endpoint.js +354 -0
- package/dist/micropub/endpoint.js.map +1 -0
- package/dist/micropub/media.d.ts +14 -0
- package/dist/micropub/media.d.ts.map +1 -0
- package/dist/micropub/media.js +94 -0
- package/dist/micropub/media.js.map +1 -0
- package/dist/micropub/update.d.ts +44 -0
- package/dist/micropub/update.d.ts.map +1 -0
- package/dist/micropub/update.js +133 -0
- package/dist/micropub/update.js.map +1 -0
- package/dist/web/context.d.ts +42 -3
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +41 -1
- package/dist/web/context.js.map +1 -1
- package/dist/web/render.d.ts +15 -0
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +16 -0
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.js +2 -2
- package/dist/webmention/index.d.ts +2 -0
- package/dist/webmention/index.d.ts.map +1 -1
- package/dist/webmention/index.js +1 -0
- package/dist/webmention/index.js.map +1 -1
- package/dist/webmention/service.d.ts.map +1 -1
- package/dist/webmention/service.js +96 -18
- package/dist/webmention/service.js.map +1 -1
- package/dist/webmention/syndication.d.ts +135 -0
- package/dist/webmention/syndication.d.ts.map +1 -0
- package/dist/webmention/syndication.js +337 -0
- package/dist/webmention/syndication.js.map +1 -0
- package/package.json +1 -1
- package/themes/default/README.md +40 -9
- package/themes/default/layouts/post.njk +19 -6
- package/themes/default/partials/citations.njk +17 -0
- package/themes/default/partials/jsonld.njk +12 -1
- package/themes/default/partials/photos.njk +10 -0
- package/themes/default/partials/post-list.njk +7 -0
- package/themes/default/src/style.css +9 -0
- package/themes/default/static/style.css +16 -0
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { readSiteSettings } from '../admin/settings.js';
|
|
2
|
+
import { citationsOf } from '../content/citation.js';
|
|
2
3
|
import { replyTarget } from '../content/post-type.js';
|
|
3
4
|
import { isFederatedDocument } from '../federation/article.js';
|
|
4
5
|
import { absoluteUrl } from '../web/negotiate.js';
|
|
5
6
|
import { discoverEndpoint, WEBMENTION_USER_AGENT } from './discovery.js';
|
|
6
7
|
import { externalLinks, externalTarget } from './links.js';
|
|
7
8
|
import { verifyWebmention } from './receive.js';
|
|
9
|
+
import { selectedTargets, syndicationCopies, syndicationTargetsReader } from './syndication.js';
|
|
8
10
|
/**
|
|
9
11
|
* Telling the pages a post links to that it links to them.
|
|
10
12
|
*
|
|
@@ -51,13 +53,22 @@ export function createWebmentionService(options) {
|
|
|
51
53
|
function sending() {
|
|
52
54
|
return readSiteSettings(config.contentDir).webmentionsSend;
|
|
53
55
|
}
|
|
54
|
-
|
|
56
|
+
const targets = syndicationTargetsReader(config.contentDir);
|
|
57
|
+
const copies = syndicationCopies(config.contentDir);
|
|
58
|
+
/** The language a post that names none is in, as the file says now. */
|
|
59
|
+
function siteLanguage() {
|
|
60
|
+
return readSiteSettings(config.contentDir).language;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Tell one page about one post, and answer with what happened and, when the
|
|
64
|
+
* page made a copy of the post, where the copy is.
|
|
65
|
+
*/
|
|
55
66
|
async function tell(slug, source, target) {
|
|
56
67
|
const endpoint = await discoverEndpoint(target);
|
|
57
68
|
if (endpoint === undefined) {
|
|
58
69
|
// Not a failure: most of the web takes no webmentions, and recording it
|
|
59
70
|
// is what tells a person why nothing went.
|
|
60
|
-
return record(slug, source, target, null, 'none', null);
|
|
71
|
+
return { sent: record(slug, source, target, null, 'none', null) };
|
|
61
72
|
}
|
|
62
73
|
try {
|
|
63
74
|
const response = await fetch(endpoint, {
|
|
@@ -73,27 +84,55 @@ export function createWebmentionService(options) {
|
|
|
73
84
|
if (!response.ok) {
|
|
74
85
|
const error = `${endpoint} answered ${String(response.status)}`;
|
|
75
86
|
logger.warn(`Could not send a webmention for ${source}: ${error}`);
|
|
76
|
-
return record(slug, source, target, endpoint, 'failed', error);
|
|
87
|
+
return { sent: record(slug, source, target, endpoint, 'failed', error) };
|
|
77
88
|
}
|
|
78
|
-
return
|
|
89
|
+
return {
|
|
90
|
+
sent: record(slug, source, target, endpoint, 'sent', null),
|
|
91
|
+
copy: copyOf(response, endpoint),
|
|
92
|
+
};
|
|
79
93
|
}
|
|
80
94
|
catch (thrown) {
|
|
81
95
|
const error = messageOf(thrown);
|
|
82
96
|
logger.warn(`Could not send a webmention for ${source}: ${error}`);
|
|
83
|
-
return record(slug, source, target, endpoint, 'failed', error);
|
|
97
|
+
return { sent: record(slug, source, target, endpoint, 'failed', error) };
|
|
84
98
|
}
|
|
85
99
|
}
|
|
86
100
|
/** Write one outcome down. */
|
|
87
101
|
function record(slug, source, target, endpoint, status, error) {
|
|
88
102
|
return admin.recordSentWebmention({ slug, source, target, endpoint, status, error });
|
|
89
103
|
}
|
|
104
|
+
/** The URLs of the targets a version of a post selects. */
|
|
105
|
+
function selectedUrls(document) {
|
|
106
|
+
if (document === undefined)
|
|
107
|
+
return [];
|
|
108
|
+
return selectedTargets(document, targets(), siteLanguage()).map((target) => target.url);
|
|
109
|
+
}
|
|
90
110
|
/** Tell every one of a post's targets, one after another. */
|
|
91
|
-
async function tellAll(slug, source,
|
|
111
|
+
async function tellAll(slug, source, links) {
|
|
92
112
|
const outcomes = [];
|
|
93
|
-
for (const target of
|
|
113
|
+
for (const target of links)
|
|
94
114
|
outcomes.push(await tell(slug, source, target));
|
|
95
115
|
return outcomes;
|
|
96
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Bring the post's recorded copies in line with what was just sent
|
|
119
|
+
* (decision-26): a target the post selects keeps the copy it answered with,
|
|
120
|
+
* and one only an earlier version selected, or any of a post nobody can
|
|
121
|
+
* read, claims none. A target's URL is the one it had for the version that
|
|
122
|
+
* selected it, since it can follow the post's language (TASK-156).
|
|
123
|
+
*/
|
|
124
|
+
async function keepCopies(permalink, versions, current, outcomes) {
|
|
125
|
+
const targeted = new Set(versions.flatMap((version) => selectedUrls(version)));
|
|
126
|
+
const selected = new Set(selectedUrls(current));
|
|
127
|
+
for (const { sent, copy } of outcomes) {
|
|
128
|
+
if (!targeted.has(sent.target))
|
|
129
|
+
continue;
|
|
130
|
+
if (!selected.has(sent.target))
|
|
131
|
+
await copies.write(permalink, sent.target, undefined);
|
|
132
|
+
else if (copy !== undefined)
|
|
133
|
+
await copies.write(permalink, sent.target, copy);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
97
136
|
return {
|
|
98
137
|
handle(change) {
|
|
99
138
|
// A full scan is a rebuild of the index, not news about the site.
|
|
@@ -116,10 +155,22 @@ export function createWebmentionService(options) {
|
|
|
116
155
|
// it was showing. That is how a webmention is withdrawn — there is no
|
|
117
156
|
// other way to say it.
|
|
118
157
|
const source = absoluteUrl(document.permalink, config.baseUrl);
|
|
119
|
-
const
|
|
120
|
-
if (
|
|
158
|
+
const links = targetsOf([change.previous, change.next], targets(), config.baseUrl, siteLanguage());
|
|
159
|
+
if (links.length === 0)
|
|
121
160
|
return;
|
|
122
|
-
|
|
161
|
+
// A post that moved is a new source to its targets, which answer with
|
|
162
|
+
// their copies of it under its new permalink.
|
|
163
|
+
const moved = change.previous !== undefined &&
|
|
164
|
+
change.next !== undefined &&
|
|
165
|
+
change.previous.permalink !== change.next.permalink
|
|
166
|
+
? change.previous.permalink
|
|
167
|
+
: undefined;
|
|
168
|
+
const current = isNowPublic ? change.next : undefined;
|
|
169
|
+
enqueue(async () => {
|
|
170
|
+
if (moved !== undefined)
|
|
171
|
+
await copies.forget(moved);
|
|
172
|
+
await keepCopies(document.permalink, [change.previous, change.next], current, await tellAll(document.slug, source, links));
|
|
173
|
+
}).catch((thrown) => {
|
|
123
174
|
logger.warn(`A webmention failed: ${messageOf(thrown)}`);
|
|
124
175
|
});
|
|
125
176
|
},
|
|
@@ -130,12 +181,13 @@ export function createWebmentionService(options) {
|
|
|
130
181
|
const source = absoluteUrl(document.permalink, config.baseUrl);
|
|
131
182
|
if (!sending())
|
|
132
183
|
return { slug, source, sent: [] };
|
|
133
|
-
const
|
|
134
|
-
return await enqueue(async () =>
|
|
135
|
-
slug,
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
184
|
+
const links = targetsOf([document], targets(), config.baseUrl, siteLanguage());
|
|
185
|
+
return await enqueue(async () => {
|
|
186
|
+
const outcomes = await tellAll(slug, source, links);
|
|
187
|
+
const current = isPublic(document, config.now()) ? document : undefined;
|
|
188
|
+
await keepCopies(document.permalink, [document], current, outcomes);
|
|
189
|
+
return { slug, source, sent: outcomes.map((one) => one.sent) };
|
|
190
|
+
});
|
|
139
191
|
},
|
|
140
192
|
receive(incoming) {
|
|
141
193
|
const checked = checking.then(async () => {
|
|
@@ -175,9 +227,10 @@ export function createWebmentionService(options) {
|
|
|
175
227
|
}
|
|
176
228
|
/**
|
|
177
229
|
* Every external page any of these versions of a post links to, in order: the
|
|
178
|
-
* post it replies to first, then the links in its body
|
|
230
|
+
* post it replies to first, then what it reposts, likes or bookmarks, then the links in its body, then the syndication
|
|
231
|
+
* targets it selects, which the theme links to inside its h-entry.
|
|
179
232
|
*/
|
|
180
|
-
function targetsOf(documents, baseUrl) {
|
|
233
|
+
function targetsOf(documents, declared, baseUrl, siteLanguage) {
|
|
181
234
|
const targets = new Set();
|
|
182
235
|
for (const document of documents) {
|
|
183
236
|
if (document === undefined)
|
|
@@ -185,11 +238,36 @@ function targetsOf(documents, baseUrl) {
|
|
|
185
238
|
const reply = externalTarget(replyTarget(document), baseUrl);
|
|
186
239
|
if (reply !== undefined)
|
|
187
240
|
targets.add(reply);
|
|
241
|
+
for (const { url } of citationsOf(document.extra)) {
|
|
242
|
+
const cited = externalTarget(url, baseUrl);
|
|
243
|
+
if (cited !== undefined)
|
|
244
|
+
targets.add(cited);
|
|
245
|
+
}
|
|
188
246
|
for (const target of externalLinks(document.html, baseUrl))
|
|
189
247
|
targets.add(target);
|
|
248
|
+
for (const target of selectedTargets(document, declared, siteLanguage))
|
|
249
|
+
targets.add(target.url);
|
|
190
250
|
}
|
|
191
251
|
return [...targets];
|
|
192
252
|
}
|
|
253
|
+
/**
|
|
254
|
+
* Where a target says its copy of the post is: the `Location` of a 201 or 202,
|
|
255
|
+
* as IndieNews and Bridgy Publish answer, resolved against the endpoint.
|
|
256
|
+
*/
|
|
257
|
+
function copyOf(response, endpoint) {
|
|
258
|
+
if (response.status !== 201 && response.status !== 202)
|
|
259
|
+
return undefined;
|
|
260
|
+
const location = response.headers.get('location');
|
|
261
|
+
if (location === null || location === '')
|
|
262
|
+
return undefined;
|
|
263
|
+
try {
|
|
264
|
+
const url = new URL(location, endpoint);
|
|
265
|
+
return url.protocol === 'http:' || url.protocol === 'https:' ? url.href : undefined;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
193
271
|
/** Whether a version of a document was one a stranger could read. */
|
|
194
272
|
function isPublic(document, now) {
|
|
195
273
|
return document !== undefined && isFederatedDocument(document, now);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/webmention/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/webmention/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { Document } from '../content/document.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Syndication targets (TASK-155): services such as IndieNews and Bridgy
|
|
4
|
+
* Publish that take a copy of a post when it links to them and sends them a
|
|
5
|
+
* webmention, and answer with the URL of the copy they made.
|
|
6
|
+
*
|
|
7
|
+
* Nothing here names a service. A site declares its targets in
|
|
8
|
+
* {@link SYNDICATION_TARGETS_FILE}; a post selects some with its
|
|
9
|
+
* `syndicate-to` list or by carrying a target's tag; the theme links to each
|
|
10
|
+
* one inside the post's h-entry; the sender notifies them as it notifies any
|
|
11
|
+
* linked page; and the URL each one answers with is kept in
|
|
12
|
+
* {@link SYNDICATION_FILE} (decision-26) and printed as `u-syndication`.
|
|
13
|
+
*/
|
|
14
|
+
/** Where a site declares its targets, relative to the content directory. */
|
|
15
|
+
export declare const SYNDICATION_TARGETS_FILE = "_data/syndicationTargets.json";
|
|
16
|
+
/**
|
|
17
|
+
* Where the copies targets answered with are kept, relative to the content
|
|
18
|
+
* directory: one object keyed by a post's permalink, each mapping a target's
|
|
19
|
+
* URL to the copy it made (decision-26). Eleventy reads it as `syndication`.
|
|
20
|
+
*/
|
|
21
|
+
export declare const SYNDICATION_FILE = "_data/syndication.json";
|
|
22
|
+
/** The front matter key a post lists the ids of its targets under. */
|
|
23
|
+
export declare const SYNDICATE_TO_FRONT_MATTER_KEY = "syndicate-to";
|
|
24
|
+
/** The front matter key, and mf2 property, for the URLs of a post's copies. */
|
|
25
|
+
export declare const SYNDICATION_FRONT_MATTER_KEY = "syndication";
|
|
26
|
+
/** What a target's `url` may hold to follow the post's language (TASK-156). */
|
|
27
|
+
export declare const LANGUAGE_PLACEHOLDER = "{lang}";
|
|
28
|
+
/** One place a post can be syndicated to. */
|
|
29
|
+
export interface SyndicationTarget {
|
|
30
|
+
/** What `syndicate-to` names it by, and its Micropub uid. */
|
|
31
|
+
readonly id: string;
|
|
32
|
+
/** What the editor's checkbox and the post's link say. */
|
|
33
|
+
readonly name: string;
|
|
34
|
+
/**
|
|
35
|
+
* The page the post links to and the webmention is sent to. As declared it
|
|
36
|
+
* may hold {@link LANGUAGE_PLACEHOLDER}; a target {@link selectedTargets}
|
|
37
|
+
* answers with has it filled for the post.
|
|
38
|
+
*/
|
|
39
|
+
readonly url: string;
|
|
40
|
+
/** A tag that selects this target without the post listing it. */
|
|
41
|
+
readonly tag?: string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* The languages, as canonical BCP 47 tags, the target takes posts in. A post
|
|
44
|
+
* in any other language does not select it. Absent means every language.
|
|
45
|
+
*/
|
|
46
|
+
readonly languages?: readonly string[] | undefined;
|
|
47
|
+
}
|
|
48
|
+
/** The declared targets, and a sentence for each entry that was not one. */
|
|
49
|
+
export interface ParsedSyndicationTargets {
|
|
50
|
+
readonly targets: readonly SyndicationTarget[];
|
|
51
|
+
readonly problems: readonly string[];
|
|
52
|
+
}
|
|
53
|
+
/** The keys a target is declared with, in the order a form or a file lists them. */
|
|
54
|
+
export type SyndicationTargetField = 'id' | 'name' | 'url' | 'tag' | 'languages';
|
|
55
|
+
/** A sentence for each key of one entry that is wrong. */
|
|
56
|
+
export type SyndicationTargetProblems = Partial<Record<SyndicationTargetField, string>>;
|
|
57
|
+
/** One entry checked: the target it declares, or what is wrong with each key. */
|
|
58
|
+
export type CheckedSyndicationTarget = {
|
|
59
|
+
readonly target: SyndicationTarget;
|
|
60
|
+
} | {
|
|
61
|
+
readonly problems: SyndicationTargetProblems;
|
|
62
|
+
};
|
|
63
|
+
/** One entry of the file as written, and what it declares or why it declares nothing. */
|
|
64
|
+
export type SyndicationEntry = {
|
|
65
|
+
readonly raw: unknown;
|
|
66
|
+
readonly target: SyndicationTarget;
|
|
67
|
+
} | {
|
|
68
|
+
readonly raw: unknown;
|
|
69
|
+
readonly problems: readonly string[];
|
|
70
|
+
};
|
|
71
|
+
/** The file's text read as a list of entries, or the one reason it is not a list. */
|
|
72
|
+
export type SyndicationEntries = {
|
|
73
|
+
readonly entries: readonly SyndicationEntry[];
|
|
74
|
+
} | {
|
|
75
|
+
readonly problem: string;
|
|
76
|
+
};
|
|
77
|
+
/** Read the targets file's text. An entry that is not a target is reported and left out. */
|
|
78
|
+
export declare function parseSyndicationTargets(text: string): ParsedSyndicationTargets;
|
|
79
|
+
/**
|
|
80
|
+
* Every entry of the targets file's text, each with the target it declares or
|
|
81
|
+
* its problems, in file order. A later entry repeating an earlier one's id
|
|
82
|
+
* declares nothing, so the first one wins.
|
|
83
|
+
*/
|
|
84
|
+
export declare function syndicationEntries(text: string): SyndicationEntries;
|
|
85
|
+
/** What an id another target already has is told. */
|
|
86
|
+
export declare function repeatedIdProblem(id: string): string;
|
|
87
|
+
/**
|
|
88
|
+
* One entry as a target, or a sentence for each key that is wrong. The one
|
|
89
|
+
* rule a target is read by, whether it comes from the file or from the admin's
|
|
90
|
+
* form; whether its id is unique depends on the other entries, so that is the
|
|
91
|
+
* caller's.
|
|
92
|
+
*/
|
|
93
|
+
export declare function checkSyndicationTarget(entry: Readonly<Record<string, unknown>>): CheckedSyndicationTarget;
|
|
94
|
+
/**
|
|
95
|
+
* The targets a site declares, read from its content directory.
|
|
96
|
+
*
|
|
97
|
+
* Read on every call and parsed again only when the bytes change, the way the
|
|
98
|
+
* reply contexts are, so a target added by hand is offered on the next page.
|
|
99
|
+
*/
|
|
100
|
+
export interface SyndicationTargetsReader {
|
|
101
|
+
(): readonly SyndicationTarget[];
|
|
102
|
+
}
|
|
103
|
+
/** A reader over one content directory's targets file. A missing file declares none. */
|
|
104
|
+
export declare function syndicationTargetsReader(contentDir: string): SyndicationTargetsReader;
|
|
105
|
+
/** What is wrong with a content directory's targets file, for the boot log. */
|
|
106
|
+
export declare function syndicationTargetProblems(contentDir: string): readonly string[];
|
|
107
|
+
/**
|
|
108
|
+
* The declared targets a post selects, in the order the site declares them,
|
|
109
|
+
* each with its `url` filled for the post: those its `syndicate-to` names, and
|
|
110
|
+
* those whose tag it carries. An id nobody declared selects nothing.
|
|
111
|
+
*
|
|
112
|
+
* The post's language is its own `lang`, else `siteLanguage` (TASK-156). A
|
|
113
|
+
* target that lists `languages` is selected only for a post in one of them or
|
|
114
|
+
* in a regional form of one, so `de-AT` goes to a target that lists `de`, and
|
|
115
|
+
* {@link LANGUAGE_PLACEHOLDER} takes the listed tag; without a list it takes
|
|
116
|
+
* the post's. The one place the URL is decided, so the theme's link, the
|
|
117
|
+
* webmention and the stored copy's key cannot disagree.
|
|
118
|
+
*/
|
|
119
|
+
export declare function selectedTargets(document: Pick<Document, 'tags' | 'extra'>, targets: readonly SyndicationTarget[], siteLanguage: string): SyndicationTarget[];
|
|
120
|
+
/** The ids a post's `syndicate-to` lists, as written. */
|
|
121
|
+
export declare function syndicateToOf(extra: Record<string, unknown>): string[];
|
|
122
|
+
/** The copies an author listed by hand under `syndication`, each an http or https URL. */
|
|
123
|
+
export declare function handSyndicationOf(extra: Record<string, unknown>): string[];
|
|
124
|
+
/** The copies targets answered with, kept in {@link SYNDICATION_FILE}. */
|
|
125
|
+
export interface SyndicationCopies {
|
|
126
|
+
/** The copies one post has, by the target URL that made each. Never touches the network. */
|
|
127
|
+
read(permalink: string): Readonly<Record<string, string>>;
|
|
128
|
+
/** Set or, with `undefined`, remove one target's copy of one post. */
|
|
129
|
+
write(permalink: string, target: string, copy: string | undefined): Promise<void>;
|
|
130
|
+
/** Forget every copy of a post, as when it moves to another permalink. */
|
|
131
|
+
forget(permalink: string): Promise<void>;
|
|
132
|
+
}
|
|
133
|
+
/** The copies file of one content directory. */
|
|
134
|
+
export declare function syndicationCopies(contentDir: string): SyndicationCopies;
|
|
135
|
+
//# sourceMappingURL=syndication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syndication.d.ts","sourceRoot":"","sources":["../../src/webmention/syndication.ts"],"names":[],"mappings":"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"}
|