@geekity/cms 0.26.0 → 0.28.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 +169 -33
- package/admin/layouts/shell.njk +6 -0
- package/admin/pages/documents/editor.njk +4 -0
- package/admin/pages/plugins/confirm.njk +42 -0
- package/admin/pages/plugins/installed.njk +86 -4
- package/admin/pages/tools/dev-mode.njk +47 -0
- package/admin/static/admin.css +15 -0
- package/admin/static/editor-actions.js +13 -9
- package/admin/static/editor.js +31 -17
- package/dist/admin/dev-mode.d.ts +9 -0
- package/dist/admin/dev-mode.d.ts.map +1 -0
- package/dist/admin/dev-mode.js +42 -0
- package/dist/admin/dev-mode.js.map +1 -0
- package/dist/admin/documents.d.ts +3 -0
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +12 -3
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/editor-actions.js +3 -1
- package/dist/admin/editor-actions.js.map +1 -1
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +2 -0
- package/dist/admin/federation.js.map +1 -1
- package/dist/admin/menu.d.ts.map +1 -1
- package/dist/admin/menu.js +2 -0
- package/dist/admin/menu.js.map +1 -1
- package/dist/admin/own-paragraph.d.ts +7 -0
- package/dist/admin/own-paragraph.d.ts.map +1 -0
- package/dist/admin/own-paragraph.js +9 -0
- package/dist/admin/own-paragraph.js.map +1 -0
- package/dist/admin/plugins.d.ts +6 -0
- package/dist/admin/plugins.d.ts.map +1 -1
- package/dist/admin/plugins.js +287 -5
- package/dist/admin/plugins.js.map +1 -1
- package/dist/admin/preview.d.ts.map +1 -1
- package/dist/admin/preview.js +4 -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-email.d.ts.map +1 -1
- package/dist/admin/settings-email.js +4 -0
- package/dist/admin/settings-email.js.map +1 -1
- package/dist/admin/store.d.ts +4 -2
- package/dist/admin/store.d.ts.map +1 -1
- package/dist/admin/store.js +1 -1
- package/dist/admin/store.js.map +1 -1
- package/dist/admin/taxonomy.d.ts +4 -1
- package/dist/admin/taxonomy.d.ts.map +1 -1
- package/dist/admin/taxonomy.js +11 -7
- package/dist/admin/taxonomy.js.map +1 -1
- package/dist/admin/templates.d.ts +2 -0
- 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/uploads.d.ts +7 -1
- package/dist/admin/uploads.d.ts.map +1 -1
- package/dist/admin/uploads.js +33 -30
- package/dist/admin/uploads.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +127 -25
- package/dist/cli.js.map +1 -1
- package/dist/comments/index.d.ts +1 -1
- package/dist/comments/index.d.ts.map +1 -1
- package/dist/comments/index.js +1 -1
- package/dist/comments/index.js.map +1 -1
- package/dist/comments/records.d.ts +1 -0
- package/dist/comments/records.d.ts.map +1 -1
- package/dist/comments/records.js +39 -10
- package/dist/comments/records.js.map +1 -1
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +33 -1
- package/dist/content/markdown.js.map +1 -1
- package/dist/content/migrated.d.ts +6 -0
- package/dist/content/migrated.d.ts.map +1 -0
- package/dist/content/migrated.js +12 -0
- package/dist/content/migrated.js.map +1 -0
- package/dist/content/original.d.ts +3 -0
- package/dist/content/original.d.ts.map +1 -0
- package/dist/content/original.js +12 -0
- package/dist/content/original.js.map +1 -0
- package/dist/content/parser.d.ts +5 -0
- package/dist/content/parser.d.ts.map +1 -1
- package/dist/content/parser.js +3 -2
- package/dist/content/parser.js.map +1 -1
- package/dist/content/schedule.d.ts +7 -0
- package/dist/content/schedule.d.ts.map +1 -1
- package/dist/content/schedule.js +11 -2
- package/dist/content/schedule.js.map +1 -1
- package/dist/content/store.d.ts +21 -3
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js +169 -42
- package/dist/content/store.js.map +1 -1
- package/dist/content/sync.d.ts.map +1 -1
- package/dist/content/sync.js +27 -5
- package/dist/content/sync.js.map +1 -1
- package/dist/content/tags.d.ts +26 -0
- package/dist/content/tags.d.ts.map +1 -0
- package/dist/content/tags.js +41 -0
- package/dist/content/tags.js.map +1 -0
- package/dist/content/video.d.ts +12 -0
- package/dist/content/video.d.ts.map +1 -0
- package/dist/content/video.js +91 -0
- package/dist/content/video.js.map +1 -0
- package/dist/dev-mode.d.ts +28 -0
- package/dist/dev-mode.d.ts.map +1 -0
- package/dist/dev-mode.js +64 -0
- package/dist/dev-mode.js.map +1 -0
- package/dist/drain.d.ts +9 -3
- package/dist/drain.d.ts.map +1 -1
- package/dist/drain.js +24 -3
- package/dist/drain.js.map +1 -1
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +3 -1
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/delivery.d.ts +2 -0
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +46 -16
- package/dist/federation/delivery.js.map +1 -1
- package/dist/federation/inbox.d.ts.map +1 -1
- package/dist/federation/inbox.js +13 -3
- package/dist/federation/inbox.js.map +1 -1
- package/dist/federation/mount.d.ts.map +1 -1
- package/dist/federation/mount.js +8 -4
- package/dist/federation/mount.js.map +1 -1
- package/dist/federation/relays.d.ts.map +1 -1
- package/dist/federation/relays.js +16 -1
- package/dist/federation/relays.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/dist/indexnow.d.ts +1 -1
- package/dist/indexnow.d.ts.map +1 -1
- package/dist/indexnow.js +7 -0
- package/dist/indexnow.js.map +1 -1
- package/dist/mail/service.d.ts +3 -1
- package/dist/mail/service.d.ts.map +1 -1
- package/dist/mail/service.js +17 -0
- package/dist/mail/service.js.map +1 -1
- package/dist/notify.d.ts +1 -1
- package/dist/notify.d.ts.map +1 -1
- package/dist/notify.js +9 -2
- package/dist/notify.js.map +1 -1
- package/dist/plugin.d.ts +75 -4
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +8 -0
- package/dist/plugin.js.map +1 -1
- package/dist/plugins/changes.d.ts +31 -0
- package/dist/plugins/changes.d.ts.map +1 -0
- package/dist/plugins/changes.js +40 -0
- package/dist/plugins/changes.js.map +1 -0
- package/dist/plugins/folder.d.ts +2 -0
- package/dist/plugins/folder.d.ts.map +1 -1
- package/dist/plugins/folder.js +26 -5
- package/dist/plugins/folder.js.map +1 -1
- package/dist/plugins/install.d.ts +30 -3
- package/dist/plugins/install.d.ts.map +1 -1
- package/dist/plugins/install.js +43 -15
- package/dist/plugins/install.js.map +1 -1
- package/dist/plugins/manage.d.ts +34 -0
- package/dist/plugins/manage.d.ts.map +1 -0
- package/dist/plugins/manage.js +98 -0
- package/dist/plugins/manage.js.map +1 -0
- package/dist/plugins/registry.js +1 -1
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/site.d.ts.map +1 -1
- package/dist/plugins/site.js +56 -0
- package/dist/plugins/site.js.map +1 -1
- package/dist/plugins/upgrade.d.ts +54 -0
- package/dist/plugins/upgrade.d.ts.map +1 -0
- package/dist/plugins/upgrade.js +240 -0
- package/dist/plugins/upgrade.js.map +1 -0
- package/dist/supervisor/control.d.ts +15 -0
- package/dist/supervisor/control.d.ts.map +1 -0
- package/dist/supervisor/control.js +89 -0
- package/dist/supervisor/control.js.map +1 -0
- package/dist/supervisor/primary.d.ts +18 -4
- package/dist/supervisor/primary.d.ts.map +1 -1
- package/dist/supervisor/primary.js +128 -16
- package/dist/supervisor/primary.js.map +1 -1
- package/dist/supervisor/protocol.d.ts +12 -0
- package/dist/supervisor/protocol.d.ts.map +1 -1
- package/dist/supervisor/protocol.js +21 -2
- package/dist/supervisor/protocol.js.map +1 -1
- package/dist/supervisor/supervision.d.ts +1 -0
- package/dist/supervisor/supervision.d.ts.map +1 -1
- package/dist/supervisor/supervision.js +14 -1
- package/dist/supervisor/supervision.js.map +1 -1
- package/dist/supervisor/worker.d.ts.map +1 -1
- package/dist/supervisor/worker.js +31 -6
- package/dist/supervisor/worker.js.map +1 -1
- package/dist/web/context.d.ts +7 -0
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +7 -4
- package/dist/web/context.js.map +1 -1
- package/dist/web/feed-item.d.ts +7 -6
- package/dist/web/feed-item.d.ts.map +1 -1
- package/dist/web/feed-item.js +5 -4
- package/dist/web/feed-item.js.map +1 -1
- package/dist/web/feed-rss.d.ts +2 -2
- package/dist/web/feed-rss.js +2 -2
- package/dist/web/redirects.d.ts +17 -10
- package/dist/web/redirects.d.ts.map +1 -1
- package/dist/web/redirects.js +83 -49
- package/dist/web/redirects.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +25 -12
- package/dist/web/routes.js.map +1 -1
- package/dist/web/taxonomy.d.ts +7 -1
- package/dist/web/taxonomy.d.ts.map +1 -1
- package/dist/web/taxonomy.js +24 -8
- package/dist/web/taxonomy.js.map +1 -1
- package/dist/webmention/service.d.ts +1 -1
- package/dist/webmention/service.d.ts.map +1 -1
- package/dist/webmention/service.js +12 -2
- package/dist/webmention/service.js.map +1 -1
- package/package.json +1 -1
- package/themes/default/README.md +154 -3
- package/themes/default/layouts/base.njk +12 -3
- package/themes/default/layouts/post.njk +8 -2
- package/themes/default/layouts/tag.njk +1 -1
- package/themes/default/partials/body-end.njk +1 -0
- package/themes/default/partials/conversation.njk +1 -1
- package/themes/default/partials/head-end.njk +1 -0
- package/themes/default/partials/tags.njk +1 -1
- package/themes/default/src/style.css +4 -0
- package/themes/default/static/style.css +8 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/admin/templates.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/admin/templates.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/uploads.d.ts
CHANGED
|
@@ -59,7 +59,7 @@ export interface StoreUploadOptions {
|
|
|
59
59
|
imagesOnly?: boolean | undefined;
|
|
60
60
|
}
|
|
61
61
|
/** Whether an upload came to a refusal rather than a stored file. */
|
|
62
|
-
export declare function refusedUpload(outcome:
|
|
62
|
+
export declare function refusedUpload<Accepted extends object>(outcome: Accepted | UploadRefusal): outcome is UploadRefusal;
|
|
63
63
|
/**
|
|
64
64
|
* Validate one submitted file and write it under
|
|
65
65
|
* `content/uploads/{yyyy}/{mm}/{slug}{ext}`, or say why it cannot be.
|
|
@@ -75,6 +75,12 @@ 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
|
+
export interface AcceptedUpload {
|
|
79
|
+
extension: string;
|
|
80
|
+
media: UploadMediaType;
|
|
81
|
+
bytes: Uint8Array;
|
|
82
|
+
}
|
|
83
|
+
export declare function acceptUpload(name: string, declared: string, bytes: Uint8Array, config: Pick<UploadConfig, 'uploadTypes' | 'uploadMaxBytes' | 'uploadMediaMaxBytes'>, options?: StoreUploadOptions): AcceptedUpload | UploadRefusal;
|
|
78
84
|
/**
|
|
79
85
|
* The largest file of this kind a site accepts: audio and video have a limit
|
|
80
86
|
* of their own, since an episode is far bigger than any picture.
|
|
@@ -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;AAGnD,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,CAC7B,cAAc,EACd,YAAY,GAAG,aAAa,GAAG,gBAAgB,GAAG,qBAAqB,CACxE,GACC,WAAW,CAAC;AAEd,yDAAyD;AACzD,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,KAAK,EAAE,eAAe,CAAC;IACvB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,8FAA8F;IAC9F,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACxB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,sEAAsE;AACtE,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,OAAO,EAAE,
|
|
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
|
@@ -42,7 +42,37 @@ export async function storeUpload(file, config, options = {}) {
|
|
|
42
42
|
return { status: 400, error: 'That upload carried no file.' };
|
|
43
43
|
}
|
|
44
44
|
const original = baseName(file.name);
|
|
45
|
-
const
|
|
45
|
+
const accepted = acceptUpload(original, declaredType(file.type), new Uint8Array(await file.arrayBuffer()), config, options);
|
|
46
|
+
if (refusedUpload(accepted))
|
|
47
|
+
return accepted;
|
|
48
|
+
const { extension, media, bytes: clean } = accepted;
|
|
49
|
+
const now = new Date();
|
|
50
|
+
const month = `${String(now.getUTCFullYear()).padStart(4, '0')}/${String(now.getUTCMonth() + 1).padStart(2, '0')}`;
|
|
51
|
+
const directory = path.join(config.contentDir, UPLOAD_DIRECTORY, ...month.split('/'));
|
|
52
|
+
await mkdir(directory, { recursive: true });
|
|
53
|
+
const stem = slugify(original.slice(0, original.length - extension.length)) || 'upload';
|
|
54
|
+
const name = await writeWithoutOverwriting(directory, stem, extension, clean);
|
|
55
|
+
// Derived immediately rather than on first sight in a page, so the encoding
|
|
56
|
+
// is paid for by whoever uploaded the file and not by whoever reads the
|
|
57
|
+
// post. A format with nothing to derive — a GIF, a PDF, a text file — comes
|
|
58
|
+
// straight back (decision-10), and a failure is reported and swallowed: a
|
|
59
|
+
// stored file with no variants is a site that serves the original, which is
|
|
60
|
+
// what it did before this feature existed.
|
|
61
|
+
try {
|
|
62
|
+
await generateImageVariants(config, `${month}/${name}`);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
66
|
+
console.warn(`Stored ${month}/${name} but could not derive its variants: ${message}`);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
url: `${UPLOAD_ASSET_PREFIX}${month}/${name}`,
|
|
70
|
+
media,
|
|
71
|
+
label: original.slice(0, original.length - extension.length).trim() || name,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function acceptUpload(name, declared, bytes, config, options = {}) {
|
|
75
|
+
const extension = path.extname(name).toLowerCase();
|
|
46
76
|
if (!config.uploadTypes.includes(extension)) {
|
|
47
77
|
const allowed = config.uploadTypes.join(', ');
|
|
48
78
|
return {
|
|
@@ -58,7 +88,6 @@ export async function storeUpload(file, config, options = {}) {
|
|
|
58
88
|
if (options.imagesOnly === true && media.kind !== 'image') {
|
|
59
89
|
return { status: 415, error: `A ${extension} is not an image, and this has to be one.` };
|
|
60
90
|
}
|
|
61
|
-
const declared = declaredType(file.type);
|
|
62
91
|
if (declared !== '' && !media.declared.includes(declared)) {
|
|
63
92
|
return {
|
|
64
93
|
status: 415,
|
|
@@ -66,16 +95,14 @@ export async function storeUpload(file, config, options = {}) {
|
|
|
66
95
|
};
|
|
67
96
|
}
|
|
68
97
|
const limit = uploadLimit(media, config);
|
|
69
|
-
if (
|
|
98
|
+
if (bytes.byteLength > limit) {
|
|
70
99
|
return { status: 413, error: tooLargeMessage(limit) };
|
|
71
100
|
}
|
|
72
|
-
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
73
101
|
if (!matchesSignature(media, bytes)) {
|
|
74
102
|
return { status: 415, error: `That file does not look like a ${extension} inside.` };
|
|
75
103
|
}
|
|
76
|
-
let clean;
|
|
77
104
|
try {
|
|
78
|
-
|
|
105
|
+
return { extension, media, bytes: stripMetadata(extension, bytes).bytes };
|
|
79
106
|
}
|
|
80
107
|
catch (error) {
|
|
81
108
|
if (!(error instanceof UnreadableMetadataError))
|
|
@@ -85,30 +112,6 @@ export async function storeUpload(file, config, options = {}) {
|
|
|
85
112
|
error: `${error.message} Its location and camera details could not be removed, so it was not stored.`,
|
|
86
113
|
};
|
|
87
114
|
}
|
|
88
|
-
const now = new Date();
|
|
89
|
-
const month = `${String(now.getUTCFullYear()).padStart(4, '0')}/${String(now.getUTCMonth() + 1).padStart(2, '0')}`;
|
|
90
|
-
const directory = path.join(config.contentDir, UPLOAD_DIRECTORY, ...month.split('/'));
|
|
91
|
-
await mkdir(directory, { recursive: true });
|
|
92
|
-
const stem = slugify(original.slice(0, original.length - extension.length)) || 'upload';
|
|
93
|
-
const name = await writeWithoutOverwriting(directory, stem, extension, clean);
|
|
94
|
-
// Derived immediately rather than on first sight in a page, so the encoding
|
|
95
|
-
// is paid for by whoever uploaded the file and not by whoever reads the
|
|
96
|
-
// post. A format with nothing to derive — a GIF, a PDF, a text file — comes
|
|
97
|
-
// straight back (decision-10), and a failure is reported and swallowed: a
|
|
98
|
-
// stored file with no variants is a site that serves the original, which is
|
|
99
|
-
// what it did before this feature existed.
|
|
100
|
-
try {
|
|
101
|
-
await generateImageVariants(config, `${month}/${name}`);
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
105
|
-
console.warn(`Stored ${month}/${name} but could not derive its variants: ${message}`);
|
|
106
|
-
}
|
|
107
|
-
return {
|
|
108
|
-
url: `${UPLOAD_ASSET_PREFIX}${month}/${name}`,
|
|
109
|
-
media,
|
|
110
|
-
label: original.slice(0, original.length - extension.length).trim() || name,
|
|
111
|
-
};
|
|
112
115
|
}
|
|
113
116
|
/**
|
|
114
117
|
* The largest file of this kind a site accepts: audio and video have a limit
|
|
@@ -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;AAC3E,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEtF,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;AAoD1C,qEAAqE;AACrE,MAAM,UAAU,aAAa,
|
|
1
|
+
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/admin/uploads.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import type { GeekityConfig } from './config.ts';
|
|
3
|
-
export type Command = 'serve' | 'init' | 'sync' | 'rebuild' | 'resend' | 'user' | 'maintenance' | 'strip-metadata' | 'plugin' | 'help' | 'version';
|
|
3
|
+
export type Command = 'serve' | 'init' | 'sync' | 'rebuild' | 'resend' | 'user' | 'maintenance' | 'dev-mode' | 'strip-metadata' | 'plugin' | 'help' | 'version';
|
|
4
4
|
export interface ParsedArgs {
|
|
5
5
|
command: Command;
|
|
6
6
|
/** Path to the config file, relative to the working directory, if the user named one. */
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2BjD,MAAM,MAAM,OAAO,GACf,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,GACT,QAAQ,GACR,MAAM,GACN,aAAa,GACb,UAAU,GACV,gBAAgB,GAChB,QAAQ,GACR,MAAM,GACN,SAAS,CAAC;AAyBd,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,yFAAyF;IACzF,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;OAIG;IACH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B;;;OAGG;IACH,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/C;;;OAGG;IACH,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB;AAyFD,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAsH7D;AASD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,aAAa,CAAC,CAyBxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW3D;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe7F;AA62BD,gEAAgE;AAChE,KAAK,aAAa,GAAG,MAAM,CAAC,cAAc,GAAG;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;CACzC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CrF"}
|
package/dist/cli.js
CHANGED
|
@@ -25,11 +25,14 @@ import { UPLOAD_DIRECTORY } from './web/assets.js';
|
|
|
25
25
|
import { createCms } from './index.js';
|
|
26
26
|
import { initSite, ownManifest, seedStarterContent } from './init.js';
|
|
27
27
|
import { importPluginFolders, scanPluginFolders } from './plugins/folder.js';
|
|
28
|
-
import {
|
|
28
|
+
import { ADD_WITH_COMMAND, addPlugin, installedFolders, parsePackageSpec, pluginRegistry, removePlugin, requirementNotes, } from './plugins/install.js';
|
|
29
|
+
import { describeUpgrade, upgradePlugins } from './plugins/upgrade.js';
|
|
29
30
|
import { pluginSite, sitePluginRegistry } from './plugins/site.js';
|
|
31
|
+
import { askToReload } from './supervisor/control.js';
|
|
30
32
|
import { superviseCluster } from './supervisor/primary.js';
|
|
31
33
|
import { processChannel, superviseWorker } from './supervisor/worker.js';
|
|
32
34
|
import { enterMaintenance, leaveMaintenance, maintenanceFile, readMaintenance, } from './maintenance.js';
|
|
35
|
+
import { devModeOn, enterDevMode, leaveDevMode } from './dev-mode.js';
|
|
33
36
|
/** The commands a site can name on the command line, as opposed to the flags. */
|
|
34
37
|
const COMMANDS = [
|
|
35
38
|
'serve',
|
|
@@ -39,6 +42,7 @@ const COMMANDS = [
|
|
|
39
42
|
'resend',
|
|
40
43
|
'user',
|
|
41
44
|
'maintenance',
|
|
45
|
+
'dev-mode',
|
|
42
46
|
'strip-metadata',
|
|
43
47
|
'plugin',
|
|
44
48
|
];
|
|
@@ -48,7 +52,7 @@ const COMMANDS = [
|
|
|
48
52
|
*/
|
|
49
53
|
const VALUE_FLAGS = ['until'];
|
|
50
54
|
/** The options that are simply on or off. */
|
|
51
|
-
const SWITCH_FLAGS = ['all'];
|
|
55
|
+
const SWITCH_FLAGS = ['all', 'check'];
|
|
52
56
|
const CONFIG_FILENAMES = ['geekity.config.ts', 'geekity.config.js', 'geekity.config.mjs'];
|
|
53
57
|
const USAGE = `geekity — the Geekity CMS command line
|
|
54
58
|
|
|
@@ -59,9 +63,11 @@ Usage:
|
|
|
59
63
|
geekity rebuild [--config <file>]
|
|
60
64
|
geekity resend (--all | <slug>...) [--config <file>]
|
|
61
65
|
geekity maintenance (on [--until <time>] | off | status) [--config <file>]
|
|
66
|
+
geekity dev-mode (on | off | status) [--config <file>]
|
|
62
67
|
geekity strip-metadata [--config <file>]
|
|
63
68
|
geekity user add <username> [--password <pw>] [--email <address>] [--config <file>]
|
|
64
69
|
geekity plugin (add <package>[@version] | remove <package>) [--config <file>]
|
|
70
|
+
geekity plugin upgrade [<package>...] [--check] [--config <file>]
|
|
65
71
|
|
|
66
72
|
Commands:
|
|
67
73
|
serve Start the CMS (the default when no command is given).
|
|
@@ -80,6 +86,12 @@ Commands:
|
|
|
80
86
|
503 with Retry-After; the admin, /healthz and signed-in
|
|
81
87
|
users are let through. A running site notices within a
|
|
82
88
|
second, with no restart.
|
|
89
|
+
dev-mode Hold everything the site would send to the outside world
|
|
90
|
+
(ActivityPub deliveries and relay follows, webmentions,
|
|
91
|
+
rssCloud and WebSub pings, IndexNow, email) while it is
|
|
92
|
+
built or migrated, and record each one in
|
|
93
|
+
data/dev-mode.jsonl. off takes the site live: nothing held
|
|
94
|
+
is sent then, and the record says when it went live.
|
|
83
95
|
strip-metadata Remove location and camera metadata (EXIF, XMP, IPTC, a
|
|
84
96
|
video's location) from files already in content/uploads.
|
|
85
97
|
New uploads are stripped as they arrive; this is for the
|
|
@@ -93,7 +105,14 @@ Commands:
|
|
|
93
105
|
package named, and names any plugin it requires that is
|
|
94
106
|
missing. Reload on the Plugins screen loads it.
|
|
95
107
|
plugin remove Delete a plugin's folder from the plugins folder. Reload on
|
|
96
|
-
the Plugins screen unloads it.
|
|
108
|
+
the Plugins screen unloads it. It refuses a plugin the site
|
|
109
|
+
has enabled: disable it first.
|
|
110
|
+
plugin upgrade Bring each plugin in the plugins folder, or only the ones
|
|
111
|
+
named, up to its newest version that this core and the
|
|
112
|
+
other installed plugins can run, installed as plugin add
|
|
113
|
+
installs one. Plugins that must move together do. It says,
|
|
114
|
+
for each plugin, what it upgraded, or why it held a newer
|
|
115
|
+
version back. --check reports and installs nothing.
|
|
97
116
|
|
|
98
117
|
Options:
|
|
99
118
|
--config <file> Config file to load. Defaults to the first of
|
|
@@ -109,13 +128,15 @@ Options:
|
|
|
109
128
|
Retry-After a client is sent, and the maintenance page
|
|
110
129
|
says it.
|
|
111
130
|
--all With resend: every announced post rather than named ones.
|
|
131
|
+
--check With plugin upgrade: say what would change, install nothing.
|
|
112
132
|
-h, --help Show this help.
|
|
113
133
|
-v, --version Show the installed version.
|
|
114
134
|
|
|
115
135
|
Environment overrides:
|
|
116
136
|
GEEKITY_PORT (or PORT), GEEKITY_CONTENT_DIR, GEEKITY_DATA_DIR,
|
|
117
137
|
GEEKITY_THEMES_DIR, GEEKITY_PLUGINS_DIR, GEEKITY_BASE_URL, GEEKITY_WATCH,
|
|
118
|
-
GEEKITY_MAINTENANCE (on keeps the site in maintenance until a restart)
|
|
138
|
+
GEEKITY_MAINTENANCE (on keeps the site in maintenance until a restart),
|
|
139
|
+
GEEKITY_DEV_MODE (on starts the site in dev mode; only dev-mode off ends it)
|
|
119
140
|
`;
|
|
120
141
|
/** Turn `process.argv.slice(2)` into a command, its options and its arguments. */
|
|
121
142
|
export function parseArgs(argv) {
|
|
@@ -352,10 +373,12 @@ async function main(argv) {
|
|
|
352
373
|
return resendCommand(args, configPath, flags);
|
|
353
374
|
if (command === 'maintenance')
|
|
354
375
|
return maintenanceCommand(args, configPath, flags);
|
|
376
|
+
if (command === 'dev-mode')
|
|
377
|
+
return devModeCommand(args, configPath);
|
|
355
378
|
if (command === 'strip-metadata')
|
|
356
379
|
return stripMetadataCommand(configPath);
|
|
357
380
|
if (command === 'plugin')
|
|
358
|
-
return pluginFolderCommand(args, configPath);
|
|
381
|
+
return pluginFolderCommand(args, configPath, flags);
|
|
359
382
|
return serveCommand(configPath);
|
|
360
383
|
}
|
|
361
384
|
/** `geekity init <directory>`: scaffold a new site. */
|
|
@@ -410,6 +433,31 @@ async function maintenanceCommand(args, configPath, flags) {
|
|
|
410
433
|
}
|
|
411
434
|
throw new Error('geekity maintenance needs on, off or status.');
|
|
412
435
|
}
|
|
436
|
+
async function devModeCommand(args, configPath) {
|
|
437
|
+
const action = args[0];
|
|
438
|
+
const config = resolveConfig(await loadConfig(process.cwd(), configPath));
|
|
439
|
+
if (action === 'on') {
|
|
440
|
+
enterDevMode(config.dataDir, 'command');
|
|
441
|
+
process.stdout.write('Dev mode is on: nothing the site does is sent until `geekity dev-mode off`.\n');
|
|
442
|
+
return 0;
|
|
443
|
+
}
|
|
444
|
+
if (action === 'off') {
|
|
445
|
+
if (config.devMode) {
|
|
446
|
+
throw new Error('GEEKITY_DEV_MODE or the devMode setting still asks for dev mode. ' +
|
|
447
|
+
'Remove it, then run geekity dev-mode off again.');
|
|
448
|
+
}
|
|
449
|
+
const wasOn = leaveDevMode(config.dataDir);
|
|
450
|
+
process.stdout.write(wasOn
|
|
451
|
+
? 'Dev mode is off: the site is live. Nothing held while it was on will be sent.\n'
|
|
452
|
+
: 'Dev mode was already off: the site is live.\n');
|
|
453
|
+
return 0;
|
|
454
|
+
}
|
|
455
|
+
if (action === 'status') {
|
|
456
|
+
process.stdout.write(devModeOn(config) ? 'Dev mode is on.\n' : 'Dev mode is off.\n');
|
|
457
|
+
return 0;
|
|
458
|
+
}
|
|
459
|
+
throw new Error('geekity dev-mode needs on, off or status.');
|
|
460
|
+
}
|
|
413
461
|
function untilFlag(value) {
|
|
414
462
|
if (value === undefined)
|
|
415
463
|
return undefined;
|
|
@@ -508,6 +556,10 @@ async function resendCommand(args, configPath, flags) {
|
|
|
508
556
|
failed += 1;
|
|
509
557
|
continue;
|
|
510
558
|
}
|
|
559
|
+
if (report.held) {
|
|
560
|
+
process.stdout.write(`${slug}: ${report.activityType} held by dev mode, nothing sent\n`);
|
|
561
|
+
continue;
|
|
562
|
+
}
|
|
511
563
|
const reached = report.deliveries.filter((delivery) => delivery.status === 'sent').length;
|
|
512
564
|
process.stdout.write(`${slug}: ${report.activityType} to ${String(reached)} of ` +
|
|
513
565
|
`${String(report.deliveries.length)} inboxes\n`);
|
|
@@ -644,7 +696,11 @@ async function serveCommand(configPath) {
|
|
|
644
696
|
(await seedStarterContent({ contentDir: resolved.contentDir, baseUrl: resolved.baseUrl }))) {
|
|
645
697
|
process.stdout.write(`Seeded ${resolved.contentDir} with the starter site\n`);
|
|
646
698
|
}
|
|
647
|
-
superviseCluster(
|
|
699
|
+
superviseCluster({
|
|
700
|
+
dataDir: resolved.dataDir,
|
|
701
|
+
pluginsDir: resolved.pluginsDir,
|
|
702
|
+
pluginWatch: resolved.pluginWatch,
|
|
703
|
+
});
|
|
648
704
|
return 0;
|
|
649
705
|
}
|
|
650
706
|
/**
|
|
@@ -672,6 +728,10 @@ async function serveWorker(configPath) {
|
|
|
672
728
|
// wins and a site that wrote `accessLog: false` still gets silence.
|
|
673
729
|
const cms = createCms({ ...config, accessLog: config.accessLog ?? true }, { folderPlugins: await importPluginFolders(loaded), supervision: worker.supervision });
|
|
674
730
|
const { port } = await cms.serve();
|
|
731
|
+
if (devModeOn(cms.config)) {
|
|
732
|
+
process.stdout.write('Dev mode is on: ActivityPub, webmentions, feed pings, IndexNow and email are held ' +
|
|
733
|
+
'and recorded in data/dev-mode.jsonl. `geekity dev-mode off` takes the site live.\n');
|
|
734
|
+
}
|
|
675
735
|
process.stdout.write(`Geekity is serving ${cms.config.baseUrl} on port ${String(port)}\n`);
|
|
676
736
|
worker.serving(cms);
|
|
677
737
|
}
|
|
@@ -681,28 +741,45 @@ async function serveWorker(configPath) {
|
|
|
681
741
|
}
|
|
682
742
|
return 0;
|
|
683
743
|
}
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
async function pluginFolderCommand(args, configPath) {
|
|
690
|
-
const [action, spec, ...rest] = args;
|
|
691
|
-
if ((action !== 'add' && action !== 'remove') || spec === undefined || rest.length > 0) {
|
|
692
|
-
throw new Error('geekity plugin needs add <package>[@version] or remove <package>.');
|
|
744
|
+
async function pluginFolderCommand(args, configPath, flags) {
|
|
745
|
+
const [action, ...names] = args;
|
|
746
|
+
const spec = names.length === 1 ? names[0] : undefined;
|
|
747
|
+
if (action !== 'upgrade' && action !== 'add' && action !== 'remove') {
|
|
748
|
+
throw new Error(PLUGIN_USAGE);
|
|
693
749
|
}
|
|
694
750
|
const config = resolveConfig(await loadConfig(process.cwd(), configPath));
|
|
695
751
|
const { pluginsDir } = config;
|
|
696
752
|
if (pluginsDir === undefined) {
|
|
697
753
|
throw new Error('geekity plugin needs a plugins folder: set GEEKITY_PLUGINS_DIR, or pluginsDir in the config.');
|
|
698
754
|
}
|
|
755
|
+
const registry = pluginRegistry(process.env);
|
|
756
|
+
if (action === 'upgrade') {
|
|
757
|
+
const report = await upgradePlugins({
|
|
758
|
+
pluginsDir,
|
|
759
|
+
registry,
|
|
760
|
+
coreVersion: ownManifest().version,
|
|
761
|
+
configured: config.plugins.map((plugin) => ({
|
|
762
|
+
name: plugin.name,
|
|
763
|
+
version: plugin.version,
|
|
764
|
+
peerDependencies: plugin.requires ?? {},
|
|
765
|
+
})),
|
|
766
|
+
only: names.length === 0 ? undefined : names,
|
|
767
|
+
check: flags['check'] === true,
|
|
768
|
+
addAdvice: ADD_WITH_COMMAND,
|
|
769
|
+
});
|
|
770
|
+
process.stdout.write(upgradeReportText(report));
|
|
771
|
+
const reloaded = report.plugins.some((plugin) => plugin.status === 'upgraded')
|
|
772
|
+
? await reloadRunningSite(config)
|
|
773
|
+
: true;
|
|
774
|
+
return reloaded && report.plugins.every((plugin) => plugin.status !== 'failed') ? 0 : 1;
|
|
775
|
+
}
|
|
776
|
+
if (spec === undefined)
|
|
777
|
+
throw new Error(PLUGIN_USAGE);
|
|
699
778
|
if (action === 'remove') {
|
|
700
|
-
const directory = await removePlugin(spec, pluginsDir);
|
|
701
|
-
process.stdout.write(`Removed ${spec} (${directory})
|
|
702
|
-
return 0;
|
|
779
|
+
const directory = await removePlugin(spec, { pluginsDir, contentDir: config.contentDir });
|
|
780
|
+
process.stdout.write(`Removed ${spec} (${directory}).\n`);
|
|
781
|
+
return (await reloadRunningSite(config)) ? 0 : 1;
|
|
703
782
|
}
|
|
704
|
-
const registry = firstSet(process.env['npm_config_registry'], process.env['NPM_CONFIG_REGISTRY']) ??
|
|
705
|
-
DEFAULT_REGISTRY;
|
|
706
783
|
const { manifest, directory, replaced } = await addPlugin(parsePackageSpec(spec), {
|
|
707
784
|
pluginsDir,
|
|
708
785
|
registry,
|
|
@@ -716,14 +793,39 @@ async function pluginFolderCommand(args, configPath) {
|
|
|
716
793
|
: `Replaced ${manifest.name} ${replaced} with ${manifest.version} in ${directory}.`;
|
|
717
794
|
process.stdout.write([
|
|
718
795
|
done,
|
|
719
|
-
...requirementNotes(manifest, installed, ownManifest().version),
|
|
720
|
-
'Reload on the Plugins screen to load it, then enable it there.',
|
|
796
|
+
...requirementNotes(manifest, installed, ownManifest().version, ADD_WITH_COMMAND),
|
|
721
797
|
'',
|
|
722
798
|
].join('\n'));
|
|
723
|
-
|
|
799
|
+
const reloaded = await reloadRunningSite(config);
|
|
800
|
+
process.stdout.write('Enable it on the Plugins screen.\n');
|
|
801
|
+
return reloaded ? 0 : 1;
|
|
724
802
|
}
|
|
725
|
-
function
|
|
726
|
-
|
|
803
|
+
async function reloadRunningSite(config) {
|
|
804
|
+
const outcome = await askToReload(config.dataDir);
|
|
805
|
+
if (outcome === undefined) {
|
|
806
|
+
process.stdout.write(config.pluginWatch
|
|
807
|
+
? 'No running geekity serve answered. A running site loads the change by itself within a few seconds.\n'
|
|
808
|
+
: 'No running geekity serve answered. Press Reload on the Plugins screen to load the change.\n');
|
|
809
|
+
return true;
|
|
810
|
+
}
|
|
811
|
+
if (outcome.ok) {
|
|
812
|
+
process.stdout.write('The running site reloaded with the change.\n');
|
|
813
|
+
return true;
|
|
814
|
+
}
|
|
815
|
+
process.stdout.write(`The running site tried to reload, but the new server did not start, so it carried on with the plugins it had: ${outcome.error}\n`);
|
|
816
|
+
return false;
|
|
817
|
+
}
|
|
818
|
+
const PLUGIN_USAGE = 'geekity plugin needs add <package>[@version], remove <package> or upgrade [<package>...].';
|
|
819
|
+
function upgradeReportText(report) {
|
|
820
|
+
const lines = report.plugins.map((plugin) => `${plugin.name}: ${describeUpgrade(plugin)}`);
|
|
821
|
+
for (const { name, notes } of report.unmet) {
|
|
822
|
+
lines.push(...notes.map((note) => `${name}: ${note}`));
|
|
823
|
+
}
|
|
824
|
+
const statuses = new Set(report.plugins.map((plugin) => plugin.status));
|
|
825
|
+
if (statuses.has('available')) {
|
|
826
|
+
lines.push('Run geekity plugin upgrade without --check to install them.');
|
|
827
|
+
}
|
|
828
|
+
return lines.map((line) => `${line}\n`).join('');
|
|
727
829
|
}
|
|
728
830
|
/**
|
|
729
831
|
* `geekity user add <username>`: create an admin without the setup screen.
|