ghost 6.56.0 → 6.57.1
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/validate-adapters.js +74 -0
- package/bin/validate-adapters.ts +87 -0
- package/bin/warm-compile-cache.sh +60 -0
- package/components/tryghost-adapter-base-scheduling-0.2.1.tgz +0 -0
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-kg-converters-1.2.4.tgz +0 -0
- package/components/tryghost-kg-default-cards-10.3.4.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.1.5.tgz +0 -0
- package/components/tryghost-kg-default-transforms-1.3.3.tgz +0 -0
- package/components/tryghost-kg-html-to-lexical-1.3.3.tgz +0 -0
- package/components/tryghost-kg-lexical-html-renderer-1.4.3.tgz +0 -0
- package/components/tryghost-parse-email-address-0.0.0.tgz +0 -0
- package/core/app.js +1 -1
- package/core/boot.js +21 -25
- package/core/bridge.js +10 -12
- package/core/built/admin/assets/Combination-BDvCdg1t.js +41 -0
- package/core/built/admin/assets/about-BNojRaxf.js +1 -0
- package/core/built/admin/assets/{account-migration-D3O_yVck.js → account-migration-DMS8JsM-.js} +1 -1
- package/core/built/admin/assets/action-list-lGzZLHc8.js +1 -0
- package/core/built/admin/assets/activitypub/{account-migration-D8FbP-Z-.js → account-migration-DHFbePl6.js} +7 -7
- package/core/built/admin/assets/activitypub/activitypub.js +3 -3
- package/core/built/admin/assets/activitypub/{avatar-11EA1VSs.js → avatar-CT4tS2_S.js} +2 -2
- package/core/built/admin/assets/activitypub/{avatar-flipboard-jfbLG-xe.js → avatar-flipboard-ByYWKipo.js} +2 -2
- package/core/built/admin/assets/activitypub/{bluesky-sharing-f1jTQe2P.js → bluesky-sharing-srVnSHDz.js} +8 -8
- package/core/built/admin/assets/activitypub/{content-formatters-nmTOPY9M.js → content-formatters-C2sos5Ht.js} +3 -3
- package/core/built/admin/assets/activitypub/{copy-BCwo9ep3.js → copy-B1UBTOoZ.js} +2 -2
- package/core/built/admin/assets/activitypub/{dist-BEfX-0aW.js → dist-MPsb2WZ1.js} +4 -4
- package/core/built/admin/assets/activitypub/{domain-AaDlZlrA.js → domain-DzcM9Dzo.js} +9 -9
- package/core/built/admin/assets/activitypub/{edit-profile-DPi8Tl5M.js → edit-profile-CsQ_4xAk.js} +5 -5
- package/core/built/admin/assets/activitypub/{explore-CxTzjILQ.js → explore-CJe0DZBK.js} +8 -8
- package/core/built/admin/assets/activitypub/{feed-DPv5x2MX.js → feed-CKV3qWON.js} +9 -9
- package/core/built/admin/assets/activitypub/{field-DbgA8lat.js → field-DckHfDJf.js} +3 -3
- package/core/built/admin/assets/activitypub/{hash-BWuZoYkA.js → hash-Dlp8RM55.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-35VDQ2K2.js → inbox-CsPy4R0M.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-DSrF_i1O.js → inbox-DAsjzUUe.js} +10 -10
- package/core/built/admin/assets/activitypub/{label-CPjFBbo7.js → label-DWyo9E5T.js} +3 -3
- package/core/built/admin/assets/activitypub/layout-DM_3pqsU.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-BkDC1XVZ.js → moderation-B0Inc03M.js} +7 -7
- package/core/built/admin/assets/activitypub/{note-xEyH4xT-.js → note-CSE54lER.js} +7 -7
- package/core/built/admin/assets/activitypub/{notifications-DClaL3ui.js → notifications-RSwbKqdh.js} +9 -9
- package/core/built/admin/assets/activitypub/{preferences-DpnOa-4Z.js → preferences-CE231n2_.js} +11 -11
- package/core/built/admin/assets/activitypub/{profile-Dvi9mz-6.js → profile-aaQ1j1Eo.js} +13 -13
- package/core/built/admin/assets/activitypub/{reply-Cs9ySd6Z.js → reply-Cjb0Vs3m.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-DFBeTnfn.js → routes-Djb0mc9k.js} +26 -26
- package/core/built/admin/assets/activitypub/{separator-C5u_VjzY.js → separator-D8pROI5n.js} +3 -3
- package/core/built/admin/assets/activitypub/{settings-CV2fFu6D.js → settings-DMc32IQl.js} +5 -5
- package/core/built/admin/assets/activitypub/{site-_TgDd_EM.js → site-DVIcsohX.js} +4 -4
- package/core/built/admin/assets/activitypub/{step-1-BfnNL2oF.js → step-1-9Yey9usF.js} +5 -5
- package/core/built/admin/assets/activitypub/{step-2-DLndZkO-.js → step-2-DdYmKRXV.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-3-A-PZTtRE.js → step-3-hdSkcjZU.js} +10 -10
- package/core/built/admin/assets/activitypub/{tabs-BUbz7tea.js → tabs-CUqseYzQ.js} +6 -6
- package/core/built/admin/assets/activitypub/{topic-filter-BdX_xYYT.js → topic-filter-Coni6OXM.js} +3 -3
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-EwuRemHh.js → use-activity-pub-queries-MeHTPMQv.js} +2 -2
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-cy4ACBc4.js → use-navigate-with-base-path-B046AM38.js} +24 -7
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-CyFcGfan.js → use-reply-chain-data-1AO-Xob6.js} +5 -5
- package/core/built/admin/assets/activitypub/{x-7zk8mV2p.js → x-BRfRYd16.js} +2 -2
- package/core/built/admin/assets/add-integration-modal-DU9ghGLS.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-DFxuQrYu.js +1 -0
- package/core/built/admin/assets/add-recommendation-modal-D-3LOrdd.js +1 -0
- package/core/built/admin/assets/analytics-DTIMRhWw.js +1 -0
- package/core/built/admin/assets/announcement-bar-modal-DGCcezB6.js +1 -0
- package/core/built/admin/assets/api-keys-Dx4NeNpK.js +1 -0
- package/core/built/admin/assets/api-keys-_iCT4dxr.js +1 -0
- package/core/built/admin/assets/{audience-CkBb2LlO.js → audience-DkknNqhZ.js} +1 -1
- package/core/built/admin/assets/automated-emails-PayPCT8L.js +1 -0
- package/core/built/admin/assets/{automations-DhKeS_U5.js → automations-162q5HjL.js} +1 -1
- package/core/built/admin/assets/{automations-cMllU545.js → automations-DvSU7QhW.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-DPGpyD-G.js → bluesky-sharing-yZ9A_jL8.js} +1 -1
- package/core/built/admin/assets/brand-icon-09YqFZjV.js +1 -0
- package/core/built/admin/assets/{breadcrumb-DIfcF5ow.js → breadcrumb-CjOH7LCU.js} +1 -1
- package/core/built/admin/assets/{chart-helpers-DV0FkdcD.js → chart-helpers-DGxvWnBT.js} +1 -1
- package/core/built/admin/assets/checkbox-BSUcnNq_.js +1 -0
- package/core/built/admin/assets/{chunk.332.05991a101d67f732dec3.js → chunk.424.4a27628efdade15c2dab.js} +28 -27
- package/core/built/admin/assets/chunk.524.dce1c51e0bc30fb2718e.js +25 -0
- package/core/built/admin/assets/{chunk.211.6f7328d63c41536451b3.js → chunk.571.40f093ed6d883993714e.js} +5 -5
- package/core/built/admin/assets/chunk.582.3a430d5c6a744fd475b6.js +27 -0
- package/core/built/admin/assets/code-editor-view-BcyKABrG.js +1 -0
- package/core/built/admin/assets/color-picker-field-8NoSnhNI.js +1 -0
- package/core/built/admin/assets/color-utils-Dzeeuj1F.js +1 -0
- package/core/built/admin/assets/combobox-5rdgDrDV.js +1 -0
- package/core/built/admin/assets/command-BOYMbZa_.js +1 -0
- package/core/built/admin/assets/comments-BhNM5CYl.js +1 -0
- package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +1 -0
- package/core/built/admin/assets/confirmation-modal-CYD7x3UQ.js +1 -0
- package/core/built/admin/assets/content-api-modal-BtW4Z1-1.js +1 -0
- package/core/built/admin/assets/copy-field-CEp_XieW.js +1 -0
- package/core/built/admin/assets/currency-Dy4Tc2R2.js +1 -0
- package/core/built/admin/assets/custom-integration-modal-bk3lNEuQ.js +1 -0
- package/core/built/admin/assets/{date-range-select-dXc-GsVe.js → date-range-select-B3Ij1Rqg.js} +1 -1
- package/core/built/admin/assets/debounce-Cx5B_9OI.js +3 -0
- package/core/built/admin/assets/design-and-theme-modal-B2xYKS1I.js +23 -0
- package/core/built/admin/assets/dirty-confirm-dialog-YE9L21gY.js +1 -0
- package/core/built/admin/assets/disabled-sources-indicator-uIzbWL7K.js +1 -0
- package/core/built/admin/assets/{dist-pHiOxyxa.js → dist-ARN6XTcR.js} +1 -1
- package/core/built/admin/assets/dist-B2PvRwLn.js +1 -0
- package/core/built/admin/assets/{dist-DyViJwIy.js → dist-Bg8bSvLA.js} +3 -3
- package/core/built/admin/assets/dist-CsvXCJSe.js +23 -0
- package/core/built/admin/assets/dist-DlCyLrOC.js +1 -0
- package/core/built/admin/assets/dist-j1xxxnY8.js +1 -0
- package/core/built/admin/assets/dist-myQaY0ka.js +1 -0
- package/core/built/admin/assets/{domain-B5ogXUBa.js → domain-DzrOAPY8.js} +1 -1
- package/core/built/admin/assets/{dropzone-BnFG7dDP.js → dropzone-CzhP33wa.js} +1 -1
- package/core/built/admin/assets/{edit-profile-B07jCZy9.js → edit-profile-oufs4R4n.js} +1 -1
- package/core/built/admin/assets/editor-BBKrunMK.js +8 -0
- package/core/built/admin/assets/embed-signup-form-modal-Ch3s6lqA.js +9 -0
- package/core/built/admin/assets/{explore-Ca1y8HW_.js → explore-CA-R01Br.js} +1 -1
- package/core/built/admin/assets/{feed-x4iFMBP4.js → feed-ClC8_Gld.js} +1 -1
- package/core/built/admin/assets/{field-ChCAabZg.js → field-B3OPenbP.js} +1 -1
- package/core/built/admin/assets/{filter-sources-LdtH1e-T.js → filter-sources-CiPLnG9A.js} +1 -1
- package/core/built/admin/assets/filters-Bz0HsRie.js +1 -0
- package/core/built/admin/assets/{filters-CjVKRP8U.js → filters-yFvybRMe.js} +1 -1
- package/core/built/admin/assets/first-promoter-modal-BC0UpYCD.js +1 -0
- package/core/built/admin/assets/format-url-C-t8G6Qd.js +1 -0
- package/core/built/admin/assets/{ghost-7f01131115186d1af84ead76e79646dd.js → ghost-d683fbeb945b13155ea669caa5d8db41.js} +300 -298
- package/core/built/admin/assets/{gift-link-modal-Buqh2vXh.js → gift-link-modal-BKRuqo-k.js} +1 -1
- package/core/built/admin/assets/{gift-links-CsUhefWG.js → gift-links-CVuqLhsZ.js} +1 -1
- package/core/built/admin/assets/global-data-provider-RzW6Bnlf.js +1 -0
- package/core/built/admin/assets/grid-CUciBfjf.js +1 -0
- package/core/built/admin/assets/{growth-DajOBdN0.js → growth-ClNAldfL.js} +1 -1
- package/core/built/admin/assets/{growth-Dy2UOSay.js → growth-Dz8OSG06.js} +2 -2
- package/core/built/admin/assets/history-modal-DIVuQ5Ct.js +1 -0
- package/core/built/admin/assets/{hooks-CixO01lL.js → hooks-D6EE7BIt.js} +2 -2
- package/core/built/admin/assets/html-field-CVZ2sMxw.js +1 -0
- package/core/built/admin/assets/iframe-buffering-e8vH4-Qn.js +1 -0
- package/core/built/admin/assets/images-Ok8FFJ3A.js +1 -0
- package/core/built/admin/assets/{inbox-BUOLDoji.js → inbox-CMUVI6qb.js} +13 -13
- package/core/built/admin/assets/index-DUXM0NlS.js +67 -0
- package/core/built/admin/assets/index-Ds2iUoF6.css +1 -0
- package/core/built/admin/assets/index.es-B9tvf-t4.js +1 -0
- package/core/built/admin/assets/{input-group-uSK3XT7b.js → input-group-2XU-iuh_.js} +1 -1
- package/core/built/admin/assets/integration-header-B4DyXV06.js +1 -0
- package/core/built/admin/assets/integrations-BT6_iJvu.js +1 -0
- package/core/built/admin/assets/invite-user-modal-DrZ7xxrZ.js +1 -0
- package/core/built/admin/assets/isEmail-BOfC647y.js +1 -0
- package/core/built/admin/assets/koenig-editor-base-BPj4S760.js +1 -0
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +9254 -9251
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +124 -124
- package/core/built/admin/assets/{koenig-lexical-BFc4yFed.js → koenig-lexical-Cdjv-m3_.js} +98 -98
- package/core/built/admin/assets/{kpi-card-CCt-qeWD.js → kpi-card-J8Mj1sDX.js} +1 -1
- package/core/built/admin/assets/{kpi-card-BN-E6WYX.js → kpi-card-awos0BMH.js} +1 -1
- package/core/built/admin/assets/{kpi-helpers-DlxTbTs4.js → kpi-helpers-SEhvH-8E.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-BlcUttpn.js → kpi-tabs-R6BjsKhd.js} +1 -1
- package/core/built/admin/assets/{label-AVrxwmsz.js → label-BMC3dzLI.js} +1 -1
- package/core/built/admin/assets/label-picker-Bnlru5tO.js +1 -0
- package/core/built/admin/assets/{labels-DAIqKed7.js → labels-DAPjKPy2.js} +1 -1
- package/core/built/admin/assets/layout-yR9rlvEw.js +1 -0
- package/core/built/admin/assets/limit-modal-COmLevuY.js +1 -0
- package/core/built/admin/assets/{link-helpers-D9LsDOkG.js → link-helpers-Bzkk68GD.js} +1 -1
- package/core/built/admin/assets/member-custom-fields-BvFKEpxJ.js +1 -0
- package/core/built/admin/assets/member-detail-CWdPAe3p.js +1 -0
- package/core/built/admin/assets/members-Bnt0ih2R.js +11 -0
- package/core/built/admin/assets/modal-page-BMTzFHVO.js +1 -0
- package/core/built/admin/assets/{moderation-CQ3urTFE.js → moderation-mPjYHgZW.js} +1 -1
- package/core/built/admin/assets/multi-select-combobox-CsoyHAiX.js +1 -0
- package/core/built/admin/assets/navigation-modal-D_c0badj.js +1 -0
- package/core/built/admin/assets/newsletter-DR49NyGS.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-B45pL1pb.js +1 -0
- package/core/built/admin/assets/newsletter-emails-B-OLfrvr.js +1 -0
- package/core/built/admin/assets/{newsletters-vt3Ni1Ov.js → newsletters-DGs5BaKH.js} +1 -1
- package/core/built/admin/assets/{newsletters-BXJbJgA-.js → newsletters-Du0lzskS.js} +1 -1
- package/core/built/admin/assets/{note-Dk877BTv.js → note-CSVsUKBm.js} +1 -1
- package/core/built/admin/assets/{notifications-CPlLjPxO.js → notifications-DV9FRtDw.js} +1 -1
- package/core/built/admin/assets/{offers-DEniVRD5.js → offers-Um6ab71O.js} +1 -1
- package/core/built/admin/assets/offers-container-modal-B0hFS8nk.js +1 -0
- package/core/built/admin/assets/{onboarding-route-DdStOtjy.js → onboarding-route--jL5KLPD.js} +1 -1
- package/core/built/admin/assets/overview-B-ZPNqMo.js +1 -0
- package/core/built/admin/assets/overview-D96iwoJi.js +1 -0
- package/core/built/admin/assets/{page-header-pp4dWmOS.js → page-header-DAvDYKO9.js} +1 -1
- package/core/built/admin/assets/{pages-B4goRPUn.js → pages-BVMnpI2O.js} +1 -1
- package/core/built/admin/assets/pintura-modal-jiUCxX0Q.js +1 -0
- package/core/built/admin/assets/portal-frame-D4D4nEO6.js +1 -0
- package/core/built/admin/assets/portal-modal-BLFdYeDH.js +1 -0
- package/core/built/admin/assets/{post-analytics-BMJrI81R.js → post-analytics-BhAtiFJp.js} +1 -1
- package/core/built/admin/assets/post-analytics-header-DK27VjJm.js +1 -0
- package/core/built/admin/assets/{post-analytics-provider-Btml5vJI.js → post-analytics-provider-DGg0FUqs.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-AcUZkbfL.js → post-share-modal-DtFAC132.js} +1 -1
- package/core/built/admin/assets/{posts-DhXE7b6r.js → posts-CxG7v0-M.js} +1 -1
- package/core/built/admin/assets/preferences-CuWLISHa.js +5 -0
- package/core/built/admin/assets/preview-chrome-BOVO6_PE.js +1 -0
- package/core/built/admin/assets/preview-modal-DctYx20m.js +1 -0
- package/core/built/admin/assets/profile-BsKYYtuL.js +1 -0
- package/core/built/admin/assets/radio-group-CI5_Kf_d.js +1 -0
- package/core/built/admin/assets/{referrers-pmJT4k3-.js → referrers-B9QDAfYm.js} +1 -1
- package/core/built/admin/assets/{router-provider-BmEZf6c6.js → router-provider-DSQfprxH.js} +1 -1
- package/core/built/admin/assets/select-CkXqNJDJ.js +1 -0
- package/core/built/admin/assets/settings-B4vM-rgV.js +4 -0
- package/core/built/admin/assets/{settings-BGgk7oCI.js → settings-ZCj-W56o.js} +1 -1
- package/core/built/admin/assets/settings-breadcrumbs-DIq31FwA.js +1 -0
- package/core/built/admin/assets/{share-modal-BeuydaBf.js → share-modal-BNj14g79.js} +1 -1
- package/core/built/admin/assets/slack-modal-C6SpMQ-q.js +1 -0
- package/core/built/admin/assets/social-urls-CHQ9cTAK.js +1 -0
- package/core/built/admin/assets/{sort-button-Df4t2AL8.js → sort-button-B-k54ow2.js} +1 -1
- package/core/built/admin/assets/{source-icon-ajoaKb41.js → source-icon-Cej3sZM6.js} +1 -1
- package/core/built/admin/assets/{stats-C_lfxZAw.js → stats-B2KW8E2y.js} +1 -1
- package/core/built/admin/assets/{stats-view-Cxot1iD8.js → stats-view-CVzU2-p5.js} +1 -1
- package/core/built/admin/assets/{step-1-ogAA4lDr.js → step-1-Dbn1iIMU.js} +1 -1
- package/core/built/admin/assets/{step-2-C5Xini-7.js → step-2-BahnSuN6.js} +1 -1
- package/core/built/admin/assets/{step-3-CZv1FV81.js → step-3-CW04e2ZJ.js} +2 -2
- package/core/built/admin/assets/stripe-button-BkBZqaGG.js +1 -0
- package/core/built/admin/assets/stripe-connect-modal-CYDDrSJm.js +1 -0
- package/core/built/admin/assets/switch-CE2NuMn-.js +1 -0
- package/core/built/admin/assets/{table-DFj1wiYv.js → table-BtLcEi1M.js} +1 -1
- package/core/built/admin/assets/tabs-BaWRfg8j.js +1 -0
- package/core/built/admin/assets/tag-detail-CmqiC32L.js +1 -0
- package/core/built/admin/assets/tags-BbygUvNB.js +1 -0
- package/core/built/admin/assets/tags-BwCgmr5v.js +1 -0
- package/core/built/admin/assets/testimonials-modal--bdzppyh.js +1 -0
- package/core/built/admin/assets/tier-detail-modal-BZmAsIy4.js +1 -0
- package/core/built/admin/assets/{tiers-DYsa4DCo.js → tiers-Da6kxHQP.js} +1 -1
- package/core/built/admin/assets/toggle-group-CVl-Xigr.js +1 -0
- package/core/built/admin/assets/{topic-filter-DGDxDalo.js → topic-filter-BoRHRbL1.js} +1 -1
- package/core/built/admin/assets/transistor-modal-CBPDqEGy.js +1 -0
- package/core/built/admin/assets/unsplash-modal-CixoRAO2.js +1 -0
- package/core/built/admin/assets/{use-analytics-data-C76v4LIp.js → use-analytics-data-BiWvcf1u.js} +1 -1
- package/core/built/admin/assets/use-check-theme-limit-error-B14lZukR.js +2 -0
- package/core/built/admin/assets/use-feature-flag-BmJoc5WN.js +1 -0
- package/core/built/admin/assets/use-filter-params-ChoV72Hw.js +1 -0
- package/core/built/admin/assets/use-filterable-api-iMpDZBxD.js +1 -0
- package/core/built/admin/assets/use-form-vRjI0Kwk.js +1 -0
- package/core/built/admin/assets/{use-growth-stats-aNXJOmQr.js → use-growth-stats-Dom8xVzo.js} +1 -1
- package/core/built/admin/assets/use-hash-link-navigation-guard-B9j6HIrV.js +1 -0
- package/core/built/admin/assets/use-limiter-Dwg8ivgQ.js +2 -0
- package/core/built/admin/assets/use-pintura-config-Bj4QmiVk.js +1 -0
- package/core/built/admin/assets/use-pintura-editor-DvrslmPE.js +1 -0
- package/core/built/admin/assets/{use-post-referrers-CG0SZioj.js → use-post-referrers-pxIHTXFs.js} +1 -1
- package/core/built/admin/assets/use-query-params-DHhhu8wi.js +1 -0
- package/core/built/admin/assets/{use-reply-chain-data-RLdPKRmS.js → use-reply-chain-data-CmFe0N6F.js} +1 -1
- package/core/built/admin/assets/use-setting-group-Cmp_sy-d.js +1 -0
- package/core/built/admin/assets/use-settings-navigation-BmROPrls.js +1 -0
- package/core/built/admin/assets/{use-simple-pagination-DgcF69KI.js → use-simple-pagination-D5rL3YwO.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-query-C1R_Kbmy.js → use-tinybird-query-DP2dMaq7.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-C9fPjVM_.js → use-tinybird-token-DrK_skPQ.js} +1 -1
- package/core/built/admin/assets/use-url-input-ChrUZBFf.js +5 -0
- package/core/built/admin/assets/user-detail-modal-XODpOqNC.js +1 -0
- package/core/built/admin/assets/{users-Dkv8NQZe.js → users-B6hIds6n.js} +1 -1
- package/core/built/admin/assets/validator-Cr0sMKuW.js +7 -0
- package/core/built/admin/assets/{virtual-list-BmTUzeoF.js → virtual-list-Dnoafqbk.js} +1 -1
- package/core/built/admin/assets/web-D71mjB2r.js +1 -0
- package/core/built/admin/assets/web-z71lA1Y3.js +2 -0
- package/core/built/admin/assets/zapier-modal-Bp507Um7.js +1 -0
- package/core/built/admin/index.html +16 -14
- package/core/frontend/helpers/authors.js +1 -1
- package/core/frontend/helpers/link.js +3 -8
- package/core/frontend/helpers/tags.js +1 -1
- package/core/frontend/meta/author-url.js +2 -2
- package/core/frontend/meta/url.js +4 -4
- package/core/frontend/services/proxy.js +1 -1
- package/core/frontend/services/routing/events.js +20 -6
- package/core/frontend/services/routing/permalink-adapter.js +0 -13
- package/core/frontend/services/routing/permalink-adapter.ts +0 -13
- package/core/frontend/services/routing/router-manager.js +15 -9
- package/core/frontend/services/sitemap/base-site-map-generator.js +1 -28
- package/core/frontend/services/sitemap/site-map-manager.js +22 -57
- package/core/frontend/web/middleware/admin-toolbar.js +1 -1
- package/core/frontend/web/middleware/serve-indexnow-key.js +1 -7
- package/core/server/adapters/route-settings/utils.js +10 -2
- package/core/server/adapters/route-settings/utils.ts +12 -2
- package/core/server/api/endpoints/email-post.js +1 -1
- package/core/server/api/endpoints/index.js +2 -2
- package/core/server/api/endpoints/previews.js +1 -1
- package/core/server/api/endpoints/search-index-public.js +3 -3
- package/core/server/api/endpoints/search-index.js +4 -4
- package/core/server/api/endpoints/themes.js +6 -1
- package/core/server/api/endpoints/utils/serializers/input/authors.js +2 -2
- package/core/server/api/endpoints/utils/serializers/input/comments.js +1 -1
- package/core/server/api/endpoints/utils/serializers/input/pages.js +3 -3
- package/core/server/api/endpoints/utils/serializers/input/posts.js +3 -3
- package/core/server/api/endpoints/utils/serializers/input/tags.js +1 -1
- package/core/server/api/endpoints/utils/serializers/input/users.js +2 -2
- package/core/server/api/endpoints/utils/serializers/input/utils/url.js +31 -13
- package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +2 -2
- package/core/server/api/endpoints/utils/serializers/output/mappers/tags.js +2 -2
- package/core/server/api/endpoints/utils/serializers/output/mappers/users.js +8 -0
- package/core/server/api/endpoints/utils/serializers/output/utils/url.js +18 -11
- package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +74 -0
- package/core/server/data/migrations/versions/6.57/2026-08-04-18-54-14-reset-automation-email-analytics.js +25 -0
- package/core/server/data/schema/commands.js +21 -5
- package/core/server/data/schema/schema.js +24 -5
- package/core/server/lib/common/to-plain.ts +1 -1
- package/core/server/models/base/plugins/overrides.js +7 -5
- package/core/server/models/post.js +2 -2
- package/core/server/services/adapter-manager/adapter-manager.js +1 -45
- package/core/server/services/adapter-manager/adapter-manager.ts +2 -48
- package/core/server/services/adapter-manager/adapter-paths.js +28 -0
- package/core/server/services/adapter-manager/adapter-paths.ts +26 -0
- package/core/server/services/adapter-manager/base-classes.js +22 -0
- package/core/server/services/adapter-manager/base-classes.ts +22 -0
- package/core/server/services/adapter-manager/index.js +4 -27
- package/core/server/services/adapter-manager/index.ts +4 -31
- package/core/server/services/adapter-manager/utils.js +50 -0
- package/core/server/services/adapter-manager/utils.ts +57 -0
- package/core/server/services/audience-feedback/audience-feedback-controller.js +11 -2
- package/core/server/services/audience-feedback/audience-feedback-service.js +2 -2
- package/core/server/services/audience-feedback/feedback-repository.js +4 -1
- package/core/server/services/auth/session/session-service.js +18 -3
- package/core/server/services/automations/database-automations-repository.js +5 -5
- package/core/server/services/automations/database-automations-repository.ts +12 -12
- package/core/server/services/automations/database-date.js +52 -3
- package/core/server/services/automations/database-date.ts +23 -2
- package/core/server/services/automations/service.js +2 -2
- package/core/server/services/automations/service.ts +2 -2
- package/core/server/services/comments/comments-service-emails.js +1 -1
- package/core/server/services/comments/comments-service.js +1 -1
- package/core/server/services/email-analytics/email-analytics-service-wrapper.js +12 -3
- package/core/server/services/email-analytics/email-analytics-service.js +4 -3
- package/core/server/services/email-analytics/index.js +2 -3
- package/core/server/services/email-analytics/index.ts +1 -2
- package/core/server/services/email-analytics/lib/queries.js +91 -124
- package/core/server/services/email-analytics/lib/queries.ts +341 -0
- package/core/server/services/email-service/email-service-wrapper.js +2 -1
- package/core/server/services/email-service/mailgun-email-provider.js +15 -0
- package/core/server/services/indexnow-ping/index.js +0 -2
- package/core/server/services/indexnow-ping/index.ts +0 -2
- package/core/server/services/indexnow-ping/indexnow-ping-service.js +6 -8
- package/core/server/services/indexnow-ping/indexnow-ping-service.ts +9 -17
- package/core/server/services/lib/mailgun-client.js +3 -3
- package/core/server/services/media-inliner/external-media-inliner.js +12 -8
- package/core/server/services/member-attribution/url-translator.js +5 -7
- package/core/server/services/member-welcome-emails/service.js +72 -12
- package/core/server/services/members/api.js +1 -1
- package/core/server/services/members/import-export/import/completion-email.js +8 -4
- package/core/server/services/members/import-export/import/completion-email.ts +9 -4
- package/core/server/services/members/import-export/import/importer.js +25 -4
- package/core/server/services/members/import-export/import/importer.ts +26 -6
- package/core/server/services/members/import-export/import/row.ts +5 -1
- package/core/server/services/members/import-export/index.js +1 -5
- package/core/server/services/members/import-export/index.ts +2 -6
- package/core/server/services/members/members-api/repositories/member-repository.js +51 -0
- package/core/server/services/members-custom-fields/queries.js +4 -13
- package/core/server/services/members-custom-fields/queries.ts +4 -13
- package/core/server/services/members-custom-fields/schema.js +18 -27
- package/core/server/services/members-custom-fields/schema.ts +17 -27
- package/core/server/services/members-custom-fields/storage.js +94 -27
- package/core/server/services/members-custom-fields/storage.ts +114 -39
- package/core/server/services/members-custom-fields/values-service.js +98 -219
- package/core/server/services/members-custom-fields/values-service.ts +110 -238
- package/core/server/services/mentions/resource-service.js +1 -1
- package/core/server/services/mentions/service.js +2 -2
- package/core/server/services/route-settings/dynamic-routing-service.js +9 -59
- package/core/server/services/slack-notifications/slack-notifications.js +2 -2
- package/core/server/services/slack-ping/index.js +1 -1
- package/core/server/services/slack-ping/index.ts +1 -1
- package/core/server/services/slack-ping/slack-ping-service.js +3 -2
- package/core/server/services/slack-ping/slack-ping-service.ts +4 -5
- package/core/server/services/stats/content-stats-service.js +3 -3
- package/core/server/services/stats/members-stats-service.js +0 -7
- package/core/server/services/stats/posts-stats-service.js +2 -2
- package/core/server/services/themes/storage.js +19 -2
- package/core/server/services/url/config.js +90 -135
- package/core/server/services/url/index.js +6 -49
- package/core/server/services/url/lazy-find-resource.js +14 -11
- package/core/server/services/url/lazy-find-resource.ts +14 -11
- package/core/server/services/url/lazy-url-service.js +174 -94
- package/core/server/services/url/lazy-url-service.ts +233 -97
- package/core/server/services/url/routable-resources.js +62 -71
- package/core/server/services/url/router-filter.js +12 -4
- package/core/server/services/url/router-filter.ts +12 -4
- package/core/server/services/webhooks/index.js +1 -1
- package/core/server/services/webhooks/serialize.js +12 -2
- package/core/server/web/api/endpoints/admin/routes.js +2 -2
- package/core/shared/config/env/config.testing-mysql.json +1 -2
- package/core/shared/config/env/config.testing.json +1 -2
- package/core/shared/custom-theme-settings-cache/custom-theme-settings-bread-service.js +4 -0
- package/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js +39 -0
- package/core/shared/events/index.js +1 -2
- package/core/shared/labs.js +4 -4
- package/package.json +10 -11
- package/pnpm-lock.yaml +44 -47
- package/pnpm-workspace.yaml +19 -19
- package/tsconfig.json +1 -0
- package/components/tryghost-adapter-base-scheduling-0.2.0.tgz +0 -0
- package/components/tryghost-kg-converters-1.2.3.tgz +0 -0
- package/components/tryghost-kg-default-cards-10.3.3.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.1.4.tgz +0 -0
- package/core/built/admin/assets/Combination-BCm9FL4o.js +0 -41
- package/core/built/admin/assets/activitypub/layout-CTgrezN7.js +0 -1
- package/core/built/admin/assets/automated-emails-6t2bIRWf.js +0 -7
- package/core/built/admin/assets/checkbox-BIl077a0.js +0 -1
- package/core/built/admin/assets/chunk.524.87b52f4fada529df2c4c.js +0 -25
- package/core/built/admin/assets/chunk.582.340bcca873e806cbd4bb.js +0 -27
- package/core/built/admin/assets/code-editor-view-C0aWNwdl.js +0 -1
- package/core/built/admin/assets/comments-qwhIjH3c.js +0 -1
- package/core/built/admin/assets/disabled-sources-indicator-DYAXW-6V.js +0 -1
- package/core/built/admin/assets/dist-BUKmD51u.js +0 -1
- package/core/built/admin/assets/dist-CNlMj7ML.js +0 -1
- package/core/built/admin/assets/dist-DDY6GRVz.js +0 -1
- package/core/built/admin/assets/dist-DG78yroX.js +0 -23
- package/core/built/admin/assets/editor-DDYSOXGN.js +0 -8
- package/core/built/admin/assets/esm-CFX93H5M.js +0 -2
- package/core/built/admin/assets/filters-CLehPo_D.js +0 -1
- package/core/built/admin/assets/index-08n05-rc.js +0 -67
- package/core/built/admin/assets/index-DgUzgFvS.css +0 -1
- package/core/built/admin/assets/label-picker-DVnpu_IF.js +0 -1
- package/core/built/admin/assets/layout-B0YLh7R9.js +0 -1
- package/core/built/admin/assets/member-custom-fields-C8NpZYza.js +0 -1
- package/core/built/admin/assets/member-detail-CIVAdKXf.js +0 -1
- package/core/built/admin/assets/members-oLPiSkXD.js +0 -10
- package/core/built/admin/assets/modals-CB7v-k3T.js +0 -31
- package/core/built/admin/assets/newsletter-rbeDX9Wk.js +0 -1
- package/core/built/admin/assets/overview--4V-kx9c.js +0 -1
- package/core/built/admin/assets/overview-DSLv30oz.js +0 -1
- package/core/built/admin/assets/post-analytics-header-pU2m9ZuV.js +0 -1
- package/core/built/admin/assets/preferences-Ru4CRPHC.js +0 -5
- package/core/built/admin/assets/profile-BNb1oj7D.js +0 -1
- package/core/built/admin/assets/select-B0HteHrp.js +0 -1
- package/core/built/admin/assets/settings-B1C9Q3wo.js +0 -4
- package/core/built/admin/assets/social-urls-DA2lXrhW.js +0 -8
- package/core/built/admin/assets/switch-CyQcwMAv.js +0 -1
- package/core/built/admin/assets/tabs-D4y1gqUd.js +0 -1
- package/core/built/admin/assets/tags-Dmft-Y4O.js +0 -1
- package/core/built/admin/assets/toggle-group-R2QMFvXW.js +0 -1
- package/core/built/admin/assets/use-filter-params-WrdhAISv.js +0 -1
- package/core/built/admin/assets/web-BqW0b0_C.js +0 -1
- package/core/built/admin/assets/web-Cy5GKMWM.js +0 -2
- package/core/server/services/email-analytics/jobs/update-member-email-analytics/index.js +0 -14
- package/core/server/services/url/local-file-cache.js +0 -75
- package/core/server/services/url/queue.js +0 -260
- package/core/server/services/url/resource.js +0 -102
- package/core/server/services/url/resources.js +0 -480
- package/core/server/services/url/url-generator.js +0 -276
- package/core/server/services/url/url-service-facade.js +0 -366
- package/core/server/services/url/url-service-facade.ts +0 -519
- package/core/server/services/url/url-service.js +0 -387
- package/core/server/services/url/urls.js +0 -140
- package/core/shared/events/url-resource-updated-event.js +0 -33
- /package/core/built/admin/assets/{chunk.211.6f7328d63c41536451b3.js.LICENSE.txt → chunk.571.40f093ed6d883993714e.js.LICENSE.txt} +0 -0
- /package/core/built/admin/assets/{dist-CqO2lWS0.js → dist-CqO2lWS02.js} +0 -0
- /package/core/server/api/endpoints/{gift-reminders.js → gifts.js} +0 -0
|
@@ -465,13 +465,13 @@ async function findNextPendingReadyAt(trx, staleLockCutoff) {
|
|
|
465
465
|
})
|
|
466
466
|
.orderBy('ready_at')
|
|
467
467
|
.first();
|
|
468
|
-
return row?.next_ready_at ?
|
|
468
|
+
return row?.next_ready_at ? (0, database_date_1.fromDatabaseDate)(row.next_ready_at) : null;
|
|
469
469
|
}
|
|
470
470
|
function buildStepToRun(row) {
|
|
471
471
|
const base = {
|
|
472
472
|
id: row.id,
|
|
473
473
|
step_attempts: row.step_attempts,
|
|
474
|
-
ready_at:
|
|
474
|
+
ready_at: (0, database_date_1.fromDatabaseDate)(row.ready_at),
|
|
475
475
|
locked_by: row.locked_by,
|
|
476
476
|
automation_run_id: row.automation_run_id,
|
|
477
477
|
automation_id: row.automation_id,
|
|
@@ -897,8 +897,8 @@ function getNextRevisionCreatedAt(latestCreatedAt, requestedCreatedAt) {
|
|
|
897
897
|
if (!latestCreatedAt) {
|
|
898
898
|
return (0, database_date_1.toDatabaseDate)(requestedCreatedAt);
|
|
899
899
|
}
|
|
900
|
-
const requestedTime =
|
|
901
|
-
const latestTime =
|
|
900
|
+
const requestedTime = (0, database_date_1.fromDatabaseDate)(requestedCreatedAt).getTime();
|
|
901
|
+
const latestTime = (0, database_date_1.fromDatabaseDate)(latestCreatedAt).getTime();
|
|
902
902
|
if (requestedTime > latestTime) {
|
|
903
903
|
return (0, database_date_1.toDatabaseDate)(requestedCreatedAt);
|
|
904
904
|
}
|
|
@@ -979,7 +979,7 @@ function buildAutomationSummary(automation) {
|
|
|
979
979
|
};
|
|
980
980
|
}
|
|
981
981
|
function serializeDate(date) {
|
|
982
|
-
const normalizedDate =
|
|
982
|
+
const normalizedDate = (0, database_date_1.fromDatabaseDate)(date);
|
|
983
983
|
normalizedDate.setMilliseconds(0);
|
|
984
984
|
return normalizedDate.toISOString();
|
|
985
985
|
}
|
|
@@ -21,7 +21,7 @@ import type {
|
|
|
21
21
|
EditAutomationData,
|
|
22
22
|
Page
|
|
23
23
|
} from './automations-repository';
|
|
24
|
-
import {toDatabaseDate} from './database-date';
|
|
24
|
+
import {fromDatabaseDate, toDatabaseDate, type DatabaseDate} from './database-date';
|
|
25
25
|
import {getStaleLockCutoff} from './stale-lock-cutoff';
|
|
26
26
|
import type {ExclusifyUnion, ReadonlyDeep} from 'type-fest';
|
|
27
27
|
|
|
@@ -48,8 +48,8 @@ interface AutomationRow {
|
|
|
48
48
|
slug: string;
|
|
49
49
|
name: string;
|
|
50
50
|
status: string;
|
|
51
|
-
created_at:
|
|
52
|
-
updated_at:
|
|
51
|
+
created_at: DatabaseDate;
|
|
52
|
+
updated_at: DatabaseDate;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
|
|
@@ -76,7 +76,7 @@ type ActionLinkRow = {
|
|
|
76
76
|
|
|
77
77
|
type ActionRevisionRow = {
|
|
78
78
|
action_id: string;
|
|
79
|
-
created_at:
|
|
79
|
+
created_at: DatabaseDate;
|
|
80
80
|
wait_hours: number | null;
|
|
81
81
|
email_subject: string | null;
|
|
82
82
|
email_lexical: string | null;
|
|
@@ -108,7 +108,7 @@ type StepToRunRow = {
|
|
|
108
108
|
action_id: string;
|
|
109
109
|
automation_action_revision_id: string;
|
|
110
110
|
type: string;
|
|
111
|
-
ready_at:
|
|
111
|
+
ready_at: DatabaseDate;
|
|
112
112
|
step_attempts: number;
|
|
113
113
|
wait_hours: number | null;
|
|
114
114
|
email_subject: string | null;
|
|
@@ -709,14 +709,14 @@ async function findNextPendingReadyAt(trx: Knex.Transaction, staleLockCutoff: Re
|
|
|
709
709
|
})
|
|
710
710
|
.orderBy('ready_at')
|
|
711
711
|
.first();
|
|
712
|
-
return row?.next_ready_at ?
|
|
712
|
+
return row?.next_ready_at ? fromDatabaseDate(row.next_ready_at) : null;
|
|
713
713
|
}
|
|
714
714
|
|
|
715
715
|
function buildStepToRun(row: ReadonlyDeep<StepToRunRow>): AutomationStepToRun {
|
|
716
716
|
const base = {
|
|
717
717
|
id: row.id,
|
|
718
718
|
step_attempts: row.step_attempts,
|
|
719
|
-
ready_at:
|
|
719
|
+
ready_at: fromDatabaseDate(row.ready_at),
|
|
720
720
|
locked_by: row.locked_by,
|
|
721
721
|
automation_run_id: row.automation_run_id,
|
|
722
722
|
automation_id: row.automation_id,
|
|
@@ -1259,13 +1259,13 @@ async function insertActionRevisions(
|
|
|
1259
1259
|
);
|
|
1260
1260
|
}
|
|
1261
1261
|
|
|
1262
|
-
function getNextRevisionCreatedAt(latestCreatedAt:
|
|
1262
|
+
function getNextRevisionCreatedAt(latestCreatedAt: DatabaseDate | null, requestedCreatedAt: string) {
|
|
1263
1263
|
if (!latestCreatedAt) {
|
|
1264
1264
|
return toDatabaseDate(requestedCreatedAt);
|
|
1265
1265
|
}
|
|
1266
1266
|
|
|
1267
|
-
const requestedTime =
|
|
1268
|
-
const latestTime =
|
|
1267
|
+
const requestedTime = fromDatabaseDate(requestedCreatedAt).getTime();
|
|
1268
|
+
const latestTime = fromDatabaseDate(latestCreatedAt).getTime();
|
|
1269
1269
|
|
|
1270
1270
|
if (requestedTime > latestTime) {
|
|
1271
1271
|
return toDatabaseDate(requestedCreatedAt);
|
|
@@ -1355,8 +1355,8 @@ function buildAutomationSummary(automation: AutomationRow): AutomationSummary {
|
|
|
1355
1355
|
};
|
|
1356
1356
|
}
|
|
1357
1357
|
|
|
1358
|
-
function serializeDate(date:
|
|
1359
|
-
const normalizedDate =
|
|
1358
|
+
function serializeDate(date: DatabaseDate) {
|
|
1359
|
+
const normalizedDate = fromDatabaseDate(date);
|
|
1360
1360
|
normalizedDate.setMilliseconds(0);
|
|
1361
1361
|
return normalizedDate.toISOString();
|
|
1362
1362
|
}
|
|
@@ -1,10 +1,59 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.toDatabaseDate = void 0;
|
|
39
|
+
exports.fromDatabaseDate = exports.toDatabaseDate = exports.DATABASE_DATE_FORMAT = void 0;
|
|
7
40
|
const moment_1 = __importDefault(require("moment"));
|
|
8
|
-
const
|
|
9
|
-
|
|
41
|
+
const errors = __importStar(require("@tryghost/errors"));
|
|
42
|
+
exports.DATABASE_DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss';
|
|
43
|
+
const toDatabaseDate = (date) => moment_1.default.utc(date).format(exports.DATABASE_DATE_FORMAT);
|
|
10
44
|
exports.toDatabaseDate = toDatabaseDate;
|
|
45
|
+
const fromDatabaseDate = (date) => {
|
|
46
|
+
if (date instanceof Date) {
|
|
47
|
+
return new Date(date);
|
|
48
|
+
}
|
|
49
|
+
if (typeof date === 'string') {
|
|
50
|
+
return moment_1.default.utc(date, exports.DATABASE_DATE_FORMAT).toDate();
|
|
51
|
+
}
|
|
52
|
+
// Defense-in-depth for legacy SQLite rows stored as epoch milliseconds.
|
|
53
|
+
if (typeof date === 'number') {
|
|
54
|
+
return moment_1.default.utc(date).toDate();
|
|
55
|
+
}
|
|
56
|
+
const exhaustive = date;
|
|
57
|
+
throw new errors.InternalServerError({ message: `Unexpected type for database date: ${exhaustive}` });
|
|
58
|
+
};
|
|
59
|
+
exports.fromDatabaseDate = fromDatabaseDate;
|
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
import moment from 'moment';
|
|
2
|
+
import * as errors from '@tryghost/errors';
|
|
2
3
|
|
|
3
|
-
const DATABASE_DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss';
|
|
4
|
+
export const DATABASE_DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss';
|
|
4
5
|
|
|
5
|
-
export
|
|
6
|
+
export type DatabaseDate = Date | string | number;
|
|
7
|
+
|
|
8
|
+
export const toDatabaseDate = (date: Date | string): string => moment.utc(date).format(DATABASE_DATE_FORMAT);
|
|
9
|
+
|
|
10
|
+
export const fromDatabaseDate = (date: DatabaseDate): Date => {
|
|
11
|
+
if (date instanceof Date) {
|
|
12
|
+
return new Date(date);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (typeof date === 'string') {
|
|
16
|
+
return moment.utc(date, DATABASE_DATE_FORMAT).toDate();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Defense-in-depth for legacy SQLite rows stored as epoch milliseconds.
|
|
20
|
+
if (typeof date === 'number') {
|
|
21
|
+
return moment.utc(date).toDate();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const exhaustive: never = date;
|
|
25
|
+
throw new errors.InternalServerError({message: `Unexpected type for database date: ${exhaustive}`});
|
|
26
|
+
};
|
|
@@ -112,13 +112,13 @@ class AutomationsService {
|
|
|
112
112
|
logging.error({ event: { name: 'automations.enqueue-poll.error' }, err, at: date.toISOString() }, 'Failed to enqueue automations poll');
|
|
113
113
|
}
|
|
114
114
|
};
|
|
115
|
-
domainEvents.subscribe(StartAutomationsPollEvent, (0, one_at_a_time_1.oneAtATime)(
|
|
115
|
+
domainEvents.subscribe(StartAutomationsPollEvent, (0, one_at_a_time_1.oneAtATime)(() => (0, poll_1.poll)({
|
|
116
116
|
automationsApi,
|
|
117
117
|
memberWelcomeEmailService,
|
|
118
118
|
scheduleAutomationEmailAnalyticsJob,
|
|
119
119
|
enqueueAnotherPollAt: enqueuePollAt
|
|
120
120
|
})));
|
|
121
|
-
domainEvents.subscribe(StartAutomationsPollEvent, (0, one_at_a_time_1.oneAtATime)(
|
|
121
|
+
domainEvents.subscribe(StartAutomationsPollEvent, (0, one_at_a_time_1.oneAtATime)(() => welcomeEmailAutomationPoll({
|
|
122
122
|
memberWelcomeEmailService,
|
|
123
123
|
enqueueAnotherPollAt: enqueuePollAt
|
|
124
124
|
})));
|
|
@@ -96,14 +96,14 @@ export class AutomationsService {
|
|
|
96
96
|
}
|
|
97
97
|
};
|
|
98
98
|
|
|
99
|
-
domainEvents.subscribe(StartAutomationsPollEvent, oneAtATime(
|
|
99
|
+
domainEvents.subscribe(StartAutomationsPollEvent, oneAtATime(() => poll({
|
|
100
100
|
automationsApi,
|
|
101
101
|
memberWelcomeEmailService,
|
|
102
102
|
scheduleAutomationEmailAnalyticsJob,
|
|
103
103
|
enqueueAnotherPollAt: enqueuePollAt
|
|
104
104
|
})));
|
|
105
105
|
|
|
106
|
-
domainEvents.subscribe(StartAutomationsPollEvent, oneAtATime(
|
|
106
|
+
domainEvents.subscribe(StartAutomationsPollEvent, oneAtATime(() => welcomeEmailAutomationPoll({
|
|
107
107
|
memberWelcomeEmailService,
|
|
108
108
|
enqueueAnotherPollAt: enqueuePollAt
|
|
109
109
|
})));
|
|
@@ -29,7 +29,7 @@ class CommentsServiceEmails {
|
|
|
29
29
|
// Comments live on pages as well as posts; the URL service routes by
|
|
30
30
|
// the passed type, so a page typed 'posts' resolves to /404/.
|
|
31
31
|
const routerType = postData.type === 'page' ? 'pages' : 'posts';
|
|
32
|
-
const baseUrl = this.urlService.
|
|
32
|
+
const baseUrl = this.urlService.getUrlForResource({...postData, type: routerType}, {absolute: true});
|
|
33
33
|
return `${baseUrl}#ghost-comments-${commentId}`;
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -473,7 +473,7 @@ class CommentsService {
|
|
|
473
473
|
* @param {AdminBrowseAllOptions} options
|
|
474
474
|
*/
|
|
475
475
|
async getAdminAllComments({includeNested, filter, mongoTransformer, reportCount, order, page, limit}) {
|
|
476
|
-
const postUrlRelations = this.urlService.
|
|
476
|
+
const postUrlRelations = this.urlService.getRequiredRelations().map(relation => `post.${relation}`);
|
|
477
477
|
const withRelated = ['member', 'post', ...postUrlRelations, 'count.replies', 'count.direct_replies', 'count.likes', 'count.dislikes', 'count.net_score', 'count.reports', 'in_reply_to', 'parent'];
|
|
478
478
|
|
|
479
479
|
return await this.models.Comment.findPage({
|
|
@@ -4,7 +4,7 @@ const config = require('../../../shared/config');
|
|
|
4
4
|
const domainEvents = require('@tryghost/domain-events');
|
|
5
5
|
/** @import {PrometheusClient} from '@tryghost/prometheus-metrics' */
|
|
6
6
|
/** @import {BatchEventProcessor} from './batch-event-processor' */
|
|
7
|
-
/** @import {JobNames, CursorSeed} from './email-analytics-service' */
|
|
7
|
+
/** @import {JobNames, CursorSeed, EmailAnalyticsFetchResult} from './email-analytics-service' */
|
|
8
8
|
|
|
9
9
|
class EmailAnalyticsServiceWrapper {
|
|
10
10
|
/** @type {string} */ #logName;
|
|
@@ -49,7 +49,7 @@ class EmailAnalyticsServiceWrapper {
|
|
|
49
49
|
const EmailAnalyticsService = require('./email-analytics-service');
|
|
50
50
|
const MailgunProvider = require('./email-analytics-provider-mailgun');
|
|
51
51
|
const settings = require('../../../shared/settings-cache');
|
|
52
|
-
const queries = require('./lib/queries');
|
|
52
|
+
const {queries} = require('./lib/queries');
|
|
53
53
|
|
|
54
54
|
this.service = new EmailAnalyticsService({
|
|
55
55
|
provider: new MailgunProvider({config, settings, tags: mailgunTags}),
|
|
@@ -74,7 +74,7 @@ class EmailAnalyticsServiceWrapper {
|
|
|
74
74
|
/**
|
|
75
75
|
* Log comprehensive job completion with timing metrics
|
|
76
76
|
* @param {string} jobType - Type of job (e.g., 'latest-opened', 'latest', 'missing', 'scheduled')
|
|
77
|
-
* @param {
|
|
77
|
+
* @param {EmailAnalyticsFetchResult} fetchResult - The fetch result from EmailAnalyticsService
|
|
78
78
|
* @param {number} totalDurationMs - Total duration in milliseconds
|
|
79
79
|
*/
|
|
80
80
|
_logJobCompletion(jobType, fetchResult, totalDurationMs) {
|
|
@@ -158,6 +158,11 @@ class EmailAnalyticsServiceWrapper {
|
|
|
158
158
|
return fetchResult.eventCount;
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
+
/**
|
|
162
|
+
* @param {object} options
|
|
163
|
+
* @param {number} options.maxEvents
|
|
164
|
+
* @returns {Promise<number>} The number of scheduled events fetched
|
|
165
|
+
*/
|
|
161
166
|
async fetchScheduled({maxEvents}) {
|
|
162
167
|
if (maxEvents < 300) {
|
|
163
168
|
return 0;
|
|
@@ -227,6 +232,10 @@ class EmailAnalyticsServiceWrapper {
|
|
|
227
232
|
this.#fetching = false;
|
|
228
233
|
}
|
|
229
234
|
|
|
235
|
+
/**
|
|
236
|
+
* @param {string} reason
|
|
237
|
+
* @returns {void}
|
|
238
|
+
*/
|
|
230
239
|
_restartFetch(reason) {
|
|
231
240
|
this.#fetching = false;
|
|
232
241
|
logging.info(`${this.#logPrefix} Restarting fetch due to ${reason}`);
|
|
@@ -3,6 +3,7 @@ const logging = require('@tryghost/logging');
|
|
|
3
3
|
const errors = require('@tryghost/errors');
|
|
4
4
|
/** @import {PrometheusClient} from '@tryghost/prometheus-metrics' */
|
|
5
5
|
/** @import {BatchEventProcessor} from './batch-event-processor' */
|
|
6
|
+
/** @import {Queries} from './lib/queries' */
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* @typedef {object} FetchData
|
|
@@ -74,7 +75,7 @@ function createEmptyResult() {
|
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
module.exports = class EmailAnalyticsService {
|
|
77
|
-
queries;
|
|
78
|
+
/** @type {Queries} */ queries;
|
|
78
79
|
provider;
|
|
79
80
|
#createEventProcessor;
|
|
80
81
|
|
|
@@ -103,7 +104,7 @@ module.exports = class EmailAnalyticsService {
|
|
|
103
104
|
|
|
104
105
|
/**
|
|
105
106
|
* @param {object} dependencies
|
|
106
|
-
* @param {
|
|
107
|
+
* @param {Queries} dependencies.queries
|
|
107
108
|
* @param {object} dependencies.provider
|
|
108
109
|
* @param {PrometheusClient} [dependencies.prometheusClient]
|
|
109
110
|
* @param {() => BatchEventProcessor} dependencies.createEventProcessor
|
|
@@ -372,7 +373,7 @@ module.exports = class EmailAnalyticsService {
|
|
|
372
373
|
* @param {EmailAnalyticsEvent[]} [options.eventTypes] - Array of event types to fetch. If not provided, Mailgun will return all event types.
|
|
373
374
|
* @returns {Promise<EmailAnalyticsFetchResult>} Fetch results with timing metrics
|
|
374
375
|
*/
|
|
375
|
-
async #fetchEvents(fetchData, {begin, end, maxEvents = Infinity, eventTypes
|
|
376
|
+
async #fetchEvents(fetchData, {begin, end, maxEvents = Infinity, eventTypes}) {
|
|
376
377
|
// Start where we left of, or the last stored event in the database, or start 30 minutes ago if we have nothing available
|
|
377
378
|
// Store that we started fetching
|
|
378
379
|
fetchData.running = true;
|
|
@@ -57,8 +57,7 @@ const models_1 = require("../../models");
|
|
|
57
57
|
const domain_events_1 = __importDefault(require("@tryghost/domain-events"));
|
|
58
58
|
// @ts-expect-error This module lacks type definitions.
|
|
59
59
|
const prometheus_client_1 = __importDefault(require("../../../shared/prometheus-client"));
|
|
60
|
-
|
|
61
|
-
const queries_1 = __importDefault(require("./lib/queries"));
|
|
60
|
+
const queries_1 = require("./lib/queries");
|
|
62
61
|
const start_email_analytics_job_event_1 = require("./events/start-email-analytics-job-event");
|
|
63
62
|
const start_automation_email_analytics_job_event_1 = require("./events/start-automation-email-analytics-job-event");
|
|
64
63
|
const constants_1 = require("../member-welcome-emails/constants");
|
|
@@ -113,7 +112,7 @@ const init = () => {
|
|
|
113
112
|
config: config_1.default,
|
|
114
113
|
emailEventProcessor: newsletterEmailEventProcessor,
|
|
115
114
|
prometheusClient: prometheus_client_1.default,
|
|
116
|
-
queries: queries_1.
|
|
115
|
+
queries: queries_1.queries
|
|
117
116
|
}))
|
|
118
117
|
});
|
|
119
118
|
exports.automations.init({
|
|
@@ -18,8 +18,7 @@ import {EmailRecipientFailure, EmailSpamComplaintEvent, Email} from '../../model
|
|
|
18
18
|
import domainEvents from '@tryghost/domain-events';
|
|
19
19
|
// @ts-expect-error This module lacks type definitions.
|
|
20
20
|
import prometheusClient from '../../../shared/prometheus-client';
|
|
21
|
-
|
|
22
|
-
import queries from './lib/queries';
|
|
21
|
+
import {queries} from './lib/queries';
|
|
23
22
|
import {StartEmailAnalyticsJobEvent} from './events/start-email-analytics-job-event';
|
|
24
23
|
import {StartAutomationEmailAnalyticsJobEvent} from './events/start-automation-email-analytics-job-event';
|
|
25
24
|
import {AUTOMATION_EMAIL_TAG} from '../member-welcome-emails/constants';
|