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,22 +1,22 @@
|
|
|
1
1
|
const request = require('@tryghost/request');
|
|
2
|
-
const urlUtils = require('../../../shared/url-utils');
|
|
3
|
-
const storage = require('../../adapters/storage');
|
|
2
|
+
const urlUtils = require('../../../shared/url-utils').default;
|
|
4
3
|
const storageUtils = require('../../adapters/storage/utils');
|
|
5
4
|
const validator = require('@tryghost/validator');
|
|
6
5
|
const config = require('../../../shared/config');
|
|
7
6
|
const settingsCache = require('../../../shared/settings-cache');
|
|
8
7
|
const ImageUtils = require('./image-utils');
|
|
9
8
|
|
|
10
|
-
const adapterManager = require('../../services/adapter-manager');
|
|
9
|
+
const adapterManager = require('../../services/adapter-manager').default;
|
|
11
10
|
|
|
12
11
|
const cacheStore = adapterManager.getAdapter('cache:imageSizes');
|
|
12
|
+
const imageStore = adapterManager.getAdapter('storage:images');
|
|
13
13
|
|
|
14
14
|
module.exports = new ImageUtils({
|
|
15
15
|
config,
|
|
16
16
|
urlUtils,
|
|
17
17
|
settingsCache,
|
|
18
18
|
storageUtils,
|
|
19
|
-
|
|
19
|
+
imageStore,
|
|
20
20
|
validator,
|
|
21
21
|
request,
|
|
22
22
|
cacheStore
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
const errors = require('@tryghost/errors');
|
|
3
|
-
const urlUtils = require('../../shared/url-utils');
|
|
3
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
4
4
|
const config = require('../../shared/config');
|
|
5
5
|
const labs = require('../../shared/labs');
|
|
6
6
|
const settingsCache = require('../../shared/settings-cache');
|
|
7
|
-
const
|
|
7
|
+
const adapterManager = require('../services/adapter-manager').default;
|
|
8
8
|
|
|
9
9
|
let nodes;
|
|
10
10
|
let lexicalHtmlRenderer;
|
|
@@ -50,7 +50,7 @@ function buildRenderOptions(userOptions) {
|
|
|
50
50
|
// NOTE: the "saveRaw" check is smelly
|
|
51
51
|
return imageTransform.canTransformFiles()
|
|
52
52
|
&& imageTransform.shouldResizeFileExtension(ext)
|
|
53
|
-
&& typeof
|
|
53
|
+
&& typeof adapterManager.getAdapter('storage:images').saveRaw === 'function';
|
|
54
54
|
},
|
|
55
55
|
canTransformImageToFormat(format) {
|
|
56
56
|
const imageTransform = require('@tryghost/image-transform');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
const config = require('../../shared/config');
|
|
3
|
-
const
|
|
3
|
+
const adapterManager = require('../services/adapter-manager').default;
|
|
4
4
|
|
|
5
5
|
let cardFactory;
|
|
6
6
|
let cards;
|
|
@@ -37,7 +37,7 @@ module.exports = {
|
|
|
37
37
|
// NOTE: the "saveRaw" check is smelly
|
|
38
38
|
return imageTransform.canTransformFiles()
|
|
39
39
|
&& imageTransform.shouldResizeFileExtension(ext)
|
|
40
|
-
&& typeof
|
|
40
|
+
&& typeof adapterManager.getAdapter('storage:images').saveRaw === 'function';
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
43
|
|
|
@@ -248,7 +248,7 @@ function installSafeDnsLookup(options) {
|
|
|
248
248
|
const requestHref = options.url.href;
|
|
249
249
|
// Use 'lookup' (the native http.request option) rather than 'dnsLookup'
|
|
250
250
|
// (got's public API property which doesn't flow to the native request).
|
|
251
|
-
options.
|
|
251
|
+
options.dnsLookup = (hostname, dnsOpts, callback) => {
|
|
252
252
|
if (typeof dnsOpts === 'function') {
|
|
253
253
|
callback = dnsOpts;
|
|
254
254
|
dnsOpts = {};
|
|
@@ -4,7 +4,7 @@ const validator = require('@tryghost/validator');
|
|
|
4
4
|
|
|
5
5
|
const tpl = require('@tryghost/tpl');
|
|
6
6
|
const settingsCache = require('../../shared/settings-cache');
|
|
7
|
-
const urlUtils = require('../../shared/url-utils');
|
|
7
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
8
8
|
|
|
9
9
|
const messages = {
|
|
10
10
|
passwordDoesNotComplyLength: 'Your password must be at least {minLength} characters long.',
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
const ghostBookshelf = require('./base');
|
|
2
2
|
|
|
3
|
+
// Member custom fields are owned by a raw-knex service rather than the Bookshelf
|
|
4
|
+
// registry. Actions still need a read model for `include=resource` to recognise
|
|
5
|
+
// their polymorphic resource type and load the current field definition.
|
|
6
|
+
const MemberCustomFieldResource = ghostBookshelf.Model.extend({
|
|
7
|
+
tableName: 'members_custom_fields'
|
|
8
|
+
});
|
|
9
|
+
|
|
3
10
|
const Action = ghostBookshelf.Model.extend({
|
|
4
11
|
tableName: 'actions',
|
|
5
12
|
|
|
@@ -18,6 +25,8 @@ const Action = ghostBookshelf.Model.extend({
|
|
|
18
25
|
candidates.push([User, 'security_action']);
|
|
19
26
|
}
|
|
20
27
|
|
|
28
|
+
candidates.push([MemberCustomFieldResource, 'member_custom_field']);
|
|
29
|
+
|
|
21
30
|
return candidates;
|
|
22
31
|
},
|
|
23
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const _ = require('lodash');
|
|
2
2
|
const ghostBookshelf = require('./base');
|
|
3
|
-
const urlUtils = require('../../shared/url-utils');
|
|
3
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
4
4
|
|
|
5
5
|
const CustomThemeSetting = ghostBookshelf.Model.extend({
|
|
6
6
|
tableName: 'custom_theme_settings',
|
|
@@ -4,6 +4,70 @@ const _ = require('lodash');
|
|
|
4
4
|
const config = require('../../shared/config');
|
|
5
5
|
const {MemberCommentingCodec} = require('../services/members/commenting');
|
|
6
6
|
|
|
7
|
+
const DEEP_OFFSET_THRESHOLD = 1000;
|
|
8
|
+
|
|
9
|
+
// The rewrite only applies to the plain single-table browse query. Joins,
|
|
10
|
+
// group by, unions etc. at the top level of the statement mean some other
|
|
11
|
+
// query shape — but the same keywords inside parens (NQL filters and search
|
|
12
|
+
// compile to `where members.id in (select ... join ...)`) are fine, so only
|
|
13
|
+
// depth-0 SQL is inspected. Bindings are `?` placeholders, so no user data
|
|
14
|
+
// appears in the inspected string.
|
|
15
|
+
function sqlOutsideParens(sql) {
|
|
16
|
+
let depth = 0;
|
|
17
|
+
let result = '';
|
|
18
|
+
|
|
19
|
+
for (const char of sql) {
|
|
20
|
+
if (char === '(') {
|
|
21
|
+
depth += 1;
|
|
22
|
+
} else if (char === ')') {
|
|
23
|
+
depth -= 1;
|
|
24
|
+
} else if (depth === 0) {
|
|
25
|
+
result += char;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Deferred join for deep OFFSET pagination: plain LIMIT/OFFSET does a full
|
|
33
|
+
// row lookup for every discarded OFFSET row, so deep browse pages took ~10s
|
|
34
|
+
// on large sites. Instead, run LIMIT/OFFSET over a subquery selecting only
|
|
35
|
+
// the primary key (covered by the (created_at, id) index), then join back to
|
|
36
|
+
// fetch full rows for just the final page.
|
|
37
|
+
//
|
|
38
|
+
// The query is inspected via its compiled SQL (`qb.toSQL()`, public knex API)
|
|
39
|
+
// rather than knex's internal builder state. The prefix/suffix anchors below
|
|
40
|
+
// mean anything unexpected — custom selects, a lock clause, missing
|
|
41
|
+
// limit/offset — safely skips the rewrite.
|
|
42
|
+
function applyDeferredJoinForDeepOffset(qb) {
|
|
43
|
+
const {sql, bindings} = qb.toSQL();
|
|
44
|
+
|
|
45
|
+
// The plain browse query compiles to
|
|
46
|
+
// `select * from `members` [where ...] order by ... limit ? offset ?`;
|
|
47
|
+
// knex passes limit and offset as the last two bindings
|
|
48
|
+
if (!sql.startsWith('select * from `members`') || !sql.endsWith('limit ? offset ?')) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const offset = bindings[bindings.length - 1];
|
|
53
|
+
|
|
54
|
+
if (!Number.isInteger(offset) || offset < DEEP_OFFSET_THRESHOLD) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const topLevelSql = sqlOutsideParens(sql);
|
|
59
|
+
if ([' join ', ' group by ', ' having ', ' union '].some(keyword => topLevelSql.includes(keyword))) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Aliased so the default raw browse order (`created_at DESC, id DESC`)
|
|
64
|
+
// stays unambiguous in the outer query
|
|
65
|
+
const idSubquery = qb.clone().select('members.id as deep_page_id');
|
|
66
|
+
|
|
67
|
+
qb.clear('where').clear('limit').clear('offset')
|
|
68
|
+
.innerJoin(idSubquery.as('deep_page'), 'members.id', 'deep_page.deep_page_id');
|
|
69
|
+
}
|
|
70
|
+
|
|
7
71
|
const Member = ghostBookshelf.Model.extend({
|
|
8
72
|
tableName: 'members',
|
|
9
73
|
|
|
@@ -357,6 +421,15 @@ const Member = ghostBookshelf.Model.extend({
|
|
|
357
421
|
return result;
|
|
358
422
|
},
|
|
359
423
|
|
|
424
|
+
// Fires with the fully-built knex query (filters/order/limit/offset
|
|
425
|
+
// applied, select columns not yet); the count query runs before this
|
|
426
|
+
// event, so pagination meta is unaffected by the rewrite
|
|
427
|
+
onFetchingCollection: function onFetchingCollection(collection, columns, options) {
|
|
428
|
+
ghostBookshelf.Model.prototype.onFetchingCollection.apply(this, arguments);
|
|
429
|
+
|
|
430
|
+
applyDeferredJoinForDeepOffset(options.query);
|
|
431
|
+
},
|
|
432
|
+
|
|
360
433
|
onDestroyed: function onDestroyed(model, options) {
|
|
361
434
|
const result = ghostBookshelf.Model.prototype.onDestroyed.apply(this, arguments);
|
|
362
435
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const ghostBookshelf = require('./base');
|
|
2
2
|
const ObjectID = require('bson-objectid').default;
|
|
3
3
|
const crypto = require('crypto');
|
|
4
|
-
const urlUtils = require('../../shared/url-utils');
|
|
4
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
5
5
|
|
|
6
6
|
const Newsletter = ghostBookshelf.Model.extend({
|
|
7
7
|
tableName: 'newsletters',
|
|
@@ -14,7 +14,7 @@ const limitService = require('../services/limits');
|
|
|
14
14
|
const mobiledocLib = require('../lib/mobiledoc');
|
|
15
15
|
const lexicalLib = require('../lib/lexical');
|
|
16
16
|
const relations = require('./relations');
|
|
17
|
-
const urlUtils = require('../../shared/url-utils');
|
|
17
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
18
18
|
const {Tag} = require('./tag');
|
|
19
19
|
const {Newsletter} = require('./newsletter');
|
|
20
20
|
const {BadRequestError} = require('@tryghost/errors');
|
|
@@ -950,15 +950,29 @@ Post = ghostBookshelf.Model.extend({
|
|
|
950
950
|
},
|
|
951
951
|
|
|
952
952
|
authors: function authors() {
|
|
953
|
+
// posts_authors.id breaks sort_order ties deterministically (by attach
|
|
954
|
+
// order); without it MySQL can order tied rows differently per query,
|
|
955
|
+
// which changes the computed primary_author. See tags() below.
|
|
956
|
+
// `id` is pivoted in so it is in the SELECT list — the query uses
|
|
957
|
+
// DISTINCT, which requires ORDER BY columns to be selected.
|
|
953
958
|
return this.belongsToMany('User', 'posts_authors', 'post_id', 'author_id')
|
|
954
|
-
.withPivot('sort_order')
|
|
955
|
-
.query('orderBy', 'sort_order', 'ASC')
|
|
959
|
+
.withPivot(['sort_order', 'id'])
|
|
960
|
+
.query('orderBy', 'sort_order', 'ASC')
|
|
961
|
+
.query('orderBy', 'posts_authors.id', 'ASC');
|
|
956
962
|
},
|
|
957
963
|
|
|
958
964
|
tags: function tags() {
|
|
965
|
+
// posts_tags.id breaks sort_order ties deterministically (by attach
|
|
966
|
+
// order). primary_tag is tags[0]-if-public, so a non-deterministic tie
|
|
967
|
+
// order (which MySQL produces for tags sharing a sort_order) makes the
|
|
968
|
+
// primary tag — and the post's URL under a {primary_tag} permalink —
|
|
969
|
+
// depend on the query shape.
|
|
970
|
+
// `id` is pivoted in so it is in the SELECT list — the query uses
|
|
971
|
+
// DISTINCT, which requires ORDER BY columns to be selected.
|
|
959
972
|
return this.belongsToMany('Tag', 'posts_tags', 'post_id', 'tag_id')
|
|
960
|
-
.withPivot('sort_order')
|
|
961
|
-
.query('orderBy', 'sort_order', 'ASC')
|
|
973
|
+
.withPivot(['sort_order', 'id'])
|
|
974
|
+
.query('orderBy', 'sort_order', 'ASC')
|
|
975
|
+
.query('orderBy', 'posts_tags.id', 'ASC');
|
|
962
976
|
},
|
|
963
977
|
|
|
964
978
|
mobiledoc_revisions() {
|
|
@@ -6,7 +6,7 @@ const ghostBookshelf = require('./base');
|
|
|
6
6
|
const tpl = require('@tryghost/tpl');
|
|
7
7
|
const errors = require('@tryghost/errors');
|
|
8
8
|
const validator = require('@tryghost/validator');
|
|
9
|
-
const urlUtils = require('../../shared/url-utils');
|
|
9
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
10
10
|
const {WRITABLE_KEYS_ALLOWLIST} = require('../../shared/labs');
|
|
11
11
|
const {getOrGenerateSiteUuid} = require('../services/settings/settings-utils');
|
|
12
12
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const ghostBookshelf = require('./base');
|
|
2
|
-
const urlUtils = require('../../shared/url-utils');
|
|
2
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
3
3
|
const mobiledocLib = require('../lib/mobiledoc');
|
|
4
4
|
const lexicalLib = require('../lib/lexical');
|
|
5
5
|
const _ = require('lodash');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const ghostBookshelf = require('./base');
|
|
2
2
|
const tpl = require('@tryghost/tpl');
|
|
3
3
|
const errors = require('@tryghost/errors');
|
|
4
|
-
const urlUtils = require('../../shared/url-utils');
|
|
4
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
5
5
|
|
|
6
6
|
const messages = {
|
|
7
7
|
tagNotFound: 'Tag not found.'
|
|
@@ -6,10 +6,9 @@ const limitService = require('../services/limits');
|
|
|
6
6
|
const tpl = require('@tryghost/tpl');
|
|
7
7
|
const errors = require('@tryghost/errors');
|
|
8
8
|
const security = require('@tryghost/security');
|
|
9
|
-
const {pipeline} = require('@tryghost/promise');
|
|
10
9
|
const validatePassword = require('../lib/validate-password');
|
|
11
10
|
const permissions = require('../services/permissions');
|
|
12
|
-
const urlUtils = require('../../shared/url-utils');
|
|
11
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
13
12
|
const {setIsRoles} = require('./role-utils');
|
|
14
13
|
const activeStates = ['active', 'warn-1', 'warn-2', 'warn-3', 'warn-4'];
|
|
15
14
|
const ASSIGNABLE_ROLES = ['Administrator', 'Super Editor', 'Editor', 'Author', 'Contributor'];
|
|
@@ -572,91 +571,68 @@ User = ghostBookshelf.Model.extend({
|
|
|
572
571
|
* @extends ghostBookshelf.Model.edit to handle returning the full object
|
|
573
572
|
* **See:** [ghostBookshelf.Model.edit](base.js.html#edit)
|
|
574
573
|
*/
|
|
575
|
-
edit: function edit(data, unfilteredOptions) {
|
|
574
|
+
edit: async function edit(data, unfilteredOptions) {
|
|
576
575
|
const options = this.filterOptions(unfilteredOptions, 'edit');
|
|
577
576
|
const self = this;
|
|
578
|
-
const ops = [];
|
|
579
577
|
|
|
580
578
|
if (data.roles && data.roles.length > 1) {
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
})
|
|
585
|
-
);
|
|
579
|
+
throw new errors.ValidationError({
|
|
580
|
+
message: tpl(messages.onlyOneRolePerUserSupported)
|
|
581
|
+
});
|
|
586
582
|
}
|
|
587
583
|
|
|
588
584
|
if (data.email) {
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
message: tpl(messages.userUpdateError.emailIsAlreadyInUse)
|
|
594
|
-
}));
|
|
595
|
-
}
|
|
585
|
+
const existingUser = await self.getByEmail(data.email, options);
|
|
586
|
+
if (existingUser && existingUser.id !== options.id) {
|
|
587
|
+
throw new errors.ValidationError({
|
|
588
|
+
message: tpl(messages.userUpdateError.emailIsAlreadyInUse)
|
|
596
589
|
});
|
|
597
|
-
}
|
|
590
|
+
}
|
|
598
591
|
}
|
|
599
592
|
|
|
600
|
-
|
|
601
|
-
return ghostBookshelf.Model.edit.call(self, data, options).then(async (user) => {
|
|
602
|
-
let roleId;
|
|
593
|
+
const user = await ghostBookshelf.Model.edit.call(self, data, options);
|
|
603
594
|
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
roleId = data.roles[0].id || data.roles[0];
|
|
609
|
-
|
|
610
|
-
return user.roles().fetch().then((roles) => {
|
|
611
|
-
// return if the role is already assigned
|
|
612
|
-
if (roles.models[0].id === roleId) {
|
|
613
|
-
return;
|
|
614
|
-
}
|
|
595
|
+
if (!data.roles || !data.roles.length) {
|
|
596
|
+
return user;
|
|
597
|
+
}
|
|
615
598
|
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
return;
|
|
620
|
-
}
|
|
599
|
+
const roleId = data.roles[0].id || data.roles[0];
|
|
600
|
+
const roles = await user.roles().fetch();
|
|
601
|
+
let roleToAssign;
|
|
621
602
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
message: tpl(messages.invalidRoleValue.message),
|
|
633
|
-
context: tpl(messages.invalidRoleValue.context),
|
|
634
|
-
help: tpl(messages.invalidRoleValue.help)
|
|
635
|
-
})
|
|
636
|
-
);
|
|
637
|
-
}
|
|
638
|
-
}).then((roleToAssign) => {
|
|
639
|
-
if (roleToAssign && roleToAssign.get('name') === 'Owner') {
|
|
640
|
-
return Promise.reject(
|
|
641
|
-
new errors.ValidationError({
|
|
642
|
-
message: tpl(messages.methodDoesNotSupportOwnerRole)
|
|
643
|
-
})
|
|
644
|
-
);
|
|
645
|
-
} else if (roleToAssign) {
|
|
646
|
-
// assign all other roles
|
|
647
|
-
return user.roles().updatePivot({role_id: roleToAssign.id});
|
|
648
|
-
}
|
|
649
|
-
}).then(() => {
|
|
650
|
-
options.status = 'all';
|
|
651
|
-
return self.findOne({id: user.id}, options);
|
|
652
|
-
}).then((model) => {
|
|
653
|
-
model._changed = user._changed;
|
|
654
|
-
return model;
|
|
603
|
+
if (roles.models[0].id !== roleId) {
|
|
604
|
+
if (ASSIGNABLE_ROLES.includes(roleId)) {
|
|
605
|
+
if (roles.models[0].get('name') !== roleId) {
|
|
606
|
+
roleToAssign = await ghostBookshelf.model('Role').findOne({
|
|
607
|
+
name: roleId
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
} else if (ObjectId.isValid(roleId)) {
|
|
611
|
+
roleToAssign = await ghostBookshelf.model('Role').findOne({
|
|
612
|
+
id: roleId
|
|
655
613
|
});
|
|
614
|
+
} else {
|
|
615
|
+
throw new errors.ValidationError({
|
|
616
|
+
message: tpl(messages.invalidRoleValue.message),
|
|
617
|
+
context: tpl(messages.invalidRoleValue.context),
|
|
618
|
+
help: tpl(messages.invalidRoleValue.help)
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
if (roleToAssign && roleToAssign.get('name') === 'Owner') {
|
|
624
|
+
throw new errors.ValidationError({
|
|
625
|
+
message: tpl(messages.methodDoesNotSupportOwnerRole)
|
|
656
626
|
});
|
|
657
|
-
})
|
|
627
|
+
} else if (roleToAssign) {
|
|
628
|
+
// assign all other roles
|
|
629
|
+
await user.roles().updatePivot({role_id: roleToAssign.id});
|
|
630
|
+
}
|
|
658
631
|
|
|
659
|
-
|
|
632
|
+
options.status = 'all';
|
|
633
|
+
const model = await self.findOne({id: user.id}, options);
|
|
634
|
+
model._changed = user._changed;
|
|
635
|
+
return model;
|
|
660
636
|
},
|
|
661
637
|
|
|
662
638
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const ghostBookshelf = require('./base');
|
|
2
2
|
const errors = require('@tryghost/errors');
|
|
3
|
-
const urlUtils = require('../../shared/url-utils');
|
|
3
|
+
const urlUtils = require('../../shared/url-utils').default;
|
|
4
4
|
const lexicalLib = require('../lib/lexical');
|
|
5
5
|
const {DEFAULT_EMAIL_DESIGN_SETTING_SLUG} = require('../services/member-welcome-emails/constants');
|
|
6
6
|
|
|
@@ -14,7 +14,7 @@ module.exports = class ActivityPubServiceWrapper {
|
|
|
14
14
|
const logging = require('@tryghost/logging');
|
|
15
15
|
const events = require('../../lib/common/events');
|
|
16
16
|
const {knex} = require('../../data/db');
|
|
17
|
-
const urlUtils = require('../../../shared/url-utils');
|
|
17
|
+
const urlUtils = require('../../../shared/url-utils').default;
|
|
18
18
|
const IdentityTokenServiceWrapper = require('../identity-tokens');
|
|
19
19
|
const settingsCache = require('../../../shared/settings-cache');
|
|
20
20
|
|
|
@@ -128,8 +128,12 @@ class AdapterManager {
|
|
|
128
128
|
// We are loading from node_modules, we can remove the `adapterType` prefix
|
|
129
129
|
pathToAdapter = node_path_1.default.join(pathToAdapters, adapterClassName);
|
|
130
130
|
}
|
|
131
|
+
// An adapter directory may be a full module with its own
|
|
132
|
+
// package.json, in which case this resolves the `exports` entry
|
|
133
|
+
// point; otherwise the path passes through unchanged.
|
|
134
|
+
const moduleToLoad = (0, utils_1.resolveAdapterEntryPoint)(pathToAdapter);
|
|
131
135
|
try {
|
|
132
|
-
const adapterModule = this.loadAdapterFromPath(
|
|
136
|
+
const adapterModule = this.loadAdapterFromPath(moduleToLoad);
|
|
133
137
|
Adapter = (0, utils_1.resolveAdapterExport)(adapterModule);
|
|
134
138
|
if (Adapter) {
|
|
135
139
|
break;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import errors from '@tryghost/errors';
|
|
3
|
-
import {resolveAdapterExport, resolveAdapterOptions, normalizeAdapterConfig, getConfiguredFeatures} from './utils';
|
|
3
|
+
import {resolveAdapterExport, resolveAdapterEntryPoint, resolveAdapterOptions, normalizeAdapterConfig, getConfiguredFeatures} from './utils';
|
|
4
4
|
import type {ConfigInstance} from '../../../shared/config/loader';
|
|
5
5
|
import type {
|
|
6
6
|
Adapter,
|
|
@@ -193,8 +193,13 @@ export class AdapterManager<BaseClasses extends BaseClassMap = BaseClassMap> {
|
|
|
193
193
|
// We are loading from node_modules, we can remove the `adapterType` prefix
|
|
194
194
|
pathToAdapter = path.join(pathToAdapters, adapterClassName);
|
|
195
195
|
}
|
|
196
|
+
// An adapter directory may be a full module with its own
|
|
197
|
+
// package.json, in which case this resolves the `exports` entry
|
|
198
|
+
// point; otherwise the path passes through unchanged.
|
|
199
|
+
const moduleToLoad = resolveAdapterEntryPoint(pathToAdapter);
|
|
200
|
+
|
|
196
201
|
try {
|
|
197
|
-
const adapterModule = this.loadAdapterFromPath(
|
|
202
|
+
const adapterModule = this.loadAdapterFromPath(moduleToLoad);
|
|
198
203
|
Adapter = resolveAdapterExport(adapterModule);
|
|
199
204
|
if (Adapter) {
|
|
200
205
|
break;
|
|
@@ -3,37 +3,40 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const ghost_storage_base_1 =
|
|
6
|
+
const ghost_storage_base_1 = require("ghost-storage-base");
|
|
7
7
|
const adapter_base_scheduling_1 = require("@tryghost/adapter-base-scheduling");
|
|
8
8
|
const adapter_base_sso_1 = require("@tryghost/adapter-base-sso");
|
|
9
|
-
const adapter_base_cache_1 =
|
|
9
|
+
const adapter_base_cache_1 = require("@tryghost/adapter-base-cache");
|
|
10
10
|
const adapter_base_redirects_1 = require("@tryghost/adapter-base-redirects");
|
|
11
11
|
const adapter_base_route_settings_1 = require("@tryghost/adapter-base-route-settings");
|
|
12
12
|
const adapter_manager_1 = require("./adapter-manager");
|
|
13
13
|
const config_1 = __importDefault(require("../../../shared/config"));
|
|
14
|
+
const adapterPaths = new Set([
|
|
15
|
+
'', // A blank path will cause us to check node_modules for the adapter
|
|
16
|
+
config_1.default.get('paths').internalAdaptersPath,
|
|
17
|
+
// custom docker builds may install adapters in a separate path from content,
|
|
18
|
+
// since the content dir is often bind-mounted into the container. Offering
|
|
19
|
+
// an escape hatch here to allow for this
|
|
20
|
+
config_1.default.get('paths').installedAdaptersPath ?? '',
|
|
21
|
+
// load adapters from content last, so that they don't override any other
|
|
22
|
+
// internal or platform-installed adapters
|
|
23
|
+
// TODO: potentially deprecate/remove as part of Ghost 7.0
|
|
24
|
+
config_1.default.getContentPath('adapters'),
|
|
25
|
+
]);
|
|
14
26
|
// A singleton adapter manager, preconfigured with the base classes for every
|
|
15
27
|
// known adapter type. `getAdapter` resolves the active adapter and its options
|
|
16
28
|
// from config on each call, so runtime config changes are always reflected.
|
|
17
29
|
const adapterManager = new adapter_manager_1.AdapterManager({
|
|
18
30
|
loadAdapterFromPath: require,
|
|
19
31
|
config: config_1.default,
|
|
20
|
-
pathsToAdapters:
|
|
21
|
-
'', // A blank path will cause us to check node_modules for the adapter
|
|
22
|
-
config_1.default.getContentPath('adapters'),
|
|
23
|
-
config_1.default.get('paths').internalAdaptersPath
|
|
24
|
-
],
|
|
32
|
+
pathsToAdapters: Array.from(adapterPaths),
|
|
25
33
|
baseClasses: {
|
|
26
|
-
storage: ghost_storage_base_1.
|
|
34
|
+
storage: ghost_storage_base_1.StorageBase,
|
|
27
35
|
scheduling: adapter_base_scheduling_1.SchedulingBase,
|
|
28
36
|
sso: adapter_base_sso_1.SSOBase,
|
|
29
|
-
cache: adapter_base_cache_1.
|
|
37
|
+
cache: adapter_base_cache_1.CacheBase,
|
|
30
38
|
redirects: adapter_base_redirects_1.RedirectsStoreBase,
|
|
31
39
|
'route-settings': adapter_base_route_settings_1.RouteSettingsStoreBase
|
|
32
40
|
}
|
|
33
41
|
});
|
|
34
|
-
|
|
35
|
-
// consumers keep `require(...).getAdapter` access AND tests can stub methods
|
|
36
|
-
// with sinon — ESM named exports compile to immutable bindings that sinon
|
|
37
|
-
// cannot stub. Using `module.exports` directly (not `export =`) keeps this
|
|
38
|
-
// compatible with the erasableSyntaxOnly compiler option.
|
|
39
|
-
module.exports = adapterManager;
|
|
42
|
+
exports.default = adapterManager;
|