ghost 6.64.0 → 6.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (672) hide show
  1. package/bin/create-migration.js +15 -0
  2. package/components/tryghost-adapter-base-scheduling-0.2.4.tgz +0 -0
  3. package/components/tryghost-api-framework-0.0.0.tgz +0 -0
  4. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  5. package/components/tryghost-kg-default-cards-10.3.6.tgz +0 -0
  6. package/components/tryghost-kg-lexical-html-renderer-1.5.1.tgz +0 -0
  7. package/components/tryghost-metafield-types-0.0.0.tgz +0 -0
  8. package/content/themes/casper/assets/built/casper.js +1 -1
  9. package/content/themes/casper/assets/built/screen.css +1 -1
  10. package/content/themes/casper/assets/css/screen.css +15 -2
  11. package/content/themes/casper/assets/js/init.js +37 -9
  12. package/content/themes/casper/package.json +8 -8
  13. package/content/themes/source/assets/built/screen.css +1 -1
  14. package/content/themes/source/assets/built/source.js +1 -1
  15. package/content/themes/source/assets/css/screen.css +14 -1
  16. package/content/themes/source/assets/js/main.js +24 -4
  17. package/content/themes/source/package.json +7 -7
  18. package/core/boot.js +22 -16
  19. package/core/bridge.js +1 -1
  20. package/core/built/admin/assets/Combination-DQ6f9A5P.js +41 -0
  21. package/core/built/admin/assets/{PolarAngleAxis-a81ieQUO.js → PolarAngleAxis-BBaU7PRV.js} +1 -1
  22. package/core/built/admin/assets/RadialBarChart-Bp20JPnA.js +1 -0
  23. package/core/built/admin/assets/{about-39CAfroa.js → about-Dp43j18M.js} +1 -1
  24. package/core/built/admin/assets/accordion-h62UzFhj.js +1 -0
  25. package/core/built/admin/assets/account-migration-CBTbtX6Q.js +1 -0
  26. package/core/built/admin/assets/action-list-DC9QpX-l.js +1 -0
  27. package/core/built/admin/assets/activitypub/{account-migration-KA6Jjf9L.js → account-migration-B1DUZS4Q.js} +8 -8
  28. package/core/built/admin/assets/activitypub/activitypub.js +24 -11
  29. package/core/built/admin/assets/activitypub/avatar-CRGud8yf.js +153 -0
  30. package/core/built/admin/assets/activitypub/{avatar-flipboard-csQaNeYK.js → avatar-flipboard-BZNFAXfm.js} +3 -3
  31. package/core/built/admin/assets/activitypub/{bluesky-sharing-C7nTDMvw.js → bluesky-sharing-Cg_v-LwS.js} +30 -31
  32. package/core/built/admin/assets/activitypub/{chunk-KS7C4IRE-Ck3O4oo2.js → chunk-KS7C4IRE-CTUL98Lc.js} +2498 -1885
  33. package/core/built/admin/assets/activitypub/{content-formatters-CLcjaBwV.js → content-formatters-D7GWP7nH.js} +23 -24
  34. package/core/built/admin/assets/activitypub/{copy-DcOh8kXw.js → copy-CgzTvoeR.js} +2 -2
  35. package/core/built/admin/assets/activitypub/{domain-fZ-X8i4-.js → domain-C3G_nkHU.js} +46 -46
  36. package/core/built/admin/assets/activitypub/{edit-profile-BqMLQV88.js → edit-profile-C8cCY-AK.js} +927 -928
  37. package/core/built/admin/assets/activitypub/{explore-B4yPoP8E.js → explore-NlDT4inq.js} +11 -11
  38. package/core/built/admin/assets/activitypub/{feed-BRC_mvAe.js → feed-DF22jCTV.js} +10 -10
  39. package/core/built/admin/assets/activitypub/{field-COacNgOt.js → field-95-iuTte.js} +4 -4
  40. package/core/built/admin/assets/activitypub/{hash-C7u-irQQ.js → hash-R7LMLnhY.js} +2 -2
  41. package/core/built/admin/assets/activitypub/{inbox-CbTTdDQ3.js → inbox-DUJUiV6x.js} +2 -2
  42. package/core/built/admin/assets/activitypub/{inbox-BW-yvUoN.js → inbox-DerExBzA.js} +416 -414
  43. package/core/built/admin/assets/activitypub/{label-kPMmYI7l.js → label-EwCn1QYc.js} +4 -4
  44. package/core/built/admin/assets/activitypub/layout-Dy6NnW1G.js +1 -0
  45. package/core/built/admin/assets/activitypub/{moderation-CuidJzc0.js → moderation-BSkfiVYo.js} +73 -75
  46. package/core/built/admin/assets/activitypub/{note-CAMRRSqD.js → note-DOnAJTXK.js} +9 -9
  47. package/core/built/admin/assets/activitypub/{notifications-BmNlXGgp.js → notifications-DZc6XTjG.js} +27 -27
  48. package/core/built/admin/assets/activitypub/{onboarding-Dmun9jr_.js → onboarding-8vEIwYTH.js} +3 -3
  49. package/core/built/admin/assets/activitypub/{onboarding-Bqg7fh_L.js → onboarding-DYVqbNmp.js} +2 -2
  50. package/core/built/admin/assets/activitypub/{preferences--oH19wf9.js → preferences-DDok6F2N.js} +1418 -1390
  51. package/core/built/admin/assets/activitypub/{profile-DH_tQx2D.js → profile-DjVa2hUk.js} +254 -255
  52. package/core/built/admin/assets/activitypub/{reply-Cap9PxSH.js → reply-DtXBpHxu.js} +2 -2
  53. package/core/built/admin/assets/activitypub/routes-Cw302e1c.js +4946 -0
  54. package/core/built/admin/assets/activitypub/{separator-CAxxu8VV.js → separator-FpRpVDd3.js} +8 -9
  55. package/core/built/admin/assets/activitypub/settings-yK-puALn.js +314 -0
  56. package/core/built/admin/assets/activitypub/{site-BYps63oh.js → site-CHw0R2PA.js} +2 -2
  57. package/core/built/admin/assets/activitypub/{step-1-CKjR2KAm.js → step-1-737bnvxk.js} +7 -7
  58. package/core/built/admin/assets/activitypub/{step-2-B6PKfOUQ.js → step-2-DBaIsAsM.js} +7 -7
  59. package/core/built/admin/assets/activitypub/{step-3-C-qBbcUo.js → step-3-BBmy9m9V.js} +23 -23
  60. package/core/built/admin/assets/activitypub/tabs-LQ2xirdm.js +1101 -0
  61. package/core/built/admin/assets/activitypub/{topic-filter-DsUOuu0k.js → topic-filter-75Nu0CKj.js} +4 -4
  62. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CX9snsLs.js → use-activity-pub-queries-CYI2QJMs.js} +58 -58
  63. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-DsJTGDSS.js → use-navigate-with-base-path-B4jZ8hyg.js} +3924 -1403
  64. package/core/built/admin/assets/activitypub/{use-reply-chain-data-AJi9zkzm.js → use-reply-chain-data-BHmFxc3U.js} +6 -6
  65. package/core/built/admin/assets/activitypub/users-CSjOwpT9.js +886 -0
  66. package/core/built/admin/assets/activitypub/{x-DR8AT3-4.js → x-B9ptWCds.js} +2 -2
  67. package/core/built/admin/assets/{add-integration-modal-B12oRifD.js → add-integration-modal-BwePhq95.js} +1 -1
  68. package/core/built/admin/assets/add-newsletter-modal-Zv0I7Msm.js +1 -0
  69. package/core/built/admin/assets/{add-recommendation-modal-CJf92edY.js → add-recommendation-modal-cdLv0wHy.js} +1 -1
  70. package/core/built/admin/assets/analytics-DY8_SaP7.js +1 -0
  71. package/core/built/admin/assets/announcement-bar-modal-C-2yWwag.js +1 -0
  72. package/core/built/admin/assets/api-keys-BHKATUqQ.js +1 -0
  73. package/core/built/admin/assets/{audience-6GXevic-.js → audience-wRcSN0jV.js} +1 -1
  74. package/core/built/admin/assets/{automated-emails-DJQ4uNZo.js → automated-emails-CzUa3v4d.js} +1 -1
  75. package/core/built/admin/assets/automations-DupSsSOr.js +1 -0
  76. package/core/built/admin/assets/badge-CI1Z0xyG.js +1 -0
  77. package/core/built/admin/assets/bluesky-sharing-B8PC1SBj.js +1 -0
  78. package/core/built/admin/assets/box-LUuYRT-1.js +1 -0
  79. package/core/built/admin/assets/brand-icon-CrmbX86T.js +1 -0
  80. package/core/built/admin/assets/breadcrumb-DDDpzLyo.js +1 -0
  81. package/core/built/admin/assets/button-D414TI3B.js +1 -0
  82. package/core/built/admin/assets/calendar-Cp_opo3i.js +1 -0
  83. package/core/built/admin/assets/card-C2dfd5u0.js +1 -0
  84. package/core/built/admin/assets/chart-B_UNLXse.js +63 -0
  85. package/core/built/admin/assets/chart-helpers-Czu_9QpJ.js +1 -0
  86. package/core/built/admin/assets/checkbox-CFFqf0Nh.js +1 -0
  87. package/core/built/admin/assets/{chunk.368.22ce1b732c0b40abd3f1.js → chunk.201.6961b57ed7a281ac193e.js} +23 -19
  88. package/core/built/admin/assets/chunk.524.0b850e72ec49a0fa3882.js +25 -0
  89. package/core/built/admin/assets/chunk.582.db2ae9e968256e8d58ac.js +27 -0
  90. package/core/built/admin/assets/code-editor-view-Bd_nnHKk.js +1 -0
  91. package/core/built/admin/assets/code-editor-view-BeU3Yf9M.js +1 -0
  92. package/core/built/admin/assets/color-picker-Bzm1V7qg.js +3 -0
  93. package/core/built/admin/assets/color-picker-field-DP0moHz9.js +1 -0
  94. package/core/built/admin/assets/combobox-6_ruuTuj.js +1 -0
  95. package/core/built/admin/assets/command-B5wfm6pd.js +1 -0
  96. package/core/built/admin/assets/comments-BB26dUSl.js +1 -0
  97. package/core/built/admin/assets/confirmation-context-znVJD4pX.js +1 -0
  98. package/core/built/admin/assets/container-CHHif8km.js +1 -0
  99. package/core/built/admin/assets/{content-api-modal-0ZjuLcQ8.js → content-api-modal-DOHwl0yZ.js} +1 -1
  100. package/core/built/admin/assets/context-menu-BpY46Dlb.js +1 -0
  101. package/core/built/admin/assets/copy-field-DRBx6Ady.js +1 -0
  102. package/core/built/admin/assets/create-ghost-browse-value-source-eIXo5Qws.js +1 -0
  103. package/core/built/admin/assets/custom-field-type-option-DrSlETOI.js +1 -0
  104. package/core/built/admin/assets/custom-integration-modal-Dgo425Ec.js +1 -0
  105. package/core/built/admin/assets/data-list-DM8yqpXi.js +1 -0
  106. package/core/built/admin/assets/date-range-select-DdC23c13.js +1 -0
  107. package/core/built/admin/assets/design-and-theme-modal-CbSu9IT4.js +2 -0
  108. package/core/built/admin/assets/detail-page-CN4NdhpV.js +1 -0
  109. package/core/built/admin/assets/dirty-confirm-dialog-BT_Vq9TD.js +1 -0
  110. package/core/built/admin/assets/{disabled-sources-indicator-CLZhMv8J.js → disabled-sources-indicator-C5xtW0Q2.js} +1 -1
  111. package/core/built/admin/assets/dist-B40T-RCQ.js +1 -0
  112. package/core/built/admin/assets/dist-CrlaEoaK.js +1 -0
  113. package/core/built/admin/assets/domain-BPReCZa8.js +1 -0
  114. package/core/built/admin/assets/dropzone-B2auMkf2.js +5 -0
  115. package/core/built/admin/assets/edit-profile-B7XTBzKe.js +1 -0
  116. package/core/built/admin/assets/editor-BcaC9dqm.js +8 -0
  117. package/core/built/admin/assets/editor-screen-FuMpItC8.js +27 -0
  118. package/core/built/admin/assets/email-sending-status-provider-9d81o1C2.js +1 -0
  119. package/core/built/admin/assets/embed-signup-form-modal-CbVbMsxl.js +8 -0
  120. package/core/built/admin/assets/empty-indicator-CSQts7GV.js +1 -0
  121. package/core/built/admin/assets/explore-DbSXFTJN.js +1 -0
  122. package/core/built/admin/assets/feature-image-placeholder-DFXA4vfJ.js +1 -0
  123. package/core/built/admin/assets/feed-W7RlF-Gp.js +1 -0
  124. package/core/built/admin/assets/field-BXEh3ptU.js +1 -0
  125. package/core/built/admin/assets/filter-sources-DHK2IoCk.js +1 -0
  126. package/core/built/admin/assets/filters-0SYNTqyQ.js +1 -0
  127. package/core/built/admin/assets/filters-DTtZKQyq.js +1 -0
  128. package/core/built/admin/assets/{first-promoter-modal-wr73Dldc.js → first-promoter-modal-DcoN_OXu.js} +1 -1
  129. package/core/built/admin/assets/{ghost-a1e6e172c6917e8ef8fa6b0007756d9b.js → ghost-25495154132af7305cb7b646fd83f48f.js} +562 -514
  130. package/core/built/admin/assets/gift-link-modal-BX-Q1TOk.js +1 -0
  131. package/core/built/admin/assets/grid-BEUIDQX7.js +1 -0
  132. package/core/built/admin/assets/growth-G6PLO4aF.js +1 -0
  133. package/core/built/admin/assets/growth-tkD-fBOY.js +3 -0
  134. package/core/built/admin/assets/heading-ih-fOVqF.js +1 -0
  135. package/core/built/admin/assets/history-modal-Ca-gStoq.js +1 -0
  136. package/core/built/admin/assets/html-field-B3CrKV9Y.js +1 -0
  137. package/core/built/admin/assets/images-H-BIm8OQ.js +1 -0
  138. package/core/built/admin/assets/{inbox-DgSZ6w2p.js → inbox-DBbDVMPz.js} +14 -14
  139. package/core/built/admin/assets/index-DOF2jDq0.js +4 -0
  140. package/core/built/admin/assets/index-JrrNchW1.css +2 -0
  141. package/core/built/admin/assets/input-group-CvH-3d3F.js +1 -0
  142. package/core/built/admin/assets/input-surface-CL23Mlh8.js +1 -0
  143. package/core/built/admin/assets/integration-header-C7GXGis_.js +1 -0
  144. package/core/built/admin/assets/invite-user-modal-EJ2_6RpV.js +1 -0
  145. package/core/built/admin/assets/isPlainObject-BzzgUf1E.js +1 -0
  146. package/core/built/admin/assets/{koenig-lexical-CXVgQFUk.js → koenig-lexical-Dkwee5FG.js} +1 -1
  147. package/core/built/admin/assets/koenig-loader-BzXCXHoA.js +2 -0
  148. package/core/built/admin/assets/kpi-card-iCDUTgOR.js +1 -0
  149. package/core/built/admin/assets/kpi-card-jTnpLKGr.js +1 -0
  150. package/core/built/admin/assets/kpi-helpers-Criu0YAf.js +1 -0
  151. package/core/built/admin/assets/kpi-tabs-DbOmmyOo.js +1 -0
  152. package/core/built/admin/assets/label-Du0yqMqL.js +1 -0
  153. package/core/built/admin/assets/label-picker-Bq1XXr1D.js +1 -0
  154. package/core/built/admin/assets/{labels-KMkFoRG6.js → labels-0x2NfLtC.js} +1 -1
  155. package/core/built/admin/assets/layout-Ckwzsnsu.js +1 -0
  156. package/core/built/admin/assets/lib-CCz2mjm8.js +2 -0
  157. package/core/built/admin/assets/link-helpers-o9GgBTni.js +1 -0
  158. package/core/built/admin/assets/{links-FwNCVyVe.js → links-Ctujreuh.js} +1 -1
  159. package/core/built/admin/assets/list-page-CH_wnDC3.js +1 -0
  160. package/core/built/admin/assets/member-activity-CsAh6MxK.js +1 -0
  161. package/core/built/admin/assets/member-activity-feed-0ytsQbtY.js +1 -0
  162. package/core/built/admin/assets/member-custom-fields-CTFGnnYv.js +1 -0
  163. package/core/built/admin/assets/member-detail-QU3vB1ML.js +1 -0
  164. package/core/built/admin/assets/members-CtMVO_AB.js +4 -0
  165. package/core/built/admin/assets/modal-page-8Ipfl51B.js +1 -0
  166. package/core/built/admin/assets/moderation-B8VtA-W0.js +1 -0
  167. package/core/built/admin/assets/multi-select-combobox-_9wEYmGv.js +1 -0
  168. package/core/built/admin/assets/navigation-modal-CGcjJvkc.js +1 -0
  169. package/core/built/admin/assets/newsletter-BpHjjqmq.js +1 -0
  170. package/core/built/admin/assets/newsletter-detail-modal-DzTbGOyo.js +1 -0
  171. package/core/built/admin/assets/newsletter-emails-BMKH4Osp.js +1 -0
  172. package/core/built/admin/assets/newsletters-BxC84_cL.js +1 -0
  173. package/core/built/admin/assets/note-BPtEzzZS.js +1 -0
  174. package/core/built/admin/assets/notifications-ng3ulEdp.js +1 -0
  175. package/core/built/admin/assets/offers-container-modal-CwqnRa3T.js +1 -0
  176. package/core/built/admin/assets/onboarding-route-CplZzd7F.js +1 -0
  177. package/core/built/admin/assets/overview-B0yD9OoX.js +1 -0
  178. package/core/built/admin/assets/overview-C4eJzQqi.js +1 -0
  179. package/core/built/admin/assets/page-header-CdCpekG9.js +1 -0
  180. package/core/built/admin/assets/pagemenu-CKQD9hoP.js +1 -0
  181. package/core/built/admin/assets/pages-route-CKsnxIvw.js +1 -0
  182. package/core/built/admin/assets/{pintura-modal-BljM7hf8.js → pintura-modal-C5jzeyGk.js} +1 -1
  183. package/core/built/admin/assets/portal-frame-DYo0bh0E.js +1 -0
  184. package/core/built/admin/assets/portal-modal-C0d8xjKa.js +1 -0
  185. package/core/built/admin/assets/post-analytics-C5C7IyAm.js +1 -0
  186. package/core/built/admin/assets/post-analytics-header-DKWHwoK2.js +1 -0
  187. package/core/built/admin/assets/{post-analytics-provider-CgreZDjS.js → post-analytics-provider-BqCPPxmW.js} +1 -1
  188. package/core/built/admin/assets/post-share-modal-wxmqbAv_.js +1 -0
  189. package/core/built/admin/assets/posts-list-screen-B978ZO0R.js +2 -0
  190. package/core/built/admin/assets/posts-route-CDqxKazl.js +1 -0
  191. package/core/built/admin/assets/preferences-CnejTRc4.js +5 -0
  192. package/core/built/admin/assets/preview-chrome-C7yZWVLZ.js +1 -0
  193. package/core/built/admin/assets/preview-modal-CFUxUGHp.js +1 -0
  194. package/core/built/admin/assets/profile-ClRGiOqA.js +1 -0
  195. package/core/built/admin/assets/radio-group-CTmLo0h9.js +1 -0
  196. package/core/built/admin/assets/router-provider-DDZvgS3V.js +1 -0
  197. package/core/built/admin/assets/select-D_4xWFYv.js +1 -0
  198. package/core/built/admin/assets/settings-BRl7-7a9.js +1 -0
  199. package/core/built/admin/assets/settings-BoQcPa-y.js +4 -0
  200. package/core/built/admin/assets/settings-breadcrumbs-C9Yxl81q.js +1 -0
  201. package/core/built/admin/assets/{dist-BXHrDV19.js → shade-scope-Cccj-c7I-D0XwkdKQ.js} +5 -3
  202. package/core/built/admin/assets/share-modal-DBqZobuR.js +1 -0
  203. package/core/built/admin/assets/simple-pagination-D5t_ox6x.js +1 -0
  204. package/core/built/admin/assets/skeleton-CPcTiTSX.js +1 -0
  205. package/core/built/admin/assets/{slack-modal-D7W_fNON.js → slack-modal-BF9ex8cd.js} +1 -1
  206. package/core/built/admin/assets/sort-button-C0EXGjnS.js +1 -0
  207. package/core/built/admin/assets/{source-icon-CQboPZQ3.js → source-icon-BzzftCQ2.js} +1 -1
  208. package/core/built/admin/assets/stats-view-CzpGoHzF.js +1 -0
  209. package/core/built/admin/assets/{step-1-BKhjy0PV.js → step-1-CBUYUPPF.js} +1 -1
  210. package/core/built/admin/assets/{step-2-PxA1OM7R.js → step-2-CEIXUwQa.js} +1 -1
  211. package/core/built/admin/assets/{step-3-BJbAiq16.js → step-3-C1HA5i1N.js} +2 -2
  212. package/core/built/admin/assets/stripe-button-DMFsLs80.js +1 -0
  213. package/core/built/admin/assets/stripe-connect-modal-CEvxCUTv.js +1 -0
  214. package/core/built/admin/assets/switch-DoOJF2yg.js +1 -0
  215. package/core/built/admin/assets/table-BDYbUHJz.js +1 -0
  216. package/core/built/admin/assets/tabs-BZyz4ZCH.js +1 -0
  217. package/core/built/admin/assets/tag-detail-CFzaz_9E.js +2 -0
  218. package/core/built/admin/assets/tag-picker-BKUCZuRc.js +1 -0
  219. package/core/built/admin/assets/tags-Bs1FiD7m.js +1 -0
  220. package/core/built/admin/assets/{testimonials-modal-Dkt6ODLW.js → testimonials-modal-CVm0_7E-.js} +1 -1
  221. package/core/built/admin/assets/text-BLI0C8Mc.js +1 -0
  222. package/core/built/admin/assets/textarea-C5qolByg.js +1 -0
  223. package/core/built/admin/assets/tier-detail-modal-Cmwzi-e7.js +1 -0
  224. package/core/built/admin/assets/toggle-group-BTL1QsWY.js +1 -0
  225. package/core/built/admin/assets/{topic-filter-DVOe3D-b.js → topic-filter-BMjhquv7.js} +1 -1
  226. package/core/built/admin/assets/transistor-modal-hMv53jF8.js +1 -0
  227. package/core/built/admin/assets/trend-badge-1w_HEzkG.js +1 -0
  228. package/core/built/admin/assets/{unsplash-modal-DXt7Brum.js → unsplash-modal-jzC8lEB2.js} +1 -1
  229. package/core/built/admin/assets/use-analytics-data-B3lGOxsC.js +1 -0
  230. package/core/built/admin/assets/use-availability-DnKqOyqd.js +1 -0
  231. package/core/built/admin/assets/{use-check-theme-limit-error-JD-J5aaZ.js → use-check-theme-limit-error-C1tc2P4N.js} +2 -2
  232. package/core/built/admin/assets/use-filter-params-DU-aiaTb.js +1 -0
  233. package/core/built/admin/assets/{use-filterable-api-CEMSAYPg.js → use-filterable-api-CxCrnPxG.js} +1 -1
  234. package/core/built/admin/assets/use-growth-stats-E13rMQUE.js +1 -0
  235. package/core/built/admin/assets/use-limiter-DlL7au90.js +19 -0
  236. package/core/built/admin/assets/{use-navigate-with-base-path-88EQpw2k.js → use-navigate-with-base-path-BzgNwMAx.js} +1 -1
  237. package/core/built/admin/assets/{use-pintura-config-BmU45Ruy.js → use-pintura-config-CtEV1JQY.js} +1 -1
  238. package/core/built/admin/assets/{use-pintura-editor-Bz2bZ4iT.js → use-pintura-editor-CaxE64kD.js} +1 -1
  239. package/core/built/admin/assets/use-reply-chain-data-BST2OgCM.js +1 -0
  240. package/core/built/admin/assets/use-sending-eta-DR9ueMH8.js +1 -0
  241. package/core/built/admin/assets/use-setting-group-ldtX1Vsk.js +1 -0
  242. package/core/built/admin/assets/use-settings-navigation-CzGU4sus.js +1 -0
  243. package/core/built/admin/assets/use-staff-users-DoeXaPsb.js +1 -0
  244. package/core/built/admin/assets/use-tinybird-query-BaBNCaj0.js +1 -0
  245. package/core/built/admin/assets/{use-tinybird-token-Lk1RSn0t.js → use-tinybird-token-CnZ19NDf.js} +1 -1
  246. package/core/built/admin/assets/{use-url-input-DpmbDppC.js → use-url-input-C5KHJw79.js} +1 -1
  247. package/core/built/admin/assets/user-detail-modal-Dm0KfPeR.js +1 -0
  248. package/core/built/admin/assets/{vendor-2dd263291938d407802568d3357ec69e.js → vendor-97e91ff8dd1457c668f9ef103ee1a77b.js} +2748 -2977
  249. package/core/built/admin/assets/virtual-list-tAuPUICw.js +1 -0
  250. package/core/built/admin/assets/web-BQlKcW2x.js +2 -0
  251. package/core/built/admin/assets/web-NTT5DkEz.js +1 -0
  252. package/core/built/admin/assets/{zapier-modal-BafLUO4R.js → zapier-modal-DsHG9Oev.js} +1 -1
  253. package/core/built/admin/index.html +22 -24
  254. package/core/frontend/apps/private-blogging/index.js +2 -2
  255. package/core/frontend/apps/private-blogging/lib/middleware.js +1 -1
  256. package/core/frontend/apps/private-blogging/lib/router.js +1 -1
  257. package/core/frontend/helpers/cancel_link.js +3 -3
  258. package/core/frontend/helpers/content.js +2 -2
  259. package/core/frontend/helpers/content_api_url.js +1 -1
  260. package/core/frontend/helpers/date.js +1 -1
  261. package/core/frontend/helpers/foreach.js +5 -5
  262. package/core/frontend/helpers/get.js +7 -4
  263. package/core/frontend/helpers/ghost_head.js +2 -2
  264. package/core/frontend/helpers/has.js +1 -3
  265. package/core/frontend/helpers/link.js +7 -7
  266. package/core/frontend/helpers/link_class.js +2 -2
  267. package/core/frontend/helpers/navigation.js +1 -2
  268. package/core/frontend/helpers/recommendations.js +5 -6
  269. package/core/frontend/helpers/tiers.js +1 -1
  270. package/core/frontend/helpers/total_members.js +1 -1
  271. package/core/frontend/helpers/total_paid_members.js +1 -1
  272. package/core/frontend/meta/author-url.js +1 -1
  273. package/core/frontend/meta/modified-date.js +1 -1
  274. package/core/frontend/meta/published-date.js +1 -1
  275. package/core/frontend/meta/schema.js +3 -8
  276. package/core/frontend/meta/structured-data.js +1 -2
  277. package/core/frontend/services/assets-minification/minifier.js +1 -1
  278. package/core/frontend/services/data/entry-lookup.js +1 -1
  279. package/core/frontend/services/data/fetch-data.js +2 -2
  280. package/core/frontend/services/rendering/format-response.js +1 -1
  281. package/core/frontend/services/rendering/renderer.js +3 -0
  282. package/core/frontend/services/rendering/templates.js +1 -1
  283. package/core/frontend/services/routing/controllers/static.js +1 -1
  284. package/core/frontend/services/routing/parent-router.js +1 -1
  285. package/core/frontend/services/routing/registry.js +1 -1
  286. package/core/frontend/services/sitemap/base-site-map-generator.js +68 -97
  287. package/core/frontend/services/sitemap/site-map-index-generator.js +16 -21
  288. package/core/frontend/services/sitemap/site-map-manager.js +82 -43
  289. package/core/frontend/services/sitemap/sitemap-xml.js +72 -0
  290. package/core/frontend/services/theme-engine/handlebars/utils.js +8 -8
  291. package/core/frontend/services/theme-engine/i18n/i18n.js +4 -5
  292. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +1 -1
  293. package/core/frontend/services/theme-engine/preview.js +1 -1
  294. package/core/frontend/utils/member-count.js +2 -2
  295. package/core/frontend/web/routers/serve-public-file.js +1 -1
  296. package/core/server/adapters/scheduling/README.md +4 -0
  297. package/core/server/adapters/scheduling/get-scheduler-idempotency-key.js +21 -0
  298. package/core/server/adapters/storage/LocalStorageBase.js +2 -1
  299. package/core/server/api/endpoints/automated-emails.js +8 -2
  300. package/core/server/api/endpoints/db.js +1 -1
  301. package/core/server/api/endpoints/emails.js +3 -3
  302. package/core/server/api/endpoints/mail.js +1 -1
  303. package/core/server/api/endpoints/member-signin-urls.js +1 -1
  304. package/core/server/api/endpoints/members.js +3 -3
  305. package/core/server/api/endpoints/oembed.js +1 -1
  306. package/core/server/api/endpoints/posts.js +1 -1
  307. package/core/server/api/endpoints/settings.js +2 -2
  308. package/core/server/api/endpoints/themes.js +5 -5
  309. package/core/server/api/endpoints/utils/serializers/input/pages.js +2 -2
  310. package/core/server/api/endpoints/utils/serializers/input/posts.js +2 -2
  311. package/core/server/api/endpoints/utils/serializers/input/tags.js +1 -1
  312. package/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js +4 -4
  313. package/core/server/api/endpoints/utils/serializers/output/mappers/comments.js +8 -5
  314. package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +1 -1
  315. package/core/server/api/endpoints/utils/serializers/output/pages.js +4 -4
  316. package/core/server/api/endpoints/utils/serializers/output/posts.js +4 -4
  317. package/core/server/api/endpoints/utils/serializers/output/search-index.js +11 -11
  318. package/core/server/api/endpoints/utils/serializers/output/settings.js +1 -1
  319. package/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js +3 -3
  320. package/core/server/api/endpoints/utils/validators/input/automated_emails.js +23 -33
  321. package/core/server/api/endpoints/utils/validators/input/settings.js +3 -3
  322. package/core/server/data/exporter/exporter.js +1 -2
  323. package/core/server/data/exporter/table-lists.js +1 -0
  324. package/core/server/data/importer/handlers/image.js +1 -2
  325. package/core/server/data/importer/handlers/json.js +1 -3
  326. package/core/server/data/importer/handlers/markdown.js +4 -8
  327. package/core/server/data/importer/import-manager.js +1 -1
  328. package/core/server/data/importer/importers/content-file-importer.js +4 -8
  329. package/core/server/data/importer/importers/data/base.js +10 -10
  330. package/core/server/data/importer/importers/data/custom-theme-settings-importer.js +1 -1
  331. package/core/server/data/importer/importers/data/data-importer.js +3 -4
  332. package/core/server/data/importer/importers/data/posts-importer.js +10 -10
  333. package/core/server/data/importer/importers/data/products-importer.js +3 -3
  334. package/core/server/data/importer/importers/data/settings-importer.js +2 -2
  335. package/core/server/data/importer/importers/data/stripe-prices-importer.js +1 -1
  336. package/core/server/data/importer/importers/data/stripe-products-importer.js +1 -1
  337. package/core/server/data/importer/importers/data/tags-importer.js +1 -1
  338. package/core/server/data/importer/importers/data/users-importer.js +2 -2
  339. package/core/server/data/importer/importers/json-to-html.js +12 -9
  340. package/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js +1 -1
  341. package/core/server/data/migrations/versions/6.65/2026-09-16-15-35-26-add-members-metafield-change-events.js +17 -0
  342. package/core/server/data/schema/fixtures/fixture-manager.js +3 -3
  343. package/core/server/data/schema/index.js +1 -1
  344. package/core/server/data/schema/schema.js +26 -0
  345. package/core/server/data/schema/validator.js +96 -123
  346. package/core/server/data/seeders/importers/email-recipients-importer.js +2 -2
  347. package/core/server/data/seeders/importers/members-login-events-importer.js +1 -1
  348. package/core/server/data/seeders/importers/members-newsletters-importer.js +1 -1
  349. package/core/server/data/seeders/importers/members-paid-subscription-events-importer.js +1 -1
  350. package/core/server/data/seeders/importers/members-status-events-importer.js +1 -1
  351. package/core/server/data/seeders/importers/members-stripe-customers-importer.js +1 -1
  352. package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +1 -1
  353. package/core/server/data/seeders/importers/members-subscribe-events-importer.js +2 -2
  354. package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +1 -1
  355. package/core/server/data/tinybird/pipes/mv_hits.pipe +25 -20
  356. package/core/server/data/tinybird/scripts/docker-analytics-manager.js +2 -2
  357. package/core/server/ghost-server.js +1 -19
  358. package/core/server/lib/image/image-size.js +1 -3
  359. package/core/server/lib/request-external.js +53 -117
  360. package/core/server/models/base/plugins/actions.js +2 -3
  361. package/core/server/models/base/plugins/crud.js +1 -2
  362. package/core/server/models/base/plugins/events.js +4 -4
  363. package/core/server/models/base/plugins/raw-knex.js +3 -3
  364. package/core/server/models/base/plugins/sanitize.js +1 -1
  365. package/core/server/models/benefit.js +1 -1
  366. package/core/server/models/collection.js +1 -1
  367. package/core/server/models/comment.js +3 -3
  368. package/core/server/models/invite.js +2 -5
  369. package/core/server/models/label.js +3 -6
  370. package/core/server/models/member.js +7 -10
  371. package/core/server/models/newsletter.js +1 -1
  372. package/core/server/models/permission.js +3 -6
  373. package/core/server/models/post.js +20 -23
  374. package/core/server/models/product.js +4 -1
  375. package/core/server/models/relations/authors.js +9 -12
  376. package/core/server/models/role.js +2 -5
  377. package/core/server/models/settings.js +3 -3
  378. package/core/server/models/tag.js +2 -5
  379. package/core/server/models/user.js +8 -10
  380. package/core/server/models/webhook.js +2 -4
  381. package/core/server/notify.js +2 -2
  382. package/core/server/services/adapter-manager/utils.js +6 -1
  383. package/core/server/services/api-version-compatibility/legacy-api-path-match.js +2 -2
  384. package/core/server/services/auth/api-key/admin.js +2 -2
  385. package/core/server/services/auth/api-key/content.js +1 -1
  386. package/core/server/services/auth/passwordreset.js +1 -1
  387. package/core/server/services/auth/setup.js +1 -3
  388. package/core/server/services/automations/README.md +19 -0
  389. package/core/server/services/automations/poll.js +3 -1
  390. package/core/server/services/automations/service.js +2 -2
  391. package/core/server/services/automations/welcome-email-automation-poll.js +199 -293
  392. package/core/server/services/comments/comments-controller.js +9 -30
  393. package/core/server/services/comments/comments-service-email-renderer.js +1 -1
  394. package/core/server/services/comments/comments-service-emails.js +1 -1
  395. package/core/server/services/comments/comments-service.js +27 -58
  396. package/core/server/services/comments/comments-stats-service.js +1 -1
  397. package/core/server/services/content-import/import/staged-file.js +9 -9
  398. package/core/server/services/content-import/index.js +1 -1
  399. package/core/server/services/custom-redirects/validation.js +1 -1
  400. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +23 -55
  401. package/core/server/services/email-analytics/index.js +35 -19
  402. package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.js +31 -60
  403. package/core/server/services/email-service/README.md +35 -0
  404. package/core/server/services/email-service/batch-sending-service.js +13 -14
  405. package/core/server/services/email-service/email-renderer.js +50 -14
  406. package/core/server/services/email-service/email-service-wrapper.js +3 -2
  407. package/core/server/services/email-service/email-service.js +33 -8
  408. package/core/server/services/email-service/email-templates/partials/feedback-button.hbs +2 -1
  409. package/core/server/services/email-service/email-templates/partials/styles.hbs +0 -6
  410. package/core/server/services/email-service/email-templates/template.hbs +1 -1
  411. package/core/server/services/email-service/jobs/send-email-job.js +12 -0
  412. package/core/server/services/email-service/mailgun-email-provider.js +7 -2
  413. package/core/server/services/email-service/sending-service.js +1 -1
  414. package/core/server/services/gifts/gift-service.js +12 -3
  415. package/core/server/services/gifts/index.js +0 -2
  416. package/core/server/services/gifts/jobs/index.js +12 -24
  417. package/core/server/services/gifts/jobs/send-gift-reminders-job.js +6 -46
  418. package/core/server/services/invitations/accept.js +2 -2
  419. package/core/server/services/jobs/job-service.js +0 -28
  420. package/core/server/services/jobs-service/jobs-service.js +5 -0
  421. package/core/server/services/jobs-service/register-job-handlers.js +17 -1
  422. package/core/server/services/lib/mailgun-client.js +16 -1
  423. package/core/server/services/lib/mailgun-recipient-message-id.js +49 -0
  424. package/core/server/services/limits.js +1 -1
  425. package/core/server/services/mail/ghost-mailer.js +1 -1
  426. package/core/server/services/member-attribution/member-attribution-service.js +1 -1
  427. package/core/server/services/member-attribution/referrer-translator.js +1 -1
  428. package/core/server/services/members/account-service.js +3 -3
  429. package/core/server/services/members/api.js +1 -1
  430. package/core/server/services/members/import-export/import/importer.js +25 -16
  431. package/core/server/services/members/import-export/import/spool.js +11 -15
  432. package/core/server/services/members/import-export/index.js +6 -4
  433. package/core/server/services/members/jobs/index.js +1 -1
  434. package/core/server/services/members/jobs/members-import-job.js +18 -0
  435. package/core/server/services/members/member-avatar.js +18 -0
  436. package/core/server/services/members/members-api/controllers/member-controller.js +2 -2
  437. package/core/server/services/members/members-api/members-api.js +4 -4
  438. package/core/server/services/members/members-api/repositories/event-repository.js +36 -1
  439. package/core/server/services/members/members-api/repositories/member-repository.js +55 -17
  440. package/core/server/services/members/members-api/repositories/product-repository.js +1 -1
  441. package/core/server/services/members/members-api/services/member-bread-service.js +4 -7
  442. package/core/server/services/members/service.js +7 -2
  443. package/core/server/services/members/stats/members-stats.js +2 -2
  444. package/core/server/services/members-events/event-storage.js +2 -2
  445. package/core/server/services/members-metafields/actions.js +23 -2
  446. package/core/server/services/members-metafields/bindings-service.js +5 -5
  447. package/core/server/services/members-metafields/definitions-service.js +2 -7
  448. package/core/server/services/members-metafields/index.js +2 -1
  449. package/core/server/services/members-metafields/queries.js +7 -1
  450. package/core/server/services/members-metafields/schema.js +49 -1
  451. package/core/server/services/members-metafields/values-service.js +112 -10
  452. package/core/server/services/mentions/mention-sending-service.js +2 -2
  453. package/core/server/services/mentions/mention.js +3 -4
  454. package/core/server/services/mentions/mentions-api.js +4 -1
  455. package/core/server/services/mentions-jobs/job-service.js +0 -28
  456. package/core/server/services/milestones/milestones-service.js +1 -1
  457. package/core/server/services/newsletters/newsletters-service.js +1 -1
  458. package/core/server/services/notifications/notifications.js +3 -3
  459. package/core/server/services/oembed/oembed-service.js +79 -3
  460. package/core/server/services/permissions/can-this.js +1 -2
  461. package/core/server/services/post-scheduling/post-scheduling.js +8 -1
  462. package/core/server/services/posts/post-scheduling.js +7 -0
  463. package/core/server/services/settings/settings-bread-service.js +3 -3
  464. package/core/server/services/settings/settings-utils.js +1 -1
  465. package/core/server/services/settings-helpers/settings-helpers.js +1 -1
  466. package/core/server/services/staff/staff-service-emails.js +9 -9
  467. package/core/server/services/stats/posts-stats-service.js +10 -10
  468. package/core/server/services/stats/referrers-stats-service.js +1 -1
  469. package/core/server/services/stats/subscription-stats-service.js +3 -3
  470. package/core/server/services/stats/utils/tinybird.js +8 -1
  471. package/core/server/services/stripe/stripe-api.js +3 -3
  472. package/core/server/services/stripe/stripe-migrations.js +6 -6
  473. package/core/server/services/themes/storage.js +21 -26
  474. package/core/server/services/themes/theme-storage.js +2 -2
  475. package/core/server/services/tiers/tier.js +15 -15
  476. package/core/server/services/tinybird-sync/index.js +3 -0
  477. package/core/server/services/tinybird-sync/tinybird-sync-service.js +7 -2
  478. package/core/server/services/update-check/update-check-service.js +3 -3
  479. package/core/server/services/webhooks/serialize.js +1 -1
  480. package/core/server/web/api/app.js +0 -5
  481. package/core/server/web/api/middleware/upload.js +29 -2
  482. package/core/server/web/parent/middleware/index.js +1 -1
  483. package/core/server/web/parent/middleware/log-request.js +5 -0
  484. package/core/server/web/parent/middleware/queue-request.js +104 -59
  485. package/core/server/web/shared/middleware/api/spam-prevention.js +2 -2
  486. package/core/shared/config/defaults.json +6 -1
  487. package/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js +1 -1
  488. package/core/shared/labs.js +3 -2
  489. package/core/shared/settings-cache/cache-manager.js +1 -1
  490. package/nodemon.json +1 -1
  491. package/package.json +6 -7
  492. package/pnpm-lock.yaml +126 -728
  493. package/pnpm-workspace.yaml +4 -7
  494. package/tsconfig.json +1 -1
  495. package/components/tryghost-adapter-base-scheduling-0.2.3.tgz +0 -0
  496. package/core/built/admin/assets/Combination-DWfJPcz9.js +0 -41
  497. package/core/built/admin/assets/RadialBarChart-CHRBhiBN.js +0 -1
  498. package/core/built/admin/assets/_baseAssignValue-DcPokYW8.js +0 -1
  499. package/core/built/admin/assets/accordion-CJmRaqK7.js +0 -1
  500. package/core/built/admin/assets/account-migration-DYf7skbb.js +0 -1
  501. package/core/built/admin/assets/action-list-Crnh-_UI.js +0 -1
  502. package/core/built/admin/assets/activitypub/avatar-DVJF5bxP.js +0 -261
  503. package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +0 -1
  504. package/core/built/admin/assets/activitypub/routes-DdyY9uFF.js +0 -7181
  505. package/core/built/admin/assets/activitypub/settings-B6EEcVkW.js +0 -315
  506. package/core/built/admin/assets/activitypub/tabs-DLhZtVde.js +0 -1083
  507. package/core/built/admin/assets/activitypub/users-inweyKL5.js +0 -1499
  508. package/core/built/admin/assets/add-newsletter-modal-CTvXiIqY.js +0 -1
  509. package/core/built/admin/assets/analytics-PHR1Fggi.js +0 -1
  510. package/core/built/admin/assets/announcement-bar-modal-Bql0CXdp.js +0 -1
  511. package/core/built/admin/assets/api-keys-CubH-7_H.js +0 -1
  512. package/core/built/admin/assets/automations-DcZSLFDU.js +0 -1
  513. package/core/built/admin/assets/badge-qP06OT7C.js +0 -1
  514. package/core/built/admin/assets/bluesky-sharing-CJw4d4Mf.js +0 -1
  515. package/core/built/admin/assets/box-CZ_LSVSy.js +0 -1
  516. package/core/built/admin/assets/brand-icon-D3ffDYaC.js +0 -1
  517. package/core/built/admin/assets/breadcrumb-Chn1Ip_q.js +0 -1
  518. package/core/built/admin/assets/button-DvIh2Bq-.js +0 -1
  519. package/core/built/admin/assets/calendar-1QGoStFM.js +0 -1
  520. package/core/built/admin/assets/card-FHQ4D10L.js +0 -1
  521. package/core/built/admin/assets/chart-helpers-CNpA7re_.js +0 -1
  522. package/core/built/admin/assets/chart-jVz9Nf9t.js +0 -63
  523. package/core/built/admin/assets/checkbox-DKht9xMl.js +0 -1
  524. package/core/built/admin/assets/chunk.524.cc9be98e44890cedc8c8.js +0 -25
  525. package/core/built/admin/assets/chunk.582.e6fe742b3217207b11a6.js +0 -27
  526. package/core/built/admin/assets/code-editor-view-BLQIV85-.js +0 -1
  527. package/core/built/admin/assets/code-editor-view-Cg5eJxcr.js +0 -1
  528. package/core/built/admin/assets/color-picker-DQoghc0t.js +0 -3
  529. package/core/built/admin/assets/color-picker-field-BbeK5RRs.js +0 -1
  530. package/core/built/admin/assets/combobox-weO4FBbv.js +0 -1
  531. package/core/built/admin/assets/command-DlLrCm9V.js +0 -1
  532. package/core/built/admin/assets/comments-BjTitLmP.js +0 -1
  533. package/core/built/admin/assets/confirmation-context-IyqoXVk-.js +0 -1
  534. package/core/built/admin/assets/container-DAimjOF_.js +0 -1
  535. package/core/built/admin/assets/context-menu-BtioYFrg.js +0 -1
  536. package/core/built/admin/assets/copy-field-C6ujqJlP.js +0 -1
  537. package/core/built/admin/assets/create-ghost-browse-value-source-DAZMWZNq.js +0 -1
  538. package/core/built/admin/assets/custom-integration-modal-Dm8QI_J4.js +0 -1
  539. package/core/built/admin/assets/data-list-C0CKkeWW.js +0 -1
  540. package/core/built/admin/assets/date-range-select-DrjHQdgz.js +0 -1
  541. package/core/built/admin/assets/design-and-theme-modal-CXVOzBWu.js +0 -2
  542. package/core/built/admin/assets/detail-page-QpLIL-EO.js +0 -1
  543. package/core/built/admin/assets/dirty-confirm-dialog-DWwxREGh.js +0 -1
  544. package/core/built/admin/assets/dist-Bf-HQtVL.js +0 -1
  545. package/core/built/admin/assets/dist-CUwte9v_.js +0 -1
  546. package/core/built/admin/assets/dist-FEQQAwTe.js +0 -1
  547. package/core/built/admin/assets/domain-DBrBic6q.js +0 -1
  548. package/core/built/admin/assets/dropzone-D61QVcEY.js +0 -5
  549. package/core/built/admin/assets/edit-profile-jCqJBxqw.js +0 -1
  550. package/core/built/admin/assets/editor-8Fm4UBEd.js +0 -8
  551. package/core/built/admin/assets/editor-screen-BSX_uC2B.js +0 -27
  552. package/core/built/admin/assets/email-sending-status-provider-DnNhlIvt.js +0 -1
  553. package/core/built/admin/assets/embed-signup-form-modal-DqtBs1WE.js +0 -8
  554. package/core/built/admin/assets/empty-indicator-L4Ql5Db7.js +0 -1
  555. package/core/built/admin/assets/en-Cx75dJv5.js +0 -1
  556. package/core/built/admin/assets/explore-DXhDCtKw.js +0 -1
  557. package/core/built/admin/assets/feature-image-placeholder-e2q6TcH6.js +0 -1
  558. package/core/built/admin/assets/feed-mmt4noNL.js +0 -1
  559. package/core/built/admin/assets/field-p7KnP98B.js +0 -1
  560. package/core/built/admin/assets/filter-bar-CiIKBg3D.js +0 -1
  561. package/core/built/admin/assets/filter-sources-I-dRaQxl.js +0 -1
  562. package/core/built/admin/assets/filters-1injvyxJ.js +0 -1
  563. package/core/built/admin/assets/filters-DnpO6GWX.js +0 -1
  564. package/core/built/admin/assets/gift-link-modal-C3H7YFXO.js +0 -1
  565. package/core/built/admin/assets/grid-5vplBYri.js +0 -1
  566. package/core/built/admin/assets/growth-B1og1kQp.js +0 -1
  567. package/core/built/admin/assets/growth-Bf6OHZlK.js +0 -3
  568. package/core/built/admin/assets/heading-BB21QAbb.js +0 -1
  569. package/core/built/admin/assets/history-modal-t_qEnxPx.js +0 -1
  570. package/core/built/admin/assets/html-field-COLQbV4r.js +0 -1
  571. package/core/built/admin/assets/images-4mvoc3lB.js +0 -1
  572. package/core/built/admin/assets/index-B3HZU2i8.css +0 -2
  573. package/core/built/admin/assets/index-DDd-zhNL.js +0 -4
  574. package/core/built/admin/assets/inline-B8H6NzIw.js +0 -1
  575. package/core/built/admin/assets/input-group-CLIN2ykI.js +0 -1
  576. package/core/built/admin/assets/input-surface-wSO5CRy5.js +0 -1
  577. package/core/built/admin/assets/integration-header-CKGrXNVP.js +0 -1
  578. package/core/built/admin/assets/invite-user-modal-BaN2mdhI.js +0 -1
  579. package/core/built/admin/assets/koenig-loader-B1XPPY5C.js +0 -2
  580. package/core/built/admin/assets/kpi-card-CRLPVlFW.js +0 -1
  581. package/core/built/admin/assets/kpi-card-CRPbW8NZ.js +0 -1
  582. package/core/built/admin/assets/kpi-helpers-D7zT96bp.js +0 -1
  583. package/core/built/admin/assets/kpi-tabs-DE_yh9Go.js +0 -1
  584. package/core/built/admin/assets/label-CgeBxy4o.js +0 -1
  585. package/core/built/admin/assets/label-picker-DGDp4Vwr.js +0 -1
  586. package/core/built/admin/assets/layout-DWnOMly4.js +0 -1
  587. package/core/built/admin/assets/lib-_QYaUU89.js +0 -2
  588. package/core/built/admin/assets/link-helpers-8J7ixADV.js +0 -1
  589. package/core/built/admin/assets/list-page-DLMP0PxC.js +0 -1
  590. package/core/built/admin/assets/member-activity-ClMWFyvN.js +0 -1
  591. package/core/built/admin/assets/member-activity-feed-BQY5Rwaj.js +0 -1
  592. package/core/built/admin/assets/member-custom-fields-Dd_ie1zG.js +0 -1
  593. package/core/built/admin/assets/member-detail-DjwkGVne.js +0 -1
  594. package/core/built/admin/assets/members--N9lhk1N.js +0 -4
  595. package/core/built/admin/assets/modal-page-Dz-9TP4E.js +0 -1
  596. package/core/built/admin/assets/moderation-DfYBKq9s.js +0 -1
  597. package/core/built/admin/assets/multi-select-combobox-BcBEzUW_.js +0 -1
  598. package/core/built/admin/assets/navigation-modal-Cd-scywg.js +0 -1
  599. package/core/built/admin/assets/newsletter-detail-modal-CFRY6vg_.js +0 -1
  600. package/core/built/admin/assets/newsletter-emails-4ntck1AC.js +0 -1
  601. package/core/built/admin/assets/newsletter-o6eCJtab.js +0 -1
  602. package/core/built/admin/assets/newsletters-Bmlv0edG.js +0 -1
  603. package/core/built/admin/assets/note-CWs3LF-0.js +0 -1
  604. package/core/built/admin/assets/notifications-BjSvTJqh.js +0 -1
  605. package/core/built/admin/assets/offers-container-modal-Bc9A196w.js +0 -1
  606. package/core/built/admin/assets/onboarding-route-Di1LJYEE.js +0 -1
  607. package/core/built/admin/assets/overview-DE7NHZQN.js +0 -1
  608. package/core/built/admin/assets/overview-DEF-ZY6x.js +0 -1
  609. package/core/built/admin/assets/page-header-B-G_g42C.js +0 -1
  610. package/core/built/admin/assets/pagemenu-CnkTDO71.js +0 -1
  611. package/core/built/admin/assets/pages-route-VT7r7YhG.js +0 -1
  612. package/core/built/admin/assets/portal-frame-D9V8iq5x.js +0 -1
  613. package/core/built/admin/assets/portal-modal-B5OOR9ZD.js +0 -1
  614. package/core/built/admin/assets/post-analytics-header-J0WciLx6.js +0 -1
  615. package/core/built/admin/assets/post-analytics-rGb-PgD-.js +0 -1
  616. package/core/built/admin/assets/post-share-modal-D0BbTo4W.js +0 -1
  617. package/core/built/admin/assets/posts-list-screen-CO5jAWoU.js +0 -2
  618. package/core/built/admin/assets/posts-route-DV-CXWK9.js +0 -1
  619. package/core/built/admin/assets/preferences-Tac29oG6.js +0 -5
  620. package/core/built/admin/assets/preview-chrome-C2lQgZBZ.js +0 -1
  621. package/core/built/admin/assets/preview-modal-CjRbBr8U.js +0 -1
  622. package/core/built/admin/assets/profile-yiM1f_Og.js +0 -1
  623. package/core/built/admin/assets/radio-group-CKROWsw4.js +0 -1
  624. package/core/built/admin/assets/router-provider-CU87qxXw.js +0 -1
  625. package/core/built/admin/assets/select-CKaC4ggu.js +0 -1
  626. package/core/built/admin/assets/settings-81kxUa28.js +0 -1
  627. package/core/built/admin/assets/settings-BVXFqBVK.js +0 -4
  628. package/core/built/admin/assets/settings-breadcrumbs-czGRx-iu.js +0 -1
  629. package/core/built/admin/assets/shade-app-CcS3f8MZ-D5BnfHck.js +0 -3
  630. package/core/built/admin/assets/share-modal-BL-16PiB.js +0 -1
  631. package/core/built/admin/assets/skeleton-DwCva0-b.js +0 -1
  632. package/core/built/admin/assets/sort-button-Dquc83jY.js +0 -1
  633. package/core/built/admin/assets/stack-BURz77VS.js +0 -1
  634. package/core/built/admin/assets/stats-view-NDja_g96.js +0 -1
  635. package/core/built/admin/assets/stripe-button-C3cfCAou.js +0 -1
  636. package/core/built/admin/assets/stripe-connect-modal-FyE3Ey2c.js +0 -1
  637. package/core/built/admin/assets/switch-zfUUy9Jh.js +0 -1
  638. package/core/built/admin/assets/table-dE4GTIRT.js +0 -1
  639. package/core/built/admin/assets/tabs-B3XK93sR.js +0 -1
  640. package/core/built/admin/assets/tag-detail-D4P-tZdM.js +0 -2
  641. package/core/built/admin/assets/tag-picker-BNSZ6Qxw.js +0 -1
  642. package/core/built/admin/assets/tags-BsZcaJ6h.js +0 -1
  643. package/core/built/admin/assets/text-DC-ot6u2.js +0 -1
  644. package/core/built/admin/assets/textarea-B4FffFmE.js +0 -1
  645. package/core/built/admin/assets/tier-detail-modal-a77Z2VMH.js +0 -1
  646. package/core/built/admin/assets/toggle-group-D2p4okmJ.js +0 -1
  647. package/core/built/admin/assets/transistor-modal-C8RMkhOD.js +0 -1
  648. package/core/built/admin/assets/trend-badge-B9v7kMF8.js +0 -1
  649. package/core/built/admin/assets/types-uYQ1HgqL.js +0 -1
  650. package/core/built/admin/assets/use-analytics-data-ChHqiZXv.js +0 -1
  651. package/core/built/admin/assets/use-availability-hPdeG76y.js +0 -1
  652. package/core/built/admin/assets/use-filter-params-BSFigDIn.js +0 -1
  653. package/core/built/admin/assets/use-growth-stats-CqqdnESN.js +0 -1
  654. package/core/built/admin/assets/use-limiter-DBGjYqu7.js +0 -19
  655. package/core/built/admin/assets/use-reply-chain-data-DmD2yX5D.js +0 -1
  656. package/core/built/admin/assets/use-sending-eta-CQeG6OP_.js +0 -1
  657. package/core/built/admin/assets/use-setting-group-Dza6bQ7W.js +0 -1
  658. package/core/built/admin/assets/use-settings-navigation-BIjI5mL3.js +0 -1
  659. package/core/built/admin/assets/use-simple-pagination-DwVxe-Lo.js +0 -1
  660. package/core/built/admin/assets/use-staff-users-i_Mq9OGR.js +0 -1
  661. package/core/built/admin/assets/use-tinybird-query-DXoF74NM.js +0 -1
  662. package/core/built/admin/assets/user-detail-modal-BU4QCHE7.js +0 -1
  663. package/core/built/admin/assets/virtual-list-DScLNuU8.js +0 -1
  664. package/core/built/admin/assets/web-BZS-t4H0.js +0 -1
  665. package/core/built/admin/assets/web-DxAUxnK3.js +0 -2
  666. package/core/frontend/services/sitemap/utils.js +0 -17
  667. package/core/server/services/automations/get-scheduler-idempotency-key.js +0 -13
  668. package/core/server/web/api/testmode/index.js +0 -1
  669. package/core/server/web/api/testmode/jobs/cpu-hog.js +0 -15
  670. package/core/server/web/api/testmode/jobs/graceful-job.js +0 -50
  671. package/core/server/web/api/testmode/jobs/say-hello.js +0 -17
  672. package/core/server/web/api/testmode/routes.js +0 -120
@@ -75,6 +75,7 @@ module.exports = {
75
75
  setFromZip: async (zip, { copySettingsFrom } = {}) => {
76
76
  const themeName = getStorage().getSanitizedFileName(zip.name.split('.zip')[0]);
77
77
  const backupName = `${themeName}_${ObjectID()}`;
78
+ const stagingName = `${themeName}_${ObjectID()}`;
78
79
 
79
80
  // check if zip name matches one of the default themes
80
81
  if (zip.name === 'casper.zip' || zip.name === 'source.zip') {
@@ -111,6 +112,13 @@ module.exports = {
111
112
  await customThemeSettings.api.copySettingsBetweenThemes(copySettingsFrom, themeName);
112
113
  }
113
114
 
115
+ // CASE: copy the extracted theme in under a staging name first, so the live
116
+ // folder is only missing between the two renames below rather than for the whole copy
117
+ await getStorage().save({
118
+ name: stagingName,
119
+ path: checkedTheme.path,
120
+ });
121
+
114
122
  const themeExists = await getStorage().exists(themeName);
115
123
  // CASE: move the existing theme to a backup folder
116
124
  if (themeExists) {
@@ -119,11 +127,7 @@ module.exports = {
119
127
  await getStorage().rename(themeName, backupName);
120
128
  }
121
129
 
122
- // CASE: store extracted theme
123
- await getStorage().save({
124
- name: themeName,
125
- path: checkedTheme.path,
126
- });
130
+ await getStorage().rename(stagingName, themeName);
127
131
 
128
132
  // CASE: loads the theme from the fs & sets the theme on the themeList
129
133
  const loadedTheme = await themeLoader.loadOneTheme(themeName);
@@ -152,20 +156,9 @@ module.exports = {
152
156
  }
153
157
 
154
158
  // restore backup if we renamed an existing theme but saving failed
155
- if (renamedExisting) {
156
- return getStorage()
157
- .exists(themeName)
158
- .then((themeExists) => {
159
- if (!themeExists) {
160
- return getStorage()
161
- .rename(backupName, themeName)
162
- .then(() => {
163
- throw error;
164
- });
165
- }
166
-
167
- throw error;
168
- });
159
+ // awaited so the finally block can't delete the backup before it's restored
160
+ if (renamedExisting && !(await getStorage().exists(themeName))) {
161
+ await getStorage().rename(backupName, themeName);
169
162
  }
170
163
 
171
164
  throw error;
@@ -178,12 +171,14 @@ module.exports = {
178
171
  });
179
172
  }
180
173
 
181
- // CASE: remove the backup we created earlier
182
- getStorage()
183
- .delete(backupName)
184
- .catch((err) => {
185
- logging.error(new errors.InternalServerError({ err: err }));
186
- });
174
+ // CASE: remove the backup and any staging copy left behind by a failure
175
+ for (const leftover of [backupName, stagingName]) {
176
+ getStorage()
177
+ .delete(leftover)
178
+ .catch((err) => {
179
+ logging.error(new errors.InternalServerError({ err: err }));
180
+ });
181
+ }
187
182
  }
188
183
  },
189
184
  destroy: async function (themeName) {
@@ -207,7 +202,7 @@ module.exports = {
207
202
  });
208
203
  }
209
204
 
210
- let result = await getStorage().delete(themeName);
205
+ const result = await getStorage().delete(themeName);
211
206
  list.del(themeName);
212
207
  return result;
213
208
  },
@@ -78,8 +78,8 @@ class ThemeStorage extends LocalStorageBase {
78
78
  * @param {string} destName
79
79
  */
80
80
  rename(srcName, destName) {
81
- let src = path.join(this.getTargetDir(), srcName);
82
- let dest = path.join(this.getTargetDir(), destName);
81
+ const src = path.join(this.getTargetDir(), srcName);
82
+ const dest = path.join(this.getTargetDir(), destName);
83
83
 
84
84
  return fs.move(src, dest);
85
85
  }
@@ -251,21 +251,21 @@ module.exports = class Tier {
251
251
  });
252
252
  }
253
253
 
254
- let name = validateName(data.name);
255
-
256
- let slug = validateSlug(data.slug);
257
- let description = validateDescription(data.description);
258
- let welcomePageURL = validateWelcomePageURL(data.welcomePageURL);
259
- let status = validateStatus(data.status || 'active');
260
- let visibility = validateVisibility(data.visibility || 'public');
261
- let type = validateType(data.type || 'paid');
262
- let currency = validateCurrency(data.currency || null, type);
263
- let trialDays = validateTrialDays(data.trialDays || 0, type);
264
- let monthlyPrice = validateMonthlyPrice(data.monthlyPrice || null, type);
265
- let yearlyPrice = validateYearlyPrice(data.yearlyPrice || null, type);
266
- let createdAt = validateCreatedAt(data.createdAt);
267
- let updatedAt = validateUpdatedAt(data.updatedAt);
268
- let benefits = validateBenefits(data.benefits);
254
+ const name = validateName(data.name);
255
+
256
+ const slug = validateSlug(data.slug);
257
+ const description = validateDescription(data.description);
258
+ const welcomePageURL = validateWelcomePageURL(data.welcomePageURL);
259
+ const status = validateStatus(data.status || 'active');
260
+ const visibility = validateVisibility(data.visibility || 'public');
261
+ const type = validateType(data.type || 'paid');
262
+ const currency = validateCurrency(data.currency || null, type);
263
+ const trialDays = validateTrialDays(data.trialDays || 0, type);
264
+ const monthlyPrice = validateMonthlyPrice(data.monthlyPrice || null, type);
265
+ const yearlyPrice = validateYearlyPrice(data.yearlyPrice || null, type);
266
+ const createdAt = validateCreatedAt(data.createdAt);
267
+ const updatedAt = validateUpdatedAt(data.updatedAt);
268
+ const benefits = validateBenefits(data.benefits);
269
269
 
270
270
  const tier = new Tier({
271
271
  id,
@@ -9,12 +9,15 @@ const bson_objectid_1 = __importDefault(require("bson-objectid"));
9
9
  const logging_1 = __importDefault(require("@tryghost/logging"));
10
10
  const config_1 = __importDefault(require("../../../shared/config"));
11
11
  // @ts-expect-error This module lacks type definitions.
12
+ const labs_1 = __importDefault(require("../../../shared/labs"));
13
+ // @ts-expect-error This module lacks type definitions.
12
14
  const settings_cache_1 = __importDefault(require("../../../shared/settings-cache"));
13
15
  const db_1 = require("../../data/db");
14
16
  const tinybird_sync_service_1 = require("./tinybird-sync-service");
15
17
  const service = (0, tinybird_sync_service_1.createTinybirdSyncService)({
16
18
  config: config_1.default,
17
19
  settingsCache: settings_cache_1.default,
20
+ labs: labs_1.default,
18
21
  knex: db_1.knex,
19
22
  logging: logging_1.default,
20
23
  sleep: async (ms) => {
@@ -10,7 +10,7 @@ const BATCH_SIZE = 5000;
10
10
  const MAX_PAYLOAD_BYTES = 9 * 1024 * 1024;
11
11
  const MAX_PAYLOAD_MESSAGES = 1000;
12
12
  const REQUEST_TIMEOUT_MS = 5 * 60 * 1000;
13
- function createTinybirdSyncService({ config, settingsCache, knex, logging, sleep, random, now, fetch, createId, }) {
13
+ function createTinybirdSyncService({ config, settingsCache, labs, knex, logging, sleep, random, now, fetch, createId, }) {
14
14
  let started = false;
15
15
  const syncAll = async (ingest) => {
16
16
  const results = await Promise.allSettled(sync_table_to_tinybird_1.AUTOMATION_SYNC_TARGETS.map(async (target) => {
@@ -34,9 +34,12 @@ function createTinybirdSyncService({ config, settingsCache, knex, logging, sleep
34
34
  }
35
35
  };
36
36
  const runLoop = async (ingest) => {
37
+ // Randomize the first wait to avoid all instances syncing at the same time.
37
38
  await sleep(Math.floor(random() * INTERVAL_MS));
38
39
  while (true) {
39
- await syncAll(ingest);
40
+ if (labs.isSet('automationsTinybirdSync')) {
41
+ await syncAll(ingest);
42
+ }
40
43
  await sleep(INTERVAL_MS);
41
44
  }
42
45
  };
@@ -50,6 +53,8 @@ function createTinybirdSyncService({ config, settingsCache, knex, logging, sleep
50
53
  return;
51
54
  }
52
55
  started = true;
56
+ const isSyncEnabled = labs.isSet('automationsTinybirdSync');
57
+ logging.info({ system: { event: 'tinybird.sync.started' } }, `[Tinybird sync] Started: sync ${isSyncEnabled ? 'enabled' : 'disabled'} by labs flag (but may change)`);
53
58
  void runLoop(ingest)
54
59
  .then(() => {
55
60
  logging.error('[Tinybird sync] Loop stopped unexpectedly');
@@ -19,10 +19,10 @@ function normalizeNotifications(response) {
19
19
  if (!response) {
20
20
  return [];
21
21
  }
22
- if (_.isArray(response.notifications)) {
22
+ if (Array.isArray(response.notifications)) {
23
23
  return response.notifications;
24
24
  }
25
- if (_.isArray(response)) {
25
+ if (Array.isArray(response)) {
26
26
  return response;
27
27
  }
28
28
  if (response.messages) {
@@ -230,7 +230,7 @@ class UpdateCheckService {
230
230
  * @return {Promise}
231
231
  */
232
232
  async updateCheckResponse(response) {
233
- let notificationGroups = (this.config.notificationGroups || []).concat(['all']);
233
+ const notificationGroups = (this.config.notificationGroups || []).concat(['all']);
234
234
 
235
235
  debug('Notification Groups', notificationGroups);
236
236
  debug('Response Update Check Service', response);
@@ -42,7 +42,7 @@ module.exports =
42
42
  const changed = model._changed ? Object.keys(model._changed) : [];
43
43
 
44
44
  if (Object.keys(model.attributes).length) {
45
- let frame = { options: { previous: false, context: { user: true } } };
45
+ const frame = { options: { previous: false, context: { user: true } } };
46
46
 
47
47
  // @NOTE: below options are lost during event processing, a more holistic approach would be
48
48
  // to pass them somehow along with the model
@@ -1,5 +1,4 @@
1
1
  const debug = require('@tryghost/debug')('web:api:default:app');
2
- const config = require('../../../shared/config');
3
2
  const express = require('../../../shared/express');
4
3
  const sentry = require('../../../shared/sentry');
5
4
  const middleware = require('../shared/middleware');
@@ -13,10 +12,6 @@ module.exports = function setupApiApp() {
13
12
  debug('Parent API setup start');
14
13
  const apiApp = express('api');
15
14
 
16
- if (config.get('server:testmode')) {
17
- apiApp.use(require('./testmode')());
18
- }
19
-
20
15
  apiApp.use(APIVersionCompatibilityService.versionRewrites);
21
16
  apiApp.use(APIVersionCompatibilityService.contentVersion);
22
17
 
@@ -324,6 +324,20 @@ const writeSvg = async (filepath, content, isZipped = false) => {
324
324
 
325
325
  return await fs.writeFile(filepath, content);
326
326
  };
327
+
328
+ /**
329
+ *
330
+ * @param {{ext: string, type: string}} file
331
+ * @returns {boolean}
332
+ *
333
+ * Extension and content type are allowlisted separately, so a file counts as an SVG if either
334
+ * one says so. Storage adapters that use the content type (e.g. S3) would otherwise serve an
335
+ * unsanitized SVG uploaded with a non-SVG extension as image/svg+xml.
336
+ */
337
+ const isSvgFile = (file) => {
338
+ return file.ext === '.svg' || file.ext === '.svgz' || file.type === 'image/svg+xml';
339
+ };
340
+
327
341
  /**
328
342
  *
329
343
  * @param {Object} options
@@ -369,7 +383,7 @@ const validation = function ({ type }) {
369
383
  }
370
384
 
371
385
  // Sanitize SVG files
372
- if (req.file.ext === '.svg' || req.file.ext === '.svgz') {
386
+ if (isSvgFile(req.file)) {
373
387
  const sanitized = await sanitizeSvg(req.file.path, req.file.ext === '.svgz');
374
388
 
375
389
  if (!sanitized) {
@@ -392,7 +406,7 @@ const validation = function ({ type }) {
392
406
  * @returns {import('express').RequestHandler}
393
407
  */
394
408
  const mediaValidation = function ({ type }) {
395
- return function mediaUploadValidation(req, res, next) {
409
+ return async function mediaUploadValidation(req, res, next) {
396
410
  const extensions =
397
411
  (config.get('uploads')[type] && config.get('uploads')[type].extensions) || [];
398
412
  const contentTypes =
@@ -448,6 +462,19 @@ const mediaValidation = function ({ type }) {
448
462
  }),
449
463
  );
450
464
  }
465
+
466
+ // Sanitize SVG thumbnails
467
+ if (isSvgFile(req.thumbnail)) {
468
+ const sanitized = await sanitizeSvg(req.thumbnail.path, req.thumbnail.ext === '.svgz');
469
+
470
+ if (!sanitized) {
471
+ return next(
472
+ new errors.UnsupportedMediaTypeError({
473
+ message: tpl(messages.svg.invalidFile),
474
+ }),
475
+ );
476
+ }
477
+ }
451
478
  }
452
479
 
453
480
  next();
@@ -3,6 +3,6 @@ module.exports = {
3
3
  filterQueryParameters: require('./filter-query-parameters').filterQueryParameters,
4
4
  ghostLocals: require('./ghost-locals').ghostLocals,
5
5
  logRequest: require('./log-request'),
6
- queueRequest: require('./queue-request'),
6
+ queueRequest: require('./queue-request').queueRequest,
7
7
  requestId: require('./request-id').requestId,
8
8
  };
@@ -12,6 +12,11 @@ module.exports = function logRequest(req, res, next) {
12
12
  const startTime = Date.now();
13
13
 
14
14
  function logResponse() {
15
+ // 'close' before 'finish' means the client went away before we responded
16
+ if (!res.writableFinished) {
17
+ res.statusCode = 499;
18
+ }
19
+
15
20
  res.responseTime = Date.now() - startTime + 'ms';
16
21
  req.userId = req.user ? (req.user.id ? req.user.id : req.user) : null;
17
22
 
@@ -1,62 +1,107 @@
1
- const errors = require('@tryghost/errors');
2
- const logging = require('@tryghost/logging');
3
- const path = require('node:path');
4
- const expressQueue = require('express-queue');
5
-
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.queueRequest = queueRequest;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const errors_1 = __importDefault(require("@tryghost/errors"));
9
+ const logging_1 = __importDefault(require("@tryghost/logging"));
6
10
  const debug = (message) => {
7
- logging.debug(`[queue-request] ${message}`);
11
+ logging_1.default.debug(`[queue-request] ${message}`);
8
12
  };
9
-
10
- module.exports = function queueRequest(config, queueFactory = expressQueue) {
11
- if (config.concurrencyLimit === undefined) {
12
- throw new errors.IncorrectUsageError({
13
- message: 'concurrencyLimit must be defined when using queueRequest middleware',
14
- });
15
- }
16
-
17
- debug(`Initialising queueRequest middleware with config: ${JSON.stringify(config)}`);
18
-
19
- // @see https://github.com/alykoshin/express-queue#usage
20
- const queue = queueFactory({
21
- activeLimit: config.concurrencyLimit,
22
- queuedLimit: -1, // Do not limit the number of queued requests
23
- });
24
-
25
- /**
26
- * Available events:
27
- * - queue - when a request is queued
28
- * - dequeue - when a request is dequeued
29
- * - process - when a request is being processed
30
- * - reject - when a request is rejected
31
- * - cancel - when a request is cancelled
32
- * - complete - when a request has completed
33
- *
34
- * @see https://github.com/search?q=repo:alykoshin/mini-queue%20job._toState&type=code
35
- */
36
- queue.queue.on('queue', (job) => {
37
- debug(`Request queued: ${job.data.req.path}`);
38
- });
39
-
40
- queue.queue.on('complete', (job) => {
41
- debug(`Request completed: ${job.data.req.path}`);
42
- });
43
-
44
- /**
45
- * @param {import('express').Request} req
46
- * @param {import('express').Response} res
47
- * @param {import('express').NextFunction} next
48
- */
49
- return function queueRequestMw(req, res, next) {
50
- req.queueDepth = queue.queue.getLength();
51
-
52
- // Do not queue requests for static assets - We assume that any path
53
- // with a file extension is a static asset
54
- if (path.extname(req.path)) {
55
- debug(`Request for assumed static asset skipping queue: ${req.path}`);
56
-
57
- return next();
13
+ /**
14
+ * Limits how many dynamic requests are processed at once, holding the rest in
15
+ * a FIFO queue.
16
+ *
17
+ * A slot is released when the response is ended or the connection closes,
18
+ * whichever happens first, so a handler that never ends its response cannot
19
+ * hold a slot forever. Work abandoned by a disconnected client may keep running
20
+ * after its slot has been handed on.
21
+ */
22
+ function queueRequest(config) {
23
+ if (config.concurrencyLimit === undefined) {
24
+ throw new errors_1.default.IncorrectUsageError({
25
+ message: 'concurrencyLimit must be defined when using queueRequest middleware',
26
+ });
58
27
  }
59
-
60
- return queue(req, res, next);
61
- };
62
- };
28
+ const concurrencyLimit = config.concurrencyLimit;
29
+ if (!Number.isInteger(concurrencyLimit) || concurrencyLimit <= 0) {
30
+ throw new errors_1.default.IncorrectUsageError({
31
+ message: 'concurrencyLimit must be a positive integer',
32
+ });
33
+ }
34
+ // Set iterates in insertion order and deletes in O(1), so cancelling a deep queue stays cheap
35
+ const queue = new Set();
36
+ let activeCount = 0;
37
+ let drainScheduled = false;
38
+ function start({ req, res, next, queuedAt }) {
39
+ activeCount += 1;
40
+ req.extra = { ...req.extra, queueWaitMs: Date.now() - queuedAt };
41
+ let released = false;
42
+ const release = () => {
43
+ if (released) {
44
+ return;
45
+ }
46
+ released = true;
47
+ activeCount -= 1;
48
+ debug(`Request completed: ${req.path}`);
49
+ scheduleStartNext();
50
+ };
51
+ const end = res.end;
52
+ res.end = function (...args) {
53
+ res.end = end;
54
+ release();
55
+ return end.apply(this, args);
56
+ };
57
+ res.once('close', release);
58
+ next();
59
+ }
60
+ // Deferred and bounded so handlers that respond synchronously neither grow the
61
+ // stack per queued request nor drain a deep backlog without yielding to I/O
62
+ function scheduleStartNext() {
63
+ if (drainScheduled) {
64
+ return;
65
+ }
66
+ drainScheduled = true;
67
+ setImmediate(() => {
68
+ drainScheduled = false;
69
+ startNext();
70
+ });
71
+ }
72
+ function startNext() {
73
+ const availableSlots = concurrencyLimit - activeCount;
74
+ for (let started = 0; started < availableSlots && queue.size > 0; started += 1) {
75
+ const [entry] = queue;
76
+ queue.delete(entry);
77
+ entry.res.removeListener('close', entry.cancel);
78
+ start(entry);
79
+ }
80
+ }
81
+ return function queueRequestMw(req, res, next) {
82
+ req.queueDepth = queue.size;
83
+ // Do not queue requests for static assets - We assume that any path
84
+ // with a file extension is a static asset
85
+ if (node_path_1.default.extname(req.path)) {
86
+ debug(`Request for assumed static asset skipping queue: ${req.path}`);
87
+ return next();
88
+ }
89
+ const entry = {
90
+ req,
91
+ res,
92
+ next,
93
+ queuedAt: Date.now(),
94
+ cancel: () => {
95
+ queue.delete(entry);
96
+ debug(`Request cancelled while queued: ${req.path}`);
97
+ },
98
+ };
99
+ // an empty-queue check keeps arrivals behind requests awaiting a deferred start
100
+ if (activeCount < concurrencyLimit && queue.size === 0) {
101
+ return start(entry);
102
+ }
103
+ debug(`Request queued: ${req.path}`);
104
+ queue.add(entry);
105
+ res.once('close', entry.cancel);
106
+ };
107
+ }
@@ -42,8 +42,8 @@ let spamMemberLogin = spam.member_login || {};
42
42
  let spamCheckoutSessionGlobal = spam.checkout_session_global || {};
43
43
  let spamCheckoutSessionEmail = spam.checkout_session_email || {};
44
44
  let spamContentApiKey = spam.content_api_key || {};
45
- let spamWebmentionsBlock = spam.webmentions_block || {};
46
- let spamEmailPreviewBlock = spam.email_preview_block || {};
45
+ const spamWebmentionsBlock = spam.webmentions_block || {};
46
+ const spamEmailPreviewBlock = spam.email_preview_block || {};
47
47
  let spamOtcVerificationEnumeration = spam.otc_verification_enumeration || {};
48
48
  let spamOtcVerification = spam.otc_verification || {};
49
49
 
@@ -71,6 +71,10 @@
71
71
  "active": "LocalImagesStorage",
72
72
  "media": "LocalMediaStorage",
73
73
  "files": "LocalFilesStorage",
74
+ "imports": {
75
+ "adapter": "LocalStorageBase",
76
+ "staticFileURLPrefix": "content/imports"
77
+ },
74
78
  "LocalMediaStorage": {},
75
79
  "LocalFilesStorage": {}
76
80
  },
@@ -363,7 +367,8 @@
363
367
  },
364
368
  "bulkEmail": {
365
369
  "batchSize": 1000,
366
- "captureLinkClickBadMemberUuid": false
370
+ "captureLinkClickBadMemberUuid": false,
371
+ "perRecipientMessageId": false
367
372
  },
368
373
  "disableJSBackups": false,
369
374
  "disableMigrationBackups": false,
@@ -238,7 +238,7 @@ module.exports = class CustomThemeSettingsService {
238
238
  return [];
239
239
  }
240
240
 
241
- let removedIds = [];
241
+ const removedIds = [];
242
242
 
243
243
  // sync any knownSettings that have changed in the theme
244
244
  for (const knownSetting of knownSettings) {
@@ -48,6 +48,7 @@ const PRIVATE_FEATURES = [
48
48
  'importMemberTier',
49
49
  'csvContentImporter',
50
50
  'adminUIRefresh',
51
+ 'admin7Pill',
51
52
  'tagsX',
52
53
  'emailUniqueid',
53
54
  'improveSendingUI',
@@ -63,6 +64,7 @@ const PRIVATE_FEATURES = [
63
64
  'postsListReact',
64
65
  'membersActivityReact',
65
66
  'editorReact',
67
+ 'dunningWarnings',
66
68
  ];
67
69
 
68
70
  module.exports.GA_KEYS = [...GA_FEATURES];
@@ -119,7 +121,6 @@ module.exports.isSet = function isSet(flag) {
119
121
  */
120
122
  module.exports.enabledHelper = function enabledHelper(options, callback) {
121
123
  const errDetails = {};
122
- let errString;
123
124
 
124
125
  if (module.exports.isSet(options.flagKey) === true) {
125
126
  // helper is active, use the callback
@@ -145,7 +146,7 @@ module.exports.enabledHelper = function enabledHelper(options, callback) {
145
146
  );
146
147
 
147
148
  const { SafeString } = require('express-hbs');
148
- errString = new SafeString(
149
+ const errString = new SafeString(
149
150
  `<script>console.error("${_.values(errDetails).join(' ')}");</script>`,
150
151
  );
151
152
 
@@ -240,7 +240,7 @@ class CacheManager {
240
240
  getPublic() {
241
241
  // This block correctly builds the type signature for the return value
242
242
  /** @type {PublicSettingsCache} */
243
- let settings = Object.fromEntries(
243
+ const settings = Object.fromEntries(
244
244
  Object.keys(this.publicSettings).map((key) => [this.publicSettings[key], null]),
245
245
  );
246
246
 
package/nodemon.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "watch": [".", "../*"],
3
- "ignore": ["../admin/**", "content/**", "core/built/**"],
3
+ "ignore": ["../admin/**", "content/**", "core/built/**", "test/**"],
4
4
  "ext": "js,mjs,cjs,json,ts,tsx",
5
5
  "exec": "node --conditions=source --import=tsx"
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "6.64.0",
3
+ "version": "6.65.0",
4
4
  "description": "The professional publishing platform",
5
5
  "keywords": [
6
6
  "blog",
@@ -54,7 +54,7 @@
54
54
  "@tryghost/adapter-base-jobs": "file:components/tryghost-adapter-base-jobs-0.0.0.tgz",
55
55
  "@tryghost/adapter-base-redirects": "file:components/tryghost-adapter-base-redirects-0.0.0.tgz",
56
56
  "@tryghost/adapter-base-route-settings": "file:components/tryghost-adapter-base-route-settings-0.0.0.tgz",
57
- "@tryghost/adapter-base-scheduling": "file:components/tryghost-adapter-base-scheduling-0.2.3.tgz",
57
+ "@tryghost/adapter-base-scheduling": "file:components/tryghost-adapter-base-scheduling-0.2.4.tgz",
58
58
  "@tryghost/adapter-base-sso": "file:components/tryghost-adapter-base-sso-0.1.3.tgz",
59
59
  "@tryghost/admin-api-schema": "file:components/tryghost-admin-api-schema-0.0.0.tgz",
60
60
  "@tryghost/api-framework": "file:components/tryghost-api-framework-0.0.0.tgz",
@@ -141,7 +141,6 @@
141
141
  "express-jwt": "8.5.1",
142
142
  "express-lazy-router": "1.0.6",
143
143
  "express-query-boolean": "2.0.0",
144
- "express-queue": "0.0.13",
145
144
  "express-session": "1.19.0",
146
145
  "fastq": "^1.20.1",
147
146
  "file-type": "21.3.4",
@@ -160,6 +159,7 @@
160
159
  "iconv-lite": "0.7.3",
161
160
  "image-size": "1.2.1",
162
161
  "intl-messageformat": "5.4.3",
162
+ "ipaddr.js": "2.5.0",
163
163
  "jose": "6.2.12",
164
164
  "js-yaml": "4.3.0",
165
165
  "jsdom": "30.0.1",
@@ -167,7 +167,7 @@
167
167
  "jsonwebtoken": "8.5.1",
168
168
  "juice": "11.1.1",
169
169
  "knex": "2.4.2",
170
- "knex-migrator": "5.4.1",
170
+ "knex-migrator": "6.2.1",
171
171
  "leaky-bucket": "2.2.0",
172
172
  "lodash": "4.18.1",
173
173
  "luxon": "3.7.2",
@@ -188,7 +188,7 @@
188
188
  "moment-timezone": "0.5.45",
189
189
  "mppx": "0.6.20",
190
190
  "multer": "2.2.0",
191
- "mysql2": "3.22.5",
191
+ "mysql2": "3.24.4",
192
192
  "nconf": "0.13.0",
193
193
  "node-html-markdown": "2.0.0",
194
194
  "nodemailer": "8.0.11",
@@ -212,7 +212,6 @@
212
212
  "type-fest": "5.7.0",
213
213
  "ua-parser-js": "1.0.41",
214
214
  "unidecode": "1.1.0",
215
- "xml": "1.0.1",
216
215
  "zod": "4.4.3"
217
216
  },
218
217
  "optionalDependencies": {
@@ -226,5 +225,5 @@
226
225
  "node": "^22.23.1 || ^24.20.0"
227
226
  },
228
227
  "scripts": {},
229
- "packageManager": "pnpm@12.4.0+sha512.37536c26ed40ab4134b6511e09f6b27f3ebb45687468f2406ca3805279a4e5ca158c1931350ad9774d6ab2108d71b3dbaeb39943159294375e4d053e8e05685c"
228
+ "packageManager": "pnpm@12.4.2+sha512.08adc6613180275c7c9edada39dcf08c9c61ad4e7eaf330a4f3461f102b0f907423454d117f98e72d47fef0616070644d7bffc973a6a57f5090a6d7c368b07c9"
230
229
  }