@jant/core 0.6.15 → 0.7.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 (537) hide show
  1. package/README.md +11 -11
  2. package/bin/commands/assets/upload.js +192 -15
  3. package/bin/commands/import-site.js +67 -4
  4. package/bin/commands/reset-password.js +21 -8
  5. package/bin/commands/site/snapshot/export.js +1 -1
  6. package/bin/commands/site/snapshot/import.js +1 -1
  7. package/bin/lib/d1-query.js +5 -16
  8. package/bin/lib/node-env.js +40 -4
  9. package/bin/lib/site-selection.js +85 -29
  10. package/bin/lib/wrangler-cli.js +28 -2
  11. package/bin/lib/wrangler-json.js +35 -0
  12. package/dist/{app-C-oi_t8W.js → app-K_Aa1MMn.js} +52623 -13193
  13. package/dist/client/.vite/manifest.json +255 -90
  14. package/dist/client/_assets/chunks/confirm-D7GrwsCN.js +45 -0
  15. package/dist/client/_assets/chunks/create-editor-CD3FhrOB.js +257 -0
  16. package/dist/client/_assets/chunks/{native-DpcrFAPh.js → emoji-mart-C4RpRKcU.js} +716 -1
  17. package/dist/client/_assets/chunks/footnote-rail-CmeoVtnU.js +1 -0
  18. package/dist/client/_assets/chunks/heic-to-CuP2Qlsw.js +1 -0
  19. package/dist/client/_assets/chunks/jant-locale-picker-DL6mIOT5.js +69 -0
  20. package/dist/client/_assets/chunks/lit-DW8VmJAT.js +2 -0
  21. package/dist/client/_assets/chunks/mediabunny-DRaCQ1r-.js +31 -0
  22. package/dist/client/_assets/chunks/rolldown-runtime-hePW80VL.js +1 -0
  23. package/dist/client/_assets/chunks/settings-paths-BcdySNx6.js +84 -0
  24. package/dist/client/_assets/chunks/site-header-nav-DzXsFk05.js +1 -0
  25. package/dist/client/_assets/chunks/slug-format-CRXO1AL5.js +1 -0
  26. package/dist/client/_assets/chunks/slugify-373citbs.js +1 -0
  27. package/dist/client/_assets/chunks/sortable-list-CgaL2jCs.js +2 -0
  28. package/dist/client/_assets/chunks/types-D5iF3H1a.js +1 -0
  29. package/dist/client/_assets/chunks/unsafe-html-B5ZEXaxg.js +1 -0
  30. package/dist/client/_assets/chunks/unsafe-svg-0QCkP0vZ.js +2 -0
  31. package/dist/client/_assets/client-GiYENVw8.css +2 -0
  32. package/dist/client/_assets/client-VnFxJN7G.js +295 -0
  33. package/dist/client/_assets/client-auth-k8gJ6QJj.js +828 -0
  34. package/dist/client/_assets/client-author-DQ8R-8KR.css +2 -0
  35. package/dist/client/_assets/client-compose-B_kDtWkW.js +2004 -0
  36. package/dist/client/_assets/client-manage-M90aSTOk.js +2170 -0
  37. package/dist/client/_assets/client-settings-DfYs9n1F.js +1112 -0
  38. package/dist/{export-CsFx6F_M.js → github-sync-BPAvT999.js} +2343 -110
  39. package/dist/index.js +2 -5
  40. package/dist/node.js +5 -7
  41. package/package.json +3 -3
  42. package/src/__tests__/auth-session-freshness.test.ts +57 -0
  43. package/src/__tests__/basecoat-variants.test.ts +121 -0
  44. package/src/__tests__/bin/assets-upload.test.ts +68 -0
  45. package/src/__tests__/export-hugo-build.test.ts +260 -0
  46. package/src/__tests__/export-service.test.ts +231 -0
  47. package/src/__tests__/helpers/component-css.ts +91 -0
  48. package/src/__tests__/helpers/db.ts +33 -0
  49. package/src/__tests__/helpers/export-fixtures.ts +3 -0
  50. package/src/__tests__/mise-config.test.ts +22 -0
  51. package/src/__tests__/stylesheet-audience.test.ts +159 -0
  52. package/src/__tests__/stylesheet-breakpoints.test.ts +183 -0
  53. package/src/app.tsx +71 -16
  54. package/src/auth.ts +18 -1
  55. package/src/client/__tests__/collection-page-actions.test.ts +51 -2
  56. package/src/client/__tests__/compose-bridge-image-upload.test.ts +196 -0
  57. package/src/client/__tests__/compose-bridge-video-poster.test.ts +159 -0
  58. package/src/client/__tests__/compose-bridge.test.ts +524 -2
  59. package/src/client/__tests__/compose-launch.test.ts +62 -1
  60. package/src/client/__tests__/compose-shortcuts.test.ts +57 -8
  61. package/src/client/__tests__/compose-triggers.test.ts +90 -0
  62. package/src/client/__tests__/copy-field.test.ts +162 -0
  63. package/src/client/__tests__/custom-url-menu.test.ts +127 -6
  64. package/src/client/__tests__/image-processor.test.ts +324 -2
  65. package/src/client/__tests__/lazy-entries.test.ts +92 -0
  66. package/src/client/__tests__/media-scroll-hint.test.ts +155 -0
  67. package/src/client/__tests__/runtime-paths.test.ts +84 -0
  68. package/src/client/__tests__/smart-collection-page-actions.test.ts +158 -0
  69. package/src/client/__tests__/toast.test.ts +88 -1
  70. package/src/client/__tests__/video-processor-probe.test.ts +175 -0
  71. package/src/client/__tests__/video-processor.test.ts +181 -0
  72. package/src/client/audio-processor.ts +24 -15
  73. package/src/client/audio-waveform.ts +49 -0
  74. package/src/client/collection-dialog-host.ts +72 -0
  75. package/src/client/collection-navigation.ts +51 -16
  76. package/src/client/collection-page-actions.ts +26 -0
  77. package/src/client/components/__tests__/compose-format-convert.test.ts +0 -19
  78. package/src/client/components/__tests__/jant-collection-dialog.test.ts +329 -0
  79. package/src/client/components/__tests__/jant-collection-directory.test.ts +274 -10
  80. package/src/client/components/__tests__/jant-collection-form.test.ts +59 -178
  81. package/src/client/components/__tests__/jant-command-palette.test.ts +79 -0
  82. package/src/client/components/__tests__/jant-compose-dialog-draft-storage.test.ts +340 -0
  83. package/src/client/components/__tests__/jant-compose-dialog.test.ts +3283 -389
  84. package/src/client/components/__tests__/jant-compose-editor.test.ts +581 -86
  85. package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +34 -89
  86. package/src/client/components/__tests__/jant-locale-picker.test.ts +207 -0
  87. package/src/client/components/__tests__/jant-nav-manager.test.ts +234 -15
  88. package/src/client/components/__tests__/jant-post-menu.test.ts +413 -2
  89. package/src/client/components/__tests__/jant-post-picker.test.ts +197 -0
  90. package/src/client/components/__tests__/jant-settings-avatar.test.ts +15 -12
  91. package/src/client/components/__tests__/jant-settings-general.test.ts +541 -172
  92. package/src/client/components/__tests__/jant-settings-language.test.ts +851 -0
  93. package/src/client/components/__tests__/jant-smart-collection-dialog.test.ts +665 -0
  94. package/src/client/components/collection-dialog-types.ts +49 -0
  95. package/src/client/components/collection-manager-types.ts +32 -1
  96. package/src/client/components/collection-types.ts +1 -15
  97. package/src/client/components/compose-format-convert.ts +5 -1
  98. package/src/client/components/compose-types.ts +121 -3
  99. package/src/client/components/jant-collection-dialog.ts +722 -0
  100. package/src/client/components/jant-collection-directory.ts +567 -182
  101. package/src/client/components/jant-collection-form.ts +53 -232
  102. package/src/client/components/jant-command-palette.ts +106 -49
  103. package/src/client/components/jant-compose-dialog.ts +2757 -1194
  104. package/src/client/components/jant-compose-editor.ts +866 -397
  105. package/src/client/components/jant-compose-fullscreen.ts +53 -47
  106. package/src/client/components/jant-config-editor.ts +65 -53
  107. package/src/client/components/jant-confirm-dialog.ts +13 -11
  108. package/src/client/components/jant-locale-picker.ts +418 -0
  109. package/src/client/components/jant-media-lightbox.ts +146 -136
  110. package/src/client/components/jant-nav-manager.ts +690 -366
  111. package/src/client/components/jant-post-menu.ts +1142 -268
  112. package/src/client/components/jant-post-picker.ts +324 -0
  113. package/src/client/components/jant-repo-picker.ts +138 -106
  114. package/src/client/components/jant-settings-avatar.ts +31 -27
  115. package/src/client/components/jant-settings-general.ts +617 -543
  116. package/src/client/components/jant-settings-language.ts +1087 -0
  117. package/src/client/components/jant-smart-collection-dialog.ts +1021 -0
  118. package/src/client/components/jant-text-preview.ts +94 -86
  119. package/src/client/components/nav-manager-types.ts +62 -1
  120. package/src/client/components/settings-types.ts +14 -29
  121. package/src/client/components/smart-collection-conditions.ts +285 -0
  122. package/src/client/components/smart-collection-dialog-types.ts +68 -0
  123. package/src/client/compose-bridge.ts +336 -242
  124. package/src/client/compose-launch.ts +89 -2
  125. package/src/client/compose-shortcuts.ts +9 -7
  126. package/src/client/compose-triggers.ts +50 -0
  127. package/src/client/copy-field.ts +108 -0
  128. package/src/client/custom-url-menu.ts +60 -4
  129. package/src/client/icons.ts +14 -0
  130. package/src/client/image-plan.ts +165 -0
  131. package/src/client/image-processor.ts +195 -117
  132. package/src/client/image-worker-client.ts +45 -0
  133. package/src/client/image-worker.ts +135 -0
  134. package/src/client/lazy-entries.ts +95 -0
  135. package/src/client/lazy-slugify.ts +2 -2
  136. package/src/client/media-scroll-hint.ts +43 -2
  137. package/src/client/mediabunny.ts +29 -0
  138. package/src/client/post-picker.ts +41 -0
  139. package/src/client/post-refresh.ts +135 -0
  140. package/src/client/runtime-paths.ts +74 -1
  141. package/src/client/settings-bridge.ts +4 -10
  142. package/src/client/site-header-nav.js +18 -6
  143. package/src/client/smart-collection-dialog-host.ts +116 -0
  144. package/src/client/smart-collection-page-actions.ts +208 -0
  145. package/src/client/tiptap/__tests__/bubble-menu.test.ts +110 -0
  146. package/src/client/tiptap/__tests__/floating-position.test.ts +136 -1
  147. package/src/client/tiptap/__tests__/inline-image-upload.test.ts +37 -0
  148. package/src/client/tiptap/__tests__/link-input-rules.test.ts +121 -0
  149. package/src/client/tiptap/bubble-menu.ts +47 -16
  150. package/src/client/tiptap/floating-position.ts +216 -2
  151. package/src/client/tiptap/inline-image-upload.ts +7 -3
  152. package/src/client/tiptap/link-input-rules.ts +4 -4
  153. package/src/client/tiptap/link-toolbar.ts +22 -9
  154. package/src/client/toast.ts +143 -38
  155. package/src/client/types/vite-worker.d.ts +12 -0
  156. package/src/client/upload-with-metadata.ts +3 -13
  157. package/src/client/video-processor.ts +351 -107
  158. package/src/client-auth.ts +14 -31
  159. package/src/client-compose.ts +19 -0
  160. package/src/client-manage.ts +13 -0
  161. package/src/client-settings.ts +14 -0
  162. package/src/client-site.ts +10 -3
  163. package/src/client.ts +4 -0
  164. package/src/db/__tests__/backfill-nav-label-mirrors.test.ts +149 -0
  165. package/src/db/__tests__/backfill-thread-activity.test.ts +234 -0
  166. package/src/db/__tests__/schema-enum-sources.test.ts +33 -0
  167. package/src/db/__tests__/smart-collection-placement.test.ts +402 -0
  168. package/src/db/__tests__/thread-activity.test.ts +113 -0
  169. package/src/db/backfills/0005_split_thread_activity_from_quiet_replies.sql +68 -0
  170. package/src/db/backfills/0006_clear_mirrored_page_nav_labels.sql +31 -0
  171. package/src/db/migrations/0031_many_ego.sql +3 -0
  172. package/src/db/migrations/0032_married_tomas.sql +3 -0
  173. package/src/db/migrations/0033_busy_johnny_storm.sql +198 -0
  174. package/src/db/migrations/0034_cheerful_rumiko_fujikawa.sql +35 -0
  175. package/src/db/migrations/meta/0031_snapshot.json +2562 -0
  176. package/src/db/migrations/meta/0032_snapshot.json +2582 -0
  177. package/src/db/migrations/meta/0033_snapshot.json +2816 -0
  178. package/src/db/migrations/meta/0034_snapshot.json +2816 -0
  179. package/src/db/migrations/meta/_journal.json +28 -0
  180. package/src/db/migrations/pg/0029_rare_hairball.sql +3 -0
  181. package/src/db/migrations/pg/0030_abandoned_nighthawk.sql +3 -0
  182. package/src/db/migrations/pg/0031_strong_ultimatum.sql +128 -0
  183. package/src/db/migrations/pg/0032_furry_multiple_man.sql +6 -0
  184. package/src/db/migrations/pg/meta/0029_snapshot.json +3289 -0
  185. package/src/db/migrations/pg/meta/0030_snapshot.json +3329 -0
  186. package/src/db/migrations/pg/meta/0031_snapshot.json +3660 -0
  187. package/src/db/migrations/pg/meta/0032_snapshot.json +3660 -0
  188. package/src/db/migrations/pg/meta/_journal.json +28 -0
  189. package/src/db/pg/schema.ts +213 -27
  190. package/src/db/post-visibility.ts +117 -0
  191. package/src/db/schema.ts +242 -27
  192. package/src/db/thread-activity.ts +101 -0
  193. package/src/i18n/__tests__/detect.test.ts +26 -81
  194. package/src/i18n/__tests__/supported-locales.test.ts +83 -0
  195. package/src/i18n/context.tsx +12 -2
  196. package/src/i18n/detect.ts +7 -66
  197. package/src/i18n/locales/glossary.zh-Hans.yml +44 -4
  198. package/src/i18n/locales/glossary.zh-Hant.yml +44 -4
  199. package/src/i18n/locales/public/en.po +568 -168
  200. package/src/i18n/locales/public/en.ts +1 -1
  201. package/src/i18n/locales/public/zh-Hans.po +562 -162
  202. package/src/i18n/locales/public/zh-Hans.ts +1 -1
  203. package/src/i18n/locales/public/zh-Hant.po +562 -162
  204. package/src/i18n/locales/public/zh-Hant.ts +1 -1
  205. package/src/i18n/locales/settings/en.po +551 -69
  206. package/src/i18n/locales/settings/en.ts +1 -1
  207. package/src/i18n/locales/settings/zh-Hans.po +597 -115
  208. package/src/i18n/locales/settings/zh-Hans.ts +1 -1
  209. package/src/i18n/locales/settings/zh-Hant.po +610 -128
  210. package/src/i18n/locales/settings/zh-Hant.ts +1 -1
  211. package/src/i18n/locales.ts +94 -0
  212. package/src/i18n/middleware.ts +12 -2
  213. package/src/i18n/supported-locales.ts +80 -0
  214. package/src/lib/__tests__/api-settings.test.ts +11 -2
  215. package/src/lib/__tests__/asset-path.test.ts +92 -0
  216. package/src/lib/__tests__/deferred.test.ts +90 -0
  217. package/src/lib/__tests__/discover-ping.test.ts +89 -0
  218. package/src/lib/__tests__/discover.test.ts +410 -0
  219. package/src/lib/__tests__/feed-policy.test.ts +26 -0
  220. package/src/lib/__tests__/feed.test.ts +1691 -12
  221. package/src/lib/__tests__/filter-dimensions.test.ts +341 -0
  222. package/src/lib/__tests__/hosted-signin.test.ts +1 -1
  223. package/src/lib/__tests__/http-cache.test.ts +162 -0
  224. package/src/lib/__tests__/jant-docs-dev.test.ts +21 -0
  225. package/src/lib/__tests__/jant-docs.test.ts +23 -0
  226. package/src/lib/__tests__/lang-detect.test.ts +231 -0
  227. package/src/lib/__tests__/markdown.test.ts +16 -0
  228. package/src/lib/__tests__/media-helpers.test.ts +81 -0
  229. package/src/lib/__tests__/navigation.test.ts +135 -1
  230. package/src/lib/__tests__/resolve-config.test.ts +64 -3
  231. package/src/lib/__tests__/schemas.test.ts +42 -4
  232. package/src/lib/__tests__/site-unavailable-page.test.ts +25 -0
  233. package/src/lib/__tests__/slug.test.ts +88 -0
  234. package/src/lib/__tests__/slugify.test.ts +85 -0
  235. package/src/lib/__tests__/storage.test.ts +32 -0
  236. package/src/lib/__tests__/thread-fold.test.ts +113 -0
  237. package/src/lib/__tests__/translit.test.ts +87 -0
  238. package/src/lib/__tests__/upload-sideload.test.ts +14 -0
  239. package/src/lib/__tests__/url-fetch.test.ts +1 -2
  240. package/src/lib/__tests__/url.test.ts +93 -34
  241. package/src/lib/__tests__/view-language.test.ts +413 -0
  242. package/src/lib/__tests__/worker-response-cache.test.ts +90 -0
  243. package/src/lib/address.ts +57 -0
  244. package/src/lib/api-posts.ts +12 -0
  245. package/src/lib/asset-path.ts +98 -1
  246. package/src/lib/build-env.ts +16 -0
  247. package/src/lib/collection-groups.ts +5 -1
  248. package/src/lib/collection-paths.ts +3 -10
  249. package/src/lib/constants.ts +28 -3
  250. package/src/lib/copy-field.ts +36 -0
  251. package/src/lib/crypto.ts +40 -0
  252. package/src/lib/csp-builder.ts +2 -1
  253. package/src/lib/deferred.ts +79 -0
  254. package/src/lib/discover-ping.ts +141 -0
  255. package/src/lib/discover.ts +437 -0
  256. package/src/lib/env.ts +134 -0
  257. package/src/lib/errors.ts +33 -0
  258. package/src/lib/feed-policy.ts +236 -2
  259. package/src/lib/feed.ts +1021 -66
  260. package/src/lib/filter-dimensions.ts +1349 -0
  261. package/src/lib/github-sync-site-config.ts +3 -0
  262. package/src/lib/hosted-signin.ts +1 -1
  263. package/src/lib/http-cache.ts +148 -0
  264. package/src/lib/hugo-markdown.ts +21 -0
  265. package/src/lib/icons.ts +9 -2
  266. package/src/lib/ids.ts +3 -0
  267. package/src/lib/jant-docs.ts +42 -0
  268. package/src/lib/lang-detect.ts +308 -0
  269. package/src/lib/link-preview.ts +25 -0
  270. package/src/lib/markdown-manager.ts +6 -1
  271. package/src/lib/media-helpers.ts +13 -1
  272. package/src/lib/navigation.ts +78 -11
  273. package/src/lib/pagination.ts +28 -24
  274. package/src/lib/per-language-surfaces.ts +67 -0
  275. package/src/lib/post-display.ts +42 -9
  276. package/src/lib/post-meta.ts +19 -0
  277. package/src/lib/render.tsx +55 -7
  278. package/src/lib/resolve-config.ts +53 -5
  279. package/src/lib/schemas.ts +201 -10
  280. package/src/lib/site-header-fragment.tsx +2 -1
  281. package/src/lib/site-unavailable-page.ts +47 -0
  282. package/src/lib/slug.ts +51 -7
  283. package/src/lib/slugify.ts +113 -0
  284. package/src/lib/startup-config.ts +4 -6
  285. package/src/lib/storage.ts +7 -0
  286. package/src/lib/summary.ts +50 -0
  287. package/src/lib/thread-fold.ts +161 -0
  288. package/src/lib/time.ts +32 -0
  289. package/src/lib/timeline.ts +81 -10
  290. package/src/lib/tiptap-render.ts +5 -4
  291. package/src/lib/translit.ts +288 -0
  292. package/src/lib/upload.ts +16 -13
  293. package/src/lib/url.ts +188 -24
  294. package/src/lib/version.ts +10 -8
  295. package/src/lib/view-language.ts +436 -0
  296. package/src/lib/view.ts +79 -23
  297. package/src/lib/viewer-context.ts +62 -0
  298. package/src/middleware/__tests__/auth.test.ts +70 -2
  299. package/src/middleware/__tests__/cache-control.test.ts +71 -3
  300. package/src/middleware/__tests__/onboarding.test.ts +76 -5
  301. package/src/middleware/__tests__/secure-headers.test.ts +1 -1
  302. package/src/middleware/__tests__/session.test.ts +181 -33
  303. package/src/middleware/auth.ts +50 -31
  304. package/src/middleware/cache-control.ts +75 -10
  305. package/src/middleware/config.ts +6 -6
  306. package/src/middleware/error-handler.ts +12 -0
  307. package/src/middleware/onboarding.ts +32 -10
  308. package/src/middleware/secure-headers.ts +1 -1
  309. package/src/middleware/session.ts +96 -8
  310. package/src/node/__tests__/cli-migrate.test.ts +21 -19
  311. package/src/node/__tests__/cli-reset-password.test.ts +81 -8
  312. package/src/node/__tests__/cli-runtime-target.test.ts +48 -1
  313. package/src/node/__tests__/cli-site-selection.test.ts +128 -38
  314. package/src/node/__tests__/runtime.test.ts +37 -0
  315. package/src/node/index.ts +1 -0
  316. package/src/preset.css +76 -22
  317. package/src/routes/__tests__/feed-validator.test.ts +156 -0
  318. package/src/routes/api/__tests__/collections.test.ts +114 -0
  319. package/src/routes/api/__tests__/discover.test.ts +222 -0
  320. package/src/routes/api/__tests__/nav-items.test.ts +212 -2
  321. package/src/routes/api/__tests__/palette.test.ts +44 -0
  322. package/src/routes/api/__tests__/post-translations.test.ts +829 -0
  323. package/src/routes/api/__tests__/settings.test.ts +24 -3
  324. package/src/routes/api/__tests__/telegram.test.ts +6 -5
  325. package/src/routes/api/collections.ts +49 -6
  326. package/src/routes/api/custom-urls.ts +0 -1
  327. package/src/routes/api/discover.ts +95 -0
  328. package/src/routes/api/export.ts +3 -0
  329. package/src/routes/api/internal/__tests__/sites.test.ts +42 -2
  330. package/src/routes/api/nav-items.ts +55 -8
  331. package/src/routes/api/posts.ts +172 -9
  332. package/src/routes/api/public/__tests__/archive.test.ts +111 -0
  333. package/src/routes/api/public/__tests__/posts.test.ts +38 -0
  334. package/src/routes/api/public/archive.ts +77 -81
  335. package/src/routes/api/public/posts.ts +30 -6
  336. package/src/routes/api/smart-collections.ts +132 -0
  337. package/src/routes/api/telegram.ts +2 -40
  338. package/src/routes/api/uploads.ts +1 -2
  339. package/src/routes/auth/__tests__/setup-auth.test.ts +137 -0
  340. package/src/routes/auth/__tests__/setup-discover.test.ts +204 -0
  341. package/src/routes/auth/__tests__/setup-flow.test.ts +270 -0
  342. package/src/routes/auth/__tests__/setup-page.test.tsx +329 -0
  343. package/src/routes/auth/__tests__/setup-steps.test.ts +310 -0
  344. package/src/routes/auth/__tests__/setup.test.ts +278 -26
  345. package/src/routes/auth/__tests__/signin.test.ts +135 -0
  346. package/src/routes/auth/setup.tsx +934 -186
  347. package/src/routes/auth/signin.tsx +10 -8
  348. package/src/routes/compose.tsx +11 -2
  349. package/src/routes/dash/__tests__/custom-urls-archive.test.ts +44 -0
  350. package/src/routes/dash/__tests__/custom-urls-page.test.ts +49 -0
  351. package/src/routes/dash/__tests__/delete-account.test.ts +106 -0
  352. package/src/routes/dash/__tests__/settings-discover.test.ts +213 -0
  353. package/src/routes/dash/custom-urls.tsx +1 -37
  354. package/src/routes/dash/settings.tsx +502 -41
  355. package/src/routes/discover-announce.ts +96 -0
  356. package/src/routes/feed/__tests__/feed.test.ts +165 -2
  357. package/src/routes/feed/__tests__/sitemap.test.ts +68 -1
  358. package/src/routes/feed/feed.ts +69 -40
  359. package/src/routes/feed/sitemap.ts +95 -11
  360. package/src/routes/pages/__tests__/archive-indexing.test.ts +200 -0
  361. package/src/routes/pages/__tests__/archive-params.test.ts +657 -1
  362. package/src/routes/pages/__tests__/collection-routing.test.ts +16 -0
  363. package/src/routes/pages/__tests__/collections-feed-links.test.ts +72 -0
  364. package/src/routes/pages/__tests__/collections.test.ts +9 -3
  365. package/src/routes/pages/__tests__/custom-archive-url.test.ts +119 -0
  366. package/src/routes/pages/__tests__/featured.test.ts +6 -2
  367. package/src/routes/pages/__tests__/feed-autodiscovery.test.ts +148 -0
  368. package/src/routes/pages/__tests__/language-routing.test.ts +679 -0
  369. package/src/routes/pages/__tests__/post-preview-partial.test.ts +96 -0
  370. package/src/routes/pages/__tests__/preview.test.ts +3 -1
  371. package/src/routes/pages/__tests__/smart-collection.test.ts +298 -0
  372. package/src/routes/pages/__tests__/subscribe.test.ts +248 -0
  373. package/src/routes/pages/archive.tsx +507 -357
  374. package/src/routes/pages/collection.tsx +94 -96
  375. package/src/routes/pages/collections.tsx +38 -50
  376. package/src/routes/pages/featured.tsx +32 -13
  377. package/src/routes/pages/home.tsx +25 -6
  378. package/src/routes/pages/language.tsx +113 -0
  379. package/src/routes/pages/latest.tsx +26 -16
  380. package/src/routes/pages/new.tsx +3 -0
  381. package/src/routes/pages/page.tsx +183 -19
  382. package/src/routes/pages/partials.tsx +41 -0
  383. package/src/routes/pages/search.tsx +18 -3
  384. package/src/routes/pages/smart-collection.tsx +340 -0
  385. package/src/routes/pages/subscribe.tsx +182 -0
  386. package/src/runtime/__tests__/index.test.ts +19 -0
  387. package/src/runtime/__tests__/node.test.ts +129 -4
  388. package/src/runtime/cloudflare.ts +21 -2
  389. package/src/runtime/index.ts +27 -1
  390. package/src/runtime/node.ts +18 -1
  391. package/src/runtime/site.ts +95 -24
  392. package/src/services/__tests__/auth.test.ts +116 -7
  393. package/src/services/__tests__/collection.test.ts +139 -4
  394. package/src/services/__tests__/language.test.ts +495 -0
  395. package/src/services/__tests__/navigation.test.ts +213 -10
  396. package/src/services/__tests__/path.test.ts +180 -0
  397. package/src/services/__tests__/post-language.test.ts +830 -0
  398. package/src/services/__tests__/post-timeline.test.ts +142 -11
  399. package/src/services/__tests__/post.test.ts +323 -9
  400. package/src/services/__tests__/settings.test.ts +228 -17
  401. package/src/services/__tests__/site-admin.test.ts +5 -5
  402. package/src/services/__tests__/smart-collection.test.ts +651 -0
  403. package/src/services/about-page.ts +22 -1
  404. package/src/services/auth.ts +51 -49
  405. package/src/services/bootstrap.ts +188 -38
  406. package/src/services/collection-directory-position.ts +76 -0
  407. package/src/services/collection.ts +330 -47
  408. package/src/services/custom-url.ts +27 -22
  409. package/src/services/export-theme/assets/client-site.css +1 -1
  410. package/src/services/export-theme/assets/client-site.js +123 -123
  411. package/src/services/export-theme/layouts/_default/rss.xml +77 -1
  412. package/src/services/export-theme/layouts/partials/feed-post-content.xml +105 -2
  413. package/src/services/export-theme/layouts/partials/media-gallery.html +35 -21
  414. package/src/services/export-theme/layouts/partials/pagination.html +14 -13
  415. package/src/services/export-theme/layouts/partials/post-card.html +8 -4
  416. package/src/services/export-theme/layouts/partials/reply.html +2 -1
  417. package/src/services/export-theme/layouts/partials/thread-preview.html +40 -30
  418. package/src/services/export-theme/styles/main.css +13 -1
  419. package/src/services/export.ts +281 -24
  420. package/src/services/index.ts +34 -3
  421. package/src/services/language.ts +412 -0
  422. package/src/services/mcp.ts +3 -1
  423. package/src/services/media.ts +14 -6
  424. package/src/services/navigation.ts +429 -67
  425. package/src/services/path.ts +225 -7
  426. package/src/services/post.ts +1318 -252
  427. package/src/services/search.ts +48 -2
  428. package/src/services/settings.ts +238 -43
  429. package/src/services/site-admin.ts +24 -7
  430. package/src/services/site.ts +77 -1
  431. package/src/services/smart-collection.ts +636 -0
  432. package/src/services/telegram.ts +20 -22
  433. package/src/services/upload-session.ts +1 -3
  434. package/src/style-author.css +27 -0
  435. package/src/styles/components-author.css +1622 -0
  436. package/src/styles/components.css +24 -1585
  437. package/src/styles/site-media.css +20 -6
  438. package/src/styles/tokens.css +144 -13
  439. package/src/styles/ui-author.css +7602 -0
  440. package/src/styles/ui.css +1224 -7276
  441. package/src/types/app-context.ts +7 -0
  442. package/src/types/bindings.ts +3 -0
  443. package/src/types/config.ts +94 -15
  444. package/src/types/constants.ts +188 -16
  445. package/src/types/entities.ts +92 -1
  446. package/src/types/operations.ts +64 -2
  447. package/src/types/props.ts +168 -30
  448. package/src/types/views.ts +61 -1
  449. package/src/ui/__tests__/font-themes.test.ts +52 -12
  450. package/src/ui/compose/ComposeDialog.tsx +215 -21
  451. package/src/ui/compose/ComposePrompt.tsx +1 -5
  452. package/src/ui/compose/__tests__/ComposeDialog.test.tsx +125 -0
  453. package/src/ui/dash/appearance/AdvancedContent.tsx +2 -2
  454. package/src/ui/dash/appearance/CodeInjectionContent.tsx +12 -16
  455. package/src/ui/dash/appearance/NavigationContent.tsx +117 -16
  456. package/src/ui/dash/appearance/__tests__/NavigationContent.test.tsx +33 -11
  457. package/src/ui/dash/appearance/__tests__/system-nav-descriptions.test.ts +44 -0
  458. package/src/ui/dash/appearance/system-nav-descriptions.ts +75 -0
  459. package/src/ui/dash/settings/AccountMenuContent.tsx +2 -2
  460. package/src/ui/dash/settings/ApiTokensContent.tsx +2 -1
  461. package/src/ui/dash/settings/ConfigEditorContent.tsx +35 -16
  462. package/src/ui/dash/settings/GeneralContent.tsx +275 -113
  463. package/src/ui/dash/settings/LanguageContent.tsx +409 -0
  464. package/src/ui/dash/settings/SettingsRootContent.tsx +19 -1
  465. package/src/ui/dash/settings/__tests__/GeneralContent.test.tsx +324 -4
  466. package/src/ui/dash/settings/__tests__/LanguageContent.test.tsx +144 -0
  467. package/src/ui/dash/settings/__tests__/discover-copy.test.ts +66 -0
  468. package/src/ui/dash/settings/discover-copy.ts +116 -0
  469. package/src/ui/feed/LinkCard.tsx +55 -45
  470. package/src/ui/feed/LinkPreview.tsx +2 -7
  471. package/src/ui/feed/NoteCard.tsx +9 -4
  472. package/src/ui/feed/PostStatusBadges.tsx +103 -17
  473. package/src/ui/feed/QuoteCard.tsx +55 -30
  474. package/src/ui/feed/ThreadPreview.tsx +6 -2
  475. package/src/ui/feed/__tests__/thread-preview.test.ts +13 -16
  476. package/src/ui/feed/__tests__/timeline-cards.test.ts +314 -49
  477. package/src/ui/feed/thread-preview-state.ts +20 -6
  478. package/src/ui/font-themes.ts +39 -29
  479. package/src/ui/layouts/BaseLayout.tsx +155 -10
  480. package/src/ui/layouts/SiteLayout.tsx +192 -34
  481. package/src/ui/layouts/__tests__/BaseLayout.test.tsx +196 -17
  482. package/src/ui/layouts/__tests__/SiteLayout.test.tsx +109 -85
  483. package/src/ui/pages/ArchivePage.tsx +401 -301
  484. package/src/ui/pages/CollectionPage.tsx +86 -76
  485. package/src/ui/pages/CollectionsPage.tsx +5 -0
  486. package/src/ui/pages/ComposePage.tsx +8 -0
  487. package/src/ui/pages/PostPage.tsx +47 -0
  488. package/src/ui/pages/SearchPage.tsx +3 -3
  489. package/src/ui/pages/SmartCollectionPage.tsx +434 -0
  490. package/src/ui/pages/SubscribePage.tsx +236 -0
  491. package/src/ui/pages/__tests__/ArchivePage.test.tsx +122 -3
  492. package/src/ui/pages/__tests__/collections-directory-rows.test.tsx +92 -0
  493. package/src/ui/pages/__tests__/collections-view-links.test.tsx +81 -0
  494. package/src/ui/shared/CollectionDirectory.tsx +178 -3
  495. package/src/ui/shared/CollectionsManager.tsx +70 -17
  496. package/src/ui/shared/CopyField.tsx +127 -0
  497. package/src/ui/shared/DraftPreviewBar.tsx +25 -9
  498. package/src/ui/shared/EmptyPostContent.tsx +23 -0
  499. package/src/ui/shared/MediaGallery.tsx +125 -46
  500. package/src/ui/shared/Pagination.tsx +20 -5
  501. package/src/ui/shared/PostFooter.tsx +55 -23
  502. package/src/ui/shared/__tests__/archive-labels.test.ts +100 -0
  503. package/src/ui/shared/__tests__/media-gallery.test.ts +210 -2
  504. package/src/ui/shared/__tests__/navigation-labels.test.ts +16 -22
  505. package/src/ui/shared/__tests__/pagination.test.ts +38 -24
  506. package/src/ui/shared/__tests__/post-footer.test.ts +32 -0
  507. package/src/ui/shared/archive-labels.ts +98 -0
  508. package/src/ui/shared/collection-management-labels.ts +94 -16
  509. package/src/ui/shared/custom-icons.ts +5 -0
  510. package/src/ui/shared/navigation-labels.ts +45 -71
  511. package/src/ui/shared/post-article-attributes.ts +8 -0
  512. package/src/ui/shared/smart-collection-labels.ts +343 -0
  513. package/dist/app-BxCOR3Uc.js +0 -6
  514. package/dist/client/_assets/chunks/heic-to-DUUaO23q.js +0 -1
  515. package/dist/client/_assets/chunks/module-DcsAZQZ_.js +0 -716
  516. package/dist/client/_assets/chunks/url-pLre2DM_.js +0 -1
  517. package/dist/client/_assets/client-B_eGKN5p.css +0 -2
  518. package/dist/client/_assets/client-DxY5BFe8.js +0 -296
  519. package/dist/client/_assets/client-auth-CakPESv9.js +0 -5533
  520. package/dist/env-OHRKGcMj.js +0 -281
  521. package/dist/github-api-BgSiE71w.js +0 -176
  522. package/dist/github-app-BbklkFmU.js +0 -275
  523. package/dist/github-sync-Cq1pzzOI.js +0 -431
  524. package/dist/github-sync-ppWXN3jb.js +0 -4
  525. package/dist/url-BMYO-Zlt.js +0 -395
  526. package/src/client/__tests__/collection-created-notice.test.ts +0 -36
  527. package/src/client/__tests__/collection-form-bridge.test.ts +0 -216
  528. package/src/client/__tests__/post-form-bridge.test.ts +0 -82
  529. package/src/client/collection-created-notice.ts +0 -66
  530. package/src/client/collection-form-bridge.ts +0 -191
  531. package/src/client/components/__tests__/jant-post-form.test.ts +0 -193
  532. package/src/client/components/jant-post-form.ts +0 -422
  533. package/src/client/components/post-form-template.ts +0 -352
  534. package/src/client/components/post-form-types.ts +0 -96
  535. package/src/client/media-metadata.ts +0 -247
  536. package/src/client/post-form-bridge.ts +0 -193
  537. package/src/ui/pages/CollectionEditorPage.tsx +0 -175
@@ -1,281 +0,0 @@
1
- import { b as __exportAll, l as normalizeSitePathPrefix, t as buildSiteUrl } from "./url-BMYO-Zlt.js";
2
- //#region src/lib/display-text.ts
3
- /**
4
- * Normalize a user-visible text value.
5
- *
6
- * Trims surrounding whitespace and collapses empty or visually empty results
7
- * to `undefined` so callers can distinguish missing display copy from
8
- * intentionally present text.
9
- *
10
- * @param value - Candidate display text
11
- * @returns Trimmed text, or `undefined` when empty
12
- * @example
13
- * ```ts
14
- * normalizeDisplayText(" Hosted account ");
15
- * // Returns: "Hosted account"
16
- * ```
17
- */ var VISUALLY_EMPTY_FORMATTING_CHARS = /\u200B|\u200C|\u200D|\u2060|\uFEFF/g;
18
- function normalizeDisplayText(value) {
19
- const normalized = value?.trim();
20
- if (!normalized) return;
21
- return normalized.replace(VISUALLY_EMPTY_FORMATTING_CHARS, "") ? normalized : void 0;
22
- }
23
- /**
24
- * Return the first non-empty display text from a list of candidates.
25
- *
26
- * Useful when UI copy needs a stable fallback chain such as configured label →
27
- * hostname → generic translated label.
28
- *
29
- * @param values - Candidate display text values in priority order
30
- * @returns The first trimmed non-empty candidate, or `undefined`
31
- * @example
32
- * ```ts
33
- * coalesceDisplayText(" ", undefined, "Hosted account");
34
- * // Returns: "Hosted account"
35
- * ```
36
- */ function coalesceDisplayText(...values) {
37
- for (const value of values) {
38
- const normalized = normalizeDisplayText(value);
39
- if (normalized) return normalized;
40
- }
41
- }
42
- //#endregion
43
- //#region src/lib/env.ts
44
- var env_exports = /* @__PURE__ */ __exportAll({
45
- DEFAULT_APP_PORT: () => DEFAULT_APP_PORT,
46
- getAuthSecret: () => getAuthSecret,
47
- getConfiguredSingleSiteOrigin: () => getConfiguredSingleSiteOrigin,
48
- getConfiguredSingleSitePathPrefix: () => getConfiguredSingleSitePathPrefix,
49
- getConfiguredSingleSiteUrl: () => getConfiguredSingleSiteUrl,
50
- getConfiguredStorageDriver: () => getConfiguredStorageDriver,
51
- getCorsOrigins: () => getCorsOrigins,
52
- getDataDir: () => getDataDir,
53
- getDefaultStorageDriver: () => getDefaultStorageDriver,
54
- getDevApiToken: () => getDevApiToken,
55
- getEnvString: () => getEnvString,
56
- getGitHubAppConfig: () => getGitHubAppConfig,
57
- getHostedControlPlaneBaseUrl: () => getHostedControlPlaneBaseUrl,
58
- getHostedControlPlaneDomainCheckSecret: () => getHostedControlPlaneDomainCheckSecret,
59
- getHostedControlPlaneInternalBaseUrl: () => getHostedControlPlaneInternalBaseUrl,
60
- getHostedControlPlaneInternalToken: () => getHostedControlPlaneInternalToken,
61
- getHostedControlPlaneProviderLabel: () => getHostedControlPlaneProviderLabel,
62
- getHostedControlPlaneProviderName: () => getHostedControlPlaneProviderName,
63
- getHostedControlPlaneSsoSecret: () => getHostedControlPlaneSsoSecret,
64
- getInternalAdminToken: () => getInternalAdminToken,
65
- getLocalStoragePath: () => getLocalStoragePath,
66
- getPort: () => getPort,
67
- getSiteOrigin: () => getSiteOrigin,
68
- getSitePathPrefix: () => getSitePathPrefix,
69
- getSiteResolutionMode: () => getSiteResolutionMode,
70
- getSiteUrl: () => getSiteUrl,
71
- getStorageDriverEnv: () => getStorageDriverEnv,
72
- getTelegramBotPool: () => getTelegramBotPool,
73
- getTelegramWebhookSecret: () => getTelegramWebhookSecret,
74
- parsePortValue: () => parsePortValue,
75
- shouldTrustProxy: () => shouldTrustProxy,
76
- shouldUseSecureCookies: () => shouldUseSecureCookies
77
- });
78
- var DEFAULT_APP_PORT = 3e3;
79
- function toEnvRecord(env) {
80
- return env ?? {};
81
- }
82
- function normalizeEnvScalar(value) {
83
- if (typeof value === "string") return value.length > 0 ? value : void 0;
84
- if (typeof value === "number") return Number.isFinite(value) ? String(value) : void 0;
85
- if (typeof value === "boolean") return value ? "true" : "false";
86
- }
87
- /**
88
- * Returns the first non-empty environment variable value from `keys`.
89
- *
90
- * Callers may provide multiple keys when a single semantic value can be
91
- * sourced from more than one binding at runtime.
92
- */ function getEnvString(env, ...keys) {
93
- const record = toEnvRecord(env);
94
- for (const key of keys) {
95
- const value = normalizeEnvScalar(record[key]);
96
- if (value) return value;
97
- }
98
- }
99
- /**
100
- * Parse a TCP port from an environment value.
101
- *
102
- * @param rawPort - Raw environment value to parse
103
- * @param fallback - Port to use when `rawPort` is empty
104
- * @returns The parsed port number
105
- * @example
106
- * parsePortValue("3000");
107
- */ function parsePortValue(rawPort, fallback = DEFAULT_APP_PORT) {
108
- if (!rawPort) return fallback;
109
- const port = Number.parseInt(rawPort, 10);
110
- if (!Number.isInteger(port) || port < 1 || port > 65535) throw new Error("PORT must be an integer between 1 and 65535.");
111
- return port;
112
- }
113
- /**
114
- * Resolve the configured application port from environment bindings.
115
- *
116
- * @param env - Runtime environment bindings
117
- * @param fallback - Port to use when `PORT` is not set
118
- * @returns The resolved application port
119
- * @example
120
- * getPort({ PORT: "3000" });
121
- */ function getPort(env, fallback = DEFAULT_APP_PORT) {
122
- return parsePortValue(getEnvString(env, "PORT"), fallback);
123
- }
124
- function getSiteOrigin(env) {
125
- const configuredOrigin = getEnvString(env, "SITE_ORIGIN");
126
- return configuredOrigin ? new URL(configuredOrigin).origin : "";
127
- }
128
- function getSitePathPrefix(env) {
129
- const configuredPrefix = getEnvString(env, "SITE_PATH_PREFIX");
130
- return configuredPrefix ? normalizeSitePathPrefix(configuredPrefix) : "";
131
- }
132
- function getSiteUrl(env) {
133
- return buildSiteUrl(getSiteOrigin(env), getSitePathPrefix(env));
134
- }
135
- function getConfiguredSingleSiteOrigin(env) {
136
- return getSiteResolutionMode(env) === "single-site" ? getSiteOrigin(env) : "";
137
- }
138
- function getConfiguredSingleSitePathPrefix(env) {
139
- return getSiteResolutionMode(env) === "single-site" ? getSitePathPrefix(env) : "";
140
- }
141
- /**
142
- * Returns the configured public site URL only when the instance runs in
143
- * `single-site` mode.
144
- *
145
- * @param env - Runtime environment bindings
146
- * @returns The configured `SITE_ORIGIN` + `SITE_PATH_PREFIX`, or an empty
147
- * string in `host-based` mode
148
- * @example
149
- * getConfiguredSingleSiteUrl({ SITE_ORIGIN: "https://example.com" });
150
- */ function getConfiguredSingleSiteUrl(env) {
151
- return getSiteResolutionMode(env) === "single-site" ? getSiteUrl(env) : "";
152
- }
153
- function getSiteResolutionMode(env) {
154
- return getEnvString(env, "SITE_RESOLUTION_MODE") === "host-based" ? "host-based" : "single-site";
155
- }
156
- function getAuthSecret(env) {
157
- return getEnvString(env, "AUTH_SECRET");
158
- }
159
- function getDevApiToken(env) {
160
- return getEnvString(env, "DEV_API_TOKEN");
161
- }
162
- function getInternalAdminToken(env) {
163
- return getEnvString(env, "INTERNAL_ADMIN_TOKEN");
164
- }
165
- function getHostedControlPlaneBaseUrl(env) {
166
- return getEnvString(env, "HOSTED_CONTROL_PLANE_BASE_URL");
167
- }
168
- function getHostedControlPlaneDomainCheckSecret(env) {
169
- return getEnvString(env, "HOSTED_CONTROL_PLANE_DOMAIN_CHECK_SECRET");
170
- }
171
- function getHostedControlPlaneInternalBaseUrl(env) {
172
- return getEnvString(env, "HOSTED_CONTROL_PLANE_INTERNAL_BASE_URL") ?? getHostedControlPlaneBaseUrl(env);
173
- }
174
- function getHostedControlPlaneProviderName(env) {
175
- return getEnvString(env, "HOSTED_CONTROL_PLANE_PROVIDER_NAME");
176
- }
177
- function getHostedControlPlaneProviderLabel(env) {
178
- const configuredName = normalizeDisplayText(getHostedControlPlaneProviderName(env));
179
- if (configuredName) return configuredName;
180
- const hostedControlPlaneBaseUrl = getHostedControlPlaneBaseUrl(env);
181
- if (!hostedControlPlaneBaseUrl) return;
182
- return new URL(hostedControlPlaneBaseUrl).hostname;
183
- }
184
- function getHostedControlPlaneSsoSecret(env) {
185
- return getEnvString(env, "HOSTED_CONTROL_PLANE_SSO_SECRET");
186
- }
187
- function getHostedControlPlaneInternalToken(env) {
188
- return getEnvString(env, "HOSTED_CONTROL_PLANE_INTERNAL_TOKEN");
189
- }
190
- function getStorageDriverEnv(env) {
191
- return getEnvString(env, "STORAGE_DRIVER");
192
- }
193
- function getDataDir(env) {
194
- return getEnvString(env, "DATA_DIR");
195
- }
196
- function joinDataSubpath(dataDir, child) {
197
- return `${dataDir.replace(/[\\/]+$/, "")}/${child}`;
198
- }
199
- function getLocalStoragePath(env) {
200
- const explicit = getEnvString(env, "LOCAL_STORAGE_PATH");
201
- if (explicit) return explicit;
202
- const dataDir = getDataDir(env);
203
- return dataDir ? joinDataSubpath(dataDir, "media") : void 0;
204
- }
205
- function getDefaultStorageDriver(env) {
206
- const record = toEnvRecord(env);
207
- return record["NODE_SQLITE"] || record["NODE_DATABASE"] ? "local" : "r2";
208
- }
209
- function getConfiguredStorageDriver(env) {
210
- return getStorageDriverEnv(env) ?? getDefaultStorageDriver(env);
211
- }
212
- /**
213
- * Returns the parsed CORS origins configuration.
214
- *
215
- * @param env - Runtime environment bindings
216
- * @returns `"*"` to allow all origins, an array of allowed origin strings,
217
- * or `undefined` when CORS is disabled
218
- *
219
- * @example
220
- * ```ts
221
- * getCorsOrigins({ CORS_ORIGINS: "*" }); // "*"
222
- * getCorsOrigins({ CORS_ORIGINS: "https://a.com,chrome-extension://id" });
223
- * // ["https://a.com", "chrome-extension://id"]
224
- * getCorsOrigins({}); // "*"
225
- * ```
226
- */ function getCorsOrigins(env) {
227
- const raw = getEnvString(env, "CORS_ORIGINS") ?? "*";
228
- if (!raw) return;
229
- if (raw === "*") return "*";
230
- const origins = raw.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
231
- return origins.length > 0 ? origins : void 0;
232
- }
233
- function getGitHubAppConfig(env) {
234
- const appId = getEnvString(env, "GITHUB_APP_ID");
235
- const rawKey = getEnvString(env, "GITHUB_APP_PRIVATE_KEY");
236
- const slug = getEnvString(env, "GITHUB_APP_SLUG");
237
- if (!appId || !rawKey || !slug) return null;
238
- return {
239
- appId,
240
- privateKey: rawKey.includes("\\n") ? rawKey.replace(/\\n/g, "\n") : rawKey,
241
- slug,
242
- webhookSecret: getEnvString(env, "GITHUB_APP_WEBHOOK_SECRET")
243
- };
244
- }
245
- function shouldTrustProxy(env) {
246
- return getEnvString(env, "TRUST_PROXY") === "true";
247
- }
248
- /**
249
- * Parses the platform-managed Telegram bot pool from `TELEGRAM_BOT_TOKENS`.
250
- *
251
- * The env value is a comma-separated list of `<bot_id>:<secret>` tokens. The
252
- * first entry is the public-facing bot (`bot1`); the rest are surfaced only
253
- * contextually when a binding code reaches an already-bound bot slot.
254
- *
255
- * @param env - Runtime environment bindings
256
- * @returns Parsed pool bots in declared order; empty when unset/invalid
257
- * @example
258
- * getTelegramBotPool({ TELEGRAM_BOT_TOKENS: "111:aaa,222:bbb" });
259
- */ function getTelegramBotPool(env) {
260
- const raw = getEnvString(env, "TELEGRAM_BOT_TOKENS");
261
- if (!raw) return [];
262
- return raw.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0).map((token) => {
263
- return {
264
- botId: token.split(":")[0]?.trim() ?? "",
265
- token
266
- };
267
- }).filter((bot) => bot.botId.length > 0);
268
- }
269
- /**
270
- * Returns the shared `secret_token` used when registering every pool bot's
271
- * webhook. Only meaningful alongside `TELEGRAM_BOT_TOKENS`.
272
- */ function getTelegramWebhookSecret(env) {
273
- return getEnvString(env, "TELEGRAM_WEBHOOK_SECRET");
274
- }
275
- function shouldUseSecureCookies(env, publicRequestUrl) {
276
- const siteOrigin = getConfiguredSingleSiteOrigin(env);
277
- if (siteOrigin) return new URL(siteOrigin).protocol === "https:";
278
- return new URL(publicRequestUrl).protocol === "https:";
279
- }
280
- //#endregion
281
- export { shouldTrustProxy as C, getTelegramWebhookSecret as S, coalesceDisplayText as T, getInternalAdminToken as _, getConfiguredSingleSiteUrl as a, getSiteResolutionMode as b, getDevApiToken as c, getHostedControlPlaneBaseUrl as d, getHostedControlPlaneDomainCheckSecret as f, getHostedControlPlaneSsoSecret as g, getHostedControlPlaneProviderLabel as h, getConfiguredSingleSitePathPrefix as i, getEnvString as l, getHostedControlPlaneInternalToken as m, getAuthSecret as n, getConfiguredStorageDriver as o, getHostedControlPlaneInternalBaseUrl as p, getConfiguredSingleSiteOrigin as r, getCorsOrigins as s, env_exports as t, getGitHubAppConfig as u, getLocalStoragePath as v, shouldUseSecureCookies as w, getTelegramBotPool as x, getPort as y };
@@ -1,176 +0,0 @@
1
- import { b as __exportAll } from "./url-BMYO-Zlt.js";
2
- //#region src/lib/github-api.ts
3
- var github_api_exports = /* @__PURE__ */ __exportAll({
4
- GitHubApiError: () => GitHubApiError,
5
- createGitHubClient: () => createGitHubClient,
6
- parseRepoSlug: () => parseRepoSlug
7
- });
8
- /**
9
- * GitHub REST API client for content sync.
10
- *
11
- * Pure fetch-based — no npm dependencies. Works in both Cloudflare Workers
12
- * and Node 18+.
13
- */ var API_BASE = "https://api.github.com";
14
- var COMMON_HEADERS = {
15
- Accept: "application/vnd.github+json",
16
- "X-GitHub-Api-Version": "2022-11-28",
17
- "User-Agent": "jant-github-sync"
18
- };
19
- var GitHubApiError = class extends Error {
20
- status;
21
- body;
22
- url;
23
- constructor(status, body, url) {
24
- super(`GitHub API ${status}: ${body} (${url})`), this.status = status, this.body = body, this.url = url;
25
- this.name = "GitHubApiError";
26
- }
27
- };
28
- /**
29
- * Create a GitHub API client.
30
- *
31
- * Accepts either a static token (PAT) or a provider function that returns a
32
- * fresh token on each request (used for short-lived GitHub App installation
33
- * tokens which need to be refreshed before expiry — the provider handles
34
- * caching internally).
35
- */ function createGitHubClient(auth) {
36
- const getToken = typeof auth === "string" ? async () => auth : auth;
37
- async function request(method, path, body) {
38
- const url = `${API_BASE}${path}`;
39
- const token = await getToken();
40
- const res = await fetch(url, {
41
- method,
42
- headers: {
43
- ...COMMON_HEADERS,
44
- Authorization: `Bearer ${token}`,
45
- ...body !== void 0 ? { "Content-Type": "application/json" } : {}
46
- },
47
- body: body !== void 0 ? JSON.stringify(body) : void 0
48
- });
49
- if (!res.ok) {
50
- const text = await res.text();
51
- throw new GitHubApiError(res.status, text, url);
52
- }
53
- if (res.status === 204) return void 0;
54
- return await res.json();
55
- }
56
- async function requestOrNull(method, path) {
57
- const url = `${API_BASE}${path}`;
58
- const token = await getToken();
59
- const res = await fetch(url, {
60
- method,
61
- headers: {
62
- ...COMMON_HEADERS,
63
- Authorization: `Bearer ${token}`
64
- }
65
- });
66
- if (res.status === 404) return null;
67
- if (!res.ok) {
68
- const text = await res.text();
69
- throw new GitHubApiError(res.status, text, url);
70
- }
71
- return await res.json();
72
- }
73
- return {
74
- async getRepo(owner, repo) {
75
- return request("GET", `/repos/${owner}/${repo}`);
76
- },
77
- async getRef(owner, repo, ref) {
78
- return { sha: (await request("GET", `/repos/${owner}/${repo}/git/ref/${ref}`)).object.sha };
79
- },
80
- async getCommit(owner, repo, sha) {
81
- const data = await request("GET", `/repos/${owner}/${repo}/git/commits/${sha}`);
82
- return {
83
- sha: data.sha,
84
- treeSha: data.tree.sha
85
- };
86
- },
87
- async updateRef(owner, repo, ref, sha) {
88
- await request("PATCH", `/repos/${owner}/${repo}/git/refs/${ref}`, {
89
- sha,
90
- force: false
91
- });
92
- },
93
- async createRef(owner, repo, ref, sha) {
94
- await request("POST", `/repos/${owner}/${repo}/git/refs`, {
95
- ref: `refs/${ref}`,
96
- sha
97
- });
98
- },
99
- async getFileContent(owner, repo, path, ref) {
100
- return requestOrNull("GET", `/repos/${owner}/${repo}/contents/${path}${ref ? `?ref=${encodeURIComponent(ref)}` : ""}`);
101
- },
102
- async createOrUpdateFile(owner, repo, path, opts) {
103
- const body = {
104
- message: opts.message,
105
- content: btoa(unescape(encodeURIComponent(opts.content)))
106
- };
107
- if (opts.sha) body.sha = opts.sha;
108
- if (opts.branch) body.branch = opts.branch;
109
- return { sha: (await request("PUT", `/repos/${owner}/${repo}/contents/${path}`, body)).content.sha };
110
- },
111
- async deleteFile(owner, repo, path, opts) {
112
- await request("DELETE", `/repos/${owner}/${repo}/contents/${path}`, {
113
- message: opts.message,
114
- sha: opts.sha,
115
- ...opts.branch ? { branch: opts.branch } : {}
116
- });
117
- },
118
- async createBlob(owner, repo, content, encoding) {
119
- return request("POST", `/repos/${owner}/${repo}/git/blobs`, {
120
- content,
121
- encoding
122
- });
123
- },
124
- async createTree(owner, repo, items, baseTree) {
125
- return request("POST", `/repos/${owner}/${repo}/git/trees`, {
126
- tree: items,
127
- ...baseTree ? { base_tree: baseTree } : {}
128
- });
129
- },
130
- async getTree(owner, repo, sha, opts) {
131
- return request("GET", `/repos/${owner}/${repo}/git/trees/${sha}${opts?.recursive ? "?recursive=1" : ""}`);
132
- },
133
- async createCommit(owner, repo, opts) {
134
- return request("POST", `/repos/${owner}/${repo}/git/commits`, {
135
- message: opts.message,
136
- tree: opts.tree,
137
- parents: opts.parents
138
- });
139
- },
140
- async createWebhook(owner, repo, opts) {
141
- return request("POST", `/repos/${owner}/${repo}/hooks`, {
142
- name: "web",
143
- active: true,
144
- events: opts.events,
145
- config: {
146
- url: opts.url,
147
- secret: opts.secret,
148
- content_type: "json",
149
- insecure_ssl: "0"
150
- }
151
- });
152
- },
153
- async listWebhooks(owner, repo) {
154
- return request("GET", `/repos/${owner}/${repo}/hooks`);
155
- },
156
- async deleteWebhook(owner, repo, hookId) {
157
- await request("DELETE", `/repos/${owner}/${repo}/hooks/${hookId}`);
158
- }
159
- };
160
- }
161
- /**
162
- * Parse an `owner/repo` string into its parts.
163
- *
164
- * @returns `{ owner, repo }` or `null` if the format is invalid.
165
- */ function parseRepoSlug(slug) {
166
- const match = /^([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.-]+)$/.exec(slug.trim());
167
- if (!match) return null;
168
- const [, owner, repo] = match;
169
- if (!owner || !repo) return null;
170
- return {
171
- owner,
172
- repo
173
- };
174
- }
175
- //#endregion
176
- export { github_api_exports as n, parseRepoSlug as r, createGitHubClient as t };