ghost 6.53.0 → 6.54.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 (596) hide show
  1. package/components/ghost-storage-base-3.0.0.tgz +0 -0
  2. package/components/tryghost-adapter-base-cache-0.2.0.tgz +0 -0
  3. package/components/tryghost-adapter-base-scheduling-0.1.1.tgz +0 -0
  4. package/components/tryghost-adapter-base-sso-0.1.1.tgz +0 -0
  5. package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
  6. package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
  7. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  8. package/components/tryghost-kg-converters-1.2.3.tgz +0 -0
  9. package/components/tryghost-kg-default-nodes-2.1.3.tgz +0 -0
  10. package/components/tryghost-kg-lexical-html-renderer-1.4.3.tgz +0 -0
  11. package/core/boot.js +9 -6
  12. package/core/built/admin/assets/Combination-CJG7Flp-.js +41 -0
  13. package/core/built/admin/assets/Growth-CSaHoSVD.js +3 -0
  14. package/core/built/admin/assets/Newsletters-C5cs6FGo.js +1 -0
  15. package/core/built/admin/assets/Overview-j4NaeUNm.js +1 -0
  16. package/core/built/admin/assets/{PolarAngleAxis-pciQ0MOy.js → PolarAngleAxis-BGjf7sBu.js} +1 -1
  17. package/core/built/admin/assets/{RadialBarChart-DWmw2PcX.js → RadialBarChart-zeFf9mBz.js} +1 -1
  18. package/core/built/admin/assets/Web-_fD935OX.js +2 -0
  19. package/core/built/admin/assets/account-migration-DLvVA5yq.js +1 -0
  20. package/core/built/admin/assets/activitypub/{account-migration-BPZG37DJ.js → account-migration-DHbZcxGM.js} +13 -13
  21. package/core/built/admin/assets/activitypub/activitypub.js +7 -7
  22. package/core/built/admin/assets/activitypub/{avatar-ZYco0ITb.js → avatar-B3DEDB1l.js} +10 -10
  23. package/core/built/admin/assets/activitypub/{avatar-flipboard-D541lc4F.js → avatar-flipboard-Cqrg0XMx.js} +3 -3
  24. package/core/built/admin/assets/activitypub/{bluesky-sharing-NOHUtHjl.js → bluesky-sharing-zfxUey_L.js} +38 -37
  25. package/core/built/admin/assets/activitypub/{chunk-KS7C4IRE-B-GOFDPZ.js → chunk-KS7C4IRE-D4HEcEwi.js} +716 -710
  26. package/core/built/admin/assets/activitypub/{content-formatters-bwrp4iEO.js → content-formatters-BpQARh28.js} +229 -181
  27. package/core/built/admin/assets/activitypub/{copy-C7m7ovHw.js → copy-D9UWIAan.js} +2 -2
  28. package/core/built/admin/assets/activitypub/{dist-B5ira32t.js → dist-Ba_QxHHl.js} +5 -5
  29. package/core/built/admin/assets/activitypub/{domain-iqE4YXwD.js → domain-CmwSZLHK.js} +33 -33
  30. package/core/built/admin/assets/activitypub/{edit-profile-B8MFYh28.js → edit-profile-CXdwNmVG.js} +46 -45
  31. package/core/built/admin/assets/activitypub/{explore-BbdKodp3.js → explore-DfbjzGM1.js} +20 -20
  32. package/core/built/admin/assets/activitypub/{feed-Cl3A5owG.js → feed-DSEBJOqf.js} +15 -15
  33. package/core/built/admin/assets/activitypub/{field-DL6WyR-c.js → field-CY7XVcx6.js} +13 -13
  34. package/core/built/admin/assets/activitypub/{hash-6G3DzwL9.js → hash-BC9Q0N4c.js} +2 -2
  35. package/core/built/admin/assets/activitypub/{inbox-YmhuBice.js → inbox-DQ4ZnC1m.js} +2 -2
  36. package/core/built/admin/assets/activitypub/inbox-DtQ0kytT.js +1221 -0
  37. package/core/built/admin/assets/activitypub/{label-DGbLjDvE.js → label-Dw96GQ7u.js} +6 -6
  38. package/core/built/admin/assets/activitypub/layout-IdVq3lRy.js +1 -0
  39. package/core/built/admin/assets/activitypub/{moderation-qnBtk1zS.js → moderation-Dg_-I-8C.js} +32 -31
  40. package/core/built/admin/assets/activitypub/{note-C7ZRoSJv.js → note-Cy1-uKMY.js} +21 -21
  41. package/core/built/admin/assets/activitypub/{notifications-DiEA4b1o.js → notifications-B_fvoLIM.js} +17 -17
  42. package/core/built/admin/assets/activitypub/{onboarding-_JVgEwgV.js → onboarding-BFDkzeR2.js} +2 -2
  43. package/core/built/admin/assets/activitypub/{onboarding-DG4zu3qM.js → onboarding-D6rcBdPe.js} +5 -5
  44. package/core/built/admin/assets/activitypub/{preferences-B3FtocnP.js → preferences-ByJseZp6.js} +1607 -1606
  45. package/core/built/admin/assets/activitypub/{profile-D8ZJfYXB.js → profile-BFtbnIjz.js} +264 -263
  46. package/core/built/admin/assets/activitypub/{reply-C1vggenw.js → reply-CpdMeAO5.js} +2 -2
  47. package/core/built/admin/assets/activitypub/{routes-BOii-V9n.js → routes-Dh3xXfce.js} +1311 -1295
  48. package/core/built/admin/assets/activitypub/{separator-1gNokN5S.js → separator-BI1FLsYM.js} +4 -4
  49. package/core/built/admin/assets/activitypub/{settings--9Sb0nbl.js → settings-DTgqJPxM.js} +14 -14
  50. package/core/built/admin/assets/activitypub/{site-fkMmqv0V.js → site-CdL9ZLqm.js} +10 -10
  51. package/core/built/admin/assets/activitypub/{step-1-QhivSMw2.js → step-1-DIDg4aHb.js} +15 -15
  52. package/core/built/admin/assets/activitypub/{step-2-pMk9YwqD.js → step-2-BfGe8BYt.js} +7 -7
  53. package/core/built/admin/assets/activitypub/{step-3-DvmVC1fo.js → step-3-mE9spAqw.js} +12 -12
  54. package/core/built/admin/assets/activitypub/{tabs-Dc0FEEYD.js → tabs-ogqwoBlb.js} +241 -237
  55. package/core/built/admin/assets/activitypub/{topic-filter-CuDyM5bD.js → topic-filter-DLHBZT93.js} +4 -4
  56. package/core/built/admin/assets/activitypub/use-activity-pub-queries-VzbN99u_.js +1957 -0
  57. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-Drx1kdAK.js → use-navigate-with-base-path-CAwXTmqH.js} +165 -175
  58. package/core/built/admin/assets/activitypub/{use-reply-chain-data-BHkCHcW5.js → use-reply-chain-data-CxonteFD.js} +8 -8
  59. package/core/built/admin/assets/activitypub/users-BLeiOTHc.js +1464 -0
  60. package/core/built/admin/assets/activitypub/{x-BHCEe-c2.js → x-C8tAnXly.js} +2 -2
  61. package/core/built/admin/assets/{audience-adiFehTD.js → audience-BKRdsFmy.js} +1 -1
  62. package/core/built/admin/assets/{automated-emails-UWM02CMr.js → automated-emails-Cn87L5Md.js} +1 -1
  63. package/core/built/admin/assets/automations-B7-y3dXt.js +1 -0
  64. package/core/built/admin/assets/automations-BP_aHamJ.js +1 -0
  65. package/core/built/admin/assets/{avatar-flipboard-Lz3F9fNT.js → avatar-flipboard-C6Kj3Awu.js} +1 -1
  66. package/core/built/admin/assets/bluesky-sharing-Bh36XPh4.js +1 -0
  67. package/core/built/admin/assets/box-BWbhXh21.js +1 -0
  68. package/core/built/admin/assets/breadcrumb-D34YWnaw.js +1 -0
  69. package/core/built/admin/assets/card-DGoDJzrn.js +1 -0
  70. package/core/built/admin/assets/{chart-ChpW-NzQ.js → chart-BuRT2Y6p.js} +14 -14
  71. package/core/built/admin/assets/chart-helpers-DbklaJw9.js +1 -0
  72. package/core/built/admin/assets/checkbox-DA4-1UiI.js +1 -0
  73. package/core/built/admin/assets/chunk.524.45e0875f41b71e46e849.js +25 -0
  74. package/core/built/admin/assets/chunk.582.51defd4b009f0de8d4d5.js +27 -0
  75. package/core/built/admin/assets/{chunk.831.0703a12e49f51cec3f3a.js → chunk.589.096f4d0bb775e5229aa9.js} +78 -85
  76. package/core/built/admin/assets/{chunk.432.c2caa0b20f03e71d1a35.js → chunk.962.b73442b07be930bb5d85.js} +2216 -3188
  77. package/core/built/admin/assets/{chunk.432.c2caa0b20f03e71d1a35.js.LICENSE.txt → chunk.962.b73442b07be930bb5d85.js.LICENSE.txt} +0 -63
  78. package/core/built/admin/assets/code-editor-view-BKBrkffZ.js +1 -0
  79. package/core/built/admin/assets/comments-CzVNIT8b.js +1 -0
  80. package/core/built/admin/assets/container-BYz2Ed39.js +1 -0
  81. package/core/built/admin/assets/data-list-16rkJYYi.js +1 -0
  82. package/core/built/admin/assets/date-range-select-B5vSsrpx.js +1 -0
  83. package/core/built/admin/assets/disabled-sources-indicator-NkOIoMue.js +1 -0
  84. package/core/built/admin/assets/{dist-CsekE4FL.js → dist-CQJY6SVY.js} +1 -1
  85. package/core/built/admin/assets/dist-DGzPJ_bO.js +4 -0
  86. package/core/built/admin/assets/{dist-BbGrW05X.js → dist-DyViJwIy.js} +1 -1
  87. package/core/built/admin/assets/dist-Ndy-PuGN.js +1 -0
  88. package/core/built/admin/assets/dist-P_ohUlTi.js +1 -0
  89. package/core/built/admin/assets/domain-B7_n5nfx.js +1 -0
  90. package/core/built/admin/assets/dropzone-DcuJEEUf.js +5 -0
  91. package/core/built/admin/assets/edit-profile-rvDGrS8J.js +1 -0
  92. package/core/built/admin/assets/editor-BCiIyFjm.js +8 -0
  93. package/core/built/admin/assets/empty-indicator-oX1u1Pkn.js +1 -0
  94. package/core/built/admin/assets/esm-CFX93H5M.js +2 -0
  95. package/core/built/admin/assets/explore-BZAZOg5X.js +1 -0
  96. package/core/built/admin/assets/feed-CFV8xDw9.js +1 -0
  97. package/core/built/admin/assets/field-BW-M2Zwp.js +1 -0
  98. package/core/built/admin/assets/{filter-sources-v39ihhhV.js → filter-sources-Fx8wiYYw.js} +1 -1
  99. package/core/built/admin/assets/filters-CGX_pf2N.js +1 -0
  100. package/core/built/admin/assets/filters-DtcXMZDU.js +1 -0
  101. package/core/built/admin/assets/framework-provider-CmtnPXIT.js +4 -0
  102. package/core/built/admin/assets/{ghost-b57f077997b739a8ae9a70772dc016cb.js → ghost-b1dce91ad3232cc259ee5fbbf9526243.js} +294 -290
  103. package/core/built/admin/assets/ghost-dark-c8d0ab7f515b2010c173e23e9b32ea8a.css +1 -0
  104. package/core/built/admin/assets/gift-link-modal-Bk8qpnMw.js +1 -0
  105. package/core/built/admin/assets/{gift-links-CY3GwiVi.js → gift-links-nBxJjZiQ.js} +1 -1
  106. package/core/built/admin/assets/growth-Ck2s3JjR.js +1 -0
  107. package/core/built/admin/assets/hooks-BApwwBE0.js +2 -0
  108. package/core/built/admin/assets/{inbox-TEISAmth.js → inbox-BRp1_aaC.js} +35 -35
  109. package/core/built/admin/assets/index-BBf502Wg.js +69 -0
  110. package/core/built/admin/assets/index-BCCZKxP2.css +1 -0
  111. package/core/built/admin/assets/inline-EMAm3okk.js +1 -0
  112. package/core/built/admin/assets/input-group-DjuYnNCd.js +1 -0
  113. package/core/built/admin/assets/{react-dom-C6aoWSfl.js → jsx-runtime-DX3WBWVO.js} +1 -1
  114. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +5 -2
  115. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +2 -2
  116. package/core/built/admin/assets/{koenig-lexical-Di7b48ED.js → koenig-lexical-CM7UFNdL.js} +2 -2
  117. package/core/built/admin/assets/kpi-card-BrGH6FsT.js +1 -0
  118. package/core/built/admin/assets/kpi-card-CIGyijjx.js +1 -0
  119. package/core/built/admin/assets/kpi-helpers-_HRRsklE.js +1 -0
  120. package/core/built/admin/assets/kpi-tabs-BSvh9eoq.js +1 -0
  121. package/core/built/admin/assets/label-BOR9XdKl.js +1 -0
  122. package/core/built/admin/assets/label-picker-BdNAWuUX.js +1 -0
  123. package/core/built/admin/assets/{labels-GbxlXWtf.js → labels-Cyayfd-e.js} +1 -1
  124. package/core/built/admin/assets/layout-Bw4GnxXp.js +1 -0
  125. package/core/built/admin/assets/limit-service-9fwD33lU.js +20 -0
  126. package/core/built/admin/assets/link-helpers-tOlxmuH5.js +1 -0
  127. package/core/built/admin/assets/list-page-B6ANtzkd.js +1 -0
  128. package/core/built/admin/assets/mailchimp-Ds_NQ04w.svg +9 -0
  129. package/core/built/admin/assets/member-custom-fields-DvFyamLu.js +1 -0
  130. package/core/built/admin/assets/member-detail-Cg2vTqvJ.js +1 -0
  131. package/core/built/admin/assets/members-DsPxYAVm.js +10 -0
  132. package/core/built/admin/assets/modals-Bf_fyvHZ.js +31 -0
  133. package/core/built/admin/assets/moderation-Dlp7M5sa.js +1 -0
  134. package/core/built/admin/assets/multi-select-combobox-CH1o8XXQ.js +1 -0
  135. package/core/built/admin/assets/newsletter-CQ5CAYUI.js +1 -0
  136. package/core/built/admin/assets/{newsletters-DZm3yLj8.js → newsletters-D1jbtV-h.js} +1 -1
  137. package/core/built/admin/assets/note-BrAZ7Z0o.js +1 -0
  138. package/core/built/admin/assets/notifications-BnbHLOPC.js +1 -0
  139. package/core/built/admin/assets/nql-lang-B7faUf8D.js +19 -0
  140. package/core/built/admin/assets/{offers-D11QtPXX.js → offers-CrY6nSRR.js} +1 -1
  141. package/core/built/admin/assets/onboarding-route-eU146kuA.js +1 -0
  142. package/core/built/admin/assets/overview-BpbaK-xu.js +1 -0
  143. package/core/built/admin/assets/page-header-C0jVxtS8.js +1 -0
  144. package/core/built/admin/assets/{pages-BnObVRrf.js → pages-BbNWFcGj.js} +1 -1
  145. package/core/built/admin/assets/pintura-CXOmq-5H.svg +15 -0
  146. package/core/built/admin/assets/post-analytics-Iw7dk1mT.js +1 -0
  147. package/core/built/admin/assets/post-analytics-header-D9pJ4iNm.js +1 -0
  148. package/core/built/admin/assets/{post-analytics-provider-DSfBCtnj.js → post-analytics-provider-BDqcfBor.js} +1 -1
  149. package/core/built/admin/assets/post-share-modal-DBfKl2GZ.js +1 -0
  150. package/core/built/admin/assets/{posts-CwH8VJvB.js → posts-EWpZIjkr.js} +1 -1
  151. package/core/built/admin/assets/preferences-D4EANGoc.js +5 -0
  152. package/core/built/admin/assets/profile-dJ44Bn_W.js +1 -0
  153. package/core/built/admin/assets/{referrers-nxR52jPI.js → referrers-BCfFYSHc.js} +1 -1
  154. package/core/built/admin/assets/router-provider-C1R4AZ2o.js +1 -0
  155. package/core/built/admin/assets/select--2uVN9_-.js +1 -0
  156. package/core/built/admin/assets/settings-Bz3RZRmE.js +1 -0
  157. package/core/built/admin/assets/settings-SD9bxIpt.js +4 -0
  158. package/core/built/admin/assets/share-modal-CkdTTMJd.js +1 -0
  159. package/core/built/admin/assets/social-urls-BvFZwYcE.js +8 -0
  160. package/core/built/admin/assets/sort-button-DZp9Y2r1.js +1 -0
  161. package/core/built/admin/assets/source-icon-CHr9qJ2Y.js +1 -0
  162. package/core/built/admin/assets/stack-xiN0eQ6Z.js +1 -0
  163. package/core/built/admin/assets/stats-DGoXZxWE.js +1 -0
  164. package/core/built/admin/assets/stats-view-D2-1L0ms.js +1 -0
  165. package/core/built/admin/assets/step-1-RdahbwyG.js +1 -0
  166. package/core/built/admin/assets/step-2-D83PeRwd.js +1 -0
  167. package/core/built/admin/assets/step-3-p_Op4wv4.js +2 -0
  168. package/core/built/admin/assets/switch-qp518gFQ.js +1 -0
  169. package/core/built/admin/assets/table-B8LgTQJZ.js +1 -0
  170. package/core/built/admin/assets/tabs-D3ZOYkM7.js +1 -0
  171. package/core/built/admin/assets/tags-B4l891z2.js +1 -0
  172. package/core/built/admin/assets/text-DwtjwGkh.js +1 -0
  173. package/core/built/admin/assets/textarea-CTlb3Uu6.js +1 -0
  174. package/core/built/admin/assets/{tiers-EghDzCKc.js → tiers-BgYLWRJv.js} +1 -1
  175. package/core/built/admin/assets/toggle-group-DNXDkAwf.js +1 -0
  176. package/core/built/admin/assets/topic-filter-DZGjEcz3.js +1 -0
  177. package/core/built/admin/assets/{use-analytics-data-0l_OHtnR.js → use-analytics-data-CaT8RirX.js} +1 -1
  178. package/core/built/admin/assets/use-filter-params-DeQ8sX4N.js +1 -0
  179. package/core/built/admin/assets/use-growth-stats-9Db2CuJe.js +1 -0
  180. package/core/built/admin/assets/{use-post-referrers-DwI31Ril.js → use-post-referrers-BV54YcQS.js} +1 -1
  181. package/core/built/admin/assets/use-reply-chain-data-DuYZGDan.js +1 -0
  182. package/core/built/admin/assets/use-simple-pagination-8fTua9Nt.js +1 -0
  183. package/core/built/admin/assets/{use-tinybird-query-DvZBBMG7.js → use-tinybird-query-Dz156HvZ.js} +1 -1
  184. package/core/built/admin/assets/{use-tinybird-token-CQtebkvU.js → use-tinybird-token-C9RUdL_n.js} +1 -1
  185. package/core/built/admin/assets/{users-Pc8IRjk9.js → users-CcSCQFcQ.js} +1 -1
  186. package/core/built/admin/assets/virtual-list-BCvP0YF-.js +1 -0
  187. package/core/built/admin/assets/web-DTZnnUGr.js +1 -0
  188. package/core/built/admin/index.html +18 -22
  189. package/core/frontend/apps/private-blogging/index.js +1 -1
  190. package/core/frontend/apps/private-blogging/lib/middleware.js +1 -1
  191. package/core/frontend/helpers/split.js +2 -1
  192. package/core/frontend/meta/asset-url.js +1 -1
  193. package/core/frontend/meta/author-image.js +1 -1
  194. package/core/frontend/meta/blog-logo.js +1 -1
  195. package/core/frontend/meta/canonical-url.js +1 -1
  196. package/core/frontend/meta/cover-image.js +1 -1
  197. package/core/frontend/meta/get-meta.js +1 -1
  198. package/core/frontend/meta/og-image.js +1 -1
  199. package/core/frontend/meta/paginated-url.js +1 -1
  200. package/core/frontend/meta/twitter-image.js +1 -1
  201. package/core/frontend/meta/url.js +1 -1
  202. package/core/frontend/services/assets-minification/admin-auth-assets.js +1 -1
  203. package/core/frontend/services/llms/handler.js +1 -1
  204. package/core/frontend/services/proxy.js +31 -2
  205. package/core/frontend/services/routing/collection-router.js +1 -1
  206. package/core/frontend/services/routing/controllers/email-post.js +1 -1
  207. package/core/frontend/services/routing/controllers/entry/markdown.js +1 -1
  208. package/core/frontend/services/routing/controllers/entry/markdown.ts +1 -1
  209. package/core/frontend/services/routing/controllers/entry.js +1 -1
  210. package/core/frontend/services/routing/controllers/entry.ts +1 -1
  211. package/core/frontend/services/routing/controllers/previews.js +6 -7
  212. package/core/frontend/services/routing/controllers/unsubscribe.js +7 -3
  213. package/core/frontend/services/routing/email-router.js +1 -1
  214. package/core/frontend/services/routing/events.js +12 -0
  215. package/core/frontend/services/routing/middleware/page-param.js +1 -1
  216. package/core/frontend/services/routing/parent-router.js +1 -1
  217. package/core/frontend/services/routing/preview-router.js +1 -1
  218. package/core/frontend/services/routing/router-manager.js +4 -8
  219. package/core/frontend/services/routing/rss-router.js +1 -1
  220. package/core/frontend/services/routing/static-pages-router.js +1 -1
  221. package/core/frontend/services/routing/static-routes-router.js +1 -1
  222. package/core/frontend/services/routing/taxonomy-router.js +1 -1
  223. package/core/frontend/services/rss/generate-feed.js +1 -1
  224. package/core/frontend/services/sitemap/base-site-map-generator.js +23 -4
  225. package/core/frontend/services/sitemap/site-map-index-generator.js +1 -1
  226. package/core/frontend/services/sitemap/site-map-manager.js +14 -8
  227. package/core/frontend/services/sitemap/utils.js +1 -1
  228. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +1 -1
  229. package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +1 -1
  230. package/core/frontend/utils/images.js +1 -1
  231. package/core/frontend/web/middleware/admin-toolbar.js +1 -1
  232. package/core/frontend/web/middleware/handle-image-sizes.js +2 -2
  233. package/core/frontend/web/middleware/redirect-ghost-to-admin.js +1 -1
  234. package/core/frontend/web/routers/serve-favicon.js +1 -1
  235. package/core/frontend/web/routers/serve-public-file.js +1 -1
  236. package/core/frontend/web/site.js +5 -5
  237. package/core/server/adapters/cache/AdapterCacheMemoryTTL.js +2 -2
  238. package/core/server/adapters/cache/MemoryCache.js +2 -2
  239. package/core/server/adapters/cache/Redis.js +1 -1
  240. package/core/server/adapters/cache/index.js +1 -1
  241. package/core/server/adapters/lib/redis/AdapterCacheRedis.js +2 -2
  242. package/core/server/adapters/route-settings/FileStore.js +2 -8
  243. package/core/server/adapters/route-settings/FileStore.ts +1 -6
  244. package/core/server/adapters/route-settings/S3RouteSettingsStore.js +206 -0
  245. package/core/server/adapters/route-settings/S3RouteSettingsStore.ts +199 -0
  246. package/core/server/adapters/route-settings/utils.js +13 -0
  247. package/core/server/adapters/route-settings/utils.ts +7 -0
  248. package/core/server/adapters/scheduling/deps.d.ts +0 -2
  249. package/core/server/adapters/scheduling/error-capture.js +76 -0
  250. package/core/server/adapters/scheduling/error-capture.ts +91 -0
  251. package/core/server/adapters/scheduling/utils.js +18 -34
  252. package/core/server/adapters/scheduling/utils.ts +36 -0
  253. package/core/server/adapters/storage/LocalFilesStorage.js +1 -1
  254. package/core/server/adapters/storage/LocalImagesStorage.js +1 -1
  255. package/core/server/adapters/storage/LocalMediaStorage.js +1 -1
  256. package/core/server/adapters/storage/LocalStorageBase.js +3 -3
  257. package/core/server/adapters/storage/S3Storage.js +2 -2
  258. package/core/server/adapters/storage/S3Storage.ts +1 -1
  259. package/core/server/adapters/storage/utils.js +1 -1
  260. package/core/server/api/endpoints/authentication.js +1 -1
  261. package/core/server/api/endpoints/featurebase.js +1 -1
  262. package/core/server/api/endpoints/files.js +2 -2
  263. package/core/server/api/endpoints/images.js +2 -2
  264. package/core/server/api/endpoints/libraries.d.ts +0 -1
  265. package/core/server/api/endpoints/media.js +8 -5
  266. package/core/server/api/endpoints/member-custom-fields.js +4 -1
  267. package/core/server/api/endpoints/member-custom-fields.ts +4 -1
  268. package/core/server/api/endpoints/posts.js +17 -1
  269. package/core/server/api/endpoints/search-index-public.js +4 -3
  270. package/core/server/api/endpoints/search-index.js +5 -4
  271. package/core/server/api/endpoints/settings-public.js +1 -1
  272. package/core/server/api/endpoints/settings.js +3 -1
  273. package/core/server/api/endpoints/utils/serializers/input/utils/url.js +9 -1
  274. package/core/server/api/endpoints/utils/serializers/output/default.js +7 -0
  275. package/core/server/api/endpoints/utils/serializers/output/files.js +1 -1
  276. package/core/server/api/endpoints/utils/serializers/output/media.js +1 -1
  277. package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.js +7 -4
  278. package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.ts +8 -4
  279. package/core/server/api/endpoints/utils/serializers/output/members.js +16 -26
  280. package/core/server/api/endpoints/utils/serializers/output/pages.js +7 -0
  281. package/core/server/api/endpoints/utils/serializers/output/posts.js +13 -0
  282. package/core/server/api/endpoints/utils/serializers/output/utils/url.js +1 -1
  283. package/core/server/api/endpoints/utils/validators/input/members.js +2 -52
  284. package/core/server/data/db/backup.js +1 -1
  285. package/core/server/data/importer/handlers/image.js +3 -3
  286. package/core/server/data/importer/import-manager.js +6 -4
  287. package/core/server/data/importer/importers/content-file-importer.js +2 -2
  288. package/core/server/data/migrations/utils/schema.js +4 -2
  289. package/core/server/data/migrations/versions/6.54/2026-07-19-16-59-00-add-content-import-permission.js +10 -0
  290. package/core/server/data/migrations/versions/6.54/2026-07-20-13-59-21-drop-email-tracked-sent-count-from-automation-action-revisions.js +7 -0
  291. package/core/server/data/migrations/versions/6.54/2026-07-21-01-58-20-add-automation-run-steps-poller-index.js +3 -0
  292. package/core/server/data/migrations/versions/6.54/2026-07-21-21-08-15-add-automated-email-recipients-mailgun-message-id-index.js +3 -0
  293. package/core/server/data/migrations/versions/6.54/2026-07-22-10-41-08-add-click-tracking-to-automated-email-recipients.js +13 -0
  294. package/core/server/data/migrations/versions/6.54/2026-07-22-15-10-30-add-email-clicked-count-to-automation-action-revisions.js +7 -0
  295. package/core/server/data/migrations/versions/6.54/2026-07-23-10-24-18-add-automation-action-revision-to-redirects.js +9 -0
  296. package/core/server/data/schema/commands.js +37 -3
  297. package/core/server/data/schema/fixtures/fixtures.json +7 -0
  298. package/core/server/data/schema/lib/default-index-name.js +20 -0
  299. package/core/server/data/schema/schema.js +40 -17
  300. package/core/server/data/seeders/data-generator.js +4 -2
  301. package/core/server/lib/image/image-size.js +5 -7
  302. package/core/server/lib/image/image-utils.js +2 -2
  303. package/core/server/lib/image/index.js +4 -4
  304. package/core/server/lib/lexical.js +3 -3
  305. package/core/server/lib/mobiledoc.js +2 -2
  306. package/core/server/lib/validate-password.js +1 -1
  307. package/core/server/models/action.js +9 -0
  308. package/core/server/models/base/plugins/generate-slug.js +1 -1
  309. package/core/server/models/collection.js +1 -1
  310. package/core/server/models/custom-theme-setting.js +1 -1
  311. package/core/server/models/member.js +73 -0
  312. package/core/server/models/newsletter.js +1 -1
  313. package/core/server/models/post.js +19 -5
  314. package/core/server/models/posts-meta.js +1 -1
  315. package/core/server/models/redirect.js +1 -1
  316. package/core/server/models/settings.js +1 -1
  317. package/core/server/models/snippet.js +1 -1
  318. package/core/server/models/tag.js +1 -1
  319. package/core/server/models/user.js +1 -1
  320. package/core/server/models/welcome-email-automated-email.js +1 -1
  321. package/core/server/services/activitypub/activity-pub-service-wrapper.js +1 -1
  322. package/core/server/services/adapter-manager/adapter-manager.js +5 -1
  323. package/core/server/services/adapter-manager/adapter-manager.ts +7 -2
  324. package/core/server/services/adapter-manager/index.js +18 -15
  325. package/core/server/services/adapter-manager/index.ts +23 -17
  326. package/core/server/services/adapter-manager/utils.js +124 -14
  327. package/core/server/services/adapter-manager/utils.ts +130 -14
  328. package/core/server/services/api-version-compatibility/mw-version-rewrites.js +1 -1
  329. package/core/server/services/audience-feedback/index.js +1 -1
  330. package/core/server/services/auth/passwordreset.js +1 -1
  331. package/core/server/services/auth/session/express-session.js +1 -1
  332. package/core/server/services/auth/session/index.js +2 -2
  333. package/core/server/services/auth/session/session-service.js +1 -1
  334. package/core/server/services/automations/automations-api.js +2 -19
  335. package/core/server/services/automations/automations-api.ts +2 -31
  336. package/core/server/services/automations/automations-repository.ts +15 -0
  337. package/core/server/services/automations/database-automations-repository.js +30 -2
  338. package/core/server/services/automations/database-automations-repository.ts +33 -2
  339. package/core/server/services/automations/poll.js +16 -12
  340. package/core/server/services/automations/poll.ts +17 -15
  341. package/core/server/services/automations/service.js +1 -1
  342. package/core/server/services/automations/service.ts +3 -13
  343. package/core/server/services/automations/welcome-email-automation-poll.js +2 -1
  344. package/core/server/services/comments/index.js +1 -1
  345. package/core/server/services/custom-redirects/index.js +2 -2
  346. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +14 -13
  347. package/core/server/services/email-analytics/email-analytics-service.js +1 -1
  348. package/core/server/services/email-analytics/events/start-email-analytics-job-event.js +11 -15
  349. package/core/server/services/email-analytics/events/start-email-analytics-job-event.ts +15 -0
  350. package/core/server/services/email-analytics/index.js +2 -3
  351. package/core/server/services/email-analytics/index.ts +1 -2
  352. package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.js +1 -6
  353. package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.ts +0 -9
  354. package/core/server/services/email-analytics/jobs/fetch-latest/index.js +1 -1
  355. package/core/server/services/email-analytics/jobs/index.js +0 -2
  356. package/core/server/services/email-service/email-service-wrapper.js +1 -1
  357. package/core/server/services/email-service/email-service.js +20 -4
  358. package/core/server/services/explore-ping/explore-ping-service.js +24 -39
  359. package/core/server/services/explore-ping/explore-ping-service.ts +198 -0
  360. package/core/server/services/explore-ping/index.js +11 -11
  361. package/core/server/services/explore-ping/index.ts +42 -0
  362. package/core/server/services/gifts/gift-reminder-scheduler.js +1 -1
  363. package/core/server/services/gifts/gift-reminder-scheduler.ts +1 -1
  364. package/core/server/services/gifts/gift-service-wrapper.js +1 -1
  365. package/core/server/services/identity-tokens/identity-token-service-wrapper.js +1 -1
  366. package/core/server/services/indexnow-ping/constants.js +30 -0
  367. package/core/server/services/indexnow-ping/constants.ts +32 -0
  368. package/core/server/services/indexnow-ping/index.js +29 -253
  369. package/core/server/services/indexnow-ping/index.ts +37 -0
  370. package/core/server/services/indexnow-ping/indexnow-ping-service.js +229 -0
  371. package/core/server/services/indexnow-ping/indexnow-ping-service.ts +319 -0
  372. package/core/server/services/invites/index.js +1 -1
  373. package/core/server/services/lib/mailgun-client.js +3 -3
  374. package/core/server/services/link-redirection/index.js +2 -2
  375. package/core/server/services/link-redirection/link-redirect-repository.js +1 -1
  376. package/core/server/services/link-redirection/link-redirect.js +12 -13
  377. package/core/server/services/link-redirection/link-redirect.ts +22 -0
  378. package/core/server/services/link-redirection/link-redirects-service.js +1 -1
  379. package/core/server/services/link-tracking/full-post-link.js +2 -2
  380. package/core/server/services/link-tracking/index.js +1 -1
  381. package/core/server/services/mail/ghost-mailer.js +1 -1
  382. package/core/server/services/mail/index.js +1 -1
  383. package/core/server/services/media-inliner/external-media-inliner.js +2 -2
  384. package/core/server/services/media-inliner/service.js +4 -3
  385. package/core/server/services/member-attribution/index.js +1 -1
  386. package/core/server/services/member-welcome-emails/service.js +1 -1
  387. package/core/server/services/members/api.js +8 -2
  388. package/core/server/services/members/csv/index.js +10 -0
  389. package/core/server/services/members/csv/index.ts +3 -0
  390. package/core/server/services/members/csv/parse.js +94 -0
  391. package/core/server/services/members/csv/parse.ts +111 -0
  392. package/core/server/services/members/csv/types.js +2 -0
  393. package/core/server/services/members/csv/types.ts +39 -0
  394. package/core/server/services/members/csv/unparse.js +69 -0
  395. package/core/server/services/members/csv/unparse.ts +79 -0
  396. package/core/server/services/members/exporter/query.js +35 -8
  397. package/core/server/services/members/importer/config.js +35 -0
  398. package/core/server/services/members/importer/config.ts +39 -0
  399. package/core/server/services/members/importer/members-csv-importer.js +31 -13
  400. package/core/server/services/members/members-api/members-api.js +4 -2
  401. package/core/server/services/members/members-api/repositories/event-repository.js +13 -2
  402. package/core/server/services/members/members-api/services/member-bread-service.js +42 -19
  403. package/core/server/services/members/middleware.js +1 -1
  404. package/core/server/services/members/service.js +15 -2
  405. package/core/server/services/members/stripe-connect.js +1 -1
  406. package/core/server/services/members-custom-fields/actions.js +3 -0
  407. package/core/server/services/members-custom-fields/actions.ts +6 -2
  408. package/core/server/services/members-custom-fields/config.js +34 -0
  409. package/core/server/services/members-custom-fields/config.ts +38 -0
  410. package/core/server/services/members-custom-fields/definitions-service.js +156 -21
  411. package/core/server/services/members-custom-fields/definitions-service.ts +170 -25
  412. package/core/server/services/members-custom-fields/index.js +16 -3
  413. package/core/server/services/members-custom-fields/index.ts +17 -3
  414. package/core/server/services/members-custom-fields/values-service.js +56 -10
  415. package/core/server/services/members-custom-fields/values-service.ts +62 -10
  416. package/core/server/services/mentions/mention-sending-service.js +22 -2
  417. package/core/server/services/mentions/service.js +21 -5
  418. package/core/server/services/newsletters/index.js +1 -1
  419. package/core/server/services/oembed/oembed-service.js +122 -33
  420. package/core/server/services/oembed/service.js +4 -2
  421. package/core/server/services/offers/service.js +1 -1
  422. package/core/server/services/post-scheduling/index.js +4 -3
  423. package/core/server/services/post-scheduling/index.ts +4 -3
  424. package/core/server/services/post-scheduling/post-scheduling.js +1 -1
  425. package/core/server/services/post-scheduling/post-scheduling.ts +1 -1
  426. package/core/server/services/posts/post-email-handler.js +13 -6
  427. package/core/server/services/posts/post-scheduling.js +1 -1
  428. package/core/server/services/posts/posts-service-instance.js +1 -1
  429. package/core/server/services/posts/posts-service.js +2 -2
  430. package/core/server/services/posts-public/service.js +1 -1
  431. package/core/server/services/public-config/site.js +1 -1
  432. package/core/server/services/recommendations/recommendation-service-wrapper.js +1 -1
  433. package/core/server/services/recommendations/service/libraries.d.ts +0 -2
  434. package/core/server/services/route-settings/dynamic-routing-service.js +2 -3
  435. package/core/server/services/route-settings/index.js +1 -1
  436. package/core/server/services/route-settings/route-settings-parser.js +134 -124
  437. package/core/server/services/route-settings/route-settings-parser.ts +160 -125
  438. package/core/server/services/route-settings/validation-errors.js +178 -0
  439. package/core/server/services/route-settings/validation-errors.ts +196 -0
  440. package/core/server/services/settings/settings-service.js +2 -2
  441. package/core/server/services/settings-helpers/index.js +1 -1
  442. package/core/server/services/slack-notifications/service.js +1 -1
  443. package/core/server/services/slack-ping/constants.js +16 -0
  444. package/core/server/services/slack-ping/constants.ts +15 -0
  445. package/core/server/services/slack-ping/index.js +26 -204
  446. package/core/server/services/slack-ping/index.ts +35 -0
  447. package/core/server/services/slack-ping/slack-ping-service.js +214 -0
  448. package/core/server/services/slack-ping/slack-ping-service.ts +296 -0
  449. package/core/server/services/staff/index.js +1 -1
  450. package/core/server/services/stats/posts-stats-service.js +1 -1
  451. package/core/server/services/stats/service.js +1 -1
  452. package/core/server/services/stripe/service.js +1 -1
  453. package/core/server/services/tags-public/service.js +1 -1
  454. package/core/server/services/themes/validate.js +1 -1
  455. package/core/server/services/update-check/index.js +1 -1
  456. package/core/server/services/url/lazy-url-service.js +66 -6
  457. package/core/server/services/url/lazy-url-service.ts +73 -6
  458. package/core/server/services/url/url-generator.js +1 -1
  459. package/core/server/services/url/url-service-facade.js +68 -3
  460. package/core/server/services/url/url-service-facade.ts +79 -4
  461. package/core/server/services/url/url-service.js +1 -1
  462. package/core/server/services/url/urls.js +1 -1
  463. package/core/server/services/webhooks/index.js +19 -2
  464. package/core/server/services/webhooks/listen.js +6 -11
  465. package/core/server/services/webhooks/payload.js +1 -3
  466. package/core/server/services/webhooks/serialize.js +16 -1
  467. package/core/server/web/admin/app.js +1 -1
  468. package/core/server/web/admin/middleware/redirect-admin-urls.js +1 -1
  469. package/core/server/web/api/endpoints/admin/routes.js +1 -0
  470. package/core/server/web/api/middleware/cors.js +1 -1
  471. package/core/server/web/api/middleware/upload.js +4 -0
  472. package/core/server/web/gift-preview/controller.js +1 -1
  473. package/core/server/web/shared/middleware/redirect-amp-urls.js +1 -1
  474. package/core/server/web/shared/middleware/uncapitalise.js +2 -2
  475. package/core/server/web/shared/middleware/url-redirects.js +1 -1
  476. package/core/shared/config/defaults.json +8 -1
  477. package/core/shared/config/overrides.json +4 -0
  478. package/core/shared/url-utils.js +19 -15
  479. package/core/shared/url-utils.ts +20 -0
  480. package/ghost.js +0 -1
  481. package/package.json +26 -31
  482. package/pnpm-lock.yaml +681 -2789
  483. package/pnpm-workspace.yaml +31 -17
  484. package/components/tryghost-adapter-base-scheduling-0.0.0.tgz +0 -0
  485. package/components/tryghost-adapter-base-sso-0.0.0.tgz +0 -0
  486. package/core/built/admin/assets/Combination--5EZGaDs.js +0 -43
  487. package/core/built/admin/assets/Growth-C0NoKcHQ.js +0 -3
  488. package/core/built/admin/assets/Newsletters-Ed8kDjdy.js +0 -1
  489. package/core/built/admin/assets/Overview-CArPgRZt.js +0 -1
  490. package/core/built/admin/assets/Web-CjjYoVM3.js +0 -2
  491. package/core/built/admin/assets/account-migration-mfa5mNI9.js +0 -1
  492. package/core/built/admin/assets/activitypub/inbox-B3rjKMTv.js +0 -1221
  493. package/core/built/admin/assets/activitypub/layout-jcurg3rU.js +0 -1
  494. package/core/built/admin/assets/activitypub/use-activity-pub-queries-yqGRcnLn.js +0 -2569
  495. package/core/built/admin/assets/activitypub/users-CfyHIsTG.js +0 -1316
  496. package/core/built/admin/assets/automations-DkUnxNdv.js +0 -1
  497. package/core/built/admin/assets/automations-vjXofmV_.js +0 -1
  498. package/core/built/admin/assets/bluesky-sharing-T-pO3RcP.js +0 -1
  499. package/core/built/admin/assets/breadcrumb-CekPYTCn.js +0 -1
  500. package/core/built/admin/assets/button--i2uMDDn.js +0 -4
  501. package/core/built/admin/assets/card-CSWz_BXq.js +0 -1
  502. package/core/built/admin/assets/chart-helpers-C_4Ka_vT.js +0 -1
  503. package/core/built/admin/assets/chunk.524.8ce2c741473e2f0929dc.js +0 -25
  504. package/core/built/admin/assets/chunk.582.453459d6228d2955408b.js +0 -27
  505. package/core/built/admin/assets/code-editor-view-BfkwQto2.js +0 -1
  506. package/core/built/admin/assets/command-K75Jzs0G.js +0 -1
  507. package/core/built/admin/assets/comments-BEIi1DH-.js +0 -1
  508. package/core/built/admin/assets/container-BNXvlcjA.js +0 -1
  509. package/core/built/admin/assets/data-list-BmK5QMab.js +0 -1
  510. package/core/built/admin/assets/date-range-select-5sKzwbt7.js +0 -1
  511. package/core/built/admin/assets/disabled-sources-indicator-L_ssJTNr.js +0 -1
  512. package/core/built/admin/assets/dist-BBIJuyPg.js +0 -1
  513. package/core/built/admin/assets/dist-BHE0dp6o.js +0 -1
  514. package/core/built/admin/assets/dist-DJ6c4_De.js +0 -1
  515. package/core/built/admin/assets/dist-DW0QXQO3.js +0 -1
  516. package/core/built/admin/assets/dist-DxFLceO5.js +0 -1
  517. package/core/built/admin/assets/dist-QcACAOAD.js +0 -1
  518. package/core/built/admin/assets/dist-duxRDcQu.js +0 -177
  519. package/core/built/admin/assets/domain-CLaPZ9Rc.js +0 -1
  520. package/core/built/admin/assets/dropzone-E0bSX4_a.js +0 -5
  521. package/core/built/admin/assets/edit-profile-DqNPKaA4.js +0 -1
  522. package/core/built/admin/assets/editor-CkLXQDRp.js +0 -8
  523. package/core/built/admin/assets/empty-indicator-BTtOlgIo.js +0 -1
  524. package/core/built/admin/assets/esm-TSfGW7nz.js +0 -2
  525. package/core/built/admin/assets/explore-BEstLxKr.js +0 -1
  526. package/core/built/admin/assets/feed-C58p2voG.js +0 -1
  527. package/core/built/admin/assets/field-BSbDUHPv.js +0 -1
  528. package/core/built/admin/assets/filters-BgYv8Gt7.js +0 -1
  529. package/core/built/admin/assets/filters-DvenFkmK.js +0 -1
  530. package/core/built/admin/assets/framework-provider-jQktxm9P.js +0 -4
  531. package/core/built/admin/assets/ghost-dark-8590dea6cd695ff90f27d262c4464538.css +0 -1
  532. package/core/built/admin/assets/gift-link-modal-BPjXkEFt.js +0 -1
  533. package/core/built/admin/assets/growth-D4JNiVTe.js +0 -1
  534. package/core/built/admin/assets/hooks-Cjxexi_I.js +0 -2
  535. package/core/built/admin/assets/index-BacwlcOy.js +0 -67
  536. package/core/built/admin/assets/index-DxRNHH0o.css +0 -1
  537. package/core/built/admin/assets/inline-C22rnPro.js +0 -1
  538. package/core/built/admin/assets/input-group-CKfrILLP.js +0 -1
  539. package/core/built/admin/assets/jsx-runtime-CtMZ-PAS.js +0 -1
  540. package/core/built/admin/assets/kpi-card-DZxQKAIb.js +0 -1
  541. package/core/built/admin/assets/kpi-card-FidQ5zg3.js +0 -1
  542. package/core/built/admin/assets/kpi-helpers-C5T8Vaf1.js +0 -1
  543. package/core/built/admin/assets/kpi-tabs-_VRK6hGV.js +0 -1
  544. package/core/built/admin/assets/label-Cza7hPgn.js +0 -1
  545. package/core/built/admin/assets/label-picker-DgC_zLaw.js +0 -1
  546. package/core/built/admin/assets/layout-BxsXnKFX.js +0 -1
  547. package/core/built/admin/assets/limit-service-CTurluJQ.js +0 -20
  548. package/core/built/admin/assets/link-helpers-C3Gqy2cz.js +0 -1
  549. package/core/built/admin/assets/list-page-BtqCnow_.js +0 -1
  550. package/core/built/admin/assets/member-custom-fields-9uXFBqSt.js +0 -1
  551. package/core/built/admin/assets/member-detail-Dq6ZDIxo.js +0 -1
  552. package/core/built/admin/assets/members-CUWD9jal.js +0 -10
  553. package/core/built/admin/assets/modals-CIdwHVga.js +0 -31
  554. package/core/built/admin/assets/moderation-DTt04UDA.js +0 -1
  555. package/core/built/admin/assets/newsletter-cC8vcc9h.js +0 -1
  556. package/core/built/admin/assets/note-DZU0IY9e.js +0 -1
  557. package/core/built/admin/assets/notifications-NoHpBHJ4.js +0 -1
  558. package/core/built/admin/assets/nql-lang-CvCSOQG3.js +0 -19
  559. package/core/built/admin/assets/onboarding-route-Deg2hNm8.js +0 -1
  560. package/core/built/admin/assets/overview-BQPt_9w3.js +0 -1
  561. package/core/built/admin/assets/page-header-D6bEqPo2.js +0 -1
  562. package/core/built/admin/assets/post-analytics-header-BPw_B2_D.js +0 -1
  563. package/core/built/admin/assets/post-analytics-kp2_--XO.js +0 -1
  564. package/core/built/admin/assets/post-share-modal-Cave3Z4W.js +0 -1
  565. package/core/built/admin/assets/preferences-C7h3j_uy.js +0 -5
  566. package/core/built/admin/assets/profile-B2x4q2oB.js +0 -1
  567. package/core/built/admin/assets/router-provider-5fsX1CYn.js +0 -1
  568. package/core/built/admin/assets/select-PhPjIBBT.js +0 -1
  569. package/core/built/admin/assets/settings-D5P9Gwgo.js +0 -6
  570. package/core/built/admin/assets/settings-zUOzQV5I.js +0 -1
  571. package/core/built/admin/assets/share-modal-EfpfbuWF.js +0 -1
  572. package/core/built/admin/assets/social-urls-DgAF08Xc.js +0 -18
  573. package/core/built/admin/assets/sort-button-WOQYJm2H.js +0 -1
  574. package/core/built/admin/assets/source-icon-hm8Cj-Gx.js +0 -1
  575. package/core/built/admin/assets/stats-CnQDb62m.js +0 -1
  576. package/core/built/admin/assets/stats-view-CCfTJgSe.js +0 -1
  577. package/core/built/admin/assets/step-1-BGlhY4DS.js +0 -1
  578. package/core/built/admin/assets/step-2-D3sDEyFH.js +0 -1
  579. package/core/built/admin/assets/step-3-CvZoUdsc.js +0 -2
  580. package/core/built/admin/assets/switch-CNjkOmwz.js +0 -1
  581. package/core/built/admin/assets/table-C5nZYPnW.js +0 -1
  582. package/core/built/admin/assets/tabs-dtOcExye.js +0 -1
  583. package/core/built/admin/assets/tags-Dhm0FB_g.js +0 -1
  584. package/core/built/admin/assets/textarea-CeKw3wmV.js +0 -1
  585. package/core/built/admin/assets/toggle-group-DfhZIMTW.js +0 -1
  586. package/core/built/admin/assets/topic-filter-Cxe1Il41.js +0 -1
  587. package/core/built/admin/assets/typeof-Ca-duI-z.js +0 -1
  588. package/core/built/admin/assets/use-filter-params-Bub6BqNy.js +0 -1
  589. package/core/built/admin/assets/use-growth-stats-BJORomv0.js +0 -1
  590. package/core/built/admin/assets/use-reply-chain-data-B89YjVoo.js +0 -1
  591. package/core/built/admin/assets/use-simple-pagination-BL2SYXKi.js +0 -1
  592. package/core/built/admin/assets/virtual-list-DNJOSK9I.js +0 -1
  593. package/core/built/admin/assets/web-BHUE3YQc.js +0 -1
  594. package/core/server/adapters/scheduling/scheduling-base.js +0 -5
  595. package/core/server/adapters/sso/SSOBase.js +0 -5
  596. package/core/server/adapters/storage/index.js +0 -17
@@ -128,8 +128,12 @@ class AdapterManager {
128
128
  // We are loading from node_modules, we can remove the `adapterType` prefix
129
129
  pathToAdapter = node_path_1.default.join(pathToAdapters, adapterClassName);
130
130
  }
131
+ // An adapter directory may be a full module with its own
132
+ // package.json, in which case this resolves the `exports` entry
133
+ // point; otherwise the path passes through unchanged.
134
+ const moduleToLoad = (0, utils_1.resolveAdapterEntryPoint)(pathToAdapter);
131
135
  try {
132
- const adapterModule = this.loadAdapterFromPath(pathToAdapter);
136
+ const adapterModule = this.loadAdapterFromPath(moduleToLoad);
133
137
  Adapter = (0, utils_1.resolveAdapterExport)(adapterModule);
134
138
  if (Adapter) {
135
139
  break;
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import errors from '@tryghost/errors';
3
- import {resolveAdapterExport, resolveAdapterOptions, normalizeAdapterConfig, getConfiguredFeatures} from './utils';
3
+ import {resolveAdapterExport, resolveAdapterEntryPoint, resolveAdapterOptions, normalizeAdapterConfig, getConfiguredFeatures} from './utils';
4
4
  import type {ConfigInstance} from '../../../shared/config/loader';
5
5
  import type {
6
6
  Adapter,
@@ -193,8 +193,13 @@ export class AdapterManager<BaseClasses extends BaseClassMap = BaseClassMap> {
193
193
  // We are loading from node_modules, we can remove the `adapterType` prefix
194
194
  pathToAdapter = path.join(pathToAdapters, adapterClassName);
195
195
  }
196
+ // An adapter directory may be a full module with its own
197
+ // package.json, in which case this resolves the `exports` entry
198
+ // point; otherwise the path passes through unchanged.
199
+ const moduleToLoad = resolveAdapterEntryPoint(pathToAdapter);
200
+
196
201
  try {
197
- const adapterModule = this.loadAdapterFromPath(pathToAdapter);
202
+ const adapterModule = this.loadAdapterFromPath(moduleToLoad);
198
203
  Adapter = resolveAdapterExport(adapterModule);
199
204
  if (Adapter) {
200
205
  break;
@@ -3,37 +3,40 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const ghost_storage_base_1 = __importDefault(require("ghost-storage-base"));
6
+ const ghost_storage_base_1 = require("ghost-storage-base");
7
7
  const adapter_base_scheduling_1 = require("@tryghost/adapter-base-scheduling");
8
8
  const adapter_base_sso_1 = require("@tryghost/adapter-base-sso");
9
- const adapter_base_cache_1 = __importDefault(require("@tryghost/adapter-base-cache"));
9
+ const adapter_base_cache_1 = require("@tryghost/adapter-base-cache");
10
10
  const adapter_base_redirects_1 = require("@tryghost/adapter-base-redirects");
11
11
  const adapter_base_route_settings_1 = require("@tryghost/adapter-base-route-settings");
12
12
  const adapter_manager_1 = require("./adapter-manager");
13
13
  const config_1 = __importDefault(require("../../../shared/config"));
14
+ const adapterPaths = new Set([
15
+ '', // A blank path will cause us to check node_modules for the adapter
16
+ config_1.default.get('paths').internalAdaptersPath,
17
+ // custom docker builds may install adapters in a separate path from content,
18
+ // since the content dir is often bind-mounted into the container. Offering
19
+ // an escape hatch here to allow for this
20
+ config_1.default.get('paths').installedAdaptersPath ?? '',
21
+ // load adapters from content last, so that they don't override any other
22
+ // internal or platform-installed adapters
23
+ // TODO: potentially deprecate/remove as part of Ghost 7.0
24
+ config_1.default.getContentPath('adapters'),
25
+ ]);
14
26
  // A singleton adapter manager, preconfigured with the base classes for every
15
27
  // known adapter type. `getAdapter` resolves the active adapter and its options
16
28
  // from config on each call, so runtime config changes are always reflected.
17
29
  const adapterManager = new adapter_manager_1.AdapterManager({
18
30
  loadAdapterFromPath: require,
19
31
  config: config_1.default,
20
- pathsToAdapters: [
21
- '', // A blank path will cause us to check node_modules for the adapter
22
- config_1.default.getContentPath('adapters'),
23
- config_1.default.get('paths').internalAdaptersPath
24
- ],
32
+ pathsToAdapters: Array.from(adapterPaths),
25
33
  baseClasses: {
26
- storage: ghost_storage_base_1.default,
34
+ storage: ghost_storage_base_1.StorageBase,
27
35
  scheduling: adapter_base_scheduling_1.SchedulingBase,
28
36
  sso: adapter_base_sso_1.SSOBase,
29
- cache: adapter_base_cache_1.default,
37
+ cache: adapter_base_cache_1.CacheBase,
30
38
  redirects: adapter_base_redirects_1.RedirectsStoreBase,
31
39
  'route-settings': adapter_base_route_settings_1.RouteSettingsStoreBase
32
40
  }
33
41
  });
34
- // NOTE: exported via `module.exports` (rather than ESM named exports) so that
35
- // consumers keep `require(...).getAdapter` access AND tests can stub methods
36
- // with sinon — ESM named exports compile to immutable bindings that sinon
37
- // cannot stub. Using `module.exports` directly (not `export =`) keeps this
38
- // compatible with the erasableSyntaxOnly compiler option.
39
- module.exports = adapterManager;
42
+ exports.default = adapterManager;
@@ -1,37 +1,43 @@
1
- import GhostStorageBase from 'ghost-storage-base';
1
+ import {StorageBase} from 'ghost-storage-base';
2
2
  import {SchedulingBase} from '@tryghost/adapter-base-scheduling';
3
3
  import {SSOBase} from '@tryghost/adapter-base-sso';
4
- import BaseCache from '@tryghost/adapter-base-cache';
5
- import { RedirectsStoreBase } from '@tryghost/adapter-base-redirects';
6
- import { RouteSettingsStoreBase } from '@tryghost/adapter-base-route-settings';
4
+ import {CacheBase} from '@tryghost/adapter-base-cache';
5
+ import {RedirectsStoreBase} from '@tryghost/adapter-base-redirects';
6
+ import {RouteSettingsStoreBase} from '@tryghost/adapter-base-route-settings';
7
7
 
8
8
  import {AdapterManager} from './adapter-manager';
9
9
  import config from '../../../shared/config';
10
10
 
11
+ const adapterPaths = new Set<string>([
12
+ '', // A blank path will cause us to check node_modules for the adapter
13
+ config.get('paths').internalAdaptersPath,
14
+
15
+ // custom docker builds may install adapters in a separate path from content,
16
+ // since the content dir is often bind-mounted into the container. Offering
17
+ // an escape hatch here to allow for this
18
+ config.get('paths').installedAdaptersPath ?? '',
19
+
20
+ // load adapters from content last, so that they don't override any other
21
+ // internal or platform-installed adapters
22
+ // TODO: potentially deprecate/remove as part of Ghost 7.0
23
+ config.getContentPath('adapters'),
24
+ ]);
25
+
11
26
  // A singleton adapter manager, preconfigured with the base classes for every
12
27
  // known adapter type. `getAdapter` resolves the active adapter and its options
13
28
  // from config on each call, so runtime config changes are always reflected.
14
29
  const adapterManager = new AdapterManager({
15
30
  loadAdapterFromPath: require,
16
31
  config,
17
- pathsToAdapters: [
18
- '', // A blank path will cause us to check node_modules for the adapter
19
- config.getContentPath('adapters'),
20
- config.get('paths').internalAdaptersPath
21
- ],
32
+ pathsToAdapters: Array.from(adapterPaths),
22
33
  baseClasses: {
23
- storage: GhostStorageBase,
34
+ storage: StorageBase,
24
35
  scheduling: SchedulingBase,
25
36
  sso: SSOBase,
26
- cache: BaseCache,
37
+ cache: CacheBase,
27
38
  redirects: RedirectsStoreBase,
28
39
  'route-settings': RouteSettingsStoreBase
29
40
  }
30
41
  });
31
42
 
32
- // NOTE: exported via `module.exports` (rather than ESM named exports) so that
33
- // consumers keep `require(...).getAdapter` access AND tests can stub methods
34
- // with sinon — ESM named exports compile to immutable bindings that sinon
35
- // cannot stub. Using `module.exports` directly (not `export =`) keeps this
36
- // compatible with the erasableSyntaxOnly compiler option.
37
- module.exports = adapterManager;
43
+ export default adapterManager;
@@ -1,9 +1,106 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolveAdapterEntryPoint = resolveAdapterEntryPoint;
3
7
  exports.resolveAdapterExport = resolveAdapterExport;
4
8
  exports.normalizeAdapterConfig = normalizeAdapterConfig;
5
9
  exports.getConfiguredFeatures = getConfiguredFeatures;
6
10
  exports.resolveAdapterOptions = resolveAdapterOptions;
11
+ const node_fs_1 = __importDefault(require("node:fs"));
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const node_module_1 = require("node:module");
14
+ /**
15
+ * Whether `filePath` resolves to a location inside `directory`.
16
+ *
17
+ * Both sides are resolved through `fs.realpathSync` before comparing, because
18
+ * Node's module resolution returns realpaths — so a symlinked install (or macOS'
19
+ * `/var` -> `/private/var`) would otherwise look like an escape.
20
+ */
21
+ function isContainedBy(filePath, directory) {
22
+ let realFilePath;
23
+ let realDirectory;
24
+ try {
25
+ realFilePath = node_fs_1.default.realpathSync(filePath);
26
+ realDirectory = node_fs_1.default.realpathSync(directory);
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ const relative = node_path_1.default.relative(realDirectory, realFilePath);
32
+ // Compare the first segment exactly rather than using startsWith('..'), so
33
+ // a legitimately-contained entry whose name merely begins with dots (e.g.
34
+ // "..hidden.js") isn't mistaken for traversal.
35
+ const [firstSegment] = relative.split(node_path_1.default.sep);
36
+ return relative !== '' && firstSegment !== '..' && !node_path_1.default.isAbsolute(relative);
37
+ }
38
+ /**
39
+ * Map a candidate adapter path to the module Node should actually load.
40
+ *
41
+ * An adapter installed into `content/adapters` can be a full module directory
42
+ * with its own `package.json`. Node's CommonJS directory resolution honours
43
+ * `main` but ignores `exports` — per spec, `exports` applies only to package
44
+ * specifiers resolved through `node_modules`, never to directory paths — so a
45
+ * package declaring only `exports` would otherwise fail to resolve.
46
+ *
47
+ * We get native `exports` resolution by self-referencing: because the referrer
48
+ * we hand to `createRequire` sits inside the package, requiring the package by
49
+ * its own `name` makes Node resolve through that package's own `exports` field,
50
+ * applying conditions, nesting and subpath rules for us.
51
+ *
52
+ * Anything that isn't a self-referencing module directory — a bare
53
+ * `node_modules` specifier, a plain `index.js` adapter directory, or a package
54
+ * declaring only `main` — is returned untouched so Node's own resolution
55
+ * applies, preserving the behaviour of pre-existing adapters.
56
+ *
57
+ * @NOTE: `require` matches the `require`, `node` and `default` conditions but
58
+ * never `import`, and that isn't overridable (`--conditions` only adds custom
59
+ * conditions). So an ESM-only package whose root export is conditioned solely on
60
+ * `import` (`{".": {"import": "./dist/index.js"}}`) is not resolvable here, even
61
+ * though `require()` would happily load the file it points at. Such a package
62
+ * needs a `require`, `node`, `default` or unconditioned target. Lifting this
63
+ * would mean reading the `exports` field ourselves.
64
+ */
65
+ function resolveAdapterEntryPoint(pathToAdapter) {
66
+ // The node_modules lane passes a bare specifier rather than a path — Node
67
+ // already applies `exports` to those — and a relative read here would be
68
+ // resolved against the cwd, so only absolute directories are considered.
69
+ if (!node_path_1.default.isAbsolute(pathToAdapter)) {
70
+ return pathToAdapter;
71
+ }
72
+ const manifestPath = node_path_1.default.join(pathToAdapter, 'package.json');
73
+ let name;
74
+ try {
75
+ ({ name } = JSON.parse(node_fs_1.default.readFileSync(manifestPath, 'utf8')));
76
+ }
77
+ catch {
78
+ // Not a module directory, or an unreadable/malformed manifest.
79
+ return pathToAdapter;
80
+ }
81
+ // Self-referencing requires a package name to reference.
82
+ if (typeof name !== 'string' || !name) {
83
+ return pathToAdapter;
84
+ }
85
+ try {
86
+ const resolved = (0, node_module_1.createRequire)(manifestPath).resolve(name);
87
+ // Self-referencing only kicks in when the package declares `exports`.
88
+ // Without it, Node falls back to walking `node_modules` up the tree and
89
+ // can resolve a *different*, same-named package from elsewhere in the
90
+ // install — silently loading an impostor instead of the operator's
91
+ // adapter. Only accept a result that actually lives in the adapter
92
+ // directory; anything else falls back to Node's directory resolution.
93
+ if (!isContainedBy(resolved, pathToAdapter)) {
94
+ return pathToAdapter;
95
+ }
96
+ return resolved;
97
+ }
98
+ catch {
99
+ // No usable `exports` entry — fall back to Node's directory resolution,
100
+ // which still handles `main` and `index.js`.
101
+ return pathToAdapter;
102
+ }
103
+ }
7
104
  /**
8
105
  * Resolve an adapter export to a constructor function, handling both CommonJS and ES module formats.
9
106
  */
@@ -34,19 +131,23 @@ function getSchedulingConfig(config) {
34
131
  }
35
132
  return adapterConfig;
36
133
  }
37
- function normalizeFilestoreConfig(config, key, defaultPaths) {
134
+ function normalizeAdapterPaths(config, key, defaultPathsByAdapter) {
38
135
  const adapterConfig = config.get(`adapters:${key}`);
39
- if (!adapterConfig?.FileStore) {
136
+ if (!adapterConfig) {
40
137
  return adapterConfig;
41
138
  }
42
- const fileStoreConfig = { ...adapterConfig.FileStore };
43
- for (const [pathName, defaultPath] of Object.entries(defaultPaths)) {
44
- fileStoreConfig[pathName] ||= defaultPath;
139
+ const normalized = { ...adapterConfig };
140
+ for (const [adapterClassName, defaultPaths] of Object.entries(defaultPathsByAdapter)) {
141
+ if (!normalized[adapterClassName]) {
142
+ continue;
143
+ }
144
+ const storeConfig = { ...normalized[adapterClassName] };
145
+ for (const [pathName, defaultPath] of Object.entries(defaultPaths)) {
146
+ storeConfig[pathName] ||= defaultPath;
147
+ }
148
+ normalized[adapterClassName] = storeConfig;
45
149
  }
46
- return {
47
- ...adapterConfig,
48
- FileStore: fileStoreConfig
49
- };
150
+ return normalized;
50
151
  }
51
152
  /**
52
153
  * Normalize adapter config by ensuring that feature-specific adapter configs
@@ -58,12 +159,21 @@ function normalizeAdapterConfig(config) {
58
159
  ...adapterConfig,
59
160
  storage: adapterConfig?.storage ?? config.get('storage'),
60
161
  scheduling: getSchedulingConfig(config),
61
- redirects: normalizeFilestoreConfig(config, 'redirects', {
62
- basePath: config.getContentPath('data')
162
+ redirects: normalizeAdapterPaths(config, 'redirects', {
163
+ FileStore: {
164
+ basePath: config.getContentPath('data')
165
+ }
63
166
  }),
64
- 'route-settings': normalizeFilestoreConfig(config, 'route-settings', {
65
- basePath: config.getContentPath('settings'),
66
- defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
167
+ 'route-settings': normalizeAdapterPaths(config, 'route-settings', {
168
+ FileStore: {
169
+ basePath: config.getContentPath('settings'),
170
+ defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
171
+ },
172
+ // The S3 store reads the bundled defaults off disk too, for the
173
+ // empty-state response when the bucket holds no routes.yaml yet.
174
+ S3RouteSettingsStore: {
175
+ defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
176
+ }
67
177
  }),
68
178
  };
69
179
  }
@@ -1,6 +1,108 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import {createRequire} from 'node:module';
1
4
  import type {AdapterConstructor} from "./types";
2
5
  import type {ConfigInstance} from '../../../shared/config/loader';
3
6
 
7
+ /**
8
+ * Whether `filePath` resolves to a location inside `directory`.
9
+ *
10
+ * Both sides are resolved through `fs.realpathSync` before comparing, because
11
+ * Node's module resolution returns realpaths — so a symlinked install (or macOS'
12
+ * `/var` -> `/private/var`) would otherwise look like an escape.
13
+ */
14
+ function isContainedBy(filePath: string, directory: string): boolean {
15
+ let realFilePath: string;
16
+ let realDirectory: string;
17
+
18
+ try {
19
+ realFilePath = fs.realpathSync(filePath);
20
+ realDirectory = fs.realpathSync(directory);
21
+ } catch {
22
+ return false;
23
+ }
24
+
25
+ const relative = path.relative(realDirectory, realFilePath);
26
+
27
+ // Compare the first segment exactly rather than using startsWith('..'), so
28
+ // a legitimately-contained entry whose name merely begins with dots (e.g.
29
+ // "..hidden.js") isn't mistaken for traversal.
30
+ const [firstSegment] = relative.split(path.sep);
31
+
32
+ return relative !== '' && firstSegment !== '..' && !path.isAbsolute(relative);
33
+ }
34
+
35
+ /**
36
+ * Map a candidate adapter path to the module Node should actually load.
37
+ *
38
+ * An adapter installed into `content/adapters` can be a full module directory
39
+ * with its own `package.json`. Node's CommonJS directory resolution honours
40
+ * `main` but ignores `exports` — per spec, `exports` applies only to package
41
+ * specifiers resolved through `node_modules`, never to directory paths — so a
42
+ * package declaring only `exports` would otherwise fail to resolve.
43
+ *
44
+ * We get native `exports` resolution by self-referencing: because the referrer
45
+ * we hand to `createRequire` sits inside the package, requiring the package by
46
+ * its own `name` makes Node resolve through that package's own `exports` field,
47
+ * applying conditions, nesting and subpath rules for us.
48
+ *
49
+ * Anything that isn't a self-referencing module directory — a bare
50
+ * `node_modules` specifier, a plain `index.js` adapter directory, or a package
51
+ * declaring only `main` — is returned untouched so Node's own resolution
52
+ * applies, preserving the behaviour of pre-existing adapters.
53
+ *
54
+ * @NOTE: `require` matches the `require`, `node` and `default` conditions but
55
+ * never `import`, and that isn't overridable (`--conditions` only adds custom
56
+ * conditions). So an ESM-only package whose root export is conditioned solely on
57
+ * `import` (`{".": {"import": "./dist/index.js"}}`) is not resolvable here, even
58
+ * though `require()` would happily load the file it points at. Such a package
59
+ * needs a `require`, `node`, `default` or unconditioned target. Lifting this
60
+ * would mean reading the `exports` field ourselves.
61
+ */
62
+ export function resolveAdapterEntryPoint(pathToAdapter: string): string {
63
+ // The node_modules lane passes a bare specifier rather than a path — Node
64
+ // already applies `exports` to those — and a relative read here would be
65
+ // resolved against the cwd, so only absolute directories are considered.
66
+ if (!path.isAbsolute(pathToAdapter)) {
67
+ return pathToAdapter;
68
+ }
69
+
70
+ const manifestPath = path.join(pathToAdapter, 'package.json');
71
+
72
+ let name: unknown;
73
+ try {
74
+ ({name} = JSON.parse(fs.readFileSync(manifestPath, 'utf8')));
75
+ } catch {
76
+ // Not a module directory, or an unreadable/malformed manifest.
77
+ return pathToAdapter;
78
+ }
79
+
80
+ // Self-referencing requires a package name to reference.
81
+ if (typeof name !== 'string' || !name) {
82
+ return pathToAdapter;
83
+ }
84
+
85
+ try {
86
+ const resolved = createRequire(manifestPath).resolve(name);
87
+
88
+ // Self-referencing only kicks in when the package declares `exports`.
89
+ // Without it, Node falls back to walking `node_modules` up the tree and
90
+ // can resolve a *different*, same-named package from elsewhere in the
91
+ // install — silently loading an impostor instead of the operator's
92
+ // adapter. Only accept a result that actually lives in the adapter
93
+ // directory; anything else falls back to Node's directory resolution.
94
+ if (!isContainedBy(resolved, pathToAdapter)) {
95
+ return pathToAdapter;
96
+ }
97
+
98
+ return resolved;
99
+ } catch {
100
+ // No usable `exports` entry — fall back to Node's directory resolution,
101
+ // which still handles `main` and `index.js`.
102
+ return pathToAdapter;
103
+ }
104
+ }
105
+
4
106
  /**
5
107
  * Resolve an adapter export to a constructor function, handling both CommonJS and ES module formats.
6
108
  */
@@ -37,21 +139,26 @@ function getSchedulingConfig(config: ConfigInstance) {
37
139
  return adapterConfig;
38
140
  }
39
141
 
40
- function normalizeFilestoreConfig(config: ConfigInstance, key: 'redirects' | 'route-settings', defaultPaths: Record<string, string>) {
142
+ function normalizeAdapterPaths(config: ConfigInstance, key: 'redirects' | 'route-settings', defaultPathsByAdapter: Record<string, Record<string, string>>) {
41
143
  const adapterConfig = config.get(`adapters:${key}`);
42
- if (!adapterConfig?.FileStore) {
144
+ if (!adapterConfig) {
43
145
  return adapterConfig;
44
146
  }
45
147
 
46
- const fileStoreConfig = {...adapterConfig.FileStore};
47
- for (const [pathName, defaultPath] of Object.entries(defaultPaths)) {
48
- fileStoreConfig[pathName] ||= defaultPath;
49
- }
148
+ const normalized = {...adapterConfig};
149
+ for (const [adapterClassName, defaultPaths] of Object.entries(defaultPathsByAdapter)) {
150
+ if (!normalized[adapterClassName]) {
151
+ continue;
152
+ }
50
153
 
51
- return {
52
- ...adapterConfig,
53
- FileStore: fileStoreConfig
154
+ const storeConfig = {...normalized[adapterClassName]};
155
+ for (const [pathName, defaultPath] of Object.entries(defaultPaths)) {
156
+ storeConfig[pathName] ||= defaultPath;
157
+ }
158
+ normalized[adapterClassName] = storeConfig;
54
159
  }
160
+
161
+ return normalized;
55
162
  }
56
163
 
57
164
  /**
@@ -65,12 +172,21 @@ export function normalizeAdapterConfig(config: ConfigInstance) {
65
172
  ...adapterConfig,
66
173
  storage: adapterConfig?.storage ?? config.get('storage'),
67
174
  scheduling: getSchedulingConfig(config),
68
- redirects: normalizeFilestoreConfig(config, 'redirects', {
69
- basePath: config.getContentPath('data')
175
+ redirects: normalizeAdapterPaths(config, 'redirects', {
176
+ FileStore: {
177
+ basePath: config.getContentPath('data')
178
+ }
70
179
  }),
71
- 'route-settings': normalizeFilestoreConfig(config, 'route-settings', {
72
- basePath: config.getContentPath('settings'),
73
- defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
180
+ 'route-settings': normalizeAdapterPaths(config, 'route-settings', {
181
+ FileStore: {
182
+ basePath: config.getContentPath('settings'),
183
+ defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
184
+ },
185
+ // The S3 store reads the bundled defaults off disk too, for the
186
+ // empty-state response when the bucket holds no routes.yaml yet.
187
+ S3RouteSettingsStore: {
188
+ defaultSettingsBasePath: config.get('paths:defaultRouteSettings')
189
+ }
74
190
  }),
75
191
  }
76
192
  }
@@ -1,5 +1,5 @@
1
1
  const legacyApiPathMatch = require('./legacy-api-path-match');
2
- const urlUtils = require('../../../shared/url-utils');
2
+ const urlUtils = require('../../../shared/url-utils').default;
3
3
 
4
4
  /**
5
5
  * If there is a version in the URL, and this is a valid API URL containing admin/content
@@ -1,4 +1,4 @@
1
- const urlUtils = require('../../../shared/url-utils');
1
+ const urlUtils = require('../../../shared/url-utils').default;
2
2
  const urlService = require('../../services/url');
3
3
 
4
4
  const AudienceFeedbackService = require('./audience-feedback-service');
@@ -5,7 +5,7 @@ const tpl = require('@tryghost/tpl');
5
5
  const moment = require('moment');
6
6
 
7
7
  const models = require('../../models');
8
- const urlUtils = require('../../../shared/url-utils');
8
+ const urlUtils = require('../../../shared/url-utils').default;
9
9
  const mail = require('../mail');
10
10
 
11
11
  const messages = {
@@ -3,7 +3,7 @@ const session = require('express-session');
3
3
  const config = require('../../../../shared/config');
4
4
  const settingsCache = require('../../../../shared/settings-cache');
5
5
  const models = require('../../../models');
6
- const urlUtils = require('../../../../shared/url-utils');
6
+ const urlUtils = require('../../../../shared/url-utils').default;
7
7
 
8
8
  const SessionStore = require('./session-store');
9
9
  const sessionStore = new SessionStore(models.Session);
@@ -1,4 +1,4 @@
1
- const adapterManager = require('../../adapter-manager');
1
+ const adapterManager = require('../../adapter-manager').default;
2
2
  const createSessionService = require('./session-service');
3
3
  const sessionFromToken = require('./session-from-token');
4
4
  const createSessionMiddleware = require('./middleware');
@@ -9,7 +9,7 @@ const {t} = require('../../i18n');
9
9
  const expressSession = require('./express-session');
10
10
 
11
11
  const models = require('../../../models');
12
- const urlUtils = require('../../../../shared/url-utils');
12
+ const urlUtils = require('../../../../shared/url-utils').default;
13
13
  const config = require('../../../../shared/config');
14
14
  const {blogIcon} = require('../../../lib/image');
15
15
  const url = require('url');
@@ -58,7 +58,7 @@ const AUTH_CODE_CHALLENGE_BYTES = 16;
58
58
  * @param {() => string} deps.getBlogLogo
59
59
  * @param {import('../../mail').GhostMailer} deps.mailer
60
60
  * @param {import('../../i18n').t} deps.t
61
- * @param {import('../../../../shared/url-utils')} deps.urlUtils
61
+ * @param {import('../../../../shared/url-utils').default} deps.urlUtils
62
62
  * @param {() => boolean} deps.isStaffDeviceVerificationDisabled
63
63
  * @returns {SessionService}
64
64
  */
@@ -21,8 +21,6 @@ const bson_objectid_1 = __importDefault(require("bson-objectid"));
21
21
  const zod_1 = require("zod");
22
22
  const database_automations_repository_1 = require("./database-automations-repository");
23
23
  const fake_wait_hours_multiplier_1 = require("./fake-wait-hours-multiplier");
24
- // @ts-expect-error Models currently lack type definitions.
25
- const models_1 = require("../../models");
26
24
  const { knex } = require('../../data/db');
27
25
  const domainEvents = require('@tryghost/domain-events');
28
26
  const labs = require('../../../shared/labs');
@@ -304,23 +302,8 @@ async function markStepTerminal(...args) {
304
302
  async function retryStep(...args) {
305
303
  return await repository.retryStep(...args);
306
304
  }
307
- async function recordEmailSent(options) {
308
- await knex.transaction(async (transacting) => {
309
- await models_1.AutomatedEmailRecipient.add({
310
- member_id: options.memberId,
311
- member_uuid: options.memberUuid,
312
- member_email: options.memberEmail,
313
- member_name: options.memberName,
314
- automation_action_revision_id: options.automationActionRevisionId,
315
- ...(options.mailgunMessageId ? { mailgun_message_id: options.mailgunMessageId } : {}),
316
- track_opens: options.trackOpens
317
- }, { transacting });
318
- await transacting('automation_action_revisions')
319
- .where('id', options.automationActionRevisionId)
320
- .update({
321
- email_sent_count: transacting.raw('COALESCE(??, 0) + ?', ['email_sent_count', 1])
322
- });
323
- });
305
+ async function recordEmailSent(...args) {
306
+ return await repository.recordEmailSent(...args);
324
307
  }
325
308
  async function getAutomatedEmailRecipientsByMailgunIds(...args) {
326
309
  return await repository.getAutomatedEmailRecipientsByMailgunIds(...args);
@@ -2,15 +2,12 @@ import errors from '@tryghost/errors';
2
2
  import tpl from '@tryghost/tpl';
3
3
  import ObjectId from 'bson-objectid';
4
4
  import {z} from 'zod';
5
- import {type Knex} from 'knex';
6
5
  import {createDatabaseAutomationsRepository} from './database-automations-repository';
7
6
  import {parseFakeWaitHoursMultiplier} from './fake-wait-hours-multiplier';
8
7
  import type {
9
8
  AutomationsRepository,
10
9
  EditAutomationData
11
10
  } from './automations-repository';
12
- // @ts-expect-error Models currently lack type definitions.
13
- import {AutomatedEmailRecipient} from '../../models';
14
11
 
15
12
  const {knex} = require('../../data/db');
16
13
  const domainEvents = require('@tryghost/domain-events');
@@ -363,34 +360,8 @@ export async function retryStep(...args: Parameters<AutomationsRepository['retry
363
360
  return await repository.retryStep(...args);
364
361
  }
365
362
 
366
- export type RecordEmailSentOptions = Readonly<{
367
- automationActionRevisionId: string;
368
- mailgunMessageId?: string;
369
- memberEmail: string;
370
- memberId: string;
371
- memberName: string | null;
372
- memberUuid: string;
373
- trackOpens: boolean;
374
- }>;
375
-
376
- export async function recordEmailSent(options: RecordEmailSentOptions): Promise<void> {
377
- await knex.transaction(async (transacting: Knex.Transaction) => {
378
- await AutomatedEmailRecipient.add({
379
- member_id: options.memberId,
380
- member_uuid: options.memberUuid,
381
- member_email: options.memberEmail,
382
- member_name: options.memberName,
383
- automation_action_revision_id: options.automationActionRevisionId,
384
- ...(options.mailgunMessageId ? {mailgun_message_id: options.mailgunMessageId} : {}),
385
- track_opens: options.trackOpens
386
- }, {transacting});
387
-
388
- await transacting('automation_action_revisions')
389
- .where('id', options.automationActionRevisionId)
390
- .update({
391
- email_sent_count: transacting.raw('COALESCE(??, 0) + ?', ['email_sent_count', 1])
392
- });
393
- });
363
+ export async function recordEmailSent(...args: Parameters<AutomationsRepository['recordEmailSent']>) {
364
+ return await repository.recordEmailSent(...args);
394
365
  }
395
366
 
396
367
  export async function getAutomatedEmailRecipientsByMailgunIds(