ghost 6.61.0 → 6.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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-jobs-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-redirects-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-route-settings-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-scheduling-0.2.3.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.1.3.tgz +0 -0
- package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
- package/components/tryghost-checkout-0.0.0.tgz +0 -0
- package/components/tryghost-i18n-0.0.0.tgz +0 -0
- package/components/tryghost-kg-card-factory-5.2.4.tgz +0 -0
- package/components/tryghost-kg-clean-basic-html-4.3.4.tgz +0 -0
- package/components/tryghost-kg-converters-1.2.5.tgz +0 -0
- package/components/tryghost-kg-default-cards-10.3.5.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.2.1.tgz +0 -0
- package/components/tryghost-kg-default-transforms-1.3.4.tgz +0 -0
- package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
- package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
- package/components/tryghost-kg-markdown-html-renderer-7.2.4.tgz +0 -0
- package/components/tryghost-kg-utils-1.1.4.tgz +0 -0
- package/components/tryghost-limit-service-0.0.0.tgz +0 -0
- package/components/tryghost-metafield-types-0.0.0.tgz +0 -0
- package/components/tryghost-nql-string-0.0.0.tgz +0 -0
- package/components/tryghost-parse-email-address-0.0.0.tgz +0 -0
- package/content/settings/README.md +1 -1
- package/content/themes/casper/.gitignore +28 -0
- package/content/themes/casper/assets/built/casper.js +1 -1
- package/content/themes/casper/assets/built/screen.css +1 -1
- package/content/themes/casper/assets/css/screen.css +2 -1
- package/content/themes/casper/assets/js/lightbox.js +63 -46
- package/content/themes/casper/package.json +6 -6
- package/content/themes/casper/page.hbs +1 -0
- package/content/themes/casper/post.hbs +1 -0
- package/content/themes/source/.gitignore +28 -0
- package/content/themes/source/assets/built/screen.css +1 -1
- package/content/themes/source/assets/built/source.js +1 -1
- package/content/themes/source/assets/css/screen.css +2 -1
- package/content/themes/source/assets/js/lightbox.js +62 -45
- package/content/themes/source/assets/js/main.js +2 -2
- package/content/themes/source/package.json +4 -4
- package/content/themes/source/partials/feature-image.hbs +1 -0
- package/content/themes/source/partials/post-card.hbs +1 -1
- package/core/boot.js +61 -27
- package/core/built/admin/assets/Combination-B0l4MKVh.js +41 -0
- package/core/built/admin/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
- package/core/built/admin/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
- package/core/built/admin/assets/{about-Bve7IJS2.js → about-C1C3s5-g.js} +1 -1
- package/core/built/admin/assets/accordion-CxGsDKwa.js +1 -0
- package/core/built/admin/assets/account-migration-CbUhW6gk.js +1 -0
- package/core/built/admin/assets/activitypub/{account-migration-C-aej4x_.js → account-migration-KA6Jjf9L.js} +16 -16
- package/core/built/admin/assets/activitypub/activitypub.js +9 -9
- package/core/built/admin/assets/activitypub/{avatar-DLPL3Abs.js → avatar-DVJF5bxP.js} +2 -2
- package/core/built/admin/assets/activitypub/{avatar-flipboard-C9iDY-QV.js → avatar-flipboard-csQaNeYK.js} +2 -2
- package/core/built/admin/assets/activitypub/{bluesky-sharing-BXkA5mqV.js → bluesky-sharing-C7nTDMvw.js} +37 -37
- package/core/built/admin/assets/activitypub/{content-formatters-CHcyMFk4.js → content-formatters-CLcjaBwV.js} +4 -4
- package/core/built/admin/assets/activitypub/{copy-DIAOQoCZ.js → copy-DcOh8kXw.js} +2 -2
- package/core/built/admin/assets/activitypub/{domain-B3ihkPde.js → domain-fZ-X8i4-.js} +121 -121
- package/core/built/admin/assets/activitypub/{edit-profile-DsZM3rTX.js → edit-profile-BqMLQV88.js} +40 -40
- package/core/built/admin/assets/activitypub/{explore-BodNrZgR.js → explore-B4yPoP8E.js} +27 -27
- package/core/built/admin/assets/activitypub/{feed-PwH1iJ84.js → feed-BRC_mvAe.js} +51 -51
- package/core/built/admin/assets/activitypub/{field-D06-kmOJ.js → field-COacNgOt.js} +3 -3
- package/core/built/admin/assets/activitypub/{hash-Bm3WxYN4.js → hash-C7u-irQQ.js} +2 -2
- package/core/built/admin/assets/activitypub/inbox-BW-yvUoN.js +1284 -0
- package/core/built/admin/assets/activitypub/{inbox-d8oJRTf4.js → inbox-CbTTdDQ3.js} +2 -2
- package/core/built/admin/assets/activitypub/label-kPMmYI7l.js +16 -0
- package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-D1Yapsod.js → moderation-CuidJzc0.js} +91 -91
- package/core/built/admin/assets/activitypub/{note-C5zjqq5C.js → note-CAMRRSqD.js} +24 -24
- package/core/built/admin/assets/activitypub/{notifications-B9p8eCHD.js → notifications-BmNlXGgp.js} +51 -51
- package/core/built/admin/assets/activitypub/{onboarding-CNelD_uF.js → onboarding-Bqg7fh_L.js} +2 -2
- package/core/built/admin/assets/activitypub/{onboarding-mat5Hrl0.js → onboarding-Dmun9jr_.js} +2 -2
- package/core/built/admin/assets/activitypub/{preferences-BCqUdC3v.js → preferences--oH19wf9.js} +1519 -1519
- package/core/built/admin/assets/activitypub/{profile-BRCWoFem.js → profile-DH_tQx2D.js} +185 -185
- package/core/built/admin/assets/activitypub/{reply-DYK5vVqb.js → reply-Cap9PxSH.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-BSXT992i.js → routes-DdyY9uFF.js} +744 -735
- package/core/built/admin/assets/activitypub/{separator-BbQqTm-p.js → separator-CAxxu8VV.js} +3 -3
- package/core/built/admin/assets/activitypub/settings-B6EEcVkW.js +315 -0
- package/core/built/admin/assets/activitypub/{site-DHoMupSB.js → site-BYps63oh.js} +2 -2
- package/core/built/admin/assets/activitypub/{step-1-B-YfsVeO.js → step-1-CKjR2KAm.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-2-DtPQzlTH.js → step-2-B6PKfOUQ.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-3-D6BFMXL_.js → step-3-C-qBbcUo.js} +11 -11
- package/core/built/admin/assets/activitypub/{tabs-GpNecvfB.js → tabs-DLhZtVde.js} +306 -306
- package/core/built/admin/assets/activitypub/{topic-filter-BPDeQQys.js → topic-filter-DsUOuu0k.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-BoVOxXkV.js → use-activity-pub-queries-CX9snsLs.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-Bmk5h4lW.js → use-navigate-with-base-path-DsJTGDSS.js} +988 -959
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-wVBX7swM.js → use-reply-chain-data-AJi9zkzm.js} +30 -30
- package/core/built/admin/assets/activitypub/{users-CoX6FT_K.js → users-inweyKL5.js} +192 -164
- package/core/built/admin/assets/activitypub/{x-DbQZOLiI.js → x-DR8AT3-4.js} +2 -2
- package/core/built/admin/assets/add-integration-modal-BT_onDJy.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-Cx1kQpiY.js +1 -0
- package/core/built/admin/assets/add-recommendation-modal-B5nvAhvr.js +1 -0
- package/core/built/admin/assets/analytics-DjoJWPI7.js +1 -0
- package/core/built/admin/assets/{announcement-bar-modal-DM3cYOpo.js → announcement-bar-modal-Dwd0EGFP.js} +1 -1
- package/core/built/admin/assets/{api-keys-3-0vJC3Y.js → api-keys-BGPzLHzA.js} +1 -1
- package/core/built/admin/assets/{api-keys-BLm2NDBh.js → api-keys-BoeacM-s.js} +1 -1
- package/core/built/admin/assets/{audience-9mwU5TW6.js → audience-ceV3XVHq.js} +1 -1
- package/core/built/admin/assets/automated-emails-BLesE41L.js +1 -0
- package/core/built/admin/assets/{automations-sAcJ1334.js → automations-BN4u3GR8.js} +1 -1
- package/core/built/admin/assets/automations-C-ZTUwW3.js +1 -0
- package/core/built/admin/assets/bluesky-sharing-vzh-oPXL.js +1 -0
- package/core/built/admin/assets/{breadcrumb-DLiqCyFc.js → breadcrumb-CaLk2b7D.js} +1 -1
- package/core/built/admin/assets/{button-B2jcu6bk.js → button-Dvcv1QSR.js} +1 -1
- package/core/built/admin/assets/calendar-Bl9RLcZX.js +1 -0
- package/core/built/admin/assets/{chart-helpers-Fo3bUL3K.js → chart-helpers-FHywU0pj.js} +1 -1
- package/core/built/admin/assets/{checkbox-BfKktMph.js → checkbox-BtayFtjg.js} +1 -1
- package/core/built/admin/assets/chunk.254.035b85ec456ebbd7336b.js +440 -0
- package/core/built/admin/assets/{chunk.524.60ca4692d91c6022042f.js → chunk.524.e6975095fccdf22d90f8.js} +5 -5
- package/core/built/admin/assets/{chunk.582.525c7617c2d9e94c940a.js → chunk.582.98b485f9b2802f540897.js} +6 -6
- package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js → chunk.901.4ccc639821020230bcca.js} +9949 -7921
- package/core/built/admin/assets/{code-editor-view-DCQJxsfU.js → code-editor-view-C3ZfoF1X.js} +1 -1
- package/core/built/admin/assets/{code-editor-view-CYVu4EW6.js → code-editor-view-CAyRWy1s.js} +1 -1
- package/core/built/admin/assets/color-picker-G4kGR7rp.js +3 -0
- package/core/built/admin/assets/color-picker-field-DQFVTNnT.js +1 -0
- package/core/built/admin/assets/combobox-BnYzgEB4.js +1 -0
- package/core/built/admin/assets/command-C_vyTikI.js +1 -0
- package/core/built/admin/assets/comments-aBrxfnZf.js +1 -0
- package/core/built/admin/assets/{config-DOMQDZGZ.js → config-kSHvwdTG.js} +1 -1
- package/core/built/admin/assets/confirmation-context-DwXX_Y5h.js +1 -0
- package/core/built/admin/assets/{content-api-modal-CyQEC3fr.js → content-api-modal-D2G0nJP6.js} +1 -1
- package/core/built/admin/assets/context-menu-DOVB6yaz.js +1 -0
- package/core/built/admin/assets/{copy-field-B3M1s78L.js → copy-field-DCJwh9qf.js} +1 -1
- package/core/built/admin/assets/create-ghost-browse-value-source-5C53jJaX.js +1 -0
- package/core/built/admin/assets/custom-field-type-option-BAuW0F-E.js +1 -0
- package/core/built/admin/assets/custom-integration-modal-AbJGVyKc.js +1 -0
- package/core/built/admin/assets/{date-range-select-DD2RKkgB.js → date-range-select-BY3K-ukj.js} +1 -1
- package/core/built/admin/assets/design-and-theme-modal-BvEy4_pC.js +2 -0
- package/core/built/admin/assets/dirty-confirm-dialog-DVPuGz3U.js +1 -0
- package/core/built/admin/assets/{disabled-sources-indicator-Cvy47bE2.js → disabled-sources-indicator-Cy7Zp4c8.js} +1 -1
- package/core/built/admin/assets/dist-Dcsslyo72.js +1 -0
- package/core/built/admin/assets/domain-Dl61QGuk.js +1 -0
- package/core/built/admin/assets/dropzone-Dtz5Rmjt.js +5 -0
- package/core/built/admin/assets/edit-profile-DNJSMDwm.js +1 -0
- package/core/built/admin/assets/editor-DbAen9zf.js +8 -0
- package/core/built/admin/assets/editor-screen-BFWThIai.js +26 -0
- package/core/built/admin/assets/email-sending-status-context-CWDOD1FN.js +1 -0
- package/core/built/admin/assets/email-sending-status-provider-DCPkDICt.js +1 -0
- package/core/built/admin/assets/emails-vFMk4yYl.js +1 -0
- package/core/built/admin/assets/{embed-signup-form-modal-DeBMLxlL.js → embed-signup-form-modal-DGqsORxS.js} +1 -1
- package/core/built/admin/assets/en-B1jX3WMs.js +1 -0
- package/core/built/admin/assets/explore-nnRr1Fja.js +1 -0
- package/core/built/admin/assets/feature-flag-overrides-context-DQjdJFAk.js +1 -0
- package/core/built/admin/assets/feature-image-placeholder-BrIHmPs8.js +1 -0
- package/core/built/admin/assets/feed-BNUcNu-W.js +1 -0
- package/core/built/admin/assets/feedback-DJ4Zb9rZ.js +1 -0
- package/core/built/admin/assets/{field-Cj8lmDOo.js → field-C93_Mg6j.js} +1 -1
- package/core/built/admin/assets/filter-bar-Da1qxybu.js +1 -0
- package/core/built/admin/assets/filter-sources-CGJb4C5r.js +1 -0
- package/core/built/admin/assets/filters--kKP-EC8.js +1 -0
- package/core/built/admin/assets/filters-DxA_a4FP.js +1 -0
- package/core/built/admin/assets/first-promoter-modal-BYDtrz2S.js +1 -0
- package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-BbSnGOtK.js +1 -0
- package/core/built/admin/assets/{ghost-c8807202a07c20030acb719ee0114815.css → ghost-8fd5bb799356bbefb254210ba7e1236d.css} +1 -1
- package/core/built/admin/assets/{ghost-3894eedcc6968f658578c0abfe942aab.js → ghost-b4e8a403baba61905cd7560e30b9732d.js} +63 -44
- package/core/built/admin/assets/{ghost-dark-fbf1e384aaef3ae315e540f0eb7373a7.css → ghost-dark-cac0cb2d5bb78e9bd14d8d1c2768ed45.css} +1 -1
- package/core/built/admin/assets/gift-link-modal-B7u5bD4e.js +1 -0
- package/core/built/admin/assets/{gift-links-DLDS7ljO.js → gift-links-CfLSnst2.js} +1 -1
- package/core/built/admin/assets/{growth-D6mhcx3q.js → growth-Cd1uO9d2.js} +1 -1
- package/core/built/admin/assets/growth-aG32xfdE.js +3 -0
- package/core/built/admin/assets/history-modal-Df8lW8h-.js +1 -0
- package/core/built/admin/assets/hooks-Cy_-oZ4o.js +2 -0
- package/core/built/admin/assets/{html-field-C8qVGGC1.js → html-field-DA4eU7eq.js} +1 -1
- package/core/built/admin/assets/{images-h8VZEQ9k.js → images-KXmyO3Ss.js} +1 -1
- package/core/built/admin/assets/{inbox-BYd1M06Q.js → inbox-gJHG7_xd.js} +14 -14
- package/core/built/admin/assets/index-BHHXtR5C.css +2 -0
- package/core/built/admin/assets/index-CgMCwsxN.js +4 -0
- package/core/built/admin/assets/index.es-CY6-yuw9.js +1 -0
- package/core/built/admin/assets/{input-group-D8sCXRF5.js → input-group-BE8rM2y1.js} +1 -1
- package/core/built/admin/assets/{integrations-Bjbu86Z0.js → integrations-B4kuRBFY.js} +1 -1
- package/core/built/admin/assets/invite-user-modal-B4CuNcx4.js +1 -0
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +14 -14
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +3 -3
- package/core/built/admin/assets/koenig-lexical/style.css +1 -1
- package/core/built/admin/assets/{koenig-lexical-_-IsVI7E.js → koenig-lexical-CGXb0F8o.js} +3 -3
- package/core/built/admin/assets/koenig-loader-BeM5rFPX.js +2 -0
- package/core/built/admin/assets/{kpi-card-DZQk_0W8.js → kpi-card-B21aToe8.js} +1 -1
- package/core/built/admin/assets/{kpi-card-DW_2y3ug.js → kpi-card-pz6Wv4Ae.js} +1 -1
- package/core/built/admin/assets/{kpi-helpers-PueTKuA6.js → kpi-helpers-Dq5jelmP.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-CojDs-Qz.js → kpi-tabs-DEZHpKUt.js} +1 -1
- package/core/built/admin/assets/{label-DjbT91GM.js → label-OLCzze8N.js} +1 -1
- package/core/built/admin/assets/label-picker-BigOvMPV.js +1 -0
- package/core/built/admin/assets/{labels-CH3Kn8RV.js → labels-Dr0SgUQD.js} +1 -1
- package/core/built/admin/assets/layout-DUTL8SH5.js +1 -0
- package/core/built/admin/assets/lib-7QPTI0FS.js +1 -0
- package/core/built/admin/assets/link-helpers-BRAg9SCj.js +1 -0
- package/core/built/admin/assets/links-BDHPTlyj.js +1 -0
- package/core/built/admin/assets/member-custom-fields-TRTHCAz9.js +1 -0
- package/core/built/admin/assets/member-detail-b6dRwc3C.js +1 -0
- package/core/built/admin/assets/members-Czt5lJSc.js +4 -0
- package/core/built/admin/assets/moderation-ZWefD9uH.js +1 -0
- package/core/built/admin/assets/{multi-select-combobox-B6LiRzDO.js → multi-select-combobox-CT13MTo-.js} +1 -1
- package/core/built/admin/assets/navigation-modal-C8FEhBK5.js +1 -0
- package/core/built/admin/assets/newsletter-5VYW4RyJ.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-ChjC0ZqH.js +1 -0
- package/core/built/admin/assets/{newsletter-emails-CFeLlt4z.js → newsletter-emails-DZH6I-PY.js} +1 -1
- package/core/built/admin/assets/newsletters-DOC9KBcX.js +1 -0
- package/core/built/admin/assets/newsletters-Rq1M3GD-.js +1 -0
- package/core/built/admin/assets/note-DIV-Pojr.js +1 -0
- package/core/built/admin/assets/notifications-s20-H49V.js +1 -0
- package/core/built/admin/assets/nql-BLpCn7qX.js +21 -0
- package/core/built/admin/assets/{offers-9J1CSiLy.js → offers--e2nGvkW.js} +1 -1
- package/core/built/admin/assets/offers-container-modal-BmG5M5Tv.js +1 -0
- package/core/built/admin/assets/onboarding-CUuy9unR.js +1 -0
- package/core/built/admin/assets/{onboarding-B4YhlZ0i.js → onboarding-pXyct0Jm.js} +1 -1
- package/core/built/admin/assets/{onboarding-route-Dmc4IPm3.js → onboarding-route-CK4pcXoR.js} +1 -1
- package/core/built/admin/assets/overview-CaPsciMs.js +1 -0
- package/core/built/admin/assets/overview-a8GfcsKX.js +1 -0
- package/core/built/admin/assets/{page-header-BR_nbIPp.js → page-header-DM_KyoFI.js} +1 -1
- package/core/built/admin/assets/pagemenu-vgZVUVKR.js +1 -0
- package/core/built/admin/assets/pages-CjDY2CBI.js +1 -0
- package/core/built/admin/assets/pages-route-BzKZYdV5.js +1 -0
- package/core/built/admin/assets/papaparse.min-cQwnxGCG.js +10 -0
- package/core/built/admin/assets/{pintura-modal-BR9hEvS8.js → pintura-modal-DExCF1ii.js} +1 -1
- package/core/built/admin/assets/portal-frame-Cqanidq4.js +1 -0
- package/core/built/admin/assets/portal-modal-oinBgA27.js +1 -0
- package/core/built/admin/assets/post-analytics-C5oJ1dWV.js +1 -0
- package/core/built/admin/assets/post-analytics-header-OATo3X_r.js +1 -0
- package/core/built/admin/assets/post-analytics-provider-tOpIVGT5.js +1 -0
- package/core/built/admin/assets/post-helpers-C88JBa4D.js +1 -0
- package/core/built/admin/assets/post-share-modal-DvhC1XgV.js +1 -0
- package/core/built/admin/assets/post-utils-DKF4mfuo.js +1 -0
- package/core/built/admin/assets/posts-list-screen-o4ZjbgS3.js +2 -0
- package/core/built/admin/assets/posts-pCPrhQeR.js +1 -0
- package/core/built/admin/assets/posts-route-9F--xdIb.js +1 -0
- package/core/built/admin/assets/preferences--vNubsqD.js +5 -0
- package/core/built/admin/assets/{preview-modal-C-BL-F9k.js → preview-modal-YYbzlYdO.js} +1 -1
- package/core/built/admin/assets/profile-BllKV3dR.js +1 -0
- package/core/built/admin/assets/{radio-group-Bgz60i81.js → radio-group-DL8GI8rt.js} +1 -1
- package/core/built/admin/assets/{referrers-CnhCMWCs.js → referrers-D8oHPmDB.js} +1 -1
- package/core/built/admin/assets/router-provider-BSvTXgZY.js +1 -0
- package/core/built/admin/assets/schemas-BoYdB6YU.js +64 -0
- package/core/built/admin/assets/select-v5YbA3Mw.js +1 -0
- package/core/built/admin/assets/settings-PEsZupw1.js +4 -0
- package/core/built/admin/assets/{settings-breadcrumbs-CyP_9zTo.js → settings-breadcrumbs-NwPnCTC7.js} +1 -1
- package/core/built/admin/assets/settings-u_s1CRkr.js +1 -0
- package/core/built/admin/assets/share-modal-SskCmVGL.js +1 -0
- package/core/built/admin/assets/slack-modal-XxSJiYgo.js +1 -0
- package/core/built/admin/assets/{sort-button-Cc-Z96sA.js → sort-button-Cx1KtINE.js} +1 -1
- package/core/built/admin/assets/{source-icon-v6PUnmyM.js → source-icon-Bdp9Im_5.js} +1 -1
- package/core/built/admin/assets/stats-D9PDLS3x.js +1 -0
- package/core/built/admin/assets/stats-view-W2g6Jsd-.js +1 -0
- package/core/built/admin/assets/{step-1-DSRp2vBj.js → step-1-BQYzvBzr.js} +1 -1
- package/core/built/admin/assets/{step-2-COqv2g0u.js → step-2-xES32xJV.js} +1 -1
- package/core/built/admin/assets/{step-3-6W1NMVQc.js → step-3-DA_XK5kW.js} +2 -2
- package/core/built/admin/assets/{stripe-button-D2K42Uty.js → stripe-button-CVsLHelt.js} +1 -1
- package/core/built/admin/assets/stripe-connect-modal-ClmLOMGS.js +1 -0
- package/core/built/admin/assets/style-Wd9nQubI.css +1 -0
- package/core/built/admin/assets/{table-B2pIKjVh.js → table-BenqVupI.js} +1 -1
- package/core/built/admin/assets/{tabs-SaW_UT-Q.js → tabs-eBBlxPp8.js} +1 -1
- package/core/built/admin/assets/tag-detail-Ce8Se2qd.js +2 -0
- package/core/built/admin/assets/tag-picker-C3UR-uJ-.js +1 -0
- package/core/built/admin/assets/tags-B-kJxCs7.js +1 -0
- package/core/built/admin/assets/{tags-zTFiKRpb.js → tags-ChfdwJyS.js} +1 -1
- package/core/built/admin/assets/testimonials-modal-9Q6fT06V.js +1 -0
- package/core/built/admin/assets/tier-detail-modal-CDyYdqK7.js +1 -0
- package/core/built/admin/assets/tiers-BCpIOGQr.js +1 -0
- package/core/built/admin/assets/{toggle-group-EM9WpESu.js → toggle-group-CviIkyok.js} +1 -1
- package/core/built/admin/assets/{topic-filter-DY4gNHn2.js → topic-filter-I2jCBGxm.js} +1 -1
- package/core/built/admin/assets/{transistor-modal-CpyPG-MH.js → transistor-modal-p53u3W8y.js} +1 -1
- package/core/built/admin/assets/{trend-badge-ByMkuAuH.js → trend-badge-CideVzQd.js} +1 -1
- package/core/built/admin/assets/{unsplash-modal-Cv2Q6GtY.js → unsplash-modal-DY8UcKcE.js} +1 -1
- package/core/built/admin/assets/{use-analytics-data-CHvjMYuT.js → use-analytics-data-DAIGcr2f.js} +1 -1
- package/core/built/admin/assets/use-check-theme-limit-error-B8bjF-gO.css +1 -0
- package/core/built/admin/assets/{use-check-theme-limit-error-Qv4SVXqw.js → use-check-theme-limit-error-DRUjK4YM.js} +1 -1
- package/core/built/admin/assets/use-filter-params-JkZhIS8L.js +1 -0
- package/core/built/admin/assets/{use-filterable-api-CzXcpUh8.js → use-filterable-api-BVEVMrhZ.js} +1 -1
- package/core/built/admin/assets/use-growth-stats-937CUj6j.js +1 -0
- package/core/built/admin/assets/use-host-limits-D0Dv3tKA.js +1 -0
- package/core/built/admin/assets/{use-limiter-cwJvsNBo.js → use-limiter-CohWfzvK.js} +1 -1
- package/core/built/admin/assets/{use-navigate-with-base-path-BHPA228f.js → use-navigate-with-base-path-BkxcPj5l.js} +1 -1
- package/core/built/admin/assets/use-pintura-config-xgytjU35.js +1 -0
- package/core/built/admin/assets/{use-pintura-editor-BDBXWUYq.js → use-pintura-editor-CaV1mbfO.js} +1 -1
- package/core/built/admin/assets/{use-post-referrers-DbY-mzci.js → use-post-referrers-BCQI7fDg.js} +1 -1
- package/core/built/admin/assets/use-reply-chain-data-CYRhoaxY.js +1 -0
- package/core/built/admin/assets/{use-router-history-entry-Bg6BhBQQ.js → use-router-history-entry-NOKcd--l.js} +1 -1
- package/core/built/admin/assets/{use-setting-group-VM7FQwMY.js → use-setting-group-bLKMwoBT.js} +1 -1
- package/core/built/admin/assets/use-settings-navigation-B-qrriKD.js +1 -0
- package/core/built/admin/assets/{use-simple-pagination-Dum6Irbs.js → use-simple-pagination-CNPd6Rf6.js} +1 -1
- package/core/built/admin/assets/use-staff-users-pRIMIyiW.js +1 -0
- package/core/built/admin/assets/use-tinybird-query-CmdbCS9X.js +1 -0
- package/core/built/admin/assets/use-tinybird-token-KLne235s.js +1 -0
- package/core/built/admin/assets/{use-unsaved-changes-guard-BAy0RANR.js → use-unsaved-changes-guard-7-ug0JdH.js} +1 -1
- package/core/built/admin/assets/use-upgrade-route-Dm_qqKr0.js +1 -0
- package/core/built/admin/assets/{use-url-input-Df5QzNa7.js → use-url-input-fvp-TpPx.js} +1 -1
- package/core/built/admin/assets/user-detail-modal-D3KlGYv-.js +1 -0
- package/core/built/admin/assets/users-DVNWrqg9.js +1 -0
- package/core/built/admin/assets/{vendor-5753232c7d6ffb3c44e1eb0a02133953.js → vendor-2dd263291938d407802568d3357ec69e.js} +19 -17
- package/core/built/admin/assets/{virtual-list-DEx8WgiO.js → virtual-list-CZ3RK2Yf.js} +1 -1
- package/core/built/admin/assets/web-ClEJsCAj.js +2 -0
- package/core/built/admin/assets/web-X9rdnrtq.js +1 -0
- package/core/built/admin/assets/{zapier-modal-Cw3BTBUu.js → zapier-modal-DfVhV17j.js} +1 -1
- package/core/built/admin/index.html +23 -27
- package/core/frontend/apps/private-blogging/lib/views/private.hbs +44 -43
- package/core/frontend/helpers/cancel_link.js +2 -2
- package/core/frontend/helpers/pagination.js +2 -2
- package/core/frontend/helpers/social_accounts.js +2 -2
- package/core/frontend/public/ghost.css +1 -1
- package/core/frontend/public/ghost.min.css +1 -1
- package/core/frontend/services/sitemap/user-map-generator.js +9 -2
- package/core/server/adapters/jobs/InMemoryJobsBackend.js +74 -29
- package/core/server/api/endpoints/authentication.js +1 -2
- package/core/server/api/endpoints/authors-public.js +15 -5
- package/core/server/api/endpoints/emails.js +13 -0
- package/core/server/api/endpoints/index.js +10 -2
- package/core/server/api/endpoints/mail.js +1 -1
- package/core/server/api/endpoints/member-metafields-members.js +23 -0
- package/core/server/api/endpoints/member-metafields.js +102 -0
- package/core/server/api/endpoints/members-account.js +42 -0
- package/core/server/api/endpoints/members.js +4 -4
- package/core/server/api/endpoints/newsletters-public.js +10 -1
- package/core/server/api/endpoints/pages-public.js +15 -5
- package/core/server/api/endpoints/posts-public.js +15 -5
- package/core/server/api/endpoints/posts.js +3 -3
- package/core/server/api/endpoints/tags-public.js +22 -3
- package/core/server/api/endpoints/tiers-checkout-config.js +2 -2
- package/core/server/api/endpoints/tiers-public.js +38 -1
- package/core/server/api/endpoints/users.js +2 -2
- package/core/server/api/endpoints/utils/api-filter-utils.js +170 -3
- package/core/server/api/endpoints/utils/public-cache-keys.js +3 -0
- package/core/server/api/endpoints/utils/serializers/input/authors.js +2 -0
- package/core/server/api/endpoints/utils/serializers/input/members.js +20 -9
- package/core/server/api/endpoints/utils/serializers/input/pages.js +2 -0
- package/core/server/api/endpoints/utils/serializers/input/posts.js +2 -0
- package/core/server/api/endpoints/utils/serializers/input/tags.js +2 -0
- package/core/server/api/endpoints/utils/serializers/output/emails.js +7 -0
- package/core/server/api/endpoints/utils/serializers/output/index.js +6 -2
- package/core/server/api/endpoints/utils/serializers/output/member-metafields.js +18 -0
- package/core/server/api/endpoints/utils/serializers/output/members-account.js +19 -0
- package/core/server/api/endpoints/utils/serializers/output/members-csv-transform.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/members.js +2 -4
- package/core/server/api/endpoints/utils/serializers/output/tiers.js +10 -2
- package/core/server/api/endpoints/utils/serializers/output/users.js +0 -10
- package/core/server/api/endpoints/utils/validators/input/invitations.js +0 -5
- package/core/server/api/endpoints/utils/validators/input/pages.js +1 -1
- package/core/server/api/endpoints/utils/validators/input/posts.js +1 -1
- package/core/server/data/exporter/table-lists.js +3 -3
- package/core/server/data/importer/importers/data/data-importer.js +3 -3
- package/core/server/data/migrations/utils/migrations.js +1 -1
- package/core/server/data/migrations/versions/6.53/2026-07-15-20-22-53-add-members-custom-field-values.js +1 -1
- package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +10 -1
- package/core/server/data/migrations/versions/6.63/2026-09-03-10-07-03-rename-custom-field-tables-to-metafields.js +169 -0
- package/core/server/data/migrations/versions/6.63/2026-09-03-11-03-31-remove-member-custom-field-read-permissions.js +30 -0
- package/core/server/data/schema/fixtures/fixtures.json +0 -11
- package/core/server/data/schema/lib/default-index-name.js +8 -11
- package/core/server/data/schema/schema.js +18 -18
- package/core/server/data/seeders/README.md +48 -0
- package/core/server/data/tinybird/pipes/mv_hits.pipe +86 -50
- package/core/server/lib/db-types/count.js +16 -0
- package/core/server/lib/image/image-size.js +24 -0
- package/core/server/lib/package-json/parse.js +2 -2
- package/core/server/lib/validate-password.js +81 -120
- package/core/server/models/action.js +4 -4
- package/core/server/models/base/plugins/filtered-collection.js +16 -0
- package/core/server/models/member.js +10 -21
- package/core/server/models/post.js +2 -2
- package/core/server/models/relations/authors.js +2 -16
- package/core/server/models/user.js +10 -3
- package/core/server/services/auth/passwordreset.js +13 -0
- package/core/server/services/automations/automations-api.js +1 -1
- package/core/server/services/automations/database-automations-repository.js +11 -4
- package/core/server/services/comments/comments-controller.js +30 -9
- package/core/server/services/comments/comments-service.js +55 -5
- package/core/server/services/content-import/csv/formula.js +12 -0
- package/core/server/services/content-import/csv/index.js +6 -1
- package/core/server/services/content-import/csv/parse.js +27 -6
- package/core/server/services/content-import/csv/serialize.js +13 -0
- package/core/server/services/content-import/import/completion-email.js +164 -0
- package/core/server/services/content-import/import/errors-file.js +36 -0
- package/core/server/services/content-import/import/importer.js +160 -53
- package/core/server/services/content-import/import/local-media-url.js +63 -0
- package/core/server/services/content-import/import/media.js +254 -0
- package/core/server/services/content-import/import/post-data.js +0 -1
- package/core/server/services/content-import/import/post-link.js +11 -0
- package/core/server/services/content-import/import/post-repository.js +25 -3
- package/core/server/services/content-import/import/reader.js +9 -2
- package/core/server/services/content-import/import/report.js +34 -0
- package/core/server/services/content-import/import/row.js +0 -2
- package/core/server/services/content-import/import/schema.js +1 -0
- package/core/server/services/content-import/import/staged-file.js +29 -0
- package/core/server/services/content-import/import/store.js +25 -2
- package/core/server/services/content-import/index.js +52 -6
- package/core/server/services/content-import/jobs/content-csv-import-job.js +20 -0
- package/core/server/services/custom-redirects/redirect-config-parser.js +2 -2
- package/core/server/services/custom-redirects/redirects-service.js +1 -1
- package/core/server/services/custom-redirects/validation.js +1 -1
- package/core/server/services/email-address/email-address-parser.js +30 -38
- package/core/server/services/email-address/email-address-service.js +37 -4
- package/core/server/services/email-analytics/index.js +2 -7
- package/core/server/services/email-service/CONTEXT.md +37 -0
- package/core/server/services/email-service/README.md +42 -0
- package/core/server/services/email-service/batch-sending-service.js +2 -4
- package/core/server/services/email-service/email-controller.js +18 -2
- package/core/server/services/email-service/email-renderer.js +14 -4
- package/core/server/services/email-service/email-service-wrapper.js +3 -9
- package/core/server/services/email-service/mailgun-email-provider.js +20 -9
- package/core/server/services/email-service/sending-status-schema.js +21 -0
- package/core/server/services/email-service/sending-status-serializers.js +33 -0
- package/core/server/services/email-service/sending-status-service.js +47 -0
- package/core/server/services/email-service/sending-status.js +111 -0
- package/core/server/services/email-suppression-list/email-suppression-list.js +0 -33
- package/core/server/services/email-suppression-list/mailgun-email-suppression-list.js +6 -7
- package/core/server/services/gifts/README.md +2 -2
- package/core/server/services/gifts/constants.js +1 -1
- package/core/server/services/gifts/email-templates/gift-delivery.hbs +3 -3
- package/core/server/services/gifts/gift-email-service.js +0 -1
- package/core/server/services/gifts/gift-service.js +19 -57
- package/core/server/services/gifts/index.js +3 -5
- package/core/server/services/gifts/jobs/index.js +4 -4
- package/core/server/services/indexnow-ping/indexnow-ping-service.js +2 -2
- package/core/server/services/invitations/accept.js +4 -2
- package/core/server/services/jobs/job-service.js +0 -9
- package/core/server/services/jobs-service/index.js +8 -0
- package/core/server/services/jobs-service/jobs-service.js +52 -3
- package/core/server/services/jobs-service/register-job-handlers.js +32 -11
- package/core/server/services/mail/ghost-mailer.js +4 -4
- package/core/server/services/member-welcome-emails/service.js +7 -7
- package/core/server/services/members/account-service.js +98 -0
- package/core/server/services/members/api.js +4 -3
- package/core/server/services/members/import-export/csv/parse.js +0 -7
- package/core/server/services/members/import-export/export/exporter.js +20 -20
- package/core/server/services/members/import-export/import/completion-email.js +8 -11
- package/core/server/services/members/import-export/import/importer.js +13 -13
- package/core/server/services/members/import-export/import/row.js +0 -3
- package/core/server/services/members/import-export/index.js +10 -17
- package/core/server/services/members/jobs/clean-expired-comped-job.js +7 -0
- package/core/server/services/members/jobs/clean-expired-comped-task.js +145 -0
- package/core/server/services/members/jobs/index.js +48 -24
- package/core/server/services/members/members-api/controllers/member-controller.js +11 -0
- package/core/server/services/members/members-api/controllers/router-controller.js +3 -6
- package/core/server/services/members/members-api/members-api.js +26 -8
- package/core/server/services/members/members-api/repositories/event-repository.js +0 -4
- package/core/server/services/members/members-api/repositories/member-repository.js +4 -4
- package/core/server/services/members/members-api/services/member-bread-service.js +62 -84
- package/core/server/services/members/members-api/services/payments-service.js +1 -1
- package/core/server/services/members/members-ssr.js +18 -0
- package/core/server/services/members/middleware.js +95 -81
- package/core/server/services/members/service.js +71 -47
- package/core/server/services/members/utils.js +9 -0
- package/core/server/services/members-metafields/access.js +28 -0
- package/core/server/services/{members-custom-fields → members-metafields}/actions.js +5 -5
- package/core/server/services/members-metafields/bindings-service.js +147 -0
- package/core/server/services/members-metafields/codec.js +14 -0
- package/core/server/services/{members-custom-fields → members-metafields}/config.js +1 -1
- package/core/server/services/{members-custom-fields → members-metafields}/definitions-service.js +68 -22
- package/core/server/services/members-metafields/filter.js +181 -0
- package/core/server/services/{members-custom-fields → members-metafields}/index.js +16 -7
- package/core/server/services/{members-custom-fields → members-metafields}/key.js +2 -1
- package/core/server/services/{members-custom-fields → members-metafields}/models.js +5 -5
- package/core/server/services/members-metafields/namespaces.js +34 -0
- package/core/server/services/{members-custom-fields → members-metafields}/queries.js +1 -1
- package/core/server/services/{members-custom-fields → members-metafields}/schema.js +16 -12
- package/core/server/services/members-metafields/serializers.js +22 -0
- package/core/server/services/{members-custom-fields → members-metafields}/values-service.js +80 -48
- package/core/server/services/mentions/mention-controller.js +23 -21
- package/core/server/services/mentions/mention-sending-service.js +26 -9
- package/core/server/services/mentions/process-webmention-job.js +16 -0
- package/core/server/services/mentions/send-webmentions-job.js +18 -0
- package/core/server/services/mentions/service.js +7 -33
- package/core/server/services/route-settings/validation-errors.js +1 -1
- package/core/server/services/route-settings/yaml-parser.js +1 -1
- package/core/server/services/settings/settings-service.js +1 -8
- package/core/server/services/settings-helpers/settings-helpers.js +4 -6
- package/core/server/services/slack-ping/slack-ping-service.js +1 -1
- package/core/server/services/staff/staff-service-emails.js +2 -2
- package/core/server/services/stripe/config.js +14 -8
- package/core/server/services/stripe/service.js +10 -1
- package/core/server/services/stripe/services/checkout/completed-session.js +2 -2
- package/core/server/services/stripe/services/checkout/session-options.js +18 -15
- package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +28 -7
- package/core/server/services/stripe/stripe-api.js +2 -0
- package/core/server/services/stripe/stripe-service.js +24 -14
- package/core/server/services/stripe/webhook-controller.js +10 -0
- package/core/server/services/tier-checkout-config/codec.js +11 -7
- package/core/server/services/tier-checkout-config/index.js +2 -1
- package/core/server/services/tier-checkout-config/models.js +11 -5
- package/core/server/services/tier-checkout-config/queries.js +12 -12
- package/core/server/services/tier-checkout-config/serializers.js +73 -10
- package/core/server/services/tier-checkout-config/service.js +14 -13
- package/core/server/services/tiers/service.js +3 -3
- package/core/server/services/update-check/index.js +13 -13
- package/core/server/services/update-check/jobs/update-check-job.js +7 -0
- package/core/server/services/update-check/update-check-service.js +2 -2
- package/core/server/services/url/router-filter.js +8 -10
- package/core/server/services/users.js +1 -19
- package/core/server/web/admin/controller.js +1 -1
- package/core/server/web/api/endpoints/admin/routes.js +20 -16
- package/core/server/web/members/account/index.js +2 -0
- package/core/server/web/members/account/routes.js +46 -0
- package/core/server/web/members/app.js +4 -18
- package/core/shared/config/defaults.json +1 -1
- package/core/shared/config/env/config.testing-mysql.json +1 -1
- package/core/shared/labs.js +7 -2
- package/package.json +42 -41
- package/pnpm-lock.yaml +1159 -582
- package/pnpm-workspace.yaml +18 -15
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.2.0.tgz +0 -0
- package/core/built/admin/assets/Combination-5fYEzgbs.js +0 -41
- package/core/built/admin/assets/account-migration-DRhAehfw.js +0 -1
- package/core/built/admin/assets/activitypub/inbox-BluD2ucT.js +0 -1284
- package/core/built/admin/assets/activitypub/label-FHSh6ZAw.js +0 -16
- package/core/built/admin/assets/activitypub/layout-Cq4NG0Xr.js +0 -1
- package/core/built/admin/assets/activitypub/settings-DQDkr06X.js +0 -315
- package/core/built/admin/assets/add-integration-modal-BC0jExDZ.js +0 -1
- package/core/built/admin/assets/add-newsletter-modal-DchTkA7l.js +0 -1
- package/core/built/admin/assets/add-recommendation-modal-DMvaJZKp.js +0 -1
- package/core/built/admin/assets/alert-dialog-QhXzdHfc.js +0 -1
- package/core/built/admin/assets/analytics-No1DDY3A.js +0 -1
- package/core/built/admin/assets/automated-emails-te1D5kq-.js +0 -1
- package/core/built/admin/assets/automations-DpUNUdcZ.js +0 -1
- package/core/built/admin/assets/bluesky-sharing-Cjrv_f62.js +0 -1
- package/core/built/admin/assets/chunk.896.435fe0637944d4a69810.js +0 -366
- package/core/built/admin/assets/color-picker-BTY_NdEm.js +0 -3
- package/core/built/admin/assets/color-picker-field-CPlkzOH0.js +0 -1
- package/core/built/admin/assets/combobox-DrMtv_4P.js +0 -1
- package/core/built/admin/assets/command-ZdgYJpoI.js +0 -1
- package/core/built/admin/assets/comments-kidj60-h.js +0 -1
- package/core/built/admin/assets/confirmation-context-BhbmQQEl.js +0 -1
- package/core/built/admin/assets/custom-field-type-option-CsGIZk1J.js +0 -10
- package/core/built/admin/assets/custom-integration-modal-BY37O_9X.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-DUSKM4uC.js +0 -22
- package/core/built/admin/assets/dialog-B44iRwlc.js +0 -1
- package/core/built/admin/assets/dirty-confirm-dialog-BxgQgQ6H.js +0 -1
- package/core/built/admin/assets/dist-Cy8tfrp_.js +0 -1
- package/core/built/admin/assets/domain-Ca6KhoQt.js +0 -1
- package/core/built/admin/assets/dropzone-Bb-5zQTk.js +0 -5
- package/core/built/admin/assets/edit-profile-BdupLlus.js +0 -1
- package/core/built/admin/assets/editor-BP883Lpn.js +0 -8
- package/core/built/admin/assets/explore-FB-CimXw.js +0 -1
- package/core/built/admin/assets/feed-C1GxsmI2.js +0 -1
- package/core/built/admin/assets/filter-sources-D5n5bFA2.js +0 -1
- package/core/built/admin/assets/filters-DJEzkMUK.js +0 -1
- package/core/built/admin/assets/filters-MZXvdH5D.js +0 -1
- package/core/built/admin/assets/first-promoter-modal-CGTGLCr5.js +0 -1
- package/core/built/admin/assets/gift-link-modal-B6v0tnRN.js +0 -1
- package/core/built/admin/assets/growth-BGAJD1rs.js +0 -3
- package/core/built/admin/assets/history-modal-iKwUY3XR.js +0 -1
- package/core/built/admin/assets/hooks-CuEZV2-q.js +0 -2
- package/core/built/admin/assets/index-DjQe-e5s.js +0 -4
- package/core/built/admin/assets/index-Dqf2x-ry.css +0 -1
- package/core/built/admin/assets/index.es-VihPwfeH.js +0 -1
- package/core/built/admin/assets/input--W-rCTrX.js +0 -1
- package/core/built/admin/assets/invite-user-modal-MdImLCaJ.js +0 -1
- package/core/built/admin/assets/koenig-loader-DYZpm6El.js +0 -2
- package/core/built/admin/assets/label-picker-cB51xl1r.js +0 -1
- package/core/built/admin/assets/layout-c_B_1hax.js +0 -1
- package/core/built/admin/assets/link-helpers-MVDdnFCY.js +0 -1
- package/core/built/admin/assets/loading-indicator-BpFWTVgh.js +0 -1
- package/core/built/admin/assets/member-custom-fields-qs0dIkxM.js +0 -1
- package/core/built/admin/assets/member-detail-B6uec2a6.js +0 -1
- package/core/built/admin/assets/members-BQF3CqhI.js +0 -2
- package/core/built/admin/assets/moderation-DY4wF1Q3.js +0 -1
- package/core/built/admin/assets/navigation-modal-DX-gNF3X.js +0 -1
- package/core/built/admin/assets/newsletter-CyQA7m3m.js +0 -1
- package/core/built/admin/assets/newsletter-detail-modal-BDrptuxn.js +0 -1
- package/core/built/admin/assets/newsletters-DXuNmC42.js +0 -1
- package/core/built/admin/assets/newsletters-DhNigJUh.js +0 -1
- package/core/built/admin/assets/note-Cgo2LCJ6.js +0 -1
- package/core/built/admin/assets/notifications-BC50AMku.js +0 -1
- package/core/built/admin/assets/offers-container-modal-DWycIMzT.js +0 -1
- package/core/built/admin/assets/onboarding-DGQuV7Ew.js +0 -1
- package/core/built/admin/assets/overview-CVbFtn-k.js +0 -1
- package/core/built/admin/assets/overview-YKj7SZaK.js +0 -1
- package/core/built/admin/assets/pages-B6vr9F_D.js +0 -1
- package/core/built/admin/assets/popover-CCy0h5rq.js +0 -1
- package/core/built/admin/assets/portal-frame-dc4XKr0e.js +0 -1
- package/core/built/admin/assets/portal-modal-BvvdF_B9.js +0 -1
- package/core/built/admin/assets/post-analytics-DX470WRG.js +0 -1
- package/core/built/admin/assets/post-analytics-header-CXpJmdDv.js +0 -1
- package/core/built/admin/assets/post-analytics-provider-CLfKGWZy.js +0 -1
- package/core/built/admin/assets/post-helpers-C5OQMBoi.js +0 -1
- package/core/built/admin/assets/post-share-modal-Cl0NXRJr.js +0 -1
- package/core/built/admin/assets/posts-KY3aUhVV.js +0 -1
- package/core/built/admin/assets/preferences-DO0UUWFp.js +0 -5
- package/core/built/admin/assets/profile-CxT-0l4d.js +0 -1
- package/core/built/admin/assets/router-provider-B0gZyiGJ.js +0 -1
- package/core/built/admin/assets/schemas-4UPic-oD.js +0 -64
- package/core/built/admin/assets/select-DuDUFdPq.js +0 -1
- package/core/built/admin/assets/settings-BjCii7BM.js +0 -1
- package/core/built/admin/assets/settings-b8kNzZSQ.js +0 -4
- package/core/built/admin/assets/share-modal-BV70mr9k.js +0 -1
- package/core/built/admin/assets/shim-ClF_m5ux.js +0 -1
- package/core/built/admin/assets/slack-modal-Be2_KK-z.js +0 -1
- package/core/built/admin/assets/stats-C4reGh9O.js +0 -1
- package/core/built/admin/assets/stats-view-DP9pQ62k.js +0 -1
- package/core/built/admin/assets/stripe-connect-modal-Z-UT_BGc.js +0 -1
- package/core/built/admin/assets/tag-detail-Dc0nTOtU.js +0 -2
- package/core/built/admin/assets/tags-BLaXBwnb.js +0 -1
- package/core/built/admin/assets/testimonials-modal-sFwRnNLh.js +0 -1
- package/core/built/admin/assets/tier-detail-modal-BCFpWwUS.js +0 -1
- package/core/built/admin/assets/tiers-Nd_z4BZY.js +0 -1
- package/core/built/admin/assets/use-filter-params-CAvfDvf1.js +0 -1
- package/core/built/admin/assets/use-growth-stats-D6mZXGhK.js +0 -1
- package/core/built/admin/assets/use-host-limits-DZtR08oa.js +0 -1
- package/core/built/admin/assets/use-pintura-config-CzTfnufz.js +0 -1
- package/core/built/admin/assets/use-reply-chain-data-BeQwz8oF.js +0 -1
- package/core/built/admin/assets/use-settings-navigation-BbrSUVcf.js +0 -1
- package/core/built/admin/assets/use-staff-users-cZg4ugOF.js +0 -1
- package/core/built/admin/assets/use-tinybird-query-B1IMyAcv.js +0 -39
- package/core/built/admin/assets/use-tinybird-token-Bow0Zwn8.js +0 -1
- package/core/built/admin/assets/use-upgrade-route-DhRSo7at.js +0 -1
- package/core/built/admin/assets/user-detail-modal-yipSoQfv.js +0 -1
- package/core/built/admin/assets/users-5msE1WMs.js +0 -1
- package/core/built/admin/assets/web-CKcXAu86.js +0 -1
- package/core/built/admin/assets/web-DR4TqM3E.js +0 -2
- package/core/server/api/endpoints/member-custom-fields.js +0 -90
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.js +0 -20
- package/core/server/services/email-suppression-list/in-memory-email-suppression-list.js +0 -39
- package/core/server/services/jobs/worker-model-event-bridge.js +0 -149
- package/core/server/services/members/jobs/clean-expired-comped.js +0 -132
- package/core/server/services/members-custom-fields/bindings-service.js +0 -119
- package/core/server/services/members-custom-fields/codec.js +0 -15
- package/core/server/services/members-custom-fields/filter.js +0 -199
- package/core/server/services/members-custom-fields/serializers.js +0 -24
- package/core/server/services/stripe/services/checkout/allowed-countries.js +0 -267
- package/core/server/services/stripe/services/checkout/field-ports.js +0 -34
- package/core/server/services/tier-checkout-config/destinations.js +0 -17
- package/core/server/services/update-check/run-update-check.js +0 -63
- /package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js.LICENSE.txt → chunk.901.4ccc639821020230bcca.js.LICENSE.txt} +0 -0
- /package/core/server/services/{members-custom-fields → members-metafields}/storage.js +0 -0
|
@@ -146,6 +146,17 @@ module.exports = class MemberController {
|
|
|
146
146
|
|
|
147
147
|
if (tierId && cadence) {
|
|
148
148
|
const tier = await this._tiersService.api.read(tierId);
|
|
149
|
+
|
|
150
|
+
if (!tier) {
|
|
151
|
+
res.writeHead(404);
|
|
152
|
+
return res.end('Not Found.');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (tier.status !== 'active') {
|
|
156
|
+
res.writeHead(403);
|
|
157
|
+
return res.end('Tier is archived.');
|
|
158
|
+
}
|
|
159
|
+
|
|
149
160
|
const stripePrice = await this._paymentsService.getPriceForTierCadence(tier, cadence);
|
|
150
161
|
|
|
151
162
|
await this._memberRepository.updateSubscription({
|
|
@@ -140,7 +140,6 @@ module.exports = class RouterController {
|
|
|
140
140
|
* @param {any} deps.offersAPI
|
|
141
141
|
* @param {any} deps.paymentsService
|
|
142
142
|
* @param {any} deps.memberRepository
|
|
143
|
-
* @param {any} deps.StripePrice
|
|
144
143
|
* @param {() => boolean} deps.allowSelfSignup
|
|
145
144
|
* @param {any} deps.magicLinkService
|
|
146
145
|
* @param {import('../../../stripe/stripe-api')} deps.stripeAPIService
|
|
@@ -160,7 +159,6 @@ module.exports = class RouterController {
|
|
|
160
159
|
paymentsService,
|
|
161
160
|
tiersService,
|
|
162
161
|
memberRepository,
|
|
163
|
-
StripePrice,
|
|
164
162
|
allowSelfSignup,
|
|
165
163
|
magicLinkService,
|
|
166
164
|
stripeAPIService,
|
|
@@ -180,7 +178,6 @@ module.exports = class RouterController {
|
|
|
180
178
|
this._paymentsService = paymentsService;
|
|
181
179
|
this._tiersService = tiersService;
|
|
182
180
|
this._memberRepository = memberRepository;
|
|
183
|
-
this._StripePrice = StripePrice;
|
|
184
181
|
this._allowSelfSignup = allowSelfSignup;
|
|
185
182
|
this._magicLinkService = magicLinkService;
|
|
186
183
|
this._stripeAPIService = stripeAPIService;
|
|
@@ -602,11 +599,11 @@ module.exports = class RouterController {
|
|
|
602
599
|
if (member) {
|
|
603
600
|
options.successUrl = this._generateSuccessUrl(options.successUrl, tier.welcomePageURL);
|
|
604
601
|
|
|
605
|
-
|
|
602
|
+
// Existing paid members must manage their subscription instead of creating another.
|
|
603
|
+
// Other members must prove ownership of the provided email before checking out.
|
|
604
|
+
const restrictCheckout = member.get('status') === 'paid' || !options.isAuthenticated;
|
|
606
605
|
|
|
607
606
|
if (restrictCheckout) {
|
|
608
|
-
// This member is already subscribed to a paid tier
|
|
609
|
-
// We don't want to create a duplicate subscription
|
|
610
607
|
if (!options.isAuthenticated && options.email) {
|
|
611
608
|
try {
|
|
612
609
|
await this._sendEmailWithMagicLink({ email: options.email, requestedType: 'signin' });
|
|
@@ -7,6 +7,8 @@ const PaymentsService = require('./services/payments-service');
|
|
|
7
7
|
const TokenService = require('./services/token-service');
|
|
8
8
|
const GeolocationService = require('./services/geolocation-service');
|
|
9
9
|
const MemberBREADService = require('./services/member-bread-service');
|
|
10
|
+
const metafields = require('../../members-metafields');
|
|
11
|
+
const { MemberAccountService } = require('../account-service');
|
|
10
12
|
const MemberRepository = require('./repositories/member-repository');
|
|
11
13
|
const NextPaymentCalculator = require('./services/next-payment-calculator');
|
|
12
14
|
|
|
@@ -41,7 +43,6 @@ module.exports = function MembersAPI({
|
|
|
41
43
|
MemberProductEvent,
|
|
42
44
|
MemberEmailChangeEvent,
|
|
43
45
|
MemberCreatedEvent,
|
|
44
|
-
SubscriptionCreatedEvent,
|
|
45
46
|
MemberLinkClickEvent,
|
|
46
47
|
EmailSpamComplaintEvent,
|
|
47
48
|
Offer,
|
|
@@ -71,7 +72,8 @@ module.exports = function MembersAPI({
|
|
|
71
72
|
commentsService,
|
|
72
73
|
emailAddressService,
|
|
73
74
|
giftService,
|
|
74
|
-
|
|
75
|
+
metafieldValues,
|
|
76
|
+
metafieldDefinitions,
|
|
75
77
|
}) {
|
|
76
78
|
const tokenService = new TokenService({
|
|
77
79
|
privateKey,
|
|
@@ -119,7 +121,6 @@ module.exports = function MembersAPI({
|
|
|
119
121
|
MemberStatusEvent,
|
|
120
122
|
MemberLoginEvent,
|
|
121
123
|
MemberCreatedEvent,
|
|
122
|
-
SubscriptionCreatedEvent,
|
|
123
124
|
MemberLinkClickEvent,
|
|
124
125
|
MemberFeedback,
|
|
125
126
|
EmailSpamComplaintEvent,
|
|
@@ -147,7 +148,6 @@ module.exports = function MembersAPI({
|
|
|
147
148
|
});
|
|
148
149
|
},
|
|
149
150
|
},
|
|
150
|
-
labsService,
|
|
151
151
|
stripeService: stripeAPIService,
|
|
152
152
|
memberAttributionService,
|
|
153
153
|
emailSuppressionList,
|
|
@@ -155,7 +155,8 @@ module.exports = function MembersAPI({
|
|
|
155
155
|
nextPaymentCalculator,
|
|
156
156
|
commentsService,
|
|
157
157
|
giftService,
|
|
158
|
-
|
|
158
|
+
metafieldValues,
|
|
159
|
+
metafieldDefinitions,
|
|
159
160
|
});
|
|
160
161
|
|
|
161
162
|
const geolocationService = new GeolocationService();
|
|
@@ -202,7 +203,6 @@ module.exports = function MembersAPI({
|
|
|
202
203
|
paymentsService,
|
|
203
204
|
tiersService,
|
|
204
205
|
memberRepository,
|
|
205
|
-
StripePrice,
|
|
206
206
|
allowSelfSignup,
|
|
207
207
|
magicLinkService,
|
|
208
208
|
stripeAPIService,
|
|
@@ -358,11 +358,27 @@ module.exports = function MembersAPI({
|
|
|
358
358
|
}
|
|
359
359
|
|
|
360
360
|
async function getMemberIdentityData(email) {
|
|
361
|
-
return memberBREADService.read({ email });
|
|
361
|
+
return memberBREADService.read({ email }, { metafieldsFor: null });
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const account = new MemberAccountService({
|
|
365
|
+
memberBREADService,
|
|
366
|
+
members: users,
|
|
367
|
+
emailSuppressionList,
|
|
368
|
+
metafieldValues: metafields.values,
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
async function getMemberIdentity(transientId) {
|
|
372
|
+
if (!transientId) {
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
const member = await users.get({ transient_id: transientId });
|
|
377
|
+
return member ? { id: member.id, email: member.get('email') } : null;
|
|
362
378
|
}
|
|
363
379
|
|
|
364
380
|
async function getMemberIdentityDataFromTransientId(transientId) {
|
|
365
|
-
return memberBREADService.read({ transient_id: transientId });
|
|
381
|
+
return memberBREADService.read({ transient_id: transientId }, { metafieldsFor: null });
|
|
366
382
|
}
|
|
367
383
|
|
|
368
384
|
async function cycleTransientId(memberId) {
|
|
@@ -502,6 +518,7 @@ module.exports = function MembersAPI({
|
|
|
502
518
|
getMemberIdentityToken,
|
|
503
519
|
getMemberEntitlementToken,
|
|
504
520
|
getMemberIdentityDataFromTransientId,
|
|
521
|
+
getMemberIdentity,
|
|
505
522
|
getMemberIdentityData,
|
|
506
523
|
cycleTransientId,
|
|
507
524
|
setMemberGeolocationFromIp,
|
|
@@ -510,6 +527,7 @@ module.exports = function MembersAPI({
|
|
|
510
527
|
sendEmailWithMagicLink,
|
|
511
528
|
getMagicLink,
|
|
512
529
|
members: users,
|
|
530
|
+
account,
|
|
513
531
|
memberBREADService,
|
|
514
532
|
events: eventRepository,
|
|
515
533
|
productRepository,
|
|
@@ -34,13 +34,11 @@ module.exports = class EventRepository {
|
|
|
34
34
|
MemberStatusEvent,
|
|
35
35
|
MemberLoginEvent,
|
|
36
36
|
MemberCreatedEvent,
|
|
37
|
-
SubscriptionCreatedEvent,
|
|
38
37
|
MemberPaidSubscriptionEvent,
|
|
39
38
|
MemberLinkClickEvent,
|
|
40
39
|
MemberFeedback,
|
|
41
40
|
EmailSpamComplaintEvent,
|
|
42
41
|
Comment,
|
|
43
|
-
labsService,
|
|
44
42
|
memberAttributionService,
|
|
45
43
|
urlService,
|
|
46
44
|
MemberEmailChangeEvent,
|
|
@@ -55,10 +53,8 @@ module.exports = class EventRepository {
|
|
|
55
53
|
this._MemberLoginEvent = MemberLoginEvent;
|
|
56
54
|
this._EmailRecipient = EmailRecipient;
|
|
57
55
|
this._Comment = Comment;
|
|
58
|
-
this._labsService = labsService;
|
|
59
56
|
this._urlService = urlService;
|
|
60
57
|
this._MemberCreatedEvent = MemberCreatedEvent;
|
|
61
|
-
this._SubscriptionCreatedEvent = SubscriptionCreatedEvent;
|
|
62
58
|
this._MemberLinkClickEvent = MemberLinkClickEvent;
|
|
63
59
|
this._MemberFeedback = MemberFeedback;
|
|
64
60
|
this._EmailSpamComplaintEvent = EmailSpamComplaintEvent;
|
|
@@ -878,10 +878,10 @@ module.exports = class MemberRepository {
|
|
|
878
878
|
(n) => n.attributes.status === 'archived',
|
|
879
879
|
);
|
|
880
880
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
881
|
+
// bookshelf-relations only touches the join table when the key is present,
|
|
882
|
+
// so an update that does not set newsletters leaves them all attached and
|
|
883
|
+
// has nothing to preserve.
|
|
884
|
+
if (memberData.newsletters && archivedNewsletters.length > 0) {
|
|
885
885
|
archivedNewsletters.forEach((n) => memberData.newsletters.push(n));
|
|
886
886
|
}
|
|
887
887
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const errors = require('@tryghost/errors');
|
|
2
|
+
const { ADMIN } = require('../../../members-metafields');
|
|
2
3
|
const logging = require('@tryghost/logging');
|
|
3
4
|
const tpl = require('@tryghost/tpl');
|
|
4
5
|
const moment = require('moment');
|
|
@@ -7,20 +8,15 @@ const messages = {
|
|
|
7
8
|
stripeNotConnected: 'Missing Stripe connection.',
|
|
8
9
|
memberAlreadyExists: 'Member already exists.',
|
|
9
10
|
memberNotFound: 'Member not found.',
|
|
10
|
-
|
|
11
|
+
metafieldsOnAdd:
|
|
11
12
|
'Custom field values cannot be set while creating a member. Create the member, then set values with an edit.',
|
|
12
|
-
|
|
13
|
+
metafieldsWithoutWriter:
|
|
13
14
|
'Custom field values cannot be set by a request with no authenticated user or integration.',
|
|
14
15
|
};
|
|
15
16
|
|
|
16
17
|
// Stored in the action's `context.action_name`; Admin maps it to a display label.
|
|
17
18
|
const CUSTOM_FIELDS_EDITED_ACTION = 'custom_fields_edited';
|
|
18
19
|
|
|
19
|
-
/**
|
|
20
|
-
* @typedef {object} ILabsService
|
|
21
|
-
* @prop {(key: string) => boolean} isSet
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
20
|
/**
|
|
25
21
|
* @typedef {object} IEmailService
|
|
26
22
|
* @prop {(data: {email: string, requestedType: string}) => Promise<any>} sendEmailWithMagicLink
|
|
@@ -45,7 +41,6 @@ module.exports = class MemberBREADService {
|
|
|
45
41
|
* @param {object} deps
|
|
46
42
|
* @param {import('../repositories/member-repository')} deps.memberRepository
|
|
47
43
|
* @param {import('../../../offers/application/offers-api')} deps.offersAPI
|
|
48
|
-
* @param {ILabsService} deps.labsService
|
|
49
44
|
* @param {IEmailService} deps.emailService
|
|
50
45
|
* @param {IStripeService} deps.stripeService
|
|
51
46
|
* @param {import('../../../member-attribution/member-attribution-service')} deps.memberAttributionService
|
|
@@ -53,11 +48,11 @@ module.exports = class MemberBREADService {
|
|
|
53
48
|
* @param {import('../../../settings-helpers/settings-helpers')} deps.settingsHelpers
|
|
54
49
|
* @param {import('./next-payment-calculator')} deps.nextPaymentCalculator
|
|
55
50
|
* @param {IGiftsModule} deps.giftService
|
|
56
|
-
* @param {import('../../../members-
|
|
51
|
+
* @param {import('../../../members-metafields/values-service').MetafieldValuesService} deps.metafieldValues Required: boot builds it before the members service
|
|
52
|
+
* @param {import('../../../members-metafields/definitions-service').MetafieldDefinitionsService} deps.metafieldDefinitions Required: boot builds it before the members service
|
|
57
53
|
*/
|
|
58
54
|
constructor({
|
|
59
55
|
memberRepository,
|
|
60
|
-
labsService,
|
|
61
56
|
emailService,
|
|
62
57
|
stripeService,
|
|
63
58
|
offersAPI,
|
|
@@ -67,14 +62,13 @@ module.exports = class MemberBREADService {
|
|
|
67
62
|
nextPaymentCalculator,
|
|
68
63
|
commentsService,
|
|
69
64
|
giftService,
|
|
70
|
-
|
|
65
|
+
metafieldValues,
|
|
66
|
+
metafieldDefinitions,
|
|
71
67
|
}) {
|
|
72
68
|
this.offersAPI = offersAPI;
|
|
73
69
|
/** @private */
|
|
74
70
|
this.memberRepository = memberRepository;
|
|
75
71
|
/** @private */
|
|
76
|
-
this.labsService = labsService;
|
|
77
|
-
/** @private */
|
|
78
72
|
this.emailService = emailService;
|
|
79
73
|
/** @private */
|
|
80
74
|
this.stripeService = stripeService;
|
|
@@ -91,36 +85,30 @@ module.exports = class MemberBREADService {
|
|
|
91
85
|
/** @private */
|
|
92
86
|
this.giftService = giftService;
|
|
93
87
|
/** @private */
|
|
94
|
-
this.
|
|
88
|
+
this.metafieldValues = metafieldValues;
|
|
89
|
+
/** @private */
|
|
90
|
+
this.metafieldDefinitions = metafieldDefinitions;
|
|
95
91
|
}
|
|
96
92
|
|
|
97
93
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* `custom_fields` key entirely, keeping a pre-feature member payload identical.
|
|
102
|
-
*
|
|
103
|
-
* A read gets values on the flag alone, with no opt-in include: a member's
|
|
104
|
-
* custom fields are their own data, like labels and tiers, which a read
|
|
105
|
-
* already returns unasked. `include` is for things that are expensive or
|
|
106
|
-
* aggregate (email_recipients, counts), and one flat lookup on a read that
|
|
107
|
-
* already issues a dozen queries is neither. The flag, not an include, is what
|
|
108
|
-
* protects consumers that predate the feature — an include would outlive it
|
|
109
|
-
* and become permanent API surface.
|
|
94
|
+
* Metafields are extra fields a publisher can define on member records, such as a shoe
|
|
95
|
+
* size or a delivery address. Their values live in their own table, so they are fetched
|
|
96
|
+
* here rather than loaded alongside the member.
|
|
110
97
|
*
|
|
111
|
-
*
|
|
112
|
-
* `
|
|
113
|
-
*
|
|
114
|
-
*
|
|
98
|
+
* Returns null when the site has defined no fields, which tells the caller to leave the
|
|
99
|
+
* `metafields` key off the member payload rather than send an empty object: a key added to
|
|
100
|
+
* an API response cannot be withdrawn without breaking whoever started reading it, and
|
|
101
|
+
* most sites have never defined a field, so those sites keep the payload they had before
|
|
102
|
+
* this feature existed.
|
|
115
103
|
* @param {string[]} memberIds
|
|
116
104
|
* @returns {Promise<Map<string, Record<string, unknown>> | null>}
|
|
117
105
|
*/
|
|
118
|
-
async
|
|
119
|
-
if (!this.
|
|
106
|
+
async fetchMetafieldValues(memberIds, audience) {
|
|
107
|
+
if (!(await this.metafieldDefinitions.hasAnyActive())) {
|
|
120
108
|
return null;
|
|
121
109
|
}
|
|
122
110
|
|
|
123
|
-
return this.
|
|
111
|
+
return this.metafieldValues.getValuesForMembers(memberIds, audience);
|
|
124
112
|
}
|
|
125
113
|
|
|
126
114
|
/**
|
|
@@ -394,7 +382,18 @@ module.exports = class MemberBREADService {
|
|
|
394
382
|
}
|
|
395
383
|
}
|
|
396
384
|
|
|
397
|
-
|
|
385
|
+
/**
|
|
386
|
+
* @param {object} data
|
|
387
|
+
* @param {object} [options]
|
|
388
|
+
* @param {import('../../../members-metafields').Audience | null} [options.metafieldsFor]
|
|
389
|
+
* Who the extra fields a publisher defined are being read for, or null to leave them
|
|
390
|
+
* off entirely. Null is not the same as "nobody may see them": it means this caller
|
|
391
|
+
* never shows them, so fetching them is two database queries whose results are thrown
|
|
392
|
+
* away. Ghost identifies a signed-in reader on every page view of a themed site
|
|
393
|
+
* through this method, and that caller renders a member through a fixed list of
|
|
394
|
+
* fields which has never included these.
|
|
395
|
+
*/
|
|
396
|
+
async read(data, { metafieldsFor = ADMIN, ...options } = {}) {
|
|
398
397
|
const defaultWithRelated = [
|
|
399
398
|
'labels',
|
|
400
399
|
'stripeSubscriptions',
|
|
@@ -455,43 +454,25 @@ module.exports = class MemberBREADService {
|
|
|
455
454
|
const unsubscribeUrl = this.settingsHelpers.createUnsubscribeUrl(member.uuid);
|
|
456
455
|
member.unsubscribe_url = unsubscribeUrl;
|
|
457
456
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
457
|
+
if (metafieldsFor) {
|
|
458
|
+
const metafields = await this.fetchMetafieldValues([member.id], metafieldsFor);
|
|
459
|
+
if (metafields) {
|
|
460
|
+
member.metafields = metafields.get(member.id) ?? {};
|
|
461
|
+
}
|
|
461
462
|
}
|
|
462
463
|
|
|
463
464
|
return member;
|
|
464
465
|
}
|
|
465
466
|
|
|
466
|
-
/**
|
|
467
|
-
* @private
|
|
468
|
-
* The write-side flag gate, paired with `fetchCustomFieldValues` on the read
|
|
469
|
-
* side. The schema declares `custom_fields` for every site, so the key arrives
|
|
470
|
-
* whether or not the feature is on and this is what decides it goes no further.
|
|
471
|
-
* @param {object} data
|
|
472
|
-
*/
|
|
473
|
-
dropCustomFieldsWhenDisabled(data) {
|
|
474
|
-
if (!this.labsService.isSet('membersCustomFields')) {
|
|
475
|
-
delete data.custom_fields;
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
|
|
479
467
|
async add(data, options) {
|
|
480
|
-
this.
|
|
481
|
-
|
|
482
|
-
// Values cannot be set on create, only on a subsequent edit. `namesValues`
|
|
483
|
-
// both judges the body and rejects a malformed one, so a body refused here is
|
|
484
|
-
// refused on edit for the same reason.
|
|
485
|
-
if (this.customFieldValues.namesValues(data.custom_fields)) {
|
|
468
|
+
if (this.metafieldValues.namesValues(this.metafieldValues.unwrapWire(data.metafields))) {
|
|
486
469
|
throw new errors.ValidationError({
|
|
487
|
-
message: tpl(messages.
|
|
488
|
-
property: '
|
|
470
|
+
message: tpl(messages.metafieldsOnAdd),
|
|
471
|
+
property: 'metafields',
|
|
489
472
|
});
|
|
490
473
|
}
|
|
491
474
|
|
|
492
|
-
|
|
493
|
-
// an absent key or one naming no values gets this far.
|
|
494
|
-
delete data.custom_fields;
|
|
475
|
+
delete data.metafields;
|
|
495
476
|
|
|
496
477
|
if (!this.stripeService.configured && (data.comped || data.stripe_customer_id)) {
|
|
497
478
|
const property = data.comped ? 'comped' : 'stripe_customer_id';
|
|
@@ -587,22 +568,16 @@ module.exports = class MemberBREADService {
|
|
|
587
568
|
async edit(data, options) {
|
|
588
569
|
delete data.last_seen_at;
|
|
589
570
|
|
|
590
|
-
this.
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
// the repository sees it — `custom_fields` is not a member column. The gate
|
|
594
|
-
// above has already dropped it when the feature is off, so by this point its
|
|
595
|
-
// presence is the signal to write.
|
|
596
|
-
const customFields = data.custom_fields;
|
|
597
|
-
const writeCustomFields = customFields !== undefined;
|
|
598
|
-
delete data.custom_fields;
|
|
571
|
+
const metafields = this.metafieldValues.unwrapWire(data.metafields);
|
|
572
|
+
const writeMetafields = metafields !== undefined;
|
|
573
|
+
delete data.metafields;
|
|
599
574
|
|
|
600
575
|
// Plan (which validates) before the member is touched, so a bad value 422s
|
|
601
576
|
// here rather than after the member edit has been applied — and keep the
|
|
602
577
|
// plan to apply once below, so the values aren't resolved and validated
|
|
603
578
|
// twice.
|
|
604
|
-
const
|
|
605
|
-
? await this.
|
|
579
|
+
const plannedMetafields = writeMetafields
|
|
580
|
+
? await this.metafieldValues.planWrite(metafields, ADMIN)
|
|
606
581
|
: null;
|
|
607
582
|
|
|
608
583
|
let model;
|
|
@@ -655,7 +630,7 @@ module.exports = class MemberBREADService {
|
|
|
655
630
|
}
|
|
656
631
|
}
|
|
657
632
|
|
|
658
|
-
if (
|
|
633
|
+
if (plannedMetafields) {
|
|
659
634
|
// Every value reaching here was typed into the Admin API, so the writer is
|
|
660
635
|
// whoever made the request — the same pair the action log records, so the two
|
|
661
636
|
// agree about who did it rather than one saying only that it was "admin".
|
|
@@ -666,15 +641,15 @@ module.exports = class MemberBREADService {
|
|
|
666
641
|
const context = options.context || {};
|
|
667
642
|
if (!context.integration && !context.user) {
|
|
668
643
|
throw new errors.IncorrectUsageError({
|
|
669
|
-
message: tpl(messages.
|
|
644
|
+
message: tpl(messages.metafieldsWithoutWriter),
|
|
670
645
|
});
|
|
671
646
|
}
|
|
672
647
|
const writtenBy = context.integration
|
|
673
648
|
? { type: 'integration', id: context.integration.id }
|
|
674
649
|
: { type: 'user', id: context.user };
|
|
675
|
-
await this.
|
|
650
|
+
await this.metafieldValues.applyWrite(model.id, plannedMetafields, { writtenBy });
|
|
676
651
|
|
|
677
|
-
//
|
|
652
|
+
// Metafields aren't a member column or relation, so an edit touching
|
|
678
653
|
// only them leaves `model._changed` empty and the save fires nothing.
|
|
679
654
|
// Declare the change into `_changed` — as bookshelf-relations does for a
|
|
680
655
|
// labels change — so the member's edited lifecycle fires its usual signals
|
|
@@ -684,13 +659,13 @@ module.exports = class MemberBREADService {
|
|
|
684
659
|
// populated `_changed` and fired the edited event during update(), so
|
|
685
660
|
// re-firing would duplicate it (this also covers a full PUT that resends
|
|
686
661
|
// unchanged member fields — `_changed` stays empty there too). That
|
|
687
|
-
// combined event omits `
|
|
688
|
-
// reads:
|
|
662
|
+
// combined event omits `metafields` from `_changed`, which nothing
|
|
663
|
+
// reads: metafields aren't in the webhook payload (they're injected
|
|
689
664
|
// into read/browse responses, not the model), and `_changed` only gates
|
|
690
665
|
// whether the event fires.
|
|
691
666
|
const memberUnchanged = !model._changed || Object.keys(model._changed).length === 0;
|
|
692
|
-
if (memberUnchanged &&
|
|
693
|
-
model._changed = {
|
|
667
|
+
if (memberUnchanged && plannedMetafields.length > 0) {
|
|
668
|
+
model._changed = { metafields: true };
|
|
694
669
|
// A mixed edit keeps the generic label on purpose: relabelling the
|
|
695
670
|
// one action a member change already fired would bury that change
|
|
696
671
|
// behind this one.
|
|
@@ -819,8 +794,11 @@ module.exports = class MemberBREADService {
|
|
|
819
794
|
|
|
820
795
|
// One query for the whole page, not one per member. `null` when the flag
|
|
821
796
|
// is off or the caller didn't ask — the same truthiness guard read uses.
|
|
822
|
-
const
|
|
823
|
-
? await this.
|
|
797
|
+
const metafieldsByMember = options.includeMetafields
|
|
798
|
+
? await this.fetchMetafieldValues(
|
|
799
|
+
page.data.map((model) => model.id),
|
|
800
|
+
ADMIN,
|
|
801
|
+
)
|
|
824
802
|
: null;
|
|
825
803
|
|
|
826
804
|
const data = page.data.map((model, index) => {
|
|
@@ -832,8 +810,8 @@ module.exports = class MemberBREADService {
|
|
|
832
810
|
if (!originalWithRelated.includes('products')) {
|
|
833
811
|
delete member.products;
|
|
834
812
|
}
|
|
835
|
-
if (
|
|
836
|
-
member.
|
|
813
|
+
if (metafieldsByMember) {
|
|
814
|
+
member.metafields = metafieldsByMember.get(model.id) ?? {};
|
|
837
815
|
}
|
|
838
816
|
member.email_suppression = {
|
|
839
817
|
suppressed: bulkSuppressionData[index].suppressed || !!model.get('email_disabled'),
|
|
@@ -161,7 +161,7 @@ class PaymentsService {
|
|
|
161
161
|
*/
|
|
162
162
|
async getCheckoutConfigForTier(tier) {
|
|
163
163
|
const checkoutConfig = this.tiersService?.checkout;
|
|
164
|
-
if (!this.labsService?.isSet('
|
|
164
|
+
if (!this.labsService?.isSet('stripeCheckoutCollection') || !checkoutConfig) {
|
|
165
165
|
return undefined;
|
|
166
166
|
}
|
|
167
167
|
try {
|
|
@@ -307,6 +307,24 @@ class MembersSSR {
|
|
|
307
307
|
*
|
|
308
308
|
* @returns {Promise<Member>}
|
|
309
309
|
*/
|
|
310
|
+
/**
|
|
311
|
+
* Who this session belongs to, without loading them.
|
|
312
|
+
*
|
|
313
|
+
* The counterpart to `getMemberDataFromSession`, for callers that need to know a
|
|
314
|
+
* member is there rather than what is on their record.
|
|
315
|
+
*
|
|
316
|
+
* @method getMemberIdentityFromSession
|
|
317
|
+
* @param {Request} req
|
|
318
|
+
* @param {Response} res
|
|
319
|
+
*
|
|
320
|
+
* @returns {Promise<{id: string, email: string} | null>}
|
|
321
|
+
*/
|
|
322
|
+
async getMemberIdentityFromSession(req, res) {
|
|
323
|
+
const transientId = this._getSessionCookies(req, res);
|
|
324
|
+
const api = await this._getMembersApi();
|
|
325
|
+
return api.getMemberIdentity(transientId);
|
|
326
|
+
}
|
|
327
|
+
|
|
310
328
|
async getMemberDataFromSession(req, res) {
|
|
311
329
|
const transientId = this._getSessionCookies(req, res);
|
|
312
330
|
const member = await this._getMemberIdentityDataFromTransientId(transientId);
|