ghost 6.11.0 → 6.12.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 (435) hide show
  1. package/components/tryghost-i18n-6.12.0.tgz +0 -0
  2. package/core/boot.js +4 -2
  3. package/core/built/admin/assets/{_baseAssignValue-BX8EallQ.js → _baseAssignValue-hsL6ItjC.js} +1 -1
  4. package/core/built/admin/assets/{a-large-small-CKZJgscl.js → a-large-small-BPPu_Iy7.js} +1 -1
  5. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
  6. package/core/built/admin/assets/admin-x-settings/{code-editor-view-n8DFeXbv.mjs → code-editor-view-Bq6l5arq.mjs} +2 -2
  7. package/core/built/admin/assets/admin-x-settings/{index-v6qQgUXt.mjs → index-CKaxer_o.mjs} +2 -2
  8. package/core/built/admin/assets/admin-x-settings/{index-CXL12uvO.mjs → index-CtYEAgeN.mjs} +2 -2
  9. package/core/built/admin/assets/admin-x-settings/{index-D4ye6uvI.mjs → index-D4NstoNQ.mjs} +11 -6
  10. package/core/built/admin/assets/admin-x-settings/{modals-CdsPaTfy.mjs → modals-BzljHVa7.mjs} +2 -2
  11. package/core/built/admin/assets/{at-sign-CqQzllfI.js → at-sign-CYnGzOFc.js} +1 -1
  12. package/core/built/admin/assets/{audience-select-DQD7iDOb.js → audience-select-DYoxiiwy.js} +1 -1
  13. package/core/built/admin/assets/{avatar-flipboard-uq7ptTxT.js → avatar-flipboard-C9-npfmZ.js} +1 -1
  14. package/core/built/admin/assets/{bluesky-sharing-qyIGv6Ny.js → bluesky-sharing-BGcmGcee.js} +1 -1
  15. package/core/built/admin/assets/{chart-DGA1MaFs.js → chart-CqJxisVP.js} +1 -1
  16. package/core/built/admin/assets/{chunk.524.1289543297329587cf8a.js → chunk.524.74a9629dd2ba0d21bbef.js} +7 -7
  17. package/core/built/admin/assets/{chunk.582.344ea0d0a16d671345cd.js → chunk.582.3846471396b3a7c46e66.js} +8 -8
  18. package/core/built/admin/assets/{code-editor-view-Bz6kXDiv.js → code-editor-view-C8l3gNnO.js} +1 -1
  19. package/core/built/admin/assets/{comments-C-lkEDkz.js → comments-CpHDoxov.js} +1 -1
  20. package/core/built/admin/assets/{copy-BFuV16bY.js → copy-DWiB-781.js} +1 -1
  21. package/core/built/admin/assets/{data-list-Bw1CQEZ9.js → data-list-yngXNZDF.js} +1 -1
  22. package/core/built/admin/assets/{deleted-feed-item-CmNbSYiO.js → deleted-feed-item-C0FcyLMN.js} +1 -1
  23. package/core/built/admin/assets/{edit-profile-DlIPB2km.js → edit-profile-BjtDkDAq.js} +1 -1
  24. package/core/built/admin/assets/{empty-indicator-DBrIZcFq.js → empty-indicator-BXWniwsl.js} +1 -1
  25. package/core/built/admin/assets/{en-BBc7b85q.js → en-B8qaJx-T.js} +1 -1
  26. package/core/built/admin/assets/{feed-B3XQzKZl.js → feed-DsCVb1SA.js} +1 -1
  27. package/core/built/admin/assets/{filters-DUFXZZnu.js → filters-jAXQSPq6.js} +1 -1
  28. package/core/built/admin/assets/{gh-chart-BV97-O7c.js → gh-chart-DwTCK8z_.js} +1 -1
  29. package/core/built/admin/assets/{ghost-9aa1e7c5992f122dba6932af78bf8e56.js → ghost-6367d022df9db9dacbcb9bfa30232ec7.js} +2 -2
  30. package/core/built/admin/assets/{growth-njR0GqK2.js → growth-DshcRqda.js} +1 -1
  31. package/core/built/admin/assets/{hash-CdH0ikFp.js → hash-p9dv0yuc.js} +1 -1
  32. package/core/built/admin/assets/{inbox-Bd0uf1Ez.js → inbox-CRoP9sy5.js} +1 -1
  33. package/core/built/admin/assets/{index-Kji6JKl7.js → index-6syrC9X1.js} +1 -1
  34. package/core/built/admin/assets/{index-C7M19LpB.js → index-BKtz3UH0.js} +1 -1
  35. package/core/built/admin/assets/{index-DWk7hKRR.js → index-BwY94Fb4.js} +1 -1
  36. package/core/built/admin/assets/{index-BFhECYgc.js → index-C3DF6aFe.js} +1 -1
  37. package/core/built/admin/assets/index-C6NCNp1B.js +1 -0
  38. package/core/built/admin/assets/{index-BYawr8p9.js → index-CJU9a2PB.js} +3 -3
  39. package/core/built/admin/assets/{index-CIE2_z5J.js → index-CUWE7aD1.js} +1 -1
  40. package/core/built/admin/assets/{index-DgRIbSpg.js → index-CuQ_II0e.js} +1 -1
  41. package/core/built/admin/assets/{index-Birw80cQ.js → index-DG8f-HuU.js} +1 -1
  42. package/core/built/admin/assets/{index-DziHC2du.js → index-DItZTRQ4.js} +1 -1
  43. package/core/built/admin/assets/{index-DG53N3Xt.js → index-eLx96SEn.js} +1 -1
  44. package/core/built/admin/assets/{index-DCw6JaEl.js → index-j2_Q-_8H.js} +1 -1
  45. package/core/built/admin/assets/{index-BZ21H0xH.js → index-qWpHJAMP.js} +1 -1
  46. package/core/built/admin/assets/{index-DXCu9e7c.js → index-sy6xRtoO.js} +1 -1
  47. package/core/built/admin/assets/{koenig-lexical-BDJVCHtm.js → koenig-lexical-DgAlBHHS.js} +1 -1
  48. package/core/built/admin/assets/{kpi-card-cv8roErt.js → kpi-card-CHZSLw4p.js} +1 -1
  49. package/core/built/admin/assets/{kpis-Dt4OFY3L.js → kpis-DzbAHfKK.js} +1 -1
  50. package/core/built/admin/assets/{links-08beB3Ij.js → links-BQHRbn46.js} +1 -1
  51. package/core/built/admin/assets/{lucide-react-DKlmxVQI.js → lucide-react-B7UnD_Dp.js} +1 -1
  52. package/core/built/admin/assets/{main-layout-Cl09wG7F.js → main-layout-9nmU5WlG.js} +1 -1
  53. package/core/built/admin/assets/{message-square-text-CaMVBVPr.js → message-square-text-CS3iRuPc.js} +1 -1
  54. package/core/built/admin/assets/{minus-2XwCoFJV.js → minus-emzwh6hq.js} +1 -1
  55. package/core/built/admin/assets/{modals-CIgzYQgv.js → modals-CumFuZ2d.js} +1 -1
  56. package/core/built/admin/assets/{moderation-FjlsSym6.js → moderation-DyfFc9m4.js} +1 -1
  57. package/core/built/admin/assets/{newsletter-BNOwZNlE.js → newsletter-BWul5IFc.js} +1 -1
  58. package/core/built/admin/assets/{newsletters-DUusEYSg.js → newsletters-N6bwI1OF.js} +1 -1
  59. package/core/built/admin/assets/{note-BpYwIDK6.js → note-CiBzkHzz.js} +1 -1
  60. package/core/built/admin/assets/{overview-Y5QYPClr.js → overview-D9gRvn7X.js} +1 -1
  61. package/core/built/admin/assets/{pagemenu-BMXHDXYy.js → pagemenu-aHubMPwB.js} +1 -1
  62. package/core/built/admin/assets/{post-analytics-UerFnJse.js → post-analytics-Bm9xH8nA.js} +1 -1
  63. package/core/built/admin/assets/{post-analytics-context-geHk7rOj.js → post-analytics-context-C7oW3aBz.js} +1 -1
  64. package/core/built/admin/assets/{post-analytics-header-DXfc4KeX.js → post-analytics-header-BjGFgN6A.js} +1 -1
  65. package/core/built/admin/assets/{post-share-modal-Dql4fYjR.js → post-share-modal-Su923uIc.js} +1 -1
  66. package/core/built/admin/assets/{posts-Bsvw11Zo.js → posts-BwP7BNcB.js} +1 -1
  67. package/core/built/admin/assets/{referrers-B8xJpCcR.js → referrers-n_ln9DqI.js} +1 -1
  68. package/core/built/admin/assets/{repeat-COP-3g8d.js → repeat-ms5ocvE0.js} +1 -1
  69. package/core/built/admin/assets/{reply-JE8tmvOn.js → reply-BvO85IDn.js} +1 -1
  70. package/core/built/admin/assets/{select-BhvNY3I-.js → select-B4QhMW5f.js} +1 -1
  71. package/core/built/admin/assets/{settings-BJwVfuWG.js → settings-D5rGcWJ7.js} +4 -4
  72. package/core/built/admin/assets/{settings-C6ZUZQe4.js → settings-QtZ6a2TL.js} +1 -1
  73. package/core/built/admin/assets/{sort-button-iOtR-vQ1.js → sort-button-84sYUZMN.js} +1 -1
  74. package/core/built/admin/assets/{source-icon-C2iFWMlV.js → source-icon-Bzw-AU8p.js} +1 -1
  75. package/core/built/admin/assets/{sprout-BW9HFVU8.js → sprout-C2R5CbXV.js} +1 -1
  76. package/core/built/admin/assets/{square-BCNGSZhW.js → square-DT1uWkxs.js} +1 -1
  77. package/core/built/admin/assets/stats/{audience-select-DNAWmT7R.mjs → audience-select-fTCiZ9MT.mjs} +3 -3
  78. package/core/built/admin/assets/stats/{index-DbGvSTMe.mjs → index-BKgioyC7.mjs} +5 -5
  79. package/core/built/admin/assets/stats/{index-s19ZmxbX.mjs → index-CR2t5Xd-.mjs} +5 -5
  80. package/core/built/admin/assets/stats/index-DEkYwR7C.mjs +739 -0
  81. package/core/built/admin/assets/stats/{index-BS3KMSy9.mjs → index-Djwey97a.mjs} +5 -5
  82. package/core/built/admin/assets/stats/{index-MOQSSYwT.mjs → index-FiU_XgEe.mjs} +6 -6
  83. package/core/built/admin/assets/stats/{sort-button-D76rcldr.mjs → sort-button-Bvi1wfa7.mjs} +3 -3
  84. package/core/built/admin/assets/stats/{stats-CJ7fhUyT.mjs → stats-Bbm6yWZq.mjs} +2 -2
  85. package/core/built/admin/assets/stats/stats.js +1 -1
  86. package/core/built/admin/assets/stats/{tabs-CkbxYgOE.mjs → tabs-BKwH5k-q.mjs} +3 -3
  87. package/core/built/admin/assets/stats/{url-helpers-DICtqCrE.mjs → url-helpers-DmHnUIGc.mjs} +9 -9
  88. package/core/built/admin/assets/stats/{use-growth-stats-DzO7zEy4.mjs → use-growth-stats-BVj3j1hb.mjs} +3 -3
  89. package/core/built/admin/assets/{stats-r0Bphuvi.js → stats-B1mhlQSp.js} +1 -1
  90. package/core/built/admin/assets/{stats-view-DzZxrBDz.js → stats-view-C6MTCwRW.js} +1 -1
  91. package/core/built/admin/assets/{step-1-CUoUOyMm.js → step-1-CzQmZJ93.js} +1 -1
  92. package/core/built/admin/assets/{step-2-CpAkPD8D.js → step-2-DXGDWSQo.js} +1 -1
  93. package/core/built/admin/assets/{step-3-Ci6oJDmK.js → step-3-CYuxXKac.js} +1 -1
  94. package/core/built/admin/assets/{table-DeBuf80X.js → table-mjAkKNdb.js} +1 -1
  95. package/core/built/admin/assets/{tabs-C2sFfNcp.js → tabs-BwQ-i6MY.js} +1 -1
  96. package/core/built/admin/assets/{tags-Bl6G5rvf.js → tags-BkUqCuvX.js} +1 -1
  97. package/core/built/admin/assets/{tags-BL_N4nn2.js → tags-DXDZbfxp.js} +1 -1
  98. package/core/built/admin/assets/{toggle-group-B2X-8giI.js → toggle-group-CqDO3Kkx.js} +1 -1
  99. package/core/built/admin/assets/{topic-filter-DeqMID_s.js → topic-filter-DnuJJBAE.js} +1 -1
  100. package/core/built/admin/assets/{trash-BglGemAb.js → trash-CZ3EXwTL.js} +1 -1
  101. package/core/built/admin/assets/{url-helpers-84icqAuE.js → url-helpers-BE3VXr__.js} +1 -1
  102. package/core/built/admin/assets/{use-growth-stats-DF-7tL8g.js → use-growth-stats-CiuWWM6O.js} +1 -1
  103. package/core/built/admin/assets/{use-infinite-virtual-scroll-BHH7oscK.js → use-infinite-virtual-scroll-BjATkxBj.js} +1 -1
  104. package/core/built/admin/assets/{use-simple-pagination-BsvYfixw.js → use-simple-pagination-C9cb7dDz.js} +1 -1
  105. package/core/built/admin/assets/{user-round-check-BjHbfXKY.js → user-round-check-D3ihrrKL.js} +1 -1
  106. package/core/built/admin/assets/{wallet-cards-KaTkgqvi.js → wallet-cards-Do7nPf3f.js} +1 -1
  107. package/core/built/admin/assets/{web-CUWbpFil.js → web-BEwI2Gfy.js} +1 -1
  108. package/core/built/admin/index-forward.html +4 -4
  109. package/core/built/admin/index.html +3 -3
  110. package/core/frontend/web/middleware/index.js +1 -0
  111. package/core/frontend/web/middleware/serve-indexnow-key.js +66 -0
  112. package/core/frontend/web/site.js +3 -0
  113. package/core/server/api/endpoints/authentication.js +1 -1
  114. package/core/server/api/endpoints/pages.js +1 -1
  115. package/core/server/api/endpoints/posts-public.js +1 -1
  116. package/core/server/api/endpoints/posts.js +1 -1
  117. package/core/server/api/endpoints/search-index-public.js +1 -1
  118. package/core/server/api/endpoints/search-index.js +1 -1
  119. package/core/server/api/endpoints/users.js +1 -1
  120. package/core/server/api/endpoints/utils/serializers/input/settings.js +2 -1
  121. package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +1 -1
  122. package/core/server/api/endpoints/utils/validators/input/settings.js +1 -1
  123. package/core/server/data/exporter/table-lists.js +2 -1
  124. package/core/server/data/migrations/versions/6.12/2026-01-08-11-48-16-add-indexnow-api-key-setting.js +9 -0
  125. package/core/server/data/schema/default-settings/default-settings.json +6 -0
  126. package/core/server/lib/lexical.js +1 -1
  127. package/core/server/models/settings.js +2 -1
  128. package/core/server/services/activitypub/{ActivityPubServiceWrapper.js → activity-pub-service-wrapper.js} +1 -1
  129. package/core/server/services/activitypub/{ActivityPubService.ts → activity-pub-service.ts} +1 -1
  130. package/core/server/services/activitypub/index.js +1 -1
  131. package/core/server/services/adapter-manager/index.js +1 -1
  132. package/core/server/services/announcement-bar-service/{AnnouncementBarSettings.js → announcement-bar-settings.js} +1 -1
  133. package/core/server/services/announcement-bar-service/index.js +1 -1
  134. package/core/server/services/audience-feedback/{AudienceFeedbackController.js → audience-feedback-controller.js} +3 -3
  135. package/core/server/services/audience-feedback/index.js +4 -4
  136. package/core/server/services/auth/session/express-session.js +1 -1
  137. package/core/server/services/comments/{CommentsController.js → comments-controller.js} +2 -2
  138. package/core/server/services/comments/{CommentsServiceEmails.js → comments-service-emails.js} +1 -1
  139. package/core/server/services/comments/{CommentsService.js → comments-service.js} +1 -1
  140. package/core/server/services/comments/index.js +3 -3
  141. package/core/server/services/custom-redirects/index.js +2 -2
  142. package/core/server/services/donations/{DonationBookshelfRepository.ts → donation-bookshelf-repository.ts} +1 -1
  143. package/core/server/services/donations/{DonationServiceWrapper.js → donation-service-wrapper.js} +1 -1
  144. package/core/server/services/donations/index.js +1 -1
  145. package/core/server/services/email-address/{EmailAddressServiceWrapper.js → email-address-service-wrapper.js} +2 -2
  146. package/core/server/services/email-address/{EmailAddressService.js → email-address-service.js} +4 -4
  147. package/core/server/services/email-address/{EmailAddressService.ts → email-address-service.ts} +1 -1
  148. package/core/server/services/email-address/index.js +1 -1
  149. package/core/server/services/email-analytics/{EmailAnalyticsProviderMailgun.js → email-analytics-provider-mailgun.js} +1 -1
  150. package/core/server/services/email-analytics/{EmailAnalyticsServiceWrapper.js → email-analytics-service-wrapper.js} +5 -5
  151. package/core/server/services/email-analytics/{EmailAnalyticsService.js → email-analytics-service.js} +2 -2
  152. package/core/server/services/email-analytics/index.js +1 -1
  153. package/core/server/services/email-analytics/jobs/fetch-latest/index.js +1 -1
  154. package/core/server/services/email-service/{BatchSendingService.js → batch-sending-service.js} +8 -8
  155. package/core/server/services/email-service/{EmailEventProcessor.js → email-event-processor.js} +6 -6
  156. package/core/server/services/email-service/{EmailEventStorage.js → email-event-storage.js} +1 -1
  157. package/core/server/services/email-service/{EmailRenderer.js → email-renderer.js} +1 -1
  158. package/core/server/services/email-service/{EmailServiceWrapper.js → email-service-wrapper.js} +9 -9
  159. package/core/server/services/email-service/{EmailService.js → email-service.js} +13 -13
  160. package/core/server/services/email-service/index.js +1 -1
  161. package/core/server/services/email-service/{MailgunEmailProvider.js → mailgun-email-provider.js} +1 -1
  162. package/core/server/services/email-service/{SendingService.js → sending-service.js} +6 -6
  163. package/core/server/services/email-suppression-list/{InMemoryEmailSuppressionList.js → in-memory-email-suppression-list.js} +1 -1
  164. package/core/server/services/email-suppression-list/{MailgunEmailSuppressionList.js → mailgun-email-suppression-list.js} +3 -3
  165. package/core/server/services/email-suppression-list/service.js +2 -2
  166. package/core/server/services/explore/index.js +2 -2
  167. package/core/server/services/explore-ping/index.js +2 -2
  168. package/core/server/services/frontend-data-service/index.js +1 -1
  169. package/core/server/services/identity-tokens/{IdentityTokenServiceWrapper.js → identity-token-service-wrapper.js} +1 -1
  170. package/core/server/services/identity-tokens/index.js +1 -1
  171. package/core/server/services/indexnow.js +212 -0
  172. package/core/server/services/invites/index.js +1 -1
  173. package/core/server/services/link-redirection/index.js +2 -2
  174. package/core/server/services/link-redirection/{LinkRedirectRepository.js → link-redirect-repository.js} +1 -1
  175. package/core/server/services/link-redirection/{LinkRedirectsService.js → link-redirects-service.js} +2 -2
  176. package/core/server/services/link-redirection/{RedirectEvent.js → redirect-event.js} +1 -1
  177. package/core/server/services/link-tracking/index.js +3 -3
  178. package/core/server/services/link-tracking/{LinkClickRepository.js → link-click-repository.js} +1 -1
  179. package/core/server/services/link-tracking/{LinkClickTrackingService.js → link-click-tracking-service.js} +4 -4
  180. package/core/server/services/link-tracking/{PostLinkRepository.js → post-link-repository.js} +7 -7
  181. package/core/server/services/mail/{GhostMailer.js → ghost-mailer.js} +1 -1
  182. package/core/server/services/mail/index.js +2 -2
  183. package/core/server/services/media-inliner/service.js +1 -1
  184. package/core/server/services/member-attribution/README.md +6 -6
  185. package/core/server/services/member-attribution/{AttributionBuilder.js → attribution-builder.js} +4 -4
  186. package/core/server/services/member-attribution/index.js +5 -5
  187. package/core/server/services/member-attribution/{MemberAttributionService.js → member-attribution-service.js} +9 -9
  188. package/core/server/services/member-attribution/{ReferrerTranslator.js → referrer-translator.js} +1 -1
  189. package/core/server/services/member-attribution/{UrlTranslator.js → url-translator.js} +1 -1
  190. package/core/server/services/member-welcome-emails/constants.js +22 -1
  191. package/core/server/services/member-welcome-emails/service.js +23 -5
  192. package/core/server/services/members/api.js +1 -1
  193. package/core/server/services/members/importer/index.js +3 -3
  194. package/core/server/services/members/importer/{MembersCSVImporter.js → members-csv-importer.js} +2 -2
  195. package/core/server/services/members/members-api/members-api.js +14 -14
  196. package/core/server/services/members/members-api/repositories/{MemberRepository.js → member-repository.js} +17 -8
  197. package/core/server/services/members/members-api/services/{MemberBREADService.js → member-bread-service.js} +1 -1
  198. package/core/server/services/members/members-api/services/{PaymentsService.js → payments-service.js} +12 -12
  199. package/core/server/services/members/service.js +4 -4
  200. package/core/server/services/members-events/index.js +3 -3
  201. package/core/server/services/members-events/{LastSeenAtUpdater.js → last-seen-at-updater.js} +2 -2
  202. package/core/server/services/mentions/{BookshelfMentionRepository.js → bookshelf-mention-repository.js} +9 -9
  203. package/core/server/services/mentions/{InMemoryMentionRepository.js → in-memory-mention-repository.js} +4 -4
  204. package/core/server/services/mentions/{MentionController.js → mention-controller.js} +5 -5
  205. package/core/server/services/mentions/{MentionCreatedEvent.js → mention-created-event.js} +1 -1
  206. package/core/server/services/mentions/{Mention.js → mention.js} +1 -1
  207. package/core/server/services/mentions/{MentionsAPI.js → mentions-api.js} +1 -1
  208. package/core/server/services/mentions/{ResourceService.js → resource-service.js} +2 -2
  209. package/core/server/services/mentions/{RoutingService.js → routing-service.js} +2 -2
  210. package/core/server/services/mentions/service.js +11 -11
  211. package/core/server/services/mentions/{WebmentionMetadata.js → webmention-metadata.js} +1 -1
  212. package/core/server/services/mentions-email-report/job.js +1 -1
  213. package/core/server/services/mentions-email-report/{MentionEmailReportJob.js → mention-email-report-job.js} +1 -1
  214. package/core/server/services/mentions-email-report/service.js +2 -2
  215. package/core/server/services/milestones/{BookshelfMilestoneRepository.js → bookshelf-milestone-repository.js} +2 -2
  216. package/core/server/services/milestones/{InMemoryMilestoneRepository.js → in-memory-milestone-repository.js} +2 -2
  217. package/core/server/services/milestones/{Milestone.js → milestone.js} +1 -1
  218. package/core/server/services/milestones/{MilestonesService.js → milestones-service.js} +1 -1
  219. package/core/server/services/milestones/service.js +4 -4
  220. package/core/server/services/newsletters/index.js +2 -2
  221. package/core/server/services/newsletters/{NewslettersService.js → newsletters-service.js} +1 -1
  222. package/core/server/services/notifications/index.js +1 -1
  223. package/core/server/services/oembed/service.js +3 -3
  224. package/core/server/services/offers/application/{OfferMapper.js → offer-mapper.js} +1 -1
  225. package/core/server/services/offers/application/{OffersAPI.js → offers-api.js} +9 -9
  226. package/core/server/services/offers/application/{UniqueChecker.js → unique-checker.js} +2 -2
  227. package/core/server/services/offers/domain/events/{OfferCodeChangeEvent.js → offer-code-change-event.js} +1 -1
  228. package/core/server/services/offers/domain/events/{OfferCreatedEvent.js → offer-created-event.js} +1 -1
  229. package/core/server/services/offers/domain/models/{OfferAmount.js → offer-amount.js} +1 -1
  230. package/core/server/services/offers/domain/models/{OfferCadence.js → offer-cadence.js} +1 -1
  231. package/core/server/services/offers/domain/models/{OfferCode.js → offer-code.js} +1 -1
  232. package/core/server/services/offers/domain/models/{OfferCreatedAt.js → offer-created-at.js} +1 -1
  233. package/core/server/services/offers/domain/models/{OfferCurrency.js → offer-currency.js} +1 -1
  234. package/core/server/services/offers/domain/models/{OfferDescription.js → offer-description.js} +1 -1
  235. package/core/server/services/offers/domain/models/{OfferDuration.js → offer-duration.js} +1 -1
  236. package/core/server/services/offers/domain/models/{OfferName.js → offer-name.js} +1 -1
  237. package/core/server/services/offers/domain/models/{OfferStatus.js → offer-status.js} +1 -1
  238. package/core/server/services/offers/domain/models/{OfferTitle.js → offer-title.js} +1 -1
  239. package/core/server/services/offers/domain/models/{OfferType.js → offer-type.js} +1 -1
  240. package/core/server/services/offers/domain/models/{Offer.js → offer.js} +14 -14
  241. package/core/server/services/offers/domain/models/{StripeCoupon.js → stripe-coupon.js} +1 -1
  242. package/core/server/services/offers/{OfferBookshelfRepository.js → offer-bookshelf-repository.js} +6 -6
  243. package/core/server/services/offers/{OffersModule.js → offers-module.js} +4 -4
  244. package/core/server/services/offers/service.js +3 -3
  245. package/core/server/services/outbox/index.js +2 -2
  246. package/core/server/services/outbox/jobs/outbox-job.js +2 -2
  247. package/core/server/services/posts/posts-service-instance.js +47 -0
  248. package/core/server/services/posts/posts-service.js +572 -45
  249. package/core/server/services/recommendations/index.js +1 -1
  250. package/core/server/services/recommendations/{RecommendationEnablerService.js → recommendation-enabler-service.js} +2 -2
  251. package/core/server/services/recommendations/{RecommendationServiceWrapper.js → recommendation-service-wrapper.js} +2 -2
  252. package/core/server/services/recommendations/service/{BookshelfClickEventRepository.js → bookshelf-click-event-repository.js} +4 -4
  253. package/core/server/services/recommendations/service/{BookshelfClickEventRepository.ts → bookshelf-click-event-repository.ts} +2 -2
  254. package/core/server/services/recommendations/service/{BookshelfRecommendationRepository.js → bookshelf-recommendation-repository.js} +4 -4
  255. package/core/server/services/recommendations/service/{BookshelfRecommendationRepository.ts → bookshelf-recommendation-repository.ts} +3 -3
  256. package/core/server/services/recommendations/service/{BookshelfSubscribeEventRepository.js → bookshelf-subscribe-event-repository.js} +4 -4
  257. package/core/server/services/recommendations/service/{BookshelfSubscribeEventRepository.ts → bookshelf-subscribe-event-repository.ts} +2 -2
  258. package/core/server/services/recommendations/service/{InMemoryRecommendationRepository.js → in-memory-recommendation-repository.js} +2 -2
  259. package/core/server/services/recommendations/service/{InMemoryRecommendationRepository.ts → in-memory-recommendation-repository.ts} +3 -3
  260. package/core/server/services/recommendations/service/{IncomingRecommendationController.js → incoming-recommendation-controller.js} +2 -2
  261. package/core/server/services/recommendations/service/{IncomingRecommendationController.ts → incoming-recommendation-controller.ts} +3 -3
  262. package/core/server/services/recommendations/service/{IncomingRecommendationEmailRenderer.ts → incoming-recommendation-email-renderer.ts} +2 -2
  263. package/core/server/services/recommendations/service/{IncomingRecommendationService.ts → incoming-recommendation-service.ts} +2 -2
  264. package/core/server/services/recommendations/service/index.js +15 -15
  265. package/core/server/services/recommendations/service/index.ts +15 -15
  266. package/core/server/services/recommendations/service/{RecommendationController.js → recommendation-controller.js} +13 -13
  267. package/core/server/services/recommendations/service/{RecommendationController.ts → recommendation-controller.ts} +4 -4
  268. package/core/server/services/recommendations/service/{RecommendationRepository.ts → recommendation-repository.ts} +3 -3
  269. package/core/server/services/recommendations/service/{RecommendationService.js → recommendation-service.js} +6 -6
  270. package/core/server/services/recommendations/service/{RecommendationService.ts → recommendation-service.ts} +8 -8
  271. package/core/server/services/recommendations/service/{Recommendation.js → recommendation.js} +4 -4
  272. package/core/server/services/recommendations/service/{Recommendation.ts → recommendation.ts} +1 -1
  273. package/core/server/services/recommendations/service/{WellknownService.ts → well-known-service.ts} +1 -1
  274. package/core/server/services/route-settings/index.js +4 -4
  275. package/core/server/services/settings/{SettingsBREADService.js → settings-bread-service.js} +1 -1
  276. package/core/server/services/settings/settings-service.js +2 -2
  277. package/core/server/services/settings-helpers/index.js +1 -1
  278. package/core/server/services/settings-helpers/{SettingsHelpers.js → settings-helpers.js} +5 -5
  279. package/core/server/services/slack-notifications/service.js +4 -4
  280. package/core/server/services/slack-notifications/{SlackNotificationsService.js → slack-notifications-service.js} +2 -2
  281. package/core/server/services/slack-notifications/{SlackNotifications.js → slack-notifications.js} +2 -2
  282. package/core/server/services/staff/index.js +1 -1
  283. package/core/server/services/staff/{StaffServiceEmails.js → staff-service-emails.js} +2 -2
  284. package/core/server/services/staff/{StaffService.js → staff-service.js} +2 -2
  285. package/core/server/services/stats/{PostsStatsService.js → posts-stats-service.js} +25 -25
  286. package/core/server/services/stats/{ReferrersStatsService.js → referrers-stats-service.js} +3 -3
  287. package/core/server/services/stats/service.js +1 -1
  288. package/core/server/services/stats/{StatsService.js → stats-service.js} +23 -23
  289. package/core/server/services/stripe/events/index.js +2 -2
  290. package/core/server/services/stripe/service.js +1 -1
  291. package/core/server/services/stripe/services/webhook/{CheckoutSessionEventService.js → checkout-session-event-service.js} +2 -2
  292. package/core/server/services/stripe/{StripeMigrations.js → stripe-migrations.js} +1 -1
  293. package/core/server/services/stripe/{StripeService.js → stripe-service.js} +8 -8
  294. package/core/server/services/stripe/{WebhookController.js → webhook-controller.js} +4 -4
  295. package/core/server/services/stripe/{WebhookManager.js → webhook-manager.js} +5 -5
  296. package/core/server/services/themes/storage.js +1 -1
  297. package/core/server/services/tiers/{InMemoryTierRepository.js → in-memory-tier-repository.js} +1 -1
  298. package/core/server/services/tiers/service.js +2 -2
  299. package/core/server/services/tiers/{TierActivatedEvent.js → tier-activated-event.js} +1 -1
  300. package/core/server/services/tiers/{TierArchivedEvent.js → tier-archived-event.js} +1 -1
  301. package/core/server/services/tiers/{TierCreatedEvent.js → tier-created-event.js} +1 -1
  302. package/core/server/services/tiers/{TierNameChangeEvent.js → tier-name-change-event.js} +1 -1
  303. package/core/server/services/tiers/{TierPriceChangeEvent.js → tier-price-change-event.js} +1 -1
  304. package/core/server/services/tiers/{TierRepository.js → tier-repository.js} +7 -7
  305. package/core/server/services/tiers/{Tier.js → tier.js} +5 -5
  306. package/core/server/services/tiers/{TiersAPI.js → tiers-api.js} +1 -1
  307. package/core/server/services/tinybird/index.js +1 -1
  308. package/core/server/services/tinybird/{TinybirdServiceWrapper.js → tinybird-service-wrapper.js} +2 -2
  309. package/core/server/services/update-check/index.js +1 -1
  310. package/core/server/services/url/index.js +2 -2
  311. package/core/server/services/url/{Resources.js → resources.js} +1 -1
  312. package/core/server/services/url/{UrlGenerator.js → url-generator.js} +1 -1
  313. package/core/server/services/url/{UrlService.js → url-service.js} +4 -4
  314. package/core/server/services/url/{Urls.js → urls.js} +1 -1
  315. package/core/server/services/webhooks/listen.js +1 -1
  316. package/core/shared/labs.js +2 -1
  317. package/package.json +3 -3
  318. package/tsconfig.tsbuildinfo +1 -1
  319. package/components/tryghost-i18n-6.11.0.tgz +0 -0
  320. package/core/built/admin/assets/index-Cr_YX9yU.js +0 -1
  321. package/core/built/admin/assets/stats/index-BBCJ2EZo.mjs +0 -733
  322. package/core/server/services/posts/PostsService.js +0 -574
  323. /package/core/server/{GhostServer.js → ghost-server.js} +0 -0
  324. /package/core/server/services/activitypub/{ActivityPubService.js → activity-pub-service.js} +0 -0
  325. /package/core/server/services/adapter-manager/{AdapterManager.js → adapter-manager.js} +0 -0
  326. /package/core/server/services/announcement-bar-service/{AnnouncementVisibilityValues.js → announcement-visibility-values.js} +0 -0
  327. /package/core/server/services/audience-feedback/{AudienceFeedbackService.js → audience-feedback-service.js} +0 -0
  328. /package/core/server/services/audience-feedback/{FeedbackRepository.js → feedback-repository.js} +0 -0
  329. /package/core/server/services/audience-feedback/{Feedback.js → feedback.js} +0 -0
  330. /package/core/server/services/auth/session/{SessionStore.js → session-store.js} +0 -0
  331. /package/core/server/services/comments/{CommentsServiceEmailRenderer.js → comments-service-email-renderer.js} +0 -0
  332. /package/core/server/services/comments/{CommentsStatsService.js → comments-stats-service.js} +0 -0
  333. /package/core/server/services/custom-redirects/{CustomRedirectsAPI.js → custom-redirects-api.js} +0 -0
  334. /package/core/server/services/donations/{DonationBookshelfRepository.js → donation-bookshelf-repository.js} +0 -0
  335. /package/core/server/services/donations/{DonationPaymentEvent.js → donation-payment-event.js} +0 -0
  336. /package/core/server/services/donations/{DonationPaymentEvent.ts → donation-payment-event.ts} +0 -0
  337. /package/core/server/services/email-address/{EmailAddressParser.js → email-address-parser.js} +0 -0
  338. /package/core/server/services/email-address/{EmailAddressParser.js.d.ts → email-address-parser.js.d.ts} +0 -0
  339. /package/core/server/services/email-analytics/{EventProcessingResult.js → event-processing-result.js} +0 -0
  340. /package/core/server/services/email-analytics/events/{StartEmailAnalyticsJobEvent.js → start-email-analytics-job-event.js} +0 -0
  341. /package/core/server/services/email-service/{DomainWarmingService.js → domain-warming-service.js} +0 -0
  342. /package/core/server/services/email-service/{DomainWarmingService.ts → domain-warming-service.ts} +0 -0
  343. /package/core/server/services/email-service/{EmailBodyCache.js → email-body-cache.js} +0 -0
  344. /package/core/server/services/email-service/{EmailController.js → email-controller.js} +0 -0
  345. /package/core/server/services/email-service/{EmailSegmenter.js → email-segmenter.js} +0 -0
  346. /package/core/server/services/email-service/events/{EmailBouncedEvent.js → email-bounced-event.js} +0 -0
  347. /package/core/server/services/email-service/events/{EmailDeliveredEvent.js → email-delivered-event.js} +0 -0
  348. /package/core/server/services/email-service/events/{EmailOpenedEvent.js → email-opened-event.js} +0 -0
  349. /package/core/server/services/email-service/events/{EmailTemporaryBouncedEvent.js → email-temporary-bounced-event.js} +0 -0
  350. /package/core/server/services/email-service/events/{EmailUnsubscribedEvent.js → email-unsubscribed-event.js} +0 -0
  351. /package/core/server/services/email-service/events/{SpamComplaintEvent.js → spam-complaint-event.js} +0 -0
  352. /package/core/server/services/email-suppression-list/{EmailSuppressionList.js → email-suppression-list.js} +0 -0
  353. /package/core/server/services/explore/{ExploreService.js → explore-service.js} +0 -0
  354. /package/core/server/services/explore-ping/{ExplorePingService.js → explore-ping-service.js} +0 -0
  355. /package/core/server/services/frontend-data-service/{FrontendDataService.js → front-end-data-service.js} +0 -0
  356. /package/core/server/services/identity-tokens/{IdentityTokenService.js → identity-token-service.js} +0 -0
  357. /package/core/server/services/identity-tokens/{IdentityTokenService.ts → identity-token-service.ts} +0 -0
  358. /package/core/server/services/invites/{Invites.js → invites.js} +0 -0
  359. /package/core/server/services/lib/{DynamicRedirectManager.js → dynamic-redirect-manager.js} +0 -0
  360. /package/core/server/services/lib/{EmailContentGenerator.js → email-content-generator.js} +0 -0
  361. /package/core/server/services/lib/{InMemoryRepository.js → in-memory-repository.js} +0 -0
  362. /package/core/server/services/lib/{InMemoryRepository.ts → in-memory-repository.ts} +0 -0
  363. /package/core/server/services/lib/magic-link/{MagicLink.js → magic-link.js} +0 -0
  364. /package/core/server/services/lib/{MailgunClient.js → mailgun-client.js} +0 -0
  365. /package/core/server/services/link-redirection/{LinkRedirect.js → link-redirect.js} +0 -0
  366. /package/core/server/services/link-tracking/{ClickEvent.js → click-event.js} +0 -0
  367. /package/core/server/services/link-tracking/{FullPostLink.js → full-post-link.js} +0 -0
  368. /package/core/server/services/link-tracking/{PostLink.js → post-link.js} +0 -0
  369. /package/core/server/services/media-inliner/{ExternalMediaInliner.js → external-media-inliner.js} +0 -0
  370. /package/core/server/services/member-attribution/{OutboundLinkTagger.js → outbound-link-tagger.js} +0 -0
  371. /package/core/server/services/member-attribution/{UrlHistory.js → url-history.js} +0 -0
  372. /package/core/server/services/member-welcome-emails/{MemberWelcomeEmailRenderer.js → member-welcome-email-renderer.js} +0 -0
  373. /package/core/server/services/members/importer/{MembersCSVImporterStripeUtils.js → members-csv-importer-stripe-utils.js} +0 -0
  374. /package/core/server/services/members/members-api/controllers/{MemberController.js → member-controller.js} +0 -0
  375. /package/core/server/services/members/members-api/controllers/{RouterController.js → router-controller.js} +0 -0
  376. /package/core/server/services/members/members-api/controllers/{WellKnownController.js → well-known-controller.js} +0 -0
  377. /package/core/server/services/members/members-api/repositories/{EventRepository.js → event-repository.js} +0 -0
  378. /package/core/server/services/members/members-api/repositories/{ProductRepository.js → product-repository.js} +0 -0
  379. /package/core/server/services/members/members-api/services/{GeolocationService.js → geolocation-service.js} +0 -0
  380. /package/core/server/services/members/members-api/services/{TokenService.js → token-service.js} +0 -0
  381. /package/core/server/services/members/{MembersConfigProvider.js → members-config-provider.js} +0 -0
  382. /package/core/server/services/members/{RequestIntegrityTokenProvider.js → request-integrity-token-provider.js} +0 -0
  383. /package/core/server/services/members/{SingleUseTokenProvider.js → single-use-token-provider.js} +0 -0
  384. /package/core/server/services/members/stats/{MembersStats.js → members-stats.js} +0 -0
  385. /package/core/server/services/members-events/{EventStorage.js → event-storage.js} +0 -0
  386. /package/core/server/services/members-events/{LastSeenAtCache.js → last-seen-at-cache.js} +0 -0
  387. /package/core/server/services/mentions/{MentionDiscoveryService.js → mention-discovery-service.js} +0 -0
  388. /package/core/server/services/mentions/{MentionSendingService.js → mention-sending-service.js} +0 -0
  389. /package/core/server/services/mentions-email-report/{StartMentionEmailReportJob.js → start-mention-email-report-job.js} +0 -0
  390. /package/core/server/services/milestones/{MilestoneCreatedEvent.js → milestone-created-event.js} +0 -0
  391. /package/core/server/services/milestones/{MilestoneQueries.js → milestone-queries.js} +0 -0
  392. /package/core/server/services/notifications/{Notifications.js → notifications.js} +0 -0
  393. /package/core/server/services/oembed/{NFTOEmbedProvider.js → nft-oembed-provider.js} +0 -0
  394. /package/core/server/services/oembed/{OEmbedService.js → oembed-service.js} +0 -0
  395. /package/core/server/services/oembed/{TwitterOEmbedProvider.js → twitter-oembed-provider.js} +0 -0
  396. /package/core/server/services/offers/domain/models/shared/{ValueObject.js → value-object.js} +0 -0
  397. /package/core/server/services/outbox/events/{StartOutboxProcessingEvent.js → start-outbox-processing-event.js} +0 -0
  398. /package/core/server/services/posts/{PostsExporter.js → posts-exporter.js} +0 -0
  399. /package/core/server/services/posts/stats/{PostStats.js → post-stats.js} +0 -0
  400. /package/core/server/services/recommendations/service/{BookshelfRepository.js → bookshelf-repository.js} +0 -0
  401. /package/core/server/services/recommendations/service/{BookshelfRepository.ts → bookshelf-repository.ts} +0 -0
  402. /package/core/server/services/recommendations/service/{ClickEvent.js → click-event.js} +0 -0
  403. /package/core/server/services/recommendations/service/{ClickEvent.ts → click-event.ts} +0 -0
  404. /package/core/server/services/recommendations/service/{IncomingRecommendationEmailRenderer.js → incoming-recommendation-email-renderer.js} +0 -0
  405. /package/core/server/services/recommendations/service/{IncomingRecommendationService.js → incoming-recommendation-service.js} +0 -0
  406. /package/core/server/services/recommendations/service/{RecommendationMetadataService.js → recommendation-metadata-service.js} +0 -0
  407. /package/core/server/services/recommendations/service/{RecommendationMetadataService.ts → recommendation-metadata-service.ts} +0 -0
  408. /package/core/server/services/recommendations/service/{RecommendationRepository.js → recommendation-repository.js} +0 -0
  409. /package/core/server/services/recommendations/service/{SubscribeEvent.js → subscribe-event.js} +0 -0
  410. /package/core/server/services/recommendations/service/{SubscribeEvent.ts → subscribe-event.ts} +0 -0
  411. /package/core/server/services/recommendations/service/{UnsafeData.js → unsafe-data.js} +0 -0
  412. /package/core/server/services/recommendations/service/{UnsafeData.ts → unsafe-data.ts} +0 -0
  413. /package/core/server/services/recommendations/service/{WellknownService.js → well-known-service.js} +0 -0
  414. /package/core/server/services/route-settings/{DefaultSettingsManager.js → default-settings-manager.js} +0 -0
  415. /package/core/server/services/route-settings/{RouteSettings.js → route-settings.js} +0 -0
  416. /package/core/server/services/route-settings/{SettingsLoader.js → settings-loader.js} +0 -0
  417. /package/core/server/services/route-settings/{SettingsPathManager.js → settings-path-manager.js} +0 -0
  418. /package/core/server/services/stats/{ContentStatsService.js → content-stats-service.js} +0 -0
  419. /package/core/server/services/stats/{MembersStatsService.js → members-stats-service.js} +0 -0
  420. /package/core/server/services/stats/{MrrStatsService.js → mrr-stats-service.js} +0 -0
  421. /package/core/server/services/stats/{SubscriptionStatsService.js → subscription-stats-service.js} +0 -0
  422. /package/core/server/services/stripe/events/{StripeLiveDisabledEvent.js → stripe-live-disabled-event.js} +0 -0
  423. /package/core/server/services/stripe/events/{StripeLiveEnabledEvent.js → stripe-live-enabled-event.js} +0 -0
  424. /package/core/server/services/stripe/services/webhook/{InvoiceEventService.js → invoice-event-service.js} +0 -0
  425. /package/core/server/services/stripe/services/webhook/{SubscriptionEventService.js → subscription-event-service.js} +0 -0
  426. /package/core/server/services/stripe/{StripeAPI.js → stripe-api.js} +0 -0
  427. /package/core/server/services/themes/{ThemeStorage.js → theme-storage.js} +0 -0
  428. /package/core/server/services/tinybird/{TinybirdService.js → tinybird-service.js} +0 -0
  429. /package/core/server/services/update-check/{UpdateCheckService.js → update-check-service.js} +0 -0
  430. /package/core/server/services/url/{LocalFileCache.js → local-file-cache.js} +0 -0
  431. /package/core/server/services/url/{Queue.js → queue.js} +0 -0
  432. /package/core/server/services/url/{Resource.js → resource.js} +0 -0
  433. /package/core/server/services/{Users.js → users.js} +0 -0
  434. /package/core/server/services/{VerificationTrigger.js → verification-trigger.js} +0 -0
  435. /package/core/server/services/webhooks/{WebhookTrigger.js → webhook-trigger.js} +0 -0
@@ -15,17 +15,17 @@ class EmailServiceWrapper {
15
15
  return;
16
16
  }
17
17
 
18
- const EmailService = require('./EmailService');
19
- const EmailController = require('./EmailController');
20
- const EmailRenderer = require('./EmailRenderer');
21
- const SendingService = require('./SendingService');
22
- const BatchSendingService = require('./BatchSendingService');
23
- const EmailSegmenter = require('./EmailSegmenter');
24
- const MailgunEmailProvider = require('./MailgunEmailProvider');
25
- const {DomainWarmingService} = require('./DomainWarmingService');
18
+ const EmailService = require('./email-service');
19
+ const EmailController = require('./email-controller');
20
+ const EmailRenderer = require('./email-renderer');
21
+ const SendingService = require('./sending-service');
22
+ const BatchSendingService = require('./batch-sending-service');
23
+ const EmailSegmenter = require('./email-segmenter');
24
+ const MailgunEmailProvider = require('./mailgun-email-provider');
25
+ const {DomainWarmingService} = require('./domain-warming-service');
26
26
 
27
27
  const {Post, Newsletter, Email, EmailBatch, EmailRecipient, Member} = require('../../models');
28
- const MailgunClient = require('../lib/MailgunClient');
28
+ const MailgunClient = require('../lib/mailgun-client');
29
29
  const configService = require('../../../shared/config');
30
30
  const settingsCache = require('../../../shared/settings-cache');
31
31
  const settingsHelpers = require('../settings-helpers');
@@ -5,15 +5,15 @@
5
5
  * @typedef {object} Email
6
6
  * @typedef {object} LimitService
7
7
  * @typedef {{checkVerificationRequired(): Promise<boolean>}} VerificationTrigger
8
- * @typedef {import ('./DomainWarmingService').DomainWarmingService} DomainWarmingService
8
+ * @typedef {import ('./domain-warming-service').DomainWarmingService} DomainWarmingService
9
9
  */
10
10
 
11
- const BatchSendingService = require('./BatchSendingService');
11
+ const BatchSendingService = require('./batch-sending-service');
12
12
  const errors = require('@tryghost/errors');
13
13
  const tpl = require('@tryghost/tpl');
14
- const EmailRenderer = require('./EmailRenderer');
15
- const EmailSegmenter = require('./EmailSegmenter');
16
- const SendingService = require('./SendingService');
14
+ const EmailRenderer = require('./email-renderer');
15
+ const EmailSegmenter = require('./email-segmenter');
16
+ const SendingService = require('./sending-service');
17
17
  const logging = require('@tryghost/logging');
18
18
 
19
19
  const messages = {
@@ -190,11 +190,11 @@ class EmailService {
190
190
 
191
191
  /**
192
192
  * @params {string} [segment]
193
- * @return {import('./EmailRenderer').MemberLike}
193
+ * @return {import('./email-renderer').MemberLike}
194
194
  */
195
195
  getDefaultExampleMember(segment) {
196
196
  /**
197
- * @type {import('./EmailRenderer').MemberLike}
197
+ * @type {import('./email-renderer').MemberLike}
198
198
  */
199
199
  return {
200
200
  id: 'example-id',
@@ -219,11 +219,11 @@ class EmailService {
219
219
  * @private
220
220
  * @param {string} [email] (optional) Search for a member with this email address and use it as the example. If not found, defaults to the default but still uses the provided email address.
221
221
  * @param {string} [segment] (optional) The segment to use for the example member
222
- * @return {Promise<import('./EmailRenderer').MemberLike>}
222
+ * @return {Promise<import('./email-renderer').MemberLike>}
223
223
  */
224
224
  async getExampleMember(email, segment) {
225
225
  /**
226
- * @type {import('./EmailRenderer').MemberLike}
226
+ * @type {import('./email-renderer').MemberLike}
227
227
  */
228
228
  const exampleMember = this.getDefaultExampleMember(segment);
229
229
 
@@ -259,8 +259,8 @@ class EmailService {
259
259
  * Do a manual replacement of tokens with values for a member (normally only used for previews)
260
260
  *
261
261
  * @param {string} htmlOrPlaintext
262
- * @param {import('./EmailRenderer').ReplacementDefinition[]} replacements
263
- * @param {import('./EmailRenderer').MemberLike} member
262
+ * @param {import('./email-renderer').ReplacementDefinition[]} replacements
263
+ * @param {import('./email-renderer').MemberLike} member
264
264
  * @return {string}
265
265
  */
266
266
  replaceDefinitions(htmlOrPlaintext, replacements, member) {
@@ -275,7 +275,7 @@ class EmailService {
275
275
  *
276
276
  * @param {*} post
277
277
  * @param {*} newsletter
278
- * @param {import('./EmailRenderer').Segment} segment
278
+ * @param {import('./email-renderer').Segment} segment
279
279
  * @returns {Promise<{subject: string, html: string, plaintext: string}>} Email preview
280
280
  */
281
281
  async previewEmail(post, newsletter, segment) {
@@ -295,7 +295,7 @@ class EmailService {
295
295
  *
296
296
  * @param {*} post
297
297
  * @param {*} newsletter
298
- * @param {import('./EmailRenderer').Segment} segment
298
+ * @param {import('./email-renderer').Segment} segment
299
299
  * @param {string[]} emails
300
300
  */
301
301
  async sendTestEmail(post, newsletter, segment, emails) {
@@ -1,3 +1,3 @@
1
- const EmailServiceWrapper = require('./EmailServiceWrapper');
1
+ const EmailServiceWrapper = require('./email-service-wrapper');
2
2
 
3
3
  module.exports = new EmailServiceWrapper();
@@ -80,7 +80,7 @@ class MailgunEmailProvider {
80
80
 
81
81
  /**
82
82
  * Send an email using the Mailgun API
83
- * @param {import('./SendingService').EmailData} data
83
+ * @param {import('./sending-service').EmailData} data
84
84
  * @param {EmailSendingOptions} options
85
85
  * @returns {Promise<EmailProviderSuccessResponse>}
86
86
  */
@@ -11,7 +11,7 @@ const logging = require('@tryghost/logging');
11
11
  * @prop {string} [replyTo]
12
12
  * @prop {string} [domainOverride]
13
13
  * @prop {Recipient[]} recipients
14
- * @prop {import("./EmailRenderer").ReplacementDefinition[]} replacementDefinitions
14
+ * @prop {import("./email-renderer").ReplacementDefinition[]} replacementDefinitions
15
15
  *
16
16
  * @typedef {object} IEmailProviderService
17
17
  * @prop {(emailData: EmailData, options: EmailSendingOptions) => Promise<EmailProviderSuccessResponse>} send
@@ -23,12 +23,12 @@ const logging = require('@tryghost/logging');
23
23
  */
24
24
 
25
25
  /**
26
- * @typedef {import("./EmailRenderer")} EmailRenderer
27
- * @typedef {import("./EmailRenderer").EmailBody} EmailBody
26
+ * @typedef {import("./email-renderer")} EmailRenderer
27
+ * @typedef {import("./email-renderer").EmailBody} EmailBody
28
28
  */
29
29
 
30
30
  /**
31
- * @typedef {import("../email-address/EmailAddressService").EmailAddressService} EmailAddressService
31
+ * @typedef {import("../email-address/email-address-service").EmailAddressService} EmailAddressService
32
32
  */
33
33
 
34
34
  /**
@@ -41,7 +41,7 @@ const logging = require('@tryghost/logging');
41
41
  */
42
42
 
43
43
  /**
44
- * @typedef {import("./EmailRenderer").MemberLike} MemberLike
44
+ * @typedef {import("./email-renderer").MemberLike} MemberLike
45
45
  */
46
46
 
47
47
  /**
@@ -156,7 +156,7 @@ class SendingService {
156
156
  /**
157
157
  * @private
158
158
  * @param {MemberLike[]} members
159
- * @param {import("./EmailRenderer").ReplacementDefinition[]} replacementDefinitions
159
+ * @param {import("./email-renderer").ReplacementDefinition[]} replacementDefinitions
160
160
  * @returns {Recipient[]}
161
161
  */
162
162
  buildRecipients(members, replacementDefinitions) {
@@ -1,4 +1,4 @@
1
- const {AbstractEmailSuppressionList, EmailSuppressionData} = require('./EmailSuppressionList');
1
+ const {AbstractEmailSuppressionList, EmailSuppressionData} = require('./email-suppression-list');
2
2
 
3
3
  module.exports = class InMemoryEmailSuppressionList extends AbstractEmailSuppressionList {
4
4
  store = ['spam@member.test', 'fail@member.test'];
@@ -1,6 +1,6 @@
1
- const {AbstractEmailSuppressionList, EmailSuppressionData, EmailSuppressedEvent} = require('./EmailSuppressionList');
2
- const SpamComplaintEvent = require('../email-service/events/SpamComplaintEvent');
3
- const EmailBouncedEvent = require('../email-service/events/EmailBouncedEvent');
1
+ const {AbstractEmailSuppressionList, EmailSuppressionData, EmailSuppressedEvent} = require('./email-suppression-list');
2
+ const SpamComplaintEvent = require('../email-service/events/spam-complaint-event');
3
+ const EmailBouncedEvent = require('../email-service/events/email-bounced-event');
4
4
  const DomainEvents = require('@tryghost/domain-events');
5
5
  const logging = require('@tryghost/logging');
6
6
  const models = require('../../models');
@@ -2,8 +2,8 @@ const models = require('../../models');
2
2
  const configService = require('../../../shared/config');
3
3
  const settingsCache = require('../../../shared/settings-cache');
4
4
  const labs = require('../../../shared/labs');
5
- const MailgunClient = require('../lib/MailgunClient');
6
- const MailgunEmailSuppressionList = require('./MailgunEmailSuppressionList');
5
+ const MailgunClient = require('../lib/mailgun-client');
6
+ const MailgunEmailSuppressionList = require('./mailgun-email-suppression-list');
7
7
 
8
8
  const mailgunClient = new MailgunClient({
9
9
  config: configService,
@@ -1,7 +1,7 @@
1
- const ExploreService = require('./ExploreService');
1
+ const ExploreService = require('./explore-service');
2
2
 
3
3
  const MembersService = require('../members');
4
- const PostsService = require('../posts/posts-service')();
4
+ const PostsService = require('../posts/posts-service-instance')();
5
5
  const PublicConfigService = require('../public-config');
6
6
  const StatsService = require('../stats');
7
7
  const StripeService = require('../stripe');
@@ -1,11 +1,11 @@
1
- const ExplorePingService = require('./ExplorePingService');
1
+ const ExplorePingService = require('./explore-ping-service');
2
2
  const config = require('../../../shared/config');
3
3
  const labs = require('../../../shared/labs');
4
4
  const logging = require('@tryghost/logging');
5
5
  const ghostVersion = require('@tryghost/version');
6
6
  const request = require('@tryghost/request');
7
7
  const settingsCache = require('../../../shared/settings-cache');
8
- const posts = require('../posts/posts-service');
8
+ const posts = require('../posts/posts-service-instance');
9
9
  const members = require('../members');
10
10
  const statsService = require('../stats');
11
11
 
@@ -1,5 +1,5 @@
1
1
  const models = require('../../models');
2
- const FrontendDataService = require('./FrontendDataService');
2
+ const FrontendDataService = require('./front-end-data-service');
3
3
 
4
4
  module.exports.init = () => {
5
5
  return new FrontendDataService({IntegrationModel: models.Integration});
@@ -1,4 +1,4 @@
1
- const {IdentityTokenService} = require('./IdentityTokenService');
1
+ const {IdentityTokenService} = require('./identity-token-service');
2
2
 
3
3
  module.exports = class IdentityTokenServiceWrapper {
4
4
  /** @type IdentityTokenService */
@@ -1 +1 @@
1
- module.exports = require('./IdentityTokenServiceWrapper');
1
+ module.exports = require('./identity-token-service-wrapper');
@@ -0,0 +1,212 @@
1
+ /**
2
+ * IndexNow Integration Service
3
+ *
4
+ * IndexNow is a protocol that allows websites to notify search engines about
5
+ * content changes for faster indexing. Instead of waiting for crawlers to
6
+ * discover updates, we proactively ping the IndexNow API when posts are
7
+ * published or updated.
8
+ *
9
+ * Protocol: https://www.indexnow.org/documentation
10
+ *
11
+ * How it works:
12
+ * 1. Ghost generates a unique API key (32-char hex string)
13
+ * 2. The key is stored in settings and served at /{key}.txt for verification
14
+ * 3. When a post is published/updated, we send a GET request to IndexNow:
15
+ * GET https://api.indexnow.org/indexnow?url={post-url}&key={key}&keyLocation={key-file-url}
16
+ * 4. IndexNow distributes the notification to participating search engines
17
+ * (Bing, Yandex, Seznam.cz, Naver, and others)
18
+ *
19
+ * The API key file is served by the middleware in:
20
+ * ghost/core/core/frontend/web/middleware/serve-indexnow-key.js
21
+ */
22
+
23
+ const urlService = require('./url');
24
+ const urlUtils = require('../../shared/url-utils');
25
+ const errors = require('@tryghost/errors');
26
+ const tpl = require('@tryghost/tpl');
27
+ const logging = require('@tryghost/logging');
28
+ const request = require('@tryghost/request');
29
+ const settingsCache = require('../../shared/settings-cache');
30
+ const labs = require('../../shared/labs');
31
+ const events = require('../lib/common/events');
32
+
33
+ const messages = {
34
+ requestFailedError: 'The {service} service was unable to send a ping request, your site will continue to function.',
35
+ requestFailedHelp: 'If you get this error repeatedly, please seek help on {url}.'
36
+ };
37
+
38
+ const defaultPostSlugs = [
39
+ 'welcome',
40
+ 'the-editor',
41
+ 'using-tags',
42
+ 'managing-users',
43
+ 'private-sites',
44
+ 'advanced-markdown',
45
+ 'themes',
46
+ 'coming-soon'
47
+ ];
48
+
49
+ // IndexNow endpoint - this routes to all participating search engines
50
+ const INDEXNOW_ENDPOINT = 'https://api.indexnow.org/indexnow';
51
+
52
+ /**
53
+ * Get existing API key from settings
54
+ * The key is auto-generated on boot by the settings service
55
+ * @returns {string|null} The API key or null if not set
56
+ */
57
+ function getApiKey() {
58
+ return settingsCache.get('indexnow_api_key') || null;
59
+ }
60
+
61
+ /**
62
+ * Ping IndexNow with a URL
63
+ * @param {Object} post - The post object
64
+ */
65
+ async function ping(post) {
66
+ // Skip pages - only ping for posts
67
+ if (post.type === 'page') {
68
+ return;
69
+ }
70
+
71
+ // Skip if site is private
72
+ if (settingsCache.get('is_private')) {
73
+ return;
74
+ }
75
+
76
+ // Skip if IndexNow is not enabled in labs
77
+ if (!labs.isSet('indexnow')) {
78
+ return;
79
+ }
80
+
81
+ // Don't ping for the default posts
82
+ if (defaultPostSlugs.indexOf(post.slug) > -1) {
83
+ return;
84
+ }
85
+
86
+ try {
87
+ const url = urlService.getUrlByResourceId(post.id, {absolute: true});
88
+
89
+ // Get the API key (auto-generated on boot by settings service)
90
+ const key = getApiKey();
91
+ if (!key) {
92
+ logging.warn('IndexNow: API key not available');
93
+ return;
94
+ }
95
+
96
+ // Get the site URL for the keyLocation parameter
97
+ const siteUrl = urlUtils.urlFor('home', true);
98
+
99
+ // Build the IndexNow request URL
100
+ const indexNowUrl = new URL(INDEXNOW_ENDPOINT);
101
+ indexNowUrl.searchParams.set('url', url);
102
+ indexNowUrl.searchParams.set('key', key);
103
+ indexNowUrl.searchParams.set('keyLocation', urlUtils.urlJoin(siteUrl, `${key}.txt`));
104
+
105
+ const options = {
106
+ timeout: {
107
+ request: 5 * 1000 // 5 second timeout
108
+ }
109
+ };
110
+
111
+ const response = await request(indexNowUrl.toString(), options);
112
+
113
+ if (response.statusCode !== 200 && response.statusCode !== 202) {
114
+ throw new errors.InternalServerError({
115
+ message: `IndexNow returned unexpected status: ${response.statusCode}`
116
+ });
117
+ }
118
+
119
+ logging.info(`IndexNow: Successfully pinged ${url}`);
120
+ } catch (err) {
121
+ // Log errors but don't throw - IndexNow failures shouldn't disrupt publishing
122
+ let error;
123
+ if (err.statusCode === 429) {
124
+ error = new errors.TooManyRequestsError({
125
+ err,
126
+ message: err.message,
127
+ context: tpl(messages.requestFailedError, {service: 'IndexNow'}),
128
+ help: tpl(messages.requestFailedHelp, {url: 'https://ghost.org/docs/'})
129
+ });
130
+ } else if (err.statusCode === 422) {
131
+ // 422 means the URL is invalid or key doesn't match
132
+ error = new errors.ValidationError({
133
+ err,
134
+ message: 'IndexNow key validation failed',
135
+ context: tpl(messages.requestFailedError, {service: 'IndexNow'}),
136
+ help: 'Ensure your IndexNow API key file is accessible at the correct URL'
137
+ });
138
+ } else {
139
+ error = new errors.InternalServerError({
140
+ err: err,
141
+ message: err.message,
142
+ context: tpl(messages.requestFailedError, {service: 'IndexNow'}),
143
+ help: tpl(messages.requestFailedHelp, {url: 'https://ghost.org/docs/'})
144
+ });
145
+ }
146
+ logging.warn(error);
147
+ }
148
+ }
149
+
150
+ /**
151
+ * Check if any SEO-relevant fields have changed
152
+ * These are fields that affect how the post appears in search results
153
+ * @param {Object} model - The model instance
154
+ * @returns {boolean} True if SEO-relevant content has changed
155
+ */
156
+ function hasSeoRelevantChanges(model) {
157
+ // Fields that affect how the post appears in search engine results
158
+ const seoFields = [
159
+ 'html', // Post content
160
+ 'title', // Post title (appears in SERP)
161
+ 'slug', // URL path
162
+ 'meta_title', // Custom meta title
163
+ 'meta_description', // Meta description (appears in SERP)
164
+ 'canonical_url', // Canonical URL
165
+ 'status' // Published status change
166
+ ];
167
+
168
+ return seoFields.some(field => model.get(field) !== model.previous(field));
169
+ }
170
+
171
+ /**
172
+ * Event listener for post.published events
173
+ * @param {Object} model - The model instance
174
+ * @param {Object} options - Event options
175
+ */
176
+ function indexnowListener(model, options) {
177
+ // CASE: do not ping if we import a database
178
+ if (options && options.importing) {
179
+ return;
180
+ }
181
+
182
+ // Content-based deduplication: skip if no SEO-relevant fields changed
183
+ // This avoids spamming IndexNow when minor non-content edits are made
184
+ if (!hasSeoRelevantChanges(model)) {
185
+ return;
186
+ }
187
+
188
+ ping(model.toJSON()).catch(() => {
189
+ // Errors are already logged inside ping()
190
+ // This catch is just to prevent unhandled rejection warnings
191
+ });
192
+ }
193
+
194
+ /**
195
+ * Register event listeners for IndexNow
196
+ */
197
+ function listen() {
198
+ // Listen for new posts being published
199
+ events
200
+ .removeListener('post.published', indexnowListener)
201
+ .on('post.published', indexnowListener);
202
+
203
+ // Also listen for published posts being edited
204
+ events
205
+ .removeListener('post.published.edited', indexnowListener)
206
+ .on('post.published.edited', indexnowListener);
207
+ }
208
+
209
+ module.exports = {
210
+ listen: listen,
211
+ getApiKey: getApiKey
212
+ };
@@ -2,7 +2,7 @@ const settingsCache = require('../../../shared/settings-cache');
2
2
  const settingsHelpers = require('../settings-helpers');
3
3
  const mailService = require('../../services/mail');
4
4
  const urlUtils = require('../../../shared/url-utils');
5
- const Invites = require('./Invites');
5
+ const Invites = require('./invites');
6
6
 
7
7
  module.exports = new Invites({
8
8
  settingsCache,
@@ -1,5 +1,5 @@
1
1
  const urlUtils = require('../../../shared/url-utils');
2
- const LinkRedirectRepository = require('./LinkRedirectRepository');
2
+ const LinkRedirectRepository = require('./link-redirect-repository');
3
3
  const adapterManager = require('../adapter-manager');
4
4
  const config = require('../../../shared/config');
5
5
  const EventRegistry = require('../../lib/common/events');
@@ -14,7 +14,7 @@ class LinkRedirectsServiceWrapper {
14
14
  // Wire up all the dependencies
15
15
  const models = require('../../models');
16
16
 
17
- const LinkRedirectsService = require('./LinkRedirectsService');
17
+ const LinkRedirectsService = require('./link-redirects-service');
18
18
 
19
19
  this.linkRedirectRepository = new LinkRedirectRepository({
20
20
  LinkRedirect: models.Redirect,
@@ -1,4 +1,4 @@
1
- const LinkRedirect = require('./LinkRedirect');
1
+ const LinkRedirect = require('./link-redirect');
2
2
  const ObjectID = require('bson-objectid').default;
3
3
  const debug = require('@tryghost/debug')('LinkRedirectRepository');
4
4
 
@@ -1,7 +1,7 @@
1
1
  const crypto = require('crypto');
2
2
  const DomainEvents = require('@tryghost/domain-events');
3
- const RedirectEvent = require('./RedirectEvent');
4
- const LinkRedirect = require('./LinkRedirect');
3
+ const RedirectEvent = require('./redirect-event');
4
+ const LinkRedirect = require('./link-redirect');
5
5
 
6
6
  /**
7
7
  * @typedef {object} ILinkRedirectRepository
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @typedef {object} RedirectEventData
3
3
  * @prop {URL} url
4
- * @prop {import('./LinkRedirect')} link
4
+ * @prop {import('./link-redirect')} link
5
5
  */
6
6
 
7
7
  module.exports = class RedirectEvent {
@@ -1,5 +1,5 @@
1
- const LinkClickRepository = require('./LinkClickRepository');
2
- const PostLinkRepository = require('./PostLinkRepository');
1
+ const LinkClickRepository = require('./link-click-repository');
2
+ const PostLinkRepository = require('./post-link-repository');
3
3
  const errors = require('@tryghost/errors');
4
4
  const urlUtils = require('../../../shared/url-utils');
5
5
 
@@ -20,7 +20,7 @@ class LinkTrackingServiceWrapper {
20
20
  const {MemberLinkClickEvent} = require('../../../shared/events');
21
21
  const DomainEvents = require('@tryghost/domain-events');
22
22
 
23
- const LinkClickTrackingService = require('./LinkClickTrackingService');
23
+ const LinkClickTrackingService = require('./link-click-tracking-service');
24
24
 
25
25
  const postLinkRepository = new PostLinkRepository({
26
26
  LinkRedirect: models.Redirect,
@@ -1,4 +1,4 @@
1
- const LinkClick = require('./ClickEvent');
1
+ const LinkClick = require('./click-event');
2
2
  const ObjectID = require('bson-objectid').default;
3
3
  const sentry = require('../../../shared/sentry');
4
4
  const config = require('../../../shared/config');
@@ -1,6 +1,6 @@
1
- const RedirectEvent = require('../link-redirection/RedirectEvent');
2
- const LinkClick = require('./ClickEvent');
3
- const PostLink = require('./PostLink');
1
+ const RedirectEvent = require('../link-redirection/redirect-event');
2
+ const LinkClick = require('./click-event');
3
+ const PostLink = require('./post-link');
4
4
  const ObjectID = require('bson-objectid').default;
5
5
  const errors = require('@tryghost/errors');
6
6
  const nql = require('@tryghost/nql');
@@ -22,7 +22,7 @@ const moment = require('moment');
22
22
  */
23
23
 
24
24
  /**
25
- * @typedef {import('./FullPostLink')} FullPostLink
25
+ * @typedef {import('./full-post-link')} FullPostLink
26
26
  */
27
27
 
28
28
  /**
@@ -1,9 +1,9 @@
1
- const FullPostLink = require('./FullPostLink');
1
+ const FullPostLink = require('./full-post-link');
2
2
  const _ = require('lodash');
3
3
 
4
4
  /**
5
5
  * @typedef {import('bson-objectid').default} ObjectID
6
- * @typedef {import('./PostLink')} PostLink
6
+ * @typedef {import('./post-link')} PostLink
7
7
  */
8
8
 
9
9
  module.exports = class PostLinkRepository {
@@ -30,17 +30,17 @@ module.exports = class PostLinkRepository {
30
30
  async getAll(options) {
31
31
  // Create a collection with applied filters
32
32
  const itemCollection = this.#LinkRedirect.forge();
33
-
33
+
34
34
  // Apply default and custom filters from the options
35
35
  if (options.filter) {
36
36
  itemCollection.applyDefaultAndCustomFilters({filter: options.filter});
37
37
  }
38
-
38
+
39
39
  // Apply ordering
40
40
  itemCollection.query((qb) => {
41
41
  qb.orderByRaw('`count__clicks` DESC, `to` DESC');
42
42
  });
43
-
43
+
44
44
  // Fetch the collection with the applied query modifications
45
45
  const collection = await itemCollection.fetchAll({withRelated: ['count.clicks']});
46
46
 
@@ -48,7 +48,7 @@ module.exports = class PostLinkRepository {
48
48
 
49
49
  for (const model of collection.models) {
50
50
  const link = this.#linkRedirectRepository.fromModel(model);
51
-
51
+
52
52
  result.push(
53
53
  new FullPostLink({
54
54
  post_id: model.get('post_id'),
@@ -59,7 +59,7 @@ module.exports = class PostLinkRepository {
59
59
  })
60
60
  );
61
61
  }
62
-
62
+
63
63
  return result;
64
64
  }
65
65
 
@@ -16,7 +16,7 @@ const messages = {
16
16
  reason: ' Reason: {reason}.',
17
17
  messageSent: 'Message sent. Double check inbox and spam folder!'
18
18
  };
19
- const EmailAddressParser = require('../email-address/EmailAddressParser');
19
+ const EmailAddressParser = require('../email-address/email-address-parser');
20
20
  const DEFAULT_TAGS = ['ghost-email', 'transactional-email'];
21
21
 
22
22
  function getDomain() {
@@ -1,7 +1,7 @@
1
1
  const path = require('path');
2
2
  const urlUtils = require('../../../shared/url-utils');
3
3
  const settingsCache = require('../../../shared/settings-cache');
4
- const EmailContentGenerator = require('../lib/EmailContentGenerator');
4
+ const EmailContentGenerator = require('../lib/email-content-generator');
5
5
 
6
6
  const emailContentGenerator = new EmailContentGenerator({
7
7
  getSiteUrl: () => urlUtils.urlFor('home', true),
@@ -9,7 +9,7 @@ const emailContentGenerator = new EmailContentGenerator({
9
9
  templatesDir: path.resolve(__dirname, '..', 'mail', 'templates')
10
10
  });
11
11
 
12
- exports.GhostMailer = require('./GhostMailer');
12
+ exports.GhostMailer = require('./ghost-mailer');
13
13
  exports.utils = {
14
14
  generateContent: emailContentGenerator.getContent.bind(emailContentGenerator)
15
15
  };
@@ -1,7 +1,7 @@
1
1
  module.exports = {
2
2
  async init() {
3
3
  const debug = require('@tryghost/debug')('mediaInliner');
4
- const MediaInliner = require('./ExternalMediaInliner');
4
+ const MediaInliner = require('./external-media-inliner');
5
5
  const models = require('../../models');
6
6
  const jobsService = require('../jobs');
7
7