@geekity/cms 0.35.0 → 0.37.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/admin/components/blocks.njk +250 -0
- package/admin/components/card.njk +4 -2
- package/admin/components/job-status.njk +15 -10
- package/admin/components/upload.njk +26 -0
- package/admin/pages/comments/all.njk +1 -1
- package/admin/pages/dashboard/home.njk +33 -32
- package/admin/pages/documents/editor.njk +34 -19
- package/admin/pages/federation/followers.njk +3 -2
- package/admin/pages/media/file.njk +5 -4
- package/admin/pages/media/library.njk +7 -3
- package/admin/pages/plugins/screen.njk +5 -35
- package/admin/pages/settings/general.njk +4 -1
- package/admin/pages/tools/export.njk +54 -51
- package/admin/pages/tools/maintenance.njk +2 -1
- package/admin/pages/users/edit.njk +3 -0
- package/admin/src/admin.css +1 -0
- package/admin/static/admin.css +374 -0
- package/admin/static/job-status.js +158 -0
- package/admin/static/upload-drop.js +225 -0
- package/dist/admin/blocks.d.ts +133 -0
- package/dist/admin/blocks.d.ts.map +1 -0
- package/dist/admin/blocks.js +454 -0
- package/dist/admin/blocks.js.map +1 -0
- package/dist/admin/core-widgets.d.ts +3 -0
- package/dist/admin/core-widgets.d.ts.map +1 -0
- package/dist/admin/core-widgets.js +17 -0
- package/dist/admin/core-widgets.js.map +1 -0
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +0 -2
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/engagement.d.ts +16 -0
- package/dist/admin/engagement.d.ts.map +1 -0
- package/dist/admin/engagement.js +38 -0
- package/dist/admin/engagement.js.map +1 -0
- package/dist/admin/federation.d.ts +2 -0
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +2 -1
- package/dist/admin/federation.js.map +1 -1
- package/dist/admin/formatting.d.ts +1 -0
- package/dist/admin/formatting.d.ts.map +1 -1
- package/dist/admin/formatting.js +18 -0
- package/dist/admin/formatting.js.map +1 -1
- package/dist/admin/index.d.ts +2 -2
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +2 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/job-status.d.ts +1 -0
- package/dist/admin/job-status.d.ts.map +1 -1
- package/dist/admin/job-status.js +1 -0
- package/dist/admin/job-status.js.map +1 -1
- package/dist/admin/media.d.ts +6 -9
- package/dist/admin/media.d.ts.map +1 -1
- package/dist/admin/media.js +85 -27
- package/dist/admin/media.js.map +1 -1
- package/dist/admin/posts-by-path.d.ts +11 -0
- package/dist/admin/posts-by-path.d.ts.map +1 -0
- package/dist/admin/posts-by-path.js +59 -0
- package/dist/admin/posts-by-path.js.map +1 -0
- package/dist/admin/routes.d.ts +0 -2
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +24 -12
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +2 -0
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/tools.js +1 -1
- package/dist/admin/tools.js.map +1 -1
- package/dist/admin/uploads.d.ts +2 -1
- package/dist/admin/uploads.d.ts.map +1 -1
- package/dist/admin/uploads.js +5 -2
- package/dist/admin/uploads.js.map +1 -1
- package/dist/admin/widget-fediverse.d.ts +3 -0
- package/dist/admin/widget-fediverse.d.ts.map +1 -0
- package/dist/admin/widget-fediverse.js +49 -0
- package/dist/admin/widget-fediverse.js.map +1 -0
- package/dist/admin/widget-followers.d.ts +3 -0
- package/dist/admin/widget-followers.d.ts.map +1 -0
- package/dist/admin/widget-followers.js +37 -0
- package/dist/admin/widget-followers.js.map +1 -0
- package/dist/admin/widget-health.d.ts +3 -0
- package/dist/admin/widget-health.d.ts.map +1 -0
- package/dist/admin/widget-health.js +103 -0
- package/dist/admin/widget-health.js.map +1 -0
- package/dist/admin/widget-interactions.d.ts +4 -0
- package/dist/admin/widget-interactions.d.ts.map +1 -0
- package/dist/admin/widget-interactions.js +99 -0
- package/dist/admin/widget-interactions.js.map +1 -0
- package/dist/admin/widget-posting.d.ts +3 -0
- package/dist/admin/widget-posting.d.ts.map +1 -0
- package/dist/admin/widget-posting.js +111 -0
- package/dist/admin/widget-posting.js.map +1 -0
- package/dist/admin/widget-scheduled.d.ts +4 -0
- package/dist/admin/widget-scheduled.d.ts.map +1 -0
- package/dist/admin/widget-scheduled.js +30 -0
- package/dist/admin/widget-scheduled.js.map +1 -0
- package/dist/admin/widget-top-posts.d.ts +4 -0
- package/dist/admin/widget-top-posts.d.ts.map +1 -0
- package/dist/admin/widget-top-posts.js +55 -0
- package/dist/admin/widget-top-posts.js.map +1 -0
- package/dist/admin/widgets.d.ts +35 -0
- package/dist/admin/widgets.d.ts.map +1 -0
- package/dist/admin/widgets.js +103 -0
- package/dist/admin/widgets.js.map +1 -0
- package/dist/cms/app.d.ts.map +1 -1
- package/dist/cms/app.js +2 -1
- package/dist/cms/app.js.map +1 -1
- package/dist/cms/boot.d.ts.map +1 -1
- package/dist/cms/boot.js +3 -2
- package/dist/cms/boot.js.map +1 -1
- package/dist/cms/services.d.ts.map +1 -1
- package/dist/cms/services.js +19 -0
- package/dist/cms/services.js.map +1 -1
- package/dist/content/alt-text.d.ts +1 -0
- package/dist/content/alt-text.d.ts.map +1 -1
- package/dist/content/alt-text.js +26 -1
- package/dist/content/alt-text.js.map +1 -1
- package/dist/content/sqlite/catalog.d.ts.map +1 -1
- package/dist/content/sqlite/catalog.js +15 -2
- package/dist/content/sqlite/catalog.js.map +1 -1
- package/dist/content/store.d.ts +10 -0
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js.map +1 -1
- package/dist/content/write.d.ts.map +1 -1
- package/dist/content/write.js +3 -1
- package/dist/content/write.js.map +1 -1
- package/dist/federation/backfill.d.ts +1 -1
- package/dist/federation/backfill.d.ts.map +1 -1
- package/dist/federation/backfill.js +5 -1
- package/dist/federation/backfill.js.map +1 -1
- package/dist/federation/follower-history.d.ts +16 -0
- package/dist/federation/follower-history.d.ts.map +1 -0
- package/dist/federation/follower-history.js +61 -0
- package/dist/federation/follower-history.js.map +1 -0
- package/dist/federation/inbox.d.ts.map +1 -1
- package/dist/federation/inbox.js +2 -1
- package/dist/federation/inbox.js.map +1 -1
- package/dist/federation/records.d.ts +1 -0
- package/dist/federation/records.d.ts.map +1 -1
- package/dist/federation/records.js +24 -6
- package/dist/federation/records.js.map +1 -1
- package/dist/files/data-files.d.ts +1 -0
- package/dist/files/data-files.d.ts.map +1 -1
- package/dist/files/data-files.js +6 -0
- package/dist/files/data-files.js.map +1 -1
- package/dist/jobs/queue.d.ts.map +1 -1
- package/dist/jobs/queue.js +5 -0
- package/dist/jobs/queue.js.map +1 -1
- package/dist/jobs/types.d.ts +7 -0
- package/dist/jobs/types.d.ts.map +1 -1
- package/dist/jobs/types.js.map +1 -1
- package/dist/media/library.d.ts +9 -0
- package/dist/media/library.d.ts.map +1 -1
- package/dist/media/library.js +25 -1
- package/dist/media/library.js.map +1 -1
- package/dist/plugin.d.ts +275 -21
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +9 -8
- package/dist/plugin.js.map +1 -1
- package/dist/plugins/fetch.d.ts +0 -5
- package/dist/plugins/fetch.d.ts.map +1 -1
- package/dist/plugins/fetch.js +31 -7
- package/dist/plugins/fetch.js.map +1 -1
- package/dist/plugins/host-api.d.ts +3 -0
- package/dist/plugins/host-api.d.ts.map +1 -0
- package/dist/plugins/host-api.js +8 -0
- package/dist/plugins/host-api.js.map +1 -0
- package/dist/plugins/install.d.ts.map +1 -1
- package/dist/plugins/install.js +4 -2
- package/dist/plugins/install.js.map +1 -1
- package/dist/plugins/page-tags.d.ts +8 -0
- package/dist/plugins/page-tags.d.ts.map +1 -0
- package/dist/plugins/page-tags.js +73 -0
- package/dist/plugins/page-tags.js.map +1 -0
- package/dist/plugins/registry.d.ts +4 -1
- package/dist/plugins/registry.d.ts.map +1 -1
- package/dist/plugins/registry.js +50 -9
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/site.js +1 -1
- package/dist/plugins/site.js.map +1 -1
- package/dist/store/admin-store.d.ts +2 -2
- package/dist/store/admin-store.d.ts.map +1 -1
- package/dist/store/admin-store.js.map +1 -1
- package/dist/store/comments.d.ts +7 -0
- package/dist/store/comments.d.ts.map +1 -1
- package/dist/store/comments.js +21 -0
- package/dist/store/comments.js.map +1 -1
- package/dist/store/deliveries.d.ts +1 -0
- package/dist/store/deliveries.d.ts.map +1 -1
- package/dist/store/deliveries.js +6 -0
- package/dist/store/deliveries.js.map +1 -1
- package/dist/store/inbox.d.ts +16 -0
- package/dist/store/inbox.d.ts.map +1 -1
- package/dist/store/inbox.js +62 -0
- package/dist/store/inbox.js.map +1 -1
- package/dist/store/queue-database.d.ts +6 -0
- package/dist/store/queue-database.d.ts.map +1 -1
- package/dist/store/queue-database.js +16 -1
- package/dist/store/queue-database.js.map +1 -1
- package/dist/store/webmentions.d.ts +1 -0
- package/dist/store/webmentions.d.ts.map +1 -1
- package/dist/store/webmentions.js +6 -0
- package/dist/store/webmentions.js.map +1 -1
- package/dist/web/env.d.ts +3 -0
- package/dist/web/env.d.ts.map +1 -1
- package/dist/web/feed-item.d.ts +4 -3
- package/dist/web/feed-item.d.ts.map +1 -1
- package/dist/web/feed-item.js +8 -2
- package/dist/web/feed-item.js.map +1 -1
- package/dist/web/listing-pages.d.ts.map +1 -1
- package/dist/web/listing-pages.js +7 -2
- package/dist/web/listing-pages.js.map +1 -1
- package/dist/web/page-tags.d.ts +4 -0
- package/dist/web/page-tags.d.ts.map +1 -0
- package/dist/web/page-tags.js +39 -0
- package/dist/web/page-tags.js.map +1 -0
- package/dist/web/render.d.ts +2 -0
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +14 -0
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts +2 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +3 -1
- package/dist/web/routes.js.map +1 -1
- package/package.json +6 -1
- package/themes/default/layouts/base.njk +6 -4
- package/dist/comments/routes.d.ts +0 -65
- package/dist/comments/routes.d.ts.map +0 -1
- package/dist/comments/routes.js +0 -235
- package/dist/comments/routes.js.map +0 -1
- package/dist/content/media.d.ts +0 -85
- package/dist/content/media.d.ts.map +0 -1
- package/dist/content/media.js +0 -237
- package/dist/content/media.js.map +0 -1
- package/dist/content/read-form.d.ts +0 -31
- package/dist/content/read-form.d.ts.map +0 -1
- package/dist/content/read-form.js +0 -157
- package/dist/content/read-form.js.map +0 -1
- package/dist/content/read.d.ts +0 -29
- package/dist/content/read.d.ts.map +0 -1
- package/dist/content/read.js +0 -82
- package/dist/content/read.js.map +0 -1
- package/dist/export/export-archives.d.ts +0 -29
- package/dist/export/export-archives.d.ts.map +0 -1
- package/dist/export/export-archives.js +0 -88
- package/dist/export/export-archives.js.map +0 -1
- package/dist/federation/mount.d.ts +0 -53
- package/dist/federation/mount.d.ts.map +0 -1
- package/dist/federation/mount.js +0 -344
- package/dist/federation/mount.js.map +0 -1
- package/dist/mail/credentials.d.ts +0 -62
- package/dist/mail/credentials.d.ts.map +0 -1
- package/dist/mail/credentials.js +0 -86
- package/dist/mail/credentials.js.map +0 -1
- package/dist/site/setting-rows.d.ts +0 -45
- package/dist/site/setting-rows.d.ts.map +0 -1
- package/dist/site/setting-rows.js +0 -361
- package/dist/site/setting-rows.js.map +0 -1
- package/dist/site/settings-form.d.ts +0 -30
- package/dist/site/settings-form.d.ts.map +0 -1
- package/dist/site/settings-form.js +0 -54
- package/dist/site/settings-form.js.map +0 -1
- package/dist/site/site-json.d.ts +0 -38
- package/dist/site/site-json.d.ts.map +0 -1
- package/dist/site/site-json.js +0 -69
- package/dist/site/site-json.js.map +0 -1
- package/dist/webmention/routes.d.ts +0 -37
- package/dist/webmention/routes.d.ts.map +0 -1
- package/dist/webmention/routes.js +0 -75
- package/dist/webmention/routes.js.map +0 -1
package/dist/content/media.js
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* What may be uploaded into `content/uploads/`, described once.
|
|
3
|
-
*
|
|
4
|
-
* The upload endpoint is the only door into the content directory that does
|
|
5
|
-
* not write Markdown, so what it accepts is a list rather than a judgement:
|
|
6
|
-
* an extension the CMS has never heard of is refused, and one it has is
|
|
7
|
-
* checked against the media type the browser declared and, where the format
|
|
8
|
-
* has one, against the bytes the file actually starts with.
|
|
9
|
-
*
|
|
10
|
-
* The table lives here rather than beside the endpoint because
|
|
11
|
-
* {@link ResolvedConfig} validates a site's allowlist against it, and config
|
|
12
|
-
* may not depend on the admin.
|
|
13
|
-
*/
|
|
14
|
-
/** The bytes of an ASCII string, for spelling a signature readably. */
|
|
15
|
-
function ascii(value) {
|
|
16
|
-
return [...value].map((character) => character.charCodeAt(0));
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* An ISO base media file — MP4, M4A, M4V — whatever its brand: a box length,
|
|
20
|
-
* then `ftyp`.
|
|
21
|
-
*/
|
|
22
|
-
const ISO_BASE_MEDIA = [{ offset: 4, bytes: ascii('ftyp') }];
|
|
23
|
-
/** An Ogg page, whatever codec is inside it. */
|
|
24
|
-
const OGG = [{ offset: 0, bytes: ascii('OggS') }];
|
|
25
|
-
/**
|
|
26
|
-
* Every extension the upload endpoint can accept, and what it takes to be one.
|
|
27
|
-
*
|
|
28
|
-
* SVG is deliberately absent. An SVG is a document that may carry script, and
|
|
29
|
-
* an upload is served from the site's own origin, so accepting one would hand
|
|
30
|
-
* anybody who can reach the editor a stored cross-site scripting hole. A site
|
|
31
|
-
* that wants them anyway can put `.svg` in `uploadTypes` — and then it has
|
|
32
|
-
* chosen that, which is the point.
|
|
33
|
-
*/
|
|
34
|
-
export const UPLOAD_MEDIA_TYPES = new Map([
|
|
35
|
-
[
|
|
36
|
-
'.png',
|
|
37
|
-
{
|
|
38
|
-
declared: ['image/png'],
|
|
39
|
-
kind: 'image',
|
|
40
|
-
signatures: [[{ offset: 0, bytes: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a] }]],
|
|
41
|
-
},
|
|
42
|
-
],
|
|
43
|
-
[
|
|
44
|
-
'.jpg',
|
|
45
|
-
{
|
|
46
|
-
declared: ['image/jpeg', 'image/jpg'],
|
|
47
|
-
kind: 'image',
|
|
48
|
-
signatures: [[{ offset: 0, bytes: [0xff, 0xd8, 0xff] }]],
|
|
49
|
-
},
|
|
50
|
-
],
|
|
51
|
-
[
|
|
52
|
-
'.jpeg',
|
|
53
|
-
{
|
|
54
|
-
declared: ['image/jpeg', 'image/jpg'],
|
|
55
|
-
kind: 'image',
|
|
56
|
-
signatures: [[{ offset: 0, bytes: [0xff, 0xd8, 0xff] }]],
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
[
|
|
60
|
-
'.gif',
|
|
61
|
-
{
|
|
62
|
-
declared: ['image/gif'],
|
|
63
|
-
kind: 'image',
|
|
64
|
-
signatures: [
|
|
65
|
-
[{ offset: 0, bytes: ascii('GIF87a') }],
|
|
66
|
-
[{ offset: 0, bytes: ascii('GIF89a') }],
|
|
67
|
-
],
|
|
68
|
-
},
|
|
69
|
-
],
|
|
70
|
-
[
|
|
71
|
-
'.webp',
|
|
72
|
-
{
|
|
73
|
-
declared: ['image/webp'],
|
|
74
|
-
kind: 'image',
|
|
75
|
-
// A WebP is a RIFF container whose form type is WEBP, so both halves of
|
|
76
|
-
// the header have to be there.
|
|
77
|
-
signatures: [
|
|
78
|
-
[
|
|
79
|
-
{ offset: 0, bytes: ascii('RIFF') },
|
|
80
|
-
{ offset: 8, bytes: ascii('WEBP') },
|
|
81
|
-
],
|
|
82
|
-
],
|
|
83
|
-
},
|
|
84
|
-
],
|
|
85
|
-
[
|
|
86
|
-
'.avif',
|
|
87
|
-
{
|
|
88
|
-
declared: ['image/avif'],
|
|
89
|
-
kind: 'image',
|
|
90
|
-
// An ISO base media file: a length, then `ftyp`, then the brand.
|
|
91
|
-
signatures: [
|
|
92
|
-
[
|
|
93
|
-
{ offset: 4, bytes: ascii('ftyp') },
|
|
94
|
-
{ offset: 8, bytes: ascii('avif') },
|
|
95
|
-
],
|
|
96
|
-
[
|
|
97
|
-
{ offset: 4, bytes: ascii('ftyp') },
|
|
98
|
-
{ offset: 8, bytes: ascii('avis') },
|
|
99
|
-
],
|
|
100
|
-
],
|
|
101
|
-
},
|
|
102
|
-
],
|
|
103
|
-
[
|
|
104
|
-
'.pdf',
|
|
105
|
-
{
|
|
106
|
-
declared: ['application/pdf'],
|
|
107
|
-
kind: 'document',
|
|
108
|
-
signatures: [[{ offset: 0, bytes: ascii('%PDF-') }]],
|
|
109
|
-
},
|
|
110
|
-
],
|
|
111
|
-
// The two text formats have no header. Nothing is sniffed, and nothing needs
|
|
112
|
-
// to be: they are served as text, and `application/octet-stream` is allowed
|
|
113
|
-
// because that is what a browser sends for a file type it does not know.
|
|
114
|
-
['.txt', { declared: ['text/plain', 'application/octet-stream'], kind: 'document', text: true }],
|
|
115
|
-
[
|
|
116
|
-
'.md',
|
|
117
|
-
{
|
|
118
|
-
declared: ['text/markdown', 'text/x-markdown', 'text/plain', 'application/octet-stream'],
|
|
119
|
-
kind: 'document',
|
|
120
|
-
text: true,
|
|
121
|
-
},
|
|
122
|
-
],
|
|
123
|
-
// WebVTT opens with its name, after a byte order mark when the editor that
|
|
124
|
-
// wrote it added one. SubRip has no header, so it is taken as text like the
|
|
125
|
-
// two formats above.
|
|
126
|
-
[
|
|
127
|
-
'.vtt',
|
|
128
|
-
{
|
|
129
|
-
declared: ['text/vtt', 'text/plain', 'application/octet-stream'],
|
|
130
|
-
kind: 'document',
|
|
131
|
-
text: true,
|
|
132
|
-
signatures: [
|
|
133
|
-
[{ offset: 0, bytes: ascii('WEBVTT') }],
|
|
134
|
-
[{ offset: 0, bytes: [0xef, 0xbb, 0xbf, ...ascii('WEBVTT')] }],
|
|
135
|
-
],
|
|
136
|
-
},
|
|
137
|
-
],
|
|
138
|
-
[
|
|
139
|
-
'.srt',
|
|
140
|
-
{
|
|
141
|
-
declared: ['application/x-subrip', 'text/srt', 'text/plain', 'application/octet-stream'],
|
|
142
|
-
kind: 'document',
|
|
143
|
-
text: true,
|
|
144
|
-
},
|
|
145
|
-
],
|
|
146
|
-
[
|
|
147
|
-
'.mp3',
|
|
148
|
-
{
|
|
149
|
-
declared: ['audio/mpeg', 'audio/mp3'],
|
|
150
|
-
kind: 'audio',
|
|
151
|
-
// An ID3 tag, or straight into an MPEG audio frame: eleven sync bits,
|
|
152
|
-
// then MPEG-1 or MPEG-2 layer III, with or without a CRC.
|
|
153
|
-
signatures: [
|
|
154
|
-
[{ offset: 0, bytes: ascii('ID3') }],
|
|
155
|
-
[{ offset: 0, bytes: [0xff, 0xfb] }],
|
|
156
|
-
[{ offset: 0, bytes: [0xff, 0xfa] }],
|
|
157
|
-
[{ offset: 0, bytes: [0xff, 0xf3] }],
|
|
158
|
-
[{ offset: 0, bytes: [0xff, 0xf2] }],
|
|
159
|
-
],
|
|
160
|
-
},
|
|
161
|
-
],
|
|
162
|
-
[
|
|
163
|
-
'.m4a',
|
|
164
|
-
{
|
|
165
|
-
declared: ['audio/mp4', 'audio/x-m4a', 'audio/m4a'],
|
|
166
|
-
kind: 'audio',
|
|
167
|
-
signatures: [ISO_BASE_MEDIA],
|
|
168
|
-
},
|
|
169
|
-
],
|
|
170
|
-
[
|
|
171
|
-
'.aac',
|
|
172
|
-
{
|
|
173
|
-
declared: ['audio/aac', 'audio/x-aac', 'audio/aacp'],
|
|
174
|
-
kind: 'audio',
|
|
175
|
-
// A raw ADTS stream: twelve sync bits, MPEG-4 or MPEG-2, no CRC.
|
|
176
|
-
signatures: [[{ offset: 0, bytes: [0xff, 0xf1] }], [{ offset: 0, bytes: [0xff, 0xf9] }]],
|
|
177
|
-
},
|
|
178
|
-
],
|
|
179
|
-
['.ogg', { declared: ['audio/ogg', 'application/ogg'], kind: 'audio', signatures: [OGG] }],
|
|
180
|
-
['.oga', { declared: ['audio/ogg', 'application/ogg'], kind: 'audio', signatures: [OGG] }],
|
|
181
|
-
['.opus', { declared: ['audio/ogg', 'audio/opus'], kind: 'audio', signatures: [OGG] }],
|
|
182
|
-
['.mp4', { declared: ['video/mp4'], kind: 'video', signatures: [ISO_BASE_MEDIA] }],
|
|
183
|
-
['.m4v', { declared: ['video/mp4', 'video/x-m4v'], kind: 'video', signatures: [ISO_BASE_MEDIA] }],
|
|
184
|
-
[
|
|
185
|
-
'.webm',
|
|
186
|
-
{
|
|
187
|
-
declared: ['video/webm', 'audio/webm'],
|
|
188
|
-
kind: 'video',
|
|
189
|
-
// The EBML header every Matroska file, WebM included, opens with.
|
|
190
|
-
signatures: [[{ offset: 0, bytes: [0x1a, 0x45, 0xdf, 0xa3] }]],
|
|
191
|
-
},
|
|
192
|
-
],
|
|
193
|
-
]);
|
|
194
|
-
/** The extensions a site may put in its allowlist, sorted. */
|
|
195
|
-
export const KNOWN_UPLOAD_TYPES = [...UPLOAD_MEDIA_TYPES.keys()].sort();
|
|
196
|
-
/**
|
|
197
|
-
* An extension as the allowlist spells it: lower case, with the dot.
|
|
198
|
-
*
|
|
199
|
-
* `PNG`, `.Png` and `png` are all the same thing to somebody writing a config
|
|
200
|
-
* file, so they are the same thing here.
|
|
201
|
-
*/
|
|
202
|
-
export function normalizeUploadType(value) {
|
|
203
|
-
const trimmed = value.trim().toLowerCase();
|
|
204
|
-
if (trimmed === '')
|
|
205
|
-
return '';
|
|
206
|
-
return trimmed.startsWith('.') ? trimmed : `.${trimmed}`;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* The media type a feed or an attachment announces for this kind of file: the
|
|
210
|
-
* first one {@link UploadMediaType.declared} lists, which is the registered
|
|
211
|
-
* name where a browser may also send an older one.
|
|
212
|
-
*/
|
|
213
|
-
export function canonicalType(media) {
|
|
214
|
-
return media.declared[0];
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* The `Content-Type` an upload of this kind is served with: its
|
|
218
|
-
* {@link canonicalType}, with the character set when it is text.
|
|
219
|
-
*/
|
|
220
|
-
export function servedType(media) {
|
|
221
|
-
const type = media.declared[0] ?? 'application/octet-stream';
|
|
222
|
-
return media.text === true ? `${type}; charset=utf-8` : type;
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Whether the first bytes of a file are the ones its extension implies.
|
|
226
|
-
*
|
|
227
|
-
* A format with no signature — the text ones — matches anything, because there
|
|
228
|
-
* is nothing to compare. Returns `false` for a file too short to hold the
|
|
229
|
-
* header it claims.
|
|
230
|
-
*/
|
|
231
|
-
export function matchesSignature(media, bytes) {
|
|
232
|
-
const alternatives = media.signatures;
|
|
233
|
-
if (alternatives === undefined)
|
|
234
|
-
return true;
|
|
235
|
-
return alternatives.some((signature) => signature.every((part) => part.bytes.every((byte, index) => bytes[part.offset + index] === byte)));
|
|
236
|
-
}
|
|
237
|
-
//# sourceMappingURL=media.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/content/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsCH,uEAAuE;AACvE,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,cAAc,GAA+B,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEzF,gDAAgD;AAChD,MAAM,GAAG,GAA+B,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE9E;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAyC,IAAI,GAAG,CAG7E;IACA;QACE,MAAM;QACN;YACE,QAAQ,EAAE,CAAC,WAAW,CAAC;YACvB,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;SACvF;KACF;IACD;QACE,MAAM;QACN;YACE,QAAQ,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;YACrC,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;SACzD;KACF;IACD;QACE,OAAO;QACP;YACE,QAAQ,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;YACrC,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;SACzD;KACF;IACD;QACE,MAAM;QACN;YACE,QAAQ,EAAE,CAAC,WAAW,CAAC;YACvB,IAAI,EAAE,OAAO;YACb,UAAU,EAAE;gBACV,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;aACxC;SACF;KACF;IACD;QACE,OAAO;QACP;YACE,QAAQ,EAAE,CAAC,YAAY,CAAC;YACxB,IAAI,EAAE,OAAO;YACb,wEAAwE;YACxE,+BAA+B;YAC/B,UAAU,EAAE;gBACV;oBACE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;oBACnC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;iBACpC;aACF;SACF;KACF;IACD;QACE,OAAO;QACP;YACE,QAAQ,EAAE,CAAC,YAAY,CAAC;YACxB,IAAI,EAAE,OAAO;YACb,iEAAiE;YACjE,UAAU,EAAE;gBACV;oBACE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;oBACnC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;iBACpC;gBACD;oBACE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;oBACnC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;iBACpC;aACF;SACF;KACF;IACD;QACE,MAAM;QACN;YACE,QAAQ,EAAE,CAAC,iBAAiB,CAAC;YAC7B,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACrD;KACF;IACD,6EAA6E;IAC7E,4EAA4E;IAC5E,yEAAyE;IACzE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,0BAA0B,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChG;QACE,KAAK;QACL;YACE,QAAQ,EAAE,CAAC,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,0BAA0B,CAAC;YACxF,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,IAAI;SACX;KACF;IACD,2EAA2E;IAC3E,4EAA4E;IAC5E,qBAAqB;IACrB;QACE,MAAM;QACN;YACE,QAAQ,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,0BAA0B,CAAC;YAChE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,IAAI;YACV,UAAU,EAAE;gBACV,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;aAC/D;SACF;KACF;IACD;QACE,MAAM;QACN;YACE,QAAQ,EAAE,CAAC,sBAAsB,EAAE,UAAU,EAAE,YAAY,EAAE,0BAA0B,CAAC;YACxF,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,IAAI;SACX;KACF;IACD;QACE,MAAM;QACN;YACE,QAAQ,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;YACrC,IAAI,EAAE,OAAO;YACb,sEAAsE;YACtE,0DAA0D;YAC1D,UAAU,EAAE;gBACV,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACpC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACpC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACpC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;aACrC;SACF;KACF;IACD;QACE,MAAM;QACN;YACE,QAAQ,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC;YACnD,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,CAAC,cAAc,CAAC;SAC7B;KACF;IACD;QACE,MAAM;QACN;YACE,QAAQ,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAC;YACpD,IAAI,EAAE,OAAO;YACb,iEAAiE;YACjE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;SACzF;KACF;IACD,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1F,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1F,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACtF,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;IAClF,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;IACjG;QACE,OAAO;QACP;YACE,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;YACtC,IAAI,EAAE,OAAO;YACb,kEAAkE;YAClE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;SAC/D;KACF;CACF,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAsB,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAE3F;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAsB;IAClD,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,0BAA0B,CAAC;IAC7D,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAsB,EAAE,KAAiB;IACxE,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC;IACtC,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACrC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CACvE,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { FieldError } from './form-error.ts';
|
|
2
|
-
import type { Read, ReadOf } from './read.ts';
|
|
3
|
-
export interface ReadOfForm {
|
|
4
|
-
name: string;
|
|
5
|
-
author: string;
|
|
6
|
-
uid: string;
|
|
7
|
-
url: string;
|
|
8
|
-
photo: string;
|
|
9
|
-
photoAlt: string;
|
|
10
|
-
}
|
|
11
|
-
export declare const READ_FIELDS: {
|
|
12
|
-
readonly status: 'read-status';
|
|
13
|
-
readonly name: 'read-of-name';
|
|
14
|
-
readonly author: 'read-of-author';
|
|
15
|
-
readonly uid: 'read-of-uid';
|
|
16
|
-
readonly url: 'read-of-url';
|
|
17
|
-
readonly photo: 'read-of-photo';
|
|
18
|
-
readonly photoAlt: 'read-of-photo-alt';
|
|
19
|
-
};
|
|
20
|
-
export declare function submittedReadOfForm(body: Readonly<Record<string, unknown>>): ReadOfForm;
|
|
21
|
-
export declare const BLANK_READ_OF_FORM: ReadOfForm;
|
|
22
|
-
export declare function readOfForm(of: ReadOf | undefined): ReadOfForm;
|
|
23
|
-
export declare function resolveRead(status: string, of: ReadOfForm, contentDir: string): {
|
|
24
|
-
read: Read | undefined;
|
|
25
|
-
} | FieldError;
|
|
26
|
-
export declare function readOfFromMicropub(values: readonly unknown[], refuse: (message: string) => void, baseUrl: string): ReadOfForm;
|
|
27
|
-
export declare function readCite({ photo, ...of }: ReadOf, baseUrl: string): {
|
|
28
|
-
type: string[];
|
|
29
|
-
properties: Record<string, unknown[]>;
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=read-form.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read-form.d.ts","sourceRoot":"","sources":["../../src/content/read-form.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,WAAW;aACtB,MAAM,EAAE,aAAa;aACrB,IAAI,EAAE,cAAc;aACpB,MAAM,EAAE,gBAAgB;aACxB,GAAG,EAAE,aAAa;aAClB,GAAG,EAAE,aAAa;aAClB,KAAK,EAAE,eAAe;aACtB,QAAQ,EAAE,mBAAmB;CACrB,CAAC;AAEX,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,UAAU,CASvF;AAED,eAAO,MAAM,kBAAkB,EAAE,UAOhC,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAS7D;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,UAAU,EACd,UAAU,EAAE,MAAM,GACjB;IAAE,IAAI,EAAE,IAAI,GAAG,SAAS,CAAA;CAAE,GAAG,UAAU,CAmDzC;AAKD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,OAAO,EAAE,EAC1B,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACjC,OAAO,EAAE,MAAM,GACd,UAAU,CAiDZ;AAED,wBAAgB,QAAQ,CACtB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EACxB,OAAO,EAAE,MAAM,GACd;IACD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;CACvC,CAWA"}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { trimmedField } from '../util/forms.js';
|
|
2
|
-
import { isUploadUrl, isWebUrl } from './enclosure.js';
|
|
3
|
-
import { isLibraryImage, photoRowFromMicropub, photoToMicropub } from './photo-form.js';
|
|
4
|
-
import { isReadStatus, READ_STATUSES } from './read.js';
|
|
5
|
-
export const READ_FIELDS = {
|
|
6
|
-
status: 'read-status',
|
|
7
|
-
name: 'read-of-name',
|
|
8
|
-
author: 'read-of-author',
|
|
9
|
-
uid: 'read-of-uid',
|
|
10
|
-
url: 'read-of-url',
|
|
11
|
-
photo: 'read-of-photo',
|
|
12
|
-
photoAlt: 'read-of-photo-alt',
|
|
13
|
-
};
|
|
14
|
-
export function submittedReadOfForm(body) {
|
|
15
|
-
return {
|
|
16
|
-
name: trimmedField(body, READ_FIELDS.name),
|
|
17
|
-
author: trimmedField(body, READ_FIELDS.author),
|
|
18
|
-
uid: trimmedField(body, READ_FIELDS.uid),
|
|
19
|
-
url: trimmedField(body, READ_FIELDS.url),
|
|
20
|
-
photo: trimmedField(body, READ_FIELDS.photo),
|
|
21
|
-
photoAlt: trimmedField(body, READ_FIELDS.photoAlt),
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
export const BLANK_READ_OF_FORM = {
|
|
25
|
-
name: '',
|
|
26
|
-
author: '',
|
|
27
|
-
uid: '',
|
|
28
|
-
url: '',
|
|
29
|
-
photo: '',
|
|
30
|
-
photoAlt: '',
|
|
31
|
-
};
|
|
32
|
-
export function readOfForm(of) {
|
|
33
|
-
return {
|
|
34
|
-
name: of?.name ?? '',
|
|
35
|
-
author: of?.author ?? '',
|
|
36
|
-
uid: of?.uid ?? '',
|
|
37
|
-
url: of?.url ?? '',
|
|
38
|
-
photo: of?.photo?.url ?? '',
|
|
39
|
-
photoAlt: of?.photo?.alt ?? '',
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
export function resolveRead(status, of, contentDir) {
|
|
43
|
-
const filled = Object.values(of).some((value) => value !== '');
|
|
44
|
-
if (status === '' && !filled)
|
|
45
|
-
return { read: undefined };
|
|
46
|
-
if (status !== '' && !isReadStatus(status)) {
|
|
47
|
-
return {
|
|
48
|
-
error: `A read status is ${READ_STATUSES.join(', ')}, not ${status}.`,
|
|
49
|
-
field: 'editor-read-status',
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
if (of.name === '') {
|
|
53
|
-
return { error: 'A read needs the title of what was read.', field: 'editor-read-of-name' };
|
|
54
|
-
}
|
|
55
|
-
if (!isReadStatus(status)) {
|
|
56
|
-
return {
|
|
57
|
-
error: 'A read needs a read status: want to read, currently reading or finished.',
|
|
58
|
-
field: 'editor-read-status',
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
if (of.url !== '' && !isWebUrl(of.url)) {
|
|
62
|
-
return {
|
|
63
|
-
error: 'The address of what was read has to be a web address, like https://example.com/a-book/.',
|
|
64
|
-
field: 'editor-read-of-url',
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
if (isUploadUrl(of.photo)) {
|
|
68
|
-
if (!isLibraryImage(of.photo, contentDir)) {
|
|
69
|
-
return {
|
|
70
|
-
error: `The cover ${of.photo} is not an image in the media library.`,
|
|
71
|
-
field: 'editor-read-of-photo',
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
else if (of.photo !== '' && !isWebUrl(of.photo)) {
|
|
76
|
-
return {
|
|
77
|
-
error: `A cover is an image in the media library or a web address, not ${of.photo}.`,
|
|
78
|
-
field: 'editor-read-of-photo',
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
const word = (value) => (value === '' ? undefined : value);
|
|
82
|
-
return {
|
|
83
|
-
read: {
|
|
84
|
-
status,
|
|
85
|
-
of: {
|
|
86
|
-
name: of.name,
|
|
87
|
-
author: word(of.author),
|
|
88
|
-
uid: word(of.uid),
|
|
89
|
-
url: word(of.url),
|
|
90
|
-
...(of.photo === '' ? {} : { photo: { url: of.photo, alt: word(of.photoAlt) } }),
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
const READ_OF_TEXT_PROPERTIES = ['name', 'author', 'uid', 'url'];
|
|
96
|
-
const READ_OF_PROPERTIES = [...READ_OF_TEXT_PROPERTIES, 'photo'];
|
|
97
|
-
export function readOfFromMicropub(values, refuse, baseUrl) {
|
|
98
|
-
if (values.length > 1)
|
|
99
|
-
refuse('read-of takes one value.');
|
|
100
|
-
const [value] = values;
|
|
101
|
-
if (value === undefined)
|
|
102
|
-
return BLANK_READ_OF_FORM;
|
|
103
|
-
const { type, properties } = typeof value === 'object' && value !== null ? value : {};
|
|
104
|
-
if (!Array.isArray(type) ||
|
|
105
|
-
!type.includes('h-cite') ||
|
|
106
|
-
typeof properties !== 'object' ||
|
|
107
|
-
properties === null) {
|
|
108
|
-
refuse('read-of is an h-cite, { "type": ["h-cite"], "properties": { "name": ["…"] } }.');
|
|
109
|
-
return BLANK_READ_OF_FORM;
|
|
110
|
-
}
|
|
111
|
-
const given = properties;
|
|
112
|
-
const unknown = Object.keys(given).filter((name) => !READ_OF_PROPERTIES.includes(name));
|
|
113
|
-
if (unknown.length > 0)
|
|
114
|
-
refuse(`read-of does not understand ${unknown.join(', ')}.`);
|
|
115
|
-
const field = (name) => {
|
|
116
|
-
const values = given[name] ?? [];
|
|
117
|
-
if (!Array.isArray(values) ||
|
|
118
|
-
values.length > 1 ||
|
|
119
|
-
!values.every((v) => typeof v === 'string')) {
|
|
120
|
-
refuse(`read-of ${name} takes one text value.`);
|
|
121
|
-
return '';
|
|
122
|
-
}
|
|
123
|
-
return (values[0] ?? '').trim();
|
|
124
|
-
};
|
|
125
|
-
const photos = given.photo ?? [];
|
|
126
|
-
let photo = { url: '', alt: '' };
|
|
127
|
-
if (!Array.isArray(photos) || photos.length > 1)
|
|
128
|
-
refuse('read-of photo takes one value.');
|
|
129
|
-
else if (photos.length === 1) {
|
|
130
|
-
const row = photoRowFromMicropub(photos[0], baseUrl);
|
|
131
|
-
if (row === undefined)
|
|
132
|
-
refuse('read-of photo is a web address or { "value": "…", "alt": "…" }.');
|
|
133
|
-
else
|
|
134
|
-
photo = row;
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
name: field('name'),
|
|
138
|
-
author: field('author'),
|
|
139
|
-
uid: field('uid'),
|
|
140
|
-
url: field('url'),
|
|
141
|
-
photo: photo.url,
|
|
142
|
-
photoAlt: photo.alt,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
export function readCite({ photo, ...of }, baseUrl) {
|
|
146
|
-
const fields = Object.entries(of).filter(([, value]) => value !== undefined);
|
|
147
|
-
return {
|
|
148
|
-
type: ['h-cite'],
|
|
149
|
-
properties: {
|
|
150
|
-
...Object.fromEntries(fields.map(([name, value]) => [name, [value]])),
|
|
151
|
-
...(photo === undefined
|
|
152
|
-
? {}
|
|
153
|
-
: { photo: [photoToMicropub({ url: photo.url, alt: photo.alt ?? '' }, baseUrl)] }),
|
|
154
|
-
},
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
//# sourceMappingURL=read-form.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read-form.js","sourceRoot":"","sources":["../../src/content/read-form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAYxD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,gBAAgB;IACxB,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,aAAa;IAClB,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,mBAAmB;CACrB,CAAC;AAEX,MAAM,UAAU,mBAAmB,CAAC,IAAuC;IACzE,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;QAC1C,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC;QAC9C,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC;QACxC,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC;QACxC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC;QAC5C,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC5C,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,EAAE;IACV,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IACP,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,EAAsB;IAC/C,OAAO;QACL,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE;QACpB,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,EAAE;QACxB,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE;QAClB,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE;QAClB,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE;QAC3B,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,MAAc,EACd,EAAc,EACd,UAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC/D,IAAI,MAAM,KAAK,EAAE,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACzD,IAAI,MAAM,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,KAAK,EAAE,oBAAoB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG;YACrE,KAAK,EAAE,oBAAoB;SAC5B,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK,EAAE,0CAA0C,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,KAAK,EAAE,0EAA0E;YACjF,KAAK,EAAE,oBAAoB;SAC5B,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,KAAK,EACH,yFAAyF;YAC3F,KAAK,EAAE,oBAAoB;SAC5B,CAAC;IACJ,CAAC;IACD,IAAI,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;YAC1C,OAAO;gBACL,KAAK,EAAE,aAAa,EAAE,CAAC,KAAK,wCAAwC;gBACpE,KAAK,EAAE,sBAAsB;aAC9B,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO;YACL,KAAK,EAAE,kEAAkE,EAAE,CAAC,KAAK,GAAG;YACpF,KAAK,EAAE,sBAAsB;SAC9B,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,KAAa,EAAsB,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvF,OAAO;QACL,IAAI,EAAE;YACJ,MAAM;YACN,EAAE,EAAE;gBACF,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;gBACvB,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;gBACjB,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;gBACjB,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;aACjF;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAC1E,MAAM,kBAAkB,GAAG,CAAC,GAAG,uBAAuB,EAAE,OAAO,CAAU,CAAC;AAE1E,MAAM,UAAU,kBAAkB,CAChC,MAA0B,EAC1B,MAAiC,EACjC,OAAe;IAEf,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IACvB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,kBAAkB,CAAC;IACnD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GACxB,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACpB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI,EACnB,CAAC;QACD,MAAM,CAAC,gFAAgF,CAAC,CAAC;QACzF,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,MAAM,KAAK,GAAG,UAAqC,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CACvC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAE,kBAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC,CACpE,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,+BAA+B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,CAAC,IAA8C,EAAU,EAAE;QACvE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACtB,MAAM,CAAC,MAAM,GAAG,CAAC;YACjB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAC3C,CAAC;YACD,MAAM,CAAC,WAAW,IAAI,wBAAwB,CAAC,CAAC;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,gCAAgC,CAAC,CAAC;SACrF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,GAAG,KAAK,SAAS;YACnB,MAAM,CAAC,iEAAiE,CAAC,CAAC;;YACvE,KAAK,GAAG,GAAG,CAAC;IACnB,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;QACvB,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC;QACjB,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC,GAAG;QAChB,QAAQ,EAAE,KAAK,CAAC,GAAG;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAU,EACxB,OAAe;IAKf,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC7E,OAAO;QACL,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,UAAU,EAAE;YACV,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrE,GAAG,CAAC,KAAK,KAAK,SAAS;gBACrB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;SACrF;KACF,CAAC;AACJ,CAAC"}
|
package/dist/content/read.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { AltTextLibrary } from './alt-text.ts';
|
|
2
|
-
import type { Photo } from './photo.ts';
|
|
3
|
-
export declare const READ_OF_FRONT_MATTER_KEY = "read-of";
|
|
4
|
-
export declare const READ_STATUS_FRONT_MATTER_KEY = "read-status";
|
|
5
|
-
export declare const READ_STATUSES: readonly ['to-read', 'reading', 'finished'];
|
|
6
|
-
export type ReadStatus = (typeof READ_STATUSES)[number];
|
|
7
|
-
export declare const READ_STATUS_LABELS: Readonly<Record<ReadStatus, string>>;
|
|
8
|
-
export interface ReadOf {
|
|
9
|
-
readonly name: string;
|
|
10
|
-
readonly author?: string | undefined;
|
|
11
|
-
readonly uid?: string | undefined;
|
|
12
|
-
readonly url?: string | undefined;
|
|
13
|
-
readonly photo?: Photo | undefined;
|
|
14
|
-
}
|
|
15
|
-
export interface Read {
|
|
16
|
-
readonly status: ReadStatus;
|
|
17
|
-
readonly of: ReadOf;
|
|
18
|
-
}
|
|
19
|
-
export declare function isReadStatus(value: unknown): value is ReadStatus;
|
|
20
|
-
export declare function readOf(extra: Readonly<Record<string, unknown>>): Read | undefined;
|
|
21
|
-
export declare function readWork(value: unknown): ReadOf | undefined;
|
|
22
|
-
export declare function uidLabel(uid: string): string;
|
|
23
|
-
export declare function readWorkFrontMatter({ name, author, uid, url, photo }: ReadOf): ReadOf;
|
|
24
|
-
export interface ReadLineOptions {
|
|
25
|
-
readonly library?: AltTextLibrary | undefined;
|
|
26
|
-
readonly baseUrl?: string | undefined;
|
|
27
|
-
}
|
|
28
|
-
export declare function readLine(read: Read | undefined, options?: ReadLineOptions): string;
|
|
29
|
-
//# sourceMappingURL=read.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/content/read.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAClD,eAAO,MAAM,4BAA4B,gBAAgB,CAAC;AAE1D,eAAO,MAAM,aAAa,YAAI,SAAS,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAEzE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAInE,CAAC;AAEF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAKjF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAkB3D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,GAAG,MAAM,CAUrF;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAiBtF"}
|
package/dist/content/read.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { escapeAttribute, escapeText } from '../util/html.js';
|
|
2
|
-
import { absoluteUrl } from '../util/url.js';
|
|
3
|
-
import { isWebUrl } from './enclosure.js';
|
|
4
|
-
import { photoAlt, photoOf } from './photo.js';
|
|
5
|
-
export const READ_OF_FRONT_MATTER_KEY = 'read-of';
|
|
6
|
-
export const READ_STATUS_FRONT_MATTER_KEY = 'read-status';
|
|
7
|
-
export const READ_STATUSES = ['to-read', 'reading', 'finished'];
|
|
8
|
-
export const READ_STATUS_LABELS = {
|
|
9
|
-
'to-read': 'Want to read',
|
|
10
|
-
reading: 'Currently reading',
|
|
11
|
-
finished: 'Finished reading',
|
|
12
|
-
};
|
|
13
|
-
export function isReadStatus(value) {
|
|
14
|
-
return READ_STATUSES.includes(value);
|
|
15
|
-
}
|
|
16
|
-
export function readOf(extra) {
|
|
17
|
-
const status = extra[READ_STATUS_FRONT_MATTER_KEY];
|
|
18
|
-
const of = readWork(extra[READ_OF_FRONT_MATTER_KEY]);
|
|
19
|
-
if (!isReadStatus(status) || of === undefined)
|
|
20
|
-
return undefined;
|
|
21
|
-
return { status, of: isWebUrl(of.url ?? '') ? of : { ...of, url: undefined } };
|
|
22
|
-
}
|
|
23
|
-
export function readWork(value) {
|
|
24
|
-
if (typeof value === 'string')
|
|
25
|
-
return value.trim() === '' ? undefined : { name: value.trim() };
|
|
26
|
-
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
27
|
-
return undefined;
|
|
28
|
-
const fields = value;
|
|
29
|
-
const word = (key) => {
|
|
30
|
-
const field = fields[key];
|
|
31
|
-
return typeof field === 'string' && field.trim() !== '' ? field.trim() : undefined;
|
|
32
|
-
};
|
|
33
|
-
const name = word('name');
|
|
34
|
-
if (name === undefined)
|
|
35
|
-
return undefined;
|
|
36
|
-
const photo = Array.isArray(fields.photo) ? undefined : photoOf(fields.photo);
|
|
37
|
-
return readWorkFrontMatter({
|
|
38
|
-
name,
|
|
39
|
-
author: word('author'),
|
|
40
|
-
uid: word('uid'),
|
|
41
|
-
url: word('url'),
|
|
42
|
-
photo,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
export function uidLabel(uid) {
|
|
46
|
-
return /^isbn:/i.test(uid) ? `ISBN: ${uid.slice('isbn:'.length)}` : uid;
|
|
47
|
-
}
|
|
48
|
-
export function readWorkFrontMatter({ name, author, uid, url, photo }) {
|
|
49
|
-
return {
|
|
50
|
-
name,
|
|
51
|
-
...(author ? { author } : {}),
|
|
52
|
-
...(uid ? { uid } : {}),
|
|
53
|
-
...(url ? { url } : {}),
|
|
54
|
-
...(photo
|
|
55
|
-
? { photo: photo.alt ? { url: photo.url, alt: photo.alt } : { url: photo.url } }
|
|
56
|
-
: {}),
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
export function readLine(read, options = {}) {
|
|
60
|
-
if (read === undefined)
|
|
61
|
-
return '';
|
|
62
|
-
const { status, of } = read;
|
|
63
|
-
const cited = `<cite class="p-name">${escapeText(of.name)}</cite>`;
|
|
64
|
-
return (`<p class="read-line"><data class="p-read-status" value="${status}">` +
|
|
65
|
-
`${READ_STATUS_LABELS[status]}</data>: <span class="p-read-of h-cite">` +
|
|
66
|
-
(of.photo === undefined ? '' : cover(of.photo, options)) +
|
|
67
|
-
(of.url === undefined
|
|
68
|
-
? cited
|
|
69
|
-
: `<a class="u-url" href="${escapeAttribute(of.url)}">${cited}</a>`) +
|
|
70
|
-
(of.author === undefined ? '' : ` by <span class="p-author">${escapeText(of.author)}</span>`) +
|
|
71
|
-
(of.uid === undefined
|
|
72
|
-
? ''
|
|
73
|
-
: `, <data class="p-uid" value="${escapeAttribute(of.uid)}">${escapeText(uidLabel(of.uid))}</data>`) +
|
|
74
|
-
'</span></p>\n');
|
|
75
|
-
}
|
|
76
|
-
function cover(photo, { library, baseUrl }) {
|
|
77
|
-
const src = baseUrl === undefined ? photo.url : absoluteUrl(photo.url, baseUrl);
|
|
78
|
-
const alt = photoAlt(photo, library ?? new Map()) ?? '';
|
|
79
|
-
return (`<span class="read-cover"><img class="u-photo" src="${escapeAttribute(src)}"` +
|
|
80
|
-
` alt="${escapeAttribute(alt)}"></span>`);
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=read.js.map
|
package/dist/content/read.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/content/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The archives the admin's export job leaves in `data/exports/` for a
|
|
3
|
-
* download (decision-55, section 4). Each holds actor keys, password hashes
|
|
4
|
-
* and personal data, so only the newest is kept and it goes 24 hours after it
|
|
5
|
-
* was written. Its age comes from the time in its name, which the site's
|
|
6
|
-
* clock wrote.
|
|
7
|
-
*/
|
|
8
|
-
export declare const EXPORT_LIFETIME_MS: number;
|
|
9
|
-
export interface ExportArchive {
|
|
10
|
-
readonly name: string;
|
|
11
|
-
readonly path: string;
|
|
12
|
-
readonly writtenAt: Date;
|
|
13
|
-
readonly expiresAt: Date;
|
|
14
|
-
}
|
|
15
|
-
/** Delete the archives 24 hours old or older, and say how many went. */
|
|
16
|
-
export declare function expireExports(dataDir: string, now: Date): Promise<number>;
|
|
17
|
-
/** The archive a download serves: the newest, unless it has expired. Expired ones are deleted. */
|
|
18
|
-
export declare function currentExport(dataDir: string, now: Date): Promise<(ExportArchive & {
|
|
19
|
-
readonly size: number;
|
|
20
|
-
}) | undefined>;
|
|
21
|
-
/**
|
|
22
|
-
* Delete what an export a crash cut off left: everything that is not an
|
|
23
|
-
* archive. Only one export job runs at a time, so no other writer's temporary
|
|
24
|
-
* file is here.
|
|
25
|
-
*/
|
|
26
|
-
export declare function clearUnfinishedExports(dataDir: string): Promise<void>;
|
|
27
|
-
/** Empty the folder but for the archive just written. */
|
|
28
|
-
export declare function keepOnlyExport(dataDir: string, keep: string): Promise<void>;
|
|
29
|
-
//# sourceMappingURL=export-archives.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"export-archives.d.ts","sourceRoot":"","sources":["../../src/export/export-archives.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,eAAO,MAAM,kBAAkB,QAAsB,CAAC;AAItD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAmCD,wEAAwE;AACxE,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAS/E;AAED,kGAAkG;AAClG,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,CAAC,aAAa,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,CAAC,CAUlE;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3E;AAED,yDAAyD;AACzD,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF"}
|