@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.
Files changed (232) hide show
  1. package/README.md +169 -33
  2. package/admin/layouts/shell.njk +6 -0
  3. package/admin/pages/documents/editor.njk +4 -0
  4. package/admin/pages/plugins/confirm.njk +42 -0
  5. package/admin/pages/plugins/installed.njk +86 -4
  6. package/admin/pages/tools/dev-mode.njk +47 -0
  7. package/admin/static/admin.css +15 -0
  8. package/admin/static/editor-actions.js +13 -9
  9. package/admin/static/editor.js +31 -17
  10. package/dist/admin/dev-mode.d.ts +9 -0
  11. package/dist/admin/dev-mode.d.ts.map +1 -0
  12. package/dist/admin/dev-mode.js +42 -0
  13. package/dist/admin/dev-mode.js.map +1 -0
  14. package/dist/admin/documents.d.ts +3 -0
  15. package/dist/admin/documents.d.ts.map +1 -1
  16. package/dist/admin/documents.js +12 -3
  17. package/dist/admin/documents.js.map +1 -1
  18. package/dist/admin/editor-actions.js +3 -1
  19. package/dist/admin/editor-actions.js.map +1 -1
  20. package/dist/admin/federation.d.ts.map +1 -1
  21. package/dist/admin/federation.js +2 -0
  22. package/dist/admin/federation.js.map +1 -1
  23. package/dist/admin/menu.d.ts.map +1 -1
  24. package/dist/admin/menu.js +2 -0
  25. package/dist/admin/menu.js.map +1 -1
  26. package/dist/admin/own-paragraph.d.ts +7 -0
  27. package/dist/admin/own-paragraph.d.ts.map +1 -0
  28. package/dist/admin/own-paragraph.js +9 -0
  29. package/dist/admin/own-paragraph.js.map +1 -0
  30. package/dist/admin/plugins.d.ts +6 -0
  31. package/dist/admin/plugins.d.ts.map +1 -1
  32. package/dist/admin/plugins.js +287 -5
  33. package/dist/admin/plugins.js.map +1 -1
  34. package/dist/admin/preview.d.ts.map +1 -1
  35. package/dist/admin/preview.js +4 -1
  36. package/dist/admin/preview.js.map +1 -1
  37. package/dist/admin/routes.d.ts.map +1 -1
  38. package/dist/admin/routes.js +4 -0
  39. package/dist/admin/routes.js.map +1 -1
  40. package/dist/admin/settings-email.d.ts.map +1 -1
  41. package/dist/admin/settings-email.js +4 -0
  42. package/dist/admin/settings-email.js.map +1 -1
  43. package/dist/admin/store.d.ts +4 -2
  44. package/dist/admin/store.d.ts.map +1 -1
  45. package/dist/admin/store.js +1 -1
  46. package/dist/admin/store.js.map +1 -1
  47. package/dist/admin/taxonomy.d.ts +4 -1
  48. package/dist/admin/taxonomy.d.ts.map +1 -1
  49. package/dist/admin/taxonomy.js +11 -7
  50. package/dist/admin/taxonomy.js.map +1 -1
  51. package/dist/admin/templates.d.ts +2 -0
  52. package/dist/admin/templates.d.ts.map +1 -1
  53. package/dist/admin/templates.js +2 -0
  54. package/dist/admin/templates.js.map +1 -1
  55. package/dist/admin/uploads.d.ts +7 -1
  56. package/dist/admin/uploads.d.ts.map +1 -1
  57. package/dist/admin/uploads.js +33 -30
  58. package/dist/admin/uploads.js.map +1 -1
  59. package/dist/cli.d.ts +1 -1
  60. package/dist/cli.d.ts.map +1 -1
  61. package/dist/cli.js +127 -25
  62. package/dist/cli.js.map +1 -1
  63. package/dist/comments/index.d.ts +1 -1
  64. package/dist/comments/index.d.ts.map +1 -1
  65. package/dist/comments/index.js +1 -1
  66. package/dist/comments/index.js.map +1 -1
  67. package/dist/comments/records.d.ts +1 -0
  68. package/dist/comments/records.d.ts.map +1 -1
  69. package/dist/comments/records.js +39 -10
  70. package/dist/comments/records.js.map +1 -1
  71. package/dist/config.d.ts +29 -0
  72. package/dist/config.d.ts.map +1 -1
  73. package/dist/config.js +3 -0
  74. package/dist/config.js.map +1 -1
  75. package/dist/content/markdown.d.ts.map +1 -1
  76. package/dist/content/markdown.js +33 -1
  77. package/dist/content/markdown.js.map +1 -1
  78. package/dist/content/migrated.d.ts +6 -0
  79. package/dist/content/migrated.d.ts.map +1 -0
  80. package/dist/content/migrated.js +12 -0
  81. package/dist/content/migrated.js.map +1 -0
  82. package/dist/content/original.d.ts +3 -0
  83. package/dist/content/original.d.ts.map +1 -0
  84. package/dist/content/original.js +12 -0
  85. package/dist/content/original.js.map +1 -0
  86. package/dist/content/parser.d.ts +5 -0
  87. package/dist/content/parser.d.ts.map +1 -1
  88. package/dist/content/parser.js +3 -2
  89. package/dist/content/parser.js.map +1 -1
  90. package/dist/content/schedule.d.ts +7 -0
  91. package/dist/content/schedule.d.ts.map +1 -1
  92. package/dist/content/schedule.js +11 -2
  93. package/dist/content/schedule.js.map +1 -1
  94. package/dist/content/store.d.ts +21 -3
  95. package/dist/content/store.d.ts.map +1 -1
  96. package/dist/content/store.js +169 -42
  97. package/dist/content/store.js.map +1 -1
  98. package/dist/content/sync.d.ts.map +1 -1
  99. package/dist/content/sync.js +27 -5
  100. package/dist/content/sync.js.map +1 -1
  101. package/dist/content/tags.d.ts +26 -0
  102. package/dist/content/tags.d.ts.map +1 -0
  103. package/dist/content/tags.js +41 -0
  104. package/dist/content/tags.js.map +1 -0
  105. package/dist/content/video.d.ts +12 -0
  106. package/dist/content/video.d.ts.map +1 -0
  107. package/dist/content/video.js +91 -0
  108. package/dist/content/video.js.map +1 -0
  109. package/dist/dev-mode.d.ts +28 -0
  110. package/dist/dev-mode.d.ts.map +1 -0
  111. package/dist/dev-mode.js +64 -0
  112. package/dist/dev-mode.js.map +1 -0
  113. package/dist/drain.d.ts +9 -3
  114. package/dist/drain.d.ts.map +1 -1
  115. package/dist/drain.js +24 -3
  116. package/dist/drain.js.map +1 -1
  117. package/dist/federation/article.d.ts.map +1 -1
  118. package/dist/federation/article.js +3 -1
  119. package/dist/federation/article.js.map +1 -1
  120. package/dist/federation/delivery.d.ts +2 -0
  121. package/dist/federation/delivery.d.ts.map +1 -1
  122. package/dist/federation/delivery.js +46 -16
  123. package/dist/federation/delivery.js.map +1 -1
  124. package/dist/federation/inbox.d.ts.map +1 -1
  125. package/dist/federation/inbox.js +13 -3
  126. package/dist/federation/inbox.js.map +1 -1
  127. package/dist/federation/mount.d.ts.map +1 -1
  128. package/dist/federation/mount.js +8 -4
  129. package/dist/federation/mount.js.map +1 -1
  130. package/dist/federation/relays.d.ts.map +1 -1
  131. package/dist/federation/relays.js +16 -1
  132. package/dist/federation/relays.js.map +1 -1
  133. package/dist/index.d.ts +2 -0
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +16 -4
  136. package/dist/index.js.map +1 -1
  137. package/dist/indexnow.d.ts +1 -1
  138. package/dist/indexnow.d.ts.map +1 -1
  139. package/dist/indexnow.js +7 -0
  140. package/dist/indexnow.js.map +1 -1
  141. package/dist/mail/service.d.ts +3 -1
  142. package/dist/mail/service.d.ts.map +1 -1
  143. package/dist/mail/service.js +17 -0
  144. package/dist/mail/service.js.map +1 -1
  145. package/dist/notify.d.ts +1 -1
  146. package/dist/notify.d.ts.map +1 -1
  147. package/dist/notify.js +9 -2
  148. package/dist/notify.js.map +1 -1
  149. package/dist/plugin.d.ts +75 -4
  150. package/dist/plugin.d.ts.map +1 -1
  151. package/dist/plugin.js +8 -0
  152. package/dist/plugin.js.map +1 -1
  153. package/dist/plugins/changes.d.ts +31 -0
  154. package/dist/plugins/changes.d.ts.map +1 -0
  155. package/dist/plugins/changes.js +40 -0
  156. package/dist/plugins/changes.js.map +1 -0
  157. package/dist/plugins/folder.d.ts +2 -0
  158. package/dist/plugins/folder.d.ts.map +1 -1
  159. package/dist/plugins/folder.js +26 -5
  160. package/dist/plugins/folder.js.map +1 -1
  161. package/dist/plugins/install.d.ts +30 -3
  162. package/dist/plugins/install.d.ts.map +1 -1
  163. package/dist/plugins/install.js +43 -15
  164. package/dist/plugins/install.js.map +1 -1
  165. package/dist/plugins/manage.d.ts +34 -0
  166. package/dist/plugins/manage.d.ts.map +1 -0
  167. package/dist/plugins/manage.js +98 -0
  168. package/dist/plugins/manage.js.map +1 -0
  169. package/dist/plugins/registry.js +1 -1
  170. package/dist/plugins/registry.js.map +1 -1
  171. package/dist/plugins/site.d.ts.map +1 -1
  172. package/dist/plugins/site.js +56 -0
  173. package/dist/plugins/site.js.map +1 -1
  174. package/dist/plugins/upgrade.d.ts +54 -0
  175. package/dist/plugins/upgrade.d.ts.map +1 -0
  176. package/dist/plugins/upgrade.js +240 -0
  177. package/dist/plugins/upgrade.js.map +1 -0
  178. package/dist/supervisor/control.d.ts +15 -0
  179. package/dist/supervisor/control.d.ts.map +1 -0
  180. package/dist/supervisor/control.js +89 -0
  181. package/dist/supervisor/control.js.map +1 -0
  182. package/dist/supervisor/primary.d.ts +18 -4
  183. package/dist/supervisor/primary.d.ts.map +1 -1
  184. package/dist/supervisor/primary.js +128 -16
  185. package/dist/supervisor/primary.js.map +1 -1
  186. package/dist/supervisor/protocol.d.ts +12 -0
  187. package/dist/supervisor/protocol.d.ts.map +1 -1
  188. package/dist/supervisor/protocol.js +21 -2
  189. package/dist/supervisor/protocol.js.map +1 -1
  190. package/dist/supervisor/supervision.d.ts +1 -0
  191. package/dist/supervisor/supervision.d.ts.map +1 -1
  192. package/dist/supervisor/supervision.js +14 -1
  193. package/dist/supervisor/supervision.js.map +1 -1
  194. package/dist/supervisor/worker.d.ts.map +1 -1
  195. package/dist/supervisor/worker.js +31 -6
  196. package/dist/supervisor/worker.js.map +1 -1
  197. package/dist/web/context.d.ts +7 -0
  198. package/dist/web/context.d.ts.map +1 -1
  199. package/dist/web/context.js +7 -4
  200. package/dist/web/context.js.map +1 -1
  201. package/dist/web/feed-item.d.ts +7 -6
  202. package/dist/web/feed-item.d.ts.map +1 -1
  203. package/dist/web/feed-item.js +5 -4
  204. package/dist/web/feed-item.js.map +1 -1
  205. package/dist/web/feed-rss.d.ts +2 -2
  206. package/dist/web/feed-rss.js +2 -2
  207. package/dist/web/redirects.d.ts +17 -10
  208. package/dist/web/redirects.d.ts.map +1 -1
  209. package/dist/web/redirects.js +83 -49
  210. package/dist/web/redirects.js.map +1 -1
  211. package/dist/web/routes.d.ts.map +1 -1
  212. package/dist/web/routes.js +25 -12
  213. package/dist/web/routes.js.map +1 -1
  214. package/dist/web/taxonomy.d.ts +7 -1
  215. package/dist/web/taxonomy.d.ts.map +1 -1
  216. package/dist/web/taxonomy.js +24 -8
  217. package/dist/web/taxonomy.js.map +1 -1
  218. package/dist/webmention/service.d.ts +1 -1
  219. package/dist/webmention/service.d.ts.map +1 -1
  220. package/dist/webmention/service.js +12 -2
  221. package/dist/webmention/service.js.map +1 -1
  222. package/package.json +1 -1
  223. package/themes/default/README.md +154 -3
  224. package/themes/default/layouts/base.njk +12 -3
  225. package/themes/default/layouts/post.njk +8 -2
  226. package/themes/default/layouts/tag.njk +1 -1
  227. package/themes/default/partials/body-end.njk +1 -0
  228. package/themes/default/partials/conversation.njk +1 -1
  229. package/themes/default/partials/head-end.njk +1 -0
  230. package/themes/default/partials/tags.njk +1 -1
  231. package/themes/default/src/style.css +4 -0
  232. package/themes/default/static/style.css +8 -0
@@ -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;;;;;;;;;;;;;;;;;;;;GAoBG;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,OAAO,EAAE,6BAA6B;IACtC,YAAY,EAAE,0BAA0B;IACxC,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,eAAe,EAAE,4BAA4B;IAC7C,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,WAAW,EAAE,0BAA0B;IACvC,gBAAgB,EAAE,gCAAgC;IAClD,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;;;;;GAKG;AACH,SAAS,aAAa,CAAC,OAAgB,EAAE,KAAc;IACrD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,KAAK,GACT,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;QACtD,CAAC,CAAE,KAAiC,CAAC,KAAK,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;AACzC,CAAC;AAED,+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;IACF,WAAW,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAEjD,OAAO,WAAW,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/admin/templates.ts"],"names":[],"mappings":"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"}
@@ -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: StoredUpload | UploadRefusal): outcome is UploadRefusal;
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":"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"}
1
+ {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/admin/uploads.ts"],"names":[],"mappings":"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"}
@@ -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 extension = path.extname(original).toLowerCase();
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 (file.size > limit) {
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
- clean = stripMetadata(extension, bytes).bytes;
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":"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"}
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;AAsBjD,MAAM,MAAM,OAAO,GACf,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,GACT,QAAQ,GACR,MAAM,GACN,aAAa,GACb,gBAAgB,GAChB,QAAQ,GACR,MAAM,GACN,SAAS,CAAC;AAwBd,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;AAwED,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;AAwwBD,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"}
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 { addPlugin, DEFAULT_REGISTRY, installedFolders, parsePackageSpec, removePlugin, requirementNotes, } from './plugins/install.js';
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
- * `geekity plugin add <package>` and `geekity plugin remove <package>`
686
- * (decision-33): change the plugins folder, which Reload on the Plugins
687
- * screen then loads. Nothing a plugin requires is installed for it.
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}). Reload on the Plugins screen to unload it.\n`);
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
- return 0;
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 firstSet(...values) {
726
- return values.find((value) => value !== undefined && value !== '');
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.