ghost 6.53.0 → 6.54.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (639) 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.2.0.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-BTP1LthE.js +3 -0
  14. package/core/built/admin/assets/Newsletters-CSEX0myc.js +1 -0
  15. package/core/built/admin/assets/Overview-BjACEsJF.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-CxxxjCcv.js +2 -0
  19. package/core/built/admin/assets/account-migration-BklF2I_I.js +1 -0
  20. package/core/built/admin/assets/activitypub/{account-migration-BPZG37DJ.js → account-migration-CNovr6W-.js} +13 -13
  21. package/core/built/admin/assets/activitypub/activitypub.js +8 -8
  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-Ceslb1_M.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-BqkDUQxJ2.js → dist-ByFmDSNP2.js} +64 -63
  29. package/core/built/admin/assets/activitypub/{dist-B5ira32t.js → dist-DHAjBcV3.js} +5 -5
  30. package/core/built/admin/assets/activitypub/{domain-iqE4YXwD.js → domain-C1qQvJ8C.js} +33 -33
  31. package/core/built/admin/assets/activitypub/{edit-profile-B8MFYh28.js → edit-profile-BcH-jEfM.js} +46 -45
  32. package/core/built/admin/assets/activitypub/{explore-BbdKodp3.js → explore-AxwBh9dI.js} +20 -20
  33. package/core/built/admin/assets/activitypub/{feed-Cl3A5owG.js → feed-BaOlbh7a.js} +15 -15
  34. package/core/built/admin/assets/activitypub/{field-DL6WyR-c.js → field-B7mYYQpN.js} +13 -13
  35. package/core/built/admin/assets/activitypub/{hash-6G3DzwL9.js → hash-BC9Q0N4c.js} +2 -2
  36. package/core/built/admin/assets/activitypub/{inbox-YmhuBice.js → inbox-DQ4ZnC1m.js} +2 -2
  37. package/core/built/admin/assets/activitypub/inbox-vXez-5uJ.js +1221 -0
  38. package/core/built/admin/assets/activitypub/{label-DGbLjDvE.js → label-Chv5T8bw.js} +6 -6
  39. package/core/built/admin/assets/activitypub/layout-CziktJXo.js +1 -0
  40. package/core/built/admin/assets/activitypub/{moderation-qnBtk1zS.js → moderation-DtSM2i1I.js} +32 -31
  41. package/core/built/admin/assets/activitypub/{note-C7ZRoSJv.js → note-Dckp4S-2.js} +21 -21
  42. package/core/built/admin/assets/activitypub/{notifications-DiEA4b1o.js → notifications-CG5T22vg.js} +17 -17
  43. package/core/built/admin/assets/activitypub/{onboarding-_JVgEwgV.js → onboarding-BFDkzeR2.js} +2 -2
  44. package/core/built/admin/assets/activitypub/{onboarding-DG4zu3qM.js → onboarding-D6rcBdPe.js} +5 -5
  45. package/core/built/admin/assets/activitypub/{preferences-B3FtocnP.js → preferences-D_799jdl.js} +1607 -1606
  46. package/core/built/admin/assets/activitypub/{profile-D8ZJfYXB.js → profile-D2JfXBQl.js} +264 -263
  47. package/core/built/admin/assets/activitypub/{reply-C1vggenw.js → reply-CpdMeAO5.js} +2 -2
  48. package/core/built/admin/assets/activitypub/{routes-BOii-V9n.js → routes-CCHe2dQp.js} +1317 -1298
  49. package/core/built/admin/assets/activitypub/{separator-1gNokN5S.js → separator-BI1FLsYM.js} +4 -4
  50. package/core/built/admin/assets/activitypub/{settings--9Sb0nbl.js → settings-kx-9Enkz.js} +14 -14
  51. package/core/built/admin/assets/activitypub/{site-fkMmqv0V.js → site-x4_IjVJ0.js} +10 -10
  52. package/core/built/admin/assets/activitypub/{step-1-QhivSMw2.js → step-1-DIDg4aHb.js} +15 -15
  53. package/core/built/admin/assets/activitypub/{step-2-pMk9YwqD.js → step-2-BfGe8BYt.js} +7 -7
  54. package/core/built/admin/assets/activitypub/{step-3-DvmVC1fo.js → step-3-mE9spAqw.js} +12 -12
  55. package/core/built/admin/assets/activitypub/{tabs-Dc0FEEYD.js → tabs-CyPRQQ1N.js} +241 -237
  56. package/core/built/admin/assets/activitypub/{topic-filter-CuDyM5bD.js → topic-filter-DLHBZT93.js} +4 -4
  57. package/core/built/admin/assets/activitypub/use-activity-pub-queries-VzbN99u_.js +1957 -0
  58. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-Drx1kdAK.js → use-navigate-with-base-path-CAwXTmqH.js} +165 -175
  59. package/core/built/admin/assets/activitypub/{use-reply-chain-data-BHkCHcW5.js → use-reply-chain-data-BAB6fNGt.js} +8 -8
  60. package/core/built/admin/assets/activitypub/users-BLeiOTHc.js +1464 -0
  61. package/core/built/admin/assets/activitypub/{x-BHCEe-c2.js → x-C8tAnXly.js} +2 -2
  62. package/core/built/admin/assets/{audience-adiFehTD.js → audience-X_XsZivI.js} +1 -1
  63. package/core/built/admin/assets/{automated-emails-UWM02CMr.js → automated-emails-of1MvVsv.js} +1 -1
  64. package/core/built/admin/assets/automations-B7-y3dXt.js +1 -0
  65. package/core/built/admin/assets/automations-DRFjW5fw.js +1 -0
  66. package/core/built/admin/assets/{avatar-flipboard-Lz3F9fNT.js → avatar-flipboard-C6Kj3Awu.js} +1 -1
  67. package/core/built/admin/assets/bluesky-sharing-BbbjWdzs.js +1 -0
  68. package/core/built/admin/assets/box-BWbhXh21.js +1 -0
  69. package/core/built/admin/assets/breadcrumb-B-M9Ip_2.js +1 -0
  70. package/core/built/admin/assets/card-DGoDJzrn.js +1 -0
  71. package/core/built/admin/assets/{chart-ChpW-NzQ.js → chart-BuRT2Y6p.js} +14 -14
  72. package/core/built/admin/assets/chart-helpers-xiSsW8r0.js +1 -0
  73. package/core/built/admin/assets/checkbox-EhJKHFdZ.js +1 -0
  74. package/core/built/admin/assets/{chunk.432.c2caa0b20f03e71d1a35.js → chunk.211.6f7328d63c41536451b3.js} +2025 -2819
  75. package/core/built/admin/assets/{chunk.432.c2caa0b20f03e71d1a35.js.LICENSE.txt → chunk.211.6f7328d63c41536451b3.js.LICENSE.txt} +1 -62
  76. package/core/built/admin/assets/{chunk.831.0703a12e49f51cec3f3a.js → chunk.361.3cdb584b973959e52ccc.js} +78 -85
  77. package/core/built/admin/assets/chunk.524.8365cd9280405c0f6216.js +25 -0
  78. package/core/built/admin/assets/chunk.582.61d078937e6102769f2c.js +27 -0
  79. package/core/built/admin/assets/code-editor-view-CZtJFGhR.js +1 -0
  80. package/core/built/admin/assets/comments-CvyXxOyN.js +1 -0
  81. package/core/built/admin/assets/container-BYz2Ed39.js +1 -0
  82. package/core/built/admin/assets/data-list-16rkJYYi.js +1 -0
  83. package/core/built/admin/assets/date-range-select-CTlyo8zW.js +1 -0
  84. package/core/built/admin/assets/disabled-sources-indicator-qs2GfLvl.js +1 -0
  85. package/core/built/admin/assets/{dist-DJ6c4_De.js → dist-2Tnz2Yfq.js} +1 -1
  86. package/core/built/admin/assets/{dist-CsekE4FL.js → dist-CQJY6SVY.js} +1 -1
  87. package/core/built/admin/assets/dist-CjY-f5Z1.js +1 -0
  88. package/core/built/admin/assets/dist-DGzPJ_bO.js +4 -0
  89. package/core/built/admin/assets/dist-DIC8yz5C.js +1 -0
  90. package/core/built/admin/assets/{dist-BbGrW05X.js → dist-DyViJwIy.js} +1 -1
  91. package/core/built/admin/assets/dist-Ndy-PuGN.js +1 -0
  92. package/core/built/admin/assets/dist-P_ohUlTi.js +1 -0
  93. package/core/built/admin/assets/domain-CPNXKVOV.js +1 -0
  94. package/core/built/admin/assets/dropzone-BmCXnw6J.js +5 -0
  95. package/core/built/admin/assets/edit-profile-SGrJve5M.js +1 -0
  96. package/core/built/admin/assets/editor-BOG2YPUm.js +8 -0
  97. package/core/built/admin/assets/empty-indicator-oX1u1Pkn.js +1 -0
  98. package/core/built/admin/assets/esm-CFX93H5M.js +2 -0
  99. package/core/built/admin/assets/explore-CUYLv9G9.js +1 -0
  100. package/core/built/admin/assets/feed-CPdJMttL.js +1 -0
  101. package/core/built/admin/assets/field-D0XISCK2.js +1 -0
  102. package/core/built/admin/assets/{filter-sources-v39ihhhV.js → filter-sources-Bieps75g.js} +1 -1
  103. package/core/built/admin/assets/filters-CuB-A7ma.js +1 -0
  104. package/core/built/admin/assets/filters-bXkkWro8.js +1 -0
  105. package/core/built/admin/assets/framework-provider-CmtnPXIT.js +4 -0
  106. package/core/built/admin/assets/{ghost-b57f077997b739a8ae9a70772dc016cb.js → ghost-05f9a7182ed56903dba05878a5b8422b.js} +46 -41
  107. package/core/built/admin/assets/ghost-dark-c8d0ab7f515b2010c173e23e9b32ea8a.css +1 -0
  108. package/core/built/admin/assets/gift-link-modal-su8MsRdg.js +1 -0
  109. package/core/built/admin/assets/{gift-links-CY3GwiVi.js → gift-links-nBxJjZiQ.js} +1 -1
  110. package/core/built/admin/assets/growth-Ba6S5FQX.js +1 -0
  111. package/core/built/admin/assets/hooks-BApwwBE0.js +2 -0
  112. package/core/built/admin/assets/{inbox-TEISAmth.js → inbox-Xx1CdnfO.js} +38 -38
  113. package/core/built/admin/assets/index-D8PbzuT9.css +1 -0
  114. package/core/built/admin/assets/index-ukW_0Uie.js +67 -0
  115. package/core/built/admin/assets/inline-EMAm3okk.js +1 -0
  116. package/core/built/admin/assets/input-group-CGOXcy4l.js +1 -0
  117. package/core/built/admin/assets/input-surface-BpAjZXY5.js +1 -0
  118. package/core/built/admin/assets/{react-dom-C6aoWSfl.js → jsx-runtime-DX3WBWVO.js} +1 -1
  119. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +5 -2
  120. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +2 -2
  121. package/core/built/admin/assets/{koenig-lexical-Di7b48ED.js → koenig-lexical-B61IALf5.js} +2 -2
  122. package/core/built/admin/assets/kpi-card-BlZaG1Lo.js +1 -0
  123. package/core/built/admin/assets/kpi-card-DCdlyaSS.js +1 -0
  124. package/core/built/admin/assets/kpi-helpers-DpAuS1Nb.js +1 -0
  125. package/core/built/admin/assets/kpi-tabs-Dme44bQS.js +1 -0
  126. package/core/built/admin/assets/label-dSs5aepE.js +1 -0
  127. package/core/built/admin/assets/label-picker-Uq91atex.js +1 -0
  128. package/core/built/admin/assets/{labels-GbxlXWtf.js → labels-Cyayfd-e.js} +1 -1
  129. package/core/built/admin/assets/layout-WUcz6tu1.js +1 -0
  130. package/core/built/admin/assets/limit-service-9fwD33lU.js +20 -0
  131. package/core/built/admin/assets/link-helpers-tOlxmuH5.js +1 -0
  132. package/core/built/admin/assets/list-page-B6ANtzkd.js +1 -0
  133. package/core/built/admin/assets/mailchimp-Ds_NQ04w.svg +9 -0
  134. package/core/built/admin/assets/member-custom-fields-NCzrMuba.js +1 -0
  135. package/core/built/admin/assets/member-detail-DPWDtYnN.js +1 -0
  136. package/core/built/admin/assets/members-B9rO7qr4.js +10 -0
  137. package/core/built/admin/assets/modals-CxRaan1J.js +31 -0
  138. package/core/built/admin/assets/moderation-D8zon60E.js +1 -0
  139. package/core/built/admin/assets/multi-select-combobox-1wYm3nle.js +1 -0
  140. package/core/built/admin/assets/newsletter-DbYMRxRS.js +1 -0
  141. package/core/built/admin/assets/{newsletters-DZm3yLj8.js → newsletters-D1jbtV-h.js} +1 -1
  142. package/core/built/admin/assets/note-PiWPnnrh.js +1 -0
  143. package/core/built/admin/assets/notifications-DEgqqB9G.js +1 -0
  144. package/core/built/admin/assets/nql-lang-B7faUf8D.js +19 -0
  145. package/core/built/admin/assets/{offers-D11QtPXX.js → offers-CrY6nSRR.js} +1 -1
  146. package/core/built/admin/assets/onboarding-route-BzF6HeVn.js +1 -0
  147. package/core/built/admin/assets/overview-DixLeIqY.js +1 -0
  148. package/core/built/admin/assets/page-header-op0eN36I.js +1 -0
  149. package/core/built/admin/assets/{pages-BnObVRrf.js → pages-BbNWFcGj.js} +1 -1
  150. package/core/built/admin/assets/pintura-CXOmq-5H.svg +15 -0
  151. package/core/built/admin/assets/post-analytics-WwRDEnrV.js +1 -0
  152. package/core/built/admin/assets/post-analytics-header-DsMoLx0R.js +1 -0
  153. package/core/built/admin/assets/{post-analytics-provider-DSfBCtnj.js → post-analytics-provider-BJCPLMIb.js} +1 -1
  154. package/core/built/admin/assets/post-share-modal-Dx-MEjhI.js +1 -0
  155. package/core/built/admin/assets/{posts-CwH8VJvB.js → posts-EWpZIjkr.js} +1 -1
  156. package/core/built/admin/assets/preferences-D7-j6A4C.js +5 -0
  157. package/core/built/admin/assets/profile-Dl69QPp0.js +1 -0
  158. package/core/built/admin/assets/{referrers-nxR52jPI.js → referrers-BCfFYSHc.js} +1 -1
  159. package/core/built/admin/assets/router-provider-C1R4AZ2o.js +1 -0
  160. package/core/built/admin/assets/select-C1qDZnW4.js +1 -0
  161. package/core/built/admin/assets/settings-BbmC_Iqq.js +4 -0
  162. package/core/built/admin/assets/settings-H6HxFgfI.js +1 -0
  163. package/core/built/admin/assets/shade-app-B3heOAfz-CGXQwWeO.js +3 -0
  164. package/core/built/admin/assets/share-modal-BJCadJyp.js +1 -0
  165. package/core/built/admin/assets/social-urls-BPL1nADp.js +8 -0
  166. package/core/built/admin/assets/sort-button-DyYlfYp7.js +1 -0
  167. package/core/built/admin/assets/source-icon-_ubRDbg_.js +1 -0
  168. package/core/built/admin/assets/stack-xiN0eQ6Z.js +1 -0
  169. package/core/built/admin/assets/stats-BQZMGMvn.js +1 -0
  170. package/core/built/admin/assets/stats-view-Doei-qCX.js +1 -0
  171. package/core/built/admin/assets/step-1-IKiLBPoC.js +1 -0
  172. package/core/built/admin/assets/step-2-jJ41PsDN.js +1 -0
  173. package/core/built/admin/assets/step-3-CaqFAEqf.js +2 -0
  174. package/core/built/admin/assets/switch-t-WyENU2.js +1 -0
  175. package/core/built/admin/assets/table-DxUL78jU.js +1 -0
  176. package/core/built/admin/assets/tabs-BQcJQ1ke.js +1 -0
  177. package/core/built/admin/assets/tags-CNujGwkT.js +1 -0
  178. package/core/built/admin/assets/text-DwtjwGkh.js +1 -0
  179. package/core/built/admin/assets/textarea-Bjccvh_E.js +1 -0
  180. package/core/built/admin/assets/{tiers-EghDzCKc.js → tiers-BgYLWRJv.js} +1 -1
  181. package/core/built/admin/assets/toggle-group-BeEpQ69p.js +1 -0
  182. package/core/built/admin/assets/topic-filter-Bb5MOD-1.js +1 -0
  183. package/core/built/admin/assets/{use-analytics-data-0l_OHtnR.js → use-analytics-data-Cds6XDjg.js} +1 -1
  184. package/core/built/admin/assets/use-filter-params-DjXkhO54.js +1 -0
  185. package/core/built/admin/assets/use-growth-stats-D8uf98-G.js +1 -0
  186. package/core/built/admin/assets/{use-post-referrers-DwI31Ril.js → use-post-referrers-CRtgyuXB.js} +1 -1
  187. package/core/built/admin/assets/use-reply-chain-data-DbKYX50v.js +1 -0
  188. package/core/built/admin/assets/use-simple-pagination-DC01kpo0.js +1 -0
  189. package/core/built/admin/assets/{use-tinybird-query-DvZBBMG7.js → use-tinybird-query-C7bQRJWw.js} +1 -1
  190. package/core/built/admin/assets/{use-tinybird-token-CQtebkvU.js → use-tinybird-token-Az4tam7_.js} +1 -1
  191. package/core/built/admin/assets/{users-Pc8IRjk9.js → users-CcSCQFcQ.js} +1 -1
  192. package/core/built/admin/assets/virtual-list-Dhuh9fGx.js +1 -0
  193. package/core/built/admin/assets/web-LtHNiNBV.js +1 -0
  194. package/core/built/admin/index.html +22 -22
  195. package/core/frontend/apps/private-blogging/index.js +1 -1
  196. package/core/frontend/apps/private-blogging/lib/middleware.js +1 -1
  197. package/core/frontend/helpers/split.js +2 -1
  198. package/core/frontend/meta/asset-url.js +1 -1
  199. package/core/frontend/meta/author-image.js +1 -1
  200. package/core/frontend/meta/blog-logo.js +1 -1
  201. package/core/frontend/meta/canonical-url.js +1 -1
  202. package/core/frontend/meta/cover-image.js +1 -1
  203. package/core/frontend/meta/get-meta.js +1 -1
  204. package/core/frontend/meta/og-image.js +1 -1
  205. package/core/frontend/meta/paginated-url.js +1 -1
  206. package/core/frontend/meta/twitter-image.js +1 -1
  207. package/core/frontend/meta/url.js +1 -1
  208. package/core/frontend/services/assets-minification/admin-auth-assets.js +1 -1
  209. package/core/frontend/services/llms/handler.js +1 -1
  210. package/core/frontend/services/proxy.js +42 -3
  211. package/core/frontend/services/routing/collection-router.js +1 -1
  212. package/core/frontend/services/routing/controllers/email-post.js +1 -1
  213. package/core/frontend/services/routing/controllers/entry/markdown.js +1 -1
  214. package/core/frontend/services/routing/controllers/entry/markdown.ts +1 -1
  215. package/core/frontend/services/routing/controllers/entry.js +1 -1
  216. package/core/frontend/services/routing/controllers/entry.ts +1 -1
  217. package/core/frontend/services/routing/controllers/previews.js +6 -7
  218. package/core/frontend/services/routing/controllers/unsubscribe.js +7 -3
  219. package/core/frontend/services/routing/email-router.js +1 -1
  220. package/core/frontend/services/routing/events.js +12 -0
  221. package/core/frontend/services/routing/middleware/page-param.js +1 -1
  222. package/core/frontend/services/routing/parent-router.js +1 -1
  223. package/core/frontend/services/routing/preview-router.js +1 -1
  224. package/core/frontend/services/routing/router-manager.js +4 -8
  225. package/core/frontend/services/routing/rss-router.js +1 -1
  226. package/core/frontend/services/routing/static-pages-router.js +1 -1
  227. package/core/frontend/services/routing/static-routes-router.js +1 -1
  228. package/core/frontend/services/routing/taxonomy-router.js +1 -1
  229. package/core/frontend/services/rss/generate-feed.js +1 -1
  230. package/core/frontend/services/sitemap/base-site-map-generator.js +23 -4
  231. package/core/frontend/services/sitemap/site-map-index-generator.js +1 -1
  232. package/core/frontend/services/sitemap/site-map-manager.js +14 -8
  233. package/core/frontend/services/sitemap/utils.js +1 -1
  234. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +1 -1
  235. package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +1 -1
  236. package/core/frontend/utils/images.js +1 -1
  237. package/core/frontend/web/middleware/admin-toolbar.js +1 -1
  238. package/core/frontend/web/middleware/handle-image-sizes.js +2 -2
  239. package/core/frontend/web/middleware/redirect-ghost-to-admin.js +1 -1
  240. package/core/frontend/web/routers/serve-favicon.js +1 -1
  241. package/core/frontend/web/routers/serve-public-file.js +1 -1
  242. package/core/frontend/web/site.js +5 -5
  243. package/core/server/adapters/cache/AdapterCacheMemoryTTL.js +2 -2
  244. package/core/server/adapters/cache/MemoryCache.js +2 -2
  245. package/core/server/adapters/cache/Redis.js +1 -1
  246. package/core/server/adapters/cache/index.js +1 -1
  247. package/core/server/adapters/lib/redis/AdapterCacheRedis.js +2 -2
  248. package/core/server/adapters/route-settings/FileStore.js +2 -8
  249. package/core/server/adapters/route-settings/FileStore.ts +1 -6
  250. package/core/server/adapters/route-settings/S3RouteSettingsStore.js +206 -0
  251. package/core/server/adapters/route-settings/S3RouteSettingsStore.ts +199 -0
  252. package/core/server/adapters/route-settings/utils.js +13 -0
  253. package/core/server/adapters/route-settings/utils.ts +7 -0
  254. package/core/server/adapters/scheduling/deps.d.ts +0 -2
  255. package/core/server/adapters/scheduling/error-capture.js +76 -0
  256. package/core/server/adapters/scheduling/error-capture.ts +91 -0
  257. package/core/server/adapters/scheduling/utils.js +18 -34
  258. package/core/server/adapters/scheduling/utils.ts +36 -0
  259. package/core/server/adapters/storage/LocalFilesStorage.js +13 -11
  260. package/core/server/adapters/storage/LocalFilesStorage.ts +24 -0
  261. package/core/server/adapters/storage/LocalImagesStorage.js +14 -12
  262. package/core/server/adapters/storage/LocalImagesStorage.ts +24 -0
  263. package/core/server/adapters/storage/LocalMediaStorage.js +13 -11
  264. package/core/server/adapters/storage/LocalMediaStorage.ts +24 -0
  265. package/core/server/adapters/storage/LocalStorageBase.js +107 -167
  266. package/core/server/adapters/storage/LocalStorageBase.ts +342 -0
  267. package/core/server/adapters/storage/S3Storage.js +2 -2
  268. package/core/server/adapters/storage/S3Storage.ts +1 -1
  269. package/core/server/adapters/storage/utils.js +36 -50
  270. package/core/server/adapters/storage/utils.ts +60 -0
  271. package/core/server/api/endpoints/authentication.js +1 -1
  272. package/core/server/api/endpoints/db.js +6 -0
  273. package/core/server/api/endpoints/featurebase.js +1 -1
  274. package/core/server/api/endpoints/files.js +2 -2
  275. package/core/server/api/endpoints/images.js +2 -2
  276. package/core/server/api/endpoints/libraries.d.ts +0 -1
  277. package/core/server/api/endpoints/media.js +8 -5
  278. package/core/server/api/endpoints/member-custom-fields.js +4 -1
  279. package/core/server/api/endpoints/member-custom-fields.ts +4 -1
  280. package/core/server/api/endpoints/members.js +25 -28
  281. package/core/server/api/endpoints/pages.js +6 -1
  282. package/core/server/api/endpoints/posts.js +28 -3
  283. package/core/server/api/endpoints/search-index-public.js +4 -3
  284. package/core/server/api/endpoints/search-index.js +5 -4
  285. package/core/server/api/endpoints/settings-public.js +1 -1
  286. package/core/server/api/endpoints/settings.js +3 -1
  287. package/core/server/api/endpoints/utils/serializers/input/utils/url.js +9 -1
  288. package/core/server/api/endpoints/utils/serializers/output/default.js +7 -0
  289. package/core/server/api/endpoints/utils/serializers/output/files.js +1 -1
  290. package/core/server/api/endpoints/utils/serializers/output/mappers/comments.js +4 -1
  291. package/core/server/api/endpoints/utils/serializers/output/media.js +1 -1
  292. package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.js +7 -4
  293. package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.ts +8 -4
  294. package/core/server/api/endpoints/utils/serializers/output/members.js +27 -106
  295. package/core/server/api/endpoints/utils/serializers/output/pages.js +7 -0
  296. package/core/server/api/endpoints/utils/serializers/output/posts.js +13 -0
  297. package/core/server/api/endpoints/utils/serializers/output/utils/url.js +1 -1
  298. package/core/server/api/endpoints/utils/validators/input/members.js +2 -52
  299. package/core/server/data/db/backup.js +1 -1
  300. package/core/server/data/exporter/export-filename.js +2 -1
  301. package/core/server/data/importer/handlers/image.js +3 -3
  302. package/core/server/data/importer/import-manager.js +6 -4
  303. package/core/server/data/importer/importers/content-file-importer.js +2 -2
  304. package/core/server/data/importer/importers/data/revue-subscriber-importer.js +6 -10
  305. package/core/server/data/importer/importers/json-to-html.js +24 -4
  306. package/core/server/data/migrations/utils/schema.js +4 -2
  307. package/core/server/data/migrations/versions/6.54/2026-07-19-16-59-00-add-content-import-permission.js +10 -0
  308. 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
  309. package/core/server/data/migrations/versions/6.54/2026-07-21-01-58-20-add-automation-run-steps-poller-index.js +3 -0
  310. 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
  311. package/core/server/data/migrations/versions/6.54/2026-07-22-10-41-08-add-click-tracking-to-automated-email-recipients.js +13 -0
  312. 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
  313. package/core/server/data/migrations/versions/6.54/2026-07-23-10-24-18-add-automation-action-revision-to-redirects.js +9 -0
  314. package/core/server/data/schema/commands.js +37 -3
  315. package/core/server/data/schema/fixtures/fixtures.json +7 -0
  316. package/core/server/data/schema/lib/default-index-name.js +20 -0
  317. package/core/server/data/schema/schema.js +40 -17
  318. package/core/server/data/seeders/data-generator.js +4 -2
  319. package/core/server/lib/image/image-size.js +7 -23
  320. package/core/server/lib/image/image-utils.js +16 -2
  321. package/core/server/lib/image/index.js +4 -4
  322. package/core/server/lib/lexical.js +3 -3
  323. package/core/server/lib/mobiledoc.js +2 -2
  324. package/core/server/lib/request-external.js +1 -1
  325. package/core/server/lib/validate-password.js +1 -1
  326. package/core/server/models/action.js +9 -0
  327. package/core/server/models/base/plugins/generate-slug.js +1 -1
  328. package/core/server/models/collection.js +1 -1
  329. package/core/server/models/custom-theme-setting.js +1 -1
  330. package/core/server/models/member.js +73 -0
  331. package/core/server/models/newsletter.js +1 -1
  332. package/core/server/models/post.js +19 -5
  333. package/core/server/models/posts-meta.js +1 -1
  334. package/core/server/models/redirect.js +1 -1
  335. package/core/server/models/settings.js +1 -1
  336. package/core/server/models/snippet.js +1 -1
  337. package/core/server/models/tag.js +1 -1
  338. package/core/server/models/user.js +47 -71
  339. package/core/server/models/welcome-email-automated-email.js +1 -1
  340. package/core/server/services/activitypub/activity-pub-service-wrapper.js +1 -1
  341. package/core/server/services/adapter-manager/adapter-manager.js +5 -1
  342. package/core/server/services/adapter-manager/adapter-manager.ts +7 -2
  343. package/core/server/services/adapter-manager/index.js +18 -15
  344. package/core/server/services/adapter-manager/index.ts +23 -17
  345. package/core/server/services/adapter-manager/utils.js +124 -14
  346. package/core/server/services/adapter-manager/utils.ts +130 -14
  347. package/core/server/services/api-version-compatibility/mw-version-rewrites.js +1 -1
  348. package/core/server/services/audience-feedback/index.js +1 -1
  349. package/core/server/services/auth/passwordreset.js +1 -1
  350. package/core/server/services/auth/session/express-session.js +1 -1
  351. package/core/server/services/auth/session/index.js +2 -2
  352. package/core/server/services/auth/session/session-service.js +29 -2
  353. package/core/server/services/automations/automations-api.js +8 -25
  354. package/core/server/services/automations/automations-api.ts +8 -37
  355. package/core/server/services/automations/automations-repository.ts +16 -0
  356. package/core/server/services/automations/database-automations-repository.js +37 -4
  357. package/core/server/services/automations/database-automations-repository.ts +41 -4
  358. package/core/server/services/automations/poll.js +16 -12
  359. package/core/server/services/automations/poll.ts +17 -15
  360. package/core/server/services/automations/service.js +1 -1
  361. package/core/server/services/automations/service.ts +3 -13
  362. package/core/server/services/automations/welcome-email-automation-poll.js +2 -1
  363. package/core/server/services/comments/comments-service-emails.js +4 -1
  364. package/core/server/services/comments/index.js +1 -1
  365. package/core/server/services/custom-redirects/index.js +2 -2
  366. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +14 -13
  367. package/core/server/services/email-analytics/email-analytics-service.js +1 -1
  368. package/core/server/services/email-analytics/events/start-email-analytics-job-event.js +11 -15
  369. package/core/server/services/email-analytics/events/start-email-analytics-job-event.ts +15 -0
  370. package/core/server/services/email-analytics/index.js +2 -3
  371. package/core/server/services/email-analytics/index.ts +1 -2
  372. package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.js +1 -6
  373. package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.ts +0 -9
  374. package/core/server/services/email-analytics/jobs/fetch-latest/index.js +1 -1
  375. package/core/server/services/email-analytics/jobs/index.js +0 -2
  376. package/core/server/services/email-service/email-service-wrapper.js +1 -1
  377. package/core/server/services/email-service/email-service.js +20 -4
  378. package/core/server/services/explore-ping/explore-ping-service.js +24 -39
  379. package/core/server/services/explore-ping/explore-ping-service.ts +198 -0
  380. package/core/server/services/explore-ping/index.js +11 -11
  381. package/core/server/services/explore-ping/index.ts +42 -0
  382. package/core/server/services/gifts/gift-reminder-scheduler.js +1 -1
  383. package/core/server/services/gifts/gift-reminder-scheduler.ts +1 -1
  384. package/core/server/services/gifts/gift-service-wrapper.js +1 -1
  385. package/core/server/services/identity-tokens/identity-token-service-wrapper.js +1 -1
  386. package/core/server/services/indexnow-ping/constants.js +30 -0
  387. package/core/server/services/indexnow-ping/constants.ts +32 -0
  388. package/core/server/services/indexnow-ping/index.js +29 -253
  389. package/core/server/services/indexnow-ping/index.ts +37 -0
  390. package/core/server/services/indexnow-ping/indexnow-ping-service.js +229 -0
  391. package/core/server/services/indexnow-ping/indexnow-ping-service.ts +319 -0
  392. package/core/server/services/invites/index.js +1 -1
  393. package/core/server/services/lib/mailgun-client.js +3 -3
  394. package/core/server/services/link-redirection/index.js +2 -2
  395. package/core/server/services/link-redirection/link-redirect-repository.js +1 -1
  396. package/core/server/services/link-redirection/link-redirect.js +12 -13
  397. package/core/server/services/link-redirection/link-redirect.ts +22 -0
  398. package/core/server/services/link-redirection/link-redirects-service.js +1 -1
  399. package/core/server/services/link-tracking/full-post-link.js +2 -2
  400. package/core/server/services/link-tracking/index.js +1 -1
  401. package/core/server/services/mail/ghost-mailer.js +1 -1
  402. package/core/server/services/mail/index.js +1 -1
  403. package/core/server/services/media-inliner/external-media-inliner.js +2 -2
  404. package/core/server/services/media-inliner/service.js +4 -3
  405. package/core/server/services/member-attribution/index.js +1 -1
  406. package/core/server/services/member-welcome-emails/service.js +1 -1
  407. package/core/server/services/members/api.js +8 -2
  408. package/core/server/services/members/import-export/config.js +30 -0
  409. package/core/server/services/members/import-export/config.ts +34 -0
  410. package/core/server/services/members/import-export/csv/index.js +10 -0
  411. package/core/server/services/members/import-export/csv/index.ts +2 -0
  412. package/core/server/services/members/import-export/csv/parse.js +64 -0
  413. package/core/server/services/members/import-export/csv/parse.ts +69 -0
  414. package/core/server/services/members/import-export/csv/serialize.js +13 -0
  415. package/core/server/services/members/import-export/csv/serialize.ts +18 -0
  416. package/core/server/services/members/import-export/export/exporter.js +202 -0
  417. package/core/server/services/members/import-export/export/exporter.ts +325 -0
  418. package/core/server/services/members/import-export/import/completion-email.js +65 -0
  419. package/core/server/services/members/import-export/import/completion-email.ts +119 -0
  420. package/core/server/services/members/import-export/import/importer.js +276 -0
  421. package/core/server/services/members/import-export/import/importer.ts +430 -0
  422. package/core/server/services/members/import-export/import/reader.js +32 -0
  423. package/core/server/services/members/import-export/import/reader.ts +33 -0
  424. package/core/server/services/members/import-export/import/row.js +33 -0
  425. package/core/server/services/members/import-export/import/row.ts +52 -0
  426. package/core/server/services/members/import-export/import/spool.js +30 -0
  427. package/core/server/services/members/import-export/import/spool.ts +38 -0
  428. package/core/server/services/members/import-export/index.js +90 -0
  429. package/core/server/services/members/import-export/index.ts +118 -0
  430. package/core/server/services/members/members-api/controllers/router-controller.js +7 -0
  431. package/core/server/services/members/members-api/members-api.js +4 -2
  432. package/core/server/services/members/members-api/repositories/event-repository.js +13 -2
  433. package/core/server/services/members/members-api/services/member-bread-service.js +42 -19
  434. package/core/server/services/members/middleware.js +1 -1
  435. package/core/server/services/members/service.js +28 -17
  436. package/core/server/services/members/stripe-connect.js +1 -1
  437. package/core/server/services/members-custom-fields/actions.js +3 -0
  438. package/core/server/services/members-custom-fields/actions.ts +6 -2
  439. package/core/server/services/members-custom-fields/config.js +34 -0
  440. package/core/server/services/members-custom-fields/config.ts +38 -0
  441. package/core/server/services/members-custom-fields/definitions-service.js +156 -21
  442. package/core/server/services/members-custom-fields/definitions-service.ts +170 -25
  443. package/core/server/services/members-custom-fields/index.js +16 -3
  444. package/core/server/services/members-custom-fields/index.ts +17 -3
  445. package/core/server/services/members-custom-fields/values-service.js +56 -10
  446. package/core/server/services/members-custom-fields/values-service.ts +62 -10
  447. package/core/server/services/mentions/mention-sending-service.js +22 -2
  448. package/core/server/services/mentions/service.js +21 -5
  449. package/core/server/services/newsletters/index.js +1 -1
  450. package/core/server/services/oembed/oembed-service.js +122 -33
  451. package/core/server/services/oembed/service.js +4 -2
  452. package/core/server/services/offers/service.js +1 -1
  453. package/core/server/services/post-scheduling/index.js +4 -3
  454. package/core/server/services/post-scheduling/index.ts +4 -3
  455. package/core/server/services/post-scheduling/post-scheduling.js +1 -1
  456. package/core/server/services/post-scheduling/post-scheduling.ts +1 -1
  457. package/core/server/services/posts/post-email-handler.js +13 -6
  458. package/core/server/services/posts/post-scheduling.js +1 -1
  459. package/core/server/services/posts/posts-exporter.js +6 -4
  460. package/core/server/services/posts/posts-service-instance.js +1 -1
  461. package/core/server/services/posts/posts-service.js +4 -4
  462. package/core/server/services/posts-public/service.js +1 -1
  463. package/core/server/services/public-config/site.js +1 -1
  464. package/core/server/services/recommendations/recommendation-service-wrapper.js +1 -1
  465. package/core/server/services/recommendations/service/libraries.d.ts +0 -2
  466. package/core/server/services/route-settings/dynamic-routing-service.js +2 -3
  467. package/core/server/services/route-settings/index.js +1 -1
  468. package/core/server/services/route-settings/route-settings-parser.js +134 -124
  469. package/core/server/services/route-settings/route-settings-parser.ts +160 -125
  470. package/core/server/services/route-settings/validation-errors.js +178 -0
  471. package/core/server/services/route-settings/validation-errors.ts +196 -0
  472. package/core/server/services/settings/settings-service.js +2 -2
  473. package/core/server/services/settings-helpers/index.js +1 -1
  474. package/core/server/services/slack-notifications/service.js +1 -1
  475. package/core/server/services/slack-ping/constants.js +16 -0
  476. package/core/server/services/slack-ping/constants.ts +15 -0
  477. package/core/server/services/slack-ping/index.js +26 -204
  478. package/core/server/services/slack-ping/index.ts +35 -0
  479. package/core/server/services/slack-ping/slack-ping-service.js +214 -0
  480. package/core/server/services/slack-ping/slack-ping-service.ts +296 -0
  481. package/core/server/services/staff/index.js +1 -1
  482. package/core/server/services/stats/posts-stats-service.js +1 -1
  483. package/core/server/services/stats/service.js +1 -1
  484. package/core/server/services/stripe/service.js +1 -1
  485. package/core/server/services/tags-public/service.js +1 -1
  486. package/core/server/services/themes/storage.js +9 -0
  487. package/core/server/services/themes/theme-storage.js +1 -1
  488. package/core/server/services/themes/validate.js +1 -1
  489. package/core/server/services/update-check/index.js +1 -1
  490. package/core/server/services/url/lazy-url-service.js +66 -6
  491. package/core/server/services/url/lazy-url-service.ts +73 -6
  492. package/core/server/services/url/url-generator.js +1 -1
  493. package/core/server/services/url/url-service-facade.js +68 -3
  494. package/core/server/services/url/url-service-facade.ts +79 -4
  495. package/core/server/services/url/url-service.js +1 -1
  496. package/core/server/services/url/urls.js +1 -1
  497. package/core/server/services/webhooks/index.js +19 -2
  498. package/core/server/services/webhooks/listen.js +6 -11
  499. package/core/server/services/webhooks/payload.js +1 -3
  500. package/core/server/services/webhooks/serialize.js +16 -1
  501. package/core/server/web/admin/app.js +1 -1
  502. package/core/server/web/admin/middleware/redirect-admin-urls.js +1 -1
  503. package/core/server/web/api/endpoints/admin/routes.js +1 -0
  504. package/core/server/web/api/middleware/cors.js +1 -1
  505. package/core/server/web/api/middleware/upload.js +4 -0
  506. package/core/server/web/gift-preview/controller.js +1 -1
  507. package/core/server/web/shared/middleware/redirect-amp-urls.js +1 -1
  508. package/core/server/web/shared/middleware/uncapitalise.js +2 -2
  509. package/core/server/web/shared/middleware/url-redirects.js +1 -1
  510. package/core/shared/config/defaults.json +10 -2
  511. package/core/shared/config/overrides.json +4 -0
  512. package/core/shared/express.js +6 -1
  513. package/core/shared/labs.js +2 -1
  514. package/core/shared/url-utils.js +19 -15
  515. package/core/shared/url-utils.ts +20 -0
  516. package/ghost.js +0 -1
  517. package/package.json +30 -35
  518. package/pnpm-lock.yaml +681 -2789
  519. package/pnpm-workspace.yaml +31 -17
  520. package/components/tryghost-adapter-base-scheduling-0.0.0.tgz +0 -0
  521. package/components/tryghost-adapter-base-sso-0.0.0.tgz +0 -0
  522. package/core/built/admin/assets/Combination--5EZGaDs.js +0 -43
  523. package/core/built/admin/assets/Growth-C0NoKcHQ.js +0 -3
  524. package/core/built/admin/assets/Newsletters-Ed8kDjdy.js +0 -1
  525. package/core/built/admin/assets/Overview-CArPgRZt.js +0 -1
  526. package/core/built/admin/assets/Web-CjjYoVM3.js +0 -2
  527. package/core/built/admin/assets/account-migration-mfa5mNI9.js +0 -1
  528. package/core/built/admin/assets/activitypub/inbox-B3rjKMTv.js +0 -1221
  529. package/core/built/admin/assets/activitypub/layout-jcurg3rU.js +0 -1
  530. package/core/built/admin/assets/activitypub/use-activity-pub-queries-yqGRcnLn.js +0 -2569
  531. package/core/built/admin/assets/activitypub/users-CfyHIsTG.js +0 -1316
  532. package/core/built/admin/assets/automations-DkUnxNdv.js +0 -1
  533. package/core/built/admin/assets/automations-vjXofmV_.js +0 -1
  534. package/core/built/admin/assets/bluesky-sharing-T-pO3RcP.js +0 -1
  535. package/core/built/admin/assets/breadcrumb-CekPYTCn.js +0 -1
  536. package/core/built/admin/assets/button--i2uMDDn.js +0 -4
  537. package/core/built/admin/assets/card-CSWz_BXq.js +0 -1
  538. package/core/built/admin/assets/chart-helpers-C_4Ka_vT.js +0 -1
  539. package/core/built/admin/assets/chunk.524.8ce2c741473e2f0929dc.js +0 -25
  540. package/core/built/admin/assets/chunk.582.453459d6228d2955408b.js +0 -27
  541. package/core/built/admin/assets/code-editor-view-BfkwQto2.js +0 -1
  542. package/core/built/admin/assets/command-K75Jzs0G.js +0 -1
  543. package/core/built/admin/assets/comments-BEIi1DH-.js +0 -1
  544. package/core/built/admin/assets/container-BNXvlcjA.js +0 -1
  545. package/core/built/admin/assets/data-list-BmK5QMab.js +0 -1
  546. package/core/built/admin/assets/date-range-select-5sKzwbt7.js +0 -1
  547. package/core/built/admin/assets/disabled-sources-indicator-L_ssJTNr.js +0 -1
  548. package/core/built/admin/assets/dist-BBIJuyPg.js +0 -1
  549. package/core/built/admin/assets/dist-BHE0dp6o.js +0 -1
  550. package/core/built/admin/assets/dist-CT46_f_J.js +0 -1
  551. package/core/built/admin/assets/dist-DW0QXQO3.js +0 -1
  552. package/core/built/admin/assets/dist-DxFLceO5.js +0 -1
  553. package/core/built/admin/assets/dist-QcACAOAD.js +0 -1
  554. package/core/built/admin/assets/dist-duxRDcQu.js +0 -177
  555. package/core/built/admin/assets/domain-CLaPZ9Rc.js +0 -1
  556. package/core/built/admin/assets/dropzone-E0bSX4_a.js +0 -5
  557. package/core/built/admin/assets/edit-profile-DqNPKaA4.js +0 -1
  558. package/core/built/admin/assets/editor-CkLXQDRp.js +0 -8
  559. package/core/built/admin/assets/empty-indicator-BTtOlgIo.js +0 -1
  560. package/core/built/admin/assets/esm-TSfGW7nz.js +0 -2
  561. package/core/built/admin/assets/explore-BEstLxKr.js +0 -1
  562. package/core/built/admin/assets/feed-C58p2voG.js +0 -1
  563. package/core/built/admin/assets/field-BSbDUHPv.js +0 -1
  564. package/core/built/admin/assets/filters-BgYv8Gt7.js +0 -1
  565. package/core/built/admin/assets/filters-DvenFkmK.js +0 -1
  566. package/core/built/admin/assets/framework-provider-jQktxm9P.js +0 -4
  567. package/core/built/admin/assets/ghost-dark-8590dea6cd695ff90f27d262c4464538.css +0 -1
  568. package/core/built/admin/assets/gift-link-modal-BPjXkEFt.js +0 -1
  569. package/core/built/admin/assets/growth-D4JNiVTe.js +0 -1
  570. package/core/built/admin/assets/hooks-Cjxexi_I.js +0 -2
  571. package/core/built/admin/assets/index-BacwlcOy.js +0 -67
  572. package/core/built/admin/assets/index-DxRNHH0o.css +0 -1
  573. package/core/built/admin/assets/inline-C22rnPro.js +0 -1
  574. package/core/built/admin/assets/input-group-CKfrILLP.js +0 -1
  575. package/core/built/admin/assets/jsx-runtime-CtMZ-PAS.js +0 -1
  576. package/core/built/admin/assets/kpi-card-DZxQKAIb.js +0 -1
  577. package/core/built/admin/assets/kpi-card-FidQ5zg3.js +0 -1
  578. package/core/built/admin/assets/kpi-helpers-C5T8Vaf1.js +0 -1
  579. package/core/built/admin/assets/kpi-tabs-_VRK6hGV.js +0 -1
  580. package/core/built/admin/assets/label-Cza7hPgn.js +0 -1
  581. package/core/built/admin/assets/label-picker-DgC_zLaw.js +0 -1
  582. package/core/built/admin/assets/layout-BxsXnKFX.js +0 -1
  583. package/core/built/admin/assets/limit-service-CTurluJQ.js +0 -20
  584. package/core/built/admin/assets/link-helpers-C3Gqy2cz.js +0 -1
  585. package/core/built/admin/assets/list-page-BtqCnow_.js +0 -1
  586. package/core/built/admin/assets/member-custom-fields-9uXFBqSt.js +0 -1
  587. package/core/built/admin/assets/member-detail-Dq6ZDIxo.js +0 -1
  588. package/core/built/admin/assets/members-CUWD9jal.js +0 -10
  589. package/core/built/admin/assets/modals-CIdwHVga.js +0 -31
  590. package/core/built/admin/assets/moderation-DTt04UDA.js +0 -1
  591. package/core/built/admin/assets/newsletter-cC8vcc9h.js +0 -1
  592. package/core/built/admin/assets/note-DZU0IY9e.js +0 -1
  593. package/core/built/admin/assets/notifications-NoHpBHJ4.js +0 -1
  594. package/core/built/admin/assets/nql-lang-CvCSOQG3.js +0 -19
  595. package/core/built/admin/assets/onboarding-route-Deg2hNm8.js +0 -1
  596. package/core/built/admin/assets/overview-BQPt_9w3.js +0 -1
  597. package/core/built/admin/assets/page-header-D6bEqPo2.js +0 -1
  598. package/core/built/admin/assets/post-analytics-header-BPw_B2_D.js +0 -1
  599. package/core/built/admin/assets/post-analytics-kp2_--XO.js +0 -1
  600. package/core/built/admin/assets/post-share-modal-Cave3Z4W.js +0 -1
  601. package/core/built/admin/assets/preferences-C7h3j_uy.js +0 -5
  602. package/core/built/admin/assets/profile-B2x4q2oB.js +0 -1
  603. package/core/built/admin/assets/router-provider-5fsX1CYn.js +0 -1
  604. package/core/built/admin/assets/select-PhPjIBBT.js +0 -1
  605. package/core/built/admin/assets/settings-D5P9Gwgo.js +0 -6
  606. package/core/built/admin/assets/settings-zUOzQV5I.js +0 -1
  607. package/core/built/admin/assets/share-modal-EfpfbuWF.js +0 -1
  608. package/core/built/admin/assets/social-urls-DgAF08Xc.js +0 -18
  609. package/core/built/admin/assets/sort-button-WOQYJm2H.js +0 -1
  610. package/core/built/admin/assets/source-icon-hm8Cj-Gx.js +0 -1
  611. package/core/built/admin/assets/stats-CnQDb62m.js +0 -1
  612. package/core/built/admin/assets/stats-view-CCfTJgSe.js +0 -1
  613. package/core/built/admin/assets/step-1-BGlhY4DS.js +0 -1
  614. package/core/built/admin/assets/step-2-D3sDEyFH.js +0 -1
  615. package/core/built/admin/assets/step-3-CvZoUdsc.js +0 -2
  616. package/core/built/admin/assets/switch-CNjkOmwz.js +0 -1
  617. package/core/built/admin/assets/table-C5nZYPnW.js +0 -1
  618. package/core/built/admin/assets/tabs-dtOcExye.js +0 -1
  619. package/core/built/admin/assets/tags-Dhm0FB_g.js +0 -1
  620. package/core/built/admin/assets/textarea-CeKw3wmV.js +0 -1
  621. package/core/built/admin/assets/toggle-group-DfhZIMTW.js +0 -1
  622. package/core/built/admin/assets/topic-filter-Cxe1Il41.js +0 -1
  623. package/core/built/admin/assets/typeof-Ca-duI-z.js +0 -1
  624. package/core/built/admin/assets/use-filter-params-Bub6BqNy.js +0 -1
  625. package/core/built/admin/assets/use-growth-stats-BJORomv0.js +0 -1
  626. package/core/built/admin/assets/use-reply-chain-data-B89YjVoo.js +0 -1
  627. package/core/built/admin/assets/use-simple-pagination-BL2SYXKi.js +0 -1
  628. package/core/built/admin/assets/virtual-list-DNJOSK9I.js +0 -1
  629. package/core/built/admin/assets/web-BHUE3YQc.js +0 -1
  630. package/core/server/adapters/scheduling/scheduling-base.js +0 -5
  631. package/core/server/adapters/sso/SSOBase.js +0 -5
  632. package/core/server/adapters/storage/index.js +0 -17
  633. package/core/server/services/mail/templates/newsletter.html +0 -876
  634. package/core/server/services/members/exporter/query.js +0 -206
  635. package/core/server/services/members/importer/index.js +0 -30
  636. package/core/server/services/members/importer/labels.js +0 -125
  637. package/core/server/services/members/importer/members-csv-importer.js +0 -502
  638. /package/core/server/services/members/{importer → import-export/import}/email-template.js +0 -0
  639. /package/core/server/services/members/{importer/members-csv-importer-stripe-utils.js → import-export/import/stripe-utils.js} +0 -0
@@ -1,22 +1,22 @@
1
1
  const request = require('@tryghost/request');
2
- const urlUtils = require('../../../shared/url-utils');
3
- const storage = require('../../adapters/storage');
2
+ const urlUtils = require('../../../shared/url-utils').default;
4
3
  const storageUtils = require('../../adapters/storage/utils');
5
4
  const validator = require('@tryghost/validator');
6
5
  const config = require('../../../shared/config');
7
6
  const settingsCache = require('../../../shared/settings-cache');
8
7
  const ImageUtils = require('./image-utils');
9
8
 
10
- const adapterManager = require('../../services/adapter-manager');
9
+ const adapterManager = require('../../services/adapter-manager').default;
11
10
 
12
11
  const cacheStore = adapterManager.getAdapter('cache:imageSizes');
12
+ const imageStore = adapterManager.getAdapter('storage:images');
13
13
 
14
14
  module.exports = new ImageUtils({
15
15
  config,
16
16
  urlUtils,
17
17
  settingsCache,
18
18
  storageUtils,
19
- storage,
19
+ imageStore,
20
20
  validator,
21
21
  request,
22
22
  cacheStore
@@ -1,10 +1,10 @@
1
1
  const path = require('path');
2
2
  const errors = require('@tryghost/errors');
3
- const urlUtils = require('../../shared/url-utils');
3
+ const urlUtils = require('../../shared/url-utils').default;
4
4
  const config = require('../../shared/config');
5
5
  const labs = require('../../shared/labs');
6
6
  const settingsCache = require('../../shared/settings-cache');
7
- const storage = require('../adapters/storage');
7
+ const adapterManager = require('../services/adapter-manager').default;
8
8
 
9
9
  let nodes;
10
10
  let lexicalHtmlRenderer;
@@ -50,7 +50,7 @@ function buildRenderOptions(userOptions) {
50
50
  // NOTE: the "saveRaw" check is smelly
51
51
  return imageTransform.canTransformFiles()
52
52
  && imageTransform.shouldResizeFileExtension(ext)
53
- && typeof storage.getStorage('images').saveRaw === 'function';
53
+ && typeof adapterManager.getAdapter('storage:images').saveRaw === 'function';
54
54
  },
55
55
  canTransformImageToFormat(format) {
56
56
  const imageTransform = require('@tryghost/image-transform');
@@ -1,6 +1,6 @@
1
1
  const path = require('path');
2
2
  const config = require('../../shared/config');
3
- const storage = require('../adapters/storage');
3
+ const adapterManager = require('../services/adapter-manager').default;
4
4
 
5
5
  let cardFactory;
6
6
  let cards;
@@ -37,7 +37,7 @@ module.exports = {
37
37
  // NOTE: the "saveRaw" check is smelly
38
38
  return imageTransform.canTransformFiles()
39
39
  && imageTransform.shouldResizeFileExtension(ext)
40
- && typeof storage.getStorage('images').saveRaw === 'function';
40
+ && typeof adapterManager.getAdapter('storage:images').saveRaw === 'function';
41
41
  }
42
42
  });
43
43
 
@@ -248,7 +248,7 @@ function installSafeDnsLookup(options) {
248
248
  const requestHref = options.url.href;
249
249
  // Use 'lookup' (the native http.request option) rather than 'dnsLookup'
250
250
  // (got's public API property which doesn't flow to the native request).
251
- options.lookup = (hostname, dnsOpts, callback) => {
251
+ options.dnsLookup = (hostname, dnsOpts, callback) => {
252
252
  if (typeof dnsOpts === 'function') {
253
253
  callback = dnsOpts;
254
254
  dnsOpts = {};
@@ -4,7 +4,7 @@ const validator = require('@tryghost/validator');
4
4
 
5
5
  const tpl = require('@tryghost/tpl');
6
6
  const settingsCache = require('../../shared/settings-cache');
7
- const urlUtils = require('../../shared/url-utils');
7
+ const urlUtils = require('../../shared/url-utils').default;
8
8
 
9
9
  const messages = {
10
10
  passwordDoesNotComplyLength: 'Your password must be at least {minLength} characters long.',
@@ -1,5 +1,12 @@
1
1
  const ghostBookshelf = require('./base');
2
2
 
3
+ // Member custom fields are owned by a raw-knex service rather than the Bookshelf
4
+ // registry. Actions still need a read model for `include=resource` to recognise
5
+ // their polymorphic resource type and load the current field definition.
6
+ const MemberCustomFieldResource = ghostBookshelf.Model.extend({
7
+ tableName: 'members_custom_fields'
8
+ });
9
+
3
10
  const Action = ghostBookshelf.Model.extend({
4
11
  tableName: 'actions',
5
12
 
@@ -18,6 +25,8 @@ const Action = ghostBookshelf.Model.extend({
18
25
  candidates.push([User, 'security_action']);
19
26
  }
20
27
 
28
+ candidates.push([MemberCustomFieldResource, 'member_custom_field']);
29
+
21
30
  return candidates;
22
31
  },
23
32
 
@@ -1,7 +1,7 @@
1
1
  const _ = require('lodash');
2
2
  const security = require('@tryghost/security');
3
3
 
4
- const urlUtils = require('../../../../shared/url-utils');
4
+ const urlUtils = require('../../../../shared/url-utils').default;
5
5
 
6
6
  /**
7
7
  * @type {Bookshelf} Bookshelf
@@ -1,5 +1,5 @@
1
1
  const ghostBookshelf = require('./base');
2
- const urlUtils = require('../../shared/url-utils');
2
+ const urlUtils = require('../../shared/url-utils').default;
3
3
 
4
4
  const Collection = ghostBookshelf.Model.extend({
5
5
  tableName: 'collections',
@@ -1,6 +1,6 @@
1
1
  const _ = require('lodash');
2
2
  const ghostBookshelf = require('./base');
3
- const urlUtils = require('../../shared/url-utils');
3
+ const urlUtils = require('../../shared/url-utils').default;
4
4
 
5
5
  const CustomThemeSetting = ghostBookshelf.Model.extend({
6
6
  tableName: 'custom_theme_settings',
@@ -4,6 +4,70 @@ const _ = require('lodash');
4
4
  const config = require('../../shared/config');
5
5
  const {MemberCommentingCodec} = require('../services/members/commenting');
6
6
 
7
+ const DEEP_OFFSET_THRESHOLD = 1000;
8
+
9
+ // The rewrite only applies to the plain single-table browse query. Joins,
10
+ // group by, unions etc. at the top level of the statement mean some other
11
+ // query shape — but the same keywords inside parens (NQL filters and search
12
+ // compile to `where members.id in (select ... join ...)`) are fine, so only
13
+ // depth-0 SQL is inspected. Bindings are `?` placeholders, so no user data
14
+ // appears in the inspected string.
15
+ function sqlOutsideParens(sql) {
16
+ let depth = 0;
17
+ let result = '';
18
+
19
+ for (const char of sql) {
20
+ if (char === '(') {
21
+ depth += 1;
22
+ } else if (char === ')') {
23
+ depth -= 1;
24
+ } else if (depth === 0) {
25
+ result += char;
26
+ }
27
+ }
28
+
29
+ return result;
30
+ }
31
+
32
+ // Deferred join for deep OFFSET pagination: plain LIMIT/OFFSET does a full
33
+ // row lookup for every discarded OFFSET row, so deep browse pages took ~10s
34
+ // on large sites. Instead, run LIMIT/OFFSET over a subquery selecting only
35
+ // the primary key (covered by the (created_at, id) index), then join back to
36
+ // fetch full rows for just the final page.
37
+ //
38
+ // The query is inspected via its compiled SQL (`qb.toSQL()`, public knex API)
39
+ // rather than knex's internal builder state. The prefix/suffix anchors below
40
+ // mean anything unexpected — custom selects, a lock clause, missing
41
+ // limit/offset — safely skips the rewrite.
42
+ function applyDeferredJoinForDeepOffset(qb) {
43
+ const {sql, bindings} = qb.toSQL();
44
+
45
+ // The plain browse query compiles to
46
+ // `select * from `members` [where ...] order by ... limit ? offset ?`;
47
+ // knex passes limit and offset as the last two bindings
48
+ if (!sql.startsWith('select * from `members`') || !sql.endsWith('limit ? offset ?')) {
49
+ return;
50
+ }
51
+
52
+ const offset = bindings[bindings.length - 1];
53
+
54
+ if (!Number.isInteger(offset) || offset < DEEP_OFFSET_THRESHOLD) {
55
+ return;
56
+ }
57
+
58
+ const topLevelSql = sqlOutsideParens(sql);
59
+ if ([' join ', ' group by ', ' having ', ' union '].some(keyword => topLevelSql.includes(keyword))) {
60
+ return;
61
+ }
62
+
63
+ // Aliased so the default raw browse order (`created_at DESC, id DESC`)
64
+ // stays unambiguous in the outer query
65
+ const idSubquery = qb.clone().select('members.id as deep_page_id');
66
+
67
+ qb.clear('where').clear('limit').clear('offset')
68
+ .innerJoin(idSubquery.as('deep_page'), 'members.id', 'deep_page.deep_page_id');
69
+ }
70
+
7
71
  const Member = ghostBookshelf.Model.extend({
8
72
  tableName: 'members',
9
73
 
@@ -357,6 +421,15 @@ const Member = ghostBookshelf.Model.extend({
357
421
  return result;
358
422
  },
359
423
 
424
+ // Fires with the fully-built knex query (filters/order/limit/offset
425
+ // applied, select columns not yet); the count query runs before this
426
+ // event, so pagination meta is unaffected by the rewrite
427
+ onFetchingCollection: function onFetchingCollection(collection, columns, options) {
428
+ ghostBookshelf.Model.prototype.onFetchingCollection.apply(this, arguments);
429
+
430
+ applyDeferredJoinForDeepOffset(options.query);
431
+ },
432
+
360
433
  onDestroyed: function onDestroyed(model, options) {
361
434
  const result = ghostBookshelf.Model.prototype.onDestroyed.apply(this, arguments);
362
435
 
@@ -1,7 +1,7 @@
1
1
  const ghostBookshelf = require('./base');
2
2
  const ObjectID = require('bson-objectid').default;
3
3
  const crypto = require('crypto');
4
- const urlUtils = require('../../shared/url-utils');
4
+ const urlUtils = require('../../shared/url-utils').default;
5
5
 
6
6
  const Newsletter = ghostBookshelf.Model.extend({
7
7
  tableName: 'newsletters',
@@ -14,7 +14,7 @@ const limitService = require('../services/limits');
14
14
  const mobiledocLib = require('../lib/mobiledoc');
15
15
  const lexicalLib = require('../lib/lexical');
16
16
  const relations = require('./relations');
17
- const urlUtils = require('../../shared/url-utils');
17
+ const urlUtils = require('../../shared/url-utils').default;
18
18
  const {Tag} = require('./tag');
19
19
  const {Newsletter} = require('./newsletter');
20
20
  const {BadRequestError} = require('@tryghost/errors');
@@ -950,15 +950,29 @@ Post = ghostBookshelf.Model.extend({
950
950
  },
951
951
 
952
952
  authors: function authors() {
953
+ // posts_authors.id breaks sort_order ties deterministically (by attach
954
+ // order); without it MySQL can order tied rows differently per query,
955
+ // which changes the computed primary_author. See tags() below.
956
+ // `id` is pivoted in so it is in the SELECT list — the query uses
957
+ // DISTINCT, which requires ORDER BY columns to be selected.
953
958
  return this.belongsToMany('User', 'posts_authors', 'post_id', 'author_id')
954
- .withPivot('sort_order')
955
- .query('orderBy', 'sort_order', 'ASC');
959
+ .withPivot(['sort_order', 'id'])
960
+ .query('orderBy', 'sort_order', 'ASC')
961
+ .query('orderBy', 'posts_authors.id', 'ASC');
956
962
  },
957
963
 
958
964
  tags: function tags() {
965
+ // posts_tags.id breaks sort_order ties deterministically (by attach
966
+ // order). primary_tag is tags[0]-if-public, so a non-deterministic tie
967
+ // order (which MySQL produces for tags sharing a sort_order) makes the
968
+ // primary tag — and the post's URL under a {primary_tag} permalink —
969
+ // depend on the query shape.
970
+ // `id` is pivoted in so it is in the SELECT list — the query uses
971
+ // DISTINCT, which requires ORDER BY columns to be selected.
959
972
  return this.belongsToMany('Tag', 'posts_tags', 'post_id', 'tag_id')
960
- .withPivot('sort_order')
961
- .query('orderBy', 'sort_order', 'ASC');
973
+ .withPivot(['sort_order', 'id'])
974
+ .query('orderBy', 'sort_order', 'ASC')
975
+ .query('orderBy', 'posts_tags.id', 'ASC');
962
976
  },
963
977
 
964
978
  mobiledoc_revisions() {
@@ -1,5 +1,5 @@
1
1
  const ghostBookshelf = require('./base');
2
- const urlUtils = require('../../shared/url-utils');
2
+ const urlUtils = require('../../shared/url-utils').default;
3
3
 
4
4
  const PostsMeta = ghostBookshelf.Model.extend({
5
5
  tableName: 'posts_meta',
@@ -1,5 +1,5 @@
1
1
  const ghostBookshelf = require('./base');
2
- const urlUtils = require('../../shared/url-utils');
2
+ const urlUtils = require('../../shared/url-utils').default;
3
3
 
4
4
  const Redirect = ghostBookshelf.Model.extend({
5
5
  tableName: 'redirects',
@@ -6,7 +6,7 @@ const ghostBookshelf = require('./base');
6
6
  const tpl = require('@tryghost/tpl');
7
7
  const errors = require('@tryghost/errors');
8
8
  const validator = require('@tryghost/validator');
9
- const urlUtils = require('../../shared/url-utils');
9
+ const urlUtils = require('../../shared/url-utils').default;
10
10
  const {WRITABLE_KEYS_ALLOWLIST} = require('../../shared/labs');
11
11
  const {getOrGenerateSiteUuid} = require('../services/settings/settings-utils');
12
12
 
@@ -1,5 +1,5 @@
1
1
  const ghostBookshelf = require('./base');
2
- const urlUtils = require('../../shared/url-utils');
2
+ const urlUtils = require('../../shared/url-utils').default;
3
3
  const mobiledocLib = require('../lib/mobiledoc');
4
4
  const lexicalLib = require('../lib/lexical');
5
5
  const _ = require('lodash');
@@ -1,7 +1,7 @@
1
1
  const ghostBookshelf = require('./base');
2
2
  const tpl = require('@tryghost/tpl');
3
3
  const errors = require('@tryghost/errors');
4
- const urlUtils = require('../../shared/url-utils');
4
+ const urlUtils = require('../../shared/url-utils').default;
5
5
 
6
6
  const messages = {
7
7
  tagNotFound: 'Tag not found.'
@@ -6,10 +6,9 @@ const limitService = require('../services/limits');
6
6
  const tpl = require('@tryghost/tpl');
7
7
  const errors = require('@tryghost/errors');
8
8
  const security = require('@tryghost/security');
9
- const {pipeline} = require('@tryghost/promise');
10
9
  const validatePassword = require('../lib/validate-password');
11
10
  const permissions = require('../services/permissions');
12
- const urlUtils = require('../../shared/url-utils');
11
+ const urlUtils = require('../../shared/url-utils').default;
13
12
  const {setIsRoles} = require('./role-utils');
14
13
  const activeStates = ['active', 'warn-1', 'warn-2', 'warn-3', 'warn-4'];
15
14
  const ASSIGNABLE_ROLES = ['Administrator', 'Super Editor', 'Editor', 'Author', 'Contributor'];
@@ -572,91 +571,68 @@ User = ghostBookshelf.Model.extend({
572
571
  * @extends ghostBookshelf.Model.edit to handle returning the full object
573
572
  * **See:** [ghostBookshelf.Model.edit](base.js.html#edit)
574
573
  */
575
- edit: function edit(data, unfilteredOptions) {
574
+ edit: async function edit(data, unfilteredOptions) {
576
575
  const options = this.filterOptions(unfilteredOptions, 'edit');
577
576
  const self = this;
578
- const ops = [];
579
577
 
580
578
  if (data.roles && data.roles.length > 1) {
581
- return Promise.reject(
582
- new errors.ValidationError({
583
- message: tpl(messages.onlyOneRolePerUserSupported)
584
- })
585
- );
579
+ throw new errors.ValidationError({
580
+ message: tpl(messages.onlyOneRolePerUserSupported)
581
+ });
586
582
  }
587
583
 
588
584
  if (data.email) {
589
- ops.push(function checkForDuplicateEmail() {
590
- return self.getByEmail(data.email, options).then(function then(user) {
591
- if (user && user.id !== options.id) {
592
- return Promise.reject(new errors.ValidationError({
593
- message: tpl(messages.userUpdateError.emailIsAlreadyInUse)
594
- }));
595
- }
585
+ const existingUser = await self.getByEmail(data.email, options);
586
+ if (existingUser && existingUser.id !== options.id) {
587
+ throw new errors.ValidationError({
588
+ message: tpl(messages.userUpdateError.emailIsAlreadyInUse)
596
589
  });
597
- });
590
+ }
598
591
  }
599
592
 
600
- ops.push(function update() {
601
- return ghostBookshelf.Model.edit.call(self, data, options).then(async (user) => {
602
- let roleId;
593
+ const user = await ghostBookshelf.Model.edit.call(self, data, options);
603
594
 
604
- if (!data.roles || !data.roles.length) {
605
- return user;
606
- }
607
-
608
- roleId = data.roles[0].id || data.roles[0];
609
-
610
- return user.roles().fetch().then((roles) => {
611
- // return if the role is already assigned
612
- if (roles.models[0].id === roleId) {
613
- return;
614
- }
595
+ if (!data.roles || !data.roles.length) {
596
+ return user;
597
+ }
615
598
 
616
- if (ASSIGNABLE_ROLES.includes(roleId)) {
617
- // return if the role is already assigned
618
- if (roles.models[0].get('name') === roleId) {
619
- return;
620
- }
599
+ const roleId = data.roles[0].id || data.roles[0];
600
+ const roles = await user.roles().fetch();
601
+ let roleToAssign;
621
602
 
622
- return ghostBookshelf.model('Role').findOne({
623
- name: roleId
624
- });
625
- } else if (ObjectId.isValid(roleId)){
626
- return ghostBookshelf.model('Role').findOne({
627
- id: roleId
628
- });
629
- } else {
630
- return Promise.reject(
631
- new errors.ValidationError({
632
- message: tpl(messages.invalidRoleValue.message),
633
- context: tpl(messages.invalidRoleValue.context),
634
- help: tpl(messages.invalidRoleValue.help)
635
- })
636
- );
637
- }
638
- }).then((roleToAssign) => {
639
- if (roleToAssign && roleToAssign.get('name') === 'Owner') {
640
- return Promise.reject(
641
- new errors.ValidationError({
642
- message: tpl(messages.methodDoesNotSupportOwnerRole)
643
- })
644
- );
645
- } else if (roleToAssign) {
646
- // assign all other roles
647
- return user.roles().updatePivot({role_id: roleToAssign.id});
648
- }
649
- }).then(() => {
650
- options.status = 'all';
651
- return self.findOne({id: user.id}, options);
652
- }).then((model) => {
653
- model._changed = user._changed;
654
- return model;
603
+ if (roles.models[0].id !== roleId) {
604
+ if (ASSIGNABLE_ROLES.includes(roleId)) {
605
+ if (roles.models[0].get('name') !== roleId) {
606
+ roleToAssign = await ghostBookshelf.model('Role').findOne({
607
+ name: roleId
608
+ });
609
+ }
610
+ } else if (ObjectId.isValid(roleId)) {
611
+ roleToAssign = await ghostBookshelf.model('Role').findOne({
612
+ id: roleId
655
613
  });
614
+ } else {
615
+ throw new errors.ValidationError({
616
+ message: tpl(messages.invalidRoleValue.message),
617
+ context: tpl(messages.invalidRoleValue.context),
618
+ help: tpl(messages.invalidRoleValue.help)
619
+ });
620
+ }
621
+ }
622
+
623
+ if (roleToAssign && roleToAssign.get('name') === 'Owner') {
624
+ throw new errors.ValidationError({
625
+ message: tpl(messages.methodDoesNotSupportOwnerRole)
656
626
  });
657
- });
627
+ } else if (roleToAssign) {
628
+ // assign all other roles
629
+ await user.roles().updatePivot({role_id: roleToAssign.id});
630
+ }
658
631
 
659
- return pipeline(ops);
632
+ options.status = 'all';
633
+ const model = await self.findOne({id: user.id}, options);
634
+ model._changed = user._changed;
635
+ return model;
660
636
  },
661
637
 
662
638
  /**
@@ -1,6 +1,6 @@
1
1
  const ghostBookshelf = require('./base');
2
2
  const errors = require('@tryghost/errors');
3
- const urlUtils = require('../../shared/url-utils');
3
+ const urlUtils = require('../../shared/url-utils').default;
4
4
  const lexicalLib = require('../lib/lexical');
5
5
  const {DEFAULT_EMAIL_DESIGN_SETTING_SLUG} = require('../services/member-welcome-emails/constants');
6
6
 
@@ -14,7 +14,7 @@ module.exports = class ActivityPubServiceWrapper {
14
14
  const logging = require('@tryghost/logging');
15
15
  const events = require('../../lib/common/events');
16
16
  const {knex} = require('../../data/db');
17
- const urlUtils = require('../../../shared/url-utils');
17
+ const urlUtils = require('../../../shared/url-utils').default;
18
18
  const IdentityTokenServiceWrapper = require('../identity-tokens');
19
19
  const settingsCache = require('../../../shared/settings-cache');
20
20
 
@@ -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;