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
@@ -0,0 +1,66 @@
1
+ /**
2
+ * IndexNow API Key Verification File Middleware
3
+ *
4
+ * IndexNow requires websites to prove ownership by hosting a text file
5
+ * containing the API key at a predictable URL: https://example.com/{key}.txt
6
+ *
7
+ * This middleware dynamically serves that file based on the configured key,
8
+ * rather than requiring users to manually upload a file.
9
+ *
10
+ * Security considerations:
11
+ * - Only serves keys that exactly match the configured key
12
+ * - Only responds to 32-character hex patterns (valid IndexNow key format)
13
+ * - Returns 404 (via next()) if IndexNow is disabled or no key configured
14
+ *
15
+ * Route collision note:
16
+ * The pattern /[a-f0-9]{32}.txt is unlikely to collide with user content
17
+ * since pages/posts don't have .txt extensions. The middleware runs before
18
+ * theme static assets, so IndexNow key files take precedence over any
19
+ * theme .txt files with matching names (which is the intended behavior
20
+ * for system-generated verification files).
21
+ *
22
+ * @see ghost/core/core/server/services/indexnow.js - Main IndexNow service
23
+ */
24
+
25
+ const settingsCache = require('../../../shared/settings-cache');
26
+ const labs = require('../../../shared/labs');
27
+
28
+ /**
29
+ * Middleware to serve the IndexNow API key verification file
30
+ */
31
+ function serveIndexNowKey(req, res, next) {
32
+ // Only handle requests for .txt files at the root
33
+ if (!req.path.match(/^\/[a-f0-9]{32}\.txt$/)) {
34
+ return next();
35
+ }
36
+
37
+ // Check if IndexNow is enabled
38
+ if (!labs.isSet('indexnow')) {
39
+ return next();
40
+ }
41
+
42
+ const apiKey = settingsCache.get('indexnow_api_key');
43
+
44
+ // No key configured
45
+ if (!apiKey) {
46
+ return next();
47
+ }
48
+
49
+ // Extract the requested key from the path (remove leading / and trailing .txt)
50
+ const requestedKey = req.path.slice(1, -4);
51
+
52
+ // Only serve if the requested key matches the configured key
53
+ if (requestedKey !== apiKey) {
54
+ return next();
55
+ }
56
+
57
+ // Serve the key as plain text
58
+ res.set({
59
+ 'Content-Type': 'text/plain',
60
+ 'Cache-Control': 'public, max-age=86400' // Cache for 24 hours
61
+ });
62
+
63
+ return res.send(apiKey);
64
+ }
65
+
66
+ module.exports = serveIndexNowKey;
@@ -94,6 +94,9 @@ module.exports = function setupSiteApp(routerConfig) {
94
94
  }
95
95
  });
96
96
 
97
+ // Serve IndexNow API key verification file (/{key}.txt)
98
+ siteApp.use(mw.serveIndexNowKey);
99
+
97
100
  // Theme static assets/files
98
101
  siteApp.use(mw.staticTheme());
99
102
 
@@ -10,7 +10,7 @@ const invitations = require('../../services/invitations');
10
10
  const dbBackup = require('../../data/db/backup');
11
11
  const apiMail = require('./index').mail;
12
12
  const apiSettings = require('./index').settings;
13
- const UsersService = require('../../services/Users');
13
+ const UsersService = require('../../services/users');
14
14
  const userService = new UsersService({dbBackup, models, auth, apiMail, apiSettings});
15
15
  const {deleteAllSessions} = require('../../services/auth/session');
16
16
 
@@ -1,7 +1,7 @@
1
1
  const models = require('../../models');
2
2
  const tpl = require('@tryghost/tpl');
3
3
  const errors = require('@tryghost/errors');
4
- const getPostServiceInstance = require('../../services/posts/posts-service');
4
+ const getPostServiceInstance = require('../../services/posts/posts-service-instance');
5
5
  const ALLOWED_INCLUDES = ['tags', 'authors', 'authors.roles', 'tiers', 'count.signups', 'count.paid_conversions', 'post_revisions', 'post_revisions.author'];
6
6
  const UNSAFE_ATTRS = ['status', 'authors', 'visibility'];
7
7
 
@@ -3,7 +3,7 @@ const tpl = require('@tryghost/tpl');
3
3
  const errors = require('@tryghost/errors');
4
4
  const {mapQuery} = require('@tryghost/mongo-utils');
5
5
  const postsPublicService = require('../../services/posts-public');
6
- const getPostServiceInstance = require('../../services/posts/posts-service');
6
+ const getPostServiceInstance = require('../../services/posts/posts-service-instance');
7
7
  const postsService = getPostServiceInstance();
8
8
 
9
9
  const allowedIncludes = ['tags', 'authors', 'tiers', 'sentiment'];
@@ -1,6 +1,6 @@
1
1
  const urlUtils = require('../../../shared/url-utils');
2
2
  const models = require('../../models');
3
- const getPostServiceInstance = require('../../services/posts/posts-service');
3
+ const getPostServiceInstance = require('../../services/posts/posts-service-instance');
4
4
  const allowedIncludes = [
5
5
  'tags',
6
6
  'authors',
@@ -1,5 +1,5 @@
1
1
  const models = require('../../models');
2
- const getPostServiceInstance = require('../../services/posts/posts-service');
2
+ const getPostServiceInstance = require('../../services/posts/posts-service-instance');
3
3
  const postsService = getPostServiceInstance();
4
4
 
5
5
  /** @type {import('@tryghost/api-framework').Controller} */
@@ -1,5 +1,5 @@
1
1
  const models = require('../../models');
2
- const getPostServiceInstance = require('../../services/posts/posts-service');
2
+ const getPostServiceInstance = require('../../services/posts/posts-service-instance');
3
3
  const postsService = getPostServiceInstance();
4
4
 
5
5
  /** @type {import('@tryghost/api-framework').Controller} */
@@ -6,7 +6,7 @@ const dbBackup = require('../../data/db/backup');
6
6
  const auth = require('../../services/auth');
7
7
  const apiMail = require('./index').mail;
8
8
  const apiSettings = require('./index').settings;
9
- const UsersService = require('../../services/Users');
9
+ const UsersService = require('../../services/users');
10
10
  const userService = new UsersService({dbBackup, models, auth, apiMail, apiSettings});
11
11
  const ALLOWED_INCLUDES = ['count.posts', 'permissions', 'roles', 'roles.permissions'];
12
12
  const UNSAFE_ATTRS = ['status', 'roles'];
@@ -78,7 +78,8 @@ const EDITABLE_SETTINGS = [
78
78
  'require_email_mfa',
79
79
  'social_web',
80
80
  'explore_ping',
81
- 'explore_ping_growth'
81
+ 'explore_ping_growth',
82
+ 'indexnow_api_key'
82
83
  ];
83
84
 
84
85
  module.exports = {
@@ -14,7 +14,7 @@ const utils = require('../../../index');
14
14
 
15
15
  const postsMetaSchema = require('../../../../../../data/schema').tables.posts_meta;
16
16
 
17
- const getPostServiceInstance = require('../../../../../../services/posts/posts-service');
17
+ const getPostServiceInstance = require('../../../../../../services/posts/posts-service-instance');
18
18
  const postsService = getPostServiceInstance();
19
19
 
20
20
  const commentsService = require('../../../../../../services/comments');
@@ -2,7 +2,7 @@ const _ = require('lodash');
2
2
  const {ValidationError} = require('@tryghost/errors');
3
3
  const validator = require('@tryghost/validator');
4
4
  const tpl = require('@tryghost/tpl');
5
- const AnnouncementBarSettings = require('../../../../../services/announcement-bar-service/AnnouncementBarSettings');
5
+ const AnnouncementBarSettings = require('../../../../../services/announcement-bar-service/announcement-bar-settings');
6
6
 
7
7
  const messages = {
8
8
  invalidEmailReceived: 'Please send a valid email',
@@ -93,7 +93,8 @@ const SETTING_KEYS_BLOCKLIST = [
93
93
  'stripe_publishable_key',
94
94
  'members_stripe_webhook_id',
95
95
  'members_stripe_webhook_secret',
96
- 'email_verification_required'
96
+ 'email_verification_required',
97
+ 'indexnow_api_key'
97
98
  ];
98
99
 
99
100
  module.exports = {
@@ -0,0 +1,9 @@
1
+ const crypto = require('crypto');
2
+ const {addSetting} = require('../../utils');
3
+
4
+ module.exports = addSetting({
5
+ key: 'indexnow_api_key',
6
+ value: crypto.randomBytes(16).toString('hex'),
7
+ type: 'string',
8
+ group: 'indexnow'
9
+ });
@@ -637,5 +637,11 @@
637
637
  },
638
638
  "type": "boolean"
639
639
  }
640
+ },
641
+ "indexnow": {
642
+ "indexnow_api_key": {
643
+ "defaultValue": null,
644
+ "type": "string"
645
+ }
640
646
  }
641
647
  }
@@ -72,7 +72,7 @@ module.exports = {
72
72
 
73
73
  async render(lexical, userOptions = {}) {
74
74
  if (!postsService) {
75
- const getPostServiceInstance = require('../services/posts/posts-service');
75
+ const getPostServiceInstance = require('../services/posts/posts-service-instance');
76
76
  postsService = getPostServiceInstance();
77
77
  }
78
78
  if (!serializePosts) {
@@ -60,7 +60,8 @@ function parseDefaultSettings() {
60
60
  members_otc_secret: () => crypto.randomBytes(64).toString('hex'),
61
61
  ghost_public_key: () => getGhostKey('public'),
62
62
  ghost_private_key: () => getGhostKey('private'),
63
- site_uuid: () => getOrGenerateSiteUuid()
63
+ site_uuid: () => getOrGenerateSiteUuid(),
64
+ indexnow_api_key: () => crypto.randomBytes(16).toString('hex')
64
65
  };
65
66
 
66
67
  _.each(defaultSettingsInCategories, function each(settings, categoryName) {
@@ -1,4 +1,4 @@
1
- const {ActivityPubService} = require('./ActivityPubService');
1
+ const {ActivityPubService} = require('./activity-pub-service');
2
2
 
3
3
  module.exports = class ActivityPubServiceWrapper {
4
4
  /** @type ActivityPubService */
@@ -1,6 +1,6 @@
1
1
  import ObjectID from 'bson-objectid';
2
2
  import {Knex} from 'knex';
3
- import {IdentityTokenService} from '../identity-tokens/IdentityTokenService';
3
+ import {IdentityTokenService} from '../identity-tokens/identity-token-service';
4
4
  import fetch from 'node-fetch';
5
5
 
6
6
  type ExpectedWebhook = {
@@ -1 +1 @@
1
- module.exports = require('./ActivityPubServiceWrapper');
1
+ module.exports = require('./activity-pub-service-wrapper');
@@ -1,4 +1,4 @@
1
- const AdapterManager = require('./AdapterManager');
1
+ const AdapterManager = require('./adapter-manager');
2
2
  const getAdapterServiceConfig = require('./config');
3
3
  const resolveAdapterOptions = require('./options-resolver');
4
4
  const config = require('../../../shared/config');
@@ -1,4 +1,4 @@
1
- const AnnouncementVisibilityValues = require('./AnnouncementVisibilityValues');
1
+ const AnnouncementVisibilityValues = require('./announcement-visibility-values');
2
2
 
3
3
  class AnnouncementBarSettings {
4
4
  #getAnnouncementSettings;
@@ -1,5 +1,5 @@
1
1
  const settingsCache = require('../../../shared/settings-cache');
2
- const AnnouncementBarSettings = require('./AnnouncementBarSettings');
2
+ const AnnouncementBarSettings = require('./announcement-bar-settings');
3
3
 
4
4
  const announcementBarService = new AnnouncementBarSettings({
5
5
  getAnnouncementSettings: () => ({
@@ -1,4 +1,4 @@
1
- const Feedback = require('./Feedback');
1
+ const Feedback = require('./feedback');
2
2
  const errors = require('@tryghost/errors');
3
3
  const tpl = require('@tryghost/tpl');
4
4
 
@@ -74,8 +74,8 @@ class AudienceFeedbackController {
74
74
  }
75
75
 
76
76
  const feedback = new Feedback({
77
- memberId: member.id,
78
- postId: post.id,
77
+ memberId: member.id,
78
+ postId: post.id,
79
79
  score
80
80
  });
81
81
  await this.#repository.add(feedback);
@@ -1,10 +1,10 @@
1
1
  const urlUtils = require('../../../shared/url-utils');
2
2
  const urlService = require('../../services/url');
3
3
 
4
- const AudienceFeedbackService = require('./AudienceFeedbackService');
5
- const AudienceFeedbackController = require('./AudienceFeedbackController');
6
- const Feedback = require('./Feedback');
7
- const FeedbackRepository = require('./FeedbackRepository');
4
+ const AudienceFeedbackService = require('./audience-feedback-service');
5
+ const AudienceFeedbackController = require('./audience-feedback-controller');
6
+ const Feedback = require('./feedback');
7
+ const FeedbackRepository = require('./feedback-repository');
8
8
 
9
9
  class AudienceFeedbackServiceWrapper {
10
10
  async init() {
@@ -5,7 +5,7 @@ const settingsCache = require('../../../../shared/settings-cache');
5
5
  const models = require('../../../models');
6
6
  const urlUtils = require('../../../../shared/url-utils');
7
7
 
8
- const SessionStore = require('./SessionStore');
8
+ const SessionStore = require('./session-store');
9
9
  const sessionStore = new SessionStore(models.Session);
10
10
 
11
11
  let unoExpressSessionMiddleware;
@@ -17,8 +17,8 @@ const messages = {
17
17
 
18
18
  module.exports = class CommentsController {
19
19
  /**
20
- * @param {import('./CommentsService')} service
21
- * @param {import('./CommentsStatsService')} stats
20
+ * @param {import('./comments-service')} service
21
+ * @param {import('./comments-stats-service')} stats
22
22
  */
23
23
  constructor(service, stats) {
24
24
  this.service = service;
@@ -1,7 +1,7 @@
1
1
  const moment = require('moment');
2
2
  const htmlToPlaintext = require('@tryghost/html-to-plaintext');
3
3
  const emailService = require('../email-service');
4
- const CommentsServiceEmailRenderer = require('./CommentsServiceEmailRenderer');
4
+ const CommentsServiceEmailRenderer = require('./comments-service-email-renderer');
5
5
  const {t} = require('../i18n');
6
6
 
7
7
  class CommentsServiceEmails {
@@ -25,7 +25,7 @@ class CommentsService {
25
25
  /** @private */
26
26
  this.contentGating = contentGating;
27
27
 
28
- const Emails = require('./CommentsServiceEmails');
28
+ const Emails = require('./comments-service-emails');
29
29
  /** @private */
30
30
  this.emails = new Emails({
31
31
  config,
@@ -1,8 +1,8 @@
1
1
  class CommentsServiceWrapper {
2
2
  init() {
3
- const CommentsService = require('./CommentsService');
4
- const CommentsController = require('./CommentsController');
5
- const CommentsStats = require('./CommentsStatsService');
3
+ const CommentsService = require('./comments-service');
4
+ const CommentsController = require('./comments-controller');
5
+ const CommentsStats = require('./comments-stats-service');
6
6
 
7
7
  const config = require('../../../shared/config');
8
8
  const logging = require('@tryghost/logging');
@@ -1,8 +1,8 @@
1
1
  const config = require('../../../shared/config');
2
2
  const urlUtils = require('../../../shared/url-utils');
3
3
 
4
- const DynamicRedirectManager = require('../lib/DynamicRedirectManager');
5
- const CustomRedirectsAPI = require('./CustomRedirectsAPI');
4
+ const DynamicRedirectManager = require('../lib/dynamic-redirect-manager');
5
+ const CustomRedirectsAPI = require('./custom-redirects-api');
6
6
  const validation = require('./validation');
7
7
  const {getBackupRedirectsFilePath} = require('./utils');
8
8
 
@@ -1,4 +1,4 @@
1
- import {DonationPaymentEvent} from './DonationPaymentEvent';
1
+ import {DonationPaymentEvent} from './donation-payment-event';
2
2
 
3
3
  type DonationRepository = {
4
4
  save(event: DonationPaymentEvent): Promise<void>;
@@ -8,7 +8,7 @@ class DonationServiceWrapper {
8
8
  return;
9
9
  }
10
10
 
11
- const {DonationBookshelfRepository} = require('./DonationBookshelfRepository');
11
+ const {DonationBookshelfRepository} = require('./donation-bookshelf-repository');
12
12
 
13
13
  this.repository = new DonationBookshelfRepository({
14
14
  DonationPaymentEventModel
@@ -1,3 +1,3 @@
1
- const DonationServiceWrapper = require('./DonationServiceWrapper');
1
+ const DonationServiceWrapper = require('./donation-service-wrapper');
2
2
 
3
3
  module.exports = new DonationServiceWrapper();
@@ -1,6 +1,6 @@
1
1
  class EmailAddressServiceWrapper {
2
2
  /**
3
- * @type {import('./EmailAddressService').EmailAddressService}
3
+ * @type {import('./email-address-service').EmailAddressService}
4
4
  */
5
5
  service;
6
6
 
@@ -14,7 +14,7 @@ class EmailAddressServiceWrapper {
14
14
  const settingsHelpers = require('../settings-helpers');
15
15
  const validator = require('@tryghost/validator');
16
16
 
17
- const {EmailAddressService} = require('./EmailAddressService');
17
+ const {EmailAddressService} = require('./email-address-service');
18
18
 
19
19
  this.service = new EmailAddressService({
20
20
  labs,
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.EmailAddressService = void 0;
7
7
  /* eslint-disable ghost/filenames/match-exported-class */
8
8
  const logging_1 = __importDefault(require("@tryghost/logging"));
9
- const EmailAddressParser_js_1 = __importDefault(require("./EmailAddressParser.js"));
9
+ const email_address_parser_js_1 = __importDefault(require("./email-address-parser.js"));
10
10
  class EmailAddressService {
11
11
  #getManagedEmailEnabled;
12
12
  #getSendingDomain;
@@ -25,7 +25,7 @@ class EmailAddressService {
25
25
  if (!fallbackAddress) {
26
26
  return null;
27
27
  }
28
- return EmailAddressParser_js_1.default.parse(fallbackAddress);
28
+ return email_address_parser_js_1.default.parse(fallbackAddress);
29
29
  };
30
30
  this.#isValidEmailAddress = dependencies.isValidEmailAddress;
31
31
  this.#labs = dependencies.labs;
@@ -46,8 +46,8 @@ class EmailAddressService {
46
46
  return this.#getFallbackEmail();
47
47
  }
48
48
  getAddressFromString(from, replyTo) {
49
- const parsedFrom = EmailAddressParser_js_1.default.parse(from);
50
- const parsedReplyTo = replyTo ? EmailAddressParser_js_1.default.parse(replyTo) : undefined;
49
+ const parsedFrom = email_address_parser_js_1.default.parse(from);
50
+ const parsedReplyTo = replyTo ? email_address_parser_js_1.default.parse(replyTo) : undefined;
51
51
  return this.getAddress({
52
52
  from: parsedFrom ?? this.defaultFromEmail,
53
53
  replyTo: parsedReplyTo ?? undefined
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable ghost/filenames/match-exported-class */
2
2
  import logging from '@tryghost/logging';
3
- import EmailAddressParser, {EmailAddress} from './EmailAddressParser.js';
3
+ import EmailAddressParser, {EmailAddress} from './email-address-parser.js';
4
4
 
5
5
  export type EmailAddresses = {
6
6
  from: EmailAddress,
@@ -1,3 +1,3 @@
1
- const EmailAddressServiceWrapper = require('./EmailAddressServiceWrapper');
1
+ const EmailAddressServiceWrapper = require('./email-address-service-wrapper');
2
2
 
3
3
  module.exports = new EmailAddressServiceWrapper();
@@ -1,4 +1,4 @@
1
- const MailgunClient = require('../lib/MailgunClient');
1
+ const MailgunClient = require('../lib/mailgun-client');
2
2
 
3
3
  const DEFAULT_EVENT_FILTER = 'delivered OR opened OR failed OR unsubscribed OR complained';
4
4
  const PAGE_LIMIT = 300;
@@ -8,12 +8,12 @@ class EmailAnalyticsServiceWrapper {
8
8
  return;
9
9
  }
10
10
 
11
- const EmailAnalyticsService = require('./EmailAnalyticsService');
12
- const EmailEventStorage = require('../email-service/EmailEventStorage');
13
- const EmailEventProcessor = require('../email-service/EmailEventProcessor');
14
- const MailgunProvider = require('./EmailAnalyticsProviderMailgun');
11
+ const EmailAnalyticsService = require('./email-analytics-service');
12
+ const EmailEventStorage = require('../email-service/email-event-storage');
13
+ const EmailEventProcessor = require('../email-service/email-event-processor');
14
+ const MailgunProvider = require('./email-analytics-provider-mailgun');
15
15
  const {EmailRecipientFailure, EmailSpamComplaintEvent, Email} = require('../../models');
16
- const StartEmailAnalyticsJobEvent = require('./events/StartEmailAnalyticsJobEvent');
16
+ const StartEmailAnalyticsJobEvent = require('./events/start-email-analytics-job-event');
17
17
  const domainEvents = require('@tryghost/domain-events');
18
18
  const settings = require('../../../shared/settings-cache');
19
19
  const labs = require('../../../shared/labs');
@@ -1,9 +1,9 @@
1
- const EventProcessingResult = require('./EventProcessingResult');
1
+ const EventProcessingResult = require('./event-processing-result');
2
2
  const logging = require('@tryghost/logging');
3
3
  const errors = require('@tryghost/errors');
4
4
 
5
5
  /**
6
- * @typedef {import('../email-service/EmailEventProcessor')} EmailEventProcessor
6
+ * @typedef {import('../email-service/email-event-processor')} EmailEventProcessor
7
7
  */
8
8
 
9
9
  /**
@@ -1,3 +1,3 @@
1
- const EmailAnalyticsServiceWrapper = require('./EmailAnalyticsServiceWrapper');
1
+ const EmailAnalyticsServiceWrapper = require('./email-analytics-service-wrapper');
2
2
 
3
3
  module.exports = new EmailAnalyticsServiceWrapper();
@@ -1,5 +1,5 @@
1
1
  const {parentPort} = require('worker_threads');
2
- const StartEmailAnalyticsJobEvent = require('../../events/StartEmailAnalyticsJobEvent');
2
+ const StartEmailAnalyticsJobEvent = require('../../events/start-email-analytics-job-event');
3
3
 
4
4
  // recurring job to fetch analytics since the most recently seen event timestamp
5
5
 
@@ -2,7 +2,7 @@ const logging = require('@tryghost/logging');
2
2
  const ObjectID = require('bson-objectid').default;
3
3
  const errors = require('@tryghost/errors');
4
4
  const tpl = require('@tryghost/tpl');
5
- const EmailBodyCache = require('./EmailBodyCache');
5
+ const EmailBodyCache = require('./email-body-cache');
6
6
 
7
7
  const messages = {
8
8
  emailErrorPartialFailure: 'An error occurred, and your newsletter was only partially sent. Please retry sending the remaining emails.',
@@ -12,11 +12,11 @@ const messages = {
12
12
  const MAX_SENDING_CONCURRENCY = 2;
13
13
 
14
14
  /**
15
- * @typedef {import('./SendingService')} SendingService
16
- * @typedef {import('./EmailSegmenter')} EmailSegmenter
17
- * @typedef {import('./EmailRenderer')} EmailRenderer
18
- * @typedef {import('./DomainWarmingService').DomainWarmingService} DomainWarmingService
19
- * @typedef {import('./EmailRenderer').MemberLike} MemberLike
15
+ * @typedef {import('./sending-service')} SendingService
16
+ * @typedef {import('./email-segmenter')} EmailSegmenter
17
+ * @typedef {import('./email-renderer')} EmailRenderer
18
+ * @typedef {import('./domain-warming-service').DomainWarmingService} DomainWarmingService
19
+ * @typedef {import('./email-renderer').MemberLike} MemberLike
20
20
  * @typedef {object} JobsService
21
21
  * @typedef {object} Email
22
22
  * @typedef {object} Newsletter
@@ -345,7 +345,7 @@ class BatchSendingService {
345
345
  * Creates a batch with retry logic and adds it to the batches array
346
346
  * @param {object} params
347
347
  * @param {Email} params.email
348
- * @param {import('./EmailRenderer').Segment} params.segment
348
+ * @param {import('./email-renderer').Segment} params.segment
349
349
  * @param {object[]} params.members
350
350
  * @param {boolean} params.useFallbackDomain
351
351
  * @param {EmailBatch[]} params.batches
@@ -374,7 +374,7 @@ class BatchSendingService {
374
374
  /**
375
375
  * @private
376
376
  * @param {Email} email
377
- * @param {import('./EmailRenderer').Segment} segment
377
+ * @param {import('./email-renderer').Segment} segment
378
378
  * @param {object[]} members
379
379
  * @param {object} options
380
380
  * @param {boolean} options.useFallbackDomain
@@ -1,11 +1,11 @@
1
1
  const logging = require('@tryghost/logging');
2
2
 
3
- const EmailDeliveredEvent = require('./events/EmailDeliveredEvent');
4
- const EmailOpenedEvent = require('./events/EmailOpenedEvent');
5
- const EmailBouncedEvent = require('./events/EmailBouncedEvent');
6
- const EmailTemporaryBouncedEvent = require('./events/EmailTemporaryBouncedEvent');
7
- const EmailUnsubscribedEvent = require('./events/EmailUnsubscribedEvent');
8
- const SpamComplaintEvent = require('./events/SpamComplaintEvent');
3
+ const EmailDeliveredEvent = require('./events/email-delivered-event');
4
+ const EmailOpenedEvent = require('./events/email-opened-event');
5
+ const EmailBouncedEvent = require('./events/email-bounced-event');
6
+ const EmailTemporaryBouncedEvent = require('./events/email-temporary-bounced-event');
7
+ const EmailUnsubscribedEvent = require('./events/email-unsubscribed-event');
8
+ const SpamComplaintEvent = require('./events/spam-complaint-event');
9
9
 
10
10
  async function waitForEvent() {
11
11
  return new Promise((resolve) => {
@@ -118,7 +118,7 @@ class EmailEventStorage {
118
118
  /**
119
119
  * @private
120
120
  * @param {'temporary'|'permanent'} severity
121
- * @param {import('./events/EmailTemporaryBouncedEvent')|import('./events/EmailBouncedEvent')} event
121
+ * @param {import('./events/email-temporary-bounced-event')|import('./events/email-bounced-event')} event
122
122
  * @param {{transacting?: any}} options
123
123
  * @returns
124
124
  */
@@ -9,7 +9,7 @@ const {isUnsplashImage} = require('@tryghost/kg-default-cards/lib/utils');
9
9
  const {textColorForBackgroundColor, darkenToContrastThreshold} = require('@tryghost/color-utils');
10
10
  const {DateTime} = require('luxon');
11
11
  const htmlToPlaintext = require('@tryghost/html-to-plaintext');
12
- const EmailAddressParser = require('../email-address/EmailAddressParser');
12
+ const EmailAddressParser = require('../email-address/email-address-parser');
13
13
  const {registerHelpers} = require('./helpers/register-helpers');
14
14
  const crypto = require('crypto');
15
15