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
@@ -1,5 +1,6 @@
1
1
  const path = require('path');
2
- const storage = require('../../adapters/storage');
2
+
3
+ const adapterManager = require('../../services/adapter-manager').default;
3
4
 
4
5
  /** @type {import('@tryghost/api-framework').Controller} */
5
6
  const controller = {
@@ -11,12 +12,14 @@ const controller = {
11
12
  },
12
13
  permissions: false,
13
14
  async query(frame) {
15
+ const storage = adapterManager.getAdapter('storage:media');
16
+
14
17
  let thumbnailPath = null;
15
18
  if (frame.files.thumbnail && frame.files.thumbnail[0]) {
16
- thumbnailPath = await storage.getStorage('media').save(frame.files.thumbnail[0]);
19
+ thumbnailPath = await storage.save(frame.files.thumbnail[0]);
17
20
  }
18
21
 
19
- const filePath = await storage.getStorage('media').save(frame.files.file[0]);
22
+ const filePath = await storage.save(frame.files.file[0]);
20
23
 
21
24
  return {
22
25
  filePath,
@@ -35,12 +38,12 @@ const controller = {
35
38
  'ref'
36
39
  ],
37
40
  async query(frame) {
38
- const mediaStorage = storage.getStorage('media');
41
+ const mediaStorage = adapterManager.getAdapter('storage:media');
39
42
  const targetDir = path.dirname(mediaStorage.urlToPath(frame.data.url));
40
43
 
41
44
  // NOTE: need to cleanup otherwise the parent media name won't match thumb name
42
45
  // due to "unique name" generation during save
43
- if (mediaStorage.exists(frame.file.name, targetDir)) {
46
+ if (await mediaStorage.exists(frame.file.name, targetDir)) {
44
47
  await mediaStorage.delete(frame.file.name, targetDir);
45
48
  }
46
49
 
@@ -53,8 +53,11 @@ const controller = {
53
53
  permissions(frame) {
54
54
  return canThis(frame).add.member_custom_field();
55
55
  },
56
+ // The whole array is passed through: create is a batch, applied
57
+ // all-or-nothing. A client sending a single definition (as Admin does)
58
+ // is just the one-item case and sees no change.
56
59
  query(frame) {
57
- return members_custom_fields_1.definitions.add(requestContextFromFrame(frame), frame.data.members_custom_fields[0]);
60
+ return members_custom_fields_1.definitions.add(requestContextFromFrame(frame), frame.data.members_custom_fields);
58
61
  }
59
62
  },
60
63
  edit: {
@@ -67,8 +67,11 @@ const controller = {
67
67
  permissions(frame: Frame) {
68
68
  return canThis(frame).add.member_custom_field();
69
69
  },
70
+ // The whole array is passed through: create is a batch, applied
71
+ // all-or-nothing. A client sending a single definition (as Admin does)
72
+ // is just the one-item case and sees no change.
70
73
  query(frame: Frame) {
71
- return definitions!.add(requestContextFromFrame(frame), frame.data.members_custom_fields[0]);
74
+ return definitions!.add(requestContextFromFrame(frame), frame.data.members_custom_fields);
72
75
  }
73
76
  },
74
77
 
@@ -1,4 +1,4 @@
1
- const urlUtils = require('../../../shared/url-utils');
1
+ const urlUtils = require('../../../shared/url-utils').default;
2
2
  const models = require('../../models');
3
3
  const {getCSVExportFileName} = require('./utils/csv-export-filename');
4
4
  const getPostServiceInstance = require('../../services/posts/posts-service-instance');
@@ -113,6 +113,22 @@ const controller = {
113
113
  }
114
114
  },
115
115
 
116
+ importCSV: {
117
+ statusCode: 202,
118
+ headers: {
119
+ cacheInvalidate: false
120
+ },
121
+ permissions: {
122
+ docName: 'content_imports',
123
+ method: 'importContent'
124
+ },
125
+ async query() {
126
+ // CSV processing lands in a later milestone — for now the endpoint
127
+ // only accepts the upload (gated by the csvContentImporter flag)
128
+ return {};
129
+ }
130
+ },
131
+
116
132
  read: {
117
133
  headers: {
118
134
  cacheInvalidate: false
@@ -1,5 +1,6 @@
1
1
  const models = require('../../models');
2
2
  const urlService = require('../../services/url');
3
+ const {requiredUrlColumns} = require('./utils/serializers/input/utils/url');
3
4
  const getPostServiceInstance = require('../../services/posts/posts-service-instance');
4
5
  const postsService = getPostServiceInstance();
5
6
 
@@ -21,7 +22,7 @@ const controller = {
21
22
  filter: 'type:post',
22
23
  limit: '10000',
23
24
  order: 'updated_at DESC',
24
- columns: ['id', 'slug', 'title', 'excerpt', 'url', 'updated_at', 'visibility'],
25
+ columns: requiredUrlColumns('posts', ['id', 'slug', 'title', 'excerpt', 'url', 'updated_at', 'visibility']),
25
26
  ...urlRelationsWhenLazyRouting()
26
27
  };
27
28
 
@@ -37,7 +38,7 @@ const controller = {
37
38
  const options = {
38
39
  limit: '10000',
39
40
  order: 'updated_at DESC',
40
- columns: ['id', 'slug', 'name', 'url', 'profile_image']
41
+ columns: requiredUrlColumns('authors', ['id', 'slug', 'name', 'url', 'profile_image'])
41
42
  };
42
43
 
43
44
  return models.Author.findPage(options);
@@ -52,7 +53,7 @@ const controller = {
52
53
  const options = {
53
54
  limit: '10000',
54
55
  order: 'updated_at DESC',
55
- columns: ['id', 'slug', 'name', 'url'],
56
+ columns: requiredUrlColumns('tags', ['id', 'slug', 'name', 'url']),
56
57
  filter: 'visibility:public'
57
58
  };
58
59
 
@@ -1,5 +1,6 @@
1
1
  const models = require('../../models');
2
2
  const urlService = require('../../services/url');
3
+ const {requiredUrlColumns} = require('./utils/serializers/input/utils/url');
3
4
  const getPostServiceInstance = require('../../services/posts/posts-service-instance');
4
5
  const postsService = getPostServiceInstance();
5
6
 
@@ -24,7 +25,7 @@ const controller = {
24
25
  filter: 'type:post+status:[draft,published,scheduled,sent]',
25
26
  limit: '10000',
26
27
  order: 'updated_at DESC',
27
- columns: ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility'],
28
+ columns: requiredUrlColumns('posts', ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility']),
28
29
  ...urlRelationsWhenLazyRouting()
29
30
  };
30
31
 
@@ -44,7 +45,7 @@ const controller = {
44
45
  filter: 'type:page+status:[draft,published,scheduled]',
45
46
  limit: '10000',
46
47
  order: 'updated_at DESC',
47
- columns: ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility'],
48
+ columns: requiredUrlColumns('pages', ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility']),
48
49
  ...urlRelationsWhenLazyRouting()
49
50
  };
50
51
 
@@ -63,7 +64,7 @@ const controller = {
63
64
  const options = {
64
65
  limit: '10000',
65
66
  order: 'updated_at DESC',
66
- columns: ['id', 'slug', 'name', 'url']
67
+ columns: requiredUrlColumns('tags', ['id', 'slug', 'name', 'url'])
67
68
  };
68
69
 
69
70
  return models.Tag.findPage(options);
@@ -81,7 +82,7 @@ const controller = {
81
82
  const options = {
82
83
  limit: '10000',
83
84
  order: 'updated_at DESC',
84
- columns: ['id', 'slug', 'url', 'name', 'profile_image']
85
+ columns: requiredUrlColumns('authors', ['id', 'slug', 'url', 'name', 'profile_image'])
85
86
  };
86
87
 
87
88
  return models.User.findPage(options);
@@ -1,6 +1,6 @@
1
1
  const settingsCache = require('../../../shared/settings-cache');
2
2
  const labs = require('../../../shared/labs');
3
- const urlUtils = require('../../../shared/url-utils');
3
+ const urlUtils = require('../../../shared/url-utils').default;
4
4
  const ghostVersion = require('@tryghost/version');
5
5
 
6
6
  /** @type {import('@tryghost/api-framework').Controller} */
@@ -1,4 +1,5 @@
1
1
  const _ = require('lodash');
2
+ const fs = require('fs-extra');
2
3
  const models = require('../../models');
3
4
  const routeSettings = require('../../services/route-settings');
4
5
  const {BadRequestError} = require('@tryghost/errors');
@@ -171,7 +172,8 @@ const controller = {
171
172
  method: 'edit'
172
173
  },
173
174
  async query(frame) {
174
- await routeSettings.api.upload(frame.file.path);
175
+ const content = await fs.readFile(frame.file.path, 'utf8');
176
+ await routeSettings.api.upload(content);
175
177
  const getRoutesHash = () => routeSettings.api.getCurrentHash();
176
178
  await settingsService.syncRoutesHash(getRoutesHash);
177
179
  }
@@ -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
  const localUtils = require('../../../index');
4
4
 
@@ -108,7 +108,15 @@ const forceUrlRelationsWhenLazy = (frame, routerType) => {
108
108
  forceUrlColumnsWhenLazy(frame, routerType);
109
109
  };
110
110
 
111
+ // Options-object variant of forceUrlColumnsWhenLazy for endpoints that build
112
+ // their query options directly (search index).
113
+ const requiredUrlColumns = (routerType, columns) => {
114
+ const required = urlService.facade.getRequiredFields(routerType).filter(field => !columns.includes(field));
115
+ return required.length ? [...columns, ...required] : columns;
116
+ };
117
+
111
118
  module.exports.forPost = forPost;
119
+ module.exports.requiredUrlColumns = requiredUrlColumns;
112
120
  module.exports.forUser = forUser;
113
121
  module.exports.forTag = forTag;
114
122
  module.exports.forSetting = forSetting;
@@ -12,6 +12,13 @@ const mapResponse = (docName, mappable, frame) => {
12
12
  };
13
13
 
14
14
  module.exports = {
15
+ // 204 No Content — see posts.js destroy
16
+ destroy(response, apiConfig, frame) {
17
+ debug('destroy', apiConfig.docName);
18
+
19
+ frame.response = {[apiConfig.docName]: []};
20
+ },
21
+
15
22
  all(response, apiConfig, frame) {
16
23
  const {docName, method} = apiConfig;
17
24
  debug('serializing', docName, method);
@@ -1,5 +1,5 @@
1
1
  const config = require('../../../../../../shared/config');
2
- const urlUtils = require('../../../../../../shared/url-utils');
2
+ const urlUtils = require('../../../../../../shared/url-utils').default;
3
3
 
4
4
  function getURL(urlPath) {
5
5
  const media = new RegExp('^' + config.getSubdir() + '/' + urlUtils.STATIC_FILES_URL_PREFIX);
@@ -1,5 +1,5 @@
1
1
  const config = require('../../../../../../shared/config');
2
- const urlUtils = require('../../../../../../shared/url-utils');
2
+ const urlUtils = require('../../../../../../shared/url-utils').default;
3
3
 
4
4
  function getURL(urlPath) {
5
5
  const media = new RegExp('^' + config.getSubdir() + '/' + urlUtils.STATIC_MEDIA_URL_PREFIX);
@@ -4,13 +4,16 @@ const serializers_1 = require("../../../../../services/members-custom-fields/ser
4
4
  const serializeOne = (field, _apiConfig, frame) => {
5
5
  frame.response = serializers_1.toCustomFieldsResponse.parse([field]);
6
6
  };
7
+ const serializeMany = (fields, _apiConfig, frame) => {
8
+ frame.response = serializers_1.toCustomFieldsResponse.parse(fields);
9
+ };
7
10
  // module.exports (not export): the API framework loads serializers via require(). The endpoint ->
8
11
  // serializer mapping lives here; the response shaping lives with the members-custom-fields service.
9
12
  module.exports = {
10
- browse(fields, _apiConfig, frame) {
11
- frame.response = serializers_1.toCustomFieldsResponse.parse(fields);
12
- },
13
+ browse: serializeMany,
13
14
  read: serializeOne,
14
- add: serializeOne,
15
+ // Create is a batch, so it returns every definition it made. The response is
16
+ // already an array, so a one-item create looks exactly as it did before.
17
+ add: serializeMany,
15
18
  edit: serializeOne
16
19
  };
@@ -9,13 +9,17 @@ const serializeOne = (field: CustomField, _apiConfig: unknown, frame: Frame): vo
9
9
  frame.response = toCustomFieldsResponse.parse([field]);
10
10
  };
11
11
 
12
+ const serializeMany = (fields: CustomField[], _apiConfig: unknown, frame: Frame): void => {
13
+ frame.response = toCustomFieldsResponse.parse(fields);
14
+ };
15
+
12
16
  // module.exports (not export): the API framework loads serializers via require(). The endpoint ->
13
17
  // serializer mapping lives here; the response shaping lives with the members-custom-fields service.
14
18
  module.exports = {
15
- browse(fields: CustomField[], _apiConfig: unknown, frame: Frame): void {
16
- frame.response = toCustomFieldsResponse.parse(fields);
17
- },
19
+ browse: serializeMany,
18
20
  read: serializeOne,
19
- add: serializeOne,
21
+ // Create is a batch, so it returns every definition it made. The response is
22
+ // already an array, so a one-item create looks exactly as it did before.
23
+ add: serializeMany,
20
24
  edit: serializeOne
21
25
  };
@@ -1,7 +1,7 @@
1
1
  //@ts-check
2
2
  const _ = require('lodash');
3
3
  const debug = require('@tryghost/debug')('api:endpoints:utils:serializers:output:members');
4
- const {unparse} = require('@tryghost/members-csv');
4
+ const {unparse} = require('../../../../../services/members/csv');
5
5
  const mappers = require('./mappers');
6
6
  const {Transform} = require('stream');
7
7
  const papaparse = require('papaparse');
@@ -25,22 +25,6 @@ module.exports = {
25
25
  activityFeed: createSerializer('activityFeed', activityFeed)
26
26
  };
27
27
 
28
- // Columns to export in CSV
29
- const CSV_HEADERS = [
30
- 'id',
31
- 'email',
32
- 'name',
33
- 'note',
34
- 'subscribed_to_emails',
35
- 'complimentary_plan',
36
- 'stripe_customer_id',
37
- 'created_at',
38
- 'deleted_at',
39
- 'labels',
40
- 'tiers',
41
- 'gift_id'
42
- ];
43
-
44
28
  /**
45
29
  * Formats a single member for CSV export
46
30
  * @param {Object} member - Member object
@@ -84,7 +68,10 @@ function formatMemberForCSV(member) {
84
68
  deleted_at: member.deleted_at || null,
85
69
  labels: labels,
86
70
  tiers: tiers,
87
- gift_id: giftId
71
+ gift_id: giftId,
72
+ // The exporter flattens custom field values into their CSV columns, since
73
+ // which columns exist is a per-site question only the database can answer.
74
+ ...member.custom_field_cells
88
75
  };
89
76
  }
90
77
 
@@ -429,38 +416,41 @@ function serializeNewsletters(newsletters) {
429
416
  * @returns {Transform} Transform stream that converts objects to CSV
430
417
  */
431
418
  function createCSVTransform() {
432
- let isFirstChunk = true;
433
-
419
+ // Locked in from the first row rather than declared up front: custom fields
420
+ // add a column per site, so the column set isn't known until a row arrives.
421
+ // Every row carries the same keys, so the first is representative.
422
+ let fields = null;
423
+
434
424
  return new Transform({
435
425
  objectMode: true,
436
426
  transform(member, encoding, callback) {
437
427
  try {
438
428
  // Format the member data for CSV
439
429
  const formattedMember = formatMemberForCSV(member);
440
-
430
+
441
431
  // For first chunk, include the headers
442
- if (isFirstChunk) {
432
+ if (fields === null) {
433
+ fields = Object.keys(formattedMember);
443
434
  const csv = papaparse.unparse({
444
- fields: CSV_HEADERS,
435
+ fields,
445
436
  data: [formattedMember]
446
437
  }, {
447
438
  header: true,
448
439
  escapeFormulae: true,
449
440
  newline: '\r\n' // Explicitly set Windows-style line endings for compatibility
450
441
  });
451
- isFirstChunk = false;
452
442
  callback(null, csv);
453
443
  } else {
454
444
  // For subsequent chunks, don't include headers, just the data
455
445
  const csv = papaparse.unparse({
456
- fields: CSV_HEADERS,
446
+ fields,
457
447
  data: [formattedMember]
458
448
  }, {
459
449
  header: false,
460
450
  escapeFormulae: true,
461
451
  newline: '\r\n' // Explicitly set Windows-style line endings for compatibility
462
452
  });
463
-
453
+
464
454
  // Make sure each row starts with a newline to ensure separation between rows
465
455
  // Ensure consistent line endings by using explicit CR+LF sequence
466
456
  callback(null, '\r\n' + csv.replace(/^\r?\n+/, ''));
@@ -3,6 +3,13 @@ const mappers = require('./mappers');
3
3
  const tiersService = require('../../../../../services/tiers');
4
4
 
5
5
  module.exports = {
6
+ // 204 No Content — see posts.js destroy
7
+ destroy(models, apiConfig, frame) {
8
+ debug('destroy');
9
+
10
+ frame.response = {pages: []};
11
+ },
12
+
6
13
  async all(models, apiConfig, frame) {
7
14
  debug('all');
8
15
 
@@ -5,6 +5,15 @@ const {createCSVTransform} = require('./posts-csv-transform');
5
5
  const {createCSVStreamResponse} = require('./stream-csv-response');
6
6
 
7
7
  module.exports = {
8
+ // 204 No Content — bookshelf clears the destroyed model's attributes
9
+ // (only relations remain), so there is nothing serializable left and
10
+ // computing its URL would hand the URL service a relations-only resource.
11
+ destroy(models, apiConfig, frame) {
12
+ debug('destroy');
13
+
14
+ frame.response = {posts: []};
15
+ },
16
+
8
17
  async all(models, apiConfig, frame) {
9
18
  debug('all');
10
19
 
@@ -62,6 +71,10 @@ module.exports = {
62
71
  });
63
72
  },
64
73
 
74
+ importCSV(result, apiConfig, frame) {
75
+ frame.response = result;
76
+ },
77
+
65
78
  bulkEdit(bulkActionResult, _apiConfig, frame) {
66
79
  frame.response = {
67
80
  bulk: {
@@ -1,5 +1,5 @@
1
1
  const urlService = require('../../../../../../services/url');
2
- const urlUtils = require('../../../../../../../shared/url-utils');
2
+ const urlUtils = require('../../../../../../../shared/url-utils').default;
3
3
  const localUtils = require('../../../index');
4
4
 
5
5
  const forPost = (id, attrs, frame, type = 'posts') => {
@@ -1,56 +1,6 @@
1
- const errors = require('@tryghost/errors');
2
1
  const jsonSchema = require('../utils/json-schema');
3
- const labs = require('../../../../../../shared/labs');
4
-
5
- // The members JSON schemas live in @tryghost/admin-api-schema and set
6
- // `additionalProperties: false`, so ajv strips `custom_fields` out of the body
7
- // before it reaches the service — silently, with no error to explain where the
8
- // values went. Stash the key across validation and restore it afterwards, so
9
- // values can ride the member body while the rest of it stays schema-validated.
10
- //
11
- // Gated on the flag: with the flag off, the key is stripped exactly as it is
12
- // today. The lasting fix is declaring `custom_fields` in the schema package
13
- // upstream, which is a separate release; this holds the seam until then.
14
- function preserveCustomFields(validate) {
15
- return async function validateWithCustomFields(apiConfig, frame) {
16
- if (!labs.isSet('membersCustomFields') || !Array.isArray(frame.data.members)) {
17
- return validate(apiConfig, frame);
18
- }
19
-
20
- const stashed = frame.data.members.map(member => member && member.custom_fields);
21
-
22
- await validate(apiConfig, frame);
23
-
24
- frame.data.members.forEach((member, index) => {
25
- if (member && stashed[index] !== undefined) {
26
- member.custom_fields = stashed[index];
27
- }
28
- });
29
- };
30
- }
31
-
32
- // Setting values while *creating* a member is a later vertical, not this one. On
33
- // add, ajv would silently strip `custom_fields` (a value that appears to vanish),
34
- // so reject it explicitly instead — the gap is then legible rather than a mystery.
35
- // Flag-gated, so with the flag off the key is stripped exactly as before.
36
- function rejectCustomFieldsOnAdd(validate) {
37
- return function validateWithoutCustomFields(apiConfig, frame) {
38
- const hasCustomFields = labs.isSet('membersCustomFields')
39
- && Array.isArray(frame.data.members)
40
- && frame.data.members.some(member => member && member.custom_fields !== undefined);
41
-
42
- if (hasCustomFields) {
43
- throw new errors.ValidationError({
44
- message: 'Custom field values cannot be set while creating a member. Create the member, then set values with an edit.',
45
- property: 'custom_fields'
46
- });
47
- }
48
-
49
- return validate(apiConfig, frame);
50
- };
51
- }
52
2
 
53
3
  module.exports = {
54
- add: rejectCustomFieldsOnAdd(jsonSchema.validate),
55
- edit: preserveCustomFields(jsonSchema.validate)
4
+ add: jsonSchema.validate,
5
+ edit: jsonSchema.validate
56
6
  };
@@ -5,7 +5,7 @@ const fs = require('fs-extra');
5
5
  const path = require('path');
6
6
  const config = require('../../../shared/config');
7
7
  const logging = require('@tryghost/logging');
8
- const urlUtils = require('../../../shared/url-utils');
8
+ const urlUtils = require('../../../shared/url-utils').default;
9
9
  const exporter = require('../exporter');
10
10
 
11
11
  /**
@@ -1,8 +1,8 @@
1
1
  const _ = require('lodash');
2
2
  const path = require('path');
3
3
  const config = require('../../../../shared/config');
4
- const urlUtils = require('../../../../shared/url-utils');
5
- const storage = require('../../../adapters/storage');
4
+ const urlUtils = require('../../../../shared/url-utils').default;
5
+ const adapterManager = require('../../../services/adapter-manager').default;
6
6
  let ImageHandler;
7
7
 
8
8
  ImageHandler = {
@@ -12,7 +12,7 @@ ImageHandler = {
12
12
  directories: ['images', 'content'],
13
13
 
14
14
  loadFile: function (files, baseDir) {
15
- const store = storage.getStorage('images');
15
+ const store = adapterManager.getAdapter('storage:images');
16
16
  const baseDirRegex = baseDir ? new RegExp('^' + baseDir + '/') : new RegExp('');
17
17
 
18
18
  const imageFolderRegexes = _.map(store.staticFileURLPrefix.split('/'), function (dir) {
@@ -18,12 +18,14 @@ const MarkdownHandler = require('./handlers/markdown');
18
18
  const ContentFileImporter = require('./importers/content-file-importer');
19
19
  const RevueImporter = require('./importers/importer-revue');
20
20
  const DataImporter = require('./importers/data');
21
- const urlUtils = require('../../../shared/url-utils');
21
+ const urlUtils = require('../../../shared/url-utils').default;
22
22
  const {GhostMailer} = require('../../services/mail');
23
23
  const jobManager = require('../../services/jobs');
24
- const mediaStorage = require('../../adapters/storage').getStorage('media');
25
- const imageStorage = require('../../adapters/storage').getStorage('images');
26
- const fileStorage = require('../../adapters/storage').getStorage('files');
24
+ const adapterManager = require('../../services/adapter-manager').default;
25
+
26
+ const mediaStorage = adapterManager.getAdapter('storage:media');
27
+ const imageStorage = adapterManager.getAdapter('storage:images');
28
+ const fileStorage = adapterManager.getAdapter('storage:files');
27
29
 
28
30
  const {emailTemplate} = require('./email-template');
29
31
  const ghostMailer = new GhostMailer();
@@ -57,14 +57,14 @@ class ContentFileImporter {
57
57
  /** @property {string} */
58
58
  type;
59
59
 
60
- /** @property {import('ghost-storage-base')} */
60
+ /** @property {import('ghost-storage-base').StorageBase} */
61
61
  #store;
62
62
 
63
63
  /**
64
64
  *
65
65
  * @param {Object} deps
66
66
  * @param {'images' | 'media' | 'files'} deps.type - importer type
67
- * @param {import('ghost-storage-base')} deps.store
67
+ * @param {import('ghost-storage-base').StorageBase} deps.store
68
68
  */
69
69
  constructor(deps) {
70
70
  this.type = deps.type;
@@ -191,12 +191,14 @@ function createSetNullableMigration(table, column, options = {}) {
191
191
  /**
192
192
  * @param {string} table
193
193
  * @param {string[]|string} columns One or multiple columns (in case the index should be for multiple columns)
194
+ * @param {object} [options]
195
+ * @param {number} [options.length] MySQL only: create a prefix index of this many characters
194
196
  * @returns {Migration}
195
197
  */
196
- function createAddIndexMigration(table, columns) {
198
+ function createAddIndexMigration(table, columns, options = {}) {
197
199
  return createTransactionalMigration(
198
200
  async function up(knex) {
199
- await commands.addIndex(table, columns, knex);
201
+ await commands.addIndex(table, columns, knex, options);
200
202
  },
201
203
  async function down(knex) {
202
204
  await commands.dropIndex(table, columns, knex);
@@ -0,0 +1,10 @@
1
+ const {addPermissionWithRoles} = require('../../utils');
2
+
3
+ // Content import (the CSV posts importer) is restricted to Administrators
4
+ // (the Owner bypasses permission checks) and the self-serve migrator's
5
+ // integration, mirroring the existing db importContent permissions.
6
+ module.exports = addPermissionWithRoles({
7
+ name: 'Import content',
8
+ action: 'importContent',
9
+ object: 'content_import'
10
+ }, ['Administrator', 'Self-Serve Migration Integration']);
@@ -0,0 +1,7 @@
1
+ const {createDropColumnMigration} = require('../../utils');
2
+
3
+ module.exports = createDropColumnMigration('automation_action_revisions', 'email_tracked_sent_count', {
4
+ type: 'integer',
5
+ nullable: true,
6
+ unsigned: true
7
+ }, {algorithm: 'auto'});
@@ -0,0 +1,3 @@
1
+ const {createAddIndexMigration} = require('../../utils');
2
+
3
+ module.exports = createAddIndexMigration('automation_run_steps', ['status', 'ready_at', 'created_at', 'id']);
@@ -0,0 +1,3 @@
1
+ const {createAddIndexMigration} = require('../../utils');
2
+
3
+ module.exports = createAddIndexMigration('automated_email_recipients', ['mailgun_message_id'], {length: 31});
@@ -0,0 +1,13 @@
1
+ const {combineNonTransactionalMigrations, createAddColumnMigration} = require('../../utils');
2
+
3
+ module.exports = combineNonTransactionalMigrations(
4
+ createAddColumnMigration('automated_email_recipients', 'track_clicks', {
5
+ type: 'boolean',
6
+ nullable: false,
7
+ defaultTo: false
8
+ }, {algorithm: 'auto'}),
9
+ createAddColumnMigration('automated_email_recipients', 'clicked_at', {
10
+ type: 'dateTime',
11
+ nullable: true
12
+ }, {algorithm: 'auto'})
13
+ );
@@ -0,0 +1,7 @@
1
+ const {createAddColumnMigration} = require('../../utils');
2
+
3
+ module.exports = createAddColumnMigration('automation_action_revisions', 'email_clicked_count', {
4
+ type: 'integer',
5
+ nullable: true,
6
+ unsigned: true
7
+ }, {algorithm: 'auto'});