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
|
@@ -0,0 +1,739 @@
|
|
|
1
|
+
import { a as ue, j as e, u as J, b as le, d as ie, O as _e, t as Me, n as Z, g as o, i as U, T as L, V as ee, k as G, o as he, m as Pe, p as te, R as pe, e as je } from "./index-BKgioyC7.mjs";
|
|
2
|
+
import { E as xe, aP as Be, B as be, aO as se, j as Ee, au as Ve, av as Ye, aw as Oe, ax as ae, k as ge, aQ as Fe, aR as Ge, aS as Re, aT as $e, aU as Ae, aV as ze, aW as ve, aX as Le, aY as Ie, m as ne, S as Ce, F as Ke, aD as Ue, aZ as We, y as He, z as Qe, N as qe, D as Xe, A as Je, a as Ne, e as ye, b as Ze, c as es, d as ss, J as as } from "./stats-Bbm6yWZq.mjs";
|
|
3
|
+
import { T as de, a as me, K as re, c as R, d as rs, b as W, e as we } from "./tabs-BKwH5k-q.mjs";
|
|
4
|
+
import { B as ts, T as X, a as S, b as y, c as ns, d as ke, e as De, f as $, S as H } from "./sort-button-Bvi1wfa7.mjs";
|
|
5
|
+
import { k as ls, S as is, a as cs, b as os, c as ds, d as ms, f as us, g as hs, C as K, h as xs, l as bs, j as fs } from "./url-helpers-DmHnUIGc.mjs";
|
|
6
|
+
import { g as oe, u as ps } from "./use-growth-stats-BVj3j1hb.mjs";
|
|
7
|
+
import { g as js } from "./audience-select-fTCiZ9MT.mjs";
|
|
8
|
+
const Se = ({ className: c }) => {
|
|
9
|
+
const p = ue();
|
|
10
|
+
return /* @__PURE__ */ e.jsx(
|
|
11
|
+
xe,
|
|
12
|
+
{
|
|
13
|
+
actions: /* @__PURE__ */ e.jsx(be, { variant: "outline", onClick: () => p("/settings/analytics", { crossApp: !0 }), children: "Open settings" }),
|
|
14
|
+
className: c,
|
|
15
|
+
description: "Enable member source tracking in settings to see which content drives member growth.",
|
|
16
|
+
title: "Member sources have been disabled",
|
|
17
|
+
children: /* @__PURE__ */ e.jsx(Be, {})
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}, gs = ({ chartData: c, subscriptionData: p, totals: w, initialTab: h = "total-members", currencySymbol: j, isLoading: f }) => {
|
|
21
|
+
const [a, x] = J(h), [m, I] = J("total"), { range: r } = le(), { appSettings: b } = ie(), Q = ue(), [M] = _e();
|
|
22
|
+
Me(() => {
|
|
23
|
+
x(h);
|
|
24
|
+
}, [h]);
|
|
25
|
+
const k = (s) => {
|
|
26
|
+
x(s);
|
|
27
|
+
const l = new URLSearchParams(M);
|
|
28
|
+
l.set("tab", s), Q(`?${l.toString()}`, { replace: !0 });
|
|
29
|
+
}, { totalMembers: P, freeMembers: O, paidMembers: F, mrr: B, percentChanges: D, directions: n } = w, C = (s, l) => {
|
|
30
|
+
if (l === 1) {
|
|
31
|
+
const T = L().format("YYYY-MM-DD"), _ = s.find((z) => z.date === T);
|
|
32
|
+
return [{
|
|
33
|
+
date: T,
|
|
34
|
+
signups: (_ == null ? void 0 : _.signups) || 0,
|
|
35
|
+
cancellations: (_ == null ? void 0 : _.cancellations) || 0
|
|
36
|
+
}];
|
|
37
|
+
}
|
|
38
|
+
const { startDate: t, endDate: u } = he(l), d = L(u).diff(L(t), "days"), g = Le(l, d, "sum"), A = new Map(s.map((T) => [T.date, T])), q = [], E = L(t), ce = L(u);
|
|
39
|
+
for (; E.isSameOrBefore(ce); ) {
|
|
40
|
+
let T, _;
|
|
41
|
+
switch (g) {
|
|
42
|
+
case "weekly":
|
|
43
|
+
T = E.startOf("week").format("YYYY-MM-DD"), _ = "week";
|
|
44
|
+
break;
|
|
45
|
+
case "monthly":
|
|
46
|
+
T = E.startOf("month").format("YYYY-MM-DD"), _ = "month";
|
|
47
|
+
break;
|
|
48
|
+
default:
|
|
49
|
+
T = E.format("YYYY-MM-DD"), _ = "day";
|
|
50
|
+
}
|
|
51
|
+
const z = A.get(T);
|
|
52
|
+
z ? q.push(z) : q.push({
|
|
53
|
+
date: T,
|
|
54
|
+
signups: 0,
|
|
55
|
+
cancellations: 0
|
|
56
|
+
}), E.add(1, _);
|
|
57
|
+
}
|
|
58
|
+
return q;
|
|
59
|
+
}, v = Z(() => {
|
|
60
|
+
if (!c || c.length === 0)
|
|
61
|
+
return [];
|
|
62
|
+
let s = [], l = "value";
|
|
63
|
+
switch (a) {
|
|
64
|
+
case "free-members":
|
|
65
|
+
l = "free";
|
|
66
|
+
break;
|
|
67
|
+
case "paid-members":
|
|
68
|
+
l = "paid";
|
|
69
|
+
break;
|
|
70
|
+
case "mrr": {
|
|
71
|
+
l = "mrr";
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
default:
|
|
75
|
+
l = "value";
|
|
76
|
+
}
|
|
77
|
+
s = se(c, r, l, "exact");
|
|
78
|
+
let t = [];
|
|
79
|
+
switch (a) {
|
|
80
|
+
case "free-members":
|
|
81
|
+
t = s.map((u) => ({
|
|
82
|
+
...u,
|
|
83
|
+
value: u.free,
|
|
84
|
+
formattedValue: o(u.free),
|
|
85
|
+
label: "Free members"
|
|
86
|
+
}));
|
|
87
|
+
break;
|
|
88
|
+
case "paid-members":
|
|
89
|
+
t = s.map((u) => ({
|
|
90
|
+
...u,
|
|
91
|
+
value: u.paid,
|
|
92
|
+
formattedValue: o(u.paid),
|
|
93
|
+
label: "Paid members"
|
|
94
|
+
}));
|
|
95
|
+
break;
|
|
96
|
+
case "mrr":
|
|
97
|
+
t = s.map((u) => ({
|
|
98
|
+
...u,
|
|
99
|
+
value: U(u.mrr),
|
|
100
|
+
formattedValue: `${j}${o(U(u.mrr))}`,
|
|
101
|
+
label: "MRR"
|
|
102
|
+
}));
|
|
103
|
+
break;
|
|
104
|
+
default:
|
|
105
|
+
t = s.map((u) => {
|
|
106
|
+
const d = u.free + u.paid;
|
|
107
|
+
return {
|
|
108
|
+
...u,
|
|
109
|
+
value: d,
|
|
110
|
+
formattedValue: o(d),
|
|
111
|
+
label: "Total members"
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return t;
|
|
116
|
+
}, [a, c, r, j]), N = {
|
|
117
|
+
"total-members": {
|
|
118
|
+
color: "hsl(var(--chart-darkblue))"
|
|
119
|
+
},
|
|
120
|
+
"free-members": {
|
|
121
|
+
color: "hsl(var(--chart-blue))"
|
|
122
|
+
},
|
|
123
|
+
"paid-members": {
|
|
124
|
+
color: "hsl(var(--chart-purple))"
|
|
125
|
+
},
|
|
126
|
+
mrr: {
|
|
127
|
+
color: "hsl(var(--chart-teal))"
|
|
128
|
+
}
|
|
129
|
+
}, V = Z(() => {
|
|
130
|
+
if (a !== "paid-members")
|
|
131
|
+
return [];
|
|
132
|
+
if (p && p.length > 0) {
|
|
133
|
+
if (r === 1) {
|
|
134
|
+
const d = L().format("YYYY-MM-DD"), g = p.find((A) => A.date === d);
|
|
135
|
+
return [{
|
|
136
|
+
date: ee(d, r),
|
|
137
|
+
new: (g == null ? void 0 : g.signups) || 0,
|
|
138
|
+
cancelled: -((g == null ? void 0 : g.cancellations) || 0)
|
|
139
|
+
// Negative for the stacked bar chart
|
|
140
|
+
}];
|
|
141
|
+
}
|
|
142
|
+
const s = se(p, r, "signups", "sum"), l = se(p, r, "cancellations", "sum"), t = s.map((d) => {
|
|
143
|
+
var g;
|
|
144
|
+
return {
|
|
145
|
+
date: d.date,
|
|
146
|
+
signups: d.signups || 0,
|
|
147
|
+
cancellations: ((g = l.find((A) => A.date === d.date)) == null ? void 0 : g.cancellations) || 0
|
|
148
|
+
};
|
|
149
|
+
});
|
|
150
|
+
return l.forEach((d) => {
|
|
151
|
+
t.find((g) => g.date === d.date) || t.push({
|
|
152
|
+
date: d.date,
|
|
153
|
+
signups: 0,
|
|
154
|
+
cancellations: d.cancellations || 0
|
|
155
|
+
});
|
|
156
|
+
}), t.sort((d, g) => new Date(d.date).getTime() - new Date(g.date).getTime()), C(t, r).map((d) => ({
|
|
157
|
+
date: ee(d.date, r),
|
|
158
|
+
new: d.signups || 0,
|
|
159
|
+
cancelled: -(d.cancellations || 0)
|
|
160
|
+
// Negative for the stacked bar chart
|
|
161
|
+
}));
|
|
162
|
+
} else {
|
|
163
|
+
if (!c || c.length === 0)
|
|
164
|
+
return [];
|
|
165
|
+
if (r === 1) {
|
|
166
|
+
const l = L().format("YYYY-MM-DD"), t = c.find((u) => u.date === l);
|
|
167
|
+
return [{
|
|
168
|
+
date: ee(l, r),
|
|
169
|
+
new: (t == null ? void 0 : t.paid_subscribed) || 0,
|
|
170
|
+
cancelled: -((t == null ? void 0 : t.paid_canceled) || 0)
|
|
171
|
+
// Negative for the stacked bar chart
|
|
172
|
+
}];
|
|
173
|
+
}
|
|
174
|
+
return se(c, r, "paid", "exact").map((l) => ({
|
|
175
|
+
date: ee(l.date, r),
|
|
176
|
+
new: l.paid_subscribed || 0,
|
|
177
|
+
cancelled: -(l.paid_canceled || 0)
|
|
178
|
+
// Negative for the stacked bar chart
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
}, [a, c, p, r]), Y = {
|
|
182
|
+
new: {
|
|
183
|
+
label: "New",
|
|
184
|
+
color: "hsl(var(--chart-teal))"
|
|
185
|
+
},
|
|
186
|
+
cancelled: {
|
|
187
|
+
label: "Cancelled",
|
|
188
|
+
color: "hsl(var(--chart-rose))"
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
if (f)
|
|
192
|
+
return /* @__PURE__ */ e.jsx("div", { className: "-mb-6 flex h-[calc(16vw+132px)] w-full items-start justify-center", children: /* @__PURE__ */ e.jsx(Ee, {}) });
|
|
193
|
+
const i = "-mb-3 h-[16vw] max-h-[320px] w-full min-h-[180px]";
|
|
194
|
+
return /* @__PURE__ */ e.jsxs(de, { defaultValue: h, variant: "kpis", children: [
|
|
195
|
+
/* @__PURE__ */ e.jsxs(me, { className: `-mx-6 ${b != null && b.paidMembersEnabled ? "hidden grid-cols-4 lg:!visible lg:!grid" : "grid grid-cols-4"}`, children: [
|
|
196
|
+
/* @__PURE__ */ e.jsx(re, { className: b != null && b.paidMembersEnabled ? "" : "cursor-auto after:hidden", value: "total-members", onClick: () => {
|
|
197
|
+
b != null && b.paidMembersEnabled && k("total-members");
|
|
198
|
+
}, children: /* @__PURE__ */ e.jsx(
|
|
199
|
+
R,
|
|
200
|
+
{
|
|
201
|
+
color: "hsl(var(--chart-darkblue))",
|
|
202
|
+
diffDirection: r === G.allTime.value ? "hidden" : n.total,
|
|
203
|
+
diffValue: D.total,
|
|
204
|
+
label: "Total members",
|
|
205
|
+
value: o(P)
|
|
206
|
+
}
|
|
207
|
+
) }),
|
|
208
|
+
(b == null ? void 0 : b.paidMembersEnabled) && /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
209
|
+
/* @__PURE__ */ e.jsx(re, { value: "free-members", onClick: () => {
|
|
210
|
+
k("free-members");
|
|
211
|
+
}, children: /* @__PURE__ */ e.jsx(
|
|
212
|
+
R,
|
|
213
|
+
{
|
|
214
|
+
color: "hsl(var(--chart-blue))",
|
|
215
|
+
diffDirection: r === G.allTime.value ? "hidden" : n.free,
|
|
216
|
+
diffValue: D.free,
|
|
217
|
+
label: "Free members",
|
|
218
|
+
value: o(O)
|
|
219
|
+
}
|
|
220
|
+
) }),
|
|
221
|
+
/* @__PURE__ */ e.jsx(re, { value: "paid-members", onClick: () => {
|
|
222
|
+
k("paid-members");
|
|
223
|
+
}, children: /* @__PURE__ */ e.jsx(
|
|
224
|
+
R,
|
|
225
|
+
{
|
|
226
|
+
color: "hsl(var(--chart-purple))",
|
|
227
|
+
diffDirection: r === G.allTime.value ? "hidden" : n.paid,
|
|
228
|
+
diffValue: D.paid,
|
|
229
|
+
label: "Paid members",
|
|
230
|
+
value: o(F)
|
|
231
|
+
}
|
|
232
|
+
) }),
|
|
233
|
+
/* @__PURE__ */ e.jsx(re, { value: "mrr", onClick: () => {
|
|
234
|
+
k("mrr");
|
|
235
|
+
}, children: /* @__PURE__ */ e.jsx(
|
|
236
|
+
R,
|
|
237
|
+
{
|
|
238
|
+
color: "hsl(var(--chart-teal))",
|
|
239
|
+
diffDirection: r === G.allTime.value ? "hidden" : n.mrr,
|
|
240
|
+
diffValue: D.mrr,
|
|
241
|
+
label: "MRR",
|
|
242
|
+
value: `${j}${o(U(B))}`
|
|
243
|
+
}
|
|
244
|
+
) })
|
|
245
|
+
] })
|
|
246
|
+
] }),
|
|
247
|
+
(b == null ? void 0 : b.paidMembersEnabled) && /* @__PURE__ */ e.jsxs(Ve, { children: [
|
|
248
|
+
/* @__PURE__ */ e.jsx(Ye, { className: "lg:hidden", asChild: !0, children: /* @__PURE__ */ e.jsxs(rs, { children: [
|
|
249
|
+
a === "total-members" && /* @__PURE__ */ e.jsx(
|
|
250
|
+
R,
|
|
251
|
+
{
|
|
252
|
+
color: "hsl(var(--chart-darkblue))",
|
|
253
|
+
diffDirection: r === G.allTime.value ? "hidden" : n.total,
|
|
254
|
+
diffValue: D.total,
|
|
255
|
+
label: "Total members",
|
|
256
|
+
value: o(P)
|
|
257
|
+
}
|
|
258
|
+
),
|
|
259
|
+
a === "free-members" && /* @__PURE__ */ e.jsx(
|
|
260
|
+
R,
|
|
261
|
+
{
|
|
262
|
+
color: "hsl(var(--chart-blue))",
|
|
263
|
+
diffDirection: r === G.allTime.value ? "hidden" : n.free,
|
|
264
|
+
diffValue: D.free,
|
|
265
|
+
label: "Free members",
|
|
266
|
+
value: o(O)
|
|
267
|
+
}
|
|
268
|
+
),
|
|
269
|
+
a === "paid-members" && /* @__PURE__ */ e.jsx(
|
|
270
|
+
R,
|
|
271
|
+
{
|
|
272
|
+
color: "hsl(var(--chart-purple))",
|
|
273
|
+
diffDirection: r === G.allTime.value ? "hidden" : n.paid,
|
|
274
|
+
diffValue: D.paid,
|
|
275
|
+
label: "Paid members",
|
|
276
|
+
value: o(F)
|
|
277
|
+
}
|
|
278
|
+
),
|
|
279
|
+
a === "mrr" && /* @__PURE__ */ e.jsx(
|
|
280
|
+
R,
|
|
281
|
+
{
|
|
282
|
+
color: "hsl(var(--chart-teal))",
|
|
283
|
+
diffDirection: r === G.allTime.value ? "hidden" : n.mrr,
|
|
284
|
+
diffValue: D.mrr,
|
|
285
|
+
label: "MRR",
|
|
286
|
+
value: `${j}${o(U(B))}`
|
|
287
|
+
}
|
|
288
|
+
)
|
|
289
|
+
] }) }),
|
|
290
|
+
/* @__PURE__ */ e.jsxs(Oe, { align: "end", className: "w-56", children: [
|
|
291
|
+
/* @__PURE__ */ e.jsx(ae, { onClick: () => k("total-members"), children: "Total members" }),
|
|
292
|
+
/* @__PURE__ */ e.jsx(ae, { onClick: () => k("free-members"), children: "Free members" }),
|
|
293
|
+
/* @__PURE__ */ e.jsx(ae, { onClick: () => k("paid-members"), children: "Paid members" }),
|
|
294
|
+
/* @__PURE__ */ e.jsx(ae, { onClick: () => k("mrr"), children: "MRR" })
|
|
295
|
+
] })
|
|
296
|
+
] }),
|
|
297
|
+
/* @__PURE__ */ e.jsx("div", { className: "my-4 [&_.recharts-cartesian-axis-tick-value]:fill-gray-500", children: a === "paid-members" ? /* @__PURE__ */ e.jsxs(
|
|
298
|
+
de,
|
|
299
|
+
{
|
|
300
|
+
defaultValue: m,
|
|
301
|
+
variant: "button-sm",
|
|
302
|
+
onValueChange: (s) => {
|
|
303
|
+
I(s);
|
|
304
|
+
},
|
|
305
|
+
children: [
|
|
306
|
+
/* @__PURE__ */ e.jsx("div", { className: "mb-4 mt-2 flex w-full items-center justify-start", children: /* @__PURE__ */ e.jsxs(me, { className: "flex items-center", children: [
|
|
307
|
+
/* @__PURE__ */ e.jsx(W, { value: "total", children: "Total" }),
|
|
308
|
+
/* @__PURE__ */ e.jsx(W, { value: "change", children: "Change" })
|
|
309
|
+
] }) }),
|
|
310
|
+
/* @__PURE__ */ e.jsx(we, { value: "total", children: /* @__PURE__ */ e.jsx(
|
|
311
|
+
ge,
|
|
312
|
+
{
|
|
313
|
+
className: i,
|
|
314
|
+
color: N[a].color,
|
|
315
|
+
data: v,
|
|
316
|
+
dataFormatter: o,
|
|
317
|
+
id: "paid-members",
|
|
318
|
+
range: r
|
|
319
|
+
}
|
|
320
|
+
) }),
|
|
321
|
+
/* @__PURE__ */ e.jsxs(we, { value: "change", children: [
|
|
322
|
+
/* @__PURE__ */ e.jsx(Fe, { className: "mt-6 aspect-auto h-[200px] w-full md:h-[220px] xl:h-[260px]", config: Y, children: /* @__PURE__ */ e.jsxs(
|
|
323
|
+
ts,
|
|
324
|
+
{
|
|
325
|
+
data: V,
|
|
326
|
+
stackOffset: "sign",
|
|
327
|
+
children: [
|
|
328
|
+
/* @__PURE__ */ e.jsx("defs", { children: /* @__PURE__ */ e.jsxs("linearGradient", { id: "tealGradient", x1: "0", x2: "0", y1: "0", y2: "1", children: [
|
|
329
|
+
/* @__PURE__ */ e.jsx("stop", { offset: "0%", stopColor: "var(--color-new)", stopOpacity: 0.8 }),
|
|
330
|
+
/* @__PURE__ */ e.jsx("stop", { offset: "100%", stopColor: "var(--color-new)", stopOpacity: 0.6 })
|
|
331
|
+
] }) }),
|
|
332
|
+
/* @__PURE__ */ e.jsx("defs", { children: /* @__PURE__ */ e.jsxs("linearGradient", { id: "roseGradient", x1: "0", x2: "0", y1: "0", y2: "1", children: [
|
|
333
|
+
/* @__PURE__ */ e.jsx("stop", { offset: "0%", stopColor: "var(--color-cancelled)", stopOpacity: 0.6 }),
|
|
334
|
+
/* @__PURE__ */ e.jsx("stop", { offset: "100%", stopColor: "var(--color-cancelled)", stopOpacity: 0.8 })
|
|
335
|
+
] }) }),
|
|
336
|
+
/* @__PURE__ */ e.jsx(Ge, { vertical: !1 }),
|
|
337
|
+
/* @__PURE__ */ e.jsx(
|
|
338
|
+
Re,
|
|
339
|
+
{
|
|
340
|
+
axisLine: !1,
|
|
341
|
+
dataKey: "date",
|
|
342
|
+
tickFormatter: () => "",
|
|
343
|
+
tickLine: !1,
|
|
344
|
+
tickMargin: 10
|
|
345
|
+
}
|
|
346
|
+
),
|
|
347
|
+
/* @__PURE__ */ e.jsx(
|
|
348
|
+
$e,
|
|
349
|
+
{
|
|
350
|
+
axisLine: !1,
|
|
351
|
+
tickFormatter: (s) => s < 0 ? o(s * -1) : o(s),
|
|
352
|
+
tickLine: !1
|
|
353
|
+
}
|
|
354
|
+
),
|
|
355
|
+
/* @__PURE__ */ e.jsx(
|
|
356
|
+
Ae,
|
|
357
|
+
{
|
|
358
|
+
content: /* @__PURE__ */ e.jsx(
|
|
359
|
+
ze,
|
|
360
|
+
{
|
|
361
|
+
className: "!min-w-[120px] px-3 py-2",
|
|
362
|
+
formatter: (s, l, t, u) => {
|
|
363
|
+
var T, _, z, fe;
|
|
364
|
+
const d = Number(s);
|
|
365
|
+
let g = "0";
|
|
366
|
+
d === 0 ? g = "0" : g = d < 0 ? o(d * -1) : o(d);
|
|
367
|
+
const A = Number(((T = t == null ? void 0 : t.payload) == null ? void 0 : T.new) || 0), q = Number(((_ = t == null ? void 0 : t.payload) == null ? void 0 : _.cancelled) || 0), E = A + q, ce = E === 0 ? "0" : E > 0 ? `+${o(E)}` : o(E);
|
|
368
|
+
return /* @__PURE__ */ e.jsxs("div", { className: "flex w-full flex-col", children: [
|
|
369
|
+
u === 0 && /* @__PURE__ */ e.jsx("div", { className: "mb-1 text-sm font-medium text-foreground", children: (z = t == null ? void 0 : t.payload) == null ? void 0 : z.date }),
|
|
370
|
+
/* @__PURE__ */ e.jsxs("div", { className: "flex w-full items-center justify-between gap-4", children: [
|
|
371
|
+
/* @__PURE__ */ e.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
372
|
+
/* @__PURE__ */ e.jsx(
|
|
373
|
+
"div",
|
|
374
|
+
{
|
|
375
|
+
className: "size-2 shrink-0 rounded-full bg-[var(--color-bg)] opacity-50",
|
|
376
|
+
style: {
|
|
377
|
+
"--color-bg": `var(--color-${l})`
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
),
|
|
381
|
+
/* @__PURE__ */ e.jsx("span", { className: "text-sm text-muted-foreground", children: ((fe = Y[l]) == null ? void 0 : fe.label) || l })
|
|
382
|
+
] }),
|
|
383
|
+
/* @__PURE__ */ e.jsx("div", { className: "ml-auto flex items-baseline gap-0.5 font-mono font-medium tabular-nums text-foreground", children: g })
|
|
384
|
+
] }),
|
|
385
|
+
u === 1 && /* @__PURE__ */ e.jsxs("div", { className: "mt-1 flex w-full items-center justify-between gap-4 border-t pt-1", children: [
|
|
386
|
+
/* @__PURE__ */ e.jsx("span", { className: "text-sm text-muted-foreground", children: "Net change" }),
|
|
387
|
+
/* @__PURE__ */ e.jsx("div", { className: "ml-auto flex items-baseline gap-0.5 font-mono font-medium tabular-nums text-foreground", children: ce })
|
|
388
|
+
] })
|
|
389
|
+
] });
|
|
390
|
+
},
|
|
391
|
+
hideLabel: !0
|
|
392
|
+
}
|
|
393
|
+
),
|
|
394
|
+
cursor: !1,
|
|
395
|
+
isAnimationActive: !1,
|
|
396
|
+
position: { y: 10 }
|
|
397
|
+
}
|
|
398
|
+
),
|
|
399
|
+
/* @__PURE__ */ e.jsx(
|
|
400
|
+
ve,
|
|
401
|
+
{
|
|
402
|
+
activeBar: { fillOpacity: 1 },
|
|
403
|
+
dataKey: "new",
|
|
404
|
+
fill: "url(#tealGradient)",
|
|
405
|
+
fillOpacity: 0.75,
|
|
406
|
+
maxBarSize: 32,
|
|
407
|
+
minPointSize: 3,
|
|
408
|
+
radius: [4, 4, 0, 0],
|
|
409
|
+
stackId: "a"
|
|
410
|
+
}
|
|
411
|
+
),
|
|
412
|
+
/* @__PURE__ */ e.jsx(
|
|
413
|
+
ve,
|
|
414
|
+
{
|
|
415
|
+
activeBar: { fillOpacity: 1 },
|
|
416
|
+
dataKey: "cancelled",
|
|
417
|
+
fill: "url(#roseGradient)",
|
|
418
|
+
fillOpacity: 0.75,
|
|
419
|
+
maxBarSize: 32,
|
|
420
|
+
radius: [4, 4, 0, 0],
|
|
421
|
+
stackId: "a"
|
|
422
|
+
}
|
|
423
|
+
)
|
|
424
|
+
]
|
|
425
|
+
}
|
|
426
|
+
) }),
|
|
427
|
+
/* @__PURE__ */ e.jsxs("div", { className: "flex items-center justify-center gap-6 text-sm text-muted-foreground", children: [
|
|
428
|
+
/* @__PURE__ */ e.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
429
|
+
/* @__PURE__ */ e.jsx(
|
|
430
|
+
"span",
|
|
431
|
+
{
|
|
432
|
+
className: "size-2 rounded-full opacity-50",
|
|
433
|
+
style: {
|
|
434
|
+
backgroundColor: Y.new.color
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
),
|
|
438
|
+
"New"
|
|
439
|
+
] }),
|
|
440
|
+
/* @__PURE__ */ e.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
441
|
+
/* @__PURE__ */ e.jsx(
|
|
442
|
+
"span",
|
|
443
|
+
{
|
|
444
|
+
className: "size-2 rounded-full opacity-50",
|
|
445
|
+
style: {
|
|
446
|
+
backgroundColor: Y.cancelled.color
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
),
|
|
450
|
+
"Cancelled"
|
|
451
|
+
] })
|
|
452
|
+
] })
|
|
453
|
+
] })
|
|
454
|
+
]
|
|
455
|
+
}
|
|
456
|
+
) : /* @__PURE__ */ e.jsx(
|
|
457
|
+
ge,
|
|
458
|
+
{
|
|
459
|
+
className: i,
|
|
460
|
+
color: N[a].color,
|
|
461
|
+
data: v,
|
|
462
|
+
dataFormatter: a === "mrr" ? (s) => `${j}${o(s)}` : o,
|
|
463
|
+
id: "mrr",
|
|
464
|
+
range: r
|
|
465
|
+
}
|
|
466
|
+
) })
|
|
467
|
+
] });
|
|
468
|
+
}, vs = Pe({
|
|
469
|
+
dataType: "TopSourcesGrowthResponseType",
|
|
470
|
+
path: "/stats/top-sources-growth"
|
|
471
|
+
}), Ns = (c, p = "signups desc", w = 50) => {
|
|
472
|
+
const { audience: h } = le(), { startDate: j, endDate: f, timezone: a } = he(c), x = {
|
|
473
|
+
date_from: te(j),
|
|
474
|
+
date_to: te(f),
|
|
475
|
+
member_status: js(h),
|
|
476
|
+
order: p,
|
|
477
|
+
limit: w.toString()
|
|
478
|
+
};
|
|
479
|
+
return a && (x.timezone = a), vs({ searchParams: x });
|
|
480
|
+
}, Te = ({ data: c, currencySymbol: p, limit: w, defaultSourceIconUrl: h }) => {
|
|
481
|
+
const j = w ? c.slice(0, w) : c, { appSettings: f } = ie();
|
|
482
|
+
return /* @__PURE__ */ e.jsx(X, { children: j.map((a) => /* @__PURE__ */ e.jsxs(S, { className: "last:border-none", children: [
|
|
483
|
+
/* @__PURE__ */ e.jsx(y, { className: "font-medium", children: /* @__PURE__ */ e.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
484
|
+
/* @__PURE__ */ e.jsx(
|
|
485
|
+
hs,
|
|
486
|
+
{
|
|
487
|
+
defaultSourceIconUrl: h,
|
|
488
|
+
displayName: a.displayName,
|
|
489
|
+
iconSrc: a.iconSrc
|
|
490
|
+
}
|
|
491
|
+
),
|
|
492
|
+
a.linkUrl ? /* @__PURE__ */ e.jsx(
|
|
493
|
+
"a",
|
|
494
|
+
{
|
|
495
|
+
className: "hover:underline",
|
|
496
|
+
href: a.linkUrl,
|
|
497
|
+
rel: "noreferrer",
|
|
498
|
+
target: "_blank",
|
|
499
|
+
children: a.displayName
|
|
500
|
+
}
|
|
501
|
+
) : /* @__PURE__ */ e.jsx("span", { children: a.displayName })
|
|
502
|
+
] }) }),
|
|
503
|
+
/* @__PURE__ */ e.jsxs(y, { className: "text-right font-mono text-sm", children: [
|
|
504
|
+
"+",
|
|
505
|
+
o(a.free_members)
|
|
506
|
+
] }),
|
|
507
|
+
(f == null ? void 0 : f.paidMembersEnabled) && /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
508
|
+
/* @__PURE__ */ e.jsxs(y, { className: "text-right font-mono text-sm", children: [
|
|
509
|
+
"+",
|
|
510
|
+
o(a.paid_members)
|
|
511
|
+
] }),
|
|
512
|
+
/* @__PURE__ */ e.jsxs(y, { className: "text-right font-mono text-sm", children: [
|
|
513
|
+
"+",
|
|
514
|
+
p,
|
|
515
|
+
o(U(a.mrr))
|
|
516
|
+
] })
|
|
517
|
+
] })
|
|
518
|
+
] }, a.source)) });
|
|
519
|
+
}, ys = ({
|
|
520
|
+
range: c,
|
|
521
|
+
limit: p = 20,
|
|
522
|
+
showViewAll: w = !1,
|
|
523
|
+
sortBy: h,
|
|
524
|
+
setSortBy: j
|
|
525
|
+
}) => {
|
|
526
|
+
const { data: f } = le(), { data: a } = Ie(), { appSettings: x } = ie(), [m, I] = J("free_members desc"), r = h || m, b = j || I, Q = r.replace("free_members", "signups").replace("paid_members", "paid_conversions"), { data: M, isLoading: k } = Ns(c, Q, p), P = f == null ? void 0 : f.url, O = "https://www.google.com/s2/favicons?domain=ghost.org&sz=64", F = pe.useMemo(() => {
|
|
527
|
+
var C;
|
|
528
|
+
if (a != null && a.stats && ((C = a == null ? void 0 : a.meta) != null && C.totals)) {
|
|
529
|
+
const v = a.meta.totals;
|
|
530
|
+
let N = v[0];
|
|
531
|
+
if (!N)
|
|
532
|
+
return oe("usd");
|
|
533
|
+
for (const V of v)
|
|
534
|
+
V.mrr > N.mrr && (N = V);
|
|
535
|
+
return oe(N.currency);
|
|
536
|
+
}
|
|
537
|
+
return oe("usd");
|
|
538
|
+
}, [a]), B = pe.useMemo(() => M != null && M.stats ? M.stats.map((C) => {
|
|
539
|
+
const v = C.source || "Direct", { domain: N } = ls(v, P), V = N ? `https://www.faviconextractor.com/favicon/${N}?larger=true` : O, Y = N && v !== "Direct" ? `https://${N}` : void 0;
|
|
540
|
+
return {
|
|
541
|
+
source: v,
|
|
542
|
+
free_members: C.signups,
|
|
543
|
+
// Backend returns 'signups', we map to 'free_members' for display
|
|
544
|
+
paid_members: C.paid_conversions,
|
|
545
|
+
// Backend returns 'paid_conversions', we map to 'paid_members' for display
|
|
546
|
+
mrr: C.mrr,
|
|
547
|
+
iconSrc: V,
|
|
548
|
+
displayName: v,
|
|
549
|
+
linkUrl: Y
|
|
550
|
+
};
|
|
551
|
+
}) : [], [M, P]), D = "Top sources", n = `Where did your growth come from ${ne(c)}`;
|
|
552
|
+
return x != null && x.analytics.membersTrackSources ? k ? /* @__PURE__ */ e.jsx(X, { children: /* @__PURE__ */ e.jsx(S, { className: "last:border-none", children: /* @__PURE__ */ e.jsx(y, { className: "border-none py-2", colSpan: 1, children: /* @__PURE__ */ e.jsx(Ce, { containerClassName: "space-y-2", count: 5, maxWidth: 75, randomize: !0 }) }) }) }) : /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
553
|
+
B.length > 0 ? /* @__PURE__ */ e.jsx(
|
|
554
|
+
Te,
|
|
555
|
+
{
|
|
556
|
+
currencySymbol: F,
|
|
557
|
+
data: B,
|
|
558
|
+
defaultSourceIconUrl: O,
|
|
559
|
+
limit: p
|
|
560
|
+
}
|
|
561
|
+
) : /* @__PURE__ */ e.jsx(X, { children: /* @__PURE__ */ e.jsx(S, { className: "last:border-none", children: /* @__PURE__ */ e.jsx(y, { className: "border-none py-12 group-hover:!bg-transparent", colSpan: x != null && x.paidMembersEnabled ? 4 : 2, children: /* @__PURE__ */ e.jsx(
|
|
562
|
+
xe,
|
|
563
|
+
{
|
|
564
|
+
description: "Try adjusting your date range to see more data.",
|
|
565
|
+
title: `No conversions ${ne(c)}`,
|
|
566
|
+
children: /* @__PURE__ */ e.jsx(Ke, { strokeWidth: 1.5 })
|
|
567
|
+
}
|
|
568
|
+
) }) }) }),
|
|
569
|
+
w && B.length > p && /* @__PURE__ */ e.jsx(ns, { className: "border-none bg-transparent hover:!bg-transparent", children: /* @__PURE__ */ e.jsx(S, { children: /* @__PURE__ */ e.jsx(y, { className: "border-none bg-transparent px-0 pb-0 hover:!bg-transparent", colSpan: 4, children: /* @__PURE__ */ e.jsxs(is, { children: [
|
|
570
|
+
/* @__PURE__ */ e.jsx(cs, { asChild: !0, children: /* @__PURE__ */ e.jsxs(be, { variant: "outline", children: [
|
|
571
|
+
"View all ",
|
|
572
|
+
/* @__PURE__ */ e.jsx(Ue, {})
|
|
573
|
+
] }) }),
|
|
574
|
+
/* @__PURE__ */ e.jsxs(os, { className: "overflow-y-auto pt-0 sm:max-w-[600px]", children: [
|
|
575
|
+
/* @__PURE__ */ e.jsxs(ds, { className: "sticky top-0 z-40 -mx-6 bg-background/60 p-6 backdrop-blur", children: [
|
|
576
|
+
/* @__PURE__ */ e.jsx(ms, { children: D }),
|
|
577
|
+
/* @__PURE__ */ e.jsx(us, { children: n })
|
|
578
|
+
] }),
|
|
579
|
+
/* @__PURE__ */ e.jsx("div", { className: "group/datalist", children: /* @__PURE__ */ e.jsxs(ke, { children: [
|
|
580
|
+
/* @__PURE__ */ e.jsx(De, { children: /* @__PURE__ */ e.jsxs(S, { children: [
|
|
581
|
+
/* @__PURE__ */ e.jsx($, { children: "Source" }),
|
|
582
|
+
/* @__PURE__ */ e.jsx($, { className: "w-[110px] text-right", children: /* @__PURE__ */ e.jsx(H, { activeSortBy: r, setSortBy: b, sortBy: "free_members desc", children: "Free members" }) }),
|
|
583
|
+
(x == null ? void 0 : x.paidMembersEnabled) && /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
584
|
+
/* @__PURE__ */ e.jsx($, { className: "w-[110px] text-right", children: /* @__PURE__ */ e.jsx(H, { activeSortBy: r, setSortBy: b, sortBy: "paid_members desc", children: "Paid members" }) }),
|
|
585
|
+
/* @__PURE__ */ e.jsx($, { className: "w-[110px] text-right", children: /* @__PURE__ */ e.jsx(H, { activeSortBy: r, setSortBy: b, sortBy: "mrr desc", children: "MRR impact" }) })
|
|
586
|
+
] })
|
|
587
|
+
] }) }),
|
|
588
|
+
/* @__PURE__ */ e.jsx(
|
|
589
|
+
Te,
|
|
590
|
+
{
|
|
591
|
+
currencySymbol: F,
|
|
592
|
+
data: B,
|
|
593
|
+
defaultSourceIconUrl: O
|
|
594
|
+
}
|
|
595
|
+
)
|
|
596
|
+
] }) })
|
|
597
|
+
] })
|
|
598
|
+
] }) }) }) })
|
|
599
|
+
] }) : /* @__PURE__ */ e.jsx(X, { children: /* @__PURE__ */ e.jsx(S, { className: "last:border-none", children: /* @__PURE__ */ e.jsx(y, { className: "border-none py-12 group-hover:!bg-transparent", colSpan: x != null && x.paidMembersEnabled ? 4 : 2, children: /* @__PURE__ */ e.jsx(Se, {}) }) }) });
|
|
600
|
+
}, ws = (c, p, w) => {
|
|
601
|
+
const h = c ?? 30, j = p ?? "mrr desc", { startDate: f, endDate: a } = Z(() => he(h), [h]), x = Z(() => {
|
|
602
|
+
const r = {
|
|
603
|
+
date_from: te(f),
|
|
604
|
+
date_to: te(a),
|
|
605
|
+
order: j
|
|
606
|
+
};
|
|
607
|
+
return w === "posts" ? r.post_type = "post" : w === "pages" && (r.post_type = "page"), r;
|
|
608
|
+
}, [f, a, j, w]), m = Object.fromEntries(
|
|
609
|
+
Object.entries(x).filter(([, r]) => r !== void 0)
|
|
610
|
+
);
|
|
611
|
+
return We({ searchParams: m });
|
|
612
|
+
}, Ps = () => {
|
|
613
|
+
const { range: c, site: p } = le(), w = ue(), [h, j] = J("free_members desc"), [f, a] = J(K.POSTS_AND_PAGES), [x] = _e(), { appSettings: m } = ie(), I = x.get("tab") || "total-members", { isLoading: r, chartData: b, totals: Q, currencySymbol: M, subscriptionData: k } = ps(c), { data: P, isLoading: O } = ws(
|
|
614
|
+
c,
|
|
615
|
+
h,
|
|
616
|
+
f
|
|
617
|
+
), F = Z(() => {
|
|
618
|
+
const C = ((P == null ? void 0 : P.stats) || []).reduce((i, s) => {
|
|
619
|
+
const l = s.post_id || (s.title && s.title.trim() !== "" ? s.title : s.attribution_url);
|
|
620
|
+
if (!l)
|
|
621
|
+
return i;
|
|
622
|
+
if (!i.has(l))
|
|
623
|
+
i.set(l, s);
|
|
624
|
+
else {
|
|
625
|
+
const t = i.get(l);
|
|
626
|
+
t.free_members += s.free_members, t.paid_members += s.paid_members, t.mrr += s.mrr, i.set(l, t);
|
|
627
|
+
}
|
|
628
|
+
return i;
|
|
629
|
+
}, /* @__PURE__ */ new Map()), v = Array.from(C.values()), N = v.reduce((i, s) => i + s.free_members, 0), V = v.reduce((i, s) => i + s.paid_members, 0), Y = v.reduce((i, s) => i + s.mrr, 0);
|
|
630
|
+
return v.map((i) => {
|
|
631
|
+
let s = 0;
|
|
632
|
+
return h.includes("free_members") && N > 0 ? s = i.free_members / N : h.includes("paid_members") && V > 0 ? s = i.paid_members / V : h.includes("mrr") && Y > 0 && (s = i.mrr / Y), {
|
|
633
|
+
title: i.title || i.attribution_url,
|
|
634
|
+
post_id: i.post_id,
|
|
635
|
+
attribution_url: i.attribution_url,
|
|
636
|
+
attribution_type: i.attribution_type,
|
|
637
|
+
attribution_id: i.attribution_id,
|
|
638
|
+
free_members: i.free_members,
|
|
639
|
+
paid_members: i.paid_members,
|
|
640
|
+
mrr: i.mrr,
|
|
641
|
+
percentage: s,
|
|
642
|
+
published_at: i.published_at,
|
|
643
|
+
url_exists: i.url_exists ?? !0
|
|
644
|
+
};
|
|
645
|
+
});
|
|
646
|
+
}, [P, h]), B = r, D = r || O;
|
|
647
|
+
return /* @__PURE__ */ e.jsxs(He, { children: [
|
|
648
|
+
/* @__PURE__ */ e.jsx(Qe, { children: /* @__PURE__ */ e.jsx(qe, { children: /* @__PURE__ */ e.jsx(Xe, {}) }) }),
|
|
649
|
+
/* @__PURE__ */ e.jsxs(Je, { data: B ? void 0 : b, isLoading: !1, loadingComponent: /* @__PURE__ */ e.jsx(e.Fragment, {}), children: [
|
|
650
|
+
/* @__PURE__ */ e.jsx(Ne, { "data-testid": "total-members-card", children: /* @__PURE__ */ e.jsx(ye, { children: /* @__PURE__ */ e.jsx(
|
|
651
|
+
gs,
|
|
652
|
+
{
|
|
653
|
+
chartData: b,
|
|
654
|
+
currencySymbol: M,
|
|
655
|
+
initialTab: I,
|
|
656
|
+
isLoading: B,
|
|
657
|
+
subscriptionData: k,
|
|
658
|
+
totals: Q
|
|
659
|
+
}
|
|
660
|
+
) }) }),
|
|
661
|
+
/* @__PURE__ */ e.jsxs(Ne, { className: "w-full overflow-x-auto", "data-testid": "top-content-card", children: [
|
|
662
|
+
/* @__PURE__ */ e.jsxs(Ze, { children: [
|
|
663
|
+
/* @__PURE__ */ e.jsx(es, { children: xs(f) }),
|
|
664
|
+
/* @__PURE__ */ e.jsx(ss, { children: bs(f, c, ne) })
|
|
665
|
+
] }),
|
|
666
|
+
/* @__PURE__ */ e.jsx(ye, { children: /* @__PURE__ */ e.jsxs(ke, { children: [
|
|
667
|
+
/* @__PURE__ */ e.jsx(De, { children: /* @__PURE__ */ e.jsxs(S, { className: "[&>th]:h-auto [&>th]:pb-2 [&>th]:pt-0", children: [
|
|
668
|
+
/* @__PURE__ */ e.jsx($, { className: "min-w-[320px] pl-0", children: /* @__PURE__ */ e.jsx(de, { defaultValue: f, variant: "button-sm", onValueChange: (n) => {
|
|
669
|
+
a(n);
|
|
670
|
+
}, children: /* @__PURE__ */ e.jsxs(me, { children: [
|
|
671
|
+
/* @__PURE__ */ e.jsx(W, { value: K.POSTS_AND_PAGES, children: "Posts & pages" }),
|
|
672
|
+
/* @__PURE__ */ e.jsx(W, { value: K.POSTS, children: "Posts" }),
|
|
673
|
+
/* @__PURE__ */ e.jsx(W, { value: K.PAGES, children: "Pages" }),
|
|
674
|
+
/* @__PURE__ */ e.jsx(W, { value: K.SOURCES, children: "Sources" })
|
|
675
|
+
] }) }) }),
|
|
676
|
+
/* @__PURE__ */ e.jsx($, { className: "w-[140px] text-right", children: m != null && m.paidMembersEnabled ? /* @__PURE__ */ e.jsx(H, { activeSortBy: h, setSortBy: j, sortBy: "free_members desc", children: "Free members" }) : /* @__PURE__ */ e.jsx(e.Fragment, { children: "Free members" }) }),
|
|
677
|
+
(m == null ? void 0 : m.paidMembersEnabled) && /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
678
|
+
/* @__PURE__ */ e.jsx($, { className: "w-[140px] text-right", children: /* @__PURE__ */ e.jsx(H, { activeSortBy: h, setSortBy: j, sortBy: "paid_members desc", children: "Paid members" }) }),
|
|
679
|
+
/* @__PURE__ */ e.jsx($, { className: "w-[140px] text-right", children: /* @__PURE__ */ e.jsx(H, { activeSortBy: h, setSortBy: j, sortBy: "mrr desc", children: "MRR impact" }) })
|
|
680
|
+
] })
|
|
681
|
+
] }) }),
|
|
682
|
+
f === K.SOURCES ? /* @__PURE__ */ e.jsx(
|
|
683
|
+
ys,
|
|
684
|
+
{
|
|
685
|
+
limit: 20,
|
|
686
|
+
range: c,
|
|
687
|
+
setSortBy: (n) => j(n),
|
|
688
|
+
showViewAll: !0,
|
|
689
|
+
sortBy: h
|
|
690
|
+
}
|
|
691
|
+
) : /* @__PURE__ */ e.jsx(X, { children: D ? /* @__PURE__ */ e.jsx(S, { className: "last:border-none", children: /* @__PURE__ */ e.jsx(y, { className: "border-none py-2", colSpan: 1, children: /* @__PURE__ */ e.jsx(Ce, { containerClassName: "space-y-2", count: 5, maxWidth: 75, randomize: !0 }) }) }) : m != null && m.analytics.membersTrackSources ? F.length > 0 ? F.map((n, C) => /* @__PURE__ */ e.jsxs(S, { className: "last:border-none", children: [
|
|
692
|
+
/* @__PURE__ */ e.jsx(y, { children: /* @__PURE__ */ e.jsxs("div", { className: "group/link inline-flex flex-col items-start gap-px", children: [
|
|
693
|
+
n.post_id && n.attribution_type === "post" ? /* @__PURE__ */ e.jsx(
|
|
694
|
+
be,
|
|
695
|
+
{
|
|
696
|
+
className: "h-auto whitespace-normal p-0 text-left font-medium leading-tight hover:!underline",
|
|
697
|
+
title: "View post analytics",
|
|
698
|
+
variant: "link",
|
|
699
|
+
onClick: fs(n.attribution_url, n.post_id, p.url || "", w, n.attribution_type),
|
|
700
|
+
children: n.title
|
|
701
|
+
}
|
|
702
|
+
) : /* @__PURE__ */ e.jsx("span", { className: "font-medium", children: n.title }),
|
|
703
|
+
n.published_at && je && new Date(n.published_at).getTime() > 0 && /* @__PURE__ */ e.jsxs("span", { className: "text-muted-foreground", children: [
|
|
704
|
+
"Published on ",
|
|
705
|
+
je(n.published_at)
|
|
706
|
+
] })
|
|
707
|
+
] }) }),
|
|
708
|
+
/* @__PURE__ */ e.jsxs(y, { className: "text-right font-mono text-sm", children: [
|
|
709
|
+
n.free_members > 0 && "+",
|
|
710
|
+
o(n.free_members)
|
|
711
|
+
] }),
|
|
712
|
+
(m == null ? void 0 : m.paidMembersEnabled) && /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
713
|
+
/* @__PURE__ */ e.jsxs(y, { className: "text-right font-mono text-sm", children: [
|
|
714
|
+
n.paid_members > 0 && "+",
|
|
715
|
+
o(n.paid_members)
|
|
716
|
+
] }),
|
|
717
|
+
/* @__PURE__ */ e.jsxs(y, { className: "text-right font-mono text-sm", children: [
|
|
718
|
+
n.mrr > 0 && "+",
|
|
719
|
+
M,
|
|
720
|
+
o(U(n.mrr))
|
|
721
|
+
] })
|
|
722
|
+
] })
|
|
723
|
+
] }, `${f}-${n.post_id || `${n.title}-${C}`}`)) : /* @__PURE__ */ e.jsx(S, { className: "border-none", children: /* @__PURE__ */ e.jsx(y, { className: "py-12 group-hover:!bg-transparent", colSpan: m != null && m.paidMembersEnabled ? 4 : 2, children: /* @__PURE__ */ e.jsx(
|
|
724
|
+
xe,
|
|
725
|
+
{
|
|
726
|
+
description: "Try adjusting your date range to see more data.",
|
|
727
|
+
title: `No conversions ${ne(c)}`,
|
|
728
|
+
children: /* @__PURE__ */ e.jsx(as, { strokeWidth: 1.5 })
|
|
729
|
+
}
|
|
730
|
+
) }) }) : /* @__PURE__ */ e.jsx(S, { className: "last:border-none", children: /* @__PURE__ */ e.jsx(y, { className: "border-none py-12 group-hover:!bg-transparent", colSpan: m != null && m.paidMembersEnabled ? 4 : 2, children: /* @__PURE__ */ e.jsx(Se, {}) }) }) })
|
|
731
|
+
] }) })
|
|
732
|
+
] })
|
|
733
|
+
] })
|
|
734
|
+
] });
|
|
735
|
+
};
|
|
736
|
+
export {
|
|
737
|
+
Ps as default
|
|
738
|
+
};
|
|
739
|
+
//# sourceMappingURL=index-DEkYwR7C.mjs.map
|