ghost 6.53.0 → 6.54.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/ghost-storage-base-3.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-cache-0.2.0.tgz +0 -0
- package/components/tryghost-adapter-base-scheduling-0.2.0.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.1.1.tgz +0 -0
- package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-i18n-0.0.0.tgz +0 -0
- package/components/tryghost-kg-converters-1.2.3.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.1.3.tgz +0 -0
- package/components/tryghost-kg-lexical-html-renderer-1.4.3.tgz +0 -0
- package/core/boot.js +9 -6
- package/core/built/admin/assets/Combination-CJG7Flp-.js +41 -0
- package/core/built/admin/assets/Growth-BTP1LthE.js +3 -0
- package/core/built/admin/assets/Newsletters-CSEX0myc.js +1 -0
- package/core/built/admin/assets/Overview-BjACEsJF.js +1 -0
- package/core/built/admin/assets/{PolarAngleAxis-pciQ0MOy.js → PolarAngleAxis-BGjf7sBu.js} +1 -1
- package/core/built/admin/assets/{RadialBarChart-DWmw2PcX.js → RadialBarChart-zeFf9mBz.js} +1 -1
- package/core/built/admin/assets/Web-CxxxjCcv.js +2 -0
- package/core/built/admin/assets/account-migration-BklF2I_I.js +1 -0
- package/core/built/admin/assets/activitypub/{account-migration-BPZG37DJ.js → account-migration-CNovr6W-.js} +13 -13
- package/core/built/admin/assets/activitypub/activitypub.js +8 -8
- package/core/built/admin/assets/activitypub/{avatar-ZYco0ITb.js → avatar-B3DEDB1l.js} +10 -10
- package/core/built/admin/assets/activitypub/{avatar-flipboard-D541lc4F.js → avatar-flipboard-Cqrg0XMx.js} +3 -3
- package/core/built/admin/assets/activitypub/{bluesky-sharing-NOHUtHjl.js → bluesky-sharing-Ceslb1_M.js} +38 -37
- package/core/built/admin/assets/activitypub/{chunk-KS7C4IRE-B-GOFDPZ.js → chunk-KS7C4IRE-D4HEcEwi.js} +716 -710
- package/core/built/admin/assets/activitypub/{content-formatters-bwrp4iEO.js → content-formatters-BpQARh28.js} +229 -181
- package/core/built/admin/assets/activitypub/{copy-C7m7ovHw.js → copy-D9UWIAan.js} +2 -2
- package/core/built/admin/assets/activitypub/{dist-BqkDUQxJ2.js → dist-ByFmDSNP2.js} +64 -63
- package/core/built/admin/assets/activitypub/{dist-B5ira32t.js → dist-DHAjBcV3.js} +5 -5
- package/core/built/admin/assets/activitypub/{domain-iqE4YXwD.js → domain-C1qQvJ8C.js} +33 -33
- package/core/built/admin/assets/activitypub/{edit-profile-B8MFYh28.js → edit-profile-BcH-jEfM.js} +46 -45
- package/core/built/admin/assets/activitypub/{explore-BbdKodp3.js → explore-AxwBh9dI.js} +20 -20
- package/core/built/admin/assets/activitypub/{feed-Cl3A5owG.js → feed-BaOlbh7a.js} +15 -15
- package/core/built/admin/assets/activitypub/{field-DL6WyR-c.js → field-B7mYYQpN.js} +13 -13
- package/core/built/admin/assets/activitypub/{hash-6G3DzwL9.js → hash-BC9Q0N4c.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-YmhuBice.js → inbox-DQ4ZnC1m.js} +2 -2
- package/core/built/admin/assets/activitypub/inbox-vXez-5uJ.js +1221 -0
- package/core/built/admin/assets/activitypub/{label-DGbLjDvE.js → label-Chv5T8bw.js} +6 -6
- package/core/built/admin/assets/activitypub/layout-CziktJXo.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-qnBtk1zS.js → moderation-DtSM2i1I.js} +32 -31
- package/core/built/admin/assets/activitypub/{note-C7ZRoSJv.js → note-Dckp4S-2.js} +21 -21
- package/core/built/admin/assets/activitypub/{notifications-DiEA4b1o.js → notifications-CG5T22vg.js} +17 -17
- package/core/built/admin/assets/activitypub/{onboarding-_JVgEwgV.js → onboarding-BFDkzeR2.js} +2 -2
- package/core/built/admin/assets/activitypub/{onboarding-DG4zu3qM.js → onboarding-D6rcBdPe.js} +5 -5
- package/core/built/admin/assets/activitypub/{preferences-B3FtocnP.js → preferences-D_799jdl.js} +1607 -1606
- package/core/built/admin/assets/activitypub/{profile-D8ZJfYXB.js → profile-D2JfXBQl.js} +264 -263
- package/core/built/admin/assets/activitypub/{reply-C1vggenw.js → reply-CpdMeAO5.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-BOii-V9n.js → routes-CCHe2dQp.js} +1317 -1298
- package/core/built/admin/assets/activitypub/{separator-1gNokN5S.js → separator-BI1FLsYM.js} +4 -4
- package/core/built/admin/assets/activitypub/{settings--9Sb0nbl.js → settings-kx-9Enkz.js} +14 -14
- package/core/built/admin/assets/activitypub/{site-fkMmqv0V.js → site-x4_IjVJ0.js} +10 -10
- package/core/built/admin/assets/activitypub/{step-1-QhivSMw2.js → step-1-DIDg4aHb.js} +15 -15
- package/core/built/admin/assets/activitypub/{step-2-pMk9YwqD.js → step-2-BfGe8BYt.js} +7 -7
- package/core/built/admin/assets/activitypub/{step-3-DvmVC1fo.js → step-3-mE9spAqw.js} +12 -12
- package/core/built/admin/assets/activitypub/{tabs-Dc0FEEYD.js → tabs-CyPRQQ1N.js} +241 -237
- package/core/built/admin/assets/activitypub/{topic-filter-CuDyM5bD.js → topic-filter-DLHBZT93.js} +4 -4
- package/core/built/admin/assets/activitypub/use-activity-pub-queries-VzbN99u_.js +1957 -0
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-Drx1kdAK.js → use-navigate-with-base-path-CAwXTmqH.js} +165 -175
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-BHkCHcW5.js → use-reply-chain-data-BAB6fNGt.js} +8 -8
- package/core/built/admin/assets/activitypub/users-BLeiOTHc.js +1464 -0
- package/core/built/admin/assets/activitypub/{x-BHCEe-c2.js → x-C8tAnXly.js} +2 -2
- package/core/built/admin/assets/{audience-adiFehTD.js → audience-X_XsZivI.js} +1 -1
- package/core/built/admin/assets/{automated-emails-UWM02CMr.js → automated-emails-of1MvVsv.js} +1 -1
- package/core/built/admin/assets/automations-B7-y3dXt.js +1 -0
- package/core/built/admin/assets/automations-DRFjW5fw.js +1 -0
- package/core/built/admin/assets/{avatar-flipboard-Lz3F9fNT.js → avatar-flipboard-C6Kj3Awu.js} +1 -1
- package/core/built/admin/assets/bluesky-sharing-BbbjWdzs.js +1 -0
- package/core/built/admin/assets/box-BWbhXh21.js +1 -0
- package/core/built/admin/assets/breadcrumb-B-M9Ip_2.js +1 -0
- package/core/built/admin/assets/card-DGoDJzrn.js +1 -0
- package/core/built/admin/assets/{chart-ChpW-NzQ.js → chart-BuRT2Y6p.js} +14 -14
- package/core/built/admin/assets/chart-helpers-xiSsW8r0.js +1 -0
- package/core/built/admin/assets/checkbox-EhJKHFdZ.js +1 -0
- package/core/built/admin/assets/{chunk.432.c2caa0b20f03e71d1a35.js → chunk.211.6f7328d63c41536451b3.js} +2025 -2819
- package/core/built/admin/assets/{chunk.432.c2caa0b20f03e71d1a35.js.LICENSE.txt → chunk.211.6f7328d63c41536451b3.js.LICENSE.txt} +1 -62
- package/core/built/admin/assets/{chunk.831.0703a12e49f51cec3f3a.js → chunk.361.3cdb584b973959e52ccc.js} +78 -85
- package/core/built/admin/assets/chunk.524.8365cd9280405c0f6216.js +25 -0
- package/core/built/admin/assets/chunk.582.61d078937e6102769f2c.js +27 -0
- package/core/built/admin/assets/code-editor-view-CZtJFGhR.js +1 -0
- package/core/built/admin/assets/comments-CvyXxOyN.js +1 -0
- package/core/built/admin/assets/container-BYz2Ed39.js +1 -0
- package/core/built/admin/assets/data-list-16rkJYYi.js +1 -0
- package/core/built/admin/assets/date-range-select-CTlyo8zW.js +1 -0
- package/core/built/admin/assets/disabled-sources-indicator-qs2GfLvl.js +1 -0
- package/core/built/admin/assets/{dist-DJ6c4_De.js → dist-2Tnz2Yfq.js} +1 -1
- package/core/built/admin/assets/{dist-CsekE4FL.js → dist-CQJY6SVY.js} +1 -1
- package/core/built/admin/assets/dist-CjY-f5Z1.js +1 -0
- package/core/built/admin/assets/dist-DGzPJ_bO.js +4 -0
- package/core/built/admin/assets/dist-DIC8yz5C.js +1 -0
- package/core/built/admin/assets/{dist-BbGrW05X.js → dist-DyViJwIy.js} +1 -1
- package/core/built/admin/assets/dist-Ndy-PuGN.js +1 -0
- package/core/built/admin/assets/dist-P_ohUlTi.js +1 -0
- package/core/built/admin/assets/domain-CPNXKVOV.js +1 -0
- package/core/built/admin/assets/dropzone-BmCXnw6J.js +5 -0
- package/core/built/admin/assets/edit-profile-SGrJve5M.js +1 -0
- package/core/built/admin/assets/editor-BOG2YPUm.js +8 -0
- package/core/built/admin/assets/empty-indicator-oX1u1Pkn.js +1 -0
- package/core/built/admin/assets/esm-CFX93H5M.js +2 -0
- package/core/built/admin/assets/explore-CUYLv9G9.js +1 -0
- package/core/built/admin/assets/feed-CPdJMttL.js +1 -0
- package/core/built/admin/assets/field-D0XISCK2.js +1 -0
- package/core/built/admin/assets/{filter-sources-v39ihhhV.js → filter-sources-Bieps75g.js} +1 -1
- package/core/built/admin/assets/filters-CuB-A7ma.js +1 -0
- package/core/built/admin/assets/filters-bXkkWro8.js +1 -0
- package/core/built/admin/assets/framework-provider-CmtnPXIT.js +4 -0
- package/core/built/admin/assets/{ghost-b57f077997b739a8ae9a70772dc016cb.js → ghost-05f9a7182ed56903dba05878a5b8422b.js} +46 -41
- package/core/built/admin/assets/ghost-dark-c8d0ab7f515b2010c173e23e9b32ea8a.css +1 -0
- package/core/built/admin/assets/gift-link-modal-su8MsRdg.js +1 -0
- package/core/built/admin/assets/{gift-links-CY3GwiVi.js → gift-links-nBxJjZiQ.js} +1 -1
- package/core/built/admin/assets/growth-Ba6S5FQX.js +1 -0
- package/core/built/admin/assets/hooks-BApwwBE0.js +2 -0
- package/core/built/admin/assets/{inbox-TEISAmth.js → inbox-Xx1CdnfO.js} +38 -38
- package/core/built/admin/assets/index-D8PbzuT9.css +1 -0
- package/core/built/admin/assets/index-ukW_0Uie.js +67 -0
- package/core/built/admin/assets/inline-EMAm3okk.js +1 -0
- package/core/built/admin/assets/input-group-CGOXcy4l.js +1 -0
- package/core/built/admin/assets/input-surface-BpAjZXY5.js +1 -0
- package/core/built/admin/assets/{react-dom-C6aoWSfl.js → jsx-runtime-DX3WBWVO.js} +1 -1
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +5 -2
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +2 -2
- package/core/built/admin/assets/{koenig-lexical-Di7b48ED.js → koenig-lexical-B61IALf5.js} +2 -2
- package/core/built/admin/assets/kpi-card-BlZaG1Lo.js +1 -0
- package/core/built/admin/assets/kpi-card-DCdlyaSS.js +1 -0
- package/core/built/admin/assets/kpi-helpers-DpAuS1Nb.js +1 -0
- package/core/built/admin/assets/kpi-tabs-Dme44bQS.js +1 -0
- package/core/built/admin/assets/label-dSs5aepE.js +1 -0
- package/core/built/admin/assets/label-picker-Uq91atex.js +1 -0
- package/core/built/admin/assets/{labels-GbxlXWtf.js → labels-Cyayfd-e.js} +1 -1
- package/core/built/admin/assets/layout-WUcz6tu1.js +1 -0
- package/core/built/admin/assets/limit-service-9fwD33lU.js +20 -0
- package/core/built/admin/assets/link-helpers-tOlxmuH5.js +1 -0
- package/core/built/admin/assets/list-page-B6ANtzkd.js +1 -0
- package/core/built/admin/assets/mailchimp-Ds_NQ04w.svg +9 -0
- package/core/built/admin/assets/member-custom-fields-NCzrMuba.js +1 -0
- package/core/built/admin/assets/member-detail-DPWDtYnN.js +1 -0
- package/core/built/admin/assets/members-B9rO7qr4.js +10 -0
- package/core/built/admin/assets/modals-CxRaan1J.js +31 -0
- package/core/built/admin/assets/moderation-D8zon60E.js +1 -0
- package/core/built/admin/assets/multi-select-combobox-1wYm3nle.js +1 -0
- package/core/built/admin/assets/newsletter-DbYMRxRS.js +1 -0
- package/core/built/admin/assets/{newsletters-DZm3yLj8.js → newsletters-D1jbtV-h.js} +1 -1
- package/core/built/admin/assets/note-PiWPnnrh.js +1 -0
- package/core/built/admin/assets/notifications-DEgqqB9G.js +1 -0
- package/core/built/admin/assets/nql-lang-B7faUf8D.js +19 -0
- package/core/built/admin/assets/{offers-D11QtPXX.js → offers-CrY6nSRR.js} +1 -1
- package/core/built/admin/assets/onboarding-route-BzF6HeVn.js +1 -0
- package/core/built/admin/assets/overview-DixLeIqY.js +1 -0
- package/core/built/admin/assets/page-header-op0eN36I.js +1 -0
- package/core/built/admin/assets/{pages-BnObVRrf.js → pages-BbNWFcGj.js} +1 -1
- package/core/built/admin/assets/pintura-CXOmq-5H.svg +15 -0
- package/core/built/admin/assets/post-analytics-WwRDEnrV.js +1 -0
- package/core/built/admin/assets/post-analytics-header-DsMoLx0R.js +1 -0
- package/core/built/admin/assets/{post-analytics-provider-DSfBCtnj.js → post-analytics-provider-BJCPLMIb.js} +1 -1
- package/core/built/admin/assets/post-share-modal-Dx-MEjhI.js +1 -0
- package/core/built/admin/assets/{posts-CwH8VJvB.js → posts-EWpZIjkr.js} +1 -1
- package/core/built/admin/assets/preferences-D7-j6A4C.js +5 -0
- package/core/built/admin/assets/profile-Dl69QPp0.js +1 -0
- package/core/built/admin/assets/{referrers-nxR52jPI.js → referrers-BCfFYSHc.js} +1 -1
- package/core/built/admin/assets/router-provider-C1R4AZ2o.js +1 -0
- package/core/built/admin/assets/select-C1qDZnW4.js +1 -0
- package/core/built/admin/assets/settings-BbmC_Iqq.js +4 -0
- package/core/built/admin/assets/settings-H6HxFgfI.js +1 -0
- package/core/built/admin/assets/shade-app-B3heOAfz-CGXQwWeO.js +3 -0
- package/core/built/admin/assets/share-modal-BJCadJyp.js +1 -0
- package/core/built/admin/assets/social-urls-BPL1nADp.js +8 -0
- package/core/built/admin/assets/sort-button-DyYlfYp7.js +1 -0
- package/core/built/admin/assets/source-icon-_ubRDbg_.js +1 -0
- package/core/built/admin/assets/stack-xiN0eQ6Z.js +1 -0
- package/core/built/admin/assets/stats-BQZMGMvn.js +1 -0
- package/core/built/admin/assets/stats-view-Doei-qCX.js +1 -0
- package/core/built/admin/assets/step-1-IKiLBPoC.js +1 -0
- package/core/built/admin/assets/step-2-jJ41PsDN.js +1 -0
- package/core/built/admin/assets/step-3-CaqFAEqf.js +2 -0
- package/core/built/admin/assets/switch-t-WyENU2.js +1 -0
- package/core/built/admin/assets/table-DxUL78jU.js +1 -0
- package/core/built/admin/assets/tabs-BQcJQ1ke.js +1 -0
- package/core/built/admin/assets/tags-CNujGwkT.js +1 -0
- package/core/built/admin/assets/text-DwtjwGkh.js +1 -0
- package/core/built/admin/assets/textarea-Bjccvh_E.js +1 -0
- package/core/built/admin/assets/{tiers-EghDzCKc.js → tiers-BgYLWRJv.js} +1 -1
- package/core/built/admin/assets/toggle-group-BeEpQ69p.js +1 -0
- package/core/built/admin/assets/topic-filter-Bb5MOD-1.js +1 -0
- package/core/built/admin/assets/{use-analytics-data-0l_OHtnR.js → use-analytics-data-Cds6XDjg.js} +1 -1
- package/core/built/admin/assets/use-filter-params-DjXkhO54.js +1 -0
- package/core/built/admin/assets/use-growth-stats-D8uf98-G.js +1 -0
- package/core/built/admin/assets/{use-post-referrers-DwI31Ril.js → use-post-referrers-CRtgyuXB.js} +1 -1
- package/core/built/admin/assets/use-reply-chain-data-DbKYX50v.js +1 -0
- package/core/built/admin/assets/use-simple-pagination-DC01kpo0.js +1 -0
- package/core/built/admin/assets/{use-tinybird-query-DvZBBMG7.js → use-tinybird-query-C7bQRJWw.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-CQtebkvU.js → use-tinybird-token-Az4tam7_.js} +1 -1
- package/core/built/admin/assets/{users-Pc8IRjk9.js → users-CcSCQFcQ.js} +1 -1
- package/core/built/admin/assets/virtual-list-Dhuh9fGx.js +1 -0
- package/core/built/admin/assets/web-LtHNiNBV.js +1 -0
- package/core/built/admin/index.html +22 -22
- package/core/frontend/apps/private-blogging/index.js +1 -1
- package/core/frontend/apps/private-blogging/lib/middleware.js +1 -1
- package/core/frontend/helpers/split.js +2 -1
- package/core/frontend/meta/asset-url.js +1 -1
- package/core/frontend/meta/author-image.js +1 -1
- package/core/frontend/meta/blog-logo.js +1 -1
- package/core/frontend/meta/canonical-url.js +1 -1
- package/core/frontend/meta/cover-image.js +1 -1
- package/core/frontend/meta/get-meta.js +1 -1
- package/core/frontend/meta/og-image.js +1 -1
- package/core/frontend/meta/paginated-url.js +1 -1
- package/core/frontend/meta/twitter-image.js +1 -1
- package/core/frontend/meta/url.js +1 -1
- package/core/frontend/services/assets-minification/admin-auth-assets.js +1 -1
- package/core/frontend/services/llms/handler.js +1 -1
- package/core/frontend/services/proxy.js +42 -3
- package/core/frontend/services/routing/collection-router.js +1 -1
- package/core/frontend/services/routing/controllers/email-post.js +1 -1
- package/core/frontend/services/routing/controllers/entry/markdown.js +1 -1
- package/core/frontend/services/routing/controllers/entry/markdown.ts +1 -1
- package/core/frontend/services/routing/controllers/entry.js +1 -1
- package/core/frontend/services/routing/controllers/entry.ts +1 -1
- package/core/frontend/services/routing/controllers/previews.js +6 -7
- package/core/frontend/services/routing/controllers/unsubscribe.js +7 -3
- package/core/frontend/services/routing/email-router.js +1 -1
- package/core/frontend/services/routing/events.js +12 -0
- package/core/frontend/services/routing/middleware/page-param.js +1 -1
- package/core/frontend/services/routing/parent-router.js +1 -1
- package/core/frontend/services/routing/preview-router.js +1 -1
- package/core/frontend/services/routing/router-manager.js +4 -8
- package/core/frontend/services/routing/rss-router.js +1 -1
- package/core/frontend/services/routing/static-pages-router.js +1 -1
- package/core/frontend/services/routing/static-routes-router.js +1 -1
- package/core/frontend/services/routing/taxonomy-router.js +1 -1
- package/core/frontend/services/rss/generate-feed.js +1 -1
- package/core/frontend/services/sitemap/base-site-map-generator.js +23 -4
- package/core/frontend/services/sitemap/site-map-index-generator.js +1 -1
- package/core/frontend/services/sitemap/site-map-manager.js +14 -8
- package/core/frontend/services/sitemap/utils.js +1 -1
- package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +1 -1
- package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +1 -1
- package/core/frontend/utils/images.js +1 -1
- package/core/frontend/web/middleware/admin-toolbar.js +1 -1
- package/core/frontend/web/middleware/handle-image-sizes.js +2 -2
- package/core/frontend/web/middleware/redirect-ghost-to-admin.js +1 -1
- package/core/frontend/web/routers/serve-favicon.js +1 -1
- package/core/frontend/web/routers/serve-public-file.js +1 -1
- package/core/frontend/web/site.js +5 -5
- package/core/server/adapters/cache/AdapterCacheMemoryTTL.js +2 -2
- package/core/server/adapters/cache/MemoryCache.js +2 -2
- package/core/server/adapters/cache/Redis.js +1 -1
- package/core/server/adapters/cache/index.js +1 -1
- package/core/server/adapters/lib/redis/AdapterCacheRedis.js +2 -2
- package/core/server/adapters/route-settings/FileStore.js +2 -8
- package/core/server/adapters/route-settings/FileStore.ts +1 -6
- package/core/server/adapters/route-settings/S3RouteSettingsStore.js +206 -0
- package/core/server/adapters/route-settings/S3RouteSettingsStore.ts +199 -0
- package/core/server/adapters/route-settings/utils.js +13 -0
- package/core/server/adapters/route-settings/utils.ts +7 -0
- package/core/server/adapters/scheduling/deps.d.ts +0 -2
- package/core/server/adapters/scheduling/error-capture.js +76 -0
- package/core/server/adapters/scheduling/error-capture.ts +91 -0
- package/core/server/adapters/scheduling/utils.js +18 -34
- package/core/server/adapters/scheduling/utils.ts +36 -0
- package/core/server/adapters/storage/LocalFilesStorage.js +13 -11
- package/core/server/adapters/storage/LocalFilesStorage.ts +24 -0
- package/core/server/adapters/storage/LocalImagesStorage.js +14 -12
- package/core/server/adapters/storage/LocalImagesStorage.ts +24 -0
- package/core/server/adapters/storage/LocalMediaStorage.js +13 -11
- package/core/server/adapters/storage/LocalMediaStorage.ts +24 -0
- package/core/server/adapters/storage/LocalStorageBase.js +107 -167
- package/core/server/adapters/storage/LocalStorageBase.ts +342 -0
- package/core/server/adapters/storage/S3Storage.js +2 -2
- package/core/server/adapters/storage/S3Storage.ts +1 -1
- package/core/server/adapters/storage/utils.js +36 -50
- package/core/server/adapters/storage/utils.ts +60 -0
- package/core/server/api/endpoints/authentication.js +1 -1
- package/core/server/api/endpoints/db.js +6 -0
- package/core/server/api/endpoints/featurebase.js +1 -1
- package/core/server/api/endpoints/files.js +2 -2
- package/core/server/api/endpoints/images.js +2 -2
- package/core/server/api/endpoints/libraries.d.ts +0 -1
- package/core/server/api/endpoints/media.js +8 -5
- package/core/server/api/endpoints/member-custom-fields.js +4 -1
- package/core/server/api/endpoints/member-custom-fields.ts +4 -1
- package/core/server/api/endpoints/members.js +25 -28
- package/core/server/api/endpoints/pages.js +6 -1
- package/core/server/api/endpoints/posts.js +28 -3
- package/core/server/api/endpoints/search-index-public.js +4 -3
- package/core/server/api/endpoints/search-index.js +5 -4
- package/core/server/api/endpoints/settings-public.js +1 -1
- package/core/server/api/endpoints/settings.js +3 -1
- package/core/server/api/endpoints/utils/serializers/input/utils/url.js +9 -1
- package/core/server/api/endpoints/utils/serializers/output/default.js +7 -0
- package/core/server/api/endpoints/utils/serializers/output/files.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/mappers/comments.js +4 -1
- package/core/server/api/endpoints/utils/serializers/output/media.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.js +7 -4
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.ts +8 -4
- package/core/server/api/endpoints/utils/serializers/output/members.js +27 -106
- package/core/server/api/endpoints/utils/serializers/output/pages.js +7 -0
- package/core/server/api/endpoints/utils/serializers/output/posts.js +13 -0
- package/core/server/api/endpoints/utils/serializers/output/utils/url.js +1 -1
- package/core/server/api/endpoints/utils/validators/input/members.js +2 -52
- package/core/server/data/db/backup.js +1 -1
- package/core/server/data/exporter/export-filename.js +2 -1
- package/core/server/data/importer/handlers/image.js +3 -3
- package/core/server/data/importer/import-manager.js +6 -4
- package/core/server/data/importer/importers/content-file-importer.js +2 -2
- package/core/server/data/importer/importers/data/revue-subscriber-importer.js +6 -10
- package/core/server/data/importer/importers/json-to-html.js +24 -4
- package/core/server/data/migrations/utils/schema.js +4 -2
- package/core/server/data/migrations/versions/6.54/2026-07-19-16-59-00-add-content-import-permission.js +10 -0
- package/core/server/data/migrations/versions/6.54/2026-07-20-13-59-21-drop-email-tracked-sent-count-from-automation-action-revisions.js +7 -0
- package/core/server/data/migrations/versions/6.54/2026-07-21-01-58-20-add-automation-run-steps-poller-index.js +3 -0
- package/core/server/data/migrations/versions/6.54/2026-07-21-21-08-15-add-automated-email-recipients-mailgun-message-id-index.js +3 -0
- package/core/server/data/migrations/versions/6.54/2026-07-22-10-41-08-add-click-tracking-to-automated-email-recipients.js +13 -0
- package/core/server/data/migrations/versions/6.54/2026-07-22-15-10-30-add-email-clicked-count-to-automation-action-revisions.js +7 -0
- package/core/server/data/migrations/versions/6.54/2026-07-23-10-24-18-add-automation-action-revision-to-redirects.js +9 -0
- package/core/server/data/schema/commands.js +37 -3
- package/core/server/data/schema/fixtures/fixtures.json +7 -0
- package/core/server/data/schema/lib/default-index-name.js +20 -0
- package/core/server/data/schema/schema.js +40 -17
- package/core/server/data/seeders/data-generator.js +4 -2
- package/core/server/lib/image/image-size.js +7 -23
- package/core/server/lib/image/image-utils.js +16 -2
- package/core/server/lib/image/index.js +4 -4
- package/core/server/lib/lexical.js +3 -3
- package/core/server/lib/mobiledoc.js +2 -2
- package/core/server/lib/request-external.js +1 -1
- package/core/server/lib/validate-password.js +1 -1
- package/core/server/models/action.js +9 -0
- package/core/server/models/base/plugins/generate-slug.js +1 -1
- package/core/server/models/collection.js +1 -1
- package/core/server/models/custom-theme-setting.js +1 -1
- package/core/server/models/member.js +73 -0
- package/core/server/models/newsletter.js +1 -1
- package/core/server/models/post.js +19 -5
- package/core/server/models/posts-meta.js +1 -1
- package/core/server/models/redirect.js +1 -1
- package/core/server/models/settings.js +1 -1
- package/core/server/models/snippet.js +1 -1
- package/core/server/models/tag.js +1 -1
- package/core/server/models/user.js +47 -71
- package/core/server/models/welcome-email-automated-email.js +1 -1
- package/core/server/services/activitypub/activity-pub-service-wrapper.js +1 -1
- package/core/server/services/adapter-manager/adapter-manager.js +5 -1
- package/core/server/services/adapter-manager/adapter-manager.ts +7 -2
- package/core/server/services/adapter-manager/index.js +18 -15
- package/core/server/services/adapter-manager/index.ts +23 -17
- package/core/server/services/adapter-manager/utils.js +124 -14
- package/core/server/services/adapter-manager/utils.ts +130 -14
- package/core/server/services/api-version-compatibility/mw-version-rewrites.js +1 -1
- package/core/server/services/audience-feedback/index.js +1 -1
- package/core/server/services/auth/passwordreset.js +1 -1
- package/core/server/services/auth/session/express-session.js +1 -1
- package/core/server/services/auth/session/index.js +2 -2
- package/core/server/services/auth/session/session-service.js +29 -2
- package/core/server/services/automations/automations-api.js +8 -25
- package/core/server/services/automations/automations-api.ts +8 -37
- package/core/server/services/automations/automations-repository.ts +16 -0
- package/core/server/services/automations/database-automations-repository.js +37 -4
- package/core/server/services/automations/database-automations-repository.ts +41 -4
- package/core/server/services/automations/poll.js +16 -12
- package/core/server/services/automations/poll.ts +17 -15
- package/core/server/services/automations/service.js +1 -1
- package/core/server/services/automations/service.ts +3 -13
- package/core/server/services/automations/welcome-email-automation-poll.js +2 -1
- package/core/server/services/comments/comments-service-emails.js +4 -1
- package/core/server/services/comments/index.js +1 -1
- package/core/server/services/custom-redirects/index.js +2 -2
- package/core/server/services/email-analytics/email-analytics-service-wrapper.js +14 -13
- package/core/server/services/email-analytics/email-analytics-service.js +1 -1
- package/core/server/services/email-analytics/events/start-email-analytics-job-event.js +11 -15
- package/core/server/services/email-analytics/events/start-email-analytics-job-event.ts +15 -0
- package/core/server/services/email-analytics/index.js +2 -3
- package/core/server/services/email-analytics/index.ts +1 -2
- package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.js +1 -6
- package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.ts +0 -9
- package/core/server/services/email-analytics/jobs/fetch-latest/index.js +1 -1
- package/core/server/services/email-analytics/jobs/index.js +0 -2
- package/core/server/services/email-service/email-service-wrapper.js +1 -1
- package/core/server/services/email-service/email-service.js +20 -4
- package/core/server/services/explore-ping/explore-ping-service.js +24 -39
- package/core/server/services/explore-ping/explore-ping-service.ts +198 -0
- package/core/server/services/explore-ping/index.js +11 -11
- package/core/server/services/explore-ping/index.ts +42 -0
- package/core/server/services/gifts/gift-reminder-scheduler.js +1 -1
- package/core/server/services/gifts/gift-reminder-scheduler.ts +1 -1
- package/core/server/services/gifts/gift-service-wrapper.js +1 -1
- package/core/server/services/identity-tokens/identity-token-service-wrapper.js +1 -1
- package/core/server/services/indexnow-ping/constants.js +30 -0
- package/core/server/services/indexnow-ping/constants.ts +32 -0
- package/core/server/services/indexnow-ping/index.js +29 -253
- package/core/server/services/indexnow-ping/index.ts +37 -0
- package/core/server/services/indexnow-ping/indexnow-ping-service.js +229 -0
- package/core/server/services/indexnow-ping/indexnow-ping-service.ts +319 -0
- package/core/server/services/invites/index.js +1 -1
- package/core/server/services/lib/mailgun-client.js +3 -3
- package/core/server/services/link-redirection/index.js +2 -2
- package/core/server/services/link-redirection/link-redirect-repository.js +1 -1
- package/core/server/services/link-redirection/link-redirect.js +12 -13
- package/core/server/services/link-redirection/link-redirect.ts +22 -0
- package/core/server/services/link-redirection/link-redirects-service.js +1 -1
- package/core/server/services/link-tracking/full-post-link.js +2 -2
- package/core/server/services/link-tracking/index.js +1 -1
- package/core/server/services/mail/ghost-mailer.js +1 -1
- package/core/server/services/mail/index.js +1 -1
- package/core/server/services/media-inliner/external-media-inliner.js +2 -2
- package/core/server/services/media-inliner/service.js +4 -3
- package/core/server/services/member-attribution/index.js +1 -1
- package/core/server/services/member-welcome-emails/service.js +1 -1
- package/core/server/services/members/api.js +8 -2
- package/core/server/services/members/import-export/config.js +30 -0
- package/core/server/services/members/import-export/config.ts +34 -0
- package/core/server/services/members/import-export/csv/index.js +10 -0
- package/core/server/services/members/import-export/csv/index.ts +2 -0
- package/core/server/services/members/import-export/csv/parse.js +64 -0
- package/core/server/services/members/import-export/csv/parse.ts +69 -0
- package/core/server/services/members/import-export/csv/serialize.js +13 -0
- package/core/server/services/members/import-export/csv/serialize.ts +18 -0
- package/core/server/services/members/import-export/export/exporter.js +202 -0
- package/core/server/services/members/import-export/export/exporter.ts +325 -0
- package/core/server/services/members/import-export/import/completion-email.js +65 -0
- package/core/server/services/members/import-export/import/completion-email.ts +119 -0
- package/core/server/services/members/import-export/import/importer.js +276 -0
- package/core/server/services/members/import-export/import/importer.ts +430 -0
- package/core/server/services/members/import-export/import/reader.js +32 -0
- package/core/server/services/members/import-export/import/reader.ts +33 -0
- package/core/server/services/members/import-export/import/row.js +33 -0
- package/core/server/services/members/import-export/import/row.ts +52 -0
- package/core/server/services/members/import-export/import/spool.js +30 -0
- package/core/server/services/members/import-export/import/spool.ts +38 -0
- package/core/server/services/members/import-export/index.js +90 -0
- package/core/server/services/members/import-export/index.ts +118 -0
- package/core/server/services/members/members-api/controllers/router-controller.js +7 -0
- package/core/server/services/members/members-api/members-api.js +4 -2
- package/core/server/services/members/members-api/repositories/event-repository.js +13 -2
- package/core/server/services/members/members-api/services/member-bread-service.js +42 -19
- package/core/server/services/members/middleware.js +1 -1
- package/core/server/services/members/service.js +28 -17
- package/core/server/services/members/stripe-connect.js +1 -1
- package/core/server/services/members-custom-fields/actions.js +3 -0
- package/core/server/services/members-custom-fields/actions.ts +6 -2
- package/core/server/services/members-custom-fields/config.js +34 -0
- package/core/server/services/members-custom-fields/config.ts +38 -0
- package/core/server/services/members-custom-fields/definitions-service.js +156 -21
- package/core/server/services/members-custom-fields/definitions-service.ts +170 -25
- package/core/server/services/members-custom-fields/index.js +16 -3
- package/core/server/services/members-custom-fields/index.ts +17 -3
- package/core/server/services/members-custom-fields/values-service.js +56 -10
- package/core/server/services/members-custom-fields/values-service.ts +62 -10
- package/core/server/services/mentions/mention-sending-service.js +22 -2
- package/core/server/services/mentions/service.js +21 -5
- package/core/server/services/newsletters/index.js +1 -1
- package/core/server/services/oembed/oembed-service.js +122 -33
- package/core/server/services/oembed/service.js +4 -2
- package/core/server/services/offers/service.js +1 -1
- package/core/server/services/post-scheduling/index.js +4 -3
- package/core/server/services/post-scheduling/index.ts +4 -3
- package/core/server/services/post-scheduling/post-scheduling.js +1 -1
- package/core/server/services/post-scheduling/post-scheduling.ts +1 -1
- package/core/server/services/posts/post-email-handler.js +13 -6
- package/core/server/services/posts/post-scheduling.js +1 -1
- package/core/server/services/posts/posts-exporter.js +6 -4
- package/core/server/services/posts/posts-service-instance.js +1 -1
- package/core/server/services/posts/posts-service.js +4 -4
- package/core/server/services/posts-public/service.js +1 -1
- package/core/server/services/public-config/site.js +1 -1
- package/core/server/services/recommendations/recommendation-service-wrapper.js +1 -1
- package/core/server/services/recommendations/service/libraries.d.ts +0 -2
- package/core/server/services/route-settings/dynamic-routing-service.js +2 -3
- package/core/server/services/route-settings/index.js +1 -1
- package/core/server/services/route-settings/route-settings-parser.js +134 -124
- package/core/server/services/route-settings/route-settings-parser.ts +160 -125
- package/core/server/services/route-settings/validation-errors.js +178 -0
- package/core/server/services/route-settings/validation-errors.ts +196 -0
- package/core/server/services/settings/settings-service.js +2 -2
- package/core/server/services/settings-helpers/index.js +1 -1
- package/core/server/services/slack-notifications/service.js +1 -1
- package/core/server/services/slack-ping/constants.js +16 -0
- package/core/server/services/slack-ping/constants.ts +15 -0
- package/core/server/services/slack-ping/index.js +26 -204
- package/core/server/services/slack-ping/index.ts +35 -0
- package/core/server/services/slack-ping/slack-ping-service.js +214 -0
- package/core/server/services/slack-ping/slack-ping-service.ts +296 -0
- package/core/server/services/staff/index.js +1 -1
- package/core/server/services/stats/posts-stats-service.js +1 -1
- package/core/server/services/stats/service.js +1 -1
- package/core/server/services/stripe/service.js +1 -1
- package/core/server/services/tags-public/service.js +1 -1
- package/core/server/services/themes/storage.js +9 -0
- package/core/server/services/themes/theme-storage.js +1 -1
- package/core/server/services/themes/validate.js +1 -1
- package/core/server/services/update-check/index.js +1 -1
- package/core/server/services/url/lazy-url-service.js +66 -6
- package/core/server/services/url/lazy-url-service.ts +73 -6
- package/core/server/services/url/url-generator.js +1 -1
- package/core/server/services/url/url-service-facade.js +68 -3
- package/core/server/services/url/url-service-facade.ts +79 -4
- package/core/server/services/url/url-service.js +1 -1
- package/core/server/services/url/urls.js +1 -1
- package/core/server/services/webhooks/index.js +19 -2
- package/core/server/services/webhooks/listen.js +6 -11
- package/core/server/services/webhooks/payload.js +1 -3
- package/core/server/services/webhooks/serialize.js +16 -1
- package/core/server/web/admin/app.js +1 -1
- package/core/server/web/admin/middleware/redirect-admin-urls.js +1 -1
- package/core/server/web/api/endpoints/admin/routes.js +1 -0
- package/core/server/web/api/middleware/cors.js +1 -1
- package/core/server/web/api/middleware/upload.js +4 -0
- package/core/server/web/gift-preview/controller.js +1 -1
- package/core/server/web/shared/middleware/redirect-amp-urls.js +1 -1
- package/core/server/web/shared/middleware/uncapitalise.js +2 -2
- package/core/server/web/shared/middleware/url-redirects.js +1 -1
- package/core/shared/config/defaults.json +10 -2
- package/core/shared/config/overrides.json +4 -0
- package/core/shared/express.js +6 -1
- package/core/shared/labs.js +2 -1
- package/core/shared/url-utils.js +19 -15
- package/core/shared/url-utils.ts +20 -0
- package/ghost.js +0 -1
- package/package.json +30 -35
- package/pnpm-lock.yaml +681 -2789
- package/pnpm-workspace.yaml +31 -17
- package/components/tryghost-adapter-base-scheduling-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.0.0.tgz +0 -0
- package/core/built/admin/assets/Combination--5EZGaDs.js +0 -43
- package/core/built/admin/assets/Growth-C0NoKcHQ.js +0 -3
- package/core/built/admin/assets/Newsletters-Ed8kDjdy.js +0 -1
- package/core/built/admin/assets/Overview-CArPgRZt.js +0 -1
- package/core/built/admin/assets/Web-CjjYoVM3.js +0 -2
- package/core/built/admin/assets/account-migration-mfa5mNI9.js +0 -1
- package/core/built/admin/assets/activitypub/inbox-B3rjKMTv.js +0 -1221
- package/core/built/admin/assets/activitypub/layout-jcurg3rU.js +0 -1
- package/core/built/admin/assets/activitypub/use-activity-pub-queries-yqGRcnLn.js +0 -2569
- package/core/built/admin/assets/activitypub/users-CfyHIsTG.js +0 -1316
- package/core/built/admin/assets/automations-DkUnxNdv.js +0 -1
- package/core/built/admin/assets/automations-vjXofmV_.js +0 -1
- package/core/built/admin/assets/bluesky-sharing-T-pO3RcP.js +0 -1
- package/core/built/admin/assets/breadcrumb-CekPYTCn.js +0 -1
- package/core/built/admin/assets/button--i2uMDDn.js +0 -4
- package/core/built/admin/assets/card-CSWz_BXq.js +0 -1
- package/core/built/admin/assets/chart-helpers-C_4Ka_vT.js +0 -1
- package/core/built/admin/assets/chunk.524.8ce2c741473e2f0929dc.js +0 -25
- package/core/built/admin/assets/chunk.582.453459d6228d2955408b.js +0 -27
- package/core/built/admin/assets/code-editor-view-BfkwQto2.js +0 -1
- package/core/built/admin/assets/command-K75Jzs0G.js +0 -1
- package/core/built/admin/assets/comments-BEIi1DH-.js +0 -1
- package/core/built/admin/assets/container-BNXvlcjA.js +0 -1
- package/core/built/admin/assets/data-list-BmK5QMab.js +0 -1
- package/core/built/admin/assets/date-range-select-5sKzwbt7.js +0 -1
- package/core/built/admin/assets/disabled-sources-indicator-L_ssJTNr.js +0 -1
- package/core/built/admin/assets/dist-BBIJuyPg.js +0 -1
- package/core/built/admin/assets/dist-BHE0dp6o.js +0 -1
- package/core/built/admin/assets/dist-CT46_f_J.js +0 -1
- package/core/built/admin/assets/dist-DW0QXQO3.js +0 -1
- package/core/built/admin/assets/dist-DxFLceO5.js +0 -1
- package/core/built/admin/assets/dist-QcACAOAD.js +0 -1
- package/core/built/admin/assets/dist-duxRDcQu.js +0 -177
- package/core/built/admin/assets/domain-CLaPZ9Rc.js +0 -1
- package/core/built/admin/assets/dropzone-E0bSX4_a.js +0 -5
- package/core/built/admin/assets/edit-profile-DqNPKaA4.js +0 -1
- package/core/built/admin/assets/editor-CkLXQDRp.js +0 -8
- package/core/built/admin/assets/empty-indicator-BTtOlgIo.js +0 -1
- package/core/built/admin/assets/esm-TSfGW7nz.js +0 -2
- package/core/built/admin/assets/explore-BEstLxKr.js +0 -1
- package/core/built/admin/assets/feed-C58p2voG.js +0 -1
- package/core/built/admin/assets/field-BSbDUHPv.js +0 -1
- package/core/built/admin/assets/filters-BgYv8Gt7.js +0 -1
- package/core/built/admin/assets/filters-DvenFkmK.js +0 -1
- package/core/built/admin/assets/framework-provider-jQktxm9P.js +0 -4
- package/core/built/admin/assets/ghost-dark-8590dea6cd695ff90f27d262c4464538.css +0 -1
- package/core/built/admin/assets/gift-link-modal-BPjXkEFt.js +0 -1
- package/core/built/admin/assets/growth-D4JNiVTe.js +0 -1
- package/core/built/admin/assets/hooks-Cjxexi_I.js +0 -2
- package/core/built/admin/assets/index-BacwlcOy.js +0 -67
- package/core/built/admin/assets/index-DxRNHH0o.css +0 -1
- package/core/built/admin/assets/inline-C22rnPro.js +0 -1
- package/core/built/admin/assets/input-group-CKfrILLP.js +0 -1
- package/core/built/admin/assets/jsx-runtime-CtMZ-PAS.js +0 -1
- package/core/built/admin/assets/kpi-card-DZxQKAIb.js +0 -1
- package/core/built/admin/assets/kpi-card-FidQ5zg3.js +0 -1
- package/core/built/admin/assets/kpi-helpers-C5T8Vaf1.js +0 -1
- package/core/built/admin/assets/kpi-tabs-_VRK6hGV.js +0 -1
- package/core/built/admin/assets/label-Cza7hPgn.js +0 -1
- package/core/built/admin/assets/label-picker-DgC_zLaw.js +0 -1
- package/core/built/admin/assets/layout-BxsXnKFX.js +0 -1
- package/core/built/admin/assets/limit-service-CTurluJQ.js +0 -20
- package/core/built/admin/assets/link-helpers-C3Gqy2cz.js +0 -1
- package/core/built/admin/assets/list-page-BtqCnow_.js +0 -1
- package/core/built/admin/assets/member-custom-fields-9uXFBqSt.js +0 -1
- package/core/built/admin/assets/member-detail-Dq6ZDIxo.js +0 -1
- package/core/built/admin/assets/members-CUWD9jal.js +0 -10
- package/core/built/admin/assets/modals-CIdwHVga.js +0 -31
- package/core/built/admin/assets/moderation-DTt04UDA.js +0 -1
- package/core/built/admin/assets/newsletter-cC8vcc9h.js +0 -1
- package/core/built/admin/assets/note-DZU0IY9e.js +0 -1
- package/core/built/admin/assets/notifications-NoHpBHJ4.js +0 -1
- package/core/built/admin/assets/nql-lang-CvCSOQG3.js +0 -19
- package/core/built/admin/assets/onboarding-route-Deg2hNm8.js +0 -1
- package/core/built/admin/assets/overview-BQPt_9w3.js +0 -1
- package/core/built/admin/assets/page-header-D6bEqPo2.js +0 -1
- package/core/built/admin/assets/post-analytics-header-BPw_B2_D.js +0 -1
- package/core/built/admin/assets/post-analytics-kp2_--XO.js +0 -1
- package/core/built/admin/assets/post-share-modal-Cave3Z4W.js +0 -1
- package/core/built/admin/assets/preferences-C7h3j_uy.js +0 -5
- package/core/built/admin/assets/profile-B2x4q2oB.js +0 -1
- package/core/built/admin/assets/router-provider-5fsX1CYn.js +0 -1
- package/core/built/admin/assets/select-PhPjIBBT.js +0 -1
- package/core/built/admin/assets/settings-D5P9Gwgo.js +0 -6
- package/core/built/admin/assets/settings-zUOzQV5I.js +0 -1
- package/core/built/admin/assets/share-modal-EfpfbuWF.js +0 -1
- package/core/built/admin/assets/social-urls-DgAF08Xc.js +0 -18
- package/core/built/admin/assets/sort-button-WOQYJm2H.js +0 -1
- package/core/built/admin/assets/source-icon-hm8Cj-Gx.js +0 -1
- package/core/built/admin/assets/stats-CnQDb62m.js +0 -1
- package/core/built/admin/assets/stats-view-CCfTJgSe.js +0 -1
- package/core/built/admin/assets/step-1-BGlhY4DS.js +0 -1
- package/core/built/admin/assets/step-2-D3sDEyFH.js +0 -1
- package/core/built/admin/assets/step-3-CvZoUdsc.js +0 -2
- package/core/built/admin/assets/switch-CNjkOmwz.js +0 -1
- package/core/built/admin/assets/table-C5nZYPnW.js +0 -1
- package/core/built/admin/assets/tabs-dtOcExye.js +0 -1
- package/core/built/admin/assets/tags-Dhm0FB_g.js +0 -1
- package/core/built/admin/assets/textarea-CeKw3wmV.js +0 -1
- package/core/built/admin/assets/toggle-group-DfhZIMTW.js +0 -1
- package/core/built/admin/assets/topic-filter-Cxe1Il41.js +0 -1
- package/core/built/admin/assets/typeof-Ca-duI-z.js +0 -1
- package/core/built/admin/assets/use-filter-params-Bub6BqNy.js +0 -1
- package/core/built/admin/assets/use-growth-stats-BJORomv0.js +0 -1
- package/core/built/admin/assets/use-reply-chain-data-B89YjVoo.js +0 -1
- package/core/built/admin/assets/use-simple-pagination-BL2SYXKi.js +0 -1
- package/core/built/admin/assets/virtual-list-DNJOSK9I.js +0 -1
- package/core/built/admin/assets/web-BHUE3YQc.js +0 -1
- package/core/server/adapters/scheduling/scheduling-base.js +0 -5
- package/core/server/adapters/sso/SSOBase.js +0 -5
- package/core/server/adapters/storage/index.js +0 -17
- package/core/server/services/mail/templates/newsletter.html +0 -876
- package/core/server/services/members/exporter/query.js +0 -206
- package/core/server/services/members/importer/index.js +0 -30
- package/core/server/services/members/importer/labels.js +0 -125
- package/core/server/services/members/importer/members-csv-importer.js +0 -502
- /package/core/server/services/members/{importer → import-export/import}/email-template.js +0 -0
- /package/core/server/services/members/{importer/members-csv-importer-stripe-utils.js → import-export/import/stripe-utils.js} +0 -0
|
@@ -1,37 +1,43 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {StorageBase} from 'ghost-storage-base';
|
|
2
2
|
import {SchedulingBase} from '@tryghost/adapter-base-scheduling';
|
|
3
3
|
import {SSOBase} from '@tryghost/adapter-base-sso';
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import {CacheBase} from '@tryghost/adapter-base-cache';
|
|
5
|
+
import {RedirectsStoreBase} from '@tryghost/adapter-base-redirects';
|
|
6
|
+
import {RouteSettingsStoreBase} from '@tryghost/adapter-base-route-settings';
|
|
7
7
|
|
|
8
8
|
import {AdapterManager} from './adapter-manager';
|
|
9
9
|
import config from '../../../shared/config';
|
|
10
10
|
|
|
11
|
+
const adapterPaths = new Set<string>([
|
|
12
|
+
'', // A blank path will cause us to check node_modules for the adapter
|
|
13
|
+
config.get('paths').internalAdaptersPath,
|
|
14
|
+
|
|
15
|
+
// custom docker builds may install adapters in a separate path from content,
|
|
16
|
+
// since the content dir is often bind-mounted into the container. Offering
|
|
17
|
+
// an escape hatch here to allow for this
|
|
18
|
+
config.get('paths').installedAdaptersPath ?? '',
|
|
19
|
+
|
|
20
|
+
// load adapters from content last, so that they don't override any other
|
|
21
|
+
// internal or platform-installed adapters
|
|
22
|
+
// TODO: potentially deprecate/remove as part of Ghost 7.0
|
|
23
|
+
config.getContentPath('adapters'),
|
|
24
|
+
]);
|
|
25
|
+
|
|
11
26
|
// A singleton adapter manager, preconfigured with the base classes for every
|
|
12
27
|
// known adapter type. `getAdapter` resolves the active adapter and its options
|
|
13
28
|
// from config on each call, so runtime config changes are always reflected.
|
|
14
29
|
const adapterManager = new AdapterManager({
|
|
15
30
|
loadAdapterFromPath: require,
|
|
16
31
|
config,
|
|
17
|
-
pathsToAdapters:
|
|
18
|
-
'', // A blank path will cause us to check node_modules for the adapter
|
|
19
|
-
config.getContentPath('adapters'),
|
|
20
|
-
config.get('paths').internalAdaptersPath
|
|
21
|
-
],
|
|
32
|
+
pathsToAdapters: Array.from(adapterPaths),
|
|
22
33
|
baseClasses: {
|
|
23
|
-
storage:
|
|
34
|
+
storage: StorageBase,
|
|
24
35
|
scheduling: SchedulingBase,
|
|
25
36
|
sso: SSOBase,
|
|
26
|
-
cache:
|
|
37
|
+
cache: CacheBase,
|
|
27
38
|
redirects: RedirectsStoreBase,
|
|
28
39
|
'route-settings': RouteSettingsStoreBase
|
|
29
40
|
}
|
|
30
41
|
});
|
|
31
42
|
|
|
32
|
-
|
|
33
|
-
// consumers keep `require(...).getAdapter` access AND tests can stub methods
|
|
34
|
-
// with sinon — ESM named exports compile to immutable bindings that sinon
|
|
35
|
-
// cannot stub. Using `module.exports` directly (not `export =`) keeps this
|
|
36
|
-
// compatible with the erasableSyntaxOnly compiler option.
|
|
37
|
-
module.exports = adapterManager;
|
|
43
|
+
export default adapterManager;
|
|
@@ -1,9 +1,106 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveAdapterEntryPoint = resolveAdapterEntryPoint;
|
|
3
7
|
exports.resolveAdapterExport = resolveAdapterExport;
|
|
4
8
|
exports.normalizeAdapterConfig = normalizeAdapterConfig;
|
|
5
9
|
exports.getConfiguredFeatures = getConfiguredFeatures;
|
|
6
10
|
exports.resolveAdapterOptions = resolveAdapterOptions;
|
|
11
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
+
const node_module_1 = require("node:module");
|
|
14
|
+
/**
|
|
15
|
+
* Whether `filePath` resolves to a location inside `directory`.
|
|
16
|
+
*
|
|
17
|
+
* Both sides are resolved through `fs.realpathSync` before comparing, because
|
|
18
|
+
* Node's module resolution returns realpaths — so a symlinked install (or macOS'
|
|
19
|
+
* `/var` -> `/private/var`) would otherwise look like an escape.
|
|
20
|
+
*/
|
|
21
|
+
function isContainedBy(filePath, directory) {
|
|
22
|
+
let realFilePath;
|
|
23
|
+
let realDirectory;
|
|
24
|
+
try {
|
|
25
|
+
realFilePath = node_fs_1.default.realpathSync(filePath);
|
|
26
|
+
realDirectory = node_fs_1.default.realpathSync(directory);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const relative = node_path_1.default.relative(realDirectory, realFilePath);
|
|
32
|
+
// Compare the first segment exactly rather than using startsWith('..'), so
|
|
33
|
+
// a legitimately-contained entry whose name merely begins with dots (e.g.
|
|
34
|
+
// "..hidden.js") isn't mistaken for traversal.
|
|
35
|
+
const [firstSegment] = relative.split(node_path_1.default.sep);
|
|
36
|
+
return relative !== '' && firstSegment !== '..' && !node_path_1.default.isAbsolute(relative);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Map a candidate adapter path to the module Node should actually load.
|
|
40
|
+
*
|
|
41
|
+
* An adapter installed into `content/adapters` can be a full module directory
|
|
42
|
+
* with its own `package.json`. Node's CommonJS directory resolution honours
|
|
43
|
+
* `main` but ignores `exports` — per spec, `exports` applies only to package
|
|
44
|
+
* specifiers resolved through `node_modules`, never to directory paths — so a
|
|
45
|
+
* package declaring only `exports` would otherwise fail to resolve.
|
|
46
|
+
*
|
|
47
|
+
* We get native `exports` resolution by self-referencing: because the referrer
|
|
48
|
+
* we hand to `createRequire` sits inside the package, requiring the package by
|
|
49
|
+
* its own `name` makes Node resolve through that package's own `exports` field,
|
|
50
|
+
* applying conditions, nesting and subpath rules for us.
|
|
51
|
+
*
|
|
52
|
+
* Anything that isn't a self-referencing module directory — a bare
|
|
53
|
+
* `node_modules` specifier, a plain `index.js` adapter directory, or a package
|
|
54
|
+
* declaring only `main` — is returned untouched so Node's own resolution
|
|
55
|
+
* applies, preserving the behaviour of pre-existing adapters.
|
|
56
|
+
*
|
|
57
|
+
* @NOTE: `require` matches the `require`, `node` and `default` conditions but
|
|
58
|
+
* never `import`, and that isn't overridable (`--conditions` only adds custom
|
|
59
|
+
* conditions). So an ESM-only package whose root export is conditioned solely on
|
|
60
|
+
* `import` (`{".": {"import": "./dist/index.js"}}`) is not resolvable here, even
|
|
61
|
+
* though `require()` would happily load the file it points at. Such a package
|
|
62
|
+
* needs a `require`, `node`, `default` or unconditioned target. Lifting this
|
|
63
|
+
* would mean reading the `exports` field ourselves.
|
|
64
|
+
*/
|
|
65
|
+
function resolveAdapterEntryPoint(pathToAdapter) {
|
|
66
|
+
// The node_modules lane passes a bare specifier rather than a path — Node
|
|
67
|
+
// already applies `exports` to those — and a relative read here would be
|
|
68
|
+
// resolved against the cwd, so only absolute directories are considered.
|
|
69
|
+
if (!node_path_1.default.isAbsolute(pathToAdapter)) {
|
|
70
|
+
return pathToAdapter;
|
|
71
|
+
}
|
|
72
|
+
const manifestPath = node_path_1.default.join(pathToAdapter, 'package.json');
|
|
73
|
+
let name;
|
|
74
|
+
try {
|
|
75
|
+
({ name } = JSON.parse(node_fs_1.default.readFileSync(manifestPath, 'utf8')));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Not a module directory, or an unreadable/malformed manifest.
|
|
79
|
+
return pathToAdapter;
|
|
80
|
+
}
|
|
81
|
+
// Self-referencing requires a package name to reference.
|
|
82
|
+
if (typeof name !== 'string' || !name) {
|
|
83
|
+
return pathToAdapter;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const resolved = (0, node_module_1.createRequire)(manifestPath).resolve(name);
|
|
87
|
+
// Self-referencing only kicks in when the package declares `exports`.
|
|
88
|
+
// Without it, Node falls back to walking `node_modules` up the tree and
|
|
89
|
+
// can resolve a *different*, same-named package from elsewhere in the
|
|
90
|
+
// install — silently loading an impostor instead of the operator's
|
|
91
|
+
// adapter. Only accept a result that actually lives in the adapter
|
|
92
|
+
// directory; anything else falls back to Node's directory resolution.
|
|
93
|
+
if (!isContainedBy(resolved, pathToAdapter)) {
|
|
94
|
+
return pathToAdapter;
|
|
95
|
+
}
|
|
96
|
+
return resolved;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// No usable `exports` entry — fall back to Node's directory resolution,
|
|
100
|
+
// which still handles `main` and `index.js`.
|
|
101
|
+
return pathToAdapter;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
7
104
|
/**
|
|
8
105
|
* Resolve an adapter export to a constructor function, handling both CommonJS and ES module formats.
|
|
9
106
|
*/
|
|
@@ -34,19 +131,23 @@ function getSchedulingConfig(config) {
|
|
|
34
131
|
}
|
|
35
132
|
return adapterConfig;
|
|
36
133
|
}
|
|
37
|
-
function
|
|
134
|
+
function normalizeAdapterPaths(config, key, defaultPathsByAdapter) {
|
|
38
135
|
const adapterConfig = config.get(`adapters:${key}`);
|
|
39
|
-
if (!adapterConfig
|
|
136
|
+
if (!adapterConfig) {
|
|
40
137
|
return adapterConfig;
|
|
41
138
|
}
|
|
42
|
-
const
|
|
43
|
-
for (const [
|
|
44
|
-
|
|
139
|
+
const normalized = { ...adapterConfig };
|
|
140
|
+
for (const [adapterClassName, defaultPaths] of Object.entries(defaultPathsByAdapter)) {
|
|
141
|
+
if (!normalized[adapterClassName]) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const storeConfig = { ...normalized[adapterClassName] };
|
|
145
|
+
for (const [pathName, defaultPath] of Object.entries(defaultPaths)) {
|
|
146
|
+
storeConfig[pathName] ||= defaultPath;
|
|
147
|
+
}
|
|
148
|
+
normalized[adapterClassName] = storeConfig;
|
|
45
149
|
}
|
|
46
|
-
return
|
|
47
|
-
...adapterConfig,
|
|
48
|
-
FileStore: fileStoreConfig
|
|
49
|
-
};
|
|
150
|
+
return normalized;
|
|
50
151
|
}
|
|
51
152
|
/**
|
|
52
153
|
* Normalize adapter config by ensuring that feature-specific adapter configs
|
|
@@ -58,12 +159,21 @@ function normalizeAdapterConfig(config) {
|
|
|
58
159
|
...adapterConfig,
|
|
59
160
|
storage: adapterConfig?.storage ?? config.get('storage'),
|
|
60
161
|
scheduling: getSchedulingConfig(config),
|
|
61
|
-
redirects:
|
|
62
|
-
|
|
162
|
+
redirects: normalizeAdapterPaths(config, 'redirects', {
|
|
163
|
+
FileStore: {
|
|
164
|
+
basePath: config.getContentPath('data')
|
|
165
|
+
}
|
|
63
166
|
}),
|
|
64
|
-
'route-settings':
|
|
65
|
-
|
|
66
|
-
|
|
167
|
+
'route-settings': normalizeAdapterPaths(config, 'route-settings', {
|
|
168
|
+
FileStore: {
|
|
169
|
+
basePath: config.getContentPath('settings'),
|
|
170
|
+
defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
|
|
171
|
+
},
|
|
172
|
+
// The S3 store reads the bundled defaults off disk too, for the
|
|
173
|
+
// empty-state response when the bucket holds no routes.yaml yet.
|
|
174
|
+
S3RouteSettingsStore: {
|
|
175
|
+
defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
|
|
176
|
+
}
|
|
67
177
|
}),
|
|
68
178
|
};
|
|
69
179
|
}
|
|
@@ -1,6 +1,108 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import {createRequire} from 'node:module';
|
|
1
4
|
import type {AdapterConstructor} from "./types";
|
|
2
5
|
import type {ConfigInstance} from '../../../shared/config/loader';
|
|
3
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Whether `filePath` resolves to a location inside `directory`.
|
|
9
|
+
*
|
|
10
|
+
* Both sides are resolved through `fs.realpathSync` before comparing, because
|
|
11
|
+
* Node's module resolution returns realpaths — so a symlinked install (or macOS'
|
|
12
|
+
* `/var` -> `/private/var`) would otherwise look like an escape.
|
|
13
|
+
*/
|
|
14
|
+
function isContainedBy(filePath: string, directory: string): boolean {
|
|
15
|
+
let realFilePath: string;
|
|
16
|
+
let realDirectory: string;
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
realFilePath = fs.realpathSync(filePath);
|
|
20
|
+
realDirectory = fs.realpathSync(directory);
|
|
21
|
+
} catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const relative = path.relative(realDirectory, realFilePath);
|
|
26
|
+
|
|
27
|
+
// Compare the first segment exactly rather than using startsWith('..'), so
|
|
28
|
+
// a legitimately-contained entry whose name merely begins with dots (e.g.
|
|
29
|
+
// "..hidden.js") isn't mistaken for traversal.
|
|
30
|
+
const [firstSegment] = relative.split(path.sep);
|
|
31
|
+
|
|
32
|
+
return relative !== '' && firstSegment !== '..' && !path.isAbsolute(relative);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Map a candidate adapter path to the module Node should actually load.
|
|
37
|
+
*
|
|
38
|
+
* An adapter installed into `content/adapters` can be a full module directory
|
|
39
|
+
* with its own `package.json`. Node's CommonJS directory resolution honours
|
|
40
|
+
* `main` but ignores `exports` — per spec, `exports` applies only to package
|
|
41
|
+
* specifiers resolved through `node_modules`, never to directory paths — so a
|
|
42
|
+
* package declaring only `exports` would otherwise fail to resolve.
|
|
43
|
+
*
|
|
44
|
+
* We get native `exports` resolution by self-referencing: because the referrer
|
|
45
|
+
* we hand to `createRequire` sits inside the package, requiring the package by
|
|
46
|
+
* its own `name` makes Node resolve through that package's own `exports` field,
|
|
47
|
+
* applying conditions, nesting and subpath rules for us.
|
|
48
|
+
*
|
|
49
|
+
* Anything that isn't a self-referencing module directory — a bare
|
|
50
|
+
* `node_modules` specifier, a plain `index.js` adapter directory, or a package
|
|
51
|
+
* declaring only `main` — is returned untouched so Node's own resolution
|
|
52
|
+
* applies, preserving the behaviour of pre-existing adapters.
|
|
53
|
+
*
|
|
54
|
+
* @NOTE: `require` matches the `require`, `node` and `default` conditions but
|
|
55
|
+
* never `import`, and that isn't overridable (`--conditions` only adds custom
|
|
56
|
+
* conditions). So an ESM-only package whose root export is conditioned solely on
|
|
57
|
+
* `import` (`{".": {"import": "./dist/index.js"}}`) is not resolvable here, even
|
|
58
|
+
* though `require()` would happily load the file it points at. Such a package
|
|
59
|
+
* needs a `require`, `node`, `default` or unconditioned target. Lifting this
|
|
60
|
+
* would mean reading the `exports` field ourselves.
|
|
61
|
+
*/
|
|
62
|
+
export function resolveAdapterEntryPoint(pathToAdapter: string): string {
|
|
63
|
+
// The node_modules lane passes a bare specifier rather than a path — Node
|
|
64
|
+
// already applies `exports` to those — and a relative read here would be
|
|
65
|
+
// resolved against the cwd, so only absolute directories are considered.
|
|
66
|
+
if (!path.isAbsolute(pathToAdapter)) {
|
|
67
|
+
return pathToAdapter;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const manifestPath = path.join(pathToAdapter, 'package.json');
|
|
71
|
+
|
|
72
|
+
let name: unknown;
|
|
73
|
+
try {
|
|
74
|
+
({name} = JSON.parse(fs.readFileSync(manifestPath, 'utf8')));
|
|
75
|
+
} catch {
|
|
76
|
+
// Not a module directory, or an unreadable/malformed manifest.
|
|
77
|
+
return pathToAdapter;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Self-referencing requires a package name to reference.
|
|
81
|
+
if (typeof name !== 'string' || !name) {
|
|
82
|
+
return pathToAdapter;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
const resolved = createRequire(manifestPath).resolve(name);
|
|
87
|
+
|
|
88
|
+
// Self-referencing only kicks in when the package declares `exports`.
|
|
89
|
+
// Without it, Node falls back to walking `node_modules` up the tree and
|
|
90
|
+
// can resolve a *different*, same-named package from elsewhere in the
|
|
91
|
+
// install — silently loading an impostor instead of the operator's
|
|
92
|
+
// adapter. Only accept a result that actually lives in the adapter
|
|
93
|
+
// directory; anything else falls back to Node's directory resolution.
|
|
94
|
+
if (!isContainedBy(resolved, pathToAdapter)) {
|
|
95
|
+
return pathToAdapter;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return resolved;
|
|
99
|
+
} catch {
|
|
100
|
+
// No usable `exports` entry — fall back to Node's directory resolution,
|
|
101
|
+
// which still handles `main` and `index.js`.
|
|
102
|
+
return pathToAdapter;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
4
106
|
/**
|
|
5
107
|
* Resolve an adapter export to a constructor function, handling both CommonJS and ES module formats.
|
|
6
108
|
*/
|
|
@@ -37,21 +139,26 @@ function getSchedulingConfig(config: ConfigInstance) {
|
|
|
37
139
|
return adapterConfig;
|
|
38
140
|
}
|
|
39
141
|
|
|
40
|
-
function
|
|
142
|
+
function normalizeAdapterPaths(config: ConfigInstance, key: 'redirects' | 'route-settings', defaultPathsByAdapter: Record<string, Record<string, string>>) {
|
|
41
143
|
const adapterConfig = config.get(`adapters:${key}`);
|
|
42
|
-
if (!adapterConfig
|
|
144
|
+
if (!adapterConfig) {
|
|
43
145
|
return adapterConfig;
|
|
44
146
|
}
|
|
45
147
|
|
|
46
|
-
const
|
|
47
|
-
for (const [
|
|
48
|
-
|
|
49
|
-
|
|
148
|
+
const normalized = {...adapterConfig};
|
|
149
|
+
for (const [adapterClassName, defaultPaths] of Object.entries(defaultPathsByAdapter)) {
|
|
150
|
+
if (!normalized[adapterClassName]) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
50
153
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
154
|
+
const storeConfig = {...normalized[adapterClassName]};
|
|
155
|
+
for (const [pathName, defaultPath] of Object.entries(defaultPaths)) {
|
|
156
|
+
storeConfig[pathName] ||= defaultPath;
|
|
157
|
+
}
|
|
158
|
+
normalized[adapterClassName] = storeConfig;
|
|
54
159
|
}
|
|
160
|
+
|
|
161
|
+
return normalized;
|
|
55
162
|
}
|
|
56
163
|
|
|
57
164
|
/**
|
|
@@ -65,12 +172,21 @@ export function normalizeAdapterConfig(config: ConfigInstance) {
|
|
|
65
172
|
...adapterConfig,
|
|
66
173
|
storage: adapterConfig?.storage ?? config.get('storage'),
|
|
67
174
|
scheduling: getSchedulingConfig(config),
|
|
68
|
-
redirects:
|
|
69
|
-
|
|
175
|
+
redirects: normalizeAdapterPaths(config, 'redirects', {
|
|
176
|
+
FileStore: {
|
|
177
|
+
basePath: config.getContentPath('data')
|
|
178
|
+
}
|
|
70
179
|
}),
|
|
71
|
-
'route-settings':
|
|
72
|
-
|
|
73
|
-
|
|
180
|
+
'route-settings': normalizeAdapterPaths(config, 'route-settings', {
|
|
181
|
+
FileStore: {
|
|
182
|
+
basePath: config.getContentPath('settings'),
|
|
183
|
+
defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
|
|
184
|
+
},
|
|
185
|
+
// The S3 store reads the bundled defaults off disk too, for the
|
|
186
|
+
// empty-state response when the bucket holds no routes.yaml yet.
|
|
187
|
+
S3RouteSettingsStore: {
|
|
188
|
+
defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
|
|
189
|
+
}
|
|
74
190
|
}),
|
|
75
191
|
}
|
|
76
192
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const legacyApiPathMatch = require('./legacy-api-path-match');
|
|
2
|
-
const urlUtils = require('../../../shared/url-utils');
|
|
2
|
+
const urlUtils = require('../../../shared/url-utils').default;
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* If there is a version in the URL, and this is a valid API URL containing admin/content
|
|
@@ -5,7 +5,7 @@ const tpl = require('@tryghost/tpl');
|
|
|
5
5
|
const moment = require('moment');
|
|
6
6
|
|
|
7
7
|
const models = require('../../models');
|
|
8
|
-
const urlUtils = require('../../../shared/url-utils');
|
|
8
|
+
const urlUtils = require('../../../shared/url-utils').default;
|
|
9
9
|
const mail = require('../mail');
|
|
10
10
|
|
|
11
11
|
const messages = {
|
|
@@ -3,7 +3,7 @@ const session = require('express-session');
|
|
|
3
3
|
const config = require('../../../../shared/config');
|
|
4
4
|
const settingsCache = require('../../../../shared/settings-cache');
|
|
5
5
|
const models = require('../../../models');
|
|
6
|
-
const urlUtils = require('../../../../shared/url-utils');
|
|
6
|
+
const urlUtils = require('../../../../shared/url-utils').default;
|
|
7
7
|
|
|
8
8
|
const SessionStore = require('./session-store');
|
|
9
9
|
const sessionStore = new SessionStore(models.Session);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const adapterManager = require('../../adapter-manager');
|
|
1
|
+
const adapterManager = require('../../adapter-manager').default;
|
|
2
2
|
const createSessionService = require('./session-service');
|
|
3
3
|
const sessionFromToken = require('./session-from-token');
|
|
4
4
|
const createSessionMiddleware = require('./middleware');
|
|
@@ -9,7 +9,7 @@ const {t} = require('../../i18n');
|
|
|
9
9
|
const expressSession = require('./express-session');
|
|
10
10
|
|
|
11
11
|
const models = require('../../../models');
|
|
12
|
-
const urlUtils = require('../../../../shared/url-utils');
|
|
12
|
+
const urlUtils = require('../../../../shared/url-utils').default;
|
|
13
13
|
const config = require('../../../../shared/config');
|
|
14
14
|
const {blogIcon} = require('../../../lib/image');
|
|
15
15
|
const url = require('url');
|
|
@@ -58,7 +58,7 @@ const AUTH_CODE_CHALLENGE_BYTES = 16;
|
|
|
58
58
|
* @param {() => string} deps.getBlogLogo
|
|
59
59
|
* @param {import('../../mail').GhostMailer} deps.mailer
|
|
60
60
|
* @param {import('../../i18n').t} deps.t
|
|
61
|
-
* @param {import('../../../../shared/url-utils')} deps.urlUtils
|
|
61
|
+
* @param {import('../../../../shared/url-utils').default} deps.urlUtils
|
|
62
62
|
* @param {() => boolean} deps.isStaffDeviceVerificationDisabled
|
|
63
63
|
* @returns {SessionService}
|
|
64
64
|
*/
|
|
@@ -208,7 +208,34 @@ module.exports = function createSessionService({
|
|
|
208
208
|
* @returns {Promise<void>}
|
|
209
209
|
*/
|
|
210
210
|
async function createSessionForUser(req, res, user) {
|
|
211
|
-
const
|
|
211
|
+
const previousSession = await getSession(req, res);
|
|
212
|
+
|
|
213
|
+
// Carried over to the new session so verification state survives login
|
|
214
|
+
const {
|
|
215
|
+
user_id: previousUserId,
|
|
216
|
+
verified: previousVerified,
|
|
217
|
+
auth_code_challenge: previousAuthCodeChallenge,
|
|
218
|
+
auth_code_generated_at: previousAuthCodeGeneratedAt
|
|
219
|
+
} = previousSession;
|
|
220
|
+
|
|
221
|
+
// Ensure a new session is always created
|
|
222
|
+
await new Promise((resolve, reject) => {
|
|
223
|
+
req.session.regenerate((err) => {
|
|
224
|
+
if (err) {
|
|
225
|
+
reject(err);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
resolve();
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
const session = req.session;
|
|
233
|
+
session.user_id = previousUserId;
|
|
234
|
+
// A different user doesn't inherit the previous user's verification
|
|
235
|
+
session.verified = previousUserId && previousUserId !== user.id ? undefined : previousVerified;
|
|
236
|
+
session.auth_code_challenge = previousAuthCodeChallenge;
|
|
237
|
+
session.auth_code_generated_at = previousAuthCodeGeneratedAt;
|
|
238
|
+
|
|
212
239
|
const origin = getOriginOfRequest(req);
|
|
213
240
|
await assignUserToSession({
|
|
214
241
|
session,
|
|
@@ -21,8 +21,6 @@ const bson_objectid_1 = __importDefault(require("bson-objectid"));
|
|
|
21
21
|
const zod_1 = require("zod");
|
|
22
22
|
const database_automations_repository_1 = require("./database-automations-repository");
|
|
23
23
|
const fake_wait_hours_multiplier_1 = require("./fake-wait-hours-multiplier");
|
|
24
|
-
// @ts-expect-error Models currently lack type definitions.
|
|
25
|
-
const models_1 = require("../../models");
|
|
26
24
|
const { knex } = require('../../data/db');
|
|
27
25
|
const domainEvents = require('@tryghost/domain-events');
|
|
28
26
|
const labs = require('../../../shared/labs');
|
|
@@ -49,8 +47,8 @@ const waitActionSchema = zod_1.z.object({
|
|
|
49
47
|
type: zod_1.z.literal('wait'),
|
|
50
48
|
data: zod_1.z.object({
|
|
51
49
|
wait_hours: zod_1.z.number().int().positive()
|
|
52
|
-
})
|
|
53
|
-
})
|
|
50
|
+
})
|
|
51
|
+
});
|
|
54
52
|
const sendEmailActionSchema = zod_1.z.object({
|
|
55
53
|
id: objectIdSchema,
|
|
56
54
|
type: zod_1.z.literal('send_email'),
|
|
@@ -58,12 +56,12 @@ const sendEmailActionSchema = zod_1.z.object({
|
|
|
58
56
|
email_subject: zod_1.z.string(),
|
|
59
57
|
email_lexical: zod_1.z.string(),
|
|
60
58
|
email_design_setting_id: zod_1.z.string().min(1)
|
|
61
|
-
})
|
|
62
|
-
})
|
|
59
|
+
})
|
|
60
|
+
});
|
|
63
61
|
const edgeSchema = zod_1.z.object({
|
|
64
62
|
source_action_id: objectIdSchema,
|
|
65
63
|
target_action_id: objectIdSchema
|
|
66
|
-
})
|
|
64
|
+
});
|
|
67
65
|
const editAutomationDataSchema = zod_1.z.object({
|
|
68
66
|
status: zod_1.z.enum(['active', 'inactive']),
|
|
69
67
|
actions: zod_1.z.array(zod_1.z.discriminatedUnion('type', [
|
|
@@ -71,7 +69,7 @@ const editAutomationDataSchema = zod_1.z.object({
|
|
|
71
69
|
sendEmailActionSchema
|
|
72
70
|
])).min(1).max(MAX_AUTOMATION_ACTIONS),
|
|
73
71
|
edges: zod_1.z.array(edgeSchema)
|
|
74
|
-
})
|
|
72
|
+
});
|
|
75
73
|
const repository = (0, database_automations_repository_1.createDatabaseAutomationsRepository)({
|
|
76
74
|
knex,
|
|
77
75
|
fakeWaitHoursMultiplier: (0, fake_wait_hours_multiplier_1.parseFakeWaitHoursMultiplier)(config.get('automations:fakeWaitHoursMultiplier'))
|
|
@@ -304,23 +302,8 @@ async function markStepTerminal(...args) {
|
|
|
304
302
|
async function retryStep(...args) {
|
|
305
303
|
return await repository.retryStep(...args);
|
|
306
304
|
}
|
|
307
|
-
async function recordEmailSent(
|
|
308
|
-
await
|
|
309
|
-
await models_1.AutomatedEmailRecipient.add({
|
|
310
|
-
member_id: options.memberId,
|
|
311
|
-
member_uuid: options.memberUuid,
|
|
312
|
-
member_email: options.memberEmail,
|
|
313
|
-
member_name: options.memberName,
|
|
314
|
-
automation_action_revision_id: options.automationActionRevisionId,
|
|
315
|
-
...(options.mailgunMessageId ? { mailgun_message_id: options.mailgunMessageId } : {}),
|
|
316
|
-
track_opens: options.trackOpens
|
|
317
|
-
}, { transacting });
|
|
318
|
-
await transacting('automation_action_revisions')
|
|
319
|
-
.where('id', options.automationActionRevisionId)
|
|
320
|
-
.update({
|
|
321
|
-
email_sent_count: transacting.raw('COALESCE(??, 0) + ?', ['email_sent_count', 1])
|
|
322
|
-
});
|
|
323
|
-
});
|
|
305
|
+
async function recordEmailSent(...args) {
|
|
306
|
+
return await repository.recordEmailSent(...args);
|
|
324
307
|
}
|
|
325
308
|
async function getAutomatedEmailRecipientsByMailgunIds(...args) {
|
|
326
309
|
return await repository.getAutomatedEmailRecipientsByMailgunIds(...args);
|
|
@@ -2,15 +2,12 @@ import errors from '@tryghost/errors';
|
|
|
2
2
|
import tpl from '@tryghost/tpl';
|
|
3
3
|
import ObjectId from 'bson-objectid';
|
|
4
4
|
import {z} from 'zod';
|
|
5
|
-
import {type Knex} from 'knex';
|
|
6
5
|
import {createDatabaseAutomationsRepository} from './database-automations-repository';
|
|
7
6
|
import {parseFakeWaitHoursMultiplier} from './fake-wait-hours-multiplier';
|
|
8
7
|
import type {
|
|
9
8
|
AutomationsRepository,
|
|
10
9
|
EditAutomationData
|
|
11
10
|
} from './automations-repository';
|
|
12
|
-
// @ts-expect-error Models currently lack type definitions.
|
|
13
|
-
import {AutomatedEmailRecipient} from '../../models';
|
|
14
11
|
|
|
15
12
|
const {knex} = require('../../data/db');
|
|
16
13
|
const domainEvents = require('@tryghost/domain-events');
|
|
@@ -42,8 +39,8 @@ const waitActionSchema = z.object({
|
|
|
42
39
|
type: z.literal('wait'),
|
|
43
40
|
data: z.object({
|
|
44
41
|
wait_hours: z.number().int().positive()
|
|
45
|
-
})
|
|
46
|
-
})
|
|
42
|
+
})
|
|
43
|
+
});
|
|
47
44
|
|
|
48
45
|
const sendEmailActionSchema = z.object({
|
|
49
46
|
id: objectIdSchema,
|
|
@@ -52,13 +49,13 @@ const sendEmailActionSchema = z.object({
|
|
|
52
49
|
email_subject: z.string(),
|
|
53
50
|
email_lexical: z.string(),
|
|
54
51
|
email_design_setting_id: z.string().min(1)
|
|
55
|
-
})
|
|
56
|
-
})
|
|
52
|
+
})
|
|
53
|
+
});
|
|
57
54
|
|
|
58
55
|
const edgeSchema = z.object({
|
|
59
56
|
source_action_id: objectIdSchema,
|
|
60
57
|
target_action_id: objectIdSchema
|
|
61
|
-
})
|
|
58
|
+
});
|
|
62
59
|
|
|
63
60
|
const editAutomationDataSchema = z.object({
|
|
64
61
|
status: z.enum(['active', 'inactive']),
|
|
@@ -67,7 +64,7 @@ const editAutomationDataSchema = z.object({
|
|
|
67
64
|
sendEmailActionSchema
|
|
68
65
|
])).min(1).max(MAX_AUTOMATION_ACTIONS),
|
|
69
66
|
edges: z.array(edgeSchema)
|
|
70
|
-
})
|
|
67
|
+
});
|
|
71
68
|
|
|
72
69
|
const repository = createDatabaseAutomationsRepository({
|
|
73
70
|
knex,
|
|
@@ -363,34 +360,8 @@ export async function retryStep(...args: Parameters<AutomationsRepository['retry
|
|
|
363
360
|
return await repository.retryStep(...args);
|
|
364
361
|
}
|
|
365
362
|
|
|
366
|
-
export
|
|
367
|
-
|
|
368
|
-
mailgunMessageId?: string;
|
|
369
|
-
memberEmail: string;
|
|
370
|
-
memberId: string;
|
|
371
|
-
memberName: string | null;
|
|
372
|
-
memberUuid: string;
|
|
373
|
-
trackOpens: boolean;
|
|
374
|
-
}>;
|
|
375
|
-
|
|
376
|
-
export async function recordEmailSent(options: RecordEmailSentOptions): Promise<void> {
|
|
377
|
-
await knex.transaction(async (transacting: Knex.Transaction) => {
|
|
378
|
-
await AutomatedEmailRecipient.add({
|
|
379
|
-
member_id: options.memberId,
|
|
380
|
-
member_uuid: options.memberUuid,
|
|
381
|
-
member_email: options.memberEmail,
|
|
382
|
-
member_name: options.memberName,
|
|
383
|
-
automation_action_revision_id: options.automationActionRevisionId,
|
|
384
|
-
...(options.mailgunMessageId ? {mailgun_message_id: options.mailgunMessageId} : {}),
|
|
385
|
-
track_opens: options.trackOpens
|
|
386
|
-
}, {transacting});
|
|
387
|
-
|
|
388
|
-
await transacting('automation_action_revisions')
|
|
389
|
-
.where('id', options.automationActionRevisionId)
|
|
390
|
-
.update({
|
|
391
|
-
email_sent_count: transacting.raw('COALESCE(??, 0) + ?', ['email_sent_count', 1])
|
|
392
|
-
});
|
|
393
|
-
});
|
|
363
|
+
export async function recordEmailSent(...args: Parameters<AutomationsRepository['recordEmailSent']>) {
|
|
364
|
+
return await repository.recordEmailSent(...args);
|
|
394
365
|
}
|
|
395
366
|
|
|
396
367
|
export async function getAutomatedEmailRecipientsByMailgunIds(
|