ghost 6.60.0 → 6.62.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 (613) hide show
  1. package/components/ghost-storage-base-3.0.0.tgz +0 -0
  2. package/components/tryghost-adapter-base-cache-0.2.0.tgz +0 -0
  3. package/components/tryghost-adapter-base-jobs-0.0.0.tgz +0 -0
  4. package/components/tryghost-adapter-base-redirects-0.0.0.tgz +0 -0
  5. package/components/tryghost-adapter-base-route-settings-0.0.0.tgz +0 -0
  6. package/components/tryghost-adapter-base-scheduling-0.2.3.tgz +0 -0
  7. package/components/tryghost-adapter-base-sso-0.1.3.tgz +0 -0
  8. package/components/tryghost-admin-api-schema-0.0.0.tgz +0 -0
  9. package/components/tryghost-checkout-0.0.0.tgz +0 -0
  10. package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
  11. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  12. package/components/tryghost-kg-card-factory-5.2.4.tgz +0 -0
  13. package/components/tryghost-kg-clean-basic-html-4.3.4.tgz +0 -0
  14. package/components/tryghost-kg-converters-1.2.5.tgz +0 -0
  15. package/components/tryghost-kg-default-cards-10.3.5.tgz +0 -0
  16. package/components/tryghost-kg-default-nodes-2.2.1.tgz +0 -0
  17. package/components/tryghost-kg-default-transforms-1.3.4.tgz +0 -0
  18. package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
  19. package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
  20. package/components/tryghost-kg-markdown-html-renderer-7.2.4.tgz +0 -0
  21. package/components/tryghost-kg-utils-1.1.4.tgz +0 -0
  22. package/components/tryghost-nql-string-0.0.0.tgz +0 -0
  23. package/components/tryghost-parse-email-address-0.0.0.tgz +0 -0
  24. package/content/settings/README.md +1 -1
  25. package/content/themes/casper/.gitignore +28 -0
  26. package/content/themes/casper/assets/built/casper.js +1 -1
  27. package/content/themes/casper/assets/built/screen.css +1 -1
  28. package/content/themes/casper/assets/css/screen.css +2 -1
  29. package/content/themes/casper/assets/js/lightbox.js +63 -46
  30. package/content/themes/casper/package.json +6 -6
  31. package/content/themes/casper/page.hbs +1 -0
  32. package/content/themes/casper/post.hbs +1 -0
  33. package/content/themes/source/.gitignore +28 -0
  34. package/content/themes/source/assets/built/screen.css +1 -1
  35. package/content/themes/source/assets/built/source.js +1 -1
  36. package/content/themes/source/assets/css/screen.css +2 -1
  37. package/content/themes/source/assets/js/lightbox.js +62 -45
  38. package/content/themes/source/assets/js/main.js +2 -2
  39. package/content/themes/source/package.json +4 -4
  40. package/content/themes/source/partials/feature-image.hbs +1 -0
  41. package/core/boot.js +62 -21
  42. package/core/built/admin/assets/Combination-B0l4MKVh.js +41 -0
  43. package/core/built/admin/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
  44. package/core/built/admin/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
  45. package/core/built/admin/assets/{PolarAngleAxis-C4qtHy1B.js → PolarAngleAxis-pkMyqz8g.js} +1 -1
  46. package/core/built/admin/assets/{RadialBarChart-Bh09Stsj.js → RadialBarChart-JAKoS4KT.js} +1 -1
  47. package/core/built/admin/assets/{about-BgpmhCuM.js → about-Dyae_UT6.js} +1 -1
  48. package/core/built/admin/assets/account-migration-CESa0mnX.js +1 -0
  49. package/core/built/admin/assets/{action-list-lGzZLHc8.js → action-list-C4v0-du8.js} +1 -1
  50. package/core/built/admin/assets/activitypub/{account-migration-DMHuPnJn.js → account-migration-By69CgCp.js} +16 -16
  51. package/core/built/admin/assets/activitypub/activitypub.js +9 -10
  52. package/core/built/admin/assets/activitypub/{avatar-DhTo5D1B.js → avatar-DLPL3Abs.js} +59 -68
  53. package/core/built/admin/assets/activitypub/{avatar-flipboard-DnVgbEfa.js → avatar-flipboard-C9iDY-QV.js} +2 -2
  54. package/core/built/admin/assets/activitypub/{bluesky-sharing-BT4zAlW7.js → bluesky-sharing-BJcPMrDd.js} +37 -37
  55. package/core/built/admin/assets/activitypub/{content-formatters-BeDZ-DIa.js → content-formatters-3rTHg3mp.js} +18 -18
  56. package/core/built/admin/assets/activitypub/{copy-8sqxUuNd.js → copy-DIAOQoCZ.js} +2 -2
  57. package/core/built/admin/assets/activitypub/{domain-xQDDu1CS.js → domain-DUR4xSkV.js} +121 -121
  58. package/core/built/admin/assets/activitypub/{edit-profile-BXdF_r2G.js → edit-profile-BqtfzxCp.js} +40 -40
  59. package/core/built/admin/assets/activitypub/{explore-CMt7gKlL.js → explore-BxuJd-J4.js} +27 -27
  60. package/core/built/admin/assets/activitypub/{feed-Bwqdddp_.js → feed-BM1TcksA.js} +51 -51
  61. package/core/built/admin/assets/activitypub/{field-4co_8FVg.js → field-Dn7HHx2-.js} +3 -3
  62. package/core/built/admin/assets/activitypub/{hash-DwakMs4X.js → hash-Bm3WxYN4.js} +2 -2
  63. package/core/built/admin/assets/activitypub/inbox-CCjkuow2.js +1284 -0
  64. package/core/built/admin/assets/activitypub/{inbox-ckD4wo_r.js → inbox-d8oJRTf4.js} +2 -2
  65. package/core/built/admin/assets/activitypub/label-1AA_s9Fa.js +16 -0
  66. package/core/built/admin/assets/activitypub/layout-2-0bw6HN.js +1 -0
  67. package/core/built/admin/assets/activitypub/{moderation-KCCO7L2J.js → moderation-CnmxEB8w.js} +91 -91
  68. package/core/built/admin/assets/activitypub/{note-BX_Bz5A0.js → note-ZKc_Bnba.js} +24 -24
  69. package/core/built/admin/assets/activitypub/{notifications-BQOYGvRv.js → notifications-CB2tJZau.js} +51 -51
  70. package/core/built/admin/assets/activitypub/{onboarding-CNelD_uF.js → onboarding-BsJ9E5qf.js} +2 -2
  71. package/core/built/admin/assets/activitypub/{onboarding-mat5Hrl0.js → onboarding-CSUJJIlh.js} +2 -2
  72. package/core/built/admin/assets/activitypub/{preferences-6h43G9_q.js → preferences-0-JZnUkI.js} +1519 -1519
  73. package/core/built/admin/assets/activitypub/{profile-BMN9VVZ2.js → profile-C35cFIhM.js} +256 -256
  74. package/core/built/admin/assets/activitypub/{reply-ZNo04xsO.js → reply-DYK5vVqb.js} +2 -2
  75. package/core/built/admin/assets/activitypub/{routes-3B9mUQ7i.js → routes-BD4vscyc.js} +796 -790
  76. package/core/built/admin/assets/activitypub/{separator-D9taVCCa.js → separator-BbQqTm-p.js} +3 -3
  77. package/core/built/admin/assets/activitypub/settings-BsMROdqh.js +315 -0
  78. package/core/built/admin/assets/activitypub/{site-DHoMupSB.js → site-O0RL9YCN.js} +2 -2
  79. package/core/built/admin/assets/activitypub/{step-1-BsGGnBuT.js → step-1-BMSx7c_X.js} +6 -6
  80. package/core/built/admin/assets/activitypub/{step-2-teosIS0k.js → step-2-DtPQzlTH.js} +6 -6
  81. package/core/built/admin/assets/activitypub/{step-3-BjD5TokC.js → step-3-CLlOZTyt.js} +11 -11
  82. package/core/built/admin/assets/activitypub/{tabs-Cvwl1wXU.js → tabs-Dxk-b9M-.js} +306 -306
  83. package/core/built/admin/assets/activitypub/{topic-filter-C3LZJc2X.js → topic-filter-5yZH6tId.js} +3 -3
  84. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-Dp9f0gov.js → use-activity-pub-queries-CV50qe03.js} +3 -3
  85. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-C4RI0sa9.js → use-navigate-with-base-path-Bmk5h4lW.js} +220 -220
  86. package/core/built/admin/assets/activitypub/{use-reply-chain-data-C2oNDMUH.js → use-reply-chain-data-Cbvzgjzd.js} +30 -30
  87. package/core/built/admin/assets/activitypub/{users-CoX6FT_K.js → users-BjcoP_HC.js} +7 -5
  88. package/core/built/admin/assets/activitypub/{x-Dxm6pV9X.js → x-DbQZOLiI.js} +2 -2
  89. package/core/built/admin/assets/add-integration-modal-BlF6rs_f.js +1 -0
  90. package/core/built/admin/assets/add-newsletter-modal-CglVQqah.js +1 -0
  91. package/core/built/admin/assets/add-recommendation-modal-wz7BsuaG.js +1 -0
  92. package/core/built/admin/assets/analytics-C4HE1gBg.js +1 -0
  93. package/core/built/admin/assets/{announcement-bar-modal-BTHiy1ZO.js → announcement-bar-modal-Ci4zz8jO.js} +1 -1
  94. package/core/built/admin/assets/{api-keys-Boy5pLbD.js → api-keys-Ck-Yteiv.js} +1 -1
  95. package/core/built/admin/assets/audience-CtbA54Sn.js +1 -0
  96. package/core/built/admin/assets/{automated-emails-te1D5kq-.js → automated-emails-D5VVMND9.js} +1 -1
  97. package/core/built/admin/assets/automations-CzKt5fb8.js +1 -0
  98. package/core/built/admin/assets/bluesky-sharing-BEtJ_gL_.js +1 -0
  99. package/core/built/admin/assets/{box-By_EgGtm.js → box-CdfQAP_F.js} +1 -1
  100. package/core/built/admin/assets/{brand-icon-09YqFZjV.js → brand-icon-CrIGOA3Z.js} +1 -1
  101. package/core/built/admin/assets/{breadcrumb-CcFr_ltt.js → breadcrumb-zUrZrBtW.js} +1 -1
  102. package/core/built/admin/assets/{button-BshWPHvn.js → button-eNMKQWXr.js} +1 -1
  103. package/core/built/admin/assets/{card-CiiE7QfM.js → card--VNbfgo3.js} +1 -1
  104. package/core/built/admin/assets/{chart-BnXyfH11.js → chart-BrhA41Zi.js} +1 -1
  105. package/core/built/admin/assets/chart-helpers-CfBKt0vT.js +1 -0
  106. package/core/built/admin/assets/{checkbox-Dwwr_3Py.js → checkbox-CgOn_tKW.js} +1 -1
  107. package/core/built/admin/assets/{chunk.524.91ecb33e6afc3bd8949b.js → chunk.524.a697dee88db67fdf6021.js} +4 -4
  108. package/core/built/admin/assets/{chunk.582.512549909741883f960c.js → chunk.582.5ed5d124cfca9c259b9c.js} +6 -6
  109. package/core/built/admin/assets/{chunk.16.f76a6314082d813d67e0.js → chunk.598.7e056fabb47ce7dbd73f.js} +14 -14
  110. package/core/built/admin/assets/{code-editor-view-BwIdPy_k.js → code-editor-view-BYNoAoNV.js} +1 -1
  111. package/core/built/admin/assets/{code-editor-view-CtkF82Fv.js → code-editor-view-K2wI-I5f.js} +1 -1
  112. package/core/built/admin/assets/color-picker-Ddw80xX6.js +3 -0
  113. package/core/built/admin/assets/color-picker-field-D9nUhvA7.js +1 -0
  114. package/core/built/admin/assets/combobox-w9j8PPQT.js +1 -0
  115. package/core/built/admin/assets/command-BfpHORBv.js +1 -0
  116. package/core/built/admin/assets/comments-BLmCmyCs.js +1 -0
  117. package/core/built/admin/assets/confirmation-context-CBM8G0Vj.js +1 -0
  118. package/core/built/admin/assets/{container-LiZf3XdY.js → container-BuQG1wuP.js} +1 -1
  119. package/core/built/admin/assets/{content-api-modal-BtpNI92-.js → content-api-modal-TXRz3U7S.js} +1 -1
  120. package/core/built/admin/assets/context-menu-_QMdd3kp.js +1 -0
  121. package/core/built/admin/assets/{copy-field-CglgRZyG.js → copy-field-6N01S07E.js} +1 -1
  122. package/core/built/admin/assets/create-ghost-browse-value-source-qIBymvvf.js +1 -0
  123. package/core/built/admin/assets/custom-field-type-option-BddFlJFa.js +1 -0
  124. package/core/built/admin/assets/custom-integration-modal-DmNquxUV.js +1 -0
  125. package/core/built/admin/assets/{data-list-CupF7bjM.js → data-list-CA2jYGPq.js} +1 -1
  126. package/core/built/admin/assets/{date-range-select-JPwM0yUj.js → date-range-select-uvz_DtPh.js} +1 -1
  127. package/core/built/admin/assets/design-and-theme-modal-BSmo12Op.js +2 -0
  128. package/core/built/admin/assets/{detail-page-D8lx2SdP.js → detail-page-Dnv-CdR1.js} +1 -1
  129. package/core/built/admin/assets/dirty-confirm-dialog-BZ1iytEd.js +1 -0
  130. package/core/built/admin/assets/{disabled-sources-indicator-BTJ2ClQu.js → disabled-sources-indicator-DMRrxsiJ.js} +1 -1
  131. package/core/built/admin/assets/{dist-DzcfoDJ3.js → dist-8YJUlf3B.js} +1 -1
  132. package/core/built/admin/assets/{dist-Cb5RSHSg.js → dist-B3keLvjj.js} +1 -1
  133. package/core/built/admin/assets/dist-Dcsslyo72.js +1 -0
  134. package/core/built/admin/assets/{dist-BT_Z-eCn.js → dist-Dgt2cr6a.js} +1 -1
  135. package/core/built/admin/assets/domain-BNYrt0aD.js +1 -0
  136. package/core/built/admin/assets/dropzone-D7nFdAe5.js +5 -0
  137. package/core/built/admin/assets/edit-profile-C5Asm4LA.js +1 -0
  138. package/core/built/admin/assets/editor-REokrzci.js +8 -0
  139. package/core/built/admin/assets/{embed-signup-form-modal-BFTPf04i.js → embed-signup-form-modal-Ds6mPEi5.js} +1 -1
  140. package/core/built/admin/assets/{empty-indicator-WB1WgT9h.js → empty-indicator-D9QdpuNX.js} +1 -1
  141. package/core/built/admin/assets/en-B1jX3WMs.js +1 -0
  142. package/core/built/admin/assets/explore-UY10Egsp.js +1 -0
  143. package/core/built/admin/assets/feature-image-placeholder-D1iF_8bc.js +1 -0
  144. package/core/built/admin/assets/feed-81C8mJWR.js +1 -0
  145. package/core/built/admin/assets/{field-LmNk7wZh.js → field-Dihp5p18.js} +1 -1
  146. package/core/built/admin/assets/filter-bar-Da1qxybu.js +1 -0
  147. package/core/built/admin/assets/filter-sources-BO9xUPj7.js +1 -0
  148. package/core/built/admin/assets/filters-CRUWecfY.js +1 -0
  149. package/core/built/admin/assets/filters-DirqNXjH.js +1 -0
  150. package/core/built/admin/assets/first-promoter-modal-CT6MxYZb.js +1 -0
  151. package/core/built/admin/assets/{ghost-c8807202a07c20030acb719ee0114815.css → ghost-8eabfc1ece81b03cf7b90780d31487e8.css} +1 -1
  152. package/core/built/admin/assets/{ghost-403cb39badad3df411fc0ba27d220047.js → ghost-c2848508292937415f20f5a830eea59e.js} +31 -28
  153. package/core/built/admin/assets/{ghost-dark-fbf1e384aaef3ae315e540f0eb7373a7.css → ghost-dark-a7bebe2c561f55369dcf29f4c820f7ff.css} +1 -1
  154. package/core/built/admin/assets/gift-link-modal-CQVAye17.js +1 -0
  155. package/core/built/admin/assets/{grid-CUciBfjf.js → grid-Dj29PY05.js} +1 -1
  156. package/core/built/admin/assets/growth-BWIu-6xj.js +3 -0
  157. package/core/built/admin/assets/growth-DU29oxeA.js +1 -0
  158. package/core/built/admin/assets/{heading-CRZZ2FUe.js → heading-Dh5SFVjL.js} +1 -1
  159. package/core/built/admin/assets/history-modal-CFd1Hvx6.js +1 -0
  160. package/core/built/admin/assets/html-field-CJBCLTvv.js +1 -0
  161. package/core/built/admin/assets/{images-C0XvUYMb.js → images-scfkWZiK.js} +1 -1
  162. package/core/built/admin/assets/{inbox-DZXDUt4s.js → inbox-Mcp4DXZN.js} +14 -14
  163. package/core/built/admin/assets/index-6MkPdCtr.js +4 -0
  164. package/core/built/admin/assets/index-Bn7QhcZu.css +2 -0
  165. package/core/built/admin/assets/index.es-CNnuNH0d.js +1 -0
  166. package/core/built/admin/assets/{inline-Cw-gigDW.js → inline-BWSs_VzR.js} +1 -1
  167. package/core/built/admin/assets/{input-group-BPAxETpQ.js → input-group-CMhe2DvY.js} +1 -1
  168. package/core/built/admin/assets/{input-surface-BdOe4KzO.js → input-surface-BsrIZeSF.js} +1 -1
  169. package/core/built/admin/assets/{integration-header-B4DyXV06.js → integration-header-Bm6IDb1A.js} +1 -1
  170. package/core/built/admin/assets/invite-user-modal-DfheMXs0.js +1 -0
  171. package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +14 -14
  172. package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +3 -3
  173. package/core/built/admin/assets/koenig-lexical/style.css +1 -1
  174. package/core/built/admin/assets/{koenig-lexical-60O_8aiO.js → koenig-lexical-DBSqAuiI.js} +3 -3
  175. package/core/built/admin/assets/koenig-loader-aFQNlJlD.js +2 -0
  176. package/core/built/admin/assets/kpi-card-DBRMfGOW.js +1 -0
  177. package/core/built/admin/assets/{kpi-card-fUHZlzBX.js → kpi-card-DFafD1qq.js} +1 -1
  178. package/core/built/admin/assets/kpi-helpers-Cv8i8hns.js +1 -0
  179. package/core/built/admin/assets/kpi-tabs-BJItvLYm.js +1 -0
  180. package/core/built/admin/assets/{label-VIG969IC.js → label-BnSCvffu.js} +1 -1
  181. package/core/built/admin/assets/label-picker-KVoo91sh.js +1 -0
  182. package/core/built/admin/assets/layout-Bjv2Ll-5.js +1 -0
  183. package/core/built/admin/assets/{link-helpers-Dtq9fxQg.js → link-helpers-MVDdnFCY.js} +1 -1
  184. package/core/built/admin/assets/{list-page-CdsnQR9N.js → list-page-BucXJ0hi.js} +1 -1
  185. package/core/built/admin/assets/member-custom-fields-DDQV6QeG.js +1 -0
  186. package/core/built/admin/assets/member-detail-CdJF6Agw.js +1 -0
  187. package/core/built/admin/assets/members-DjQbq9Z2.js +4 -0
  188. package/core/built/admin/assets/{modal-page-BMTzFHVO.js → modal-page-xCivTMvI.js} +1 -1
  189. package/core/built/admin/assets/moderation-AgCIEso4.js +1 -0
  190. package/core/built/admin/assets/{multi-select-combobox-CGohnsxJ.js → multi-select-combobox-BcITkUVr.js} +1 -1
  191. package/core/built/admin/assets/navigation-modal-BkT7b1M2.js +1 -0
  192. package/core/built/admin/assets/newsletter-BMMAuvgq.js +1 -0
  193. package/core/built/admin/assets/newsletter-detail-modal-0SCJ7Zpm.js +1 -0
  194. package/core/built/admin/assets/{newsletter-emails-D5ql1rud.js → newsletter-emails-DKzwafuh.js} +1 -1
  195. package/core/built/admin/assets/newsletters-BRBb_uQC.js +1 -0
  196. package/core/built/admin/assets/note-DyGHtS9a.js +1 -0
  197. package/core/built/admin/assets/notifications-ZgWniKna.js +1 -0
  198. package/core/built/admin/assets/nql-BLpCn7qX.js +21 -0
  199. package/core/built/admin/assets/offers-container-modal-B-E8TIWr.js +1 -0
  200. package/core/built/admin/assets/{onboarding-B4YhlZ0i.js → onboarding-CzIsre-d.js} +1 -1
  201. package/core/built/admin/assets/onboarding-qg8Akovm.js +1 -0
  202. package/core/built/admin/assets/{onboarding-route-Cu_ROWPn.js → onboarding-route-CaavZulg.js} +1 -1
  203. package/core/built/admin/assets/overview-BW8GLeYi.js +1 -0
  204. package/core/built/admin/assets/overview-BkXZNzaZ.js +1 -0
  205. package/core/built/admin/assets/{page-header-Cfds8pCg.js → page-header-De0VzKBi.js} +1 -1
  206. package/core/built/admin/assets/pagemenu-B5KKCpbA.js +1 -0
  207. package/core/built/admin/assets/pages-jgaFm69d.js +1 -0
  208. package/core/built/admin/assets/pages-route-CIUAQxtY.js +1 -0
  209. package/core/built/admin/assets/papaparse.min-cQwnxGCG.js +10 -0
  210. package/core/built/admin/assets/{pintura-modal-TDTrJ89x.js → pintura-modal-BZ2J9w3n.js} +1 -1
  211. package/core/built/admin/assets/portal-frame-B6Hr9wHc.js +1 -0
  212. package/core/built/admin/assets/portal-modal-D4ceei3t.js +1 -0
  213. package/core/built/admin/assets/post-analytics-header-BYCsT0GP.js +1 -0
  214. package/core/built/admin/assets/post-analytics-ot7f6pih.js +1 -0
  215. package/core/built/admin/assets/{post-analytics-provider-Cu3jNeFh.js → post-analytics-provider-Bo1gmYaP.js} +1 -1
  216. package/core/built/admin/assets/{post-share-modal-P1_M6o-H.js → post-share-modal-C-PaYZ_e.js} +1 -1
  217. package/core/built/admin/assets/posts-DuGazgTb.js +1 -0
  218. package/core/built/admin/assets/posts-list-screen-CBGGgjjj.js +2 -0
  219. package/core/built/admin/assets/posts-route-D6xmS7Vf.js +1 -0
  220. package/core/built/admin/assets/preferences-C5YJLp74.js +5 -0
  221. package/core/built/admin/assets/{preview-chrome-BOVO6_PE.js → preview-chrome-BljUBlOk.js} +1 -1
  222. package/core/built/admin/assets/{preview-modal-MlTjP8UU.js → preview-modal-BfeFqi5y.js} +1 -1
  223. package/core/built/admin/assets/profile-B8mx2yAu.js +1 -0
  224. package/core/built/admin/assets/{radio-group-CjtmsCPl.js → radio-group-DczlLKOn.js} +1 -1
  225. package/core/built/admin/assets/{router-provider-CJC58zTy.js → router-provider-B0gZyiGJ.js} +1 -1
  226. package/core/built/admin/assets/{schemas-CRsC53ls.js → schemas-DppqmpeJ.js} +2 -2
  227. package/core/built/admin/assets/select-cb0t_TAJ.js +1 -0
  228. package/core/built/admin/assets/settings-DZqxR0Da.js +1 -0
  229. package/core/built/admin/assets/settings-DvfTNdHQ.js +4 -0
  230. package/core/built/admin/assets/{settings-breadcrumbs-sLDNedBW.js → settings-breadcrumbs-DLzbRRSt.js} +1 -1
  231. package/core/built/admin/assets/{shade-app-F7WxOyfk-nufqw1hd.js → shade-app-CcS3f8MZ-vwURazk8.js} +2 -2
  232. package/core/built/admin/assets/share-modal-D2-Bz1_I.js +1 -0
  233. package/core/built/admin/assets/{skeleton-D7hwjdry.js → skeleton-Ce9GgUpf.js} +1 -1
  234. package/core/built/admin/assets/slack-modal-DYDTUria.js +1 -0
  235. package/core/built/admin/assets/sort-button-VVeQjjbu.js +1 -0
  236. package/core/built/admin/assets/{source-icon-BPsD5ees.js → source-icon-Ck5_5Kgq.js} +1 -1
  237. package/core/built/admin/assets/{stack-CIfOAAVf.js → stack-B2eszIiq.js} +1 -1
  238. package/core/built/admin/assets/stats-Rjmk5owg.js +1 -0
  239. package/core/built/admin/assets/stats-view-BGGmkmgv.js +1 -0
  240. package/core/built/admin/assets/{step-1-CMta6YFO.js → step-1-CsaBjeN4.js} +1 -1
  241. package/core/built/admin/assets/{step-2-BG04nh5q.js → step-2-D2vnxOOM.js} +1 -1
  242. package/core/built/admin/assets/{step-3-ZnMaVIPj.js → step-3-wBoLdGEb.js} +2 -2
  243. package/core/built/admin/assets/{stripe-button-DDoUKN5a.js → stripe-button-CDgLz0S0.js} +1 -1
  244. package/core/built/admin/assets/stripe-connect-modal-CSjMJetP.js +1 -0
  245. package/core/built/admin/assets/{switch-C9djUIMO.js → switch-CI4gLWqb.js} +1 -1
  246. package/core/built/admin/assets/{table-CrqQtkR2.js → table-Do6iQ83Q.js} +1 -1
  247. package/core/built/admin/assets/{tabs-CGisSbWq.js → tabs-D2yWLMp_.js} +1 -1
  248. package/core/built/admin/assets/tag-detail-BhXlOsCa.js +2 -0
  249. package/core/built/admin/assets/tags-ldukRApe.js +1 -0
  250. package/core/built/admin/assets/testimonials-modal-CtnZBJKl.js +1 -0
  251. package/core/built/admin/assets/{text-DU9Hv33_.js → text-BQDSDsKs.js} +1 -1
  252. package/core/built/admin/assets/{textarea-d9qEkMOP.js → textarea-DJ1Q5V39.js} +1 -1
  253. package/core/built/admin/assets/tier-detail-modal-BOs8e_G8.js +1 -0
  254. package/core/built/admin/assets/{toggle-group-CtKZURJd.js → toggle-group-ByUJsxwD.js} +1 -1
  255. package/core/built/admin/assets/{topic-filter-D8JT8Tq1.js → topic-filter-BgC3g5_v.js} +1 -1
  256. package/core/built/admin/assets/{transistor-modal-6PUf0idx.js → transistor-modal-Drr0SNfo.js} +1 -1
  257. package/core/built/admin/assets/trend-badge-6ye93YAW.js +1 -0
  258. package/core/built/admin/assets/{unsplash-modal-BPuDBPja.js → unsplash-modal-p6AoQoWp.js} +1 -1
  259. package/core/built/admin/assets/{use-analytics-data--opuzwcz.js → use-analytics-data-CWCMAESo.js} +1 -1
  260. package/core/built/admin/assets/use-check-theme-limit-error-B8bjF-gO.css +1 -0
  261. package/core/built/admin/assets/use-check-theme-limit-error-Cw3WQHy8.js +2 -0
  262. package/core/built/admin/assets/use-filter-params-BIni9taJ.js +1 -0
  263. package/core/built/admin/assets/use-growth-stats-DCVG3s9w.js +1 -0
  264. package/core/built/admin/assets/{use-limiter-TDSNiHPB.js → use-limiter-D2WRRx0H.js} +1 -1
  265. package/core/built/admin/assets/{use-navigate-with-base-path-CK989MlC.js → use-navigate-with-base-path-BHPA228f.js} +1 -1
  266. package/core/built/admin/assets/{use-pintura-config-CnCGrDFk.js → use-pintura-config-h-J0Lvta.js} +1 -1
  267. package/core/built/admin/assets/{use-pintura-editor-ntphvtUd.js → use-pintura-editor-BfN1UwzH.js} +1 -1
  268. package/core/built/admin/assets/use-post-referrers-Czg47m8s.js +1 -0
  269. package/core/built/admin/assets/use-reply-chain-data-ns0caK8k.js +1 -0
  270. package/core/built/admin/assets/{use-router-history-entry-BwfQS2mq.js → use-router-history-entry-uldn7zJO.js} +1 -1
  271. package/core/built/admin/assets/{use-setting-group-DQxV42-O.js → use-setting-group-DpcuCUDg.js} +1 -1
  272. package/core/built/admin/assets/use-settings-navigation-CZjGrhsp.js +1 -0
  273. package/core/built/admin/assets/{use-simple-pagination-B2TdNX67.js → use-simple-pagination-DzJWobPR.js} +1 -1
  274. package/core/built/admin/assets/{use-staff-users-QrR9voeC.js → use-staff-users-Csipb-O0.js} +1 -1
  275. package/core/built/admin/assets/use-tinybird-query-CSnGXzZh.js +1 -0
  276. package/core/built/admin/assets/use-tinybird-token-DTOKRR7e.js +1 -0
  277. package/core/built/admin/assets/{use-unsaved-changes-guard-DpYJcj1d.js → use-unsaved-changes-guard-CBzs-KPi.js} +1 -1
  278. package/core/built/admin/assets/{use-url-input-WnIqckzS.js → use-url-input-DFr8lCbS.js} +1 -1
  279. package/core/built/admin/assets/user-detail-modal-B_iUClI6.js +1 -0
  280. package/core/built/admin/assets/users-Cg-OeGzC.js +1 -0
  281. package/core/built/admin/assets/{virtual-list-D3MfPNOh.js → virtual-list-BW-padMe.js} +1 -1
  282. package/core/built/admin/assets/web-C1v33ehA.js +2 -0
  283. package/core/built/admin/assets/web-C4BKzn2T.js +1 -0
  284. package/core/built/admin/assets/{zapier-modal-BO6PS_Vd.js → zapier-modal-BBFfI6Ml.js} +1 -1
  285. package/core/built/admin/index.html +24 -30
  286. package/core/frontend/apps/private-blogging/lib/views/private.hbs +44 -43
  287. package/core/frontend/helpers/cancel_link.js +2 -2
  288. package/core/frontend/helpers/pagination.js +2 -2
  289. package/core/frontend/helpers/social_accounts.js +2 -2
  290. package/core/frontend/public/ghost.css +1 -1
  291. package/core/frontend/public/ghost.min.css +1 -1
  292. package/core/frontend/services/rendering/renderer.js +15 -0
  293. package/core/frontend/services/sitemap/user-map-generator.js +9 -2
  294. package/core/server/adapters/storage/LocalStorageBase.js +8 -5
  295. package/core/server/api/endpoints/db.js +19 -5
  296. package/core/server/api/endpoints/index.js +6 -2
  297. package/core/server/api/endpoints/mail.js +1 -1
  298. package/core/server/api/endpoints/member-metafields.js +89 -0
  299. package/core/server/api/endpoints/members.js +4 -4
  300. package/core/server/api/endpoints/posts.js +4 -3
  301. package/core/server/api/endpoints/tiers-checkout-config.js +59 -0
  302. package/core/server/api/endpoints/utils/serializers/input/members.js +4 -7
  303. package/core/server/api/endpoints/utils/serializers/output/config.js +1 -0
  304. package/core/server/api/endpoints/utils/serializers/output/index.js +6 -2
  305. package/core/server/api/endpoints/utils/serializers/output/{member-custom-fields.js → member-metafields.js} +2 -4
  306. package/core/server/api/endpoints/utils/serializers/output/members.js +2 -4
  307. package/core/server/api/endpoints/utils/serializers/output/tiers-checkout-config.js +12 -0
  308. package/core/server/api/endpoints/utils/validators/input/invitations.js +0 -5
  309. package/core/server/api/endpoints/utils/validators/input/pages.js +1 -1
  310. package/core/server/api/endpoints/utils/validators/input/posts.js +1 -1
  311. package/core/server/data/exporter/table-lists.js +3 -0
  312. package/core/server/data/importer/content-files.js +57 -0
  313. package/core/server/data/importer/handlers/image.js +2 -2
  314. package/core/server/data/importer/import-archive.js +131 -0
  315. package/core/server/data/importer/import-manager.js +18 -180
  316. package/core/server/data/importer/importers/content-file-importer.js +66 -4
  317. package/core/server/data/importer/importers/data/data-importer.js +3 -3
  318. package/core/server/data/migrations/utils/migrations.js +1 -1
  319. package/core/server/data/migrations/versions/6.61/2026-08-19-14-30-20-add-written-by-to-members-custom-field-values.js +42 -0
  320. package/core/server/data/migrations/versions/6.61/2026-08-19-14-38-53-add-members-custom-field-bindings-table.js +26 -0
  321. package/core/server/data/migrations/versions/6.61/2026-08-19-14-48-06-add-tier-checkout-field-tables.js +35 -0
  322. package/core/server/data/schema/schema.js +90 -0
  323. package/core/server/data/seeders/importers/automation-action-revisions-importer.js +3 -3
  324. package/core/server/data/seeders/importers/automation-actions-importer.js +3 -3
  325. package/core/server/data/seeders/importers/automation-run-steps-importer.js +3 -3
  326. package/core/server/data/seeders/importers/automation-runs-importer.js +5 -5
  327. package/core/server/data/seeders/importers/automations-importer.js +3 -3
  328. package/core/server/data/seeders/importers/comment-reports-importer.js +1 -1
  329. package/core/server/data/seeders/importers/comments-importer.js +1 -1
  330. package/core/server/data/seeders/importers/email-batches-importer.js +1 -1
  331. package/core/server/data/seeders/importers/email-recipients-importer.js +1 -1
  332. package/core/server/data/seeders/importers/emails-importer.js +1 -1
  333. package/core/server/data/seeders/importers/labels-importer.js +1 -1
  334. package/core/server/data/seeders/importers/members-click-events-importer.js +1 -1
  335. package/core/server/data/seeders/importers/members-created-events-importer.js +1 -1
  336. package/core/server/data/seeders/importers/members-feedback-importer.js +1 -1
  337. package/core/server/data/seeders/importers/members-importer.js +1 -1
  338. package/core/server/data/seeders/importers/members-login-events-importer.js +1 -1
  339. package/core/server/data/seeders/importers/members-products-importer.js +1 -1
  340. package/core/server/data/seeders/importers/members-status-events-importer.js +1 -1
  341. package/core/server/data/seeders/importers/members-stripe-customers-importer.js +1 -1
  342. package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +1 -1
  343. package/core/server/data/seeders/importers/members-subscribe-events-importer.js +1 -1
  344. package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +1 -1
  345. package/core/server/data/seeders/importers/offer-redemptions-importer.js +1 -1
  346. package/core/server/data/seeders/importers/offers-importer.js +1 -1
  347. package/core/server/data/seeders/importers/posts-importer.js +1 -1
  348. package/core/server/data/seeders/importers/table-importer.js +2 -2
  349. package/core/server/data/seeders/importers/tags-importer.js +1 -1
  350. package/core/server/data/seeders/importers/users-importer.js +1 -1
  351. package/core/server/data/seeders/importers/web-mentions-importer.js +1 -1
  352. package/core/server/data/seeders/utils/random.js +3 -3
  353. package/core/server/ghost-server.js +3 -2
  354. package/core/server/lib/db-types/boolean.js +18 -0
  355. package/core/server/lib/image/image-size.js +24 -0
  356. package/core/server/lib/package-json/parse.js +2 -2
  357. package/core/server/lib/promise-pool.js +31 -0
  358. package/core/server/models/member.js +6 -17
  359. package/core/server/models/post.js +2 -2
  360. package/core/server/models/relations/authors.js +2 -16
  361. package/core/server/models/user.js +9 -2
  362. package/core/server/services/auth/passwordreset.js +13 -0
  363. package/core/server/services/automations/database-automations-repository.js +26 -26
  364. package/core/server/services/automations/poll.js +1 -0
  365. package/core/server/services/comments/comments-controller.js +30 -9
  366. package/core/server/services/comments/comments-service.js +55 -5
  367. package/core/server/services/content-import/csv/formula.js +12 -0
  368. package/core/server/services/content-import/csv/index.js +6 -1
  369. package/core/server/services/content-import/csv/parse.js +27 -6
  370. package/core/server/services/content-import/csv/serialize.js +13 -0
  371. package/core/server/services/content-import/import/assets.js +74 -0
  372. package/core/server/services/content-import/import/completion-email.js +164 -0
  373. package/core/server/services/content-import/import/errors-file.js +36 -0
  374. package/core/server/services/content-import/import/importer.js +204 -54
  375. package/core/server/services/content-import/import/local-media-url.js +63 -0
  376. package/core/server/services/content-import/import/media.js +254 -0
  377. package/core/server/services/content-import/import/post-data.js +1 -1
  378. package/core/server/services/content-import/import/post-link.js +11 -0
  379. package/core/server/services/content-import/import/post-repository.js +100 -0
  380. package/core/server/services/content-import/import/reader.js +9 -2
  381. package/core/server/services/content-import/import/relations.js +149 -0
  382. package/core/server/services/content-import/import/report.js +34 -0
  383. package/core/server/services/content-import/import/row.js +11 -2
  384. package/core/server/services/content-import/import/schema.js +30 -0
  385. package/core/server/services/content-import/import/source.js +125 -0
  386. package/core/server/services/content-import/import/staged-file.js +29 -0
  387. package/core/server/services/content-import/import/store.js +25 -2
  388. package/core/server/services/content-import/index.js +58 -34
  389. package/core/server/services/content-import/jobs/content-csv-import-job.js +20 -0
  390. package/core/server/services/custom-redirects/redirect-config-parser.js +2 -2
  391. package/core/server/services/custom-redirects/redirects-service.js +1 -1
  392. package/core/server/services/custom-redirects/validation.js +1 -1
  393. package/core/server/services/email-address/email-address-parser.js +30 -38
  394. package/core/server/services/email-address/email-address-service.js +37 -4
  395. package/core/server/services/email-analytics/email-analytics-service.js +8 -1
  396. package/core/server/services/email-analytics/index.js +2 -7
  397. package/core/server/services/email-analytics/lib/queries.js +7 -1
  398. package/core/server/services/email-service/batch-sending-service.js +0 -4
  399. package/core/server/services/email-service/email-renderer.js +14 -4
  400. package/core/server/services/email-service/email-service-wrapper.js +0 -9
  401. package/core/server/services/email-service/mailgun-email-provider.js +20 -9
  402. package/core/server/services/gift-links/schema.js +3 -3
  403. package/core/server/services/gifts/CONTEXT.md +1 -1
  404. package/core/server/services/gifts/constants.js +1 -1
  405. package/core/server/services/gifts/email-templates/gift-delivery.hbs +3 -3
  406. package/core/server/services/gifts/gift-bookshelf-repository.js +2 -2
  407. package/core/server/services/gifts/gift-delivery-bookshelf-repository.js +18 -9
  408. package/core/server/services/gifts/gift-delivery-schema.js +5 -5
  409. package/core/server/services/gifts/gift-delivery-service.js +4 -0
  410. package/core/server/services/gifts/gift-email-service.js +0 -1
  411. package/core/server/services/gifts/gift-schema.js +10 -10
  412. package/core/server/services/gifts/gift-service.js +4 -2
  413. package/core/server/services/gifts/index.js +3 -3
  414. package/core/server/services/gifts/jobs/index.js +4 -4
  415. package/core/server/services/indexnow-ping/indexnow-ping-service.js +2 -2
  416. package/core/server/services/invitations/accept.js +4 -2
  417. package/core/server/services/jobs/job-service.js +0 -9
  418. package/core/server/services/jobs-service/register-job-handlers.js +25 -15
  419. package/core/server/services/lib/mailgun-client.js +44 -8
  420. package/core/server/services/mail/ghost-mailer.js +4 -4
  421. package/core/server/services/media-inliner/external-media-inliner-job.js +12 -0
  422. package/core/server/services/media-inliner/external-media-inliner.js +103 -29
  423. package/core/server/services/media-inliner/service.js +13 -41
  424. package/core/server/services/media-inliner/types.js +2 -0
  425. package/core/server/services/member-welcome-emails/service.js +7 -7
  426. package/core/server/services/members/api.js +1 -0
  427. package/core/server/services/members/import-export/csv/parse.js +0 -7
  428. package/core/server/services/members/import-export/export/exporter.js +4 -6
  429. package/core/server/services/members/import-export/import/completion-email.js +2 -5
  430. package/core/server/services/members/import-export/import/importer.js +21 -5
  431. package/core/server/services/members/import-export/import/row.js +0 -3
  432. package/core/server/services/members/import-export/import/stripe-utils.js +6 -1
  433. package/core/server/services/members/import-export/index.js +10 -12
  434. package/core/server/services/members/jobs/clean-expired-comped-job.js +7 -0
  435. package/core/server/services/members/jobs/clean-expired-comped-task.js +145 -0
  436. package/core/server/services/members/jobs/index.js +48 -24
  437. package/core/server/services/members/members-api/controllers/member-controller.js +11 -0
  438. package/core/server/services/members/members-api/controllers/router-controller.js +3 -6
  439. package/core/server/services/members/members-api/members-api.js +9 -6
  440. package/core/server/services/members/members-api/repositories/event-repository.js +0 -4
  441. package/core/server/services/members/members-api/services/member-bread-service.js +53 -63
  442. package/core/server/services/members/members-api/services/payments-service.js +47 -1
  443. package/core/server/services/members/service.js +1 -5
  444. package/core/server/services/members-custom-fields/actions.js +27 -1
  445. package/core/server/services/members-custom-fields/bindings-service.js +120 -0
  446. package/core/server/services/members-custom-fields/codec.js +3 -4
  447. package/core/server/services/members-custom-fields/definitions-service.js +165 -22
  448. package/core/server/services/members-custom-fields/filter.js +75 -93
  449. package/core/server/services/members-custom-fields/index.js +11 -4
  450. package/core/server/services/members-custom-fields/key.js +2 -1
  451. package/core/server/services/members-custom-fields/models.js +1 -1
  452. package/core/server/services/members-custom-fields/queries.js +5 -0
  453. package/core/server/services/members-custom-fields/schema.js +37 -6
  454. package/core/server/services/members-custom-fields/serializers.js +3 -5
  455. package/core/server/services/members-custom-fields/values-service.js +65 -31
  456. package/core/server/services/mentions/mention-controller.js +23 -21
  457. package/core/server/services/mentions/process-webmention-job.js +16 -0
  458. package/core/server/services/mentions/service.js +8 -4
  459. package/core/server/services/public-config/config.js +7 -0
  460. package/core/server/services/route-settings/validation-errors.js +1 -1
  461. package/core/server/services/route-settings/yaml-parser.js +1 -1
  462. package/core/server/services/settings/settings-service.js +1 -8
  463. package/core/server/services/settings-helpers/settings-helpers.js +4 -6
  464. package/core/server/services/slack-ping/slack-ping-service.js +1 -1
  465. package/core/server/services/staff/staff-service-emails.js +2 -2
  466. package/core/server/services/stripe/config.js +14 -8
  467. package/core/server/services/stripe/service.js +10 -1
  468. package/core/server/services/stripe/services/checkout/completed-session.js +68 -0
  469. package/core/server/services/stripe/services/checkout/session-options.js +100 -0
  470. package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +71 -1
  471. package/core/server/services/stripe/stripe-api.js +31 -0
  472. package/core/server/services/stripe/stripe-service.js +26 -9
  473. package/core/server/services/stripe/webhook-controller.js +10 -0
  474. package/core/server/services/tier-checkout-config/codec.js +99 -0
  475. package/core/server/services/tier-checkout-config/index.js +26 -0
  476. package/core/server/services/tier-checkout-config/models.js +63 -0
  477. package/core/server/services/tier-checkout-config/queries.js +80 -0
  478. package/core/server/services/tier-checkout-config/schema.js +33 -0
  479. package/core/server/services/tier-checkout-config/serializers.js +128 -0
  480. package/core/server/services/tier-checkout-config/service.js +304 -0
  481. package/core/server/services/tiers/service.js +21 -0
  482. package/core/server/services/update-check/index.js +13 -13
  483. package/core/server/services/update-check/jobs/update-check-job.js +7 -0
  484. package/core/server/services/update-check/update-check-service.js +2 -2
  485. package/core/server/web/admin/controller.js +1 -1
  486. package/core/server/web/api/endpoints/admin/routes.js +34 -20
  487. package/core/server/web/api/middleware/upload.js +2 -2
  488. package/core/server/web/parent/app.js +5 -0
  489. package/core/server/web/parent/middleware/filter-query-parameters.js +94 -0
  490. package/core/server/web/parent/middleware/index.js +1 -0
  491. package/core/server/web/query-parameter-policy/index.js +9 -0
  492. package/core/server/web/query-parameter-policy/policy.json +58 -0
  493. package/core/server/web/query-parameter-policy/schema.js +38 -0
  494. package/core/shared/config/defaults.json +3 -0
  495. package/core/shared/config/env/config.testing-mysql.json +4 -1
  496. package/core/shared/config/env/config.testing.json +3 -0
  497. package/core/shared/config/overrides.json +4 -2
  498. package/core/shared/labs.js +9 -15
  499. package/package.json +25 -25
  500. package/pnpm-lock.yaml +741 -108
  501. package/pnpm-workspace.yaml +12 -9
  502. package/tsconfig.json +2 -3
  503. package/components/tryghost-kg-default-nodes-2.2.0.tgz +0 -0
  504. package/core/built/admin/assets/Combination-gnJO3vIw.js +0 -41
  505. package/core/built/admin/assets/account-migration-8qTEI1i1.js +0 -1
  506. package/core/built/admin/assets/activitypub/inbox-DQ5CwLma.js +0 -1284
  507. package/core/built/admin/assets/activitypub/label-B72sfvEU.js +0 -16
  508. package/core/built/admin/assets/activitypub/layout-CXajhRsL.js +0 -1
  509. package/core/built/admin/assets/activitypub/settings-71gCm3SO.js +0 -315
  510. package/core/built/admin/assets/add-integration-modal--YpTq3c0.js +0 -1
  511. package/core/built/admin/assets/add-newsletter-modal-C8Ix2hol.js +0 -1
  512. package/core/built/admin/assets/add-recommendation-modal-CScuNFz4.js +0 -1
  513. package/core/built/admin/assets/alert-dialog-wEbVxANM.js +0 -1
  514. package/core/built/admin/assets/analytics-Cnji45H5.js +0 -1
  515. package/core/built/admin/assets/app-utils-D2Wp7ZSS.js +0 -1
  516. package/core/built/admin/assets/audience-DTLMXAFH.js +0 -1
  517. package/core/built/admin/assets/automations-BWpRCZ_f.js +0 -1
  518. package/core/built/admin/assets/bluesky-sharing-DHOpQxff.js +0 -1
  519. package/core/built/admin/assets/chart-helpers-B3OqQ6Ez.js +0 -1
  520. package/core/built/admin/assets/color-picker-Bmo1r9Fc.js +0 -3
  521. package/core/built/admin/assets/color-picker-field-DywowPhF.js +0 -1
  522. package/core/built/admin/assets/combobox-C4QCh6Yw.js +0 -1
  523. package/core/built/admin/assets/command-DcLbSifC.js +0 -1
  524. package/core/built/admin/assets/comments-Bxy_3WyE.js +0 -1
  525. package/core/built/admin/assets/confirmation-context-CLFHhyyH.js +0 -1
  526. package/core/built/admin/assets/custom-field-type-option-D0PXoSnP.js +0 -10
  527. package/core/built/admin/assets/custom-integration-modal-DCIHKN33.js +0 -1
  528. package/core/built/admin/assets/design-and-theme-modal-CZ-PkW7o.js +0 -23
  529. package/core/built/admin/assets/dialog-Db7c164G.js +0 -1
  530. package/core/built/admin/assets/dirty-confirm-dialog-CmARpZQS.js +0 -1
  531. package/core/built/admin/assets/dist-QLZuGq7o2.js +0 -1
  532. package/core/built/admin/assets/domain-D0SAtc-T.js +0 -1
  533. package/core/built/admin/assets/dropzone-CaPOeDRZ.js +0 -5
  534. package/core/built/admin/assets/edit-profile-By7v5XW5.js +0 -1
  535. package/core/built/admin/assets/editor-COXn4Atu.js +0 -8
  536. package/core/built/admin/assets/explore-BsNYrubV.js +0 -1
  537. package/core/built/admin/assets/feed-8RR1O1bK.js +0 -1
  538. package/core/built/admin/assets/filter-sources-4C0kF1NU.js +0 -1
  539. package/core/built/admin/assets/filters-CV5jCb9n.js +0 -1
  540. package/core/built/admin/assets/filters-Dmr0PoqU.js +0 -1
  541. package/core/built/admin/assets/first-promoter-modal-OCzSaL3B.js +0 -1
  542. package/core/built/admin/assets/gift-link-modal-0mzjn5oF.js +0 -1
  543. package/core/built/admin/assets/growth-55vWlGT_.js +0 -1
  544. package/core/built/admin/assets/growth-DA5AluYw.js +0 -3
  545. package/core/built/admin/assets/history-modal-G1s5hHz7.js +0 -1
  546. package/core/built/admin/assets/html-field-BegxsWpw.js +0 -1
  547. package/core/built/admin/assets/index-CDP9tIOk.js +0 -4
  548. package/core/built/admin/assets/index-Dqf2x-ry.css +0 -1
  549. package/core/built/admin/assets/index.es-BMUCj9TR.js +0 -1
  550. package/core/built/admin/assets/input-UHrKuvBT.js +0 -1
  551. package/core/built/admin/assets/invite-user-modal-BrAkxEO3.js +0 -1
  552. package/core/built/admin/assets/koenig-loader-DwVY_V-H.js +0 -1
  553. package/core/built/admin/assets/kpi-card-LERqWBoY.js +0 -1
  554. package/core/built/admin/assets/kpi-helpers-DB3ouhYF.js +0 -1
  555. package/core/built/admin/assets/kpi-tabs-BGvtMD8S.js +0 -1
  556. package/core/built/admin/assets/label-picker-BBWykUeA.js +0 -1
  557. package/core/built/admin/assets/layout-Di5K7doM.js +0 -1
  558. package/core/built/admin/assets/loading-indicator-SFTqyYVE.js +0 -1
  559. package/core/built/admin/assets/member-custom-fields-gOv6Hoh3.js +0 -1
  560. package/core/built/admin/assets/member-detail-D7mZDDp3.js +0 -1
  561. package/core/built/admin/assets/member-route-0Aa52Ntz.js +0 -1
  562. package/core/built/admin/assets/members-DvZG9t69.js +0 -2
  563. package/core/built/admin/assets/moderation-DzzPLDyl.js +0 -1
  564. package/core/built/admin/assets/navigation-modal-CI8Bx5vn.js +0 -1
  565. package/core/built/admin/assets/newsletter-Bg3cq5U-.js +0 -1
  566. package/core/built/admin/assets/newsletter-detail-modal-DQU3r4g2.js +0 -1
  567. package/core/built/admin/assets/newsletters-DMDfZbMS.js +0 -1
  568. package/core/built/admin/assets/note-i8k6pjaw.js +0 -1
  569. package/core/built/admin/assets/notifications-psA_2Ph4.js +0 -1
  570. package/core/built/admin/assets/offers-container-modal-BWfjSdyg.js +0 -1
  571. package/core/built/admin/assets/onboarding-DGQuV7Ew.js +0 -1
  572. package/core/built/admin/assets/overview-C-6xOLaf.js +0 -1
  573. package/core/built/admin/assets/overview-DaLhpRrC.js +0 -1
  574. package/core/built/admin/assets/pages-B6vr9F_D.js +0 -1
  575. package/core/built/admin/assets/popover-CFgqFDvC.js +0 -1
  576. package/core/built/admin/assets/portal-frame-DjBF-uy2.js +0 -1
  577. package/core/built/admin/assets/portal-modal-Cf0pBAk8.js +0 -1
  578. package/core/built/admin/assets/post-analytics-Buz1COoY.js +0 -1
  579. package/core/built/admin/assets/post-analytics-header-B-P0eFnT.js +0 -1
  580. package/core/built/admin/assets/posts-KY3aUhVV.js +0 -1
  581. package/core/built/admin/assets/preferences-Cq1aOiLy.js +0 -5
  582. package/core/built/admin/assets/profile-D6dHYf2o.js +0 -1
  583. package/core/built/admin/assets/select-D_RQaXgt.js +0 -1
  584. package/core/built/admin/assets/settings-B5hJKZ5C.js +0 -1
  585. package/core/built/admin/assets/settings-DIo_F-MF.js +0 -4
  586. package/core/built/admin/assets/share-modal-CLBfj377.js +0 -1
  587. package/core/built/admin/assets/shim-ClF_m5ux.js +0 -1
  588. package/core/built/admin/assets/slack-modal-Bt9I_tEo.js +0 -1
  589. package/core/built/admin/assets/sort-button-DMBXF7tP.js +0 -1
  590. package/core/built/admin/assets/stats-B_YkF7bp.js +0 -1
  591. package/core/built/admin/assets/stats-view-BOCp9RG8.js +0 -1
  592. package/core/built/admin/assets/stripe-connect-modal-BeSukI8q.js +0 -1
  593. package/core/built/admin/assets/tag-detail-2a3BfzTW.js +0 -2
  594. package/core/built/admin/assets/tags-Dp2_8UzL.js +0 -1
  595. package/core/built/admin/assets/testimonials-modal-C9nrypNo.js +0 -1
  596. package/core/built/admin/assets/tier-detail-modal-CxRwgTPR.js +0 -1
  597. package/core/built/admin/assets/use-check-theme-limit-error-C9-QhGdV.js +0 -1
  598. package/core/built/admin/assets/use-filter-params-CSpAvgD2.js +0 -1
  599. package/core/built/admin/assets/use-growth-stats-BOmoPDHJ.js +0 -1
  600. package/core/built/admin/assets/use-post-referrers-CbXLFIex.js +0 -1
  601. package/core/built/admin/assets/use-reply-chain-data-JYFKSO83.js +0 -1
  602. package/core/built/admin/assets/use-settings-navigation-BBzro2-V.js +0 -1
  603. package/core/built/admin/assets/use-tinybird-query-D2Aeoty5.js +0 -39
  604. package/core/built/admin/assets/use-tinybird-token-DBuwMmln.js +0 -1
  605. package/core/built/admin/assets/user-detail-modal-59mBJqxN.js +0 -1
  606. package/core/built/admin/assets/users-5msE1WMs.js +0 -1
  607. package/core/built/admin/assets/web-DUuX7nE2.js +0 -2
  608. package/core/built/admin/assets/web-N8ucs2aG.js +0 -1
  609. package/core/server/api/endpoints/member-custom-fields.js +0 -100
  610. package/core/server/services/jobs/worker-model-event-bridge.js +0 -149
  611. package/core/server/services/members/jobs/clean-expired-comped.js +0 -132
  612. package/core/server/services/update-check/run-update-check.js +0 -63
  613. /package/core/server/lib/{db-date.js → db-types/date.js} +0 -0
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.AutomationActionsImporter = void 0;
7
7
  const errors_1 = __importDefault(require("@tryghost/errors"));
8
8
  const table_importer_1 = require("./table-importer");
9
- const db_date_1 = require("../../../lib/db-date");
9
+ const date_1 = require("../../../lib/db-types/date");
10
10
  const random_1 = require("../utils/random");
11
11
  class AutomationActionsImporter extends table_importer_1.TableImporter {
12
12
  static table = 'automation_actions';
@@ -41,8 +41,8 @@ class AutomationActionsImporter extends table_importer_1.TableImporter {
41
41
  this.#actionIndex += 1;
42
42
  return {
43
43
  id: this.fastFakeObjectId(),
44
- created_at: (0, db_date_1.toDatabaseDate)(createdAt),
45
- updated_at: (0, db_date_1.toDatabaseDate)(createdAt),
44
+ created_at: (0, date_1.toDatabaseDate)(createdAt),
45
+ updated_at: (0, date_1.toDatabaseDate)(createdAt),
46
46
  deleted_at: null,
47
47
  automation_id: this.#automation.id,
48
48
  type,
@@ -8,7 +8,7 @@ const faker_1 = require("@faker-js/faker");
8
8
  const errors_1 = __importDefault(require("@tryghost/errors"));
9
9
  const lodash_1 = require("lodash");
10
10
  const table_importer_1 = require("./table-importer");
11
- const db_date_1 = require("../../../lib/db-date");
11
+ const date_1 = require("../../../lib/db-types/date");
12
12
  class AutomationRunStepsImporter extends table_importer_1.TableImporter {
13
13
  static table = 'automation_run_steps';
14
14
  static dependencies = [
@@ -86,12 +86,12 @@ class AutomationRunStepsImporter extends table_importer_1.TableImporter {
86
86
  ? requestedStepCount
87
87
  : actionCount;
88
88
  fullPathGeneratedForAutomation.add(run.automation_id);
89
- const runCreatedAt = (0, db_date_1.fromDatabaseDate)(run.created_at);
89
+ const runCreatedAt = (0, date_1.fromDatabaseDate)(run.created_at);
90
90
  const lastStepStatus = faker_1.faker.helpers.arrayElement(['pending', 'finished', 'failed']);
91
91
  for (let index = 0; index < runStepCount; index += 1) {
92
92
  const createdAt = new Date(runCreatedAt);
93
93
  createdAt.setHours(createdAt.getHours() + index);
94
- const createdAtString = (0, db_date_1.toDatabaseDate)(createdAt);
94
+ const createdAtString = (0, date_1.toDatabaseDate)(createdAt);
95
95
  const status = index === runStepCount - 1 ? lastStepStatus : 'finished';
96
96
  const isTerminal = status !== 'pending';
97
97
  steps.push({
@@ -9,7 +9,7 @@ const errors_1 = __importDefault(require("@tryghost/errors"));
9
9
  const strict_1 = __importDefault(require("node:assert/strict"));
10
10
  const table_importer_1 = require("./table-importer");
11
11
  const parse_email_address_1 = require("@tryghost/parse-email-address");
12
- const db_date_1 = require("../../../lib/db-date");
12
+ const date_1 = require("../../../lib/db-types/date");
13
13
  const random_1 = require("../utils/random");
14
14
  const assertExampleEmailDomain = (email) => {
15
15
  const { domain } = (0, parse_email_address_1.parseEmailAddress)(email) ?? {};
@@ -51,14 +51,14 @@ class AutomationRunsImporter extends table_importer_1.TableImporter {
51
51
  });
52
52
  }
53
53
  const member = faker_1.faker.helpers.arrayElement(this.#members);
54
- const automationCreatedAt = (0, db_date_1.fromDatabaseDate)(this.#automation.created_at);
55
- const memberCreatedAt = (0, db_date_1.fromDatabaseDate)(member.created_at);
54
+ const automationCreatedAt = (0, date_1.fromDatabaseDate)(this.#automation.created_at);
55
+ const memberCreatedAt = (0, date_1.fromDatabaseDate)(member.created_at);
56
56
  const createdAt = (0, random_1.randomDateBetween)(new Date(Math.max(automationCreatedAt.valueOf(), memberCreatedAt.valueOf())), new Date());
57
57
  assertExampleEmailDomain(member.email);
58
58
  return {
59
59
  id: this.fastFakeObjectId(),
60
- created_at: (0, db_date_1.toDatabaseDate)(createdAt),
61
- updated_at: (0, db_date_1.toDatabaseDate)(createdAt),
60
+ created_at: (0, date_1.toDatabaseDate)(createdAt),
61
+ updated_at: (0, date_1.toDatabaseDate)(createdAt),
62
62
  automation_id: this.#automation.id,
63
63
  member_id: member.id,
64
64
  member_email: member.email,
@@ -7,7 +7,7 @@ const string_1 = require("@tryghost/string");
7
7
  const table_importer_1 = require("./table-importer");
8
8
  // @ts-expect-error This module currently lacks type definitions.
9
9
  const blog_info_1 = require("../utils/blog-info");
10
- const db_date_1 = require("../../../lib/db-date");
10
+ const date_1 = require("../../../lib/db-types/date");
11
11
  const constants_1 = require("../../../services/member-welcome-emails/constants");
12
12
  const defaultAutomations = [
13
13
  {
@@ -40,8 +40,8 @@ class AutomationsImporter extends table_importer_1.TableImporter {
40
40
  status: faker_1.faker.helpers.arrayElement(['active', 'inactive']),
41
41
  name,
42
42
  slug,
43
- created_at: (0, db_date_1.toDatabaseDate)(createdAt),
44
- updated_at: (0, db_date_1.toDatabaseDate)(createdAt),
43
+ created_at: (0, date_1.toDatabaseDate)(createdAt),
44
+ updated_at: (0, date_1.toDatabaseDate)(createdAt),
45
45
  };
46
46
  }
47
47
  }
@@ -1,7 +1,7 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
3
  const { luck, randomDateBetween } = require('../utils/random');
4
- const { toDatabaseDate } = require('../../../lib/db-date');
4
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
5
5
 
6
6
  class CommentReportsImporter extends TableImporter {
7
7
  static table = 'comment_reports';
@@ -2,7 +2,7 @@ const { faker } = require('@faker-js/faker');
2
2
  const { TableImporter } = require('./table-importer');
3
3
  const { luck } = require('../utils/random');
4
4
  const generateEvents = require('../utils/event-generator');
5
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
5
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
6
6
 
7
7
  class CommentsImporter extends TableImporter {
8
8
  static table = 'comments';
@@ -1,7 +1,7 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
3
  const { randomDateBetween } = require('../utils/random');
4
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
4
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
5
5
 
6
6
  class EmailBatchesImporter extends TableImporter {
7
7
  static table = 'email_batches';
@@ -2,7 +2,7 @@ const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
3
  const generateEvents = require('../utils/event-generator');
4
4
  const { randomDateBetween } = require('../utils/random');
5
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
5
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
6
6
  const debug = require('@tryghost/debug')('EmailRecipientsImporter');
7
7
 
8
8
  const emailStatus = {
@@ -2,7 +2,7 @@ const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
3
  const generateEvents = require('../utils/event-generator');
4
4
  const { luck } = require('../utils/random');
5
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
5
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
6
6
 
7
7
  class EmailsImporter extends TableImporter {
8
8
  static table = 'emails';
@@ -2,7 +2,7 @@ const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
3
  const { slugify } = require('@tryghost/string');
4
4
  const { blogStartDate } = require('../utils/blog-info');
5
- const { toDatabaseDate } = require('../../../lib/db-date');
5
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
6
6
 
7
7
  class LabelsImporter extends TableImporter {
8
8
  static table = 'labels';
@@ -1,7 +1,7 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
3
  const { luck, randomDateBetween } = require('../utils/random');
4
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
4
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
5
5
 
6
6
  class MembersClickEventsImporter extends TableImporter {
7
7
  static table = 'members_click_events';
@@ -1,7 +1,7 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
3
  const { luck } = require('../utils/random');
4
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
4
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
5
5
 
6
6
  class MembersCreatedEventsImporter extends TableImporter {
7
7
  static table = 'members_created_events';
@@ -1,6 +1,6 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { luck, randomDateBetween } = require('../utils/random');
3
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
3
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
4
4
 
5
5
  class MembersFeedbackImporter extends TableImporter {
6
6
  static table = 'members_feedback';
@@ -4,7 +4,7 @@ const { faker: americanFaker } = require('@faker-js/faker/locale/en_US');
4
4
  const { blogStartDate: startTime } = require('../utils/blog-info');
5
5
  const generateEvents = require('../utils/event-generator');
6
6
  const { luck } = require('../utils/random');
7
- const { toDatabaseDate } = require('../../../lib/db-date');
7
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
8
8
  const debug = require('@tryghost/debug')('MembersImporter');
9
9
 
10
10
  class MembersImporter extends TableImporter {
@@ -1,7 +1,7 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { luck } = require('../utils/random');
3
3
  const generateEvents = require('../utils/event-generator');
4
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
4
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
5
5
 
6
6
  class MembersLoginEventsImporter extends TableImporter {
7
7
  static table = 'members_login_events';
@@ -1,7 +1,7 @@
1
1
  const { faker } = require('@faker-js/faker');
2
2
  const { TableImporter } = require('./table-importer');
3
3
  const { luck } = require('../utils/random');
4
- const { toDatabaseDate } = require('../../../lib/db-date');
4
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
5
5
 
6
6
  class MembersProductsImporter extends TableImporter {
7
7
  static table = 'members_products';
@@ -1,6 +1,6 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { randomDateBetween } = require('../utils/random');
3
- const { toDatabaseDate } = require('../../../lib/db-date');
3
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
4
4
 
5
5
  class MembersStatusEventsImporter extends TableImporter {
6
6
  static table = 'members_status_events';
@@ -1,6 +1,6 @@
1
1
  const { faker } = require('@faker-js/faker');
2
2
  const { TableImporter } = require('./table-importer');
3
- const { fromDatabaseDate } = require('../../../lib/db-date');
3
+ const { fromDatabaseDate } = require('../../../lib/db-types/date');
4
4
 
5
5
  class MembersStripeCustomersImporter extends TableImporter {
6
6
  static table = 'members_stripe_customers';
@@ -2,7 +2,7 @@ const { faker } = require('@faker-js/faker');
2
2
  const { TableImporter } = require('./table-importer');
3
3
  const generateEvents = require('../utils/event-generator');
4
4
  const { luck } = require('../utils/random');
5
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
5
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
6
6
 
7
7
  class MembersStripeCustomersSubscriptionsImporter extends TableImporter {
8
8
  static table = 'members_stripe_customers_subscriptions';
@@ -1,6 +1,6 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { luck, randomDateBetween } = require('../utils/random');
3
- const { toDatabaseDate } = require('../../../lib/db-date');
3
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
4
4
 
5
5
  class MembersSubscribeEventsImporter extends TableImporter {
6
6
  static table = 'members_subscribe_events';
@@ -1,7 +1,7 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
3
  const { luck } = require('../utils/random');
4
- const { fromDatabaseDate } = require('../../../lib/db-date');
4
+ const { fromDatabaseDate } = require('../../../lib/db-types/date');
5
5
 
6
6
  class MembersSubscriptionCreatedEventsImporter extends TableImporter {
7
7
  static table = 'members_subscription_created_events';
@@ -2,7 +2,7 @@ const { faker } = require('@faker-js/faker');
2
2
  const errors = require('@tryghost/errors');
3
3
  const { TableImporter } = require('./table-importer');
4
4
  const { randomDateBetween } = require('../utils/random');
5
- const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-date');
5
+ const { fromDatabaseDate, toDatabaseDate } = require('../../../lib/db-types/date');
6
6
 
7
7
  class OfferRedemptionsImporter extends TableImporter {
8
8
  static table = 'offer_redemptions';
@@ -1,7 +1,7 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { slugify } = require('@tryghost/string');
3
3
  const { blogStartDate } = require('../utils/blog-info');
4
- const { toDatabaseDate } = require('../../../lib/db-date');
4
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
5
5
 
6
6
  const offerTemplates = [
7
7
  {
@@ -2,7 +2,7 @@ const { faker } = require('@faker-js/faker');
2
2
  const { slugify } = require('@tryghost/string');
3
3
  const { luck } = require('../utils/random');
4
4
  const { TableImporter } = require('./table-importer');
5
- const { toDatabaseDate } = require('../../../lib/db-date');
5
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
6
6
 
7
7
  class PostsImporter extends TableImporter {
8
8
  static table = 'posts';
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.TableImporter = void 0;
7
7
  const debug_1 = __importDefault(require("@tryghost/debug"));
8
- const db_date_1 = require("../../../lib/db-date");
8
+ const date_1 = require("../../../lib/db-types/date");
9
9
  const node_path_1 = __importDefault(require("node:path"));
10
10
  const node_fs_1 = __importDefault(require("node:fs"));
11
11
  const papaparse_1 = __importDefault(require("papaparse"));
@@ -101,7 +101,7 @@ class TableImporter {
101
101
  mutableObj[key] = value ? 1 : 0;
102
102
  }
103
103
  else if (value instanceof Date) {
104
- mutableObj[key] = (0, db_date_1.toDatabaseDate)(value);
104
+ mutableObj[key] = (0, date_1.toDatabaseDate)(value);
105
105
  }
106
106
  else if (value === null) {
107
107
  mutableObj[key] = '\\N';
@@ -1,7 +1,7 @@
1
1
  const { faker } = require('@faker-js/faker');
2
2
  const { slugify } = require('@tryghost/string');
3
3
  const { TableImporter } = require('./table-importer');
4
- const { toDatabaseDate } = require('../../../lib/db-date');
4
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
5
5
 
6
6
  class TagsImporter extends TableImporter {
7
7
  static table = 'tags';
@@ -2,7 +2,7 @@ const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
3
  const { slugify } = require('@tryghost/string');
4
4
  const security = require('@tryghost/security');
5
- const { toDatabaseDate } = require('../../../lib/db-date');
5
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
6
6
 
7
7
  class UsersImporter extends TableImporter {
8
8
  static table = 'users';
@@ -1,6 +1,6 @@
1
1
  const { TableImporter } = require('./table-importer');
2
2
  const { faker } = require('@faker-js/faker');
3
- const { toDatabaseDate } = require('../../../lib/db-date');
3
+ const { toDatabaseDate } = require('../../../lib/db-types/date');
4
4
 
5
5
  class WebMentionsImporter extends TableImporter {
6
6
  static table = 'mentions';
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.luck = void 0;
4
4
  exports.randomDateBetween = randomDateBetween;
5
5
  const faker_1 = require("@faker-js/faker");
6
- const db_date_1 = require("../../../lib/db-date");
6
+ const date_1 = require("../../../lib/db-types/date");
7
7
  /**
8
8
  * Adds another degree of randomness into some decisions
9
9
  * @param lowerThan Only this % of people will achieve this luck
@@ -15,7 +15,7 @@ const luck = (lowerThan) => faker_1.faker.number.int({
15
15
  }) <= lowerThan;
16
16
  exports.luck = luck;
17
17
  function randomDateBetween(start, end) {
18
- const earliest = (0, db_date_1.fromDatabaseDate)(start);
19
- const latest = (0, db_date_1.fromDatabaseDate)(end);
18
+ const earliest = (0, date_1.fromDatabaseDate)(start);
19
+ const latest = (0, date_1.fromDatabaseDate)(end);
20
20
  return latest > earliest ? faker_1.faker.date.between({ from: earliest, to: latest }) : earliest;
21
21
  }
@@ -18,6 +18,7 @@ const flush_logs_1 = require("../shared/flush-logs");
18
18
  const moment_1 = __importDefault(require("moment"));
19
19
  const stoppable_1 = __importDefault(require("stoppable"));
20
20
  const node_util_1 = require("node:util");
21
+ const node_assert_1 = __importDefault(require("node:assert"));
21
22
  const debug = (0, debug_1.default)('server');
22
23
  const messages = {
23
24
  cantTouchThis: "Can't touch this",
@@ -216,7 +217,7 @@ class GhostServer {
216
217
  */
217
218
  async _stopServer() {
218
219
  const { httpServer } = this;
219
- assert(httpServer, 'httpServer must be set before stopping server');
220
+ (0, node_assert_1.default)(httpServer, 'httpServer must be set before stopping server');
220
221
  const startTime = Date.now();
221
222
  try {
222
223
  return await (0, node_util_1.promisify)(httpServer.stop.bind(httpServer))();
@@ -280,7 +281,7 @@ class GhostServer {
280
281
  const connectionInterval = setInterval(() => this.httpServer?.getConnections((_err, connections) => logging_1.default.warn(`${connections} connections currently open`)), 5000);
281
282
  // Output a notice when the server closes
282
283
  const { httpServer } = this;
283
- assert(httpServer, 'httpServer must be set before starting test mode');
284
+ (0, node_assert_1.default)(httpServer, 'httpServer must be set before starting test mode');
284
285
  httpServer.on('close', function () {
285
286
  clearInterval(connectionInterval);
286
287
  logging_1.default.warn('Server has fully closed');
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DbBoolean = void 0;
4
+ const zod_1 = require("zod");
5
+ /**
6
+ * A boolean column, whichever engine handed it back.
7
+ *
8
+ * SQLite has no boolean type and answers with 0 or 1; MySQL answers with a boolean. Every
9
+ * read normalises so nothing downstream has to know which database it is talking to, and
10
+ * so a falsy check never has to reason about the number zero.
11
+ *
12
+ * Encoding leaves the value alone: a boolean column takes a boolean, and takes the 0 or 1
13
+ * it gave us just as happily.
14
+ */
15
+ exports.DbBoolean = zod_1.z.codec(zod_1.z.union([zod_1.z.boolean(), zod_1.z.number()]), zod_1.z.boolean(), {
16
+ decode: (stored) => Boolean(stored),
17
+ encode: (value) => value,
18
+ });
@@ -31,6 +31,12 @@ class ImageSize {
31
31
  },
32
32
  response_timeout: this.config.get('times:getImageSizeTimeoutInMS') || 10000,
33
33
  };
34
+
35
+ // Coalesces concurrent getImageSizeFromUrl() calls for the same URL so we only
36
+ // ever issue one underlying request/read per URL at a time. A single post's
37
+ // coverImage/ogImage/twitterImage often resolve to the same feature_image URL
38
+ // and are looked up concurrently, which otherwise fans out into duplicate requests.
39
+ this.inFlightImageSizeLookups = new Map();
34
40
  }
35
41
 
36
42
  // processes the Buffer result of an image file using image-size
@@ -153,6 +159,24 @@ class ImageSize {
153
159
  * @returns {Promise<Object>} imageObject or error
154
160
  */
155
161
  getImageSizeFromUrl(imagePath) {
162
+ if (this.inFlightImageSizeLookups.has(imagePath)) {
163
+ return this.inFlightImageSizeLookups.get(imagePath);
164
+ }
165
+
166
+ const promise = this._getImageSizeFromUrl(imagePath).finally(() => {
167
+ this.inFlightImageSizeLookups.delete(imagePath);
168
+ });
169
+ this.inFlightImageSizeLookups.set(imagePath, promise);
170
+
171
+ return promise;
172
+ }
173
+
174
+ /**
175
+ * @description read image dimensions from URL, without in-flight deduplication
176
+ * @param {string} imagePath as URL
177
+ * @returns {Promise<Object>} imageObject or error
178
+ */
179
+ _getImageSizeFromUrl(imagePath) {
156
180
  if (this.storageUtils.isLocalImage(imagePath)) {
157
181
  // don't make a request for a locally stored image
158
182
  return this.getImageSizeFromStoragePath(imagePath);
@@ -37,7 +37,7 @@ async function parse(path) {
37
37
  message: tpl(messages.themeFileIsMalformed),
38
38
  context: path,
39
39
  err: parseError,
40
- help: tpl(messages.willBeRequired, { url: 'https://ghost.org/docs/themes/' }),
40
+ help: tpl(messages.willBeRequired, { url: 'https://docs.ghost.org/themes/' }),
41
41
  });
42
42
  }
43
43
 
@@ -47,7 +47,7 @@ async function parse(path) {
47
47
  throw new errors.IncorrectUsageError({
48
48
  message: tpl(messages.nameOrVersionMissing),
49
49
  context: path,
50
- help: tpl(messages.willBeRequired, { url: 'https://ghost.org/docs/themes/' }),
50
+ help: tpl(messages.willBeRequired, { url: 'https://docs.ghost.org/themes/' }),
51
51
  });
52
52
  }
53
53
 
@@ -0,0 +1,31 @@
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.promisePool = void 0;
7
+ const errors_1 = __importDefault(require("@tryghost/errors"));
8
+ const validateMaxConcurrency = (maxConcurrency) => {
9
+ if (maxConcurrency < 1 || !Number.isSafeInteger(maxConcurrency)) {
10
+ throw new errors_1.default.IncorrectUsageError({
11
+ message: 'Concurrency must be a positive integer',
12
+ });
13
+ }
14
+ };
15
+ /**
16
+ * Run promise-returning tasks with a bounded level of concurrency.
17
+ */
18
+ const promisePool = async (tasks, maxConcurrency) => {
19
+ validateMaxConcurrency(maxConcurrency);
20
+ const taskIterator = tasks.values();
21
+ const concurrency = Math.min(maxConcurrency, tasks.length);
22
+ const workers = Array(concurrency)
23
+ .fill(taskIterator)
24
+ .map(async (workerIterator) => {
25
+ for (const task of workerIterator) {
26
+ await task();
27
+ }
28
+ });
29
+ await Promise.all(workers);
30
+ };
31
+ exports.promisePool = promisePool;
@@ -3,7 +3,6 @@ const crypto = require('crypto');
3
3
  const _ = require('lodash');
4
4
  const { chainTransformers } = require('@tryghost/mongo-utils');
5
5
  const config = require('../../shared/config');
6
- const labs = require('../../shared/labs');
7
6
  const { MemberCommentingCodec } = require('../services/members/commenting');
8
7
  const {
9
8
  CUSTOM_FIELDS_RELATION,
@@ -191,18 +190,12 @@ const Member = ghostBookshelf.Model.extend(
191
190
  ];
192
191
  },
193
192
 
194
- // Chain the custom-field filter transformer at this single choke point the method
195
- // every members query routes its filter through (list, CSV export, bulk edit/destroy,
196
- // count, email send all reach it via findPage or getFilteredCollectionQuery) — so a
197
- // saved `custom_fields.*` segment works the same everywhere without each call site
198
- // wiring it. Runs only behind the flag and only when the filter names the relation; the
199
- // transformer maps the public `key`/`value` grammar onto the leaf-row columns.
193
+ // Every members query routes its filter through this one method: list, CSV export, bulk
194
+ // edit and delete, counts and email sends all reach it via findPage or
195
+ // getFilteredCollectionQuery. Chaining the metafield filter transformer here covers them
196
+ // all without any call site wiring it.
200
197
  applyDefaultAndCustomFilters(options) {
201
- if (
202
- labs.isSet('membersCustomFields') &&
203
- options.filter &&
204
- options.filter.includes(`${CUSTOM_FIELDS_RELATION.tableNameAs}.`)
205
- ) {
198
+ if (options.filter && options.filter.includes(`${CUSTOM_FIELDS_RELATION.tableNameAs}.`)) {
206
199
  const transformer = createCustomFieldsFilterTransformer();
207
200
  options.mongoTransformer = options.mongoTransformer
208
201
  ? chainTransformers(options.mongoTransformer, transformer)
@@ -213,11 +206,7 @@ const Member = ghostBookshelf.Model.extend(
213
206
 
214
207
  filterRelations() {
215
208
  return {
216
- // Custom field values are filterable only behind the feature flag. Gating the
217
- // relation here (rather than the whole model) means a `custom_fields.*` filter
218
- // is simply an unknown relation when the flag is off, and the filter is
219
- // rejected — nothing to special-case downstream.
220
- ...(labs.isSet('membersCustomFields') ? { custom_fields: CUSTOM_FIELDS_RELATION } : {}),
209
+ metafields: CUSTOM_FIELDS_RELATION,
221
210
  labels: {
222
211
  tableName: 'labels',
223
212
  type: 'manyToMany',
@@ -29,9 +29,9 @@ const messages = {
29
29
  notEnoughPermission: 'You do not have permission to perform this action',
30
30
  invalidNewsletter: "The newsletter parameter doesn't match any active newsletter.",
31
31
  invalidMobiledocStructure: 'Invalid mobiledoc structure.',
32
- invalidMobiledocStructureHelp: 'https://ghost.org/docs/publishing/',
32
+ invalidMobiledocStructureHelp: 'https://docs.ghost.org/publishing/',
33
33
  invalidLexicalStructure: 'Invalid lexical structure.',
34
- invalidLexicalStructureHelp: 'https://ghost.org/docs/publishing/',
34
+ invalidLexicalStructureHelp: 'https://docs.ghost.org/publishing/',
35
35
  emailOnlyWithoutNewsletter: 'Scheduling an email requires a newsletter reference.',
36
36
  };
37
37
 
@@ -149,7 +149,6 @@ module.exports.extendModel = function extendModel(Post, Posts, ghostBookshelf) {
149
149
 
150
150
  // CASE: `posts.authors` was not requested, but fetched in specific cases (see top)
151
151
  if (
152
- !this._originalOptions ||
153
152
  !this._originalOptions.withRelated ||
154
153
  this._originalOptions.withRelated.indexOf('authors') === -1
155
154
  ) {
@@ -157,10 +156,7 @@ module.exports.extendModel = function extendModel(Post, Posts, ghostBookshelf) {
157
156
  }
158
157
 
159
158
  // If the current column settings allow it...
160
- if (
161
- !options.columns ||
162
- (options.columns && options.columns.indexOf('primary_author') > -1)
163
- ) {
159
+ if (!options.columns || options.columns.indexOf('primary_author') > -1) {
164
160
  // ... attach a computed property of primary_author which is the first author
165
161
  if (attrs.authors && attrs.authors.length) {
166
162
  attrs.primary_author = attrs.authors[0];
@@ -398,20 +394,10 @@ module.exports.extendModel = function extendModel(Post, Posts, ghostBookshelf) {
398
394
  }
399
395
 
400
396
  function isOwner() {
401
- let isCorrectOwner = true;
402
-
403
397
  if (!unsafeAttrs.authors) {
404
398
  return false;
405
399
  }
406
-
407
- if (unsafeAttrs.authors) {
408
- isCorrectOwner =
409
- isCorrectOwner &&
410
- unsafeAttrs.authors.length &&
411
- unsafeAttrs.authors[0].id === context.user;
412
- }
413
-
414
- return isCorrectOwner;
400
+ return unsafeAttrs.authors.length && unsafeAttrs.authors[0].id === context.user;
415
401
  }
416
402
 
417
403
  function isPrimaryAuthor() {
@@ -43,8 +43,13 @@ const messages = {
43
43
  };
44
44
 
45
45
  /**
46
- * inactive: owner user before blog setup, suspended users
47
- * locked user: imported users, they get a random password
46
+ * `inactive`: suspended staff, who cannot sign in or reset their password.
47
+ * Also used for the initial owner before site setup is complete.
48
+ * `locked`: users whose password was randomized by an import or authentication
49
+ * reset. They must reset their password to regain access.
50
+ *
51
+ * Both statuses prevent normal sign-in, so they are grouped here. This is not
52
+ * a suspension check: isInactive() checks only the literal `inactive` status.
48
53
  */
49
54
  const inactiveStates = ['inactive', 'locked'];
50
55
 
@@ -212,6 +217,8 @@ User = ghostBookshelf.Model.extend(
212
217
  return this.save(update, { ...options, patch: true });
213
218
  },
214
219
 
220
+ // Checks the literal status, not membership in inactiveStates: locked users
221
+ // must remain eligible for password resets.
215
222
  isInactive: function isInactive() {
216
223
  return this.get('status') === 'inactive';
217
224
  },