ghost 6.68.0 → 6.69.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 (300) hide show
  1. package/components/ghost-storage-base-3.0.1.tgz +0 -0
  2. package/components/tryghost-adapter-base-cache-0.2.1.tgz +0 -0
  3. package/components/tryghost-adapter-base-scheduling-0.2.5.tgz +0 -0
  4. package/components/tryghost-adapter-base-sso-0.1.4.tgz +0 -0
  5. package/components/tryghost-app-contracts-0.0.0.tgz +0 -0
  6. package/components/tryghost-checkout-0.0.0.tgz +0 -0
  7. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  8. package/components/tryghost-kg-card-factory-5.2.6.tgz +0 -0
  9. package/components/tryghost-kg-clean-basic-html-4.3.6.tgz +0 -0
  10. package/components/tryghost-kg-converters-1.2.6.tgz +0 -0
  11. package/components/tryghost-kg-default-cards-10.3.7.tgz +0 -0
  12. package/components/tryghost-kg-default-nodes-2.2.3.tgz +0 -0
  13. package/components/tryghost-kg-default-transforms-1.3.6.tgz +0 -0
  14. package/components/tryghost-kg-html-to-lexical-1.4.1.tgz +0 -0
  15. package/components/tryghost-kg-lexical-html-renderer-1.5.1.tgz +0 -0
  16. package/components/tryghost-kg-markdown-html-renderer-7.2.7.tgz +0 -0
  17. package/components/tryghost-kg-utils-1.1.6.tgz +0 -0
  18. package/components/tryghost-metafield-csv-0.0.0.tgz +0 -0
  19. package/components/tryghost-metafield-types-0.1.1.tgz +0 -0
  20. package/core/boot.js +6 -0
  21. package/core/built/admin/assets/{about-D_nwtf7X.js → about-Dxp30cNg.js} +1 -1
  22. package/core/built/admin/assets/{account-migration-BaecWw1T.js → account-migration-D05akW4q.js} +1 -1
  23. package/core/built/admin/assets/activitypub/{account-migration-4saTEZ6p.js → account-migration-BmiwuzXI.js} +6 -6
  24. package/core/built/admin/assets/activitypub/activitypub.js +2 -2
  25. package/core/built/admin/assets/activitypub/{bluesky-sharing-BHBNuZQH.js → bluesky-sharing-B1fzMdFb.js} +6 -6
  26. package/core/built/admin/assets/activitypub/{content-formatters-DVx9YktY.js → content-formatters-G0qBT5QE.js} +3 -3
  27. package/core/built/admin/assets/activitypub/{domain-rAmlMXBC.js → domain-B3UtdA1m.js} +7 -7
  28. package/core/built/admin/assets/activitypub/{edit-profile-CXYL4ZrS.js → edit-profile-9EodzviR.js} +4 -4
  29. package/core/built/admin/assets/activitypub/{explore-dqpEx3GA.js → explore-DmwPdxHI.js} +8 -8
  30. package/core/built/admin/assets/activitypub/{feed-Cb-wYNw9.js → feed-yauqnu7A.js} +5 -5
  31. package/core/built/admin/assets/activitypub/{field-JxegcPt6.js → field-CsrMjbg2.js} +2 -2
  32. package/core/built/admin/assets/activitypub/{inbox-2hXDJBn5.js → inbox-DV3RrpFH.js} +7 -7
  33. package/core/built/admin/assets/activitypub/{label-DRQzZ7lb.js → label-DPs40NLn.js} +2 -2
  34. package/core/built/admin/assets/activitypub/layout-CvOhndCA.js +1 -0
  35. package/core/built/admin/assets/activitypub/{moderation-BnYKcTXY.js → moderation-DGa6hVNH.js} +7 -7
  36. package/core/built/admin/assets/activitypub/{note-C6ucS3Wu.js → note-BVL6LVHF.js} +5 -5
  37. package/core/built/admin/assets/activitypub/{notifications-DgBW9wEC.js → notifications-CRUu_uMC.js} +5 -5
  38. package/core/built/admin/assets/activitypub/{onboarding-DGu6yG4L.js → onboarding-Dpm-nLkQ.js} +2 -2
  39. package/core/built/admin/assets/activitypub/{onboarding-Bq3fNf_a.js → onboarding-KtpJA-xb.js} +2 -2
  40. package/core/built/admin/assets/activitypub/{preferences-C3jI1eVN.js → preferences-CdFuVqIt.js} +7 -7
  41. package/core/built/admin/assets/activitypub/{profile-Cn3vRb5Z.js → profile-KnNAoHYu.js} +8 -8
  42. package/core/built/admin/assets/activitypub/{routes-DbrwlS9h.js → routes-BRndai50.js} +26 -26
  43. package/core/built/admin/assets/activitypub/{settings-D0BALDQu.js → settings-DU7ftJ8w.js} +4 -4
  44. package/core/built/admin/assets/activitypub/{site-BFGj8HuQ.js → site-D1ZYV3AT.js} +2 -2
  45. package/core/built/admin/assets/activitypub/{step-1-CaoPg0a5.js → step-1-9IHheE78.js} +4 -4
  46. package/core/built/admin/assets/activitypub/{step-3-5k0TkyC9.js → step-3-DBERnfa-.js} +3 -3
  47. package/core/built/admin/assets/activitypub/{tabs-BV4JU7Vg.js → tabs-CvkwStij.js} +4 -4
  48. package/core/built/admin/assets/activitypub/{topic-filter-71sX5nfN.js → topic-filter-CS0Jsf_4.js} +2 -2
  49. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-B3srUuKt.js → use-activity-pub-queries-CGgtQrxL.js} +2 -2
  50. package/core/built/admin/assets/activitypub/{use-reply-chain-data-Cl6bGNy7.js → use-reply-chain-data-CLdUpx1t.js} +4 -4
  51. package/core/built/admin/assets/activitypub/{users-EcSPpds5.js → users-CyoMXlwX.js} +11 -3
  52. package/core/built/admin/assets/{add-integration-modal-DBFzeAUT.js → add-integration-modal-BVg-ec8i.js} +1 -1
  53. package/core/built/admin/assets/{add-newsletter-modal-CYJe-dTC.js → add-newsletter-modal-Du6th521.js} +1 -1
  54. package/core/built/admin/assets/{add-recommendation-modal-CgwGKH-_.js → add-recommendation-modal-BiCJ0-q5.js} +1 -1
  55. package/core/built/admin/assets/{analytics-CcXT_WqF.js → analytics-CQJzDDdJ.js} +1 -1
  56. package/core/built/admin/assets/{announcement-bar-modal-Ldcg-PB-.js → announcement-bar-modal-CskyZLzT.js} +1 -1
  57. package/core/built/admin/assets/{api-BLteQZ7W.js → api-BFocMbDg.js} +2 -2
  58. package/core/built/admin/assets/{api-keys-CoeerpwI.js → api-keys-CqKJHuAV.js} +1 -1
  59. package/core/built/admin/assets/{audience-Deg9lzfk.js → audience-Dn7LuH-r.js} +1 -1
  60. package/core/built/admin/assets/{auth-layout-CRaMX7g6.js → auth-layout-VLhXgXn5.js} +1 -1
  61. package/core/built/admin/assets/{automated-emails-WcjjRkRV.js → automated-emails-D5cFl1wr.js} +1 -1
  62. package/core/built/admin/assets/{automations-CbIdX0rd.js → automations-BpweKEcq.js} +1 -1
  63. package/core/built/admin/assets/automations-DBTYwNTJ.js +1 -0
  64. package/core/built/admin/assets/{bluesky-sharing-BJMNRwnU.js → bluesky-sharing-CrfpFHQ9.js} +1 -1
  65. package/core/built/admin/assets/{chart-helpers-D-3N170i.js → chart-helpers-BSuFLd6-.js} +1 -1
  66. package/core/built/admin/assets/{chunk.524.94ab17e1199b4c3f4615.js → chunk.524.e24d68bc6253b274b726.js} +4 -4
  67. package/core/built/admin/assets/{chunk.582.6f09b19a007e2805824e.js → chunk.582.47834285406dfa1abb29.js} +6 -6
  68. package/core/built/admin/assets/{chunk.476.53b5794a67d68111e0bf.js → chunk.837.e1454abc054e1fba1fe5.js} +5 -5
  69. package/core/built/admin/assets/{code-editor-view-DhTwpxxv.js → code-editor-view-BrGe3eS4.js} +1 -1
  70. package/core/built/admin/assets/{code-editor-view-C7wXGiuv.js → code-editor-view-CY6JCXNv.js} +1 -1
  71. package/core/built/admin/assets/{color-picker-field-Cjz2zY11.js → color-picker-field-DGe9HH6W.js} +1 -1
  72. package/core/built/admin/assets/{comments-DY-VLVxh.js → comments-iRbF6XiJ.js} +1 -1
  73. package/core/built/admin/assets/{config-B3HuCo0y.js → config-CRAZ4Civ.js} +1 -1
  74. package/core/built/admin/assets/{content-api-modal-2jt-jWiM.js → content-api-modal-B-XRbzeW.js} +1 -1
  75. package/core/built/admin/assets/{content-formatters-VqvNA7Pv.js → content-formatters-C08JJbUJ.js} +2 -2
  76. package/core/built/admin/assets/{context-menu-BWbk9nd5.js → context-menu-BxGXsgQO.js} +1 -1
  77. package/core/built/admin/assets/{custom-field-type-option-CIatEwIN.js → custom-field-type-option-C8Nt4X6x.js} +1 -1
  78. package/core/built/admin/assets/{custom-integration-modal-Cw0w2Tb3.js → custom-integration-modal-DzI16qjN.js} +1 -1
  79. package/core/built/admin/assets/{date-range-select-O-uA-BRV.js → date-range-select-BZqsYsGx.js} +1 -1
  80. package/core/built/admin/assets/{design-and-theme-modal-BLjNHRYN.js → design-and-theme-modal-1ty_KEkM.js} +2 -2
  81. package/core/built/admin/assets/{dist-DJhCsld6.js → dist-B4jqKAG5.js} +1 -1
  82. package/core/built/admin/assets/{dist-5Ol0DC_t.js → dist-Bmo2j_KH.js} +1 -1
  83. package/core/built/admin/assets/{dist-p52UDdoR.js → dist-C-_aTlvJ.js} +1 -1
  84. package/core/built/admin/assets/{dist-CcN1a5SB.js → dist-CWHIoxYn.js} +1 -1
  85. package/core/built/admin/assets/{dist-BcfsaiCV.js → dist-Cp2M5TzT.js} +1 -1
  86. package/core/built/admin/assets/{dist-kjTYGivb.js → dist-DQAAPbtg.js} +1 -1
  87. package/core/built/admin/assets/{dist-IMek6Acg.js → dist-DyO279y5.js} +1 -1
  88. package/core/built/admin/assets/{domain-DaPAeOFF.js → domain-DiFl_Z1A.js} +1 -1
  89. package/core/built/admin/assets/{edit-profile-BKO5qonH.js → edit-profile-PrLbJV3P.js} +1 -1
  90. package/core/built/admin/assets/editor-BBJDJL8U.js +8 -0
  91. package/core/built/admin/assets/{editor-screen-l4BUPE2o.js → editor-screen-nblrp808.js} +3 -3
  92. package/core/built/admin/assets/{email-previews-B1Ska3CF.js → email-previews-BKJxrW29.js} +1 -1
  93. package/core/built/admin/assets/{email-sending-status-provider-Bjn5KTy2.js → email-sending-status-provider-DB9ylBWk.js} +1 -1
  94. package/core/built/admin/assets/{emails-qxNbhO6X.js → emails-8YiSmC2X.js} +1 -1
  95. package/core/built/admin/assets/{embed-signup-form-modal-DSgds6Js.js → embed-signup-form-modal-CZmbYKfd.js} +1 -1
  96. package/core/built/admin/assets/{error-boundary-CJODV8Rg.js → error-boundary-DrxPFFO-.js} +1 -1
  97. package/core/built/admin/assets/{esm-CNLDtBMc.js → esm-_iCUCvbN.js} +1 -1
  98. package/core/built/admin/assets/{explore-C6V_JpUZ.js → explore-C69LSRVg.js} +1 -1
  99. package/core/built/admin/assets/{feed-B_TyFn9E.js → feed-B_0m7WhZ.js} +1 -1
  100. package/core/built/admin/assets/{feedback-gKOzmiGt.js → feedback-DW1DXdzT.js} +1 -1
  101. package/core/built/admin/assets/{filters-Bf6E1qAP.js → filters-Dr3vMnjZ.js} +1 -1
  102. package/core/built/admin/assets/{filters-DhsiEotO.js → filters-M2sRWPoF.js} +1 -1
  103. package/core/built/admin/assets/{first-promoter-modal-LmTXHr-z.js → first-promoter-modal-D43R2zhI.js} +1 -1
  104. package/core/built/admin/assets/{focus-koenig-editor-on-bottom-click-BAcLNJti.js → focus-koenig-editor-on-bottom-click-BzS8jiJf.js} +1 -1
  105. package/core/built/admin/assets/fullscreen-close-button-CWSp-MsK.js +1 -0
  106. package/core/built/admin/assets/{ghost-63bc7da4336844000c523a5a0819531e.js → ghost-ffde29676517b768b1aef5ec8d492418.js} +93 -96
  107. package/core/built/admin/assets/{gift-link-modal-uZtwRHzl.js → gift-link-modal-CNE7dfPD.js} +1 -1
  108. package/core/built/admin/assets/{gift-links-HVqaXear.js → gift-links-lQ7H_D8Z.js} +1 -1
  109. package/core/built/admin/assets/global-search-modal-DzRM3aON.js +1 -0
  110. package/core/built/admin/assets/{growth-BlPW4DHj.js → growth-CAi_5HIf.js} +1 -1
  111. package/core/built/admin/assets/{growth-CflU3vR0.js → growth-CMHbTWKE.js} +1 -1
  112. package/core/built/admin/assets/history-modal-BIz13vhr.js +1 -0
  113. package/core/built/admin/assets/{hooks-C-BDQ6Hs.js → hooks-0r7qxGEo.js} +2 -2
  114. package/core/built/admin/assets/{html-field-D6G0G1d_.js → html-field-vTe2q1be.js} +1 -1
  115. package/core/built/admin/assets/{iframe-buffering-DW-Axhvc.js → iframe-buffering-cu-yK7NA.js} +1 -1
  116. package/core/built/admin/assets/{images-BSUWxquu.js → images-DTZtaIAr.js} +1 -1
  117. package/core/built/admin/assets/{inbox-BkU3sg13.js → inbox-BHfpmmzn.js} +1 -1
  118. package/core/built/admin/assets/{index-z8-nEVdb.css → index-B02LJqc8.css} +1 -1
  119. package/core/built/admin/assets/{index-CuDhPtkB.js → index-RuRs_qGS.js} +3 -3
  120. package/core/built/admin/assets/{index.es-H6HOI4DG.js → index.es-rdb1skp_.js} +1 -1
  121. package/core/built/admin/assets/{integrations-BRo5DwA5.js → integrations-Deg9-u8X.js} +1 -1
  122. package/core/built/admin/assets/{invite-user-modal-CydBOG99.js → invite-user-modal-C4DeNcoO.js} +1 -1
  123. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +10483 -10455
  124. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +131 -131
  125. package/core/built/admin/assets/{koenig-lexical-CG_eb4dw.js → koenig-lexical-BhXu1__-.js} +96 -96
  126. package/core/built/admin/assets/{kpi-helpers-CyRx_yD6.js → kpi-helpers-H-Hl6h7h.js} +1 -1
  127. package/core/built/admin/assets/{kpi-tabs-V1_Nu9sh.js → kpi-tabs-k4A9-imn.js} +1 -1
  128. package/core/built/admin/assets/{label-picker-GTIIlBQ6.js → label-picker-DaivLdMw.js} +1 -1
  129. package/core/built/admin/assets/{labels-BVGLgdAj.js → labels-BCj6D_nl.js} +1 -1
  130. package/core/built/admin/assets/{layout-CG58T6P7.js → layout-_g2xhB0L.js} +1 -1
  131. package/core/built/admin/assets/{lib-Dkic19kH.js → lib-Bre6UXdJ.js} +2 -2
  132. package/core/built/admin/assets/{links-jD8AkkIu.js → links-C8RnEJVJ.js} +1 -1
  133. package/core/built/admin/assets/{member-activity-JggQ0VNQ.js → member-activity-DNJPUW5X.js} +1 -1
  134. package/core/built/admin/assets/{member-activity-feed-BBeCZmLM.js → member-activity-feed-CvKEetHS.js} +1 -1
  135. package/core/built/admin/assets/{member-custom-fields-DPsyP1Hq.js → member-custom-fields-CBdiwPD9.js} +1 -1
  136. package/core/built/admin/assets/{member-detail-D7qugPN7.js → member-detail-BIoyIIsl.js} +1 -1
  137. package/core/built/admin/assets/{members-Cj_BUZUL.js → members-CH6KeXQc.js} +1 -1
  138. package/core/built/admin/assets/{members-alDWPKDd.js → members-Dd9RczFK.js} +1 -1
  139. package/core/built/admin/assets/{migrate-2uKKakld.js → migrate-CVQIWsXO.js} +1 -1
  140. package/core/built/admin/assets/{moderation-pCUKsxbF.js → moderation-OtjZoNOc.js} +1 -1
  141. package/core/built/admin/assets/{navigation-modal-D0FBI5-m.js → navigation-modal-Bl02NjtO.js} +1 -1
  142. package/core/built/admin/assets/{newsletter-4urgCSR_.js → newsletter-BXyT7o69.js} +1 -1
  143. package/core/built/admin/assets/{newsletter-detail-modal-Chh1jvjH.js → newsletter-detail-modal-DxuKNu_1.js} +1 -1
  144. package/core/built/admin/assets/{newsletter-emails-CzVCiC2K.js → newsletter-emails-DicgmnMU.js} +1 -1
  145. package/core/built/admin/assets/{newsletters-eRQTtOBH.js → newsletters-By25FmUs.js} +1 -1
  146. package/core/built/admin/assets/{newsletters-BMEgeL2l.js → newsletters-CACa0VCx.js} +1 -1
  147. package/core/built/admin/assets/{note-dqog4Bua.js → note-CF4LrSmR.js} +1 -1
  148. package/core/built/admin/assets/{notifications-rcEVv-gx.js → notifications-BmHJmqIJ.js} +1 -1
  149. package/core/built/admin/assets/{offers-hV7zBtsI.js → offers-Df9Jzay5.js} +1 -1
  150. package/core/built/admin/assets/{offers-container-modal-DgZgkMsA.js → offers-container-modal-R0HRwugm.js} +1 -1
  151. package/core/built/admin/assets/{onboarding-4TxbZb90.js → onboarding-Bpo1yTzA.js} +1 -1
  152. package/core/built/admin/assets/{onboarding-SGscZLIc.js → onboarding-bMq3R8jB.js} +1 -1
  153. package/core/built/admin/assets/{onboarding-route-B3mN9l7E.js → onboarding-route-flf5YWti.js} +1 -1
  154. package/core/built/admin/assets/{overview-D4EanvDG.js → overview-C9WvmmOC.js} +1 -1
  155. package/core/built/admin/assets/{overview-CCwbHet8.js → overview-CDkHdIJM.js} +1 -1
  156. package/core/built/admin/assets/{page-header-Baymg6VR.js → page-header-CxTb0je5.js} +1 -1
  157. package/core/built/admin/assets/{pagemenu--UL0gW1x.js → pagemenu-DXr_U43J.js} +1 -1
  158. package/core/built/admin/assets/{pages-Cbq1M2kG.js → pages-Bm-zFXyP.js} +1 -1
  159. package/core/built/admin/assets/pages-route-LCw94aIO.js +1 -0
  160. package/core/built/admin/assets/{pintura-modal-D6HGlnJa.js → pintura-modal-B5sIPWcj.js} +1 -1
  161. package/core/built/admin/assets/{portal-modal-Bhqsevn_.js → portal-modal-DjOO3Unv.js} +1 -1
  162. package/core/built/admin/assets/{post-analytics-header-DX9fETdi.js → post-analytics-header-D2anehCj.js} +1 -1
  163. package/core/built/admin/assets/{post-analytics-provider-U7RtOle1.js → post-analytics-provider-BLQvV5C0.js} +1 -1
  164. package/core/built/admin/assets/{post-analytics-BJWDtC3a.js → post-analytics-wdu9gq8u.js} +1 -1
  165. package/core/built/admin/assets/{post-debug-D1b8Amju.js → post-debug-BnABXMfD.js} +1 -1
  166. package/core/built/admin/assets/{posts-Lg-p_ZHg.js → posts-CftunZgV.js} +1 -1
  167. package/core/built/admin/assets/{posts-list-screen-CmsW18e_.js → posts-list-screen-CwXmvY68.js} +2 -2
  168. package/core/built/admin/assets/posts-route-J74fMhCe.js +1 -0
  169. package/core/built/admin/assets/{preferences-CMlDfHfa.js → preferences-DFhf_pJF.js} +1 -1
  170. package/core/built/admin/assets/{preview-modal-D8om_cQv.js → preview-modal-BrZza3R_.js} +1 -1
  171. package/core/built/admin/assets/{profile-yFsIoZom.js → profile-CS4fP60N.js} +1 -1
  172. package/core/built/admin/assets/{radio-group-DwgLjwWB.js → radio-group-Xfp-frJz.js} +1 -1
  173. package/core/built/admin/assets/{referrers-DzP5QoXL.js → referrers-C8LJlrBm.js} +1 -1
  174. package/core/built/admin/assets/{reload-CZ-KP3IQ.js → reload-D0fnKoCm.js} +1 -1
  175. package/core/built/admin/assets/{reset-CCAa8v35.js → reset-CB-ATcLE.js} +1 -1
  176. package/core/built/admin/assets/{restore-screen-Ba0i2Y1K.js → restore-screen-EaZf4V8j.js} +1 -1
  177. package/core/built/admin/assets/{routes-DrnhmKTT.js → routes-DKfpFMfF.js} +2 -2
  178. package/core/built/admin/assets/search-index-sM3OjEUl.js +1 -0
  179. package/core/built/admin/assets/settings-BWzod-5X.js +4 -0
  180. package/core/built/admin/assets/{settings-lqWkfSmT.js → settings-DvgngbFt.js} +1 -1
  181. package/core/built/admin/assets/{setup-BopRPuaM.js → setup-CdHAchG5.js} +1 -1
  182. package/core/built/admin/assets/{signin-e8NgsU9M.js → signin-CUEEme88.js} +1 -1
  183. package/core/built/admin/assets/{signin-verify-CHkFJevb.js → signin-verify-CYRphSrj.js} +1 -1
  184. package/core/built/admin/assets/{signout-DRvQZuWa.js → signout-kLCJau9G.js} +1 -1
  185. package/core/built/admin/assets/{signup-DQHi7jZz.js → signup-J2Vjq7Gt.js} +1 -1
  186. package/core/built/admin/assets/{slack-modal-BuGESzgn.js → slack-modal-DKamr_94.js} +1 -1
  187. package/core/built/admin/assets/source-icon-DqBCPDIK.js +1 -0
  188. package/core/built/admin/assets/{stats-CHOikfoP.js → stats-BL_FJ7Ns.js} +1 -1
  189. package/core/built/admin/assets/{stats-view-DQZzKeEz.js → stats-view-BwbdkdOQ.js} +1 -1
  190. package/core/built/admin/assets/{step-1-C8XwHcKt.js → step-1-CLYhNmG9.js} +1 -1
  191. package/core/built/admin/assets/{step-2-BXaXAdwY.js → step-2-B2ujMlpa.js} +1 -1
  192. package/core/built/admin/assets/{step-3-DytbqpJi.js → step-3-DoaTWqqj.js} +1 -1
  193. package/core/built/admin/assets/{stripe-connect-modal-BhudjSeO.js → stripe-connect-modal-DytxH9DJ.js} +1 -1
  194. package/core/built/admin/assets/{tabs-CDb_TceL.js → tabs-fHs3A8WC.js} +1 -1
  195. package/core/built/admin/assets/{tag-detail-V72Zlro8.js → tag-detail-BcO46Ids.js} +2 -2
  196. package/core/built/admin/assets/{tag-picker-M3fC-yOF.js → tag-picker-Ct6NeqWK.js} +1 -1
  197. package/core/built/admin/assets/{tags-CXqE2A2T.js → tags-C1h3wCpW.js} +1 -1
  198. package/core/built/admin/assets/{tags-ZhqbPPc6.js → tags-OlmRJ6Ps.js} +1 -1
  199. package/core/built/admin/assets/{testimonials-modal-Cn8gvIFA.js → testimonials-modal-DMsQzSCB.js} +1 -1
  200. package/core/built/admin/assets/{themes-pOHHvnkt.js → themes-CPJSMo_W.js} +1 -1
  201. package/core/built/admin/assets/{tier-detail-modal-CeDla1OO.js → tier-detail-modal-DssSmhkF.js} +1 -1
  202. package/core/built/admin/assets/{tiers-D7aGzwZ-.js → tiers-DlvS8D6_.js} +1 -1
  203. package/core/built/admin/assets/{toggle-group-D7ly9OGa.js → toggle-group-BFWCtH3p.js} +1 -1
  204. package/core/built/admin/assets/{topic-filter-DQ3pr6AB.js → topic-filter-DAJ-DFPb.js} +1 -1
  205. package/core/built/admin/assets/{transistor-modal-4_Yx2vRo.js → transistor-modal-CtyFRsD0.js} +1 -1
  206. package/core/built/admin/assets/{unsplash-modal-Dm7R4k4k.js → unsplash-modal-DHnnTPmZ.js} +1 -1
  207. package/core/built/admin/assets/{use-activity-pub-queries-Gy9_locM.js → use-activity-pub-queries-BgR1USeY.js} +1 -1
  208. package/core/built/admin/assets/{use-analytics-data-oJ2o0pSS.js → use-analytics-data-Byf83QE-.js} +1 -1
  209. package/core/built/admin/assets/{use-availability-BqL7Dvn_.js → use-availability-CgZC6L_V.js} +1 -1
  210. package/core/built/admin/assets/{use-check-theme-limit-error-CxC9uKJz.js → use-check-theme-limit-error-DjprzKAN.js} +1 -1
  211. package/core/built/admin/assets/use-definitions-CJuXLSob.js +1 -0
  212. package/core/built/admin/assets/{use-email-sending-status-BFAg5TIb.js → use-email-sending-status-7kopNcza.js} +1 -1
  213. package/core/built/admin/assets/{use-filter-params-BOo9yZ5j.js → use-filter-params-DQ7uX-Zp.js} +1 -1
  214. package/core/built/admin/assets/{use-filterable-api-BnNLaS_r.js → use-filterable-api-CDrrxoGD.js} +1 -1
  215. package/core/built/admin/assets/{use-growth-stats-BS62uyyn.js → use-growth-stats-CCpnBgqS.js} +1 -1
  216. package/core/built/admin/assets/{use-host-limits-CNh4AAEs.js → use-host-limits-BZx7rzRI.js} +1 -1
  217. package/core/built/admin/assets/{use-limiter-DPKxoO1_.js → use-limiter-gF219BEg.js} +1 -1
  218. package/core/built/admin/assets/{use-pintura-config-CyVO62ZV.js → use-pintura-config-D-pmGkn2.js} +1 -1
  219. package/core/built/admin/assets/{use-pintura-editor-B5VBPbiO.js → use-pintura-editor-D_4zhlGE.js} +1 -1
  220. package/core/built/admin/assets/{use-post-referrers-nUPolSk7.js → use-post-referrers-Bc8eq4uy.js} +1 -1
  221. package/core/built/admin/assets/{use-post-top-links-DCH4eO11.js → use-post-top-links-DjltnQuI.js} +1 -1
  222. package/core/built/admin/assets/{use-reply-chain-data-UMzFbDvh.js → use-reply-chain-data-BiV3Cl0B.js} +1 -1
  223. package/core/built/admin/assets/use-sending-eta-gE-2B0Zw.js +1 -0
  224. package/core/built/admin/assets/{use-setting-group-Bf3vY8br.js → use-setting-group-YP84CqrJ.js} +1 -1
  225. package/core/built/admin/assets/{use-staff-users-CcQzTHqH.js → use-staff-users-CnwfdSx1.js} +1 -1
  226. package/core/built/admin/assets/{use-tinybird-query-CPy5ipAP.js → use-tinybird-query-BYbl5gKY.js} +1 -1
  227. package/core/built/admin/assets/{use-tinybird-token-DVNHuhu_.js → use-tinybird-token-Dz37zvb7.js} +1 -1
  228. package/core/built/admin/assets/{use-unsaved-changes-guard-Bvcp_Rny.js → use-unsaved-changes-guard-BkCuSlvU.js} +1 -1
  229. package/core/built/admin/assets/{use-upgrade-route-Bsxw9ZLN.js → use-upgrade-route-C-V-Xfak.js} +1 -1
  230. package/core/built/admin/assets/{use-url-input-DPJ592FB.js → use-url-input-BeYKYMGh.js} +1 -1
  231. package/core/built/admin/assets/{user-detail-modal-6UY6GdNy.js → user-detail-modal-CSoj7vOC.js} +1 -1
  232. package/core/built/admin/assets/{users-CzgQKbfO.js → users-CKJaAxEJ.js} +1 -1
  233. package/core/built/admin/assets/{view-site-DA_-zfGq.js → view-site-SpMx4P7G.js} +1 -1
  234. package/core/built/admin/assets/{web-Cq5YiD2r.js → web-CZf-k4F0.js} +1 -1
  235. package/core/built/admin/assets/{web-DqFIrOxt.js → web-uAqgYPK9.js} +1 -1
  236. package/core/built/admin/assets/{zapier-modal-DgqU-OBB.js → zapier-modal-DENbgTyE.js} +1 -1
  237. package/core/built/admin/index.html +24 -24
  238. package/core/frontend/helpers/color_to_rgba.js +15 -13
  239. package/core/frontend/helpers/facebook_url.js +27 -15
  240. package/core/frontend/services/assets-minification/card-assets.js +1 -1
  241. package/core/frontend/services/helpers/register-ghost-helpers.js +2 -2
  242. package/core/server/api/endpoints/app-installations.js +36 -0
  243. package/core/server/api/endpoints/automations.js +1 -1
  244. package/core/server/api/endpoints/index.js +4 -0
  245. package/core/server/data/exporter/table-lists.js +2 -0
  246. package/core/server/data/migrations/versions/6.69/2026-10-07-06-20-43-add-app-installation-permissions.js +40 -0
  247. package/core/server/data/schema/fixtures/fixtures.json +21 -0
  248. package/core/server/data/schema/in-development.js +1 -1
  249. package/core/server/data/schema/schema.js +53 -0
  250. package/core/server/lib/after-commit.js +20 -0
  251. package/core/server/models/action.js +6 -0
  252. package/core/server/services/app-installations/actions.js +44 -0
  253. package/core/server/services/app-installations/codec.js +20 -0
  254. package/core/server/services/app-installations/index.js +42 -0
  255. package/core/server/services/app-installations/schema.js +52 -0
  256. package/core/server/services/app-installations/service.js +160 -0
  257. package/core/server/services/automations/README.md +3 -3
  258. package/core/server/services/automations/automations-api.js +1 -1
  259. package/core/server/services/comments/comments-service-emails.js +8 -6
  260. package/core/server/services/email-service/README.md +16 -0
  261. package/core/server/services/email-service/email-service-wrapper.js +1 -0
  262. package/core/server/services/email-service/email-service.js +94 -53
  263. package/core/server/services/email-service/sending-status-serializers.js +4 -1
  264. package/core/server/services/email-service/sending-status-service.js +13 -0
  265. package/core/server/services/email-service/sending-status.js +12 -1
  266. package/core/server/services/members/members-api/repositories/member-repository.js +5 -23
  267. package/core/server/services/posts/post-email-handler.js +61 -28
  268. package/core/server/services/posts/posts-service.js +27 -2
  269. package/core/server/services/service-inventory.yaml +93 -7
  270. package/core/server/services/stats/stats-service.js +1 -5
  271. package/core/server/services/tinybird-sync/index.js +0 -3
  272. package/core/server/services/tinybird-sync/tinybird-sync-service.js +2 -6
  273. package/core/server/web/api/endpoints/admin/routes.js +25 -12
  274. package/core/shared/labs.js +4 -6
  275. package/package.json +11 -10
  276. package/pnpm-lock.yaml +112 -100
  277. package/pnpm-workspace.yaml +14 -12
  278. package/components/ghost-storage-base-3.0.0.tgz +0 -0
  279. package/components/tryghost-adapter-base-cache-0.2.0.tgz +0 -0
  280. package/components/tryghost-checkout-0.0.1.tgz +0 -0
  281. package/components/tryghost-kg-card-factory-5.2.4.tgz +0 -0
  282. package/components/tryghost-kg-clean-basic-html-4.3.4.tgz +0 -0
  283. package/components/tryghost-kg-converters-1.2.5.tgz +0 -0
  284. package/components/tryghost-kg-default-transforms-1.3.4.tgz +0 -0
  285. package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
  286. package/components/tryghost-kg-markdown-html-renderer-7.2.6.tgz +0 -0
  287. package/components/tryghost-kg-utils-1.1.4.tgz +0 -0
  288. package/components/tryghost-metafield-csv-0.0.1.tgz +0 -0
  289. package/core/built/admin/assets/activitypub/layout-QTbY0t8e.js +0 -1
  290. package/core/built/admin/assets/automations-DVToctfJ.js +0 -1
  291. package/core/built/admin/assets/editor-CMXR0YvR.js +0 -8
  292. package/core/built/admin/assets/fullscreen-close-button-DXssPeDB.js +0 -1
  293. package/core/built/admin/assets/global-search-modal-C8LVJmiz.js +0 -1
  294. package/core/built/admin/assets/history-modal-parBtjpz.js +0 -1
  295. package/core/built/admin/assets/pages-route-CDk3V9rq.js +0 -1
  296. package/core/built/admin/assets/posts-route-CexHhklY.js +0 -1
  297. package/core/built/admin/assets/settings-xqakrAWa.js +0 -4
  298. package/core/built/admin/assets/source-icon-BjVangBd.js +0 -1
  299. package/core/built/admin/assets/use-definitions-DMVU3mTG.js +0 -1
  300. package/core/built/admin/assets/use-sending-eta-BsnKdQhv.js +0 -1
@@ -1 +1 @@
1
- (function(){try{var e=typeof window<`u`?window:typeof global<`u`?global:typeof globalThis<`u`?globalThis:typeof self<`u`?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]=`eccaa981-edff-4582-a1f4-3fedc37cf1e2`,e._sentryDebugIdIdentifier=`sentry-dbid-eccaa981-edff-4582-a1f4-3fedc37cf1e2`)}catch{}})();import{s as e,t}from"./react-C9lG_SsT.js";import{t as n}from"./jsx-runtime-Bm2_KH-0.js";import{t as r}from"./use-tinybird-query-CPy5ipAP.js";import{i}from"./pagemenu--UL0gW1x.js";import{_ as a,h as o}from"./chunk-OB3PAWPO-D3muQBsq.js";import{a as s,t as c}from"./router-provider-Cf-bcYZr.js";import{G as l,H as u,M as d,U as f}from"./shade-provider-DvrXKKQZ.js";import{a as p}from"./heading-Ch2Mb19A.js";import{L as m,t as h,vn as ee}from"./button-CTHYSI-d.js";import{a as g,i as _,n as v,o as y,r as b,t as x}from"./card-Cd6xB_Ok.js";import{t as S}from"./gh-chart-Boqv6SC0.js";import{a as C,c as w,i as T,l as E,n as D,o as O,r as k,s as A,t as j,u as M}from"./data-list-CNs61th8.js";import{t as te}from"./empty-indicator-BhVwqSVH.js";import{a as N,i as ne,n as re,o as P,r as ie,s as F}from"./use-filter-params-BOo9yZ5j.js";import{t as ae}from"./loading-indicator-DaRyGrxv.js";import{r as I,t as L}from"./tabs-CDb_TceL.js";import{o as oe}from"./filters-Bf6E1qAP.js";import{n as R,r as z,t as B}from"./kpi-tabs-V1_Nu9sh.js";import{$ as V,K as H,Kt as se,Q as U,Y as ce,ct as W,et as G,ft as K,nn as le,nt as ue,q as de,rt as fe,st as pe,tt as me,ut as he,vt as ge}from"./index-CuDhPtkB.js";import{t as q}from"./date-range-select-O-uA-BRV.js";import{a as J,c as _e,i as ve,n as Y,o as ye,r as be}from"./chart-helpers-D-3N170i.js";import{t as xe}from"./use-analytics-data-oJ2o0pSS.js";import{n as Se,t as Ce}from"./audience-Deg9lzfk.js";import{n as we}from"./post-analytics-context-v4FXmVDC.js";import{r as Te,t as Ee}from"./post-analytics-header-DX9fETdi.js";import{n as X,r as De,t as Z}from"./kpi-helpers-CyRx_yD6.js";var Q=e(t(),1),$=n(),Oe=({data:e,range:t})=>{let[n]=a(),[r,i]=(0,Q.useState)(n.get(`tab`)||`visits`),o=X[r],s=_e(e||[],t,o.dataKey,`sum`)?.map(e=>{let t=Number(e[o.dataKey]);return{date:String(e.date),value:t,formattedValue:o.formatter(t),label:o.label}}),c=Z(e),l=be(t,e||[],{fieldName:o.dataKey});return(0,$.jsx)(x,{children:(0,$.jsx)(v,{children:(0,$.jsxs)(L,{defaultValue:r,variant:`kpis`,children:[(0,$.jsxs)(I,{className:`-mx-6 hidden grid-cols-2 md:visible! md:grid!`,children:[(0,$.jsx)(R,{value:`visits`,onClick:()=>{i(`visits`)},children:(0,$.jsx)(z,{color:X.visits.color,label:`Unique visitors`,value:c.visits})}),(0,$.jsx)(R,{value:`views`,onClick:()=>{i(`views`)},children:(0,$.jsx)(z,{color:X.views.color,label:`Total views`,value:c.views})})]}),(0,$.jsxs)(W,{children:[(0,$.jsx)(ge,{className:`md:hidden`,asChild:!0,children:(0,$.jsxs)(B,{children:[r===`visits`&&(0,$.jsx)(z,{color:`var(--chart-blue)`,label:`Unique visitors`,value:c.visits}),r===`views`&&(0,$.jsx)(z,{color:`var(--chart-teal)`,label:`Total views`,value:c.views})]})}),(0,$.jsxs)(he,{align:`end`,className:`w-56`,children:[(0,$.jsx)(K,{onClick:()=>i(`visits`),children:`Unique visitors`}),(0,$.jsx)(K,{onClick:()=>i(`views`),children:`Total views`})]})]}),(0,$.jsx)(`div`,{className:`my-4 [&_.recharts-cartesian-axis-tick-value]:fill-gray-500`,children:(0,$.jsx)(S,{className:`-mb-3 aspect-auto h-[16vw] max-h-[320px] min-h-[180px] w-full`,color:o.color,data:s,id:o.dataKey,range:l,showHours:!0,syncId:`overview-charts`})})]})})})},ke=e(P(),1);ke.registerLocale(N);var Ae=e=>H[e]||ke.getName(e,`en`,{select:`alias`})||`Unknown`,je=e=>({"UNITED STATES":`US`,"UNITED STATES OF AMERICA":`US`,USA:`US`,"UNITED KINGDOM":`GB`,UK:`GB`,"GREAT BRITAIN":`GB`,NETHERLANDS:`NL`})[e.toUpperCase()]||(e.length>2?e.substring(0,2):e),Me=({tableHeader:e,data:t,onLocationClick:n})=>(0,$.jsxs)(j,{children:[e&&(0,$.jsxs)(C,{children:[(0,$.jsx)(T,{children:`Country`}),(0,$.jsx)(T,{children:`Visitors`})]}),(0,$.jsx)(k,{children:t.map(e=>{let t=Ae(`${e.location}`)||`Unknown`,r=n&&e.location!==`Unknown`,i=e.location?e.location.toLowerCase():`unknown`;return(0,$.jsxs)(M,{className:r?`cursor-pointer`:``,"data-testid":`location-row-${i}`,onClick:r?()=>n(e.location):void 0,children:[(0,$.jsx)(D,{style:{width:`${e.percentage?Math.round(e.percentage*100):0}%`}}),(0,$.jsx)(O,{className:`group-hover/data:max-w-[calc(100%-140px)]`,children:(0,$.jsxs)(`div`,{className:`flex items-center space-x-3 overflow-hidden`,title:t||`Unknown`,children:[(0,$.jsx)(F,{countryCode:`${je(e.location)}`,fallback:(0,$.jsx)(`span`,{className:`flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white`,children:(0,$.jsx)(d.SkullAndBones,{className:`size-3`})})}),(0,$.jsx)(`div`,{className:`truncate font-medium`,children:t})]})}),(0,$.jsxs)(A,{children:[(0,$.jsx)(w,{children:u(Number(e.visits))}),(0,$.jsx)(E,{children:f(e.percentage)})]})]},e.location||`unknown`)})})]}),Ne=({data:e,isLoading:t,onLocationClick:n})=>{let r=e.slice(0,10);return(0,$.jsx)($.Fragment,{children:t?``:(0,$.jsx)($.Fragment,{children:e&&e.length>0&&(0,$.jsxs)(x,{className:`group/datalist`,"data-testid":`locations-card`,children:[(0,$.jsxs)(`div`,{className:`flex items-center justify-between p-6`,children:[(0,$.jsxs)(g,{className:`p-0`,children:[(0,$.jsx)(y,{children:`Locations`}),(0,$.jsx)(b,{children:`Where are the readers of this post`})]}),(0,$.jsx)(p,{className:`mr-2`,children:`Visitors`})]}),(0,$.jsxs)(v,{className:`overflow-hidden`,children:[(0,$.jsx)(pe,{}),(0,$.jsx)(Me,{data:r,tableHeader:!1,onLocationClick:n})]}),e.length>10&&(0,$.jsx)(_,{children:(0,$.jsxs)(U,{children:[(0,$.jsx)(fe,{asChild:!0,children:(0,$.jsxs)(h,{variant:`subtle`,children:[`View all `,(0,$.jsx)(m,{})]})}),(0,$.jsxs)(V,{className:`overflow-y-auto pt-0 sm:max-w-[420px]`,children:[(0,$.jsxs)(me,{className:`sticky top-0 z-40 -mx-6 bg-surface-elevated/60 p-6 backdrop-blur`,children:[(0,$.jsx)(ue,{children:`Top locations`}),(0,$.jsx)(G,{children:`Where are the readers of this post`})]}),(0,$.jsx)(`div`,{className:`group/datalist`,children:(0,$.jsx)(Me,{data:e,tableHeader:!0,onLocationClick:n})})]})]})})]})})})},Pe=()=>{let e=s(),{postId:t}=o(),{statsConfig:n,isLoading:a,site:u}=xe(),{range:d,setRange:f,post:p,isPostLoading:m}=we(),{data:h}=se(),g=le(),_=(0,Q.useRef)(null),{filters:y,setFilters:b}=ie({supportedFields:re,trackingSource:`post-analytics`}),S=(0,Q.useMemo)(()=>Ce(y.find(e=>e.field===`audience`)?.values),[y]);(0,Q.useEffect)(()=>{!m&&p?.email_only&&e(`/posts/analytics/${t}`)},[m,p?.email_only,e,t]);let C=(0,Q.useMemo)(()=>{if(!p?.published_at)return de.allTime.value;let e=ye(p.published_at),{startDate:t,endDate:n}=J(d);return n.diff(t,`days`)+1>e?e:d},[p?.published_at,d]),{startDate:w,endDate:T,timezone:E}=J(C),D=(0,Q.useCallback)(()=>{let e=l(_.current);e&&e.scrollTo({top:0,behavior:`smooth`})},[]),O=(0,Q.useMemo)(()=>{let e={};return y.forEach(t=>{let n=t.field,r=t.values;if(n===`audience`)return;let i=r&&r.length>0&&r[0]!==null&&r[0]!==void 0,a=n===`source`&&r?.[0]===``;if(i&&(r[0]!==``||a)){let t=String(r[0]);e[n]=t}}),e},[y]),k=(0,Q.useCallback)((e,t)=>{b(n=>n.find(t=>t.field===e)?n.map(n=>n.field===e?{...n,values:[t]}:n):[...n,oe(e,`is`,[t])]),D()},[b,D]),A=(0,Q.useCallback)(e=>k(`location`,e),[k]),j=(0,Q.useCallback)(e=>k(`source`,e),[k]),M=(0,Q.useMemo)(()=>{let e={site_uuid:n?.id||``,date_from:Y(w),date_to:Y(T),timezone:E,member_status:Se(S),post_uuid:``,...O};return!m&&p?.uuid?{...e,post_uuid:p.uuid}:e},[m,p,n?.id,w,T,E,S,O]),{data:N,loading:P}=r({endpoint:`api_kpis`,statsConfig:n,params:M}),{data:F,loading:I}=r({endpoint:`api_top_locations`,statsConfig:n,params:M}),{data:L,loading:R}=r({endpoint:`api_top_sources`,statsConfig:n,params:M}),z=(0,Q.useMemo)(()=>F?.reduce((e,t)=>e+Number(t.visits),0)||0,[F]),B=(0,Q.useMemo)(()=>L?L.reduce((e,t)=>e+Number(t.visits||0),0):0,[L]),V=u.url,H=u.icon,U=(0,Q.useMemo)(()=>{let e=F?.map(e=>({location:String(e.location),visits:Number(e.visits),percentage:z>0?Number(e.visits)/z:0,isUnknown:ce.includes(String(e.location))}))||[],t=e.filter(e=>!e.isUnknown),n=e.filter(e=>e.isUnknown),r=n.length>0?[{location:`Unknown`,visits:n.reduce((e,t)=>e+t.visits,0),percentage:n.reduce((e,t)=>e+t.percentage,0)}]:[];return[...t,...r]},[F,z]),W=a||m||P||I||R,G=Z(N),K=y.length>0;return h?.settings&&!g?(0,$.jsx)(c,{to:`/posts/analytics/${t}`,replace:!0}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(Ee,{currentTab:`Web`,children:[K&&(0,$.jsx)(i,{children:(0,$.jsx)(q,{range:d,onRangeChange:f})}),(0,$.jsxs)(i,{className:`${K?`mt-0! [grid-area:subactions] lg:mt-[25px]!`:`[grid-area:actions]`}`,children:[(0,$.jsx)(ne,{filters:y,postUuid:p?.uuid,range:d,onChange:b}),!K&&(0,$.jsx)(q,{range:d,onRangeChange:f})]})]}),(0,$.jsx)(Te,{ref:_,children:W?(0,$.jsx)(x,{className:`size-full`,variant:`plain`,children:(0,$.jsx)(v,{className:`size-full items-center justify-center`,children:(0,$.jsx)(ae,{})})}):N&&N.length!==0&&G.visits!==`0`?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(Oe,{data:N,range:C}),(0,$.jsxs)(`div`,{className:`flex flex-col gap-6 lg:grid lg:grid-cols-2`,children:[(0,$.jsx)(Ne,{data:U,isLoading:I,onLocationClick:A}),(0,$.jsx)(De,{data:L,range:C,siteIcon:H,siteUrl:V,totalVisitors:B,onSourceClick:j})]})]}):(0,$.jsx)(`div`,{className:`grow`,children:(0,$.jsx)(te,{className:`h-full`,description:`Try adjusting filters to see more data.`,title:`No visitors ${ve(d)}`,children:(0,$.jsx)(ee,{strokeWidth:1.5})})})})]})};export{Pe as default};
1
+ (function(){try{var e=typeof window<`u`?window:typeof global<`u`?global:typeof globalThis<`u`?globalThis:typeof self<`u`?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]=`f8a4c414-8630-4394-b47c-2c8a1a19d09f`,e._sentryDebugIdIdentifier=`sentry-dbid-f8a4c414-8630-4394-b47c-2c8a1a19d09f`)}catch{}})();import{s as e,t}from"./react-C9lG_SsT.js";import{t as n}from"./jsx-runtime-Bm2_KH-0.js";import{t as r}from"./use-tinybird-query-BYbl5gKY.js";import{i}from"./pagemenu-DXr_U43J.js";import{_ as a,h as o}from"./chunk-OB3PAWPO-D3muQBsq.js";import{a as s,t as c}from"./router-provider-Cf-bcYZr.js";import{G as l,H as u,M as d,U as f}from"./shade-provider-DvrXKKQZ.js";import{a as p}from"./heading-Ch2Mb19A.js";import{L as m,t as h,vn as ee}from"./button-CTHYSI-d.js";import{a as g,i as _,n as v,o as y,r as b,t as x}from"./card-Cd6xB_Ok.js";import{t as S}from"./gh-chart-Boqv6SC0.js";import{a as C,c as w,i as T,l as E,n as D,o as O,r as k,s as A,t as j,u as M}from"./data-list-CNs61th8.js";import{t as te}from"./empty-indicator-BhVwqSVH.js";import{a as N,i as ne,n as re,o as P,r as ie,s as F}from"./use-filter-params-DQ7uX-Zp.js";import{t as ae}from"./loading-indicator-DaRyGrxv.js";import{r as I,t as L}from"./tabs-fHs3A8WC.js";import{o as oe}from"./filters-Dr3vMnjZ.js";import{n as R,r as z,t as B}from"./kpi-tabs-k4A9-imn.js";import{$ as V,K as H,Kt as se,Q as U,Y as ce,ct as W,et as G,ft as K,nn as le,nt as ue,q as de,rt as fe,st as pe,tt as me,ut as he,vt as ge}from"./index-RuRs_qGS.js";import{t as q}from"./date-range-select-BZqsYsGx.js";import{a as J,c as _e,i as ve,n as Y,o as ye,r as be}from"./chart-helpers-BSuFLd6-.js";import{t as xe}from"./use-analytics-data-Byf83QE-.js";import{n as Se,t as Ce}from"./audience-Dn7LuH-r.js";import{n as we}from"./post-analytics-context-v4FXmVDC.js";import{r as Te,t as Ee}from"./post-analytics-header-D2anehCj.js";import{n as X,r as De,t as Z}from"./kpi-helpers-H-Hl6h7h.js";var Q=e(t(),1),$=n(),Oe=({data:e,range:t})=>{let[n]=a(),[r,i]=(0,Q.useState)(n.get(`tab`)||`visits`),o=X[r],s=_e(e||[],t,o.dataKey,`sum`)?.map(e=>{let t=Number(e[o.dataKey]);return{date:String(e.date),value:t,formattedValue:o.formatter(t),label:o.label}}),c=Z(e),l=be(t,e||[],{fieldName:o.dataKey});return(0,$.jsx)(x,{children:(0,$.jsx)(v,{children:(0,$.jsxs)(L,{defaultValue:r,variant:`kpis`,children:[(0,$.jsxs)(I,{className:`-mx-6 hidden grid-cols-2 md:visible! md:grid!`,children:[(0,$.jsx)(R,{value:`visits`,onClick:()=>{i(`visits`)},children:(0,$.jsx)(z,{color:X.visits.color,label:`Unique visitors`,value:c.visits})}),(0,$.jsx)(R,{value:`views`,onClick:()=>{i(`views`)},children:(0,$.jsx)(z,{color:X.views.color,label:`Total views`,value:c.views})})]}),(0,$.jsxs)(W,{children:[(0,$.jsx)(ge,{className:`md:hidden`,asChild:!0,children:(0,$.jsxs)(B,{children:[r===`visits`&&(0,$.jsx)(z,{color:`var(--chart-blue)`,label:`Unique visitors`,value:c.visits}),r===`views`&&(0,$.jsx)(z,{color:`var(--chart-teal)`,label:`Total views`,value:c.views})]})}),(0,$.jsxs)(he,{align:`end`,className:`w-56`,children:[(0,$.jsx)(K,{onClick:()=>i(`visits`),children:`Unique visitors`}),(0,$.jsx)(K,{onClick:()=>i(`views`),children:`Total views`})]})]}),(0,$.jsx)(`div`,{className:`my-4 [&_.recharts-cartesian-axis-tick-value]:fill-gray-500`,children:(0,$.jsx)(S,{className:`-mb-3 aspect-auto h-[16vw] max-h-[320px] min-h-[180px] w-full`,color:o.color,data:s,id:o.dataKey,range:l,showHours:!0,syncId:`overview-charts`})})]})})})},ke=e(P(),1);ke.registerLocale(N);var Ae=e=>H[e]||ke.getName(e,`en`,{select:`alias`})||`Unknown`,je=e=>({"UNITED STATES":`US`,"UNITED STATES OF AMERICA":`US`,USA:`US`,"UNITED KINGDOM":`GB`,UK:`GB`,"GREAT BRITAIN":`GB`,NETHERLANDS:`NL`})[e.toUpperCase()]||(e.length>2?e.substring(0,2):e),Me=({tableHeader:e,data:t,onLocationClick:n})=>(0,$.jsxs)(j,{children:[e&&(0,$.jsxs)(C,{children:[(0,$.jsx)(T,{children:`Country`}),(0,$.jsx)(T,{children:`Visitors`})]}),(0,$.jsx)(k,{children:t.map(e=>{let t=Ae(`${e.location}`)||`Unknown`,r=n&&e.location!==`Unknown`,i=e.location?e.location.toLowerCase():`unknown`;return(0,$.jsxs)(M,{className:r?`cursor-pointer`:``,"data-testid":`location-row-${i}`,onClick:r?()=>n(e.location):void 0,children:[(0,$.jsx)(D,{style:{width:`${e.percentage?Math.round(e.percentage*100):0}%`}}),(0,$.jsx)(O,{className:`group-hover/data:max-w-[calc(100%-140px)]`,children:(0,$.jsxs)(`div`,{className:`flex items-center space-x-3 overflow-hidden`,title:t||`Unknown`,children:[(0,$.jsx)(F,{countryCode:`${je(e.location)}`,fallback:(0,$.jsx)(`span`,{className:`flex h-[14px] w-[22px] items-center justify-center rounded-[2px] bg-black text-white`,children:(0,$.jsx)(d.SkullAndBones,{className:`size-3`})})}),(0,$.jsx)(`div`,{className:`truncate font-medium`,children:t})]})}),(0,$.jsxs)(A,{children:[(0,$.jsx)(w,{children:u(Number(e.visits))}),(0,$.jsx)(E,{children:f(e.percentage)})]})]},e.location||`unknown`)})})]}),Ne=({data:e,isLoading:t,onLocationClick:n})=>{let r=e.slice(0,10);return(0,$.jsx)($.Fragment,{children:t?``:(0,$.jsx)($.Fragment,{children:e&&e.length>0&&(0,$.jsxs)(x,{className:`group/datalist`,"data-testid":`locations-card`,children:[(0,$.jsxs)(`div`,{className:`flex items-center justify-between p-6`,children:[(0,$.jsxs)(g,{className:`p-0`,children:[(0,$.jsx)(y,{children:`Locations`}),(0,$.jsx)(b,{children:`Where are the readers of this post`})]}),(0,$.jsx)(p,{className:`mr-2`,children:`Visitors`})]}),(0,$.jsxs)(v,{className:`overflow-hidden`,children:[(0,$.jsx)(pe,{}),(0,$.jsx)(Me,{data:r,tableHeader:!1,onLocationClick:n})]}),e.length>10&&(0,$.jsx)(_,{children:(0,$.jsxs)(U,{children:[(0,$.jsx)(fe,{asChild:!0,children:(0,$.jsxs)(h,{variant:`subtle`,children:[`View all `,(0,$.jsx)(m,{})]})}),(0,$.jsxs)(V,{className:`overflow-y-auto pt-0 sm:max-w-[420px]`,children:[(0,$.jsxs)(me,{className:`sticky top-0 z-40 -mx-6 bg-surface-elevated/60 p-6 backdrop-blur`,children:[(0,$.jsx)(ue,{children:`Top locations`}),(0,$.jsx)(G,{children:`Where are the readers of this post`})]}),(0,$.jsx)(`div`,{className:`group/datalist`,children:(0,$.jsx)(Me,{data:e,tableHeader:!0,onLocationClick:n})})]})]})})]})})})},Pe=()=>{let e=s(),{postId:t}=o(),{statsConfig:n,isLoading:a,site:u}=xe(),{range:d,setRange:f,post:p,isPostLoading:m}=we(),{data:h}=se(),g=le(),_=(0,Q.useRef)(null),{filters:y,setFilters:b}=ie({supportedFields:re,trackingSource:`post-analytics`}),S=(0,Q.useMemo)(()=>Ce(y.find(e=>e.field===`audience`)?.values),[y]);(0,Q.useEffect)(()=>{!m&&p?.email_only&&e(`/posts/analytics/${t}`)},[m,p?.email_only,e,t]);let C=(0,Q.useMemo)(()=>{if(!p?.published_at)return de.allTime.value;let e=ye(p.published_at),{startDate:t,endDate:n}=J(d);return n.diff(t,`days`)+1>e?e:d},[p?.published_at,d]),{startDate:w,endDate:T,timezone:E}=J(C),D=(0,Q.useCallback)(()=>{let e=l(_.current);e&&e.scrollTo({top:0,behavior:`smooth`})},[]),O=(0,Q.useMemo)(()=>{let e={};return y.forEach(t=>{let n=t.field,r=t.values;if(n===`audience`)return;let i=r&&r.length>0&&r[0]!==null&&r[0]!==void 0,a=n===`source`&&r?.[0]===``;if(i&&(r[0]!==``||a)){let t=String(r[0]);e[n]=t}}),e},[y]),k=(0,Q.useCallback)((e,t)=>{b(n=>n.find(t=>t.field===e)?n.map(n=>n.field===e?{...n,values:[t]}:n):[...n,oe(e,`is`,[t])]),D()},[b,D]),A=(0,Q.useCallback)(e=>k(`location`,e),[k]),j=(0,Q.useCallback)(e=>k(`source`,e),[k]),M=(0,Q.useMemo)(()=>{let e={site_uuid:n?.id||``,date_from:Y(w),date_to:Y(T),timezone:E,member_status:Se(S),post_uuid:``,...O};return!m&&p?.uuid?{...e,post_uuid:p.uuid}:e},[m,p,n?.id,w,T,E,S,O]),{data:N,loading:P}=r({endpoint:`api_kpis`,statsConfig:n,params:M}),{data:F,loading:I}=r({endpoint:`api_top_locations`,statsConfig:n,params:M}),{data:L,loading:R}=r({endpoint:`api_top_sources`,statsConfig:n,params:M}),z=(0,Q.useMemo)(()=>F?.reduce((e,t)=>e+Number(t.visits),0)||0,[F]),B=(0,Q.useMemo)(()=>L?L.reduce((e,t)=>e+Number(t.visits||0),0):0,[L]),V=u.url,H=u.icon,U=(0,Q.useMemo)(()=>{let e=F?.map(e=>({location:String(e.location),visits:Number(e.visits),percentage:z>0?Number(e.visits)/z:0,isUnknown:ce.includes(String(e.location))}))||[],t=e.filter(e=>!e.isUnknown),n=e.filter(e=>e.isUnknown),r=n.length>0?[{location:`Unknown`,visits:n.reduce((e,t)=>e+t.visits,0),percentage:n.reduce((e,t)=>e+t.percentage,0)}]:[];return[...t,...r]},[F,z]),W=a||m||P||I||R,G=Z(N),K=y.length>0;return h?.settings&&!g?(0,$.jsx)(c,{to:`/posts/analytics/${t}`,replace:!0}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(Ee,{currentTab:`Web`,children:[K&&(0,$.jsx)(i,{children:(0,$.jsx)(q,{range:d,onRangeChange:f})}),(0,$.jsxs)(i,{className:`${K?`mt-0! [grid-area:subactions] lg:mt-[25px]!`:`[grid-area:actions]`}`,children:[(0,$.jsx)(ne,{filters:y,postUuid:p?.uuid,range:d,onChange:b}),!K&&(0,$.jsx)(q,{range:d,onRangeChange:f})]})]}),(0,$.jsx)(Te,{ref:_,children:W?(0,$.jsx)(x,{className:`size-full`,variant:`plain`,children:(0,$.jsx)(v,{className:`size-full items-center justify-center`,children:(0,$.jsx)(ae,{})})}):N&&N.length!==0&&G.visits!==`0`?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(Oe,{data:N,range:C}),(0,$.jsxs)(`div`,{className:`flex flex-col gap-6 lg:grid lg:grid-cols-2`,children:[(0,$.jsx)(Ne,{data:U,isLoading:I,onLocationClick:A}),(0,$.jsx)(De,{data:L,range:C,siteIcon:H,siteUrl:V,totalVisitors:B,onSourceClick:j})]})]}):(0,$.jsx)(`div`,{className:`grow`,children:(0,$.jsx)(te,{className:`h-full`,description:`Try adjusting filters to see more data.`,title:`No visitors ${ve(d)}`,children:(0,$.jsx)(ee,{strokeWidth:1.5})})})})]})};export{Pe as default};
@@ -1 +1 @@
1
- (function(){try{var e=typeof window<`u`?window:typeof global<`u`?global:typeof globalThis<`u`?globalThis:typeof self<`u`?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]=`d148ed6f-3f17-4158-9515-ea46afef1ef9`,e._sentryDebugIdIdentifier=`sentry-dbid-d148ed6f-3f17-4158-9515-ea46afef1ef9`)}catch{}})();import{i as e,s as t,t as n}from"./react-C9lG_SsT.js";import{g as r,m as i}from"./hooks-C-BDQ6Hs.js";import{t as a}from"./jsx-runtime-Bm2_KH-0.js";import{Nr as o,t as s}from"./button-CTHYSI-d.js";import{i as c,n as l,r as u,t as d}from"./action-list-CGRkUA1s.js";import{t as f}from"./use-host-limits-CNh4AAEs.js";import{t as p}from"./settings-modal-3x4v8abr.js";import{t as ee}from"./brand-icon-BFOhZhQt.js";import{t as m}from"./use-settings-navigation-CO2nUqDW.js";import{n as h}from"./confirmation-context-By_jX_cA.js";import{n as te}from"./integrations-BRo5DwA5.js";import{t as ne}from"./api-keys-COZMaKEL.js";import{t as re}from"./integration-header-CrqD-b0Z.js";import{t as ie}from"./api-keys-CoeerpwI.js";var ae=``+new URL(`zapier-logo-D8a11oW_.svg`,import.meta.url).href,g=t(n(),1),_=a(),v=(e,t)=>`${e}-${t}`,y=()=>{let[e,t]=(0,g.useState)(``),[n,r]=(0,g.useState)(!1),i=(0,g.useRef)(new Map),[a,o]=(0,g.useState)(new Set),s=t=>t.length?t.some(t=>t.toLowerCase().includes(e.toLowerCase())):!0,c=(0,g.useCallback)((t,n)=>{i.current.set(t,n),(!e||n.some(t=>t.toLowerCase().includes(e.toLowerCase())))&&o(e=>new Set(e).add(t))},[e]),l=(0,g.useCallback)(e=>{i.current.delete(e),o(t=>{let n=new Set(t);return n.delete(e),n})},[]);(0,g.useEffect)(()=>{let t=new Set;i.current.forEach((n,r)=>{(!e||n.some(t=>t.toLowerCase().includes(e.toLowerCase())))&&t.add(r)}),o(t)},[e]);let u=(0,g.useCallback)(e=>a.size===1&&a.has(e),[a]),d=(0,g.useCallback)(()=>a,[a]),f=t=>{if(!e)return t;if(typeof t==`string`){let n=e.split(/\s+/).map(e=>e.toLowerCase()),r=n.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`),i=t.split(RegExp(`(${r})`,`gi`)),a=new Map;return i.map(e=>{if(!n.includes(e.toLowerCase()))return e;let t=(a.get(e)??0)+1;return a.set(e,t),(0,_.jsx)(`span`,{className:`bg-yellow-500/40`,children:e},`${e}-${t}`)})}else if(Array.isArray(t))return t.map(e=>f(e));else if(t&&typeof t==`object`&&t)return g.Children.map(t,e=>e&&typeof e==`object`&&`props`in e?f(e.props.children):e);else return t};return{filter:e,setFilter:t,checkVisible:s,highlightKeywords:f,noResult:n,setNoResult:r,registerComponent:c,unregisterComponent:l,getVisibleComponents:d,isOnlyVisibleComponent:u}},b=``+new URL(`Alto-DoS3yH_j.png`,import.meta.url).href,x=``+new URL(`Bulletin-BUpcurG5.png`,import.meta.url).href,S=``+new URL(`Casper-ASA9Ix4v.png`,import.meta.url).href,C=``+new URL(`Dawn-aeEVEPie.png`,import.meta.url).href,w=``+new URL(`Digest-DJl0U_FG.png`,import.meta.url).href,T=``+new URL(`Dope-D_CgP0p0.png`,import.meta.url).href,E=``+new URL(`Ease-B4NuA7sj.png`,import.meta.url).href,D=``+new URL(`Edge-BPZxvKka.png`,import.meta.url).href,O=``+new URL(`Edition-cIDLjlhj.png`,import.meta.url).href,k=``+new URL(`Episode-D7bgV2bY.png`,import.meta.url).href,A=``+new URL(`Headline-BFXOunIb.png`,import.meta.url).href,j=``+new URL(`Journal-D3UW9T2b.png`,import.meta.url).href,M=``+new URL(`London-CSCVHwS0.png`,import.meta.url).href,N=``+new URL(`Ruby-DVEXVMTx.png`,import.meta.url).href,P=``+new URL(`Solo-c-yPo0gw.png`,import.meta.url).href,F=``+new URL(`Source-V-WXZXnS.png`,import.meta.url).href,I=``+new URL(`Source-Magazine-Czq1p0a_.png`,import.meta.url).href,L=``+new URL(`Source-Newsletter-CwTcfhJ-.png`,import.meta.url).href,R=``+new URL(`Taste-U2cRR2yO.png`,import.meta.url).href,z=``+new URL(`Wave-DE2aI-FM.png`,import.meta.url).href,B=[{name:`Source`,category:`News`,previewUrl:`https://source.ghost.io/`,ref:`default`,image:F,variants:[{category:`Magazine`,previewUrl:`https://source-magazine.ghost.io/`,image:I},{category:`Newsletter`,previewUrl:`https://source-newsletter.ghost.io/`,image:L}]},{name:`Casper`,category:`Blog`,previewUrl:`https://demo.ghost.io/`,ref:`TryGhost/Casper`,image:S},{name:`Edition`,category:`Newsletter`,url:`https://github.com/TryGhost/Edition`,previewUrl:`https://edition.ghost.io/`,ref:`TryGhost/Edition`,image:O},{name:`Solo`,category:`Blog`,url:`https://github.com/TryGhost/Solo`,previewUrl:`https://solo.ghost.io`,ref:`TryGhost/Solo`,image:P},{name:`Taste`,category:`Blog`,url:`https://github.com/TryGhost/Taste`,previewUrl:`https://taste.ghost.io`,ref:`TryGhost/Taste`,image:R},{name:`Episode`,category:`Podcast`,url:`https://github.com/TryGhost/Episode`,previewUrl:`https://episode.ghost.io`,ref:`TryGhost/Episode`,image:k},{name:`Digest`,category:`Newsletter`,url:`https://github.com/TryGhost/Digest`,previewUrl:`https://digest.ghost.io/`,ref:`TryGhost/Digest`,image:w},{name:`Bulletin`,category:`Newsletter`,url:`https://github.com/TryGhost/Bulletin`,previewUrl:`https://bulletin.ghost.io/`,ref:`TryGhost/Bulletin`,image:x},{name:`Alto`,category:`Blog`,url:`https://github.com/TryGhost/Alto`,previewUrl:`https://alto.ghost.io`,ref:`TryGhost/Alto`,image:b},{name:`Dope`,category:`Magazine`,url:`https://github.com/TryGhost/Dope`,previewUrl:`https://dope.ghost.io`,ref:`TryGhost/Dope`,image:T},{name:`Wave`,category:`Podcast`,url:`https://github.com/TryGhost/Wave`,previewUrl:`https://wave.ghost.io`,ref:`TryGhost/Wave`,image:z},{name:`Edge`,category:`Photography`,url:`https://github.com/TryGhost/Edge`,previewUrl:`https://edge.ghost.io`,ref:`TryGhost/Edge`,image:D},{name:`Dawn`,category:`Newsletter`,url:`https://github.com/TryGhost/Dawn`,previewUrl:`https://dawn.ghost.io/`,ref:`TryGhost/Dawn`,image:C},{name:`Ease`,category:`Documentation`,url:`https://github.com/TryGhost/Ease`,previewUrl:`https://ease.ghost.io`,ref:`TryGhost/Ease`,image:E},{name:`Headline`,category:`News`,url:`https://github.com/TryGhost/Headline`,previewUrl:`https://headline.ghost.io`,ref:`TryGhost/Headline`,image:A},{name:`Ruby`,category:`Magazine`,url:`https://github.com/TryGhost/Ruby`,previewUrl:`https://ruby.ghost.io`,ref:`TryGhost/Ruby`,image:N},{name:`London`,category:`Photography`,url:`https://github.com/TryGhost/London`,previewUrl:`https://london.ghost.io`,ref:`TryGhost/London`,image:M},{name:`Journal`,category:`Newsletter`,url:`https://github.com/TryGhost/Journal`,previewUrl:`https://journal.ghost.io/`,ref:`TryGhost/Journal`,image:j}],V=``+new URL(`ghost-orb-bYPPSSAp.png`,import.meta.url).href,H=``+new URL(`orb-black-2-C-rcujeh.png`,import.meta.url).href,U=``+new URL(`orb-black-3-DTkwRv_1.png`,import.meta.url).href,W=``+new URL(`orb-black-4-BXF3fMuE.png`,import.meta.url).href,G=``+new URL(`orb-black-5-94Eda1ek.png`,import.meta.url).href,K=`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201818.2%202500'%20style='enable-background:new%200%200%201818.2%202500'%20xml:space='preserve'%3e%3ctitle%3egoogle-docs%3c/title%3e%3cpath%20d='M1136.4%200h-966C79.6%200%200%2079.5%200%20170.5v2159.1c0%2090.9%2079.5%20170.5%20170.5%20170.5h1477.3c90.9%200%20170.5-79.5%20170.5-170.5V681.8l-397.7-284.1L1136.4%200z'%20style='fill:%234285f4'/%3e%3cpath%20d='M454.5%201818.2h909.1v-113.6h-909l-.1%20113.6zm0%20227.3h681.8v-113.6H454.5v113.6zm0-795.5v113.6h909.1V1250H454.5zm0%20340.9h909.1v-113.6h-909l-.1%20113.6z'%20style='fill:%23f1f1f1'/%3e%3cpath%20d='M1136.4%200v511.4c0%2090.9%2079.5%20170.4%20170.4%20170.4h511.4L1136.4%200z'%20style='fill:%23a1c2fa'/%3e%3c/svg%3e`,q=``+new URL(`mailchimp-DwTEN-tS.svg`,import.meta.url).href,J=`data:image/svg+xml,%3csvg%20height='546'%20viewBox='0%200%20569%20546'%20width='569'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3epatreon%3c/title%3e%3cg%20fill='%23FF424D'%3e%3ccircle%20cx='362.59'%20cy='204.59'%20data-fill='1'%20r='204.59'/%3e%3cpath%20data-fill='1'%20d='M0%200h100v545.8H0z'/%3e%3c/g%3e%3c/svg%3e`,Y=`data:image/svg+xml,%3csvg%20width='152'%20height='179'%20viewBox='0%200%20152%20179'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3epaypal%3c/title%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cpath%20d='M136.492%2045.453c2.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27l-2.365%2015a4.168%204.168%200%200%200%204.118%204.818H69.76a6.948%206.948%200%200%200%206.863-5.865l.283-1.468%205.442-34.507.351-1.907a6.947%206.947%200%200%201%206.862-5.865h4.322c27.984%200%2049.896-11.37%2056.299-44.25%202.675-13.74%201.292-25.208-5.783-33.27-2.14-2.439-4.802-4.455-7.907-6.1'%20fill='%23238EC2'/%3e%3cpath%20d='M136.492%2045.453c2.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27l8.609-54.588-.267%201.711c.609-3.86%203.909-6.704%207.817-6.704h16.288c31.989%200%2057.037-12.996%2064.356-50.582.217-1.113.402-2.191.568-3.251'%20fill='%2320274F'/%3e%3cpath%20d='M56.978%2045.638a6.945%206.945%200%200%201%206.863-5.866h43.514c5.155%200%209.961.337%2014.356%201.045%201.256.202%202.478.435%203.665.698a53.92%2053.92%200%200%201%203.455.885c.558.162%201.106.333%201.646.512%202.157.717%204.166%201.562%206.015%202.541%202.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27L56.978%2045.638'%20fill='%23253667'/%3e%3c/g%3e%3c/svg%3e`,oe=``+new URL(`slackicon-37ETtpm7.png`,import.meta.url).href,se=`data:image/svg+xml,%3csvg%20width='86'%20height='89'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3etypeform%3c/title%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cpath%20d='M40.28%2087.561c12.464.154%2021.16-3.994%2030.135-12.175%208.975-8.18%2014.306-16.867%2014.741-28.73.436-11.862-3.412-21.43-12.564-30.581C63.441%206.923%2051.64.9%2039.4.899%2027.158.898%2018.967%206.252%2011.385%2016.07c-7.581%209.818-9.237%2022.212-9.894%2033.921-.657%2011.71-1.15%2017.111%206.608%2024.625%207.758%207.514%2019.718%2012.791%2032.182%2012.945z'%20stroke='%23262627'/%3e%3cpath%20d='M29.136%2037.976v-4.885h25.918v4.885H44.679v27.998H39.51V37.976z'%20fill='%23262627'%20fill-rule='nonzero'/%3e%3c/g%3e%3c/svg%3e`,ce=``+new URL(`zero-bounce-lzY95s9E.png`,import.meta.url).href,X=[{ghostImage:H,appImage:oe,title:`Share scheduled posts with your team in Slack`,url:`https://zapier.com/webintent/create-zap?template=359499`},{ghostImage:U,appImage:J,title:`Connect Patreon to your Ghost membership site`,url:`https://zapier.com/webintent/create-zap?template=75801`},{ghostImage:W,appImage:ce,title:`Protect email delivery with email verification`,url:`https://zapier.com/webintent/create-zap?template=359415`},{ghostImage:G,appImage:Y,title:`Add members for successful sales in PayPal`,url:`https://zapier.com/webintent/create-zap?template=184423`},{ghostImage:U,appImage:Y,title:`Unsubscribe members who cancel a subscription in PayPal`,url:`https://zapier.com/webintent/create-zap?template=359348`},{ghostImage:V,appImage:K,title:`Send new post drafts from Google Docs to Ghost`,url:`https://zapier.com/webintent/create-zap?template=50924`},{ghostImage:W,appImage:se,title:`Survey new members using Typeform`,url:`https://zapier.com/webintent/create-zap?template=359407`},{ghostImage:V,appImage:q,title:`Sync email subscribers in Ghost + Mailchimp`,url:`https://zapier.com/webintent/create-zap?template=359342`}],Z=(0,g.createContext)({officialThemes:B,zapierTemplates:X,search:{filter:``,setFilter:()=>{},checkVisible:()=>!0,highlightKeywords:()=>``,noResult:!1,setNoResult:()=>{},registerComponent:()=>{},unregisterComponent:()=>{},getVisibleComponents:()=>new Set,isOnlyVisibleComponent:()=>!1},sortingState:[],offersShowArchived:!1,setOffersShowArchived:()=>{}}),Q=()=>(0,g.useContext)(Z),le=()=>Q().officialThemes,$=()=>Q().search,ue=()=>Q().upgradeStatus,de=()=>{let{sortingState:e,setSortingState:t}=Q();return{sortingState:e,setSortingState:t}},fe=()=>{let{offersShowArchived:e,setOffersShowArchived:t}=Q();return{offersShowArchived:e,setOffersShowArchived:t}},pe=e({default:()=>me});function me(){let{updateRoute:e}=m(),{zapierTemplates:t}=Q(),{data:{integrations:n}={integrations:[]}}=te(),{mutateAsync:a}=ie(),v=r(),{confirm:y}=h(),[b,x]=(0,g.useState)(!1),S=f()?.customIntegrations?.disabled,C=n.find(({slug:e})=>e===`zapier`),w=C?.api_keys?.find(e=>e.type===`admin`);return(0,g.useEffect)(()=>{S&&e(`integrations`)},[S,e]),(0,_.jsxs)(p,{cancelLabel:``,footer:(0,_.jsxs)(`div`,{className:`mx-8 flex w-full items-center justify-between`,children:[(0,_.jsxs)(`a`,{className:`mt-1 self-baseline font-bold`,href:`https://zapier.com/apps/ghost/integrations?utm_medium=partner_api&utm_source=widget&utm_campaign=Widget`,rel:`noopener noreferrer`,target:`_blank`,children:[`View more Ghost integrations powered by`,` `,(0,_.jsx)(`span`,{children:(0,_.jsx)(`img`,{alt:`Zapier`,className:`relative top-[-2px] inline-block`,src:ae})})]}),(0,_.jsx)(s,{type:`button`,onClick:()=>{e(`integrations`)},children:`Close`})]}),okLabel:`Close`,okVariant:`default`,testId:`zapier-modal`,title:``,stickyFooter:!0,onClose:()=>{e(`integrations`)},onOk:()=>{e(`integrations`)},children:[(0,_.jsx)(re,{detail:`Automation for your favorite apps`,extra:(0,_.jsx)(`div`,{className:`mt-1 -mb-4`,children:(0,_.jsx)(ne,{keys:[{id:`admin-api-key`,label:`Admin API key`,text:w?.secret,hint:b?(0,_.jsx)(`div`,{className:`text-green`,children:`Admin API Key was successfully regenerated`}):void 0,onRegenerate:()=>{!C||!w||(x(!1),y({title:`Regenerate Admin API Key`,prompt:`You will need to locate the Ghost App within your Zapier account and click on "Reconnect" to enter the new Admin API Key.`,okLabel:`Regenerate Admin API Key`,onOk:async e=>{try{await a({integrationId:C.id,apiKeyId:w.id}),x(!0),e?.remove()}catch(e){v(e)}}}))}},{id:`api-url`,label:`API URL`,text:window.location.origin+i().subdir}]})}),icon:(0,_.jsx)(ee,{name:`zapier`,size:56}),title:`Zapier`}),(0,_.jsx)(d,{children:t.map(e=>(0,_.jsxs)(l,{hover:!1,children:[(0,_.jsx)(c,{className:`flex items-center gap-3 py-2 pl-3`,children:(0,_.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center`,children:[(0,_.jsxs)(`div`,{className:`flex shrink-0 flex-nowrap items-center gap-2`,children:[(0,_.jsx)(`img`,{className:`size-8 object-contain dark:invert`,role:`presentation`,src:e.ghostImage}),(0,_.jsx)(o,{className:`size-3`}),(0,_.jsx)(`img`,{className:`size-8 object-contain`,role:`presentation`,src:e.appImage})]}),(0,_.jsx)(`span`,{children:e.title})]})}),(0,_.jsx)(u,{visibility:`hover`,children:(0,_.jsx)(s,{className:`h-auto p-0 font-semibold whitespace-nowrap text-[#FF4A00] hover:text-[#FF4A00]`,variant:`link`,asChild:!0,children:(0,_.jsx)(`a`,{href:e.url,rel:`noopener noreferrer`,target:`_blank`,children:`Use this Zap`})})})]},e.url))})]})}export{$ as a,X as c,y as d,le as i,B as l,Z as n,de as o,fe as r,ue as s,pe as t,v as u};
1
+ (function(){try{var e=typeof window<`u`?window:typeof global<`u`?global:typeof globalThis<`u`?globalThis:typeof self<`u`?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]=`1b31d1a3-e174-4c3e-8996-8f59d2ad570b`,e._sentryDebugIdIdentifier=`sentry-dbid-1b31d1a3-e174-4c3e-8996-8f59d2ad570b`)}catch{}})();import{i as e,s as t,t as n}from"./react-C9lG_SsT.js";import{g as r,m as i}from"./hooks-0r7qxGEo.js";import{t as a}from"./jsx-runtime-Bm2_KH-0.js";import{Nr as o,t as s}from"./button-CTHYSI-d.js";import{i as c,n as l,r as u,t as d}from"./action-list-CGRkUA1s.js";import{t as f}from"./use-host-limits-BZx7rzRI.js";import{t as p}from"./settings-modal-3x4v8abr.js";import{t as ee}from"./brand-icon-BFOhZhQt.js";import{t as m}from"./use-settings-navigation-CO2nUqDW.js";import{n as h}from"./confirmation-context-By_jX_cA.js";import{n as te}from"./integrations-Deg9-u8X.js";import{t as ne}from"./api-keys-COZMaKEL.js";import{t as re}from"./integration-header-CrqD-b0Z.js";import{t as ie}from"./api-keys-CqKJHuAV.js";var ae=``+new URL(`zapier-logo-D8a11oW_.svg`,import.meta.url).href,g=t(n(),1),_=a(),v=(e,t)=>`${e}-${t}`,y=()=>{let[e,t]=(0,g.useState)(``),[n,r]=(0,g.useState)(!1),i=(0,g.useRef)(new Map),[a,o]=(0,g.useState)(new Set),s=t=>t.length?t.some(t=>t.toLowerCase().includes(e.toLowerCase())):!0,c=(0,g.useCallback)((t,n)=>{i.current.set(t,n),(!e||n.some(t=>t.toLowerCase().includes(e.toLowerCase())))&&o(e=>new Set(e).add(t))},[e]),l=(0,g.useCallback)(e=>{i.current.delete(e),o(t=>{let n=new Set(t);return n.delete(e),n})},[]);(0,g.useEffect)(()=>{let t=new Set;i.current.forEach((n,r)=>{(!e||n.some(t=>t.toLowerCase().includes(e.toLowerCase())))&&t.add(r)}),o(t)},[e]);let u=(0,g.useCallback)(e=>a.size===1&&a.has(e),[a]),d=(0,g.useCallback)(()=>a,[a]),f=t=>{if(!e)return t;if(typeof t==`string`){let n=e.split(/\s+/).map(e=>e.toLowerCase()),r=n.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`),i=t.split(RegExp(`(${r})`,`gi`)),a=new Map;return i.map(e=>{if(!n.includes(e.toLowerCase()))return e;let t=(a.get(e)??0)+1;return a.set(e,t),(0,_.jsx)(`span`,{className:`bg-yellow-500/40`,children:e},`${e}-${t}`)})}else if(Array.isArray(t))return t.map(e=>f(e));else if(t&&typeof t==`object`&&t)return g.Children.map(t,e=>e&&typeof e==`object`&&`props`in e?f(e.props.children):e);else return t};return{filter:e,setFilter:t,checkVisible:s,highlightKeywords:f,noResult:n,setNoResult:r,registerComponent:c,unregisterComponent:l,getVisibleComponents:d,isOnlyVisibleComponent:u}},b=``+new URL(`Alto-DoS3yH_j.png`,import.meta.url).href,x=``+new URL(`Bulletin-BUpcurG5.png`,import.meta.url).href,S=``+new URL(`Casper-ASA9Ix4v.png`,import.meta.url).href,C=``+new URL(`Dawn-aeEVEPie.png`,import.meta.url).href,w=``+new URL(`Digest-DJl0U_FG.png`,import.meta.url).href,T=``+new URL(`Dope-D_CgP0p0.png`,import.meta.url).href,E=``+new URL(`Ease-B4NuA7sj.png`,import.meta.url).href,D=``+new URL(`Edge-BPZxvKka.png`,import.meta.url).href,O=``+new URL(`Edition-cIDLjlhj.png`,import.meta.url).href,k=``+new URL(`Episode-D7bgV2bY.png`,import.meta.url).href,A=``+new URL(`Headline-BFXOunIb.png`,import.meta.url).href,j=``+new URL(`Journal-D3UW9T2b.png`,import.meta.url).href,M=``+new URL(`London-CSCVHwS0.png`,import.meta.url).href,N=``+new URL(`Ruby-DVEXVMTx.png`,import.meta.url).href,P=``+new URL(`Solo-c-yPo0gw.png`,import.meta.url).href,F=``+new URL(`Source-V-WXZXnS.png`,import.meta.url).href,I=``+new URL(`Source-Magazine-Czq1p0a_.png`,import.meta.url).href,L=``+new URL(`Source-Newsletter-CwTcfhJ-.png`,import.meta.url).href,R=``+new URL(`Taste-U2cRR2yO.png`,import.meta.url).href,z=``+new URL(`Wave-DE2aI-FM.png`,import.meta.url).href,B=[{name:`Source`,category:`News`,previewUrl:`https://source.ghost.io/`,ref:`default`,image:F,variants:[{category:`Magazine`,previewUrl:`https://source-magazine.ghost.io/`,image:I},{category:`Newsletter`,previewUrl:`https://source-newsletter.ghost.io/`,image:L}]},{name:`Casper`,category:`Blog`,previewUrl:`https://demo.ghost.io/`,ref:`TryGhost/Casper`,image:S},{name:`Edition`,category:`Newsletter`,url:`https://github.com/TryGhost/Edition`,previewUrl:`https://edition.ghost.io/`,ref:`TryGhost/Edition`,image:O},{name:`Solo`,category:`Blog`,url:`https://github.com/TryGhost/Solo`,previewUrl:`https://solo.ghost.io`,ref:`TryGhost/Solo`,image:P},{name:`Taste`,category:`Blog`,url:`https://github.com/TryGhost/Taste`,previewUrl:`https://taste.ghost.io`,ref:`TryGhost/Taste`,image:R},{name:`Episode`,category:`Podcast`,url:`https://github.com/TryGhost/Episode`,previewUrl:`https://episode.ghost.io`,ref:`TryGhost/Episode`,image:k},{name:`Digest`,category:`Newsletter`,url:`https://github.com/TryGhost/Digest`,previewUrl:`https://digest.ghost.io/`,ref:`TryGhost/Digest`,image:w},{name:`Bulletin`,category:`Newsletter`,url:`https://github.com/TryGhost/Bulletin`,previewUrl:`https://bulletin.ghost.io/`,ref:`TryGhost/Bulletin`,image:x},{name:`Alto`,category:`Blog`,url:`https://github.com/TryGhost/Alto`,previewUrl:`https://alto.ghost.io`,ref:`TryGhost/Alto`,image:b},{name:`Dope`,category:`Magazine`,url:`https://github.com/TryGhost/Dope`,previewUrl:`https://dope.ghost.io`,ref:`TryGhost/Dope`,image:T},{name:`Wave`,category:`Podcast`,url:`https://github.com/TryGhost/Wave`,previewUrl:`https://wave.ghost.io`,ref:`TryGhost/Wave`,image:z},{name:`Edge`,category:`Photography`,url:`https://github.com/TryGhost/Edge`,previewUrl:`https://edge.ghost.io`,ref:`TryGhost/Edge`,image:D},{name:`Dawn`,category:`Newsletter`,url:`https://github.com/TryGhost/Dawn`,previewUrl:`https://dawn.ghost.io/`,ref:`TryGhost/Dawn`,image:C},{name:`Ease`,category:`Documentation`,url:`https://github.com/TryGhost/Ease`,previewUrl:`https://ease.ghost.io`,ref:`TryGhost/Ease`,image:E},{name:`Headline`,category:`News`,url:`https://github.com/TryGhost/Headline`,previewUrl:`https://headline.ghost.io`,ref:`TryGhost/Headline`,image:A},{name:`Ruby`,category:`Magazine`,url:`https://github.com/TryGhost/Ruby`,previewUrl:`https://ruby.ghost.io`,ref:`TryGhost/Ruby`,image:N},{name:`London`,category:`Photography`,url:`https://github.com/TryGhost/London`,previewUrl:`https://london.ghost.io`,ref:`TryGhost/London`,image:M},{name:`Journal`,category:`Newsletter`,url:`https://github.com/TryGhost/Journal`,previewUrl:`https://journal.ghost.io/`,ref:`TryGhost/Journal`,image:j}],V=``+new URL(`ghost-orb-bYPPSSAp.png`,import.meta.url).href,H=``+new URL(`orb-black-2-C-rcujeh.png`,import.meta.url).href,U=``+new URL(`orb-black-3-DTkwRv_1.png`,import.meta.url).href,W=``+new URL(`orb-black-4-BXF3fMuE.png`,import.meta.url).href,G=``+new URL(`orb-black-5-94Eda1ek.png`,import.meta.url).href,K=`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201818.2%202500'%20style='enable-background:new%200%200%201818.2%202500'%20xml:space='preserve'%3e%3ctitle%3egoogle-docs%3c/title%3e%3cpath%20d='M1136.4%200h-966C79.6%200%200%2079.5%200%20170.5v2159.1c0%2090.9%2079.5%20170.5%20170.5%20170.5h1477.3c90.9%200%20170.5-79.5%20170.5-170.5V681.8l-397.7-284.1L1136.4%200z'%20style='fill:%234285f4'/%3e%3cpath%20d='M454.5%201818.2h909.1v-113.6h-909l-.1%20113.6zm0%20227.3h681.8v-113.6H454.5v113.6zm0-795.5v113.6h909.1V1250H454.5zm0%20340.9h909.1v-113.6h-909l-.1%20113.6z'%20style='fill:%23f1f1f1'/%3e%3cpath%20d='M1136.4%200v511.4c0%2090.9%2079.5%20170.4%20170.4%20170.4h511.4L1136.4%200z'%20style='fill:%23a1c2fa'/%3e%3c/svg%3e`,q=``+new URL(`mailchimp-DwTEN-tS.svg`,import.meta.url).href,J=`data:image/svg+xml,%3csvg%20height='546'%20viewBox='0%200%20569%20546'%20width='569'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3epatreon%3c/title%3e%3cg%20fill='%23FF424D'%3e%3ccircle%20cx='362.59'%20cy='204.59'%20data-fill='1'%20r='204.59'/%3e%3cpath%20data-fill='1'%20d='M0%200h100v545.8H0z'/%3e%3c/g%3e%3c/svg%3e`,Y=`data:image/svg+xml,%3csvg%20width='152'%20height='179'%20viewBox='0%200%20152%20179'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3epaypal%3c/title%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cpath%20d='M136.492%2045.453c2.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27l-2.365%2015a4.168%204.168%200%200%200%204.118%204.818H69.76a6.948%206.948%200%200%200%206.863-5.865l.283-1.468%205.442-34.507.351-1.907a6.947%206.947%200%200%201%206.862-5.865h4.322c27.984%200%2049.896-11.37%2056.299-44.25%202.675-13.74%201.292-25.208-5.783-33.27-2.14-2.439-4.802-4.455-7.907-6.1'%20fill='%23238EC2'/%3e%3cpath%20d='M136.492%2045.453c2.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27l8.609-54.588-.267%201.711c.609-3.86%203.909-6.704%207.817-6.704h16.288c31.989%200%2057.037-12.996%2064.356-50.582.217-1.113.402-2.191.568-3.251'%20fill='%2320274F'/%3e%3cpath%20d='M56.978%2045.638a6.945%206.945%200%200%201%206.863-5.866h43.514c5.155%200%209.961.337%2014.356%201.045%201.256.202%202.478.435%203.665.698a53.92%2053.92%200%200%201%203.455.885c.558.162%201.106.333%201.646.512%202.157.717%204.166%201.562%206.015%202.541%202.179-13.894-.015-23.348-7.53-31.911C120.688%204.114%20105.741.075%2086.617.075H31.105a7.943%207.943%200%200%200-7.846%206.705L.144%20153.36a4.765%204.765%200%200%200%204.707%205.507h34.27L56.978%2045.638'%20fill='%23253667'/%3e%3c/g%3e%3c/svg%3e`,oe=``+new URL(`slackicon-37ETtpm7.png`,import.meta.url).href,se=`data:image/svg+xml,%3csvg%20width='86'%20height='89'%20xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3etypeform%3c/title%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cpath%20d='M40.28%2087.561c12.464.154%2021.16-3.994%2030.135-12.175%208.975-8.18%2014.306-16.867%2014.741-28.73.436-11.862-3.412-21.43-12.564-30.581C63.441%206.923%2051.64.9%2039.4.899%2027.158.898%2018.967%206.252%2011.385%2016.07c-7.581%209.818-9.237%2022.212-9.894%2033.921-.657%2011.71-1.15%2017.111%206.608%2024.625%207.758%207.514%2019.718%2012.791%2032.182%2012.945z'%20stroke='%23262627'/%3e%3cpath%20d='M29.136%2037.976v-4.885h25.918v4.885H44.679v27.998H39.51V37.976z'%20fill='%23262627'%20fill-rule='nonzero'/%3e%3c/g%3e%3c/svg%3e`,ce=``+new URL(`zero-bounce-lzY95s9E.png`,import.meta.url).href,X=[{ghostImage:H,appImage:oe,title:`Share scheduled posts with your team in Slack`,url:`https://zapier.com/webintent/create-zap?template=359499`},{ghostImage:U,appImage:J,title:`Connect Patreon to your Ghost membership site`,url:`https://zapier.com/webintent/create-zap?template=75801`},{ghostImage:W,appImage:ce,title:`Protect email delivery with email verification`,url:`https://zapier.com/webintent/create-zap?template=359415`},{ghostImage:G,appImage:Y,title:`Add members for successful sales in PayPal`,url:`https://zapier.com/webintent/create-zap?template=184423`},{ghostImage:U,appImage:Y,title:`Unsubscribe members who cancel a subscription in PayPal`,url:`https://zapier.com/webintent/create-zap?template=359348`},{ghostImage:V,appImage:K,title:`Send new post drafts from Google Docs to Ghost`,url:`https://zapier.com/webintent/create-zap?template=50924`},{ghostImage:W,appImage:se,title:`Survey new members using Typeform`,url:`https://zapier.com/webintent/create-zap?template=359407`},{ghostImage:V,appImage:q,title:`Sync email subscribers in Ghost + Mailchimp`,url:`https://zapier.com/webintent/create-zap?template=359342`}],Z=(0,g.createContext)({officialThemes:B,zapierTemplates:X,search:{filter:``,setFilter:()=>{},checkVisible:()=>!0,highlightKeywords:()=>``,noResult:!1,setNoResult:()=>{},registerComponent:()=>{},unregisterComponent:()=>{},getVisibleComponents:()=>new Set,isOnlyVisibleComponent:()=>!1},sortingState:[],offersShowArchived:!1,setOffersShowArchived:()=>{}}),Q=()=>(0,g.useContext)(Z),le=()=>Q().officialThemes,$=()=>Q().search,ue=()=>Q().upgradeStatus,de=()=>{let{sortingState:e,setSortingState:t}=Q();return{sortingState:e,setSortingState:t}},fe=()=>{let{offersShowArchived:e,setOffersShowArchived:t}=Q();return{offersShowArchived:e,setOffersShowArchived:t}},pe=e({default:()=>me});function me(){let{updateRoute:e}=m(),{zapierTemplates:t}=Q(),{data:{integrations:n}={integrations:[]}}=te(),{mutateAsync:a}=ie(),v=r(),{confirm:y}=h(),[b,x]=(0,g.useState)(!1),S=f()?.customIntegrations?.disabled,C=n.find(({slug:e})=>e===`zapier`),w=C?.api_keys?.find(e=>e.type===`admin`);return(0,g.useEffect)(()=>{S&&e(`integrations`)},[S,e]),(0,_.jsxs)(p,{cancelLabel:``,footer:(0,_.jsxs)(`div`,{className:`mx-8 flex w-full items-center justify-between`,children:[(0,_.jsxs)(`a`,{className:`mt-1 self-baseline font-bold`,href:`https://zapier.com/apps/ghost/integrations?utm_medium=partner_api&utm_source=widget&utm_campaign=Widget`,rel:`noopener noreferrer`,target:`_blank`,children:[`View more Ghost integrations powered by`,` `,(0,_.jsx)(`span`,{children:(0,_.jsx)(`img`,{alt:`Zapier`,className:`relative top-[-2px] inline-block`,src:ae})})]}),(0,_.jsx)(s,{type:`button`,onClick:()=>{e(`integrations`)},children:`Close`})]}),okLabel:`Close`,okVariant:`default`,testId:`zapier-modal`,title:``,stickyFooter:!0,onClose:()=>{e(`integrations`)},onOk:()=>{e(`integrations`)},children:[(0,_.jsx)(re,{detail:`Automation for your favorite apps`,extra:(0,_.jsx)(`div`,{className:`mt-1 -mb-4`,children:(0,_.jsx)(ne,{keys:[{id:`admin-api-key`,label:`Admin API key`,text:w?.secret,hint:b?(0,_.jsx)(`div`,{className:`text-green`,children:`Admin API Key was successfully regenerated`}):void 0,onRegenerate:()=>{!C||!w||(x(!1),y({title:`Regenerate Admin API Key`,prompt:`You will need to locate the Ghost App within your Zapier account and click on "Reconnect" to enter the new Admin API Key.`,okLabel:`Regenerate Admin API Key`,onOk:async e=>{try{await a({integrationId:C.id,apiKeyId:w.id}),x(!0),e?.remove()}catch(e){v(e)}}}))}},{id:`api-url`,label:`API URL`,text:window.location.origin+i().subdir}]})}),icon:(0,_.jsx)(ee,{name:`zapier`,size:56}),title:`Zapier`}),(0,_.jsx)(d,{children:t.map(e=>(0,_.jsxs)(l,{hover:!1,children:[(0,_.jsx)(c,{className:`flex items-center gap-3 py-2 pl-3`,children:(0,_.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center`,children:[(0,_.jsxs)(`div`,{className:`flex shrink-0 flex-nowrap items-center gap-2`,children:[(0,_.jsx)(`img`,{className:`size-8 object-contain dark:invert`,role:`presentation`,src:e.ghostImage}),(0,_.jsx)(o,{className:`size-3`}),(0,_.jsx)(`img`,{className:`size-8 object-contain`,role:`presentation`,src:e.appImage})]}),(0,_.jsx)(`span`,{children:e.title})]})}),(0,_.jsx)(u,{visibility:`hover`,children:(0,_.jsx)(s,{className:`h-auto p-0 font-semibold whitespace-nowrap text-[#FF4A00] hover:text-[#FF4A00]`,variant:`link`,asChild:!0,children:(0,_.jsx)(`a`,{href:e.url,rel:`noopener noreferrer`,target:`_blank`,children:`Use this Zap`})})})]},e.url))})]})}export{$ as a,X as c,y as d,le as i,B as l,Z as n,de as o,fe as r,ue as s,pe as t,v as u};
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <link rel="stylesheet" href="./assets/vendor-3bf602dfa6463c3400ffd81697767274.css">
5
5
  <link rel="stylesheet" href="./assets/ghost-9e0c57ee9999504f74dd7d09fae9419b.css">
6
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.68%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%22f58f8dd191%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%226271394482%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D">
6
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.69%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%22520a6bb472%22%2C%22activitypubFilename%22%3A%22activitypub.js%22%2C%22activitypubHash%22%3A%22cd3aa56f15%22%2C%22activitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D">
7
7
 
8
8
  <meta charset="UTF-8" />
9
9
 
@@ -20,18 +20,18 @@
20
20
 
21
21
  <link rel="shortcut icon" href="./assets/favicon-C_q1KHzv.ico" />
22
22
  <link rel="apple-touch-icon" href="./assets/apple-touch-icon-DhO18_4B.png" />
23
- <script type="module" crossorigin src="./assets/index-CuDhPtkB.js"></script>
23
+ <script type="module" crossorigin src="./assets/index-RuRs_qGS.js"></script>
24
24
  <link rel="modulepreload" crossorigin href="./assets/react-C9lG_SsT.js">
25
25
  <link rel="modulepreload" crossorigin href="./assets/react-dom-t7VxfrkA.js">
26
26
  <link rel="modulepreload" crossorigin href="./assets/jsx-runtime-Bm2_KH-0.js">
27
27
  <link rel="modulepreload" crossorigin href="./assets/framework-provider-CIvHFnik.js">
28
28
  <link rel="modulepreload" crossorigin href="./assets/dist-pogVoW2G.js">
29
- <link rel="modulepreload" crossorigin href="./assets/hooks-C-BDQ6Hs.js">
29
+ <link rel="modulepreload" crossorigin href="./assets/hooks-0r7qxGEo.js">
30
30
  <link rel="modulepreload" crossorigin href="./assets/src-BwdakGcc.js">
31
31
  <link rel="modulepreload" crossorigin href="./assets/update-queries-sbOKc6_E.js">
32
- <link rel="modulepreload" crossorigin href="./assets/users-CzgQKbfO.js">
33
- <link rel="modulepreload" crossorigin href="./assets/members-Cj_BUZUL.js">
34
- <link rel="modulepreload" crossorigin href="./assets/config-B3HuCo0y.js">
32
+ <link rel="modulepreload" crossorigin href="./assets/users-CKJaAxEJ.js">
33
+ <link rel="modulepreload" crossorigin href="./assets/members-CH6KeXQc.js">
34
+ <link rel="modulepreload" crossorigin href="./assets/config-CRAZ4Civ.js">
35
35
  <link rel="modulepreload" crossorigin href="./assets/preload-helper-Ba4JejZL.js">
36
36
  <link rel="modulepreload" crossorigin href="./assets/chunk-OB3PAWPO-D3muQBsq.js">
37
37
  <link rel="modulepreload" crossorigin href="./assets/shade-provider-DvrXKKQZ.js">
@@ -44,7 +44,7 @@
44
44
  <link rel="modulepreload" crossorigin href="./assets/lazy-component-DNJLzmpQ.js">
45
45
  <link rel="modulepreload" crossorigin href="./assets/button-CTHYSI-d.js">
46
46
  <link rel="modulepreload" crossorigin href="./assets/list-return-state-B91WMz_J.js">
47
- <link rel="modulepreload" crossorigin href="./assets/api-BLteQZ7W.js">
47
+ <link rel="modulepreload" crossorigin href="./assets/api-BFocMbDg.js">
48
48
  <link rel="modulepreload" crossorigin href="./assets/dist-xChRm5l0.js">
49
49
  <link rel="modulepreload" crossorigin href="./assets/accordion-BB5V0RD1.js">
50
50
  <link rel="modulepreload" crossorigin href="./assets/es2015-8TGMBpHz.js">
@@ -64,26 +64,26 @@
64
64
  <link rel="modulepreload" crossorigin href="./assets/loading-indicator-DaRyGrxv.js">
65
65
  <link rel="modulepreload" crossorigin href="./assets/no-value-label-CKNmidLC.js">
66
66
  <link rel="modulepreload" crossorigin href="./assets/use-navigate-with-base-path-pweMCFf6.js">
67
- <link rel="modulepreload" crossorigin href="./assets/use-activity-pub-queries-Gy9_locM.js">
68
- <link rel="modulepreload" crossorigin href="./assets/content-formatters-VqvNA7Pv.js">
69
- <link rel="modulepreload" crossorigin href="./assets/onboarding-SGscZLIc.js">
70
- <link rel="modulepreload" crossorigin href="./assets/onboarding-4TxbZb90.js">
67
+ <link rel="modulepreload" crossorigin href="./assets/use-activity-pub-queries-BgR1USeY.js">
68
+ <link rel="modulepreload" crossorigin href="./assets/content-formatters-C08JJbUJ.js">
69
+ <link rel="modulepreload" crossorigin href="./assets/onboarding-bMq3R8jB.js">
70
+ <link rel="modulepreload" crossorigin href="./assets/onboarding-Bpo1yTzA.js">
71
71
  <link rel="modulepreload" crossorigin href="./assets/index.module-CnPepLB9.js">
72
- <link rel="modulepreload" crossorigin href="./assets/routes-DrnhmKTT.js">
72
+ <link rel="modulepreload" crossorigin href="./assets/routes-DKfpFMfF.js">
73
73
  <link rel="modulepreload" crossorigin href="./assets/empty-indicator-BhVwqSVH.js">
74
74
  <link rel="modulepreload" crossorigin href="./assets/input-group-DL5EFP5r.js">
75
- <link rel="modulepreload" crossorigin href="./assets/tags-ZhqbPPc6.js">
76
- <link rel="modulepreload" crossorigin href="./assets/posts-Lg-p_ZHg.js">
75
+ <link rel="modulepreload" crossorigin href="./assets/tags-OlmRJ6Ps.js">
76
+ <link rel="modulepreload" crossorigin href="./assets/posts-CftunZgV.js">
77
77
  <link rel="modulepreload" crossorigin href="./assets/multi-select-combobox-BzBMUFst.js">
78
- <link rel="modulepreload" crossorigin href="./assets/labels-BVGLgdAj.js">
79
- <link rel="modulepreload" crossorigin href="./assets/pages-Cbq1M2kG.js">
80
- <link rel="modulepreload" crossorigin href="./assets/tiers-D7aGzwZ-.js">
81
- <link rel="modulepreload" crossorigin href="./assets/label-picker-GTIIlBQ6.js">
78
+ <link rel="modulepreload" crossorigin href="./assets/labels-BCj6D_nl.js">
79
+ <link rel="modulepreload" crossorigin href="./assets/pages-Bm-zFXyP.js">
80
+ <link rel="modulepreload" crossorigin href="./assets/tiers-DlvS8D6_.js">
81
+ <link rel="modulepreload" crossorigin href="./assets/label-picker-DaivLdMw.js">
82
82
  <link rel="modulepreload" crossorigin href="./assets/schemas-21VB7GGY.js">
83
83
  <link rel="modulepreload" crossorigin href="./assets/iso-B3K0cJod.js">
84
- <link rel="modulepreload" crossorigin href="./assets/themes-pOHHvnkt.js">
85
- <link rel="modulepreload" crossorigin href="./assets/reload-CZ-KP3IQ.js">
86
- <link rel="stylesheet" crossorigin href="./assets/index-z8-nEVdb.css">
84
+ <link rel="modulepreload" crossorigin href="./assets/themes-CPJSMo_W.js">
85
+ <link rel="modulepreload" crossorigin href="./assets/reload-D0fnKoCm.js">
86
+ <link rel="stylesheet" crossorigin href="./assets/index-B02LJqc8.css">
87
87
  </head>
88
88
  <body class="react-admin">
89
89
  <div id="admin-alerts"></div>
@@ -104,8 +104,8 @@
104
104
  <div id="ember-notifications-wormhole"></div>
105
105
  <script src="./assets/vendor-3bd6810a31926284c0dda888502e81e9.js"></script>
106
106
  <script src="./assets/chunk.675.5577e1ad1530cfd25d08.js"></script>
107
- <script src="./assets/chunk.476.53b5794a67d68111e0bf.js"></script>
108
- <script src="./assets/chunk.524.94ab17e1199b4c3f4615.js"></script>
109
- <script src="./assets/ghost-63bc7da4336844000c523a5a0819531e.js"></script>
107
+ <script src="./assets/chunk.837.e1454abc054e1fba1fe5.js"></script>
108
+ <script src="./assets/chunk.524.e24d68bc6253b274b726.js"></script>
109
+ <script src="./assets/ghost-ffde29676517b768b1aef5ec8d492418.js"></script>
110
110
  </body>
111
111
  </html>
@@ -1,14 +1,16 @@
1
- const { Color } = require('@tryghost/color-utils');
2
-
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.color_to_rgba = color_to_rgba;
4
+ const color_utils_1 = require("@tryghost/color-utils");
3
5
  // eslint-disable-next-line camelcase
4
- module.exports = function color_to_rgba(color, alpha) {
5
- const backgroundColor = typeof color === 'string' && color.trim() ? color.trim() : '#15171A';
6
- const opacity = Number.isFinite(alpha) ? alpha : Number.parseFloat(alpha);
7
- const normalizedOpacity = Number.isFinite(opacity) ? Math.max(0, Math.min(1, opacity)) : 0.25;
8
-
9
- try {
10
- return new Color(backgroundColor).alpha(normalizedOpacity).rgb().string();
11
- } catch (err) {
12
- return 'rgba(21, 23, 26, 0.25)';
13
- }
14
- };
6
+ function color_to_rgba(color, alpha) {
7
+ const backgroundColor = typeof color === 'string' && color.trim() ? color.trim() : '#15171A';
8
+ const opacity = typeof alpha === 'number' && Number.isFinite(alpha) ? alpha : Number.parseFloat(String(alpha));
9
+ const normalizedOpacity = Number.isFinite(opacity) ? Math.max(0, Math.min(1, opacity)) : 0.25;
10
+ try {
11
+ return new color_utils_1.Color(backgroundColor).alpha(normalizedOpacity).rgb().string();
12
+ }
13
+ catch {
14
+ return 'rgba(21, 23, 26, 0.25)';
15
+ }
16
+ }
@@ -1,24 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.facebook_url = facebook_url;
1
4
  // # Facebook URL Helper
2
5
  // Usage: `{{facebook_url}}` or `{{facebook_url author.facebook}}`
3
6
  //
4
7
  // Output a url for a facebook username
5
- const { socialUrls } = require('../services/proxy');
6
- const { localUtils } = require('../services/handlebars');
7
-
8
+ // @ts-expect-error JavaScript module has no type declarations.
9
+ const proxy_1 = require("../services/proxy");
10
+ // @ts-expect-error JavaScript module has no type declarations.
11
+ const handlebars_1 = require("../services/handlebars");
12
+ function isFacebookUrlOptions(value) {
13
+ return typeof value === 'object' && value !== null && 'data' in value;
14
+ }
8
15
  // We use the name facebook_url to match the helper for consistency:
9
16
  /**
10
17
  * @deprecated Use {{social_url type="facebook"}} instead.
11
18
  */
12
19
  // eslint-disable-next-line camelcase
13
- module.exports = function facebook_url(username, options) {
14
- if (!options) {
15
- options = username;
16
- username = localUtils.findKey('facebook', this, options.data.site);
17
- }
18
-
19
- if (username) {
20
- return socialUrls.facebook(username);
21
- }
22
-
23
- return null;
24
- };
20
+ function facebook_url(usernameOrOptions, options) {
21
+ let username;
22
+ if (!options) {
23
+ if (!isFacebookUrlOptions(usernameOrOptions)) {
24
+ return null;
25
+ }
26
+ options = usernameOrOptions;
27
+ username = handlebars_1.localUtils.findKey('facebook', this, options.data.site);
28
+ }
29
+ else if (typeof usernameOrOptions === 'string') {
30
+ username = usernameOrOptions;
31
+ }
32
+ if (username) {
33
+ return proxy_1.socialUrls.facebook(username);
34
+ }
35
+ return null;
36
+ }
@@ -15,7 +15,7 @@ const isChunkMap = (chunks) =>
15
15
  _.isPlainObject(chunks) && Object.values(chunks).every((chunk) => typeof chunk === 'string');
16
16
 
17
17
  /**
18
- * Card assets are built ahead of time by scripts/build-card-assets.mjs, which
18
+ * Card assets are built ahead of time by scripts/build-card-assets.mts, which
19
19
  * minifies every card's CSS/JS into a manifest. The only per-site variable is
20
20
  * which cards the active theme asked for, so serving is a matter of picking
21
21
  * chunks out of the manifest and concatenating them.
@@ -6,7 +6,7 @@ exports.registerGhostHelpers = () => {
6
6
  registry.registerHelper('body_class', require('../../helpers/body_class'));
7
7
  registry.registerHelper('cancel_link', require('../../helpers/cancel_link'));
8
8
  registry.registerHelper('collection', require('../../helpers/collection'));
9
- registry.registerHelper('color_to_rgba', require('../../helpers/color_to_rgba'));
9
+ registry.registerHelper('color_to_rgba', require('../../helpers/color_to_rgba').color_to_rgba);
10
10
  registry.registerHelper('comment_count', require('../../helpers/comment_count'));
11
11
  registry.registerHelper('comments', require('../../helpers/comments'));
12
12
  registry.registerHelper('concat', require('../../helpers/concat'));
@@ -17,7 +17,7 @@ exports.registerGhostHelpers = () => {
17
17
  registry.registerHelper('date', require('../../helpers/date'));
18
18
  registry.registerHelper('encode', require('../../helpers/encode'));
19
19
  registry.registerHelper('excerpt', require('../../helpers/excerpt'));
20
- registry.registerHelper('facebook_url', require('../../helpers/facebook_url'));
20
+ registry.registerHelper('facebook_url', require('../../helpers/facebook_url').facebook_url);
21
21
  registry.registerHelper('foreach', require('../../helpers/foreach'));
22
22
  registry.registerHelper('get', require('../../helpers/get'));
23
23
  registry.registerHelper('ghost_foot', require('../../helpers/ghost_foot'));
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const app_installations_1 = require("../../services/app-installations");
4
+ const noCacheInvalidation = { cacheInvalidate: false };
5
+ const controller = {
6
+ docName: 'app_installations',
7
+ browse: {
8
+ headers: noCacheInvalidation,
9
+ permissions: true,
10
+ async query() {
11
+ return { data: await app_installations_1.service.browse() };
12
+ },
13
+ },
14
+ read: {
15
+ headers: noCacheInvalidation,
16
+ options: ['id'],
17
+ validation: { options: { id: { required: true } } },
18
+ permissions: true,
19
+ query(frame) {
20
+ return app_installations_1.service.read(frame.options.id);
21
+ },
22
+ },
23
+ destroy: {
24
+ statusCode: 204,
25
+ headers: noCacheInvalidation,
26
+ options: ['id'],
27
+ validation: { options: { id: { required: true } } },
28
+ permissions: true,
29
+ query(frame) {
30
+ return app_installations_1.service.uninstall((0, app_installations_1.actingContext)(frame.options.context), frame.options.id);
31
+ },
32
+ },
33
+ };
34
+ // The API framework loads this file with `require()`, so it exports CommonJS-style;
35
+ // `export default` would not be picked up.
36
+ module.exports = controller;
@@ -41,7 +41,7 @@ const errors_1 = __importDefault(require("@tryghost/errors"));
41
41
  const automationsApi = __importStar(require("../../services/automations/automations-api"));
42
42
  // @ts-expect-error This module lacks type definitions.
43
43
  const labs_1 = __importDefault(require("../../../shared/labs"));
44
- const MAX_AUTOMATIONS = 20;
44
+ const MAX_AUTOMATIONS = 50;
45
45
  const assertCanAddAutomations = () => {
46
46
  if (!labs_1.default.isSet('automations') || !labs_1.default.isSet('automationsPerTier')) {
47
47
  throw new errors_1.default.NotFoundError({ message: 'Creating automations is not enabled.' });
@@ -336,6 +336,10 @@ module.exports = {
336
336
  return apiFramework.pipeline(require('./gifts-members'), localUtils, 'members');
337
337
  },
338
338
 
339
+ get appInstallations() {
340
+ return apiFramework.pipeline(require('./app-installations'), localUtils);
341
+ },
342
+
339
343
  get giftLinks() {
340
344
  return apiFramework.pipeline(require('./gift-links'), localUtils);
341
345
  },
@@ -68,6 +68,8 @@ const BACKUP_TABLES = [
68
68
  'gift_deliveries',
69
69
  'gifts',
70
70
  'gift_links',
71
+ 'app_installations',
72
+ 'app_installation_manifests',
71
73
  'post_gift_links',
72
74
  'automations',
73
75
  'automation_actions',
@@ -0,0 +1,40 @@
1
+ const { combineTransactionalMigrations, addPermissionWithRoles } = require('../../utils');
2
+
3
+ const RESOURCE = 'app_installation';
4
+
5
+ // An app acts with the access of the staff user who is signed in, so only
6
+ // Administrators (and the Owner, who needs no grant) manage apps. Integrations get none.
7
+ module.exports = combineTransactionalMigrations(
8
+ addPermissionWithRoles(
9
+ {
10
+ name: 'Browse app installations',
11
+ action: 'browse',
12
+ object: RESOURCE,
13
+ },
14
+ ['Administrator'],
15
+ ),
16
+ addPermissionWithRoles(
17
+ {
18
+ name: 'Read app installations',
19
+ action: 'read',
20
+ object: RESOURCE,
21
+ },
22
+ ['Administrator'],
23
+ ),
24
+ addPermissionWithRoles(
25
+ {
26
+ name: 'Add app installations',
27
+ action: 'add',
28
+ object: RESOURCE,
29
+ },
30
+ ['Administrator'],
31
+ ),
32
+ addPermissionWithRoles(
33
+ {
34
+ name: 'Delete app installations',
35
+ action: 'destroy',
36
+ object: RESOURCE,
37
+ },
38
+ ['Administrator'],
39
+ ),
40
+ );
@@ -829,6 +829,26 @@
829
829
  "name": "Remove all gift links",
830
830
  "action_type": "removeAll",
831
831
  "object_type": "gift_link"
832
+ },
833
+ {
834
+ "name": "Browse app installations",
835
+ "action_type": "browse",
836
+ "object_type": "app_installation"
837
+ },
838
+ {
839
+ "name": "Read app installations",
840
+ "action_type": "read",
841
+ "object_type": "app_installation"
842
+ },
843
+ {
844
+ "name": "Add app installations",
845
+ "action_type": "add",
846
+ "object_type": "app_installation"
847
+ },
848
+ {
849
+ "name": "Delete app installations",
850
+ "action_type": "destroy",
851
+ "object_type": "app_installation"
832
852
  }
833
853
  ]
834
854
  },
@@ -992,6 +1012,7 @@
992
1012
  "collection": "all",
993
1013
  "recommendation": "all",
994
1014
  "gift_link": "all",
1015
+ "app_installation": "all",
995
1016
  "automation": ["browse", "read", "edit", "add"],
996
1017
  "identity": "read"
997
1018
  },
@@ -32,7 +32,7 @@ const schema_1 = __importDefault(require("./schema"));
32
32
  * Code that reads or writes these tables must stay dormant wherever the tables
33
33
  * are not created.
34
34
  */
35
- exports.IN_DEVELOPMENT_TABLES = [];
35
+ exports.IN_DEVELOPMENT_TABLES = ['app_installations', 'app_installation_manifests'];
36
36
  function isInDevelopmentTable(tableName) {
37
37
  return exports.IN_DEVELOPMENT_TABLES.includes(tableName);
38
38
  }
@@ -2647,4 +2647,57 @@ module.exports = {
2647
2647
  created_at: { type: 'dateTime', nullable: false },
2648
2648
  updated_at: { type: 'dateTime', nullable: true },
2649
2649
  },
2650
+ // One site's approval of one app. Still in development: see ./in-development.ts.
2651
+ //
2652
+ // A row is never deleted and never revived. Uninstalling ends it, and installing the same
2653
+ // app again adds a new row, so every past install stays on record. Who installed or
2654
+ // uninstalled an app, and when, is in `actions`.
2655
+ app_installations: {
2656
+ id: { type: 'string', maxlength: 24, nullable: false, primary: true },
2657
+ // The ID from the app's manifest. Kept on every row, installed or not.
2658
+ app_id: { type: 'string', maxlength: 191, nullable: false, index: true },
2659
+ // The same ID until the installation is uninstalled, suspended included, then null.
2660
+ // Being unique, it is what lets a site have only one installation per app however two
2661
+ // installs race, while any number of ended ones share the null.
2662
+ current_app_id: { type: 'string', maxlength: 191, nullable: true, unique: true },
2663
+ status: {
2664
+ type: 'string',
2665
+ maxlength: 50,
2666
+ nullable: false,
2667
+ validations: { isIn: [['active', 'suspended', 'uninstalled']] },
2668
+ },
2669
+ // The approved manifest, which is what runs, and a newer one waiting for approval.
2670
+ // Both point into app_installation_manifests. They are plain columns rather than
2671
+ // foreign keys, as those rows point back here, and are set in the same transaction.
2672
+ manifest_id: { type: 'string', maxlength: 24, nullable: false },
2673
+ pending_manifest_id: { type: 'string', maxlength: 24, nullable: true },
2674
+ // Goes up on every change to the installation. Open app sessions are pinned to it, so
2675
+ // any change ends them.
2676
+ revision: { type: 'integer', nullable: false, unsigned: true, defaultTo: 0 },
2677
+ created_at: { type: 'dateTime', nullable: false },
2678
+ updated_at: { type: 'dateTime', nullable: true },
2679
+ },
2680
+ // Every manifest an installation has run or been asked to approve. Still in development:
2681
+ // see ./in-development.ts.
2682
+ //
2683
+ // Append-only: a row is added when a manifest becomes an installation's approved or
2684
+ // pending one, and never changed, so the site can always tell exactly what was approved.
2685
+ app_installation_manifests: {
2686
+ id: { type: 'string', maxlength: 24, nullable: false, primary: true },
2687
+ installation_id: {
2688
+ type: 'string',
2689
+ maxlength: 24,
2690
+ nullable: false,
2691
+ references: 'app_installations.id',
2692
+ },
2693
+ // As wide as the contract's URL limit, which is what refuses a longer one.
2694
+ manifest_url: { type: 'string', maxlength: 2000, nullable: false },
2695
+ // The validated manifest, with its URLs resolved, as JSON.
2696
+ manifest: { type: 'text', maxlength: 65535, nullable: false },
2697
+ // SHA-256 of `manifest`, in hex: what a publisher reviews and confirms.
2698
+ digest: { type: 'string', maxlength: 64, nullable: false },
2699
+ // Whether this manifest had changes that needed approval when it was added.
2700
+ requires_approval: { type: 'boolean', nullable: false, defaultTo: false },
2701
+ created_at: { type: 'dateTime', nullable: false },
2702
+ },
2650
2703
  };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.afterCommit = afterCommit;
4
+ /**
5
+ * Runs `fn` once the work it follows has committed.
6
+ *
7
+ * Without a transaction each query commits as it runs, so `fn` runs now, and whatever it
8
+ * throws or returns is the caller's. Inside `transacting` it runs when that transaction
9
+ * commits, after the caller has moved on, and not at all if it rolls back; a rollback, or a
10
+ * failure in `fn`, goes to `onFailure`.
11
+ *
12
+ * Knex resolves a transaction rolled back without an error as if it had committed.
13
+ */
14
+ function afterCommit(transacting, fn, onFailure) {
15
+ if (!transacting) {
16
+ return fn();
17
+ }
18
+ transacting.executionPromise.then(() => fn()).catch(onFailure);
19
+ return undefined;
20
+ }
@@ -7,6 +7,11 @@ const MemberMetafieldResource = ghostBookshelf.Model.extend({
7
7
  tableName: 'members_metafields',
8
8
  });
9
9
 
10
+ // App installations are owned by a raw-knex service too, and need the same.
11
+ const AppInstallationResource = ghostBookshelf.Model.extend({
12
+ tableName: 'app_installations',
13
+ });
14
+
10
15
  const Action = ghostBookshelf.Model.extend(
11
16
  {
12
17
  tableName: 'actions',
@@ -27,6 +32,7 @@ const Action = ghostBookshelf.Model.extend(
27
32
  }
28
33
 
29
34
  candidates.push([MemberMetafieldResource, 'member_custom_field']);
35
+ candidates.push([AppInstallationResource, 'app_installation']);
30
36
 
31
37
  return candidates;
32
38
  },