ghost 6.63.0 → 6.65.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/create-migration.js +15 -0
- package/bin/lib/duplicate-deps.js +204 -0
- package/bin/validate-adapters.js +50 -6
- package/components/tryghost-adapter-base-scheduling-0.2.4.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-i18n-0.0.0.tgz +0 -0
- package/components/{tryghost-kg-default-cards-10.3.5.tgz → 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-html-to-lexical-1.4.0.tgz +0 -0
- package/components/{tryghost-kg-lexical-html-renderer-1.5.0.tgz → tryghost-kg-lexical-html-renderer-1.5.1.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/casper/assets/built/casper.js +1 -1
- package/content/themes/casper/assets/built/screen.css +1 -1
- package/content/themes/casper/assets/css/screen.css +15 -2
- package/content/themes/casper/assets/js/init.js +37 -9
- package/content/themes/casper/package.json +8 -8
- package/content/themes/source/assets/built/screen.css +1 -1
- package/content/themes/source/assets/built/source.js +1 -1
- package/content/themes/source/assets/css/screen.css +15 -2
- package/content/themes/source/assets/js/main.js +24 -4
- package/content/themes/source/package.json +8 -8
- package/core/boot.js +27 -15
- package/core/bridge.js +1 -1
- package/core/built/admin/assets/Combination-DQ6f9A5P.js +41 -0
- package/core/built/admin/assets/{PolarAngleAxis-pkMyqz8g.js → PolarAngleAxis-BBaU7PRV.js} +2 -2
- package/core/built/admin/assets/RadialBarChart-Bp20JPnA.js +1 -0
- package/core/built/admin/assets/about-Dp43j18M.js +1 -0
- package/core/built/admin/assets/accordion-h62UzFhj.js +1 -0
- package/core/built/admin/assets/account-migration-CBTbtX6Q.js +1 -0
- package/core/built/admin/assets/action-list-DC9QpX-l.js +1 -0
- package/core/built/admin/assets/activitypub/{account-migration-KA6Jjf9L.js → account-migration-B1DUZS4Q.js} +8 -8
- package/core/built/admin/assets/activitypub/activitypub.js +24 -11
- package/core/built/admin/assets/activitypub/avatar-CRGud8yf.js +153 -0
- package/core/built/admin/assets/activitypub/{avatar-flipboard-csQaNeYK.js → avatar-flipboard-BZNFAXfm.js} +3 -3
- package/core/built/admin/assets/activitypub/{bluesky-sharing-C7nTDMvw.js → bluesky-sharing-Cg_v-LwS.js} +30 -31
- package/core/built/admin/assets/activitypub/{chunk-KS7C4IRE-Ck3O4oo2.js → chunk-KS7C4IRE-CTUL98Lc.js} +2498 -1885
- package/core/built/admin/assets/activitypub/{content-formatters-CLcjaBwV.js → content-formatters-D7GWP7nH.js} +23 -24
- package/core/built/admin/assets/activitypub/{copy-DcOh8kXw.js → copy-CgzTvoeR.js} +2 -2
- package/core/built/admin/assets/activitypub/{domain-fZ-X8i4-.js → domain-C3G_nkHU.js} +46 -46
- package/core/built/admin/assets/activitypub/{edit-profile-BqMLQV88.js → edit-profile-C8cCY-AK.js} +927 -928
- package/core/built/admin/assets/activitypub/{explore-B4yPoP8E.js → explore-NlDT4inq.js} +11 -11
- package/core/built/admin/assets/activitypub/{feed-BRC_mvAe.js → feed-DF22jCTV.js} +10 -10
- package/core/built/admin/assets/activitypub/{field-COacNgOt.js → field-95-iuTte.js} +4 -4
- package/core/built/admin/assets/activitypub/{hash-C7u-irQQ.js → hash-R7LMLnhY.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-CbTTdDQ3.js → inbox-DUJUiV6x.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-BW-yvUoN.js → inbox-DerExBzA.js} +416 -414
- package/core/built/admin/assets/activitypub/{label-kPMmYI7l.js → label-EwCn1QYc.js} +4 -4
- package/core/built/admin/assets/activitypub/layout-Dy6NnW1G.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-CuidJzc0.js → moderation-BSkfiVYo.js} +73 -75
- package/core/built/admin/assets/activitypub/{note-CAMRRSqD.js → note-DOnAJTXK.js} +9 -9
- package/core/built/admin/assets/activitypub/{notifications-BmNlXGgp.js → notifications-DZc6XTjG.js} +27 -27
- package/core/built/admin/assets/activitypub/{onboarding-Dmun9jr_.js → onboarding-8vEIwYTH.js} +3 -3
- package/core/built/admin/assets/activitypub/{onboarding-Bqg7fh_L.js → onboarding-DYVqbNmp.js} +2 -2
- package/core/built/admin/assets/activitypub/{preferences--oH19wf9.js → preferences-DDok6F2N.js} +1418 -1390
- package/core/built/admin/assets/activitypub/{profile-DH_tQx2D.js → profile-DjVa2hUk.js} +254 -255
- package/core/built/admin/assets/activitypub/{reply-Cap9PxSH.js → reply-DtXBpHxu.js} +2 -2
- package/core/built/admin/assets/activitypub/routes-Cw302e1c.js +4946 -0
- package/core/built/admin/assets/activitypub/{separator-CAxxu8VV.js → separator-FpRpVDd3.js} +8 -9
- package/core/built/admin/assets/activitypub/settings-yK-puALn.js +314 -0
- package/core/built/admin/assets/activitypub/{site-BYps63oh.js → site-CHw0R2PA.js} +2 -2
- package/core/built/admin/assets/activitypub/{step-1-CKjR2KAm.js → step-1-737bnvxk.js} +7 -7
- package/core/built/admin/assets/activitypub/{step-2-B6PKfOUQ.js → step-2-DBaIsAsM.js} +7 -7
- package/core/built/admin/assets/activitypub/{step-3-C-qBbcUo.js → step-3-BBmy9m9V.js} +23 -23
- package/core/built/admin/assets/activitypub/tabs-LQ2xirdm.js +1101 -0
- package/core/built/admin/assets/activitypub/{topic-filter-DsUOuu0k.js → topic-filter-75Nu0CKj.js} +4 -4
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CX9snsLs.js → use-activity-pub-queries-CYI2QJMs.js} +58 -58
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-DsJTGDSS.js → use-navigate-with-base-path-B4jZ8hyg.js} +3924 -1403
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-AJi9zkzm.js → use-reply-chain-data-BHmFxc3U.js} +6 -6
- package/core/built/admin/assets/activitypub/users-CSjOwpT9.js +886 -0
- package/core/built/admin/assets/activitypub/{x-DR8AT3-4.js → x-B9ptWCds.js} +2 -2
- package/core/built/admin/assets/add-integration-modal-BwePhq95.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-Zv0I7Msm.js +1 -0
- package/core/built/admin/assets/add-recommendation-modal-cdLv0wHy.js +1 -0
- package/core/built/admin/assets/analytics-DY8_SaP7.js +1 -0
- package/core/built/admin/assets/announcement-bar-modal-C-2yWwag.js +1 -0
- package/core/built/admin/assets/api-keys-BHKATUqQ.js +1 -0
- package/core/built/admin/assets/{api-keys-BGPzLHzA.js → api-keys-omLA6iYn.js} +1 -1
- package/core/built/admin/assets/{audience-ceV3XVHq.js → audience-wRcSN0jV.js} +1 -1
- package/core/built/admin/assets/automated-emails-CzUa3v4d.js +1 -0
- package/core/built/admin/assets/automations-DupSsSOr.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-CI1Z0xyG.js +1 -0
- package/core/built/admin/assets/bluesky-sharing-B8PC1SBj.js +1 -0
- package/core/built/admin/assets/box-LUuYRT-1.js +1 -0
- package/core/built/admin/assets/brand-icon-CrmbX86T.js +1 -0
- package/core/built/admin/assets/breadcrumb-DDDpzLyo.js +1 -0
- package/core/built/admin/assets/button-D414TI3B.js +1 -0
- package/core/built/admin/assets/calendar-Cp_opo3i.js +1 -0
- package/core/built/admin/assets/card-C2dfd5u0.js +1 -0
- package/core/built/admin/assets/chart-B_UNLXse.js +63 -0
- package/core/built/admin/assets/chart-helpers-Czu_9QpJ.js +1 -0
- package/core/built/admin/assets/checkbox-CFFqf0Nh.js +1 -0
- package/core/built/admin/assets/{chunk-KS7C4IRE-DCsL4i4D.js → chunk-KS7C4IRE-DhOcHQOU.js} +1 -1
- package/core/built/admin/assets/{chunk.254.035b85ec456ebbd7336b.js → chunk.201.6961b57ed7a281ac193e.js} +165 -122
- package/core/built/admin/assets/chunk.524.0b850e72ec49a0fa3882.js +25 -0
- package/core/built/admin/assets/chunk.582.db2ae9e968256e8d58ac.js +27 -0
- package/core/built/admin/assets/{chunk.901.4ccc639821020230bcca.js → chunk.972.4b8c97f93d66db15e751.js} +10625 -10088
- package/core/built/admin/assets/clean-tracked-url-dkN05vOf.js +1 -0
- package/core/built/admin/assets/code-editor-view-Bd_nnHKk.js +1 -0
- package/core/built/admin/assets/code-editor-view-BeU3Yf9M.js +1 -0
- package/core/built/admin/assets/color-picker-Bzm1V7qg.js +3 -0
- package/core/built/admin/assets/color-picker-field-DP0moHz9.js +1 -0
- package/core/built/admin/assets/combobox-6_ruuTuj.js +1 -0
- package/core/built/admin/assets/command-B5wfm6pd.js +1 -0
- package/core/built/admin/assets/comments-BB26dUSl.js +1 -0
- package/core/built/admin/assets/components-CwL6a6As-CCRaoCeP.js +1 -0
- package/core/built/admin/assets/{config-kSHvwdTG.js → config-BPljH6wF.js} +1 -1
- package/core/built/admin/assets/confirmation-context-znVJD4pX.js +1 -0
- package/core/built/admin/assets/container-CHHif8km.js +1 -0
- package/core/built/admin/assets/content-api-modal-DOHwl0yZ.js +1 -0
- package/core/built/admin/assets/context-menu-BpY46Dlb.js +1 -0
- package/core/built/admin/assets/copy-field-DRBx6Ady.js +1 -0
- package/core/built/admin/assets/create-ghost-browse-value-source-eIXo5Qws.js +1 -0
- package/core/built/admin/assets/{custom-field-type-option-BAuW0F-E.js → custom-field-type-option-DrSlETOI.js} +1 -1
- package/core/built/admin/assets/custom-integration-modal-Dgo425Ec.js +1 -0
- package/core/built/admin/assets/data-list-DM8yqpXi.js +1 -0
- package/core/built/admin/assets/date-range-select-DdC23c13.js +1 -0
- package/core/built/admin/assets/design-and-theme-modal-CbSu9IT4.js +2 -0
- package/core/built/admin/assets/detail-page-CN4NdhpV.js +1 -0
- package/core/built/admin/assets/dirty-confirm-dialog-BT_Vq9TD.js +1 -0
- package/core/built/admin/assets/disabled-sources-indicator-C5xtW0Q2.js +1 -0
- package/core/built/admin/assets/dist-B40T-RCQ.js +1 -0
- package/core/built/admin/assets/dist-BRQkNYN1.js +11 -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-Cm2qbZKL.js +1 -0
- package/core/built/admin/assets/dist-CrlaEoaK.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-nmRzULcD.js +1 -0
- package/core/built/admin/assets/domain-BPReCZa8.js +1 -0
- package/core/built/admin/assets/dropzone-B2auMkf2.js +5 -0
- package/core/built/admin/assets/edit-profile-B7XTBzKe.js +1 -0
- package/core/built/admin/assets/editor-BcaC9dqm.js +8 -0
- package/core/built/admin/assets/editor-screen-FuMpItC8.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-9d81o1C2.js +1 -0
- package/core/built/admin/assets/{emails-vFMk4yYl.js → emails-CgvIIz3q.js} +1 -1
- package/core/built/admin/assets/embed-signup-form-modal-CbVbMsxl.js +8 -0
- package/core/built/admin/assets/empty-indicator-CSQts7GV.js +1 -0
- package/core/built/admin/assets/esm--rhhUGIG.js +2 -0
- package/core/built/admin/assets/explore-DbSXFTJN.js +1 -0
- package/core/built/admin/assets/feature-flag-overrides-context-CrcQKm9Z.js +1 -0
- package/core/built/admin/assets/feature-image-placeholder-DFXA4vfJ.js +1 -0
- package/core/built/admin/assets/feed-W7RlF-Gp.js +1 -0
- package/core/built/admin/assets/feedback-BTPBQLT5.js +1 -0
- package/core/built/admin/assets/field-BXEh3ptU.js +1 -0
- package/core/built/admin/assets/filter-sources-DHK2IoCk.js +1 -0
- package/core/built/admin/assets/filters-0SYNTqyQ.js +1 -0
- package/core/built/admin/assets/filters-DTtZKQyq.js +1 -0
- package/core/built/admin/assets/first-promoter-modal-DcoN_OXu.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-b4e8a403baba61905cd7560e30b9732d.js → ghost-25495154132af7305cb7b646fd83f48f.js} +580 -523
- package/core/built/admin/assets/gift-link-modal-BX-Q1TOk.js +1 -0
- package/core/built/admin/assets/{gift-links-CfLSnst2.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-BEUIDQX7.js +1 -0
- package/core/built/admin/assets/growth-G6PLO4aF.js +1 -0
- package/core/built/admin/assets/growth-tkD-fBOY.js +3 -0
- package/core/built/admin/assets/heading-ih-fOVqF.js +1 -0
- package/core/built/admin/assets/history-modal-Ca-gStoq.js +1 -0
- package/core/built/admin/assets/hooks-DYfTEQLk.js +2 -0
- package/core/built/admin/assets/html-field-B3CrKV9Y.js +1 -0
- package/core/built/admin/assets/iframe-buffering-Bq1el-gw.js +1 -0
- package/core/built/admin/assets/images-H-BIm8OQ.js +1 -0
- package/core/built/admin/assets/{inbox-gJHG7_xd.js → inbox-DBbDVMPz.js} +35 -35
- package/core/built/admin/assets/index-DOF2jDq0.js +4 -0
- package/core/built/admin/assets/index-JrrNchW1.css +2 -0
- package/core/built/admin/assets/index.es-Ct5XQNSj.js +1 -0
- package/core/built/admin/assets/input-group-CvH-3d3F.js +1 -0
- package/core/built/admin/assets/input-surface-CL23Mlh8.js +1 -0
- package/core/built/admin/assets/integration-header-C7GXGis_.js +1 -0
- package/core/built/admin/assets/{integrations-B4kuRBFY.js → integrations-DnJrZnHv.js} +1 -1
- package/core/built/admin/assets/invite-user-modal-EJ2_6RpV.js +1 -0
- package/core/built/admin/assets/isPlainObject-BzzgUf1E.js +1 -0
- package/core/built/admin/assets/jsx-runtime-BlNNh7jY.js +1 -0
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +3 -3
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +1 -1
- package/core/built/admin/assets/{koenig-lexical-CGXb0F8o.js → koenig-lexical-Dkwee5FG.js} +1 -1
- package/core/built/admin/assets/koenig-loader-BzXCXHoA.js +2 -0
- package/core/built/admin/assets/kpi-card-iCDUTgOR.js +1 -0
- package/core/built/admin/assets/kpi-card-jTnpLKGr.js +1 -0
- package/core/built/admin/assets/kpi-helpers-Criu0YAf.js +1 -0
- package/core/built/admin/assets/kpi-tabs-DbOmmyOo.js +1 -0
- package/core/built/admin/assets/label-Du0yqMqL.js +1 -0
- package/core/built/admin/assets/label-picker-Bq1XXr1D.js +1 -0
- package/core/built/admin/assets/labels-0x2NfLtC.js +1 -0
- package/core/built/admin/assets/layout-Ckwzsnsu.js +1 -0
- package/core/built/admin/assets/lib-CCz2mjm8.js +2 -0
- package/core/built/admin/assets/link-helpers-o9GgBTni.js +1 -0
- package/core/built/admin/assets/links-Ctujreuh.js +1 -0
- package/core/built/admin/assets/list-page-CH_wnDC3.js +1 -0
- package/core/built/admin/assets/luxon-BXCsmep3.js +1 -0
- package/core/built/admin/assets/member-activity-CsAh6MxK.js +1 -0
- package/core/built/admin/assets/member-activity-feed-0ytsQbtY.js +1 -0
- package/core/built/admin/assets/member-custom-fields-CTFGnnYv.js +1 -0
- package/core/built/admin/assets/member-detail-QU3vB1ML.js +1 -0
- package/core/built/admin/assets/members-CtMVO_AB.js +4 -0
- package/core/built/admin/assets/modal-page-8Ipfl51B.js +1 -0
- package/core/built/admin/assets/moderation-B8VtA-W0.js +1 -0
- package/core/built/admin/assets/multi-select-combobox-_9wEYmGv.js +1 -0
- package/core/built/admin/assets/navigation-modal-CGcjJvkc.js +1 -0
- package/core/built/admin/assets/newsletter-BpHjjqmq.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-DzTbGOyo.js +1 -0
- package/core/built/admin/assets/newsletter-emails-BMKH4Osp.js +1 -0
- package/core/built/admin/assets/newsletters-BxC84_cL.js +1 -0
- package/core/built/admin/assets/{newsletters-Rq1M3GD-.js → newsletters-Dz77m__5.js} +1 -1
- package/core/built/admin/assets/note-BPtEzzZS.js +1 -0
- package/core/built/admin/assets/notifications-ng3ulEdp.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--e2nGvkW.js → offers-ByWSK0rR.js} +1 -1
- package/core/built/admin/assets/offers-container-modal-CwqnRa3T.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-CplZzd7F.js +1 -0
- package/core/built/admin/assets/overview-B0yD9OoX.js +1 -0
- package/core/built/admin/assets/overview-C4eJzQqi.js +1 -0
- package/core/built/admin/assets/page-header-CdCpekG9.js +1 -0
- package/core/built/admin/assets/pagemenu-CKQD9hoP.js +1 -0
- package/core/built/admin/assets/{pages-CjDY2CBI.js → pages-DZ_YGB1D.js} +1 -1
- package/core/built/admin/assets/pages-route-CKsnxIvw.js +1 -0
- package/core/built/admin/assets/papaparse.min-BlhnCUXn.js +10 -0
- package/core/built/admin/assets/pintura-modal-C5jzeyGk.js +1 -0
- package/core/built/admin/assets/portal-frame-DYo0bh0E.js +1 -0
- package/core/built/admin/assets/portal-modal-C0d8xjKa.js +1 -0
- package/core/built/admin/assets/post-analytics-C5C7IyAm.js +1 -0
- package/core/built/admin/assets/post-analytics-context-bt2YTBAC.js +1 -0
- package/core/built/admin/assets/post-analytics-header-DKWHwoK2.js +1 -0
- package/core/built/admin/assets/post-analytics-provider-BqCPPxmW.js +1 -0
- package/core/built/admin/assets/post-share-modal-wxmqbAv_.js +1 -0
- package/core/built/admin/assets/posts-list-screen-B978ZO0R.js +2 -0
- package/core/built/admin/assets/posts-route-CDqxKazl.js +1 -0
- package/core/built/admin/assets/{posts-pCPrhQeR.js → posts-tcoO3iRG.js} +1 -1
- package/core/built/admin/assets/preferences-CnejTRc4.js +5 -0
- package/core/built/admin/assets/preview-chrome-C7yZWVLZ.js +1 -0
- package/core/built/admin/assets/preview-modal-CFUxUGHp.js +1 -0
- package/core/built/admin/assets/profile-ClRGiOqA.js +1 -0
- package/core/built/admin/assets/prop-types-6lTeqvom.js +1 -0
- package/core/built/admin/assets/radio-group-CTmLo0h9.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-D8oHPmDB.js → referrers-1R8bPpoV.js} +1 -1
- package/core/built/admin/assets/router-provider-DDZvgS3V.js +1 -0
- package/core/built/admin/assets/select-D_4xWFYv.js +1 -0
- package/core/built/admin/assets/settings-BRl7-7a9.js +1 -0
- package/core/built/admin/assets/settings-BoQcPa-y.js +4 -0
- package/core/built/admin/assets/settings-breadcrumbs-C9Yxl81q.js +1 -0
- package/core/built/admin/assets/{dist-B3keLvjj.js → shade-scope-Cccj-c7I-D0XwkdKQ.js} +5 -3
- package/core/built/admin/assets/share-modal-DBqZobuR.js +1 -0
- package/core/built/admin/assets/simple-pagination-D5t_ox6x.js +1 -0
- package/core/built/admin/assets/skeleton-CPcTiTSX.js +1 -0
- package/core/built/admin/assets/slack-modal-BF9ex8cd.js +1 -0
- package/core/built/admin/assets/sort-button-C0EXGjnS.js +1 -0
- package/core/built/admin/assets/source-icon-BzzftCQ2.js +1 -0
- package/core/built/admin/assets/{stats-D9PDLS3x.js → stats-Cvp8Ep5m.js} +1 -1
- package/core/built/admin/assets/stats-view-CzpGoHzF.js +1 -0
- package/core/built/admin/assets/step-1-CBUYUPPF.js +1 -0
- package/core/built/admin/assets/step-2-CEIXUwQa.js +1 -0
- package/core/built/admin/assets/step-3-C1HA5i1N.js +2 -0
- package/core/built/admin/assets/stripe-button-DMFsLs80.js +1 -0
- package/core/built/admin/assets/stripe-connect-modal-CEvxCUTv.js +1 -0
- package/core/built/admin/assets/switch-DoOJF2yg.js +1 -0
- package/core/built/admin/assets/table-BDYbUHJz.js +1 -0
- package/core/built/admin/assets/tabs-BZyz4ZCH.js +1 -0
- package/core/built/admin/assets/tag-detail-CFzaz_9E.js +2 -0
- package/core/built/admin/assets/tag-picker-BKUCZuRc.js +1 -0
- package/core/built/admin/assets/tags-Bs1FiD7m.js +1 -0
- package/core/built/admin/assets/{tags-ChfdwJyS.js → tags-NwZ7BPK6.js} +1 -1
- package/core/built/admin/assets/testimonials-modal-CVm0_7E-.js +1 -0
- package/core/built/admin/assets/text-BLI0C8Mc.js +1 -0
- package/core/built/admin/assets/textarea-C5qolByg.js +1 -0
- package/core/built/admin/assets/themes-DtcEFQWm.js +1 -0
- package/core/built/admin/assets/tier-detail-modal-Cmwzi-e7.js +1 -0
- package/core/built/admin/assets/{tiers-BCpIOGQr.js → tiers-6mPzCXlM.js} +1 -1
- package/core/built/admin/assets/toggle-group-BTL1QsWY.js +1 -0
- package/core/built/admin/assets/topic-filter-BMjhquv7.js +1 -0
- package/core/built/admin/assets/transistor-modal-hMv53jF8.js +1 -0
- package/core/built/admin/assets/trend-badge-1w_HEzkG.js +1 -0
- package/core/built/admin/assets/unsplash-modal-jzC8lEB2.js +1 -0
- package/core/built/admin/assets/use-analytics-data-B3lGOxsC.js +1 -0
- package/core/built/admin/assets/use-availability-DnKqOyqd.js +1 -0
- package/core/built/admin/assets/{use-check-theme-limit-error-DRUjK4YM.js → use-check-theme-limit-error-C1tc2P4N.js} +2 -2
- package/core/built/admin/assets/use-email-sending-status-DNMtL5B9.js +1 -0
- package/core/built/admin/assets/use-filter-params-DU-aiaTb.js +1 -0
- package/core/built/admin/assets/use-filterable-api-CxCrnPxG.js +1 -0
- package/core/built/admin/assets/use-form-DJKZJhQh.js +1 -0
- package/core/built/admin/assets/use-growth-stats-E13rMQUE.js +1 -0
- package/core/built/admin/assets/use-host-limits-mpTkZIq8.js +1 -0
- package/core/built/admin/assets/use-limiter-DlL7au90.js +19 -0
- package/core/built/admin/assets/use-navigate-with-base-path-BzgNwMAx.js +1 -0
- package/core/built/admin/assets/use-pintura-config-CtEV1JQY.js +1 -0
- package/core/built/admin/assets/use-pintura-editor-CaxE64kD.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-BST2OgCM.js +1 -0
- package/core/built/admin/assets/use-router-history-entry-CKx9LhqD.js +1 -0
- package/core/built/admin/assets/use-sending-eta-DR9ueMH8.js +1 -0
- package/core/built/admin/assets/use-setting-group-ldtX1Vsk.js +1 -0
- package/core/built/admin/assets/use-settings-navigation-CzGU4sus.js +1 -0
- package/core/built/admin/assets/use-staff-users-DoeXaPsb.js +1 -0
- package/core/built/admin/assets/use-tinybird-query-BaBNCaj0.js +1 -0
- package/core/built/admin/assets/use-tinybird-token-CnZ19NDf.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-fvp-TpPx.js → use-url-input-C5KHJw79.js} +1 -1
- package/core/built/admin/assets/user-detail-modal-Dm0KfPeR.js +1 -0
- package/core/built/admin/assets/{users-DVNWrqg9.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-2dd263291938d407802568d3357ec69e.js → vendor-97e91ff8dd1457c668f9ef103ee1a77b.js} +2748 -2977
- package/core/built/admin/assets/virtual-list-tAuPUICw.js +1 -0
- package/core/built/admin/assets/web-BQlKcW2x.js +2 -0
- package/core/built/admin/assets/web-NTT5DkEz.js +1 -0
- package/core/built/admin/assets/zapier-modal-DsHG9Oev.js +1 -0
- package/core/built/admin/index.html +35 -34
- package/core/cli/command.js +17 -2
- package/core/frontend/apps/private-blogging/index.js +2 -2
- package/core/frontend/apps/private-blogging/lib/middleware.js +1 -1
- package/core/frontend/apps/private-blogging/lib/router.js +1 -1
- package/core/frontend/helpers/cancel_link.js +3 -3
- package/core/frontend/helpers/content.js +2 -2
- package/core/frontend/helpers/content_api_url.js +1 -1
- package/core/frontend/helpers/date.js +1 -1
- package/core/frontend/helpers/foreach.js +5 -5
- package/core/frontend/helpers/get.js +7 -4
- package/core/frontend/helpers/ghost_head.js +2 -2
- package/core/frontend/helpers/has.js +1 -3
- package/core/frontend/helpers/link.js +7 -7
- package/core/frontend/helpers/link_class.js +2 -2
- package/core/frontend/helpers/navigation.js +1 -2
- package/core/frontend/helpers/recommendations.js +5 -6
- package/core/frontend/helpers/tiers.js +1 -1
- package/core/frontend/helpers/total_members.js +1 -1
- package/core/frontend/helpers/total_paid_members.js +1 -1
- package/core/frontend/meta/asset-url.js +1 -16
- package/core/frontend/meta/author-url.js +1 -1
- package/core/frontend/meta/modified-date.js +1 -1
- package/core/frontend/meta/published-date.js +1 -1
- package/core/frontend/meta/schema.js +3 -8
- package/core/frontend/meta/structured-data.js +1 -2
- package/core/frontend/services/asset-hash/index.js +32 -2
- package/core/frontend/services/assets-minification/minifier.js +1 -1
- package/core/frontend/services/data/entry-lookup.js +1 -1
- package/core/frontend/services/data/fetch-data.js +2 -2
- package/core/frontend/services/rendering/format-response.js +1 -1
- package/core/frontend/services/rendering/renderer.js +3 -0
- package/core/frontend/services/rendering/templates.js +1 -1
- package/core/frontend/services/routing/controllers/static.js +1 -1
- package/core/frontend/services/routing/controllers/unsubscribe.js +2 -1
- package/core/frontend/services/routing/parent-router.js +1 -1
- package/core/frontend/services/routing/registry.js +1 -1
- package/core/frontend/services/rss/generate-feed.js +1 -1
- package/core/frontend/services/sitemap/base-site-map-generator.js +68 -97
- package/core/frontend/services/sitemap/site-map-index-generator.js +16 -21
- package/core/frontend/services/sitemap/site-map-manager.js +82 -43
- package/core/frontend/services/sitemap/sitemap-xml.js +72 -0
- package/core/frontend/services/theme-engine/active.js +2 -4
- package/core/frontend/services/theme-engine/handlebars/utils.js +8 -8
- package/core/frontend/services/theme-engine/i18n/i18n.js +15 -6
- package/core/frontend/services/theme-engine/i18next/theme-i18n.js +1 -1
- package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +1 -1
- package/core/frontend/services/theme-engine/preview.js +1 -1
- package/core/frontend/utils/member-count.js +2 -2
- package/core/frontend/web/middleware/llms-discovery.js +34 -43
- package/core/frontend/web/routers/serve-public-file.js +1 -1
- package/core/server/adapters/route-settings/S3RouteSettingsStore.js +1 -1
- package/core/server/adapters/scheduling/README.md +4 -0
- package/core/server/adapters/scheduling/get-scheduler-idempotency-key.js +21 -0
- package/core/server/adapters/storage/LocalFilesStorage.js +12 -2
- package/core/server/adapters/storage/LocalStorageBase.js +15 -1
- package/core/server/api/endpoints/actions.js +2 -1
- package/core/server/api/endpoints/automated-emails.js +11 -4
- package/core/server/api/endpoints/automations.js +77 -49
- package/core/server/api/endpoints/db.js +1 -1
- package/core/server/api/endpoints/emails.js +11 -6
- package/core/server/api/endpoints/index.js +1 -1
- package/core/server/api/endpoints/invites.js +2 -1
- package/core/server/api/endpoints/labels.js +6 -2
- package/core/server/api/endpoints/mail.js +1 -1
- package/core/server/api/endpoints/member-metafields.js +2 -2
- package/core/server/api/endpoints/member-signin-urls.js +1 -1
- package/core/server/api/endpoints/members.js +23 -7
- package/core/server/api/endpoints/oembed.js +1 -1
- package/core/server/api/endpoints/pages.js +2 -6
- package/core/server/api/endpoints/posts.js +4 -12
- package/core/server/api/endpoints/settings.js +2 -2
- package/core/server/api/endpoints/snippets.js +2 -1
- package/core/server/api/endpoints/tags.js +6 -2
- package/core/server/api/endpoints/themes.js +5 -5
- package/core/server/api/endpoints/users.js +2 -6
- package/core/server/api/endpoints/utils/api-filter-utils.js +62 -3
- package/core/server/api/endpoints/utils/serializers/input/pages.js +2 -2
- package/core/server/api/endpoints/utils/serializers/input/posts.js +2 -2
- package/core/server/api/endpoints/utils/serializers/input/tags.js +1 -1
- package/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js +4 -4
- package/core/server/api/endpoints/utils/serializers/output/mappers/comments.js +8 -5
- package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/pages.js +4 -4
- package/core/server/api/endpoints/utils/serializers/output/posts.js +4 -4
- package/core/server/api/endpoints/utils/serializers/output/search-index.js +11 -11
- package/core/server/api/endpoints/utils/serializers/output/settings.js +1 -1
- 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 +6 -3
- package/core/server/api/endpoints/utils/validators/input/automated_emails.js +23 -33
- package/core/server/api/endpoints/utils/validators/input/settings.js +18 -4
- package/core/server/data/exporter/exporter.js +3 -3
- package/core/server/data/exporter/table-lists.js +4 -5
- package/core/server/data/importer/handlers/image.js +1 -2
- package/core/server/data/importer/handlers/json.js +1 -3
- package/core/server/data/importer/handlers/markdown.js +4 -8
- package/core/server/data/importer/import-manager.js +1 -1
- package/core/server/data/importer/importers/content-file-importer.js +4 -8
- package/core/server/data/importer/importers/data/base.js +10 -10
- package/core/server/data/importer/importers/data/custom-theme-settings-importer.js +1 -1
- package/core/server/data/importer/importers/data/data-importer.js +3 -4
- package/core/server/data/importer/importers/data/posts-importer.js +10 -10
- package/core/server/data/importer/importers/data/products-importer.js +3 -3
- package/core/server/data/importer/importers/data/settings-importer.js +10 -4
- package/core/server/data/importer/importers/data/stripe-prices-importer.js +1 -1
- package/core/server/data/importer/importers/data/stripe-products-importer.js +1 -1
- package/core/server/data/importer/importers/data/tags-importer.js +1 -1
- package/core/server/data/importer/importers/data/users-importer.js +2 -2
- package/core/server/data/importer/importers/json-to-html.js +12 -9
- package/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js +1 -1
- 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/migrations/versions/6.65/2026-09-16-15-35-26-add-members-metafield-change-events.js +17 -0
- package/core/server/data/schema/fixtures/fixture-manager.js +3 -3
- package/core/server/data/schema/index.js +1 -1
- package/core/server/data/schema/schema.js +54 -2
- package/core/server/data/schema/validator.js +96 -123
- 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 +3 -3
- 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 +2 -2
- package/core/server/data/seeders/importers/members-newsletters-importer.js +1 -1
- package/core/server/data/seeders/importers/members-paid-subscription-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-status-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-stripe-customers-importer.js +1 -1
- package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +2 -2
- package/core/server/data/seeders/importers/members-subscribe-events-importer.js +2 -2
- package/core/server/data/seeders/importers/members-subscription-created-events-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 +25 -20
- package/core/server/data/tinybird/pipes/mv_pending_automation_runs.pipe +7 -0
- package/core/server/data/tinybird/scripts/docker-analytics-manager.js +2 -2
- package/core/server/data/tinybird/tests/api_automation_browse_stats.yaml +18 -0
- package/core/server/ghost-server.js +4 -22
- package/core/server/lib/generate-password.js +54 -0
- package/core/server/lib/image/image-size.js +1 -3
- package/core/server/lib/public-jwk.js +77 -0
- package/core/server/lib/request-external.js +53 -117
- package/core/server/models/base/plugins/actions.js +2 -3
- package/core/server/models/base/plugins/crud.js +1 -2
- package/core/server/models/base/plugins/events.js +4 -4
- package/core/server/models/base/plugins/raw-knex.js +3 -3
- package/core/server/models/base/plugins/sanitize.js +1 -1
- package/core/server/models/benefit.js +1 -1
- package/core/server/models/collection.js +1 -1
- package/core/server/models/comment.js +3 -3
- package/core/server/models/invite.js +2 -5
- package/core/server/models/label.js +3 -6
- package/core/server/models/member.js +7 -10
- package/core/server/models/newsletter.js +1 -1
- package/core/server/models/permission.js +3 -6
- package/core/server/models/post.js +20 -23
- package/core/server/models/product.js +4 -1
- package/core/server/models/relations/authors.js +9 -12
- package/core/server/models/role.js +2 -5
- package/core/server/models/settings.js +3 -3
- package/core/server/models/tag.js +2 -5
- package/core/server/models/user.js +19 -19
- package/core/server/models/webhook.js +2 -4
- package/core/server/notify.js +2 -2
- package/core/server/services/adapter-manager/base-classes.js +21 -3
- package/core/server/services/adapter-manager/utils.js +6 -1
- package/core/server/services/api-version-compatibility/legacy-api-path-match.js +2 -2
- package/core/server/services/auth/api-key/admin.js +2 -2
- package/core/server/services/auth/api-key/content.js +1 -1
- package/core/server/services/auth/passwordreset.js +1 -1
- package/core/server/services/auth/setup.js +1 -3
- package/core/server/services/automations/README.md +19 -0
- package/core/server/services/automations/automations-api.js +46 -1
- package/core/server/services/automations/poll.js +3 -1
- package/core/server/services/automations/service.js +2 -2
- package/core/server/services/automations/tinybird-automation-stats.js +56 -0
- package/core/server/services/automations/welcome-email-automation-poll.js +199 -293
- package/core/server/services/comments/comments-controller.js +9 -30
- package/core/server/services/comments/comments-service-email-renderer.js +1 -1
- package/core/server/services/comments/comments-service-emails.js +1 -1
- package/core/server/services/comments/comments-service.js +27 -58
- package/core/server/services/comments/comments-stats-service.js +1 -1
- package/core/server/services/content-import/import/media.js +1 -1
- package/core/server/services/content-import/import/staged-file.js +9 -9
- package/core/server/services/content-import/index.js +1 -1
- package/core/server/services/custom-redirects/validation.js +1 -1
- package/core/server/services/email-analytics/email-analytics-service-wrapper.js +38 -84
- package/core/server/services/email-analytics/email-analytics-service.js +19 -3
- package/core/server/services/email-analytics/index.js +44 -23
- package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.js +31 -60
- package/core/server/services/email-rendering/finalize.js +7 -2
- package/core/server/services/email-service/README.md +38 -0
- package/core/server/services/email-service/batch-sending-service.js +13 -14
- package/core/server/services/email-service/email-renderer.js +57 -16
- package/core/server/services/email-service/email-service-wrapper.js +4 -3
- package/core/server/services/email-service/email-service.js +76 -42
- package/core/server/services/email-service/email-templates/partials/feedback-button.hbs +2 -1
- package/core/server/services/email-service/email-templates/partials/styles.hbs +0 -6
- package/core/server/services/email-service/email-templates/template.hbs +1 -1
- package/core/server/services/email-service/jobs/send-email-job.js +12 -0
- package/core/server/services/email-service/mailgun-email-provider.js +7 -2
- package/core/server/services/email-service/sending-service.js +1 -1
- package/core/server/services/email-service/sending-status.js +10 -4
- package/core/server/services/gifts/gift-email-service.js +10 -3
- package/core/server/services/gifts/gift-service.js +12 -3
- package/core/server/services/gifts/index.js +1 -2
- package/core/server/services/gifts/jobs/index.js +12 -24
- package/core/server/services/gifts/jobs/send-gift-reminders-job.js +6 -46
- 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/invitations/accept.js +2 -2
- package/core/server/services/jobs/job-service.js +0 -28
- package/core/server/services/jobs-service/jobs-service.js +5 -0
- package/core/server/services/jobs-service/register-job-handlers.js +17 -1
- package/core/server/services/lib/mailgun-client.js +16 -1
- package/core/server/services/lib/mailgun-recipient-message-id.js +49 -0
- package/core/server/services/limits.js +18 -2
- package/core/server/services/mail/ghost-mailer.js +1 -1
- package/core/server/services/member-attribution/member-attribution-service.js +1 -1
- package/core/server/services/member-attribution/referrer-translator.js +1 -1
- package/core/server/services/member-welcome-emails/service.js +1 -1
- package/core/server/services/members/account-service.js +3 -3
- package/core/server/services/members/api.js +1 -1
- package/core/server/services/members/import-export/import/importer.js +25 -16
- package/core/server/services/members/import-export/import/spool.js +11 -15
- package/core/server/services/members/import-export/index.js +11 -8
- package/core/server/services/members/jobs/index.js +1 -1
- package/core/server/services/members/jobs/members-import-job.js +18 -0
- package/core/server/services/members/member-avatar.js +18 -0
- package/core/server/services/members/members-api/controllers/member-controller.js +2 -2
- 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 +4 -4
- package/core/server/services/members/members-api/repositories/event-repository.js +40 -1
- package/core/server/services/members/members-api/repositories/member-repository.js +55 -17
- package/core/server/services/members/members-api/repositories/product-repository.js +1 -1
- package/core/server/services/members/members-api/services/member-bread-service.js +19 -19
- package/core/server/services/members/members-api/services/token-service.js +11 -12
- package/core/server/services/members/middleware.js +9 -2
- package/core/server/services/members/request-integrity-token-provider.js +2 -1
- package/core/server/services/members/service.js +7 -2
- package/core/server/services/members/stats/members-stats.js +2 -2
- package/core/server/services/members-events/event-storage.js +2 -2
- package/core/server/services/members-metafields/access.js +31 -20
- package/core/server/services/members-metafields/actions.js +24 -2
- package/core/server/services/members-metafields/bindings-service.js +5 -5
- package/core/server/services/members-metafields/codec.js +9 -2
- package/core/server/services/members-metafields/definitions-service.js +57 -52
- package/core/server/services/members-metafields/index.js +3 -2
- package/core/server/services/members-metafields/models.js +2 -0
- package/core/server/services/members-metafields/queries.js +45 -11
- package/core/server/services/members-metafields/schema.js +51 -1
- package/core/server/services/members-metafields/serializers.js +1 -0
- package/core/server/services/members-metafields/values-service.js +132 -21
- package/core/server/services/mentions/mention-discovery-service.js +1 -1
- package/core/server/services/mentions/mention-sending-service.js +3 -3
- package/core/server/services/mentions/mention.js +4 -5
- package/core/server/services/mentions/mentions-api.js +4 -1
- package/core/server/services/mentions-jobs/job-service.js +0 -28
- package/core/server/services/milestones/milestones-service.js +1 -1
- package/core/server/services/newsletters/newsletters-service.js +1 -1
- package/core/server/services/notifications/notifications.js +3 -3
- package/core/server/services/oembed/oembed-service.js +115 -14
- package/core/server/services/permissions/can-this.js +1 -2
- package/core/server/services/post-scheduling/post-scheduling.js +8 -1
- package/core/server/services/posts/post-scheduling.js +27 -0
- package/core/server/services/settings/settings-bread-service.js +3 -3
- package/core/server/services/settings/settings-utils.js +1 -1
- package/core/server/services/settings-helpers/settings-helpers.js +1 -1
- package/core/server/services/staff/staff-service-emails.js +14 -10
- package/core/server/services/stats/posts-stats-service.js +10 -10
- package/core/server/services/stats/referrers-stats-service.js +1 -1
- package/core/server/services/stats/stats-service.js +12 -3
- package/core/server/services/stats/subscription-stats-service.js +3 -3
- package/core/server/services/stats/utils/tinybird.js +8 -1
- package/core/server/services/stripe/stripe-api.js +3 -3
- package/core/server/services/stripe/stripe-migrations.js +6 -6
- package/core/server/services/themes/storage.js +21 -26
- package/core/server/services/themes/theme-storage.js +2 -2
- package/core/server/services/tier-checkout-config/service.js +17 -1
- package/core/server/services/tiers/tier.js +15 -15
- 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 +31 -0
- package/core/server/services/tinybird-sync/sync-table-to-tinybird.js +149 -0
- package/core/server/services/tinybird-sync/tinybird-sync-service.js +67 -0
- package/core/server/services/update-check/update-check-service.js +3 -3
- package/core/server/services/webhooks/serialize.js +1 -1
- package/core/server/web/api/app.js +0 -5
- package/core/server/web/api/endpoints/admin/routes.js +33 -34
- package/core/server/web/api/middleware/upload.js +29 -2
- package/core/server/web/parent/middleware/index.js +1 -1
- package/core/server/web/parent/middleware/log-request.js +5 -0
- package/core/server/web/parent/middleware/queue-request.js +104 -59
- package/core/server/web/shared/middleware/api/spam-prevention.js +2 -2
- package/core/server/web/well-known.js +12 -16
- package/core/shared/config/defaults.json +7 -3
- package/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js +1 -1
- package/core/shared/{flush-logs.js → flush.js} +7 -3
- package/core/shared/labs.js +5 -2
- package/core/shared/settings-cache/cache-manager.js +1 -1
- package/core/shared/timing-safe-string-equal.js +26 -0
- package/nodemon.json +1 -1
- package/package.json +47 -48
- package/patches/@elastic__elasticsearch@8.19.2.patch +67 -0
- package/patches/juice@11.1.1.patch +46 -0
- package/pnpm-lock.yaml +571 -2107
- package/pnpm-workspace.yaml +38 -28
- package/scripts/prune.mts +70 -3
- package/tsconfig.json +1 -1
- package/components/tryghost-adapter-base-scheduling-0.2.3.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-C1C3s5-g.js +0 -1
- package/core/built/admin/assets/accordion-CxGsDKwa.js +0 -1
- package/core/built/admin/assets/account-migration-CbUhW6gk.js +0 -1
- package/core/built/admin/assets/action-list-C4v0-du8.js +0 -1
- package/core/built/admin/assets/activitypub/avatar-DVJF5bxP.js +0 -261
- package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +0 -1
- package/core/built/admin/assets/activitypub/routes-DdyY9uFF.js +0 -7181
- package/core/built/admin/assets/activitypub/settings-B6EEcVkW.js +0 -315
- package/core/built/admin/assets/activitypub/tabs-DLhZtVde.js +0 -1083
- package/core/built/admin/assets/activitypub/users-inweyKL5.js +0 -1499
- package/core/built/admin/assets/add-integration-modal-BT_onDJy.js +0 -1
- package/core/built/admin/assets/add-newsletter-modal-Cx1kQpiY.js +0 -1
- package/core/built/admin/assets/add-recommendation-modal-B5nvAhvr.js +0 -1
- package/core/built/admin/assets/analytics-DjoJWPI7.js +0 -1
- package/core/built/admin/assets/announcement-bar-modal-Dwd0EGFP.js +0 -1
- package/core/built/admin/assets/api-keys-BoeacM-s.js +0 -1
- package/core/built/admin/assets/automated-emails-BLesE41L.js +0 -1
- package/core/built/admin/assets/automations-BN4u3GR8.js +0 -1
- package/core/built/admin/assets/automations-C-ZTUwW3.js +0 -1
- package/core/built/admin/assets/avatar-flipboard-C6Kj3Awu.js +0 -1
- package/core/built/admin/assets/bluesky-sharing-vzh-oPXL.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-CaLk2b7D.js +0 -1
- package/core/built/admin/assets/build-CsiH26uS.js +0 -1
- package/core/built/admin/assets/button-Dvcv1QSR.js +0 -1
- package/core/built/admin/assets/calendar-Bl9RLcZX.js +0 -1
- package/core/built/admin/assets/card--VNbfgo3.js +0 -1
- package/core/built/admin/assets/chart-BrhA41Zi.js +0 -63
- package/core/built/admin/assets/chart-helpers-FHywU0pj.js +0 -1
- package/core/built/admin/assets/checkbox-BtayFtjg.js +0 -1
- package/core/built/admin/assets/chunk.524.e6975095fccdf22d90f8.js +0 -32
- package/core/built/admin/assets/chunk.582.98b485f9b2802f540897.js +0 -34
- package/core/built/admin/assets/code-editor-view-C3ZfoF1X.js +0 -1
- package/core/built/admin/assets/code-editor-view-CAyRWy1s.js +0 -1
- package/core/built/admin/assets/color-picker-G4kGR7rp.js +0 -3
- package/core/built/admin/assets/color-picker-field-DQFVTNnT.js +0 -1
- package/core/built/admin/assets/combobox-BnYzgEB4.js +0 -1
- package/core/built/admin/assets/command-C_vyTikI.js +0 -1
- package/core/built/admin/assets/comments-aBrxfnZf.js +0 -1
- package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +0 -1
- package/core/built/admin/assets/confirmation-context-DwXX_Y5h.js +0 -1
- package/core/built/admin/assets/container-BuQG1wuP.js +0 -1
- package/core/built/admin/assets/content-api-modal-D2G0nJP6.js +0 -1
- package/core/built/admin/assets/context-menu-DOVB6yaz.js +0 -1
- package/core/built/admin/assets/copy-field-DCJwh9qf.js +0 -1
- package/core/built/admin/assets/create-ghost-browse-value-source-5C53jJaX.js +0 -1
- package/core/built/admin/assets/custom-integration-modal-AbJGVyKc.js +0 -1
- package/core/built/admin/assets/data-list-CA2jYGPq.js +0 -1
- package/core/built/admin/assets/date-range-select-BY3K-ukj.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-BvEy4_pC.js +0 -2
- package/core/built/admin/assets/detail-page-Dnv-CdR1.js +0 -1
- package/core/built/admin/assets/dirty-confirm-dialog-DVPuGz3U.js +0 -1
- package/core/built/admin/assets/disabled-sources-indicator-Cy7Zp4c8.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-Dl61QGuk.js +0 -1
- package/core/built/admin/assets/dropzone-Dtz5Rmjt.js +0 -5
- package/core/built/admin/assets/edit-profile-DNJSMDwm.js +0 -1
- package/core/built/admin/assets/editor-DbAen9zf.js +0 -8
- package/core/built/admin/assets/editor-screen-BFWThIai.js +0 -26
- package/core/built/admin/assets/email-sending-status-context-CWDOD1FN.js +0 -1
- package/core/built/admin/assets/email-sending-status-provider-DCPkDICt.js +0 -1
- package/core/built/admin/assets/embed-signup-form-modal-DGqsORxS.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-nnRr1Fja.js +0 -1
- package/core/built/admin/assets/feature-flag-overrides-context-DQjdJFAk.js +0 -1
- package/core/built/admin/assets/feature-image-placeholder-BrIHmPs8.js +0 -1
- package/core/built/admin/assets/feed-BNUcNu-W.js +0 -1
- package/core/built/admin/assets/feedback-DJ4Zb9rZ.js +0 -1
- package/core/built/admin/assets/field-C93_Mg6j.js +0 -1
- package/core/built/admin/assets/filter-bar-Da1qxybu.js +0 -1
- package/core/built/admin/assets/filter-sources-CGJb4C5r.js +0 -1
- package/core/built/admin/assets/filters--kKP-EC8.js +0 -1
- package/core/built/admin/assets/filters-DxA_a4FP.js +0 -1
- package/core/built/admin/assets/first-promoter-modal-BYDtrz2S.js +0 -1
- package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-BbSnGOtK.js +0 -1
- package/core/built/admin/assets/framework-provider-DqI25epG.js +0 -4
- package/core/built/admin/assets/gift-link-modal-B7u5bD4e.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-Cd1uO9d2.js +0 -1
- package/core/built/admin/assets/growth-aG32xfdE.js +0 -3
- package/core/built/admin/assets/heading-Dh5SFVjL.js +0 -1
- package/core/built/admin/assets/history-modal-Df8lW8h-.js +0 -1
- package/core/built/admin/assets/hooks-Cy_-oZ4o.js +0 -2
- package/core/built/admin/assets/html-field-DA4eU7eq.js +0 -1
- package/core/built/admin/assets/iframe-buffering-B2OKJzbz.js +0 -1
- package/core/built/admin/assets/images-KXmyO3Ss.js +0 -1
- package/core/built/admin/assets/index-BHHXtR5C.css +0 -2
- package/core/built/admin/assets/index-CgMCwsxN.js +0 -4
- package/core/built/admin/assets/index.es-CY6-yuw9.js +0 -1
- package/core/built/admin/assets/inline-BWSs_VzR.js +0 -1
- package/core/built/admin/assets/input-group-BE8rM2y1.js +0 -1
- package/core/built/admin/assets/input-surface-BsrIZeSF.js +0 -1
- package/core/built/admin/assets/integration-header-Bm6IDb1A.js +0 -1
- package/core/built/admin/assets/invite-user-modal-B4CuNcx4.js +0 -1
- package/core/built/admin/assets/koenig-loader-BeM5rFPX.js +0 -2
- package/core/built/admin/assets/kpi-card-B21aToe8.js +0 -1
- package/core/built/admin/assets/kpi-card-pz6Wv4Ae.js +0 -1
- package/core/built/admin/assets/kpi-helpers-Dq5jelmP.js +0 -1
- package/core/built/admin/assets/kpi-tabs-DEZHpKUt.js +0 -1
- package/core/built/admin/assets/label-OLCzze8N.js +0 -1
- package/core/built/admin/assets/label-picker-BigOvMPV.js +0 -1
- package/core/built/admin/assets/labels-Dr0SgUQD.js +0 -1
- package/core/built/admin/assets/layout-DUTL8SH5.js +0 -1
- package/core/built/admin/assets/lib-7QPTI0FS.js +0 -1
- package/core/built/admin/assets/limit-service-BhiEvqcP.js +0 -20
- package/core/built/admin/assets/link-helpers-BRAg9SCj.js +0 -1
- package/core/built/admin/assets/links-BDHPTlyj.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-TRTHCAz9.js +0 -1
- package/core/built/admin/assets/member-detail-b6dRwc3C.js +0 -1
- package/core/built/admin/assets/members-Czt5lJSc.js +0 -4
- package/core/built/admin/assets/modal-page-xCivTMvI.js +0 -1
- package/core/built/admin/assets/moderation-ZWefD9uH.js +0 -1
- package/core/built/admin/assets/multi-select-combobox-CT13MTo-.js +0 -1
- package/core/built/admin/assets/navigation-modal-C8FEhBK5.js +0 -1
- package/core/built/admin/assets/newsletter-5VYW4RyJ.js +0 -1
- package/core/built/admin/assets/newsletter-detail-modal-ChjC0ZqH.js +0 -1
- package/core/built/admin/assets/newsletter-emails-DZH6I-PY.js +0 -1
- package/core/built/admin/assets/newsletters-DOC9KBcX.js +0 -1
- package/core/built/admin/assets/note-DIV-Pojr.js +0 -1
- package/core/built/admin/assets/notifications-s20-H49V.js +0 -1
- package/core/built/admin/assets/nql-lang-CaWrLesS.js +0 -19
- package/core/built/admin/assets/offers-container-modal-BmG5M5Tv.js +0 -1
- package/core/built/admin/assets/onboarding-CUuy9unR.js +0 -1
- package/core/built/admin/assets/onboarding-pXyct0Jm.js +0 -1
- package/core/built/admin/assets/onboarding-route-CK4pcXoR.js +0 -1
- package/core/built/admin/assets/overview-CaPsciMs.js +0 -1
- package/core/built/admin/assets/overview-a8GfcsKX.js +0 -1
- package/core/built/admin/assets/page-header-DM_KyoFI.js +0 -1
- package/core/built/admin/assets/pagemenu-vgZVUVKR.js +0 -1
- package/core/built/admin/assets/pages-route-BzKZYdV5.js +0 -1
- package/core/built/admin/assets/papaparse.min-cQwnxGCG.js +0 -10
- package/core/built/admin/assets/pintura-modal-DExCF1ii.js +0 -1
- package/core/built/admin/assets/portal-frame-Cqanidq4.js +0 -1
- package/core/built/admin/assets/portal-modal-oinBgA27.js +0 -1
- package/core/built/admin/assets/post-analytics-C5oJ1dWV.js +0 -1
- package/core/built/admin/assets/post-analytics-context-D0Mw-Pmv.js +0 -1
- package/core/built/admin/assets/post-analytics-header-OATo3X_r.js +0 -1
- package/core/built/admin/assets/post-analytics-provider-tOpIVGT5.js +0 -1
- package/core/built/admin/assets/post-share-modal-DvhC1XgV.js +0 -1
- package/core/built/admin/assets/posts-list-screen-o4ZjbgS3.js +0 -2
- package/core/built/admin/assets/posts-route-9F--xdIb.js +0 -1
- package/core/built/admin/assets/preferences--vNubsqD.js +0 -5
- package/core/built/admin/assets/preview-chrome-BljUBlOk.js +0 -1
- package/core/built/admin/assets/preview-modal-YYbzlYdO.js +0 -1
- package/core/built/admin/assets/profile-BllKV3dR.js +0 -1
- package/core/built/admin/assets/prop-types-DeUPn3oD.js +0 -1
- package/core/built/admin/assets/radio-group-DL8GI8rt.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-BSvTXgZY.js +0 -1
- package/core/built/admin/assets/select-v5YbA3Mw.js +0 -1
- package/core/built/admin/assets/settings-PEsZupw1.js +0 -4
- package/core/built/admin/assets/settings-breadcrumbs-NwPnCTC7.js +0 -1
- package/core/built/admin/assets/settings-u_s1CRkr.js +0 -1
- package/core/built/admin/assets/shade-app-CcS3f8MZ-vwURazk8.js +0 -3
- package/core/built/admin/assets/share-modal-SskCmVGL.js +0 -1
- package/core/built/admin/assets/skeleton-Ce9GgUpf.js +0 -1
- package/core/built/admin/assets/slack-modal-XxSJiYgo.js +0 -1
- package/core/built/admin/assets/sort-button-Cx1KtINE.js +0 -1
- package/core/built/admin/assets/source-icon-Bdp9Im_5.js +0 -1
- package/core/built/admin/assets/stack-B2eszIiq.js +0 -1
- package/core/built/admin/assets/stats-view-W2g6Jsd-.js +0 -1
- package/core/built/admin/assets/step-1-BQYzvBzr.js +0 -1
- package/core/built/admin/assets/step-2-xES32xJV.js +0 -1
- package/core/built/admin/assets/step-3-DA_XK5kW.js +0 -2
- package/core/built/admin/assets/stripe-button-CVsLHelt.js +0 -1
- package/core/built/admin/assets/stripe-connect-modal-ClmLOMGS.js +0 -1
- package/core/built/admin/assets/switch-CI4gLWqb.js +0 -1
- package/core/built/admin/assets/table-BenqVupI.js +0 -1
- package/core/built/admin/assets/tabs-eBBlxPp8.js +0 -1
- package/core/built/admin/assets/tag-detail-Ce8Se2qd.js +0 -2
- package/core/built/admin/assets/tag-picker-C3UR-uJ-.js +0 -1
- package/core/built/admin/assets/tags-B-kJxCs7.js +0 -1
- package/core/built/admin/assets/testimonials-modal-9Q6fT06V.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-CDyYdqK7.js +0 -1
- package/core/built/admin/assets/toggle-group-CviIkyok.js +0 -1
- package/core/built/admin/assets/topic-filter-I2jCBGxm.js +0 -1
- package/core/built/admin/assets/transistor-modal-p53u3W8y.js +0 -1
- package/core/built/admin/assets/trend-badge-CideVzQd.js +0 -1
- package/core/built/admin/assets/types-uYQ1HgqL.js +0 -1
- package/core/built/admin/assets/unsplash-modal-DY8UcKcE.js +0 -1
- package/core/built/admin/assets/use-analytics-data-DAIGcr2f.js +0 -1
- package/core/built/admin/assets/use-filter-params-JkZhIS8L.js +0 -1
- package/core/built/admin/assets/use-filterable-api-BVEVMrhZ.js +0 -1
- package/core/built/admin/assets/use-form-vRjI0Kwk.js +0 -1
- package/core/built/admin/assets/use-growth-stats-937CUj6j.js +0 -1
- package/core/built/admin/assets/use-host-limits-D0Dv3tKA.js +0 -1
- package/core/built/admin/assets/use-limiter-CohWfzvK.js +0 -2
- package/core/built/admin/assets/use-navigate-with-base-path-BkxcPj5l.js +0 -1
- package/core/built/admin/assets/use-pintura-config-xgytjU35.js +0 -1
- package/core/built/admin/assets/use-pintura-editor-CaV1mbfO.js +0 -1
- package/core/built/admin/assets/use-post-referrers-BCQI7fDg.js +0 -1
- package/core/built/admin/assets/use-query-params-BfzuqbcD.js +0 -1
- package/core/built/admin/assets/use-reply-chain-data-CYRhoaxY.js +0 -1
- package/core/built/admin/assets/use-router-history-entry-NOKcd--l.js +0 -1
- package/core/built/admin/assets/use-setting-group-bLKMwoBT.js +0 -1
- package/core/built/admin/assets/use-settings-navigation-B-qrriKD.js +0 -1
- package/core/built/admin/assets/use-simple-pagination-CNPd6Rf6.js +0 -1
- package/core/built/admin/assets/use-staff-users-pRIMIyiW.js +0 -1
- package/core/built/admin/assets/use-tinybird-query-CmdbCS9X.js +0 -1
- package/core/built/admin/assets/use-tinybird-token-KLne235s.js +0 -1
- package/core/built/admin/assets/use-unsaved-changes-guard-7-ug0JdH.js +0 -1
- package/core/built/admin/assets/use-upgrade-route-Dm_qqKr0.js +0 -1
- package/core/built/admin/assets/user-detail-modal-D3KlGYv-.js +0 -1
- package/core/built/admin/assets/virtual-list-CZ3RK2Yf.js +0 -1
- package/core/built/admin/assets/web-ClEJsCAj.js +0 -2
- package/core/built/admin/assets/web-X9rdnrtq.js +0 -1
- package/core/built/admin/assets/zapier-modal-DfVhV17j.js +0 -1
- package/core/frontend/services/sitemap/utils.js +0 -17
- package/core/server/services/automations/get-scheduler-idempotency-key.js +0 -13
- package/core/server/web/api/testmode/index.js +0 -1
- package/core/server/web/api/testmode/jobs/cpu-hog.js +0 -15
- package/core/server/web/api/testmode/jobs/graceful-job.js +0 -50
- package/core/server/web/api/testmode/jobs/say-hello.js +0 -17
- package/core/server/web/api/testmode/routes.js +0 -120
- /package/core/built/admin/assets/{chunk.901.4ccc639821020230bcca.js.LICENSE.txt → chunk.972.4b8c97f93d66db15e751.js.LICENSE.txt} +0 -0
|
@@ -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
|
|
|
@@ -45,6 +65,13 @@ exports.publish = async (resourceType, id, force, options) => {
|
|
|
45
65
|
throw err;
|
|
46
66
|
}
|
|
47
67
|
|
|
68
|
+
// The read above is filtered to scheduled resources, so a resource that an
|
|
69
|
+
// earlier delivery has already published normally surfaces as NotFound.
|
|
70
|
+
// Keep an explicit check so the outcome doesn't depend on that filter.
|
|
71
|
+
if (preScheduledResource.status !== 'scheduled') {
|
|
72
|
+
return NO_OP;
|
|
73
|
+
}
|
|
74
|
+
|
|
48
75
|
const publishedAtMoment = moment(preScheduledResource.published_at);
|
|
49
76
|
|
|
50
77
|
if (publishedAtMoment.diff(moment(), 'minutes') > publishAPostBySchedulerToleranceInMinutes) {
|
|
@@ -128,7 +128,7 @@ class SettingsBREADService {
|
|
|
128
128
|
* @returns
|
|
129
129
|
*/
|
|
130
130
|
browse(context) {
|
|
131
|
-
|
|
131
|
+
const settings = this.settingsCache.getAll();
|
|
132
132
|
|
|
133
133
|
return this._formatBrowse(settings, context);
|
|
134
134
|
}
|
|
@@ -199,7 +199,7 @@ class SettingsBREADService {
|
|
|
199
199
|
* @returns
|
|
200
200
|
*/
|
|
201
201
|
async edit(settings, options, stripeConnectData) {
|
|
202
|
-
|
|
202
|
+
const filteredSettings = settings.filter((setting) => {
|
|
203
203
|
// The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings.
|
|
204
204
|
return (
|
|
205
205
|
![
|
|
@@ -488,7 +488,7 @@ class SettingsBREADService {
|
|
|
488
488
|
if (process.env.NODE_ENV !== 'production') {
|
|
489
489
|
logging.warn(message.text);
|
|
490
490
|
}
|
|
491
|
-
|
|
491
|
+
const msg = Object.assign(
|
|
492
492
|
{
|
|
493
493
|
from: fromEmail,
|
|
494
494
|
subject: 'Verify email address',
|
|
@@ -41,7 +41,7 @@ let SITE_UUID;
|
|
|
41
41
|
function getOrGenerateSiteUuid() {
|
|
42
42
|
if (!SITE_UUID) {
|
|
43
43
|
try {
|
|
44
|
-
|
|
44
|
+
const configuredSiteUuid = config.get('site_uuid');
|
|
45
45
|
if (configuredSiteUuid && validator.isUUID(configuredSiteUuid)) {
|
|
46
46
|
SITE_UUID = configuredSiteUuid.toLowerCase();
|
|
47
47
|
logging.info(`Setting site_uuid to configured value: ${SITE_UUID}`);
|
|
@@ -125,7 +125,7 @@ class SettingsHelpers {
|
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
getMembersSupportAddress() {
|
|
128
|
-
|
|
128
|
+
const supportAddress = this.settingsCache.get('members_support_address');
|
|
129
129
|
|
|
130
130
|
if (!supportAddress) {
|
|
131
131
|
// In the new flow, we make a difference between an empty setting (= use default) and a 'noreply' setting (=use noreply @ domain)
|
|
@@ -44,7 +44,7 @@ class StaffServiceEmails {
|
|
|
44
44
|
attributionTitle = 'Homepage';
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
const staffUrl = this.urlUtils.urlJoin(
|
|
48
48
|
this.urlUtils.urlFor('admin', true),
|
|
49
49
|
'#',
|
|
50
50
|
`/settings/staff/${user.slug}/email-notifications`,
|
|
@@ -101,7 +101,7 @@ class StaffServiceEmails {
|
|
|
101
101
|
startedOn: this.getFormattedDate(subscription.startDate),
|
|
102
102
|
};
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
const offerData = this.getOfferData(offer);
|
|
105
105
|
|
|
106
106
|
if (!offerData && subscription?.trialEnd) {
|
|
107
107
|
const trialEnd = moment(subscription.trialEnd);
|
|
@@ -118,7 +118,7 @@ class StaffServiceEmails {
|
|
|
118
118
|
attributionTitle = 'Homepage';
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
const staffUrl = this.urlUtils.urlJoin(
|
|
122
122
|
this.urlUtils.urlFor('admin', true),
|
|
123
123
|
'#',
|
|
124
124
|
`/settings/staff/${user.slug}/email-notifications`,
|
|
@@ -180,7 +180,7 @@ class StaffServiceEmails {
|
|
|
180
180
|
cancellationReason: subscription.cancellationReason || '',
|
|
181
181
|
};
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
const staffUrl = this.urlUtils.urlJoin(
|
|
184
184
|
this.urlUtils.urlFor('admin', true),
|
|
185
185
|
'#',
|
|
186
186
|
`/settings/staff/${user.slug}/email-notifications`,
|
|
@@ -217,7 +217,7 @@ class StaffServiceEmails {
|
|
|
217
217
|
* @param {string} recipient.slug
|
|
218
218
|
*/
|
|
219
219
|
async getSharedData(recipient) {
|
|
220
|
-
|
|
220
|
+
const staffUrl = this.urlUtils.urlJoin(
|
|
221
221
|
this.urlUtils.urlFor('admin', true),
|
|
222
222
|
'#',
|
|
223
223
|
`/settings/staff/${recipient.slug}/email-notifications`,
|
|
@@ -273,7 +273,7 @@ class StaffServiceEmails {
|
|
|
273
273
|
for (const user of users) {
|
|
274
274
|
const to = user.email;
|
|
275
275
|
|
|
276
|
-
|
|
276
|
+
const staffUrl = this.urlUtils.urlJoin(
|
|
277
277
|
this.urlUtils.urlFor('admin', true),
|
|
278
278
|
'#',
|
|
279
279
|
`/settings/staff/${user.slug}/email-notifications`,
|
|
@@ -442,7 +442,7 @@ class StaffServiceEmails {
|
|
|
442
442
|
for (const user of users) {
|
|
443
443
|
const to = user.email;
|
|
444
444
|
|
|
445
|
-
|
|
445
|
+
const staffUrl = this.urlUtils.urlJoin(
|
|
446
446
|
this.urlUtils.urlFor('admin', true),
|
|
447
447
|
'#',
|
|
448
448
|
`/settings/staff/${user.slug}/email-notifications`,
|
|
@@ -485,7 +485,7 @@ class StaffServiceEmails {
|
|
|
485
485
|
|
|
486
486
|
/** @private */
|
|
487
487
|
getMemberData(member) {
|
|
488
|
-
|
|
488
|
+
const name = member?.name || member?.email;
|
|
489
489
|
return {
|
|
490
490
|
name,
|
|
491
491
|
email: member?.email,
|
|
@@ -607,7 +607,7 @@ class StaffServiceEmails {
|
|
|
607
607
|
this.logging.warn(message.text);
|
|
608
608
|
}
|
|
609
609
|
|
|
610
|
-
|
|
610
|
+
const msg = Object.assign(
|
|
611
611
|
{
|
|
612
612
|
from: this.fromEmailAddress,
|
|
613
613
|
forceTextContent: true,
|
|
@@ -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) {
|
|
@@ -355,7 +355,7 @@ class PostsStatsService {
|
|
|
355
355
|
.groupBy('source');
|
|
356
356
|
|
|
357
357
|
// Now join all the data
|
|
358
|
-
|
|
358
|
+
const query = this.knex
|
|
359
359
|
.with('free_referrers', freeReferrersCTE)
|
|
360
360
|
.with('paid_referrers', paidReferrersCTE)
|
|
361
361
|
.with('mrr_referrers', mrrReferrersCTE)
|
|
@@ -657,7 +657,7 @@ class PostsStatsService {
|
|
|
657
657
|
const { dateFrom, dateTo } = getDateBoundaries(options);
|
|
658
658
|
|
|
659
659
|
// Simpler approach mirroring _buildFreeMembersSubquery
|
|
660
|
-
|
|
660
|
+
const subquery = knex('members_created_events as mce')
|
|
661
661
|
.select('mce.referrer_source as source')
|
|
662
662
|
.countDistinct('mce.member_id as free_members')
|
|
663
663
|
.leftJoin('members_subscription_created_events as msce', function () {
|
|
@@ -686,7 +686,7 @@ class PostsStatsService {
|
|
|
686
686
|
_buildPaidReferrersSubquery(postId, options) {
|
|
687
687
|
const knex = this.knex;
|
|
688
688
|
const { dateFrom, dateTo } = getDateBoundaries(options);
|
|
689
|
-
|
|
689
|
+
const subquery = knex('members_subscription_created_events as msce')
|
|
690
690
|
.select('msce.referrer_source as source')
|
|
691
691
|
.countDistinct('msce.member_id as paid_members')
|
|
692
692
|
.where('msce.attribution_id', postId)
|
|
@@ -708,7 +708,7 @@ class PostsStatsService {
|
|
|
708
708
|
_buildMrrReferrersSubquery(postId, options) {
|
|
709
709
|
const knex = this.knex;
|
|
710
710
|
const { dateFrom, dateTo } = getDateBoundaries(options);
|
|
711
|
-
|
|
711
|
+
const subquery = knex('members_subscription_created_events as msce')
|
|
712
712
|
.select('msce.referrer_source as source')
|
|
713
713
|
.sum('mpse.mrr_delta as mrr')
|
|
714
714
|
.join('members_paid_subscription_events as mpse', function () {
|
|
@@ -744,7 +744,7 @@ class PostsStatsService {
|
|
|
744
744
|
const { dateFrom, dateTo } = getDateBoundaries(options);
|
|
745
745
|
|
|
746
746
|
// Parse order field and direction
|
|
747
|
-
|
|
747
|
+
const [orderField, orderDirection = 'desc'] = order.split(' ');
|
|
748
748
|
|
|
749
749
|
// Map frontend order fields to database fields (simplified for ORDER BY)
|
|
750
750
|
const orderFieldMap = {
|
|
@@ -834,7 +834,7 @@ class PostsStatsService {
|
|
|
834
834
|
const { dateFrom, dateTo } = getDateBoundaries(options);
|
|
835
835
|
|
|
836
836
|
// Parse order field and direction
|
|
837
|
-
|
|
837
|
+
const [orderField, orderDirection = 'desc'] = order.split(' ');
|
|
838
838
|
|
|
839
839
|
// Map frontend order fields to database fields (simplified for ORDER BY)
|
|
840
840
|
const orderFieldMap = {
|
|
@@ -1095,7 +1095,7 @@ class PostsStatsService {
|
|
|
1095
1095
|
const { dateFrom, dateTo } = getDateBoundaries(options);
|
|
1096
1096
|
|
|
1097
1097
|
// Build optimized deltas query - avoid expensive JOIN
|
|
1098
|
-
|
|
1098
|
+
const deltasQuery = this.knex('members_subscribe_events as mse')
|
|
1099
1099
|
.select(
|
|
1100
1100
|
this.knex.raw(`DATE(mse.created_at) as date`),
|
|
1101
1101
|
this.knex.raw(`SUM(CASE WHEN mse.subscribed = 1 THEN 1 ELSE -1 END) as value`),
|
|
@@ -1150,7 +1150,7 @@ class PostsStatsService {
|
|
|
1150
1150
|
// Build complete time series with all dates
|
|
1151
1151
|
const completeValues = [];
|
|
1152
1152
|
let lastValue = startingValue; // Use provided starting value
|
|
1153
|
-
|
|
1153
|
+
const currentDate = rangeStart.clone();
|
|
1154
1154
|
|
|
1155
1155
|
while (currentDate.isSameOrBefore(rangeEnd)) {
|
|
1156
1156
|
const dateKey = currentDate.format('YYYY-MM-DD');
|
|
@@ -1507,7 +1507,7 @@ class PostsStatsService {
|
|
|
1507
1507
|
try {
|
|
1508
1508
|
// Build free members query (modeled after _buildFreeMembersSubquery)
|
|
1509
1509
|
// Members who signed up on post but paid elsewhere/never
|
|
1510
|
-
|
|
1510
|
+
const freeMembersQuery = this.knex('members_created_events as mce')
|
|
1511
1511
|
.select('mce.attribution_id as post_id')
|
|
1512
1512
|
.countDistinct('mce.member_id as free_members')
|
|
1513
1513
|
.leftJoin('members_subscription_created_events as msce', function () {
|
|
@@ -1525,7 +1525,7 @@ class PostsStatsService {
|
|
|
1525
1525
|
|
|
1526
1526
|
// Build paid members query (modeled after _buildPaidMembersSubquery)
|
|
1527
1527
|
// Members whose paid conversion was attributed to this post
|
|
1528
|
-
|
|
1528
|
+
const paidMembersQuery = this.knex('members_subscription_created_events as msce')
|
|
1529
1529
|
.select('msce.attribution_id as post_id')
|
|
1530
1530
|
.countDistinct('msce.member_id as paid_members')
|
|
1531
1531
|
.whereIn('msce.attribution_type', ['post', 'page'])
|
|
@@ -226,7 +226,7 @@ class ReferrersStatsService {
|
|
|
226
226
|
const { dateFrom: startDateTime, dateTo: endDateTime } = getDateBoundaries(options);
|
|
227
227
|
|
|
228
228
|
// Join subscription created events with paid subscription events to get MRR changes
|
|
229
|
-
|
|
229
|
+
const query = knex('members_subscription_created_events as msce')
|
|
230
230
|
.join('members_paid_subscription_events as mpse', function () {
|
|
231
231
|
this.on('msce.member_id', '=', 'mpse.member_id').andOn(
|
|
232
232
|
'msce.subscription_id',
|
|
@@ -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,
|
|
@@ -25,12 +25,12 @@ class SubscriptionStatsService {
|
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
/** @type {SubscriptionHistoryEntry[]} */
|
|
28
|
-
|
|
28
|
+
const subscriptionHistoryEntries = [];
|
|
29
29
|
|
|
30
30
|
/** @type {string[]} */
|
|
31
|
-
|
|
31
|
+
const cadences = [];
|
|
32
32
|
/** @type {string[]} */
|
|
33
|
-
|
|
33
|
+
const tiers = [];
|
|
34
34
|
|
|
35
35
|
for (let index = subscriptionDeltaEntries.length - 1; index >= 0; index -= 1) {
|
|
36
36
|
const entry = subscriptionDeltaEntries[index];
|
|
@@ -82,6 +82,8 @@ const create = ({ config, request, settingsCache, tinybirdService }) => {
|
|
|
82
82
|
}
|
|
83
83
|
});
|
|
84
84
|
|
|
85
|
+
searchParams.ghost_client = 'server';
|
|
86
|
+
|
|
85
87
|
// Convert searchParams to query string and append to URL
|
|
86
88
|
const queryString = new URLSearchParams(searchParams).toString();
|
|
87
89
|
const fullUrl = `${tinybirdUrl}?${queryString}`;
|
|
@@ -91,7 +93,12 @@ const create = ({ config, request, settingsCache, tinybirdService }) => {
|
|
|
91
93
|
Authorization: `Bearer ${token}`,
|
|
92
94
|
},
|
|
93
95
|
timeout: {
|
|
94
|
-
|
|
96
|
+
// Allow Tinybird's 30-second query deadline to finish before timing out locally.
|
|
97
|
+
request: 35000,
|
|
98
|
+
},
|
|
99
|
+
retry: {
|
|
100
|
+
// A failed request may still be executing; avoid duplicating expensive queries.
|
|
101
|
+
limit: 0,
|
|
95
102
|
},
|
|
96
103
|
};
|
|
97
104
|
|
|
@@ -367,7 +367,7 @@ module.exports = class StripeAPI {
|
|
|
367
367
|
let latestCustomer = customers[0];
|
|
368
368
|
let latestSubscriptionTime = 0;
|
|
369
369
|
|
|
370
|
-
for (
|
|
370
|
+
for (const customer of customers) {
|
|
371
371
|
// skip customers with no subscriptions
|
|
372
372
|
if (
|
|
373
373
|
!customer.subscriptions ||
|
|
@@ -378,7 +378,7 @@ module.exports = class StripeAPI {
|
|
|
378
378
|
}
|
|
379
379
|
|
|
380
380
|
// find the customer with the most recent subscription
|
|
381
|
-
for (
|
|
381
|
+
for (const subscription of customer.subscriptions.data) {
|
|
382
382
|
if (
|
|
383
383
|
subscription.current_period_end &&
|
|
384
384
|
subscription.current_period_end > latestSubscriptionTime
|
|
@@ -606,7 +606,7 @@ module.exports = class StripeAPI {
|
|
|
606
606
|
subscriptionData.trial_period_days = options.trialDays;
|
|
607
607
|
}
|
|
608
608
|
|
|
609
|
-
|
|
609
|
+
const stripeSessionOptions = {
|
|
610
610
|
payment_method_types: this.PAYMENT_METHOD_TYPES,
|
|
611
611
|
managed_payments: MANAGED_PAYMENTS_DISABLED,
|
|
612
612
|
success_url: options.successUrl || this._config.checkoutSessionSuccessUrl,
|
|
@@ -69,7 +69,7 @@ module.exports = class StripeMigrations {
|
|
|
69
69
|
logging.info(`Populating products and prices for existing stripe customers`);
|
|
70
70
|
const uniquePlans = _.uniq(subscriptions.map((d) => _.get(d, 'plan.id')));
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
const stripePrices = [];
|
|
73
73
|
for (const plan of uniquePlans) {
|
|
74
74
|
try {
|
|
75
75
|
const stripePrice = await this.api.getPrice(plan, {
|
|
@@ -356,9 +356,9 @@ module.exports = class StripeMigrations {
|
|
|
356
356
|
|
|
357
357
|
if (!monthlyPrice) {
|
|
358
358
|
logging.info('Could not any active Monthly price - creating a new one');
|
|
359
|
-
|
|
359
|
+
|
|
360
360
|
const stripeProductsPage = await this.models.StripeProduct.findPage({ ...options, limit: 1 });
|
|
361
|
-
defaultStripeProduct = stripeProductsPage.data[0];
|
|
361
|
+
const defaultStripeProduct = stripeProductsPage.data[0];
|
|
362
362
|
const price = await this.api.createPrice({
|
|
363
363
|
currency: 'usd',
|
|
364
364
|
amount: 5000,
|
|
@@ -445,9 +445,9 @@ module.exports = class StripeMigrations {
|
|
|
445
445
|
|
|
446
446
|
if (!yearlyPrice) {
|
|
447
447
|
logging.info('Could not any active yearly price - creating a new one');
|
|
448
|
-
|
|
448
|
+
|
|
449
449
|
const stripeProductsPage = await this.models.StripeProduct.findPage({ ...options, limit: 1 });
|
|
450
|
-
defaultStripeProduct = stripeProductsPage.data[0];
|
|
450
|
+
const defaultStripeProduct = stripeProductsPage.data[0];
|
|
451
451
|
const price = await this.api.createPrice({
|
|
452
452
|
currency: 'usd',
|
|
453
453
|
amount: 500,
|
|
@@ -621,7 +621,7 @@ module.exports = class StripeMigrations {
|
|
|
621
621
|
});
|
|
622
622
|
if (invalidSubscriptions.length > 0) {
|
|
623
623
|
logging.warn(`Deleting ${invalidSubscriptions.length} invalid subscription(s)`);
|
|
624
|
-
for (
|
|
624
|
+
for (const sub of invalidSubscriptions) {
|
|
625
625
|
logging.warn(`Deleting subscription - ${sub.id} - no price found`);
|
|
626
626
|
await sub.destroy(options);
|
|
627
627
|
}
|
|
@@ -75,6 +75,7 @@ module.exports = {
|
|
|
75
75
|
setFromZip: async (zip, { copySettingsFrom } = {}) => {
|
|
76
76
|
const themeName = getStorage().getSanitizedFileName(zip.name.split('.zip')[0]);
|
|
77
77
|
const backupName = `${themeName}_${ObjectID()}`;
|
|
78
|
+
const stagingName = `${themeName}_${ObjectID()}`;
|
|
78
79
|
|
|
79
80
|
// check if zip name matches one of the default themes
|
|
80
81
|
if (zip.name === 'casper.zip' || zip.name === 'source.zip') {
|
|
@@ -111,6 +112,13 @@ module.exports = {
|
|
|
111
112
|
await customThemeSettings.api.copySettingsBetweenThemes(copySettingsFrom, themeName);
|
|
112
113
|
}
|
|
113
114
|
|
|
115
|
+
// CASE: copy the extracted theme in under a staging name first, so the live
|
|
116
|
+
// folder is only missing between the two renames below rather than for the whole copy
|
|
117
|
+
await getStorage().save({
|
|
118
|
+
name: stagingName,
|
|
119
|
+
path: checkedTheme.path,
|
|
120
|
+
});
|
|
121
|
+
|
|
114
122
|
const themeExists = await getStorage().exists(themeName);
|
|
115
123
|
// CASE: move the existing theme to a backup folder
|
|
116
124
|
if (themeExists) {
|
|
@@ -119,11 +127,7 @@ module.exports = {
|
|
|
119
127
|
await getStorage().rename(themeName, backupName);
|
|
120
128
|
}
|
|
121
129
|
|
|
122
|
-
|
|
123
|
-
await getStorage().save({
|
|
124
|
-
name: themeName,
|
|
125
|
-
path: checkedTheme.path,
|
|
126
|
-
});
|
|
130
|
+
await getStorage().rename(stagingName, themeName);
|
|
127
131
|
|
|
128
132
|
// CASE: loads the theme from the fs & sets the theme on the themeList
|
|
129
133
|
const loadedTheme = await themeLoader.loadOneTheme(themeName);
|
|
@@ -152,20 +156,9 @@ module.exports = {
|
|
|
152
156
|
}
|
|
153
157
|
|
|
154
158
|
// restore backup if we renamed an existing theme but saving failed
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
.then((themeExists) => {
|
|
159
|
-
if (!themeExists) {
|
|
160
|
-
return getStorage()
|
|
161
|
-
.rename(backupName, themeName)
|
|
162
|
-
.then(() => {
|
|
163
|
-
throw error;
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
throw error;
|
|
168
|
-
});
|
|
159
|
+
// awaited so the finally block can't delete the backup before it's restored
|
|
160
|
+
if (renamedExisting && !(await getStorage().exists(themeName))) {
|
|
161
|
+
await getStorage().rename(backupName, themeName);
|
|
169
162
|
}
|
|
170
163
|
|
|
171
164
|
throw error;
|
|
@@ -178,12 +171,14 @@ module.exports = {
|
|
|
178
171
|
});
|
|
179
172
|
}
|
|
180
173
|
|
|
181
|
-
// CASE: remove the backup
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
174
|
+
// CASE: remove the backup and any staging copy left behind by a failure
|
|
175
|
+
for (const leftover of [backupName, stagingName]) {
|
|
176
|
+
getStorage()
|
|
177
|
+
.delete(leftover)
|
|
178
|
+
.catch((err) => {
|
|
179
|
+
logging.error(new errors.InternalServerError({ err: err }));
|
|
180
|
+
});
|
|
181
|
+
}
|
|
187
182
|
}
|
|
188
183
|
},
|
|
189
184
|
destroy: async function (themeName) {
|
|
@@ -207,7 +202,7 @@ module.exports = {
|
|
|
207
202
|
});
|
|
208
203
|
}
|
|
209
204
|
|
|
210
|
-
|
|
205
|
+
const result = await getStorage().delete(themeName);
|
|
211
206
|
list.del(themeName);
|
|
212
207
|
return result;
|
|
213
208
|
},
|
|
@@ -78,8 +78,8 @@ class ThemeStorage extends LocalStorageBase {
|
|
|
78
78
|
* @param {string} destName
|
|
79
79
|
*/
|
|
80
80
|
rename(srcName, destName) {
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
const src = path.join(this.getTargetDir(), srcName);
|
|
82
|
+
const dest = path.join(this.getTargetDir(), destName);
|
|
83
83
|
|
|
84
84
|
return fs.move(src, dest);
|
|
85
85
|
}
|
|
@@ -8,11 +8,22 @@ 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
10
|
const schema_1 = require("../members-metafields/schema");
|
|
11
|
+
const members_metafields_1 = require("../members-metafields");
|
|
11
12
|
const checkout_1 = require("@tryghost/checkout");
|
|
12
13
|
const codec_1 = require("./codec");
|
|
13
14
|
const queries_1 = require("./queries");
|
|
14
15
|
const models_1 = require("./models");
|
|
15
16
|
const serializers_1 = require("./serializers");
|
|
17
|
+
/**
|
|
18
|
+
* What a member may do with a field this service creates for them.
|
|
19
|
+
*
|
|
20
|
+
* The opposite of the default a publisher-made field gets. These hold what the member
|
|
21
|
+
* themselves gave at checkout, and collection can be switched on while the screen for
|
|
22
|
+
* opening a field to members is not, since the two sit behind different flags. A closed
|
|
23
|
+
* default would then leave a member unable to correct their own address and nobody able
|
|
24
|
+
* to open it for them.
|
|
25
|
+
*/
|
|
26
|
+
const COLLECTED_FIELD_ACCESS = { member: members_metafields_1.MEMBER_ACCESS.write };
|
|
16
27
|
/**
|
|
17
28
|
* A request states its settings in named sections: one for shipping, one for phone. Each
|
|
18
29
|
* section stands for one or more of the values Stripe hands back when a checkout is
|
|
@@ -142,7 +153,12 @@ class TierCheckoutConfigService {
|
|
|
142
153
|
});
|
|
143
154
|
}
|
|
144
155
|
if (!alreadyPlanned) {
|
|
145
|
-
create.set(key, {
|
|
156
|
+
create.set(key, {
|
|
157
|
+
key,
|
|
158
|
+
name: wants.name,
|
|
159
|
+
type: wants.type,
|
|
160
|
+
access: COLLECTED_FIELD_ACCESS,
|
|
161
|
+
});
|
|
146
162
|
}
|
|
147
163
|
}
|
|
148
164
|
return { clear, create: [...create.values()], bind: wanted };
|
|
@@ -251,21 +251,21 @@ module.exports = class Tier {
|
|
|
251
251
|
});
|
|
252
252
|
}
|
|
253
253
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
254
|
+
const name = validateName(data.name);
|
|
255
|
+
|
|
256
|
+
const slug = validateSlug(data.slug);
|
|
257
|
+
const description = validateDescription(data.description);
|
|
258
|
+
const welcomePageURL = validateWelcomePageURL(data.welcomePageURL);
|
|
259
|
+
const status = validateStatus(data.status || 'active');
|
|
260
|
+
const visibility = validateVisibility(data.visibility || 'public');
|
|
261
|
+
const type = validateType(data.type || 'paid');
|
|
262
|
+
const currency = validateCurrency(data.currency || null, type);
|
|
263
|
+
const trialDays = validateTrialDays(data.trialDays || 0, type);
|
|
264
|
+
const monthlyPrice = validateMonthlyPrice(data.monthlyPrice || null, type);
|
|
265
|
+
const yearlyPrice = validateYearlyPrice(data.yearlyPrice || null, type);
|
|
266
|
+
const createdAt = validateCreatedAt(data.createdAt);
|
|
267
|
+
const updatedAt = validateUpdatedAt(data.updatedAt);
|
|
268
|
+
const benefits = validateBenefits(data.benefits);
|
|
269
269
|
|
|
270
270
|
const tier = new Tier({
|
|
271
271
|
id,
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getIngestConfig = getIngestConfig;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const StatsConfigSchema = zod_1.z.object({
|
|
6
|
+
id: zod_1.z.string().min(1).optional(),
|
|
7
|
+
});
|
|
8
|
+
const SiteUuidSchema = zod_1.z.string().min(1);
|
|
9
|
+
const SyncAuthKeySchema = zod_1.z.string().min(1);
|
|
10
|
+
const TrackerEndpointSchema = zod_1.z.url();
|
|
11
|
+
const ANALYTICS_PATH_PREFIX = '/.ghost/analytics/';
|
|
12
|
+
function getIngestConfig({ config, settingsCache, }) {
|
|
13
|
+
const trackerEndpointResult = TrackerEndpointSchema.safeParse(config.get('tinybird:tracker:endpoint'));
|
|
14
|
+
const syncAuthKeyResult = SyncAuthKeySchema.safeParse(config.get('tinybird:sync_auth_key'));
|
|
15
|
+
if (!trackerEndpointResult.success || !syncAuthKeyResult.success) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const endpoint = new URL(trackerEndpointResult.data);
|
|
19
|
+
const analyticsPathIndex = endpoint.pathname.indexOf(ANALYTICS_PATH_PREFIX);
|
|
20
|
+
if (analyticsPathIndex === -1) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
endpoint.pathname = `${endpoint.pathname.slice(0, analyticsPathIndex + ANALYTICS_PATH_PREFIX.length)}api/v1/tinybird-sync`;
|
|
24
|
+
const statsResult = StatsConfigSchema.safeParse(config.get('tinybird:stats'));
|
|
25
|
+
const settingsSiteUuidResult = SiteUuidSchema.safeParse(settingsCache.get('site_uuid'));
|
|
26
|
+
let siteUuid = statsResult.success ? statsResult.data.id : undefined;
|
|
27
|
+
if (!siteUuid && settingsSiteUuidResult.success) {
|
|
28
|
+
siteUuid = settingsSiteUuidResult.data;
|
|
29
|
+
}
|
|
30
|
+
if (!siteUuid) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
endpoint,
|
|
35
|
+
// secretlint-disable-next-line @secretlint/secretlint-rule-pattern
|
|
36
|
+
trafficAnalyticsAuth: syncAuthKeyResult.data,
|
|
37
|
+
siteUuid,
|
|
38
|
+
};
|
|
39
|
+
}
|