@geekity/cms 0.23.0 → 0.25.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 (192) hide show
  1. package/README.md +96 -160
  2. package/admin/pages/documents/editor.njk +45 -0
  3. package/admin/pages/federation/settings.njk +1 -59
  4. package/admin/pages/plugins/installed.njk +113 -0
  5. package/admin/pages/plugins/screen.njk +129 -0
  6. package/admin/static/admin.css +136 -4
  7. package/admin/static/editor-actions.js +192 -0
  8. package/admin/static/editor.js +1 -1
  9. package/dist/admin/accounts.d.ts +18 -39
  10. package/dist/admin/accounts.d.ts.map +1 -1
  11. package/dist/admin/accounts.js +19 -48
  12. package/dist/admin/accounts.js.map +1 -1
  13. package/dist/admin/documents.d.ts +5 -0
  14. package/dist/admin/documents.d.ts.map +1 -1
  15. package/dist/admin/documents.js +17 -8
  16. package/dist/admin/documents.js.map +1 -1
  17. package/dist/admin/editor-actions.d.ts +35 -0
  18. package/dist/admin/editor-actions.d.ts.map +1 -0
  19. package/dist/admin/editor-actions.js +168 -0
  20. package/dist/admin/editor-actions.js.map +1 -0
  21. package/dist/admin/federation.d.ts +4 -5
  22. package/dist/admin/federation.d.ts.map +1 -1
  23. package/dist/admin/federation.js +4 -5
  24. package/dist/admin/federation.js.map +1 -1
  25. package/dist/admin/index.d.ts +1 -1
  26. package/dist/admin/index.d.ts.map +1 -1
  27. package/dist/admin/index.js +1 -1
  28. package/dist/admin/index.js.map +1 -1
  29. package/dist/admin/menu.d.ts +1 -1
  30. package/dist/admin/menu.d.ts.map +1 -1
  31. package/dist/admin/menu.js +10 -3
  32. package/dist/admin/menu.js.map +1 -1
  33. package/dist/admin/plugins.d.ts +24 -0
  34. package/dist/admin/plugins.d.ts.map +1 -0
  35. package/dist/admin/plugins.js +312 -0
  36. package/dist/admin/plugins.js.map +1 -0
  37. package/dist/admin/routes.d.ts.map +1 -1
  38. package/dist/admin/routes.js +5 -1
  39. package/dist/admin/routes.js.map +1 -1
  40. package/dist/admin/settings-federation.d.ts +0 -25
  41. package/dist/admin/settings-federation.d.ts.map +1 -1
  42. package/dist/admin/settings-federation.js +1 -54
  43. package/dist/admin/settings-federation.js.map +1 -1
  44. package/dist/admin/settings.d.ts +2 -14
  45. package/dist/admin/settings.d.ts.map +1 -1
  46. package/dist/admin/settings.js +1 -21
  47. package/dist/admin/settings.js.map +1 -1
  48. package/dist/admin/store.d.ts +8 -1
  49. package/dist/admin/store.d.ts.map +1 -1
  50. package/dist/admin/store.js +7 -3
  51. package/dist/admin/store.js.map +1 -1
  52. package/dist/admin/templates.d.ts +2 -0
  53. package/dist/admin/templates.d.ts.map +1 -1
  54. package/dist/admin/templates.js +2 -0
  55. package/dist/admin/templates.js.map +1 -1
  56. package/dist/cli.d.ts +2 -3
  57. package/dist/cli.d.ts.map +1 -1
  58. package/dist/cli.js +278 -212
  59. package/dist/cli.js.map +1 -1
  60. package/dist/config.d.ts +20 -0
  61. package/dist/config.d.ts.map +1 -1
  62. package/dist/config.js +6 -0
  63. package/dist/config.js.map +1 -1
  64. package/dist/content/store.d.ts +6 -0
  65. package/dist/content/store.d.ts.map +1 -1
  66. package/dist/content/store.js +3 -0
  67. package/dist/content/store.js.map +1 -1
  68. package/dist/drain.d.ts +28 -0
  69. package/dist/drain.d.ts.map +1 -0
  70. package/dist/drain.js +106 -0
  71. package/dist/drain.js.map +1 -0
  72. package/dist/env.d.ts +11 -0
  73. package/dist/env.d.ts.map +1 -1
  74. package/dist/federation/federation.d.ts +4 -2
  75. package/dist/federation/federation.d.ts.map +1 -1
  76. package/dist/federation/federation.js +16 -21
  77. package/dist/federation/federation.js.map +1 -1
  78. package/dist/federation/inbox.d.ts +23 -3
  79. package/dist/federation/inbox.d.ts.map +1 -1
  80. package/dist/federation/inbox.js +63 -1
  81. package/dist/federation/inbox.js.map +1 -1
  82. package/dist/federation/index.d.ts +0 -4
  83. package/dist/federation/index.d.ts.map +1 -1
  84. package/dist/federation/index.js +0 -2
  85. package/dist/federation/index.js.map +1 -1
  86. package/dist/federation/mount.d.ts +6 -12
  87. package/dist/federation/mount.d.ts.map +1 -1
  88. package/dist/federation/mount.js +3 -50
  89. package/dist/federation/mount.js.map +1 -1
  90. package/dist/federation/queue.d.ts +22 -0
  91. package/dist/federation/queue.d.ts.map +1 -0
  92. package/dist/federation/queue.js +58 -0
  93. package/dist/federation/queue.js.map +1 -0
  94. package/dist/files/atomic.d.ts +13 -0
  95. package/dist/files/atomic.d.ts.map +1 -1
  96. package/dist/files/atomic.js +45 -0
  97. package/dist/files/atomic.js.map +1 -1
  98. package/dist/index.d.ts +30 -3
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +156 -79
  101. package/dist/index.js.map +1 -1
  102. package/dist/plugin.d.ts +513 -0
  103. package/dist/plugin.d.ts.map +1 -0
  104. package/dist/plugin.js +23 -0
  105. package/dist/plugin.js.map +1 -0
  106. package/dist/plugins/enabled.d.ts +23 -0
  107. package/dist/plugins/enabled.d.ts.map +1 -0
  108. package/dist/plugins/enabled.js +49 -0
  109. package/dist/plugins/enabled.js.map +1 -0
  110. package/dist/plugins/federation.d.ts +26 -0
  111. package/dist/plugins/federation.d.ts.map +1 -0
  112. package/dist/plugins/federation.js +114 -0
  113. package/dist/plugins/federation.js.map +1 -0
  114. package/dist/plugins/fetch.d.ts +15 -0
  115. package/dist/plugins/fetch.d.ts.map +1 -0
  116. package/dist/plugins/fetch.js +33 -0
  117. package/dist/plugins/fetch.js.map +1 -0
  118. package/dist/plugins/folder.d.ts +50 -0
  119. package/dist/plugins/folder.d.ts.map +1 -0
  120. package/dist/plugins/folder.js +171 -0
  121. package/dist/plugins/folder.js.map +1 -0
  122. package/dist/plugins/install.d.ts +45 -0
  123. package/dist/plugins/install.d.ts.map +1 -0
  124. package/dist/plugins/install.js +275 -0
  125. package/dist/plugins/install.js.map +1 -0
  126. package/dist/plugins/mount.d.ts +17 -0
  127. package/dist/plugins/mount.d.ts.map +1 -0
  128. package/dist/plugins/mount.js +44 -0
  129. package/dist/plugins/mount.js.map +1 -0
  130. package/dist/plugins/registry.d.ts +110 -0
  131. package/dist/plugins/registry.d.ts.map +1 -0
  132. package/dist/plugins/registry.js +447 -0
  133. package/dist/plugins/registry.js.map +1 -0
  134. package/dist/plugins/settings.d.ts +64 -0
  135. package/dist/plugins/settings.d.ts.map +1 -0
  136. package/dist/plugins/settings.js +219 -0
  137. package/dist/plugins/settings.js.map +1 -0
  138. package/dist/plugins/site.d.ts +17 -0
  139. package/dist/plugins/site.d.ts.map +1 -0
  140. package/dist/plugins/site.js +67 -0
  141. package/dist/plugins/site.js.map +1 -0
  142. package/dist/supervisor/primary.d.ts +47 -0
  143. package/dist/supervisor/primary.d.ts.map +1 -0
  144. package/dist/supervisor/primary.js +208 -0
  145. package/dist/supervisor/primary.js.map +1 -0
  146. package/dist/supervisor/protocol.d.ts +37 -0
  147. package/dist/supervisor/protocol.d.ts.map +1 -0
  148. package/dist/supervisor/protocol.js +29 -0
  149. package/dist/supervisor/protocol.js.map +1 -0
  150. package/dist/supervisor/supervision.d.ts +25 -0
  151. package/dist/supervisor/supervision.d.ts.map +1 -0
  152. package/dist/supervisor/supervision.js +7 -0
  153. package/dist/supervisor/supervision.js.map +1 -0
  154. package/dist/supervisor/worker.d.ts +29 -0
  155. package/dist/supervisor/worker.d.ts.map +1 -0
  156. package/dist/supervisor/worker.js +97 -0
  157. package/dist/supervisor/worker.js.map +1 -0
  158. package/dist/web/errors.d.ts.map +1 -1
  159. package/dist/web/errors.js +5 -3
  160. package/dist/web/errors.js.map +1 -1
  161. package/dist/web/llms.d.ts +8 -0
  162. package/dist/web/llms.d.ts.map +1 -1
  163. package/dist/web/llms.js +25 -7
  164. package/dist/web/llms.js.map +1 -1
  165. package/dist/web/maintenance.d.ts +2 -2
  166. package/dist/web/maintenance.d.ts.map +1 -1
  167. package/dist/web/maintenance.js +7 -4
  168. package/dist/web/maintenance.js.map +1 -1
  169. package/dist/web/negotiate.d.ts +8 -5
  170. package/dist/web/negotiate.d.ts.map +1 -1
  171. package/dist/web/negotiate.js +21 -10
  172. package/dist/web/negotiate.js.map +1 -1
  173. package/dist/web/routes.d.ts.map +1 -1
  174. package/dist/web/routes.js +84 -36
  175. package/dist/web/routes.js.map +1 -1
  176. package/package.json +11 -5
  177. package/dist/comments/conversation.d.ts +0 -29
  178. package/dist/comments/conversation.d.ts.map +0 -1
  179. package/dist/comments/conversation.js +0 -60
  180. package/dist/comments/conversation.js.map +0 -1
  181. package/dist/federation/import-wordpress.d.ts +0 -128
  182. package/dist/federation/import-wordpress.d.ts.map +0 -1
  183. package/dist/federation/import-wordpress.js +0 -426
  184. package/dist/federation/import-wordpress.js.map +0 -1
  185. package/dist/federation/wordpress.d.ts +0 -131
  186. package/dist/federation/wordpress.d.ts.map +0 -1
  187. package/dist/federation/wordpress.js +0 -342
  188. package/dist/federation/wordpress.js.map +0 -1
  189. package/dist/web/comments.d.ts +0 -60
  190. package/dist/web/comments.d.ts.map +0 -1
  191. package/dist/web/comments.js +0 -207
  192. package/dist/web/comments.js.map +0 -1
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The messages between `geekity serve`'s supervisor and the worker that runs
3
+ * the CMS (TASK-288). A reload is: the serving worker asks (`reload`); the
4
+ * supervisor tells it to `drain`; it answers `drained` once it writes
5
+ * nothing more; a new worker boots and says `ready`; the old one is told to
6
+ * `retire`. A new worker that does not boot says `boot-failed`, and the old
7
+ * one is told to `resume`, with the reason.
8
+ */
9
+ /**
10
+ * How a worker that cannot carry on gives up: it exits with this code, and the
11
+ * supervisor boots a replacement, as it does for any serving or draining
12
+ * worker that exits without being told to.
13
+ */
14
+ export const EXIT_FOR_REPLACEMENT = 1;
15
+ const WORKER_TYPES = new Set(['ready', 'boot-failed', 'reload', 'drained']);
16
+ const SUPERVISOR_TYPES = new Set(['drain', 'resume', 'retire', 'shutdown']);
17
+ export function isWorkerMessage(value) {
18
+ return hasType(value, WORKER_TYPES);
19
+ }
20
+ export function isSupervisorMessage(value) {
21
+ return hasType(value, SUPERVISOR_TYPES);
22
+ }
23
+ function hasType(value, types) {
24
+ if (typeof value !== 'object' || value === null)
25
+ return false;
26
+ const type = value.type;
27
+ return typeof type === 'string' && types.has(type);
28
+ }
29
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/supervisor/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AActC,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACjG,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEjG,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,KAA0B;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * What a CMS running under `geekity serve`'s supervisor knows about it
3
+ * (TASK-288): which plugin folders it loaded, how to ask for a reload, and
4
+ * why the last one failed.
5
+ */
6
+ import type { PluginFolder } from '../plugins/folder.ts';
7
+ export type ReloadOutcome = {
8
+ readonly ok: true;
9
+ } | {
10
+ readonly ok: false;
11
+ readonly error: string;
12
+ };
13
+ export interface Supervision {
14
+ /** The plugin folders this worker loaded at boot. */
15
+ readonly loaded: readonly PluginFolder[];
16
+ /**
17
+ * Ask the supervisor for a new worker. Resolves once the new worker serves,
18
+ * when this one is about to retire, or with why it did not boot, when this
19
+ * one carries on.
20
+ */
21
+ reload(): Promise<ReloadOutcome>;
22
+ /** Why this worker's last reload failed, or `undefined`. */
23
+ readonly lastFailure: string | undefined;
24
+ }
25
+ //# sourceMappingURL=supervision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervision.d.ts","sourceRoot":"","sources":["../../src/supervisor/supervision.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC;;;;OAIG;IACH,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * What a CMS running under `geekity serve`'s supervisor knows about it
3
+ * (TASK-288): which plugin folders it loaded, how to ask for a reload, and
4
+ * why the last one failed.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=supervision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervision.js","sourceRoot":"","sources":["../../src/supervisor/supervision.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The worker's half of `geekity serve`'s supervision (TASK-288): the
3
+ * {@link Supervision} the Plugins screen asks for a reload, and the answers
4
+ * to what the supervisor tells this worker to do.
5
+ */
6
+ import type { Cms } from '../index.ts';
7
+ import type { PluginFolder } from '../plugins/folder.ts';
8
+ import type { SupervisorMessage, WorkerMessage } from './protocol.ts';
9
+ import type { Supervision } from './supervision.ts';
10
+ export interface WorkerChannel {
11
+ send(message: WorkerMessage, sent?: () => void): void;
12
+ onMessage(handler: (message: SupervisorMessage) => void): void;
13
+ /** The supervisor went away without saying so. */
14
+ onDisconnect(handler: () => void): void;
15
+ }
16
+ export interface SupervisedWorker {
17
+ readonly supervision: Supervision;
18
+ /** The CMS listens: tell the supervisor, and do what it says from here on. */
19
+ serving(cms: Pick<Cms, 'drain' | 'resume' | 'close'>): void;
20
+ }
21
+ export declare function superviseWorker(options: {
22
+ channel: WorkerChannel;
23
+ loaded: readonly PluginFolder[];
24
+ exit: (code: number) => void;
25
+ log: (line: string) => void;
26
+ }): SupervisedWorker;
27
+ /** This process's IPC channel to the supervisor that forked it. */
28
+ export declare function processChannel(): WorkerChannel;
29
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/supervisor/worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAiB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACtD,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/D,kDAAkD;IAClD,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,8EAA8E;IAC9E,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IAChC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GAAG,gBAAgB,CA6EnB;AAED,mEAAmE;AACnE,wBAAgB,cAAc,IAAI,aAAa,CAc9C"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * The worker's half of `geekity serve`'s supervision (TASK-288): the
3
+ * {@link Supervision} the Plugins screen asks for a reload, and the answers
4
+ * to what the supervisor tells this worker to do.
5
+ */
6
+ import { EXIT_FOR_REPLACEMENT, isSupervisorMessage } from './protocol.js';
7
+ export function superviseWorker(options) {
8
+ const { channel, exit, log } = options;
9
+ let pending;
10
+ let lastFailure;
11
+ function settle(outcome) {
12
+ pending?.resolve(outcome);
13
+ pending = undefined;
14
+ }
15
+ const supervision = {
16
+ loaded: options.loaded,
17
+ get lastFailure() {
18
+ return lastFailure;
19
+ },
20
+ reload() {
21
+ if (pending === undefined) {
22
+ let resolve = () => undefined;
23
+ const promise = new Promise((done) => {
24
+ resolve = done;
25
+ });
26
+ pending = { promise, resolve };
27
+ channel.send({ type: 'reload' });
28
+ }
29
+ return pending.promise;
30
+ },
31
+ };
32
+ return {
33
+ supervision,
34
+ serving(cms) {
35
+ let closing;
36
+ const close = () => {
37
+ closing ??= cms.close().then(() => exit(0), (error) => {
38
+ log(`The server did not close cleanly: ${messageOf(error)}`);
39
+ exit(1);
40
+ });
41
+ return closing;
42
+ };
43
+ channel.onMessage((message) => {
44
+ void (async () => {
45
+ switch (message.type) {
46
+ case 'drain':
47
+ try {
48
+ await cms.drain();
49
+ }
50
+ catch (error) {
51
+ log(`The server could not drain for a reload: ${messageOf(error)}`);
52
+ exit(EXIT_FOR_REPLACEMENT);
53
+ return;
54
+ }
55
+ channel.send({ type: 'drained' });
56
+ return;
57
+ case 'resume':
58
+ lastFailure = message.error;
59
+ await cms.resume();
60
+ settle({ ok: false, error: message.error });
61
+ return;
62
+ case 'retire':
63
+ settle({ ok: true });
64
+ await close();
65
+ return;
66
+ case 'shutdown':
67
+ await close();
68
+ return;
69
+ }
70
+ })();
71
+ });
72
+ channel.onDisconnect(() => void close());
73
+ channel.send({ type: 'ready' });
74
+ },
75
+ };
76
+ }
77
+ /** This process's IPC channel to the supervisor that forked it. */
78
+ export function processChannel() {
79
+ return {
80
+ send(message, sent) {
81
+ process.send?.(message, undefined, {}, () => sent?.());
82
+ },
83
+ onMessage(handler) {
84
+ process.on('message', (message) => {
85
+ if (isSupervisorMessage(message))
86
+ handler(message);
87
+ });
88
+ },
89
+ onDisconnect(handler) {
90
+ process.on('disconnect', handler);
91
+ },
92
+ };
93
+ }
94
+ function messageOf(error) {
95
+ return error instanceof Error ? error.message : String(error);
96
+ }
97
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/supervisor/worker.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/web/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAOzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAM5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA0CrD;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,EAAE,YAAY,CAAC,UAAU,CAuChD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAM7F"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/web/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAOzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAO5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA0CrD;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,EAAE,YAAY,CAAC,UAAU,CAyChD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAM7F"}
@@ -2,7 +2,7 @@ import { HTTPException } from 'hono/http-exception';
2
2
  import { ADMIN_ASSET_PREFIX } from '../admin/assets.js';
3
3
  import { ADMIN_PREFIX } from '../admin/session.js';
4
4
  import { ADMIN_TEMPLATES, createAdminTemplateEnvironment } from '../admin/templates.js';
5
- import { DOCUMENT_REPRESENTATIONS, selectRepresentation, splitRepresentationExtension, } from './negotiate.js';
5
+ import { CONTENT_TYPES, DOCUMENT_REPRESENTATIONS, selectRepresentation, splitRepresentationExtension, } from './negotiate.js';
6
6
  import { requestPath } from './routes.js';
7
7
  /**
8
8
  * A server error is never stored: the next request may well succeed, and a
@@ -56,15 +56,17 @@ export const serverError = (error, c) => {
56
56
  });
57
57
  }), 500, { 'cache-control': NO_STORE });
58
58
  }
59
- switch (representationOf(pathname, c.req.header('accept'))) {
59
+ const representation = representationOf(pathname, c.req.header('accept'));
60
+ switch (representation) {
60
61
  case 'json':
61
62
  return c.body(JSON_BODY, 500, {
62
63
  'content-type': 'application/json; charset=utf-8',
63
64
  'cache-control': NO_STORE,
64
65
  });
65
66
  case 'markdown':
67
+ case 'text':
66
68
  return c.body(MARKDOWN_BODY, 500, {
67
- 'content-type': 'text/markdown; charset=utf-8',
69
+ 'content-type': CONTENT_TYPES[representation],
68
70
  'content-disposition': 'inline',
69
71
  'cache-control': NO_STORE,
70
72
  });
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/web/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/web/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAExF,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,MAAM,QAAQ,GAAG,UAAU,CAAC;AAE5B;;;GAGG;AACH,MAAM,WAAW,GAAG;;;;;;;;;;;;CAYnB,CAAC;AAEF,MAAM,aAAa,GACjB,qHAAqH,CAAC;AAExH,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,SAAS,CACjC;IACE,KAAK,EAAE,uBAAuB;IAC9B,OAAO,EAAE,sDAAsD;CAChE,EACD,SAAS,EACT,CAAC,CACF,IAAI,CAAC;AAEN,qFAAqF;AACrF,IAAI,gBAAyC,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAA6B,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;IAChE,IAAI,KAAK,YAAY,aAAa;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAE/D,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,QAAQ,UAAU,EAAE,KAAK,CAAC,CAAC;IAE5D,IAAI,QAAQ,KAAK,YAAY,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC;QACzE,OAAO,CAAC,CAAC,IAAI,CACX,YAAY,CAAC,GAAG,EAAE;YAChB,gBAAgB,KAAK,8BAA8B,EAAE,CAAC;YACtD,OAAO,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE;gBAC1D,QAAQ,EAAE,YAAY;gBACtB,WAAW,EAAE,kBAAkB;aAChC,CAAC,CAAC;QACL,CAAC,CAAC,EACF,GAAG,EACH,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC9B,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1E,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBAC5B,cAAc,EAAE,iCAAiC;gBACjD,eAAe,EAAE,QAAQ;aAC1B,CAAC,CAAC;QACL,KAAK,UAAU,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;gBAChC,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC;gBAC7C,qBAAqB,EAAE,QAAQ;gBAC/B,eAAe,EAAE,QAAQ;aAC1B,CAAC,CAAC;QACL,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,IAAI,CACX,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAC9D,GAAG,EACH,EAAE,eAAe,EAAE,QAAQ,EAAE,CAC9B,CAAC;IACN,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,MAA0B;IAC3E,OAAO,CACL,4BAA4B,CAAC,QAAQ,CAAC,EAAE,cAAc;QACtD,oBAAoB,CAAC,MAAM,EAAE,wBAAwB,CAAC;QACtD,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAoB;IACxC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -41,8 +41,16 @@ export interface LlmsTxtFile {
41
41
  body: string;
42
42
  lastModified: Date | undefined;
43
43
  }
44
+ export interface LlmsListing {
45
+ title: string;
46
+ description?: string | undefined;
47
+ posts: readonly LlmsEntry[];
48
+ newer?: string | undefined;
49
+ older?: string | undefined;
50
+ }
44
51
  /** The index as llms.txt Markdown, every link absolute. */
45
52
  export declare function llmsTxt(index: LlmsIndex, baseUrl: string): string;
53
+ export declare function llmsListingTxt(listing: LlmsListing, baseUrl: string): string;
46
54
  /** A generated file, dated by the newest entry in it. */
47
55
  export declare function generatedLlmsTxt(index: LlmsIndex, baseUrl: string): LlmsTxtFile;
48
56
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"llms.d.ts","sourceRoot":"","sources":["../../src/web/llms.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD;;;;;;;;;GASG;AAEH,sBAAsB;AACtB,eAAO,MAAM,aAAa,cAAc,CAAC;AAEzC,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,aAAa,6DAAgE,CAAC;AAI3F,mCAAmC;AACnC,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,4DAA4D;IAC5D,YAAY,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CACjC;AAED,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,oBAAoB;IACpB,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7B;AAED,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC;CAChC;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAajE;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAS/E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAQtE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,kBAAkB,GAAG,SAAS,GAC1C,QAAQ,CAaV"}
1
+ {"version":3,"file":"llms.d.ts","sourceRoot":"","sources":["../../src/web/llms.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD;;;;;;;;;GASG;AAEH,sBAAsB;AACtB,eAAO,MAAM,aAAa,cAAc,CAAC;AAEzC,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,aAAa,6DAAgE,CAAC;AAI3F,mCAAmC;AACnC,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,4DAA4D;IAC5D,YAAY,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CACjC;AAED,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,oBAAoB;IACpB,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7B;AAED,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQjE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAY5E;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAS/E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAQtE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,kBAAkB,GAAG,SAAS,GAC1C,QAAQ,CAaV"}
package/dist/web/llms.js CHANGED
@@ -24,15 +24,25 @@ const LLMS_TXT_CONTENT_TYPE = 'text/markdown; charset=utf-8';
24
24
  /** The index as llms.txt Markdown, every link absolute. */
25
25
  export function llmsTxt(index, baseUrl) {
26
26
  const description = oneLine(index.description);
27
- const section = (heading, entries) => entries.length === 0
28
- ? []
29
- : [`## ${heading}`, entries.map((entry) => entryLine(entry, baseUrl)).join('\n')];
30
- return `${[
27
+ return markdownFile([
31
28
  `# ${oneLine(index.title)}`,
32
29
  ...(description === '' ? [] : [`> ${description}`]),
33
- ...section('Pages', index.pages),
34
- ...section('Recent posts', index.posts),
35
- ].join('\n\n')}\n`;
30
+ ...section('Pages', index.pages, baseUrl),
31
+ ...section('Recent posts', index.posts, baseUrl),
32
+ ]);
33
+ }
34
+ export function llmsListingTxt(listing, baseUrl) {
35
+ const pager = [
36
+ ...(listing.newer === undefined ? [] : [{ title: 'Newer posts', href: listing.newer }]),
37
+ ...(listing.older === undefined ? [] : [{ title: 'Older posts', href: listing.older }]),
38
+ ];
39
+ const description = oneLine(listing.description ?? '');
40
+ return markdownFile([
41
+ `# ${oneLine(listing.title)}`,
42
+ ...(description === '' ? [] : [`> ${description}`]),
43
+ ...section('Posts', listing.posts, baseUrl),
44
+ ...section('More posts', pager, baseUrl),
45
+ ]);
36
46
  }
37
47
  /** A generated file, dated by the newest entry in it. */
38
48
  export function generatedLlmsTxt(index, baseUrl) {
@@ -76,6 +86,14 @@ export function llmsTxtResponse(file, conditional) {
76
86
  headers.set('content-type', LLMS_TXT_CONTENT_TYPE);
77
87
  return new Response(file.body, { headers });
78
88
  }
89
+ function markdownFile(blocks) {
90
+ return `${blocks.join('\n\n')}\n`;
91
+ }
92
+ function section(heading, entries, baseUrl) {
93
+ return entries.length === 0
94
+ ? []
95
+ : [`## ${heading}`, entries.map((entry) => entryLine(entry, baseUrl)).join('\n')];
96
+ }
79
97
  function entryLine(entry, baseUrl) {
80
98
  const description = oneLine(entry.description ?? '');
81
99
  const link = `- [${escapeLinkText(oneLine(entry.title))}](${absoluteUrl(entry.href, baseUrl)})`;
@@ -1 +1 @@
1
- {"version":3,"file":"llms.js","sourceRoot":"","sources":["../../src/web/llms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGzE;;;;;;;;;GASG;AAEH,sBAAsB;AACtB,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AAEzC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,4CAA4C,CAAC;AAE3F,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AA4B7D,2DAA2D;AAC3D,MAAM,UAAU,OAAO,CAAC,KAAgB,EAAE,OAAe;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,OAA6B,EAAY,EAAE,CAC3E,OAAO,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtF,OAAO,GAAG;QACR,KAAK,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAC3B,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;QACnD,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;QAChC,GAAG,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC;KACxC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,KAAgB,EAAE,OAAe;IAChE,IAAI,YAA8B,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YAAE,SAAS;QAC/C,IAAI,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,GAAG,YAAY,EAAE,CAAC;YACpE,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAiB,EACjB,WAA2C;IAE3C,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;IACnD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAC,KAAgB,EAAE,OAAe;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;IAChG,OAAO,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,WAAW,EAAE,CAAC;AAC/D,CAAC;AAED,oEAAoE;AACpE,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"llms.js","sourceRoot":"","sources":["../../src/web/llms.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,8 @@ import type { GeekityEnv } from '../env.ts';
7
7
  * crawlers and fediverse servers all read the outage as temporary: a crawler
8
8
  * keeps the page in its index, and a server whose inbox delivery was refused
9
9
  * queues it for a retry rather than dropping it. Mounted in front of the
10
- * federation middleware, so no inbox, Fedify's or the WordPress plugin's, is
11
- * reached at all.
10
+ * federation middleware, so no inbox, the site's own or a plugin's, is reached
11
+ * at all.
12
12
  *
13
13
  * A signed-in user browses the public site as usual, which is how an admin
14
14
  * checks an upgrade before turning maintenance off. The test is the one the
@@ -1 +1 @@
1
- {"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../src/web/maintenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAIvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAqE5C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,EAAE,iBAAiB,CAAC,UAAU,CAYzD,CAAC"}
1
+ {"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../src/web/maintenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAIvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAsE5C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,EAAE,iBAAiB,CAAC,UAAU,CAYzD,CAAC"}
@@ -3,6 +3,7 @@ import { signedInCommenter } from '../comments/viewer.js';
3
3
  import { THEME_ASSET_PREFIX } from './assets.js';
4
4
  import { representationOf } from './errors.js';
5
5
  import { HEALTH_PATH } from './health.js';
6
+ import { CONTENT_TYPES } from './negotiate.js';
6
7
  import { requestPath } from './routes.js';
7
8
  import { CHANGE_PASSWORD_WELL_KNOWN_PATH, SECURITY_TXT_PATH } from './well-known.js';
8
9
  /**
@@ -60,8 +61,8 @@ function isExempt(pathname) {
60
61
  * crawlers and fediverse servers all read the outage as temporary: a crawler
61
62
  * keeps the page in its index, and a server whose inbox delivery was refused
62
63
  * queues it for a retry rather than dropping it. Mounted in front of the
63
- * federation middleware, so no inbox, Fedify's or the WordPress plugin's, is
64
- * reached at all.
64
+ * federation middleware, so no inbox, the site's own or a plugin's, is reached
65
+ * at all.
65
66
  *
66
67
  * A signed-in user browses the public site as usual, which is how an admin
67
68
  * checks an upgrade before turning maintenance off. The test is the one the
@@ -85,16 +86,18 @@ function unavailable(c, pathname, until) {
85
86
  'retry-after': upcoming?.toUTCString() ?? String(DEFAULT_RETRY_AFTER_SECONDS),
86
87
  'cache-control': NO_STORE,
87
88
  };
88
- switch (representationOf(pathname, c.req.header('accept'))) {
89
+ const representation = representationOf(pathname, c.req.header('accept'));
90
+ switch (representation) {
89
91
  case 'json':
90
92
  return c.body(JSON_BODY, 503, {
91
93
  ...headers,
92
94
  'content-type': 'application/json; charset=utf-8',
93
95
  });
94
96
  case 'markdown':
97
+ case 'text':
95
98
  return c.body(MARKDOWN_BODY, 503, {
96
99
  ...headers,
97
- 'content-type': 'text/markdown; charset=utf-8',
100
+ 'content-type': CONTENT_TYPES[representation],
98
101
  'content-disposition': 'inline',
99
102
  });
100
103
  case 'html':
@@ -1 +1 @@
1
- {"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../src/web/maintenance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../src/web/maintenance.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import type { Document } from '../content/document.ts';
6
6
  * decide *what* is at a URL; this module decides *which body* to hand back and
7
7
  * how to label it, so the two questions never get tangled together.
8
8
  */
9
- export type Representation = 'html' | 'markdown' | 'json';
9
+ export type Representation = 'html' | 'markdown' | 'text' | 'json';
10
10
  /** The media type each representation is served as. */
11
11
  export declare const MEDIA_TYPES: Readonly<Record<Representation, string>>;
12
12
  /**
@@ -17,8 +17,8 @@ export declare const MEDIA_TYPES: Readonly<Record<Representation, string>>;
17
17
  * page.
18
18
  */
19
19
  export declare const DOCUMENT_REPRESENTATIONS: readonly Representation[];
20
- /** What a listing offers. Markdown is not a listing; there is no file to serve. */
21
20
  export declare const LISTING_REPRESENTATIONS: readonly Representation[];
21
+ export declare const SEARCH_REPRESENTATIONS: readonly Representation[];
22
22
  /**
23
23
  * The representation a request accepts, or `undefined` when it accepts none of
24
24
  * them and is owed a 406.
@@ -65,9 +65,10 @@ export interface RepresentationExtension {
65
65
  * A `.md` or `.json` suffix taken off a request path, or `undefined` when the
66
66
  * path carries neither.
67
67
  *
68
- * Both spellings work: `/2026/09/hello/index.md` — the one the `Link` header
69
- * advertises, and the one an Eleventy-style static build would produce — and
70
- * the shorter `/2026/09/hello.md` that people actually type. The result is a
68
+ * Both spellings are recognised: `/2026/09/hello/index.md` — the one the `Link`
69
+ * header advertises, and the one an Eleventy-style static build would produce —
70
+ * and the shorter `/2026/09/hello.md` that people actually type, which the
71
+ * router redirects to the first once it has found what it names. The result is a
71
72
  * list of candidate paths rather than one, because the trailing slash a
72
73
  * permalink carries is exactly what an extension has to displace.
73
74
  */
@@ -128,6 +129,8 @@ export declare function documentJson(document: Document, options: DocumentJsonOp
128
129
  * browser does, and one post's broken link must not fail a whole feed.
129
130
  */
130
131
  export declare function absoluteUrl(pathname: string, baseUrl: string): string;
132
+ /** What each representation is labelled with on the wire. */
133
+ export declare const CONTENT_TYPES: Readonly<Record<Representation, string>>;
131
134
  /** The conditional headers a request may carry. */
132
135
  export interface ConditionalHeaders {
133
136
  /** `If-None-Match`. */
@@ -1 +1 @@
1
- {"version":3,"file":"negotiate.d.ts","sourceRoot":"","sources":["../../src/web/negotiate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAIvD;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAE1D,uDAAuD;AACvD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAIhE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,cAAc,EAAiC,CAAC;AAEhG,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,EAAE,SAAS,cAAc,EAAqB,CAAC;AAEnF;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,cAAc,GAAG,SAAS,CAsB5B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,EAGzD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAmB1E;AAwBD;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAGvF,CAAC;AAEF,mFAAmF;AACnF,MAAM,WAAW,uBAAuB;IACtC,kDAAkD;IAClD,cAAc,EAAE,cAAc,CAAC;IAC/B,gEAAgE;IAChE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,GACf,uBAAuB,GAAG,SAAS,CAkBrC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,CAIvF;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAa3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKrE;AASD,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,2BAA2B;IAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,gDAAgD;AAChD,MAAM,WAAW,6BAA6B;IAC5C,sEAAsE;IACtE,IAAI,EAAE,OAAO,CAAC;IACd,sCAAsC;IACtC,cAAc,EAAE,cAAc,CAAC;IAC/B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,wFAAwF;IACxF,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,sCAAsC;IACtC,YAAY,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAChC,sDAAsD;IACtD,WAAW,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,QAAQ,CAmDvF;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,QAAQ,CAuBV;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,MAAM,CAQR;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,CAOnE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI,GAAG,SAAS,CAQ/E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,kBAAkB,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,YAAY,EAAE,IAAI,GAAG,SAAS,GAC7B,OAAO,CAcT;AAED,+CAA+C;AAC/C,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAmBzD"}
1
+ {"version":3,"file":"negotiate.d.ts","sourceRoot":"","sources":["../../src/web/negotiate.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { matchesEtag } from './assets.js';
5
5
  export const MEDIA_TYPES = {
6
6
  html: 'text/html',
7
7
  markdown: 'text/markdown',
8
+ text: 'text/plain',
8
9
  json: 'application/json',
9
10
  };
10
11
  /**
@@ -14,9 +15,14 @@ export const MEDIA_TYPES = {
14
15
  * `Accept` at all — so HTML comes first: a browser that says nothing gets a
15
16
  * page.
16
17
  */
17
- export const DOCUMENT_REPRESENTATIONS = ['html', 'markdown', 'json'];
18
- /** What a listing offers. Markdown is not a listing; there is no file to serve. */
19
- export const LISTING_REPRESENTATIONS = ['html', 'json'];
18
+ export const DOCUMENT_REPRESENTATIONS = [
19
+ 'html',
20
+ 'markdown',
21
+ 'text',
22
+ 'json',
23
+ ];
24
+ export const LISTING_REPRESENTATIONS = DOCUMENT_REPRESENTATIONS;
25
+ export const SEARCH_REPRESENTATIONS = ['html', 'json'];
20
26
  /**
21
27
  * The representation a request accepts, or `undefined` when it accepts none of
22
28
  * them and is owed a 406.
@@ -109,9 +115,10 @@ export const REPRESENTATION_EXTENSIONS = {
109
115
  * A `.md` or `.json` suffix taken off a request path, or `undefined` when the
110
116
  * path carries neither.
111
117
  *
112
- * Both spellings work: `/2026/09/hello/index.md` — the one the `Link` header
113
- * advertises, and the one an Eleventy-style static build would produce — and
114
- * the shorter `/2026/09/hello.md` that people actually type. The result is a
118
+ * Both spellings are recognised: `/2026/09/hello/index.md` — the one the `Link`
119
+ * header advertises, and the one an Eleventy-style static build would produce —
120
+ * and the shorter `/2026/09/hello.md` that people actually type, which the
121
+ * router redirects to the first once it has found what it names. The result is a
115
122
  * list of candidate paths rather than one, because the trailing slash a
116
123
  * permalink carries is exactly what an extension has to displace.
117
124
  */
@@ -191,9 +198,10 @@ export function absoluteUrl(pathname, baseUrl) {
191
198
  return URL.parse(resolved, base)?.toString() ?? pathname;
192
199
  }
193
200
  /** What each representation is labelled with on the wire. */
194
- const CONTENT_TYPES = {
201
+ export const CONTENT_TYPES = {
195
202
  html: 'text/html; charset=utf-8',
196
203
  markdown: 'text/markdown; charset=utf-8',
204
+ text: 'text/plain; charset=utf-8',
197
205
  json: 'application/json; charset=utf-8',
198
206
  };
199
207
  /**
@@ -243,7 +251,7 @@ export function representationResponse(options) {
243
251
  return new Response(null, { status: 304, headers });
244
252
  }
245
253
  headers.set('content-type', CONTENT_TYPES[options.representation]);
246
- if (options.representation === 'markdown') {
254
+ if (options.representation === 'markdown' || options.representation === 'text') {
247
255
  // The point of the Markdown representation is to be read, not downloaded.
248
256
  headers.set('content-disposition', 'inline');
249
257
  }
@@ -269,7 +277,7 @@ export function notAcceptableResponse(href, available) {
269
277
  return new Response(`${JSON.stringify({
270
278
  error: 'not_acceptable',
271
279
  message: 'This URL is not available in any of the media types you accept.',
272
- alternates: available.map((representation) => ({
280
+ alternates: available.filter(hasOwnUrl).map((representation) => ({
273
281
  type: MEDIA_TYPES[representation],
274
282
  url: representationHref(href, representation),
275
283
  })),
@@ -288,10 +296,13 @@ export function notAcceptableResponse(href, available) {
288
296
  */
289
297
  export function alternateLinks(href, current, available) {
290
298
  return available
291
- .filter((representation) => representation !== current)
299
+ .filter((representation) => representation !== current && hasOwnUrl(representation))
292
300
  .map((representation) => `<${representationHref(href, representation)}>; rel="alternate"; type="${MEDIA_TYPES[representation]}"`)
293
301
  .join(', ');
294
302
  }
303
+ function hasOwnUrl(representation) {
304
+ return representation === 'html' || REPRESENTATION_EXTENSIONS[representation] !== undefined;
305
+ }
295
306
  /**
296
307
  * The validator for one representation of something whose content is already
297
308
  * hashed.