@geekity/cms 0.41.0 → 0.42.1

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 (199) hide show
  1. package/admin/components/blocks.njk +15 -1
  2. package/admin/pages/documents/editor.njk +1 -0
  3. package/admin/pages/settings/reading.njk +14 -0
  4. package/admin/pages/users/writing-goals.njk +64 -0
  5. package/admin/static/admin.css +5 -1
  6. package/admin/static/editor.js +21 -18
  7. package/dist/access-log.d.ts +3 -0
  8. package/dist/access-log.d.ts.map +1 -1
  9. package/dist/access-log.js +13 -9
  10. package/dist/access-log.js.map +1 -1
  11. package/dist/admin/autosave.d.ts +1 -0
  12. package/dist/admin/autosave.d.ts.map +1 -1
  13. package/dist/admin/autosave.js +20 -4
  14. package/dist/admin/autosave.js.map +1 -1
  15. package/dist/admin/blocks.d.ts +13 -1
  16. package/dist/admin/blocks.d.ts.map +1 -1
  17. package/dist/admin/blocks.js +40 -5
  18. package/dist/admin/blocks.js.map +1 -1
  19. package/dist/admin/core-widgets.d.ts.map +1 -1
  20. package/dist/admin/core-widgets.js +2 -0
  21. package/dist/admin/core-widgets.js.map +1 -1
  22. package/dist/admin/documents.d.ts.map +1 -1
  23. package/dist/admin/documents.js +18 -0
  24. package/dist/admin/documents.js.map +1 -1
  25. package/dist/admin/editor-word-counter.d.ts +8 -0
  26. package/dist/admin/editor-word-counter.d.ts.map +1 -0
  27. package/dist/admin/editor-word-counter.js +27 -0
  28. package/dist/admin/editor-word-counter.js.map +1 -0
  29. package/dist/admin/editor-words.d.ts +7 -0
  30. package/dist/admin/editor-words.d.ts.map +1 -0
  31. package/dist/admin/editor-words.js +9 -0
  32. package/dist/admin/editor-words.js.map +1 -0
  33. package/dist/admin/focus-mode.d.ts +0 -2
  34. package/dist/admin/focus-mode.d.ts.map +1 -1
  35. package/dist/admin/focus-mode.js +0 -10
  36. package/dist/admin/focus-mode.js.map +1 -1
  37. package/dist/admin/menu.d.ts.map +1 -1
  38. package/dist/admin/menu.js +2 -0
  39. package/dist/admin/menu.js.map +1 -1
  40. package/dist/admin/routes.d.ts.map +1 -1
  41. package/dist/admin/routes.js +2 -0
  42. package/dist/admin/routes.js.map +1 -1
  43. package/dist/admin/settings-fields.d.ts.map +1 -1
  44. package/dist/admin/settings-fields.js +1 -0
  45. package/dist/admin/settings-fields.js.map +1 -1
  46. package/dist/admin/settings-reading.d.ts.map +1 -1
  47. package/dist/admin/settings-reading.js +7 -1
  48. package/dist/admin/settings-reading.js.map +1 -1
  49. package/dist/admin/templates.d.ts +1 -0
  50. package/dist/admin/templates.d.ts.map +1 -1
  51. package/dist/admin/templates.js +1 -0
  52. package/dist/admin/templates.js.map +1 -1
  53. package/dist/admin/users.d.ts.map +1 -1
  54. package/dist/admin/users.js +2 -0
  55. package/dist/admin/users.js.map +1 -1
  56. package/dist/admin/widget-writing.d.ts +3 -0
  57. package/dist/admin/widget-writing.d.ts.map +1 -0
  58. package/dist/admin/widget-writing.js +102 -0
  59. package/dist/admin/widget-writing.js.map +1 -0
  60. package/dist/admin/widgets.d.ts +4 -1
  61. package/dist/admin/widgets.d.ts.map +1 -1
  62. package/dist/admin/widgets.js +19 -8
  63. package/dist/admin/widgets.js.map +1 -1
  64. package/dist/admin/writing-goals.d.ts +33 -0
  65. package/dist/admin/writing-goals.d.ts.map +1 -0
  66. package/dist/admin/writing-goals.js +149 -0
  67. package/dist/admin/writing-goals.js.map +1 -0
  68. package/dist/cli.d.ts +1 -1
  69. package/dist/cli.d.ts.map +1 -1
  70. package/dist/cli.js +64 -3
  71. package/dist/cli.js.map +1 -1
  72. package/dist/cms/create.d.ts +5 -2
  73. package/dist/cms/create.d.ts.map +1 -1
  74. package/dist/cms/create.js +60 -2
  75. package/dist/cms/create.js.map +1 -1
  76. package/dist/cms/server-error.d.ts.map +1 -1
  77. package/dist/cms/server-error.js +1 -0
  78. package/dist/cms/server-error.js.map +1 -1
  79. package/dist/cms/services.d.ts.map +1 -1
  80. package/dist/cms/services.js +5 -0
  81. package/dist/cms/services.js.map +1 -1
  82. package/dist/config.d.ts +20 -0
  83. package/dist/config.d.ts.map +1 -1
  84. package/dist/config.js +6 -2
  85. package/dist/config.js.map +1 -1
  86. package/dist/content/words.d.ts +3 -0
  87. package/dist/content/words.d.ts.map +1 -0
  88. package/dist/content/words.js +120 -0
  89. package/dist/content/words.js.map +1 -0
  90. package/dist/files/data-files.d.ts +3 -0
  91. package/dist/files/data-files.d.ts.map +1 -1
  92. package/dist/files/data-files.js +18 -0
  93. package/dist/files/data-files.js.map +1 -1
  94. package/dist/gemini/capsule.d.ts +4 -0
  95. package/dist/gemini/capsule.d.ts.map +1 -0
  96. package/dist/gemini/capsule.js +9 -0
  97. package/dist/gemini/capsule.js.map +1 -0
  98. package/dist/gemini/certificate.d.ts +34 -0
  99. package/dist/gemini/certificate.d.ts.map +1 -0
  100. package/dist/gemini/certificate.js +255 -0
  101. package/dist/gemini/certificate.js.map +1 -0
  102. package/dist/gemini/site-certificate.d.ts +8 -0
  103. package/dist/gemini/site-certificate.d.ts.map +1 -0
  104. package/dist/gemini/site-certificate.js +17 -0
  105. package/dist/gemini/site-certificate.js.map +1 -0
  106. package/dist/micropub/endpoint.d.ts.map +1 -1
  107. package/dist/micropub/endpoint.js +12 -0
  108. package/dist/micropub/endpoint.js.map +1 -1
  109. package/dist/plugin.d.ts +14 -1
  110. package/dist/plugin.d.ts.map +1 -1
  111. package/dist/plugin.js.map +1 -1
  112. package/dist/site/namespace.d.ts +1 -0
  113. package/dist/site/namespace.d.ts.map +1 -1
  114. package/dist/site/namespace.js +6 -0
  115. package/dist/site/namespace.js.map +1 -1
  116. package/dist/site/users.d.ts +7 -0
  117. package/dist/site/users.d.ts.map +1 -1
  118. package/dist/site/users.js +7 -0
  119. package/dist/site/users.js.map +1 -1
  120. package/dist/site/writing-goals.d.ts +22 -0
  121. package/dist/site/writing-goals.d.ts.map +1 -0
  122. package/dist/site/writing-goals.js +42 -0
  123. package/dist/site/writing-goals.js.map +1 -0
  124. package/dist/util/public-address.d.ts +1 -0
  125. package/dist/util/public-address.d.ts.map +1 -1
  126. package/dist/util/public-address.js +38 -30
  127. package/dist/util/public-address.js.map +1 -1
  128. package/dist/web/access-line.d.ts +2 -0
  129. package/dist/web/access-line.d.ts.map +1 -0
  130. package/dist/web/access-line.js +6 -0
  131. package/dist/web/access-line.js.map +1 -0
  132. package/dist/web/document-page.d.ts.map +1 -1
  133. package/dist/web/document-page.js +3 -4
  134. package/dist/web/document-page.js.map +1 -1
  135. package/dist/web/feed-routes.d.ts.map +1 -1
  136. package/dist/web/feed-routes.js +4 -4
  137. package/dist/web/feed-routes.js.map +1 -1
  138. package/dist/web/gemini-listener.d.ts +30 -0
  139. package/dist/web/gemini-listener.d.ts.map +1 -0
  140. package/dist/web/gemini-listener.js +186 -0
  141. package/dist/web/gemini-listener.js.map +1 -0
  142. package/dist/web/gemini-request.d.ts +23 -0
  143. package/dist/web/gemini-request.d.ts.map +1 -0
  144. package/dist/web/gemini-request.js +127 -0
  145. package/dist/web/gemini-request.js.map +1 -0
  146. package/dist/web/listing-pages.d.ts.map +1 -1
  147. package/dist/web/listing-pages.js +7 -5
  148. package/dist/web/listing-pages.js.map +1 -1
  149. package/dist/web/llms.d.ts +1 -0
  150. package/dist/web/llms.d.ts.map +1 -1
  151. package/dist/web/llms.js +3 -0
  152. package/dist/web/llms.js.map +1 -1
  153. package/dist/web/maintenance.js +1 -0
  154. package/dist/web/maintenance.js.map +1 -1
  155. package/dist/web/markdown-representation.d.ts +11 -20
  156. package/dist/web/markdown-representation.d.ts.map +1 -1
  157. package/dist/web/markdown-representation.js +57 -58
  158. package/dist/web/markdown-representation.js.map +1 -1
  159. package/dist/web/negotiate.d.ts +8 -17
  160. package/dist/web/negotiate.d.ts.map +1 -1
  161. package/dist/web/negotiate.js +37 -28
  162. package/dist/web/negotiate.js.map +1 -1
  163. package/dist/web/proxy-protocol.d.ts +13 -0
  164. package/dist/web/proxy-protocol.d.ts.map +1 -0
  165. package/dist/web/proxy-protocol.js +79 -0
  166. package/dist/web/proxy-protocol.js.map +1 -0
  167. package/dist/web/render.d.ts +33 -20
  168. package/dist/web/render.d.ts.map +1 -1
  169. package/dist/web/render.js +64 -27
  170. package/dist/web/render.js.map +1 -1
  171. package/dist/web/routes.d.ts.map +1 -1
  172. package/dist/web/routes.js +4 -8
  173. package/dist/web/routes.js.map +1 -1
  174. package/dist/web/site-index.d.ts.map +1 -1
  175. package/dist/web/site-index.js +6 -2
  176. package/dist/web/site-index.js.map +1 -1
  177. package/dist/web/status-pages.d.ts +2 -3
  178. package/dist/web/status-pages.d.ts.map +1 -1
  179. package/dist/web/status-pages.js +14 -11
  180. package/dist/web/status-pages.js.map +1 -1
  181. package/dist/web/throttle.d.ts +9 -0
  182. package/dist/web/throttle.d.ts.map +1 -1
  183. package/dist/web/throttle.js +17 -0
  184. package/dist/web/throttle.js.map +1 -1
  185. package/dist/writing/ledger.d.ts +15 -0
  186. package/dist/writing/ledger.d.ts.map +1 -0
  187. package/dist/writing/ledger.js +70 -0
  188. package/dist/writing/ledger.js.map +1 -0
  189. package/dist/writing/progress.d.ts +25 -0
  190. package/dist/writing/progress.d.ts.map +1 -0
  191. package/dist/writing/progress.js +83 -0
  192. package/dist/writing/progress.js.map +1 -0
  193. package/package.json +2 -1
  194. package/themes/default/layouts/404.gmi.njk +10 -0
  195. package/themes/default/layouts/410.gmi.njk +8 -0
  196. package/themes/default/layouts/500.gmi.njk +9 -0
  197. package/themes/default/layouts/503.gmi.njk +9 -0
  198. package/themes/default/layouts/base.njk +3 -0
  199. package/themes/default/partials/markdown-footer.md.njk +9 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/writing/progress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,UAAU,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAErF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,IAAI,EACT,QAAQ,EAAE,MAAM,GACf,eAAe,CAajB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAEhF"}
@@ -0,0 +1,83 @@
1
+ import { Temporal } from '@js-temporal/polyfill';
2
+ import { writingDay } from './ledger.js';
3
+ export function writingProgress(ledger, goals, now, timezone) {
4
+ const today = Temporal.PlainDate.from(writingDay(now, timezone));
5
+ const wordsToday = ledger.days[today.toString()] ?? 0;
6
+ return {
7
+ today: today.toString(),
8
+ wordsToday,
9
+ period: periodProgress(ledger, goals, today),
10
+ streak: {
11
+ ...streaks(ledger, goals.streak, today),
12
+ todayMet: meetsStreak(wordsToday, goals.streak),
13
+ todayNeeds: Math.max(0, goals.streak.dailyWords - wordsToday),
14
+ },
15
+ };
16
+ }
17
+ export function meetsStreak(words, rule) {
18
+ return (words ?? 0) >= rule.dailyWords;
19
+ }
20
+ function periodProgress(ledger, goal, today) {
21
+ const [start, end] = periodBounds(goal.period, today);
22
+ let words = 0;
23
+ for (const [day, total] of Object.entries(ledger.days)) {
24
+ if (Temporal.PlainDate.compare(start, day) <= 0 &&
25
+ Temporal.PlainDate.compare(day, today) <= 0) {
26
+ words += total;
27
+ }
28
+ }
29
+ const elapsed = daysBetween(start, today) + 1;
30
+ const length = daysBetween(start, end) + 1;
31
+ const expected = Math.ceil((goal.words * elapsed) / length);
32
+ return {
33
+ start: start.toString(),
34
+ end: end.toString(),
35
+ words,
36
+ goal: goal.words,
37
+ expected,
38
+ pace: words - expected,
39
+ };
40
+ }
41
+ function periodBounds(period, today) {
42
+ switch (period) {
43
+ case 'day':
44
+ return [today, today];
45
+ case 'week': {
46
+ const monday = today.subtract({ days: today.dayOfWeek - 1 });
47
+ return [monday, monday.add({ days: 6 })];
48
+ }
49
+ case 'month':
50
+ return [today.with({ day: 1 }), today.with({ day: today.daysInMonth })];
51
+ case 'year':
52
+ return [today.with({ month: 1, day: 1 }), today.with({ month: 12, day: 31 })];
53
+ }
54
+ }
55
+ function streaks(ledger, rule, today) {
56
+ const first = Object.keys(ledger.days)
57
+ .filter((day) => meetsStreak(ledger.days[day], rule))
58
+ .sort()[0];
59
+ if (first === undefined)
60
+ return { current: 0, best: 0 };
61
+ let run = 0;
62
+ let misses = 0;
63
+ let best = 0;
64
+ for (let day = Temporal.PlainDate.from(first); Temporal.PlainDate.compare(day, today) < 0; day = day.add({ days: 1 })) {
65
+ if (meetsStreak(ledger.days[day.toString()], rule)) {
66
+ run += 1;
67
+ misses = 0;
68
+ }
69
+ else {
70
+ misses += 1;
71
+ if (misses > rule.missesAllowed)
72
+ run = 0;
73
+ }
74
+ best = Math.max(best, run);
75
+ }
76
+ if (meetsStreak(ledger.days[today.toString()], rule))
77
+ run += 1;
78
+ return { current: run, best: Math.max(best, run) };
79
+ }
80
+ function daysBetween(from, to) {
81
+ return from.until(to, { largestUnit: 'day' }).days;
82
+ }
83
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/writing/progress.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekity/cms",
3
- "version": "0.41.0",
3
+ "version": "0.42.1",
4
4
  "type": "module",
5
5
  "description": "A file-first CMS: Markdown content, a SQLite index, a Hono server that is both the editor and the public site.",
6
6
  "license": "MIT",
@@ -52,6 +52,7 @@
52
52
  "@fedify/hono": "^2.4.4",
53
53
  "@fedify/sqlite": "^2.4.4",
54
54
  "@fedify/vocab": "^2.4.4",
55
+ "@geekity/md2gemini": "^0.1.1",
55
56
  "@hono/node-server": "^2.1.5",
56
57
  "@js-temporal/polyfill": "^0.5.1",
57
58
  "gray-matter": "^4.0.3",
@@ -0,0 +1,10 @@
1
+ {#
2
+ The body of the 404 page's gemtext. Converting 404.md.njk would turn its
3
+ closing sentence into "Go home[1], or search the site[2]." over two
4
+ numbered link lines, so the links are written as link lines here.
5
+ The context is the Markdown one's; links go through `geminiUrl`.
6
+ #}
7
+ Content not found.
8
+
9
+ => {{ "/" | geminiUrl }} Home
10
+ => {{ "/search/" | geminiUrl }} Search the site
@@ -0,0 +1,8 @@
1
+ {#
2
+ The body of the 410 page's gemtext, written as gemtext for the reason
3
+ 404.gmi.njk gives. The context is the 404's.
4
+ #}
5
+ This content has been deleted.
6
+
7
+ => {{ "/" | geminiUrl }} Home
8
+ => {{ "/search/" | geminiUrl }} Search the site
@@ -0,0 +1,9 @@
1
+ {#
2
+ The body of the 500 page's gemtext, written as gemtext for the reason
3
+ 404.gmi.njk gives. The context is the 404's. When this fails too, the CMS
4
+ writes a fixed body instead.
5
+ #}
6
+ This page could not be shown because of a problem on the server. Try again in a moment.
7
+
8
+ => {{ "/" | geminiUrl }} Home
9
+ => {{ "/search/" | geminiUrl }} Search the site
@@ -0,0 +1,9 @@
1
+ {#
2
+ The body of the maintenance page's gemtext, written as gemtext for the
3
+ reason 404.gmi.njk gives. `until` and `untilText` are as in 503.md.njk.
4
+ When this fails, the CMS writes a fixed body instead.
5
+ #}
6
+ This site is down for maintenance and will be back shortly.{% if until %} It should be back by {{ untilText }}.{% endif %} Please try again then.
7
+
8
+ => {{ "/" | geminiUrl }} Home
9
+ => {{ "/search/" | geminiUrl }} Search the site
@@ -167,6 +167,9 @@
167
167
  {% if activityStreams %}
168
168
  <link rel="alternate" type="application/activity+json" href="{{ activityStreams }}">
169
169
  {% endif %}
170
+ {% if capsuleUrl %}
171
+ <link rel="alternate" type="text/gemini" href="{{ capsuleUrl }}">
172
+ {% endif %}
170
173
  {% endblock %}
171
174
  {% if webmention %}
172
175
  <link rel="webmention" href="{{ webmention | url }}">
@@ -27,7 +27,9 @@
27
27
  under its list item. `commentForm` and `contactForm` are each the `url` of
28
28
  the form on the HTML page, printed as it is, since a form needs HTML;
29
29
  `commentForm` is absent while comments are closed. `webmention` is there
30
- when the site takes webmentions.
30
+ when the site takes webmentions. `capsuleUrl` is this page's gemini:// URL
31
+ while the site serves Gemini, and is never set when this is written as
32
+ gemtext.
31
33
  `thread` is on a comment's own page, as the header describes it: its
32
34
  `comment.replies` are threaded as a conversation's are, and `onPostUrl` is the
33
35
  comment on the post's page.
@@ -135,6 +137,12 @@ Or reply from your own site and send a [webmention](https://indieweb.org/Webment
135
137
 
136
138
  [Send a message on the web page]({{ contactForm.url }})
137
139
 
140
+ {% endif %}
141
+ {% if capsuleUrl %}
142
+ ## Gemini
143
+
144
+ [Read this page over Gemini]({{ capsuleUrl }})
145
+
138
146
  {% endif %}
139
147
  {% if feeds.length %}
140
148
  ## Feeds