ghost 6.37.1 → 6.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  2. package/core/boot.js +13 -9
  3. package/core/bridge.js +10 -6
  4. package/core/built/admin/assets/{PolarAngleAxis-Cavik65s.js → PolarAngleAxis-CB-FJBDa.js} +1 -1
  5. package/core/built/admin/assets/{_baseAssignValue-CnqN6ZMT.js → _baseAssignValue-BEAjPAfy.js} +1 -1
  6. package/core/built/admin/assets/{a-large-small-Wi4LtZX-.js → a-large-small-L1BJa6mG.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-Cf8T5Jfd.mjs → code-editor-view-bOZzJ3a1.mjs} +2 -2
  9. package/core/built/admin/assets/admin-x-settings/{index-BMWEh-vR.mjs → index-BRuMxaCz.mjs} +2 -2
  10. package/core/built/admin/assets/admin-x-settings/{index-Aj-hFSnY.mjs → index-CTAQj489.mjs} +5 -5
  11. package/core/built/admin/assets/admin-x-settings/{index-DjBJrXYn.mjs → index-WoKKBOe4.mjs} +2 -2
  12. package/core/built/admin/assets/admin-x-settings/{modals-8WpWZZdI.mjs → modals-BQ5M-RTA.mjs} +3 -3
  13. package/core/built/admin/assets/{arrow-right-BiAOKOto.js → arrow-right-B2j-ecEK.js} +1 -1
  14. package/core/built/admin/assets/{at-sign-z5gBMxDW.js → at-sign-CtAw8_lw.js} +1 -1
  15. package/core/built/admin/assets/{audience-DxNilLIv.js → audience-CvSOqHuo.js} +1 -1
  16. package/core/built/admin/assets/automations-BVUNuVOh.js +1 -0
  17. package/core/built/admin/assets/automations-Bi9RJq5E.js +1 -0
  18. package/core/built/admin/assets/{avatar-flipboard-5OzseZFV.js → avatar-flipboard-DocLTXLh.js} +1 -1
  19. package/core/built/admin/assets/{bluesky-sharing-D9YcSpW8.js → bluesky-sharing-DafX2lE1.js} +1 -1
  20. package/core/built/admin/assets/chart-BRQeD9eh.js +67 -0
  21. package/core/built/admin/assets/{chevron-up-DVt6fhV3.js → chevron-up-v4_QwmnL.js} +1 -1
  22. package/core/built/admin/assets/{chunk.524.fcd26ef812d73e2b0620.js → chunk.524.c3d844070c24d7984fd7.js} +4 -4
  23. package/core/built/admin/assets/{chunk.582.b61ffaad1c2fa4aba820.js → chunk.582.0e0ede1eac12926acceb.js} +6 -6
  24. package/core/built/admin/assets/{chunk.383.adb5a3fe32b6b98c43ff.js → chunk.995.4b32363ab39da3e7f5d7.js} +3 -3
  25. package/core/built/admin/assets/circle-alert-Dbz54fYb.js +1 -0
  26. package/core/built/admin/assets/{code-editor-view-CbQIqTrK.js → code-editor-view-D-pYCcdu.js} +1 -1
  27. package/core/built/admin/assets/comments-DSv09jRn.js +1 -0
  28. package/core/built/admin/assets/{content-helpers-jANWGIfA.js → content-helpers-DQdPPDGb.js} +1 -1
  29. package/core/built/admin/assets/{copy-BBLeLEnG.js → copy-BULQsPZ4.js} +1 -1
  30. package/core/built/admin/assets/{data-list-BveeOSGI.js → data-list-WxXC0iKE.js} +1 -1
  31. package/core/built/admin/assets/{deleted-feed-item-DupAEk4P.js → deleted-feed-item-ZBLfgRkK.js} +1 -1
  32. package/core/built/admin/assets/{dropzone-D3PSdAHN.js → dropzone-B8mAoWrn.js} +1 -1
  33. package/core/built/admin/assets/{edit-profile-NrCR9_bi.js → edit-profile-Bj3th8H0.js} +1 -1
  34. package/core/built/admin/assets/editor-BZV40eAE.css +1 -0
  35. package/core/built/admin/assets/editor-u20VuPzn.js +7 -0
  36. package/core/built/admin/assets/{empty-indicator-Dhi_KeYX.js → empty-indicator-P3IsUguf.js} +1 -1
  37. package/core/built/admin/assets/{en-BontI3SP.js → en-C9bUnuy7.js} +1 -1
  38. package/core/built/admin/assets/{feed-B3Kfiz5R.js → feed-B94mO944.js} +1 -1
  39. package/core/built/admin/assets/{filter-query-core-Dwh4Qulu.js → filter-query-core-CM0KKIr2.js} +1 -1
  40. package/core/built/admin/assets/filters-D52FTE0z.js +1 -0
  41. package/core/built/admin/assets/gh-chart-Xa6Nvzwz.js +1 -0
  42. package/core/built/admin/assets/{ghost-c25434d5bbf5a5429883d4c3590f1946.js → ghost-82f1c4ffe0e1cd058ce4b66b5253b620.js} +159 -201
  43. package/core/built/admin/assets/{ghost-dark-52df27573e5f2a75e6cf4b1d06eea9e4.css → ghost-dark-9897cf5102772faedf566e5e54d4fbee.css} +1 -1
  44. package/core/built/admin/assets/{ghost-fcf460028e04192f392f16e173f2e3a8.css → ghost-e11f1814be0f38e98bb77b49eba11178.css} +1 -1
  45. package/core/built/admin/assets/{growth-DRH8zUIJ.js → growth-D3TW3JIB.js} +1 -1
  46. package/core/built/admin/assets/{hash-UvX5iOa9.js → hash-CstXS-iB.js} +1 -1
  47. package/core/built/admin/assets/{header-G1a38jnf.js → header-StkTITw-.js} +1 -1
  48. package/core/built/admin/assets/{inbox-By7HZskI.js → inbox-D1RM3kVF.js} +1 -1
  49. package/core/built/admin/assets/index-BEkJ9xtY.css +1 -0
  50. package/core/built/admin/assets/{index-CS_ZmI8F.js → index-BJx5Uas5.js} +1 -1
  51. package/core/built/admin/assets/index-BKzg6OE7.js +1 -0
  52. package/core/built/admin/assets/{index-D7JyKf1m.js → index-BM-MBdD0.js} +1 -1
  53. package/core/built/admin/assets/index-BRzvVuXt.js +2 -0
  54. package/core/built/admin/assets/index-B_3xqeM9.js +1 -0
  55. package/core/built/admin/assets/{index-ydyrczVl.js → index-C-OdR2wJ.js} +1 -1
  56. package/core/built/admin/assets/{index-X-MG1ikg.js → index-C59QlJqT.js} +1 -1
  57. package/core/built/admin/assets/{index-CJo0Qh4V.js → index-CCq_1tCo.js} +1 -1
  58. package/core/built/admin/assets/{index-qHUvPjQB.js → index-CYyEyBYw.js} +11 -11
  59. package/core/built/admin/assets/{index-CX4ztLSk.js → index-DHbiBjyq.js} +1 -1
  60. package/core/built/admin/assets/{index-BP6hBbPK.js → index-DTVgSMyL.js} +2 -2
  61. package/core/built/admin/assets/{index-vZMbI8e8.js → index-DiUjEgRw.js} +1 -1
  62. package/core/built/admin/assets/{index-YM4ZplGj.js → index-DugxKzA6.js} +1 -1
  63. package/core/built/admin/assets/{index-D8InZCr2.js → index-DzVHlhO1.js} +1 -1
  64. package/core/built/admin/assets/{index-D4b7U6K-.js → index-LsaD9Cq7.js} +1 -1
  65. package/core/built/admin/assets/{index-DRUPF8nN.js → index-x0hNfyqU.js} +1 -1
  66. package/core/built/admin/assets/{inline-Bc9zHR7e.js → inline-B4cWemrJ.js} +1 -1
  67. package/core/built/admin/assets/{koenig-lexical-B-ZnqRE1.js → koenig-lexical-BOdeH3QJ.js} +1 -1
  68. package/core/built/admin/assets/{kpi-card-zyi5Onb0.js → kpi-card-P7zSpcx0.js} +1 -1
  69. package/core/built/admin/assets/{kpi-card-CzlPIEPE.js → kpi-card-plhYOEtA.js} +1 -1
  70. package/core/built/admin/assets/{kpi-tabs-Dsa5ldXK.js → kpi-tabs-DZw2Qktb.js} +1 -1
  71. package/core/built/admin/assets/{kpis-Cw5ZRQhk.js → kpis-CDHM0xhW.js} +1 -1
  72. package/core/built/admin/assets/{label-BvxmsD1M.js → label-Ckacdx14.js} +1 -1
  73. package/core/built/admin/assets/{links-CiS5BPKS.js → links-BtXE5d0Y.js} +1 -1
  74. package/core/built/admin/assets/{list-filter-zmkB7rg4.js → list-filter-DLjjiktn.js} +1 -1
  75. package/core/built/admin/assets/{list-header-Cp779e3H.js → list-header-Cc7Ia3nr.js} +1 -1
  76. package/core/built/admin/assets/loader-circle-DLJd-dNm.js +1 -0
  77. package/core/built/admin/assets/{mail-i2qs8CIG.js → mail-B97w28e2.js} +1 -1
  78. package/core/built/admin/assets/{main-layout-KCvKOX8F.js → main-layout-bwWvzc9B.js} +1 -1
  79. package/core/built/admin/assets/{members-w601v5JJ.js → members-CokS8MI2.js} +5 -5
  80. package/core/built/admin/assets/{message-square-text-bG9IoWIt.js → message-square-text-D3rsjDFR.js} +1 -1
  81. package/core/built/admin/assets/minus-BzXQVmMw.js +1 -0
  82. package/core/built/admin/assets/{modals-lNzhiL0o.js → modals-D0lip-iy.js} +2 -2
  83. package/core/built/admin/assets/{moderation-CyfNRSWj.js → moderation-Dv7AadCV.js} +1 -1
  84. package/core/built/admin/assets/newsletter-BazC5rIj.js +1 -0
  85. package/core/built/admin/assets/{newsletters-B8xSXSr_.js → newsletters-m6HQgU5J.js} +1 -1
  86. package/core/built/admin/assets/{note-dNfKEpxw.js → note-CCGiEKz-.js} +1 -1
  87. package/core/built/admin/assets/{onboarding-route-Drbw0QtT.js → onboarding-route-Cbt7qWNE.js} +1 -1
  88. package/core/built/admin/assets/overview-TN50tzUh.js +1 -0
  89. package/core/built/admin/assets/{pagemenu-VJXMoMB4.js → pagemenu-BXrHWtsU.js} +1 -1
  90. package/core/built/admin/assets/{pencil-DHNmlLjO.js → pencil-BL1r8KVy.js} +1 -1
  91. package/core/built/admin/assets/{post-analytics-PsqLsS2e.js → post-analytics-BqEXi6Ps.js} +1 -1
  92. package/core/built/admin/assets/{post-analytics-context-QLZsZCFg.js → post-analytics-context-DekYNlb3.js} +1 -1
  93. package/core/built/admin/assets/{post-analytics-header-PecXsIT-.js → post-analytics-header-AkNbn6uc.js} +1 -1
  94. package/core/built/admin/assets/{post-share-modal-B4Rvo7W1.js → post-share-modal-CXDGVKoQ.js} +1 -1
  95. package/core/built/admin/assets/posts/{app-utils-DIc5TmxO.mjs → app-utils-DxA7edI_.mjs} +2 -2
  96. package/core/built/admin/assets/posts/{automations-BZpT35kJ.mjs → automations-Cwu_gHl4.mjs} +64 -67
  97. package/core/built/admin/assets/posts/automations-D81hV_2c.mjs +13 -0
  98. package/core/built/admin/assets/posts/{avatar-K63cvqSS.mjs → avatar-IkjEzEjI.mjs} +19 -19
  99. package/core/built/admin/assets/posts/{button-ufGBCcsV.mjs → button-KaJZKcou.mjs} +21 -21
  100. package/core/built/admin/assets/posts/{check-IcEnuTpD.mjs → check-Cf74RvZ1.mjs} +21 -21
  101. package/core/built/admin/assets/posts/{comments-CyJU9Ums.mjs → comments-pdKhYbYG.mjs} +54 -52
  102. package/core/built/admin/assets/posts/createLucideIcon-Cj7h3r9g.mjs +320 -0
  103. package/core/built/admin/assets/posts/{dialog-D6_lBvtT.mjs → dialog-Ci3W8fjx.mjs} +71 -76
  104. package/core/built/admin/assets/posts/{dropdown-menu-BSSmAory.mjs → dropdown-menu-DZ9XCHSw.mjs} +5 -5
  105. package/core/built/admin/assets/posts/editor-Bb-xle0o.mjs +6084 -0
  106. package/core/built/admin/assets/posts/ellipsis-ChhZo9aT.mjs +10 -0
  107. package/core/built/admin/assets/posts/{empty-indicator-DvGCvRAX.mjs → empty-indicator-DnFs7hDy.mjs} +2 -2
  108. package/core/built/admin/assets/posts/{filters-BLBaHhJz.mjs → filters-CO_FUPX-.mjs} +42 -40
  109. package/core/built/admin/assets/posts/get-site-timezone-C21yKZT_.mjs +87 -0
  110. package/core/built/admin/assets/posts/{growth-Bz1ChJNB.mjs → growth-CtX9Efm2.mjs} +12 -12
  111. package/core/built/admin/assets/posts/heading-DZ_KtDTL.mjs +138 -0
  112. package/core/built/admin/assets/posts/{hooks-BEngBys9.mjs → hooks-DVhBDVlA.mjs} +3 -2
  113. package/core/built/admin/assets/posts/{index-BAF0YXsp.mjs → index-B4db8w_H.mjs} +181 -172
  114. package/core/built/admin/assets/posts/{inline-C2YFQAdU.mjs → inline-BfB-SNk0.mjs} +2 -2
  115. package/core/built/admin/assets/posts/{input-surface-TqJlNSp_.mjs → input-surface-CNwZJloi.mjs} +2 -2
  116. package/core/built/admin/assets/posts/{kpis-DAX5_0-Q.mjs → kpis-BvY_5Y1u.mjs} +8792 -8803
  117. package/core/built/admin/assets/posts/{links-A1YTsBbF.mjs → links-Ck-h7SKg.mjs} +57 -57
  118. package/core/built/admin/assets/posts/{loading-indicator-BZsjmp8g.mjs → loading-indicator-B_rU9Lie.mjs} +3 -3
  119. package/core/built/admin/assets/posts/mail-DiZ3oKEW.mjs +9 -0
  120. package/core/built/admin/assets/posts/{main-layout-D_HHTP_n.mjs → main-layout-aYo6qOBZ.mjs} +2 -2
  121. package/core/built/admin/assets/posts/{newsletter-BRzgjOIa.mjs → newsletter-BQc53TF2.mjs} +31 -30
  122. package/core/built/admin/assets/posts/{overview-C41VFjn7.mjs → overview-blz9Ak9q.mjs} +42 -41
  123. package/core/built/admin/assets/posts/plus-YVjtYaK3.mjs +15 -0
  124. package/core/built/admin/assets/posts/{post-analytics-DGgMkFaf.mjs → post-analytics-BQbWGoeu.mjs} +6 -6
  125. package/core/built/admin/assets/posts/{post-analytics-context-B1r3HBrp.mjs → post-analytics-context-Be7THgnd.mjs} +7 -7
  126. package/core/built/admin/assets/posts/{post-analytics-header-DTWSO0Aq.mjs → post-analytics-header-iDFy7Bao.mjs} +2762 -2764
  127. package/core/built/admin/assets/posts/{post-share-modal-ohHwk0Yt.mjs → post-share-modal-akP16idN.mjs} +50 -48
  128. package/core/built/admin/assets/posts/posts.js +2 -1
  129. package/core/built/admin/assets/posts/{settings-CZYL6Jhr.mjs → settings-BdQhfHxY.mjs} +2 -2
  130. package/core/built/admin/assets/posts/{sheet-D7YesQJE.mjs → sheet-3dBlKeXf.mjs} +14 -13
  131. package/core/built/admin/assets/posts/{skeleton-S1k58YKa.mjs → skeleton-DMgSvYqr.mjs} +11 -11
  132. package/core/built/admin/assets/posts/{source-icon-DnpCy5N4.mjs → source-icon-Bp5Qxq1E.mjs} +4 -4
  133. package/core/built/admin/assets/posts/{stats-CbOpowXb.mjs → stats-DJx9qc_u.mjs} +4 -4
  134. package/core/built/admin/assets/posts/{table-Cw3Wxf1C.mjs → table-BpVwuzeH.mjs} +2 -2
  135. package/core/built/admin/assets/posts/{data-list-BnZARP88.mjs → tabs-CbZCpxfI.mjs} +4885 -5284
  136. package/core/built/admin/assets/posts/{tags-BoMt6Ce3.mjs → tags-CNtvDS6f.mjs} +33 -33
  137. package/core/built/admin/assets/posts/{tags-CNdsvTtZ.mjs → tags-DFOoFZ_3.mjs} +2 -2
  138. package/core/built/admin/assets/posts/{tooltip-CTcyINxz.mjs → tooltip-Cc_09RDU.mjs} +106 -117
  139. package/core/built/admin/assets/posts/value-CwGM7M-1.mjs +410 -0
  140. package/core/built/admin/assets/posts/{virtual-list-window-Bs88yrut.mjs → virtual-list-window-D6nRoL0y.mjs} +5 -5
  141. package/core/built/admin/assets/posts/{web-Bsd8eTP6.mjs → web-yfPssEt8.mjs} +1042 -1040
  142. package/core/built/admin/assets/posts/x-DrUGcpfp.mjs +9 -0
  143. package/core/built/admin/assets/posts/zap-DAN0ur-o.mjs +24 -0
  144. package/core/built/admin/assets/posts-D-jyPPE6.js +1 -0
  145. package/core/built/admin/assets/power-Cc5ncYVl.js +1 -0
  146. package/core/built/admin/assets/{referrers-kcBT5smx.js → referrers-qnXsKsuv.js} +1 -1
  147. package/core/built/admin/assets/{repeat-Cn2sKd-L.js → repeat-BGIBynZH.js} +1 -1
  148. package/core/built/admin/assets/{reply-D7E-ZMd5.js → reply-DOKdAsL_.js} +1 -1
  149. package/core/built/admin/assets/{rocket-DnH0XAGW.js → rocket-CAN2NB82.js} +1 -1
  150. package/core/built/admin/assets/{select-f0MMMQWu.js → select-8S9kYGSM.js} +1 -1
  151. package/core/built/admin/assets/{settings-BAQNP3gU.js → settings-DeD-bmZc.js} +4 -4
  152. package/core/built/admin/assets/{settings-ORttG1jT.js → settings-e4IB9sx6.js} +1 -1
  153. package/core/built/admin/assets/{share-modal-CXU4tGY8.js → share-modal-CBavk20I.js} +1 -1
  154. package/core/built/admin/assets/{sort-button-BXMrChFu.js → sort-button-DlSKBzUq.js} +1 -1
  155. package/core/built/admin/assets/{source-icon-cjy79jGT.js → source-icon-27VIJSXr.js} +1 -1
  156. package/core/built/admin/assets/{sprout-DZ4tZ78G.js → sprout-D66nqc79.js} +1 -1
  157. package/core/built/admin/assets/{square-vOzqJf7x.js → square-DccaXQWe.js} +1 -1
  158. package/core/built/admin/assets/stats/{audience-5NeJICtP.mjs → audience-B84ClTDM.mjs} +3 -3
  159. package/core/built/admin/assets/stats/{content-helpers-DFSTl3uB.mjs → content-helpers-CBAddUg7.mjs} +4 -4
  160. package/core/built/admin/assets/stats/{index-C4T7u699.mjs → index-Bz5oVpED.mjs} +5 -5
  161. package/core/built/admin/assets/stats/{index-B8bp6qe2.mjs → index-Cs8i1uR4.mjs} +74 -75
  162. package/core/built/admin/assets/stats/{index-wvi17m79.mjs → index-DEsP_Tbd.mjs} +8 -8
  163. package/core/built/admin/assets/stats/{index-CFfAYHdD.mjs → index-Ds-pM47x.mjs} +5 -5
  164. package/core/built/admin/assets/stats/{index-Chqk7VlR.mjs → index-Wzk1IcAz.mjs} +6 -6
  165. package/core/built/admin/assets/stats/{kpi-tabs-Df9yOI2P.mjs → kpi-tabs-Cs4l8B_M.mjs} +7 -7
  166. package/core/built/admin/assets/stats/{sort-button-Doi8OgMU.mjs → sort-button-rR-GA9Hu.mjs} +3 -3
  167. package/core/built/admin/assets/stats/{stats-FXeCefyd.mjs → stats-RFpEJpEq.mjs} +34 -34
  168. package/core/built/admin/assets/stats/stats.js +1 -1
  169. package/core/built/admin/assets/stats/{use-growth-stats-93C_3EZk.mjs → use-growth-stats-DwgFzbq9.mjs} +3 -3
  170. package/core/built/admin/assets/{stats-CIGz2Win.js → stats-B4OybenW.js} +1 -1
  171. package/core/built/admin/assets/{stats-view-BTKRxYTQ.js → stats-view-BuExwFXa.js} +1 -1
  172. package/core/built/admin/assets/{step-1-BSMHbT-q.js → step-1-D_5LOQrC.js} +1 -1
  173. package/core/built/admin/assets/{step-2-_YC0LCZv.js → step-2-BZLBj8cj.js} +1 -1
  174. package/core/built/admin/assets/{step-3-DWMqP2bO.js → step-3-s5uNbcOH.js} +1 -1
  175. package/core/built/admin/assets/{table-mHKjXQba.js → table-pGS7EeJe.js} +1 -1
  176. package/core/built/admin/assets/{tabs-B93IVRBz.js → tabs-CjdKssUe.js} +1 -1
  177. package/core/built/admin/assets/{tags-DCb-x2ZB.js → tags-B0vRk0A6.js} +1 -1
  178. package/core/built/admin/assets/{tags-kUHJ1MZo.js → tags-Dso4-FA_.js} +1 -1
  179. package/core/built/admin/assets/{textarea-DswCtM7_.js → textarea-DzFnun0_.js} +1 -1
  180. package/core/built/admin/assets/{tiers-DueraQKd.js → tiers-4Vkr_D-L.js} +1 -1
  181. package/core/built/admin/assets/{toggle-group-ChTo8MPD.js → toggle-group-hDsr47IB.js} +1 -1
  182. package/core/built/admin/assets/{topic-filter-DrW3fYWo.js → topic-filter-C7TpPe1G.js} +1 -1
  183. package/core/built/admin/assets/{trash-B2ESGftj.js → trash-DCVuk7ZX.js} +1 -1
  184. package/core/built/admin/assets/{underline-vo-bPRac.js → underline-CjK8la2G.js} +1 -1
  185. package/core/built/admin/assets/{upload-DXQRkBBq.js → upload-CPYhmtWZ.js} +1 -1
  186. package/core/built/admin/assets/{use-growth-stats-CoB8-lsd.js → use-growth-stats-CaFSgp_R.js} +1 -1
  187. package/core/built/admin/assets/{use-simple-pagination-Y_Wv2N6g.js → use-simple-pagination-D0vJBMvF.js} +1 -1
  188. package/core/built/admin/assets/{user-round-check-Dp9a2x-e.js → user-round-check-CzQQeFd8.js} +1 -1
  189. package/core/built/admin/assets/{user-round-x-DwCTGlxc.js → user-round-x-BDFm8yQj.js} +1 -1
  190. package/core/built/admin/assets/value-BGBiTkF3.js +1 -0
  191. package/core/built/admin/assets/{vendor-17f3b979ba6f3898d1a8c5249cc22ff1.js → vendor-ce3fc901ccbcf37f36eb791b4e454138.js} +29 -31
  192. package/core/built/admin/assets/{virtual-list-window-BF7IvGMC.js → virtual-list-window-EKtWZ5cP.js} +1 -1
  193. package/core/built/admin/assets/{wallet-cards-IEmcxJvG.js → wallet-cards-C1NOBbWE.js} +1 -1
  194. package/core/built/admin/assets/web-DCA7HR1S.js +1 -0
  195. package/core/built/admin/index.html +8 -8
  196. package/core/frontend/helpers/social_accounts.js +91 -0
  197. package/core/frontend/services/sitemap/handler.js +14 -2
  198. package/core/frontend/services/sitemap/site-map-manager.js +133 -9
  199. package/core/frontend/web/middleware/handle-image-sizes.js +4 -0
  200. package/core/server/api/endpoints/automations.js +38 -45
  201. package/core/server/models/member.js +30 -25
  202. package/core/server/services/automations/automations-api.js +58 -0
  203. package/core/server/services/automations/automations-api.ts +71 -0
  204. package/core/server/services/automations/automations-repository.js +2 -0
  205. package/core/server/services/automations/automations-repository.ts +63 -0
  206. package/core/server/services/automations/fake-database-automations-repository.js +210 -0
  207. package/core/server/services/automations/fake-database-automations-repository.ts +273 -0
  208. package/core/server/services/automations/temporary-fake-database.js +5 -4
  209. package/core/server/services/gifts/email-templates/gift-purchase-confirmation.hbs +10 -32
  210. package/core/server/services/gifts/email-templates/gift-purchase-confirmation.js +6 -8
  211. package/core/server/services/gifts/email-templates/gift-purchase-confirmation.ts +6 -8
  212. package/core/server/services/gifts/email-templates/gift-reminder.hbs +12 -37
  213. package/core/server/services/gifts/email-templates/gift-reminder.js +5 -9
  214. package/core/server/services/gifts/email-templates/gift-reminder.ts +5 -9
  215. package/core/server/services/gifts/gift-service.js +1 -1
  216. package/core/server/services/gifts/gift-service.ts +2 -2
  217. package/core/server/services/member-welcome-emails/service.js +0 -1
  218. package/core/server/services/members/members-api/controllers/router-controller.js +52 -7
  219. package/core/server/services/members/members-api/services/member-bread-service.js +0 -8
  220. package/core/server/services/route-settings/route-settings.js +18 -2
  221. package/core/server/services/staff/email-templates/gift.hbs +1 -1
  222. package/core/server/services/staff/email-templates/gift.txt.js +1 -1
  223. package/core/server/services/staff/email-templates/new-gift-subscription.hbs +1 -1
  224. package/core/server/services/staff/email-templates/new-gift-subscription.txt.js +1 -1
  225. package/core/server/services/staff/staff-service-emails.js +1 -1
  226. package/core/server/services/url/index.js +16 -1
  227. package/core/server/services/url/lazy-find-resource.js +49 -0
  228. package/core/server/services/url/lazy-find-resource.ts +62 -0
  229. package/core/server/services/url/lazy-url-service.js +220 -0
  230. package/core/server/services/url/lazy-url-service.ts +265 -0
  231. package/core/server/web/api/endpoints/admin/routes.js +1 -0
  232. package/core/server/web/gift-preview/Inter.ttf +0 -0
  233. package/core/server/web/gift-preview/controller.js +56 -6
  234. package/core/server/web/gift-preview/gift-card-noise.png +0 -0
  235. package/core/server/web/gift-preview/gift-card-orb.png +0 -0
  236. package/core/server/web/gift-preview/image.js +170 -43
  237. package/core/shared/config/defaults.json +1 -0
  238. package/core/shared/one-at-a-time.js +28 -33
  239. package/core/shared/one-at-a-time.ts +58 -0
  240. package/package.json +18 -16
  241. package/pnpm-lock.yaml +989 -356
  242. package/core/built/admin/assets/automations-D1uMjd06.js +0 -1
  243. package/core/built/admin/assets/chart-_EXssQtm.js +0 -67
  244. package/core/built/admin/assets/comments-E00h1SbR.js +0 -1
  245. package/core/built/admin/assets/filters-CC7XfjOS.js +0 -1
  246. package/core/built/admin/assets/gh-chart-B9_ywrJJ.js +0 -1
  247. package/core/built/admin/assets/index-AsV-aY0z.css +0 -1
  248. package/core/built/admin/assets/index-B0y_ynZw.js +0 -1
  249. package/core/built/admin/assets/index-Bs6wWbLA.js +0 -2
  250. package/core/built/admin/assets/index-Cb4641XW.js +0 -1
  251. package/core/built/admin/assets/loader-circle-B5UPqSok.js +0 -1
  252. package/core/built/admin/assets/minus-DWx9VUtr.js +0 -1
  253. package/core/built/admin/assets/newsletter-fkQye9OK.js +0 -1
  254. package/core/built/admin/assets/overview-CZ-VrnXy.js +0 -1
  255. package/core/built/admin/assets/posts/createLucideIcon-DcUfTBt_.mjs +0 -454
  256. package/core/built/admin/assets/posts/get-site-timezone-DlXmHA3y.mjs +0 -93
  257. package/core/built/admin/assets/posts-Bx1RWrub.js +0 -1
  258. package/core/built/admin/assets/web-DSME3e8c.js +0 -1
@@ -1,6 +1,14 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
1
4
  const CACHE_MAX_SIZE = 100;
5
+ const GIFT_CARD_NOISE_PATH = path.join(__dirname, 'gift-card-noise.png');
6
+ const GIFT_CARD_ORB_PATH = path.join(__dirname, 'gift-card-orb.png');
7
+ const INTER_FONT_PATH = path.join(__dirname, 'Inter.ttf');
2
8
 
3
9
  const cache = new Map();
10
+ let giftCardNoiseTile;
11
+ let giftCardOrbImageHref;
4
12
 
5
13
  function cacheResult(key, value) {
6
14
  if (cache.size >= CACHE_MAX_SIZE) {
@@ -21,75 +29,194 @@ function escapeXml(str) {
21
29
  .replaceAll('\'', ''');
22
30
  }
23
31
 
24
- function hexToRgb(hex) {
25
- const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
32
+ function getGiftCardOrbImageHref() {
33
+ if (giftCardOrbImageHref !== undefined) {
34
+ return giftCardOrbImageHref;
35
+ }
36
+
37
+ const orbPng = fs.readFileSync(GIFT_CARD_ORB_PATH);
38
+ giftCardOrbImageHref = `data:image/png;base64,${orbPng.toString('base64')}`;
39
+
40
+ return giftCardOrbImageHref;
41
+ }
42
+
43
+ async function getGiftCardNoiseTile() {
44
+ if (giftCardNoiseTile !== undefined) {
45
+ return giftCardNoiseTile;
46
+ }
47
+
48
+ const sharp = require('sharp');
49
+
50
+ giftCardNoiseTile = await sharp(GIFT_CARD_NOISE_PATH)
51
+ .resize(192, 192, {kernel: 'nearest'})
52
+ .png()
53
+ .toBuffer();
54
+
55
+ return giftCardNoiseTile;
56
+ }
57
+
58
+ function parseHexColor(color) {
59
+ const match = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(`${color || ''}`.trim());
26
60
 
27
- if (!result) {
28
- return {r: 0, g: 0, b: 0};
61
+ if (!match) {
62
+ return null;
29
63
  }
30
64
 
65
+ const hex = match[1].length === 3
66
+ ? match[1].split('').map(char => char + char).join('')
67
+ : match[1];
68
+
31
69
  return {
32
- r: Number.parseInt(result[1], 16),
33
- g: Number.parseInt(result[2], 16),
34
- b: Number.parseInt(result[3], 16)
70
+ r: parseInt(hex.slice(0, 2), 16),
71
+ g: parseInt(hex.slice(2, 4), 16),
72
+ b: parseInt(hex.slice(4, 6), 16)
35
73
  };
36
74
  }
37
75
 
38
- function getBackgroundColor(accentColor) {
39
- // Blend accent color at 6% opacity over white, matching Portal's redemption modal
40
- const {r, g, b} = hexToRgb(accentColor);
41
- const opacity = 0.06;
42
- const blend = c => Math.round(255 + (c - 255) * opacity);
76
+ function formatHexChannel(value) {
77
+ return Math.round(value).toString(16).padStart(2, '0');
78
+ }
79
+
80
+ function mixWithBlack(color, colorWeight = 0.65) {
81
+ const rgb = parseHexColor(color);
82
+
83
+ if (!rgb) {
84
+ return '#000000';
85
+ }
86
+
87
+ return `#${formatHexChannel(rgb.r * colorWeight)}${formatHexChannel(rgb.g * colorWeight)}${formatHexChannel(rgb.b * colorWeight)}`;
88
+ }
89
+
90
+ function truncateText(str, maxLength) {
91
+ const text = `${str || ''}`.trim();
43
92
 
44
- return `rgb(${blend(r)}, ${blend(g)}, ${blend(b)})`;
93
+ if (text.length <= maxLength) {
94
+ return text;
95
+ }
96
+
97
+ return `${text.slice(0, maxLength - 3).trim()}...`;
98
+ }
99
+
100
+ function createTextInput({text, size, weight, width}) {
101
+ const escapedText = escapeXml(text);
102
+
103
+ return {
104
+ text: {
105
+ text: `<span foreground="#FFFFFF" font_desc="Inter ${weight} ${size}">${escapedText}</span>`,
106
+ font: 'Inter',
107
+ fontfile: INTER_FONT_PATH,
108
+ width,
109
+ rgba: true,
110
+ dpi: 72
111
+ }
112
+ };
113
+ }
114
+
115
+ function buildTextOverlays({siteTitle = 'Ghost', tierLabel = '', cadenceLabel = '1 year'}) {
116
+ const safeCadenceLabel = truncateText(cadenceLabel, 18);
117
+ const safeTierLabel = truncateText(tierLabel || 'Gift membership', 38);
118
+ const safeSiteTitle = truncateText(siteTitle, 40);
119
+
120
+ return [
121
+ {
122
+ input: createTextInput({
123
+ text: safeCadenceLabel,
124
+ size: 84,
125
+ weight: 'Bold',
126
+ width: 1060
127
+ }),
128
+ left: 64,
129
+ top: 82
130
+ },
131
+ {
132
+ input: createTextInput({
133
+ text: safeTierLabel,
134
+ size: 44,
135
+ weight: 'Medium',
136
+ width: 1060
137
+ }),
138
+ left: 66,
139
+ top: 177
140
+ },
141
+ {
142
+ input: createTextInput({
143
+ text: safeSiteTitle,
144
+ size: 52,
145
+ weight: 'Bold',
146
+ width: 1060
147
+ }),
148
+ left: 66,
149
+ top: 500
150
+ }
151
+ ];
45
152
  }
46
153
 
47
154
  function buildSvg({accentColor}) {
48
- const bgColor = getBackgroundColor(accentColor);
49
155
  const escapedAccentColor = escapeXml(accentColor);
50
-
51
- // Gift box icon from Portal (apps/portal/src/images/icons/gift.svg)
52
- // Original viewBox 0 0 24 24, scaled and centered in the seal.
53
- const giftIcon = `
54
- <g transform="translate(564, 279) scale(3)" fill="none" stroke="#FFFFFF"
55
- stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
56
- <rect x="3" y="8" width="18" height="4" rx="1"/>
57
- <path d="M12 8v13"/>
58
- <path d="M19 12v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-7"/>
59
- <path d="M7.5 8a2.5 2.5 0 0 1 0-5C9 3 12 8 12 8"/>
60
- <path d="M16.5 8a2.5 2.5 0 0 0 0-5C15 3 12 8 12 8"/>
61
- </g>
62
- `;
156
+ const orbImageHref = escapeXml(getGiftCardOrbImageHref());
63
157
 
64
158
  return `<?xml version="1.0" encoding="UTF-8"?>
65
159
  <svg width="1200" height="630" viewBox="0 0 1200 630" xmlns="http://www.w3.org/2000/svg">
66
- <rect width="1200" height="630" fill="${bgColor}"/>
67
-
68
- <rect x="0" y="303" width="1200" height="24" fill="${escapedAccentColor}"/>
69
- <rect x="588" y="0" width="24" height="630" fill="${escapedAccentColor}"/>
160
+ <defs>
161
+ <linearGradient id="cardShine" x1="120" y1="580" x2="980" y2="60" gradientUnits="userSpaceOnUse">
162
+ <stop stop-color="#FFFFFF" stop-opacity="0"/>
163
+ <stop offset="0.5" stop-color="#FFFFFF" stop-opacity="0.31"/>
164
+ <stop offset="1" stop-color="#FFFFFF" stop-opacity="0"/>
165
+ </linearGradient>
166
+ </defs>
167
+
168
+ <rect width="1200" height="630" fill="${escapedAccentColor}"/>
169
+ <rect width="1200" height="630" fill="#FFFFFF" opacity="0.07"/>
170
+ <rect width="1200" height="630" fill="url(#cardShine)"/>
171
+ <image href="${orbImageHref}" x="0" y="0" width="1200" height="630" opacity="0.2" preserveAspectRatio="none"/>
172
+ </svg>`;
173
+ }
70
174
 
71
- <circle cx="600" cy="315" r="70" fill="${bgColor}"/>
72
- <circle cx="600" cy="315" r="58" fill="${escapedAccentColor}"/>
175
+ function buildNotchOverlay({accentColor}) {
176
+ const notchFill = escapeXml(mixWithBlack(accentColor));
73
177
 
74
- ${giftIcon}
178
+ const svg = `<?xml version="1.0" encoding="UTF-8"?>
179
+ <svg width="1200" height="630" viewBox="0 0 1200 630" xmlns="http://www.w3.org/2000/svg">
180
+ <rect x="505" y="42" width="190" height="36" rx="18" fill="${notchFill}"/>
181
+ <rect x="510" y="44" width="180" height="3" rx="1.5" fill="#FFFFFF" opacity="0.18"/>
75
182
  </svg>`;
183
+
184
+ return {
185
+ input: Buffer.from(svg)
186
+ };
76
187
  }
77
188
 
78
- async function generateGiftPreviewImage({accentColor}) {
79
- const cacheKey = accentColor;
189
+ async function generateGiftPreviewImage({accentColor = '#15171A', siteTitle, tierLabel, cadenceLabel}) {
190
+ const cacheKey = JSON.stringify({
191
+ accentColor,
192
+ siteTitle,
193
+ tierLabel,
194
+ cadenceLabel
195
+ });
80
196
 
81
197
  if (cache.has(cacheKey)) {
82
198
  return cache.get(cacheKey);
83
199
  }
84
200
 
85
- const imageTransform = require('@tryghost/image-transform');
201
+ const sharp = require('sharp');
202
+
86
203
  const svg = buildSvg({accentColor});
87
- const image = await imageTransform.resizeFromBuffer(Buffer.from(svg), {
88
- width: 1200,
89
- format: 'png',
90
- withoutEnlargement: false,
91
- timeout: 10
92
- });
204
+ const noiseTile = await getGiftCardNoiseTile();
205
+ const image = await sharp(Buffer.from(svg), {animated: false})
206
+ .resize(1200, null, {
207
+ withoutEnlargement: false
208
+ })
209
+ .composite([
210
+ {
211
+ input: noiseTile,
212
+ tile: true
213
+ },
214
+ buildNotchOverlay({accentColor}),
215
+ ...buildTextOverlays({siteTitle, tierLabel, cadenceLabel})
216
+ ])
217
+ .png()
218
+ .timeout({seconds: 10})
219
+ .toBuffer();
93
220
 
94
221
  cacheResult(cacheKey, image);
95
222
 
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "url": "http://localhost:2368",
3
+ "lazyRouting": false,
3
4
  "server": {
4
5
  "host": "127.0.0.1",
5
6
  "port": 2368,
@@ -1,6 +1,7 @@
1
- // @ts-check
2
- const {InternalServerError} = require('@tryghost/errors');
3
-
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.oneAtATime = void 0;
4
+ const errors_1 = require("@tryghost/errors");
4
5
  /**
5
6
  * Wraps an async function so it runs at most one invocation at a time, with at
6
7
  * most one additional invocation queued.
@@ -13,50 +14,44 @@ const {InternalServerError} = require('@tryghost/errors');
13
14
  *
14
15
  * Errors are silently swallowed.
15
16
  *
16
- * @param {() => PromiseLike<unknown>} fn
17
- * @returns {() => void}
18
17
  */
19
18
  const oneAtATime = (fn) => {
20
- /** @type {'idle' | 'running' | 'running+queued'} */
21
19
  let state = 'idle';
22
-
23
20
  const run = async () => {
24
21
  try {
25
22
  await fn();
26
- } catch {
23
+ }
24
+ catch {
27
25
  // noop
28
26
  }
29
-
30
27
  switch (state) {
31
- case 'running+queued':
32
- state = 'running';
33
- run();
34
- break;
35
- case 'running':
36
- state = 'idle';
37
- break;
38
- default:
39
- throw new InternalServerError({message: `Unexpected state: ${state}`});
28
+ case 'running+queued':
29
+ state = 'running';
30
+ run();
31
+ break;
32
+ case 'running':
33
+ state = 'idle';
34
+ break;
35
+ default:
36
+ throw new errors_1.InternalServerError({ message: `Unexpected state: ${state}` });
40
37
  }
41
38
  };
42
-
43
39
  return () => {
44
40
  switch (state) {
45
- case 'idle':
46
- state = 'running';
47
- run();
48
- break;
49
- case 'running':
50
- state = 'running+queued';
51
- break;
52
- case 'running+queued':
53
- break;
54
- default: {
55
- /** @type {never} */ const _exhaustive = state;
56
- throw new InternalServerError({message: `Unexpected state: ${_exhaustive}`});
57
- }
41
+ case 'idle':
42
+ state = 'running';
43
+ run();
44
+ break;
45
+ case 'running':
46
+ state = 'running+queued';
47
+ break;
48
+ case 'running+queued':
49
+ break;
50
+ default: {
51
+ const _exhaustive = state;
52
+ throw new errors_1.InternalServerError({ message: `Unexpected state: ${_exhaustive}` });
53
+ }
58
54
  }
59
55
  };
60
56
  };
61
-
62
57
  exports.oneAtATime = oneAtATime;
@@ -0,0 +1,58 @@
1
+ import {InternalServerError} from '@tryghost/errors';
2
+
3
+ type State = 'idle' | 'running' | 'running+queued';
4
+
5
+ /**
6
+ * Wraps an async function so it runs at most one invocation at a time, with at
7
+ * most one additional invocation queued.
8
+ *
9
+ * Possible states:
10
+ *
11
+ * - idle: nothing is running
12
+ * - running: function is active, nothing is queued
13
+ * - running + queued: function is active, another invocation enqueued
14
+ *
15
+ * Errors are silently swallowed.
16
+ *
17
+ */
18
+ export const oneAtATime = (fn: () => PromiseLike<unknown>): () => void => {
19
+ let state: State = 'idle';
20
+
21
+ const run = async () => {
22
+ try {
23
+ await fn();
24
+ } catch {
25
+ // noop
26
+ }
27
+
28
+ switch (state) {
29
+ case 'running+queued':
30
+ state = 'running';
31
+ run();
32
+ break;
33
+ case 'running':
34
+ state = 'idle';
35
+ break;
36
+ default:
37
+ throw new InternalServerError({message: `Unexpected state: ${state}`});
38
+ }
39
+ };
40
+
41
+ return () => {
42
+ switch (state) {
43
+ case 'idle':
44
+ state = 'running';
45
+ run();
46
+ break;
47
+ case 'running':
48
+ state = 'running+queued';
49
+ break;
50
+ case 'running+queued':
51
+ break;
52
+ default: {
53
+ const _exhaustive: never = state;
54
+ throw new InternalServerError({message: `Unexpected state: ${_exhaustive}`});
55
+ }
56
+ }
57
+ };
58
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "6.37.1",
3
+ "version": "6.38.0",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -88,15 +88,15 @@
88
88
  "@faker-js/faker": "7.6.0",
89
89
  "@isaacs/ttlcache": "1.4.1",
90
90
  "@sentry/node": "7.120.4",
91
- "@tryghost/adapter-base-cache": "0.1.23",
92
- "@tryghost/admin-api-schema": "4.7.2",
91
+ "@tryghost/adapter-base-cache": "0.1.25",
92
+ "@tryghost/admin-api-schema": "4.7.4",
93
93
  "@tryghost/api-framework": "1.0.7",
94
- "@tryghost/bookshelf-plugins": "2.0.3",
94
+ "@tryghost/bookshelf-plugins": "2.2.0",
95
95
  "@tryghost/color-utils": "0.2.16",
96
96
  "@tryghost/config-url-helpers": "1.0.23",
97
97
  "@tryghost/custom-fonts": "1.0.8",
98
98
  "@tryghost/database-info": "0.3.35",
99
- "@tryghost/debug": "2.1.0",
99
+ "@tryghost/debug": "2.2.0",
100
100
  "@tryghost/domain-events": "1.0.8",
101
101
  "@tryghost/email-mock-receiver": "2.1.0",
102
102
  "@tryghost/errors": "1.3.13",
@@ -116,7 +116,7 @@
116
116
  "@tryghost/kg-markdown-html-renderer": "7.2.1",
117
117
  "@tryghost/kg-mobiledoc-html-renderer": "7.2.1",
118
118
  "@tryghost/limit-service": "1.5.2",
119
- "@tryghost/logging": "4.1.0",
119
+ "@tryghost/logging": "4.2.0",
120
120
  "@tryghost/members-csv": "2.0.7",
121
121
  "@tryghost/metrics": "1.0.43",
122
122
  "@tryghost/mongo-utils": "0.6.3",
@@ -126,20 +126,20 @@
126
126
  "@tryghost/nql": "0.12.10",
127
127
  "@tryghost/nql-lang": "0.6.4",
128
128
  "@tryghost/parse-email-address": "file:components/tryghost-parse-email-address-0.0.0.tgz",
129
- "@tryghost/pretty-cli": "3.1.0",
129
+ "@tryghost/pretty-cli": "3.2.0",
130
130
  "@tryghost/prometheus-metrics": "1.0.8",
131
- "@tryghost/promise": "2.1.0",
132
- "@tryghost/referrer-parser": "0.1.15",
131
+ "@tryghost/promise": "2.2.0",
132
+ "@tryghost/referrer-parser": "0.1.17",
133
133
  "@tryghost/request": "1.0.12",
134
- "@tryghost/root-utils": "2.1.0",
134
+ "@tryghost/root-utils": "2.2.0",
135
135
  "@tryghost/security": "1.0.6",
136
- "@tryghost/social-urls": "0.1.60",
136
+ "@tryghost/social-urls": "0.1.62",
137
137
  "@tryghost/string": "0.3.2",
138
- "@tryghost/tpl": "2.1.0",
138
+ "@tryghost/tpl": "2.2.0",
139
139
  "@tryghost/url-utils": "5.1.2",
140
140
  "@tryghost/validator": "0.2.22",
141
- "@tryghost/version": "2.1.0",
142
- "@tryghost/zip": "3.1.0",
141
+ "@tryghost/version": "2.2.0",
142
+ "@tryghost/zip": "3.2.0",
143
143
  "body-parser": "1.20.4",
144
144
  "bookshelf": "1.2.0",
145
145
  "bookshelf-relations": "2.8.0",
@@ -178,7 +178,7 @@
178
178
  "ghost-storage-base": "1.1.2",
179
179
  "glob": "8.1.0",
180
180
  "got": "13.0.0",
181
- "gscan": "5.4.3",
181
+ "gscan": "6.0.2",
182
182
  "handlebars": "4.7.9",
183
183
  "heic-convert": "2.1.0",
184
184
  "html-to-text": "5.1.1",
@@ -228,6 +228,7 @@
228
228
  "rss": "1.2.2",
229
229
  "sanitize-html": "2.17.0",
230
230
  "semver": "7.7.4",
231
+ "sharp": "0.34.5",
231
232
  "simple-dom": "1.4.0",
232
233
  "stoppable": "1.1.0",
233
234
  "stripe": "8.222.0",
@@ -264,6 +265,7 @@
264
265
  "@types/node-jose": "1.1.13",
265
266
  "@types/nodemailer": "6.4.23",
266
267
  "@types/on-headers": "1.0.4",
268
+ "@types/papaparse": "5.5.2",
267
269
  "@types/sinon": "17.0.4",
268
270
  "@types/supertest": "6.0.3",
269
271
  "@typescript-eslint/parser": "8.49.0",
@@ -375,7 +377,7 @@
375
377
  ],
376
378
  "overrides": {
377
379
  "@tryghost/errors": "^1.3.7",
378
- "@tryghost/logging": "4.1.0",
380
+ "@tryghost/logging": "4.2.0",
379
381
  "jackspeak": "2.3.6",
380
382
  "moment": "2.30.1",
381
383
  "moment-timezone": "0.5.45",