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.
Files changed (267) hide show
  1. package/core/boot.js +9 -13
  2. package/core/bridge.js +6 -10
  3. package/core/built/admin/assets/{PolarAngleAxis-eFuSrR7S.js → PolarAngleAxis-DWP6qq-Z.js} +2 -2
  4. package/core/built/admin/assets/{_baseAssignValue-XVHfKew7.js → _baseAssignValue-N9f4o_XK.js} +1 -1
  5. package/core/built/admin/assets/{a-large-small-DOzPDzKp.js → a-large-small-BOAtcFiE.js} +1 -1
  6. package/core/built/admin/assets/{account-migration-Cx45M5qm.js → account-migration-CtZx_5ib.js} +1 -1
  7. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
  8. package/core/built/admin/assets/admin-x-settings/{code-editor-view-Bi8Orhyj.mjs → code-editor-view-BMovCjer.mjs} +2 -2
  9. package/core/built/admin/assets/admin-x-settings/{index-1_V9g9Pt.mjs → index-BT1n-g2b.mjs} +3 -3
  10. package/core/built/admin/assets/admin-x-settings/{index-e9saYQJa.mjs → index-BnowNBGd.mjs} +5 -5
  11. package/core/built/admin/assets/admin-x-settings/{index-CnvQi01U.mjs → index-CRpK6gF8.mjs} +3 -3
  12. package/core/built/admin/assets/admin-x-settings/{index-BmU6BOfy.mjs → index-CfXS3AZ8.mjs} +3 -3
  13. package/core/built/admin/assets/admin-x-settings/{index-EuMiBt6I.mjs → index-Cs8zML6u.mjs} +3 -3
  14. package/core/built/admin/assets/admin-x-settings/{index-B43MPc5u.mjs → index-DmpwO1w3.mjs} +2 -2
  15. package/core/built/admin/assets/admin-x-settings/{index-DOgG0XZa.mjs → index-DwFIdhcR.mjs} +3 -3
  16. package/core/built/admin/assets/admin-x-settings/{index-CWdxMIcZ.mjs → index-sNyPiIJA.mjs} +2 -2
  17. package/core/built/admin/assets/admin-x-settings/{index-Ojg_pBvq.mjs → index-xTILut54.mjs} +1259 -1259
  18. package/core/built/admin/assets/admin-x-settings/{modals-Ckbx9UQF.mjs → modals-Cm5t13os.mjs} +9 -9
  19. package/core/built/admin/assets/{arrow-right-DckEQtp9.js → arrow-right-BxdHN_En.js} +1 -1
  20. package/core/built/admin/assets/{at-sign-BChf68aS.js → at-sign-Cajf-dOf.js} +1 -1
  21. package/core/built/admin/assets/{audience-BYU5Bd7D.js → audience-CHNb9mCT.js} +1 -1
  22. package/core/built/admin/assets/{automated-email-design-Z26Qit0_.js → automated-email-design-B9C9mKUS.js} +2 -2
  23. package/core/built/admin/assets/{automated-emails-aBicreLv.js → automated-emails-DhLhkq8L.js} +1 -1
  24. package/core/built/admin/assets/{automations-vpH-d72N.js → automations-6-cgZovk.js} +1 -1
  25. package/core/built/admin/assets/{automations-Ddo22yPk.js → automations-CxJ-N_YK.js} +1 -1
  26. package/core/built/admin/assets/{avatar-flipboard-CoI3LQ-o.js → avatar-flipboard-f5nSMmek.js} +1 -1
  27. package/core/built/admin/assets/{bluesky-sharing-iVDkCMKN.js → bluesky-sharing-Dm2k8qZH.js} +1 -1
  28. package/core/built/admin/assets/{chart-CjM1VQqH.js → chart-BbJnjWey.js} +23 -23
  29. package/core/built/admin/assets/{checkbox-CC5kd_Kf.js → checkbox-CT7DNFAI.js} +1 -1
  30. package/core/built/admin/assets/{chevron-up-D__wzyXT.js → chevron-up-BxijmTT9.js} +1 -1
  31. package/core/built/admin/assets/{chunk.696.79505fa556d329d6e824.js → chunk.167.37bb0d7f6ac67fefa679.js} +3184 -3523
  32. package/core/built/admin/assets/{chunk.696.79505fa556d329d6e824.js.LICENSE.txt → chunk.167.37bb0d7f6ac67fefa679.js.LICENSE.txt} +1 -1
  33. package/core/built/admin/assets/{chunk.524.1ff649a6cc62dc38f538.js → chunk.524.ed812b62217210a913d4.js} +5 -5
  34. package/core/built/admin/assets/{chunk.582.408a40e0095e479e3d11.js → chunk.582.7db5c9f17bca5a484049.js} +6 -6
  35. package/core/built/admin/assets/{chunk.945.835812fcb16029abd7f9.js → chunk.834.f9db7c62b9457db93e8c.js} +3 -3
  36. package/core/built/admin/assets/{code-editor-view-C735d5EA.js → code-editor-view-D8slE0IA.js} +1 -1
  37. package/core/built/admin/assets/{comments-DgFPax3Y.js → comments-BvfR-fA8.js} +1 -1
  38. package/core/built/admin/assets/{content-helpers-DjugSfvm.js → content-helpers-DUWGLvgL.js} +1 -1
  39. package/core/built/admin/assets/{copy-D9JONGcK.js → copy-ht18t5gu.js} +1 -1
  40. package/core/built/admin/assets/{data-list-QWLEHG4y.js → data-list-Daha2dIs.js} +1 -1
  41. package/core/built/admin/assets/{deleted-feed-item-CwSCflTW.js → deleted-feed-item-ChP5bwgi.js} +1 -1
  42. package/core/built/admin/assets/{dropzone-lK_4vpWS.js → dropzone-h_qyk514.js} +1 -1
  43. package/core/built/admin/assets/{edit-profile-BmioJZHv.js → edit-profile-BT8RQpAG.js} +1 -1
  44. package/core/built/admin/assets/editor-s1mqd9_o.js +8 -0
  45. package/core/built/admin/assets/{empty-indicator-Dg64lT_g.js → empty-indicator-BIUvv6JE.js} +1 -1
  46. package/core/built/admin/assets/{en-DCwBNJ98.js → en-BEcDl42w.js} +1 -1
  47. package/core/built/admin/assets/{eye-psLxWnjO.js → eye-TPnIdamu.js} +1 -1
  48. package/core/built/admin/assets/{feed-TUcCSZHL.js → feed-BK3qvLWi.js} +1 -1
  49. package/core/built/admin/assets/{field-Uk8NOvtc.js → field-CSFsrvVy.js} +1 -1
  50. package/core/built/admin/assets/{filter-query-core-CbH_VKcG.js → filter-query-core-R8cQCO2w.js} +1 -1
  51. package/core/built/admin/assets/{filters-DmawZ5Uu.js → filters-Cp1voB1e.js} +1 -1
  52. package/core/built/admin/assets/gh-chart-BFsyOJD_.js +1 -0
  53. package/core/built/admin/assets/{ghost-2baa7ddc3630015f41c0efd13bd586b8.js → ghost-1881362e8a92dae1e3333a0484c173a3.js} +7 -6
  54. package/core/built/admin/assets/{growth-BAl-TyMy.js → growth-DIigOxF1.js} +1 -1
  55. package/core/built/admin/assets/{hash-Q1ou0OMZ.js → hash-B3iFVeCl.js} +1 -1
  56. package/core/built/admin/assets/{inbox-BAOtR6tN.js → inbox-2bPMLikt.js} +1 -1
  57. package/core/built/admin/assets/{index-BnJp51QE.js → index-52qUC8yv.js} +5 -5
  58. package/core/built/admin/assets/{index-BDIwushG.js → index-9j01Aj_X.js} +1 -1
  59. package/core/built/admin/assets/index-B9UVpmey.js +1 -0
  60. package/core/built/admin/assets/{index-DTeOW3Se.js → index-BXc5OF6x.js} +1 -1
  61. package/core/built/admin/assets/{index-Duc21aJ7.js → index-BaGL3IFe.js} +1 -1
  62. package/core/built/admin/assets/{index-DKC8uXHk.js → index-BdozZbt2.js} +2 -2
  63. package/core/built/admin/assets/{index-z951kI4K.js → index-Bgpz7M7i.js} +1 -1
  64. package/core/built/admin/assets/{index-BfSvX9is.js → index-Bp4O7TVf.js} +1 -1
  65. package/core/built/admin/assets/{index-C5S08C6P.js → index-BuqUmpe9.js} +1 -1
  66. package/core/built/admin/assets/{index-D7OtVnbo.js → index-CEF_Ofn0.js} +1 -1
  67. package/core/built/admin/assets/{index-Bs6rUYFS.js → index-CgSVv5Up.js} +58 -58
  68. package/core/built/admin/assets/{index-Ro9qXetv.js → index-Cr6x2czK.js} +1 -1
  69. package/core/built/admin/assets/{index-DJbgQjV6.js → index-CrbZj3Ju.js} +1 -1
  70. package/core/built/admin/assets/{index-BTBcWw_z.js → index-CrlAPDdD.js} +2 -2
  71. package/core/built/admin/assets/{index-B6SD2Qs-.js → index-CtrmMGWT.js} +1 -1
  72. package/core/built/admin/assets/{index-Bw0oyOFd.js → index-D-V_DAdt.js} +1 -1
  73. package/core/built/admin/assets/{index-DAJduTBl.js → index-D0poOSjw.js} +4 -4
  74. package/core/built/admin/assets/{index-CGT3W8fi.js → index-DWVGCPEC.js} +3 -3
  75. package/core/built/admin/assets/index-Dozbr_4s.css +1 -0
  76. package/core/built/admin/assets/{index-FyplpnYQ.js → index-S3Ai3lDy.js} +1 -1
  77. package/core/built/admin/assets/{index-DLr8D_Ks.js → index-VDhA5kgU.js} +1 -1
  78. package/core/built/admin/assets/{index-DRA1fORQ.js → index-fnIFqFMt.js} +1 -1
  79. package/core/built/admin/assets/{index-BhWQZObu.js → index-kA3UcdW7.js} +1 -1
  80. package/core/built/admin/assets/{input-group-DH32syTz.js → input-group-Fdl0S6pw.js} +1 -1
  81. package/core/built/admin/assets/{koenig-lexical-CxVcbgsH.js → koenig-lexical-REiYtzGD.js} +1 -1
  82. package/core/built/admin/assets/{kpi-card-DBWHDi3l.js → kpi-card-BS8vEj4c.js} +1 -1
  83. package/core/built/admin/assets/{kpi-card-BYhzWV5F.js → kpi-card-D3HEfOCP.js} +1 -1
  84. package/core/built/admin/assets/{kpi-tabs-Kxc-utyg.js → kpi-tabs-8vaI7yWq.js} +1 -1
  85. package/core/built/admin/assets/kpis-CkD0Xteg.js +1 -0
  86. package/core/built/admin/assets/label-DT38Gd2T.js +1 -0
  87. package/core/built/admin/assets/{links-Cg8O8ZGP.js → links-BK-azjCL.js} +1 -1
  88. package/core/built/admin/assets/{list-page-D2KCBsiy.js → list-page-DVpac3lc.js} +1 -1
  89. package/core/built/admin/assets/{loader-circle-nmLqhMZL.js → loader-circle-CIq5Cv-9.js} +1 -1
  90. package/core/built/admin/assets/{mail-D7cxYMd5.js → mail-gdeIU06V.js} +1 -1
  91. package/core/built/admin/assets/{main-layout-BXdUkeCo.js → main-layout-B2t-RiNE.js} +1 -1
  92. package/core/built/admin/assets/members-7z-tESWd.js +10 -0
  93. package/core/built/admin/assets/minus-BbGfVkll.js +1 -0
  94. package/core/built/admin/assets/{modals-VRvX8mK0.js → modals-DVIfijEz.js} +3 -3
  95. package/core/built/admin/assets/{moderation-DkT8qVJs.js → moderation-DwzDOhih.js} +1 -1
  96. package/core/built/admin/assets/{newsletter-sUT4ciRJ.js → newsletter-D1N8bUfp.js} +1 -1
  97. package/core/built/admin/assets/{newsletters-BNvAF2Oi.js → newsletters-7GSeQdQe.js} +1 -1
  98. package/core/built/admin/assets/{note-B0JhJv7s.js → note-Bn1-ZWDE.js} +1 -1
  99. package/core/built/admin/assets/offers-BsuLKYy9.js +1 -0
  100. package/core/built/admin/assets/{onboarding-route-IrO_SCb3.js → onboarding-route-C73r9kyO.js} +1 -1
  101. package/core/built/admin/assets/{overview-C2nk_B6i.js → overview-6U5p38zx.js} +1 -1
  102. package/core/built/admin/assets/{pagemenu-BGhty1iq.js → pagemenu-DrueoEX9.js} +1 -1
  103. package/core/built/admin/assets/{pencil-DiA3J4m5.js → pencil-Csnv8udS.js} +1 -1
  104. package/core/built/admin/assets/{pin-off-HWos3YHh.js → pin-off-BDeHGsSQ.js} +1 -1
  105. package/core/built/admin/assets/{post-analytics-context-BJwP-XAB.js → post-analytics-context-jKeUh2Ka.js} +1 -1
  106. package/core/built/admin/assets/{post-analytics-header-CZF5QmAD.js → post-analytics-header-C5QLn6Lm.js} +1 -1
  107. package/core/built/admin/assets/{post-analytics-DBUHbt1b.js → post-analytics-ngMqqbt9.js} +1 -1
  108. package/core/built/admin/assets/{post-share-modal-Bb8R05dH.js → post-share-modal-04B7JT4R.js} +1 -1
  109. package/core/built/admin/assets/posts/{alert-dialog-mmQvJUHQ.mjs → alert-dialog-CYvHtOQ5.mjs} +4 -4
  110. package/core/built/admin/assets/posts/{app-utils-CD0bhOLs.mjs → app-utils-Cs-8qje1.mjs} +3 -3
  111. package/core/built/admin/assets/posts/{automations-BL0WaXHA.mjs → automations-DE2rwx-Z.mjs} +25 -25
  112. package/core/built/admin/assets/posts/{automations-BmGKngyG.mjs → automations-Dq0_cprS.mjs} +4 -4
  113. package/core/built/admin/assets/posts/{avatar-CeJ0Zq_A.mjs → avatar-Dt_bGEgl.mjs} +7 -7
  114. package/core/built/admin/assets/posts/{button-CQCNdxY6.mjs → button-DO7JrPsL.mjs} +2 -2
  115. package/core/built/admin/assets/posts/{chevron-up-DaikhWC2.mjs → chevron-up-B8WyJjCr.mjs} +3 -3
  116. package/core/built/admin/assets/posts/{comments-DUSJ25vf.mjs → comments-B3-RpqJU.mjs} +1933 -1905
  117. package/core/built/admin/assets/posts/{data-list-BiiYXQes.mjs → data-list-BiZFP6Co.mjs} +5 -5
  118. package/core/built/admin/assets/posts/{dialog-DRN6olky.mjs → dialog-Bvl2PD8s.mjs} +3 -3
  119. package/core/built/admin/assets/posts/{editor-DN_Zz0m2.mjs → editor-BCtdAD74.mjs} +3230 -3130
  120. package/core/built/admin/assets/posts/{ellipsis-BIs4PL5-.mjs → ellipsis-B5H7Hudx.mjs} +2 -2
  121. package/core/built/admin/assets/posts/{empty-indicator-Wiukrx4T.mjs → empty-indicator-BRoAf6Jv.mjs} +2 -2
  122. package/core/built/admin/assets/posts/{filters-CJl5ebXd.mjs → filters-CffYQY_8.mjs} +12 -12
  123. package/core/built/admin/assets/posts/{get-site-timezone-JepxGwVr.mjs → get-site-timezone-CSrPVUfX.mjs} +2 -2
  124. package/core/built/admin/assets/posts/{growth-cNlqbz-x.mjs → growth--LVGRPtS.mjs} +13 -13
  125. package/core/built/admin/assets/posts/{heading-C_V6Ckxx.mjs → heading-BRQEP7IA.mjs} +2 -2
  126. package/core/built/admin/assets/posts/{heart-BMBWsLs2.mjs → heart-CC2f1qWb.mjs} +2 -2
  127. package/core/built/admin/assets/posts/{hooks-D4pJ_p_P.mjs → hooks-J2WpDj1d.mjs} +2 -2
  128. package/core/built/admin/assets/posts/{index-DzWTmJMy.mjs → index-D-vhKzUJ.mjs} +3 -3
  129. package/core/built/admin/assets/posts/{index-CDwlVw9E.mjs → index-LnPyGojr.mjs} +2 -2
  130. package/core/built/admin/assets/posts/{index-BuIZkUhD.mjs → index-nxfIbREV.mjs} +11 -11
  131. package/core/built/admin/assets/posts/{input-DUvSHOFz.mjs → input-DTtfruk_.mjs} +3 -3
  132. package/core/built/admin/assets/posts/{input-surface-CO8-j6V2.mjs → input-surface-DXTGCuo2.mjs} +2 -2
  133. package/core/built/admin/assets/posts/{koenig-lexical-cRm7bY-6.mjs → koenig-lexical-CNcifuT7.mjs} +2 -2
  134. package/core/built/admin/assets/posts/{kpis-BXukzbg6.mjs → kpis-n8L4BlMi.mjs} +5843 -5854
  135. package/core/built/admin/assets/posts/{label-TTt0QyDb.mjs → label-yl8B8ADj.mjs} +6 -6
  136. package/core/built/admin/assets/posts/{links-BAXELE82.mjs → links-DDApMJfk.mjs} +4 -4
  137. package/core/built/admin/assets/posts/{list-page-DQIiFvFP.mjs → list-page-BJJ9amzJ.mjs} +4 -4
  138. package/core/built/admin/assets/posts/{loading-indicator-BsY7eGY6.mjs → loading-indicator-CQBDNvdo.mjs} +3 -3
  139. package/core/built/admin/assets/posts/{mail-Bi1gt3MU.mjs → mail-BHg0SvNu.mjs} +2 -2
  140. package/core/built/admin/assets/posts/{main-layout-DejRuxP8.mjs → main-layout-DXveCJ5W.mjs} +2 -2
  141. package/core/built/admin/assets/posts/{newsletter-PCUtHW6Z.mjs → newsletter-DUpVmnKN.mjs} +19 -19
  142. package/core/built/admin/assets/posts/{overview-f4eDWazr.mjs → overview-sv6i-2h9.mjs} +18 -18
  143. package/core/built/admin/assets/posts/{pencil-DDnfXQqn.mjs → pencil-DsGDLJp6.mjs} +2 -2
  144. package/core/built/admin/assets/posts/{plus-DW3bG6ui.mjs → plus-DjZ_REvJ.mjs} +2 -2
  145. package/core/built/admin/assets/posts/{popover-Du2NcggM.mjs → popover-2PA9zdiD.mjs} +4 -4
  146. package/core/built/admin/assets/posts/{post-analytics-BmnHyWJq.mjs → post-analytics-CKHoiJFY.mjs} +6 -6
  147. package/core/built/admin/assets/posts/{post-analytics-context-0fieM91Y.mjs → post-analytics-context-D17CB7nm.mjs} +6 -6
  148. package/core/built/admin/assets/posts/{post-analytics-header-Bxi56AWV.mjs → post-analytics-header-aQLnrdWi.mjs} +12 -12
  149. package/core/built/admin/assets/posts/{post-share-modal-DiuT4GFO.mjs → post-share-modal-C8-8CZw8.mjs} +6 -6
  150. package/core/built/admin/assets/posts/{posts-CYjfxmgX.mjs → posts-BA2vu_T2.mjs} +2 -2
  151. package/core/built/admin/assets/posts/posts.js +1 -1
  152. package/core/built/admin/assets/posts/{search-Dz7F6ifc.mjs → search-Bx6BvCRk.mjs} +2 -2
  153. package/core/built/admin/assets/posts/{select-FX6QYAFU.mjs → select-QOJ2OvL0.mjs} +7 -7
  154. package/core/built/admin/assets/posts/{separator-C7QPCSjM.mjs → separator-CHtBa4OX.mjs} +3 -3
  155. package/core/built/admin/assets/posts/{settings-DJqx19W1.mjs → settings-CxhTCxXg.mjs} +2 -2
  156. package/core/built/admin/assets/posts/{sheet-wg_8-w45.mjs → sheet-DO5nhiru.mjs} +4 -4
  157. package/core/built/admin/assets/posts/{site-Bxv-L5Dn.mjs → site-6g4pKVnR.mjs} +2 -2
  158. package/core/built/admin/assets/posts/{skeleton-DrFcKwP3.mjs → skeleton-DgWx-52p.mjs} +3 -3
  159. package/core/built/admin/assets/posts/{source-icon-DD_bmIqg.mjs → source-icon-_zLbYeab.mjs} +4 -4
  160. package/core/built/admin/assets/posts/{stats-DkOg80Vt.mjs → stats-BGJFxx5f.mjs} +4 -4
  161. package/core/built/admin/assets/posts/{switch-DZFGAF_Y.mjs → switch-Djipx7gc.mjs} +5 -5
  162. package/core/built/admin/assets/posts/{table-CZCVviNy.mjs → table-DpDCE80J.mjs} +2 -2
  163. package/core/built/admin/assets/posts/{tabs-1fkhM4p8.mjs → tabs-CLWGiyQ4.mjs} +4 -4
  164. package/core/built/admin/assets/posts/{tags-CkyGqwqi.mjs → tags-B4KIn7er.mjs} +2 -2
  165. package/core/built/admin/assets/posts/{tags-BAmugIR1.mjs → tags-Dn1L_Z_4.mjs} +16 -16
  166. package/core/built/admin/assets/posts/{toggle-group-B_ubMZvo.mjs → toggle-group-DMMjXGB3.mjs} +4 -4
  167. package/core/built/admin/assets/posts/{tooltip-D1X0uVas.mjs → tooltip-DlCjZwmt.mjs} +5 -5
  168. package/core/built/admin/assets/posts/{underline-CV8OJ7qc.mjs → underline-WN3ZSFyI.mjs} +2 -2
  169. package/core/built/admin/assets/posts/{value-DhEK7_uT.mjs → value-BWiEmo45.mjs} +2 -2
  170. package/core/built/admin/assets/posts/{virtual-list-window-DqbQUkIo.mjs → virtual-list-window-F3Tvi9H5.mjs} +3 -3
  171. package/core/built/admin/assets/posts/{web-5jcYGeBz.mjs → web-C8PxkHvH.mjs} +18 -18
  172. package/core/built/admin/assets/posts/{x-Cl72IwQm.mjs → x-BdlZ3sG3.mjs} +2 -2
  173. package/core/built/admin/assets/posts/{zap-BPDyHF1u.mjs → zap-BuAk2C7n.mjs} +33 -21
  174. package/core/built/admin/assets/{posts-D6K0FKB9.js → posts-bRma2Aji.js} +1 -1
  175. package/core/built/admin/assets/power-B4VCYMPn.js +1 -0
  176. package/core/built/admin/assets/{referrers-C9UK_aF_.js → referrers-BgXy4ZDF.js} +1 -1
  177. package/core/built/admin/assets/{repeat-BwgUDBQn.js → repeat-BElPLZnh.js} +1 -1
  178. package/core/built/admin/assets/{reply-DbknkQhJ.js → reply-qlUFZ_G8.js} +1 -1
  179. package/core/built/admin/assets/{rocket-1EqU2MzS.js → rocket-CXYckFbm.js} +1 -1
  180. package/core/built/admin/assets/{select-BGJXWb8i.js → select-MGAxyhXP.js} +1 -1
  181. package/core/built/admin/assets/{send-_CqvCQBY.js → send-DcU5LcPI.js} +1 -1
  182. package/core/built/admin/assets/{settings-Bnep890F.js → settings-DGSAz4oa.js} +4 -4
  183. package/core/built/admin/assets/{settings-Ct244PHl.js → settings-DI95fXs5.js} +1 -1
  184. package/core/built/admin/assets/{share-modal-B8pN_3tk.js → share-modal-CsNAIPeN.js} +1 -1
  185. package/core/built/admin/assets/{sort-button-EXsVVSdw.js → sort-button-wV9PBd2P.js} +1 -1
  186. package/core/built/admin/assets/{source-icon-XMs0toB0.js → source-icon-CYt4X1-M.js} +1 -1
  187. package/core/built/admin/assets/{sprout-uA_pVmDr.js → sprout-5QqpAoO8.js} +1 -1
  188. package/core/built/admin/assets/{square-atKnWQyw.js → square-YHeYyKG9.js} +1 -1
  189. package/core/built/admin/assets/{stats-CPNnZGD9.js → stats-PD64opSw.js} +1 -1
  190. package/core/built/admin/assets/{stats-view-BP8LU5rf.js → stats-view-C4fnD3uG.js} +1 -1
  191. package/core/built/admin/assets/{step-1-FHeGC4GW.js → step-1-BqeM_LxC.js} +1 -1
  192. package/core/built/admin/assets/{step-2-BFhgD2N8.js → step-2-C7AcokE9.js} +1 -1
  193. package/core/built/admin/assets/{step-3-BZMKjY5n.js → step-3-9Z0qkfpM.js} +2 -2
  194. package/core/built/admin/assets/{table-kGA62bBZ.js → table-C8Mxw8fs.js} +1 -1
  195. package/core/built/admin/assets/{tabs-Dl3BXr4Z.js → tabs-2KXMNRG-.js} +1 -1
  196. package/core/built/admin/assets/{tags-CLhASxwZ.js → tags-Cx-Jx8Yb.js} +1 -1
  197. package/core/built/admin/assets/{tags-D-W0kJMe.js → tags-cn7wgGit.js} +1 -1
  198. package/core/built/admin/assets/{textarea-DMub6CsU.js → textarea-dKwIcAK5.js} +1 -1
  199. package/core/built/admin/assets/{thumbs-up-DZu4SX5N.js → thumbs-up-gzGza05L.js} +1 -1
  200. package/core/built/admin/assets/{tiers-2bg8BCFj.js → tiers-D--LgD9v.js} +1 -1
  201. package/core/built/admin/assets/{toggle-group-ByS0KZ3G.js → toggle-group-C8KbiBQS.js} +1 -1
  202. package/core/built/admin/assets/{topic-filter-oRqwlePZ.js → topic-filter--VQn4A7D.js} +1 -1
  203. package/core/built/admin/assets/{trash-BHoSD8mS.js → trash-CnBwlhjN.js} +1 -1
  204. package/core/built/admin/assets/{underline-1YSgOpPm.js → underline-B2FjHOE0.js} +1 -1
  205. package/core/built/admin/assets/{undo-2-BwYMlB8G.js → undo-2-fUPuO2Zt.js} +1 -1
  206. package/core/built/admin/assets/{upload-BDz0_o9b.js → upload-BPOrFdtp.js} +1 -1
  207. package/core/built/admin/assets/{use-growth-stats-PRVcCUT7.js → use-growth-stats-By0ZDqFi.js} +1 -1
  208. package/core/built/admin/assets/{use-pintura-config-CROsgSEd.js → use-pintura-config-0ykvCF7U.js} +1 -1
  209. package/core/built/admin/assets/{use-simple-pagination-CBjKBNNI.js → use-simple-pagination-TruuCHV6.js} +1 -1
  210. package/core/built/admin/assets/{user-round-check-DKooQiV7.js → user-round-check-C1Vahz0b.js} +1 -1
  211. package/core/built/admin/assets/{user-round-x-B94nAYJb.js → user-round-x-CzKFo5GY.js} +1 -1
  212. package/core/built/admin/assets/{virtual-list-window-Cf_vCQFb.js → virtual-list-window-BWEknk_A.js} +1 -1
  213. package/core/built/admin/assets/{wallet-cards-BorRQari.js → wallet-cards-CRHrrjiy.js} +1 -1
  214. package/core/built/admin/assets/{web-BVHy-80k.js → web-C2H0oAut.js} +1 -1
  215. package/core/built/admin/index.html +7 -7
  216. package/core/frontend/services/llms/service.js +37 -10
  217. package/core/frontend/services/routing/config.js +5 -3
  218. package/core/frontend/services/routing/config.ts +59 -0
  219. package/core/frontend/services/sitemap/handler.js +2 -14
  220. package/core/frontend/services/sitemap/site-map-manager.js +9 -214
  221. package/core/server/api/endpoints/comment-replies.js +1 -2
  222. package/core/server/api/endpoints/members.js +4 -1
  223. package/core/server/api/endpoints/search-index-public.js +12 -1
  224. package/core/server/api/endpoints/search-index.js +13 -2
  225. package/core/server/lib/bootstrap-socket.js +31 -36
  226. package/core/server/lib/bootstrap-socket.ts +114 -0
  227. package/core/server/lib/common/to-plain.js +9 -21
  228. package/core/server/lib/common/to-plain.ts +25 -0
  229. package/core/server/models/role-utils.js +5 -7
  230. package/core/server/models/role-utils.ts +56 -0
  231. package/core/server/services/adapter-manager/adapter-manager.js +5 -1
  232. package/core/server/services/audience-feedback/audience-feedback-service.js +1 -1
  233. package/core/server/services/automations/automations-api.js +37 -2
  234. package/core/server/services/automations/automations-api.ts +43 -2
  235. package/core/server/services/comments/comments-controller.js +87 -55
  236. package/core/server/services/comments/comments-service-emails.js +1 -1
  237. package/core/server/services/comments/comments-service.js +249 -79
  238. package/core/server/services/mail/templates/notification.html +157 -0
  239. package/core/server/services/member-attribution/url-translator.js +1 -1
  240. package/core/server/services/members/members-api/services/token-service.js +21 -2
  241. package/core/server/services/notifications/notification-email.js +38 -0
  242. package/core/server/services/notifications/notification-email.ts +66 -0
  243. package/core/server/services/notifications/sanitize-email-html.js +37 -0
  244. package/core/server/services/notifications/sanitize-email-html.ts +35 -0
  245. package/core/server/services/route-settings/route-settings.js +2 -18
  246. package/core/server/services/route-settings/validate.js +2 -1
  247. package/core/server/services/update-check/index.js +10 -3
  248. package/core/server/services/update-check/update-check-service.js +18 -25
  249. package/core/server/services/url/index.js +1 -16
  250. package/core/shared/config/defaults.json +0 -1
  251. package/package.json +2 -1
  252. package/pnpm-lock.yaml +11 -1
  253. package/pnpm-workspace.yaml +2 -0
  254. package/core/built/admin/assets/editor-G3BxjP48.js +0 -8
  255. package/core/built/admin/assets/gh-chart-vpcpdiS9.js +0 -1
  256. package/core/built/admin/assets/index-BP5ial3p.js +0 -1
  257. package/core/built/admin/assets/index-Bd9VZ28k.css +0 -1
  258. package/core/built/admin/assets/kpis-B8pv3wne.js +0 -1
  259. package/core/built/admin/assets/label-BjHICZC1.js +0 -1
  260. package/core/built/admin/assets/members-DcuuSs_v.js +0 -10
  261. package/core/built/admin/assets/minus-Dv51QEND.js +0 -1
  262. package/core/built/admin/assets/offers-DKZ0qsmb.js +0 -1
  263. package/core/built/admin/assets/power-D5QO6MjY.js +0 -1
  264. package/core/server/services/url/lazy-find-resource.js +0 -49
  265. package/core/server/services/url/lazy-find-resource.ts +0 -62
  266. package/core/server/services/url/lazy-url-service.js +0 -262
  267. 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: 'members:entitlements:read',
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
- const isLazy = urlService.facade.isLazy();
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
- resetUrlState();
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
- RESOURCE_CONFIG = require('../../../frontend/services/routing/config');
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 {GhostMailer} = require('../mail');
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
- sendEmail: ghostMailer.send.bind(ghostMailer)
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 {Function} options.sendEmail - function handling sending an email
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, sendEmail}) {
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.sendEmail = sendEmail;
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
- for (const email of adminEmails) {
344
- try {
345
- this.sendEmail({
346
- to: email,
347
- subject: `Action required: Critical alert from Ghost instance ${siteUrl}`,
348
- html: toAdd.message,
349
- forceTextContent: true
350
- });
351
- } catch (err) {
352
- this.logging.error(err);
353
- if (this.config.rethrowErrors) {
354
- throw err;
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
@@ -1,6 +1,5 @@
1
1
  {
2
2
  "url": "http://localhost:2368",
3
- "lazyRouting": false,
4
3
  "server": {
5
4
  "host": "127.0.0.1",
6
5
  "port": 2368,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "6.44.0",
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
@@ -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