ghost 6.44.0 → 6.44.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/core/boot.js +9 -13
- package/core/bridge.js +6 -10
- package/core/built/admin/assets/{PolarAngleAxis-eFuSrR7S.js → PolarAngleAxis-DWP6qq-Z.js} +2 -2
- package/core/built/admin/assets/{_baseAssignValue-XVHfKew7.js → _baseAssignValue-N9f4o_XK.js} +1 -1
- package/core/built/admin/assets/{a-large-small-DOzPDzKp.js → a-large-small-BOAtcFiE.js} +1 -1
- package/core/built/admin/assets/{account-migration-Cx45M5qm.js → account-migration-CtZx_5ib.js} +1 -1
- package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
- package/core/built/admin/assets/admin-x-settings/{code-editor-view-Bi8Orhyj.mjs → code-editor-view-BMovCjer.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-1_V9g9Pt.mjs → index-BT1n-g2b.mjs} +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-e9saYQJa.mjs → index-BnowNBGd.mjs} +5 -5
- package/core/built/admin/assets/admin-x-settings/{index-CnvQi01U.mjs → index-CRpK6gF8.mjs} +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-BmU6BOfy.mjs → index-CfXS3AZ8.mjs} +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-EuMiBt6I.mjs → index-Cs8zML6u.mjs} +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-B43MPc5u.mjs → index-DmpwO1w3.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-DOgG0XZa.mjs → index-DwFIdhcR.mjs} +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-CWdxMIcZ.mjs → index-sNyPiIJA.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-Ojg_pBvq.mjs → index-xTILut54.mjs} +1259 -1259
- package/core/built/admin/assets/admin-x-settings/{modals-Ckbx9UQF.mjs → modals-Cm5t13os.mjs} +9 -9
- package/core/built/admin/assets/{arrow-right-DckEQtp9.js → arrow-right-BxdHN_En.js} +1 -1
- package/core/built/admin/assets/{at-sign-BChf68aS.js → at-sign-Cajf-dOf.js} +1 -1
- package/core/built/admin/assets/{audience-BYU5Bd7D.js → audience-CHNb9mCT.js} +1 -1
- package/core/built/admin/assets/{automated-email-design-Z26Qit0_.js → automated-email-design-B9C9mKUS.js} +2 -2
- package/core/built/admin/assets/{automated-emails-aBicreLv.js → automated-emails-DhLhkq8L.js} +1 -1
- package/core/built/admin/assets/{automations-vpH-d72N.js → automations-6-cgZovk.js} +1 -1
- package/core/built/admin/assets/{automations-Ddo22yPk.js → automations-CxJ-N_YK.js} +1 -1
- package/core/built/admin/assets/{avatar-flipboard-CoI3LQ-o.js → avatar-flipboard-f5nSMmek.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-iVDkCMKN.js → bluesky-sharing-Dm2k8qZH.js} +1 -1
- package/core/built/admin/assets/{chart-CjM1VQqH.js → chart-BbJnjWey.js} +23 -23
- package/core/built/admin/assets/{checkbox-CC5kd_Kf.js → checkbox-CT7DNFAI.js} +1 -1
- package/core/built/admin/assets/{chevron-up-D__wzyXT.js → chevron-up-BxijmTT9.js} +1 -1
- package/core/built/admin/assets/{chunk.696.79505fa556d329d6e824.js → chunk.167.37bb0d7f6ac67fefa679.js} +3184 -3523
- package/core/built/admin/assets/{chunk.696.79505fa556d329d6e824.js.LICENSE.txt → chunk.167.37bb0d7f6ac67fefa679.js.LICENSE.txt} +1 -1
- package/core/built/admin/assets/{chunk.524.1ff649a6cc62dc38f538.js → chunk.524.ed812b62217210a913d4.js} +5 -5
- package/core/built/admin/assets/{chunk.582.408a40e0095e479e3d11.js → chunk.582.7db5c9f17bca5a484049.js} +6 -6
- package/core/built/admin/assets/{chunk.945.835812fcb16029abd7f9.js → chunk.834.f9db7c62b9457db93e8c.js} +3 -3
- package/core/built/admin/assets/{code-editor-view-C735d5EA.js → code-editor-view-D8slE0IA.js} +1 -1
- package/core/built/admin/assets/{comments-DgFPax3Y.js → comments-BvfR-fA8.js} +1 -1
- package/core/built/admin/assets/{content-helpers-DjugSfvm.js → content-helpers-DUWGLvgL.js} +1 -1
- package/core/built/admin/assets/{copy-D9JONGcK.js → copy-ht18t5gu.js} +1 -1
- package/core/built/admin/assets/{data-list-QWLEHG4y.js → data-list-Daha2dIs.js} +1 -1
- package/core/built/admin/assets/{deleted-feed-item-CwSCflTW.js → deleted-feed-item-ChP5bwgi.js} +1 -1
- package/core/built/admin/assets/{dropzone-lK_4vpWS.js → dropzone-h_qyk514.js} +1 -1
- package/core/built/admin/assets/{edit-profile-BmioJZHv.js → edit-profile-BT8RQpAG.js} +1 -1
- package/core/built/admin/assets/editor-s1mqd9_o.js +8 -0
- package/core/built/admin/assets/{empty-indicator-Dg64lT_g.js → empty-indicator-BIUvv6JE.js} +1 -1
- package/core/built/admin/assets/{en-DCwBNJ98.js → en-BEcDl42w.js} +1 -1
- package/core/built/admin/assets/{eye-psLxWnjO.js → eye-TPnIdamu.js} +1 -1
- package/core/built/admin/assets/{feed-TUcCSZHL.js → feed-BK3qvLWi.js} +1 -1
- package/core/built/admin/assets/{field-Uk8NOvtc.js → field-CSFsrvVy.js} +1 -1
- package/core/built/admin/assets/{filter-query-core-CbH_VKcG.js → filter-query-core-R8cQCO2w.js} +1 -1
- package/core/built/admin/assets/{filters-DmawZ5Uu.js → filters-Cp1voB1e.js} +1 -1
- package/core/built/admin/assets/gh-chart-BFsyOJD_.js +1 -0
- package/core/built/admin/assets/{ghost-2baa7ddc3630015f41c0efd13bd586b8.js → ghost-1881362e8a92dae1e3333a0484c173a3.js} +7 -6
- package/core/built/admin/assets/{growth-BAl-TyMy.js → growth-DIigOxF1.js} +1 -1
- package/core/built/admin/assets/{hash-Q1ou0OMZ.js → hash-B3iFVeCl.js} +1 -1
- package/core/built/admin/assets/{inbox-BAOtR6tN.js → inbox-2bPMLikt.js} +1 -1
- package/core/built/admin/assets/{index-BnJp51QE.js → index-52qUC8yv.js} +5 -5
- package/core/built/admin/assets/{index-BDIwushG.js → index-9j01Aj_X.js} +1 -1
- package/core/built/admin/assets/index-B9UVpmey.js +1 -0
- package/core/built/admin/assets/{index-DTeOW3Se.js → index-BXc5OF6x.js} +1 -1
- package/core/built/admin/assets/{index-Duc21aJ7.js → index-BaGL3IFe.js} +1 -1
- package/core/built/admin/assets/{index-DKC8uXHk.js → index-BdozZbt2.js} +2 -2
- package/core/built/admin/assets/{index-z951kI4K.js → index-Bgpz7M7i.js} +1 -1
- package/core/built/admin/assets/{index-BfSvX9is.js → index-Bp4O7TVf.js} +1 -1
- package/core/built/admin/assets/{index-C5S08C6P.js → index-BuqUmpe9.js} +1 -1
- package/core/built/admin/assets/{index-D7OtVnbo.js → index-CEF_Ofn0.js} +1 -1
- package/core/built/admin/assets/{index-Bs6rUYFS.js → index-CgSVv5Up.js} +58 -58
- package/core/built/admin/assets/{index-Ro9qXetv.js → index-Cr6x2czK.js} +1 -1
- package/core/built/admin/assets/{index-DJbgQjV6.js → index-CrbZj3Ju.js} +1 -1
- package/core/built/admin/assets/{index-BTBcWw_z.js → index-CrlAPDdD.js} +2 -2
- package/core/built/admin/assets/{index-B6SD2Qs-.js → index-CtrmMGWT.js} +1 -1
- package/core/built/admin/assets/{index-Bw0oyOFd.js → index-D-V_DAdt.js} +1 -1
- package/core/built/admin/assets/{index-DAJduTBl.js → index-D0poOSjw.js} +4 -4
- package/core/built/admin/assets/{index-CGT3W8fi.js → index-DWVGCPEC.js} +3 -3
- package/core/built/admin/assets/index-Dozbr_4s.css +1 -0
- package/core/built/admin/assets/{index-FyplpnYQ.js → index-S3Ai3lDy.js} +1 -1
- package/core/built/admin/assets/{index-DLr8D_Ks.js → index-VDhA5kgU.js} +1 -1
- package/core/built/admin/assets/{index-DRA1fORQ.js → index-fnIFqFMt.js} +1 -1
- package/core/built/admin/assets/{index-BhWQZObu.js → index-kA3UcdW7.js} +1 -1
- package/core/built/admin/assets/{input-group-DH32syTz.js → input-group-Fdl0S6pw.js} +1 -1
- package/core/built/admin/assets/{koenig-lexical-CxVcbgsH.js → koenig-lexical-REiYtzGD.js} +1 -1
- package/core/built/admin/assets/{kpi-card-DBWHDi3l.js → kpi-card-BS8vEj4c.js} +1 -1
- package/core/built/admin/assets/{kpi-card-BYhzWV5F.js → kpi-card-D3HEfOCP.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-Kxc-utyg.js → kpi-tabs-8vaI7yWq.js} +1 -1
- package/core/built/admin/assets/kpis-CkD0Xteg.js +1 -0
- package/core/built/admin/assets/label-DT38Gd2T.js +1 -0
- package/core/built/admin/assets/{links-Cg8O8ZGP.js → links-BK-azjCL.js} +1 -1
- package/core/built/admin/assets/{list-page-D2KCBsiy.js → list-page-DVpac3lc.js} +1 -1
- package/core/built/admin/assets/{loader-circle-nmLqhMZL.js → loader-circle-CIq5Cv-9.js} +1 -1
- package/core/built/admin/assets/{mail-D7cxYMd5.js → mail-gdeIU06V.js} +1 -1
- package/core/built/admin/assets/{main-layout-BXdUkeCo.js → main-layout-B2t-RiNE.js} +1 -1
- package/core/built/admin/assets/members-7z-tESWd.js +10 -0
- package/core/built/admin/assets/minus-BbGfVkll.js +1 -0
- package/core/built/admin/assets/{modals-VRvX8mK0.js → modals-DVIfijEz.js} +3 -3
- package/core/built/admin/assets/{moderation-DkT8qVJs.js → moderation-DwzDOhih.js} +1 -1
- package/core/built/admin/assets/{newsletter-sUT4ciRJ.js → newsletter-D1N8bUfp.js} +1 -1
- package/core/built/admin/assets/{newsletters-BNvAF2Oi.js → newsletters-7GSeQdQe.js} +1 -1
- package/core/built/admin/assets/{note-B0JhJv7s.js → note-Bn1-ZWDE.js} +1 -1
- package/core/built/admin/assets/offers-BsuLKYy9.js +1 -0
- package/core/built/admin/assets/{onboarding-route-IrO_SCb3.js → onboarding-route-C73r9kyO.js} +1 -1
- package/core/built/admin/assets/{overview-C2nk_B6i.js → overview-6U5p38zx.js} +1 -1
- package/core/built/admin/assets/{pagemenu-BGhty1iq.js → pagemenu-DrueoEX9.js} +1 -1
- package/core/built/admin/assets/{pencil-DiA3J4m5.js → pencil-Csnv8udS.js} +1 -1
- package/core/built/admin/assets/{pin-off-HWos3YHh.js → pin-off-BDeHGsSQ.js} +1 -1
- package/core/built/admin/assets/{post-analytics-context-BJwP-XAB.js → post-analytics-context-jKeUh2Ka.js} +1 -1
- package/core/built/admin/assets/{post-analytics-header-CZF5QmAD.js → post-analytics-header-C5QLn6Lm.js} +1 -1
- package/core/built/admin/assets/{post-analytics-DBUHbt1b.js → post-analytics-ngMqqbt9.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-Bb8R05dH.js → post-share-modal-04B7JT4R.js} +1 -1
- package/core/built/admin/assets/posts/{alert-dialog-mmQvJUHQ.mjs → alert-dialog-CYvHtOQ5.mjs} +4 -4
- package/core/built/admin/assets/posts/{app-utils-CD0bhOLs.mjs → app-utils-Cs-8qje1.mjs} +3 -3
- package/core/built/admin/assets/posts/{automations-BL0WaXHA.mjs → automations-DE2rwx-Z.mjs} +25 -25
- package/core/built/admin/assets/posts/{automations-BmGKngyG.mjs → automations-Dq0_cprS.mjs} +4 -4
- package/core/built/admin/assets/posts/{avatar-CeJ0Zq_A.mjs → avatar-Dt_bGEgl.mjs} +7 -7
- package/core/built/admin/assets/posts/{button-CQCNdxY6.mjs → button-DO7JrPsL.mjs} +2 -2
- package/core/built/admin/assets/posts/{chevron-up-DaikhWC2.mjs → chevron-up-B8WyJjCr.mjs} +3 -3
- package/core/built/admin/assets/posts/{comments-DUSJ25vf.mjs → comments-B3-RpqJU.mjs} +1933 -1905
- package/core/built/admin/assets/posts/{data-list-BiiYXQes.mjs → data-list-BiZFP6Co.mjs} +5 -5
- package/core/built/admin/assets/posts/{dialog-DRN6olky.mjs → dialog-Bvl2PD8s.mjs} +3 -3
- package/core/built/admin/assets/posts/{editor-DN_Zz0m2.mjs → editor-BCtdAD74.mjs} +3230 -3130
- package/core/built/admin/assets/posts/{ellipsis-BIs4PL5-.mjs → ellipsis-B5H7Hudx.mjs} +2 -2
- package/core/built/admin/assets/posts/{empty-indicator-Wiukrx4T.mjs → empty-indicator-BRoAf6Jv.mjs} +2 -2
- package/core/built/admin/assets/posts/{filters-CJl5ebXd.mjs → filters-CffYQY_8.mjs} +12 -12
- package/core/built/admin/assets/posts/{get-site-timezone-JepxGwVr.mjs → get-site-timezone-CSrPVUfX.mjs} +2 -2
- package/core/built/admin/assets/posts/{growth-cNlqbz-x.mjs → growth--LVGRPtS.mjs} +13 -13
- package/core/built/admin/assets/posts/{heading-C_V6Ckxx.mjs → heading-BRQEP7IA.mjs} +2 -2
- package/core/built/admin/assets/posts/{heart-BMBWsLs2.mjs → heart-CC2f1qWb.mjs} +2 -2
- package/core/built/admin/assets/posts/{hooks-D4pJ_p_P.mjs → hooks-J2WpDj1d.mjs} +2 -2
- package/core/built/admin/assets/posts/{index-DzWTmJMy.mjs → index-D-vhKzUJ.mjs} +3 -3
- package/core/built/admin/assets/posts/{index-CDwlVw9E.mjs → index-LnPyGojr.mjs} +2 -2
- package/core/built/admin/assets/posts/{index-BuIZkUhD.mjs → index-nxfIbREV.mjs} +11 -11
- package/core/built/admin/assets/posts/{input-DUvSHOFz.mjs → input-DTtfruk_.mjs} +3 -3
- package/core/built/admin/assets/posts/{input-surface-CO8-j6V2.mjs → input-surface-DXTGCuo2.mjs} +2 -2
- package/core/built/admin/assets/posts/{koenig-lexical-cRm7bY-6.mjs → koenig-lexical-CNcifuT7.mjs} +2 -2
- package/core/built/admin/assets/posts/{kpis-BXukzbg6.mjs → kpis-n8L4BlMi.mjs} +5843 -5854
- package/core/built/admin/assets/posts/{label-TTt0QyDb.mjs → label-yl8B8ADj.mjs} +6 -6
- package/core/built/admin/assets/posts/{links-BAXELE82.mjs → links-DDApMJfk.mjs} +4 -4
- package/core/built/admin/assets/posts/{list-page-DQIiFvFP.mjs → list-page-BJJ9amzJ.mjs} +4 -4
- package/core/built/admin/assets/posts/{loading-indicator-BsY7eGY6.mjs → loading-indicator-CQBDNvdo.mjs} +3 -3
- package/core/built/admin/assets/posts/{mail-Bi1gt3MU.mjs → mail-BHg0SvNu.mjs} +2 -2
- package/core/built/admin/assets/posts/{main-layout-DejRuxP8.mjs → main-layout-DXveCJ5W.mjs} +2 -2
- package/core/built/admin/assets/posts/{newsletter-PCUtHW6Z.mjs → newsletter-DUpVmnKN.mjs} +19 -19
- package/core/built/admin/assets/posts/{overview-f4eDWazr.mjs → overview-sv6i-2h9.mjs} +18 -18
- package/core/built/admin/assets/posts/{pencil-DDnfXQqn.mjs → pencil-DsGDLJp6.mjs} +2 -2
- package/core/built/admin/assets/posts/{plus-DW3bG6ui.mjs → plus-DjZ_REvJ.mjs} +2 -2
- package/core/built/admin/assets/posts/{popover-Du2NcggM.mjs → popover-2PA9zdiD.mjs} +4 -4
- package/core/built/admin/assets/posts/{post-analytics-BmnHyWJq.mjs → post-analytics-CKHoiJFY.mjs} +6 -6
- package/core/built/admin/assets/posts/{post-analytics-context-0fieM91Y.mjs → post-analytics-context-D17CB7nm.mjs} +6 -6
- package/core/built/admin/assets/posts/{post-analytics-header-Bxi56AWV.mjs → post-analytics-header-aQLnrdWi.mjs} +12 -12
- package/core/built/admin/assets/posts/{post-share-modal-DiuT4GFO.mjs → post-share-modal-C8-8CZw8.mjs} +6 -6
- package/core/built/admin/assets/posts/{posts-CYjfxmgX.mjs → posts-BA2vu_T2.mjs} +2 -2
- package/core/built/admin/assets/posts/posts.js +1 -1
- package/core/built/admin/assets/posts/{search-Dz7F6ifc.mjs → search-Bx6BvCRk.mjs} +2 -2
- package/core/built/admin/assets/posts/{select-FX6QYAFU.mjs → select-QOJ2OvL0.mjs} +7 -7
- package/core/built/admin/assets/posts/{separator-C7QPCSjM.mjs → separator-CHtBa4OX.mjs} +3 -3
- package/core/built/admin/assets/posts/{settings-DJqx19W1.mjs → settings-CxhTCxXg.mjs} +2 -2
- package/core/built/admin/assets/posts/{sheet-wg_8-w45.mjs → sheet-DO5nhiru.mjs} +4 -4
- package/core/built/admin/assets/posts/{site-Bxv-L5Dn.mjs → site-6g4pKVnR.mjs} +2 -2
- package/core/built/admin/assets/posts/{skeleton-DrFcKwP3.mjs → skeleton-DgWx-52p.mjs} +3 -3
- package/core/built/admin/assets/posts/{source-icon-DD_bmIqg.mjs → source-icon-_zLbYeab.mjs} +4 -4
- package/core/built/admin/assets/posts/{stats-DkOg80Vt.mjs → stats-BGJFxx5f.mjs} +4 -4
- package/core/built/admin/assets/posts/{switch-DZFGAF_Y.mjs → switch-Djipx7gc.mjs} +5 -5
- package/core/built/admin/assets/posts/{table-CZCVviNy.mjs → table-DpDCE80J.mjs} +2 -2
- package/core/built/admin/assets/posts/{tabs-1fkhM4p8.mjs → tabs-CLWGiyQ4.mjs} +4 -4
- package/core/built/admin/assets/posts/{tags-CkyGqwqi.mjs → tags-B4KIn7er.mjs} +2 -2
- package/core/built/admin/assets/posts/{tags-BAmugIR1.mjs → tags-Dn1L_Z_4.mjs} +16 -16
- package/core/built/admin/assets/posts/{toggle-group-B_ubMZvo.mjs → toggle-group-DMMjXGB3.mjs} +4 -4
- package/core/built/admin/assets/posts/{tooltip-D1X0uVas.mjs → tooltip-DlCjZwmt.mjs} +5 -5
- package/core/built/admin/assets/posts/{underline-CV8OJ7qc.mjs → underline-WN3ZSFyI.mjs} +2 -2
- package/core/built/admin/assets/posts/{value-DhEK7_uT.mjs → value-BWiEmo45.mjs} +2 -2
- package/core/built/admin/assets/posts/{virtual-list-window-DqbQUkIo.mjs → virtual-list-window-F3Tvi9H5.mjs} +3 -3
- package/core/built/admin/assets/posts/{web-5jcYGeBz.mjs → web-C8PxkHvH.mjs} +18 -18
- package/core/built/admin/assets/posts/{x-Cl72IwQm.mjs → x-BdlZ3sG3.mjs} +2 -2
- package/core/built/admin/assets/posts/{zap-BPDyHF1u.mjs → zap-BuAk2C7n.mjs} +33 -21
- package/core/built/admin/assets/{posts-D6K0FKB9.js → posts-bRma2Aji.js} +1 -1
- package/core/built/admin/assets/power-B4VCYMPn.js +1 -0
- package/core/built/admin/assets/{referrers-C9UK_aF_.js → referrers-BgXy4ZDF.js} +1 -1
- package/core/built/admin/assets/{repeat-BwgUDBQn.js → repeat-BElPLZnh.js} +1 -1
- package/core/built/admin/assets/{reply-DbknkQhJ.js → reply-qlUFZ_G8.js} +1 -1
- package/core/built/admin/assets/{rocket-1EqU2MzS.js → rocket-CXYckFbm.js} +1 -1
- package/core/built/admin/assets/{select-BGJXWb8i.js → select-MGAxyhXP.js} +1 -1
- package/core/built/admin/assets/{send-_CqvCQBY.js → send-DcU5LcPI.js} +1 -1
- package/core/built/admin/assets/{settings-Bnep890F.js → settings-DGSAz4oa.js} +4 -4
- package/core/built/admin/assets/{settings-Ct244PHl.js → settings-DI95fXs5.js} +1 -1
- package/core/built/admin/assets/{share-modal-B8pN_3tk.js → share-modal-CsNAIPeN.js} +1 -1
- package/core/built/admin/assets/{sort-button-EXsVVSdw.js → sort-button-wV9PBd2P.js} +1 -1
- package/core/built/admin/assets/{source-icon-XMs0toB0.js → source-icon-CYt4X1-M.js} +1 -1
- package/core/built/admin/assets/{sprout-uA_pVmDr.js → sprout-5QqpAoO8.js} +1 -1
- package/core/built/admin/assets/{square-atKnWQyw.js → square-YHeYyKG9.js} +1 -1
- package/core/built/admin/assets/{stats-CPNnZGD9.js → stats-PD64opSw.js} +1 -1
- package/core/built/admin/assets/{stats-view-BP8LU5rf.js → stats-view-C4fnD3uG.js} +1 -1
- package/core/built/admin/assets/{step-1-FHeGC4GW.js → step-1-BqeM_LxC.js} +1 -1
- package/core/built/admin/assets/{step-2-BFhgD2N8.js → step-2-C7AcokE9.js} +1 -1
- package/core/built/admin/assets/{step-3-BZMKjY5n.js → step-3-9Z0qkfpM.js} +2 -2
- package/core/built/admin/assets/{table-kGA62bBZ.js → table-C8Mxw8fs.js} +1 -1
- package/core/built/admin/assets/{tabs-Dl3BXr4Z.js → tabs-2KXMNRG-.js} +1 -1
- package/core/built/admin/assets/{tags-CLhASxwZ.js → tags-Cx-Jx8Yb.js} +1 -1
- package/core/built/admin/assets/{tags-D-W0kJMe.js → tags-cn7wgGit.js} +1 -1
- package/core/built/admin/assets/{textarea-DMub6CsU.js → textarea-dKwIcAK5.js} +1 -1
- package/core/built/admin/assets/{thumbs-up-DZu4SX5N.js → thumbs-up-gzGza05L.js} +1 -1
- package/core/built/admin/assets/{tiers-2bg8BCFj.js → tiers-D--LgD9v.js} +1 -1
- package/core/built/admin/assets/{toggle-group-ByS0KZ3G.js → toggle-group-C8KbiBQS.js} +1 -1
- package/core/built/admin/assets/{topic-filter-oRqwlePZ.js → topic-filter--VQn4A7D.js} +1 -1
- package/core/built/admin/assets/{trash-BHoSD8mS.js → trash-CnBwlhjN.js} +1 -1
- package/core/built/admin/assets/{underline-1YSgOpPm.js → underline-B2FjHOE0.js} +1 -1
- package/core/built/admin/assets/{undo-2-BwYMlB8G.js → undo-2-fUPuO2Zt.js} +1 -1
- package/core/built/admin/assets/{upload-BDz0_o9b.js → upload-BPOrFdtp.js} +1 -1
- package/core/built/admin/assets/{use-growth-stats-PRVcCUT7.js → use-growth-stats-By0ZDqFi.js} +1 -1
- package/core/built/admin/assets/{use-pintura-config-CROsgSEd.js → use-pintura-config-0ykvCF7U.js} +1 -1
- package/core/built/admin/assets/{use-simple-pagination-CBjKBNNI.js → use-simple-pagination-TruuCHV6.js} +1 -1
- package/core/built/admin/assets/{user-round-check-DKooQiV7.js → user-round-check-C1Vahz0b.js} +1 -1
- package/core/built/admin/assets/{user-round-x-B94nAYJb.js → user-round-x-CzKFo5GY.js} +1 -1
- package/core/built/admin/assets/{virtual-list-window-Cf_vCQFb.js → virtual-list-window-BWEknk_A.js} +1 -1
- package/core/built/admin/assets/{wallet-cards-BorRQari.js → wallet-cards-CRHrrjiy.js} +1 -1
- package/core/built/admin/assets/{web-BVHy-80k.js → web-C2H0oAut.js} +1 -1
- package/core/built/admin/index.html +7 -7
- package/core/frontend/services/llms/service.js +37 -10
- package/core/frontend/services/routing/config.js +5 -3
- package/core/frontend/services/routing/config.ts +59 -0
- package/core/frontend/services/sitemap/handler.js +2 -14
- package/core/frontend/services/sitemap/site-map-manager.js +9 -214
- package/core/server/api/endpoints/comment-replies.js +1 -2
- package/core/server/api/endpoints/members.js +4 -1
- package/core/server/api/endpoints/search-index-public.js +12 -1
- package/core/server/api/endpoints/search-index.js +13 -2
- package/core/server/lib/bootstrap-socket.js +31 -36
- package/core/server/lib/bootstrap-socket.ts +114 -0
- package/core/server/lib/common/to-plain.js +9 -21
- package/core/server/lib/common/to-plain.ts +25 -0
- package/core/server/models/role-utils.js +5 -7
- package/core/server/models/role-utils.ts +56 -0
- package/core/server/services/adapter-manager/adapter-manager.js +5 -1
- package/core/server/services/audience-feedback/audience-feedback-service.js +1 -1
- package/core/server/services/automations/automations-api.js +37 -2
- package/core/server/services/automations/automations-api.ts +43 -2
- package/core/server/services/comments/comments-controller.js +87 -55
- package/core/server/services/comments/comments-service-emails.js +1 -1
- package/core/server/services/comments/comments-service.js +249 -79
- package/core/server/services/mail/templates/notification.html +157 -0
- package/core/server/services/member-attribution/url-translator.js +1 -1
- package/core/server/services/members/members-api/services/token-service.js +21 -2
- package/core/server/services/notifications/notification-email.js +38 -0
- package/core/server/services/notifications/notification-email.ts +66 -0
- package/core/server/services/notifications/sanitize-email-html.js +37 -0
- package/core/server/services/notifications/sanitize-email-html.ts +35 -0
- package/core/server/services/route-settings/route-settings.js +2 -18
- package/core/server/services/route-settings/validate.js +2 -1
- package/core/server/services/update-check/index.js +10 -3
- package/core/server/services/update-check/update-check-service.js +18 -25
- package/core/server/services/url/index.js +1 -16
- package/core/shared/config/defaults.json +0 -1
- package/package.json +2 -1
- package/pnpm-lock.yaml +11 -1
- package/pnpm-workspace.yaml +2 -0
- package/core/built/admin/assets/editor-G3BxjP48.js +0 -8
- package/core/built/admin/assets/gh-chart-vpcpdiS9.js +0 -1
- package/core/built/admin/assets/index-BP5ial3p.js +0 -1
- package/core/built/admin/assets/index-Bd9VZ28k.css +0 -1
- package/core/built/admin/assets/kpis-B8pv3wne.js +0 -1
- package/core/built/admin/assets/label-BjHICZC1.js +0 -1
- package/core/built/admin/assets/members-DcuuSs_v.js +0 -10
- package/core/built/admin/assets/minus-Dv51QEND.js +0 -1
- package/core/built/admin/assets/offers-DKZ0qsmb.js +0 -1
- package/core/built/admin/assets/power-D5QO6MjY.js +0 -1
- package/core/server/services/url/lazy-find-resource.js +0 -49
- package/core/server/services/url/lazy-find-resource.ts +0 -62
- package/core/server/services/url/lazy-url-service.js +0 -262
- package/core/server/services/url/lazy-url-service.ts +0 -308
|
@@ -2,6 +2,11 @@ const jose = require('node-jose');
|
|
|
2
2
|
const jwt = require('jsonwebtoken');
|
|
3
3
|
const crypto = require('crypto');
|
|
4
4
|
|
|
5
|
+
// A token's `scope` declares its purpose. Only identity tokens may act as a
|
|
6
|
+
// member; entitlement tokens are read-only and handed to integrations.
|
|
7
|
+
const IDENTITY_TOKEN_SCOPE = 'members:identity';
|
|
8
|
+
const ENTITLEMENT_TOKEN_SCOPE = 'members:entitlements:read';
|
|
9
|
+
|
|
5
10
|
module.exports = class TokenService {
|
|
6
11
|
constructor({
|
|
7
12
|
privateKey,
|
|
@@ -19,7 +24,8 @@ module.exports = class TokenService {
|
|
|
19
24
|
const jwk = await this._keyStoreReady;
|
|
20
25
|
return jwt.sign({
|
|
21
26
|
sub,
|
|
22
|
-
kid: jwk.kid
|
|
27
|
+
kid: jwk.kid,
|
|
28
|
+
scope: IDENTITY_TOKEN_SCOPE
|
|
23
29
|
}, this._privateKey, {
|
|
24
30
|
keyid: jwk.kid,
|
|
25
31
|
algorithm: 'RS512',
|
|
@@ -40,7 +46,7 @@ module.exports = class TokenService {
|
|
|
40
46
|
return jwt.sign({
|
|
41
47
|
sub,
|
|
42
48
|
kid: jwk.kid,
|
|
43
|
-
scope:
|
|
49
|
+
scope: ENTITLEMENT_TOKEN_SCOPE,
|
|
44
50
|
member_uuid: memberUuid,
|
|
45
51
|
paid,
|
|
46
52
|
active_tier_ids: activeTierIds,
|
|
@@ -55,6 +61,15 @@ module.exports = class TokenService {
|
|
|
55
61
|
}
|
|
56
62
|
|
|
57
63
|
/**
|
|
64
|
+
* Decode and verify a member *identity* token.
|
|
65
|
+
*
|
|
66
|
+
* Identity and entitlement tokens are signed with the same key and share the
|
|
67
|
+
* same issuer/audience, so a signature check alone cannot tell them apart.
|
|
68
|
+
* They are distinguished by `scope`: only tokens scoped `members:identity`
|
|
69
|
+
* may act as the member. Read-only entitlement tokens
|
|
70
|
+
* (`members:entitlements:read`) are handed to integrations and must never be
|
|
71
|
+
* accepted on state-changing endpoints.
|
|
72
|
+
*
|
|
58
73
|
* @param {string} token
|
|
59
74
|
* @returns {Promise<jwt.JwtPayload>}
|
|
60
75
|
*/
|
|
@@ -70,6 +85,10 @@ module.exports = class TokenService {
|
|
|
70
85
|
return {sub: result};
|
|
71
86
|
}
|
|
72
87
|
|
|
88
|
+
if (result.scope !== IDENTITY_TOKEN_SCOPE) {
|
|
89
|
+
throw new jwt.JsonWebTokenError('Only identity tokens can act as a member');
|
|
90
|
+
}
|
|
91
|
+
|
|
73
92
|
return result;
|
|
74
93
|
}
|
|
75
94
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NotificationEmailService = void 0;
|
|
4
|
+
const sanitize_email_html_1 = require("./sanitize-email-html");
|
|
5
|
+
/**
|
|
6
|
+
* Renders a notification email in the shared shell and sends it to each
|
|
7
|
+
* recipient. Recipient resolution is a separate concern handled by the caller.
|
|
8
|
+
*/
|
|
9
|
+
class NotificationEmailService {
|
|
10
|
+
mailer;
|
|
11
|
+
generateEmailContent;
|
|
12
|
+
getSiteUrl;
|
|
13
|
+
constructor(deps) {
|
|
14
|
+
this.mailer = deps.mailer;
|
|
15
|
+
this.generateEmailContent = deps.generateEmailContent;
|
|
16
|
+
this.getSiteUrl = deps.getSiteUrl;
|
|
17
|
+
}
|
|
18
|
+
async send({ to, subject, content }) {
|
|
19
|
+
if (!to.length) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const message = (0, sanitize_email_html_1.sanitizeEmailHtml)(content);
|
|
23
|
+
const siteUrl = this.getSiteUrl();
|
|
24
|
+
for (const recipient of to) {
|
|
25
|
+
const { html, text } = await this.generateEmailContent({
|
|
26
|
+
template: 'notification',
|
|
27
|
+
data: { message, siteUrl, recipientEmail: recipient }
|
|
28
|
+
});
|
|
29
|
+
await this.mailer.send({
|
|
30
|
+
to: recipient,
|
|
31
|
+
subject,
|
|
32
|
+
html,
|
|
33
|
+
...(text ? { text } : {})
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.NotificationEmailService = NotificationEmailService;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import {sanitizeEmailHtml} from './sanitize-email-html';
|
|
2
|
+
|
|
3
|
+
interface Mailer {
|
|
4
|
+
send(options: {to: string; subject: string; html: string; text?: string}): Promise<unknown>;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
interface GenerateEmailContent {
|
|
8
|
+
(options: {template: string; data: Record<string, unknown>}): Promise<{html: string; text?: string}>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface NotificationEmailDeps {
|
|
12
|
+
mailer: Mailer;
|
|
13
|
+
generateEmailContent: GenerateEmailContent;
|
|
14
|
+
getSiteUrl: () => string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface NotificationEmailMessage {
|
|
18
|
+
/**
|
|
19
|
+
* Resolved recipient addresses. The service does not decide who receives
|
|
20
|
+
* the email; callers compose recipients via a separate audience helper.
|
|
21
|
+
*/
|
|
22
|
+
to: string[];
|
|
23
|
+
subject: string;
|
|
24
|
+
/**
|
|
25
|
+
* Untrusted HTML content. Sanitised before being rendered into the shell,
|
|
26
|
+
* so the email cannot ship scripts, event handlers or unsafe links even
|
|
27
|
+
* if the upstream source is compromised.
|
|
28
|
+
*/
|
|
29
|
+
content: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Renders a notification email in the shared shell and sends it to each
|
|
34
|
+
* recipient. Recipient resolution is a separate concern handled by the caller.
|
|
35
|
+
*/
|
|
36
|
+
export class NotificationEmailService {
|
|
37
|
+
private readonly mailer: Mailer;
|
|
38
|
+
private readonly generateEmailContent: GenerateEmailContent;
|
|
39
|
+
private readonly getSiteUrl: () => string;
|
|
40
|
+
|
|
41
|
+
constructor(deps: NotificationEmailDeps) {
|
|
42
|
+
this.mailer = deps.mailer;
|
|
43
|
+
this.generateEmailContent = deps.generateEmailContent;
|
|
44
|
+
this.getSiteUrl = deps.getSiteUrl;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async send({to, subject, content}: NotificationEmailMessage): Promise<void> {
|
|
48
|
+
if (!to.length) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const message = sanitizeEmailHtml(content);
|
|
52
|
+
const siteUrl = this.getSiteUrl();
|
|
53
|
+
for (const recipient of to) {
|
|
54
|
+
const {html, text} = await this.generateEmailContent({
|
|
55
|
+
template: 'notification',
|
|
56
|
+
data: {message, siteUrl, recipientEmail: recipient}
|
|
57
|
+
});
|
|
58
|
+
await this.mailer.send({
|
|
59
|
+
to: recipient,
|
|
60
|
+
subject,
|
|
61
|
+
html,
|
|
62
|
+
...(text ? {text} : {})
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.sanitizeEmailHtml = sanitizeEmailHtml;
|
|
7
|
+
const sanitize_html_1 = __importDefault(require("sanitize-html"));
|
|
8
|
+
// Even though the upstream feed is operated by Ghost org, the resulting HTML
|
|
9
|
+
// is rendered into admin inboxes on the receiving install. A compromised or
|
|
10
|
+
// malformed feed entry must not be able to ship scripts, event handlers, or
|
|
11
|
+
// non-http(s) URLs to recipients via this path.
|
|
12
|
+
const ALLOWED_TAGS = [
|
|
13
|
+
'p', 'br', 'hr',
|
|
14
|
+
'strong', 'b', 'em', 'i', 'u', 'code',
|
|
15
|
+
'a',
|
|
16
|
+
'ul', 'ol', 'li',
|
|
17
|
+
'blockquote',
|
|
18
|
+
'h1', 'h2', 'h3', 'h4'
|
|
19
|
+
];
|
|
20
|
+
const ALLOWED_SCHEMES = ['http', 'https', 'mailto'];
|
|
21
|
+
const SANITIZE_OPTIONS = {
|
|
22
|
+
allowedTags: ALLOWED_TAGS,
|
|
23
|
+
allowedAttributes: {
|
|
24
|
+
a: ['href', 'title', 'target', 'rel']
|
|
25
|
+
},
|
|
26
|
+
allowedSchemes: ALLOWED_SCHEMES,
|
|
27
|
+
allowProtocolRelative: false,
|
|
28
|
+
transformTags: {
|
|
29
|
+
a: sanitize_html_1.default.simpleTransform('a', {
|
|
30
|
+
target: '_blank',
|
|
31
|
+
rel: 'noopener noreferrer'
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
function sanitizeEmailHtml(html) {
|
|
36
|
+
return (0, sanitize_html_1.default)(html, SANITIZE_OPTIONS);
|
|
37
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import sanitizeHtml from 'sanitize-html';
|
|
2
|
+
|
|
3
|
+
// Even though the upstream feed is operated by Ghost org, the resulting HTML
|
|
4
|
+
// is rendered into admin inboxes on the receiving install. A compromised or
|
|
5
|
+
// malformed feed entry must not be able to ship scripts, event handlers, or
|
|
6
|
+
// non-http(s) URLs to recipients via this path.
|
|
7
|
+
const ALLOWED_TAGS = [
|
|
8
|
+
'p', 'br', 'hr',
|
|
9
|
+
'strong', 'b', 'em', 'i', 'u', 'code',
|
|
10
|
+
'a',
|
|
11
|
+
'ul', 'ol', 'li',
|
|
12
|
+
'blockquote',
|
|
13
|
+
'h1', 'h2', 'h3', 'h4'
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
const ALLOWED_SCHEMES = ['http', 'https', 'mailto'];
|
|
17
|
+
|
|
18
|
+
const SANITIZE_OPTIONS: sanitizeHtml.IOptions = {
|
|
19
|
+
allowedTags: ALLOWED_TAGS,
|
|
20
|
+
allowedAttributes: {
|
|
21
|
+
a: ['href', 'title', 'target', 'rel']
|
|
22
|
+
},
|
|
23
|
+
allowedSchemes: ALLOWED_SCHEMES,
|
|
24
|
+
allowProtocolRelative: false,
|
|
25
|
+
transformTags: {
|
|
26
|
+
a: sanitizeHtml.simpleTransform('a', {
|
|
27
|
+
target: '_blank',
|
|
28
|
+
rel: 'noopener noreferrer'
|
|
29
|
+
})
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export function sanitizeEmailHtml(html: string): string {
|
|
34
|
+
return sanitizeHtml(html, SANITIZE_OPTIONS);
|
|
35
|
+
}
|
|
@@ -95,20 +95,10 @@ class RouteSettings {
|
|
|
95
95
|
await this.createBackupFile(this.settingsPath, this.backupPath);
|
|
96
96
|
await this.saveFile(filePath, this.settingsPath);
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
const resetUrlState = () => {
|
|
100
|
-
if (isLazy) {
|
|
101
|
-
// Drop registered router configs; reloadFrontend re-registers them.
|
|
102
|
-
urlService.facade.reset();
|
|
103
|
-
} else {
|
|
104
|
-
urlService.resetGenerators({releaseResourcesOnly: true});
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
resetUrlState();
|
|
98
|
+
urlService.resetGenerators({releaseResourcesOnly: true});
|
|
109
99
|
|
|
110
100
|
const bringBackValidRoutes = async () => {
|
|
111
|
-
|
|
101
|
+
urlService.resetGenerators({releaseResourcesOnly: true});
|
|
112
102
|
|
|
113
103
|
await this.restoreBackupFile(this.settingsPath, this.backupPath);
|
|
114
104
|
|
|
@@ -124,12 +114,6 @@ class RouteSettings {
|
|
|
124
114
|
});
|
|
125
115
|
}
|
|
126
116
|
|
|
127
|
-
// The lazy URL service has nothing to precompute, so the readiness
|
|
128
|
-
// poll below is unnecessary; hasFinished() returns true immediately.
|
|
129
|
-
if (isLazy) {
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
117
|
// @TODO: how can we get rid of this from here?
|
|
134
118
|
let tries = 0;
|
|
135
119
|
|
|
@@ -429,7 +429,8 @@ module.exports = function validate(object) {
|
|
|
429
429
|
}
|
|
430
430
|
|
|
431
431
|
// TODO: extract this config outta here! the config should be passed into this module
|
|
432
|
-
|
|
432
|
+
const {QUERY, TAXONOMIES} = require('../../../frontend/services/routing/config');
|
|
433
|
+
RESOURCE_CONFIG = {QUERY, TAXONOMIES};
|
|
433
434
|
|
|
434
435
|
object.routes = _private.validateRoutes(object.routes);
|
|
435
436
|
object.collections = _private.validateCollections(object.collections);
|
|
@@ -11,6 +11,7 @@ const databaseInfo = require('../../data/db/info');
|
|
|
11
11
|
const request = require('@tryghost/request');
|
|
12
12
|
const ghostVersion = require('@tryghost/version');
|
|
13
13
|
const UpdateCheckService = require('./update-check-service');
|
|
14
|
+
const {NotificationEmailService} = require('../notifications/notification-email');
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Initializes and triggers update check
|
|
@@ -34,8 +35,14 @@ module.exports = async ({
|
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
const
|
|
38
|
-
const ghostMailer = new GhostMailer();
|
|
38
|
+
const mailService = require('../mail');
|
|
39
|
+
const ghostMailer = new mailService.GhostMailer();
|
|
40
|
+
|
|
41
|
+
const notificationEmailService = new NotificationEmailService({
|
|
42
|
+
mailer: ghostMailer,
|
|
43
|
+
generateEmailContent: mailService.utils.generateContent,
|
|
44
|
+
getSiteUrl: () => urlUtils.urlFor('home', true)
|
|
45
|
+
});
|
|
39
46
|
|
|
40
47
|
const updateChecker = new UpdateCheckService({
|
|
41
48
|
api: {
|
|
@@ -66,7 +73,7 @@ module.exports = async ({
|
|
|
66
73
|
rethrowErrors
|
|
67
74
|
},
|
|
68
75
|
request,
|
|
69
|
-
|
|
76
|
+
notificationEmailService
|
|
70
77
|
});
|
|
71
78
|
|
|
72
79
|
await updateChecker.check();
|
|
@@ -50,14 +50,14 @@ class UpdateCheckService {
|
|
|
50
50
|
* @param {boolean} [options.config.forceUpdate]
|
|
51
51
|
* @param {string} options.config.ghostVersion - Ghost instance version
|
|
52
52
|
* @param {Function} options.request - a HTTP request proxy function
|
|
53
|
-
* @param {
|
|
53
|
+
* @param {Object} options.notificationEmailService - service that sends a sanitised, shell-rendered notification email to a recipient list
|
|
54
54
|
*/
|
|
55
|
-
constructor({api, config, request,
|
|
55
|
+
constructor({api, config, request, notificationEmailService}) {
|
|
56
56
|
this.api = api;
|
|
57
57
|
this.config = config;
|
|
58
58
|
this.logging = logging;
|
|
59
59
|
this.request = request;
|
|
60
|
-
this.
|
|
60
|
+
this.notificationEmailService = notificationEmailService;
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
nextCheckTimestamp() {
|
|
@@ -315,15 +315,6 @@ class UpdateCheckService {
|
|
|
315
315
|
}
|
|
316
316
|
|
|
317
317
|
debug(`creating custom notifications for ${notification.messages.length} notifications`);
|
|
318
|
-
const {users} = await this.api.users.browse(Object.assign({
|
|
319
|
-
limit: 'all',
|
|
320
|
-
include: ['roles'],
|
|
321
|
-
filter: 'status:active'
|
|
322
|
-
}, internal));
|
|
323
|
-
|
|
324
|
-
const adminEmails = users
|
|
325
|
-
.filter(user => ['Owner', 'Administrator'].includes(user.roles[0].name))
|
|
326
|
-
.map(user => user.email);
|
|
327
318
|
|
|
328
319
|
const siteUrl = this.config.siteUrl;
|
|
329
320
|
|
|
@@ -340,19 +331,21 @@ class UpdateCheckService {
|
|
|
340
331
|
};
|
|
341
332
|
|
|
342
333
|
if (toAdd.type === 'alert') {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
334
|
+
try {
|
|
335
|
+
const {users} = await this.api.users.browse({
|
|
336
|
+
filter: 'status:active+roles.name:[Owner,Administrator]',
|
|
337
|
+
...internal
|
|
338
|
+
});
|
|
339
|
+
const to = users.map(user => user.email);
|
|
340
|
+
await this.notificationEmailService.send({
|
|
341
|
+
to,
|
|
342
|
+
subject: `Action required: Critical alert from Ghost instance ${siteUrl}`,
|
|
343
|
+
content: toAdd.message
|
|
344
|
+
});
|
|
345
|
+
} catch (err) {
|
|
346
|
+
this.logging.error(err);
|
|
347
|
+
if (this.config.rethrowErrors) {
|
|
348
|
+
throw err;
|
|
356
349
|
}
|
|
357
350
|
}
|
|
358
351
|
}
|
|
@@ -2,7 +2,6 @@ const config = require('../../../shared/config');
|
|
|
2
2
|
const LocalFileCache = require('./local-file-cache');
|
|
3
3
|
const UrlService = require('./url-service');
|
|
4
4
|
const UrlServiceFacade = require('./url-service-facade');
|
|
5
|
-
const LazyUrlService = require('./lazy-url-service');
|
|
6
5
|
|
|
7
6
|
// NOTE: instead of a path we could give UrlService a "data-resolver" of some sort
|
|
8
7
|
// so it doesn't have to contain the logic to read data at all. This would be
|
|
@@ -23,21 +22,7 @@ if (process.env.NODE_ENV.startsWith('test')){
|
|
|
23
22
|
|
|
24
23
|
const cache = new LocalFileCache({storagePath, writeDisabled});
|
|
25
24
|
const urlService = new UrlService({cache});
|
|
26
|
-
|
|
27
|
-
// LazyUrlService is only attached to the facade when the lazyRouting flag is
|
|
28
|
-
// on. The eager UrlService stays in the require graph either way so test code
|
|
29
|
-
// and partially-migrated callers continue to work. The model layer is only
|
|
30
|
-
// pulled in when the flag is on so flag-off boot keeps its existing
|
|
31
|
-
// require-graph shape.
|
|
32
|
-
let lazyUrlService = null;
|
|
33
|
-
if (config.get('lazyRouting')) {
|
|
34
|
-
const models = require('../../models');
|
|
35
|
-
const {createFindResource} = require('./lazy-find-resource');
|
|
36
|
-
|
|
37
|
-
lazyUrlService = new LazyUrlService({findResource: createFindResource(models)});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const urlServiceFacade = new UrlServiceFacade({urlService, lazyUrlService});
|
|
25
|
+
const urlServiceFacade = new UrlServiceFacade({urlService});
|
|
41
26
|
|
|
42
27
|
// Singleton: default export remains the eager UrlService for backwards
|
|
43
28
|
// compatibility with existing imports. The new facade is exposed alongside
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ghost",
|
|
3
|
-
"version": "6.44.
|
|
3
|
+
"version": "6.44.1",
|
|
4
4
|
"description": "The professional publishing platform",
|
|
5
5
|
"author": "Ghost Foundation",
|
|
6
6
|
"homepage": "https://ghost.org",
|
|
@@ -268,6 +268,7 @@
|
|
|
268
268
|
"@types/nodemailer": "6.4.23",
|
|
269
269
|
"@types/on-headers": "1.0.4",
|
|
270
270
|
"@types/papaparse": "5.5.2",
|
|
271
|
+
"@types/sanitize-html": "2.16.1",
|
|
271
272
|
"@types/sinon": "17.0.4",
|
|
272
273
|
"@types/supertest": "6.0.3",
|
|
273
274
|
"@typescript-eslint/parser": "8.49.0",
|
package/pnpm-lock.yaml
CHANGED
|
@@ -605,6 +605,9 @@ importers:
|
|
|
605
605
|
'@types/papaparse':
|
|
606
606
|
specifier: 5.5.2
|
|
607
607
|
version: 5.5.2
|
|
608
|
+
'@types/sanitize-html':
|
|
609
|
+
specifier: 2.16.1
|
|
610
|
+
version: 2.16.1
|
|
608
611
|
'@types/sinon':
|
|
609
612
|
specifier: 17.0.4
|
|
610
613
|
version: 17.0.4
|
|
@@ -3660,6 +3663,9 @@ packages:
|
|
|
3660
3663
|
'@types/responselike@1.0.3':
|
|
3661
3664
|
resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
|
|
3662
3665
|
|
|
3666
|
+
'@types/sanitize-html@2.16.1':
|
|
3667
|
+
resolution: {integrity: sha512-n9wjs8bCOTyN/ynwD8s/nTcTreIHB1vf31vhLMGqUPNHaweKC4/fAl4Dj+hUlCTKYgm4P3k83fmiFfzkZ6sgMA==}
|
|
3668
|
+
|
|
3663
3669
|
'@types/send@0.17.6':
|
|
3664
3670
|
resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
|
|
3665
3671
|
|
|
@@ -7125,7 +7131,7 @@ packages:
|
|
|
7125
7131
|
hasBin: true
|
|
7126
7132
|
|
|
7127
7133
|
mock-knex@https://codeload.github.com/TryGhost/mock-knex/tar.gz/68948e11b0ea4fe63456098dfdc169bea7f62009:
|
|
7128
|
-
resolution: {tarball: https://codeload.github.com/TryGhost/mock-knex/tar.gz/68948e11b0ea4fe63456098dfdc169bea7f62009}
|
|
7134
|
+
resolution: {gitHosted: true, integrity: sha512-VVShGrOVsuUDz9ueLO/3hcMzwNGr/e/dvYoiXCJSs7hI8TWdSWsEXDURWp251+NZHEZG/CI+L78lBFv+piGfxg==, tarball: https://codeload.github.com/TryGhost/mock-knex/tar.gz/68948e11b0ea4fe63456098dfdc169bea7f62009}
|
|
7129
7135
|
version: 0.4.13
|
|
7130
7136
|
peerDependencies:
|
|
7131
7137
|
knex: '> 0.8'
|
|
@@ -12820,6 +12826,10 @@ snapshots:
|
|
|
12820
12826
|
dependencies:
|
|
12821
12827
|
'@types/node': 22.19.19
|
|
12822
12828
|
|
|
12829
|
+
'@types/sanitize-html@2.16.1':
|
|
12830
|
+
dependencies:
|
|
12831
|
+
htmlparser2: 10.1.0
|
|
12832
|
+
|
|
12823
12833
|
'@types/send@0.17.6':
|
|
12824
12834
|
dependencies:
|
|
12825
12835
|
'@types/mime': 1.3.5
|
package/pnpm-workspace.yaml
CHANGED
|
@@ -41,6 +41,7 @@ catalog:
|
|
|
41
41
|
'@types/node': 22.19.19
|
|
42
42
|
'@types/react': 18.3.29
|
|
43
43
|
'@types/react-dom': 18.3.7
|
|
44
|
+
'@types/sanitize-html': 2.16.1
|
|
44
45
|
'@types/validator': 13.15.10
|
|
45
46
|
'@typescript-eslint/eslint-plugin': 8.49.0
|
|
46
47
|
'@typescript-eslint/parser': 8.49.0
|
|
@@ -49,6 +50,7 @@ catalog:
|
|
|
49
50
|
bson-objectid: 2.0.4
|
|
50
51
|
c8: 11.0.0
|
|
51
52
|
chai: 4.5.0
|
|
53
|
+
chalk: 4.1.2
|
|
52
54
|
clsx: 2.1.1
|
|
53
55
|
concurrently: 10.0.0
|
|
54
56
|
cross-fetch: 4.1.0
|