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
package/core/server/services/{members-custom-fields → members-metafields}/definitions-service.js
RENAMED
|
@@ -3,14 +3,16 @@ 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.MetafieldDefinitionsService = void 0;
|
|
7
7
|
const bson_objectid_1 = __importDefault(require("bson-objectid"));
|
|
8
8
|
const errors_1 = __importDefault(require("@tryghost/errors"));
|
|
9
9
|
const zod_1 = require("zod");
|
|
10
|
-
const
|
|
11
|
-
const identity_1 = require("@tryghost/
|
|
10
|
+
const metafield_types_1 = require("@tryghost/metafield-types");
|
|
11
|
+
const identity_1 = require("@tryghost/metafield-types/identity");
|
|
12
12
|
const codec_1 = require("./codec");
|
|
13
|
+
const namespaces_1 = require("./namespaces");
|
|
13
14
|
const schema_1 = require("./schema");
|
|
15
|
+
const access_1 = require("./access");
|
|
14
16
|
const queries_1 = require("./queries");
|
|
15
17
|
const key_1 = require("./key");
|
|
16
18
|
// The same NQL -> knex bridge Bookshelf's filter plugin uses, applied directly to
|
|
@@ -18,7 +20,7 @@ const key_1 = require("./key");
|
|
|
18
20
|
// turns that into parametrised WHERE clauses. Neither needs a Bookshelf model.
|
|
19
21
|
const nql = require('@tryghost/nql');
|
|
20
22
|
const knexify = require('@tryghost/mongo-knex');
|
|
21
|
-
const TABLE = '
|
|
23
|
+
const TABLE = 'members_metafields';
|
|
22
24
|
// Column limits come from the canonical schema — the same source the migration and
|
|
23
25
|
// Bookshelf models read — so the service can never drift from the database. The
|
|
24
26
|
// name cap turns an over-long input into a clean 422 (not a DB error), and the key
|
|
@@ -45,10 +47,12 @@ const FieldName = zod_1.z
|
|
|
45
47
|
.trim()
|
|
46
48
|
.min(1, { message: 'Custom field name is required.' })
|
|
47
49
|
.max(MAX_NAME_LENGTH, { message: 'Custom field name is too long.' });
|
|
48
|
-
|
|
50
|
+
const FieldAccess = zod_1.z.object({ member: access_1.MemberAccessSchema });
|
|
51
|
+
// No key: the backend mints it from the name.
|
|
49
52
|
const AddFieldInput = zod_1.z.object({
|
|
50
53
|
name: FieldName,
|
|
51
|
-
type:
|
|
54
|
+
type: metafield_types_1.FieldTypeSchema,
|
|
55
|
+
access: FieldAccess.optional(),
|
|
52
56
|
});
|
|
53
57
|
// A bound on the work one request can ask for, separate from how many definitions
|
|
54
58
|
// a site may hold in total. Every definition in a batch costs several queries
|
|
@@ -71,15 +75,16 @@ const ReorderInput = zod_1.z
|
|
|
71
75
|
key: zod_1.z.string().min(1, { message: 'Every custom field in the order needs a key.' }),
|
|
72
76
|
}))
|
|
73
77
|
.min(1, { message: 'The order must name every custom field.' });
|
|
74
|
-
// Name and
|
|
75
|
-
// rules can reject a change loudly; they are never persisted.
|
|
78
|
+
// Name, status and access are mutable. `key` and `type` are accepted so the
|
|
79
|
+
// immutability rules can reject a change loudly; they are never persisted.
|
|
76
80
|
const EditFieldInput = zod_1.z.object({
|
|
77
81
|
name: FieldName.optional(),
|
|
78
82
|
status: schema_1.FieldStatusSchema.optional(),
|
|
83
|
+
access: FieldAccess.optional(),
|
|
79
84
|
key: zod_1.z.string().optional(),
|
|
80
|
-
type:
|
|
85
|
+
type: metafield_types_1.FieldTypeSchema.optional(),
|
|
81
86
|
});
|
|
82
|
-
class
|
|
87
|
+
class MetafieldDefinitionsService {
|
|
83
88
|
knex;
|
|
84
89
|
recordAction;
|
|
85
90
|
getMaxDefinitions;
|
|
@@ -93,8 +98,8 @@ class CustomFieldDefinitionsService {
|
|
|
93
98
|
// restart. Where the number comes from is the caller's business.
|
|
94
99
|
this.getMaxDefinitions = getMaxDefinitions;
|
|
95
100
|
}
|
|
96
|
-
async
|
|
97
|
-
const [field] = await this.list((0, queries_1.
|
|
101
|
+
async hasAnyReadable(audience) {
|
|
102
|
+
const [field] = await this.list((0, queries_1.definitions)(this.knex, { audience, status: queries_1.ACTIVE_ONLY, limit: 1 }));
|
|
98
103
|
return Boolean(field);
|
|
99
104
|
}
|
|
100
105
|
/**
|
|
@@ -104,42 +109,35 @@ class CustomFieldDefinitionsService {
|
|
|
104
109
|
isStored(namespace) {
|
|
105
110
|
return namespace === identity_1.CUSTOM_NAMESPACE;
|
|
106
111
|
}
|
|
107
|
-
|
|
108
|
-
if (!this.isStored(namespace)) {
|
|
109
|
-
throw new errors_1.default.ValidationError({
|
|
110
|
-
message: `Fields cannot be defined in the "${namespace}" namespace.`,
|
|
111
|
-
property: 'namespace',
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
async browse(options = {}) {
|
|
112
|
+
async browse(options, audience) {
|
|
116
113
|
if (options.namespace !== undefined && !this.isStored(options.namespace)) {
|
|
117
114
|
return [];
|
|
118
115
|
}
|
|
119
|
-
// Archived fields are hidden by default: most surfaces (member details, the
|
|
120
|
-
// filter picker, the importer) only ever want active fields. A caller-
|
|
121
|
-
// supplied `filter` can widen that — Settings pulls active and archived
|
|
122
|
-
// together in one request (`filter=status:[active,archived]`).
|
|
123
|
-
//
|
|
124
116
|
// Whichever set comes back, it comes back in the publisher's order: filtering
|
|
125
117
|
// narrows the list, it never reorders it.
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
118
|
+
const { filter } = options;
|
|
119
|
+
if (filter) {
|
|
120
|
+
// A filter naming `status` decides the statuses itself, which is how Settings
|
|
121
|
+
// pulls active and archived together in one request
|
|
122
|
+
// (`filter=status:[active,archived]`). One that does not gets the same active-only
|
|
123
|
+
// scope as an unfiltered read.
|
|
124
|
+
const parsed = parseFilter(filter);
|
|
125
|
+
return this.list((0, queries_1.definitions)(this.knex, {
|
|
126
|
+
audience,
|
|
127
|
+
status: filterReferencesStatus(parsed) ? queries_1.ANY_STATUS : queries_1.ACTIVE_ONLY,
|
|
128
|
+
filter: (query) => knexify(query, parsed, { tableName: TABLE }),
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
return this.list((0, queries_1.definitions)(this.knex, { audience, status: queries_1.ACTIVE_ONLY }));
|
|
130
132
|
}
|
|
131
|
-
/**
|
|
132
|
-
* Decode a definition query into the domain, in the publisher's order.
|
|
133
|
-
*
|
|
134
|
-
* Typed off `activeFields` so the builder keeps the table's row type: every caller
|
|
135
|
-
* hands over a query against the definitions table, whatever it has narrowed.
|
|
136
|
-
*/
|
|
137
133
|
async list(query) {
|
|
138
134
|
const rows = await (0, queries_1.inFieldOrder)(query).select('*');
|
|
139
|
-
return rows.map((row) => zod_1.z.decode(codec_1.
|
|
135
|
+
return rows.map((row) => zod_1.z.decode(codec_1.metafieldCodec, row));
|
|
140
136
|
}
|
|
141
|
-
async read(namespace, key) {
|
|
142
|
-
const [field] = this.isStored(namespace)
|
|
137
|
+
async read(namespace, key, audience) {
|
|
138
|
+
const [field] = this.isStored(namespace)
|
|
139
|
+
? await this.list((0, queries_1.definitions)(this.knex, { audience, status: queries_1.ANY_STATUS, key }))
|
|
140
|
+
: [];
|
|
143
141
|
if (!field) {
|
|
144
142
|
throw new errors_1.default.NotFoundError({ message: 'Custom field not found.' });
|
|
145
143
|
}
|
|
@@ -156,7 +154,7 @@ class CustomFieldDefinitionsService {
|
|
|
156
154
|
* key get distinct ones, exactly as if they had arrived as separate requests.
|
|
157
155
|
*/
|
|
158
156
|
async add(context, namespace, input) {
|
|
159
|
-
|
|
157
|
+
(0, namespaces_1.assertDefinable)(namespace);
|
|
160
158
|
const requestedCount = Array.isArray(input) ? input.length : 0;
|
|
161
159
|
const parsed = AddFieldsInput.safeParse(input);
|
|
162
160
|
if (!parsed.success) {
|
|
@@ -197,6 +195,7 @@ class CustomFieldDefinitionsService {
|
|
|
197
195
|
key,
|
|
198
196
|
name: field.name,
|
|
199
197
|
type: field.type,
|
|
198
|
+
memberAccess: field.access?.member ?? access_1.MEMBER_ACCESS.none,
|
|
200
199
|
sortOrder: firstSortOrder + index,
|
|
201
200
|
});
|
|
202
201
|
keys.push(key);
|
|
@@ -242,6 +241,7 @@ class CustomFieldDefinitionsService {
|
|
|
242
241
|
key: wanted.key,
|
|
243
242
|
name: wanted.name,
|
|
244
243
|
type: wanted.type,
|
|
244
|
+
memberAccess: wanted.access.member,
|
|
245
245
|
sortOrder: await this.nextSortOrder(db),
|
|
246
246
|
});
|
|
247
247
|
const [created] = await this.readMany(db, [wanted.key]);
|
|
@@ -269,6 +269,7 @@ class CustomFieldDefinitionsService {
|
|
|
269
269
|
key: field.key,
|
|
270
270
|
name: field.name,
|
|
271
271
|
type: field.type,
|
|
272
|
+
member_access: field.memberAccess,
|
|
272
273
|
sort_order: field.sortOrder,
|
|
273
274
|
created_at: new Date(),
|
|
274
275
|
});
|
|
@@ -276,7 +277,7 @@ class CustomFieldDefinitionsService {
|
|
|
276
277
|
/** `read` for a caller that is deciding rather than serving: absent is an answer. */
|
|
277
278
|
async findByKey(key, { executor = this.knex } = {}) {
|
|
278
279
|
const row = await executor(TABLE).where('key', key).first();
|
|
279
|
-
return row ? zod_1.z.decode(codec_1.
|
|
280
|
+
return row ? zod_1.z.decode(codec_1.metafieldCodec, row) : null;
|
|
280
281
|
}
|
|
281
282
|
/** The same entry `add` writes. Only the caller knows its transaction committed. */
|
|
282
283
|
async recordCreated(context, fields) {
|
|
@@ -335,7 +336,7 @@ class CustomFieldDefinitionsService {
|
|
|
335
336
|
* Returns every definition, archived included, matching what the request named.
|
|
336
337
|
*/
|
|
337
338
|
async reorder(context, namespace, input) {
|
|
338
|
-
|
|
339
|
+
(0, namespaces_1.assertDefinable)(namespace);
|
|
339
340
|
const parsed = ReorderInput.safeParse(input);
|
|
340
341
|
if (!parsed.success) {
|
|
341
342
|
const issue = parsed.error.issues[0];
|
|
@@ -357,7 +358,8 @@ class CustomFieldDefinitionsService {
|
|
|
357
358
|
.where('key', key)
|
|
358
359
|
.update({ sort_order: ranks.get(key) });
|
|
359
360
|
}
|
|
360
|
-
|
|
361
|
+
// An order covers the whole list, archived definitions included.
|
|
362
|
+
return this.list((0, queries_1.definitions)(trx, { audience: access_1.ADMIN, status: queries_1.ANY_STATUS }));
|
|
361
363
|
});
|
|
362
364
|
await this.recordAction({
|
|
363
365
|
context,
|
|
@@ -399,7 +401,7 @@ class CustomFieldDefinitionsService {
|
|
|
399
401
|
async readMany(db, keys) {
|
|
400
402
|
const rows = await db(TABLE).whereIn('key', keys).select('*');
|
|
401
403
|
const byKey = new Map(rows.map((row) => [row.key, row]));
|
|
402
|
-
return keys.map((key) => zod_1.z.decode(codec_1.
|
|
404
|
+
return keys.map((key) => zod_1.z.decode(codec_1.metafieldCodec, byKey.get(key)));
|
|
403
405
|
}
|
|
404
406
|
/**
|
|
405
407
|
* Pick a free key from the name's base: `base`, then `base_2`, `base_3`, ...
|
|
@@ -466,7 +468,7 @@ class CustomFieldDefinitionsService {
|
|
|
466
468
|
});
|
|
467
469
|
}
|
|
468
470
|
const patch = parsed.data;
|
|
469
|
-
const existing = await this.read(identity_1.CUSTOM_NAMESPACE, key);
|
|
471
|
+
const existing = await this.read(identity_1.CUSTOM_NAMESPACE, key, access_1.ADMIN);
|
|
470
472
|
// Key and type are immutable after creation: values are addressed by key
|
|
471
473
|
// and interpreted by type, so changing either would silently orphan or
|
|
472
474
|
// corrupt stored values. Reject a differing value rather than ignore it.
|
|
@@ -506,6 +508,22 @@ class CustomFieldDefinitionsService {
|
|
|
506
508
|
details: { primary_name: patch.name, key, previous_name: existing.name },
|
|
507
509
|
});
|
|
508
510
|
}
|
|
511
|
+
if (patch.access !== undefined && patch.access.member !== existing.access.member) {
|
|
512
|
+
await this.knex(TABLE)
|
|
513
|
+
.where('key', key)
|
|
514
|
+
.update({ member_access: patch.access.member, updated_at: new Date() });
|
|
515
|
+
await this.recordAction({
|
|
516
|
+
context,
|
|
517
|
+
verb: 'changeAccess',
|
|
518
|
+
subject: existing.id,
|
|
519
|
+
details: {
|
|
520
|
+
primary_name: patch.name ?? existing.name,
|
|
521
|
+
key,
|
|
522
|
+
member_access: patch.access.member,
|
|
523
|
+
previous_member_access: existing.access.member,
|
|
524
|
+
},
|
|
525
|
+
});
|
|
526
|
+
}
|
|
509
527
|
// A status change is the archive/restore transition. Only write (and log)
|
|
510
528
|
// when it actually flips, so re-sending the current status is a no-op.
|
|
511
529
|
if (patch.status !== undefined && patch.status !== existing.status) {
|
|
@@ -520,7 +538,7 @@ class CustomFieldDefinitionsService {
|
|
|
520
538
|
details: { primary_name: patch.name ?? existing.name, key },
|
|
521
539
|
});
|
|
522
540
|
}
|
|
523
|
-
return this.read(identity_1.CUSTOM_NAMESPACE, key);
|
|
541
|
+
return this.read(identity_1.CUSTOM_NAMESPACE, key, access_1.ADMIN);
|
|
524
542
|
}
|
|
525
543
|
/**
|
|
526
544
|
* Permanently delete a field and every member value attached to it (the FK
|
|
@@ -551,7 +569,7 @@ class CustomFieldDefinitionsService {
|
|
|
551
569
|
});
|
|
552
570
|
}
|
|
553
571
|
}
|
|
554
|
-
exports.
|
|
572
|
+
exports.MetafieldDefinitionsService = MetafieldDefinitionsService;
|
|
555
573
|
/**
|
|
556
574
|
* The shape a stated key has to have. Minting derives one that is usable by
|
|
557
575
|
* construction, so this is the check that path never needed: a caller stating its own
|
|
@@ -603,12 +621,11 @@ function isUniqueConstraintViolation(error) {
|
|
|
603
621
|
const code = error?.code;
|
|
604
622
|
return code === 'ER_DUP_ENTRY' || code === 'SQLITE_CONSTRAINT';
|
|
605
623
|
}
|
|
606
|
-
//
|
|
607
|
-
//
|
|
608
|
-
// the
|
|
609
|
-
//
|
|
610
|
-
|
|
611
|
-
function applyFilter(query, filter) {
|
|
624
|
+
// Parse a caller-supplied NQL filter, without applying it. A malformed filter is a
|
|
625
|
+
// client error (400), not a 500. Whether the result widens the statuses is decided by
|
|
626
|
+
// the caller, which reads it with `filterReferencesStatus` and says so when building
|
|
627
|
+
// the query; nothing here narrows anything.
|
|
628
|
+
function parseFilter(filter) {
|
|
612
629
|
let mongoQuery;
|
|
613
630
|
try {
|
|
614
631
|
mongoQuery = nql(filter).toJSON();
|
|
@@ -629,20 +646,7 @@ function applyFilter(query, filter) {
|
|
|
629
646
|
property: 'filter',
|
|
630
647
|
});
|
|
631
648
|
}
|
|
632
|
-
|
|
633
|
-
knexify(query, mongoQuery, { tableName: TABLE });
|
|
634
|
-
}
|
|
635
|
-
catch (err) {
|
|
636
|
-
throw new errors_1.default.BadRequestError({
|
|
637
|
-
message: 'Could not parse the filter parameter.',
|
|
638
|
-
property: 'filter',
|
|
639
|
-
err: err,
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
|
-
if (!filterReferencesStatus(mongoQuery)) {
|
|
643
|
-
query.where('status', schema_1.FIELD_STATUS.active);
|
|
644
|
-
}
|
|
645
|
-
return query;
|
|
649
|
+
return mongoQuery;
|
|
646
650
|
}
|
|
647
651
|
// Whether an NQL-parsed filter constrains `status` anywhere, including inside the
|
|
648
652
|
// $and/$or/$nor combinators — so a status filter at any nesting counts as the
|
|
@@ -3,8 +3,8 @@ 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.
|
|
7
|
-
exports.
|
|
6
|
+
exports.METAFIELDS_RELATION = void 0;
|
|
7
|
+
exports.createMetafieldsFilterTransformer = createMetafieldsFilterTransformer;
|
|
8
8
|
// Translates the metafield clauses of a members filter into a query over the
|
|
9
9
|
// values table. A metafield is a publisher-defined field on a member; it is
|
|
10
10
|
// addressed as `namespace.key`, and a composite value such as an address names
|
|
@@ -15,13 +15,13 @@ exports.createCustomFieldsFilterTransformer = createCustomFieldsFilterTransforme
|
|
|
15
15
|
// metafields.key:'custom.company' // has a value
|
|
16
16
|
// metafields.key:-'custom.shipping_address.country' // that part is not set
|
|
17
17
|
//
|
|
18
|
-
// The values table holds one row per stored value: `
|
|
18
|
+
// The values table holds one row per stored value: `metafield_key`, `path`
|
|
19
19
|
// (empty for a plain field, the part's name for one part of a composite) and
|
|
20
20
|
// `value_text`. A filter addresses those columns directly, so each one becomes a
|
|
21
21
|
// single $elemMatch over them — positive asserts a matching row exists, $not
|
|
22
22
|
// asserts none does — with no lookup against the field definitions.
|
|
23
23
|
const errors_1 = __importDefault(require("@tryghost/errors"));
|
|
24
|
-
const identity_1 = require("@tryghost/
|
|
24
|
+
const identity_1 = require("@tryghost/metafield-types/identity");
|
|
25
25
|
const RELATION = 'metafields';
|
|
26
26
|
const PREFIX = `${RELATION}.`;
|
|
27
27
|
const KEY_ATTRIBUTE = `${PREFIX}key`;
|
|
@@ -78,11 +78,11 @@ function parseLeafAddress(raw) {
|
|
|
78
78
|
}
|
|
79
79
|
return { key: identity.key, path: identity.partPath };
|
|
80
80
|
}
|
|
81
|
-
function
|
|
81
|
+
function createMetafieldsFilterTransformer() {
|
|
82
82
|
// One (maybe-negated) $elemMatch over the leaf columns: positive is "a leaf pinned
|
|
83
83
|
// by these matches", `$not` is "no leaf does".
|
|
84
84
|
function buildElemMatch(target, value, negate) {
|
|
85
|
-
const match = {
|
|
85
|
+
const match = { metafield_key: target.key };
|
|
86
86
|
if (value !== undefined) {
|
|
87
87
|
match.path = target.path ?? ROOT_PATH;
|
|
88
88
|
match.value_text = value;
|
|
@@ -167,14 +167,14 @@ function createCustomFieldsFilterTransformer() {
|
|
|
167
167
|
return (query) => transform(query);
|
|
168
168
|
}
|
|
169
169
|
/**
|
|
170
|
-
* The Member filter relation that exposes
|
|
170
|
+
* The Member filter relation that exposes metafield values. A member has many leaf
|
|
171
171
|
* rows (one per field, or per part of a composite field), and a predicate asks whether
|
|
172
172
|
* one of them matches, so this joins the values table on member_id and mongo-knex emits
|
|
173
173
|
* it as a correlated `members.id IN (…)` subquery — composing with every other member
|
|
174
174
|
* filter.
|
|
175
175
|
*/
|
|
176
|
-
exports.
|
|
177
|
-
tableName: '
|
|
176
|
+
exports.METAFIELDS_RELATION = {
|
|
177
|
+
tableName: 'members_metafield_values',
|
|
178
178
|
tableNameAs: RELATION,
|
|
179
179
|
type: 'oneToOne',
|
|
180
180
|
joinFrom: 'member_id',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.bindings = exports.values = exports.definitions = exports.actingContext = void 0;
|
|
3
|
+
exports.bindings = exports.values = exports.definitions = exports.canWrite = exports.MEMBER_ACCESS = exports.MEMBERS = exports.INTERNAL = exports.ADMIN = exports.actingContext = void 0;
|
|
4
4
|
exports.init = init;
|
|
5
5
|
const definitions_service_1 = require("./definitions-service");
|
|
6
6
|
const values_service_1 = require("./values-service");
|
|
@@ -9,6 +9,15 @@ const actions_1 = require("./actions");
|
|
|
9
9
|
const config_1 = require("./config");
|
|
10
10
|
var actions_2 = require("./actions");
|
|
11
11
|
Object.defineProperty(exports, "actingContext", { enumerable: true, get: function () { return actions_2.actingContext; } });
|
|
12
|
+
// Which door a request came through, which is what decides how much of a member's
|
|
13
|
+
// answers it may see or change. Required wherever that is asked, so a new caller
|
|
14
|
+
// has to name itself rather than inherit an answer by default.
|
|
15
|
+
var access_1 = require("./access");
|
|
16
|
+
Object.defineProperty(exports, "ADMIN", { enumerable: true, get: function () { return access_1.ADMIN; } });
|
|
17
|
+
Object.defineProperty(exports, "INTERNAL", { enumerable: true, get: function () { return access_1.INTERNAL; } });
|
|
18
|
+
Object.defineProperty(exports, "MEMBERS", { enumerable: true, get: function () { return access_1.MEMBERS; } });
|
|
19
|
+
Object.defineProperty(exports, "MEMBER_ACCESS", { enumerable: true, get: function () { return access_1.MEMBER_ACCESS; } });
|
|
20
|
+
Object.defineProperty(exports, "canWrite", { enumerable: true, get: function () { return access_1.canWrite; } });
|
|
12
21
|
function init() {
|
|
13
22
|
// The three are constructed together below, so checking all of them keeps the "all or
|
|
14
23
|
// none" invariant explicit rather than trusting one to stand in for the rest.
|
|
@@ -17,25 +26,25 @@ function init() {
|
|
|
17
26
|
}
|
|
18
27
|
const { knex } = require('../../data/db');
|
|
19
28
|
const models = require('../../models');
|
|
20
|
-
const recordAction = ({ context, verb, subject, details }) => (0, actions_1.
|
|
29
|
+
const recordAction = ({ context, verb, subject, details }) => (0, actions_1.recordMetafieldAction)({ Action: models.Action, context, verb, subject, details });
|
|
21
30
|
// Resolved here, not in the service: reading config is this module's job, and
|
|
22
31
|
// the service is handed a number. A getter rather than a value because the
|
|
23
32
|
// ceiling is an operator setting that can change between requests, and a Ghost
|
|
24
33
|
// container holds no state across them.
|
|
25
34
|
const config = require('../../../shared/config');
|
|
26
|
-
exports.definitions = new definitions_service_1.
|
|
35
|
+
exports.definitions = new definitions_service_1.MetafieldDefinitionsService({
|
|
27
36
|
knex,
|
|
28
37
|
recordAction,
|
|
29
|
-
getMaxDefinitions: () => (0, config_1.resolveMaxDefinitions)(config.get('members:
|
|
38
|
+
getMaxDefinitions: () => (0, config_1.resolveMaxDefinitions)(config.get('members:metafields:maxDefinitions')),
|
|
30
39
|
});
|
|
31
40
|
// The values service reads the field definitions straight from the table, so
|
|
32
41
|
// it needs knex and the same ceiling — no handle on the definitions service.
|
|
33
|
-
exports.values = new values_service_1.
|
|
42
|
+
exports.values = new values_service_1.MetafieldValuesService({
|
|
34
43
|
knex,
|
|
35
|
-
getMaxDefinitions: () => (0, config_1.resolveMaxDefinitions)(config.get('members:
|
|
44
|
+
getMaxDefinitions: () => (0, config_1.resolveMaxDefinitions)(config.get('members:metafields:maxDefinitions')),
|
|
36
45
|
});
|
|
37
46
|
// Built after the values, which is what a binding routes into. It has no handle on the
|
|
38
47
|
// definitions: making a field is not part of binding to one, so a caller that needs both
|
|
39
48
|
// asks for both.
|
|
40
|
-
exports.bindings = new bindings_service_1.
|
|
49
|
+
exports.bindings = new bindings_service_1.MetafieldBindingsService({ knex, values: exports.values });
|
|
41
50
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.KEY_CHARACTERS = void 0;
|
|
4
4
|
exports.mintableKey = mintableKey;
|
|
5
|
-
const identity_1 = require("@tryghost/
|
|
5
|
+
const identity_1 = require("@tryghost/metafield-types/identity");
|
|
6
6
|
// Neither package ships types.
|
|
7
7
|
const { stripInvisibleChars } = require('@tryghost/string');
|
|
8
8
|
const unidecode = require('unidecode');
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.Metafield = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
-
const
|
|
5
|
+
const metafield_types_1 = require("@tryghost/metafield-types");
|
|
6
|
+
const access_1 = require("./access");
|
|
6
7
|
const schema_1 = require("./schema");
|
|
7
|
-
exports.
|
|
8
|
+
exports.Metafield = zod_1.z.object({
|
|
8
9
|
id: zod_1.z.string(),
|
|
9
10
|
namespace: zod_1.z.string(),
|
|
10
11
|
key: zod_1.z.string(),
|
|
11
12
|
name: zod_1.z.string(),
|
|
12
|
-
type:
|
|
13
|
+
type: metafield_types_1.FieldTypeSchema,
|
|
13
14
|
status: schema_1.FieldStatusSchema,
|
|
15
|
+
access: zod_1.z.object({ member: access_1.MemberAccessSchema }),
|
|
14
16
|
createdAt: zod_1.z.date(),
|
|
15
17
|
updatedAt: zod_1.z.date().nullable(),
|
|
16
18
|
});
|
|
@@ -0,0 +1,34 @@
|
|
|
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.definableByPublisher = definableByPublisher;
|
|
7
|
+
exports.assertDefinable = assertDefinable;
|
|
8
|
+
const errors_1 = __importDefault(require("@tryghost/errors"));
|
|
9
|
+
const identity_1 = require("@tryghost/metafield-types/identity");
|
|
10
|
+
/**
|
|
11
|
+
* Who may define fields in a namespace.
|
|
12
|
+
*
|
|
13
|
+
* This is a property of the namespace, not of whoever is asking, so it is settled before
|
|
14
|
+
* any question about the caller. Asking the caller first gets the order wrong in a way
|
|
15
|
+
* that shows: a request to define a field in a namespace nobody owns would be refused for
|
|
16
|
+
* want of a permission, telling the caller to go and get one, when no permission would
|
|
17
|
+
* have helped.
|
|
18
|
+
*
|
|
19
|
+
* The publisher owns `custom` and nothing owns anything else yet. An app owning its own
|
|
20
|
+
* namespace resolves here too, and will not resolve to a permission at all: the caller
|
|
21
|
+
* has to *be* that app rather than hold a role, which is why the staff permission stays
|
|
22
|
+
* named after the publisher's fields rather than after metafields at large.
|
|
23
|
+
*/
|
|
24
|
+
function definableByPublisher(namespace) {
|
|
25
|
+
return namespace === identity_1.CUSTOM_NAMESPACE;
|
|
26
|
+
}
|
|
27
|
+
function assertDefinable(namespace) {
|
|
28
|
+
if (!definableByPublisher(namespace)) {
|
|
29
|
+
throw new errors_1.default.ValidationError({
|
|
30
|
+
message: `Fields cannot be defined in the "${namespace}" namespace.`,
|
|
31
|
+
property: 'namespace',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ANY_STATUS = exports.ACTIVE_ONLY = void 0;
|
|
4
|
+
exports.readableBy = readableBy;
|
|
5
|
+
exports.definitions = definitions;
|
|
6
|
+
exports.inFieldOrder = inFieldOrder;
|
|
7
|
+
const access_1 = require("./access");
|
|
8
|
+
const schema_1 = require("./schema");
|
|
9
|
+
const FIELDS_TABLE = 'members_metafields';
|
|
10
|
+
// Nothing in the database keeps an archived or hidden field out of a read: no
|
|
11
|
+
// constraint stops a value row referencing one. Both filters are therefore applied in
|
|
12
|
+
// code, and a query that forgets either is a silent bug.
|
|
13
|
+
function readableBy(query, audience) {
|
|
14
|
+
query.whereIn(`${FIELDS_TABLE}.member_access`, (0, access_1.readableLevels)(audience));
|
|
15
|
+
return query;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Whether a read includes definitions the publisher has archived.
|
|
19
|
+
*
|
|
20
|
+
* A member is never offered an archived field. Staff managing the list are always
|
|
21
|
+
* shown one, since an archived field is still theirs to rename, restore or delete.
|
|
22
|
+
*/
|
|
23
|
+
exports.ACTIVE_ONLY = 'active-only';
|
|
24
|
+
exports.ANY_STATUS = 'any-status';
|
|
25
|
+
// Unannotated so the builder keeps the row type knex derives from the table
|
|
26
|
+
// registration; naming a type here would both lose that and make the alias below
|
|
27
|
+
// refer to itself.
|
|
28
|
+
function metafieldsTable(db) {
|
|
29
|
+
return db(FIELDS_TABLE);
|
|
30
|
+
}
|
|
31
|
+
function definitions(db, scope) {
|
|
32
|
+
let query = metafieldsTable(db);
|
|
33
|
+
if (scope.filter) {
|
|
34
|
+
query = scope.filter(query);
|
|
35
|
+
}
|
|
36
|
+
if (scope.key !== undefined) {
|
|
37
|
+
query = query.where(`${FIELDS_TABLE}.key`, scope.key);
|
|
38
|
+
}
|
|
39
|
+
if (scope.status === exports.ACTIVE_ONLY) {
|
|
40
|
+
query = query.where(`${FIELDS_TABLE}.status`, schema_1.FIELD_STATUS.active);
|
|
41
|
+
}
|
|
42
|
+
if (scope.limit !== undefined) {
|
|
43
|
+
query = query.limit(scope.limit);
|
|
44
|
+
}
|
|
45
|
+
return readableBy(query, scope.audience);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The publisher's order, applied to every read of the list. Here for the same reason the
|
|
49
|
+
* status filter is: a read that forgets it comes back in whatever order the engine chose.
|
|
50
|
+
*
|
|
51
|
+
* `created_at` orders a site that has never reordered, where every row still holds the
|
|
52
|
+
* default rank; `id` settles the rest so the order is total.
|
|
53
|
+
*/
|
|
54
|
+
function inFieldOrder(query) {
|
|
55
|
+
query
|
|
56
|
+
.orderBy(`${FIELDS_TABLE}.sort_order`, 'asc')
|
|
57
|
+
.orderBy(`${FIELDS_TABLE}.created_at`, 'asc')
|
|
58
|
+
.orderBy(`${FIELDS_TABLE}.id`, 'asc');
|
|
59
|
+
return query;
|
|
60
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DbBoundField = exports.
|
|
3
|
+
exports.DbBoundField = exports.DbMetafieldBinding = exports.DbMetafieldLeaf = exports.DbMetafieldValue = exports.WrittenBy = exports.DbMetafield = exports.FieldStatusSchema = exports.FIELD_STATUS = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
-
const
|
|
5
|
+
const metafield_types_1 = require("@tryghost/metafield-types");
|
|
6
6
|
const date_1 = require("../../lib/db-types/date");
|
|
7
|
+
const access_1 = require("./access");
|
|
7
8
|
// `archived` is soft: the field drops out of the values path but stays in the definition
|
|
8
9
|
// list so it can be renamed, restored or deleted. Mirrors schema.js's `isIn` on the
|
|
9
10
|
// column, which is static config and cannot import this.
|
|
@@ -11,19 +12,20 @@ exports.FIELD_STATUS = { active: 'active', archived: 'archived' };
|
|
|
11
12
|
exports.FieldStatusSchema = zod_1.z.enum([exports.FIELD_STATUS.active, exports.FIELD_STATUS.archived]);
|
|
12
13
|
// The single source for the read projection and the knex table type below. `type` parses
|
|
13
14
|
// as the field-type enum, so the row carries the narrow type and no codec needs a cast.
|
|
14
|
-
exports.
|
|
15
|
+
exports.DbMetafield = zod_1.z.object({
|
|
15
16
|
id: zod_1.z.string(),
|
|
16
17
|
key: zod_1.z.string(),
|
|
17
18
|
name: zod_1.z.string(),
|
|
18
|
-
type:
|
|
19
|
+
type: metafield_types_1.FieldTypeSchema,
|
|
19
20
|
status: exports.FieldStatusSchema,
|
|
21
|
+
member_access: access_1.MemberAccessSchema,
|
|
20
22
|
created_at: date_1.DbDate,
|
|
21
23
|
updated_at: date_1.DbDate.nullable(),
|
|
22
24
|
});
|
|
23
25
|
/**
|
|
24
26
|
* How a value arrived, not who caused it: who edited a member's fields is already an
|
|
25
27
|
* action, and Stripe is not a person. `type` is the namespace that makes `id` resolvable —
|
|
26
|
-
* `users`, `integrations`, `
|
|
28
|
+
* `users`, `integrations`, `members_metafield_bindings` — so the one writer that
|
|
27
29
|
* resolves in no table is the one with no id to give.
|
|
28
30
|
*/
|
|
29
31
|
exports.WrittenBy = zod_1.z.discriminatedUnion('type', [
|
|
@@ -31,12 +33,16 @@ exports.WrittenBy = zod_1.z.discriminatedUnion('type', [
|
|
|
31
33
|
zod_1.z.object({ type: zod_1.z.literal('integration'), id: zod_1.z.string() }),
|
|
32
34
|
zod_1.z.object({ type: zod_1.z.literal('binding'), id: zod_1.z.string() }),
|
|
33
35
|
zod_1.z.object({ type: zod_1.z.literal('import'), id: zod_1.z.null() }),
|
|
36
|
+
// A member writing their own answers. Resolvable in `members`, like the others,
|
|
37
|
+
// and the only writer whose changes leave nothing in the staff action log: that
|
|
38
|
+
// log records what staff did.
|
|
39
|
+
zod_1.z.object({ type: zod_1.z.literal('member'), id: zod_1.z.string() }),
|
|
34
40
|
]);
|
|
35
41
|
// One part of a member's value. What a `path` means is storage.ts's business, so the row
|
|
36
42
|
// carries it as a plain string.
|
|
37
|
-
exports.
|
|
43
|
+
exports.DbMetafieldValue = zod_1.z.object({
|
|
38
44
|
id: zod_1.z.string(),
|
|
39
|
-
|
|
45
|
+
metafield_key: zod_1.z.string(),
|
|
40
46
|
member_id: zod_1.z.string(),
|
|
41
47
|
path: zod_1.z.string(),
|
|
42
48
|
// Nullable like the column, though nothing here writes a null: a part with no value
|
|
@@ -55,18 +61,18 @@ exports.DbCustomFieldValue = zod_1.z.object({
|
|
|
55
61
|
// `type` takes no part in the assembly and is here as a gate: a value whose type has left
|
|
56
62
|
// the catalog is one the definitions list no longer returns either, so failing to parse
|
|
57
63
|
// is what drops it.
|
|
58
|
-
exports.
|
|
64
|
+
exports.DbMetafieldLeaf = zod_1.z.object({
|
|
59
65
|
member_id: zod_1.z.string(),
|
|
60
66
|
key: zod_1.z.string(),
|
|
61
|
-
type:
|
|
67
|
+
type: metafield_types_1.FieldTypeSchema,
|
|
62
68
|
path: zod_1.z.string(),
|
|
63
69
|
value_text: zod_1.z.string(),
|
|
64
70
|
});
|
|
65
|
-
exports.
|
|
71
|
+
exports.DbMetafieldBinding = zod_1.z.object({
|
|
66
72
|
id: zod_1.z.string(),
|
|
67
73
|
product_id: zod_1.z.string(),
|
|
68
74
|
port: zod_1.z.string(),
|
|
69
|
-
|
|
75
|
+
metafield_key: zod_1.z.string(),
|
|
70
76
|
created_at: date_1.DbDate,
|
|
71
77
|
updated_at: date_1.DbDate.nullable(),
|
|
72
78
|
});
|
|
@@ -74,5 +80,5 @@ exports.DbCustomFieldBinding = zod_1.z.object({
|
|
|
74
80
|
exports.DbBoundField = zod_1.z.object({
|
|
75
81
|
binding_id: zod_1.z.string(),
|
|
76
82
|
key: zod_1.z.string(),
|
|
77
|
-
type:
|
|
83
|
+
type: metafield_types_1.FieldTypeSchema,
|
|
78
84
|
});
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.toMetafieldsResponse = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const case_keys_1 = require("../../lib/case-keys");
|
|
6
6
|
const models_1 = require("./models");
|
|
7
|
-
const
|
|
7
|
+
const MetafieldResource = zod_1.z.object({
|
|
8
8
|
namespace: zod_1.z.string(),
|
|
9
9
|
key: zod_1.z.string(),
|
|
10
10
|
name: zod_1.z.string(),
|
|
11
11
|
type: zod_1.z.string(),
|
|
12
12
|
status: zod_1.z.string(),
|
|
13
|
+
access: zod_1.z.object({ member: zod_1.z.string() }),
|
|
13
14
|
created_at: zod_1.z.date(),
|
|
14
15
|
updated_at: zod_1.z.date().nullable(),
|
|
15
16
|
});
|
|
16
|
-
const
|
|
17
|
-
exports.
|
|
18
|
-
.array(models_1.
|
|
17
|
+
const MetafieldsResponse = zod_1.z.object({ members_metafields: zod_1.z.array(MetafieldResource) });
|
|
18
|
+
exports.toMetafieldsResponse = zod_1.z
|
|
19
|
+
.array(models_1.Metafield)
|
|
19
20
|
.transform((fields) => ({
|
|
20
21
|
members_metafields: fields.map((field) => (0, case_keys_1.snakeKeys)(field)),
|
|
21
22
|
}))
|
|
22
|
-
.pipe(
|
|
23
|
+
.pipe(MetafieldsResponse);
|