@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.
- package/README.md +11 -11
- package/bin/commands/assets/upload.js +192 -15
- package/bin/commands/import-site.js +60 -4
- package/bin/commands/reset-password.js +21 -8
- package/bin/commands/site/snapshot/export.js +1 -1
- package/bin/commands/site/snapshot/import.js +1 -1
- package/bin/lib/d1-query.js +5 -16
- package/bin/lib/node-env.js +40 -4
- package/bin/lib/site-selection.js +85 -29
- package/bin/lib/wrangler-cli.js +28 -2
- package/bin/lib/wrangler-json.js +35 -0
- package/dist/{app-C7_4oab9.js → app-K_Aa1MMn.js} +52476 -13330
- package/dist/client/.vite/manifest.json +255 -90
- package/dist/client/_assets/chunks/confirm-D7GrwsCN.js +45 -0
- package/dist/client/_assets/chunks/create-editor-CD3FhrOB.js +257 -0
- package/dist/client/_assets/chunks/{native-DpcrFAPh.js → emoji-mart-C4RpRKcU.js} +716 -1
- package/dist/client/_assets/chunks/footnote-rail-CmeoVtnU.js +1 -0
- package/dist/client/_assets/chunks/heic-to-CuP2Qlsw.js +1 -0
- package/dist/client/_assets/chunks/jant-locale-picker-DL6mIOT5.js +69 -0
- package/dist/client/_assets/chunks/lit-DW8VmJAT.js +2 -0
- package/dist/client/_assets/chunks/mediabunny-DRaCQ1r-.js +31 -0
- package/dist/client/_assets/chunks/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/client/_assets/chunks/settings-paths-BcdySNx6.js +84 -0
- package/dist/client/_assets/chunks/site-header-nav-DzXsFk05.js +1 -0
- package/dist/client/_assets/chunks/slug-format-CRXO1AL5.js +1 -0
- package/dist/client/_assets/chunks/slugify-373citbs.js +1 -0
- package/dist/client/_assets/chunks/sortable-list-CgaL2jCs.js +2 -0
- package/dist/client/_assets/chunks/types-D5iF3H1a.js +1 -0
- package/dist/client/_assets/chunks/unsafe-html-B5ZEXaxg.js +1 -0
- package/dist/client/_assets/chunks/unsafe-svg-0QCkP0vZ.js +2 -0
- package/dist/client/_assets/client-GiYENVw8.css +2 -0
- package/dist/client/_assets/client-VnFxJN7G.js +295 -0
- package/dist/client/_assets/client-auth-k8gJ6QJj.js +828 -0
- package/dist/client/_assets/client-author-DQ8R-8KR.css +2 -0
- package/dist/client/_assets/client-compose-B_kDtWkW.js +2004 -0
- package/dist/client/_assets/client-manage-M90aSTOk.js +2170 -0
- package/dist/client/_assets/client-settings-DfYs9n1F.js +1112 -0
- package/dist/{export-Dl5KCiEs.js → github-sync-BPAvT999.js} +2254 -107
- package/dist/index.js +2 -5
- package/dist/node.js +5 -7
- package/package.json +3 -3
- package/src/__tests__/auth-session-freshness.test.ts +57 -0
- package/src/__tests__/basecoat-variants.test.ts +121 -0
- package/src/__tests__/bin/assets-upload.test.ts +68 -0
- package/src/__tests__/export-hugo-build.test.ts +260 -0
- package/src/__tests__/export-service.test.ts +231 -0
- package/src/__tests__/helpers/component-css.ts +91 -0
- package/src/__tests__/helpers/db.ts +33 -0
- package/src/__tests__/helpers/export-fixtures.ts +3 -0
- package/src/__tests__/stylesheet-audience.test.ts +159 -0
- package/src/__tests__/stylesheet-breakpoints.test.ts +183 -0
- package/src/app.tsx +71 -16
- package/src/auth.ts +18 -1
- package/src/client/__tests__/collection-page-actions.test.ts +51 -2
- package/src/client/__tests__/compose-bridge-image-upload.test.ts +196 -0
- package/src/client/__tests__/compose-bridge-video-poster.test.ts +159 -0
- package/src/client/__tests__/compose-bridge.test.ts +272 -0
- package/src/client/__tests__/compose-launch.test.ts +62 -1
- package/src/client/__tests__/compose-shortcuts.test.ts +38 -9
- package/src/client/__tests__/compose-triggers.test.ts +90 -0
- package/src/client/__tests__/copy-field.test.ts +162 -0
- package/src/client/__tests__/custom-url-menu.test.ts +127 -6
- package/src/client/__tests__/image-processor.test.ts +324 -2
- package/src/client/__tests__/lazy-entries.test.ts +92 -0
- package/src/client/__tests__/media-scroll-hint.test.ts +155 -0
- package/src/client/__tests__/runtime-paths.test.ts +84 -0
- package/src/client/__tests__/smart-collection-page-actions.test.ts +158 -0
- package/src/client/__tests__/toast.test.ts +23 -0
- package/src/client/__tests__/video-processor-probe.test.ts +175 -0
- package/src/client/__tests__/video-processor.test.ts +181 -0
- package/src/client/audio-processor.ts +24 -15
- package/src/client/audio-waveform.ts +49 -0
- package/src/client/collection-dialog-host.ts +72 -0
- package/src/client/collection-navigation.ts +51 -16
- package/src/client/collection-page-actions.ts +26 -0
- package/src/client/components/__tests__/jant-collection-dialog.test.ts +329 -0
- package/src/client/components/__tests__/jant-collection-directory.test.ts +274 -10
- package/src/client/components/__tests__/jant-collection-form.test.ts +59 -178
- package/src/client/components/__tests__/jant-command-palette.test.ts +28 -0
- package/src/client/components/__tests__/jant-compose-dialog-draft-storage.test.ts +340 -0
- package/src/client/components/__tests__/jant-compose-dialog.test.ts +1250 -53
- package/src/client/components/__tests__/jant-compose-editor.test.ts +544 -40
- package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +0 -1
- package/src/client/components/__tests__/jant-locale-picker.test.ts +207 -0
- package/src/client/components/__tests__/jant-nav-manager.test.ts +234 -15
- package/src/client/components/__tests__/jant-post-menu.test.ts +413 -2
- package/src/client/components/__tests__/jant-post-picker.test.ts +197 -0
- package/src/client/components/__tests__/jant-settings-avatar.test.ts +15 -12
- package/src/client/components/__tests__/jant-settings-general.test.ts +541 -172
- package/src/client/components/__tests__/jant-settings-language.test.ts +851 -0
- package/src/client/components/__tests__/jant-smart-collection-dialog.test.ts +665 -0
- package/src/client/components/collection-dialog-types.ts +49 -0
- package/src/client/components/collection-manager-types.ts +32 -1
- package/src/client/components/collection-types.ts +1 -15
- package/src/client/components/compose-types.ts +75 -1
- package/src/client/components/jant-collection-dialog.ts +722 -0
- package/src/client/components/jant-collection-directory.ts +567 -182
- package/src/client/components/jant-collection-form.ts +53 -232
- package/src/client/components/jant-command-palette.ts +100 -49
- package/src/client/components/jant-compose-dialog.ts +1486 -707
- package/src/client/components/jant-compose-editor.ts +673 -336
- package/src/client/components/jant-compose-fullscreen.ts +51 -43
- package/src/client/components/jant-config-editor.ts +65 -53
- package/src/client/components/jant-confirm-dialog.ts +13 -11
- package/src/client/components/jant-locale-picker.ts +418 -0
- package/src/client/components/jant-media-lightbox.ts +146 -136
- package/src/client/components/jant-nav-manager.ts +690 -366
- package/src/client/components/jant-post-menu.ts +1086 -282
- package/src/client/components/jant-post-picker.ts +324 -0
- package/src/client/components/jant-repo-picker.ts +138 -106
- package/src/client/components/jant-settings-avatar.ts +31 -27
- package/src/client/components/jant-settings-general.ts +617 -543
- package/src/client/components/jant-settings-language.ts +1087 -0
- package/src/client/components/jant-smart-collection-dialog.ts +1021 -0
- package/src/client/components/jant-text-preview.ts +94 -86
- package/src/client/components/nav-manager-types.ts +62 -1
- package/src/client/components/settings-types.ts +14 -29
- package/src/client/components/smart-collection-conditions.ts +285 -0
- package/src/client/components/smart-collection-dialog-types.ts +68 -0
- package/src/client/compose-bridge.ts +214 -141
- package/src/client/compose-launch.ts +76 -2
- package/src/client/compose-shortcuts.ts +6 -8
- package/src/client/compose-triggers.ts +50 -0
- package/src/client/copy-field.ts +108 -0
- package/src/client/custom-url-menu.ts +60 -4
- package/src/client/icons.ts +14 -0
- package/src/client/image-plan.ts +165 -0
- package/src/client/image-processor.ts +195 -117
- package/src/client/image-worker-client.ts +45 -0
- package/src/client/image-worker.ts +135 -0
- package/src/client/lazy-entries.ts +95 -0
- package/src/client/lazy-slugify.ts +2 -2
- package/src/client/media-scroll-hint.ts +43 -2
- package/src/client/mediabunny.ts +29 -0
- package/src/client/post-picker.ts +41 -0
- package/src/client/runtime-paths.ts +74 -1
- package/src/client/settings-bridge.ts +4 -10
- package/src/client/site-header-nav.js +18 -6
- package/src/client/smart-collection-dialog-host.ts +116 -0
- package/src/client/smart-collection-page-actions.ts +208 -0
- package/src/client/tiptap/__tests__/bubble-menu.test.ts +110 -0
- package/src/client/tiptap/__tests__/floating-position.test.ts +136 -1
- package/src/client/tiptap/__tests__/inline-image-upload.test.ts +37 -0
- package/src/client/tiptap/bubble-menu.ts +47 -16
- package/src/client/tiptap/floating-position.ts +216 -2
- package/src/client/tiptap/inline-image-upload.ts +7 -3
- package/src/client/tiptap/link-toolbar.ts +22 -9
- package/src/client/toast.ts +13 -0
- package/src/client/types/vite-worker.d.ts +12 -0
- package/src/client/upload-with-metadata.ts +3 -13
- package/src/client/video-processor.ts +351 -107
- package/src/client-auth.ts +14 -31
- package/src/client-compose.ts +19 -0
- package/src/client-manage.ts +13 -0
- package/src/client-settings.ts +14 -0
- package/src/client-site.ts +10 -3
- package/src/client.ts +4 -0
- package/src/db/__tests__/backfill-nav-label-mirrors.test.ts +149 -0
- package/src/db/__tests__/schema-enum-sources.test.ts +33 -0
- package/src/db/__tests__/smart-collection-placement.test.ts +402 -0
- package/src/db/backfills/0006_clear_mirrored_page_nav_labels.sql +31 -0
- package/src/db/migrations/0032_married_tomas.sql +3 -0
- package/src/db/migrations/0033_busy_johnny_storm.sql +198 -0
- package/src/db/migrations/0034_cheerful_rumiko_fujikawa.sql +35 -0
- package/src/db/migrations/meta/0032_snapshot.json +2582 -0
- package/src/db/migrations/meta/0033_snapshot.json +2816 -0
- package/src/db/migrations/meta/0034_snapshot.json +2816 -0
- package/src/db/migrations/meta/_journal.json +21 -0
- package/src/db/migrations/pg/0030_abandoned_nighthawk.sql +3 -0
- package/src/db/migrations/pg/0031_strong_ultimatum.sql +128 -0
- package/src/db/migrations/pg/0032_furry_multiple_man.sql +6 -0
- package/src/db/migrations/pg/meta/0030_snapshot.json +3329 -0
- package/src/db/migrations/pg/meta/0031_snapshot.json +3660 -0
- package/src/db/migrations/pg/meta/0032_snapshot.json +3660 -0
- package/src/db/migrations/pg/meta/_journal.json +21 -0
- package/src/db/pg/schema.ts +195 -27
- package/src/db/post-visibility.ts +117 -0
- package/src/db/schema.ts +222 -27
- package/src/i18n/__tests__/detect.test.ts +26 -81
- package/src/i18n/__tests__/supported-locales.test.ts +83 -0
- package/src/i18n/context.tsx +12 -2
- package/src/i18n/detect.ts +7 -66
- package/src/i18n/locales/glossary.zh-Hans.yml +44 -4
- package/src/i18n/locales/glossary.zh-Hant.yml +44 -4
- package/src/i18n/locales/public/en.po +490 -158
- package/src/i18n/locales/public/en.ts +1 -1
- package/src/i18n/locales/public/zh-Hans.po +487 -155
- package/src/i18n/locales/public/zh-Hans.ts +1 -1
- package/src/i18n/locales/public/zh-Hant.po +487 -155
- package/src/i18n/locales/public/zh-Hant.ts +1 -1
- package/src/i18n/locales/settings/en.po +551 -69
- package/src/i18n/locales/settings/en.ts +1 -1
- package/src/i18n/locales/settings/zh-Hans.po +597 -115
- package/src/i18n/locales/settings/zh-Hans.ts +1 -1
- package/src/i18n/locales/settings/zh-Hant.po +610 -128
- package/src/i18n/locales/settings/zh-Hant.ts +1 -1
- package/src/i18n/locales.ts +94 -0
- package/src/i18n/middleware.ts +12 -2
- package/src/i18n/supported-locales.ts +80 -0
- package/src/lib/__tests__/api-settings.test.ts +11 -2
- package/src/lib/__tests__/asset-path.test.ts +92 -0
- package/src/lib/__tests__/deferred.test.ts +90 -0
- package/src/lib/__tests__/discover-ping.test.ts +89 -0
- package/src/lib/__tests__/discover.test.ts +410 -0
- package/src/lib/__tests__/feed-policy.test.ts +26 -0
- package/src/lib/__tests__/feed.test.ts +1526 -15
- package/src/lib/__tests__/filter-dimensions.test.ts +341 -0
- package/src/lib/__tests__/hosted-signin.test.ts +1 -1
- package/src/lib/__tests__/http-cache.test.ts +162 -0
- package/src/lib/__tests__/jant-docs-dev.test.ts +21 -0
- package/src/lib/__tests__/jant-docs.test.ts +23 -0
- package/src/lib/__tests__/lang-detect.test.ts +231 -0
- package/src/lib/__tests__/media-helpers.test.ts +81 -0
- package/src/lib/__tests__/navigation.test.ts +135 -1
- package/src/lib/__tests__/resolve-config.test.ts +64 -3
- package/src/lib/__tests__/schemas.test.ts +42 -4
- package/src/lib/__tests__/site-unavailable-page.test.ts +25 -0
- package/src/lib/__tests__/slug.test.ts +70 -0
- package/src/lib/__tests__/slugify.test.ts +85 -0
- package/src/lib/__tests__/storage.test.ts +32 -0
- package/src/lib/__tests__/thread-fold.test.ts +113 -0
- package/src/lib/__tests__/upload-sideload.test.ts +14 -0
- package/src/lib/__tests__/url-fetch.test.ts +1 -2
- package/src/lib/__tests__/url.test.ts +78 -72
- package/src/lib/__tests__/view-language.test.ts +413 -0
- package/src/lib/__tests__/worker-response-cache.test.ts +90 -0
- package/src/lib/address.ts +57 -0
- package/src/lib/api-posts.ts +12 -0
- package/src/lib/asset-path.ts +98 -1
- package/src/lib/build-env.ts +16 -0
- package/src/lib/collection-groups.ts +5 -1
- package/src/lib/collection-paths.ts +3 -10
- package/src/lib/constants.ts +28 -3
- package/src/lib/copy-field.ts +36 -0
- package/src/lib/crypto.ts +40 -0
- package/src/lib/csp-builder.ts +2 -1
- package/src/lib/deferred.ts +79 -0
- package/src/lib/discover-ping.ts +141 -0
- package/src/lib/discover.ts +437 -0
- package/src/lib/env.ts +134 -0
- package/src/lib/errors.ts +33 -0
- package/src/lib/feed-policy.ts +236 -2
- package/src/lib/feed.ts +926 -73
- package/src/lib/filter-dimensions.ts +1349 -0
- package/src/lib/github-sync-site-config.ts +3 -0
- package/src/lib/hosted-signin.ts +1 -1
- package/src/lib/http-cache.ts +148 -0
- package/src/lib/hugo-markdown.ts +16 -0
- package/src/lib/icons.ts +9 -2
- package/src/lib/ids.ts +3 -0
- package/src/lib/jant-docs.ts +42 -0
- package/src/lib/lang-detect.ts +308 -0
- package/src/lib/media-helpers.ts +13 -1
- package/src/lib/navigation.ts +78 -11
- package/src/lib/pagination.ts +28 -24
- package/src/lib/per-language-surfaces.ts +67 -0
- package/src/lib/post-meta.ts +19 -0
- package/src/lib/render.tsx +55 -7
- package/src/lib/resolve-config.ts +53 -5
- package/src/lib/schemas.ts +201 -10
- package/src/lib/site-header-fragment.tsx +2 -1
- package/src/lib/site-unavailable-page.ts +47 -0
- package/src/lib/slug.ts +51 -7
- package/src/lib/slugify.ts +113 -0
- package/src/lib/startup-config.ts +4 -6
- package/src/lib/storage.ts +7 -0
- package/src/lib/summary.ts +50 -0
- package/src/lib/thread-fold.ts +161 -0
- package/src/lib/time.ts +32 -0
- package/src/lib/timeline.ts +42 -1
- package/src/lib/tiptap-render.ts +1 -2
- package/src/lib/upload.ts +16 -13
- package/src/lib/url.ts +139 -86
- package/src/lib/version.ts +10 -8
- package/src/lib/view-language.ts +436 -0
- package/src/lib/view.ts +51 -23
- package/src/lib/viewer-context.ts +62 -0
- package/src/middleware/__tests__/auth.test.ts +70 -2
- package/src/middleware/__tests__/cache-control.test.ts +71 -3
- package/src/middleware/__tests__/onboarding.test.ts +76 -5
- package/src/middleware/__tests__/secure-headers.test.ts +1 -1
- package/src/middleware/__tests__/session.test.ts +181 -33
- package/src/middleware/auth.ts +50 -31
- package/src/middleware/cache-control.ts +75 -10
- package/src/middleware/config.ts +6 -6
- package/src/middleware/error-handler.ts +12 -0
- package/src/middleware/onboarding.ts +32 -10
- package/src/middleware/secure-headers.ts +1 -1
- package/src/middleware/session.ts +96 -8
- package/src/node/__tests__/cli-migrate.test.ts +21 -19
- package/src/node/__tests__/cli-reset-password.test.ts +81 -8
- package/src/node/__tests__/cli-runtime-target.test.ts +48 -1
- package/src/node/__tests__/cli-site-selection.test.ts +128 -38
- package/src/node/__tests__/runtime.test.ts +37 -0
- package/src/node/index.ts +1 -0
- package/src/preset.css +76 -22
- package/src/routes/__tests__/feed-validator.test.ts +156 -0
- package/src/routes/api/__tests__/collections.test.ts +114 -0
- package/src/routes/api/__tests__/discover.test.ts +222 -0
- package/src/routes/api/__tests__/nav-items.test.ts +212 -2
- package/src/routes/api/__tests__/post-translations.test.ts +829 -0
- package/src/routes/api/__tests__/settings.test.ts +24 -3
- package/src/routes/api/__tests__/telegram.test.ts +6 -5
- package/src/routes/api/collections.ts +49 -6
- package/src/routes/api/custom-urls.ts +0 -1
- package/src/routes/api/discover.ts +95 -0
- package/src/routes/api/export.ts +3 -0
- package/src/routes/api/internal/__tests__/sites.test.ts +42 -2
- package/src/routes/api/nav-items.ts +55 -8
- package/src/routes/api/posts.ts +159 -0
- package/src/routes/api/public/__tests__/archive.test.ts +111 -0
- package/src/routes/api/public/archive.ts +77 -81
- package/src/routes/api/public/posts.ts +23 -6
- package/src/routes/api/smart-collections.ts +132 -0
- package/src/routes/api/telegram.ts +2 -40
- package/src/routes/api/uploads.ts +1 -2
- package/src/routes/auth/__tests__/setup-auth.test.ts +137 -0
- package/src/routes/auth/__tests__/setup-discover.test.ts +204 -0
- package/src/routes/auth/__tests__/setup-flow.test.ts +270 -0
- package/src/routes/auth/__tests__/setup-page.test.tsx +329 -0
- package/src/routes/auth/__tests__/setup-steps.test.ts +310 -0
- package/src/routes/auth/__tests__/setup.test.ts +278 -26
- package/src/routes/auth/__tests__/signin.test.ts +135 -0
- package/src/routes/auth/setup.tsx +934 -186
- package/src/routes/auth/signin.tsx +10 -8
- package/src/routes/compose.tsx +5 -0
- package/src/routes/dash/__tests__/custom-urls-archive.test.ts +44 -0
- package/src/routes/dash/__tests__/custom-urls-page.test.ts +49 -0
- package/src/routes/dash/__tests__/delete-account.test.ts +106 -0
- package/src/routes/dash/__tests__/settings-discover.test.ts +213 -0
- package/src/routes/dash/custom-urls.tsx +1 -37
- package/src/routes/dash/settings.tsx +502 -41
- package/src/routes/discover-announce.ts +96 -0
- package/src/routes/feed/__tests__/feed.test.ts +165 -2
- package/src/routes/feed/feed.ts +69 -40
- package/src/routes/feed/sitemap.ts +95 -11
- package/src/routes/pages/__tests__/archive-indexing.test.ts +200 -0
- package/src/routes/pages/__tests__/archive-params.test.ts +370 -6
- package/src/routes/pages/__tests__/collection-routing.test.ts +16 -0
- package/src/routes/pages/__tests__/collections-feed-links.test.ts +72 -0
- package/src/routes/pages/__tests__/collections.test.ts +9 -3
- package/src/routes/pages/__tests__/custom-archive-url.test.ts +119 -0
- package/src/routes/pages/__tests__/feed-autodiscovery.test.ts +148 -0
- package/src/routes/pages/__tests__/language-routing.test.ts +679 -0
- package/src/routes/pages/__tests__/post-preview-partial.test.ts +96 -0
- package/src/routes/pages/__tests__/smart-collection.test.ts +298 -0
- package/src/routes/pages/__tests__/subscribe.test.ts +248 -0
- package/src/routes/pages/archive.tsx +471 -369
- package/src/routes/pages/collection.tsx +94 -96
- package/src/routes/pages/collections.tsx +38 -50
- package/src/routes/pages/featured.tsx +32 -13
- package/src/routes/pages/home.tsx +25 -6
- package/src/routes/pages/language.tsx +113 -0
- package/src/routes/pages/latest.tsx +26 -16
- package/src/routes/pages/new.tsx +3 -0
- package/src/routes/pages/page.tsx +178 -17
- package/src/routes/pages/partials.tsx +41 -0
- package/src/routes/pages/search.tsx +18 -3
- package/src/routes/pages/smart-collection.tsx +340 -0
- package/src/routes/pages/subscribe.tsx +182 -0
- package/src/runtime/__tests__/index.test.ts +19 -0
- package/src/runtime/__tests__/node.test.ts +129 -4
- package/src/runtime/cloudflare.ts +21 -2
- package/src/runtime/index.ts +27 -1
- package/src/runtime/node.ts +18 -1
- package/src/runtime/site.ts +95 -24
- package/src/services/__tests__/auth.test.ts +116 -7
- package/src/services/__tests__/collection.test.ts +108 -4
- package/src/services/__tests__/language.test.ts +495 -0
- package/src/services/__tests__/navigation.test.ts +213 -10
- package/src/services/__tests__/path.test.ts +180 -0
- package/src/services/__tests__/post-language.test.ts +830 -0
- package/src/services/__tests__/post.test.ts +46 -9
- package/src/services/__tests__/settings.test.ts +228 -17
- package/src/services/__tests__/site-admin.test.ts +5 -5
- package/src/services/__tests__/smart-collection.test.ts +651 -0
- package/src/services/about-page.ts +22 -1
- package/src/services/auth.ts +51 -49
- package/src/services/bootstrap.ts +188 -38
- package/src/services/collection-directory-position.ts +76 -0
- package/src/services/collection.ts +331 -46
- package/src/services/custom-url.ts +27 -22
- package/src/services/export-theme/assets/client-site.css +1 -1
- package/src/services/export-theme/assets/client-site.js +123 -123
- package/src/services/export-theme/layouts/_default/rss.xml +77 -1
- package/src/services/export-theme/layouts/partials/feed-post-content.xml +105 -2
- package/src/services/export-theme/layouts/partials/media-gallery.html +35 -21
- package/src/services/export-theme/layouts/partials/pagination.html +14 -13
- package/src/services/export-theme/layouts/partials/post-card.html +8 -4
- package/src/services/export-theme/layouts/partials/reply.html +2 -1
- package/src/services/export-theme/layouts/partials/thread-preview.html +40 -30
- package/src/services/export-theme/styles/main.css +13 -1
- package/src/services/export.ts +278 -19
- package/src/services/index.ts +34 -3
- package/src/services/language.ts +412 -0
- package/src/services/mcp.ts +3 -1
- package/src/services/media.ts +14 -6
- package/src/services/navigation.ts +429 -67
- package/src/services/path.ts +221 -6
- package/src/services/post.ts +1021 -152
- package/src/services/search.ts +39 -2
- package/src/services/settings.ts +238 -43
- package/src/services/site-admin.ts +24 -7
- package/src/services/site.ts +77 -1
- package/src/services/smart-collection.ts +636 -0
- package/src/services/telegram.ts +20 -22
- package/src/services/upload-session.ts +1 -3
- package/src/style-author.css +27 -0
- package/src/styles/components-author.css +1622 -0
- package/src/styles/components.css +24 -1571
- package/src/styles/site-media.css +16 -2
- package/src/styles/tokens.css +82 -12
- package/src/styles/ui-author.css +7602 -0
- package/src/styles/ui.css +1087 -7219
- package/src/types/app-context.ts +7 -0
- package/src/types/bindings.ts +3 -0
- package/src/types/config.ts +94 -15
- package/src/types/constants.ts +188 -16
- package/src/types/entities.ts +87 -1
- package/src/types/operations.ts +64 -2
- package/src/types/props.ts +157 -31
- package/src/types/views.ts +55 -1
- package/src/ui/__tests__/font-themes.test.ts +52 -12
- package/src/ui/compose/ComposeDialog.tsx +201 -7
- package/src/ui/compose/ComposePrompt.tsx +1 -5
- package/src/ui/compose/__tests__/ComposeDialog.test.tsx +125 -0
- package/src/ui/dash/appearance/AdvancedContent.tsx +2 -2
- package/src/ui/dash/appearance/CodeInjectionContent.tsx +12 -16
- package/src/ui/dash/appearance/NavigationContent.tsx +117 -16
- package/src/ui/dash/appearance/__tests__/NavigationContent.test.tsx +33 -11
- package/src/ui/dash/appearance/__tests__/system-nav-descriptions.test.ts +44 -0
- package/src/ui/dash/appearance/system-nav-descriptions.ts +75 -0
- package/src/ui/dash/settings/AccountMenuContent.tsx +2 -2
- package/src/ui/dash/settings/ApiTokensContent.tsx +2 -1
- package/src/ui/dash/settings/ConfigEditorContent.tsx +35 -16
- package/src/ui/dash/settings/GeneralContent.tsx +275 -113
- package/src/ui/dash/settings/LanguageContent.tsx +409 -0
- package/src/ui/dash/settings/SettingsRootContent.tsx +19 -1
- package/src/ui/dash/settings/__tests__/GeneralContent.test.tsx +324 -4
- package/src/ui/dash/settings/__tests__/LanguageContent.test.tsx +144 -0
- package/src/ui/dash/settings/__tests__/discover-copy.test.ts +66 -0
- package/src/ui/dash/settings/discover-copy.ts +116 -0
- package/src/ui/feed/LinkCard.tsx +55 -45
- package/src/ui/feed/NoteCard.tsx +9 -4
- package/src/ui/feed/PostStatusBadges.tsx +90 -43
- package/src/ui/feed/QuoteCard.tsx +55 -30
- package/src/ui/feed/ThreadPreview.tsx +6 -2
- package/src/ui/feed/__tests__/thread-preview.test.ts +13 -16
- package/src/ui/feed/__tests__/timeline-cards.test.ts +314 -49
- package/src/ui/feed/thread-preview-state.ts +20 -6
- package/src/ui/font-themes.ts +39 -29
- package/src/ui/layouts/BaseLayout.tsx +155 -10
- package/src/ui/layouts/SiteLayout.tsx +192 -34
- package/src/ui/layouts/__tests__/BaseLayout.test.tsx +196 -17
- package/src/ui/layouts/__tests__/SiteLayout.test.tsx +109 -85
- package/src/ui/pages/ArchivePage.tsx +282 -289
- package/src/ui/pages/CollectionPage.tsx +86 -76
- package/src/ui/pages/CollectionsPage.tsx +5 -0
- package/src/ui/pages/ComposePage.tsx +8 -0
- package/src/ui/pages/PostPage.tsx +47 -0
- package/src/ui/pages/SearchPage.tsx +3 -3
- package/src/ui/pages/SmartCollectionPage.tsx +434 -0
- package/src/ui/pages/SubscribePage.tsx +236 -0
- package/src/ui/pages/__tests__/ArchivePage.test.tsx +65 -9
- package/src/ui/pages/__tests__/collections-directory-rows.test.tsx +92 -0
- package/src/ui/pages/__tests__/collections-view-links.test.tsx +81 -0
- package/src/ui/shared/CollectionDirectory.tsx +178 -3
- package/src/ui/shared/CollectionsManager.tsx +70 -17
- package/src/ui/shared/CopyField.tsx +127 -0
- package/src/ui/shared/EmptyPostContent.tsx +23 -0
- package/src/ui/shared/MediaGallery.tsx +125 -46
- package/src/ui/shared/Pagination.tsx +20 -5
- package/src/ui/shared/PostFooter.tsx +20 -11
- package/src/ui/shared/__tests__/archive-labels.test.ts +100 -0
- package/src/ui/shared/__tests__/media-gallery.test.ts +210 -2
- package/src/ui/shared/__tests__/navigation-labels.test.ts +16 -22
- package/src/ui/shared/__tests__/pagination.test.ts +38 -24
- package/src/ui/shared/__tests__/post-footer.test.ts +32 -0
- package/src/ui/shared/archive-labels.ts +98 -0
- package/src/ui/shared/collection-management-labels.ts +94 -16
- package/src/ui/shared/navigation-labels.ts +45 -71
- package/src/ui/shared/post-article-attributes.ts +2 -0
- package/src/ui/shared/smart-collection-labels.ts +343 -0
- package/dist/app-C75Zc8dD.js +0 -6
- package/dist/client/_assets/chunks/heic-to-DUUaO23q.js +0 -1
- package/dist/client/_assets/chunks/module-DcsAZQZ_.js +0 -716
- package/dist/client/_assets/chunks/url-CU9pEbk5.js +0 -1
- package/dist/client/_assets/client-Bq0vre8Y.js +0 -296
- package/dist/client/_assets/client-D3VZyG4L.css +0 -2
- package/dist/client/_assets/client-auth-F2rb9WfF.js +0 -5571
- package/dist/env-BPYViDJJ.js +0 -281
- package/dist/github-api-BNF35Lkx.js +0 -176
- package/dist/github-app-DdiD-bC4.js +0 -275
- package/dist/github-sync-Bqg62IvV.js +0 -4
- package/dist/github-sync-HdK2EgvJ.js +0 -431
- package/dist/url-CbLAtlZe.js +0 -900
- package/src/client/__tests__/collection-created-notice.test.ts +0 -36
- package/src/client/__tests__/collection-form-bridge.test.ts +0 -216
- package/src/client/__tests__/post-form-bridge.test.ts +0 -82
- package/src/client/collection-created-notice.ts +0 -66
- package/src/client/collection-form-bridge.ts +0 -191
- package/src/client/components/__tests__/jant-post-form.test.ts +0 -193
- package/src/client/components/jant-post-form.ts +0 -422
- package/src/client/components/post-form-template.ts +0 -352
- package/src/client/components/post-form-types.ts +0 -96
- package/src/client/media-metadata.ts +0 -247
- package/src/client/post-form-bridge.ts +0 -193
- package/src/ui/pages/CollectionEditorPage.tsx +0 -175
package/dist/env-BPYViDJJ.js
DELETED
|
@@ -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 };
|