@jant/core 0.6.16 → 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 (508) hide show
  1. package/README.md +11 -11
  2. package/bin/commands/assets/upload.js +192 -15
  3. package/bin/commands/import-site.js +60 -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-C7_4oab9.js → app-K_Aa1MMn.js} +52476 -13330
  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-Dl5KCiEs.js → github-sync-BPAvT999.js} +2254 -107
  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__/stylesheet-audience.test.ts +159 -0
  51. package/src/__tests__/stylesheet-breakpoints.test.ts +183 -0
  52. package/src/app.tsx +71 -16
  53. package/src/auth.ts +18 -1
  54. package/src/client/__tests__/collection-page-actions.test.ts +51 -2
  55. package/src/client/__tests__/compose-bridge-image-upload.test.ts +196 -0
  56. package/src/client/__tests__/compose-bridge-video-poster.test.ts +159 -0
  57. package/src/client/__tests__/compose-bridge.test.ts +272 -0
  58. package/src/client/__tests__/compose-launch.test.ts +62 -1
  59. package/src/client/__tests__/compose-shortcuts.test.ts +38 -9
  60. package/src/client/__tests__/compose-triggers.test.ts +90 -0
  61. package/src/client/__tests__/copy-field.test.ts +162 -0
  62. package/src/client/__tests__/custom-url-menu.test.ts +127 -6
  63. package/src/client/__tests__/image-processor.test.ts +324 -2
  64. package/src/client/__tests__/lazy-entries.test.ts +92 -0
  65. package/src/client/__tests__/media-scroll-hint.test.ts +155 -0
  66. package/src/client/__tests__/runtime-paths.test.ts +84 -0
  67. package/src/client/__tests__/smart-collection-page-actions.test.ts +158 -0
  68. package/src/client/__tests__/toast.test.ts +23 -0
  69. package/src/client/__tests__/video-processor-probe.test.ts +175 -0
  70. package/src/client/__tests__/video-processor.test.ts +181 -0
  71. package/src/client/audio-processor.ts +24 -15
  72. package/src/client/audio-waveform.ts +49 -0
  73. package/src/client/collection-dialog-host.ts +72 -0
  74. package/src/client/collection-navigation.ts +51 -16
  75. package/src/client/collection-page-actions.ts +26 -0
  76. package/src/client/components/__tests__/jant-collection-dialog.test.ts +329 -0
  77. package/src/client/components/__tests__/jant-collection-directory.test.ts +274 -10
  78. package/src/client/components/__tests__/jant-collection-form.test.ts +59 -178
  79. package/src/client/components/__tests__/jant-command-palette.test.ts +28 -0
  80. package/src/client/components/__tests__/jant-compose-dialog-draft-storage.test.ts +340 -0
  81. package/src/client/components/__tests__/jant-compose-dialog.test.ts +1250 -53
  82. package/src/client/components/__tests__/jant-compose-editor.test.ts +544 -40
  83. package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +0 -1
  84. package/src/client/components/__tests__/jant-locale-picker.test.ts +207 -0
  85. package/src/client/components/__tests__/jant-nav-manager.test.ts +234 -15
  86. package/src/client/components/__tests__/jant-post-menu.test.ts +413 -2
  87. package/src/client/components/__tests__/jant-post-picker.test.ts +197 -0
  88. package/src/client/components/__tests__/jant-settings-avatar.test.ts +15 -12
  89. package/src/client/components/__tests__/jant-settings-general.test.ts +541 -172
  90. package/src/client/components/__tests__/jant-settings-language.test.ts +851 -0
  91. package/src/client/components/__tests__/jant-smart-collection-dialog.test.ts +665 -0
  92. package/src/client/components/collection-dialog-types.ts +49 -0
  93. package/src/client/components/collection-manager-types.ts +32 -1
  94. package/src/client/components/collection-types.ts +1 -15
  95. package/src/client/components/compose-types.ts +75 -1
  96. package/src/client/components/jant-collection-dialog.ts +722 -0
  97. package/src/client/components/jant-collection-directory.ts +567 -182
  98. package/src/client/components/jant-collection-form.ts +53 -232
  99. package/src/client/components/jant-command-palette.ts +100 -49
  100. package/src/client/components/jant-compose-dialog.ts +1486 -707
  101. package/src/client/components/jant-compose-editor.ts +673 -336
  102. package/src/client/components/jant-compose-fullscreen.ts +51 -43
  103. package/src/client/components/jant-config-editor.ts +65 -53
  104. package/src/client/components/jant-confirm-dialog.ts +13 -11
  105. package/src/client/components/jant-locale-picker.ts +418 -0
  106. package/src/client/components/jant-media-lightbox.ts +146 -136
  107. package/src/client/components/jant-nav-manager.ts +690 -366
  108. package/src/client/components/jant-post-menu.ts +1086 -282
  109. package/src/client/components/jant-post-picker.ts +324 -0
  110. package/src/client/components/jant-repo-picker.ts +138 -106
  111. package/src/client/components/jant-settings-avatar.ts +31 -27
  112. package/src/client/components/jant-settings-general.ts +617 -543
  113. package/src/client/components/jant-settings-language.ts +1087 -0
  114. package/src/client/components/jant-smart-collection-dialog.ts +1021 -0
  115. package/src/client/components/jant-text-preview.ts +94 -86
  116. package/src/client/components/nav-manager-types.ts +62 -1
  117. package/src/client/components/settings-types.ts +14 -29
  118. package/src/client/components/smart-collection-conditions.ts +285 -0
  119. package/src/client/components/smart-collection-dialog-types.ts +68 -0
  120. package/src/client/compose-bridge.ts +214 -141
  121. package/src/client/compose-launch.ts +76 -2
  122. package/src/client/compose-shortcuts.ts +6 -8
  123. package/src/client/compose-triggers.ts +50 -0
  124. package/src/client/copy-field.ts +108 -0
  125. package/src/client/custom-url-menu.ts +60 -4
  126. package/src/client/icons.ts +14 -0
  127. package/src/client/image-plan.ts +165 -0
  128. package/src/client/image-processor.ts +195 -117
  129. package/src/client/image-worker-client.ts +45 -0
  130. package/src/client/image-worker.ts +135 -0
  131. package/src/client/lazy-entries.ts +95 -0
  132. package/src/client/lazy-slugify.ts +2 -2
  133. package/src/client/media-scroll-hint.ts +43 -2
  134. package/src/client/mediabunny.ts +29 -0
  135. package/src/client/post-picker.ts +41 -0
  136. package/src/client/runtime-paths.ts +74 -1
  137. package/src/client/settings-bridge.ts +4 -10
  138. package/src/client/site-header-nav.js +18 -6
  139. package/src/client/smart-collection-dialog-host.ts +116 -0
  140. package/src/client/smart-collection-page-actions.ts +208 -0
  141. package/src/client/tiptap/__tests__/bubble-menu.test.ts +110 -0
  142. package/src/client/tiptap/__tests__/floating-position.test.ts +136 -1
  143. package/src/client/tiptap/__tests__/inline-image-upload.test.ts +37 -0
  144. package/src/client/tiptap/bubble-menu.ts +47 -16
  145. package/src/client/tiptap/floating-position.ts +216 -2
  146. package/src/client/tiptap/inline-image-upload.ts +7 -3
  147. package/src/client/tiptap/link-toolbar.ts +22 -9
  148. package/src/client/toast.ts +13 -0
  149. package/src/client/types/vite-worker.d.ts +12 -0
  150. package/src/client/upload-with-metadata.ts +3 -13
  151. package/src/client/video-processor.ts +351 -107
  152. package/src/client-auth.ts +14 -31
  153. package/src/client-compose.ts +19 -0
  154. package/src/client-manage.ts +13 -0
  155. package/src/client-settings.ts +14 -0
  156. package/src/client-site.ts +10 -3
  157. package/src/client.ts +4 -0
  158. package/src/db/__tests__/backfill-nav-label-mirrors.test.ts +149 -0
  159. package/src/db/__tests__/schema-enum-sources.test.ts +33 -0
  160. package/src/db/__tests__/smart-collection-placement.test.ts +402 -0
  161. package/src/db/backfills/0006_clear_mirrored_page_nav_labels.sql +31 -0
  162. package/src/db/migrations/0032_married_tomas.sql +3 -0
  163. package/src/db/migrations/0033_busy_johnny_storm.sql +198 -0
  164. package/src/db/migrations/0034_cheerful_rumiko_fujikawa.sql +35 -0
  165. package/src/db/migrations/meta/0032_snapshot.json +2582 -0
  166. package/src/db/migrations/meta/0033_snapshot.json +2816 -0
  167. package/src/db/migrations/meta/0034_snapshot.json +2816 -0
  168. package/src/db/migrations/meta/_journal.json +21 -0
  169. package/src/db/migrations/pg/0030_abandoned_nighthawk.sql +3 -0
  170. package/src/db/migrations/pg/0031_strong_ultimatum.sql +128 -0
  171. package/src/db/migrations/pg/0032_furry_multiple_man.sql +6 -0
  172. package/src/db/migrations/pg/meta/0030_snapshot.json +3329 -0
  173. package/src/db/migrations/pg/meta/0031_snapshot.json +3660 -0
  174. package/src/db/migrations/pg/meta/0032_snapshot.json +3660 -0
  175. package/src/db/migrations/pg/meta/_journal.json +21 -0
  176. package/src/db/pg/schema.ts +195 -27
  177. package/src/db/post-visibility.ts +117 -0
  178. package/src/db/schema.ts +222 -27
  179. package/src/i18n/__tests__/detect.test.ts +26 -81
  180. package/src/i18n/__tests__/supported-locales.test.ts +83 -0
  181. package/src/i18n/context.tsx +12 -2
  182. package/src/i18n/detect.ts +7 -66
  183. package/src/i18n/locales/glossary.zh-Hans.yml +44 -4
  184. package/src/i18n/locales/glossary.zh-Hant.yml +44 -4
  185. package/src/i18n/locales/public/en.po +490 -158
  186. package/src/i18n/locales/public/en.ts +1 -1
  187. package/src/i18n/locales/public/zh-Hans.po +487 -155
  188. package/src/i18n/locales/public/zh-Hans.ts +1 -1
  189. package/src/i18n/locales/public/zh-Hant.po +487 -155
  190. package/src/i18n/locales/public/zh-Hant.ts +1 -1
  191. package/src/i18n/locales/settings/en.po +551 -69
  192. package/src/i18n/locales/settings/en.ts +1 -1
  193. package/src/i18n/locales/settings/zh-Hans.po +597 -115
  194. package/src/i18n/locales/settings/zh-Hans.ts +1 -1
  195. package/src/i18n/locales/settings/zh-Hant.po +610 -128
  196. package/src/i18n/locales/settings/zh-Hant.ts +1 -1
  197. package/src/i18n/locales.ts +94 -0
  198. package/src/i18n/middleware.ts +12 -2
  199. package/src/i18n/supported-locales.ts +80 -0
  200. package/src/lib/__tests__/api-settings.test.ts +11 -2
  201. package/src/lib/__tests__/asset-path.test.ts +92 -0
  202. package/src/lib/__tests__/deferred.test.ts +90 -0
  203. package/src/lib/__tests__/discover-ping.test.ts +89 -0
  204. package/src/lib/__tests__/discover.test.ts +410 -0
  205. package/src/lib/__tests__/feed-policy.test.ts +26 -0
  206. package/src/lib/__tests__/feed.test.ts +1526 -15
  207. package/src/lib/__tests__/filter-dimensions.test.ts +341 -0
  208. package/src/lib/__tests__/hosted-signin.test.ts +1 -1
  209. package/src/lib/__tests__/http-cache.test.ts +162 -0
  210. package/src/lib/__tests__/jant-docs-dev.test.ts +21 -0
  211. package/src/lib/__tests__/jant-docs.test.ts +23 -0
  212. package/src/lib/__tests__/lang-detect.test.ts +231 -0
  213. package/src/lib/__tests__/media-helpers.test.ts +81 -0
  214. package/src/lib/__tests__/navigation.test.ts +135 -1
  215. package/src/lib/__tests__/resolve-config.test.ts +64 -3
  216. package/src/lib/__tests__/schemas.test.ts +42 -4
  217. package/src/lib/__tests__/site-unavailable-page.test.ts +25 -0
  218. package/src/lib/__tests__/slug.test.ts +70 -0
  219. package/src/lib/__tests__/slugify.test.ts +85 -0
  220. package/src/lib/__tests__/storage.test.ts +32 -0
  221. package/src/lib/__tests__/thread-fold.test.ts +113 -0
  222. package/src/lib/__tests__/upload-sideload.test.ts +14 -0
  223. package/src/lib/__tests__/url-fetch.test.ts +1 -2
  224. package/src/lib/__tests__/url.test.ts +78 -72
  225. package/src/lib/__tests__/view-language.test.ts +413 -0
  226. package/src/lib/__tests__/worker-response-cache.test.ts +90 -0
  227. package/src/lib/address.ts +57 -0
  228. package/src/lib/api-posts.ts +12 -0
  229. package/src/lib/asset-path.ts +98 -1
  230. package/src/lib/build-env.ts +16 -0
  231. package/src/lib/collection-groups.ts +5 -1
  232. package/src/lib/collection-paths.ts +3 -10
  233. package/src/lib/constants.ts +28 -3
  234. package/src/lib/copy-field.ts +36 -0
  235. package/src/lib/crypto.ts +40 -0
  236. package/src/lib/csp-builder.ts +2 -1
  237. package/src/lib/deferred.ts +79 -0
  238. package/src/lib/discover-ping.ts +141 -0
  239. package/src/lib/discover.ts +437 -0
  240. package/src/lib/env.ts +134 -0
  241. package/src/lib/errors.ts +33 -0
  242. package/src/lib/feed-policy.ts +236 -2
  243. package/src/lib/feed.ts +926 -73
  244. package/src/lib/filter-dimensions.ts +1349 -0
  245. package/src/lib/github-sync-site-config.ts +3 -0
  246. package/src/lib/hosted-signin.ts +1 -1
  247. package/src/lib/http-cache.ts +148 -0
  248. package/src/lib/hugo-markdown.ts +16 -0
  249. package/src/lib/icons.ts +9 -2
  250. package/src/lib/ids.ts +3 -0
  251. package/src/lib/jant-docs.ts +42 -0
  252. package/src/lib/lang-detect.ts +308 -0
  253. package/src/lib/media-helpers.ts +13 -1
  254. package/src/lib/navigation.ts +78 -11
  255. package/src/lib/pagination.ts +28 -24
  256. package/src/lib/per-language-surfaces.ts +67 -0
  257. package/src/lib/post-meta.ts +19 -0
  258. package/src/lib/render.tsx +55 -7
  259. package/src/lib/resolve-config.ts +53 -5
  260. package/src/lib/schemas.ts +201 -10
  261. package/src/lib/site-header-fragment.tsx +2 -1
  262. package/src/lib/site-unavailable-page.ts +47 -0
  263. package/src/lib/slug.ts +51 -7
  264. package/src/lib/slugify.ts +113 -0
  265. package/src/lib/startup-config.ts +4 -6
  266. package/src/lib/storage.ts +7 -0
  267. package/src/lib/summary.ts +50 -0
  268. package/src/lib/thread-fold.ts +161 -0
  269. package/src/lib/time.ts +32 -0
  270. package/src/lib/timeline.ts +42 -1
  271. package/src/lib/tiptap-render.ts +1 -2
  272. package/src/lib/upload.ts +16 -13
  273. package/src/lib/url.ts +139 -86
  274. package/src/lib/version.ts +10 -8
  275. package/src/lib/view-language.ts +436 -0
  276. package/src/lib/view.ts +51 -23
  277. package/src/lib/viewer-context.ts +62 -0
  278. package/src/middleware/__tests__/auth.test.ts +70 -2
  279. package/src/middleware/__tests__/cache-control.test.ts +71 -3
  280. package/src/middleware/__tests__/onboarding.test.ts +76 -5
  281. package/src/middleware/__tests__/secure-headers.test.ts +1 -1
  282. package/src/middleware/__tests__/session.test.ts +181 -33
  283. package/src/middleware/auth.ts +50 -31
  284. package/src/middleware/cache-control.ts +75 -10
  285. package/src/middleware/config.ts +6 -6
  286. package/src/middleware/error-handler.ts +12 -0
  287. package/src/middleware/onboarding.ts +32 -10
  288. package/src/middleware/secure-headers.ts +1 -1
  289. package/src/middleware/session.ts +96 -8
  290. package/src/node/__tests__/cli-migrate.test.ts +21 -19
  291. package/src/node/__tests__/cli-reset-password.test.ts +81 -8
  292. package/src/node/__tests__/cli-runtime-target.test.ts +48 -1
  293. package/src/node/__tests__/cli-site-selection.test.ts +128 -38
  294. package/src/node/__tests__/runtime.test.ts +37 -0
  295. package/src/node/index.ts +1 -0
  296. package/src/preset.css +76 -22
  297. package/src/routes/__tests__/feed-validator.test.ts +156 -0
  298. package/src/routes/api/__tests__/collections.test.ts +114 -0
  299. package/src/routes/api/__tests__/discover.test.ts +222 -0
  300. package/src/routes/api/__tests__/nav-items.test.ts +212 -2
  301. package/src/routes/api/__tests__/post-translations.test.ts +829 -0
  302. package/src/routes/api/__tests__/settings.test.ts +24 -3
  303. package/src/routes/api/__tests__/telegram.test.ts +6 -5
  304. package/src/routes/api/collections.ts +49 -6
  305. package/src/routes/api/custom-urls.ts +0 -1
  306. package/src/routes/api/discover.ts +95 -0
  307. package/src/routes/api/export.ts +3 -0
  308. package/src/routes/api/internal/__tests__/sites.test.ts +42 -2
  309. package/src/routes/api/nav-items.ts +55 -8
  310. package/src/routes/api/posts.ts +159 -0
  311. package/src/routes/api/public/__tests__/archive.test.ts +111 -0
  312. package/src/routes/api/public/archive.ts +77 -81
  313. package/src/routes/api/public/posts.ts +23 -6
  314. package/src/routes/api/smart-collections.ts +132 -0
  315. package/src/routes/api/telegram.ts +2 -40
  316. package/src/routes/api/uploads.ts +1 -2
  317. package/src/routes/auth/__tests__/setup-auth.test.ts +137 -0
  318. package/src/routes/auth/__tests__/setup-discover.test.ts +204 -0
  319. package/src/routes/auth/__tests__/setup-flow.test.ts +270 -0
  320. package/src/routes/auth/__tests__/setup-page.test.tsx +329 -0
  321. package/src/routes/auth/__tests__/setup-steps.test.ts +310 -0
  322. package/src/routes/auth/__tests__/setup.test.ts +278 -26
  323. package/src/routes/auth/__tests__/signin.test.ts +135 -0
  324. package/src/routes/auth/setup.tsx +934 -186
  325. package/src/routes/auth/signin.tsx +10 -8
  326. package/src/routes/compose.tsx +5 -0
  327. package/src/routes/dash/__tests__/custom-urls-archive.test.ts +44 -0
  328. package/src/routes/dash/__tests__/custom-urls-page.test.ts +49 -0
  329. package/src/routes/dash/__tests__/delete-account.test.ts +106 -0
  330. package/src/routes/dash/__tests__/settings-discover.test.ts +213 -0
  331. package/src/routes/dash/custom-urls.tsx +1 -37
  332. package/src/routes/dash/settings.tsx +502 -41
  333. package/src/routes/discover-announce.ts +96 -0
  334. package/src/routes/feed/__tests__/feed.test.ts +165 -2
  335. package/src/routes/feed/feed.ts +69 -40
  336. package/src/routes/feed/sitemap.ts +95 -11
  337. package/src/routes/pages/__tests__/archive-indexing.test.ts +200 -0
  338. package/src/routes/pages/__tests__/archive-params.test.ts +370 -6
  339. package/src/routes/pages/__tests__/collection-routing.test.ts +16 -0
  340. package/src/routes/pages/__tests__/collections-feed-links.test.ts +72 -0
  341. package/src/routes/pages/__tests__/collections.test.ts +9 -3
  342. package/src/routes/pages/__tests__/custom-archive-url.test.ts +119 -0
  343. package/src/routes/pages/__tests__/feed-autodiscovery.test.ts +148 -0
  344. package/src/routes/pages/__tests__/language-routing.test.ts +679 -0
  345. package/src/routes/pages/__tests__/post-preview-partial.test.ts +96 -0
  346. package/src/routes/pages/__tests__/smart-collection.test.ts +298 -0
  347. package/src/routes/pages/__tests__/subscribe.test.ts +248 -0
  348. package/src/routes/pages/archive.tsx +471 -369
  349. package/src/routes/pages/collection.tsx +94 -96
  350. package/src/routes/pages/collections.tsx +38 -50
  351. package/src/routes/pages/featured.tsx +32 -13
  352. package/src/routes/pages/home.tsx +25 -6
  353. package/src/routes/pages/language.tsx +113 -0
  354. package/src/routes/pages/latest.tsx +26 -16
  355. package/src/routes/pages/new.tsx +3 -0
  356. package/src/routes/pages/page.tsx +178 -17
  357. package/src/routes/pages/partials.tsx +41 -0
  358. package/src/routes/pages/search.tsx +18 -3
  359. package/src/routes/pages/smart-collection.tsx +340 -0
  360. package/src/routes/pages/subscribe.tsx +182 -0
  361. package/src/runtime/__tests__/index.test.ts +19 -0
  362. package/src/runtime/__tests__/node.test.ts +129 -4
  363. package/src/runtime/cloudflare.ts +21 -2
  364. package/src/runtime/index.ts +27 -1
  365. package/src/runtime/node.ts +18 -1
  366. package/src/runtime/site.ts +95 -24
  367. package/src/services/__tests__/auth.test.ts +116 -7
  368. package/src/services/__tests__/collection.test.ts +108 -4
  369. package/src/services/__tests__/language.test.ts +495 -0
  370. package/src/services/__tests__/navigation.test.ts +213 -10
  371. package/src/services/__tests__/path.test.ts +180 -0
  372. package/src/services/__tests__/post-language.test.ts +830 -0
  373. package/src/services/__tests__/post.test.ts +46 -9
  374. package/src/services/__tests__/settings.test.ts +228 -17
  375. package/src/services/__tests__/site-admin.test.ts +5 -5
  376. package/src/services/__tests__/smart-collection.test.ts +651 -0
  377. package/src/services/about-page.ts +22 -1
  378. package/src/services/auth.ts +51 -49
  379. package/src/services/bootstrap.ts +188 -38
  380. package/src/services/collection-directory-position.ts +76 -0
  381. package/src/services/collection.ts +331 -46
  382. package/src/services/custom-url.ts +27 -22
  383. package/src/services/export-theme/assets/client-site.css +1 -1
  384. package/src/services/export-theme/assets/client-site.js +123 -123
  385. package/src/services/export-theme/layouts/_default/rss.xml +77 -1
  386. package/src/services/export-theme/layouts/partials/feed-post-content.xml +105 -2
  387. package/src/services/export-theme/layouts/partials/media-gallery.html +35 -21
  388. package/src/services/export-theme/layouts/partials/pagination.html +14 -13
  389. package/src/services/export-theme/layouts/partials/post-card.html +8 -4
  390. package/src/services/export-theme/layouts/partials/reply.html +2 -1
  391. package/src/services/export-theme/layouts/partials/thread-preview.html +40 -30
  392. package/src/services/export-theme/styles/main.css +13 -1
  393. package/src/services/export.ts +278 -19
  394. package/src/services/index.ts +34 -3
  395. package/src/services/language.ts +412 -0
  396. package/src/services/mcp.ts +3 -1
  397. package/src/services/media.ts +14 -6
  398. package/src/services/navigation.ts +429 -67
  399. package/src/services/path.ts +221 -6
  400. package/src/services/post.ts +1021 -152
  401. package/src/services/search.ts +39 -2
  402. package/src/services/settings.ts +238 -43
  403. package/src/services/site-admin.ts +24 -7
  404. package/src/services/site.ts +77 -1
  405. package/src/services/smart-collection.ts +636 -0
  406. package/src/services/telegram.ts +20 -22
  407. package/src/services/upload-session.ts +1 -3
  408. package/src/style-author.css +27 -0
  409. package/src/styles/components-author.css +1622 -0
  410. package/src/styles/components.css +24 -1571
  411. package/src/styles/site-media.css +16 -2
  412. package/src/styles/tokens.css +82 -12
  413. package/src/styles/ui-author.css +7602 -0
  414. package/src/styles/ui.css +1087 -7219
  415. package/src/types/app-context.ts +7 -0
  416. package/src/types/bindings.ts +3 -0
  417. package/src/types/config.ts +94 -15
  418. package/src/types/constants.ts +188 -16
  419. package/src/types/entities.ts +87 -1
  420. package/src/types/operations.ts +64 -2
  421. package/src/types/props.ts +157 -31
  422. package/src/types/views.ts +55 -1
  423. package/src/ui/__tests__/font-themes.test.ts +52 -12
  424. package/src/ui/compose/ComposeDialog.tsx +201 -7
  425. package/src/ui/compose/ComposePrompt.tsx +1 -5
  426. package/src/ui/compose/__tests__/ComposeDialog.test.tsx +125 -0
  427. package/src/ui/dash/appearance/AdvancedContent.tsx +2 -2
  428. package/src/ui/dash/appearance/CodeInjectionContent.tsx +12 -16
  429. package/src/ui/dash/appearance/NavigationContent.tsx +117 -16
  430. package/src/ui/dash/appearance/__tests__/NavigationContent.test.tsx +33 -11
  431. package/src/ui/dash/appearance/__tests__/system-nav-descriptions.test.ts +44 -0
  432. package/src/ui/dash/appearance/system-nav-descriptions.ts +75 -0
  433. package/src/ui/dash/settings/AccountMenuContent.tsx +2 -2
  434. package/src/ui/dash/settings/ApiTokensContent.tsx +2 -1
  435. package/src/ui/dash/settings/ConfigEditorContent.tsx +35 -16
  436. package/src/ui/dash/settings/GeneralContent.tsx +275 -113
  437. package/src/ui/dash/settings/LanguageContent.tsx +409 -0
  438. package/src/ui/dash/settings/SettingsRootContent.tsx +19 -1
  439. package/src/ui/dash/settings/__tests__/GeneralContent.test.tsx +324 -4
  440. package/src/ui/dash/settings/__tests__/LanguageContent.test.tsx +144 -0
  441. package/src/ui/dash/settings/__tests__/discover-copy.test.ts +66 -0
  442. package/src/ui/dash/settings/discover-copy.ts +116 -0
  443. package/src/ui/feed/LinkCard.tsx +55 -45
  444. package/src/ui/feed/NoteCard.tsx +9 -4
  445. package/src/ui/feed/PostStatusBadges.tsx +90 -43
  446. package/src/ui/feed/QuoteCard.tsx +55 -30
  447. package/src/ui/feed/ThreadPreview.tsx +6 -2
  448. package/src/ui/feed/__tests__/thread-preview.test.ts +13 -16
  449. package/src/ui/feed/__tests__/timeline-cards.test.ts +314 -49
  450. package/src/ui/feed/thread-preview-state.ts +20 -6
  451. package/src/ui/font-themes.ts +39 -29
  452. package/src/ui/layouts/BaseLayout.tsx +155 -10
  453. package/src/ui/layouts/SiteLayout.tsx +192 -34
  454. package/src/ui/layouts/__tests__/BaseLayout.test.tsx +196 -17
  455. package/src/ui/layouts/__tests__/SiteLayout.test.tsx +109 -85
  456. package/src/ui/pages/ArchivePage.tsx +282 -289
  457. package/src/ui/pages/CollectionPage.tsx +86 -76
  458. package/src/ui/pages/CollectionsPage.tsx +5 -0
  459. package/src/ui/pages/ComposePage.tsx +8 -0
  460. package/src/ui/pages/PostPage.tsx +47 -0
  461. package/src/ui/pages/SearchPage.tsx +3 -3
  462. package/src/ui/pages/SmartCollectionPage.tsx +434 -0
  463. package/src/ui/pages/SubscribePage.tsx +236 -0
  464. package/src/ui/pages/__tests__/ArchivePage.test.tsx +65 -9
  465. package/src/ui/pages/__tests__/collections-directory-rows.test.tsx +92 -0
  466. package/src/ui/pages/__tests__/collections-view-links.test.tsx +81 -0
  467. package/src/ui/shared/CollectionDirectory.tsx +178 -3
  468. package/src/ui/shared/CollectionsManager.tsx +70 -17
  469. package/src/ui/shared/CopyField.tsx +127 -0
  470. package/src/ui/shared/EmptyPostContent.tsx +23 -0
  471. package/src/ui/shared/MediaGallery.tsx +125 -46
  472. package/src/ui/shared/Pagination.tsx +20 -5
  473. package/src/ui/shared/PostFooter.tsx +20 -11
  474. package/src/ui/shared/__tests__/archive-labels.test.ts +100 -0
  475. package/src/ui/shared/__tests__/media-gallery.test.ts +210 -2
  476. package/src/ui/shared/__tests__/navigation-labels.test.ts +16 -22
  477. package/src/ui/shared/__tests__/pagination.test.ts +38 -24
  478. package/src/ui/shared/__tests__/post-footer.test.ts +32 -0
  479. package/src/ui/shared/archive-labels.ts +98 -0
  480. package/src/ui/shared/collection-management-labels.ts +94 -16
  481. package/src/ui/shared/navigation-labels.ts +45 -71
  482. package/src/ui/shared/post-article-attributes.ts +2 -0
  483. package/src/ui/shared/smart-collection-labels.ts +343 -0
  484. package/dist/app-C75Zc8dD.js +0 -6
  485. package/dist/client/_assets/chunks/heic-to-DUUaO23q.js +0 -1
  486. package/dist/client/_assets/chunks/module-DcsAZQZ_.js +0 -716
  487. package/dist/client/_assets/chunks/url-CU9pEbk5.js +0 -1
  488. package/dist/client/_assets/client-Bq0vre8Y.js +0 -296
  489. package/dist/client/_assets/client-D3VZyG4L.css +0 -2
  490. package/dist/client/_assets/client-auth-F2rb9WfF.js +0 -5571
  491. package/dist/env-BPYViDJJ.js +0 -281
  492. package/dist/github-api-BNF35Lkx.js +0 -176
  493. package/dist/github-app-DdiD-bC4.js +0 -275
  494. package/dist/github-sync-Bqg62IvV.js +0 -4
  495. package/dist/github-sync-HdK2EgvJ.js +0 -431
  496. package/dist/url-CbLAtlZe.js +0 -900
  497. package/src/client/__tests__/collection-created-notice.test.ts +0 -36
  498. package/src/client/__tests__/collection-form-bridge.test.ts +0 -216
  499. package/src/client/__tests__/post-form-bridge.test.ts +0 -82
  500. package/src/client/collection-created-notice.ts +0 -66
  501. package/src/client/collection-form-bridge.ts +0 -191
  502. package/src/client/components/__tests__/jant-post-form.test.ts +0 -193
  503. package/src/client/components/jant-post-form.ts +0 -422
  504. package/src/client/components/post-form-template.ts +0 -352
  505. package/src/client/components/post-form-types.ts +0 -96
  506. package/src/client/media-metadata.ts +0 -247
  507. package/src/client/post-form-bridge.ts +0 -193
  508. package/src/ui/pages/CollectionEditorPage.tsx +0 -175
@@ -1,281 +0,0 @@
1
- import { l as normalizeSitePathPrefix, t as buildSiteUrl, x as __exportAll } from "./url-CbLAtlZe.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 { x as __exportAll } from "./url-CbLAtlZe.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 };