ghost 6.60.0 → 6.62.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-custom-field-types-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-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/core/boot.js +62 -21
- 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/{PolarAngleAxis-C4qtHy1B.js → PolarAngleAxis-pkMyqz8g.js} +1 -1
- package/core/built/admin/assets/{RadialBarChart-Bh09Stsj.js → RadialBarChart-JAKoS4KT.js} +1 -1
- package/core/built/admin/assets/{about-BgpmhCuM.js → about-Dyae_UT6.js} +1 -1
- package/core/built/admin/assets/account-migration-CESa0mnX.js +1 -0
- package/core/built/admin/assets/{action-list-lGzZLHc8.js → action-list-C4v0-du8.js} +1 -1
- package/core/built/admin/assets/activitypub/{account-migration-DMHuPnJn.js → account-migration-By69CgCp.js} +16 -16
- package/core/built/admin/assets/activitypub/activitypub.js +9 -10
- package/core/built/admin/assets/activitypub/{avatar-DhTo5D1B.js → avatar-DLPL3Abs.js} +59 -68
- package/core/built/admin/assets/activitypub/{avatar-flipboard-DnVgbEfa.js → avatar-flipboard-C9iDY-QV.js} +2 -2
- package/core/built/admin/assets/activitypub/{bluesky-sharing-BT4zAlW7.js → bluesky-sharing-BJcPMrDd.js} +37 -37
- package/core/built/admin/assets/activitypub/{content-formatters-BeDZ-DIa.js → content-formatters-3rTHg3mp.js} +18 -18
- package/core/built/admin/assets/activitypub/{copy-8sqxUuNd.js → copy-DIAOQoCZ.js} +2 -2
- package/core/built/admin/assets/activitypub/{domain-xQDDu1CS.js → domain-DUR4xSkV.js} +121 -121
- package/core/built/admin/assets/activitypub/{edit-profile-BXdF_r2G.js → edit-profile-BqtfzxCp.js} +40 -40
- package/core/built/admin/assets/activitypub/{explore-CMt7gKlL.js → explore-BxuJd-J4.js} +27 -27
- package/core/built/admin/assets/activitypub/{feed-Bwqdddp_.js → feed-BM1TcksA.js} +51 -51
- package/core/built/admin/assets/activitypub/{field-4co_8FVg.js → field-Dn7HHx2-.js} +3 -3
- package/core/built/admin/assets/activitypub/{hash-DwakMs4X.js → hash-Bm3WxYN4.js} +2 -2
- package/core/built/admin/assets/activitypub/inbox-CCjkuow2.js +1284 -0
- package/core/built/admin/assets/activitypub/{inbox-ckD4wo_r.js → inbox-d8oJRTf4.js} +2 -2
- package/core/built/admin/assets/activitypub/label-1AA_s9Fa.js +16 -0
- package/core/built/admin/assets/activitypub/layout-2-0bw6HN.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-KCCO7L2J.js → moderation-CnmxEB8w.js} +91 -91
- package/core/built/admin/assets/activitypub/{note-BX_Bz5A0.js → note-ZKc_Bnba.js} +24 -24
- package/core/built/admin/assets/activitypub/{notifications-BQOYGvRv.js → notifications-CB2tJZau.js} +51 -51
- package/core/built/admin/assets/activitypub/{onboarding-CNelD_uF.js → onboarding-BsJ9E5qf.js} +2 -2
- package/core/built/admin/assets/activitypub/{onboarding-mat5Hrl0.js → onboarding-CSUJJIlh.js} +2 -2
- package/core/built/admin/assets/activitypub/{preferences-6h43G9_q.js → preferences-0-JZnUkI.js} +1519 -1519
- package/core/built/admin/assets/activitypub/{profile-BMN9VVZ2.js → profile-C35cFIhM.js} +256 -256
- package/core/built/admin/assets/activitypub/{reply-ZNo04xsO.js → reply-DYK5vVqb.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-3B9mUQ7i.js → routes-BD4vscyc.js} +796 -790
- package/core/built/admin/assets/activitypub/{separator-D9taVCCa.js → separator-BbQqTm-p.js} +3 -3
- package/core/built/admin/assets/activitypub/settings-BsMROdqh.js +315 -0
- package/core/built/admin/assets/activitypub/{site-DHoMupSB.js → site-O0RL9YCN.js} +2 -2
- package/core/built/admin/assets/activitypub/{step-1-BsGGnBuT.js → step-1-BMSx7c_X.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-2-teosIS0k.js → step-2-DtPQzlTH.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-3-BjD5TokC.js → step-3-CLlOZTyt.js} +11 -11
- package/core/built/admin/assets/activitypub/{tabs-Cvwl1wXU.js → tabs-Dxk-b9M-.js} +306 -306
- package/core/built/admin/assets/activitypub/{topic-filter-C3LZJc2X.js → topic-filter-5yZH6tId.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-Dp9f0gov.js → use-activity-pub-queries-CV50qe03.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-C4RI0sa9.js → use-navigate-with-base-path-Bmk5h4lW.js} +220 -220
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-C2oNDMUH.js → use-reply-chain-data-Cbvzgjzd.js} +30 -30
- package/core/built/admin/assets/activitypub/{users-CoX6FT_K.js → users-BjcoP_HC.js} +7 -5
- package/core/built/admin/assets/activitypub/{x-Dxm6pV9X.js → x-DbQZOLiI.js} +2 -2
- package/core/built/admin/assets/add-integration-modal-BlF6rs_f.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-CglVQqah.js +1 -0
- package/core/built/admin/assets/add-recommendation-modal-wz7BsuaG.js +1 -0
- package/core/built/admin/assets/analytics-C4HE1gBg.js +1 -0
- package/core/built/admin/assets/{announcement-bar-modal-BTHiy1ZO.js → announcement-bar-modal-Ci4zz8jO.js} +1 -1
- package/core/built/admin/assets/{api-keys-Boy5pLbD.js → api-keys-Ck-Yteiv.js} +1 -1
- package/core/built/admin/assets/audience-CtbA54Sn.js +1 -0
- package/core/built/admin/assets/{automated-emails-te1D5kq-.js → automated-emails-D5VVMND9.js} +1 -1
- package/core/built/admin/assets/automations-CzKt5fb8.js +1 -0
- package/core/built/admin/assets/bluesky-sharing-BEtJ_gL_.js +1 -0
- package/core/built/admin/assets/{box-By_EgGtm.js → box-CdfQAP_F.js} +1 -1
- package/core/built/admin/assets/{brand-icon-09YqFZjV.js → brand-icon-CrIGOA3Z.js} +1 -1
- package/core/built/admin/assets/{breadcrumb-CcFr_ltt.js → breadcrumb-zUrZrBtW.js} +1 -1
- package/core/built/admin/assets/{button-BshWPHvn.js → button-eNMKQWXr.js} +1 -1
- package/core/built/admin/assets/{card-CiiE7QfM.js → card--VNbfgo3.js} +1 -1
- package/core/built/admin/assets/{chart-BnXyfH11.js → chart-BrhA41Zi.js} +1 -1
- package/core/built/admin/assets/chart-helpers-CfBKt0vT.js +1 -0
- package/core/built/admin/assets/{checkbox-Dwwr_3Py.js → checkbox-CgOn_tKW.js} +1 -1
- package/core/built/admin/assets/{chunk.524.91ecb33e6afc3bd8949b.js → chunk.524.a697dee88db67fdf6021.js} +4 -4
- package/core/built/admin/assets/{chunk.582.512549909741883f960c.js → chunk.582.5ed5d124cfca9c259b9c.js} +6 -6
- package/core/built/admin/assets/{chunk.16.f76a6314082d813d67e0.js → chunk.598.7e056fabb47ce7dbd73f.js} +14 -14
- package/core/built/admin/assets/{code-editor-view-BwIdPy_k.js → code-editor-view-BYNoAoNV.js} +1 -1
- package/core/built/admin/assets/{code-editor-view-CtkF82Fv.js → code-editor-view-K2wI-I5f.js} +1 -1
- package/core/built/admin/assets/color-picker-Ddw80xX6.js +3 -0
- package/core/built/admin/assets/color-picker-field-D9nUhvA7.js +1 -0
- package/core/built/admin/assets/combobox-w9j8PPQT.js +1 -0
- package/core/built/admin/assets/command-BfpHORBv.js +1 -0
- package/core/built/admin/assets/comments-BLmCmyCs.js +1 -0
- package/core/built/admin/assets/confirmation-context-CBM8G0Vj.js +1 -0
- package/core/built/admin/assets/{container-LiZf3XdY.js → container-BuQG1wuP.js} +1 -1
- package/core/built/admin/assets/{content-api-modal-BtpNI92-.js → content-api-modal-TXRz3U7S.js} +1 -1
- package/core/built/admin/assets/context-menu-_QMdd3kp.js +1 -0
- package/core/built/admin/assets/{copy-field-CglgRZyG.js → copy-field-6N01S07E.js} +1 -1
- package/core/built/admin/assets/create-ghost-browse-value-source-qIBymvvf.js +1 -0
- package/core/built/admin/assets/custom-field-type-option-BddFlJFa.js +1 -0
- package/core/built/admin/assets/custom-integration-modal-DmNquxUV.js +1 -0
- package/core/built/admin/assets/{data-list-CupF7bjM.js → data-list-CA2jYGPq.js} +1 -1
- package/core/built/admin/assets/{date-range-select-JPwM0yUj.js → date-range-select-uvz_DtPh.js} +1 -1
- package/core/built/admin/assets/design-and-theme-modal-BSmo12Op.js +2 -0
- package/core/built/admin/assets/{detail-page-D8lx2SdP.js → detail-page-Dnv-CdR1.js} +1 -1
- package/core/built/admin/assets/dirty-confirm-dialog-BZ1iytEd.js +1 -0
- package/core/built/admin/assets/{disabled-sources-indicator-BTJ2ClQu.js → disabled-sources-indicator-DMRrxsiJ.js} +1 -1
- package/core/built/admin/assets/{dist-DzcfoDJ3.js → dist-8YJUlf3B.js} +1 -1
- package/core/built/admin/assets/{dist-Cb5RSHSg.js → dist-B3keLvjj.js} +1 -1
- package/core/built/admin/assets/dist-Dcsslyo72.js +1 -0
- package/core/built/admin/assets/{dist-BT_Z-eCn.js → dist-Dgt2cr6a.js} +1 -1
- package/core/built/admin/assets/domain-BNYrt0aD.js +1 -0
- package/core/built/admin/assets/dropzone-D7nFdAe5.js +5 -0
- package/core/built/admin/assets/edit-profile-C5Asm4LA.js +1 -0
- package/core/built/admin/assets/editor-REokrzci.js +8 -0
- package/core/built/admin/assets/{embed-signup-form-modal-BFTPf04i.js → embed-signup-form-modal-Ds6mPEi5.js} +1 -1
- package/core/built/admin/assets/{empty-indicator-WB1WgT9h.js → empty-indicator-D9QdpuNX.js} +1 -1
- package/core/built/admin/assets/en-B1jX3WMs.js +1 -0
- package/core/built/admin/assets/explore-UY10Egsp.js +1 -0
- package/core/built/admin/assets/feature-image-placeholder-D1iF_8bc.js +1 -0
- package/core/built/admin/assets/feed-81C8mJWR.js +1 -0
- package/core/built/admin/assets/{field-LmNk7wZh.js → field-Dihp5p18.js} +1 -1
- package/core/built/admin/assets/filter-bar-Da1qxybu.js +1 -0
- package/core/built/admin/assets/filter-sources-BO9xUPj7.js +1 -0
- package/core/built/admin/assets/filters-CRUWecfY.js +1 -0
- package/core/built/admin/assets/filters-DirqNXjH.js +1 -0
- package/core/built/admin/assets/first-promoter-modal-CT6MxYZb.js +1 -0
- package/core/built/admin/assets/{ghost-c8807202a07c20030acb719ee0114815.css → ghost-8eabfc1ece81b03cf7b90780d31487e8.css} +1 -1
- package/core/built/admin/assets/{ghost-403cb39badad3df411fc0ba27d220047.js → ghost-c2848508292937415f20f5a830eea59e.js} +31 -28
- package/core/built/admin/assets/{ghost-dark-fbf1e384aaef3ae315e540f0eb7373a7.css → ghost-dark-a7bebe2c561f55369dcf29f4c820f7ff.css} +1 -1
- package/core/built/admin/assets/gift-link-modal-CQVAye17.js +1 -0
- package/core/built/admin/assets/{grid-CUciBfjf.js → grid-Dj29PY05.js} +1 -1
- package/core/built/admin/assets/growth-BWIu-6xj.js +3 -0
- package/core/built/admin/assets/growth-DU29oxeA.js +1 -0
- package/core/built/admin/assets/{heading-CRZZ2FUe.js → heading-Dh5SFVjL.js} +1 -1
- package/core/built/admin/assets/history-modal-CFd1Hvx6.js +1 -0
- package/core/built/admin/assets/html-field-CJBCLTvv.js +1 -0
- package/core/built/admin/assets/{images-C0XvUYMb.js → images-scfkWZiK.js} +1 -1
- package/core/built/admin/assets/{inbox-DZXDUt4s.js → inbox-Mcp4DXZN.js} +14 -14
- package/core/built/admin/assets/index-6MkPdCtr.js +4 -0
- package/core/built/admin/assets/index-Bn7QhcZu.css +2 -0
- package/core/built/admin/assets/index.es-CNnuNH0d.js +1 -0
- package/core/built/admin/assets/{inline-Cw-gigDW.js → inline-BWSs_VzR.js} +1 -1
- package/core/built/admin/assets/{input-group-BPAxETpQ.js → input-group-CMhe2DvY.js} +1 -1
- package/core/built/admin/assets/{input-surface-BdOe4KzO.js → input-surface-BsrIZeSF.js} +1 -1
- package/core/built/admin/assets/{integration-header-B4DyXV06.js → integration-header-Bm6IDb1A.js} +1 -1
- package/core/built/admin/assets/invite-user-modal-DfheMXs0.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-60O_8aiO.js → koenig-lexical-DBSqAuiI.js} +3 -3
- package/core/built/admin/assets/koenig-loader-aFQNlJlD.js +2 -0
- package/core/built/admin/assets/kpi-card-DBRMfGOW.js +1 -0
- package/core/built/admin/assets/{kpi-card-fUHZlzBX.js → kpi-card-DFafD1qq.js} +1 -1
- package/core/built/admin/assets/kpi-helpers-Cv8i8hns.js +1 -0
- package/core/built/admin/assets/kpi-tabs-BJItvLYm.js +1 -0
- package/core/built/admin/assets/{label-VIG969IC.js → label-BnSCvffu.js} +1 -1
- package/core/built/admin/assets/label-picker-KVoo91sh.js +1 -0
- package/core/built/admin/assets/layout-Bjv2Ll-5.js +1 -0
- package/core/built/admin/assets/{link-helpers-Dtq9fxQg.js → link-helpers-MVDdnFCY.js} +1 -1
- package/core/built/admin/assets/{list-page-CdsnQR9N.js → list-page-BucXJ0hi.js} +1 -1
- package/core/built/admin/assets/member-custom-fields-DDQV6QeG.js +1 -0
- package/core/built/admin/assets/member-detail-CdJF6Agw.js +1 -0
- package/core/built/admin/assets/members-DjQbq9Z2.js +4 -0
- package/core/built/admin/assets/{modal-page-BMTzFHVO.js → modal-page-xCivTMvI.js} +1 -1
- package/core/built/admin/assets/moderation-AgCIEso4.js +1 -0
- package/core/built/admin/assets/{multi-select-combobox-CGohnsxJ.js → multi-select-combobox-BcITkUVr.js} +1 -1
- package/core/built/admin/assets/navigation-modal-BkT7b1M2.js +1 -0
- package/core/built/admin/assets/newsletter-BMMAuvgq.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-0SCJ7Zpm.js +1 -0
- package/core/built/admin/assets/{newsletter-emails-D5ql1rud.js → newsletter-emails-DKzwafuh.js} +1 -1
- package/core/built/admin/assets/newsletters-BRBb_uQC.js +1 -0
- package/core/built/admin/assets/note-DyGHtS9a.js +1 -0
- package/core/built/admin/assets/notifications-ZgWniKna.js +1 -0
- package/core/built/admin/assets/nql-BLpCn7qX.js +21 -0
- package/core/built/admin/assets/offers-container-modal-B-E8TIWr.js +1 -0
- package/core/built/admin/assets/{onboarding-B4YhlZ0i.js → onboarding-CzIsre-d.js} +1 -1
- package/core/built/admin/assets/onboarding-qg8Akovm.js +1 -0
- package/core/built/admin/assets/{onboarding-route-Cu_ROWPn.js → onboarding-route-CaavZulg.js} +1 -1
- package/core/built/admin/assets/overview-BW8GLeYi.js +1 -0
- package/core/built/admin/assets/overview-BkXZNzaZ.js +1 -0
- package/core/built/admin/assets/{page-header-Cfds8pCg.js → page-header-De0VzKBi.js} +1 -1
- package/core/built/admin/assets/pagemenu-B5KKCpbA.js +1 -0
- package/core/built/admin/assets/pages-jgaFm69d.js +1 -0
- package/core/built/admin/assets/pages-route-CIUAQxtY.js +1 -0
- package/core/built/admin/assets/papaparse.min-cQwnxGCG.js +10 -0
- package/core/built/admin/assets/{pintura-modal-TDTrJ89x.js → pintura-modal-BZ2J9w3n.js} +1 -1
- package/core/built/admin/assets/portal-frame-B6Hr9wHc.js +1 -0
- package/core/built/admin/assets/portal-modal-D4ceei3t.js +1 -0
- package/core/built/admin/assets/post-analytics-header-BYCsT0GP.js +1 -0
- package/core/built/admin/assets/post-analytics-ot7f6pih.js +1 -0
- package/core/built/admin/assets/{post-analytics-provider-Cu3jNeFh.js → post-analytics-provider-Bo1gmYaP.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-P1_M6o-H.js → post-share-modal-C-PaYZ_e.js} +1 -1
- package/core/built/admin/assets/posts-DuGazgTb.js +1 -0
- package/core/built/admin/assets/posts-list-screen-CBGGgjjj.js +2 -0
- package/core/built/admin/assets/posts-route-D6xmS7Vf.js +1 -0
- package/core/built/admin/assets/preferences-C5YJLp74.js +5 -0
- package/core/built/admin/assets/{preview-chrome-BOVO6_PE.js → preview-chrome-BljUBlOk.js} +1 -1
- package/core/built/admin/assets/{preview-modal-MlTjP8UU.js → preview-modal-BfeFqi5y.js} +1 -1
- package/core/built/admin/assets/profile-B8mx2yAu.js +1 -0
- package/core/built/admin/assets/{radio-group-CjtmsCPl.js → radio-group-DczlLKOn.js} +1 -1
- package/core/built/admin/assets/{router-provider-CJC58zTy.js → router-provider-B0gZyiGJ.js} +1 -1
- package/core/built/admin/assets/{schemas-CRsC53ls.js → schemas-DppqmpeJ.js} +2 -2
- package/core/built/admin/assets/select-cb0t_TAJ.js +1 -0
- package/core/built/admin/assets/settings-DZqxR0Da.js +1 -0
- package/core/built/admin/assets/settings-DvfTNdHQ.js +4 -0
- package/core/built/admin/assets/{settings-breadcrumbs-sLDNedBW.js → settings-breadcrumbs-DLzbRRSt.js} +1 -1
- package/core/built/admin/assets/{shade-app-F7WxOyfk-nufqw1hd.js → shade-app-CcS3f8MZ-vwURazk8.js} +2 -2
- package/core/built/admin/assets/share-modal-D2-Bz1_I.js +1 -0
- package/core/built/admin/assets/{skeleton-D7hwjdry.js → skeleton-Ce9GgUpf.js} +1 -1
- package/core/built/admin/assets/slack-modal-DYDTUria.js +1 -0
- package/core/built/admin/assets/sort-button-VVeQjjbu.js +1 -0
- package/core/built/admin/assets/{source-icon-BPsD5ees.js → source-icon-Ck5_5Kgq.js} +1 -1
- package/core/built/admin/assets/{stack-CIfOAAVf.js → stack-B2eszIiq.js} +1 -1
- package/core/built/admin/assets/stats-Rjmk5owg.js +1 -0
- package/core/built/admin/assets/stats-view-BGGmkmgv.js +1 -0
- package/core/built/admin/assets/{step-1-CMta6YFO.js → step-1-CsaBjeN4.js} +1 -1
- package/core/built/admin/assets/{step-2-BG04nh5q.js → step-2-D2vnxOOM.js} +1 -1
- package/core/built/admin/assets/{step-3-ZnMaVIPj.js → step-3-wBoLdGEb.js} +2 -2
- package/core/built/admin/assets/{stripe-button-DDoUKN5a.js → stripe-button-CDgLz0S0.js} +1 -1
- package/core/built/admin/assets/stripe-connect-modal-CSjMJetP.js +1 -0
- package/core/built/admin/assets/{switch-C9djUIMO.js → switch-CI4gLWqb.js} +1 -1
- package/core/built/admin/assets/{table-CrqQtkR2.js → table-Do6iQ83Q.js} +1 -1
- package/core/built/admin/assets/{tabs-CGisSbWq.js → tabs-D2yWLMp_.js} +1 -1
- package/core/built/admin/assets/tag-detail-BhXlOsCa.js +2 -0
- package/core/built/admin/assets/tags-ldukRApe.js +1 -0
- package/core/built/admin/assets/testimonials-modal-CtnZBJKl.js +1 -0
- package/core/built/admin/assets/{text-DU9Hv33_.js → text-BQDSDsKs.js} +1 -1
- package/core/built/admin/assets/{textarea-d9qEkMOP.js → textarea-DJ1Q5V39.js} +1 -1
- package/core/built/admin/assets/tier-detail-modal-BOs8e_G8.js +1 -0
- package/core/built/admin/assets/{toggle-group-CtKZURJd.js → toggle-group-ByUJsxwD.js} +1 -1
- package/core/built/admin/assets/{topic-filter-D8JT8Tq1.js → topic-filter-BgC3g5_v.js} +1 -1
- package/core/built/admin/assets/{transistor-modal-6PUf0idx.js → transistor-modal-Drr0SNfo.js} +1 -1
- package/core/built/admin/assets/trend-badge-6ye93YAW.js +1 -0
- package/core/built/admin/assets/{unsplash-modal-BPuDBPja.js → unsplash-modal-p6AoQoWp.js} +1 -1
- package/core/built/admin/assets/{use-analytics-data--opuzwcz.js → use-analytics-data-CWCMAESo.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-Cw3WQHy8.js +2 -0
- package/core/built/admin/assets/use-filter-params-BIni9taJ.js +1 -0
- package/core/built/admin/assets/use-growth-stats-DCVG3s9w.js +1 -0
- package/core/built/admin/assets/{use-limiter-TDSNiHPB.js → use-limiter-D2WRRx0H.js} +1 -1
- package/core/built/admin/assets/{use-navigate-with-base-path-CK989MlC.js → use-navigate-with-base-path-BHPA228f.js} +1 -1
- package/core/built/admin/assets/{use-pintura-config-CnCGrDFk.js → use-pintura-config-h-J0Lvta.js} +1 -1
- package/core/built/admin/assets/{use-pintura-editor-ntphvtUd.js → use-pintura-editor-BfN1UwzH.js} +1 -1
- package/core/built/admin/assets/use-post-referrers-Czg47m8s.js +1 -0
- package/core/built/admin/assets/use-reply-chain-data-ns0caK8k.js +1 -0
- package/core/built/admin/assets/{use-router-history-entry-BwfQS2mq.js → use-router-history-entry-uldn7zJO.js} +1 -1
- package/core/built/admin/assets/{use-setting-group-DQxV42-O.js → use-setting-group-DpcuCUDg.js} +1 -1
- package/core/built/admin/assets/use-settings-navigation-CZjGrhsp.js +1 -0
- package/core/built/admin/assets/{use-simple-pagination-B2TdNX67.js → use-simple-pagination-DzJWobPR.js} +1 -1
- package/core/built/admin/assets/{use-staff-users-QrR9voeC.js → use-staff-users-Csipb-O0.js} +1 -1
- package/core/built/admin/assets/use-tinybird-query-CSnGXzZh.js +1 -0
- package/core/built/admin/assets/use-tinybird-token-DTOKRR7e.js +1 -0
- package/core/built/admin/assets/{use-unsaved-changes-guard-DpYJcj1d.js → use-unsaved-changes-guard-CBzs-KPi.js} +1 -1
- package/core/built/admin/assets/{use-url-input-WnIqckzS.js → use-url-input-DFr8lCbS.js} +1 -1
- package/core/built/admin/assets/user-detail-modal-B_iUClI6.js +1 -0
- package/core/built/admin/assets/users-Cg-OeGzC.js +1 -0
- package/core/built/admin/assets/{virtual-list-D3MfPNOh.js → virtual-list-BW-padMe.js} +1 -1
- package/core/built/admin/assets/web-C1v33ehA.js +2 -0
- package/core/built/admin/assets/web-C4BKzn2T.js +1 -0
- package/core/built/admin/assets/{zapier-modal-BO6PS_Vd.js → zapier-modal-BBFfI6Ml.js} +1 -1
- package/core/built/admin/index.html +24 -30
- 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/rendering/renderer.js +15 -0
- package/core/frontend/services/sitemap/user-map-generator.js +9 -2
- package/core/server/adapters/storage/LocalStorageBase.js +8 -5
- package/core/server/api/endpoints/db.js +19 -5
- package/core/server/api/endpoints/index.js +6 -2
- package/core/server/api/endpoints/mail.js +1 -1
- package/core/server/api/endpoints/member-metafields.js +89 -0
- package/core/server/api/endpoints/members.js +4 -4
- package/core/server/api/endpoints/posts.js +4 -3
- package/core/server/api/endpoints/tiers-checkout-config.js +59 -0
- package/core/server/api/endpoints/utils/serializers/input/members.js +4 -7
- package/core/server/api/endpoints/utils/serializers/output/config.js +1 -0
- package/core/server/api/endpoints/utils/serializers/output/index.js +6 -2
- package/core/server/api/endpoints/utils/serializers/output/{member-custom-fields.js → member-metafields.js} +2 -4
- package/core/server/api/endpoints/utils/serializers/output/members.js +2 -4
- package/core/server/api/endpoints/utils/serializers/output/tiers-checkout-config.js +12 -0
- 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 -0
- package/core/server/data/importer/content-files.js +57 -0
- package/core/server/data/importer/handlers/image.js +2 -2
- package/core/server/data/importer/import-archive.js +131 -0
- package/core/server/data/importer/import-manager.js +18 -180
- package/core/server/data/importer/importers/content-file-importer.js +66 -4
- 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.61/2026-08-19-14-30-20-add-written-by-to-members-custom-field-values.js +42 -0
- package/core/server/data/migrations/versions/6.61/2026-08-19-14-38-53-add-members-custom-field-bindings-table.js +26 -0
- package/core/server/data/migrations/versions/6.61/2026-08-19-14-48-06-add-tier-checkout-field-tables.js +35 -0
- package/core/server/data/schema/schema.js +90 -0
- package/core/server/data/seeders/importers/automation-action-revisions-importer.js +3 -3
- package/core/server/data/seeders/importers/automation-actions-importer.js +3 -3
- package/core/server/data/seeders/importers/automation-run-steps-importer.js +3 -3
- package/core/server/data/seeders/importers/automation-runs-importer.js +5 -5
- package/core/server/data/seeders/importers/automations-importer.js +3 -3
- package/core/server/data/seeders/importers/comment-reports-importer.js +1 -1
- package/core/server/data/seeders/importers/comments-importer.js +1 -1
- package/core/server/data/seeders/importers/email-batches-importer.js +1 -1
- package/core/server/data/seeders/importers/email-recipients-importer.js +1 -1
- package/core/server/data/seeders/importers/emails-importer.js +1 -1
- package/core/server/data/seeders/importers/labels-importer.js +1 -1
- package/core/server/data/seeders/importers/members-click-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-created-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-feedback-importer.js +1 -1
- package/core/server/data/seeders/importers/members-importer.js +1 -1
- package/core/server/data/seeders/importers/members-login-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-products-importer.js +1 -1
- package/core/server/data/seeders/importers/members-status-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-stripe-customers-importer.js +1 -1
- package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +1 -1
- package/core/server/data/seeders/importers/members-subscribe-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +1 -1
- package/core/server/data/seeders/importers/offer-redemptions-importer.js +1 -1
- package/core/server/data/seeders/importers/offers-importer.js +1 -1
- package/core/server/data/seeders/importers/posts-importer.js +1 -1
- package/core/server/data/seeders/importers/table-importer.js +2 -2
- package/core/server/data/seeders/importers/tags-importer.js +1 -1
- package/core/server/data/seeders/importers/users-importer.js +1 -1
- package/core/server/data/seeders/importers/web-mentions-importer.js +1 -1
- package/core/server/data/seeders/utils/random.js +3 -3
- package/core/server/ghost-server.js +3 -2
- package/core/server/lib/db-types/boolean.js +18 -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/promise-pool.js +31 -0
- package/core/server/models/member.js +6 -17
- package/core/server/models/post.js +2 -2
- package/core/server/models/relations/authors.js +2 -16
- package/core/server/models/user.js +9 -2
- package/core/server/services/auth/passwordreset.js +13 -0
- package/core/server/services/automations/database-automations-repository.js +26 -26
- package/core/server/services/automations/poll.js +1 -0
- 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/assets.js +74 -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 +204 -54
- 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 +1 -1
- package/core/server/services/content-import/import/post-link.js +11 -0
- package/core/server/services/content-import/import/post-repository.js +100 -0
- package/core/server/services/content-import/import/reader.js +9 -2
- package/core/server/services/content-import/import/relations.js +149 -0
- package/core/server/services/content-import/import/report.js +34 -0
- package/core/server/services/content-import/import/row.js +11 -2
- package/core/server/services/content-import/import/schema.js +30 -0
- package/core/server/services/content-import/import/source.js +125 -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 +58 -34
- 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/email-analytics-service.js +8 -1
- package/core/server/services/email-analytics/index.js +2 -7
- package/core/server/services/email-analytics/lib/queries.js +7 -1
- package/core/server/services/email-service/batch-sending-service.js +0 -4
- package/core/server/services/email-service/email-renderer.js +14 -4
- package/core/server/services/email-service/email-service-wrapper.js +0 -9
- package/core/server/services/email-service/mailgun-email-provider.js +20 -9
- package/core/server/services/gift-links/schema.js +3 -3
- package/core/server/services/gifts/CONTEXT.md +1 -1
- 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-bookshelf-repository.js +2 -2
- package/core/server/services/gifts/gift-delivery-bookshelf-repository.js +18 -9
- package/core/server/services/gifts/gift-delivery-schema.js +5 -5
- package/core/server/services/gifts/gift-delivery-service.js +4 -0
- package/core/server/services/gifts/gift-email-service.js +0 -1
- package/core/server/services/gifts/gift-schema.js +10 -10
- package/core/server/services/gifts/gift-service.js +4 -2
- package/core/server/services/gifts/index.js +3 -3
- 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/register-job-handlers.js +25 -15
- package/core/server/services/lib/mailgun-client.js +44 -8
- package/core/server/services/mail/ghost-mailer.js +4 -4
- package/core/server/services/media-inliner/external-media-inliner-job.js +12 -0
- package/core/server/services/media-inliner/external-media-inliner.js +103 -29
- package/core/server/services/media-inliner/service.js +13 -41
- package/core/server/services/media-inliner/types.js +2 -0
- package/core/server/services/member-welcome-emails/service.js +7 -7
- package/core/server/services/members/api.js +1 -0
- package/core/server/services/members/import-export/csv/parse.js +0 -7
- package/core/server/services/members/import-export/export/exporter.js +4 -6
- package/core/server/services/members/import-export/import/completion-email.js +2 -5
- package/core/server/services/members/import-export/import/importer.js +21 -5
- package/core/server/services/members/import-export/import/row.js +0 -3
- package/core/server/services/members/import-export/import/stripe-utils.js +6 -1
- package/core/server/services/members/import-export/index.js +10 -12
- 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 +9 -6
- package/core/server/services/members/members-api/repositories/event-repository.js +0 -4
- package/core/server/services/members/members-api/services/member-bread-service.js +53 -63
- package/core/server/services/members/members-api/services/payments-service.js +47 -1
- package/core/server/services/members/service.js +1 -5
- package/core/server/services/members-custom-fields/actions.js +27 -1
- package/core/server/services/members-custom-fields/bindings-service.js +120 -0
- package/core/server/services/members-custom-fields/codec.js +3 -4
- package/core/server/services/members-custom-fields/definitions-service.js +165 -22
- package/core/server/services/members-custom-fields/filter.js +75 -93
- package/core/server/services/members-custom-fields/index.js +11 -4
- package/core/server/services/members-custom-fields/key.js +2 -1
- package/core/server/services/members-custom-fields/models.js +1 -1
- package/core/server/services/members-custom-fields/queries.js +5 -0
- package/core/server/services/members-custom-fields/schema.js +37 -6
- package/core/server/services/members-custom-fields/serializers.js +3 -5
- package/core/server/services/members-custom-fields/values-service.js +65 -31
- package/core/server/services/mentions/mention-controller.js +23 -21
- package/core/server/services/mentions/process-webmention-job.js +16 -0
- package/core/server/services/mentions/service.js +8 -4
- package/core/server/services/public-config/config.js +7 -0
- 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 +68 -0
- package/core/server/services/stripe/services/checkout/session-options.js +100 -0
- package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +71 -1
- package/core/server/services/stripe/stripe-api.js +31 -0
- package/core/server/services/stripe/stripe-service.js +26 -9
- package/core/server/services/stripe/webhook-controller.js +10 -0
- package/core/server/services/tier-checkout-config/codec.js +99 -0
- package/core/server/services/tier-checkout-config/index.js +26 -0
- package/core/server/services/tier-checkout-config/models.js +63 -0
- package/core/server/services/tier-checkout-config/queries.js +80 -0
- package/core/server/services/tier-checkout-config/schema.js +33 -0
- package/core/server/services/tier-checkout-config/serializers.js +128 -0
- package/core/server/services/tier-checkout-config/service.js +304 -0
- package/core/server/services/tiers/service.js +21 -0
- 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/web/admin/controller.js +1 -1
- package/core/server/web/api/endpoints/admin/routes.js +34 -20
- package/core/server/web/api/middleware/upload.js +2 -2
- package/core/server/web/parent/app.js +5 -0
- package/core/server/web/parent/middleware/filter-query-parameters.js +94 -0
- package/core/server/web/parent/middleware/index.js +1 -0
- package/core/server/web/query-parameter-policy/index.js +9 -0
- package/core/server/web/query-parameter-policy/policy.json +58 -0
- package/core/server/web/query-parameter-policy/schema.js +38 -0
- package/core/shared/config/defaults.json +3 -0
- package/core/shared/config/env/config.testing-mysql.json +4 -1
- package/core/shared/config/env/config.testing.json +3 -0
- package/core/shared/config/overrides.json +4 -2
- package/core/shared/labs.js +9 -15
- package/package.json +25 -25
- package/pnpm-lock.yaml +741 -108
- package/pnpm-workspace.yaml +12 -9
- package/tsconfig.json +2 -3
- package/components/tryghost-kg-default-nodes-2.2.0.tgz +0 -0
- package/core/built/admin/assets/Combination-gnJO3vIw.js +0 -41
- package/core/built/admin/assets/account-migration-8qTEI1i1.js +0 -1
- package/core/built/admin/assets/activitypub/inbox-DQ5CwLma.js +0 -1284
- package/core/built/admin/assets/activitypub/label-B72sfvEU.js +0 -16
- package/core/built/admin/assets/activitypub/layout-CXajhRsL.js +0 -1
- package/core/built/admin/assets/activitypub/settings-71gCm3SO.js +0 -315
- package/core/built/admin/assets/add-integration-modal--YpTq3c0.js +0 -1
- package/core/built/admin/assets/add-newsletter-modal-C8Ix2hol.js +0 -1
- package/core/built/admin/assets/add-recommendation-modal-CScuNFz4.js +0 -1
- package/core/built/admin/assets/alert-dialog-wEbVxANM.js +0 -1
- package/core/built/admin/assets/analytics-Cnji45H5.js +0 -1
- package/core/built/admin/assets/app-utils-D2Wp7ZSS.js +0 -1
- package/core/built/admin/assets/audience-DTLMXAFH.js +0 -1
- package/core/built/admin/assets/automations-BWpRCZ_f.js +0 -1
- package/core/built/admin/assets/bluesky-sharing-DHOpQxff.js +0 -1
- package/core/built/admin/assets/chart-helpers-B3OqQ6Ez.js +0 -1
- package/core/built/admin/assets/color-picker-Bmo1r9Fc.js +0 -3
- package/core/built/admin/assets/color-picker-field-DywowPhF.js +0 -1
- package/core/built/admin/assets/combobox-C4QCh6Yw.js +0 -1
- package/core/built/admin/assets/command-DcLbSifC.js +0 -1
- package/core/built/admin/assets/comments-Bxy_3WyE.js +0 -1
- package/core/built/admin/assets/confirmation-context-CLFHhyyH.js +0 -1
- package/core/built/admin/assets/custom-field-type-option-D0PXoSnP.js +0 -10
- package/core/built/admin/assets/custom-integration-modal-DCIHKN33.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-CZ-PkW7o.js +0 -23
- package/core/built/admin/assets/dialog-Db7c164G.js +0 -1
- package/core/built/admin/assets/dirty-confirm-dialog-CmARpZQS.js +0 -1
- package/core/built/admin/assets/dist-QLZuGq7o2.js +0 -1
- package/core/built/admin/assets/domain-D0SAtc-T.js +0 -1
- package/core/built/admin/assets/dropzone-CaPOeDRZ.js +0 -5
- package/core/built/admin/assets/edit-profile-By7v5XW5.js +0 -1
- package/core/built/admin/assets/editor-COXn4Atu.js +0 -8
- package/core/built/admin/assets/explore-BsNYrubV.js +0 -1
- package/core/built/admin/assets/feed-8RR1O1bK.js +0 -1
- package/core/built/admin/assets/filter-sources-4C0kF1NU.js +0 -1
- package/core/built/admin/assets/filters-CV5jCb9n.js +0 -1
- package/core/built/admin/assets/filters-Dmr0PoqU.js +0 -1
- package/core/built/admin/assets/first-promoter-modal-OCzSaL3B.js +0 -1
- package/core/built/admin/assets/gift-link-modal-0mzjn5oF.js +0 -1
- package/core/built/admin/assets/growth-55vWlGT_.js +0 -1
- package/core/built/admin/assets/growth-DA5AluYw.js +0 -3
- package/core/built/admin/assets/history-modal-G1s5hHz7.js +0 -1
- package/core/built/admin/assets/html-field-BegxsWpw.js +0 -1
- package/core/built/admin/assets/index-CDP9tIOk.js +0 -4
- package/core/built/admin/assets/index-Dqf2x-ry.css +0 -1
- package/core/built/admin/assets/index.es-BMUCj9TR.js +0 -1
- package/core/built/admin/assets/input-UHrKuvBT.js +0 -1
- package/core/built/admin/assets/invite-user-modal-BrAkxEO3.js +0 -1
- package/core/built/admin/assets/koenig-loader-DwVY_V-H.js +0 -1
- package/core/built/admin/assets/kpi-card-LERqWBoY.js +0 -1
- package/core/built/admin/assets/kpi-helpers-DB3ouhYF.js +0 -1
- package/core/built/admin/assets/kpi-tabs-BGvtMD8S.js +0 -1
- package/core/built/admin/assets/label-picker-BBWykUeA.js +0 -1
- package/core/built/admin/assets/layout-Di5K7doM.js +0 -1
- package/core/built/admin/assets/loading-indicator-SFTqyYVE.js +0 -1
- package/core/built/admin/assets/member-custom-fields-gOv6Hoh3.js +0 -1
- package/core/built/admin/assets/member-detail-D7mZDDp3.js +0 -1
- package/core/built/admin/assets/member-route-0Aa52Ntz.js +0 -1
- package/core/built/admin/assets/members-DvZG9t69.js +0 -2
- package/core/built/admin/assets/moderation-DzzPLDyl.js +0 -1
- package/core/built/admin/assets/navigation-modal-CI8Bx5vn.js +0 -1
- package/core/built/admin/assets/newsletter-Bg3cq5U-.js +0 -1
- package/core/built/admin/assets/newsletter-detail-modal-DQU3r4g2.js +0 -1
- package/core/built/admin/assets/newsletters-DMDfZbMS.js +0 -1
- package/core/built/admin/assets/note-i8k6pjaw.js +0 -1
- package/core/built/admin/assets/notifications-psA_2Ph4.js +0 -1
- package/core/built/admin/assets/offers-container-modal-BWfjSdyg.js +0 -1
- package/core/built/admin/assets/onboarding-DGQuV7Ew.js +0 -1
- package/core/built/admin/assets/overview-C-6xOLaf.js +0 -1
- package/core/built/admin/assets/overview-DaLhpRrC.js +0 -1
- package/core/built/admin/assets/pages-B6vr9F_D.js +0 -1
- package/core/built/admin/assets/popover-CFgqFDvC.js +0 -1
- package/core/built/admin/assets/portal-frame-DjBF-uy2.js +0 -1
- package/core/built/admin/assets/portal-modal-Cf0pBAk8.js +0 -1
- package/core/built/admin/assets/post-analytics-Buz1COoY.js +0 -1
- package/core/built/admin/assets/post-analytics-header-B-P0eFnT.js +0 -1
- package/core/built/admin/assets/posts-KY3aUhVV.js +0 -1
- package/core/built/admin/assets/preferences-Cq1aOiLy.js +0 -5
- package/core/built/admin/assets/profile-D6dHYf2o.js +0 -1
- package/core/built/admin/assets/select-D_RQaXgt.js +0 -1
- package/core/built/admin/assets/settings-B5hJKZ5C.js +0 -1
- package/core/built/admin/assets/settings-DIo_F-MF.js +0 -4
- package/core/built/admin/assets/share-modal-CLBfj377.js +0 -1
- package/core/built/admin/assets/shim-ClF_m5ux.js +0 -1
- package/core/built/admin/assets/slack-modal-Bt9I_tEo.js +0 -1
- package/core/built/admin/assets/sort-button-DMBXF7tP.js +0 -1
- package/core/built/admin/assets/stats-B_YkF7bp.js +0 -1
- package/core/built/admin/assets/stats-view-BOCp9RG8.js +0 -1
- package/core/built/admin/assets/stripe-connect-modal-BeSukI8q.js +0 -1
- package/core/built/admin/assets/tag-detail-2a3BfzTW.js +0 -2
- package/core/built/admin/assets/tags-Dp2_8UzL.js +0 -1
- package/core/built/admin/assets/testimonials-modal-C9nrypNo.js +0 -1
- package/core/built/admin/assets/tier-detail-modal-CxRwgTPR.js +0 -1
- package/core/built/admin/assets/use-check-theme-limit-error-C9-QhGdV.js +0 -1
- package/core/built/admin/assets/use-filter-params-CSpAvgD2.js +0 -1
- package/core/built/admin/assets/use-growth-stats-BOmoPDHJ.js +0 -1
- package/core/built/admin/assets/use-post-referrers-CbXLFIex.js +0 -1
- package/core/built/admin/assets/use-reply-chain-data-JYFKSO83.js +0 -1
- package/core/built/admin/assets/use-settings-navigation-BBzro2-V.js +0 -1
- package/core/built/admin/assets/use-tinybird-query-D2Aeoty5.js +0 -39
- package/core/built/admin/assets/use-tinybird-token-DBuwMmln.js +0 -1
- package/core/built/admin/assets/user-detail-modal-59mBJqxN.js +0 -1
- package/core/built/admin/assets/users-5msE1WMs.js +0 -1
- package/core/built/admin/assets/web-DUuX7nE2.js +0 -2
- package/core/built/admin/assets/web-N8ucs2aG.js +0 -1
- package/core/server/api/endpoints/member-custom-fields.js +0 -100
- 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/update-check/run-update-check.js +0 -63
- /package/core/server/lib/{db-date.js → db-types/date.js} +0 -0
|
@@ -175,7 +175,12 @@ module.exports = class MembersCSVImporterStripeUtils {
|
|
|
175
175
|
await this.archivePrice(newStripePrice.id);
|
|
176
176
|
} catch (archiveErr) {
|
|
177
177
|
logging.warn(
|
|
178
|
-
|
|
178
|
+
{
|
|
179
|
+
event: { name: 'members.import.orphaned_price_archive_failed' },
|
|
180
|
+
err: archiveErr,
|
|
181
|
+
stripePriceId: newStripePrice.id,
|
|
182
|
+
},
|
|
183
|
+
'Failed to archive an orphaned Stripe price after a failed subscription update',
|
|
179
184
|
);
|
|
180
185
|
}
|
|
181
186
|
throw err;
|
|
@@ -12,7 +12,6 @@ const exporter_1 = __importDefault(require("./export/exporter"));
|
|
|
12
12
|
const MembersCSVImporterStripeUtils = require('./import/stripe-utils');
|
|
13
13
|
const db = require('../../../data/db');
|
|
14
14
|
const models = require('../../../models');
|
|
15
|
-
const labs = require('../../../../shared/labs');
|
|
16
15
|
const logging = require('@tryghost/logging');
|
|
17
16
|
const sentry = require('../../../../shared/sentry');
|
|
18
17
|
// Build the members CSV importer. This is the composition root: today's models and
|
|
@@ -57,13 +56,15 @@ function makeImporter(deps) {
|
|
|
57
56
|
transacting: options.transacting,
|
|
58
57
|
}),
|
|
59
58
|
};
|
|
60
|
-
// Gated by the same labs flag as the export, so the two halves round-trip or stay
|
|
61
|
-
// silent together: off, activeFields resolves empty and every custom_fields.* column
|
|
62
|
-
// is dropped.
|
|
63
59
|
const customFields = {
|
|
64
|
-
activeFields: async () =>
|
|
60
|
+
activeFields: async () => deps.customFields.definitions.browse(),
|
|
65
61
|
planWrite: (values) => deps.customFields.values.planWrite(values),
|
|
66
|
-
|
|
62
|
+
// Every value the import writes came out of the file, whichever column carried it.
|
|
63
|
+
// An import has no id to give until runs are tracked, so it names its kind only.
|
|
64
|
+
applyWrite: (memberId, plan, executor) => deps.customFields.values.applyWrite(memberId, plan, {
|
|
65
|
+
writtenBy: { type: 'import', id: null },
|
|
66
|
+
executor,
|
|
67
|
+
}),
|
|
67
68
|
};
|
|
68
69
|
// Inline jobs never reach the job manager's Sentry handler, which is wired to the
|
|
69
70
|
// offloaded worker path only, so a throw here would be seen by nobody.
|
|
@@ -100,9 +101,7 @@ function makeImporter(deps) {
|
|
|
100
101
|
}
|
|
101
102
|
// Build the members CSV exporter. The same composition root from the other direction:
|
|
102
103
|
// knex and the members id lookup are wired here, and the custom fields definitions and
|
|
103
|
-
// values services are injected (boot builds them before this one).
|
|
104
|
-
// decides whether custom field columns appear, so nothing flag-shaped leaks into the
|
|
105
|
-
// exporter itself.
|
|
104
|
+
// values services are injected (boot builds them before this one).
|
|
106
105
|
function makeExporter({ definitions, values, }) {
|
|
107
106
|
const exporter = new exporter_1.default({
|
|
108
107
|
knex: db.knex,
|
|
@@ -121,9 +120,8 @@ function makeExporter({ definitions, values, }) {
|
|
|
121
120
|
},
|
|
122
121
|
customFields: {
|
|
123
122
|
// Boot builds the definitions and values services before this one, so they
|
|
124
|
-
// are always present -- no not-initialised state to guard.
|
|
125
|
-
|
|
126
|
-
activeDefinitions: async () => labs.isSet('membersCustomFields') ? definitions.browse() : [],
|
|
123
|
+
// are always present -- no not-initialised state to guard.
|
|
124
|
+
activeDefinitions: async () => definitions.browse(),
|
|
127
125
|
valuesForMembers: (memberIds) => values.getValuesForMembers(memberIds),
|
|
128
126
|
},
|
|
129
127
|
});
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const ObjectId = require('bson-objectid').default;
|
|
4
|
+
const { chunk: chunkArray } = require('lodash');
|
|
5
|
+
const moment = require('moment');
|
|
6
|
+
// Removes expired comped entries from the members_products table, moves the
|
|
7
|
+
// affected members from comped to free and records a comped->free status
|
|
8
|
+
// event for each of them. The three writes commit or roll back together, so a
|
|
9
|
+
// failed run leaves the source rows in place and a repeat run redoes the whole
|
|
10
|
+
// unit of work instead of finishing a half-applied one.
|
|
11
|
+
async function cleanExpiredComped({ db, models, events, logging, sentry, }) {
|
|
12
|
+
const startedAt = Date.now();
|
|
13
|
+
const { deletedSubscriptionCount, updatedMemberCount, updatedMembers, now } = await db.knex.transaction(async (trx) => {
|
|
14
|
+
const expiredCompedRows = await trx('members_products')
|
|
15
|
+
// we need to be careful about the type here. .format() is the only
|
|
16
|
+
// thing that works across SQLite and MySQL: an ISO cutoff compares
|
|
17
|
+
// lexically against SQLite's 'YYYY-MM-DD HH:mm:ss' text and its 'T'
|
|
18
|
+
// sorts above ' ', wrongly matching same-UTC-day expiries
|
|
19
|
+
.where('expiry_at', '<', moment.utc().startOf('day').format('YYYY-MM-DD HH:mm:ss'))
|
|
20
|
+
.select('*');
|
|
21
|
+
if (!expiredCompedRows.length) {
|
|
22
|
+
return {
|
|
23
|
+
deletedSubscriptionCount: 0,
|
|
24
|
+
updatedMemberCount: 0,
|
|
25
|
+
updatedMembers: [],
|
|
26
|
+
now: new Date(),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const rowIds = expiredCompedRows.map((d) => d.id);
|
|
30
|
+
const memberIds = expiredCompedRows.map((d) => d.member_id);
|
|
31
|
+
// Only members still in the comped status change; anyone already paid,
|
|
32
|
+
// free or deleted is left untouched. The rows are locked for the rest
|
|
33
|
+
// of the transaction so a concurrent status change cannot slip between
|
|
34
|
+
// this read and the update below (forUpdate is a no-op on SQLite,
|
|
35
|
+
// where the single-writer transaction already guarantees this). The
|
|
36
|
+
// members rows are locked BEFORE the members_products delete so this
|
|
37
|
+
// transaction acquires locks in the same members -> members_products
|
|
38
|
+
// order as the member-edit flows (Bookshelf edit, linkSubscription);
|
|
39
|
+
// the reverse order could deadlock against them.
|
|
40
|
+
const compedMembers = await trx('members')
|
|
41
|
+
.whereIn('id', memberIds)
|
|
42
|
+
.andWhere('status', 'comped')
|
|
43
|
+
.forUpdate();
|
|
44
|
+
const deletedCount = await trx('members_products').whereIn('id', rowIds).del();
|
|
45
|
+
const updateMemberIds = compedMembers.map((d) => d.id);
|
|
46
|
+
const updatedAt = new Date();
|
|
47
|
+
const updatedCount = await trx('members').whereIn('id', updateMemberIds).update({
|
|
48
|
+
status: 'free',
|
|
49
|
+
updated_at: updatedAt,
|
|
50
|
+
});
|
|
51
|
+
const statusEvents = compedMembers.map((member) => {
|
|
52
|
+
return {
|
|
53
|
+
id: ObjectId().toHexString(),
|
|
54
|
+
member_id: member.id,
|
|
55
|
+
from_status: member.status,
|
|
56
|
+
to_status: 'free',
|
|
57
|
+
created_at: updatedAt,
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
// SQLite >= 3.32.0 can support 32766 host parameters
|
|
61
|
+
// each row uses 5 variables so ⌊32766/5⌋ = 6553
|
|
62
|
+
const chunkSize = 6553;
|
|
63
|
+
for (const chunk of chunkArray(statusEvents, chunkSize)) {
|
|
64
|
+
await trx('members_status_events').insert(chunk);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
deletedSubscriptionCount: deletedCount,
|
|
68
|
+
updatedMemberCount: updatedCount,
|
|
69
|
+
updatedMembers: compedMembers,
|
|
70
|
+
now: updatedAt,
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
// Emitted after the commit so listeners never observe state that could
|
|
74
|
+
// still roll back. A failed emission is logged and skipped rather than
|
|
75
|
+
// failing the job: the database changes are already durable and the
|
|
76
|
+
// emitted_event_count below makes the shortfall visible.
|
|
77
|
+
let emittedEventCount = 0;
|
|
78
|
+
for (const member of updatedMembers) {
|
|
79
|
+
const emitted = await emitMemberEditedEvent({ member, now, models, events, logging, sentry });
|
|
80
|
+
if (emitted) {
|
|
81
|
+
emittedEventCount += 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
logging.info({
|
|
85
|
+
system: {
|
|
86
|
+
event: 'clean_expired_comped.completed',
|
|
87
|
+
deleted_subscription_count: deletedSubscriptionCount,
|
|
88
|
+
updated_member_count: updatedMemberCount,
|
|
89
|
+
emitted_event_count: emittedEventCount,
|
|
90
|
+
duration_ms: Date.now() - startedAt,
|
|
91
|
+
},
|
|
92
|
+
}, `[Background Job] clean-expired-comped removed ${deletedSubscriptionCount} expired subscriptions and updated ${updatedMemberCount} members`);
|
|
93
|
+
return { deletedSubscriptionCount, updatedMemberCount, emittedEventCount };
|
|
94
|
+
}
|
|
95
|
+
// Emits member.edited in the shape its listeners (webhooks in particular)
|
|
96
|
+
// expect: a freshly loaded model whose _previousAttributes carry the
|
|
97
|
+
// pre-cleanup status and _changed the comped->free transition, with an
|
|
98
|
+
// internal context.
|
|
99
|
+
async function emitMemberEditedEvent({ member, now, models, events, logging, sentry, }) {
|
|
100
|
+
try {
|
|
101
|
+
const model = await models.Member.findOne({ id: member.id }, { require: true, context: { internal: true } });
|
|
102
|
+
model._previousAttributes = normalizeDates({
|
|
103
|
+
...model.attributes,
|
|
104
|
+
status: member.status,
|
|
105
|
+
updated_at: member.updated_at,
|
|
106
|
+
});
|
|
107
|
+
model._changed = normalizeDates({
|
|
108
|
+
status: 'free',
|
|
109
|
+
updated_at: now,
|
|
110
|
+
});
|
|
111
|
+
events.emit('member.edited', model, { context: { internal: true } });
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
if (isNotFoundError(err)) {
|
|
116
|
+
logging.warn(`Could not emit member.edited for expired comped member: Member ${member.id} was not found`);
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
logging.error(err);
|
|
120
|
+
sentry.captureException(err);
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function normalizeDates(attributes) {
|
|
125
|
+
const normalized = { ...attributes };
|
|
126
|
+
for (const [key, value] of Object.entries(normalized)) {
|
|
127
|
+
if (key.endsWith('_at') && value && !(value instanceof Date)) {
|
|
128
|
+
normalized[key] = moment.utc(value).toDate();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return normalized;
|
|
132
|
+
}
|
|
133
|
+
function isNotFoundError(err) {
|
|
134
|
+
if (!err || typeof err !== 'object') {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
const errorType = 'errorType' in err ? err.errorType : undefined;
|
|
138
|
+
const name = 'name' in err ? err.name : undefined;
|
|
139
|
+
const message = 'message' in err ? err.message : undefined;
|
|
140
|
+
return (errorType === 'NotFoundError' ||
|
|
141
|
+
name === 'NotFoundError' ||
|
|
142
|
+
message === 'NotFound' ||
|
|
143
|
+
message === 'EmptyResponse');
|
|
144
|
+
}
|
|
145
|
+
exports.default = cleanExpiredComped;
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
1
|
const logging = require('@tryghost/logging');
|
|
3
|
-
const
|
|
2
|
+
const errors = require('@tryghost/errors');
|
|
4
3
|
const CleanTokensJob = require('./clean-tokens-job').default;
|
|
4
|
+
const CleanExpiredCompedJob = require('./clean-expired-comped-job').default;
|
|
5
|
+
const cleanTokensTask = require('./clean-tokens-task').default;
|
|
6
|
+
const cleanExpiredCompedTask = require('./clean-expired-comped-task').default;
|
|
5
7
|
|
|
6
8
|
let hasScheduled = {
|
|
7
9
|
expiredComped: false,
|
|
8
10
|
tokens: false,
|
|
9
11
|
};
|
|
10
12
|
|
|
13
|
+
let tasks;
|
|
14
|
+
|
|
11
15
|
function alreadyScheduledOrTest(key) {
|
|
12
16
|
return hasScheduled[key] || process.env.NODE_ENV.startsWith('test');
|
|
13
17
|
}
|
|
@@ -19,43 +23,63 @@ function randomDailyCron(maxHour = 24) {
|
|
|
19
23
|
return `${s} ${m} ${h} * * *`;
|
|
20
24
|
}
|
|
21
25
|
|
|
22
|
-
function
|
|
23
|
-
if (
|
|
24
|
-
|
|
26
|
+
function getTasks() {
|
|
27
|
+
if (!tasks) {
|
|
28
|
+
throw new errors.IncorrectUsageError({
|
|
29
|
+
message: 'Member jobs used before init(). Call init() from boot first.',
|
|
30
|
+
});
|
|
25
31
|
}
|
|
32
|
+
return tasks;
|
|
33
|
+
}
|
|
26
34
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
35
|
+
module.exports = {
|
|
36
|
+
// Composition root for the member cleanup tasks. Idempotent because tests
|
|
37
|
+
// may boot more than once per process.
|
|
38
|
+
init() {
|
|
39
|
+
if (tasks) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
30
42
|
|
|
31
|
-
|
|
43
|
+
const db = require('../../../data/db');
|
|
44
|
+
const models = require('../../../models');
|
|
45
|
+
const events = require('../../../lib/common/events');
|
|
46
|
+
const sentry = require('../../../../shared/sentry');
|
|
32
47
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
});
|
|
48
|
+
tasks = {
|
|
49
|
+
cleanTokens: () => cleanTokensTask({ db, logging }),
|
|
50
|
+
cleanExpiredComped: () => cleanExpiredCompedTask({ db, models, events, logging, sentry }),
|
|
51
|
+
};
|
|
52
|
+
},
|
|
39
53
|
|
|
40
|
-
|
|
54
|
+
cleanTokens() {
|
|
55
|
+
return getTasks().cleanTokens();
|
|
56
|
+
},
|
|
41
57
|
|
|
42
|
-
|
|
43
|
-
|
|
58
|
+
cleanExpiredComped() {
|
|
59
|
+
return getTasks().cleanExpiredComped();
|
|
60
|
+
},
|
|
44
61
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
62
|
+
async scheduleExpiredCompCleanupJob(jobsService) {
|
|
63
|
+
if (alreadyScheduledOrTest('expiredComped')) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Keep the legacy off-peak window: a random time between 00:00 and 05:59
|
|
68
|
+
const cron = randomDailyCron(6);
|
|
69
|
+
logging.info(`[Background Job] clean-expired-comped scheduled at ${cron}`);
|
|
70
|
+
await jobsService.scheduleRecurring(new CleanExpiredCompedJob(), { cron });
|
|
71
|
+
|
|
72
|
+
hasScheduled.expiredComped = true;
|
|
48
73
|
},
|
|
49
74
|
|
|
50
|
-
async scheduleTokenCleanupJob() {
|
|
75
|
+
async scheduleTokenCleanupJob(jobsService) {
|
|
51
76
|
if (alreadyScheduledOrTest('tokens')) {
|
|
52
77
|
return;
|
|
53
78
|
}
|
|
54
79
|
|
|
55
|
-
const classBasedJobs = require('../../jobs-service').getInstance();
|
|
56
80
|
const cron = randomDailyCron();
|
|
57
81
|
logging.info(`[Background Job] clean-tokens scheduled at ${cron}`);
|
|
58
|
-
await
|
|
82
|
+
await jobsService.scheduleRecurring(new CleanTokensJob(), { cron });
|
|
59
83
|
|
|
60
84
|
hasScheduled.tokens = true;
|
|
61
85
|
},
|
|
@@ -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' });
|
|
@@ -41,7 +41,6 @@ module.exports = function MembersAPI({
|
|
|
41
41
|
MemberProductEvent,
|
|
42
42
|
MemberEmailChangeEvent,
|
|
43
43
|
MemberCreatedEvent,
|
|
44
|
-
SubscriptionCreatedEvent,
|
|
45
44
|
MemberLinkClickEvent,
|
|
46
45
|
EmailSpamComplaintEvent,
|
|
47
46
|
Offer,
|
|
@@ -72,6 +71,7 @@ module.exports = function MembersAPI({
|
|
|
72
71
|
emailAddressService,
|
|
73
72
|
giftService,
|
|
74
73
|
customFieldValues,
|
|
74
|
+
customFieldDefinitions,
|
|
75
75
|
}) {
|
|
76
76
|
const tokenService = new TokenService({
|
|
77
77
|
privateKey,
|
|
@@ -119,7 +119,6 @@ module.exports = function MembersAPI({
|
|
|
119
119
|
MemberStatusEvent,
|
|
120
120
|
MemberLoginEvent,
|
|
121
121
|
MemberCreatedEvent,
|
|
122
|
-
SubscriptionCreatedEvent,
|
|
123
122
|
MemberLinkClickEvent,
|
|
124
123
|
MemberFeedback,
|
|
125
124
|
EmailSpamComplaintEvent,
|
|
@@ -147,7 +146,6 @@ module.exports = function MembersAPI({
|
|
|
147
146
|
});
|
|
148
147
|
},
|
|
149
148
|
},
|
|
150
|
-
labsService,
|
|
151
149
|
stripeService: stripeAPIService,
|
|
152
150
|
memberAttributionService,
|
|
153
151
|
emailSuppressionList,
|
|
@@ -156,6 +154,7 @@ module.exports = function MembersAPI({
|
|
|
156
154
|
commentsService,
|
|
157
155
|
giftService,
|
|
158
156
|
customFieldValues,
|
|
157
|
+
customFieldDefinitions,
|
|
159
158
|
});
|
|
160
159
|
|
|
161
160
|
const geolocationService = new GeolocationService();
|
|
@@ -179,6 +178,11 @@ module.exports = function MembersAPI({
|
|
|
179
178
|
offersAPI,
|
|
180
179
|
stripeAPIService,
|
|
181
180
|
settingsCache,
|
|
181
|
+
// The service wrapper, not the checkout config it builds: tiers and members are
|
|
182
|
+
// initialised in the same Promise.all, so reading the property here would capture
|
|
183
|
+
// whatever it was before tiers finished — usually undefined.
|
|
184
|
+
tiersService,
|
|
185
|
+
labsService,
|
|
182
186
|
});
|
|
183
187
|
|
|
184
188
|
const memberController = new MemberController({
|
|
@@ -197,7 +201,6 @@ module.exports = function MembersAPI({
|
|
|
197
201
|
paymentsService,
|
|
198
202
|
tiersService,
|
|
199
203
|
memberRepository,
|
|
200
|
-
StripePrice,
|
|
201
204
|
allowSelfSignup,
|
|
202
205
|
magicLinkService,
|
|
203
206
|
stripeAPIService,
|
|
@@ -353,11 +356,11 @@ module.exports = function MembersAPI({
|
|
|
353
356
|
}
|
|
354
357
|
|
|
355
358
|
async function getMemberIdentityData(email) {
|
|
356
|
-
return memberBREADService.read({ email });
|
|
359
|
+
return memberBREADService.read({ email }, { withCustomFields: false });
|
|
357
360
|
}
|
|
358
361
|
|
|
359
362
|
async function getMemberIdentityDataFromTransientId(transientId) {
|
|
360
|
-
return memberBREADService.read({ transient_id: transientId });
|
|
363
|
+
return memberBREADService.read({ transient_id: transientId }, { withCustomFields: false });
|
|
361
364
|
}
|
|
362
365
|
|
|
363
366
|
async function cycleTransientId(memberId) {
|
|
@@ -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;
|