ghost 6.62.0 → 6.64.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/bin/lib/duplicate-deps.js +204 -0
- package/bin/validate-adapters.js +50 -6
- package/components/tryghost-adapter-base-jobs-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-api-framework-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.6.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.1.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/content/themes/source/assets/built/screen.css +1 -1
- package/content/themes/source/assets/css/screen.css +1 -1
- package/content/themes/source/package.json +7 -7
- package/content/themes/source/partials/post-card.hbs +1 -1
- package/core/boot.js +17 -9
- package/core/built/admin/assets/Combination-DWfJPcz9.js +41 -0
- package/core/built/admin/assets/{PolarAngleAxis-pkMyqz8g.js → PolarAngleAxis-a81ieQUO.js} +2 -2
- package/core/built/admin/assets/RadialBarChart-CHRBhiBN.js +1 -0
- package/core/built/admin/assets/_baseAssignValue-DcPokYW8.js +1 -0
- package/core/built/admin/assets/about-39CAfroa.js +1 -0
- package/core/built/admin/assets/accordion-CJmRaqK7.js +1 -0
- package/core/built/admin/assets/account-migration-DYf7skbb.js +1 -0
- package/core/built/admin/assets/action-list-Crnh-_UI.js +1 -0
- package/core/built/admin/assets/activitypub/{account-migration-By69CgCp.js → account-migration-KA6Jjf9L.js} +7 -7
- package/core/built/admin/assets/activitypub/activitypub.js +3 -3
- 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-BJcPMrDd.js → bluesky-sharing-C7nTDMvw.js} +9 -9
- package/core/built/admin/assets/activitypub/{content-formatters-3rTHg3mp.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-DUR4xSkV.js → domain-fZ-X8i4-.js} +9 -9
- package/core/built/admin/assets/activitypub/{edit-profile-BqtfzxCp.js → edit-profile-BqMLQV88.js} +6 -6
- package/core/built/admin/assets/activitypub/{explore-BxuJd-J4.js → explore-B4yPoP8E.js} +10 -10
- package/core/built/admin/assets/activitypub/{feed-BM1TcksA.js → feed-BRC_mvAe.js} +9 -9
- package/core/built/admin/assets/activitypub/{field-Dn7HHx2-.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-CCjkuow2.js → inbox-BW-yvUoN.js} +10 -10
- package/core/built/admin/assets/activitypub/{inbox-d8oJRTf4.js → inbox-CbTTdDQ3.js} +2 -2
- package/core/built/admin/assets/activitypub/{label-1AA_s9Fa.js → label-kPMmYI7l.js} +3 -3
- package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-CnmxEB8w.js → moderation-CuidJzc0.js} +10 -10
- package/core/built/admin/assets/activitypub/{note-ZKc_Bnba.js → note-CAMRRSqD.js} +7 -7
- package/core/built/admin/assets/activitypub/{notifications-CB2tJZau.js → notifications-BmNlXGgp.js} +9 -9
- package/core/built/admin/assets/activitypub/{onboarding-BsJ9E5qf.js → onboarding-Bqg7fh_L.js} +2 -2
- package/core/built/admin/assets/activitypub/{onboarding-CSUJJIlh.js → onboarding-Dmun9jr_.js} +2 -2
- package/core/built/admin/assets/activitypub/{preferences-0-JZnUkI.js → preferences--oH19wf9.js} +11 -11
- package/core/built/admin/assets/activitypub/{profile-C35cFIhM.js → profile-DH_tQx2D.js} +14 -14
- package/core/built/admin/assets/activitypub/{reply-DYK5vVqb.js → reply-Cap9PxSH.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-BD4vscyc.js → routes-DdyY9uFF.js} +30 -30
- package/core/built/admin/assets/activitypub/{separator-BbQqTm-p.js → separator-CAxxu8VV.js} +3 -3
- package/core/built/admin/assets/activitypub/{settings-BsMROdqh.js → settings-B6EEcVkW.js} +6 -6
- package/core/built/admin/assets/activitypub/{site-O0RL9YCN.js → site-BYps63oh.js} +2 -2
- package/core/built/admin/assets/activitypub/{step-1-BMSx7c_X.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-CLlOZTyt.js → step-3-C-qBbcUo.js} +11 -11
- package/core/built/admin/assets/activitypub/{tabs-Dxk-b9M-.js → tabs-DLhZtVde.js} +6 -6
- package/core/built/admin/assets/activitypub/{topic-filter-5yZH6tId.js → topic-filter-DsUOuu0k.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CV50qe03.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-Cbvzgjzd.js → use-reply-chain-data-AJi9zkzm.js} +5 -5
- package/core/built/admin/assets/activitypub/{users-BjcoP_HC.js → users-inweyKL5.js} +186 -160
- package/core/built/admin/assets/activitypub/{x-DbQZOLiI.js → x-DR8AT3-4.js} +2 -2
- package/core/built/admin/assets/add-integration-modal-B12oRifD.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-CTvXiIqY.js +1 -0
- package/core/built/admin/assets/add-recommendation-modal-CJf92edY.js +1 -0
- package/core/built/admin/assets/analytics-PHR1Fggi.js +1 -0
- package/core/built/admin/assets/announcement-bar-modal-Bql0CXdp.js +1 -0
- package/core/built/admin/assets/api-keys-CubH-7_H.js +1 -0
- package/core/built/admin/assets/{api-keys-3-0vJC3Y.js → api-keys-omLA6iYn.js} +1 -1
- package/core/built/admin/assets/{audience-CtbA54Sn.js → audience-6GXevic-.js} +1 -1
- package/core/built/admin/assets/automated-emails-DJQ4uNZo.js +1 -0
- package/core/built/admin/assets/automations-DcZSLFDU.js +1 -0
- package/core/built/admin/assets/automations-hDVcRPjh.js +1 -0
- package/core/built/admin/assets/avatar-flipboard-DiAGgshK.js +1 -0
- package/core/built/admin/assets/badge-qP06OT7C.js +1 -0
- package/core/built/admin/assets/bluesky-sharing-CJw4d4Mf.js +1 -0
- package/core/built/admin/assets/box-CZ_LSVSy.js +1 -0
- package/core/built/admin/assets/brand-icon-D3ffDYaC.js +1 -0
- package/core/built/admin/assets/breadcrumb-Chn1Ip_q.js +1 -0
- package/core/built/admin/assets/button-DvIh2Bq-.js +1 -0
- package/core/built/admin/assets/calendar-1QGoStFM.js +1 -0
- package/core/built/admin/assets/card-FHQ4D10L.js +1 -0
- package/core/built/admin/assets/chart-helpers-CNpA7re_.js +1 -0
- package/core/built/admin/assets/{chart-BrhA41Zi.js → chart-jVz9Nf9t.js} +9 -9
- package/core/built/admin/assets/checkbox-DKht9xMl.js +1 -0
- package/core/built/admin/assets/{chunk-KS7C4IRE-DCsL4i4D.js → chunk-KS7C4IRE-DhOcHQOU.js} +1 -1
- package/core/built/admin/assets/chunk.368.22ce1b732c0b40abd3f1.js +479 -0
- package/core/built/admin/assets/chunk.524.cc9be98e44890cedc8c8.js +25 -0
- package/core/built/admin/assets/{chunk.582.5ed5d124cfca9c259b9c.js → chunk.582.e6fe742b3217207b11a6.js} +23 -30
- package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js → chunk.972.4b8c97f93d66db15e751.js} +13582 -11017
- package/core/built/admin/assets/clean-tracked-url-dkN05vOf.js +1 -0
- package/core/built/admin/assets/code-editor-view-BLQIV85-.js +1 -0
- package/core/built/admin/assets/code-editor-view-Cg5eJxcr.js +1 -0
- package/core/built/admin/assets/color-picker-DQoghc0t.js +3 -0
- package/core/built/admin/assets/color-picker-field-BbeK5RRs.js +1 -0
- package/core/built/admin/assets/combobox-weO4FBbv.js +1 -0
- package/core/built/admin/assets/command-DlLrCm9V.js +1 -0
- package/core/built/admin/assets/comments-BjTitLmP.js +1 -0
- package/core/built/admin/assets/components-CwL6a6As-CCRaoCeP.js +1 -0
- package/core/built/admin/assets/{config-DOMQDZGZ.js → config-BPljH6wF.js} +1 -1
- package/core/built/admin/assets/confirmation-context-IyqoXVk-.js +1 -0
- package/core/built/admin/assets/container-DAimjOF_.js +1 -0
- package/core/built/admin/assets/content-api-modal-0ZjuLcQ8.js +1 -0
- package/core/built/admin/assets/context-menu-BtioYFrg.js +1 -0
- package/core/built/admin/assets/copy-field-C6ujqJlP.js +1 -0
- package/core/built/admin/assets/create-ghost-browse-value-source-DAZMWZNq.js +1 -0
- package/core/built/admin/assets/custom-integration-modal-Dm8QI_J4.js +1 -0
- package/core/built/admin/assets/data-list-C0CKkeWW.js +1 -0
- package/core/built/admin/assets/date-range-select-DrjHQdgz.js +1 -0
- package/core/built/admin/assets/design-and-theme-modal-CXVOzBWu.js +2 -0
- package/core/built/admin/assets/detail-page-QpLIL-EO.js +1 -0
- package/core/built/admin/assets/dirty-confirm-dialog-DWwxREGh.js +1 -0
- package/core/built/admin/assets/disabled-sources-indicator-CLZhMv8J.js +1 -0
- package/core/built/admin/assets/dist-BRQkNYN1.js +11 -0
- package/core/built/admin/assets/{dist-B3keLvjj.js → dist-BXHrDV19.js} +2 -2
- package/core/built/admin/assets/dist-Bf-HQtVL.js +1 -0
- package/core/built/admin/assets/dist-Bm-PB47a.js +6 -0
- package/core/built/admin/assets/{dist-B6bJuxL3.js → dist-C2lYC76d.js} +1 -1
- package/core/built/admin/assets/dist-CUwte9v_.js +1 -0
- package/core/built/admin/assets/dist-Cm2qbZKL.js +1 -0
- package/core/built/admin/assets/{dist-BtaTA7Ii.js → dist-D7yMk931.js} +1 -1
- package/core/built/admin/assets/{dist-zwwGt8Yf.js → dist-DNAdeRyr.js} +1 -1
- package/core/built/admin/assets/dist-DS6zpxid.js +1 -0
- package/core/built/admin/assets/dist-DVVKsyPh.js +23 -0
- package/core/built/admin/assets/dist-DxfQlAmn.js +1 -0
- package/core/built/admin/assets/dist-DziNzWI2.js +1 -0
- package/core/built/admin/assets/dist-FEQQAwTe.js +1 -0
- package/core/built/admin/assets/dist-nmRzULcD.js +1 -0
- package/core/built/admin/assets/domain-DBrBic6q.js +1 -0
- package/core/built/admin/assets/dropzone-D61QVcEY.js +5 -0
- package/core/built/admin/assets/edit-profile-jCqJBxqw.js +1 -0
- package/core/built/admin/assets/editor-8Fm4UBEd.js +8 -0
- package/core/built/admin/assets/editor-screen-BSX_uC2B.js +27 -0
- package/core/built/admin/assets/email-previews-Bs-JDhIw.js +1 -0
- package/core/built/admin/assets/email-sending-status-context-C76KYL1V.js +1 -0
- package/core/built/admin/assets/email-sending-status-provider-DnNhlIvt.js +1 -0
- package/core/built/admin/assets/emails-CgvIIz3q.js +1 -0
- package/core/built/admin/assets/{embed-signup-form-modal-Ds6mPEi5.js → embed-signup-form-modal-DqtBs1WE.js} +1 -1
- package/core/built/admin/assets/empty-indicator-L4Ql5Db7.js +1 -0
- package/core/built/admin/assets/en-Cx75dJv5.js +1 -0
- package/core/built/admin/assets/esm--rhhUGIG.js +2 -0
- package/core/built/admin/assets/explore-DXhDCtKw.js +1 -0
- package/core/built/admin/assets/feature-flag-overrides-context-CrcQKm9Z.js +1 -0
- package/core/built/admin/assets/feature-image-placeholder-e2q6TcH6.js +1 -0
- package/core/built/admin/assets/feed-mmt4noNL.js +1 -0
- package/core/built/admin/assets/feedback-BTPBQLT5.js +1 -0
- package/core/built/admin/assets/field-p7KnP98B.js +1 -0
- package/core/built/admin/assets/filter-bar-CiIKBg3D.js +1 -0
- package/core/built/admin/assets/filter-sources-I-dRaQxl.js +1 -0
- package/core/built/admin/assets/filters-1injvyxJ.js +1 -0
- package/core/built/admin/assets/filters-DnpO6GWX.js +1 -0
- package/core/built/admin/assets/first-promoter-modal-wr73Dldc.js +1 -0
- package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-CkFA8EkI.js +1 -0
- package/core/built/admin/assets/framework-provider-DB-svAju.js +4 -0
- package/core/built/admin/assets/{ghost-8eabfc1ece81b03cf7b90780d31487e8.css → ghost-8fd5bb799356bbefb254210ba7e1236d.css} +1 -1
- package/core/built/admin/assets/{ghost-c2848508292937415f20f5a830eea59e.js → ghost-a1e6e172c6917e8ef8fa6b0007756d9b.js} +71 -46
- package/core/built/admin/assets/{ghost-dark-a7bebe2c561f55369dcf29f4c820f7ff.css → ghost-dark-cac0cb2d5bb78e9bd14d8d1c2768ed45.css} +1 -1
- package/core/built/admin/assets/gift-link-modal-C3H7YFXO.js +1 -0
- package/core/built/admin/assets/{gift-links-DLDS7ljO.js → gift-links-D8gl_yJS.js} +1 -1
- package/core/built/admin/assets/global-data-context-3MItMry2.js +1 -0
- package/core/built/admin/assets/grid-5vplBYri.js +1 -0
- package/core/built/admin/assets/growth-B1og1kQp.js +1 -0
- package/core/built/admin/assets/growth-Bf6OHZlK.js +3 -0
- package/core/built/admin/assets/heading-BB21QAbb.js +1 -0
- package/core/built/admin/assets/history-modal-t_qEnxPx.js +1 -0
- package/core/built/admin/assets/hooks-DYfTEQLk.js +2 -0
- package/core/built/admin/assets/html-field-COLQbV4r.js +1 -0
- package/core/built/admin/assets/iframe-buffering-Bq1el-gw.js +1 -0
- package/core/built/admin/assets/images-4mvoc3lB.js +1 -0
- package/core/built/admin/assets/{inbox-Mcp4DXZN.js → inbox-DgSZ6w2p.js} +34 -34
- package/core/built/admin/assets/index-B3HZU2i8.css +2 -0
- package/core/built/admin/assets/index-DDd-zhNL.js +4 -0
- package/core/built/admin/assets/index.es-Ct5XQNSj.js +1 -0
- package/core/built/admin/assets/inline-B8H6NzIw.js +1 -0
- package/core/built/admin/assets/input-group-CLIN2ykI.js +1 -0
- package/core/built/admin/assets/{input-surface-BsrIZeSF.js → input-surface-wSO5CRy5.js} +1 -1
- package/core/built/admin/assets/integration-header-CKGrXNVP.js +1 -0
- package/core/built/admin/assets/{integrations-Bjbu86Z0.js → integrations-DnJrZnHv.js} +1 -1
- package/core/built/admin/assets/invite-user-modal-BaN2mdhI.js +1 -0
- package/core/built/admin/assets/jsx-runtime-BlNNh7jY.js +1 -0
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +4 -4
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +2 -2
- package/core/built/admin/assets/{koenig-lexical-DBSqAuiI.js → koenig-lexical-CXVgQFUk.js} +2 -2
- package/core/built/admin/assets/koenig-loader-B1XPPY5C.js +2 -0
- package/core/built/admin/assets/kpi-card-CRLPVlFW.js +1 -0
- package/core/built/admin/assets/kpi-card-CRPbW8NZ.js +1 -0
- package/core/built/admin/assets/kpi-helpers-D7zT96bp.js +1 -0
- package/core/built/admin/assets/kpi-tabs-DE_yh9Go.js +1 -0
- package/core/built/admin/assets/label-CgeBxy4o.js +1 -0
- package/core/built/admin/assets/label-picker-DGDp4Vwr.js +1 -0
- package/core/built/admin/assets/labels-KMkFoRG6.js +1 -0
- package/core/built/admin/assets/layout-DWnOMly4.js +1 -0
- package/core/built/admin/assets/lib-_QYaUU89.js +2 -0
- package/core/built/admin/assets/link-helpers-8J7ixADV.js +1 -0
- package/core/built/admin/assets/links-FwNCVyVe.js +1 -0
- package/core/built/admin/assets/list-page-DLMP0PxC.js +1 -0
- package/core/built/admin/assets/luxon-BXCsmep3.js +1 -0
- package/core/built/admin/assets/member-activity-ClMWFyvN.js +1 -0
- package/core/built/admin/assets/member-activity-feed-BQY5Rwaj.js +1 -0
- package/core/built/admin/assets/member-custom-fields-Dd_ie1zG.js +1 -0
- package/core/built/admin/assets/member-detail-DjwkGVne.js +1 -0
- package/core/built/admin/assets/members--N9lhk1N.js +4 -0
- package/core/built/admin/assets/modal-page-Dz-9TP4E.js +1 -0
- package/core/built/admin/assets/moderation-DfYBKq9s.js +1 -0
- package/core/built/admin/assets/multi-select-combobox-BcBEzUW_.js +1 -0
- package/core/built/admin/assets/navigation-modal-Cd-scywg.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-CFRY6vg_.js +1 -0
- package/core/built/admin/assets/newsletter-emails-4ntck1AC.js +1 -0
- package/core/built/admin/assets/newsletter-o6eCJtab.js +1 -0
- package/core/built/admin/assets/newsletters-Bmlv0edG.js +1 -0
- package/core/built/admin/assets/newsletters-Dz77m__5.js +1 -0
- package/core/built/admin/assets/note-CWs3LF-0.js +1 -0
- package/core/built/admin/assets/notifications-BjSvTJqh.js +1 -0
- package/core/built/admin/assets/{nql-BLpCn7qX.js → nql-DnDc7UuU.js} +1 -1
- package/core/built/admin/assets/nql-lang-CeTB_Bhv.js +19 -0
- package/core/built/admin/assets/{offers-9J1CSiLy.js → offers-ByWSK0rR.js} +1 -1
- package/core/built/admin/assets/offers-container-modal-Bc9A196w.js +1 -0
- package/core/built/admin/assets/onboarding-B4hfBi9a.js +1 -0
- package/core/built/admin/assets/onboarding-DV_XbHts.js +1 -0
- package/core/built/admin/assets/onboarding-route-Di1LJYEE.js +1 -0
- package/core/built/admin/assets/overview-DE7NHZQN.js +1 -0
- package/core/built/admin/assets/overview-DEF-ZY6x.js +1 -0
- package/core/built/admin/assets/page-header-B-G_g42C.js +1 -0
- package/core/built/admin/assets/pagemenu-CnkTDO71.js +1 -0
- package/core/built/admin/assets/pages-DZ_YGB1D.js +1 -0
- package/core/built/admin/assets/pages-route-VT7r7YhG.js +1 -0
- package/core/built/admin/assets/papaparse.min-BlhnCUXn.js +10 -0
- package/core/built/admin/assets/pintura-modal-BljM7hf8.js +1 -0
- package/core/built/admin/assets/portal-frame-D9V8iq5x.js +1 -0
- package/core/built/admin/assets/portal-modal-B5OOR9ZD.js +1 -0
- package/core/built/admin/assets/post-analytics-context-bt2YTBAC.js +1 -0
- package/core/built/admin/assets/post-analytics-header-J0WciLx6.js +1 -0
- package/core/built/admin/assets/post-analytics-provider-CgreZDjS.js +1 -0
- package/core/built/admin/assets/post-analytics-rGb-PgD-.js +1 -0
- package/core/built/admin/assets/post-helpers-C88JBa4D.js +1 -0
- package/core/built/admin/assets/post-share-modal-D0BbTo4W.js +1 -0
- package/core/built/admin/assets/post-utils-DKF4mfuo.js +1 -0
- package/core/built/admin/assets/posts-list-screen-CO5jAWoU.js +2 -0
- package/core/built/admin/assets/posts-route-DV-CXWK9.js +1 -0
- package/core/built/admin/assets/posts-tcoO3iRG.js +1 -0
- package/core/built/admin/assets/preferences-Tac29oG6.js +5 -0
- package/core/built/admin/assets/preview-chrome-C2lQgZBZ.js +1 -0
- package/core/built/admin/assets/preview-modal-CjRbBr8U.js +1 -0
- package/core/built/admin/assets/profile-yiM1f_Og.js +1 -0
- package/core/built/admin/assets/prop-types-6lTeqvom.js +1 -0
- package/core/built/admin/assets/radio-group-CKROWsw4.js +1 -0
- package/core/built/admin/assets/react-BXwhMTuc.js +1 -0
- package/core/built/admin/assets/{jsx-runtime-DX3WBWVO.js → react-dom-CMOtJ5MH.js} +2 -2
- package/core/built/admin/assets/{referrers-CnhCMWCs.js → referrers-1R8bPpoV.js} +1 -1
- package/core/built/admin/assets/router-provider-CU87qxXw.js +1 -0
- package/core/built/admin/assets/schemas-BoYdB6YU.js +64 -0
- package/core/built/admin/assets/select-CKaC4ggu.js +1 -0
- package/core/built/admin/assets/settings-81kxUa28.js +1 -0
- package/core/built/admin/assets/settings-BVXFqBVK.js +4 -0
- package/core/built/admin/assets/settings-breadcrumbs-czGRx-iu.js +1 -0
- package/core/built/admin/assets/{shade-app-CcS3f8MZ-vwURazk8.js → shade-app-CcS3f8MZ-D5BnfHck.js} +1 -1
- package/core/built/admin/assets/share-modal-BL-16PiB.js +1 -0
- package/core/built/admin/assets/skeleton-DwCva0-b.js +1 -0
- package/core/built/admin/assets/slack-modal-D7W_fNON.js +1 -0
- package/core/built/admin/assets/sort-button-Dquc83jY.js +1 -0
- package/core/built/admin/assets/source-icon-CQboPZQ3.js +1 -0
- package/core/built/admin/assets/stack-BURz77VS.js +1 -0
- package/core/built/admin/assets/stats-Cvp8Ep5m.js +1 -0
- package/core/built/admin/assets/stats-view-NDja_g96.js +1 -0
- package/core/built/admin/assets/step-1-BKhjy0PV.js +1 -0
- package/core/built/admin/assets/step-2-PxA1OM7R.js +1 -0
- package/core/built/admin/assets/step-3-BJbAiq16.js +2 -0
- package/core/built/admin/assets/stripe-button-C3cfCAou.js +1 -0
- package/core/built/admin/assets/stripe-connect-modal-FyE3Ey2c.js +1 -0
- package/core/built/admin/assets/style-Wd9nQubI.css +1 -0
- package/core/built/admin/assets/switch-zfUUy9Jh.js +1 -0
- package/core/built/admin/assets/table-dE4GTIRT.js +1 -0
- package/core/built/admin/assets/tabs-B3XK93sR.js +1 -0
- package/core/built/admin/assets/tag-detail-D4P-tZdM.js +2 -0
- package/core/built/admin/assets/tag-picker-BNSZ6Qxw.js +1 -0
- package/core/built/admin/assets/tags-BsZcaJ6h.js +1 -0
- package/core/built/admin/assets/{tags-zTFiKRpb.js → tags-NwZ7BPK6.js} +1 -1
- package/core/built/admin/assets/testimonials-modal-Dkt6ODLW.js +1 -0
- package/core/built/admin/assets/text-DC-ot6u2.js +1 -0
- package/core/built/admin/assets/textarea-B4FffFmE.js +1 -0
- package/core/built/admin/assets/themes-DtcEFQWm.js +1 -0
- package/core/built/admin/assets/tier-detail-modal-a77Z2VMH.js +1 -0
- package/core/built/admin/assets/tiers-6mPzCXlM.js +1 -0
- package/core/built/admin/assets/toggle-group-D2p4okmJ.js +1 -0
- package/core/built/admin/assets/topic-filter-DVOe3D-b.js +1 -0
- package/core/built/admin/assets/transistor-modal-C8RMkhOD.js +1 -0
- package/core/built/admin/assets/trend-badge-B9v7kMF8.js +1 -0
- package/core/built/admin/assets/unsplash-modal-DXt7Brum.js +1 -0
- package/core/built/admin/assets/use-analytics-data-ChHqiZXv.js +1 -0
- package/core/built/admin/assets/use-availability-hPdeG76y.js +1 -0
- package/core/built/admin/assets/{use-check-theme-limit-error-Cw3WQHy8.js → use-check-theme-limit-error-JD-J5aaZ.js} +2 -2
- package/core/built/admin/assets/use-email-sending-status-DNMtL5B9.js +1 -0
- package/core/built/admin/assets/use-filter-params-BSFigDIn.js +1 -0
- package/core/built/admin/assets/use-filterable-api-CEMSAYPg.js +1 -0
- package/core/built/admin/assets/use-form-DJKZJhQh.js +1 -0
- package/core/built/admin/assets/use-growth-stats-CqqdnESN.js +1 -0
- package/core/built/admin/assets/use-host-limits-mpTkZIq8.js +1 -0
- package/core/built/admin/assets/use-limiter-DBGjYqu7.js +19 -0
- package/core/built/admin/assets/use-navigate-with-base-path-88EQpw2k.js +1 -0
- package/core/built/admin/assets/use-pintura-config-BmU45Ruy.js +1 -0
- package/core/built/admin/assets/use-pintura-editor-Bz2bZ4iT.js +1 -0
- package/core/built/admin/assets/use-post-referrers-DyPjyBSN.js +1 -0
- package/core/built/admin/assets/use-query-params-DlOHCo-R.js +1 -0
- package/core/built/admin/assets/use-reply-chain-data-DmD2yX5D.js +1 -0
- package/core/built/admin/assets/use-router-history-entry-CKx9LhqD.js +1 -0
- package/core/built/admin/assets/use-sending-eta-CQeG6OP_.js +1 -0
- package/core/built/admin/assets/use-setting-group-Dza6bQ7W.js +1 -0
- package/core/built/admin/assets/use-settings-navigation-BIjI5mL3.js +1 -0
- package/core/built/admin/assets/use-simple-pagination-DwVxe-Lo.js +1 -0
- package/core/built/admin/assets/use-staff-users-i_Mq9OGR.js +1 -0
- package/core/built/admin/assets/{use-tinybird-query-CSnGXzZh.js → use-tinybird-query-DXoF74NM.js} +1 -1
- package/core/built/admin/assets/use-tinybird-token-Lk1RSn0t.js +1 -0
- package/core/built/admin/assets/use-unsaved-changes-guard-CKVPWz_F.js +1 -0
- package/core/built/admin/assets/use-upgrade-route-CVjDlNSs.js +1 -0
- package/core/built/admin/assets/{use-url-input-DFr8lCbS.js → use-url-input-DpmbDppC.js} +1 -1
- package/core/built/admin/assets/user-detail-modal-BU4QCHE7.js +1 -0
- package/core/built/admin/assets/{users-Cg-OeGzC.js → users-C60_hpn6.js} +1 -1
- package/core/built/admin/assets/{validator-Cr0sMKuW.js → validator-DlFQP70j.js} +1 -1
- package/core/built/admin/assets/{vendor-5753232c7d6ffb3c44e1eb0a02133953.js → vendor-2dd263291938d407802568d3357ec69e.js} +19 -17
- package/core/built/admin/assets/virtual-list-DScLNuU8.js +1 -0
- package/core/built/admin/assets/web-BZS-t4H0.js +1 -0
- package/core/built/admin/assets/web-DxAUxnK3.js +2 -0
- package/core/built/admin/assets/zapier-modal-BafLUO4R.js +1 -0
- package/core/built/admin/index.html +38 -34
- package/core/cli/command.js +17 -2
- package/core/frontend/meta/asset-url.js +1 -16
- package/core/frontend/services/asset-hash/index.js +32 -2
- package/core/frontend/services/routing/controllers/unsubscribe.js +2 -1
- package/core/frontend/services/rss/generate-feed.js +1 -1
- package/core/frontend/services/theme-engine/active.js +2 -4
- package/core/frontend/services/theme-engine/i18n/i18n.js +11 -1
- package/core/frontend/services/theme-engine/i18next/theme-i18n.js +1 -1
- package/core/frontend/web/middleware/llms-discovery.js +34 -43
- package/core/server/adapters/jobs/InMemoryJobsBackend.js +74 -29
- package/core/server/adapters/route-settings/S3RouteSettingsStore.js +1 -1
- package/core/server/adapters/storage/LocalFilesStorage.js +12 -2
- package/core/server/adapters/storage/LocalStorageBase.js +13 -0
- package/core/server/api/endpoints/actions.js +2 -1
- package/core/server/api/endpoints/authentication.js +1 -2
- package/core/server/api/endpoints/authors-public.js +15 -5
- package/core/server/api/endpoints/automated-emails.js +3 -2
- package/core/server/api/endpoints/automations.js +77 -49
- package/core/server/api/endpoints/emails.js +21 -3
- package/core/server/api/endpoints/index.js +9 -1
- package/core/server/api/endpoints/invites.js +2 -1
- package/core/server/api/endpoints/labels.js +6 -2
- package/core/server/api/endpoints/member-metafields-members.js +23 -0
- package/core/server/api/endpoints/member-metafields.js +34 -21
- package/core/server/api/endpoints/members-account.js +42 -0
- package/core/server/api/endpoints/members.js +22 -6
- 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/pages.js +2 -6
- package/core/server/api/endpoints/posts-public.js +15 -5
- package/core/server/api/endpoints/posts.js +3 -11
- package/core/server/api/endpoints/snippets.js +2 -1
- package/core/server/api/endpoints/tags-public.js +22 -3
- package/core/server/api/endpoints/tags.js +6 -2
- 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 +4 -8
- package/core/server/api/endpoints/utils/api-filter-utils.js +232 -6
- 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 +16 -2
- 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 +4 -0
- package/core/server/api/endpoints/utils/serializers/output/member-metafields.js +3 -3
- 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/tiers.js +10 -2
- package/core/server/api/endpoints/utils/serializers/output/users.js +0 -10
- package/core/server/api/endpoints/utils/serializers/output/utils/clean.js +2 -0
- package/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js +3 -0
- package/core/server/api/endpoints/utils/validators/input/settings.js +15 -1
- package/core/server/data/exporter/exporter.js +2 -1
- package/core/server/data/exporter/table-lists.js +6 -8
- package/core/server/data/importer/importers/data/settings-importer.js +8 -2
- 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/migrations/versions/6.64/2026-09-03-15-40-25-add-member-access-to-members-metafields.js +12 -0
- package/core/server/data/migrations/versions/6.64/2026-09-08-11-01-12-add-posts-auto-excerpt-and-reading-time-columns.js +17 -0
- package/core/server/data/migrations/versions/6.64/2026-09-09-13-56-18-add-automation-run-updated-at-indexes.js +6 -0
- package/core/server/data/migrations/versions/6.64/2026-09-09-13-56-18-add-tinybird-syncs-table.js +10 -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 +46 -20
- package/core/server/data/seeders/README.md +48 -0
- package/core/server/data/seeders/importers/automations-importer.js +0 -1
- package/core/server/data/seeders/importers/comments-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/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-stripe-customers-subscriptions-importer.js +1 -1
- package/core/server/data/seeders/utils/blog-info.js +4 -3
- package/core/server/data/seeders/utils/event-generator.js +72 -46
- package/core/server/data/tinybird/datasources/_mv_automation_run_steps.datasource +10 -0
- package/core/server/data/tinybird/datasources/_mv_automation_runs.datasource +10 -0
- package/core/server/data/tinybird/datasources/_mv_pending_automation_runs.datasource +10 -0
- package/core/server/data/tinybird/datasources/automation_run_events.datasource +12 -0
- package/core/server/data/tinybird/datasources/automation_run_step_events.datasource +12 -0
- package/core/server/data/tinybird/endpoints/api_automation_browse_stats.pipe +43 -0
- package/core/server/data/tinybird/fixtures/automation_run_events.ndjson +7 -0
- package/core/server/data/tinybird/fixtures/automation_run_step_events.ndjson +8 -0
- package/core/server/data/tinybird/pipes/mv_automation_run_steps.pipe +13 -0
- package/core/server/data/tinybird/pipes/mv_automation_runs.pipe +15 -0
- package/core/server/data/tinybird/pipes/mv_hits.pipe +86 -50
- package/core/server/data/tinybird/pipes/mv_pending_automation_runs.pipe +7 -0
- package/core/server/data/tinybird/tests/api_automation_browse_stats.yaml +18 -0
- package/core/server/ghost-server.js +3 -3
- package/core/server/lib/db-types/count.js +16 -0
- package/core/server/lib/generate-password.js +54 -0
- package/core/server/lib/public-jwk.js +77 -0
- 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 +6 -6
- package/core/server/models/user.js +12 -10
- package/core/server/services/adapter-manager/base-classes.js +21 -3
- package/core/server/services/automations/automations-api.js +46 -1
- package/core/server/services/automations/database-automations-repository.js +11 -4
- package/core/server/services/automations/tinybird-automation-stats.js +56 -0
- package/core/server/services/content-import/import/media.js +1 -1
- package/core/server/services/email-analytics/email-analytics-service-wrapper.js +15 -29
- package/core/server/services/email-analytics/email-analytics-service.js +19 -3
- package/core/server/services/email-analytics/index.js +9 -4
- package/core/server/services/email-rendering/finalize.js +7 -2
- package/core/server/services/email-service/CONTEXT.md +37 -0
- package/core/server/services/email-service/README.md +45 -0
- package/core/server/services/email-service/batch-sending-service.js +2 -0
- package/core/server/services/email-service/email-controller.js +18 -2
- package/core/server/services/email-service/email-renderer.js +7 -2
- package/core/server/services/email-service/email-service-wrapper.js +4 -1
- package/core/server/services/email-service/email-service.js +43 -34
- 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 +117 -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/gift-email-service.js +10 -3
- package/core/server/services/gifts/gift-service.js +19 -57
- package/core/server/services/gifts/index.js +1 -2
- package/core/server/services/i18n.js +1 -1
- package/core/server/services/identity-tokens/identity-token-service-wrapper.js +3 -4
- 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 +13 -2
- package/core/server/services/limits.js +17 -1
- package/core/server/services/member-welcome-emails/service.js +1 -1
- package/core/server/services/members/account-service.js +98 -0
- package/core/server/services/members/api.js +4 -4
- package/core/server/services/members/import-export/export/exporter.js +20 -20
- package/core/server/services/members/import-export/import/completion-email.js +6 -6
- package/core/server/services/members/import-export/import/importer.js +13 -13
- package/core/server/services/members/import-export/index.js +10 -9
- package/core/server/services/members/members-api/controllers/router-controller.js +7 -2
- package/core/server/services/members/members-api/controllers/well-known-controller.js +2 -1
- package/core/server/services/members/members-api/members-api.js +26 -6
- package/core/server/services/members/members-api/repositories/event-repository.js +4 -0
- 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 +57 -48
- package/core/server/services/members/members-api/services/token-service.js +11 -12
- package/core/server/services/members/members-ssr.js +18 -0
- package/core/server/services/members/middleware.js +104 -83
- package/core/server/services/members/request-integrity-token-provider.js +2 -1
- package/core/server/services/members/service.js +70 -42
- package/core/server/services/members/utils.js +9 -0
- package/core/server/services/members-metafields/access.js +39 -0
- package/core/server/services/{members-custom-fields → members-metafields}/actions.js +6 -5
- package/core/server/services/members-metafields/bindings-service.js +147 -0
- package/core/server/services/members-metafields/codec.js +21 -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 +71 -67
- package/core/server/services/{members-custom-fields → members-metafields}/filter.js +9 -9
- package/core/server/services/{members-custom-fields → members-metafields}/index.js +16 -7
- package/core/server/services/{members-custom-fields → members-metafields}/key.js +1 -1
- package/core/server/services/{members-custom-fields → members-metafields}/models.js +6 -4
- package/core/server/services/members-metafields/namespaces.js +34 -0
- package/core/server/services/members-metafields/queries.js +60 -0
- package/core/server/services/{members-custom-fields → members-metafields}/schema.js +18 -12
- package/core/server/services/{members-custom-fields → members-metafields}/serializers.js +7 -6
- package/core/server/services/{members-custom-fields → members-metafields}/values-service.js +46 -27
- package/core/server/services/mentions/mention-discovery-service.js +1 -1
- package/core/server/services/mentions/mention-sending-service.js +27 -10
- package/core/server/services/mentions/mention.js +1 -1
- package/core/server/services/mentions/send-webmentions-job.js +18 -0
- package/core/server/services/mentions/service.js +1 -31
- package/core/server/services/oembed/oembed-service.js +36 -11
- package/core/server/services/posts/post-scheduling.js +20 -0
- package/core/server/services/staff/staff-service-emails.js +5 -1
- package/core/server/services/stats/stats-service.js +12 -3
- package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +2 -2
- package/core/server/services/stripe/stripe-service.js +4 -4
- package/core/server/services/tier-checkout-config/codec.js +2 -2
- package/core/server/services/tier-checkout-config/index.js +2 -1
- package/core/server/services/tier-checkout-config/models.js +2 -2
- package/core/server/services/tier-checkout-config/queries.js +8 -8
- package/core/server/services/tier-checkout-config/serializers.js +57 -0
- package/core/server/services/tier-checkout-config/service.js +18 -2
- package/core/server/services/tiers/service.js +3 -3
- package/core/server/services/tinybird/tinybird-service.js +1 -0
- package/core/server/services/tinybird-sync/get-ingest-config.js +39 -0
- package/core/server/services/tinybird-sync/index.js +28 -0
- package/core/server/services/tinybird-sync/sync-table-to-tinybird.js +149 -0
- package/core/server/services/tinybird-sync/tinybird-sync-service.js +62 -0
- package/core/server/services/url/router-filter.js +8 -10
- package/core/server/services/users.js +1 -19
- package/core/server/web/api/endpoints/admin/routes.js +34 -34
- 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/server/web/well-known.js +12 -16
- package/core/shared/config/defaults.json +2 -3
- package/core/shared/{flush-logs.js → flush.js} +7 -3
- package/core/shared/labs.js +6 -2
- package/core/shared/timing-safe-string-equal.js +26 -0
- package/package.json +46 -46
- package/patches/@elastic__elasticsearch@8.19.2.patch +67 -0
- package/patches/juice@11.1.1.patch +46 -0
- package/pnpm-lock.yaml +750 -1742
- package/pnpm-workspace.yaml +37 -24
- package/scripts/prune.mts +70 -3
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-kg-default-cards-10.3.5.tgz +0 -0
- package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
- package/core/built/admin/assets/Combination-B0l4MKVh.js +0 -41
- package/core/built/admin/assets/RadialBarChart-JAKoS4KT.js +0 -1
- package/core/built/admin/assets/_baseAssignValue-C_vooEQc.js +0 -1
- package/core/built/admin/assets/about-Dyae_UT6.js +0 -1
- package/core/built/admin/assets/account-migration-CESa0mnX.js +0 -1
- package/core/built/admin/assets/action-list-C4v0-du8.js +0 -1
- package/core/built/admin/assets/activitypub/layout-2-0bw6HN.js +0 -1
- package/core/built/admin/assets/add-integration-modal-BlF6rs_f.js +0 -1
- package/core/built/admin/assets/add-newsletter-modal-CglVQqah.js +0 -1
- package/core/built/admin/assets/add-recommendation-modal-wz7BsuaG.js +0 -1
- package/core/built/admin/assets/analytics-C4HE1gBg.js +0 -1
- package/core/built/admin/assets/announcement-bar-modal-Ci4zz8jO.js +0 -1
- package/core/built/admin/assets/api-keys-Ck-Yteiv.js +0 -1
- package/core/built/admin/assets/automated-emails-D5VVMND9.js +0 -1
- package/core/built/admin/assets/automations-CzKt5fb8.js +0 -1
- package/core/built/admin/assets/automations-sAcJ1334.js +0 -1
- package/core/built/admin/assets/avatar-flipboard-C6Kj3Awu.js +0 -1
- package/core/built/admin/assets/bluesky-sharing-BEtJ_gL_.js +0 -1
- package/core/built/admin/assets/box-CdfQAP_F.js +0 -1
- package/core/built/admin/assets/brand-icon-CrIGOA3Z.js +0 -1
- package/core/built/admin/assets/breadcrumb-zUrZrBtW.js +0 -1
- package/core/built/admin/assets/build-CsiH26uS.js +0 -1
- package/core/built/admin/assets/button-eNMKQWXr.js +0 -1
- package/core/built/admin/assets/card--VNbfgo3.js +0 -1
- package/core/built/admin/assets/chart-helpers-CfBKt0vT.js +0 -1
- package/core/built/admin/assets/checkbox-CgOn_tKW.js +0 -1
- package/core/built/admin/assets/chunk.524.a697dee88db67fdf6021.js +0 -32
- package/core/built/admin/assets/chunk.598.7e056fabb47ce7dbd73f.js +0 -366
- package/core/built/admin/assets/code-editor-view-BYNoAoNV.js +0 -1
- package/core/built/admin/assets/code-editor-view-K2wI-I5f.js +0 -1
- package/core/built/admin/assets/color-picker-Ddw80xX6.js +0 -3
- package/core/built/admin/assets/color-picker-field-D9nUhvA7.js +0 -1
- package/core/built/admin/assets/combobox-w9j8PPQT.js +0 -1
- package/core/built/admin/assets/command-BfpHORBv.js +0 -1
- package/core/built/admin/assets/comments-BLmCmyCs.js +0 -1
- package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +0 -1
- package/core/built/admin/assets/confirmation-context-CBM8G0Vj.js +0 -1
- package/core/built/admin/assets/container-BuQG1wuP.js +0 -1
- package/core/built/admin/assets/content-api-modal-TXRz3U7S.js +0 -1
- package/core/built/admin/assets/context-menu-_QMdd3kp.js +0 -1
- package/core/built/admin/assets/copy-field-6N01S07E.js +0 -1
- package/core/built/admin/assets/create-ghost-browse-value-source-qIBymvvf.js +0 -1
- package/core/built/admin/assets/custom-field-type-option-BddFlJFa.js +0 -1
- package/core/built/admin/assets/custom-integration-modal-DmNquxUV.js +0 -1
- package/core/built/admin/assets/data-list-CA2jYGPq.js +0 -1
- package/core/built/admin/assets/date-range-select-uvz_DtPh.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-BSmo12Op.js +0 -2
- package/core/built/admin/assets/detail-page-Dnv-CdR1.js +0 -1
- package/core/built/admin/assets/dirty-confirm-dialog-BZ1iytEd.js +0 -1
- package/core/built/admin/assets/disabled-sources-indicator-DMRrxsiJ.js +0 -1
- package/core/built/admin/assets/dist-4m6pHdc0.js +0 -23
- package/core/built/admin/assets/dist-8YJUlf3B.js +0 -1
- package/core/built/admin/assets/dist-CZgIBXQN.js +0 -1
- package/core/built/admin/assets/dist-CiHx7vA5.js +0 -6
- package/core/built/admin/assets/dist-DIC8yz5C.js +0 -1
- package/core/built/admin/assets/dist-Dcsslyo72.js +0 -1
- package/core/built/admin/assets/dist-Dgt2cr6a.js +0 -1
- package/core/built/admin/assets/dist-ECAUrdGc.js +0 -1
- package/core/built/admin/assets/dist-JLOy8o0Q.js +0 -1
- package/core/built/admin/assets/dist-Ndy-PuGN.js +0 -1
- package/core/built/admin/assets/dist-Z97pCNqS.js +0 -11
- package/core/built/admin/assets/domain-BNYrt0aD.js +0 -1
- package/core/built/admin/assets/dropzone-D7nFdAe5.js +0 -5
- package/core/built/admin/assets/edit-profile-C5Asm4LA.js +0 -1
- package/core/built/admin/assets/editor-REokrzci.js +0 -8
- package/core/built/admin/assets/empty-indicator-D9QdpuNX.js +0 -1
- package/core/built/admin/assets/en-B1jX3WMs.js +0 -1
- package/core/built/admin/assets/esm-CXo5SEPy.js +0 -2
- package/core/built/admin/assets/explore-UY10Egsp.js +0 -1
- package/core/built/admin/assets/feature-image-placeholder-D1iF_8bc.js +0 -1
- package/core/built/admin/assets/feed-81C8mJWR.js +0 -1
- package/core/built/admin/assets/field-Dihp5p18.js +0 -1
- package/core/built/admin/assets/filter-bar-Da1qxybu.js +0 -1
- package/core/built/admin/assets/filter-sources-BO9xUPj7.js +0 -1
- package/core/built/admin/assets/filters-CRUWecfY.js +0 -1
- package/core/built/admin/assets/filters-DirqNXjH.js +0 -1
- package/core/built/admin/assets/first-promoter-modal-CT6MxYZb.js +0 -1
- package/core/built/admin/assets/framework-provider-DqI25epG.js +0 -4
- package/core/built/admin/assets/gift-link-modal-CQVAye17.js +0 -1
- package/core/built/admin/assets/global-data-context-gAMDH9u1.js +0 -1
- package/core/built/admin/assets/grid-Dj29PY05.js +0 -1
- package/core/built/admin/assets/growth-BWIu-6xj.js +0 -3
- package/core/built/admin/assets/growth-DU29oxeA.js +0 -1
- package/core/built/admin/assets/heading-Dh5SFVjL.js +0 -1
- package/core/built/admin/assets/history-modal-CFd1Hvx6.js +0 -1
- package/core/built/admin/assets/hooks-CuEZV2-q.js +0 -2
- package/core/built/admin/assets/html-field-CJBCLTvv.js +0 -1
- package/core/built/admin/assets/iframe-buffering-B2OKJzbz.js +0 -1
- package/core/built/admin/assets/images-scfkWZiK.js +0 -1
- package/core/built/admin/assets/index-6MkPdCtr.js +0 -4
- package/core/built/admin/assets/index-Bn7QhcZu.css +0 -2
- package/core/built/admin/assets/index.es-CNnuNH0d.js +0 -1
- package/core/built/admin/assets/inline-BWSs_VzR.js +0 -1
- package/core/built/admin/assets/input-group-CMhe2DvY.js +0 -1
- package/core/built/admin/assets/integration-header-Bm6IDb1A.js +0 -1
- package/core/built/admin/assets/invite-user-modal-DfheMXs0.js +0 -1
- package/core/built/admin/assets/koenig-loader-aFQNlJlD.js +0 -2
- package/core/built/admin/assets/kpi-card-DBRMfGOW.js +0 -1
- package/core/built/admin/assets/kpi-card-DFafD1qq.js +0 -1
- package/core/built/admin/assets/kpi-helpers-Cv8i8hns.js +0 -1
- package/core/built/admin/assets/kpi-tabs-BJItvLYm.js +0 -1
- package/core/built/admin/assets/label-BnSCvffu.js +0 -1
- package/core/built/admin/assets/label-picker-KVoo91sh.js +0 -1
- package/core/built/admin/assets/labels-CH3Kn8RV.js +0 -1
- package/core/built/admin/assets/layout-Bjv2Ll-5.js +0 -1
- package/core/built/admin/assets/limit-service-BhiEvqcP.js +0 -20
- package/core/built/admin/assets/link-helpers-MVDdnFCY.js +0 -1
- package/core/built/admin/assets/list-page-BucXJ0hi.js +0 -1
- package/core/built/admin/assets/luxon-D1RVjjpq.js +0 -1
- package/core/built/admin/assets/member-custom-fields-DDQV6QeG.js +0 -1
- package/core/built/admin/assets/member-detail-CdJF6Agw.js +0 -1
- package/core/built/admin/assets/members-DjQbq9Z2.js +0 -4
- package/core/built/admin/assets/modal-page-xCivTMvI.js +0 -1
- package/core/built/admin/assets/moderation-AgCIEso4.js +0 -1
- package/core/built/admin/assets/multi-select-combobox-BcITkUVr.js +0 -1
- package/core/built/admin/assets/navigation-modal-BkT7b1M2.js +0 -1
- package/core/built/admin/assets/newsletter-BMMAuvgq.js +0 -1
- package/core/built/admin/assets/newsletter-detail-modal-0SCJ7Zpm.js +0 -1
- package/core/built/admin/assets/newsletter-emails-DKzwafuh.js +0 -1
- package/core/built/admin/assets/newsletters-BRBb_uQC.js +0 -1
- package/core/built/admin/assets/newsletters-DhNigJUh.js +0 -1
- package/core/built/admin/assets/note-DyGHtS9a.js +0 -1
- package/core/built/admin/assets/notifications-ZgWniKna.js +0 -1
- package/core/built/admin/assets/nql-lang-CaWrLesS.js +0 -19
- package/core/built/admin/assets/offers-container-modal-B-E8TIWr.js +0 -1
- package/core/built/admin/assets/onboarding-CzIsre-d.js +0 -1
- package/core/built/admin/assets/onboarding-qg8Akovm.js +0 -1
- package/core/built/admin/assets/onboarding-route-CaavZulg.js +0 -1
- package/core/built/admin/assets/overview-BW8GLeYi.js +0 -1
- package/core/built/admin/assets/overview-BkXZNzaZ.js +0 -1
- package/core/built/admin/assets/page-header-De0VzKBi.js +0 -1
- package/core/built/admin/assets/pagemenu-B5KKCpbA.js +0 -1
- package/core/built/admin/assets/pages-jgaFm69d.js +0 -1
- package/core/built/admin/assets/pages-route-CIUAQxtY.js +0 -1
- package/core/built/admin/assets/papaparse.min-cQwnxGCG.js +0 -10
- package/core/built/admin/assets/pintura-modal-BZ2J9w3n.js +0 -1
- package/core/built/admin/assets/portal-frame-B6Hr9wHc.js +0 -1
- package/core/built/admin/assets/portal-modal-D4ceei3t.js +0 -1
- package/core/built/admin/assets/post-analytics-context-D0Mw-Pmv.js +0 -1
- package/core/built/admin/assets/post-analytics-header-BYCsT0GP.js +0 -1
- package/core/built/admin/assets/post-analytics-ot7f6pih.js +0 -1
- package/core/built/admin/assets/post-analytics-provider-Bo1gmYaP.js +0 -1
- package/core/built/admin/assets/post-helpers-C5OQMBoi.js +0 -1
- package/core/built/admin/assets/post-share-modal-C-PaYZ_e.js +0 -1
- package/core/built/admin/assets/posts-DuGazgTb.js +0 -1
- package/core/built/admin/assets/posts-list-screen-CBGGgjjj.js +0 -2
- package/core/built/admin/assets/posts-route-D6xmS7Vf.js +0 -1
- package/core/built/admin/assets/preferences-C5YJLp74.js +0 -5
- package/core/built/admin/assets/preview-chrome-BljUBlOk.js +0 -1
- package/core/built/admin/assets/preview-modal-BfeFqi5y.js +0 -1
- package/core/built/admin/assets/profile-B8mx2yAu.js +0 -1
- package/core/built/admin/assets/prop-types-DeUPn3oD.js +0 -1
- package/core/built/admin/assets/radio-group-DczlLKOn.js +0 -1
- package/core/built/admin/assets/react-Bb3IsNbi.js +0 -1
- package/core/built/admin/assets/rolldown-runtime-DAXXjFlN.js +0 -1
- package/core/built/admin/assets/router-provider-B0gZyiGJ.js +0 -1
- package/core/built/admin/assets/schemas-DppqmpeJ.js +0 -64
- package/core/built/admin/assets/select-cb0t_TAJ.js +0 -1
- package/core/built/admin/assets/settings-DZqxR0Da.js +0 -1
- package/core/built/admin/assets/settings-DvfTNdHQ.js +0 -4
- package/core/built/admin/assets/settings-breadcrumbs-DLzbRRSt.js +0 -1
- package/core/built/admin/assets/share-modal-D2-Bz1_I.js +0 -1
- package/core/built/admin/assets/skeleton-Ce9GgUpf.js +0 -1
- package/core/built/admin/assets/slack-modal-DYDTUria.js +0 -1
- package/core/built/admin/assets/sort-button-VVeQjjbu.js +0 -1
- package/core/built/admin/assets/source-icon-Ck5_5Kgq.js +0 -1
- package/core/built/admin/assets/stack-B2eszIiq.js +0 -1
- package/core/built/admin/assets/stats-Rjmk5owg.js +0 -1
- package/core/built/admin/assets/stats-view-BGGmkmgv.js +0 -1
- package/core/built/admin/assets/step-1-CsaBjeN4.js +0 -1
- package/core/built/admin/assets/step-2-D2vnxOOM.js +0 -1
- package/core/built/admin/assets/step-3-wBoLdGEb.js +0 -2
- package/core/built/admin/assets/stripe-button-CDgLz0S0.js +0 -1
- package/core/built/admin/assets/stripe-connect-modal-CSjMJetP.js +0 -1
- package/core/built/admin/assets/switch-CI4gLWqb.js +0 -1
- package/core/built/admin/assets/table-Do6iQ83Q.js +0 -1
- package/core/built/admin/assets/tabs-D2yWLMp_.js +0 -1
- package/core/built/admin/assets/tag-detail-BhXlOsCa.js +0 -2
- package/core/built/admin/assets/tags-ldukRApe.js +0 -1
- package/core/built/admin/assets/testimonials-modal-CtnZBJKl.js +0 -1
- package/core/built/admin/assets/text-BQDSDsKs.js +0 -1
- package/core/built/admin/assets/textarea-DJ1Q5V39.js +0 -1
- package/core/built/admin/assets/tier-detail-modal-BOs8e_G8.js +0 -1
- package/core/built/admin/assets/tiers-Nd_z4BZY.js +0 -1
- package/core/built/admin/assets/toggle-group-ByUJsxwD.js +0 -1
- package/core/built/admin/assets/topic-filter-BgC3g5_v.js +0 -1
- package/core/built/admin/assets/transistor-modal-Drr0SNfo.js +0 -1
- package/core/built/admin/assets/trend-badge-6ye93YAW.js +0 -1
- package/core/built/admin/assets/unsplash-modal-p6AoQoWp.js +0 -1
- package/core/built/admin/assets/use-analytics-data-CWCMAESo.js +0 -1
- package/core/built/admin/assets/use-filter-params-BIni9taJ.js +0 -1
- package/core/built/admin/assets/use-filterable-api-CzXcpUh8.js +0 -1
- package/core/built/admin/assets/use-form-vRjI0Kwk.js +0 -1
- package/core/built/admin/assets/use-growth-stats-DCVG3s9w.js +0 -1
- package/core/built/admin/assets/use-host-limits-DZtR08oa.js +0 -1
- package/core/built/admin/assets/use-limiter-D2WRRx0H.js +0 -2
- package/core/built/admin/assets/use-navigate-with-base-path-BHPA228f.js +0 -1
- package/core/built/admin/assets/use-pintura-config-h-J0Lvta.js +0 -1
- package/core/built/admin/assets/use-pintura-editor-BfN1UwzH.js +0 -1
- package/core/built/admin/assets/use-post-referrers-Czg47m8s.js +0 -1
- package/core/built/admin/assets/use-query-params-BfzuqbcD.js +0 -1
- package/core/built/admin/assets/use-reply-chain-data-ns0caK8k.js +0 -1
- package/core/built/admin/assets/use-router-history-entry-uldn7zJO.js +0 -1
- package/core/built/admin/assets/use-setting-group-DpcuCUDg.js +0 -1
- package/core/built/admin/assets/use-settings-navigation-CZjGrhsp.js +0 -1
- package/core/built/admin/assets/use-simple-pagination-DzJWobPR.js +0 -1
- package/core/built/admin/assets/use-staff-users-Csipb-O0.js +0 -1
- package/core/built/admin/assets/use-tinybird-token-DTOKRR7e.js +0 -1
- package/core/built/admin/assets/use-unsaved-changes-guard-CBzs-KPi.js +0 -1
- package/core/built/admin/assets/use-upgrade-route-DhRSo7at.js +0 -1
- package/core/built/admin/assets/user-detail-modal-B_iUClI6.js +0 -1
- package/core/built/admin/assets/virtual-list-BW-padMe.js +0 -1
- package/core/built/admin/assets/web-C1v33ehA.js +0 -2
- package/core/built/admin/assets/web-C4BKzn2T.js +0 -1
- package/core/built/admin/assets/zapier-modal-BBFfI6Ml.js +0 -1
- package/core/server/services/email-suppression-list/in-memory-email-suppression-list.js +0 -39
- package/core/server/services/members-custom-fields/bindings-service.js +0 -120
- package/core/server/services/members-custom-fields/codec.js +0 -14
- package/core/server/services/members-custom-fields/queries.js +0 -32
- /package/core/built/admin/assets/{chunk.492.f24d855d7e3f3aad261c.js.LICENSE.txt → chunk.972.4b8c97f93d66db15e751.js.LICENSE.txt} +0 -0
- /package/core/server/services/{members-custom-fields → members-metafields}/storage.js +0 -0
|
@@ -49,9 +49,9 @@ let membersApi;
|
|
|
49
49
|
let verificationTrigger;
|
|
50
50
|
|
|
51
51
|
const buildImporterDeps = ({ stripeAPIService }) => {
|
|
52
|
-
// Required here, not statically: boot builds the
|
|
52
|
+
// Required here, not statically: boot builds the metafields services before this
|
|
53
53
|
// one (the exporter below relies on the same).
|
|
54
|
-
const
|
|
54
|
+
const metafields = require('../members-metafields');
|
|
55
55
|
return {
|
|
56
56
|
getTimezone: () => settingsCache.get('timezone'),
|
|
57
57
|
// A getter rather than a value because the threshold is an operator
|
|
@@ -88,9 +88,9 @@ const buildImporterDeps = ({ stripeAPIService }) => {
|
|
|
88
88
|
urlFor: urlUtils.urlFor.bind(urlUtils),
|
|
89
89
|
stripeAPIService,
|
|
90
90
|
productRepository: membersApi.productRepository,
|
|
91
|
-
|
|
92
|
-
definitions:
|
|
93
|
-
values:
|
|
91
|
+
metafields: {
|
|
92
|
+
definitions: metafields.definitions,
|
|
93
|
+
values: metafields.values,
|
|
94
94
|
},
|
|
95
95
|
};
|
|
96
96
|
};
|
|
@@ -115,6 +115,66 @@ const initVerificationTrigger = () => {
|
|
|
115
115
|
});
|
|
116
116
|
};
|
|
117
117
|
|
|
118
|
+
const membersMigrationJobName = 'members-migrations';
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Runs the historical Stripe backfills once per site, retried only after a
|
|
122
|
+
* failed run.
|
|
123
|
+
*
|
|
124
|
+
* The `jobs` row named `members-migrations` is the only guard: any status other
|
|
125
|
+
* than `failed` means the run was already attempted and is skipped forever. The
|
|
126
|
+
* row is written after the run, so a boot that dies mid-way retries next time.
|
|
127
|
+
* The row is written even when Stripe is not configured, matching the job-based
|
|
128
|
+
* version: a site that connects Stripe later never runs these 2021-era backfills.
|
|
129
|
+
* Two processes booting a site with no row will both run the backfills, where the
|
|
130
|
+
* job-based version claimed the row first. Accepted: every site that has booted
|
|
131
|
+
* since Ghost 5.6 has the row, and the backfills do nothing without Stripe.
|
|
132
|
+
*
|
|
133
|
+
* @TODO: Delete the backfills, this runner and the `jobs` rows in the next major
|
|
134
|
+
*
|
|
135
|
+
* @param {import('../stripe')} stripeService
|
|
136
|
+
*/
|
|
137
|
+
async function runStripeMigrations(stripeService) {
|
|
138
|
+
const existingJob = await models.Job.findOne({ name: membersMigrationJobName });
|
|
139
|
+
|
|
140
|
+
if (existingJob && existingJob.get('status') !== 'failed') {
|
|
141
|
+
logging.info(`Stripe ${membersMigrationJobName} skipped because it has already run`);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const startedAt = Date.now();
|
|
146
|
+
logging.info(`Stripe ${membersMigrationJobName} started`);
|
|
147
|
+
|
|
148
|
+
let status = 'finished';
|
|
149
|
+
try {
|
|
150
|
+
await stripeService.migrations.execute();
|
|
151
|
+
logging.info(`Stripe ${membersMigrationJobName} completed in ${Date.now() - startedAt}ms`);
|
|
152
|
+
} catch (err) {
|
|
153
|
+
status = 'failed';
|
|
154
|
+
logging.error(
|
|
155
|
+
err,
|
|
156
|
+
`Stripe ${membersMigrationJobName} failed after ${Date.now() - startedAt}ms`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const attrs = { status, started_at: new Date(startedAt), finished_at: new Date() };
|
|
161
|
+
if (existingJob) {
|
|
162
|
+
await models.Job.edit(attrs, { id: existingJob.id });
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
try {
|
|
167
|
+
await models.Job.add({ name: membersMigrationJobName, ...attrs });
|
|
168
|
+
} catch (err) {
|
|
169
|
+
// Two processes booting a site with no row yet both get here, and the unique
|
|
170
|
+
// index on jobs.name rejects the second insert. The row exists, so move on.
|
|
171
|
+
if (!(await models.Job.findOne({ name: membersMigrationJobName }))) {
|
|
172
|
+
throw err;
|
|
173
|
+
}
|
|
174
|
+
logging.warn(`Stripe ${membersMigrationJobName} row was already written by another process`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
118
178
|
module.exports = {
|
|
119
179
|
async init() {
|
|
120
180
|
const stripeService = require('../stripe');
|
|
@@ -175,46 +235,14 @@ module.exports = {
|
|
|
175
235
|
membersCSVImporter.importInline(request, verificationTrigger);
|
|
176
236
|
|
|
177
237
|
// Constructed here rather than required statically: the exporter needs the
|
|
178
|
-
//
|
|
179
|
-
const
|
|
238
|
+
// metafields services, which boot builds before this one.
|
|
239
|
+
const metafields = require('../members-metafields');
|
|
180
240
|
module.exports.export = makeExporter({
|
|
181
|
-
definitions:
|
|
182
|
-
values:
|
|
241
|
+
definitions: metafields.definitions,
|
|
242
|
+
values: metafields.values,
|
|
183
243
|
});
|
|
184
244
|
|
|
185
|
-
|
|
186
|
-
const membersMigrationJobName = 'members-migrations';
|
|
187
|
-
if (!(await jobsService.hasExecutedSuccessfully(membersMigrationJobName))) {
|
|
188
|
-
logging.info(`[Background Job] ${membersMigrationJobName} queued`);
|
|
189
|
-
jobsService.addOneOffJob({
|
|
190
|
-
name: membersMigrationJobName,
|
|
191
|
-
offloaded: false,
|
|
192
|
-
job: async () => {
|
|
193
|
-
const startedAt = Date.now();
|
|
194
|
-
logging.info(`[Background Job] ${membersMigrationJobName} started`);
|
|
195
|
-
try {
|
|
196
|
-
const result = await stripeService.migrations.execute();
|
|
197
|
-
logging.info(
|
|
198
|
-
`[Background Job] ${membersMigrationJobName} completed in ${Date.now() - startedAt}ms`,
|
|
199
|
-
);
|
|
200
|
-
return result;
|
|
201
|
-
} catch (err) {
|
|
202
|
-
logging.error(
|
|
203
|
-
err,
|
|
204
|
-
`[Background Job] ${membersMigrationJobName} failed after ${Date.now() - startedAt}ms`,
|
|
205
|
-
);
|
|
206
|
-
throw err;
|
|
207
|
-
}
|
|
208
|
-
},
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
await jobsService.awaitOneOffCompletion(membersMigrationJobName);
|
|
212
|
-
} else {
|
|
213
|
-
logging.info(
|
|
214
|
-
`[Background Job] ${membersMigrationJobName} skipped because it has already run`,
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
245
|
+
await runStripeMigrations(stripeService);
|
|
218
246
|
},
|
|
219
247
|
contentGating: require('./content-gating'),
|
|
220
248
|
|
|
@@ -41,5 +41,14 @@ module.exports.formattedMemberResponse = function formattedMemberResponse(member
|
|
|
41
41
|
data.email_suppression = member.email_suppression;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
// Absent rather than empty on a site that has defined no extra fields, which is
|
|
45
|
+
// most of them, so those members' accounts read exactly as they did before this
|
|
46
|
+
// existed. Present but empty means the publisher has defined fields and this
|
|
47
|
+
// member has answered none, which a client renders as blank inputs rather than
|
|
48
|
+
// as nothing to fill in.
|
|
49
|
+
if (member.metafields) {
|
|
50
|
+
data.metafields = member.metafields;
|
|
51
|
+
}
|
|
52
|
+
|
|
44
53
|
return data;
|
|
45
54
|
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.INTERNAL = exports.MEMBERS = exports.ADMIN = exports.MemberAccessSchema = exports.MEMBER_ACCESS = void 0;
|
|
4
|
+
exports.readableLevels = readableLevels;
|
|
5
|
+
exports.canWrite = canWrite;
|
|
6
|
+
const metafield_types_1 = require("@tryghost/metafield-types");
|
|
7
|
+
Object.defineProperty(exports, "MEMBER_ACCESS", { enumerable: true, get: function () { return metafield_types_1.MEMBER_ACCESS; } });
|
|
8
|
+
Object.defineProperty(exports, "MemberAccessSchema", { enumerable: true, get: function () { return metafield_types_1.MemberAccessSchema; } });
|
|
9
|
+
const EVERY_LEVEL = [...metafield_types_1.MEMBER_ACCESS_LEVELS];
|
|
10
|
+
exports.ADMIN = { entry: 'admin' };
|
|
11
|
+
exports.MEMBERS = { entry: 'members' };
|
|
12
|
+
exports.INTERNAL = { entry: 'internal' };
|
|
13
|
+
// Every audience is spelled out with the levels it may read, staff included, because
|
|
14
|
+
// reads narrow on whatever this returns and an audience with no entry gets an empty
|
|
15
|
+
// list, which matches no field. Giving staff a way to skip the check instead would
|
|
16
|
+
// invert that: an unrecognised audience would then match everything.
|
|
17
|
+
const READABLE = {
|
|
18
|
+
admin: EVERY_LEVEL,
|
|
19
|
+
internal: EVERY_LEVEL,
|
|
20
|
+
members: [metafield_types_1.MEMBER_ACCESS.read, metafield_types_1.MEMBER_ACCESS.write],
|
|
21
|
+
};
|
|
22
|
+
const WRITABLE = {
|
|
23
|
+
admin: EVERY_LEVEL,
|
|
24
|
+
internal: EVERY_LEVEL,
|
|
25
|
+
members: [metafield_types_1.MEMBER_ACCESS.write],
|
|
26
|
+
};
|
|
27
|
+
// `Object.hasOwn` rather than a plain lookup: an entry naming a property every object
|
|
28
|
+
// inherits (`__proto__`, `constructor`, `toString`) would otherwise return that
|
|
29
|
+
// inherited value instead of falling through to the empty list.
|
|
30
|
+
function levelsFor(table, audience) {
|
|
31
|
+
const entry = audience?.entry;
|
|
32
|
+
return entry !== undefined && Object.hasOwn(table, entry) ? table[entry] : [];
|
|
33
|
+
}
|
|
34
|
+
function readableLevels(audience) {
|
|
35
|
+
return levelsFor(READABLE, audience);
|
|
36
|
+
}
|
|
37
|
+
function canWrite(audience, field) {
|
|
38
|
+
return levelsFor(WRITABLE, audience).includes(field.memberAccess);
|
|
39
|
+
}
|
|
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.actingContext = actingContext;
|
|
7
|
-
exports.
|
|
7
|
+
exports.recordMetafieldAction = recordMetafieldAction;
|
|
8
8
|
const logging_1 = __importDefault(require("@tryghost/logging"));
|
|
9
9
|
/**
|
|
10
10
|
* Who is acting, read off an API frame's context.
|
|
11
11
|
*
|
|
12
|
-
* Here rather than in each endpoint, because two resources now record
|
|
12
|
+
* Here rather than in each endpoint, because two resources now record metafield history
|
|
13
13
|
* and a second reading of the same shape is a second chance to disagree about it. An
|
|
14
14
|
* integration and a user are both actors; a request that is neither — a webhook, a job —
|
|
15
15
|
* has none, and the history says so rather than guessing.
|
|
@@ -31,12 +31,13 @@ const COMMANDS = {
|
|
|
31
31
|
create: 'added',
|
|
32
32
|
rename: 'edited',
|
|
33
33
|
reorder: 'edited',
|
|
34
|
+
changeAccess: 'edited',
|
|
34
35
|
archive: 'archived',
|
|
35
36
|
restore: 'restored',
|
|
36
37
|
delete: 'deleted',
|
|
37
38
|
};
|
|
38
39
|
// Best-effort action-log write: a failed action must never fail the command that triggered it.
|
|
39
|
-
async function
|
|
40
|
+
async function recordMetafieldAction({ Action, context, verb, subject, details, }) {
|
|
40
41
|
if (!context.actor) {
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
@@ -55,12 +56,12 @@ async function recordCustomFieldAction({ Action, context, verb, subject, details
|
|
|
55
56
|
}
|
|
56
57
|
catch (err) {
|
|
57
58
|
logging_1.default.error({
|
|
58
|
-
event: { name: 'members.
|
|
59
|
+
event: { name: 'members.metafields.action_log_failed' },
|
|
59
60
|
err,
|
|
60
61
|
verb,
|
|
61
62
|
subject,
|
|
62
63
|
actorType: context.actor.type,
|
|
63
64
|
actorId: context.actor.id,
|
|
64
|
-
}, 'Failed to record a member
|
|
65
|
+
}, 'Failed to record a member metafield action');
|
|
65
66
|
}
|
|
66
67
|
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MetafieldBindingsService = void 0;
|
|
7
|
+
const bson_objectid_1 = __importDefault(require("bson-objectid"));
|
|
8
|
+
const logging_1 = __importDefault(require("@tryghost/logging"));
|
|
9
|
+
const access_1 = require("./access");
|
|
10
|
+
const schema_1 = require("./schema");
|
|
11
|
+
const FIELDS_TABLE = 'members_metafields';
|
|
12
|
+
const { CUSTOM_NAMESPACE } = require('@tryghost/metafield-types/identity');
|
|
13
|
+
const BINDINGS_TABLE = 'members_metafield_bindings';
|
|
14
|
+
/**
|
|
15
|
+
* Where a source sends what it collected: a `port` is the name that source uses for a
|
|
16
|
+
* thing, and the binding resolves it to one of the publisher's fields.
|
|
17
|
+
*/
|
|
18
|
+
class MetafieldBindingsService {
|
|
19
|
+
knex;
|
|
20
|
+
values;
|
|
21
|
+
constructor({ knex, values }) {
|
|
22
|
+
this.knex = knex;
|
|
23
|
+
this.values = values;
|
|
24
|
+
}
|
|
25
|
+
async bind(db, productId, port, metafieldKey, now) {
|
|
26
|
+
const existing = await db(BINDINGS_TABLE).where({ product_id: productId, port }).first();
|
|
27
|
+
if (existing?.metafield_key === metafieldKey) {
|
|
28
|
+
await db(BINDINGS_TABLE).where('id', existing.id).update({ updated_at: now });
|
|
29
|
+
return existing.id;
|
|
30
|
+
}
|
|
31
|
+
if (existing) {
|
|
32
|
+
await db(BINDINGS_TABLE).where('id', existing.id).del();
|
|
33
|
+
}
|
|
34
|
+
const bindingId = new bson_objectid_1.default().toHexString();
|
|
35
|
+
await db(BINDINGS_TABLE).insert({
|
|
36
|
+
id: bindingId,
|
|
37
|
+
product_id: productId,
|
|
38
|
+
port,
|
|
39
|
+
metafield_key: metafieldKey,
|
|
40
|
+
created_at: now,
|
|
41
|
+
updated_at: now,
|
|
42
|
+
});
|
|
43
|
+
return bindingId;
|
|
44
|
+
}
|
|
45
|
+
/** Stops the writing. Whatever hangs off the binding cascades with it. */
|
|
46
|
+
async remove(db, productId, port) {
|
|
47
|
+
await db(BINDINGS_TABLE).where({ product_id: productId, port }).del();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Values a processor collected on Ghost's behalf and sent back.
|
|
51
|
+
*
|
|
52
|
+
* Nobody supplied these in a sense the site can name — a payment page asked, and a
|
|
53
|
+
* machine reported the answers — so what is recorded against them is the binding that
|
|
54
|
+
* routed each one. That resolves back to the tier that asked, what it was collected
|
|
55
|
+
* as, and the field it landed in, which is everything worth knowing about how the
|
|
56
|
+
* value arrived.
|
|
57
|
+
*/
|
|
58
|
+
async writeCollected(memberId, productId, collected) {
|
|
59
|
+
return this.writeThrough(memberId, productId, collected, (binding) => ({
|
|
60
|
+
type: 'binding',
|
|
61
|
+
id: binding.bindingId,
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Values a member supplied about themselves, through the same ports a checkout uses.
|
|
66
|
+
*
|
|
67
|
+
* A member typing their own address into a form is answerable for it in a way no
|
|
68
|
+
* routing is, and a record saying a binding wrote it would be wrong. The member is the
|
|
69
|
+
* one whose record this is, so there is nobody else it could be.
|
|
70
|
+
*/
|
|
71
|
+
async writeSuppliedByMember(memberId, productId, supplied) {
|
|
72
|
+
return this.writeThrough(memberId, productId, supplied, () => ({
|
|
73
|
+
type: 'member',
|
|
74
|
+
id: memberId,
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Values arrive in the order they are to be applied: where two land in one field, the
|
|
79
|
+
* last of them is what the field holds.
|
|
80
|
+
*
|
|
81
|
+
* Every value is attempted, and then the first failure is raised. Attempting them all
|
|
82
|
+
* is this method's business: one refused answer must not cost a publisher the address
|
|
83
|
+
* a courier needs, and the values have nothing to do with each other beyond arriving
|
|
84
|
+
* together. Whether the failure is worth acting on is the caller's, which is why it
|
|
85
|
+
* leaves here rather than being logged and forgotten — a checkout webhook has already
|
|
86
|
+
* taken the money and must never fail, while a member filling in a form is owed the
|
|
87
|
+
* news.
|
|
88
|
+
*/
|
|
89
|
+
async writeThrough(memberId, productId, values, attribute) {
|
|
90
|
+
let failure;
|
|
91
|
+
for (const { port, value } of values) {
|
|
92
|
+
try {
|
|
93
|
+
// Inside, because working out where a value goes can fail the same way storing
|
|
94
|
+
// it can, and a value nobody could place is no more reason to abandon the rest
|
|
95
|
+
// than one nobody could store.
|
|
96
|
+
const destination = await this.resolve(productId, port);
|
|
97
|
+
if (!destination) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
await this.writeOne(memberId, destination, value, attribute);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
failure = failure ?? err;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (failure) {
|
|
107
|
+
throw failure;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async writeOne(memberId, into, value, attribute) {
|
|
111
|
+
// Internal: what may be set is bounded by the binding rather than by who is
|
|
112
|
+
// looking. A port exists because a publisher pointed it at a field, and that
|
|
113
|
+
// decision is what admits the value, whoever supplied it.
|
|
114
|
+
const planned = await this.values.planWrite({ [`${CUSTOM_NAMESPACE}.${into.key}`]: value }, access_1.INTERNAL);
|
|
115
|
+
await this.values.applyWrite(memberId, planned, { writtenBy: attribute(into) });
|
|
116
|
+
}
|
|
117
|
+
async resolve(productId, port) {
|
|
118
|
+
const row = await this.knex(BINDINGS_TABLE)
|
|
119
|
+
.join(FIELDS_TABLE, `${BINDINGS_TABLE}.metafield_key`, `${FIELDS_TABLE}.key`)
|
|
120
|
+
.where(`${BINDINGS_TABLE}.product_id`, productId)
|
|
121
|
+
.where(`${BINDINGS_TABLE}.port`, port)
|
|
122
|
+
// An archived destination is still where this goes, and still not somewhere a value
|
|
123
|
+
// can land, so the write drops rather than waiting.
|
|
124
|
+
.where(`${FIELDS_TABLE}.status`, schema_1.FIELD_STATUS.active)
|
|
125
|
+
.select(`${BINDINGS_TABLE}.id as binding_id`, `${FIELDS_TABLE}.key`, `${FIELDS_TABLE}.type`)
|
|
126
|
+
.first();
|
|
127
|
+
if (!row) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
// Decoded rather than trusted: a join is a read boundary, and `type` is what decides
|
|
131
|
+
// how the collected value is read. Unreadable counts as unresolved rather than
|
|
132
|
+
// throwing, so one bad row skips its value the way an unbound port does instead of
|
|
133
|
+
// failing everything else the same checkout collected.
|
|
134
|
+
const bound = schema_1.DbBoundField.safeParse(row);
|
|
135
|
+
if (!bound.success) {
|
|
136
|
+
logging_1.default.warn({
|
|
137
|
+
event: { name: 'members.metafields.binding_unreadable' },
|
|
138
|
+
err: bound.error,
|
|
139
|
+
productId,
|
|
140
|
+
port,
|
|
141
|
+
}, 'A binding could not be read');
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
return { bindingId: bound.data.binding_id, key: bound.data.key, type: bound.data.type };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.MetafieldBindingsService = MetafieldBindingsService;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.metafieldCodec = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const identity_1 = require("@tryghost/metafield-types/identity");
|
|
6
|
+
const case_keys_1 = require("../../lib/case-keys");
|
|
7
|
+
const schema_1 = require("./schema");
|
|
8
|
+
const models_1 = require("./models");
|
|
9
|
+
exports.metafieldCodec = zod_1.z.codec(schema_1.DbMetafield, models_1.Metafield, {
|
|
10
|
+
// DbMetafield validates `type` as the field-type enum, so the decoded row
|
|
11
|
+
// already carries a FieldType and camelKeys preserves it — no cast needed.
|
|
12
|
+
decode: ({ member_access: memberAccess, ...row }) => ({
|
|
13
|
+
...(0, case_keys_1.camelKeys)(row),
|
|
14
|
+
namespace: identity_1.CUSTOM_NAMESPACE,
|
|
15
|
+
access: { member: memberAccess },
|
|
16
|
+
}),
|
|
17
|
+
encode: ({ namespace: _namespace, access, ...field }) => ({
|
|
18
|
+
...(0, case_keys_1.snakeKeys)(field),
|
|
19
|
+
member_access: access.member,
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
@@ -22,7 +22,7 @@ const Ceiling = zod_1.z
|
|
|
22
22
|
// rather than restated. Parsed eagerly because a missing or malformed value
|
|
23
23
|
// there is our bug rather than an operator's, and should fail loudly at boot
|
|
24
24
|
// instead of quietly becoming the fallback for everything below.
|
|
25
|
-
const shippedCeiling = Ceiling.parse(require('../../../shared/config/defaults.json').members.
|
|
25
|
+
const shippedCeiling = Ceiling.parse(require('../../../shared/config/defaults.json').members.metafields.maxDefinitions);
|
|
26
26
|
// A higher layer can override the shipped value with anything. Something
|
|
27
27
|
// unreadable falls back to the shipped ceiling rather than throwing, because an
|
|
28
28
|
// operator can correct this live and a bad value must not take the feature down
|