ghost 6.58.0 → 6.59.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 (453) hide show
  1. package/components/tryghost-adapter-base-scheduling-0.2.2.tgz +0 -0
  2. package/components/tryghost-adapter-base-sso-0.1.2.tgz +0 -0
  3. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  4. package/components/tryghost-kg-default-nodes-2.2.0.tgz +0 -0
  5. package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
  6. package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
  7. package/content/themes/casper/.github/workflows/test.yml +11 -1
  8. package/content/themes/casper/AGENTS.md +25 -0
  9. package/content/themes/casper/assets/built/screen.css +1 -1
  10. package/content/themes/casper/assets/css/screen.css +15 -1
  11. package/content/themes/casper/gulpfile.js +3 -0
  12. package/content/themes/casper/package.json +8 -8
  13. package/content/themes/source/.gitattributes +5 -0
  14. package/content/themes/source/.github/workflows/test.yml +39 -0
  15. package/content/themes/source/AGENTS.md +25 -0
  16. package/content/themes/source/README.md +33 -4
  17. package/content/themes/source/assets/built/screen.css +1 -1
  18. package/content/themes/source/assets/css/screen.css +15 -0
  19. package/content/themes/source/gulpfile.js +6 -3
  20. package/content/themes/source/package.json +13 -10
  21. package/content/themes/source/pnpm-workspace.yaml +3 -0
  22. package/core/boot.js +11 -4
  23. package/core/built/admin/assets/Combination-BCm9FL4o.js +41 -0
  24. package/core/built/admin/assets/about-BdSCpjXG.js +1 -0
  25. package/core/built/admin/assets/account-migration-BpKAqo8k.js +1 -0
  26. package/core/built/admin/assets/activitypub/{account-migration-BpDeIF3G.js → account-migration-DVnYS1XG.js} +8 -8
  27. package/core/built/admin/assets/activitypub/activitypub.js +2 -2
  28. package/core/built/admin/assets/activitypub/{bluesky-sharing-aPMtrS3L.js → bluesky-sharing-DLVeE9ii.js} +31 -31
  29. package/core/built/admin/assets/activitypub/{content-formatters-BORfuA9G.js → content-formatters-DCsVic-t.js} +2 -2
  30. package/core/built/admin/assets/activitypub/{dist-ByFmDSNP2.js → dist-ByFmDSNP.js} +1 -1
  31. package/core/built/admin/assets/activitypub/{domain-CPdiB27_.js → domain-rrvDLfnK.js} +8 -8
  32. package/core/built/admin/assets/activitypub/{edit-profile-BY2PawIe.js → edit-profile-VT-piVxq.js} +23 -23
  33. package/core/built/admin/assets/activitypub/{explore-Sp9bgAwq.js → explore-DZg3m48P.js} +14 -14
  34. package/core/built/admin/assets/activitypub/{feed-BjtF4ohL.js → feed-BJqQvDMI.js} +41 -41
  35. package/core/built/admin/assets/activitypub/{field-BDOYVTg6.js → field-BezS4-1J.js} +2 -2
  36. package/core/built/admin/assets/activitypub/inbox-Uf0GVrI_.js +1284 -0
  37. package/core/built/admin/assets/activitypub/{label-1jhN-qhD.js → label-CZ6if4zK.js} +2 -2
  38. package/core/built/admin/assets/activitypub/layout-DNuYT4Gu.js +1 -0
  39. package/core/built/admin/assets/activitypub/moderation-CP6mDVky.js +340 -0
  40. package/core/built/admin/assets/activitypub/{note-nr_m_5yb.js → note-BlFkye2g.js} +16 -16
  41. package/core/built/admin/assets/activitypub/{notifications-BdcyivbT.js → notifications-GGTrGEdu.js} +163 -126
  42. package/core/built/admin/assets/activitypub/{preferences-CNqy1x9C.js → preferences-CjZXrZqr.js} +1550 -1551
  43. package/core/built/admin/assets/activitypub/{profile-DlY4rhbO.js → profile-CcXYxydm.js} +248 -248
  44. package/core/built/admin/assets/activitypub/{routes-CEHdEZzS.js → routes-nHCKlZl-.js} +1971 -1747
  45. package/core/built/admin/assets/activitypub/settings-pDzybcb3.js +315 -0
  46. package/core/built/admin/assets/activitypub/{site-CtBUCPBz.js → site-BZF0F8LN.js} +101 -101
  47. package/core/built/admin/assets/activitypub/{step-1-D9jGWyAy.js → step-1-C-Ns1Tfg.js} +3 -3
  48. package/core/built/admin/assets/activitypub/{step-3-KpUqpGWi.js → step-3-rDMNGmLg.js} +8 -8
  49. package/core/built/admin/assets/activitypub/{tabs-DvlsxTCI.js → tabs-CDjh3_Jp.js} +198 -198
  50. package/core/built/admin/assets/activitypub/{topic-filter-CIN1E2jg.js → topic-filter-CmTc8hpN.js} +2 -2
  51. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CATFd6YV.js → use-activity-pub-queries-DUDEdSdR.js} +286 -243
  52. package/core/built/admin/assets/activitypub/{use-reply-chain-data-DJ0vhA8V.js → use-reply-chain-data-TunGtmJl.js} +14 -14
  53. package/core/built/admin/assets/add-integration-modal-CXRQi1x0.js +1 -0
  54. package/core/built/admin/assets/add-newsletter-modal-t447KRYz.js +1 -0
  55. package/core/built/admin/assets/add-recommendation-modal-D882MdnR.js +1 -0
  56. package/core/built/admin/assets/{analytics-BC2oR8ay.js → analytics-Dj-WlzPf.js} +1 -1
  57. package/core/built/admin/assets/announcement-bar-modal-CwHKKw-a.js +1 -0
  58. package/core/built/admin/assets/api-keys-Boy5pLbD.js +1 -0
  59. package/core/built/admin/assets/audience-Cc40y7zQ.js +1 -0
  60. package/core/built/admin/assets/automations-DNLK5Udr.js +1 -0
  61. package/core/built/admin/assets/bluesky-sharing-Cm4aFaOl.js +1 -0
  62. package/core/built/admin/assets/breadcrumb-CcFr_ltt.js +1 -0
  63. package/core/built/admin/assets/button-BshWPHvn.js +1 -0
  64. package/core/built/admin/assets/chart-helpers-BsbzoWhK.js +1 -0
  65. package/core/built/admin/assets/{checkbox-LmClhqcS.js → checkbox-1G6KfK2q.js} +1 -1
  66. package/core/built/admin/assets/chunk-KS7C4IRE-DCsL4i4D.js +4 -0
  67. package/core/built/admin/assets/{chunk.408.1a258af360eb8d905508.js → chunk.301.5673a0caf7c49bb00212.js} +3 -3
  68. package/core/built/admin/assets/{chunk.524.4c693c3a00ac91df34fa.js → chunk.524.86db0d945468c852374b.js} +4 -4
  69. package/core/built/admin/assets/{chunk.582.20b600e329e58d12d7c2.js → chunk.582.c2f6216d3c4af303e236.js} +6 -6
  70. package/core/built/admin/assets/{code-editor-view-DqTOUnbM.js → code-editor-view-BVjtWyst.js} +1 -1
  71. package/core/built/admin/assets/{code-editor-view-bA0lfxUL.js → code-editor-view-y_zVfmCa.js} +1 -1
  72. package/core/built/admin/assets/color-picker-XEMPgNJE.js +3 -0
  73. package/core/built/admin/assets/{color-picker-field-Cv9GOJQZ.js → color-picker-field-BhplXcy5.js} +1 -1
  74. package/core/built/admin/assets/combobox-CRMJrvcQ.js +1 -0
  75. package/core/built/admin/assets/command-151T2eRx.js +1 -0
  76. package/core/built/admin/assets/comments-Bjbl9toF.js +1 -0
  77. package/core/built/admin/assets/confirmation-context-QmFxSjWy.js +1 -0
  78. package/core/built/admin/assets/{content-api-modal-BOFWRUkC.js → content-api-modal-CpeABXne.js} +1 -1
  79. package/core/built/admin/assets/{copy-field-8biQvNMD.js → copy-field-CglgRZyG.js} +1 -1
  80. package/core/built/admin/assets/custom-field-type-option-DSyJw4T4.js +1 -0
  81. package/core/built/admin/assets/custom-integration-modal-DWB9bRVp.js +1 -0
  82. package/core/built/admin/assets/date-range-select-kaKtab5O.js +1 -0
  83. package/core/built/admin/assets/design-and-theme-modal-86s2AaZ-.js +23 -0
  84. package/core/built/admin/assets/dirty-confirm-dialog-CTFdXXy7.js +1 -0
  85. package/core/built/admin/assets/disabled-sources-indicator-BFyCxUOx.js +1 -0
  86. package/core/built/admin/assets/dist-C1-Oy3Db.js +1 -0
  87. package/core/built/admin/assets/dist-CJJqYPep.js +1 -0
  88. package/core/built/admin/assets/dist-CNlMj7ML.js +1 -0
  89. package/core/built/admin/assets/dist-Kll2twSG.js +1 -0
  90. package/core/built/admin/assets/domain-BOoMvBG3.js +1 -0
  91. package/core/built/admin/assets/{dropzone-B21Entqz.js → dropzone-B6KWzsrb.js} +2 -2
  92. package/core/built/admin/assets/edit-profile-BagrYOrN.js +1 -0
  93. package/core/built/admin/assets/editor-AaJjqbpk.js +8 -0
  94. package/core/built/admin/assets/embed-signup-form-modal-B8L95KwR.js +8 -0
  95. package/core/built/admin/assets/explore-xbykZTlO.js +1 -0
  96. package/core/built/admin/assets/feed-BAHSipWv.js +1 -0
  97. package/core/built/admin/assets/{field-BQqLTgHM.js → field-kJYZ2T3C.js} +1 -1
  98. package/core/built/admin/assets/{filter-sources-FgqoUIL7.js → filter-sources-QeqFGNRB.js} +1 -1
  99. package/core/built/admin/assets/{filters-D0uIMD8n.js → filters-By5KQeV6.js} +1 -1
  100. package/core/built/admin/assets/filters-DtYpAkDd.js +1 -0
  101. package/core/built/admin/assets/first-promoter-modal-8A02oyjA.js +1 -0
  102. package/core/built/admin/assets/{ghost-ba408063a5922b458b4a8f216cf23251.js → ghost-f110822e67868c9fdf9a6c23754b2559.js} +9 -8
  103. package/core/built/admin/assets/gift-link-modal-DbYCyuhF.js +1 -0
  104. package/core/built/admin/assets/global-data-context-gAMDH9u1.js +1 -0
  105. package/core/built/admin/assets/growth-BSOxJGey.js +3 -0
  106. package/core/built/admin/assets/growth-BZTjURq5.js +1 -0
  107. package/core/built/admin/assets/history-modal-CCgWtlZE.js +1 -0
  108. package/core/built/admin/assets/html-field-BQC7XyLA.js +1 -0
  109. package/core/built/admin/assets/iframe-buffering-DnOlWTD4.js +1 -0
  110. package/core/built/admin/assets/{images-3cQgwfTD.js → images-D5UKr2SG.js} +1 -1
  111. package/core/built/admin/assets/{inbox-Dz_JblyJ.js → inbox-DvN15_YH.js} +45 -39
  112. package/core/built/admin/assets/index-BJz9Zlsc.js +67 -0
  113. package/core/built/admin/assets/index-Dg8cdR8E.css +1 -0
  114. package/core/built/admin/assets/{input-group-DpogNUIt.js → input-group-BPAxETpQ.js} +1 -1
  115. package/core/built/admin/assets/invite-user-modal-jcUaaNkW.js +1 -0
  116. package/core/built/admin/assets/{koenig-lexical-2KuqRwZI.js → koenig-lexical-CfXTYeli.js} +1 -1
  117. package/core/built/admin/assets/koenig-loader-DktFM3Uh.js +1 -0
  118. package/core/built/admin/assets/{kpi-card-Ck3tT2Wg.js → kpi-card-fUHZlzBX.js} +1 -1
  119. package/core/built/admin/assets/{kpi-card-DDIxptaS.js → kpi-card-o0urVtNL.js} +1 -1
  120. package/core/built/admin/assets/kpi-helpers-2FTF4a3-.js +1 -0
  121. package/core/built/admin/assets/kpi-tabs-B8-_k2dQ.js +1 -0
  122. package/core/built/admin/assets/{label-DodDsMzn.js → label-CiRS3i_f.js} +1 -1
  123. package/core/built/admin/assets/label-picker-ao7tuPaK.js +1 -0
  124. package/core/built/admin/assets/layout-DC6QGDaw.js +1 -0
  125. package/core/built/admin/assets/member-custom-fields-BW756-EV.js +1 -0
  126. package/core/built/admin/assets/member-detail-CGGgUTSl.js +1 -0
  127. package/core/built/admin/assets/members-ZcPthwG0.js +11 -0
  128. package/core/built/admin/assets/moderation-24bElWs3.js +1 -0
  129. package/core/built/admin/assets/multi-select-combobox-CZPrgz-Z.js +1 -0
  130. package/core/built/admin/assets/navigation-modal-BiTP4U_J.js +1 -0
  131. package/core/built/admin/assets/newsletter-B3Ihwizp.js +1 -0
  132. package/core/built/admin/assets/newsletter-detail-modal-CYsu4qhl.js +1 -0
  133. package/core/built/admin/assets/newsletter-emails-CDPR4-SP.js +1 -0
  134. package/core/built/admin/assets/newsletters-bJiYLJWl.js +1 -0
  135. package/core/built/admin/assets/note-7f6urVVA.js +1 -0
  136. package/core/built/admin/assets/notifications-rosQCyXH.js +1 -0
  137. package/core/built/admin/assets/offers-container-modal-J2j6NpDL.js +1 -0
  138. package/core/built/admin/assets/onboarding-route-DTjcThKl.js +1 -0
  139. package/core/built/admin/assets/overview-BxvWzGaf.js +1 -0
  140. package/core/built/admin/assets/overview-D6JG0hkZ.js +1 -0
  141. package/core/built/admin/assets/{page-header-VLPJfj_d.js → page-header-l7vXmLIw.js} +1 -1
  142. package/core/built/admin/assets/pintura-modal-BGHmudVB.js +1 -0
  143. package/core/built/admin/assets/portal-frame-DVc4VHX_.js +1 -0
  144. package/core/built/admin/assets/portal-modal-BCOcdiRi.js +1 -0
  145. package/core/built/admin/assets/{post-analytics-Gv81eN_g.js → post-analytics-CTSZMK6I.js} +1 -1
  146. package/core/built/admin/assets/post-analytics-header-Dt4RQGq0.js +1 -0
  147. package/core/built/admin/assets/{post-analytics-provider-O2YjZMhN.js → post-analytics-provider-C4ydiboO.js} +1 -1
  148. package/core/built/admin/assets/post-share-modal-DjH_a_1L.js +1 -0
  149. package/core/built/admin/assets/preferences-BLo6VJUS.js +5 -0
  150. package/core/built/admin/assets/preview-modal-BOgjgsJL.js +1 -0
  151. package/core/built/admin/assets/profile-DG6iCdRH.js +1 -0
  152. package/core/built/admin/assets/radio-group-ChHD4EQJ.js +1 -0
  153. package/core/built/admin/assets/router-provider-Bexg1t-V.js +1 -0
  154. package/core/built/admin/assets/select-ChxknEcT.js +1 -0
  155. package/core/built/admin/assets/settings-B0VDAhgV.js +1 -0
  156. package/core/built/admin/assets/settings-Dwo3CeAD.js +4 -0
  157. package/core/built/admin/assets/settings-breadcrumbs-sLDNedBW.js +1 -0
  158. package/core/built/admin/assets/share-modal-BDb2nacg.js +1 -0
  159. package/core/built/admin/assets/skeleton-D7hwjdry.js +1 -0
  160. package/core/built/admin/assets/slack-modal-CwNAD69x.js +1 -0
  161. package/core/built/admin/assets/sort-button-DhqpxkrO.js +1 -0
  162. package/core/built/admin/assets/source-icon-BPsD5ees.js +1 -0
  163. package/core/built/admin/assets/stats-WdDJ8c_1.js +1 -0
  164. package/core/built/admin/assets/stats-view-J3PI2eT_.js +1 -0
  165. package/core/built/admin/assets/step-1-2q1SjerQ.js +1 -0
  166. package/core/built/admin/assets/step-2-D5mJB3Uu.js +1 -0
  167. package/core/built/admin/assets/step-3-BpAuYTGZ.js +2 -0
  168. package/core/built/admin/assets/{stripe-button-Bh4p6Wud.js → stripe-button-DDoUKN5a.js} +1 -1
  169. package/core/built/admin/assets/stripe-connect-modal-pMdF3t4S.js +1 -0
  170. package/core/built/admin/assets/switch-B_1yU3Aw.js +1 -0
  171. package/core/built/admin/assets/{table-DghJxZMH.js → table-CrqQtkR2.js} +1 -1
  172. package/core/built/admin/assets/tabs-BhzVdh5p.js +1 -0
  173. package/core/built/admin/assets/tag-detail-CwJhI4qg.js +2 -0
  174. package/core/built/admin/assets/tags-CvJ0PgrB.js +1 -0
  175. package/core/built/admin/assets/testimonials-modal-CV82IAnI.js +1 -0
  176. package/core/built/admin/assets/tier-detail-modal-pLzCOfeg.js +1 -0
  177. package/core/built/admin/assets/toggle-group-BW_T4yn6.js +1 -0
  178. package/core/built/admin/assets/topic-filter-DkXjDejV.js +1 -0
  179. package/core/built/admin/assets/transistor-modal-TMRvHZ6B.js +1 -0
  180. package/core/built/admin/assets/unsplash-modal-CV92RdPw.js +1 -0
  181. package/core/built/admin/assets/{use-analytics-data-IxJcSjc9.js → use-analytics-data-BM_uV9SU.js} +1 -1
  182. package/core/built/admin/assets/use-check-theme-limit-error-DkBnXMSY.js +1 -0
  183. package/core/built/admin/assets/use-confirm-unload-SzlkOIpm.js +1 -0
  184. package/core/built/admin/assets/use-feature-flag-cahOlMva.js +1 -0
  185. package/core/built/admin/assets/use-filter-params-BX5qf0Cg.js +1 -0
  186. package/core/built/admin/assets/{use-growth-stats-1NW-8eEZ.js → use-growth-stats-D0LlWBe6.js} +1 -1
  187. package/core/built/admin/assets/{use-hash-link-navigation-guard-B9j6HIrV.js → use-hash-link-navigation-guard-B_Y3FhYH.js} +1 -1
  188. package/core/built/admin/assets/use-limiter-D3DHSoAj.js +2 -0
  189. package/core/built/admin/assets/{use-pintura-config-BjFChXV1.js → use-pintura-config-D63Xu0SG.js} +1 -1
  190. package/core/built/admin/assets/use-pintura-editor-Z51aFnC8.js +1 -0
  191. package/core/built/admin/assets/{use-post-referrers-Dp1BnTAK.js → use-post-referrers-Cvymr3gt.js} +1 -1
  192. package/core/built/admin/assets/use-query-params-BfzuqbcD.js +1 -0
  193. package/core/built/admin/assets/use-reply-chain-data-Dc18Ujqo.js +1 -0
  194. package/core/built/admin/assets/use-setting-group-DYRIzqC0.js +1 -0
  195. package/core/built/admin/assets/use-settings-navigation-aDSLtmEl.js +1 -0
  196. package/core/built/admin/assets/{use-simple-pagination-DsEGSJhe.js → use-simple-pagination-B2TdNX67.js} +1 -1
  197. package/core/built/admin/assets/{use-tinybird-query-Ci_DiPkX.js → use-tinybird-query-BvQIVuRc.js} +1 -1
  198. package/core/built/admin/assets/{use-tinybird-token-CsUwc722.js → use-tinybird-token-COQTPIwL.js} +1 -1
  199. package/core/built/admin/assets/use-upgrade-route-BZf1g59m.js +1 -0
  200. package/core/built/admin/assets/{use-url-input-BEZJpVgN.js → use-url-input-PcqZadXa.js} +1 -1
  201. package/core/built/admin/assets/user-detail-modal-DeO3SAZq.js +1 -0
  202. package/core/built/admin/assets/{virtual-list-D5ugXyZY.js → virtual-list-D3MfPNOh.js} +1 -1
  203. package/core/built/admin/assets/web-CDdyG7z1.js +2 -0
  204. package/core/built/admin/assets/web-CwQ8_QUc.js +1 -0
  205. package/core/built/admin/assets/zapier-modal-a7t75iNI.js +1 -0
  206. package/core/built/admin/index.html +15 -12
  207. package/core/frontend/apps/private-blogging/lib/helpers/input_password.js +2 -1
  208. package/core/frontend/helpers/body_class.js +2 -1
  209. package/core/frontend/helpers/cancel_link.js +2 -1
  210. package/core/frontend/helpers/color_to_rgba.js +2 -1
  211. package/core/frontend/helpers/content_api_key.js +2 -1
  212. package/core/frontend/helpers/content_api_url.js +2 -1
  213. package/core/frontend/helpers/contrast_text_color.js +2 -1
  214. package/core/frontend/helpers/facebook_url.js +2 -1
  215. package/core/frontend/helpers/ghost_foot.js +2 -1
  216. package/core/frontend/helpers/ghost_head.js +2 -1
  217. package/core/frontend/helpers/has.js +4 -2
  218. package/core/frontend/helpers/link_class.js +2 -1
  219. package/core/frontend/helpers/meta_description.js +2 -1
  220. package/core/frontend/helpers/meta_title.js +2 -1
  221. package/core/frontend/helpers/navigation.js +113 -22
  222. package/core/frontend/helpers/page_url.js +2 -1
  223. package/core/frontend/helpers/post_class.js +2 -1
  224. package/core/frontend/helpers/reading_time.js +2 -1
  225. package/core/frontend/helpers/social_accounts.js +2 -1
  226. package/core/frontend/helpers/social_url.js +2 -1
  227. package/core/frontend/helpers/total_members.js +2 -1
  228. package/core/frontend/helpers/total_paid_members.js +2 -1
  229. package/core/frontend/helpers/tpl/navigation.hbs +1 -1
  230. package/core/frontend/helpers/twitter_url.js +2 -1
  231. package/core/frontend/public/cards.manifest.json +1 -1
  232. package/core/server/api/endpoints/posts.js +7 -4
  233. package/core/server/api/endpoints/utils/permissions.js +2 -1
  234. package/core/server/api/endpoints/utils/validators/input/settings.js +83 -1
  235. package/core/server/data/exporter/table-lists.js +1 -0
  236. package/core/server/data/importer/handlers/json.js +2 -1
  237. package/core/server/data/migrations/versions/5.19/2022-09-02-20-52-backfill-new-product-columns.js +2 -1
  238. package/core/server/data/migrations/versions/5.21/2022-10-26-04-50-member-subscription-created-batch-id.js +4 -2
  239. package/core/server/data/migrations/versions/5.22/2022-10-31-12-03-backfill-new-product-columns.js +2 -1
  240. package/core/server/data/migrations/versions/6.58/2026-08-11-21-22-48-rename-email-batches-provider-id.js +1 -1
  241. package/core/server/data/migrations/versions/6.59/2026-08-18-17-06-46-add-gift-delivery-fields-to-gifts.js +26 -0
  242. package/core/server/data/migrations/versions/6.59/2026-08-18-17-07-01-add-gift-deliveries.js +20 -0
  243. package/core/server/data/schema/commands.js +48 -24
  244. package/core/server/data/schema/schema.js +28 -7
  245. package/core/server/data/seeders/importers/automation-action-revisions-importer.js +3 -36
  246. package/core/server/data/seeders/importers/automation-actions-importer.js +5 -41
  247. package/core/server/data/seeders/importers/automation-run-steps-importer.js +3 -36
  248. package/core/server/data/seeders/importers/automation-runs-importer.js +7 -42
  249. package/core/server/data/seeders/importers/automations-importer.js +3 -36
  250. package/core/server/data/seeders/importers/comment-reports-importer.js +5 -5
  251. package/core/server/data/seeders/importers/comments-importer.js +5 -5
  252. package/core/server/data/seeders/importers/email-batches-importer.js +5 -4
  253. package/core/server/data/seeders/importers/email-recipients-importer.js +12 -20
  254. package/core/server/data/seeders/importers/emails-importer.js +6 -6
  255. package/core/server/data/seeders/importers/labels-importer.js +3 -3
  256. package/core/server/data/seeders/importers/members-click-events-importer.js +5 -5
  257. package/core/server/data/seeders/importers/members-created-events-importer.js +13 -12
  258. package/core/server/data/seeders/importers/members-feedback-importer.js +7 -7
  259. package/core/server/data/seeders/importers/members-importer.js +4 -4
  260. package/core/server/data/seeders/importers/members-login-events-importer.js +3 -3
  261. package/core/server/data/seeders/importers/members-products-importer.js +2 -2
  262. package/core/server/data/seeders/importers/members-status-events-importer.js +4 -3
  263. package/core/server/data/seeders/importers/members-stripe-customers-importer.js +2 -2
  264. package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +7 -7
  265. package/core/server/data/seeders/importers/members-subscribe-events-importer.js +3 -3
  266. package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +3 -3
  267. package/core/server/data/seeders/importers/offer-redemptions-importer.js +7 -7
  268. package/core/server/data/seeders/importers/offers-importer.js +3 -3
  269. package/core/server/data/seeders/importers/posts-importer.js +4 -4
  270. package/core/server/data/seeders/importers/table-importer.js +2 -35
  271. package/core/server/data/seeders/importers/tags-importer.js +2 -2
  272. package/core/server/data/seeders/importers/users-importer.js +2 -2
  273. package/core/server/data/seeders/importers/web-mentions-importer.js +2 -2
  274. package/core/server/data/seeders/utils/random.js +7 -0
  275. package/core/server/ghost-server.js +19 -5
  276. package/core/server/lib/db-date.js +72 -3
  277. package/core/server/models/gift-delivery.js +23 -0
  278. package/core/server/models/gift.js +9 -0
  279. package/core/server/models/index.js +3 -2
  280. package/core/server/models/settings.js +43 -4
  281. package/core/server/services/automations/database-automations-repository.js +38 -31
  282. package/core/server/services/automations/poll.js +1 -1
  283. package/core/server/services/content-import/csv/index.js +8 -0
  284. package/core/server/services/content-import/csv/parse.js +60 -0
  285. package/core/server/services/content-import/import/importer.js +222 -0
  286. package/core/server/services/content-import/import/post-data.js +52 -0
  287. package/core/server/services/content-import/import/reader.js +15 -0
  288. package/core/server/services/content-import/import/row.js +50 -0
  289. package/core/server/services/content-import/import/store.js +71 -0
  290. package/core/server/services/content-import/index.js +67 -0
  291. package/core/server/services/email-analytics/automation-email-analytics-batch-processor.js +1 -1
  292. package/core/server/services/email-analytics/index.js +3 -1
  293. package/core/server/services/email-analytics/jobs/index.js +2 -2
  294. package/core/server/services/email-service/email-service-wrapper.js +1 -1
  295. package/core/server/services/email-suppression-list/email-suppression-list.js +4 -2
  296. package/core/server/services/gifts/CONTEXT.md +27 -3
  297. package/core/server/services/gifts/README.md +8 -4
  298. package/core/server/services/gifts/constants.js +2 -1
  299. package/core/server/services/gifts/email-templates/gift-delivery.hbs +20 -0
  300. package/core/server/services/gifts/email-templates/gift-delivery.js +39 -0
  301. package/core/server/services/gifts/email-templates/gift-purchase-confirmation.hbs +2 -2
  302. package/core/server/services/gifts/email-templates/gift-purchase-confirmation.js +19 -4
  303. package/core/server/services/gifts/events/send-gift-delivery-event.js +15 -0
  304. package/core/server/services/gifts/gift-bookshelf-repository.js +23 -3
  305. package/core/server/services/gifts/gift-checkout-adapter.js +5 -3
  306. package/core/server/services/gifts/gift-codec.js +8 -0
  307. package/core/server/services/gifts/gift-delivery-bookshelf-repository.js +107 -0
  308. package/core/server/services/gifts/gift-delivery-codec.js +12 -0
  309. package/core/server/services/gifts/gift-delivery-schema.js +15 -0
  310. package/core/server/services/gifts/gift-delivery-service.js +209 -0
  311. package/core/server/services/gifts/gift-email-renderer.js +13 -1
  312. package/core/server/services/gifts/gift-email-service.js +97 -17
  313. package/core/server/services/gifts/gift-schema.js +10 -6
  314. package/core/server/services/gifts/gift-service.js +259 -34
  315. package/core/server/services/gifts/gift.js +59 -5
  316. package/core/server/services/gifts/index.js +69 -3
  317. package/core/server/services/lib/mailgun-client.js +5 -2
  318. package/core/server/services/mail/ghost-mailer.js +9 -1
  319. package/core/server/services/member-welcome-emails/service.js +6 -1
  320. package/core/server/services/members/members-api/controllers/router-controller.js +26 -8
  321. package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +100 -12
  322. package/core/server/services/stripe/stripe-api.js +3 -2
  323. package/core/server/services/stripe/webhook-controller.js +6 -3
  324. package/core/server/services/stripe/webhook-manager.js +2 -0
  325. package/core/shared/labs.js +1 -0
  326. package/package.json +9 -8
  327. package/pnpm-lock.yaml +26 -11
  328. package/pnpm-workspace.yaml +5 -6
  329. package/content/themes/source/yarn.lock +0 -6232
  330. package/core/built/admin/assets/Combination-BDvCdg1t.js +0 -41
  331. package/core/built/admin/assets/about-B_BvSyLF.js +0 -1
  332. package/core/built/admin/assets/account-migration-oJUGxnzT.js +0 -1
  333. package/core/built/admin/assets/activitypub/dist-Dqggkccr.js +0 -215
  334. package/core/built/admin/assets/activitypub/inbox-z1o2j1Tb.js +0 -1221
  335. package/core/built/admin/assets/activitypub/layout-BRMezuty.js +0 -1
  336. package/core/built/admin/assets/activitypub/moderation-CZudJi8N.js +0 -160
  337. package/core/built/admin/assets/activitypub/settings-CrSV1cux.js +0 -107
  338. package/core/built/admin/assets/add-integration-modal-BW23PDYs.js +0 -1
  339. package/core/built/admin/assets/add-newsletter-modal-M0ls8BKO.js +0 -1
  340. package/core/built/admin/assets/add-recommendation-modal-B0NeBMzl.js +0 -1
  341. package/core/built/admin/assets/announcement-bar-modal-pXBqjQE_.js +0 -1
  342. package/core/built/admin/assets/api-keys-Df6uv1dT.js +0 -1
  343. package/core/built/admin/assets/audience-BY8od8If.js +0 -1
  344. package/core/built/admin/assets/automations-DCs6Wady.js +0 -1
  345. package/core/built/admin/assets/bluesky-sharing-D0P42Cws.js +0 -1
  346. package/core/built/admin/assets/breadcrumb-MTj_cKLb.js +0 -1
  347. package/core/built/admin/assets/chart-helpers-DcO3k_vA.js +0 -1
  348. package/core/built/admin/assets/chunk-KS7C4IRE-DG9HTHQ3.js +0 -4
  349. package/core/built/admin/assets/color-picker-CBlJMv3y.js +0 -3
  350. package/core/built/admin/assets/combobox-BbPJzjCp.js +0 -1
  351. package/core/built/admin/assets/command-BrhXIlDr.js +0 -1
  352. package/core/built/admin/assets/comments-Cu4rD1aJ.js +0 -1
  353. package/core/built/admin/assets/confirmation-provider-BEdrnHns.js +0 -1
  354. package/core/built/admin/assets/custom-field-type-option-CNhAgHbJ.js +0 -1
  355. package/core/built/admin/assets/custom-integration-modal-CrGOI8IB.js +0 -1
  356. package/core/built/admin/assets/date-range-select-Bsh4gIek.js +0 -1
  357. package/core/built/admin/assets/design-and-theme-modal-DWZguwWX.js +0 -23
  358. package/core/built/admin/assets/dirty-confirm-dialog-DmdMpgyN.js +0 -1
  359. package/core/built/admin/assets/disabled-sources-indicator-BLnmyWgt.js +0 -1
  360. package/core/built/admin/assets/dist-DMFGvqqU.js +0 -1
  361. package/core/built/admin/assets/dist-DlCyLrOC.js +0 -1
  362. package/core/built/admin/assets/dist-j1xxxnY8.js +0 -1
  363. package/core/built/admin/assets/domain-Dp9TRrFp.js +0 -1
  364. package/core/built/admin/assets/edit-profile-DG6lpMsr.js +0 -1
  365. package/core/built/admin/assets/editor-CPQOrhrn.js +0 -8
  366. package/core/built/admin/assets/embed-signup-form-modal-CgWniDha.js +0 -9
  367. package/core/built/admin/assets/explore-C3rzONJv.js +0 -1
  368. package/core/built/admin/assets/feed-DpUwS1cU.js +0 -1
  369. package/core/built/admin/assets/filters-DZJT29GW.js +0 -1
  370. package/core/built/admin/assets/first-promoter-modal-DJhQQheG.js +0 -1
  371. package/core/built/admin/assets/gift-link-modal-sdFLjND9.js +0 -1
  372. package/core/built/admin/assets/global-data-provider-CixmTX00.js +0 -1
  373. package/core/built/admin/assets/growth-0YYkBEeS.js +0 -1
  374. package/core/built/admin/assets/growth-DpjAPeQT.js +0 -3
  375. package/core/built/admin/assets/history-modal-BWJ4-cJ0.js +0 -1
  376. package/core/built/admin/assets/html-field-C-oa5DEl.js +0 -1
  377. package/core/built/admin/assets/iframe-buffering-Ba9sDpi2.js +0 -1
  378. package/core/built/admin/assets/index-BOJzlYiz.js +0 -67
  379. package/core/built/admin/assets/index-Bid6LAyc.css +0 -1
  380. package/core/built/admin/assets/invite-user-modal-DCiQSiuD.js +0 -1
  381. package/core/built/admin/assets/koenig-editor-base-BApy8Q7C.js +0 -1
  382. package/core/built/admin/assets/kpi-helpers-ssbuy-hD.js +0 -1
  383. package/core/built/admin/assets/kpi-tabs-BqoIM6bI.js +0 -1
  384. package/core/built/admin/assets/label-picker-Cvvbmzb5.js +0 -1
  385. package/core/built/admin/assets/layout-DkkGyev2.js +0 -1
  386. package/core/built/admin/assets/member-custom-fields-CvGcpaiW.js +0 -1
  387. package/core/built/admin/assets/member-detail-CMCMZ47_.js +0 -1
  388. package/core/built/admin/assets/members-sRl6fNfq.js +0 -11
  389. package/core/built/admin/assets/moderation-KhKwGqI1.js +0 -1
  390. package/core/built/admin/assets/multi-select-combobox-nhCff0_K.js +0 -1
  391. package/core/built/admin/assets/navigation-modal-MDJExWDJ.js +0 -1
  392. package/core/built/admin/assets/newsletter-BIBHumfV.js +0 -1
  393. package/core/built/admin/assets/newsletter-detail-modal-CfjBMH3v.js +0 -1
  394. package/core/built/admin/assets/newsletter-emails-ClDL-7dA.js +0 -1
  395. package/core/built/admin/assets/newsletters-CBe-IPzK.js +0 -1
  396. package/core/built/admin/assets/note-HnNUOt4d.js +0 -1
  397. package/core/built/admin/assets/notifications-Cj5e-258.js +0 -1
  398. package/core/built/admin/assets/offers-container-modal-BHwHtixC.js +0 -1
  399. package/core/built/admin/assets/onboarding-route-D_4jp7Nq.js +0 -1
  400. package/core/built/admin/assets/overview-CezDdg-F.js +0 -1
  401. package/core/built/admin/assets/overview-D5mM51Lj.js +0 -1
  402. package/core/built/admin/assets/pintura-modal-BXXJ8Iaa.js +0 -1
  403. package/core/built/admin/assets/portal-frame-BLCvF8f-.js +0 -1
  404. package/core/built/admin/assets/portal-modal-DN80tAcy.js +0 -1
  405. package/core/built/admin/assets/post-analytics-header-_ydSY8qO.js +0 -1
  406. package/core/built/admin/assets/post-share-modal-CzYak_a5.js +0 -1
  407. package/core/built/admin/assets/preferences-gneLb6LV.js +0 -5
  408. package/core/built/admin/assets/preview-modal-Bkq-tgVm.js +0 -1
  409. package/core/built/admin/assets/profile-CzXmCNTC.js +0 -1
  410. package/core/built/admin/assets/radio-group-Dsq5ZEbV.js +0 -1
  411. package/core/built/admin/assets/router-provider-CkB_ArLF.js +0 -1
  412. package/core/built/admin/assets/select-xuZAuDyS.js +0 -1
  413. package/core/built/admin/assets/settings-Ct8pabhr.js +0 -1
  414. package/core/built/admin/assets/settings-KSWWQanQ.js +0 -4
  415. package/core/built/admin/assets/settings-breadcrumbs-DbPGu-Tu.js +0 -1
  416. package/core/built/admin/assets/share-modal-CdiUx9WM.js +0 -1
  417. package/core/built/admin/assets/slack-modal-BP--Z3jE.js +0 -1
  418. package/core/built/admin/assets/sort-button-CjfKdlsL.js +0 -1
  419. package/core/built/admin/assets/source-icon-DHj1h6Ts.js +0 -1
  420. package/core/built/admin/assets/stats-C615kulJ.js +0 -1
  421. package/core/built/admin/assets/stats-view-BSMRdYiN.js +0 -1
  422. package/core/built/admin/assets/step-1-pSdGYtIF.js +0 -1
  423. package/core/built/admin/assets/step-2-T9Uy4eBD.js +0 -1
  424. package/core/built/admin/assets/step-3-D4uXe_XG.js +0 -2
  425. package/core/built/admin/assets/stripe-connect-modal-C2vTvepi.js +0 -1
  426. package/core/built/admin/assets/switch-CE2NuMn-.js +0 -1
  427. package/core/built/admin/assets/tabs-l9c7FjzI.js +0 -1
  428. package/core/built/admin/assets/tag-detail-DBw_M2-p.js +0 -2
  429. package/core/built/admin/assets/tags-DoWsAG6l.js +0 -1
  430. package/core/built/admin/assets/testimonials-modal-BZKePE2T.js +0 -1
  431. package/core/built/admin/assets/tier-detail-modal-D65pVWsN.js +0 -1
  432. package/core/built/admin/assets/toggle-group-uJnl42w3.js +0 -1
  433. package/core/built/admin/assets/topic-filter-BM7hz0kW.js +0 -1
  434. package/core/built/admin/assets/transistor-modal-VZOGN3od.js +0 -1
  435. package/core/built/admin/assets/unsplash-modal-CKGfACxF.js +0 -1
  436. package/core/built/admin/assets/use-check-theme-limit-error-CGp3CGT5.js +0 -1
  437. package/core/built/admin/assets/use-feature-flag-CSq2Lwzt.js +0 -1
  438. package/core/built/admin/assets/use-filter-params-0hcJJuEJ.js +0 -1
  439. package/core/built/admin/assets/use-limiter-ffwpsZPp.js +0 -2
  440. package/core/built/admin/assets/use-pintura-editor-Cb41oJyL.js +0 -1
  441. package/core/built/admin/assets/use-query-params-DHhhu8wi.js +0 -1
  442. package/core/built/admin/assets/use-reply-chain-data-C0ZUTkfk.js +0 -1
  443. package/core/built/admin/assets/use-setting-group-Bx8M6FL2.js +0 -1
  444. package/core/built/admin/assets/use-settings-navigation-BOZcat_V.js +0 -1
  445. package/core/built/admin/assets/use-upgrade-route-B3_DUiuT.js +0 -1
  446. package/core/built/admin/assets/user-detail-modal-595z1N5r.js +0 -1
  447. package/core/built/admin/assets/web-CAta3lRE.js +0 -1
  448. package/core/built/admin/assets/web-Ds9_wWJK.js +0 -2
  449. package/core/built/admin/assets/zapier-modal-CcfDZY53.js +0 -1
  450. package/core/server/data/seeders/utils/database-date.js +0 -28
  451. package/core/server/services/automations/database-date.js +0 -59
  452. /package/core/built/admin/assets/{dist-CqO2lWS02.js → dist-CqO2lWS0.js} +0 -0
  453. /package/core/server/services/{automations → lib}/mailgun-message-id.js +0 -0
@@ -1421,8 +1421,11 @@ module.exports = {
1421
1421
  id: {type: 'string', maxlength: 24, nullable: false, primary: true},
1422
1422
  token: {type: 'string', maxlength: 48, nullable: false, unique: true},
1423
1423
 
1424
- buyer_email: {type: 'string', maxlength: 191, nullable: false, validations: {isEmail: true}},
1424
+ buyer_email: {type: 'string', maxlength: 191, nullable: true, validations: {isEmail: true}},
1425
1425
  buyer_member_id: {type: 'string', maxlength: 24, nullable: true, unique: false, references: 'members.id', setNullDelete: true},
1426
+ buyer_name: {type: 'string', maxlength: 191, nullable: true},
1427
+ recipient_name: {type: 'string', maxlength: 191, nullable: true},
1428
+ personal_message: {type: 'text', maxlength: 500, nullable: true},
1426
1429
 
1427
1430
  redeemer_member_id: {type: 'string', maxlength: 24, nullable: true, unique: false, references: 'members.id', setNullDelete: true},
1428
1431
 
@@ -1437,18 +1440,19 @@ module.exports = {
1437
1440
  currency: {type: 'string', maxlength: 50, nullable: false},
1438
1441
  amount: {type: 'integer', nullable: false, unsigned: true},
1439
1442
 
1440
- stripe_checkout_session_id: {type: 'string', maxlength: 255, nullable: false, unique: true},
1441
- stripe_payment_intent_id: {type: 'string', maxlength: 255, nullable: false, unique: true},
1443
+ stripe_checkout_session_id: {type: 'string', maxlength: 255, nullable: true, unique: true},
1444
+ stripe_payment_intent_id: {type: 'string', maxlength: 255, nullable: true, unique: true},
1442
1445
 
1446
+ checkout_started_at: {type: 'dateTime', nullable: true},
1443
1447
  consumes_at: {type: 'dateTime', nullable: true},
1444
- expires_at: {type: 'dateTime', nullable: false},
1448
+ expires_at: {type: 'dateTime', nullable: true},
1445
1449
 
1446
1450
  status: {
1447
1451
  type: 'string', maxlength: 50, nullable: false, validations: {
1448
- isIn: [['purchased', 'redeemed', 'consumed', 'expired', 'refunded']]
1452
+ isIn: [['payment_pending', 'purchased', 'redeemed', 'consumed', 'expired', 'refunded']]
1449
1453
  }
1450
1454
  },
1451
- purchased_at: {type: 'dateTime', nullable: false},
1455
+ purchased_at: {type: 'dateTime', nullable: true},
1452
1456
  redeemed_at: {type: 'dateTime', nullable: true},
1453
1457
  consumed_at: {type: 'dateTime', nullable: true},
1454
1458
  expired_at: {type: 'dateTime', nullable: true},
@@ -1456,7 +1460,24 @@ module.exports = {
1456
1460
  consumes_soon_reminder_sent_at: {type: 'dateTime', nullable: true},
1457
1461
  '@@INDEXES@@': [
1458
1462
  ['status', 'consumes_at'],
1459
- ['status', 'expires_at']
1463
+ ['status', 'expires_at'],
1464
+ ['status', 'checkout_started_at']
1465
+ ]
1466
+ },
1467
+ gift_deliveries: {
1468
+ id: {type: 'string', maxlength: 24, nullable: false, primary: true},
1469
+ gift_id: {type: 'string', maxlength: 24, nullable: false, unique: true, references: 'gifts.id', cascadeDelete: true},
1470
+ recipient_email: {type: 'string', maxlength: 191, nullable: false, validations: {isEmail: true}},
1471
+ status: {
1472
+ type: 'string', maxlength: 50, nullable: false, defaultTo: 'pending', validations: {
1473
+ isIn: [['pending', 'sending', 'sent', 'failed', 'cancelled']]
1474
+ }
1475
+ },
1476
+ started_at: {type: 'dateTime', nullable: true},
1477
+ email_sent_at: {type: 'dateTime', nullable: true},
1478
+ email_provider_message_id: {type: 'string', maxlength: 1000, nullable: true},
1479
+ '@@INDEXES@@': [
1480
+ ['status', 'started_at']
1460
1481
  ]
1461
1482
  }
1462
1483
  };
@@ -1,37 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
@@ -40,7 +7,7 @@ exports.AutomationActionRevisionsImporter = void 0;
40
7
  const faker_1 = require("@faker-js/faker");
41
8
  const errors_1 = __importDefault(require("@tryghost/errors"));
42
9
  const table_importer_1 = require("./table-importer");
43
- const databaseDate = __importStar(require("../utils/database-date"));
10
+ const db_date_1 = require("../../../lib/db-date");
44
11
  const constants_1 = require("../../../services/member-welcome-emails/constants");
45
12
  class AutomationActionRevisionsImporter extends table_importer_1.TableImporter {
46
13
  static table = 'automation_action_revisions';
@@ -75,12 +42,12 @@ class AutomationActionRevisionsImporter extends table_importer_1.TableImporter {
75
42
  if (!this.#action) {
76
43
  throw new errors_1.default.IncorrectUsageError({ message: 'Cannot generate automation action revision without an action' });
77
44
  }
78
- const createdAt = databaseDate.parse(this.#action.created_at);
45
+ const createdAt = (0, db_date_1.fromDatabaseDate)(this.#action.created_at);
79
46
  createdAt.setSeconds(createdAt.getSeconds() + this.#revisionIndex);
80
47
  this.#revisionIndex += 1;
81
48
  const common = {
82
49
  id: this.fastFakeObjectId(),
83
- created_at: databaseDate.dateToDatabaseString(createdAt),
50
+ created_at: (0, db_date_1.toDatabaseDate)(createdAt),
84
51
  action_id: this.#action.id,
85
52
  email_sent_count: null,
86
53
  email_opened_count: null,
@@ -1,46 +1,13 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
39
6
  exports.AutomationActionsImporter = void 0;
40
- const faker_1 = require("@faker-js/faker");
41
7
  const errors_1 = __importDefault(require("@tryghost/errors"));
42
8
  const table_importer_1 = require("./table-importer");
43
- const databaseDate = __importStar(require("../utils/database-date"));
9
+ const db_date_1 = require("../../../lib/db-date");
10
+ const random_1 = require("../utils/random");
44
11
  class AutomationActionsImporter extends table_importer_1.TableImporter {
45
12
  static table = 'automation_actions';
46
13
  static dependencies = ['automations'];
@@ -65,16 +32,13 @@ class AutomationActionsImporter extends table_importer_1.TableImporter {
65
32
  if (!this.#automation) {
66
33
  throw new errors_1.default.IncorrectUsageError({ message: 'Cannot generate automation action without an automation' });
67
34
  }
68
- const createdAt = faker_1.faker.date.between({
69
- from: databaseDate.parse(this.#automation.created_at),
70
- to: new Date()
71
- });
35
+ const createdAt = (0, random_1.randomDateBetween)(this.#automation.created_at, new Date());
72
36
  const type = this.#actionIndex % 2 === 0 ? 'wait' : 'send_email';
73
37
  this.#actionIndex += 1;
74
38
  return {
75
39
  id: this.fastFakeObjectId(),
76
- created_at: databaseDate.dateToDatabaseString(createdAt),
77
- updated_at: databaseDate.dateToDatabaseString(createdAt),
40
+ created_at: (0, db_date_1.toDatabaseDate)(createdAt),
41
+ updated_at: (0, db_date_1.toDatabaseDate)(createdAt),
78
42
  deleted_at: null,
79
43
  automation_id: this.#automation.id,
80
44
  type
@@ -1,37 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
@@ -41,7 +8,7 @@ const faker_1 = require("@faker-js/faker");
41
8
  const errors_1 = __importDefault(require("@tryghost/errors"));
42
9
  const lodash_1 = require("lodash");
43
10
  const table_importer_1 = require("./table-importer");
44
- const databaseDate = __importStar(require("../utils/database-date"));
11
+ const db_date_1 = require("../../../lib/db-date");
45
12
  class AutomationRunStepsImporter extends table_importer_1.TableImporter {
46
13
  static table = 'automation_run_steps';
47
14
  static dependencies = ['automation_runs', 'automation_action_revisions', 'automation_action_edges'];
@@ -102,12 +69,12 @@ class AutomationRunStepsImporter extends table_importer_1.TableImporter {
102
69
  const requestedStepCount = (0, lodash_1.clamp)(Math.floor(stepsPerRun) + extraStep, 1, actionCount);
103
70
  const runStepCount = fullPathGeneratedForAutomation.has(run.automation_id) ? requestedStepCount : actionCount;
104
71
  fullPathGeneratedForAutomation.add(run.automation_id);
105
- const runCreatedAt = databaseDate.parse(run.created_at);
72
+ const runCreatedAt = (0, db_date_1.fromDatabaseDate)(run.created_at);
106
73
  const lastStepStatus = faker_1.faker.helpers.arrayElement(['pending', 'finished', 'failed']);
107
74
  for (let index = 0; index < runStepCount; index += 1) {
108
75
  const createdAt = new Date(runCreatedAt);
109
76
  createdAt.setHours(createdAt.getHours() + index);
110
- const createdAtString = databaseDate.dateToDatabaseString(createdAt);
77
+ const createdAtString = (0, db_date_1.toDatabaseDate)(createdAt);
111
78
  const status = index === runStepCount - 1 ? lastStepStatus : 'finished';
112
79
  const isTerminal = status !== 'pending';
113
80
  steps.push({
@@ -1,37 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
@@ -42,7 +9,8 @@ const errors_1 = __importDefault(require("@tryghost/errors"));
42
9
  const strict_1 = __importDefault(require("node:assert/strict"));
43
10
  const table_importer_1 = require("./table-importer");
44
11
  const parse_email_address_1 = require("@tryghost/parse-email-address");
45
- const databaseDate = __importStar(require("../utils/database-date"));
12
+ const db_date_1 = require("../../../lib/db-date");
13
+ const random_1 = require("../utils/random");
46
14
  const assertExampleEmailDomain = (email) => {
47
15
  const { domain } = (0, parse_email_address_1.parseEmailAddress)(email) ?? {};
48
16
  (0, strict_1.default)(domain, 'Refusing to seed an automation run for a member with no email');
@@ -77,17 +45,14 @@ class AutomationRunsImporter extends table_importer_1.TableImporter {
77
45
  throw new errors_1.default.IncorrectUsageError({ message: 'Cannot generate automation run without an automation' });
78
46
  }
79
47
  const member = faker_1.faker.helpers.arrayElement(this.#members);
80
- const automationCreatedAt = databaseDate.parse(this.#automation.created_at);
81
- const memberCreatedAt = databaseDate.parse(member.created_at);
82
- const createdAt = faker_1.faker.date.between({
83
- from: new Date(Math.max(automationCreatedAt.valueOf(), memberCreatedAt.valueOf())),
84
- to: new Date()
85
- });
48
+ const automationCreatedAt = (0, db_date_1.fromDatabaseDate)(this.#automation.created_at);
49
+ const memberCreatedAt = (0, db_date_1.fromDatabaseDate)(member.created_at);
50
+ const createdAt = (0, random_1.randomDateBetween)(new Date(Math.max(automationCreatedAt.valueOf(), memberCreatedAt.valueOf())), new Date());
86
51
  assertExampleEmailDomain(member.email);
87
52
  return {
88
53
  id: this.fastFakeObjectId(),
89
- created_at: databaseDate.dateToDatabaseString(createdAt),
90
- updated_at: databaseDate.dateToDatabaseString(createdAt),
54
+ created_at: (0, db_date_1.toDatabaseDate)(createdAt),
55
+ updated_at: (0, db_date_1.toDatabaseDate)(createdAt),
91
56
  automation_id: this.#automation.id,
92
57
  member_id: member.id,
93
58
  member_email: member.email
@@ -1,37 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.AutomationsImporter = void 0;
37
4
  const faker_1 = require("@faker-js/faker");
@@ -40,7 +7,7 @@ const string_1 = require("@tryghost/string");
40
7
  const table_importer_1 = require("./table-importer");
41
8
  // @ts-expect-error This module currently lacks type definitions.
42
9
  const blog_info_1 = require("../utils/blog-info");
43
- const databaseDate = __importStar(require("../utils/database-date"));
10
+ const db_date_1 = require("../../../lib/db-date");
44
11
  const constants_1 = require("../../../services/member-welcome-emails/constants");
45
12
  const defaultAutomations = [{
46
13
  name: 'Free member welcome flow',
@@ -70,8 +37,8 @@ class AutomationsImporter extends table_importer_1.TableImporter {
70
37
  status: faker_1.faker.helpers.arrayElement(['active', 'inactive']),
71
38
  name,
72
39
  slug,
73
- created_at: databaseDate.dateToDatabaseString(createdAt),
74
- updated_at: databaseDate.dateToDatabaseString(createdAt)
40
+ created_at: (0, db_date_1.toDatabaseDate)(createdAt),
41
+ updated_at: (0, db_date_1.toDatabaseDate)(createdAt)
75
42
  };
76
43
  }
77
44
  }
@@ -1,7 +1,7 @@
1
1
  const {TableImporter} = require('./table-importer');
2
2
  const {faker} = require('@faker-js/faker');
3
- const {luck} = require('../utils/random');
4
- const databaseDate = require('../utils/database-date');
3
+ const {luck, randomDateBetween} = require('../utils/random');
4
+ const {toDatabaseDate} = require('../../../lib/db-date');
5
5
 
6
6
  class CommentReportsImporter extends TableImporter {
7
7
  static table = 'comment_reports';
@@ -49,7 +49,7 @@ class CommentReportsImporter extends TableImporter {
49
49
  return null;
50
50
  }
51
51
 
52
- const reportTime = databaseDate.randomBetween(this.model.created_at, new Date());
52
+ const reportTime = randomDateBetween(this.model.created_at, new Date());
53
53
 
54
54
  const reporter = this.possibleReporters[faker.number.int(this.possibleReporters.length - 1)];
55
55
 
@@ -57,8 +57,8 @@ class CommentReportsImporter extends TableImporter {
57
57
  id: this.fastFakeObjectId(),
58
58
  comment_id: this.model.id,
59
59
  member_id: reporter.id,
60
- created_at: databaseDate.dateToDatabaseString(reportTime),
61
- updated_at: databaseDate.dateToDatabaseString(reportTime)
60
+ created_at: toDatabaseDate(reportTime),
61
+ updated_at: toDatabaseDate(reportTime)
62
62
  };
63
63
  }
64
64
  }
@@ -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 databaseDate = require('../utils/database-date');
5
+ const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
6
6
 
7
7
  class CommentsImporter extends TableImporter {
8
8
  static table = 'comments';
@@ -24,7 +24,7 @@ class CommentsImporter extends TableImporter {
24
24
 
25
25
  setReferencedModel(model) {
26
26
  this.model = model;
27
- const publishedAt = databaseDate.parse(model.published_at);
27
+ const publishedAt = fromDatabaseDate(model.published_at);
28
28
 
29
29
  this.commentIds = []; // Store [id, parent_id, timestamp] tuples for reply-to-reply
30
30
 
@@ -37,7 +37,7 @@ class CommentsImporter extends TableImporter {
37
37
  endTime: new Date()
38
38
  }).sort((a, b) => a.getTime() - b.getTime()); // Sort chronologically so replies always come after their targets
39
39
 
40
- this.possibleMembers = this.members.filter(member => databaseDate.parse(member.created_at) < publishedAt);
40
+ this.possibleMembers = this.members.filter(member => fromDatabaseDate(member.created_at) < publishedAt);
41
41
  }
42
42
 
43
43
  generate() {
@@ -97,8 +97,8 @@ class CommentsImporter extends TableImporter {
97
97
  parent_id: parentId,
98
98
  in_reply_to_id: inReplyToId,
99
99
  status: 'published',
100
- created_at: databaseDate.dateToDatabaseString(timestamp),
101
- updated_at: databaseDate.dateToDatabaseString(timestamp),
100
+ created_at: toDatabaseDate(timestamp),
101
+ updated_at: toDatabaseDate(timestamp),
102
102
  html: `<p>${faker.lorem.sentence().replace(/[&<>"']/g, c => `&#${c.charCodeAt(0)};`)}</p>`
103
103
  };
104
104
 
@@ -1,6 +1,7 @@
1
1
  const {TableImporter} = require('./table-importer');
2
2
  const {faker} = require('@faker-js/faker');
3
- const databaseDate = require('../utils/database-date');
3
+ const {randomDateBetween} = require('../utils/random');
4
+ const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
4
5
 
5
6
  class EmailBatchesImporter extends TableImporter {
6
7
  static table = 'email_batches';
@@ -21,8 +22,8 @@ class EmailBatchesImporter extends TableImporter {
21
22
  }
22
23
 
23
24
  generate() {
24
- const emailSentDate = databaseDate.parse(this.model.created_at);
25
- const latestUpdatedDate = databaseDate.parse(this.model.created_at);
25
+ const emailSentDate = fromDatabaseDate(this.model.created_at);
26
+ const latestUpdatedDate = new Date(emailSentDate);
26
27
  latestUpdatedDate.setHours(latestUpdatedDate.getHours() + 1);
27
28
 
28
29
  return {
@@ -31,7 +32,7 @@ class EmailBatchesImporter extends TableImporter {
31
32
  mailgun_message_id: `${new Date().toISOString().split('.')[0].replace(/[^0-9]/g, '')}.${faker.string.hexadecimal({length: 16, prefix: '', casing: 'lower'})}@m.example.com`,
32
33
  status: 'submitted', // TODO: introduce failures
33
34
  created_at: this.model.created_at,
34
- updated_at: databaseDate.dateToDatabaseString(databaseDate.randomBetween(emailSentDate, latestUpdatedDate))
35
+ updated_at: toDatabaseDate(randomDateBetween(emailSentDate, latestUpdatedDate))
35
36
  };
36
37
  }
37
38
  }
@@ -1,7 +1,8 @@
1
1
  const {TableImporter} = require('./table-importer');
2
2
  const {faker} = require('@faker-js/faker');
3
3
  const generateEvents = require('../utils/event-generator');
4
- const databaseDate = require('../utils/database-date');
4
+ const {randomDateBetween} = require('../utils/random');
5
+ const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
5
6
  const debug = require('@tryghost/debug')('EmailRecipientsImporter');
6
7
 
7
8
  const emailStatus = {
@@ -109,11 +110,7 @@ class EmailRecipientsImporter extends TableImporter {
109
110
  this.membersSubscribeEventsCreatedAtsByNewsletterId.set(memberSubscribeEvent.newsletter_id, []);
110
111
  }
111
112
 
112
- if (!(memberSubscribeEvent.created_at instanceof Date)) {
113
- // SQLite fix
114
- memberSubscribeEvent.created_at = databaseDate.parse(memberSubscribeEvent.created_at);
115
- }
116
- this.membersSubscribeEventsCreatedAtsByNewsletterId.get(memberSubscribeEvent.newsletter_id).push(memberSubscribeEvent.created_at.getTime());
113
+ this.membersSubscribeEventsCreatedAtsByNewsletterId.get(memberSubscribeEvent.newsletter_id).push(fromDatabaseDate(memberSubscribeEvent.created_at).getTime());
117
114
  }
118
115
 
119
116
  await this.importForEach(this.emailBatches, quantity ? quantity / emails.length : 1000);
@@ -123,15 +120,12 @@ class EmailRecipientsImporter extends TableImporter {
123
120
  this.batch = model;
124
121
  this.model = this.emails.get(this.batch.email_id);
125
122
  this.batchIndex = this.batch.index;
126
-
127
- // Shallow clone members list so we can shuffle and modify it
128
- const earliestOpenTime = databaseDate.parse(this.batch.updated_at);
129
- const latestOpenTime = databaseDate.parse(this.batch.updated_at);
130
- latestOpenTime.setDate(latestOpenTime.getDate() + 14);
123
+ this.batchUpdatedAt = fromDatabaseDate(this.batch.updated_at);
124
+ this.batchProcessedAt = toDatabaseDate(this.batchUpdatedAt);
131
125
 
132
126
  // Get all members that were subscribed to this newsletter BEFORE the batch was sent
133
127
  // We use binary search to speed up it up
134
- const lastIndex = findFirstHigherIndex(this.membersSubscribeEventsCreatedAtsByNewsletterId.get(this.model.newsletter_id), earliestOpenTime);
128
+ const lastIndex = findFirstHigherIndex(this.membersSubscribeEventsCreatedAtsByNewsletterId.get(this.model.newsletter_id), this.batchUpdatedAt);
135
129
 
136
130
  this.membersList = this.membersSubscribeEventsByNewsletterId.get(this.model.newsletter_id).slice(0, Math.max(0, lastIndex - 1))
137
131
  .slice(this.batchIndex * 1000, (this.batchIndex + 1) * 1000)
@@ -164,7 +158,7 @@ class EmailRecipientsImporter extends TableImporter {
164
158
  }
165
159
 
166
160
  // The events are generated for a different time, so we need to move them to the batch time
167
- timestamp = new Date(timestamp.getTime() - this.eventStartTimeUsed.getTime() + databaseDate.parse(this.batch.updated_at).getTime());
161
+ timestamp = new Date(timestamp.getTime() - this.eventStartTimeUsed.getTime() + this.batchUpdatedAt.getTime());
168
162
 
169
163
  if (timestamp > new Date()) {
170
164
  timestamp = new Date();
@@ -187,9 +181,7 @@ class EmailRecipientsImporter extends TableImporter {
187
181
 
188
182
  let deliveredTime;
189
183
  if (status === emailStatus.opened) {
190
- const startDate = databaseDate.parse(this.batch.updated_at);
191
- const endDate = timestamp;
192
- deliveredTime = databaseDate.randomBetween(startDate, endDate);
184
+ deliveredTime = randomDateBetween(this.batchUpdatedAt, timestamp);
193
185
  }
194
186
 
195
187
  return {
@@ -198,10 +190,10 @@ class EmailRecipientsImporter extends TableImporter {
198
190
  email_id: this.model.id,
199
191
  batch_id: this.batch.id,
200
192
  member_id: member.id,
201
- processed_at: databaseDate.dateToDatabaseString(this.batch.updated_at),
202
- delivered_at: status === emailStatus.opened ? databaseDate.dateToDatabaseString(deliveredTime) : status === emailStatus.delivered ? databaseDate.dateToDatabaseString(timestamp) : null,
203
- opened_at: status === emailStatus.opened ? databaseDate.dateToDatabaseString(timestamp) : null,
204
- failed_at: status === emailStatus.failed ? databaseDate.dateToDatabaseString(timestamp) : null,
193
+ processed_at: this.batchProcessedAt,
194
+ delivered_at: status === emailStatus.opened ? toDatabaseDate(deliveredTime) : status === emailStatus.delivered ? toDatabaseDate(timestamp) : null,
195
+ opened_at: status === emailStatus.opened ? toDatabaseDate(timestamp) : null,
196
+ failed_at: status === emailStatus.failed ? toDatabaseDate(timestamp) : null,
205
197
  member_uuid: member.uuid,
206
198
  member_email: member.email,
207
199
  member_name: member.name
@@ -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 databaseDate = require('../utils/database-date');
5
+ const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
6
6
 
7
7
  class EmailsImporter extends TableImporter {
8
8
  static table = 'emails';
@@ -42,7 +42,7 @@ class EmailsImporter extends TableImporter {
42
42
  : this.newsletters[1];
43
43
  }
44
44
 
45
- const publishedAt = databaseDate.parse(this.model.published_at);
45
+ const publishedAt = fromDatabaseDate(this.model.published_at);
46
46
  const timestamp = luck(60)
47
47
  ? publishedAt
48
48
  : generateEvents({
@@ -55,7 +55,7 @@ class EmailsImporter extends TableImporter {
55
55
 
56
56
  const recipientCount = this.membersSubscribeEvents
57
57
  .filter(entry => entry.newsletter_id === newsletter.id)
58
- .filter(entry => databaseDate.parse(entry.created_at) < timestamp).length;
58
+ .filter(entry => fromDatabaseDate(entry.created_at) < timestamp).length;
59
59
  const deliveredCount = Math.ceil(recipientCount * faker.number.float({
60
60
  max: 1,
61
61
  min: 0.9,
@@ -87,10 +87,10 @@ class EmailsImporter extends TableImporter {
87
87
  track_opens: true,
88
88
  track_clicks: true,
89
89
  feedback_enabled: true,
90
- submitted_at: databaseDate.dateToDatabaseString(timestamp),
90
+ submitted_at: toDatabaseDate(timestamp),
91
91
  newsletter_id: newsletter.id,
92
- created_at: databaseDate.dateToDatabaseString(timestamp),
93
- updated_at: databaseDate.dateToDatabaseString(timestamp)
92
+ created_at: toDatabaseDate(timestamp),
93
+ updated_at: toDatabaseDate(timestamp)
94
94
  };
95
95
  }
96
96
  }
@@ -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 databaseDate = require('../utils/database-date');
5
+ const {toDatabaseDate} = require('../../../lib/db-date');
6
6
 
7
7
  class LabelsImporter extends TableImporter {
8
8
  static table = 'labels';
@@ -30,8 +30,8 @@ class LabelsImporter extends TableImporter {
30
30
  id: this.fastFakeObjectId(),
31
31
  name: name,
32
32
  slug: `${slugify(name)}`,
33
- created_at: databaseDate.dateToDatabaseString(blogStartDate),
34
- updated_at: databaseDate.dateToDatabaseString(blogStartDate)
33
+ created_at: toDatabaseDate(blogStartDate),
34
+ updated_at: toDatabaseDate(blogStartDate)
35
35
  };
36
36
  }
37
37
  }
@@ -1,7 +1,7 @@
1
1
  const {TableImporter} = require('./table-importer');
2
2
  const {faker} = require('@faker-js/faker');
3
- const {luck} = require('../utils/random');
4
- const databaseDate = require('../utils/database-date');
3
+ const {luck, randomDateBetween} = require('../utils/random');
4
+ const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
5
5
 
6
6
  class MembersClickEventsImporter extends TableImporter {
7
7
  static table = 'members_click_events';
@@ -50,9 +50,9 @@ class MembersClickEventsImporter extends TableImporter {
50
50
  }
51
51
  this.amount -= 1;
52
52
 
53
- const openedAt = databaseDate.parse(this.model.opened_at);
53
+ const openedAt = fromDatabaseDate(this.model.opened_at);
54
54
  const laterOn = new Date(openedAt.getTime() + 1000 * 60 * 15);
55
- const clickTime = faker.date.between({from: openedAt.getTime(), to: laterOn.getTime()}); //added getTime here because it threw random errors
55
+ const clickTime = randomDateBetween(openedAt, laterOn);
56
56
 
57
57
  return {
58
58
  id: this.fastFakeObjectId(),
@@ -61,7 +61,7 @@ class MembersClickEventsImporter extends TableImporter {
61
61
  min: 0,
62
62
  max: this.redirectList.length - 1
63
63
  }))].id,
64
- created_at: databaseDate.dateToDatabaseString(clickTime)
64
+ created_at: toDatabaseDate(clickTime)
65
65
  };
66
66
  }
67
67
  }