@geekity/cms 0.14.0 → 0.16.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 +270 -52
- package/admin/pages/documents/editor.njk +120 -0
- package/admin/pages/documents/syndication.njk +110 -0
- package/admin/pages/federation/followers.njk +7 -0
- package/admin/pages/media/library.njk +4 -3
- package/admin/pages/settings/general.njk +44 -0
- package/admin/static/admin.css +44 -0
- package/dist/admin/documents.d.ts +104 -0
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +220 -55
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/enclosure-field.d.ts +91 -0
- package/dist/admin/enclosure-field.d.ts.map +1 -0
- package/dist/admin/enclosure-field.js +282 -0
- package/dist/admin/enclosure-field.js.map +1 -0
- 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/media.d.ts +7 -2
- package/dist/admin/media.d.ts.map +1 -1
- package/dist/admin/media.js +4 -2
- package/dist/admin/media.js.map +1 -1
- package/dist/admin/menu.d.ts.map +1 -1
- package/dist/admin/menu.js +3 -0
- 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 +4 -0
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/settings-general.d.ts.map +1 -1
- package/dist/admin/settings-general.js +36 -2
- package/dist/admin/settings-general.js.map +1 -1
- package/dist/admin/settings-page.d.ts.map +1 -1
- package/dist/admin/settings-page.js +1 -2
- package/dist/admin/settings-page.js.map +1 -1
- package/dist/admin/settings.d.ts +26 -0
- package/dist/admin/settings.d.ts.map +1 -1
- package/dist/admin/settings.js +88 -2
- package/dist/admin/settings.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 +1 -0
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +1 -0
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/uploads.d.ts +13 -2
- package/dist/admin/uploads.d.ts.map +1 -1
- package/dist/admin/uploads.js +23 -5
- package/dist/admin/uploads.js.map +1 -1
- package/dist/config.d.ts +17 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -7
- package/dist/config.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/enclosure.d.ts +69 -0
- package/dist/content/enclosure.d.ts.map +1 -0
- package/dist/content/enclosure.js +165 -0
- package/dist/content/enclosure.js.map +1 -0
- package/dist/content/index.d.ts +5 -1
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +2 -0
- package/dist/content/index.js.map +1 -1
- package/dist/content/media.d.ts +15 -2
- package/dist/content/media.d.ts.map +1 -1
- package/dist/content/media.js +92 -9
- package/dist/content/media.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/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +93 -10
- 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/images/icons.d.ts +5 -0
- package/dist/images/icons.d.ts.map +1 -1
- package/dist/images/icons.js +13 -8
- package/dist/images/icons.js.map +1 -1
- package/dist/images/paths.d.ts +1 -1
- package/dist/images/paths.d.ts.map +1 -1
- package/dist/images/paths.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -4
- package/dist/index.js.map +1 -1
- package/dist/indieauth/bearer.d.ts +6 -1
- package/dist/indieauth/bearer.d.ts.map +1 -1
- package/dist/indieauth/bearer.js +39 -12
- package/dist/indieauth/bearer.js.map +1 -1
- package/dist/indieauth/discovery.d.ts +9 -4
- package/dist/indieauth/discovery.d.ts.map +1 -1
- package/dist/indieauth/discovery.js +18 -7
- package/dist/indieauth/discovery.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 +353 -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 +93 -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/assets.d.ts +14 -0
- package/dist/web/assets.d.ts.map +1 -1
- package/dist/web/assets.js +56 -1
- package/dist/web/assets.js.map +1 -1
- package/dist/web/context.d.ts +68 -3
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +56 -1
- package/dist/web/context.js.map +1 -1
- package/dist/web/feed-atom.d.ts.map +1 -1
- package/dist/web/feed-atom.js +20 -0
- package/dist/web/feed-atom.js.map +1 -1
- package/dist/web/feed-item.d.ts +19 -0
- package/dist/web/feed-item.d.ts.map +1 -1
- package/dist/web/feed-item.js +22 -0
- package/dist/web/feed-item.js.map +1 -1
- package/dist/web/feed-json.d.ts +13 -0
- package/dist/web/feed-json.d.ts.map +1 -1
- package/dist/web/feed-json.js +15 -0
- package/dist/web/feed-json.js.map +1 -1
- package/dist/web/feed-rss.d.ts.map +1 -1
- package/dist/web/feed-rss.js +59 -2
- package/dist/web/feed-rss.js.map +1 -1
- package/dist/web/feed-xml.d.ts +7 -1
- package/dist/web/feed-xml.d.ts.map +1 -1
- package/dist/web/feed-xml.js +8 -2
- package/dist/web/feed-xml.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 +6 -0
- package/dist/web/feeds.js.map +1 -1
- package/dist/web/index.d.ts +4 -1
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +2 -0
- package/dist/web/index.js.map +1 -1
- package/dist/web/license.d.ts +94 -0
- package/dist/web/license.d.ts.map +1 -0
- package/dist/web/license.js +116 -0
- package/dist/web/license.js.map +1 -0
- package/dist/web/oembed.d.ts.map +1 -1
- package/dist/web/oembed.js +1 -2
- package/dist/web/oembed.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 +27 -2
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +10 -6
- package/dist/web/routes.js.map +1 -1
- package/dist/web/share-image.d.ts +7 -7
- package/dist/web/share-image.d.ts.map +1 -1
- package/dist/web/share-image.js +8 -7
- package/dist/web/share-image.js.map +1 -1
- 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 +121 -37
- package/themes/default/layouts/base.njk +3 -4
- package/themes/default/layouts/post.njk +23 -6
- package/themes/default/partials/citations.njk +17 -0
- package/themes/default/partials/jsonld.njk +15 -6
- package/themes/default/partials/photos.njk +10 -0
- package/themes/default/partials/post-list.njk +7 -0
- package/themes/default/partials/recording.njk +41 -0
- package/themes/default/src/style.css +25 -0
- package/themes/default/static/style.css +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syndication-targets.d.ts","sourceRoot":"","sources":["../../src/admin/syndication-targets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAa5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AAEvD,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,uBAAgC,CAAC;AAEtE,gCAAgC;AAChC,eAAO,MAAM,2BAA2B,2BAAoC,CAAC;AAE7E,mCAAmC;AACnC,eAAO,MAAM,8BAA8B,8BAAuC,CAAC;AAEnF,iDAAiD;AACjD,eAAO,MAAM,yBAAyB;IACpC,yEAAyE;oBAClE,OAAO;IACd,sFAAsF;kBACjF,KAAK;iBACN,IAAI;mBACF,MAAM;kBACP,KAAK;kBACL,KAAK;IACV,wDAAwD;wBAC7C,WAAW;CAC4D,CAAC;AA4CrF,iFAAiF;AACjF,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,EACrB,OAAO,EAAE,8BAA8B,GACtC,IAAI,CA8FN"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Posts > Syndication (TASK-218): the services a post can be sent to, as
|
|
3
|
+
* `content/_data/syndicationTargets.json` declares them.
|
|
4
|
+
*
|
|
5
|
+
* The file stays the source of truth (decision-9, decision-26). The screen
|
|
6
|
+
* reads it on every request and writes it back, so the editor's checkboxes,
|
|
7
|
+
* Micropub's `q=syndicate-to` and the webmention sender, which all read the
|
|
8
|
+
* file through `syndicationTargetsReader`, offer a change on the next request.
|
|
9
|
+
*
|
|
10
|
+
* Every entry the file holds is a panel, the broken ones too: an entry that
|
|
11
|
+
* declares nothing is drawn with what is wrong with it and can be fixed or
|
|
12
|
+
* removed here, which is the only place a site owner without a shell would
|
|
13
|
+
* ever see it. A panel names its entry by position and by the JSON it held
|
|
14
|
+
* when the page was drawn, and a save or a delete is refused when the file no
|
|
15
|
+
* longer holds that JSON there, so a change made elsewhere in the meantime is
|
|
16
|
+
* never overwritten or removed by mistake.
|
|
17
|
+
*/
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import { readFileIfPresentSync, withFileLock, writeFileAtomicallySync } from '../files/atomic.js';
|
|
20
|
+
import { checkSyndicationTarget, repeatedIdProblem, SYNDICATION_TARGETS_FILE, syndicationEntries, } from '../webmention/syndication.js';
|
|
21
|
+
import { flash } from './flash.js';
|
|
22
|
+
import { ADMIN_PREFIX } from './session.js';
|
|
23
|
+
import { ADMIN_TEMPLATES } from './templates.js';
|
|
24
|
+
/**
|
|
25
|
+
* The child of Posts the screen is. Under Posts, beside Categories and Tags,
|
|
26
|
+
* because only a post is syndicated; not under Settings, whose children are
|
|
27
|
+
* the settings pages and nothing else.
|
|
28
|
+
*/
|
|
29
|
+
export const SYNDICATION_TARGETS_CHILD = 'syndication';
|
|
30
|
+
/** Where the screen lives, and where one entry's panel saves to. */
|
|
31
|
+
export const SYNDICATION_TARGETS_PATH = `${ADMIN_PREFIX}/syndication`;
|
|
32
|
+
/** Where the Add form posts. */
|
|
33
|
+
export const ADD_SYNDICATION_TARGET_PATH = `${SYNDICATION_TARGETS_PATH}/add`;
|
|
34
|
+
/** Where a Remove button posts. */
|
|
35
|
+
export const DELETE_SYNDICATION_TARGET_PATH = `${SYNDICATION_TARGETS_PATH}/delete`;
|
|
36
|
+
/** The fields the forms on the screen submit. */
|
|
37
|
+
export const SYNDICATION_TARGET_FIELDS = {
|
|
38
|
+
/** Which entry a save or a remove is about: its position in the file. */
|
|
39
|
+
entry: 'entry',
|
|
40
|
+
/** The entry's JSON when the page was drawn, so a changed file is not overwritten. */
|
|
41
|
+
was: 'was',
|
|
42
|
+
id: 'id',
|
|
43
|
+
name: 'name',
|
|
44
|
+
url: 'url',
|
|
45
|
+
tag: 'tag',
|
|
46
|
+
/** The language tags, separated by commas or spaces. */
|
|
47
|
+
languages: 'languages',
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Register the screen, the save of one entry, the add and the remove. Behind
|
|
51
|
+
* the admin's guard like the settings pages: there is one role, so whoever is
|
|
52
|
+
* signed in may change site settings, and anyone else is sent to the login
|
|
53
|
+
* form.
|
|
54
|
+
*/
|
|
55
|
+
export function mountSyndicationTargetsScreen(app, options) {
|
|
56
|
+
const { render } = options;
|
|
57
|
+
app.get(SYNDICATION_TARGETS_PATH, (c) => render(c, ADMIN_TEMPLATES.syndication, screen(c)));
|
|
58
|
+
app.post(SYNDICATION_TARGETS_PATH, async (c) => {
|
|
59
|
+
const body = await c.req.parseBody();
|
|
60
|
+
const form = formOf(body);
|
|
61
|
+
const index = indexOf(body);
|
|
62
|
+
return answer(c, `target-${String(index)}`, form, {
|
|
63
|
+
kind: 'save',
|
|
64
|
+
form,
|
|
65
|
+
index,
|
|
66
|
+
was: text(body[SYNDICATION_TARGET_FIELDS.was]),
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
app.post(ADD_SYNDICATION_TARGET_PATH, async (c) => {
|
|
70
|
+
const form = formOf(await c.req.parseBody());
|
|
71
|
+
return answer(c, 'target-new', form, { kind: 'add', form });
|
|
72
|
+
});
|
|
73
|
+
app.post(DELETE_SYNDICATION_TARGET_PATH, async (c) => {
|
|
74
|
+
const body = await c.req.parseBody();
|
|
75
|
+
const notice = await removeTarget(c.var.config.contentDir, {
|
|
76
|
+
index: indexOf(body),
|
|
77
|
+
was: text(body[SYNDICATION_TARGET_FIELDS.was]),
|
|
78
|
+
});
|
|
79
|
+
flash(c, notice.kind === 'written' ? 'notice' : 'error', notice.message);
|
|
80
|
+
return c.redirect(SYNDICATION_TARGETS_PATH, 303);
|
|
81
|
+
});
|
|
82
|
+
async function answer(c, key, form, requested) {
|
|
83
|
+
const outcome = await saveTarget(c.var.config.contentDir, requested);
|
|
84
|
+
if (outcome.kind === 'refused') {
|
|
85
|
+
c.status(400);
|
|
86
|
+
return render(c, ADMIN_TEMPLATES.syndication, screen(c, { key, form, problems: outcome.problems }));
|
|
87
|
+
}
|
|
88
|
+
flash(c, outcome.kind === 'written' ? 'notice' : 'error', outcome.message);
|
|
89
|
+
return c.redirect(SYNDICATION_TARGETS_PATH, 303);
|
|
90
|
+
}
|
|
91
|
+
function screen(c, refused) {
|
|
92
|
+
const fileText = readFileIfPresentSync(targetsFile(c.var.config.contentDir));
|
|
93
|
+
const read = fileText === undefined ? { entries: [] } : syndicationEntries(fileText);
|
|
94
|
+
const typed = (key) => refused?.key === key ? refused : undefined;
|
|
95
|
+
const panels = 'problem' in read
|
|
96
|
+
? []
|
|
97
|
+
: read.entries.map((entry, index) => {
|
|
98
|
+
const key = `target-${String(index)}`;
|
|
99
|
+
const shown = typed(key);
|
|
100
|
+
return {
|
|
101
|
+
key,
|
|
102
|
+
index,
|
|
103
|
+
was: JSON.stringify(entry.raw),
|
|
104
|
+
form: shown?.form ?? formFromRaw(entry.raw),
|
|
105
|
+
problems: shown?.problems ?? {},
|
|
106
|
+
fileProblems: 'problems' in entry ? entry.problems : [],
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
const adding = typed('target-new');
|
|
110
|
+
return {
|
|
111
|
+
section: 'posts',
|
|
112
|
+
child: SYNDICATION_TARGETS_CHILD,
|
|
113
|
+
heading: 'Syndication',
|
|
114
|
+
file: SYNDICATION_TARGETS_FILE,
|
|
115
|
+
fileProblem: 'problem' in read ? read.problem : '',
|
|
116
|
+
saveUrl: SYNDICATION_TARGETS_PATH,
|
|
117
|
+
addUrl: ADD_SYNDICATION_TARGET_PATH,
|
|
118
|
+
deleteUrl: DELETE_SYNDICATION_TARGET_PATH,
|
|
119
|
+
fields: SYNDICATION_TARGET_FIELDS,
|
|
120
|
+
panels,
|
|
121
|
+
adding: {
|
|
122
|
+
key: 'target-new',
|
|
123
|
+
form: adding?.form ?? emptyForm(),
|
|
124
|
+
problems: adding?.problems ?? {},
|
|
125
|
+
},
|
|
126
|
+
refusedKey: refused?.key ?? '',
|
|
127
|
+
hasProblems: refused !== undefined,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Run `apply` on the file's entries under its lock, as re-read inside it, or
|
|
133
|
+
* leave the file alone when it is not a list or no longer holds `held` where
|
|
134
|
+
* the page drew it.
|
|
135
|
+
*/
|
|
136
|
+
async function underLock(file, held, apply) {
|
|
137
|
+
return await withFileLock(file, () => {
|
|
138
|
+
const current = readFileIfPresentSync(file);
|
|
139
|
+
const read = current === undefined ? { entries: [] } : syndicationEntries(current);
|
|
140
|
+
if ('problem' in read) {
|
|
141
|
+
return {
|
|
142
|
+
kind: 'unchanged',
|
|
143
|
+
message: `Nothing was changed. ${read.problem} Fix or remove the file by hand first, since saving here would lose what it holds.`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (held !== undefined && JSON.stringify(read.entries[held.index]?.raw) !== held.was) {
|
|
147
|
+
return {
|
|
148
|
+
kind: 'unchanged',
|
|
149
|
+
message: `Nothing was changed. ${SYNDICATION_TARGETS_FILE} changed since this page was drawn, so here is what it holds now.`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return apply([...read.entries]);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
async function removeTarget(contentDir, held) {
|
|
156
|
+
const file = targetsFile(contentDir);
|
|
157
|
+
return await underLock(file, held, (entries) => {
|
|
158
|
+
const [removed] = entries.splice(held.index, 1);
|
|
159
|
+
write(file, entries);
|
|
160
|
+
return { kind: 'written', message: `${label(removed)} was removed.` };
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check a save by the rule the file is read by, plus an id no other entry
|
|
165
|
+
* declares, and write it only when it passes.
|
|
166
|
+
*/
|
|
167
|
+
async function saveTarget(contentDir, requested) {
|
|
168
|
+
const file = targetsFile(contentDir);
|
|
169
|
+
const held = requested.kind === 'save' ? requested : undefined;
|
|
170
|
+
return await underLock(file, held, (entries) => {
|
|
171
|
+
const others = entries.filter((_, index) => index !== held?.index);
|
|
172
|
+
const checked = checkSyndicationTarget(recordFromForm(requested.form));
|
|
173
|
+
const id = requested.form.id.trim();
|
|
174
|
+
const problems = 'problems' in checked ? { ...checked.problems } : {};
|
|
175
|
+
if (others.some((entry) => 'target' in entry && entry.target.id === id)) {
|
|
176
|
+
problems.id ??= repeatedIdProblem(id);
|
|
177
|
+
}
|
|
178
|
+
if ('problems' in checked || Object.keys(problems).length > 0) {
|
|
179
|
+
return { kind: 'refused', problems };
|
|
180
|
+
}
|
|
181
|
+
const { target } = checked;
|
|
182
|
+
if (held === undefined) {
|
|
183
|
+
write(file, [...entries, { raw: target, target }]);
|
|
184
|
+
return {
|
|
185
|
+
kind: 'written',
|
|
186
|
+
message: `${target.name} was added. The editor and Micropub clients offer it now.`,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const previous = entries[held.index]?.raw;
|
|
190
|
+
const kept = isRecord(previous) ? withoutTargetKeys(previous) : {};
|
|
191
|
+
entries[held.index] = { raw: { ...target, ...kept }, target };
|
|
192
|
+
write(file, entries);
|
|
193
|
+
return { kind: 'written', message: `${target.name} was saved.` };
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
function write(file, entries) {
|
|
197
|
+
writeFileAtomicallySync(file, `${JSON.stringify(entries.map((entry) => entry.raw), null, 2)}\n`);
|
|
198
|
+
}
|
|
199
|
+
function targetsFile(contentDir) {
|
|
200
|
+
return path.join(contentDir, ...SYNDICATION_TARGETS_FILE.split('/'));
|
|
201
|
+
}
|
|
202
|
+
const TARGET_KEYS = ['id', 'name', 'url', 'tag', 'languages'];
|
|
203
|
+
/** What an entry holds beyond a target's own keys, kept across a save. */
|
|
204
|
+
function withoutTargetKeys(raw) {
|
|
205
|
+
return Object.fromEntries(Object.entries(raw).filter(([key]) => !TARGET_KEYS.includes(key)));
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* A form as an entry the file could hold. An empty tag or languages box is a
|
|
209
|
+
* key left out, which is how the file says "none".
|
|
210
|
+
*/
|
|
211
|
+
function recordFromForm(form) {
|
|
212
|
+
const tag = form.tag.trim();
|
|
213
|
+
const languages = form.languages.split(/[\s,]+/).filter((item) => item !== '');
|
|
214
|
+
return {
|
|
215
|
+
id: form.id.trim(),
|
|
216
|
+
name: form.name,
|
|
217
|
+
url: form.url.trim(),
|
|
218
|
+
...(tag === '' ? {} : { tag }),
|
|
219
|
+
...(languages.length === 0 ? {} : { languages }),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/** What a file's entry shows in its boxes, valid or not. */
|
|
223
|
+
function formFromRaw(raw) {
|
|
224
|
+
const record = isRecord(raw) ? raw : {};
|
|
225
|
+
const shown = (value) => value === undefined ? '' : typeof value === 'string' ? value : JSON.stringify(value);
|
|
226
|
+
const languages = record['languages'];
|
|
227
|
+
return {
|
|
228
|
+
id: shown(record['id']),
|
|
229
|
+
name: shown(record['name']),
|
|
230
|
+
url: shown(record['url']),
|
|
231
|
+
tag: shown(record['tag']),
|
|
232
|
+
languages: Array.isArray(languages) && languages.every((item) => typeof item === 'string')
|
|
233
|
+
? languages.join(', ')
|
|
234
|
+
: shown(languages),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function emptyForm() {
|
|
238
|
+
return { id: '', name: '', url: '', tag: '', languages: '' };
|
|
239
|
+
}
|
|
240
|
+
function formOf(body) {
|
|
241
|
+
return {
|
|
242
|
+
id: text(body[SYNDICATION_TARGET_FIELDS.id]),
|
|
243
|
+
name: text(body[SYNDICATION_TARGET_FIELDS.name]),
|
|
244
|
+
url: text(body[SYNDICATION_TARGET_FIELDS.url]),
|
|
245
|
+
tag: text(body[SYNDICATION_TARGET_FIELDS.tag]),
|
|
246
|
+
languages: text(body[SYNDICATION_TARGET_FIELDS.languages]),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/** The entry a form names, or -1, which names none and so is refused as changed. */
|
|
250
|
+
function indexOf(body) {
|
|
251
|
+
const value = text(body[SYNDICATION_TARGET_FIELDS.entry]);
|
|
252
|
+
return /^\d+$/.test(value) ? Number(value) : -1;
|
|
253
|
+
}
|
|
254
|
+
/** What a flash calls an entry: its name, valid or not. */
|
|
255
|
+
function label(entry) {
|
|
256
|
+
const raw = entry?.raw;
|
|
257
|
+
const name = isRecord(raw) ? raw['name'] : undefined;
|
|
258
|
+
return typeof name === 'string' && name.trim() !== '' ? name.trim() : 'The entry';
|
|
259
|
+
}
|
|
260
|
+
function text(value) {
|
|
261
|
+
return typeof value === 'string' ? value : '';
|
|
262
|
+
}
|
|
263
|
+
function isRecord(value) {
|
|
264
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=syndication-targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syndication-targets.js","sourceRoot":"","sources":["../../src/admin/syndication-targets.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,7 @@ export declare const ADMIN_TEMPLATES: {
|
|
|
37
37
|
readonly documentEditor: 'pages/documents/editor.njk';
|
|
38
38
|
readonly documentConflict: 'pages/documents/conflict.njk';
|
|
39
39
|
readonly taxonomy: 'pages/documents/taxonomy.njk';
|
|
40
|
+
readonly syndication: 'pages/documents/syndication.njk';
|
|
40
41
|
readonly navigation: 'pages/navigation/menus.njk';
|
|
41
42
|
readonly media: 'pages/media/library.njk';
|
|
42
43
|
readonly themes: 'pages/appearance/themes.njk';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/admin/templates.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAoB,MAAM,UAAU,CAAC;AAIzD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAgE,CAAC;AAElG;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe;aAC1B,KAAK,EAAE,yBAAyB;aAChC,KAAK,EAAE,yBAAyB;aAChC,MAAM,EAAE,0BAA0B;aAClC,KAAK,EAAE,yBAAyB;aAChC,SAAS,EAAE,0BAA0B;aACrC,WAAW,EAAE,uBAAuB;aACpC,YAAY,EAAE,0BAA0B;aACxC,cAAc,EAAE,4BAA4B;aAC5C,gBAAgB,EAAE,8BAA8B;aAChD,QAAQ,EAAE,8BAA8B;aACxC,UAAU,EAAE,4BAA4B;aACxC,KAAK,EAAE,yBAAyB;aAChC,MAAM,EAAE,6BAA6B;aACrC,QAAQ,EAAE,wBAAwB;aAClC,QAAQ,EAAE,wBAAwB;aAClC,eAAe,EAAE,4BAA4B;aAC7C,eAAe,EAAE,4BAA4B;aAC7C,kBAAkB,EAAE,+BAA+B;aACnD,kBAAkB,EAAE,+BAA+B;aACnD,aAAa,EAAE,0BAA0B;aACzC,iBAAiB,EAAE,+BAA+B;aAClD,iBAAiB,EAAE,+BAA+B;aAClD,SAAS,EAAE,sBAAsB;aACjC,QAAQ,EAAE,qBAAqB;aAC/B,SAAS,EAAE,sBAAsB;aACjC,aAAa,EAAE,sBAAsB;aACrC,UAAU,EAAE,gCAAgC;aAC5C,kBAAkB,EAAE,+BAA+B;aACnD,gBAAgB,EAAE,6BAA6B;aAC/C,gBAAgB,EAAE,6BAA6B;aAC/C,WAAW,EAAE,iBAAiB;aAC9B,cAAc,EAAE,iCAAiC;CACzC,CAAC;AAEX,8DAA8D;AAC9D,MAAM,WAAW,qCAAqC;IACpD;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,qCAA0C,GAClD,WAAW,CAmBb"}
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/admin/templates.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAoB,MAAM,UAAU,CAAC;AAIzD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAgE,CAAC;AAElG;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe;aAC1B,KAAK,EAAE,yBAAyB;aAChC,KAAK,EAAE,yBAAyB;aAChC,MAAM,EAAE,0BAA0B;aAClC,KAAK,EAAE,yBAAyB;aAChC,SAAS,EAAE,0BAA0B;aACrC,WAAW,EAAE,uBAAuB;aACpC,YAAY,EAAE,0BAA0B;aACxC,cAAc,EAAE,4BAA4B;aAC5C,gBAAgB,EAAE,8BAA8B;aAChD,QAAQ,EAAE,8BAA8B;aACxC,WAAW,EAAE,iCAAiC;aAC9C,UAAU,EAAE,4BAA4B;aACxC,KAAK,EAAE,yBAAyB;aAChC,MAAM,EAAE,6BAA6B;aACrC,QAAQ,EAAE,wBAAwB;aAClC,QAAQ,EAAE,wBAAwB;aAClC,eAAe,EAAE,4BAA4B;aAC7C,eAAe,EAAE,4BAA4B;aAC7C,kBAAkB,EAAE,+BAA+B;aACnD,kBAAkB,EAAE,+BAA+B;aACnD,aAAa,EAAE,0BAA0B;aACzC,iBAAiB,EAAE,+BAA+B;aAClD,iBAAiB,EAAE,+BAA+B;aAClD,SAAS,EAAE,sBAAsB;aACjC,QAAQ,EAAE,qBAAqB;aAC/B,SAAS,EAAE,sBAAsB;aACjC,aAAa,EAAE,sBAAsB;aACrC,UAAU,EAAE,gCAAgC;aAC5C,kBAAkB,EAAE,+BAA+B;aACnD,gBAAgB,EAAE,6BAA6B;aAC/C,gBAAgB,EAAE,6BAA6B;aAC/C,WAAW,EAAE,iBAAiB;aAC9B,cAAc,EAAE,iCAAiC;CACzC,CAAC;AAEX,8DAA8D;AAC9D,MAAM,WAAW,qCAAqC;IACpD;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,qCAA0C,GAClD,WAAW,CAmBb"}
|
package/dist/admin/templates.js
CHANGED
|
@@ -39,6 +39,7 @@ export const ADMIN_TEMPLATES = {
|
|
|
39
39
|
documentEditor: 'pages/documents/editor.njk',
|
|
40
40
|
documentConflict: 'pages/documents/conflict.njk',
|
|
41
41
|
taxonomy: 'pages/documents/taxonomy.njk',
|
|
42
|
+
syndication: 'pages/documents/syndication.njk',
|
|
42
43
|
navigation: 'pages/navigation/menus.njk',
|
|
43
44
|
media: 'pages/media/library.njk',
|
|
44
45
|
themes: 'pages/appearance/themes.njk',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/admin/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAW,aAAa,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAElG;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,yBAAyB;IAChC,KAAK,EAAE,yBAAyB;IAChC,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE,yBAAyB;IAChC,SAAS,EAAE,0BAA0B;IACrC,WAAW,EAAE,uBAAuB;IACpC,YAAY,EAAE,0BAA0B;IACxC,cAAc,EAAE,4BAA4B;IAC5C,gBAAgB,EAAE,8BAA8B;IAChD,QAAQ,EAAE,8BAA8B;IACxC,UAAU,EAAE,4BAA4B;IACxC,KAAK,EAAE,yBAAyB;IAChC,MAAM,EAAE,6BAA6B;IACrC,QAAQ,EAAE,wBAAwB;IAClC,QAAQ,EAAE,wBAAwB;IAClC,eAAe,EAAE,4BAA4B;IAC7C,eAAe,EAAE,4BAA4B;IAC7C,kBAAkB,EAAE,+BAA+B;IACnD,kBAAkB,EAAE,+BAA+B;IACnD,aAAa,EAAE,0BAA0B;IACzC,iBAAiB,EAAE,+BAA+B;IAClD,iBAAiB,EAAE,+BAA+B;IAClD,SAAS,EAAE,sBAAsB;IACjC,QAAQ,EAAE,qBAAqB;IAC/B,SAAS,EAAE,sBAAsB;IACjC,aAAa,EAAE,sBAAsB;IACrC,UAAU,EAAE,gCAAgC;IAC5C,kBAAkB,EAAE,+BAA+B;IACnD,gBAAgB,EAAE,6BAA6B;IAC/C,gBAAgB,EAAE,6BAA6B;IAC/C,WAAW,EAAE,iBAAiB;IAC9B,cAAc,EAAE,iCAAiC;CACzC,CAAC;AAYX,+EAA+E;AAC/E,MAAM,UAAU,8BAA8B,CAC5C,OAAO,GAA0C,EAAE;IAEnD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,CAAC,kBAAkB,CAAC,EAAE;QACxD,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI;KAClC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE;QAC1C,UAAU,EAAE,IAAI;QAChB,gBAAgB,EAAE,KAAK;QACvB,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,yEAAyE;IACzE,sEAAsE;IACtE,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,KAAc,EAAE,MAAM,GAAY,UAAU,EAAE,EAAE,CAC7E,UAAU,CAAC,KAAK,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CACpE,CAAC;IAEF,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/admin/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAW,aAAa,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAElG;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,yBAAyB;IAChC,KAAK,EAAE,yBAAyB;IAChC,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE,yBAAyB;IAChC,SAAS,EAAE,0BAA0B;IACrC,WAAW,EAAE,uBAAuB;IACpC,YAAY,EAAE,0BAA0B;IACxC,cAAc,EAAE,4BAA4B;IAC5C,gBAAgB,EAAE,8BAA8B;IAChD,QAAQ,EAAE,8BAA8B;IACxC,WAAW,EAAE,iCAAiC;IAC9C,UAAU,EAAE,4BAA4B;IACxC,KAAK,EAAE,yBAAyB;IAChC,MAAM,EAAE,6BAA6B;IACrC,QAAQ,EAAE,wBAAwB;IAClC,QAAQ,EAAE,wBAAwB;IAClC,eAAe,EAAE,4BAA4B;IAC7C,eAAe,EAAE,4BAA4B;IAC7C,kBAAkB,EAAE,+BAA+B;IACnD,kBAAkB,EAAE,+BAA+B;IACnD,aAAa,EAAE,0BAA0B;IACzC,iBAAiB,EAAE,+BAA+B;IAClD,iBAAiB,EAAE,+BAA+B;IAClD,SAAS,EAAE,sBAAsB;IACjC,QAAQ,EAAE,qBAAqB;IAC/B,SAAS,EAAE,sBAAsB;IACjC,aAAa,EAAE,sBAAsB;IACrC,UAAU,EAAE,gCAAgC;IAC5C,kBAAkB,EAAE,+BAA+B;IACnD,gBAAgB,EAAE,6BAA6B;IAC/C,gBAAgB,EAAE,6BAA6B;IAC/C,WAAW,EAAE,iBAAiB;IAC9B,cAAc,EAAE,iCAAiC;CACzC,CAAC;AAYX,+EAA+E;AAC/E,MAAM,UAAU,8BAA8B,CAC5C,OAAO,GAA0C,EAAE;IAEnD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,CAAC,kBAAkB,CAAC,EAAE;QACxD,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI;KAClC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE;QAC1C,UAAU,EAAE,IAAI;QAChB,gBAAgB,EAAE,KAAK;QACvB,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,yEAAyE;IACzE,sEAAsE;IACtE,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,KAAc,EAAE,MAAM,GAAY,UAAU,EAAE,EAAE,CAC7E,UAAU,CAAC,KAAK,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CACpE,CAAC;IAEF,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/dist/admin/uploads.d.ts
CHANGED
|
@@ -32,12 +32,12 @@ export interface UploadResult {
|
|
|
32
32
|
* generated later, or by whichever screen remembered to ask, would be an
|
|
33
33
|
* upload that is responsive on some pages and not on others.
|
|
34
34
|
*/
|
|
35
|
-
export type UploadConfig = Pick<ResolvedConfig, 'contentDir' | 'uploadTypes' | 'uploadMaxBytes'> & ImageConfig;
|
|
35
|
+
export type UploadConfig = Pick<ResolvedConfig, 'contentDir' | 'uploadTypes' | 'uploadMaxBytes' | 'uploadMediaMaxBytes'> & ImageConfig;
|
|
36
36
|
/** One file that has landed under `content/uploads/`. */
|
|
37
37
|
export interface StoredUpload {
|
|
38
38
|
/** The public URL of the file, which the site serves straight away. */
|
|
39
39
|
url: string;
|
|
40
|
-
/** What the CMS decided the file is; `media.
|
|
40
|
+
/** What the CMS decided the file is; `media.kind` says what it is for. */
|
|
41
41
|
media: UploadMediaType;
|
|
42
42
|
/** The submitted name without its extension, for the text of a link to it. */
|
|
43
43
|
label: string;
|
|
@@ -75,6 +75,17 @@ export declare function refusedUpload(outcome: StoredUpload | UploadRefusal): ou
|
|
|
75
75
|
* what a site accepts.
|
|
76
76
|
*/
|
|
77
77
|
export declare function storeUpload(file: unknown, config: UploadConfig, options?: StoreUploadOptions): Promise<StoredUpload | UploadRefusal>;
|
|
78
|
+
/**
|
|
79
|
+
* The largest file of this kind a site accepts: audio and video have a limit
|
|
80
|
+
* of their own, since an episode is far bigger than any picture.
|
|
81
|
+
*/
|
|
82
|
+
export declare function uploadLimit(media: UploadMediaType, config: Pick<ResolvedConfig, 'uploadMaxBytes' | 'uploadMediaMaxBytes'>): number;
|
|
83
|
+
/**
|
|
84
|
+
* The most any upload may weigh. The headers do not say what a file is, so a
|
|
85
|
+
* check made before reading it can only hold it to the larger limit, and
|
|
86
|
+
* {@link storeUpload} holds each file to its own once it knows.
|
|
87
|
+
*/
|
|
88
|
+
export declare function largestUploadLimit(config: Pick<ResolvedConfig, 'uploadMaxBytes' | 'uploadMediaMaxBytes'>): number;
|
|
78
89
|
/**
|
|
79
90
|
* Refuse an oversized upload by its headers, before anything reads it.
|
|
80
91
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/admin/uploads.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIzD,qDAAqD;AACrD,eAAO,MAAM,YAAY,mBAA4B,CAAC;AAEtD,0CAA0C;AAC1C,eAAO,MAAM,YAAY,SAAS,CAAC;AAEnC;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/admin/uploads.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/uploads.js
CHANGED
|
@@ -54,7 +54,7 @@ export async function storeUpload(file, config, options = {}) {
|
|
|
54
54
|
// Guaranteed by resolveConfig, which refuses an allowlist naming anything
|
|
55
55
|
// the table has no entry for.
|
|
56
56
|
const media = UPLOAD_MEDIA_TYPES.get(extension);
|
|
57
|
-
if (options.imagesOnly === true &&
|
|
57
|
+
if (options.imagesOnly === true && media.kind !== 'image') {
|
|
58
58
|
return { status: 415, error: `A ${extension} is not an image, and this has to be one.` };
|
|
59
59
|
}
|
|
60
60
|
const declared = declaredType(file.type);
|
|
@@ -64,8 +64,9 @@ export async function storeUpload(file, config, options = {}) {
|
|
|
64
64
|
error: `That file says it is ${declared}, which is not what a ${extension} is.`,
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
const limit = uploadLimit(media, config);
|
|
68
|
+
if (file.size > limit) {
|
|
69
|
+
return { status: 413, error: tooLargeMessage(limit) };
|
|
69
70
|
}
|
|
70
71
|
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
71
72
|
if (!matchesSignature(media, bytes)) {
|
|
@@ -96,6 +97,23 @@ export async function storeUpload(file, config, options = {}) {
|
|
|
96
97
|
label: original.slice(0, original.length - extension.length).trim() || name,
|
|
97
98
|
};
|
|
98
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* The largest file of this kind a site accepts: audio and video have a limit
|
|
102
|
+
* of their own, since an episode is far bigger than any picture.
|
|
103
|
+
*/
|
|
104
|
+
export function uploadLimit(media, config) {
|
|
105
|
+
return media.kind === 'audio' || media.kind === 'video'
|
|
106
|
+
? config.uploadMediaMaxBytes
|
|
107
|
+
: config.uploadMaxBytes;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The most any upload may weigh. The headers do not say what a file is, so a
|
|
111
|
+
* check made before reading it can only hold it to the larger limit, and
|
|
112
|
+
* {@link storeUpload} holds each file to its own once it knows.
|
|
113
|
+
*/
|
|
114
|
+
export function largestUploadLimit(config) {
|
|
115
|
+
return Math.max(config.uploadMaxBytes, config.uploadMediaMaxBytes);
|
|
116
|
+
}
|
|
99
117
|
/**
|
|
100
118
|
* Refuse an oversized upload by its headers, before anything reads it.
|
|
101
119
|
*
|
|
@@ -111,7 +129,7 @@ export const refuseOversizedUpload = async (c, next) => {
|
|
|
111
129
|
if (c.req.method !== 'POST')
|
|
112
130
|
return next();
|
|
113
131
|
const declared = Number(c.req.header('content-length') ?? '');
|
|
114
|
-
const limit = c.var.config
|
|
132
|
+
const limit = largestUploadLimit(c.var.config);
|
|
115
133
|
if (Number.isFinite(declared) && declared > limit + UPLOAD_ENVELOPE_BYTES) {
|
|
116
134
|
// JSON for the editor's control, which reads it, and plain text for the
|
|
117
135
|
// media screen's form, which is a navigation: a browser that has just
|
|
@@ -152,7 +170,7 @@ export function mountUploads(app) {
|
|
|
152
170
|
markdown: uploadMarkdown({
|
|
153
171
|
url: outcome.url,
|
|
154
172
|
label: outcome.label,
|
|
155
|
-
image: outcome.media.image,
|
|
173
|
+
image: outcome.media.kind === 'image',
|
|
156
174
|
}),
|
|
157
175
|
};
|
|
158
176
|
return c.json(result, 201);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/admin/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,qDAAqD;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,YAAY,UAAU,CAAC;AAEtD,0CAA0C;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/admin/uploads.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -144,10 +144,20 @@ export interface GeekityConfig {
|
|
|
144
144
|
* MiB. Overridden by `GEEKITY_UPLOAD_MAX_BYTES`.
|
|
145
145
|
*/
|
|
146
146
|
uploadMaxBytes?: number;
|
|
147
|
+
/**
|
|
148
|
+
* Largest audio or video file the upload endpoint accepts, in bytes. Default
|
|
149
|
+
* 200 MiB. Overridden by `GEEKITY_UPLOAD_MEDIA_MAX_BYTES`.
|
|
150
|
+
*
|
|
151
|
+
* It is a limit of its own because an episode is a hundred times the size
|
|
152
|
+
* of a photo: raising {@link GeekityConfig.uploadMaxBytes} far enough for
|
|
153
|
+
* one would let every other upload be that big too.
|
|
154
|
+
*/
|
|
155
|
+
uploadMediaMaxBytes?: number;
|
|
147
156
|
/**
|
|
148
157
|
* File extensions the upload endpoint accepts, with or without the leading
|
|
149
|
-
* dot and in any case. Default: PNG, JPEG, GIF, WebP, AVIF, PDF, plain text
|
|
150
|
-
* and
|
|
158
|
+
* dot and in any case. Default: PNG, JPEG, GIF, WebP, AVIF, PDF, plain text,
|
|
159
|
+
* Markdown, WebVTT and SubRip captions, and MP3, M4A, AAC, Ogg, Opus, MP4,
|
|
160
|
+
* M4V and WebM audio and video. Overridden by `GEEKITY_UPLOAD_TYPES`, a comma-separated
|
|
151
161
|
* list. Every entry has to be one the CMS knows a media type for; see
|
|
152
162
|
* `KNOWN_UPLOAD_TYPES`.
|
|
153
163
|
*/
|
|
@@ -380,6 +390,7 @@ export interface ResolvedConfig {
|
|
|
380
390
|
watch: boolean;
|
|
381
391
|
sessionLifetime: number;
|
|
382
392
|
uploadMaxBytes: number;
|
|
393
|
+
uploadMediaMaxBytes: number;
|
|
383
394
|
/** Normalised: lower case, each with its leading dot. */
|
|
384
395
|
uploadTypes: string[];
|
|
385
396
|
imageOptimization: boolean;
|
|
@@ -437,9 +448,12 @@ export declare const DEFAULT_THEMES_DIR = "themes";
|
|
|
437
448
|
export declare const DEFAULT_SESSION_LIFETIME: number;
|
|
438
449
|
/** Largest upload a site accepts by default: ten mebibytes. */
|
|
439
450
|
export declare const DEFAULT_UPLOAD_MAX_BYTES: number;
|
|
451
|
+
/** Largest audio or video upload a site accepts by default: two hundred mebibytes. */
|
|
452
|
+
export declare const DEFAULT_UPLOAD_MEDIA_MAX_BYTES: number;
|
|
440
453
|
/**
|
|
441
454
|
* What the editor may upload by default: the raster image formats a browser
|
|
442
|
-
* displays, PDFs,
|
|
455
|
+
* displays, PDFs, the text formats, captions, and the audio and video formats
|
|
456
|
+
* a browser plays. Everything the CMS knows about
|
|
443
457
|
* except SVG, which is script-bearing markup served from the site's own origin
|
|
444
458
|
* and so is opt-in.
|
|
445
459
|
*/
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,EAAE,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzB;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,CAAC;IACxC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACpC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACtD,wDAAwD;IACxD,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACjC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;IACjC,sGAAsG;IACtG,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,qGAAqG;IACrG,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACtD,+EAA+E;IAC/E,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;CACtD;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,gGAAgG;IAChG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oHAAoH;IACpH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8IAA8I;IAC9I,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -10,9 +10,12 @@ export const DEFAULT_THEMES_DIR = 'themes';
|
|
|
10
10
|
export const DEFAULT_SESSION_LIFETIME = 14 * 24 * 60 * 60;
|
|
11
11
|
/** Largest upload a site accepts by default: ten mebibytes. */
|
|
12
12
|
export const DEFAULT_UPLOAD_MAX_BYTES = 10 * 1024 * 1024;
|
|
13
|
+
/** Largest audio or video upload a site accepts by default: two hundred mebibytes. */
|
|
14
|
+
export const DEFAULT_UPLOAD_MEDIA_MAX_BYTES = 200 * 1024 * 1024;
|
|
13
15
|
/**
|
|
14
16
|
* What the editor may upload by default: the raster image formats a browser
|
|
15
|
-
* displays, PDFs,
|
|
17
|
+
* displays, PDFs, the text formats, captions, and the audio and video formats
|
|
18
|
+
* a browser plays. Everything the CMS knows about
|
|
16
19
|
* except SVG, which is script-bearing markup served from the site's own origin
|
|
17
20
|
* and so is opt-in.
|
|
18
21
|
*/
|
|
@@ -96,7 +99,8 @@ export function resolveConfig(config = {}, context = {}) {
|
|
|
96
99
|
baseUrlSource: baseUrlSource(env['GEEKITY_BASE_URL'], config.baseUrl),
|
|
97
100
|
watch: resolveBoolean('GEEKITY_WATCH', env['GEEKITY_WATCH'], config.watch, true),
|
|
98
101
|
sessionLifetime: resolveSessionLifetime(env['GEEKITY_SESSION_LIFETIME'], config.sessionLifetime),
|
|
99
|
-
uploadMaxBytes:
|
|
102
|
+
uploadMaxBytes: resolveByteLimit('GEEKITY_UPLOAD_MAX_BYTES', 'uploadMaxBytes', env['GEEKITY_UPLOAD_MAX_BYTES'], config.uploadMaxBytes, DEFAULT_UPLOAD_MAX_BYTES),
|
|
103
|
+
uploadMediaMaxBytes: resolveByteLimit('GEEKITY_UPLOAD_MEDIA_MAX_BYTES', 'uploadMediaMaxBytes', env['GEEKITY_UPLOAD_MEDIA_MAX_BYTES'], config.uploadMediaMaxBytes, DEFAULT_UPLOAD_MEDIA_MAX_BYTES),
|
|
100
104
|
uploadTypes: resolveUploadTypes(env['GEEKITY_UPLOAD_TYPES'], config.uploadTypes),
|
|
101
105
|
imageOptimization: resolveBoolean('GEEKITY_IMAGE_OPTIMIZATION', env['GEEKITY_IMAGE_OPTIMIZATION'], config.imageOptimization, true),
|
|
102
106
|
imageWidths: resolveImageWidths(env['GEEKITY_IMAGE_WIDTHS'], config.imageWidths),
|
|
@@ -149,19 +153,19 @@ function resolveSecurityHeaders(configured) {
|
|
|
149
153
|
}
|
|
150
154
|
return headers;
|
|
151
155
|
}
|
|
152
|
-
/** Bytes, a positive whole number of them. */
|
|
153
|
-
function
|
|
156
|
+
/** Bytes, a positive whole number of them, from the environment, else the option, else the default. */
|
|
157
|
+
function resolveByteLimit(variable, option, fromEnv, configured, fallback) {
|
|
154
158
|
if (fromEnv !== undefined && fromEnv !== '') {
|
|
155
159
|
const parsed = Number(fromEnv);
|
|
156
160
|
if (!isValidByteCount(parsed)) {
|
|
157
|
-
throw new TypeError(
|
|
161
|
+
throw new TypeError(`${variable} must be a positive whole number of bytes, received ${JSON.stringify(fromEnv)}`);
|
|
158
162
|
}
|
|
159
163
|
return parsed;
|
|
160
164
|
}
|
|
161
165
|
if (configured === undefined)
|
|
162
|
-
return
|
|
166
|
+
return fallback;
|
|
163
167
|
if (!isValidByteCount(configured)) {
|
|
164
|
-
throw new TypeError(`config
|
|
168
|
+
throw new TypeError(`config.${option} must be a positive whole number of bytes, received ${JSON.stringify(configured)}`);
|
|
165
169
|
}
|
|
166
170
|
return configured;
|
|
167
171
|
}
|