ghost 6.63.0 → 6.64.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 (624) hide show
  1. package/bin/lib/duplicate-deps.js +204 -0
  2. package/bin/validate-adapters.js +50 -6
  3. package/components/tryghost-adapter-base-scheduling-0.2.3.tgz +0 -0
  4. package/components/tryghost-adapter-base-sso-0.1.3.tgz +0 -0
  5. package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
  6. package/components/tryghost-api-framework-0.0.0.tgz +0 -0
  7. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  8. package/components/{tryghost-kg-default-cards-10.3.5.tgz → tryghost-kg-default-cards-10.3.6.tgz} +0 -0
  9. package/components/tryghost-kg-default-nodes-2.2.1.tgz +0 -0
  10. package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
  11. package/components/tryghost-kg-lexical-html-renderer-1.5.1.tgz +0 -0
  12. package/components/tryghost-limit-service-0.0.0.tgz +0 -0
  13. package/components/tryghost-metafield-types-0.0.0.tgz +0 -0
  14. package/content/themes/source/assets/built/screen.css +1 -1
  15. package/content/themes/source/assets/css/screen.css +1 -1
  16. package/content/themes/source/package.json +7 -7
  17. package/core/boot.js +10 -4
  18. package/core/built/admin/assets/Combination-DWfJPcz9.js +41 -0
  19. package/core/built/admin/assets/{PolarAngleAxis-pkMyqz8g.js → PolarAngleAxis-a81ieQUO.js} +2 -2
  20. package/core/built/admin/assets/RadialBarChart-CHRBhiBN.js +1 -0
  21. package/core/built/admin/assets/_baseAssignValue-DcPokYW8.js +1 -0
  22. package/core/built/admin/assets/about-39CAfroa.js +1 -0
  23. package/core/built/admin/assets/accordion-CJmRaqK7.js +1 -0
  24. package/core/built/admin/assets/account-migration-DYf7skbb.js +1 -0
  25. package/core/built/admin/assets/action-list-Crnh-_UI.js +1 -0
  26. package/core/built/admin/assets/add-integration-modal-B12oRifD.js +1 -0
  27. package/core/built/admin/assets/add-newsletter-modal-CTvXiIqY.js +1 -0
  28. package/core/built/admin/assets/add-recommendation-modal-CJf92edY.js +1 -0
  29. package/core/built/admin/assets/analytics-PHR1Fggi.js +1 -0
  30. package/core/built/admin/assets/announcement-bar-modal-Bql0CXdp.js +1 -0
  31. package/core/built/admin/assets/api-keys-CubH-7_H.js +1 -0
  32. package/core/built/admin/assets/{api-keys-BGPzLHzA.js → api-keys-omLA6iYn.js} +1 -1
  33. package/core/built/admin/assets/{audience-ceV3XVHq.js → audience-6GXevic-.js} +1 -1
  34. package/core/built/admin/assets/automated-emails-DJQ4uNZo.js +1 -0
  35. package/core/built/admin/assets/automations-DcZSLFDU.js +1 -0
  36. package/core/built/admin/assets/automations-hDVcRPjh.js +1 -0
  37. package/core/built/admin/assets/avatar-flipboard-DiAGgshK.js +1 -0
  38. package/core/built/admin/assets/badge-qP06OT7C.js +1 -0
  39. package/core/built/admin/assets/bluesky-sharing-CJw4d4Mf.js +1 -0
  40. package/core/built/admin/assets/box-CZ_LSVSy.js +1 -0
  41. package/core/built/admin/assets/brand-icon-D3ffDYaC.js +1 -0
  42. package/core/built/admin/assets/breadcrumb-Chn1Ip_q.js +1 -0
  43. package/core/built/admin/assets/button-DvIh2Bq-.js +1 -0
  44. package/core/built/admin/assets/calendar-1QGoStFM.js +1 -0
  45. package/core/built/admin/assets/card-FHQ4D10L.js +1 -0
  46. package/core/built/admin/assets/chart-helpers-CNpA7re_.js +1 -0
  47. package/core/built/admin/assets/{chart-BrhA41Zi.js → chart-jVz9Nf9t.js} +9 -9
  48. package/core/built/admin/assets/checkbox-DKht9xMl.js +1 -0
  49. package/core/built/admin/assets/{chunk-KS7C4IRE-DCsL4i4D.js → chunk-KS7C4IRE-DhOcHQOU.js} +1 -1
  50. package/core/built/admin/assets/{chunk.254.035b85ec456ebbd7336b.js → chunk.368.22ce1b732c0b40abd3f1.js} +159 -120
  51. package/core/built/admin/assets/chunk.524.cc9be98e44890cedc8c8.js +25 -0
  52. package/core/built/admin/assets/{chunk.582.98b485f9b2802f540897.js → chunk.582.e6fe742b3217207b11a6.js} +23 -30
  53. package/core/built/admin/assets/{chunk.901.4ccc639821020230bcca.js → chunk.972.4b8c97f93d66db15e751.js} +10625 -10088
  54. package/core/built/admin/assets/clean-tracked-url-dkN05vOf.js +1 -0
  55. package/core/built/admin/assets/code-editor-view-BLQIV85-.js +1 -0
  56. package/core/built/admin/assets/code-editor-view-Cg5eJxcr.js +1 -0
  57. package/core/built/admin/assets/color-picker-DQoghc0t.js +3 -0
  58. package/core/built/admin/assets/color-picker-field-BbeK5RRs.js +1 -0
  59. package/core/built/admin/assets/combobox-weO4FBbv.js +1 -0
  60. package/core/built/admin/assets/command-DlLrCm9V.js +1 -0
  61. package/core/built/admin/assets/comments-BjTitLmP.js +1 -0
  62. package/core/built/admin/assets/components-CwL6a6As-CCRaoCeP.js +1 -0
  63. package/core/built/admin/assets/{config-kSHvwdTG.js → config-BPljH6wF.js} +1 -1
  64. package/core/built/admin/assets/confirmation-context-IyqoXVk-.js +1 -0
  65. package/core/built/admin/assets/container-DAimjOF_.js +1 -0
  66. package/core/built/admin/assets/content-api-modal-0ZjuLcQ8.js +1 -0
  67. package/core/built/admin/assets/context-menu-BtioYFrg.js +1 -0
  68. package/core/built/admin/assets/copy-field-C6ujqJlP.js +1 -0
  69. package/core/built/admin/assets/create-ghost-browse-value-source-DAZMWZNq.js +1 -0
  70. package/core/built/admin/assets/custom-integration-modal-Dm8QI_J4.js +1 -0
  71. package/core/built/admin/assets/data-list-C0CKkeWW.js +1 -0
  72. package/core/built/admin/assets/date-range-select-DrjHQdgz.js +1 -0
  73. package/core/built/admin/assets/design-and-theme-modal-CXVOzBWu.js +2 -0
  74. package/core/built/admin/assets/detail-page-QpLIL-EO.js +1 -0
  75. package/core/built/admin/assets/dirty-confirm-dialog-DWwxREGh.js +1 -0
  76. package/core/built/admin/assets/disabled-sources-indicator-CLZhMv8J.js +1 -0
  77. package/core/built/admin/assets/dist-BRQkNYN1.js +11 -0
  78. package/core/built/admin/assets/{dist-B3keLvjj.js → dist-BXHrDV19.js} +2 -2
  79. package/core/built/admin/assets/dist-Bf-HQtVL.js +1 -0
  80. package/core/built/admin/assets/dist-Bm-PB47a.js +6 -0
  81. package/core/built/admin/assets/{dist-B6bJuxL3.js → dist-C2lYC76d.js} +1 -1
  82. package/core/built/admin/assets/dist-CUwte9v_.js +1 -0
  83. package/core/built/admin/assets/dist-Cm2qbZKL.js +1 -0
  84. package/core/built/admin/assets/{dist-BtaTA7Ii.js → dist-D7yMk931.js} +1 -1
  85. package/core/built/admin/assets/{dist-zwwGt8Yf.js → dist-DNAdeRyr.js} +1 -1
  86. package/core/built/admin/assets/dist-DS6zpxid.js +1 -0
  87. package/core/built/admin/assets/dist-DVVKsyPh.js +23 -0
  88. package/core/built/admin/assets/dist-DxfQlAmn.js +1 -0
  89. package/core/built/admin/assets/dist-DziNzWI2.js +1 -0
  90. package/core/built/admin/assets/dist-FEQQAwTe.js +1 -0
  91. package/core/built/admin/assets/dist-nmRzULcD.js +1 -0
  92. package/core/built/admin/assets/domain-DBrBic6q.js +1 -0
  93. package/core/built/admin/assets/dropzone-D61QVcEY.js +5 -0
  94. package/core/built/admin/assets/edit-profile-jCqJBxqw.js +1 -0
  95. package/core/built/admin/assets/editor-8Fm4UBEd.js +8 -0
  96. package/core/built/admin/assets/editor-screen-BSX_uC2B.js +27 -0
  97. package/core/built/admin/assets/email-previews-Bs-JDhIw.js +1 -0
  98. package/core/built/admin/assets/email-sending-status-context-C76KYL1V.js +1 -0
  99. package/core/built/admin/assets/email-sending-status-provider-DnNhlIvt.js +1 -0
  100. package/core/built/admin/assets/{emails-vFMk4yYl.js → emails-CgvIIz3q.js} +1 -1
  101. package/core/built/admin/assets/{embed-signup-form-modal-DGqsORxS.js → embed-signup-form-modal-DqtBs1WE.js} +1 -1
  102. package/core/built/admin/assets/empty-indicator-L4Ql5Db7.js +1 -0
  103. package/core/built/admin/assets/en-Cx75dJv5.js +1 -0
  104. package/core/built/admin/assets/esm--rhhUGIG.js +2 -0
  105. package/core/built/admin/assets/explore-DXhDCtKw.js +1 -0
  106. package/core/built/admin/assets/feature-flag-overrides-context-CrcQKm9Z.js +1 -0
  107. package/core/built/admin/assets/feature-image-placeholder-e2q6TcH6.js +1 -0
  108. package/core/built/admin/assets/feed-mmt4noNL.js +1 -0
  109. package/core/built/admin/assets/feedback-BTPBQLT5.js +1 -0
  110. package/core/built/admin/assets/field-p7KnP98B.js +1 -0
  111. package/core/built/admin/assets/filter-bar-CiIKBg3D.js +1 -0
  112. package/core/built/admin/assets/filter-sources-I-dRaQxl.js +1 -0
  113. package/core/built/admin/assets/filters-1injvyxJ.js +1 -0
  114. package/core/built/admin/assets/filters-DnpO6GWX.js +1 -0
  115. package/core/built/admin/assets/first-promoter-modal-wr73Dldc.js +1 -0
  116. package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-CkFA8EkI.js +1 -0
  117. package/core/built/admin/assets/framework-provider-DB-svAju.js +4 -0
  118. package/core/built/admin/assets/{ghost-b4e8a403baba61905cd7560e30b9732d.js → ghost-a1e6e172c6917e8ef8fa6b0007756d9b.js} +39 -30
  119. package/core/built/admin/assets/gift-link-modal-C3H7YFXO.js +1 -0
  120. package/core/built/admin/assets/{gift-links-CfLSnst2.js → gift-links-D8gl_yJS.js} +1 -1
  121. package/core/built/admin/assets/global-data-context-3MItMry2.js +1 -0
  122. package/core/built/admin/assets/grid-5vplBYri.js +1 -0
  123. package/core/built/admin/assets/growth-B1og1kQp.js +1 -0
  124. package/core/built/admin/assets/growth-Bf6OHZlK.js +3 -0
  125. package/core/built/admin/assets/heading-BB21QAbb.js +1 -0
  126. package/core/built/admin/assets/history-modal-t_qEnxPx.js +1 -0
  127. package/core/built/admin/assets/hooks-DYfTEQLk.js +2 -0
  128. package/core/built/admin/assets/html-field-COLQbV4r.js +1 -0
  129. package/core/built/admin/assets/iframe-buffering-Bq1el-gw.js +1 -0
  130. package/core/built/admin/assets/images-4mvoc3lB.js +1 -0
  131. package/core/built/admin/assets/{inbox-gJHG7_xd.js → inbox-DgSZ6w2p.js} +34 -34
  132. package/core/built/admin/assets/index-B3HZU2i8.css +2 -0
  133. package/core/built/admin/assets/index-DDd-zhNL.js +4 -0
  134. package/core/built/admin/assets/index.es-Ct5XQNSj.js +1 -0
  135. package/core/built/admin/assets/inline-B8H6NzIw.js +1 -0
  136. package/core/built/admin/assets/input-group-CLIN2ykI.js +1 -0
  137. package/core/built/admin/assets/{input-surface-BsrIZeSF.js → input-surface-wSO5CRy5.js} +1 -1
  138. package/core/built/admin/assets/integration-header-CKGrXNVP.js +1 -0
  139. package/core/built/admin/assets/{integrations-B4kuRBFY.js → integrations-DnJrZnHv.js} +1 -1
  140. package/core/built/admin/assets/invite-user-modal-BaN2mdhI.js +1 -0
  141. package/core/built/admin/assets/jsx-runtime-BlNNh7jY.js +1 -0
  142. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +3 -3
  143. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +1 -1
  144. package/core/built/admin/assets/{koenig-lexical-CGXb0F8o.js → koenig-lexical-CXVgQFUk.js} +1 -1
  145. package/core/built/admin/assets/koenig-loader-B1XPPY5C.js +2 -0
  146. package/core/built/admin/assets/kpi-card-CRLPVlFW.js +1 -0
  147. package/core/built/admin/assets/kpi-card-CRPbW8NZ.js +1 -0
  148. package/core/built/admin/assets/kpi-helpers-D7zT96bp.js +1 -0
  149. package/core/built/admin/assets/kpi-tabs-DE_yh9Go.js +1 -0
  150. package/core/built/admin/assets/label-CgeBxy4o.js +1 -0
  151. package/core/built/admin/assets/label-picker-DGDp4Vwr.js +1 -0
  152. package/core/built/admin/assets/labels-KMkFoRG6.js +1 -0
  153. package/core/built/admin/assets/layout-DWnOMly4.js +1 -0
  154. package/core/built/admin/assets/lib-_QYaUU89.js +2 -0
  155. package/core/built/admin/assets/link-helpers-8J7ixADV.js +1 -0
  156. package/core/built/admin/assets/links-FwNCVyVe.js +1 -0
  157. package/core/built/admin/assets/list-page-DLMP0PxC.js +1 -0
  158. package/core/built/admin/assets/luxon-BXCsmep3.js +1 -0
  159. package/core/built/admin/assets/member-activity-ClMWFyvN.js +1 -0
  160. package/core/built/admin/assets/member-activity-feed-BQY5Rwaj.js +1 -0
  161. package/core/built/admin/assets/member-custom-fields-Dd_ie1zG.js +1 -0
  162. package/core/built/admin/assets/member-detail-DjwkGVne.js +1 -0
  163. package/core/built/admin/assets/members--N9lhk1N.js +4 -0
  164. package/core/built/admin/assets/modal-page-Dz-9TP4E.js +1 -0
  165. package/core/built/admin/assets/moderation-DfYBKq9s.js +1 -0
  166. package/core/built/admin/assets/multi-select-combobox-BcBEzUW_.js +1 -0
  167. package/core/built/admin/assets/navigation-modal-Cd-scywg.js +1 -0
  168. package/core/built/admin/assets/newsletter-detail-modal-CFRY6vg_.js +1 -0
  169. package/core/built/admin/assets/newsletter-emails-4ntck1AC.js +1 -0
  170. package/core/built/admin/assets/newsletter-o6eCJtab.js +1 -0
  171. package/core/built/admin/assets/newsletters-Bmlv0edG.js +1 -0
  172. package/core/built/admin/assets/{newsletters-Rq1M3GD-.js → newsletters-Dz77m__5.js} +1 -1
  173. package/core/built/admin/assets/note-CWs3LF-0.js +1 -0
  174. package/core/built/admin/assets/notifications-BjSvTJqh.js +1 -0
  175. package/core/built/admin/assets/{nql-BLpCn7qX.js → nql-DnDc7UuU.js} +1 -1
  176. package/core/built/admin/assets/nql-lang-CeTB_Bhv.js +19 -0
  177. package/core/built/admin/assets/{offers--e2nGvkW.js → offers-ByWSK0rR.js} +1 -1
  178. package/core/built/admin/assets/offers-container-modal-Bc9A196w.js +1 -0
  179. package/core/built/admin/assets/onboarding-B4hfBi9a.js +1 -0
  180. package/core/built/admin/assets/onboarding-DV_XbHts.js +1 -0
  181. package/core/built/admin/assets/onboarding-route-Di1LJYEE.js +1 -0
  182. package/core/built/admin/assets/overview-DE7NHZQN.js +1 -0
  183. package/core/built/admin/assets/overview-DEF-ZY6x.js +1 -0
  184. package/core/built/admin/assets/page-header-B-G_g42C.js +1 -0
  185. package/core/built/admin/assets/pagemenu-CnkTDO71.js +1 -0
  186. package/core/built/admin/assets/{pages-CjDY2CBI.js → pages-DZ_YGB1D.js} +1 -1
  187. package/core/built/admin/assets/pages-route-VT7r7YhG.js +1 -0
  188. package/core/built/admin/assets/papaparse.min-BlhnCUXn.js +10 -0
  189. package/core/built/admin/assets/pintura-modal-BljM7hf8.js +1 -0
  190. package/core/built/admin/assets/portal-frame-D9V8iq5x.js +1 -0
  191. package/core/built/admin/assets/portal-modal-B5OOR9ZD.js +1 -0
  192. package/core/built/admin/assets/post-analytics-context-bt2YTBAC.js +1 -0
  193. package/core/built/admin/assets/post-analytics-header-J0WciLx6.js +1 -0
  194. package/core/built/admin/assets/post-analytics-provider-CgreZDjS.js +1 -0
  195. package/core/built/admin/assets/post-analytics-rGb-PgD-.js +1 -0
  196. package/core/built/admin/assets/post-share-modal-D0BbTo4W.js +1 -0
  197. package/core/built/admin/assets/posts-list-screen-CO5jAWoU.js +2 -0
  198. package/core/built/admin/assets/posts-route-DV-CXWK9.js +1 -0
  199. package/core/built/admin/assets/{posts-pCPrhQeR.js → posts-tcoO3iRG.js} +1 -1
  200. package/core/built/admin/assets/preferences-Tac29oG6.js +5 -0
  201. package/core/built/admin/assets/preview-chrome-C2lQgZBZ.js +1 -0
  202. package/core/built/admin/assets/preview-modal-CjRbBr8U.js +1 -0
  203. package/core/built/admin/assets/profile-yiM1f_Og.js +1 -0
  204. package/core/built/admin/assets/prop-types-6lTeqvom.js +1 -0
  205. package/core/built/admin/assets/radio-group-CKROWsw4.js +1 -0
  206. package/core/built/admin/assets/react-BXwhMTuc.js +1 -0
  207. package/core/built/admin/assets/{jsx-runtime-DX3WBWVO.js → react-dom-CMOtJ5MH.js} +2 -2
  208. package/core/built/admin/assets/{referrers-D8oHPmDB.js → referrers-1R8bPpoV.js} +1 -1
  209. package/core/built/admin/assets/router-provider-CU87qxXw.js +1 -0
  210. package/core/built/admin/assets/select-CKaC4ggu.js +1 -0
  211. package/core/built/admin/assets/settings-81kxUa28.js +1 -0
  212. package/core/built/admin/assets/settings-BVXFqBVK.js +4 -0
  213. package/core/built/admin/assets/settings-breadcrumbs-czGRx-iu.js +1 -0
  214. package/core/built/admin/assets/{shade-app-CcS3f8MZ-vwURazk8.js → shade-app-CcS3f8MZ-D5BnfHck.js} +1 -1
  215. package/core/built/admin/assets/share-modal-BL-16PiB.js +1 -0
  216. package/core/built/admin/assets/skeleton-DwCva0-b.js +1 -0
  217. package/core/built/admin/assets/slack-modal-D7W_fNON.js +1 -0
  218. package/core/built/admin/assets/sort-button-Dquc83jY.js +1 -0
  219. package/core/built/admin/assets/source-icon-CQboPZQ3.js +1 -0
  220. package/core/built/admin/assets/stack-BURz77VS.js +1 -0
  221. package/core/built/admin/assets/{stats-D9PDLS3x.js → stats-Cvp8Ep5m.js} +1 -1
  222. package/core/built/admin/assets/stats-view-NDja_g96.js +1 -0
  223. package/core/built/admin/assets/step-1-BKhjy0PV.js +1 -0
  224. package/core/built/admin/assets/step-2-PxA1OM7R.js +1 -0
  225. package/core/built/admin/assets/step-3-BJbAiq16.js +2 -0
  226. package/core/built/admin/assets/stripe-button-C3cfCAou.js +1 -0
  227. package/core/built/admin/assets/stripe-connect-modal-FyE3Ey2c.js +1 -0
  228. package/core/built/admin/assets/switch-zfUUy9Jh.js +1 -0
  229. package/core/built/admin/assets/table-dE4GTIRT.js +1 -0
  230. package/core/built/admin/assets/tabs-B3XK93sR.js +1 -0
  231. package/core/built/admin/assets/tag-detail-D4P-tZdM.js +2 -0
  232. package/core/built/admin/assets/tag-picker-BNSZ6Qxw.js +1 -0
  233. package/core/built/admin/assets/tags-BsZcaJ6h.js +1 -0
  234. package/core/built/admin/assets/{tags-ChfdwJyS.js → tags-NwZ7BPK6.js} +1 -1
  235. package/core/built/admin/assets/testimonials-modal-Dkt6ODLW.js +1 -0
  236. package/core/built/admin/assets/text-DC-ot6u2.js +1 -0
  237. package/core/built/admin/assets/textarea-B4FffFmE.js +1 -0
  238. package/core/built/admin/assets/themes-DtcEFQWm.js +1 -0
  239. package/core/built/admin/assets/tier-detail-modal-a77Z2VMH.js +1 -0
  240. package/core/built/admin/assets/{tiers-BCpIOGQr.js → tiers-6mPzCXlM.js} +1 -1
  241. package/core/built/admin/assets/toggle-group-D2p4okmJ.js +1 -0
  242. package/core/built/admin/assets/topic-filter-DVOe3D-b.js +1 -0
  243. package/core/built/admin/assets/transistor-modal-C8RMkhOD.js +1 -0
  244. package/core/built/admin/assets/trend-badge-B9v7kMF8.js +1 -0
  245. package/core/built/admin/assets/unsplash-modal-DXt7Brum.js +1 -0
  246. package/core/built/admin/assets/use-analytics-data-ChHqiZXv.js +1 -0
  247. package/core/built/admin/assets/use-availability-hPdeG76y.js +1 -0
  248. package/core/built/admin/assets/{use-check-theme-limit-error-DRUjK4YM.js → use-check-theme-limit-error-JD-J5aaZ.js} +2 -2
  249. package/core/built/admin/assets/use-email-sending-status-DNMtL5B9.js +1 -0
  250. package/core/built/admin/assets/use-filter-params-BSFigDIn.js +1 -0
  251. package/core/built/admin/assets/use-filterable-api-CEMSAYPg.js +1 -0
  252. package/core/built/admin/assets/use-form-DJKZJhQh.js +1 -0
  253. package/core/built/admin/assets/use-growth-stats-CqqdnESN.js +1 -0
  254. package/core/built/admin/assets/use-host-limits-mpTkZIq8.js +1 -0
  255. package/core/built/admin/assets/use-limiter-DBGjYqu7.js +19 -0
  256. package/core/built/admin/assets/use-navigate-with-base-path-88EQpw2k.js +1 -0
  257. package/core/built/admin/assets/use-pintura-config-BmU45Ruy.js +1 -0
  258. package/core/built/admin/assets/use-pintura-editor-Bz2bZ4iT.js +1 -0
  259. package/core/built/admin/assets/use-post-referrers-DyPjyBSN.js +1 -0
  260. package/core/built/admin/assets/use-query-params-DlOHCo-R.js +1 -0
  261. package/core/built/admin/assets/use-reply-chain-data-DmD2yX5D.js +1 -0
  262. package/core/built/admin/assets/use-router-history-entry-CKx9LhqD.js +1 -0
  263. package/core/built/admin/assets/use-sending-eta-CQeG6OP_.js +1 -0
  264. package/core/built/admin/assets/use-setting-group-Dza6bQ7W.js +1 -0
  265. package/core/built/admin/assets/use-settings-navigation-BIjI5mL3.js +1 -0
  266. package/core/built/admin/assets/use-simple-pagination-DwVxe-Lo.js +1 -0
  267. package/core/built/admin/assets/use-staff-users-i_Mq9OGR.js +1 -0
  268. package/core/built/admin/assets/{use-tinybird-query-CmdbCS9X.js → use-tinybird-query-DXoF74NM.js} +1 -1
  269. package/core/built/admin/assets/use-tinybird-token-Lk1RSn0t.js +1 -0
  270. package/core/built/admin/assets/use-unsaved-changes-guard-CKVPWz_F.js +1 -0
  271. package/core/built/admin/assets/use-upgrade-route-CVjDlNSs.js +1 -0
  272. package/core/built/admin/assets/{use-url-input-fvp-TpPx.js → use-url-input-DpmbDppC.js} +1 -1
  273. package/core/built/admin/assets/user-detail-modal-BU4QCHE7.js +1 -0
  274. package/core/built/admin/assets/{users-DVNWrqg9.js → users-C60_hpn6.js} +1 -1
  275. package/core/built/admin/assets/{validator-Cr0sMKuW.js → validator-DlFQP70j.js} +1 -1
  276. package/core/built/admin/assets/virtual-list-DScLNuU8.js +1 -0
  277. package/core/built/admin/assets/web-BZS-t4H0.js +1 -0
  278. package/core/built/admin/assets/web-DxAUxnK3.js +2 -0
  279. package/core/built/admin/assets/zapier-modal-BafLUO4R.js +1 -0
  280. package/core/built/admin/index.html +35 -32
  281. package/core/cli/command.js +17 -2
  282. package/core/frontend/meta/asset-url.js +1 -16
  283. package/core/frontend/services/asset-hash/index.js +32 -2
  284. package/core/frontend/services/routing/controllers/unsubscribe.js +2 -1
  285. package/core/frontend/services/rss/generate-feed.js +1 -1
  286. package/core/frontend/services/theme-engine/active.js +2 -4
  287. package/core/frontend/services/theme-engine/i18n/i18n.js +11 -1
  288. package/core/frontend/services/theme-engine/i18next/theme-i18n.js +1 -1
  289. package/core/frontend/web/middleware/llms-discovery.js +34 -43
  290. package/core/server/adapters/route-settings/S3RouteSettingsStore.js +1 -1
  291. package/core/server/adapters/storage/LocalFilesStorage.js +12 -2
  292. package/core/server/adapters/storage/LocalStorageBase.js +13 -0
  293. package/core/server/api/endpoints/actions.js +2 -1
  294. package/core/server/api/endpoints/automated-emails.js +3 -2
  295. package/core/server/api/endpoints/automations.js +77 -49
  296. package/core/server/api/endpoints/emails.js +8 -3
  297. package/core/server/api/endpoints/index.js +1 -1
  298. package/core/server/api/endpoints/invites.js +2 -1
  299. package/core/server/api/endpoints/labels.js +6 -2
  300. package/core/server/api/endpoints/member-metafields.js +2 -2
  301. package/core/server/api/endpoints/members.js +22 -6
  302. package/core/server/api/endpoints/pages.js +2 -6
  303. package/core/server/api/endpoints/posts.js +3 -11
  304. package/core/server/api/endpoints/snippets.js +2 -1
  305. package/core/server/api/endpoints/tags.js +6 -2
  306. package/core/server/api/endpoints/users.js +2 -6
  307. package/core/server/api/endpoints/utils/api-filter-utils.js +62 -3
  308. package/core/server/api/endpoints/utils/serializers/output/utils/clean.js +2 -0
  309. package/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js +3 -0
  310. package/core/server/api/endpoints/utils/validators/input/settings.js +15 -1
  311. package/core/server/data/exporter/exporter.js +2 -1
  312. package/core/server/data/exporter/table-lists.js +3 -5
  313. package/core/server/data/importer/importers/data/settings-importer.js +8 -2
  314. package/core/server/data/migrations/versions/6.64/2026-09-03-15-40-25-add-member-access-to-members-metafields.js +12 -0
  315. package/core/server/data/migrations/versions/6.64/2026-09-08-11-01-12-add-posts-auto-excerpt-and-reading-time-columns.js +17 -0
  316. package/core/server/data/migrations/versions/6.64/2026-09-09-13-56-18-add-automation-run-updated-at-indexes.js +6 -0
  317. package/core/server/data/migrations/versions/6.64/2026-09-09-13-56-18-add-tinybird-syncs-table.js +10 -0
  318. package/core/server/data/schema/schema.js +28 -2
  319. package/core/server/data/seeders/importers/automations-importer.js +0 -1
  320. package/core/server/data/seeders/importers/comments-importer.js +1 -1
  321. package/core/server/data/seeders/importers/email-recipients-importer.js +1 -1
  322. package/core/server/data/seeders/importers/emails-importer.js +1 -1
  323. package/core/server/data/seeders/importers/members-importer.js +1 -1
  324. package/core/server/data/seeders/importers/members-login-events-importer.js +1 -1
  325. package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +1 -1
  326. package/core/server/data/seeders/utils/blog-info.js +4 -3
  327. package/core/server/data/seeders/utils/event-generator.js +72 -46
  328. package/core/server/data/tinybird/datasources/_mv_automation_run_steps.datasource +10 -0
  329. package/core/server/data/tinybird/datasources/_mv_automation_runs.datasource +10 -0
  330. package/core/server/data/tinybird/datasources/_mv_pending_automation_runs.datasource +10 -0
  331. package/core/server/data/tinybird/datasources/automation_run_events.datasource +12 -0
  332. package/core/server/data/tinybird/datasources/automation_run_step_events.datasource +12 -0
  333. package/core/server/data/tinybird/endpoints/api_automation_browse_stats.pipe +43 -0
  334. package/core/server/data/tinybird/fixtures/automation_run_events.ndjson +7 -0
  335. package/core/server/data/tinybird/fixtures/automation_run_step_events.ndjson +8 -0
  336. package/core/server/data/tinybird/pipes/mv_automation_run_steps.pipe +13 -0
  337. package/core/server/data/tinybird/pipes/mv_automation_runs.pipe +15 -0
  338. package/core/server/data/tinybird/pipes/mv_pending_automation_runs.pipe +7 -0
  339. package/core/server/data/tinybird/tests/api_automation_browse_stats.yaml +18 -0
  340. package/core/server/ghost-server.js +3 -3
  341. package/core/server/lib/generate-password.js +54 -0
  342. package/core/server/lib/public-jwk.js +77 -0
  343. package/core/server/models/user.js +11 -9
  344. package/core/server/services/adapter-manager/base-classes.js +21 -3
  345. package/core/server/services/automations/automations-api.js +46 -1
  346. package/core/server/services/automations/tinybird-automation-stats.js +56 -0
  347. package/core/server/services/content-import/import/media.js +1 -1
  348. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +15 -29
  349. package/core/server/services/email-analytics/email-analytics-service.js +19 -3
  350. package/core/server/services/email-analytics/index.js +9 -4
  351. package/core/server/services/email-rendering/finalize.js +7 -2
  352. package/core/server/services/email-service/README.md +3 -0
  353. package/core/server/services/email-service/email-renderer.js +7 -2
  354. package/core/server/services/email-service/email-service-wrapper.js +1 -1
  355. package/core/server/services/email-service/email-service.js +43 -34
  356. package/core/server/services/email-service/sending-status.js +10 -4
  357. package/core/server/services/gifts/gift-email-service.js +10 -3
  358. package/core/server/services/gifts/index.js +1 -0
  359. package/core/server/services/i18n.js +1 -1
  360. package/core/server/services/identity-tokens/identity-token-service-wrapper.js +3 -4
  361. package/core/server/services/limits.js +17 -1
  362. package/core/server/services/member-welcome-emails/service.js +1 -1
  363. package/core/server/services/members/import-export/index.js +5 -4
  364. package/core/server/services/members/members-api/controllers/router-controller.js +7 -2
  365. package/core/server/services/members/members-api/controllers/well-known-controller.js +2 -1
  366. package/core/server/services/members/members-api/repositories/event-repository.js +4 -0
  367. package/core/server/services/members/members-api/services/member-bread-service.js +15 -12
  368. package/core/server/services/members/members-api/services/token-service.js +11 -12
  369. package/core/server/services/members/middleware.js +9 -2
  370. package/core/server/services/members/request-integrity-token-provider.js +2 -1
  371. package/core/server/services/members-metafields/access.js +31 -20
  372. package/core/server/services/members-metafields/actions.js +1 -0
  373. package/core/server/services/members-metafields/codec.js +9 -2
  374. package/core/server/services/members-metafields/definitions-service.js +56 -46
  375. package/core/server/services/members-metafields/index.js +2 -2
  376. package/core/server/services/members-metafields/models.js +2 -0
  377. package/core/server/services/members-metafields/queries.js +39 -11
  378. package/core/server/services/members-metafields/schema.js +2 -0
  379. package/core/server/services/members-metafields/serializers.js +1 -0
  380. package/core/server/services/members-metafields/values-service.js +20 -11
  381. package/core/server/services/mentions/mention-discovery-service.js +1 -1
  382. package/core/server/services/mentions/mention-sending-service.js +1 -1
  383. package/core/server/services/mentions/mention.js +1 -1
  384. package/core/server/services/oembed/oembed-service.js +36 -11
  385. package/core/server/services/posts/post-scheduling.js +20 -0
  386. package/core/server/services/staff/staff-service-emails.js +5 -1
  387. package/core/server/services/stats/stats-service.js +12 -3
  388. package/core/server/services/tier-checkout-config/service.js +17 -1
  389. package/core/server/services/tinybird/tinybird-service.js +1 -0
  390. package/core/server/services/tinybird-sync/get-ingest-config.js +39 -0
  391. package/core/server/services/tinybird-sync/index.js +28 -0
  392. package/core/server/services/tinybird-sync/sync-table-to-tinybird.js +149 -0
  393. package/core/server/services/tinybird-sync/tinybird-sync-service.js +62 -0
  394. package/core/server/web/api/endpoints/admin/routes.js +33 -34
  395. package/core/server/web/well-known.js +12 -16
  396. package/core/shared/config/defaults.json +1 -2
  397. package/core/shared/{flush-logs.js → flush.js} +7 -3
  398. package/core/shared/labs.js +2 -0
  399. package/core/shared/timing-safe-string-equal.js +26 -0
  400. package/package.json +42 -42
  401. package/patches/@elastic__elasticsearch@8.19.2.patch +67 -0
  402. package/patches/juice@11.1.1.patch +46 -0
  403. package/pnpm-lock.yaml +457 -1391
  404. package/pnpm-workspace.yaml +34 -21
  405. package/scripts/prune.mts +70 -3
  406. package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
  407. package/core/built/admin/assets/Combination-B0l4MKVh.js +0 -41
  408. package/core/built/admin/assets/RadialBarChart-JAKoS4KT.js +0 -1
  409. package/core/built/admin/assets/_baseAssignValue-C_vooEQc.js +0 -1
  410. package/core/built/admin/assets/about-C1C3s5-g.js +0 -1
  411. package/core/built/admin/assets/accordion-CxGsDKwa.js +0 -1
  412. package/core/built/admin/assets/account-migration-CbUhW6gk.js +0 -1
  413. package/core/built/admin/assets/action-list-C4v0-du8.js +0 -1
  414. package/core/built/admin/assets/add-integration-modal-BT_onDJy.js +0 -1
  415. package/core/built/admin/assets/add-newsletter-modal-Cx1kQpiY.js +0 -1
  416. package/core/built/admin/assets/add-recommendation-modal-B5nvAhvr.js +0 -1
  417. package/core/built/admin/assets/analytics-DjoJWPI7.js +0 -1
  418. package/core/built/admin/assets/announcement-bar-modal-Dwd0EGFP.js +0 -1
  419. package/core/built/admin/assets/api-keys-BoeacM-s.js +0 -1
  420. package/core/built/admin/assets/automated-emails-BLesE41L.js +0 -1
  421. package/core/built/admin/assets/automations-BN4u3GR8.js +0 -1
  422. package/core/built/admin/assets/automations-C-ZTUwW3.js +0 -1
  423. package/core/built/admin/assets/avatar-flipboard-C6Kj3Awu.js +0 -1
  424. package/core/built/admin/assets/bluesky-sharing-vzh-oPXL.js +0 -1
  425. package/core/built/admin/assets/box-CdfQAP_F.js +0 -1
  426. package/core/built/admin/assets/brand-icon-CrIGOA3Z.js +0 -1
  427. package/core/built/admin/assets/breadcrumb-CaLk2b7D.js +0 -1
  428. package/core/built/admin/assets/build-CsiH26uS.js +0 -1
  429. package/core/built/admin/assets/button-Dvcv1QSR.js +0 -1
  430. package/core/built/admin/assets/calendar-Bl9RLcZX.js +0 -1
  431. package/core/built/admin/assets/card--VNbfgo3.js +0 -1
  432. package/core/built/admin/assets/chart-helpers-FHywU0pj.js +0 -1
  433. package/core/built/admin/assets/checkbox-BtayFtjg.js +0 -1
  434. package/core/built/admin/assets/chunk.524.e6975095fccdf22d90f8.js +0 -32
  435. package/core/built/admin/assets/code-editor-view-C3ZfoF1X.js +0 -1
  436. package/core/built/admin/assets/code-editor-view-CAyRWy1s.js +0 -1
  437. package/core/built/admin/assets/color-picker-G4kGR7rp.js +0 -3
  438. package/core/built/admin/assets/color-picker-field-DQFVTNnT.js +0 -1
  439. package/core/built/admin/assets/combobox-BnYzgEB4.js +0 -1
  440. package/core/built/admin/assets/command-C_vyTikI.js +0 -1
  441. package/core/built/admin/assets/comments-aBrxfnZf.js +0 -1
  442. package/core/built/admin/assets/components-CwL6a6As-B0E0-NBJ.js +0 -1
  443. package/core/built/admin/assets/confirmation-context-DwXX_Y5h.js +0 -1
  444. package/core/built/admin/assets/container-BuQG1wuP.js +0 -1
  445. package/core/built/admin/assets/content-api-modal-D2G0nJP6.js +0 -1
  446. package/core/built/admin/assets/context-menu-DOVB6yaz.js +0 -1
  447. package/core/built/admin/assets/copy-field-DCJwh9qf.js +0 -1
  448. package/core/built/admin/assets/create-ghost-browse-value-source-5C53jJaX.js +0 -1
  449. package/core/built/admin/assets/custom-field-type-option-BAuW0F-E.js +0 -1
  450. package/core/built/admin/assets/custom-integration-modal-AbJGVyKc.js +0 -1
  451. package/core/built/admin/assets/data-list-CA2jYGPq.js +0 -1
  452. package/core/built/admin/assets/date-range-select-BY3K-ukj.js +0 -1
  453. package/core/built/admin/assets/design-and-theme-modal-BvEy4_pC.js +0 -2
  454. package/core/built/admin/assets/detail-page-Dnv-CdR1.js +0 -1
  455. package/core/built/admin/assets/dirty-confirm-dialog-DVPuGz3U.js +0 -1
  456. package/core/built/admin/assets/disabled-sources-indicator-Cy7Zp4c8.js +0 -1
  457. package/core/built/admin/assets/dist-4m6pHdc0.js +0 -23
  458. package/core/built/admin/assets/dist-8YJUlf3B.js +0 -1
  459. package/core/built/admin/assets/dist-CZgIBXQN.js +0 -1
  460. package/core/built/admin/assets/dist-CiHx7vA5.js +0 -6
  461. package/core/built/admin/assets/dist-DIC8yz5C.js +0 -1
  462. package/core/built/admin/assets/dist-Dcsslyo72.js +0 -1
  463. package/core/built/admin/assets/dist-Dgt2cr6a.js +0 -1
  464. package/core/built/admin/assets/dist-ECAUrdGc.js +0 -1
  465. package/core/built/admin/assets/dist-JLOy8o0Q.js +0 -1
  466. package/core/built/admin/assets/dist-Ndy-PuGN.js +0 -1
  467. package/core/built/admin/assets/dist-Z97pCNqS.js +0 -11
  468. package/core/built/admin/assets/domain-Dl61QGuk.js +0 -1
  469. package/core/built/admin/assets/dropzone-Dtz5Rmjt.js +0 -5
  470. package/core/built/admin/assets/edit-profile-DNJSMDwm.js +0 -1
  471. package/core/built/admin/assets/editor-DbAen9zf.js +0 -8
  472. package/core/built/admin/assets/editor-screen-BFWThIai.js +0 -26
  473. package/core/built/admin/assets/email-sending-status-context-CWDOD1FN.js +0 -1
  474. package/core/built/admin/assets/email-sending-status-provider-DCPkDICt.js +0 -1
  475. package/core/built/admin/assets/empty-indicator-D9QdpuNX.js +0 -1
  476. package/core/built/admin/assets/en-B1jX3WMs.js +0 -1
  477. package/core/built/admin/assets/esm-CXo5SEPy.js +0 -2
  478. package/core/built/admin/assets/explore-nnRr1Fja.js +0 -1
  479. package/core/built/admin/assets/feature-flag-overrides-context-DQjdJFAk.js +0 -1
  480. package/core/built/admin/assets/feature-image-placeholder-BrIHmPs8.js +0 -1
  481. package/core/built/admin/assets/feed-BNUcNu-W.js +0 -1
  482. package/core/built/admin/assets/feedback-DJ4Zb9rZ.js +0 -1
  483. package/core/built/admin/assets/field-C93_Mg6j.js +0 -1
  484. package/core/built/admin/assets/filter-bar-Da1qxybu.js +0 -1
  485. package/core/built/admin/assets/filter-sources-CGJb4C5r.js +0 -1
  486. package/core/built/admin/assets/filters--kKP-EC8.js +0 -1
  487. package/core/built/admin/assets/filters-DxA_a4FP.js +0 -1
  488. package/core/built/admin/assets/first-promoter-modal-BYDtrz2S.js +0 -1
  489. package/core/built/admin/assets/focus-koenig-editor-on-bottom-click-BbSnGOtK.js +0 -1
  490. package/core/built/admin/assets/framework-provider-DqI25epG.js +0 -4
  491. package/core/built/admin/assets/gift-link-modal-B7u5bD4e.js +0 -1
  492. package/core/built/admin/assets/global-data-context-gAMDH9u1.js +0 -1
  493. package/core/built/admin/assets/grid-Dj29PY05.js +0 -1
  494. package/core/built/admin/assets/growth-Cd1uO9d2.js +0 -1
  495. package/core/built/admin/assets/growth-aG32xfdE.js +0 -3
  496. package/core/built/admin/assets/heading-Dh5SFVjL.js +0 -1
  497. package/core/built/admin/assets/history-modal-Df8lW8h-.js +0 -1
  498. package/core/built/admin/assets/hooks-Cy_-oZ4o.js +0 -2
  499. package/core/built/admin/assets/html-field-DA4eU7eq.js +0 -1
  500. package/core/built/admin/assets/iframe-buffering-B2OKJzbz.js +0 -1
  501. package/core/built/admin/assets/images-KXmyO3Ss.js +0 -1
  502. package/core/built/admin/assets/index-BHHXtR5C.css +0 -2
  503. package/core/built/admin/assets/index-CgMCwsxN.js +0 -4
  504. package/core/built/admin/assets/index.es-CY6-yuw9.js +0 -1
  505. package/core/built/admin/assets/inline-BWSs_VzR.js +0 -1
  506. package/core/built/admin/assets/input-group-BE8rM2y1.js +0 -1
  507. package/core/built/admin/assets/integration-header-Bm6IDb1A.js +0 -1
  508. package/core/built/admin/assets/invite-user-modal-B4CuNcx4.js +0 -1
  509. package/core/built/admin/assets/koenig-loader-BeM5rFPX.js +0 -2
  510. package/core/built/admin/assets/kpi-card-B21aToe8.js +0 -1
  511. package/core/built/admin/assets/kpi-card-pz6Wv4Ae.js +0 -1
  512. package/core/built/admin/assets/kpi-helpers-Dq5jelmP.js +0 -1
  513. package/core/built/admin/assets/kpi-tabs-DEZHpKUt.js +0 -1
  514. package/core/built/admin/assets/label-OLCzze8N.js +0 -1
  515. package/core/built/admin/assets/label-picker-BigOvMPV.js +0 -1
  516. package/core/built/admin/assets/labels-Dr0SgUQD.js +0 -1
  517. package/core/built/admin/assets/layout-DUTL8SH5.js +0 -1
  518. package/core/built/admin/assets/lib-7QPTI0FS.js +0 -1
  519. package/core/built/admin/assets/limit-service-BhiEvqcP.js +0 -20
  520. package/core/built/admin/assets/link-helpers-BRAg9SCj.js +0 -1
  521. package/core/built/admin/assets/links-BDHPTlyj.js +0 -1
  522. package/core/built/admin/assets/list-page-BucXJ0hi.js +0 -1
  523. package/core/built/admin/assets/luxon-D1RVjjpq.js +0 -1
  524. package/core/built/admin/assets/member-custom-fields-TRTHCAz9.js +0 -1
  525. package/core/built/admin/assets/member-detail-b6dRwc3C.js +0 -1
  526. package/core/built/admin/assets/members-Czt5lJSc.js +0 -4
  527. package/core/built/admin/assets/modal-page-xCivTMvI.js +0 -1
  528. package/core/built/admin/assets/moderation-ZWefD9uH.js +0 -1
  529. package/core/built/admin/assets/multi-select-combobox-CT13MTo-.js +0 -1
  530. package/core/built/admin/assets/navigation-modal-C8FEhBK5.js +0 -1
  531. package/core/built/admin/assets/newsletter-5VYW4RyJ.js +0 -1
  532. package/core/built/admin/assets/newsletter-detail-modal-ChjC0ZqH.js +0 -1
  533. package/core/built/admin/assets/newsletter-emails-DZH6I-PY.js +0 -1
  534. package/core/built/admin/assets/newsletters-DOC9KBcX.js +0 -1
  535. package/core/built/admin/assets/note-DIV-Pojr.js +0 -1
  536. package/core/built/admin/assets/notifications-s20-H49V.js +0 -1
  537. package/core/built/admin/assets/nql-lang-CaWrLesS.js +0 -19
  538. package/core/built/admin/assets/offers-container-modal-BmG5M5Tv.js +0 -1
  539. package/core/built/admin/assets/onboarding-CUuy9unR.js +0 -1
  540. package/core/built/admin/assets/onboarding-pXyct0Jm.js +0 -1
  541. package/core/built/admin/assets/onboarding-route-CK4pcXoR.js +0 -1
  542. package/core/built/admin/assets/overview-CaPsciMs.js +0 -1
  543. package/core/built/admin/assets/overview-a8GfcsKX.js +0 -1
  544. package/core/built/admin/assets/page-header-DM_KyoFI.js +0 -1
  545. package/core/built/admin/assets/pagemenu-vgZVUVKR.js +0 -1
  546. package/core/built/admin/assets/pages-route-BzKZYdV5.js +0 -1
  547. package/core/built/admin/assets/papaparse.min-cQwnxGCG.js +0 -10
  548. package/core/built/admin/assets/pintura-modal-DExCF1ii.js +0 -1
  549. package/core/built/admin/assets/portal-frame-Cqanidq4.js +0 -1
  550. package/core/built/admin/assets/portal-modal-oinBgA27.js +0 -1
  551. package/core/built/admin/assets/post-analytics-C5oJ1dWV.js +0 -1
  552. package/core/built/admin/assets/post-analytics-context-D0Mw-Pmv.js +0 -1
  553. package/core/built/admin/assets/post-analytics-header-OATo3X_r.js +0 -1
  554. package/core/built/admin/assets/post-analytics-provider-tOpIVGT5.js +0 -1
  555. package/core/built/admin/assets/post-share-modal-DvhC1XgV.js +0 -1
  556. package/core/built/admin/assets/posts-list-screen-o4ZjbgS3.js +0 -2
  557. package/core/built/admin/assets/posts-route-9F--xdIb.js +0 -1
  558. package/core/built/admin/assets/preferences--vNubsqD.js +0 -5
  559. package/core/built/admin/assets/preview-chrome-BljUBlOk.js +0 -1
  560. package/core/built/admin/assets/preview-modal-YYbzlYdO.js +0 -1
  561. package/core/built/admin/assets/profile-BllKV3dR.js +0 -1
  562. package/core/built/admin/assets/prop-types-DeUPn3oD.js +0 -1
  563. package/core/built/admin/assets/radio-group-DL8GI8rt.js +0 -1
  564. package/core/built/admin/assets/react-Bb3IsNbi.js +0 -1
  565. package/core/built/admin/assets/rolldown-runtime-DAXXjFlN.js +0 -1
  566. package/core/built/admin/assets/router-provider-BSvTXgZY.js +0 -1
  567. package/core/built/admin/assets/select-v5YbA3Mw.js +0 -1
  568. package/core/built/admin/assets/settings-PEsZupw1.js +0 -4
  569. package/core/built/admin/assets/settings-breadcrumbs-NwPnCTC7.js +0 -1
  570. package/core/built/admin/assets/settings-u_s1CRkr.js +0 -1
  571. package/core/built/admin/assets/share-modal-SskCmVGL.js +0 -1
  572. package/core/built/admin/assets/skeleton-Ce9GgUpf.js +0 -1
  573. package/core/built/admin/assets/slack-modal-XxSJiYgo.js +0 -1
  574. package/core/built/admin/assets/sort-button-Cx1KtINE.js +0 -1
  575. package/core/built/admin/assets/source-icon-Bdp9Im_5.js +0 -1
  576. package/core/built/admin/assets/stack-B2eszIiq.js +0 -1
  577. package/core/built/admin/assets/stats-view-W2g6Jsd-.js +0 -1
  578. package/core/built/admin/assets/step-1-BQYzvBzr.js +0 -1
  579. package/core/built/admin/assets/step-2-xES32xJV.js +0 -1
  580. package/core/built/admin/assets/step-3-DA_XK5kW.js +0 -2
  581. package/core/built/admin/assets/stripe-button-CVsLHelt.js +0 -1
  582. package/core/built/admin/assets/stripe-connect-modal-ClmLOMGS.js +0 -1
  583. package/core/built/admin/assets/switch-CI4gLWqb.js +0 -1
  584. package/core/built/admin/assets/table-BenqVupI.js +0 -1
  585. package/core/built/admin/assets/tabs-eBBlxPp8.js +0 -1
  586. package/core/built/admin/assets/tag-detail-Ce8Se2qd.js +0 -2
  587. package/core/built/admin/assets/tag-picker-C3UR-uJ-.js +0 -1
  588. package/core/built/admin/assets/tags-B-kJxCs7.js +0 -1
  589. package/core/built/admin/assets/testimonials-modal-9Q6fT06V.js +0 -1
  590. package/core/built/admin/assets/text-BQDSDsKs.js +0 -1
  591. package/core/built/admin/assets/textarea-DJ1Q5V39.js +0 -1
  592. package/core/built/admin/assets/tier-detail-modal-CDyYdqK7.js +0 -1
  593. package/core/built/admin/assets/toggle-group-CviIkyok.js +0 -1
  594. package/core/built/admin/assets/topic-filter-I2jCBGxm.js +0 -1
  595. package/core/built/admin/assets/transistor-modal-p53u3W8y.js +0 -1
  596. package/core/built/admin/assets/trend-badge-CideVzQd.js +0 -1
  597. package/core/built/admin/assets/unsplash-modal-DY8UcKcE.js +0 -1
  598. package/core/built/admin/assets/use-analytics-data-DAIGcr2f.js +0 -1
  599. package/core/built/admin/assets/use-filter-params-JkZhIS8L.js +0 -1
  600. package/core/built/admin/assets/use-filterable-api-BVEVMrhZ.js +0 -1
  601. package/core/built/admin/assets/use-form-vRjI0Kwk.js +0 -1
  602. package/core/built/admin/assets/use-growth-stats-937CUj6j.js +0 -1
  603. package/core/built/admin/assets/use-host-limits-D0Dv3tKA.js +0 -1
  604. package/core/built/admin/assets/use-limiter-CohWfzvK.js +0 -2
  605. package/core/built/admin/assets/use-navigate-with-base-path-BkxcPj5l.js +0 -1
  606. package/core/built/admin/assets/use-pintura-config-xgytjU35.js +0 -1
  607. package/core/built/admin/assets/use-pintura-editor-CaV1mbfO.js +0 -1
  608. package/core/built/admin/assets/use-post-referrers-BCQI7fDg.js +0 -1
  609. package/core/built/admin/assets/use-query-params-BfzuqbcD.js +0 -1
  610. package/core/built/admin/assets/use-reply-chain-data-CYRhoaxY.js +0 -1
  611. package/core/built/admin/assets/use-router-history-entry-NOKcd--l.js +0 -1
  612. package/core/built/admin/assets/use-setting-group-bLKMwoBT.js +0 -1
  613. package/core/built/admin/assets/use-settings-navigation-B-qrriKD.js +0 -1
  614. package/core/built/admin/assets/use-simple-pagination-CNPd6Rf6.js +0 -1
  615. package/core/built/admin/assets/use-staff-users-pRIMIyiW.js +0 -1
  616. package/core/built/admin/assets/use-tinybird-token-KLne235s.js +0 -1
  617. package/core/built/admin/assets/use-unsaved-changes-guard-7-ug0JdH.js +0 -1
  618. package/core/built/admin/assets/use-upgrade-route-Dm_qqKr0.js +0 -1
  619. package/core/built/admin/assets/user-detail-modal-D3KlGYv-.js +0 -1
  620. package/core/built/admin/assets/virtual-list-CZ3RK2Yf.js +0 -1
  621. package/core/built/admin/assets/web-ClEJsCAj.js +0 -2
  622. package/core/built/admin/assets/web-X9rdnrtq.js +0 -1
  623. package/core/built/admin/assets/zapier-modal-DfVhV17j.js +0 -1
  624. /package/core/built/admin/assets/{chunk.901.4ccc639821020230bcca.js.LICENSE.txt → chunk.972.4b8c97f93d66db15e751.js.LICENSE.txt} +0 -0
@@ -669,7 +669,11 @@ class StaffServiceEmails {
669
669
 
670
670
  const juice = require('juice');
671
671
 
672
- return juice(html, { inlinePseudoElements: true, removeStyleTags: true });
672
+ return juice(html, {
673
+ inlinePseudoElements: true,
674
+ removeStyleTags: true,
675
+ resolveCSSVariables: false,
676
+ });
673
677
  }
674
678
 
675
679
  async renderText(templateName, data) {
@@ -246,10 +246,19 @@ class StatsService {
246
246
  const request = deps.request || require('../../lib/request-external');
247
247
  const settingsCache = deps.settingsCache || require('../../../shared/settings-cache');
248
248
 
249
- if (settingsCache.get('web_analytics_enabled')) {
250
- // TODO: move the tinybird client to the tinybird service
251
- const TinybirdServiceWrapper = require('../tinybird');
249
+ const labs = deps.labs || require('../../../shared/labs');
250
+ const webAnalyticsEnabled = settingsCache.get('web_analytics_enabled');
251
+ const TinybirdServiceWrapper = require('../tinybird');
252
+
253
+ if (
254
+ webAnalyticsEnabled ||
255
+ (labs.isSet('automationsTinybirdSync') && config.get('tinybird:stats'))
256
+ ) {
252
257
  TinybirdServiceWrapper.init();
258
+ }
259
+
260
+ if (webAnalyticsEnabled) {
261
+ // TODO: move the tinybird client to the tinybird service
253
262
  tinybirdClient = require('./utils/tinybird').create({
254
263
  config,
255
264
  request,
@@ -8,11 +8,22 @@ const bson_objectid_1 = __importDefault(require("bson-objectid"));
8
8
  const errors_1 = __importDefault(require("@tryghost/errors"));
9
9
  const zod_1 = require("zod");
10
10
  const schema_1 = require("../members-metafields/schema");
11
+ const members_metafields_1 = require("../members-metafields");
11
12
  const checkout_1 = require("@tryghost/checkout");
12
13
  const codec_1 = require("./codec");
13
14
  const queries_1 = require("./queries");
14
15
  const models_1 = require("./models");
15
16
  const serializers_1 = require("./serializers");
17
+ /**
18
+ * What a member may do with a field this service creates for them.
19
+ *
20
+ * The opposite of the default a publisher-made field gets. These hold what the member
21
+ * themselves gave at checkout, and collection can be switched on while the screen for
22
+ * opening a field to members is not, since the two sit behind different flags. A closed
23
+ * default would then leave a member unable to correct their own address and nobody able
24
+ * to open it for them.
25
+ */
26
+ const COLLECTED_FIELD_ACCESS = { member: members_metafields_1.MEMBER_ACCESS.write };
16
27
  /**
17
28
  * A request states its settings in named sections: one for shipping, one for phone. Each
18
29
  * section stands for one or more of the values Stripe hands back when a checkout is
@@ -142,7 +153,12 @@ class TierCheckoutConfigService {
142
153
  });
143
154
  }
144
155
  if (!alreadyPlanned) {
145
- create.set(key, { key, name: wants.name, type: wants.type });
156
+ create.set(key, {
157
+ key,
158
+ name: wants.name,
159
+ type: wants.type,
160
+ access: COLLECTED_FIELD_ACCESS,
161
+ });
146
162
  }
147
163
  }
148
164
  return { clear, create: [...create.values()], bind: wanted };
@@ -58,6 +58,7 @@ const TINYBIRD_PIPES = [
58
58
  'api_top_utm_terms',
59
59
  'api_top_devices',
60
60
  'api_gift_link_visits',
61
+ 'api_automation_browse_stats',
61
62
  // v2 pipes (materialized view optimization)
62
63
  'api_kpis_v2',
63
64
  'api_active_visitors_v2',
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getIngestConfig = getIngestConfig;
4
+ const zod_1 = require("zod");
5
+ const StatsConfigSchema = zod_1.z.object({
6
+ id: zod_1.z.string().min(1).optional(),
7
+ });
8
+ const SiteUuidSchema = zod_1.z.string().min(1);
9
+ const SyncAuthKeySchema = zod_1.z.string().min(1);
10
+ const TrackerEndpointSchema = zod_1.z.url();
11
+ const ANALYTICS_PATH_PREFIX = '/.ghost/analytics/';
12
+ function getIngestConfig({ config, settingsCache, }) {
13
+ const trackerEndpointResult = TrackerEndpointSchema.safeParse(config.get('tinybird:tracker:endpoint'));
14
+ const syncAuthKeyResult = SyncAuthKeySchema.safeParse(config.get('tinybird:sync_auth_key'));
15
+ if (!trackerEndpointResult.success || !syncAuthKeyResult.success) {
16
+ return null;
17
+ }
18
+ const endpoint = new URL(trackerEndpointResult.data);
19
+ const analyticsPathIndex = endpoint.pathname.indexOf(ANALYTICS_PATH_PREFIX);
20
+ if (analyticsPathIndex === -1) {
21
+ return null;
22
+ }
23
+ endpoint.pathname = `${endpoint.pathname.slice(0, analyticsPathIndex + ANALYTICS_PATH_PREFIX.length)}api/v1/tinybird-sync`;
24
+ const statsResult = StatsConfigSchema.safeParse(config.get('tinybird:stats'));
25
+ const settingsSiteUuidResult = SiteUuidSchema.safeParse(settingsCache.get('site_uuid'));
26
+ let siteUuid = statsResult.success ? statsResult.data.id : undefined;
27
+ if (!siteUuid && settingsSiteUuidResult.success) {
28
+ siteUuid = settingsSiteUuidResult.data;
29
+ }
30
+ if (!siteUuid) {
31
+ return null;
32
+ }
33
+ return {
34
+ endpoint,
35
+ // secretlint-disable-next-line @secretlint/secretlint-rule-pattern
36
+ trafficAnalyticsAuth: syncAuthKeyResult.data,
37
+ siteUuid,
38
+ };
39
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.start = void 0;
7
+ const promises_1 = require("node:timers/promises");
8
+ const bson_objectid_1 = __importDefault(require("bson-objectid"));
9
+ const logging_1 = __importDefault(require("@tryghost/logging"));
10
+ const config_1 = __importDefault(require("../../../shared/config"));
11
+ // @ts-expect-error This module lacks type definitions.
12
+ const settings_cache_1 = __importDefault(require("../../../shared/settings-cache"));
13
+ const db_1 = require("../../data/db");
14
+ const tinybird_sync_service_1 = require("./tinybird-sync-service");
15
+ const service = (0, tinybird_sync_service_1.createTinybirdSyncService)({
16
+ config: config_1.default,
17
+ settingsCache: settings_cache_1.default,
18
+ knex: db_1.knex,
19
+ logging: logging_1.default,
20
+ sleep: async (ms) => {
21
+ await (0, promises_1.setTimeout)(ms, undefined, { ref: false });
22
+ },
23
+ random: Math.random,
24
+ now: () => new Date(),
25
+ fetch: globalThis.fetch,
26
+ createId: () => (0, bson_objectid_1.default)().toHexString(),
27
+ });
28
+ exports.start = service.start;
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SAFETY_LAG_MS = exports.AUTOMATION_SYNC_TARGETS = void 0;
7
+ exports.syncTableToTinybird = syncTableToTinybird;
8
+ const errors_1 = __importDefault(require("@tryghost/errors"));
9
+ const date_1 = require("../../lib/db-types/date");
10
+ // Only what the Tinybird materialized views read. Member identity and lock bookkeeping
11
+ // stay in MySQL.
12
+ exports.AUTOMATION_SYNC_TARGETS = [
13
+ {
14
+ table: 'automation_runs',
15
+ columns: ['id', 'automation_id', 'created_at', 'updated_at'],
16
+ },
17
+ {
18
+ table: 'automation_run_steps',
19
+ columns: [
20
+ 'id',
21
+ 'automation_run_id',
22
+ 'automation_action_revision_id',
23
+ 'status',
24
+ 'step_attempts',
25
+ 'ready_at',
26
+ 'started_at',
27
+ 'finished_at',
28
+ 'created_at',
29
+ 'updated_at',
30
+ ],
31
+ },
32
+ ];
33
+ // A row's updated_at is assigned before its transaction commits, so a row can become
34
+ // visible after rows with later timestamps. Holding back the newest rows keeps the
35
+ // watermark from moving past a row whose transaction is still open.
36
+ exports.SAFETY_LAG_MS = 60 * 1000;
37
+ const serializeValue = (key, value) => key.endsWith('_at') && value !== null && value !== undefined
38
+ ? (0, date_1.fromDatabaseDate)(value).toISOString()
39
+ : value;
40
+ const toEventLine = (row, siteUuid, type) => {
41
+ const payload = Object.fromEntries(Object.entries(row).map(([key, value]) => [key, serializeValue(key, value)]));
42
+ return JSON.stringify({
43
+ type,
44
+ site_uuid: siteUuid,
45
+ id: row.id,
46
+ updated_at: (0, date_1.fromDatabaseDate)(row.updated_at).toISOString(),
47
+ payload: { ...payload, site_uuid: siteUuid },
48
+ });
49
+ };
50
+ function* chunkByPayloadLimits(lines, maxBytes, maxMessages) {
51
+ let current = [];
52
+ let currentBytes = 0;
53
+ for (const line of lines) {
54
+ const bytes = Buffer.byteLength(line) + '\n'.length;
55
+ if (current.length && (currentBytes + bytes > maxBytes || current.length === maxMessages)) {
56
+ yield current;
57
+ current = [];
58
+ currentBytes = 0;
59
+ }
60
+ current.push(line);
61
+ currentBytes += bytes;
62
+ }
63
+ if (current.length) {
64
+ yield current;
65
+ }
66
+ }
67
+ async function postEvents(lines, { table }, { endpoint, trafficAnalyticsAuth, siteUuid, fetch, requestTimeoutMs }) {
68
+ const response = await fetch(endpoint, {
69
+ method: 'POST',
70
+ headers: {
71
+ Authorization: `Bearer ${trafficAnalyticsAuth}`,
72
+ 'Content-Type': 'application/x-ndjson',
73
+ 'x-site-uuid': siteUuid,
74
+ },
75
+ body: lines.join('\n'),
76
+ signal: AbortSignal.timeout(requestTimeoutMs),
77
+ });
78
+ if (!response.ok) {
79
+ throw new errors_1.default.InternalServerError({
80
+ message: `Traffic Analytics returned ${response.status} while syncing ${table}: ${await response.text()}`,
81
+ });
82
+ }
83
+ }
84
+ async function readWatermark(knex, table) {
85
+ const row = await knex('tinybird_syncs')
86
+ .select('last_synced_updated_at', 'last_synced_id')
87
+ .where({ table_name: table })
88
+ .first();
89
+ if (!row) {
90
+ return null;
91
+ }
92
+ return { updatedAt: (0, date_1.fromDatabaseDate)(row.last_synced_updated_at), id: row.last_synced_id };
93
+ }
94
+ async function writeWatermark(knex, table, cursor, now, createId) {
95
+ const timestamp = (0, date_1.toDatabaseDate)(now);
96
+ const values = {
97
+ last_synced_updated_at: (0, date_1.toDatabaseDate)(cursor.updatedAt),
98
+ last_synced_id: cursor.id,
99
+ updated_at: timestamp,
100
+ };
101
+ await knex('tinybird_syncs')
102
+ .insert({
103
+ id: createId(),
104
+ table_name: table,
105
+ ...values,
106
+ created_at: timestamp,
107
+ })
108
+ .onConflict('table_name')
109
+ .merge(values);
110
+ }
111
+ async function readBatch({ table, columns }, { knex, batchSize }, cursor, cutoff) {
112
+ const query = knex(table)
113
+ .select(columns)
114
+ .where('updated_at', '<', cutoff)
115
+ .orderBy([{ column: 'updated_at' }, { column: 'id' }])
116
+ .limit(batchSize);
117
+ if (cursor) {
118
+ const updatedAt = (0, date_1.toDatabaseDate)(cursor.updatedAt);
119
+ query.andWhere((builder) => builder
120
+ .where('updated_at', '>', updatedAt)
121
+ .orWhere((tie) => tie.where('updated_at', updatedAt).andWhere('id', '>', cursor.id)));
122
+ }
123
+ return await query;
124
+ }
125
+ async function syncTableToTinybird(target, options) {
126
+ const { knex, siteUuid, now, createId, batchSize, maxPayloadBytes, maxPayloadMessages } = options;
127
+ const cutoff = (0, date_1.toDatabaseDate)(new Date(now().getTime() - exports.SAFETY_LAG_MS));
128
+ let cursor = await readWatermark(knex, target.table);
129
+ let sent = 0;
130
+ while (true) {
131
+ const rows = await readBatch(target, options, cursor, cutoff);
132
+ if (!rows.length) {
133
+ return sent;
134
+ }
135
+ const lines = rows.map((row) => toEventLine(row, siteUuid, target.table));
136
+ for (const chunk of chunkByPayloadLimits(lines, maxPayloadBytes, maxPayloadMessages)) {
137
+ await postEvents(chunk, target, options);
138
+ }
139
+ const last = rows[rows.length - 1];
140
+ cursor = { updatedAt: (0, date_1.fromDatabaseDate)(last.updated_at), id: last.id };
141
+ await writeWatermark(knex, target.table, cursor, now(), createId);
142
+ sent += rows.length;
143
+ // This is a performance optimization to prevent one needless batch read.
144
+ // It is not required for correctness.
145
+ if (rows.length < batchSize) {
146
+ return sent;
147
+ }
148
+ }
149
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTinybirdSyncService = createTinybirdSyncService;
4
+ const get_ingest_config_1 = require("./get-ingest-config");
5
+ const sync_table_to_tinybird_1 = require("./sync-table-to-tinybird");
6
+ const INTERVAL_MS = 5 * 60 * 1000;
7
+ const BATCH_SIZE = 5000;
8
+ // This should be a little less than the maximum, because rows are chunked by
9
+ // JSON line, not bytes strictly.
10
+ const MAX_PAYLOAD_BYTES = 9 * 1024 * 1024;
11
+ const MAX_PAYLOAD_MESSAGES = 1000;
12
+ const REQUEST_TIMEOUT_MS = 5 * 60 * 1000;
13
+ function createTinybirdSyncService({ config, settingsCache, knex, logging, sleep, random, now, fetch, createId, }) {
14
+ let started = false;
15
+ const syncAll = async (ingest) => {
16
+ const results = await Promise.allSettled(sync_table_to_tinybird_1.AUTOMATION_SYNC_TARGETS.map(async (target) => {
17
+ const sent = await (0, sync_table_to_tinybird_1.syncTableToTinybird)(target, {
18
+ knex,
19
+ ...ingest,
20
+ now,
21
+ fetch,
22
+ createId,
23
+ batchSize: BATCH_SIZE,
24
+ maxPayloadBytes: MAX_PAYLOAD_BYTES,
25
+ maxPayloadMessages: MAX_PAYLOAD_MESSAGES,
26
+ requestTimeoutMs: REQUEST_TIMEOUT_MS,
27
+ });
28
+ logging.info({ system: { event: 'tinybird.sync.completed', table: target.table, sent } }, `[Tinybird sync] ${target.table}: sent ${sent} rows`);
29
+ }));
30
+ for (const result of results) {
31
+ if (result.status === 'rejected') {
32
+ logging.error(result.reason, '[Tinybird sync] Failed to sync table');
33
+ }
34
+ }
35
+ };
36
+ const runLoop = async (ingest) => {
37
+ await sleep(Math.floor(random() * INTERVAL_MS));
38
+ while (true) {
39
+ await syncAll(ingest);
40
+ await sleep(INTERVAL_MS);
41
+ }
42
+ };
43
+ const start = () => {
44
+ if (started) {
45
+ return;
46
+ }
47
+ const ingest = (0, get_ingest_config_1.getIngestConfig)({ config, settingsCache });
48
+ if (!ingest) {
49
+ logging.info('[Tinybird sync] Not started: Traffic Analytics service is not configured');
50
+ return;
51
+ }
52
+ started = true;
53
+ void runLoop(ingest)
54
+ .then(() => {
55
+ logging.error('[Tinybird sync] Loop stopped unexpectedly');
56
+ })
57
+ .catch((error) => {
58
+ logging.error(error, '[Tinybird sync] Loop stopped');
59
+ });
60
+ };
61
+ return { start };
62
+ }
@@ -5,6 +5,7 @@ const auth = require('../../../../services/auth');
5
5
  const apiMw = require('../../middleware');
6
6
  const mw = require('./middleware');
7
7
  const labs = require('../../../../../shared/labs');
8
+ const limits = require('../../../../services/limits');
8
9
 
9
10
  const shared = require('../../../shared');
10
11
 
@@ -195,40 +196,38 @@ module.exports = function apiRoutes() {
195
196
 
196
197
  router.get('/members/stripe_connect', mw.authAdminApi, http(api.membersStripeConnect.auth));
197
198
 
198
- // Reading definitions is deliberately not behind the feature flag: Admin asks every site
199
- // for them, and a site without the flag simply has none, so the answer is an empty list
200
- // rather than a 404. Creating and changing them is flagged. Registered before /members/:id
201
- // so the literal path is not captured as an id.
202
- router.get('/members/metafields/:namespace', mw.authAdminApi, http(api.membersMetafields.browse));
203
- router.post(
204
- '/members/metafields/:namespace',
205
- mw.authAdminApi,
206
- labs.enabledMiddleware('membersCustomFields'),
207
- http(api.membersMetafields.add),
208
- );
209
- router.put(
210
- '/members/metafields/:namespace',
211
- mw.authAdminApi,
212
- labs.enabledMiddleware('membersCustomFields'),
213
- http(api.membersMetafields.reorder),
214
- );
215
- router.get(
216
- '/members/metafields/:namespace/:key',
217
- mw.authAdminApi,
218
- http(api.membersMetafields.read),
219
- );
220
- router.put(
221
- '/members/metafields/:namespace/:key',
222
- mw.authAdminApi,
223
- labs.enabledMiddleware('membersCustomFields'),
224
- http(api.membersMetafields.edit),
225
- );
226
- router.delete(
227
- '/members/metafields/:namespace/:key',
228
- mw.authAdminApi,
229
- labs.enabledMiddleware('membersCustomFields'),
230
- http(api.membersMetafields.destroy),
231
- );
199
+ // Custom field definitions. Mounted rather than listed so every route under it is
200
+ // reached the same way, and so the guards are stated once each instead of on every
201
+ // route that needs them.
202
+ //
203
+ // Order carries the rule here, the way Express reads it: a request walks this stack
204
+ // from the top, so the reads below are answered before the guards are reached, and
205
+ // everything registered after them passes through both. A route added at the end is
206
+ // guarded by being there, which is the safer way round to forget.
207
+ //
208
+ // Mounted before /members/:id so the literal path is not captured as an id.
209
+ const metafieldsRouter = express.Router('admin api members metafields');
210
+ router.use('/members/metafields', metafieldsRouter);
211
+
212
+ metafieldsRouter.use(mw.authAdminApi);
213
+
214
+ // Reading is deliberately open: Admin asks every site for its definitions to draw
215
+ // screens it renders either way, and a site that has none simply answers with an empty
216
+ // list rather than a 404.
217
+ metafieldsRouter.get('/:namespace', http(api.membersMetafields.browse));
218
+ metafieldsRouter.get('/:namespace/:key', http(api.membersMetafields.read));
219
+
220
+ // Changing one needs the feature to exist in this build and the site's plan to include
221
+ // it. Two separate questions, asked once each: a 404 says the feature is not here, a 403
222
+ // says the plan does not cover it, and only the second is something a publisher can act
223
+ // on.
224
+ metafieldsRouter.use(labs.enabledMiddleware('membersCustomFields'));
225
+ metafieldsRouter.use(limits.requireFeature('limitCustomFields'));
226
+
227
+ metafieldsRouter.post('/:namespace', http(api.membersMetafields.add));
228
+ metafieldsRouter.put('/:namespace', http(api.membersMetafields.reorder));
229
+ metafieldsRouter.put('/:namespace/:key', http(api.membersMetafields.edit));
230
+ metafieldsRouter.delete('/:namespace/:key', http(api.membersMetafields.destroy));
232
231
 
233
232
  router.get('/members/:id', mw.authAdminApi, http(api.members.read));
234
233
  router.put('/members/:id', mw.authAdminApi, http(api.members.edit));
@@ -2,35 +2,31 @@ const express = require('../../shared/express');
2
2
  const settings = require('../../shared/settings-cache');
3
3
  const config = require('../../shared/config');
4
4
  const { cacheControl } = require('./shared/middleware');
5
+ const { getPublicKeyInfo } = require('../lib/public-jwk');
5
6
 
6
7
  module.exports = function setupWellKnownApp() {
7
8
  const wellKnownApp = express('well-known');
8
9
 
9
- const jose = require('node-jose');
10
10
  const dangerousPrivateKey = settings.get('ghost_private_key');
11
- const keyStore = jose.JWK.createKeyStore();
12
- const keyStoreReady = keyStore.add(dangerousPrivateKey, 'pem');
13
-
14
- const getSafePublicJWKS = async () => {
15
- await keyStoreReady;
16
- return keyStore.toJSON();
17
- };
11
+ const keyReady = getPublicKeyInfo(dangerousPrivateKey);
18
12
 
19
13
  const cache = cacheControl('public', { maxAge: config.get('caching:wellKnown:maxAge') });
20
14
 
21
15
  wellKnownApp.get('/jwks.json', cache, async function jwksMiddleware(req, res) {
22
- const jwks = await getSafePublicJWKS();
16
+ const { kid, jwk } = await keyReady;
23
17
 
24
18
  // there's only one key in the store atm
25
19
  // based on this setting all of the keys to have
26
20
  // "use": "sig" property
27
- const keys = jwks.keys.map((key) => ({
28
- e: key.e,
29
- kid: key.kid,
30
- kty: key.kty,
31
- n: key.n,
32
- use: 'sig',
33
- }));
21
+ const keys = [
22
+ {
23
+ e: jwk.e,
24
+ kid,
25
+ kty: jwk.kty,
26
+ n: jwk.n,
27
+ use: 'sig',
28
+ },
29
+ ];
34
30
 
35
31
  res.json({ keys });
36
32
  });
@@ -305,8 +305,7 @@
305
305
  "enabled": false,
306
306
  "threshold": 500
307
307
  }
308
- },
309
- "openedJobLagWarningMinutes": 30
308
+ }
310
309
  },
311
310
  "linkClickTrackingCacheMemberUuid": false,
312
311
  "backgroundJobs": {
@@ -3,15 +3,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.flushLogs = flushLogs;
6
+ exports.flushLogsAndMetrics = flushLogsAndMetrics;
7
7
  const promises_1 = require("node:timers/promises");
8
8
  const logging_1 = __importDefault(require("@tryghost/logging"));
9
+ const metrics_1 = __importDefault(require("@tryghost/metrics"));
9
10
  const DEFAULT_TIMEOUT_MS = 2000;
10
11
  /**
11
12
  * Drain buffered log transports before the process exits, bounded so a stuck
12
13
  * transport can never block shutdown.
13
14
  */
14
- async function flushLogs(timeoutMs = DEFAULT_TIMEOUT_MS) {
15
+ async function flushLogsAndMetrics(timeoutMs = DEFAULT_TIMEOUT_MS) {
15
16
  // Unreffed so the loser of the race can't hold the event loop open
16
- await Promise.race([logging_1.default.flush(), (0, promises_1.setTimeout)(timeoutMs, undefined, { ref: false })]);
17
+ await Promise.race([
18
+ Promise.all([logging_1.default.flush(), metrics_1.default.flush()]),
19
+ (0, promises_1.setTimeout)(timeoutMs, undefined, { ref: false }),
20
+ ]);
17
21
  }
@@ -41,6 +41,7 @@ const PUBLIC_BETA_FEATURES = [
41
41
  // Which is only visible if the developer experiments flag is enabled
42
42
  const PRIVATE_FEATURES = [
43
43
  'automations',
44
+ 'automationsPerTier',
44
45
  'automationRunAnalytics',
45
46
  'automationsTinybirdSync',
46
47
  'stripeAutomaticTax',
@@ -60,6 +61,7 @@ const PRIVATE_FEATURES = [
60
61
  'selfServeArchives',
61
62
  'machinePayments',
62
63
  'postsListReact',
64
+ 'membersActivityReact',
63
65
  'editorReact',
64
66
  ];
65
67
 
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.timingSafeStringEqual = timingSafeStringEqual;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ /**
9
+ * Compares a value Ghost computed (an HMAC digest, say) with one taken from a
10
+ * request, without the response time revealing how much of it matched.
11
+ * Anything that is not a string never matches: a query param repeated in the
12
+ * URL arrives as an array, and that is as wrong as a bad key.
13
+ */
14
+ function timingSafeStringEqual(expected, provided) {
15
+ if (typeof provided !== 'string') {
16
+ return false;
17
+ }
18
+ const expectedBuffer = Buffer.from(expected, 'utf16le');
19
+ const providedBuffer = Buffer.from(provided, 'utf16le');
20
+ // crypto.timingSafeEqual throws when the lengths differ. The digests compared
21
+ // here have a fixed, public length, so returning early gives nothing away.
22
+ if (expectedBuffer.length !== providedBuffer.length) {
23
+ return false;
24
+ }
25
+ return crypto_1.default.timingSafeEqual(expectedBuffer, providedBuffer);
26
+ }