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
|
@@ -3,21 +3,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.MetafieldValuesService = void 0;
|
|
7
7
|
const bson_objectid_1 = __importDefault(require("bson-objectid"));
|
|
8
8
|
const errors_1 = __importDefault(require("@tryghost/errors"));
|
|
9
9
|
const logging_1 = __importDefault(require("@tryghost/logging"));
|
|
10
10
|
const zod_1 = require("zod");
|
|
11
|
-
const
|
|
12
|
-
const identity_1 = require("@tryghost/
|
|
11
|
+
const metafield_types_1 = require("@tryghost/metafield-types");
|
|
12
|
+
const identity_1 = require("@tryghost/metafield-types/identity");
|
|
13
13
|
const schema_1 = require("./schema");
|
|
14
14
|
const queries_1 = require("./queries");
|
|
15
|
+
const access_1 = require("./access");
|
|
15
16
|
const storage_1 = require("./storage");
|
|
16
|
-
const FIELDS_TABLE = '
|
|
17
|
-
const VALUES_TABLE = '
|
|
17
|
+
const FIELDS_TABLE = 'members_metafields';
|
|
18
|
+
const VALUES_TABLE = 'members_metafield_values';
|
|
18
19
|
/**
|
|
19
20
|
* From the canonical schema, the same source definitions-service reads, so no key a site
|
|
20
|
-
* could hold is refused and this cannot drift from the `
|
|
21
|
+
* could hold is refused and this cannot drift from the `members_metafields.key` column.
|
|
21
22
|
*/
|
|
22
23
|
const MAX_KEY_LENGTH = require('../../data/schema').tables[FIELDS_TABLE].key.maxlength;
|
|
23
24
|
/**
|
|
@@ -38,7 +39,7 @@ const wireProperty = (identity) => [identity_1.QUALIFIER, identity].join('.');
|
|
|
38
39
|
* because a value belongs to the member and a definition belongs to the site's settings,
|
|
39
40
|
* which are different aggregates rather than different layers.
|
|
40
41
|
*/
|
|
41
|
-
class
|
|
42
|
+
class MetafieldValuesService {
|
|
42
43
|
knex;
|
|
43
44
|
/** A getter, not a number: the ceiling is an operator setting that changes between requests. */
|
|
44
45
|
getMaxDefinitions;
|
|
@@ -46,7 +47,11 @@ class CustomFieldValuesService {
|
|
|
46
47
|
this.knex = knex;
|
|
47
48
|
this.getMaxDefinitions = getMaxDefinitions;
|
|
48
49
|
}
|
|
49
|
-
|
|
50
|
+
// The query is scoped to the audience, so a field they may not see is absent from
|
|
51
|
+
// the map and the caller reports it as unknown. Looking up unscoped and rejecting
|
|
52
|
+
// afterwards would let a member tell a hidden field from an undefined one by the
|
|
53
|
+
// reply they got.
|
|
54
|
+
async allowedFieldsByIdentity(identities, audience) {
|
|
50
55
|
const keys = identities
|
|
51
56
|
.map((identity) => (0, identity_1.parseIdentity)(identity))
|
|
52
57
|
.filter((parsed) => parsed !== null && parsed.namespace === identity_1.CUSTOM_NAMESPACE)
|
|
@@ -54,23 +59,29 @@ class CustomFieldValuesService {
|
|
|
54
59
|
if (keys.length === 0) {
|
|
55
60
|
return new Map();
|
|
56
61
|
}
|
|
57
|
-
const fields = await (0, queries_1.
|
|
62
|
+
const fields = await (0, queries_1.definitions)(this.knex, { audience, status: queries_1.ACTIVE_ONLY })
|
|
58
63
|
.whereIn('key', keys)
|
|
59
|
-
.select('id', 'key', 'name', 'type');
|
|
64
|
+
.select('id', 'key', 'name', 'type', 'member_access');
|
|
60
65
|
return new Map(fields.map((field) => [
|
|
61
66
|
(0, identity_1.formatIdentity)({ namespace: identity_1.CUSTOM_NAMESPACE, key: field.key, partPath: null }),
|
|
62
|
-
{
|
|
67
|
+
{
|
|
68
|
+
id: field.id,
|
|
69
|
+
key: field.key,
|
|
70
|
+
name: field.name,
|
|
71
|
+
type: field.type,
|
|
72
|
+
namespace: identity_1.CUSTOM_NAMESPACE,
|
|
73
|
+
memberAccess: field.member_access,
|
|
74
|
+
},
|
|
63
75
|
]));
|
|
64
76
|
}
|
|
65
|
-
async getValuesForMembers(memberIds) {
|
|
77
|
+
async getValuesForMembers(memberIds, audience) {
|
|
66
78
|
if (memberIds.length === 0) {
|
|
67
79
|
return new Map();
|
|
68
80
|
}
|
|
69
81
|
// Not ordered by field: these rows become an object keyed by field, and an object
|
|
70
82
|
// cannot carry an order. `path` is ordered so composite parts assemble the same
|
|
71
83
|
// way every time.
|
|
72
|
-
const rows = await this.knex(VALUES_TABLE)
|
|
73
|
-
.join(FIELDS_TABLE, `${VALUES_TABLE}.custom_field_key`, `${FIELDS_TABLE}.key`)
|
|
84
|
+
const rows = await (0, queries_1.readableBy)(this.knex(VALUES_TABLE).join(FIELDS_TABLE, `${VALUES_TABLE}.metafield_key`, `${FIELDS_TABLE}.key`), audience)
|
|
74
85
|
.whereIn(`${VALUES_TABLE}.member_id`, memberIds)
|
|
75
86
|
.where(`${FIELDS_TABLE}.status`, schema_1.FIELD_STATUS.active)
|
|
76
87
|
.orderBy(`${VALUES_TABLE}.path`, 'asc')
|
|
@@ -78,15 +89,15 @@ class CustomFieldValuesService {
|
|
|
78
89
|
const leaves = [];
|
|
79
90
|
for (const row of rows) {
|
|
80
91
|
try {
|
|
81
|
-
leaves.push(schema_1.
|
|
92
|
+
leaves.push(schema_1.DbMetafieldLeaf.parse(row));
|
|
82
93
|
}
|
|
83
94
|
catch (err) {
|
|
84
95
|
logging_1.default.warn({
|
|
85
|
-
event: { name: 'members.
|
|
96
|
+
event: { name: 'members.metafields.value_unreadable' },
|
|
86
97
|
err,
|
|
87
|
-
|
|
98
|
+
metafieldKey: row.key,
|
|
88
99
|
path: row.path,
|
|
89
|
-
}, 'Skipping an unreadable
|
|
100
|
+
}, 'Skipping an unreadable metafield value');
|
|
90
101
|
}
|
|
91
102
|
}
|
|
92
103
|
const flat = (0, storage_1.valuesFromLeaves)(leaves);
|
|
@@ -141,7 +152,7 @@ class CustomFieldValuesService {
|
|
|
141
152
|
* validate before opening a transaction it would otherwise have to unwind, then apply
|
|
142
153
|
* the same plan without re-resolving it.
|
|
143
154
|
*/
|
|
144
|
-
async planWrite(input) {
|
|
155
|
+
async planWrite(input, audience) {
|
|
145
156
|
const values = this.parseValues(input);
|
|
146
157
|
const identities = Object.keys(values);
|
|
147
158
|
// Bounded by the definitions ceiling, which also holds the lookup below inside
|
|
@@ -153,7 +164,7 @@ class CustomFieldValuesService {
|
|
|
153
164
|
property: identity_1.QUALIFIER,
|
|
154
165
|
});
|
|
155
166
|
}
|
|
156
|
-
const byIdentity = await this.
|
|
167
|
+
const byIdentity = await this.allowedFieldsByIdentity(identities, audience);
|
|
157
168
|
const writes = [];
|
|
158
169
|
for (const [identity, raw] of Object.entries(values)) {
|
|
159
170
|
const field = byIdentity.get(identity);
|
|
@@ -163,10 +174,18 @@ class CustomFieldValuesService {
|
|
|
163
174
|
property: wireProperty(identity),
|
|
164
175
|
});
|
|
165
176
|
}
|
|
177
|
+
// A different refusal from the unknown-field one above: this audience can
|
|
178
|
+
// already see the field, so naming it discloses nothing.
|
|
179
|
+
if (!(0, access_1.canWrite)(audience, field)) {
|
|
180
|
+
throw new errors_1.default.ValidationError({
|
|
181
|
+
message: `Cannot set custom field: ${identity}`,
|
|
182
|
+
property: wireProperty(identity),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
166
185
|
// `null` clears any field, and `''` clears one with no parts. For a value
|
|
167
186
|
// with parts `''` names nothing, so it is left to fail validation rather than
|
|
168
187
|
// being read as a silent delete.
|
|
169
|
-
if (raw === null || (raw === '' && (0,
|
|
188
|
+
if (raw === null || (raw === '' && (0, metafield_types_1.subFieldsOf)(field.type) === null)) {
|
|
170
189
|
writes.push({ field });
|
|
171
190
|
continue;
|
|
172
191
|
}
|
|
@@ -174,7 +193,7 @@ class CustomFieldValuesService {
|
|
|
174
193
|
// `context` when `context` is empty and prepends it when it is not, so
|
|
175
194
|
// anything added here reaches the client glued to the front of the reason.
|
|
176
195
|
// Which field failed rides in `property`.
|
|
177
|
-
const value =
|
|
196
|
+
const value = metafield_types_1.FIELD_TYPES[field.type].value.safeParse(raw);
|
|
178
197
|
if (!value.success) {
|
|
179
198
|
const issue = value.error.issues[0];
|
|
180
199
|
throw new errors_1.default.ValidationError({
|
|
@@ -224,7 +243,7 @@ class CustomFieldValuesService {
|
|
|
224
243
|
rows.push(...set.map((leaf) => ({
|
|
225
244
|
id: new bson_objectid_1.default().toHexString(),
|
|
226
245
|
member_id: memberId,
|
|
227
|
-
|
|
246
|
+
metafield_key: field.key,
|
|
228
247
|
path: leaf.path,
|
|
229
248
|
value_text: leaf.value_text,
|
|
230
249
|
written_by_type: writtenBy.type,
|
|
@@ -236,7 +255,7 @@ class CustomFieldValuesService {
|
|
|
236
255
|
if (clearedKeys.length > 0) {
|
|
237
256
|
await trx(VALUES_TABLE)
|
|
238
257
|
.where('member_id', memberId)
|
|
239
|
-
.whereIn('
|
|
258
|
+
.whereIn('metafield_key', clearedKeys)
|
|
240
259
|
.del();
|
|
241
260
|
}
|
|
242
261
|
if (clearedPaths.length > 0) {
|
|
@@ -245,7 +264,7 @@ class CustomFieldValuesService {
|
|
|
245
264
|
.where('member_id', memberId)
|
|
246
265
|
.where((builder) => {
|
|
247
266
|
for (const { fieldKey, paths } of clearedPaths) {
|
|
248
|
-
builder.orWhere((pair) => pair.where('
|
|
267
|
+
builder.orWhere((pair) => pair.where('metafield_key', fieldKey).whereIn('path', paths));
|
|
249
268
|
}
|
|
250
269
|
})
|
|
251
270
|
.del();
|
|
@@ -258,7 +277,7 @@ class CustomFieldValuesService {
|
|
|
258
277
|
.insert(rows.slice(from, from + UPSERT_CHUNK))
|
|
259
278
|
// Naming the columns rather than giving values takes each from the row
|
|
260
279
|
// that lost the conflict, so every part updates to its own value.
|
|
261
|
-
.onConflict(['member_id', '
|
|
280
|
+
.onConflict(['member_id', 'metafield_key', 'path'])
|
|
262
281
|
// The writer is merged with the value, so a leaf names who wrote what
|
|
263
282
|
// it currently holds rather than who wrote its first value.
|
|
264
283
|
.merge(['value_text', 'written_by_type', 'written_by_id', 'updated_at']);
|
|
@@ -273,4 +292,4 @@ class CustomFieldValuesService {
|
|
|
273
292
|
}
|
|
274
293
|
}
|
|
275
294
|
}
|
|
276
|
-
exports.
|
|
295
|
+
exports.MetafieldValuesService = MetafieldValuesService;
|
|
@@ -63,7 +63,7 @@ module.exports = class MentionDiscoveryService {
|
|
|
63
63
|
return null;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
const cheerio = require('cheerio');
|
|
66
|
+
const cheerio = require('cheerio/slim');
|
|
67
67
|
const $ = cheerio.load(response.body);
|
|
68
68
|
|
|
69
69
|
// must be first <link> OR <a> element with rel=webmention
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const errors = require('@tryghost/errors');
|
|
2
2
|
const logging = require('@tryghost/logging');
|
|
3
|
+
const SendWebmentionsJob = require('./send-webmentions-job').default;
|
|
3
4
|
|
|
4
5
|
module.exports = class MentionSendingService {
|
|
5
6
|
#discoveryService;
|
|
@@ -8,8 +9,12 @@ module.exports = class MentionSendingService {
|
|
|
8
9
|
#getPostData;
|
|
9
10
|
#getPostUrl;
|
|
10
11
|
#isEnabled;
|
|
11
|
-
#
|
|
12
|
+
#jobsService;
|
|
12
13
|
|
|
14
|
+
/**
|
|
15
|
+
* @param {object} deps
|
|
16
|
+
* @param {import('../jobs-service/jobs-service').JobsService} deps.jobsService
|
|
17
|
+
*/
|
|
13
18
|
constructor({
|
|
14
19
|
discoveryService,
|
|
15
20
|
externalRequest,
|
|
@@ -17,7 +22,7 @@ module.exports = class MentionSendingService {
|
|
|
17
22
|
getPostData,
|
|
18
23
|
getPostUrl,
|
|
19
24
|
isEnabled,
|
|
20
|
-
|
|
25
|
+
jobsService,
|
|
21
26
|
}) {
|
|
22
27
|
this.#discoveryService = discoveryService;
|
|
23
28
|
this.#externalRequest = externalRequest;
|
|
@@ -25,7 +30,7 @@ module.exports = class MentionSendingService {
|
|
|
25
30
|
this.#getPostData = getPostData;
|
|
26
31
|
this.#getPostUrl = getPostUrl;
|
|
27
32
|
this.#isEnabled = isEnabled;
|
|
28
|
-
this.#
|
|
33
|
+
this.#jobsService = jobsService;
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
get siteUrl() {
|
|
@@ -82,13 +87,13 @@ module.exports = class MentionSendingService {
|
|
|
82
87
|
// Capture the source URL now, from the event's data, rather than
|
|
83
88
|
// deferring the model into the job.
|
|
84
89
|
const url = new URL(await this.#resolvePostUrl(post));
|
|
85
|
-
await this.#
|
|
86
|
-
|
|
87
|
-
url,
|
|
90
|
+
await this.#jobsService.dispatch(
|
|
91
|
+
new SendWebmentionsJob({
|
|
92
|
+
sourceUrl: url.href,
|
|
88
93
|
html: html,
|
|
89
94
|
previousHtml: previousHtml,
|
|
90
|
-
})
|
|
91
|
-
|
|
95
|
+
}),
|
|
96
|
+
);
|
|
92
97
|
}
|
|
93
98
|
} catch (e) {
|
|
94
99
|
logging.error('Error in webmention sending service post update event handler:');
|
|
@@ -157,11 +162,23 @@ module.exports = class MentionSendingService {
|
|
|
157
162
|
});
|
|
158
163
|
}
|
|
159
164
|
|
|
165
|
+
/**
|
|
166
|
+
* Send the webmentions for a delivered job.
|
|
167
|
+
* @param {import('./send-webmentions-job').default} job
|
|
168
|
+
*/
|
|
169
|
+
async sendWebmentions(job) {
|
|
170
|
+
await this.sendForHTMLResource({
|
|
171
|
+
url: new URL(job.sourceUrl),
|
|
172
|
+
html: job.html,
|
|
173
|
+
previousHtml: job.previousHtml,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
160
177
|
/**
|
|
161
178
|
* Send a webmention call for the links in a resource.
|
|
162
179
|
* @param {object} resource
|
|
163
180
|
* @param {URL} resource.url
|
|
164
|
-
* @param {string} resource.html
|
|
181
|
+
* @param {string|null} resource.html
|
|
165
182
|
* @param {string|null} [resource.previousHtml]
|
|
166
183
|
*/
|
|
167
184
|
async sendForHTMLResource(resource) {
|
|
@@ -225,7 +242,7 @@ module.exports = class MentionSendingService {
|
|
|
225
242
|
* @returns {URL[]}
|
|
226
243
|
*/
|
|
227
244
|
getLinks(html) {
|
|
228
|
-
const cheerio = require('cheerio');
|
|
245
|
+
const cheerio = require('cheerio/slim');
|
|
229
246
|
const $ = cheerio.load(html);
|
|
230
247
|
const urls = [];
|
|
231
248
|
const siteUrl = this.siteUrl;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const job_1 = require("../jobs-service/job");
|
|
4
|
+
// Carries the post's full html twice - the largest job payload in the system;
|
|
5
|
+
// revisit if a durable backend puts size limits on envelopes.
|
|
6
|
+
class SendWebmentionsJob extends job_1.Job {
|
|
7
|
+
static type = 'send-webmentions';
|
|
8
|
+
sourceUrl;
|
|
9
|
+
html;
|
|
10
|
+
previousHtml;
|
|
11
|
+
constructor({ sourceUrl, html, previousHtml, }) {
|
|
12
|
+
super();
|
|
13
|
+
this.sourceUrl = sourceUrl;
|
|
14
|
+
this.html = html ?? null;
|
|
15
|
+
this.previousHtml = previousHtml ?? null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.default = SendWebmentionsJob;
|
|
@@ -14,8 +14,6 @@ const outputSerializerUrlUtil = require('../../../server/api/endpoints/utils/ser
|
|
|
14
14
|
const urlService = require('../url');
|
|
15
15
|
const settingsCache = require('../../../shared/settings-cache');
|
|
16
16
|
const DomainEvents = require('@tryghost/domain-events');
|
|
17
|
-
const logging = require('@tryghost/logging');
|
|
18
|
-
const mentionsJobService = require('../mentions-jobs');
|
|
19
17
|
|
|
20
18
|
// Serializes a post model to the data the URL service needs, loading the
|
|
21
19
|
// relations it reads for filtered collections (event-emitted models don't
|
|
@@ -38,33 +36,6 @@ function getPostUrl(id, postData) {
|
|
|
38
36
|
return jsonModel.url;
|
|
39
37
|
}
|
|
40
38
|
|
|
41
|
-
// Reports the same queued/started/finished/failed lifecycle for every mentions
|
|
42
|
-
// background job. The wrapped callback's result and errors pass through unchanged,
|
|
43
|
-
// so job manager outcomes and retries are unaffected.
|
|
44
|
-
function makeLoggingJobService() {
|
|
45
|
-
return {
|
|
46
|
-
async addJob(name, fn) {
|
|
47
|
-
logging.info(`[Background Job] ${name} queued`);
|
|
48
|
-
mentionsJobService.addJob({
|
|
49
|
-
name,
|
|
50
|
-
job: async () => {
|
|
51
|
-
const startedAt = Date.now();
|
|
52
|
-
logging.info(`[Background Job] ${name} started`);
|
|
53
|
-
try {
|
|
54
|
-
const result = await fn();
|
|
55
|
-
logging.info(`[Background Job] ${name} completed in ${Date.now() - startedAt}ms`);
|
|
56
|
-
return result;
|
|
57
|
-
} catch (err) {
|
|
58
|
-
logging.error(err, `[Background Job] ${name} failed after ${Date.now() - startedAt}ms`);
|
|
59
|
-
throw err;
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
offloaded: false,
|
|
63
|
-
});
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
39
|
module.exports = {
|
|
69
40
|
/** @type {import('./mentions-api')} */
|
|
70
41
|
api: null,
|
|
@@ -141,7 +112,7 @@ module.exports = {
|
|
|
141
112
|
getPostData: (post) => getPostData(post),
|
|
142
113
|
getPostUrl: (id, data) => getPostUrl(id, data),
|
|
143
114
|
isEnabled: () => !settingsCache.get('is_private'),
|
|
144
|
-
|
|
115
|
+
jobsService,
|
|
145
116
|
});
|
|
146
117
|
sendingService.listen(events);
|
|
147
118
|
|
|
@@ -152,4 +123,3 @@ module.exports = {
|
|
|
152
123
|
// exposed for testing
|
|
153
124
|
module.exports.getPostData = getPostData;
|
|
154
125
|
module.exports.getPostUrl = getPostUrl;
|
|
155
|
-
module.exports.makeLoggingJobService = makeLoggingJobService;
|
|
@@ -42,6 +42,7 @@ const messages = {
|
|
|
42
42
|
unableToFetchOembed: 'Unable to fetch requested embed.',
|
|
43
43
|
unauthorized: 'URL contains a private resource.',
|
|
44
44
|
unconvertibleSvg: 'SVG image is too large or compressed to convert.',
|
|
45
|
+
unsupportedImage: 'Image is not a supported file type.',
|
|
45
46
|
};
|
|
46
47
|
|
|
47
48
|
const SVG_RASTER_SIZE = 256;
|
|
@@ -68,6 +69,16 @@ const shouldRasterize = (buffer, ext) => {
|
|
|
68
69
|
return head.startsWith('<') && /<svg[\s:>]/i.test(head);
|
|
69
70
|
};
|
|
70
71
|
|
|
72
|
+
let fileTypeFromBuffer;
|
|
73
|
+
|
|
74
|
+
const detectFileType = async (buffer) => {
|
|
75
|
+
if (!fileTypeFromBuffer) {
|
|
76
|
+
({ fileTypeFromBuffer } = await import('file-type'));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return fileTypeFromBuffer(buffer);
|
|
80
|
+
};
|
|
81
|
+
|
|
71
82
|
/**
|
|
72
83
|
* @param {string} url
|
|
73
84
|
* @returns {{url: string, provider: boolean}}
|
|
@@ -234,6 +245,20 @@ class OEmbedService {
|
|
|
234
245
|
});
|
|
235
246
|
|
|
236
247
|
ext = '.png';
|
|
248
|
+
} else {
|
|
249
|
+
// The URL's extension is attacker-controlled and decides the
|
|
250
|
+
// Content-Type the stored file is later served with, so name the
|
|
251
|
+
// file after its contents and hold it to the same allowlist as image
|
|
252
|
+
// uploads. `file-type` never reports SVG, which is handled above.
|
|
253
|
+
const fileType = await detectFileType(imageBuffer);
|
|
254
|
+
ext = fileType ? `.${fileType.ext}` : '';
|
|
255
|
+
|
|
256
|
+
if (!this.config.get('uploads').images.extensions.includes(ext)) {
|
|
257
|
+
throw new errors.ValidationError({
|
|
258
|
+
message: tpl(messages.unsupportedImage),
|
|
259
|
+
context: imageUrl,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
237
262
|
}
|
|
238
263
|
|
|
239
264
|
const uniqueFileName = `${name}-${crypto.randomUUID()}${ext}`;
|
|
@@ -561,12 +586,12 @@ class OEmbedService {
|
|
|
561
586
|
*/
|
|
562
587
|
async fetchOembedData(url, html, cardType) {
|
|
563
588
|
// Lazy require the library to keep boot quick
|
|
564
|
-
const cheerio = require('cheerio');
|
|
589
|
+
const cheerio = require('cheerio/slim');
|
|
565
590
|
|
|
566
591
|
// check for <link rel="alternate" type="application/json+oembed"> element
|
|
567
592
|
let oembedUrl;
|
|
568
593
|
try {
|
|
569
|
-
oembedUrl = cheerio('link[type="application/json+oembed"]'
|
|
594
|
+
oembedUrl = cheerio.load(html)('link[type="application/json+oembed"]').attr('href');
|
|
570
595
|
} catch (e) {
|
|
571
596
|
return this.unknownProvider(url);
|
|
572
597
|
}
|
|
@@ -622,15 +647,15 @@ class OEmbedService {
|
|
|
622
647
|
return;
|
|
623
648
|
}
|
|
624
649
|
|
|
625
|
-
// `rich` and `
|
|
626
|
-
// stored in the post's Lexical payload and rendered
|
|
627
|
-
// editor preview (via srcdoc) and into public themes
|
|
628
|
-
// Known providers (YouTube, Twitter, etc.)
|
|
629
|
-
// with @extractus/oembed-extractor's
|
|
630
|
-
// here is an arbitrary site's
|
|
631
|
-
// must not trust. Drop the
|
|
632
|
-
// a bookmark card.
|
|
633
|
-
if (oembed.type === 'video' || oembed.type === 'rich') {
|
|
650
|
+
// `rich`, `video` and `photo` responses can all ship provider-supplied
|
|
651
|
+
// HTML that gets stored in the post's Lexical payload and rendered
|
|
652
|
+
// into the admin editor preview (via srcdoc) and into public themes
|
|
653
|
+
// and emails (via innerHTML). Known providers (YouTube, Twitter, etc.)
|
|
654
|
+
// go through `knownProvider` with @extractus/oembed-extractor's
|
|
655
|
+
// allowlist — anything reaching here is an arbitrary site's
|
|
656
|
+
// self-declared oEmbed endpoint, which we must not trust. Drop the
|
|
657
|
+
// response and let the caller fall back to a bookmark card.
|
|
658
|
+
if (oembed.type === 'video' || oembed.type === 'rich' || oembed.type === 'photo') {
|
|
634
659
|
return;
|
|
635
660
|
}
|
|
636
661
|
|
|
@@ -16,6 +16,10 @@ const messages = {
|
|
|
16
16
|
// retrying a publish that will never happen.
|
|
17
17
|
const NO_OP = { scheduledResource: null, preScheduledResource: null };
|
|
18
18
|
|
|
19
|
+
// Ignore overlapping deliveries for the same resource. The scheduler owns
|
|
20
|
+
// retries if the active publish fails; always release the guard when it settles.
|
|
21
|
+
const inFlight = new Set();
|
|
22
|
+
|
|
19
23
|
/**
|
|
20
24
|
* Publishes scheduled resource (a post or a page at the moment of writing)
|
|
21
25
|
*
|
|
@@ -27,6 +31,22 @@ const NO_OP = { scheduledResource: null, preScheduledResource: null };
|
|
|
27
31
|
* `scheduledResource: null` when there was nothing to publish yet
|
|
28
32
|
*/
|
|
29
33
|
exports.publish = async (resourceType, id, force, options) => {
|
|
34
|
+
const key = `${resourceType}:${id}`;
|
|
35
|
+
|
|
36
|
+
if (inFlight.has(key)) {
|
|
37
|
+
return NO_OP;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
inFlight.add(key);
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
return await publishNow(resourceType, id, force, options);
|
|
44
|
+
} finally {
|
|
45
|
+
inFlight.delete(key);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const publishNow = async (resourceType, id, force, options) => {
|
|
30
50
|
const publishAPostBySchedulerToleranceInMinutes =
|
|
31
51
|
config.get('times').publishAPostBySchedulerToleranceInMinutes;
|
|
32
52
|
|
|
@@ -669,7 +669,11 @@ class StaffServiceEmails {
|
|
|
669
669
|
|
|
670
670
|
const juice = require('juice');
|
|
671
671
|
|
|
672
|
-
return juice(html, {
|
|
672
|
+
return juice(html, {
|
|
673
|
+
inlinePseudoElements: true,
|
|
674
|
+
removeStyleTags: true,
|
|
675
|
+
resolveCSSVariables: false,
|
|
676
|
+
});
|
|
673
677
|
}
|
|
674
678
|
|
|
675
679
|
async renderText(templateName, data) {
|
|
@@ -246,10 +246,19 @@ class StatsService {
|
|
|
246
246
|
const request = deps.request || require('../../lib/request-external');
|
|
247
247
|
const settingsCache = deps.settingsCache || require('../../../shared/settings-cache');
|
|
248
248
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
249
|
+
const labs = deps.labs || require('../../../shared/labs');
|
|
250
|
+
const webAnalyticsEnabled = settingsCache.get('web_analytics_enabled');
|
|
251
|
+
const TinybirdServiceWrapper = require('../tinybird');
|
|
252
|
+
|
|
253
|
+
if (
|
|
254
|
+
webAnalyticsEnabled ||
|
|
255
|
+
(labs.isSet('automationsTinybirdSync') && config.get('tinybird:stats'))
|
|
256
|
+
) {
|
|
252
257
|
TinybirdServiceWrapper.init();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (webAnalyticsEnabled) {
|
|
261
|
+
// TODO: move the tinybird client to the tinybird service
|
|
253
262
|
tinybirdClient = require('./utils/tinybird').create({
|
|
254
263
|
config,
|
|
255
264
|
request,
|
|
@@ -453,7 +453,7 @@ module.exports = class CheckoutSessionEventService {
|
|
|
453
453
|
|
|
454
454
|
/**
|
|
455
455
|
* This service knows how to read a completed Stripe session. It does not know, and must
|
|
456
|
-
* not know, which
|
|
456
|
+
* not know, which metafield any of those values belongs in — that is what a binding
|
|
457
457
|
* decides, so no field key appears anywhere in this code.
|
|
458
458
|
*
|
|
459
459
|
* Nothing here may be fatal: a throw fails the webhook, which makes Stripe retry it and
|
|
@@ -493,7 +493,7 @@ module.exports = class CheckoutSessionEventService {
|
|
|
493
493
|
return;
|
|
494
494
|
}
|
|
495
495
|
|
|
496
|
-
await this.deps.
|
|
496
|
+
await this.deps.metafieldBindings.writeCollected(
|
|
497
497
|
memberId,
|
|
498
498
|
tierId,
|
|
499
499
|
collectedByPort.parse(session),
|
|
@@ -10,7 +10,7 @@ const InvoiceEventService = require('./services/webhook/invoice-event-service');
|
|
|
10
10
|
const CheckoutSessionEventService = require('./services/webhook/checkout-session-event-service');
|
|
11
11
|
const ChargeRefundedEventService = require('./services/webhook/charge-refunded-event-service');
|
|
12
12
|
const memberWelcomeEmailService = require('../member-welcome-emails/service');
|
|
13
|
-
const
|
|
13
|
+
const metafields = require('../members-metafields');
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* @typedef {object} IStripeServiceConfig
|
|
@@ -135,10 +135,10 @@ module.exports = class StripeService {
|
|
|
135
135
|
memberWelcomeEmailService.init();
|
|
136
136
|
return memberWelcomeEmailService.api.isMemberWelcomeEmailActive('paid');
|
|
137
137
|
},
|
|
138
|
-
// A getter because the
|
|
138
|
+
// A getter because the metafields services are built during boot: reading the
|
|
139
139
|
// binding at construction would capture the empty value it had beforehand.
|
|
140
|
-
get
|
|
141
|
-
return
|
|
140
|
+
get metafieldBindings() {
|
|
141
|
+
return metafields.bindings;
|
|
142
142
|
},
|
|
143
143
|
});
|
|
144
144
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.questionRowCodec = exports.QuestionRow = exports.collectionRowCodec = exports.CollectionRow = exports.optionsCodec = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
-
const
|
|
5
|
+
const metafield_types_1 = require("@tryghost/metafield-types");
|
|
6
6
|
const boolean_1 = require("../../lib/db-types/boolean");
|
|
7
7
|
const schema_1 = require("./schema");
|
|
8
8
|
const models_1 = require("./models");
|
|
@@ -67,7 +67,7 @@ exports.QuestionRow = zod_1.z.object({
|
|
|
67
67
|
label: schema_1.DbCheckoutQuestion.shape.label,
|
|
68
68
|
optional: schema_1.DbCheckoutQuestion.shape.optional,
|
|
69
69
|
question_name: zod_1.z.string().nullable(),
|
|
70
|
-
question_type:
|
|
70
|
+
question_type: metafield_types_1.FieldTypeSchema.nullable(),
|
|
71
71
|
});
|
|
72
72
|
exports.questionRowCodec = exports.QuestionRow.transform((row) => ({
|
|
73
73
|
tierId: row.product_id,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toCheckoutConfigResponse = exports.TierCheckoutConfig = exports.ShippingCollection = exports.ResolvedQuestion = exports.ResolvedCheckout = exports.PhoneCollection = exports.emptyCheckoutConfig = exports.CheckoutQuestion = exports.TierCheckoutConfigService = void 0;
|
|
3
|
+
exports.requirementsByTier = exports.toCheckoutConfigResponse = exports.TierCheckoutConfig = exports.ShippingCollection = exports.ResolvedQuestion = exports.ResolvedCheckout = exports.PhoneCollection = exports.emptyCheckoutConfig = exports.CheckoutQuestion = exports.TierCheckoutConfigService = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* What a tier's checkout asks and collects.
|
|
6
6
|
*
|
|
@@ -24,3 +24,4 @@ Object.defineProperty(exports, "ShippingCollection", { enumerable: true, get: fu
|
|
|
24
24
|
Object.defineProperty(exports, "TierCheckoutConfig", { enumerable: true, get: function () { return models_1.TierCheckoutConfig; } });
|
|
25
25
|
var serializers_1 = require("./serializers");
|
|
26
26
|
Object.defineProperty(exports, "toCheckoutConfigResponse", { enumerable: true, get: function () { return serializers_1.toCheckoutConfigResponse; } });
|
|
27
|
+
Object.defineProperty(exports, "requirementsByTier", { enumerable: true, get: function () { return serializers_1.requirementsByTier; } });
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ResolvedCheckout = exports.ResolvedQuestion = exports.CheckoutOptions = exports.emptyCheckoutConfig = exports.emptyCollection = exports.TierCheckoutConfig = exports.PhoneCollection = exports.ShippingCollection = exports.CheckoutQuestion = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
-
const
|
|
5
|
+
const metafield_types_1 = require("@tryghost/metafield-types");
|
|
6
6
|
exports.CheckoutQuestion = zod_1.z.object({
|
|
7
7
|
key: zod_1.z.string(),
|
|
8
8
|
label: zod_1.z.string().nullable(),
|
|
@@ -53,7 +53,7 @@ exports.CheckoutOptions = zod_1.z.object({
|
|
|
53
53
|
});
|
|
54
54
|
exports.ResolvedQuestion = exports.CheckoutQuestion.extend({
|
|
55
55
|
prompt: zod_1.z.string(),
|
|
56
|
-
type:
|
|
56
|
+
type: metafield_types_1.FieldTypeSchema,
|
|
57
57
|
});
|
|
58
58
|
exports.ResolvedCheckout = zod_1.z.object({
|
|
59
59
|
customFields: zod_1.z.array(exports.ResolvedQuestion),
|