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.
- package/components/tryghost-i18n-6.12.0.tgz +0 -0
- package/core/boot.js +4 -2
- package/core/built/admin/assets/{_baseAssignValue-BX8EallQ.js → _baseAssignValue-hsL6ItjC.js} +1 -1
- package/core/built/admin/assets/{a-large-small-CKZJgscl.js → a-large-small-BPPu_Iy7.js} +1 -1
- package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
- package/core/built/admin/assets/admin-x-settings/{code-editor-view-n8DFeXbv.mjs → code-editor-view-Bq6l5arq.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-v6qQgUXt.mjs → index-CKaxer_o.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-CXL12uvO.mjs → index-CtYEAgeN.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{index-D4ye6uvI.mjs → index-D4NstoNQ.mjs} +11 -6
- package/core/built/admin/assets/admin-x-settings/{modals-CdsPaTfy.mjs → modals-BzljHVa7.mjs} +2 -2
- package/core/built/admin/assets/{at-sign-CqQzllfI.js → at-sign-CYnGzOFc.js} +1 -1
- package/core/built/admin/assets/{audience-select-DQD7iDOb.js → audience-select-DYoxiiwy.js} +1 -1
- package/core/built/admin/assets/{avatar-flipboard-uq7ptTxT.js → avatar-flipboard-C9-npfmZ.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-qyIGv6Ny.js → bluesky-sharing-BGcmGcee.js} +1 -1
- package/core/built/admin/assets/{chart-DGA1MaFs.js → chart-CqJxisVP.js} +1 -1
- package/core/built/admin/assets/{chunk.524.1289543297329587cf8a.js → chunk.524.74a9629dd2ba0d21bbef.js} +7 -7
- package/core/built/admin/assets/{chunk.582.344ea0d0a16d671345cd.js → chunk.582.3846471396b3a7c46e66.js} +8 -8
- package/core/built/admin/assets/{code-editor-view-Bz6kXDiv.js → code-editor-view-C8l3gNnO.js} +1 -1
- package/core/built/admin/assets/{comments-C-lkEDkz.js → comments-CpHDoxov.js} +1 -1
- package/core/built/admin/assets/{copy-BFuV16bY.js → copy-DWiB-781.js} +1 -1
- package/core/built/admin/assets/{data-list-Bw1CQEZ9.js → data-list-yngXNZDF.js} +1 -1
- package/core/built/admin/assets/{deleted-feed-item-CmNbSYiO.js → deleted-feed-item-C0FcyLMN.js} +1 -1
- package/core/built/admin/assets/{edit-profile-DlIPB2km.js → edit-profile-BjtDkDAq.js} +1 -1
- package/core/built/admin/assets/{empty-indicator-DBrIZcFq.js → empty-indicator-BXWniwsl.js} +1 -1
- package/core/built/admin/assets/{en-BBc7b85q.js → en-B8qaJx-T.js} +1 -1
- package/core/built/admin/assets/{feed-B3XQzKZl.js → feed-DsCVb1SA.js} +1 -1
- package/core/built/admin/assets/{filters-DUFXZZnu.js → filters-jAXQSPq6.js} +1 -1
- package/core/built/admin/assets/{gh-chart-BV97-O7c.js → gh-chart-DwTCK8z_.js} +1 -1
- package/core/built/admin/assets/{ghost-9aa1e7c5992f122dba6932af78bf8e56.js → ghost-6367d022df9db9dacbcb9bfa30232ec7.js} +2 -2
- package/core/built/admin/assets/{growth-njR0GqK2.js → growth-DshcRqda.js} +1 -1
- package/core/built/admin/assets/{hash-CdH0ikFp.js → hash-p9dv0yuc.js} +1 -1
- package/core/built/admin/assets/{inbox-Bd0uf1Ez.js → inbox-CRoP9sy5.js} +1 -1
- package/core/built/admin/assets/{index-Kji6JKl7.js → index-6syrC9X1.js} +1 -1
- package/core/built/admin/assets/{index-C7M19LpB.js → index-BKtz3UH0.js} +1 -1
- package/core/built/admin/assets/{index-DWk7hKRR.js → index-BwY94Fb4.js} +1 -1
- package/core/built/admin/assets/{index-BFhECYgc.js → index-C3DF6aFe.js} +1 -1
- package/core/built/admin/assets/index-C6NCNp1B.js +1 -0
- package/core/built/admin/assets/{index-BYawr8p9.js → index-CJU9a2PB.js} +3 -3
- package/core/built/admin/assets/{index-CIE2_z5J.js → index-CUWE7aD1.js} +1 -1
- package/core/built/admin/assets/{index-DgRIbSpg.js → index-CuQ_II0e.js} +1 -1
- package/core/built/admin/assets/{index-Birw80cQ.js → index-DG8f-HuU.js} +1 -1
- package/core/built/admin/assets/{index-DziHC2du.js → index-DItZTRQ4.js} +1 -1
- package/core/built/admin/assets/{index-DG53N3Xt.js → index-eLx96SEn.js} +1 -1
- package/core/built/admin/assets/{index-DCw6JaEl.js → index-j2_Q-_8H.js} +1 -1
- package/core/built/admin/assets/{index-BZ21H0xH.js → index-qWpHJAMP.js} +1 -1
- package/core/built/admin/assets/{index-DXCu9e7c.js → index-sy6xRtoO.js} +1 -1
- package/core/built/admin/assets/{koenig-lexical-BDJVCHtm.js → koenig-lexical-DgAlBHHS.js} +1 -1
- package/core/built/admin/assets/{kpi-card-cv8roErt.js → kpi-card-CHZSLw4p.js} +1 -1
- package/core/built/admin/assets/{kpis-Dt4OFY3L.js → kpis-DzbAHfKK.js} +1 -1
- package/core/built/admin/assets/{links-08beB3Ij.js → links-BQHRbn46.js} +1 -1
- package/core/built/admin/assets/{lucide-react-DKlmxVQI.js → lucide-react-B7UnD_Dp.js} +1 -1
- package/core/built/admin/assets/{main-layout-Cl09wG7F.js → main-layout-9nmU5WlG.js} +1 -1
- package/core/built/admin/assets/{message-square-text-CaMVBVPr.js → message-square-text-CS3iRuPc.js} +1 -1
- package/core/built/admin/assets/{minus-2XwCoFJV.js → minus-emzwh6hq.js} +1 -1
- package/core/built/admin/assets/{modals-CIgzYQgv.js → modals-CumFuZ2d.js} +1 -1
- package/core/built/admin/assets/{moderation-FjlsSym6.js → moderation-DyfFc9m4.js} +1 -1
- package/core/built/admin/assets/{newsletter-BNOwZNlE.js → newsletter-BWul5IFc.js} +1 -1
- package/core/built/admin/assets/{newsletters-DUusEYSg.js → newsletters-N6bwI1OF.js} +1 -1
- package/core/built/admin/assets/{note-BpYwIDK6.js → note-CiBzkHzz.js} +1 -1
- package/core/built/admin/assets/{overview-Y5QYPClr.js → overview-D9gRvn7X.js} +1 -1
- package/core/built/admin/assets/{pagemenu-BMXHDXYy.js → pagemenu-aHubMPwB.js} +1 -1
- package/core/built/admin/assets/{post-analytics-UerFnJse.js → post-analytics-Bm9xH8nA.js} +1 -1
- package/core/built/admin/assets/{post-analytics-context-geHk7rOj.js → post-analytics-context-C7oW3aBz.js} +1 -1
- package/core/built/admin/assets/{post-analytics-header-DXfc4KeX.js → post-analytics-header-BjGFgN6A.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-Dql4fYjR.js → post-share-modal-Su923uIc.js} +1 -1
- package/core/built/admin/assets/{posts-Bsvw11Zo.js → posts-BwP7BNcB.js} +1 -1
- package/core/built/admin/assets/{referrers-B8xJpCcR.js → referrers-n_ln9DqI.js} +1 -1
- package/core/built/admin/assets/{repeat-COP-3g8d.js → repeat-ms5ocvE0.js} +1 -1
- package/core/built/admin/assets/{reply-JE8tmvOn.js → reply-BvO85IDn.js} +1 -1
- package/core/built/admin/assets/{select-BhvNY3I-.js → select-B4QhMW5f.js} +1 -1
- package/core/built/admin/assets/{settings-BJwVfuWG.js → settings-D5rGcWJ7.js} +4 -4
- package/core/built/admin/assets/{settings-C6ZUZQe4.js → settings-QtZ6a2TL.js} +1 -1
- package/core/built/admin/assets/{sort-button-iOtR-vQ1.js → sort-button-84sYUZMN.js} +1 -1
- package/core/built/admin/assets/{source-icon-C2iFWMlV.js → source-icon-Bzw-AU8p.js} +1 -1
- package/core/built/admin/assets/{sprout-BW9HFVU8.js → sprout-C2R5CbXV.js} +1 -1
- package/core/built/admin/assets/{square-BCNGSZhW.js → square-DT1uWkxs.js} +1 -1
- package/core/built/admin/assets/stats/{audience-select-DNAWmT7R.mjs → audience-select-fTCiZ9MT.mjs} +3 -3
- package/core/built/admin/assets/stats/{index-DbGvSTMe.mjs → index-BKgioyC7.mjs} +5 -5
- package/core/built/admin/assets/stats/{index-s19ZmxbX.mjs → index-CR2t5Xd-.mjs} +5 -5
- package/core/built/admin/assets/stats/index-DEkYwR7C.mjs +739 -0
- package/core/built/admin/assets/stats/{index-BS3KMSy9.mjs → index-Djwey97a.mjs} +5 -5
- package/core/built/admin/assets/stats/{index-MOQSSYwT.mjs → index-FiU_XgEe.mjs} +6 -6
- package/core/built/admin/assets/stats/{sort-button-D76rcldr.mjs → sort-button-Bvi1wfa7.mjs} +3 -3
- package/core/built/admin/assets/stats/{stats-CJ7fhUyT.mjs → stats-Bbm6yWZq.mjs} +2 -2
- package/core/built/admin/assets/stats/stats.js +1 -1
- package/core/built/admin/assets/stats/{tabs-CkbxYgOE.mjs → tabs-BKwH5k-q.mjs} +3 -3
- package/core/built/admin/assets/stats/{url-helpers-DICtqCrE.mjs → url-helpers-DmHnUIGc.mjs} +9 -9
- package/core/built/admin/assets/stats/{use-growth-stats-DzO7zEy4.mjs → use-growth-stats-BVj3j1hb.mjs} +3 -3
- package/core/built/admin/assets/{stats-r0Bphuvi.js → stats-B1mhlQSp.js} +1 -1
- package/core/built/admin/assets/{stats-view-DzZxrBDz.js → stats-view-C6MTCwRW.js} +1 -1
- package/core/built/admin/assets/{step-1-CUoUOyMm.js → step-1-CzQmZJ93.js} +1 -1
- package/core/built/admin/assets/{step-2-CpAkPD8D.js → step-2-DXGDWSQo.js} +1 -1
- package/core/built/admin/assets/{step-3-Ci6oJDmK.js → step-3-CYuxXKac.js} +1 -1
- package/core/built/admin/assets/{table-DeBuf80X.js → table-mjAkKNdb.js} +1 -1
- package/core/built/admin/assets/{tabs-C2sFfNcp.js → tabs-BwQ-i6MY.js} +1 -1
- package/core/built/admin/assets/{tags-Bl6G5rvf.js → tags-BkUqCuvX.js} +1 -1
- package/core/built/admin/assets/{tags-BL_N4nn2.js → tags-DXDZbfxp.js} +1 -1
- package/core/built/admin/assets/{toggle-group-B2X-8giI.js → toggle-group-CqDO3Kkx.js} +1 -1
- package/core/built/admin/assets/{topic-filter-DeqMID_s.js → topic-filter-DnuJJBAE.js} +1 -1
- package/core/built/admin/assets/{trash-BglGemAb.js → trash-CZ3EXwTL.js} +1 -1
- package/core/built/admin/assets/{url-helpers-84icqAuE.js → url-helpers-BE3VXr__.js} +1 -1
- package/core/built/admin/assets/{use-growth-stats-DF-7tL8g.js → use-growth-stats-CiuWWM6O.js} +1 -1
- package/core/built/admin/assets/{use-infinite-virtual-scroll-BHH7oscK.js → use-infinite-virtual-scroll-BjATkxBj.js} +1 -1
- package/core/built/admin/assets/{use-simple-pagination-BsvYfixw.js → use-simple-pagination-C9cb7dDz.js} +1 -1
- package/core/built/admin/assets/{user-round-check-BjHbfXKY.js → user-round-check-D3ihrrKL.js} +1 -1
- package/core/built/admin/assets/{wallet-cards-KaTkgqvi.js → wallet-cards-Do7nPf3f.js} +1 -1
- package/core/built/admin/assets/{web-CUWbpFil.js → web-BEwI2Gfy.js} +1 -1
- package/core/built/admin/index-forward.html +4 -4
- package/core/built/admin/index.html +3 -3
- package/core/frontend/web/middleware/index.js +1 -0
- package/core/frontend/web/middleware/serve-indexnow-key.js +66 -0
- package/core/frontend/web/site.js +3 -0
- package/core/server/api/endpoints/authentication.js +1 -1
- package/core/server/api/endpoints/pages.js +1 -1
- package/core/server/api/endpoints/posts-public.js +1 -1
- package/core/server/api/endpoints/posts.js +1 -1
- package/core/server/api/endpoints/search-index-public.js +1 -1
- package/core/server/api/endpoints/search-index.js +1 -1
- package/core/server/api/endpoints/users.js +1 -1
- package/core/server/api/endpoints/utils/serializers/input/settings.js +2 -1
- package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +1 -1
- package/core/server/api/endpoints/utils/validators/input/settings.js +1 -1
- package/core/server/data/exporter/table-lists.js +2 -1
- package/core/server/data/migrations/versions/6.12/2026-01-08-11-48-16-add-indexnow-api-key-setting.js +9 -0
- package/core/server/data/schema/default-settings/default-settings.json +6 -0
- package/core/server/lib/lexical.js +1 -1
- package/core/server/models/settings.js +2 -1
- package/core/server/services/activitypub/{ActivityPubServiceWrapper.js → activity-pub-service-wrapper.js} +1 -1
- package/core/server/services/activitypub/{ActivityPubService.ts → activity-pub-service.ts} +1 -1
- package/core/server/services/activitypub/index.js +1 -1
- package/core/server/services/adapter-manager/index.js +1 -1
- package/core/server/services/announcement-bar-service/{AnnouncementBarSettings.js → announcement-bar-settings.js} +1 -1
- package/core/server/services/announcement-bar-service/index.js +1 -1
- package/core/server/services/audience-feedback/{AudienceFeedbackController.js → audience-feedback-controller.js} +3 -3
- package/core/server/services/audience-feedback/index.js +4 -4
- package/core/server/services/auth/session/express-session.js +1 -1
- package/core/server/services/comments/{CommentsController.js → comments-controller.js} +2 -2
- package/core/server/services/comments/{CommentsServiceEmails.js → comments-service-emails.js} +1 -1
- package/core/server/services/comments/{CommentsService.js → comments-service.js} +1 -1
- package/core/server/services/comments/index.js +3 -3
- package/core/server/services/custom-redirects/index.js +2 -2
- package/core/server/services/donations/{DonationBookshelfRepository.ts → donation-bookshelf-repository.ts} +1 -1
- package/core/server/services/donations/{DonationServiceWrapper.js → donation-service-wrapper.js} +1 -1
- package/core/server/services/donations/index.js +1 -1
- package/core/server/services/email-address/{EmailAddressServiceWrapper.js → email-address-service-wrapper.js} +2 -2
- package/core/server/services/email-address/{EmailAddressService.js → email-address-service.js} +4 -4
- package/core/server/services/email-address/{EmailAddressService.ts → email-address-service.ts} +1 -1
- package/core/server/services/email-address/index.js +1 -1
- package/core/server/services/email-analytics/{EmailAnalyticsProviderMailgun.js → email-analytics-provider-mailgun.js} +1 -1
- package/core/server/services/email-analytics/{EmailAnalyticsServiceWrapper.js → email-analytics-service-wrapper.js} +5 -5
- package/core/server/services/email-analytics/{EmailAnalyticsService.js → email-analytics-service.js} +2 -2
- package/core/server/services/email-analytics/index.js +1 -1
- package/core/server/services/email-analytics/jobs/fetch-latest/index.js +1 -1
- package/core/server/services/email-service/{BatchSendingService.js → batch-sending-service.js} +8 -8
- package/core/server/services/email-service/{EmailEventProcessor.js → email-event-processor.js} +6 -6
- package/core/server/services/email-service/{EmailEventStorage.js → email-event-storage.js} +1 -1
- package/core/server/services/email-service/{EmailRenderer.js → email-renderer.js} +1 -1
- package/core/server/services/email-service/{EmailServiceWrapper.js → email-service-wrapper.js} +9 -9
- package/core/server/services/email-service/{EmailService.js → email-service.js} +13 -13
- package/core/server/services/email-service/index.js +1 -1
- package/core/server/services/email-service/{MailgunEmailProvider.js → mailgun-email-provider.js} +1 -1
- package/core/server/services/email-service/{SendingService.js → sending-service.js} +6 -6
- package/core/server/services/email-suppression-list/{InMemoryEmailSuppressionList.js → in-memory-email-suppression-list.js} +1 -1
- package/core/server/services/email-suppression-list/{MailgunEmailSuppressionList.js → mailgun-email-suppression-list.js} +3 -3
- package/core/server/services/email-suppression-list/service.js +2 -2
- package/core/server/services/explore/index.js +2 -2
- package/core/server/services/explore-ping/index.js +2 -2
- package/core/server/services/frontend-data-service/index.js +1 -1
- package/core/server/services/identity-tokens/{IdentityTokenServiceWrapper.js → identity-token-service-wrapper.js} +1 -1
- package/core/server/services/identity-tokens/index.js +1 -1
- package/core/server/services/indexnow.js +212 -0
- package/core/server/services/invites/index.js +1 -1
- package/core/server/services/link-redirection/index.js +2 -2
- package/core/server/services/link-redirection/{LinkRedirectRepository.js → link-redirect-repository.js} +1 -1
- package/core/server/services/link-redirection/{LinkRedirectsService.js → link-redirects-service.js} +2 -2
- package/core/server/services/link-redirection/{RedirectEvent.js → redirect-event.js} +1 -1
- package/core/server/services/link-tracking/index.js +3 -3
- package/core/server/services/link-tracking/{LinkClickRepository.js → link-click-repository.js} +1 -1
- package/core/server/services/link-tracking/{LinkClickTrackingService.js → link-click-tracking-service.js} +4 -4
- package/core/server/services/link-tracking/{PostLinkRepository.js → post-link-repository.js} +7 -7
- package/core/server/services/mail/{GhostMailer.js → ghost-mailer.js} +1 -1
- package/core/server/services/mail/index.js +2 -2
- package/core/server/services/media-inliner/service.js +1 -1
- package/core/server/services/member-attribution/README.md +6 -6
- package/core/server/services/member-attribution/{AttributionBuilder.js → attribution-builder.js} +4 -4
- package/core/server/services/member-attribution/index.js +5 -5
- package/core/server/services/member-attribution/{MemberAttributionService.js → member-attribution-service.js} +9 -9
- package/core/server/services/member-attribution/{ReferrerTranslator.js → referrer-translator.js} +1 -1
- package/core/server/services/member-attribution/{UrlTranslator.js → url-translator.js} +1 -1
- package/core/server/services/member-welcome-emails/constants.js +22 -1
- package/core/server/services/member-welcome-emails/service.js +23 -5
- package/core/server/services/members/api.js +1 -1
- package/core/server/services/members/importer/index.js +3 -3
- package/core/server/services/members/importer/{MembersCSVImporter.js → members-csv-importer.js} +2 -2
- package/core/server/services/members/members-api/members-api.js +14 -14
- package/core/server/services/members/members-api/repositories/{MemberRepository.js → member-repository.js} +17 -8
- package/core/server/services/members/members-api/services/{MemberBREADService.js → member-bread-service.js} +1 -1
- package/core/server/services/members/members-api/services/{PaymentsService.js → payments-service.js} +12 -12
- package/core/server/services/members/service.js +4 -4
- package/core/server/services/members-events/index.js +3 -3
- package/core/server/services/members-events/{LastSeenAtUpdater.js → last-seen-at-updater.js} +2 -2
- package/core/server/services/mentions/{BookshelfMentionRepository.js → bookshelf-mention-repository.js} +9 -9
- package/core/server/services/mentions/{InMemoryMentionRepository.js → in-memory-mention-repository.js} +4 -4
- package/core/server/services/mentions/{MentionController.js → mention-controller.js} +5 -5
- package/core/server/services/mentions/{MentionCreatedEvent.js → mention-created-event.js} +1 -1
- package/core/server/services/mentions/{Mention.js → mention.js} +1 -1
- package/core/server/services/mentions/{MentionsAPI.js → mentions-api.js} +1 -1
- package/core/server/services/mentions/{ResourceService.js → resource-service.js} +2 -2
- package/core/server/services/mentions/{RoutingService.js → routing-service.js} +2 -2
- package/core/server/services/mentions/service.js +11 -11
- package/core/server/services/mentions/{WebmentionMetadata.js → webmention-metadata.js} +1 -1
- package/core/server/services/mentions-email-report/job.js +1 -1
- package/core/server/services/mentions-email-report/{MentionEmailReportJob.js → mention-email-report-job.js} +1 -1
- package/core/server/services/mentions-email-report/service.js +2 -2
- package/core/server/services/milestones/{BookshelfMilestoneRepository.js → bookshelf-milestone-repository.js} +2 -2
- package/core/server/services/milestones/{InMemoryMilestoneRepository.js → in-memory-milestone-repository.js} +2 -2
- package/core/server/services/milestones/{Milestone.js → milestone.js} +1 -1
- package/core/server/services/milestones/{MilestonesService.js → milestones-service.js} +1 -1
- package/core/server/services/milestones/service.js +4 -4
- package/core/server/services/newsletters/index.js +2 -2
- package/core/server/services/newsletters/{NewslettersService.js → newsletters-service.js} +1 -1
- package/core/server/services/notifications/index.js +1 -1
- package/core/server/services/oembed/service.js +3 -3
- package/core/server/services/offers/application/{OfferMapper.js → offer-mapper.js} +1 -1
- package/core/server/services/offers/application/{OffersAPI.js → offers-api.js} +9 -9
- package/core/server/services/offers/application/{UniqueChecker.js → unique-checker.js} +2 -2
- package/core/server/services/offers/domain/events/{OfferCodeChangeEvent.js → offer-code-change-event.js} +1 -1
- package/core/server/services/offers/domain/events/{OfferCreatedEvent.js → offer-created-event.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferAmount.js → offer-amount.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferCadence.js → offer-cadence.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferCode.js → offer-code.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferCreatedAt.js → offer-created-at.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferCurrency.js → offer-currency.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferDescription.js → offer-description.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferDuration.js → offer-duration.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferName.js → offer-name.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferStatus.js → offer-status.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferTitle.js → offer-title.js} +1 -1
- package/core/server/services/offers/domain/models/{OfferType.js → offer-type.js} +1 -1
- package/core/server/services/offers/domain/models/{Offer.js → offer.js} +14 -14
- package/core/server/services/offers/domain/models/{StripeCoupon.js → stripe-coupon.js} +1 -1
- package/core/server/services/offers/{OfferBookshelfRepository.js → offer-bookshelf-repository.js} +6 -6
- package/core/server/services/offers/{OffersModule.js → offers-module.js} +4 -4
- package/core/server/services/offers/service.js +3 -3
- package/core/server/services/outbox/index.js +2 -2
- package/core/server/services/outbox/jobs/outbox-job.js +2 -2
- package/core/server/services/posts/posts-service-instance.js +47 -0
- package/core/server/services/posts/posts-service.js +572 -45
- package/core/server/services/recommendations/index.js +1 -1
- package/core/server/services/recommendations/{RecommendationEnablerService.js → recommendation-enabler-service.js} +2 -2
- package/core/server/services/recommendations/{RecommendationServiceWrapper.js → recommendation-service-wrapper.js} +2 -2
- package/core/server/services/recommendations/service/{BookshelfClickEventRepository.js → bookshelf-click-event-repository.js} +4 -4
- package/core/server/services/recommendations/service/{BookshelfClickEventRepository.ts → bookshelf-click-event-repository.ts} +2 -2
- package/core/server/services/recommendations/service/{BookshelfRecommendationRepository.js → bookshelf-recommendation-repository.js} +4 -4
- package/core/server/services/recommendations/service/{BookshelfRecommendationRepository.ts → bookshelf-recommendation-repository.ts} +3 -3
- package/core/server/services/recommendations/service/{BookshelfSubscribeEventRepository.js → bookshelf-subscribe-event-repository.js} +4 -4
- package/core/server/services/recommendations/service/{BookshelfSubscribeEventRepository.ts → bookshelf-subscribe-event-repository.ts} +2 -2
- package/core/server/services/recommendations/service/{InMemoryRecommendationRepository.js → in-memory-recommendation-repository.js} +2 -2
- package/core/server/services/recommendations/service/{InMemoryRecommendationRepository.ts → in-memory-recommendation-repository.ts} +3 -3
- package/core/server/services/recommendations/service/{IncomingRecommendationController.js → incoming-recommendation-controller.js} +2 -2
- package/core/server/services/recommendations/service/{IncomingRecommendationController.ts → incoming-recommendation-controller.ts} +3 -3
- package/core/server/services/recommendations/service/{IncomingRecommendationEmailRenderer.ts → incoming-recommendation-email-renderer.ts} +2 -2
- package/core/server/services/recommendations/service/{IncomingRecommendationService.ts → incoming-recommendation-service.ts} +2 -2
- package/core/server/services/recommendations/service/index.js +15 -15
- package/core/server/services/recommendations/service/index.ts +15 -15
- package/core/server/services/recommendations/service/{RecommendationController.js → recommendation-controller.js} +13 -13
- package/core/server/services/recommendations/service/{RecommendationController.ts → recommendation-controller.ts} +4 -4
- package/core/server/services/recommendations/service/{RecommendationRepository.ts → recommendation-repository.ts} +3 -3
- package/core/server/services/recommendations/service/{RecommendationService.js → recommendation-service.js} +6 -6
- package/core/server/services/recommendations/service/{RecommendationService.ts → recommendation-service.ts} +8 -8
- package/core/server/services/recommendations/service/{Recommendation.js → recommendation.js} +4 -4
- package/core/server/services/recommendations/service/{Recommendation.ts → recommendation.ts} +1 -1
- package/core/server/services/recommendations/service/{WellknownService.ts → well-known-service.ts} +1 -1
- package/core/server/services/route-settings/index.js +4 -4
- package/core/server/services/settings/{SettingsBREADService.js → settings-bread-service.js} +1 -1
- package/core/server/services/settings/settings-service.js +2 -2
- package/core/server/services/settings-helpers/index.js +1 -1
- package/core/server/services/settings-helpers/{SettingsHelpers.js → settings-helpers.js} +5 -5
- package/core/server/services/slack-notifications/service.js +4 -4
- package/core/server/services/slack-notifications/{SlackNotificationsService.js → slack-notifications-service.js} +2 -2
- package/core/server/services/slack-notifications/{SlackNotifications.js → slack-notifications.js} +2 -2
- package/core/server/services/staff/index.js +1 -1
- package/core/server/services/staff/{StaffServiceEmails.js → staff-service-emails.js} +2 -2
- package/core/server/services/staff/{StaffService.js → staff-service.js} +2 -2
- package/core/server/services/stats/{PostsStatsService.js → posts-stats-service.js} +25 -25
- package/core/server/services/stats/{ReferrersStatsService.js → referrers-stats-service.js} +3 -3
- package/core/server/services/stats/service.js +1 -1
- package/core/server/services/stats/{StatsService.js → stats-service.js} +23 -23
- package/core/server/services/stripe/events/index.js +2 -2
- package/core/server/services/stripe/service.js +1 -1
- package/core/server/services/stripe/services/webhook/{CheckoutSessionEventService.js → checkout-session-event-service.js} +2 -2
- package/core/server/services/stripe/{StripeMigrations.js → stripe-migrations.js} +1 -1
- package/core/server/services/stripe/{StripeService.js → stripe-service.js} +8 -8
- package/core/server/services/stripe/{WebhookController.js → webhook-controller.js} +4 -4
- package/core/server/services/stripe/{WebhookManager.js → webhook-manager.js} +5 -5
- package/core/server/services/themes/storage.js +1 -1
- package/core/server/services/tiers/{InMemoryTierRepository.js → in-memory-tier-repository.js} +1 -1
- package/core/server/services/tiers/service.js +2 -2
- package/core/server/services/tiers/{TierActivatedEvent.js → tier-activated-event.js} +1 -1
- package/core/server/services/tiers/{TierArchivedEvent.js → tier-archived-event.js} +1 -1
- package/core/server/services/tiers/{TierCreatedEvent.js → tier-created-event.js} +1 -1
- package/core/server/services/tiers/{TierNameChangeEvent.js → tier-name-change-event.js} +1 -1
- package/core/server/services/tiers/{TierPriceChangeEvent.js → tier-price-change-event.js} +1 -1
- package/core/server/services/tiers/{TierRepository.js → tier-repository.js} +7 -7
- package/core/server/services/tiers/{Tier.js → tier.js} +5 -5
- package/core/server/services/tiers/{TiersAPI.js → tiers-api.js} +1 -1
- package/core/server/services/tinybird/index.js +1 -1
- package/core/server/services/tinybird/{TinybirdServiceWrapper.js → tinybird-service-wrapper.js} +2 -2
- package/core/server/services/update-check/index.js +1 -1
- package/core/server/services/url/index.js +2 -2
- package/core/server/services/url/{Resources.js → resources.js} +1 -1
- package/core/server/services/url/{UrlGenerator.js → url-generator.js} +1 -1
- package/core/server/services/url/{UrlService.js → url-service.js} +4 -4
- package/core/server/services/url/{Urls.js → urls.js} +1 -1
- package/core/server/services/webhooks/listen.js +1 -1
- package/core/shared/labs.js +2 -1
- package/package.json +3 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/components/tryghost-i18n-6.11.0.tgz +0 -0
- package/core/built/admin/assets/index-Cr_YX9yU.js +0 -1
- package/core/built/admin/assets/stats/index-BBCJ2EZo.mjs +0 -733
- package/core/server/services/posts/PostsService.js +0 -574
- /package/core/server/{GhostServer.js → ghost-server.js} +0 -0
- /package/core/server/services/activitypub/{ActivityPubService.js → activity-pub-service.js} +0 -0
- /package/core/server/services/adapter-manager/{AdapterManager.js → adapter-manager.js} +0 -0
- /package/core/server/services/announcement-bar-service/{AnnouncementVisibilityValues.js → announcement-visibility-values.js} +0 -0
- /package/core/server/services/audience-feedback/{AudienceFeedbackService.js → audience-feedback-service.js} +0 -0
- /package/core/server/services/audience-feedback/{FeedbackRepository.js → feedback-repository.js} +0 -0
- /package/core/server/services/audience-feedback/{Feedback.js → feedback.js} +0 -0
- /package/core/server/services/auth/session/{SessionStore.js → session-store.js} +0 -0
- /package/core/server/services/comments/{CommentsServiceEmailRenderer.js → comments-service-email-renderer.js} +0 -0
- /package/core/server/services/comments/{CommentsStatsService.js → comments-stats-service.js} +0 -0
- /package/core/server/services/custom-redirects/{CustomRedirectsAPI.js → custom-redirects-api.js} +0 -0
- /package/core/server/services/donations/{DonationBookshelfRepository.js → donation-bookshelf-repository.js} +0 -0
- /package/core/server/services/donations/{DonationPaymentEvent.js → donation-payment-event.js} +0 -0
- /package/core/server/services/donations/{DonationPaymentEvent.ts → donation-payment-event.ts} +0 -0
- /package/core/server/services/email-address/{EmailAddressParser.js → email-address-parser.js} +0 -0
- /package/core/server/services/email-address/{EmailAddressParser.js.d.ts → email-address-parser.js.d.ts} +0 -0
- /package/core/server/services/email-analytics/{EventProcessingResult.js → event-processing-result.js} +0 -0
- /package/core/server/services/email-analytics/events/{StartEmailAnalyticsJobEvent.js → start-email-analytics-job-event.js} +0 -0
- /package/core/server/services/email-service/{DomainWarmingService.js → domain-warming-service.js} +0 -0
- /package/core/server/services/email-service/{DomainWarmingService.ts → domain-warming-service.ts} +0 -0
- /package/core/server/services/email-service/{EmailBodyCache.js → email-body-cache.js} +0 -0
- /package/core/server/services/email-service/{EmailController.js → email-controller.js} +0 -0
- /package/core/server/services/email-service/{EmailSegmenter.js → email-segmenter.js} +0 -0
- /package/core/server/services/email-service/events/{EmailBouncedEvent.js → email-bounced-event.js} +0 -0
- /package/core/server/services/email-service/events/{EmailDeliveredEvent.js → email-delivered-event.js} +0 -0
- /package/core/server/services/email-service/events/{EmailOpenedEvent.js → email-opened-event.js} +0 -0
- /package/core/server/services/email-service/events/{EmailTemporaryBouncedEvent.js → email-temporary-bounced-event.js} +0 -0
- /package/core/server/services/email-service/events/{EmailUnsubscribedEvent.js → email-unsubscribed-event.js} +0 -0
- /package/core/server/services/email-service/events/{SpamComplaintEvent.js → spam-complaint-event.js} +0 -0
- /package/core/server/services/email-suppression-list/{EmailSuppressionList.js → email-suppression-list.js} +0 -0
- /package/core/server/services/explore/{ExploreService.js → explore-service.js} +0 -0
- /package/core/server/services/explore-ping/{ExplorePingService.js → explore-ping-service.js} +0 -0
- /package/core/server/services/frontend-data-service/{FrontendDataService.js → front-end-data-service.js} +0 -0
- /package/core/server/services/identity-tokens/{IdentityTokenService.js → identity-token-service.js} +0 -0
- /package/core/server/services/identity-tokens/{IdentityTokenService.ts → identity-token-service.ts} +0 -0
- /package/core/server/services/invites/{Invites.js → invites.js} +0 -0
- /package/core/server/services/lib/{DynamicRedirectManager.js → dynamic-redirect-manager.js} +0 -0
- /package/core/server/services/lib/{EmailContentGenerator.js → email-content-generator.js} +0 -0
- /package/core/server/services/lib/{InMemoryRepository.js → in-memory-repository.js} +0 -0
- /package/core/server/services/lib/{InMemoryRepository.ts → in-memory-repository.ts} +0 -0
- /package/core/server/services/lib/magic-link/{MagicLink.js → magic-link.js} +0 -0
- /package/core/server/services/lib/{MailgunClient.js → mailgun-client.js} +0 -0
- /package/core/server/services/link-redirection/{LinkRedirect.js → link-redirect.js} +0 -0
- /package/core/server/services/link-tracking/{ClickEvent.js → click-event.js} +0 -0
- /package/core/server/services/link-tracking/{FullPostLink.js → full-post-link.js} +0 -0
- /package/core/server/services/link-tracking/{PostLink.js → post-link.js} +0 -0
- /package/core/server/services/media-inliner/{ExternalMediaInliner.js → external-media-inliner.js} +0 -0
- /package/core/server/services/member-attribution/{OutboundLinkTagger.js → outbound-link-tagger.js} +0 -0
- /package/core/server/services/member-attribution/{UrlHistory.js → url-history.js} +0 -0
- /package/core/server/services/member-welcome-emails/{MemberWelcomeEmailRenderer.js → member-welcome-email-renderer.js} +0 -0
- /package/core/server/services/members/importer/{MembersCSVImporterStripeUtils.js → members-csv-importer-stripe-utils.js} +0 -0
- /package/core/server/services/members/members-api/controllers/{MemberController.js → member-controller.js} +0 -0
- /package/core/server/services/members/members-api/controllers/{RouterController.js → router-controller.js} +0 -0
- /package/core/server/services/members/members-api/controllers/{WellKnownController.js → well-known-controller.js} +0 -0
- /package/core/server/services/members/members-api/repositories/{EventRepository.js → event-repository.js} +0 -0
- /package/core/server/services/members/members-api/repositories/{ProductRepository.js → product-repository.js} +0 -0
- /package/core/server/services/members/members-api/services/{GeolocationService.js → geolocation-service.js} +0 -0
- /package/core/server/services/members/members-api/services/{TokenService.js → token-service.js} +0 -0
- /package/core/server/services/members/{MembersConfigProvider.js → members-config-provider.js} +0 -0
- /package/core/server/services/members/{RequestIntegrityTokenProvider.js → request-integrity-token-provider.js} +0 -0
- /package/core/server/services/members/{SingleUseTokenProvider.js → single-use-token-provider.js} +0 -0
- /package/core/server/services/members/stats/{MembersStats.js → members-stats.js} +0 -0
- /package/core/server/services/members-events/{EventStorage.js → event-storage.js} +0 -0
- /package/core/server/services/members-events/{LastSeenAtCache.js → last-seen-at-cache.js} +0 -0
- /package/core/server/services/mentions/{MentionDiscoveryService.js → mention-discovery-service.js} +0 -0
- /package/core/server/services/mentions/{MentionSendingService.js → mention-sending-service.js} +0 -0
- /package/core/server/services/mentions-email-report/{StartMentionEmailReportJob.js → start-mention-email-report-job.js} +0 -0
- /package/core/server/services/milestones/{MilestoneCreatedEvent.js → milestone-created-event.js} +0 -0
- /package/core/server/services/milestones/{MilestoneQueries.js → milestone-queries.js} +0 -0
- /package/core/server/services/notifications/{Notifications.js → notifications.js} +0 -0
- /package/core/server/services/oembed/{NFTOEmbedProvider.js → nft-oembed-provider.js} +0 -0
- /package/core/server/services/oembed/{OEmbedService.js → oembed-service.js} +0 -0
- /package/core/server/services/oembed/{TwitterOEmbedProvider.js → twitter-oembed-provider.js} +0 -0
- /package/core/server/services/offers/domain/models/shared/{ValueObject.js → value-object.js} +0 -0
- /package/core/server/services/outbox/events/{StartOutboxProcessingEvent.js → start-outbox-processing-event.js} +0 -0
- /package/core/server/services/posts/{PostsExporter.js → posts-exporter.js} +0 -0
- /package/core/server/services/posts/stats/{PostStats.js → post-stats.js} +0 -0
- /package/core/server/services/recommendations/service/{BookshelfRepository.js → bookshelf-repository.js} +0 -0
- /package/core/server/services/recommendations/service/{BookshelfRepository.ts → bookshelf-repository.ts} +0 -0
- /package/core/server/services/recommendations/service/{ClickEvent.js → click-event.js} +0 -0
- /package/core/server/services/recommendations/service/{ClickEvent.ts → click-event.ts} +0 -0
- /package/core/server/services/recommendations/service/{IncomingRecommendationEmailRenderer.js → incoming-recommendation-email-renderer.js} +0 -0
- /package/core/server/services/recommendations/service/{IncomingRecommendationService.js → incoming-recommendation-service.js} +0 -0
- /package/core/server/services/recommendations/service/{RecommendationMetadataService.js → recommendation-metadata-service.js} +0 -0
- /package/core/server/services/recommendations/service/{RecommendationMetadataService.ts → recommendation-metadata-service.ts} +0 -0
- /package/core/server/services/recommendations/service/{RecommendationRepository.js → recommendation-repository.js} +0 -0
- /package/core/server/services/recommendations/service/{SubscribeEvent.js → subscribe-event.js} +0 -0
- /package/core/server/services/recommendations/service/{SubscribeEvent.ts → subscribe-event.ts} +0 -0
- /package/core/server/services/recommendations/service/{UnsafeData.js → unsafe-data.js} +0 -0
- /package/core/server/services/recommendations/service/{UnsafeData.ts → unsafe-data.ts} +0 -0
- /package/core/server/services/recommendations/service/{WellknownService.js → well-known-service.js} +0 -0
- /package/core/server/services/route-settings/{DefaultSettingsManager.js → default-settings-manager.js} +0 -0
- /package/core/server/services/route-settings/{RouteSettings.js → route-settings.js} +0 -0
- /package/core/server/services/route-settings/{SettingsLoader.js → settings-loader.js} +0 -0
- /package/core/server/services/route-settings/{SettingsPathManager.js → settings-path-manager.js} +0 -0
- /package/core/server/services/stats/{ContentStatsService.js → content-stats-service.js} +0 -0
- /package/core/server/services/stats/{MembersStatsService.js → members-stats-service.js} +0 -0
- /package/core/server/services/stats/{MrrStatsService.js → mrr-stats-service.js} +0 -0
- /package/core/server/services/stats/{SubscriptionStatsService.js → subscription-stats-service.js} +0 -0
- /package/core/server/services/stripe/events/{StripeLiveDisabledEvent.js → stripe-live-disabled-event.js} +0 -0
- /package/core/server/services/stripe/events/{StripeLiveEnabledEvent.js → stripe-live-enabled-event.js} +0 -0
- /package/core/server/services/stripe/services/webhook/{InvoiceEventService.js → invoice-event-service.js} +0 -0
- /package/core/server/services/stripe/services/webhook/{SubscriptionEventService.js → subscription-event-service.js} +0 -0
- /package/core/server/services/stripe/{StripeAPI.js → stripe-api.js} +0 -0
- /package/core/server/services/themes/{ThemeStorage.js → theme-storage.js} +0 -0
- /package/core/server/services/tinybird/{TinybirdService.js → tinybird-service.js} +0 -0
- /package/core/server/services/update-check/{UpdateCheckService.js → update-check-service.js} +0 -0
- /package/core/server/services/url/{LocalFileCache.js → local-file-cache.js} +0 -0
- /package/core/server/services/url/{Queue.js → queue.js} +0 -0
- /package/core/server/services/url/{Resource.js → resource.js} +0 -0
- /package/core/server/services/{Users.js → users.js} +0 -0
- /package/core/server/services/{VerificationTrigger.js → verification-trigger.js} +0 -0
- /package/core/server/services/webhooks/{WebhookTrigger.js → webhook-trigger.js} +0 -0
package/core/server/services/email-service/{EmailServiceWrapper.js → email-service-wrapper.js}
RENAMED
|
@@ -15,17 +15,17 @@ class EmailServiceWrapper {
|
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
const EmailService = require('./
|
|
19
|
-
const EmailController = require('./
|
|
20
|
-
const EmailRenderer = require('./
|
|
21
|
-
const SendingService = require('./
|
|
22
|
-
const BatchSendingService = require('./
|
|
23
|
-
const EmailSegmenter = require('./
|
|
24
|
-
const MailgunEmailProvider = require('./
|
|
25
|
-
const {DomainWarmingService} = require('./
|
|
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/
|
|
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 ('./
|
|
8
|
+
* @typedef {import ('./domain-warming-service').DomainWarmingService} DomainWarmingService
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
const BatchSendingService = require('./
|
|
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('./
|
|
15
|
-
const EmailSegmenter = require('./
|
|
16
|
-
const SendingService = require('./
|
|
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('./
|
|
193
|
+
* @return {import('./email-renderer').MemberLike}
|
|
194
194
|
*/
|
|
195
195
|
getDefaultExampleMember(segment) {
|
|
196
196
|
/**
|
|
197
|
-
* @type {import('./
|
|
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('./
|
|
222
|
+
* @return {Promise<import('./email-renderer').MemberLike>}
|
|
223
223
|
*/
|
|
224
224
|
async getExampleMember(email, segment) {
|
|
225
225
|
/**
|
|
226
|
-
* @type {import('./
|
|
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('./
|
|
263
|
-
* @param {import('./
|
|
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('./
|
|
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('./
|
|
298
|
+
* @param {import('./email-renderer').Segment} segment
|
|
299
299
|
* @param {string[]} emails
|
|
300
300
|
*/
|
|
301
301
|
async sendTestEmail(post, newsletter, segment, emails) {
|
package/core/server/services/email-service/{MailgunEmailProvider.js → mailgun-email-provider.js}
RENAMED
|
@@ -80,7 +80,7 @@ class MailgunEmailProvider {
|
|
|
80
80
|
|
|
81
81
|
/**
|
|
82
82
|
* Send an email using the Mailgun API
|
|
83
|
-
* @param {import('./
|
|
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("./
|
|
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("./
|
|
27
|
-
* @typedef {import("./
|
|
26
|
+
* @typedef {import("./email-renderer")} EmailRenderer
|
|
27
|
+
* @typedef {import("./email-renderer").EmailBody} EmailBody
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
* @typedef {import("../email-address/
|
|
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("./
|
|
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("./
|
|
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('./
|
|
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('./
|
|
2
|
-
const SpamComplaintEvent = require('../email-service/events/
|
|
3
|
-
const EmailBouncedEvent = require('../email-service/events/
|
|
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/
|
|
6
|
-
const MailgunEmailSuppressionList = require('./
|
|
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('./
|
|
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('./
|
|
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('./
|
|
2
|
+
const FrontendDataService = require('./front-end-data-service');
|
|
3
3
|
|
|
4
4
|
module.exports.init = () => {
|
|
5
5
|
return new FrontendDataService({IntegrationModel: models.Integration});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = require('./
|
|
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('./
|
|
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('./
|
|
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('./
|
|
17
|
+
const LinkRedirectsService = require('./link-redirects-service');
|
|
18
18
|
|
|
19
19
|
this.linkRedirectRepository = new LinkRedirectRepository({
|
|
20
20
|
LinkRedirect: models.Redirect,
|
package/core/server/services/link-redirection/{LinkRedirectsService.js → link-redirects-service.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const crypto = require('crypto');
|
|
2
2
|
const DomainEvents = require('@tryghost/domain-events');
|
|
3
|
-
const RedirectEvent = require('./
|
|
4
|
-
const LinkRedirect = require('./
|
|
3
|
+
const RedirectEvent = require('./redirect-event');
|
|
4
|
+
const LinkRedirect = require('./link-redirect');
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* @typedef {object} ILinkRedirectRepository
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const LinkClickRepository = require('./
|
|
2
|
-
const PostLinkRepository = require('./
|
|
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('./
|
|
23
|
+
const LinkClickTrackingService = require('./link-click-tracking-service');
|
|
24
24
|
|
|
25
25
|
const postLinkRepository = new PostLinkRepository({
|
|
26
26
|
LinkRedirect: models.Redirect,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const RedirectEvent = require('../link-redirection/
|
|
2
|
-
const LinkClick = require('./
|
|
3
|
-
const PostLink = require('./
|
|
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('./
|
|
25
|
+
* @typedef {import('./full-post-link')} FullPostLink
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
28
|
/**
|
package/core/server/services/link-tracking/{PostLinkRepository.js → post-link-repository.js}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const FullPostLink = require('./
|
|
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('./
|
|
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/
|
|
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/
|
|
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('./
|
|
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('./
|
|
4
|
+
const MediaInliner = require('./external-media-inliner');
|
|
5
5
|
const models = require('../../models');
|
|
6
6
|
const jobsService = require('../jobs');
|
|
7
7
|
|