ghost 6.11.0 → 6.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/components/tryghost-i18n-6.12.0.tgz +0 -0
  2. package/core/boot.js +4 -2
  3. package/core/built/admin/assets/{_baseAssignValue-BX8EallQ.js → _baseAssignValue-hsL6ItjC.js} +1 -1
  4. package/core/built/admin/assets/{a-large-small-CKZJgscl.js → a-large-small-BPPu_Iy7.js} +1 -1
  5. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
  6. package/core/built/admin/assets/admin-x-settings/{code-editor-view-n8DFeXbv.mjs → code-editor-view-Bq6l5arq.mjs} +2 -2
  7. package/core/built/admin/assets/admin-x-settings/{index-v6qQgUXt.mjs → index-CKaxer_o.mjs} +2 -2
  8. package/core/built/admin/assets/admin-x-settings/{index-CXL12uvO.mjs → index-CtYEAgeN.mjs} +2 -2
  9. package/core/built/admin/assets/admin-x-settings/{index-D4ye6uvI.mjs → index-D4NstoNQ.mjs} +11 -6
  10. package/core/built/admin/assets/admin-x-settings/{modals-CdsPaTfy.mjs → modals-BzljHVa7.mjs} +2 -2
  11. package/core/built/admin/assets/{at-sign-CqQzllfI.js → at-sign-CYnGzOFc.js} +1 -1
  12. package/core/built/admin/assets/{audience-select-DQD7iDOb.js → audience-select-DYoxiiwy.js} +1 -1
  13. package/core/built/admin/assets/{avatar-flipboard-uq7ptTxT.js → avatar-flipboard-C9-npfmZ.js} +1 -1
  14. package/core/built/admin/assets/{bluesky-sharing-qyIGv6Ny.js → bluesky-sharing-BGcmGcee.js} +1 -1
  15. package/core/built/admin/assets/{chart-DGA1MaFs.js → chart-CqJxisVP.js} +1 -1
  16. package/core/built/admin/assets/{chunk.524.1289543297329587cf8a.js → chunk.524.74a9629dd2ba0d21bbef.js} +7 -7
  17. package/core/built/admin/assets/{chunk.582.344ea0d0a16d671345cd.js → chunk.582.3846471396b3a7c46e66.js} +8 -8
  18. package/core/built/admin/assets/{code-editor-view-Bz6kXDiv.js → code-editor-view-C8l3gNnO.js} +1 -1
  19. package/core/built/admin/assets/{comments-C-lkEDkz.js → comments-CpHDoxov.js} +1 -1
  20. package/core/built/admin/assets/{copy-BFuV16bY.js → copy-DWiB-781.js} +1 -1
  21. package/core/built/admin/assets/{data-list-Bw1CQEZ9.js → data-list-yngXNZDF.js} +1 -1
  22. package/core/built/admin/assets/{deleted-feed-item-CmNbSYiO.js → deleted-feed-item-C0FcyLMN.js} +1 -1
  23. package/core/built/admin/assets/{edit-profile-DlIPB2km.js → edit-profile-BjtDkDAq.js} +1 -1
  24. package/core/built/admin/assets/{empty-indicator-DBrIZcFq.js → empty-indicator-BXWniwsl.js} +1 -1
  25. package/core/built/admin/assets/{en-BBc7b85q.js → en-B8qaJx-T.js} +1 -1
  26. package/core/built/admin/assets/{feed-B3XQzKZl.js → feed-DsCVb1SA.js} +1 -1
  27. package/core/built/admin/assets/{filters-DUFXZZnu.js → filters-jAXQSPq6.js} +1 -1
  28. package/core/built/admin/assets/{gh-chart-BV97-O7c.js → gh-chart-DwTCK8z_.js} +1 -1
  29. package/core/built/admin/assets/{ghost-9aa1e7c5992f122dba6932af78bf8e56.js → ghost-6367d022df9db9dacbcb9bfa30232ec7.js} +2 -2
  30. package/core/built/admin/assets/{growth-njR0GqK2.js → growth-DshcRqda.js} +1 -1
  31. package/core/built/admin/assets/{hash-CdH0ikFp.js → hash-p9dv0yuc.js} +1 -1
  32. package/core/built/admin/assets/{inbox-Bd0uf1Ez.js → inbox-CRoP9sy5.js} +1 -1
  33. package/core/built/admin/assets/{index-Kji6JKl7.js → index-6syrC9X1.js} +1 -1
  34. package/core/built/admin/assets/{index-C7M19LpB.js → index-BKtz3UH0.js} +1 -1
  35. package/core/built/admin/assets/{index-DWk7hKRR.js → index-BwY94Fb4.js} +1 -1
  36. package/core/built/admin/assets/{index-BFhECYgc.js → index-C3DF6aFe.js} +1 -1
  37. package/core/built/admin/assets/index-C6NCNp1B.js +1 -0
  38. package/core/built/admin/assets/{index-BYawr8p9.js → index-CJU9a2PB.js} +3 -3
  39. package/core/built/admin/assets/{index-CIE2_z5J.js → index-CUWE7aD1.js} +1 -1
  40. package/core/built/admin/assets/{index-DgRIbSpg.js → index-CuQ_II0e.js} +1 -1
  41. package/core/built/admin/assets/{index-Birw80cQ.js → index-DG8f-HuU.js} +1 -1
  42. package/core/built/admin/assets/{index-DziHC2du.js → index-DItZTRQ4.js} +1 -1
  43. package/core/built/admin/assets/{index-DG53N3Xt.js → index-eLx96SEn.js} +1 -1
  44. package/core/built/admin/assets/{index-DCw6JaEl.js → index-j2_Q-_8H.js} +1 -1
  45. package/core/built/admin/assets/{index-BZ21H0xH.js → index-qWpHJAMP.js} +1 -1
  46. package/core/built/admin/assets/{index-DXCu9e7c.js → index-sy6xRtoO.js} +1 -1
  47. package/core/built/admin/assets/{koenig-lexical-BDJVCHtm.js → koenig-lexical-DgAlBHHS.js} +1 -1
  48. package/core/built/admin/assets/{kpi-card-cv8roErt.js → kpi-card-CHZSLw4p.js} +1 -1
  49. package/core/built/admin/assets/{kpis-Dt4OFY3L.js → kpis-DzbAHfKK.js} +1 -1
  50. package/core/built/admin/assets/{links-08beB3Ij.js → links-BQHRbn46.js} +1 -1
  51. package/core/built/admin/assets/{lucide-react-DKlmxVQI.js → lucide-react-B7UnD_Dp.js} +1 -1
  52. package/core/built/admin/assets/{main-layout-Cl09wG7F.js → main-layout-9nmU5WlG.js} +1 -1
  53. package/core/built/admin/assets/{message-square-text-CaMVBVPr.js → message-square-text-CS3iRuPc.js} +1 -1
  54. package/core/built/admin/assets/{minus-2XwCoFJV.js → minus-emzwh6hq.js} +1 -1
  55. package/core/built/admin/assets/{modals-CIgzYQgv.js → modals-CumFuZ2d.js} +1 -1
  56. package/core/built/admin/assets/{moderation-FjlsSym6.js → moderation-DyfFc9m4.js} +1 -1
  57. package/core/built/admin/assets/{newsletter-BNOwZNlE.js → newsletter-BWul5IFc.js} +1 -1
  58. package/core/built/admin/assets/{newsletters-DUusEYSg.js → newsletters-N6bwI1OF.js} +1 -1
  59. package/core/built/admin/assets/{note-BpYwIDK6.js → note-CiBzkHzz.js} +1 -1
  60. package/core/built/admin/assets/{overview-Y5QYPClr.js → overview-D9gRvn7X.js} +1 -1
  61. package/core/built/admin/assets/{pagemenu-BMXHDXYy.js → pagemenu-aHubMPwB.js} +1 -1
  62. package/core/built/admin/assets/{post-analytics-UerFnJse.js → post-analytics-Bm9xH8nA.js} +1 -1
  63. package/core/built/admin/assets/{post-analytics-context-geHk7rOj.js → post-analytics-context-C7oW3aBz.js} +1 -1
  64. package/core/built/admin/assets/{post-analytics-header-DXfc4KeX.js → post-analytics-header-BjGFgN6A.js} +1 -1
  65. package/core/built/admin/assets/{post-share-modal-Dql4fYjR.js → post-share-modal-Su923uIc.js} +1 -1
  66. package/core/built/admin/assets/{posts-Bsvw11Zo.js → posts-BwP7BNcB.js} +1 -1
  67. package/core/built/admin/assets/{referrers-B8xJpCcR.js → referrers-n_ln9DqI.js} +1 -1
  68. package/core/built/admin/assets/{repeat-COP-3g8d.js → repeat-ms5ocvE0.js} +1 -1
  69. package/core/built/admin/assets/{reply-JE8tmvOn.js → reply-BvO85IDn.js} +1 -1
  70. package/core/built/admin/assets/{select-BhvNY3I-.js → select-B4QhMW5f.js} +1 -1
  71. package/core/built/admin/assets/{settings-BJwVfuWG.js → settings-D5rGcWJ7.js} +4 -4
  72. package/core/built/admin/assets/{settings-C6ZUZQe4.js → settings-QtZ6a2TL.js} +1 -1
  73. package/core/built/admin/assets/{sort-button-iOtR-vQ1.js → sort-button-84sYUZMN.js} +1 -1
  74. package/core/built/admin/assets/{source-icon-C2iFWMlV.js → source-icon-Bzw-AU8p.js} +1 -1
  75. package/core/built/admin/assets/{sprout-BW9HFVU8.js → sprout-C2R5CbXV.js} +1 -1
  76. package/core/built/admin/assets/{square-BCNGSZhW.js → square-DT1uWkxs.js} +1 -1
  77. package/core/built/admin/assets/stats/{audience-select-DNAWmT7R.mjs → audience-select-fTCiZ9MT.mjs} +3 -3
  78. package/core/built/admin/assets/stats/{index-DbGvSTMe.mjs → index-BKgioyC7.mjs} +5 -5
  79. package/core/built/admin/assets/stats/{index-s19ZmxbX.mjs → index-CR2t5Xd-.mjs} +5 -5
  80. package/core/built/admin/assets/stats/index-DEkYwR7C.mjs +739 -0
  81. package/core/built/admin/assets/stats/{index-BS3KMSy9.mjs → index-Djwey97a.mjs} +5 -5
  82. package/core/built/admin/assets/stats/{index-MOQSSYwT.mjs → index-FiU_XgEe.mjs} +6 -6
  83. package/core/built/admin/assets/stats/{sort-button-D76rcldr.mjs → sort-button-Bvi1wfa7.mjs} +3 -3
  84. package/core/built/admin/assets/stats/{stats-CJ7fhUyT.mjs → stats-Bbm6yWZq.mjs} +2 -2
  85. package/core/built/admin/assets/stats/stats.js +1 -1
  86. package/core/built/admin/assets/stats/{tabs-CkbxYgOE.mjs → tabs-BKwH5k-q.mjs} +3 -3
  87. package/core/built/admin/assets/stats/{url-helpers-DICtqCrE.mjs → url-helpers-DmHnUIGc.mjs} +9 -9
  88. package/core/built/admin/assets/stats/{use-growth-stats-DzO7zEy4.mjs → use-growth-stats-BVj3j1hb.mjs} +3 -3
  89. package/core/built/admin/assets/{stats-r0Bphuvi.js → stats-B1mhlQSp.js} +1 -1
  90. package/core/built/admin/assets/{stats-view-DzZxrBDz.js → stats-view-C6MTCwRW.js} +1 -1
  91. package/core/built/admin/assets/{step-1-CUoUOyMm.js → step-1-CzQmZJ93.js} +1 -1
  92. package/core/built/admin/assets/{step-2-CpAkPD8D.js → step-2-DXGDWSQo.js} +1 -1
  93. package/core/built/admin/assets/{step-3-Ci6oJDmK.js → step-3-CYuxXKac.js} +1 -1
  94. package/core/built/admin/assets/{table-DeBuf80X.js → table-mjAkKNdb.js} +1 -1
  95. package/core/built/admin/assets/{tabs-C2sFfNcp.js → tabs-BwQ-i6MY.js} +1 -1
  96. package/core/built/admin/assets/{tags-Bl6G5rvf.js → tags-BkUqCuvX.js} +1 -1
  97. package/core/built/admin/assets/{tags-BL_N4nn2.js → tags-DXDZbfxp.js} +1 -1
  98. package/core/built/admin/assets/{toggle-group-B2X-8giI.js → toggle-group-CqDO3Kkx.js} +1 -1
  99. package/core/built/admin/assets/{topic-filter-DeqMID_s.js → topic-filter-DnuJJBAE.js} +1 -1
  100. package/core/built/admin/assets/{trash-BglGemAb.js → trash-CZ3EXwTL.js} +1 -1
  101. package/core/built/admin/assets/{url-helpers-84icqAuE.js → url-helpers-BE3VXr__.js} +1 -1
  102. package/core/built/admin/assets/{use-growth-stats-DF-7tL8g.js → use-growth-stats-CiuWWM6O.js} +1 -1
  103. package/core/built/admin/assets/{use-infinite-virtual-scroll-BHH7oscK.js → use-infinite-virtual-scroll-BjATkxBj.js} +1 -1
  104. package/core/built/admin/assets/{use-simple-pagination-BsvYfixw.js → use-simple-pagination-C9cb7dDz.js} +1 -1
  105. package/core/built/admin/assets/{user-round-check-BjHbfXKY.js → user-round-check-D3ihrrKL.js} +1 -1
  106. package/core/built/admin/assets/{wallet-cards-KaTkgqvi.js → wallet-cards-Do7nPf3f.js} +1 -1
  107. package/core/built/admin/assets/{web-CUWbpFil.js → web-BEwI2Gfy.js} +1 -1
  108. package/core/built/admin/index-forward.html +4 -4
  109. package/core/built/admin/index.html +3 -3
  110. package/core/frontend/web/middleware/index.js +1 -0
  111. package/core/frontend/web/middleware/serve-indexnow-key.js +66 -0
  112. package/core/frontend/web/site.js +3 -0
  113. package/core/server/api/endpoints/authentication.js +1 -1
  114. package/core/server/api/endpoints/pages.js +1 -1
  115. package/core/server/api/endpoints/posts-public.js +1 -1
  116. package/core/server/api/endpoints/posts.js +1 -1
  117. package/core/server/api/endpoints/search-index-public.js +1 -1
  118. package/core/server/api/endpoints/search-index.js +1 -1
  119. package/core/server/api/endpoints/users.js +1 -1
  120. package/core/server/api/endpoints/utils/serializers/input/settings.js +2 -1
  121. package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +1 -1
  122. package/core/server/api/endpoints/utils/validators/input/settings.js +1 -1
  123. package/core/server/data/exporter/table-lists.js +2 -1
  124. package/core/server/data/migrations/versions/6.12/2026-01-08-11-48-16-add-indexnow-api-key-setting.js +9 -0
  125. package/core/server/data/schema/default-settings/default-settings.json +6 -0
  126. package/core/server/lib/lexical.js +1 -1
  127. package/core/server/models/settings.js +2 -1
  128. package/core/server/services/activitypub/{ActivityPubServiceWrapper.js → activity-pub-service-wrapper.js} +1 -1
  129. package/core/server/services/activitypub/{ActivityPubService.ts → activity-pub-service.ts} +1 -1
  130. package/core/server/services/activitypub/index.js +1 -1
  131. package/core/server/services/adapter-manager/index.js +1 -1
  132. package/core/server/services/announcement-bar-service/{AnnouncementBarSettings.js → announcement-bar-settings.js} +1 -1
  133. package/core/server/services/announcement-bar-service/index.js +1 -1
  134. package/core/server/services/audience-feedback/{AudienceFeedbackController.js → audience-feedback-controller.js} +3 -3
  135. package/core/server/services/audience-feedback/index.js +4 -4
  136. package/core/server/services/auth/session/express-session.js +1 -1
  137. package/core/server/services/comments/{CommentsController.js → comments-controller.js} +2 -2
  138. package/core/server/services/comments/{CommentsServiceEmails.js → comments-service-emails.js} +1 -1
  139. package/core/server/services/comments/{CommentsService.js → comments-service.js} +1 -1
  140. package/core/server/services/comments/index.js +3 -3
  141. package/core/server/services/custom-redirects/index.js +2 -2
  142. package/core/server/services/donations/{DonationBookshelfRepository.ts → donation-bookshelf-repository.ts} +1 -1
  143. package/core/server/services/donations/{DonationServiceWrapper.js → donation-service-wrapper.js} +1 -1
  144. package/core/server/services/donations/index.js +1 -1
  145. package/core/server/services/email-address/{EmailAddressServiceWrapper.js → email-address-service-wrapper.js} +2 -2
  146. package/core/server/services/email-address/{EmailAddressService.js → email-address-service.js} +4 -4
  147. package/core/server/services/email-address/{EmailAddressService.ts → email-address-service.ts} +1 -1
  148. package/core/server/services/email-address/index.js +1 -1
  149. package/core/server/services/email-analytics/{EmailAnalyticsProviderMailgun.js → email-analytics-provider-mailgun.js} +1 -1
  150. package/core/server/services/email-analytics/{EmailAnalyticsServiceWrapper.js → email-analytics-service-wrapper.js} +5 -5
  151. package/core/server/services/email-analytics/{EmailAnalyticsService.js → email-analytics-service.js} +2 -2
  152. package/core/server/services/email-analytics/index.js +1 -1
  153. package/core/server/services/email-analytics/jobs/fetch-latest/index.js +1 -1
  154. package/core/server/services/email-service/{BatchSendingService.js → batch-sending-service.js} +8 -8
  155. package/core/server/services/email-service/{EmailEventProcessor.js → email-event-processor.js} +6 -6
  156. package/core/server/services/email-service/{EmailEventStorage.js → email-event-storage.js} +1 -1
  157. package/core/server/services/email-service/{EmailRenderer.js → email-renderer.js} +1 -1
  158. package/core/server/services/email-service/{EmailServiceWrapper.js → email-service-wrapper.js} +9 -9
  159. package/core/server/services/email-service/{EmailService.js → email-service.js} +13 -13
  160. package/core/server/services/email-service/index.js +1 -1
  161. package/core/server/services/email-service/{MailgunEmailProvider.js → mailgun-email-provider.js} +1 -1
  162. package/core/server/services/email-service/{SendingService.js → sending-service.js} +6 -6
  163. package/core/server/services/email-suppression-list/{InMemoryEmailSuppressionList.js → in-memory-email-suppression-list.js} +1 -1
  164. package/core/server/services/email-suppression-list/{MailgunEmailSuppressionList.js → mailgun-email-suppression-list.js} +3 -3
  165. package/core/server/services/email-suppression-list/service.js +2 -2
  166. package/core/server/services/explore/index.js +2 -2
  167. package/core/server/services/explore-ping/index.js +2 -2
  168. package/core/server/services/frontend-data-service/index.js +1 -1
  169. package/core/server/services/identity-tokens/{IdentityTokenServiceWrapper.js → identity-token-service-wrapper.js} +1 -1
  170. package/core/server/services/identity-tokens/index.js +1 -1
  171. package/core/server/services/indexnow.js +212 -0
  172. package/core/server/services/invites/index.js +1 -1
  173. package/core/server/services/link-redirection/index.js +2 -2
  174. package/core/server/services/link-redirection/{LinkRedirectRepository.js → link-redirect-repository.js} +1 -1
  175. package/core/server/services/link-redirection/{LinkRedirectsService.js → link-redirects-service.js} +2 -2
  176. package/core/server/services/link-redirection/{RedirectEvent.js → redirect-event.js} +1 -1
  177. package/core/server/services/link-tracking/index.js +3 -3
  178. package/core/server/services/link-tracking/{LinkClickRepository.js → link-click-repository.js} +1 -1
  179. package/core/server/services/link-tracking/{LinkClickTrackingService.js → link-click-tracking-service.js} +4 -4
  180. package/core/server/services/link-tracking/{PostLinkRepository.js → post-link-repository.js} +7 -7
  181. package/core/server/services/mail/{GhostMailer.js → ghost-mailer.js} +1 -1
  182. package/core/server/services/mail/index.js +2 -2
  183. package/core/server/services/media-inliner/service.js +1 -1
  184. package/core/server/services/member-attribution/README.md +6 -6
  185. package/core/server/services/member-attribution/{AttributionBuilder.js → attribution-builder.js} +4 -4
  186. package/core/server/services/member-attribution/index.js +5 -5
  187. package/core/server/services/member-attribution/{MemberAttributionService.js → member-attribution-service.js} +9 -9
  188. package/core/server/services/member-attribution/{ReferrerTranslator.js → referrer-translator.js} +1 -1
  189. package/core/server/services/member-attribution/{UrlTranslator.js → url-translator.js} +1 -1
  190. package/core/server/services/member-welcome-emails/constants.js +22 -1
  191. package/core/server/services/member-welcome-emails/service.js +23 -5
  192. package/core/server/services/members/api.js +1 -1
  193. package/core/server/services/members/importer/index.js +3 -3
  194. package/core/server/services/members/importer/{MembersCSVImporter.js → members-csv-importer.js} +2 -2
  195. package/core/server/services/members/members-api/members-api.js +14 -14
  196. package/core/server/services/members/members-api/repositories/{MemberRepository.js → member-repository.js} +17 -8
  197. package/core/server/services/members/members-api/services/{MemberBREADService.js → member-bread-service.js} +1 -1
  198. package/core/server/services/members/members-api/services/{PaymentsService.js → payments-service.js} +12 -12
  199. package/core/server/services/members/service.js +4 -4
  200. package/core/server/services/members-events/index.js +3 -3
  201. package/core/server/services/members-events/{LastSeenAtUpdater.js → last-seen-at-updater.js} +2 -2
  202. package/core/server/services/mentions/{BookshelfMentionRepository.js → bookshelf-mention-repository.js} +9 -9
  203. package/core/server/services/mentions/{InMemoryMentionRepository.js → in-memory-mention-repository.js} +4 -4
  204. package/core/server/services/mentions/{MentionController.js → mention-controller.js} +5 -5
  205. package/core/server/services/mentions/{MentionCreatedEvent.js → mention-created-event.js} +1 -1
  206. package/core/server/services/mentions/{Mention.js → mention.js} +1 -1
  207. package/core/server/services/mentions/{MentionsAPI.js → mentions-api.js} +1 -1
  208. package/core/server/services/mentions/{ResourceService.js → resource-service.js} +2 -2
  209. package/core/server/services/mentions/{RoutingService.js → routing-service.js} +2 -2
  210. package/core/server/services/mentions/service.js +11 -11
  211. package/core/server/services/mentions/{WebmentionMetadata.js → webmention-metadata.js} +1 -1
  212. package/core/server/services/mentions-email-report/job.js +1 -1
  213. package/core/server/services/mentions-email-report/{MentionEmailReportJob.js → mention-email-report-job.js} +1 -1
  214. package/core/server/services/mentions-email-report/service.js +2 -2
  215. package/core/server/services/milestones/{BookshelfMilestoneRepository.js → bookshelf-milestone-repository.js} +2 -2
  216. package/core/server/services/milestones/{InMemoryMilestoneRepository.js → in-memory-milestone-repository.js} +2 -2
  217. package/core/server/services/milestones/{Milestone.js → milestone.js} +1 -1
  218. package/core/server/services/milestones/{MilestonesService.js → milestones-service.js} +1 -1
  219. package/core/server/services/milestones/service.js +4 -4
  220. package/core/server/services/newsletters/index.js +2 -2
  221. package/core/server/services/newsletters/{NewslettersService.js → newsletters-service.js} +1 -1
  222. package/core/server/services/notifications/index.js +1 -1
  223. package/core/server/services/oembed/service.js +3 -3
  224. package/core/server/services/offers/application/{OfferMapper.js → offer-mapper.js} +1 -1
  225. package/core/server/services/offers/application/{OffersAPI.js → offers-api.js} +9 -9
  226. package/core/server/services/offers/application/{UniqueChecker.js → unique-checker.js} +2 -2
  227. package/core/server/services/offers/domain/events/{OfferCodeChangeEvent.js → offer-code-change-event.js} +1 -1
  228. package/core/server/services/offers/domain/events/{OfferCreatedEvent.js → offer-created-event.js} +1 -1
  229. package/core/server/services/offers/domain/models/{OfferAmount.js → offer-amount.js} +1 -1
  230. package/core/server/services/offers/domain/models/{OfferCadence.js → offer-cadence.js} +1 -1
  231. package/core/server/services/offers/domain/models/{OfferCode.js → offer-code.js} +1 -1
  232. package/core/server/services/offers/domain/models/{OfferCreatedAt.js → offer-created-at.js} +1 -1
  233. package/core/server/services/offers/domain/models/{OfferCurrency.js → offer-currency.js} +1 -1
  234. package/core/server/services/offers/domain/models/{OfferDescription.js → offer-description.js} +1 -1
  235. package/core/server/services/offers/domain/models/{OfferDuration.js → offer-duration.js} +1 -1
  236. package/core/server/services/offers/domain/models/{OfferName.js → offer-name.js} +1 -1
  237. package/core/server/services/offers/domain/models/{OfferStatus.js → offer-status.js} +1 -1
  238. package/core/server/services/offers/domain/models/{OfferTitle.js → offer-title.js} +1 -1
  239. package/core/server/services/offers/domain/models/{OfferType.js → offer-type.js} +1 -1
  240. package/core/server/services/offers/domain/models/{Offer.js → offer.js} +14 -14
  241. package/core/server/services/offers/domain/models/{StripeCoupon.js → stripe-coupon.js} +1 -1
  242. package/core/server/services/offers/{OfferBookshelfRepository.js → offer-bookshelf-repository.js} +6 -6
  243. package/core/server/services/offers/{OffersModule.js → offers-module.js} +4 -4
  244. package/core/server/services/offers/service.js +3 -3
  245. package/core/server/services/outbox/index.js +2 -2
  246. package/core/server/services/outbox/jobs/outbox-job.js +2 -2
  247. package/core/server/services/posts/posts-service-instance.js +47 -0
  248. package/core/server/services/posts/posts-service.js +572 -45
  249. package/core/server/services/recommendations/index.js +1 -1
  250. package/core/server/services/recommendations/{RecommendationEnablerService.js → recommendation-enabler-service.js} +2 -2
  251. package/core/server/services/recommendations/{RecommendationServiceWrapper.js → recommendation-service-wrapper.js} +2 -2
  252. package/core/server/services/recommendations/service/{BookshelfClickEventRepository.js → bookshelf-click-event-repository.js} +4 -4
  253. package/core/server/services/recommendations/service/{BookshelfClickEventRepository.ts → bookshelf-click-event-repository.ts} +2 -2
  254. package/core/server/services/recommendations/service/{BookshelfRecommendationRepository.js → bookshelf-recommendation-repository.js} +4 -4
  255. package/core/server/services/recommendations/service/{BookshelfRecommendationRepository.ts → bookshelf-recommendation-repository.ts} +3 -3
  256. package/core/server/services/recommendations/service/{BookshelfSubscribeEventRepository.js → bookshelf-subscribe-event-repository.js} +4 -4
  257. package/core/server/services/recommendations/service/{BookshelfSubscribeEventRepository.ts → bookshelf-subscribe-event-repository.ts} +2 -2
  258. package/core/server/services/recommendations/service/{InMemoryRecommendationRepository.js → in-memory-recommendation-repository.js} +2 -2
  259. package/core/server/services/recommendations/service/{InMemoryRecommendationRepository.ts → in-memory-recommendation-repository.ts} +3 -3
  260. package/core/server/services/recommendations/service/{IncomingRecommendationController.js → incoming-recommendation-controller.js} +2 -2
  261. package/core/server/services/recommendations/service/{IncomingRecommendationController.ts → incoming-recommendation-controller.ts} +3 -3
  262. package/core/server/services/recommendations/service/{IncomingRecommendationEmailRenderer.ts → incoming-recommendation-email-renderer.ts} +2 -2
  263. package/core/server/services/recommendations/service/{IncomingRecommendationService.ts → incoming-recommendation-service.ts} +2 -2
  264. package/core/server/services/recommendations/service/index.js +15 -15
  265. package/core/server/services/recommendations/service/index.ts +15 -15
  266. package/core/server/services/recommendations/service/{RecommendationController.js → recommendation-controller.js} +13 -13
  267. package/core/server/services/recommendations/service/{RecommendationController.ts → recommendation-controller.ts} +4 -4
  268. package/core/server/services/recommendations/service/{RecommendationRepository.ts → recommendation-repository.ts} +3 -3
  269. package/core/server/services/recommendations/service/{RecommendationService.js → recommendation-service.js} +6 -6
  270. package/core/server/services/recommendations/service/{RecommendationService.ts → recommendation-service.ts} +8 -8
  271. package/core/server/services/recommendations/service/{Recommendation.js → recommendation.js} +4 -4
  272. package/core/server/services/recommendations/service/{Recommendation.ts → recommendation.ts} +1 -1
  273. package/core/server/services/recommendations/service/{WellknownService.ts → well-known-service.ts} +1 -1
  274. package/core/server/services/route-settings/index.js +4 -4
  275. package/core/server/services/settings/{SettingsBREADService.js → settings-bread-service.js} +1 -1
  276. package/core/server/services/settings/settings-service.js +2 -2
  277. package/core/server/services/settings-helpers/index.js +1 -1
  278. package/core/server/services/settings-helpers/{SettingsHelpers.js → settings-helpers.js} +5 -5
  279. package/core/server/services/slack-notifications/service.js +4 -4
  280. package/core/server/services/slack-notifications/{SlackNotificationsService.js → slack-notifications-service.js} +2 -2
  281. package/core/server/services/slack-notifications/{SlackNotifications.js → slack-notifications.js} +2 -2
  282. package/core/server/services/staff/index.js +1 -1
  283. package/core/server/services/staff/{StaffServiceEmails.js → staff-service-emails.js} +2 -2
  284. package/core/server/services/staff/{StaffService.js → staff-service.js} +2 -2
  285. package/core/server/services/stats/{PostsStatsService.js → posts-stats-service.js} +25 -25
  286. package/core/server/services/stats/{ReferrersStatsService.js → referrers-stats-service.js} +3 -3
  287. package/core/server/services/stats/service.js +1 -1
  288. package/core/server/services/stats/{StatsService.js → stats-service.js} +23 -23
  289. package/core/server/services/stripe/events/index.js +2 -2
  290. package/core/server/services/stripe/service.js +1 -1
  291. package/core/server/services/stripe/services/webhook/{CheckoutSessionEventService.js → checkout-session-event-service.js} +2 -2
  292. package/core/server/services/stripe/{StripeMigrations.js → stripe-migrations.js} +1 -1
  293. package/core/server/services/stripe/{StripeService.js → stripe-service.js} +8 -8
  294. package/core/server/services/stripe/{WebhookController.js → webhook-controller.js} +4 -4
  295. package/core/server/services/stripe/{WebhookManager.js → webhook-manager.js} +5 -5
  296. package/core/server/services/themes/storage.js +1 -1
  297. package/core/server/services/tiers/{InMemoryTierRepository.js → in-memory-tier-repository.js} +1 -1
  298. package/core/server/services/tiers/service.js +2 -2
  299. package/core/server/services/tiers/{TierActivatedEvent.js → tier-activated-event.js} +1 -1
  300. package/core/server/services/tiers/{TierArchivedEvent.js → tier-archived-event.js} +1 -1
  301. package/core/server/services/tiers/{TierCreatedEvent.js → tier-created-event.js} +1 -1
  302. package/core/server/services/tiers/{TierNameChangeEvent.js → tier-name-change-event.js} +1 -1
  303. package/core/server/services/tiers/{TierPriceChangeEvent.js → tier-price-change-event.js} +1 -1
  304. package/core/server/services/tiers/{TierRepository.js → tier-repository.js} +7 -7
  305. package/core/server/services/tiers/{Tier.js → tier.js} +5 -5
  306. package/core/server/services/tiers/{TiersAPI.js → tiers-api.js} +1 -1
  307. package/core/server/services/tinybird/index.js +1 -1
  308. package/core/server/services/tinybird/{TinybirdServiceWrapper.js → tinybird-service-wrapper.js} +2 -2
  309. package/core/server/services/update-check/index.js +1 -1
  310. package/core/server/services/url/index.js +2 -2
  311. package/core/server/services/url/{Resources.js → resources.js} +1 -1
  312. package/core/server/services/url/{UrlGenerator.js → url-generator.js} +1 -1
  313. package/core/server/services/url/{UrlService.js → url-service.js} +4 -4
  314. package/core/server/services/url/{Urls.js → urls.js} +1 -1
  315. package/core/server/services/webhooks/listen.js +1 -1
  316. package/core/shared/labs.js +2 -1
  317. package/package.json +3 -3
  318. package/tsconfig.tsbuildinfo +1 -1
  319. package/components/tryghost-i18n-6.11.0.tgz +0 -0
  320. package/core/built/admin/assets/index-Cr_YX9yU.js +0 -1
  321. package/core/built/admin/assets/stats/index-BBCJ2EZo.mjs +0 -733
  322. package/core/server/services/posts/PostsService.js +0 -574
  323. /package/core/server/{GhostServer.js → ghost-server.js} +0 -0
  324. /package/core/server/services/activitypub/{ActivityPubService.js → activity-pub-service.js} +0 -0
  325. /package/core/server/services/adapter-manager/{AdapterManager.js → adapter-manager.js} +0 -0
  326. /package/core/server/services/announcement-bar-service/{AnnouncementVisibilityValues.js → announcement-visibility-values.js} +0 -0
  327. /package/core/server/services/audience-feedback/{AudienceFeedbackService.js → audience-feedback-service.js} +0 -0
  328. /package/core/server/services/audience-feedback/{FeedbackRepository.js → feedback-repository.js} +0 -0
  329. /package/core/server/services/audience-feedback/{Feedback.js → feedback.js} +0 -0
  330. /package/core/server/services/auth/session/{SessionStore.js → session-store.js} +0 -0
  331. /package/core/server/services/comments/{CommentsServiceEmailRenderer.js → comments-service-email-renderer.js} +0 -0
  332. /package/core/server/services/comments/{CommentsStatsService.js → comments-stats-service.js} +0 -0
  333. /package/core/server/services/custom-redirects/{CustomRedirectsAPI.js → custom-redirects-api.js} +0 -0
  334. /package/core/server/services/donations/{DonationBookshelfRepository.js → donation-bookshelf-repository.js} +0 -0
  335. /package/core/server/services/donations/{DonationPaymentEvent.js → donation-payment-event.js} +0 -0
  336. /package/core/server/services/donations/{DonationPaymentEvent.ts → donation-payment-event.ts} +0 -0
  337. /package/core/server/services/email-address/{EmailAddressParser.js → email-address-parser.js} +0 -0
  338. /package/core/server/services/email-address/{EmailAddressParser.js.d.ts → email-address-parser.js.d.ts} +0 -0
  339. /package/core/server/services/email-analytics/{EventProcessingResult.js → event-processing-result.js} +0 -0
  340. /package/core/server/services/email-analytics/events/{StartEmailAnalyticsJobEvent.js → start-email-analytics-job-event.js} +0 -0
  341. /package/core/server/services/email-service/{DomainWarmingService.js → domain-warming-service.js} +0 -0
  342. /package/core/server/services/email-service/{DomainWarmingService.ts → domain-warming-service.ts} +0 -0
  343. /package/core/server/services/email-service/{EmailBodyCache.js → email-body-cache.js} +0 -0
  344. /package/core/server/services/email-service/{EmailController.js → email-controller.js} +0 -0
  345. /package/core/server/services/email-service/{EmailSegmenter.js → email-segmenter.js} +0 -0
  346. /package/core/server/services/email-service/events/{EmailBouncedEvent.js → email-bounced-event.js} +0 -0
  347. /package/core/server/services/email-service/events/{EmailDeliveredEvent.js → email-delivered-event.js} +0 -0
  348. /package/core/server/services/email-service/events/{EmailOpenedEvent.js → email-opened-event.js} +0 -0
  349. /package/core/server/services/email-service/events/{EmailTemporaryBouncedEvent.js → email-temporary-bounced-event.js} +0 -0
  350. /package/core/server/services/email-service/events/{EmailUnsubscribedEvent.js → email-unsubscribed-event.js} +0 -0
  351. /package/core/server/services/email-service/events/{SpamComplaintEvent.js → spam-complaint-event.js} +0 -0
  352. /package/core/server/services/email-suppression-list/{EmailSuppressionList.js → email-suppression-list.js} +0 -0
  353. /package/core/server/services/explore/{ExploreService.js → explore-service.js} +0 -0
  354. /package/core/server/services/explore-ping/{ExplorePingService.js → explore-ping-service.js} +0 -0
  355. /package/core/server/services/frontend-data-service/{FrontendDataService.js → front-end-data-service.js} +0 -0
  356. /package/core/server/services/identity-tokens/{IdentityTokenService.js → identity-token-service.js} +0 -0
  357. /package/core/server/services/identity-tokens/{IdentityTokenService.ts → identity-token-service.ts} +0 -0
  358. /package/core/server/services/invites/{Invites.js → invites.js} +0 -0
  359. /package/core/server/services/lib/{DynamicRedirectManager.js → dynamic-redirect-manager.js} +0 -0
  360. /package/core/server/services/lib/{EmailContentGenerator.js → email-content-generator.js} +0 -0
  361. /package/core/server/services/lib/{InMemoryRepository.js → in-memory-repository.js} +0 -0
  362. /package/core/server/services/lib/{InMemoryRepository.ts → in-memory-repository.ts} +0 -0
  363. /package/core/server/services/lib/magic-link/{MagicLink.js → magic-link.js} +0 -0
  364. /package/core/server/services/lib/{MailgunClient.js → mailgun-client.js} +0 -0
  365. /package/core/server/services/link-redirection/{LinkRedirect.js → link-redirect.js} +0 -0
  366. /package/core/server/services/link-tracking/{ClickEvent.js → click-event.js} +0 -0
  367. /package/core/server/services/link-tracking/{FullPostLink.js → full-post-link.js} +0 -0
  368. /package/core/server/services/link-tracking/{PostLink.js → post-link.js} +0 -0
  369. /package/core/server/services/media-inliner/{ExternalMediaInliner.js → external-media-inliner.js} +0 -0
  370. /package/core/server/services/member-attribution/{OutboundLinkTagger.js → outbound-link-tagger.js} +0 -0
  371. /package/core/server/services/member-attribution/{UrlHistory.js → url-history.js} +0 -0
  372. /package/core/server/services/member-welcome-emails/{MemberWelcomeEmailRenderer.js → member-welcome-email-renderer.js} +0 -0
  373. /package/core/server/services/members/importer/{MembersCSVImporterStripeUtils.js → members-csv-importer-stripe-utils.js} +0 -0
  374. /package/core/server/services/members/members-api/controllers/{MemberController.js → member-controller.js} +0 -0
  375. /package/core/server/services/members/members-api/controllers/{RouterController.js → router-controller.js} +0 -0
  376. /package/core/server/services/members/members-api/controllers/{WellKnownController.js → well-known-controller.js} +0 -0
  377. /package/core/server/services/members/members-api/repositories/{EventRepository.js → event-repository.js} +0 -0
  378. /package/core/server/services/members/members-api/repositories/{ProductRepository.js → product-repository.js} +0 -0
  379. /package/core/server/services/members/members-api/services/{GeolocationService.js → geolocation-service.js} +0 -0
  380. /package/core/server/services/members/members-api/services/{TokenService.js → token-service.js} +0 -0
  381. /package/core/server/services/members/{MembersConfigProvider.js → members-config-provider.js} +0 -0
  382. /package/core/server/services/members/{RequestIntegrityTokenProvider.js → request-integrity-token-provider.js} +0 -0
  383. /package/core/server/services/members/{SingleUseTokenProvider.js → single-use-token-provider.js} +0 -0
  384. /package/core/server/services/members/stats/{MembersStats.js → members-stats.js} +0 -0
  385. /package/core/server/services/members-events/{EventStorage.js → event-storage.js} +0 -0
  386. /package/core/server/services/members-events/{LastSeenAtCache.js → last-seen-at-cache.js} +0 -0
  387. /package/core/server/services/mentions/{MentionDiscoveryService.js → mention-discovery-service.js} +0 -0
  388. /package/core/server/services/mentions/{MentionSendingService.js → mention-sending-service.js} +0 -0
  389. /package/core/server/services/mentions-email-report/{StartMentionEmailReportJob.js → start-mention-email-report-job.js} +0 -0
  390. /package/core/server/services/milestones/{MilestoneCreatedEvent.js → milestone-created-event.js} +0 -0
  391. /package/core/server/services/milestones/{MilestoneQueries.js → milestone-queries.js} +0 -0
  392. /package/core/server/services/notifications/{Notifications.js → notifications.js} +0 -0
  393. /package/core/server/services/oembed/{NFTOEmbedProvider.js → nft-oembed-provider.js} +0 -0
  394. /package/core/server/services/oembed/{OEmbedService.js → oembed-service.js} +0 -0
  395. /package/core/server/services/oembed/{TwitterOEmbedProvider.js → twitter-oembed-provider.js} +0 -0
  396. /package/core/server/services/offers/domain/models/shared/{ValueObject.js → value-object.js} +0 -0
  397. /package/core/server/services/outbox/events/{StartOutboxProcessingEvent.js → start-outbox-processing-event.js} +0 -0
  398. /package/core/server/services/posts/{PostsExporter.js → posts-exporter.js} +0 -0
  399. /package/core/server/services/posts/stats/{PostStats.js → post-stats.js} +0 -0
  400. /package/core/server/services/recommendations/service/{BookshelfRepository.js → bookshelf-repository.js} +0 -0
  401. /package/core/server/services/recommendations/service/{BookshelfRepository.ts → bookshelf-repository.ts} +0 -0
  402. /package/core/server/services/recommendations/service/{ClickEvent.js → click-event.js} +0 -0
  403. /package/core/server/services/recommendations/service/{ClickEvent.ts → click-event.ts} +0 -0
  404. /package/core/server/services/recommendations/service/{IncomingRecommendationEmailRenderer.js → incoming-recommendation-email-renderer.js} +0 -0
  405. /package/core/server/services/recommendations/service/{IncomingRecommendationService.js → incoming-recommendation-service.js} +0 -0
  406. /package/core/server/services/recommendations/service/{RecommendationMetadataService.js → recommendation-metadata-service.js} +0 -0
  407. /package/core/server/services/recommendations/service/{RecommendationMetadataService.ts → recommendation-metadata-service.ts} +0 -0
  408. /package/core/server/services/recommendations/service/{RecommendationRepository.js → recommendation-repository.js} +0 -0
  409. /package/core/server/services/recommendations/service/{SubscribeEvent.js → subscribe-event.js} +0 -0
  410. /package/core/server/services/recommendations/service/{SubscribeEvent.ts → subscribe-event.ts} +0 -0
  411. /package/core/server/services/recommendations/service/{UnsafeData.js → unsafe-data.js} +0 -0
  412. /package/core/server/services/recommendations/service/{UnsafeData.ts → unsafe-data.ts} +0 -0
  413. /package/core/server/services/recommendations/service/{WellknownService.js → well-known-service.js} +0 -0
  414. /package/core/server/services/route-settings/{DefaultSettingsManager.js → default-settings-manager.js} +0 -0
  415. /package/core/server/services/route-settings/{RouteSettings.js → route-settings.js} +0 -0
  416. /package/core/server/services/route-settings/{SettingsLoader.js → settings-loader.js} +0 -0
  417. /package/core/server/services/route-settings/{SettingsPathManager.js → settings-path-manager.js} +0 -0
  418. /package/core/server/services/stats/{ContentStatsService.js → content-stats-service.js} +0 -0
  419. /package/core/server/services/stats/{MembersStatsService.js → members-stats-service.js} +0 -0
  420. /package/core/server/services/stats/{MrrStatsService.js → mrr-stats-service.js} +0 -0
  421. /package/core/server/services/stats/{SubscriptionStatsService.js → subscription-stats-service.js} +0 -0
  422. /package/core/server/services/stripe/events/{StripeLiveDisabledEvent.js → stripe-live-disabled-event.js} +0 -0
  423. /package/core/server/services/stripe/events/{StripeLiveEnabledEvent.js → stripe-live-enabled-event.js} +0 -0
  424. /package/core/server/services/stripe/services/webhook/{InvoiceEventService.js → invoice-event-service.js} +0 -0
  425. /package/core/server/services/stripe/services/webhook/{SubscriptionEventService.js → subscription-event-service.js} +0 -0
  426. /package/core/server/services/stripe/{StripeAPI.js → stripe-api.js} +0 -0
  427. /package/core/server/services/themes/{ThemeStorage.js → theme-storage.js} +0 -0
  428. /package/core/server/services/tinybird/{TinybirdService.js → tinybird-service.js} +0 -0
  429. /package/core/server/services/update-check/{UpdateCheckService.js → update-check-service.js} +0 -0
  430. /package/core/server/services/url/{LocalFileCache.js → local-file-cache.js} +0 -0
  431. /package/core/server/services/url/{Queue.js → queue.js} +0 -0
  432. /package/core/server/services/url/{Resource.js → resource.js} +0 -0
  433. /package/core/server/services/{Users.js → users.js} +0 -0
  434. /package/core/server/services/{VerificationTrigger.js → verification-trigger.js} +0 -0
  435. /package/core/server/services/webhooks/{WebhookTrigger.js → webhook-trigger.js} +0 -0
@@ -0,0 +1,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