ghost 6.64.0 → 6.65.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 (672) hide show
  1. package/bin/create-migration.js +15 -0
  2. package/components/tryghost-adapter-base-scheduling-0.2.4.tgz +0 -0
  3. package/components/tryghost-api-framework-0.0.0.tgz +0 -0
  4. package/components/tryghost-i18n-0.0.0.tgz +0 -0
  5. package/components/tryghost-kg-default-cards-10.3.6.tgz +0 -0
  6. package/components/tryghost-kg-lexical-html-renderer-1.5.1.tgz +0 -0
  7. package/components/tryghost-metafield-types-0.0.0.tgz +0 -0
  8. package/content/themes/casper/assets/built/casper.js +1 -1
  9. package/content/themes/casper/assets/built/screen.css +1 -1
  10. package/content/themes/casper/assets/css/screen.css +15 -2
  11. package/content/themes/casper/assets/js/init.js +37 -9
  12. package/content/themes/casper/package.json +8 -8
  13. package/content/themes/source/assets/built/screen.css +1 -1
  14. package/content/themes/source/assets/built/source.js +1 -1
  15. package/content/themes/source/assets/css/screen.css +14 -1
  16. package/content/themes/source/assets/js/main.js +24 -4
  17. package/content/themes/source/package.json +7 -7
  18. package/core/boot.js +22 -16
  19. package/core/bridge.js +1 -1
  20. package/core/built/admin/assets/Combination-DQ6f9A5P.js +41 -0
  21. package/core/built/admin/assets/{PolarAngleAxis-a81ieQUO.js → PolarAngleAxis-BBaU7PRV.js} +1 -1
  22. package/core/built/admin/assets/RadialBarChart-Bp20JPnA.js +1 -0
  23. package/core/built/admin/assets/{about-39CAfroa.js → about-Dp43j18M.js} +1 -1
  24. package/core/built/admin/assets/accordion-h62UzFhj.js +1 -0
  25. package/core/built/admin/assets/account-migration-CBTbtX6Q.js +1 -0
  26. package/core/built/admin/assets/action-list-DC9QpX-l.js +1 -0
  27. package/core/built/admin/assets/activitypub/{account-migration-KA6Jjf9L.js → account-migration-B1DUZS4Q.js} +8 -8
  28. package/core/built/admin/assets/activitypub/activitypub.js +24 -11
  29. package/core/built/admin/assets/activitypub/avatar-CRGud8yf.js +153 -0
  30. package/core/built/admin/assets/activitypub/{avatar-flipboard-csQaNeYK.js → avatar-flipboard-BZNFAXfm.js} +3 -3
  31. package/core/built/admin/assets/activitypub/{bluesky-sharing-C7nTDMvw.js → bluesky-sharing-Cg_v-LwS.js} +30 -31
  32. package/core/built/admin/assets/activitypub/{chunk-KS7C4IRE-Ck3O4oo2.js → chunk-KS7C4IRE-CTUL98Lc.js} +2498 -1885
  33. package/core/built/admin/assets/activitypub/{content-formatters-CLcjaBwV.js → content-formatters-D7GWP7nH.js} +23 -24
  34. package/core/built/admin/assets/activitypub/{copy-DcOh8kXw.js → copy-CgzTvoeR.js} +2 -2
  35. package/core/built/admin/assets/activitypub/{domain-fZ-X8i4-.js → domain-C3G_nkHU.js} +46 -46
  36. package/core/built/admin/assets/activitypub/{edit-profile-BqMLQV88.js → edit-profile-C8cCY-AK.js} +927 -928
  37. package/core/built/admin/assets/activitypub/{explore-B4yPoP8E.js → explore-NlDT4inq.js} +11 -11
  38. package/core/built/admin/assets/activitypub/{feed-BRC_mvAe.js → feed-DF22jCTV.js} +10 -10
  39. package/core/built/admin/assets/activitypub/{field-COacNgOt.js → field-95-iuTte.js} +4 -4
  40. package/core/built/admin/assets/activitypub/{hash-C7u-irQQ.js → hash-R7LMLnhY.js} +2 -2
  41. package/core/built/admin/assets/activitypub/{inbox-CbTTdDQ3.js → inbox-DUJUiV6x.js} +2 -2
  42. package/core/built/admin/assets/activitypub/{inbox-BW-yvUoN.js → inbox-DerExBzA.js} +416 -414
  43. package/core/built/admin/assets/activitypub/{label-kPMmYI7l.js → label-EwCn1QYc.js} +4 -4
  44. package/core/built/admin/assets/activitypub/layout-Dy6NnW1G.js +1 -0
  45. package/core/built/admin/assets/activitypub/{moderation-CuidJzc0.js → moderation-BSkfiVYo.js} +73 -75
  46. package/core/built/admin/assets/activitypub/{note-CAMRRSqD.js → note-DOnAJTXK.js} +9 -9
  47. package/core/built/admin/assets/activitypub/{notifications-BmNlXGgp.js → notifications-DZc6XTjG.js} +27 -27
  48. package/core/built/admin/assets/activitypub/{onboarding-Dmun9jr_.js → onboarding-8vEIwYTH.js} +3 -3
  49. package/core/built/admin/assets/activitypub/{onboarding-Bqg7fh_L.js → onboarding-DYVqbNmp.js} +2 -2
  50. package/core/built/admin/assets/activitypub/{preferences--oH19wf9.js → preferences-DDok6F2N.js} +1418 -1390
  51. package/core/built/admin/assets/activitypub/{profile-DH_tQx2D.js → profile-DjVa2hUk.js} +254 -255
  52. package/core/built/admin/assets/activitypub/{reply-Cap9PxSH.js → reply-DtXBpHxu.js} +2 -2
  53. package/core/built/admin/assets/activitypub/routes-Cw302e1c.js +4946 -0
  54. package/core/built/admin/assets/activitypub/{separator-CAxxu8VV.js → separator-FpRpVDd3.js} +8 -9
  55. package/core/built/admin/assets/activitypub/settings-yK-puALn.js +314 -0
  56. package/core/built/admin/assets/activitypub/{site-BYps63oh.js → site-CHw0R2PA.js} +2 -2
  57. package/core/built/admin/assets/activitypub/{step-1-CKjR2KAm.js → step-1-737bnvxk.js} +7 -7
  58. package/core/built/admin/assets/activitypub/{step-2-B6PKfOUQ.js → step-2-DBaIsAsM.js} +7 -7
  59. package/core/built/admin/assets/activitypub/{step-3-C-qBbcUo.js → step-3-BBmy9m9V.js} +23 -23
  60. package/core/built/admin/assets/activitypub/tabs-LQ2xirdm.js +1101 -0
  61. package/core/built/admin/assets/activitypub/{topic-filter-DsUOuu0k.js → topic-filter-75Nu0CKj.js} +4 -4
  62. package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CX9snsLs.js → use-activity-pub-queries-CYI2QJMs.js} +58 -58
  63. package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-DsJTGDSS.js → use-navigate-with-base-path-B4jZ8hyg.js} +3924 -1403
  64. package/core/built/admin/assets/activitypub/{use-reply-chain-data-AJi9zkzm.js → use-reply-chain-data-BHmFxc3U.js} +6 -6
  65. package/core/built/admin/assets/activitypub/users-CSjOwpT9.js +886 -0
  66. package/core/built/admin/assets/activitypub/{x-DR8AT3-4.js → x-B9ptWCds.js} +2 -2
  67. package/core/built/admin/assets/{add-integration-modal-B12oRifD.js → add-integration-modal-BwePhq95.js} +1 -1
  68. package/core/built/admin/assets/add-newsletter-modal-Zv0I7Msm.js +1 -0
  69. package/core/built/admin/assets/{add-recommendation-modal-CJf92edY.js → add-recommendation-modal-cdLv0wHy.js} +1 -1
  70. package/core/built/admin/assets/analytics-DY8_SaP7.js +1 -0
  71. package/core/built/admin/assets/announcement-bar-modal-C-2yWwag.js +1 -0
  72. package/core/built/admin/assets/api-keys-BHKATUqQ.js +1 -0
  73. package/core/built/admin/assets/{audience-6GXevic-.js → audience-wRcSN0jV.js} +1 -1
  74. package/core/built/admin/assets/{automated-emails-DJQ4uNZo.js → automated-emails-CzUa3v4d.js} +1 -1
  75. package/core/built/admin/assets/automations-DupSsSOr.js +1 -0
  76. package/core/built/admin/assets/badge-CI1Z0xyG.js +1 -0
  77. package/core/built/admin/assets/bluesky-sharing-B8PC1SBj.js +1 -0
  78. package/core/built/admin/assets/box-LUuYRT-1.js +1 -0
  79. package/core/built/admin/assets/brand-icon-CrmbX86T.js +1 -0
  80. package/core/built/admin/assets/breadcrumb-DDDpzLyo.js +1 -0
  81. package/core/built/admin/assets/button-D414TI3B.js +1 -0
  82. package/core/built/admin/assets/calendar-Cp_opo3i.js +1 -0
  83. package/core/built/admin/assets/card-C2dfd5u0.js +1 -0
  84. package/core/built/admin/assets/chart-B_UNLXse.js +63 -0
  85. package/core/built/admin/assets/chart-helpers-Czu_9QpJ.js +1 -0
  86. package/core/built/admin/assets/checkbox-CFFqf0Nh.js +1 -0
  87. package/core/built/admin/assets/{chunk.368.22ce1b732c0b40abd3f1.js → chunk.201.6961b57ed7a281ac193e.js} +23 -19
  88. package/core/built/admin/assets/chunk.524.0b850e72ec49a0fa3882.js +25 -0
  89. package/core/built/admin/assets/chunk.582.db2ae9e968256e8d58ac.js +27 -0
  90. package/core/built/admin/assets/code-editor-view-Bd_nnHKk.js +1 -0
  91. package/core/built/admin/assets/code-editor-view-BeU3Yf9M.js +1 -0
  92. package/core/built/admin/assets/color-picker-Bzm1V7qg.js +3 -0
  93. package/core/built/admin/assets/color-picker-field-DP0moHz9.js +1 -0
  94. package/core/built/admin/assets/combobox-6_ruuTuj.js +1 -0
  95. package/core/built/admin/assets/command-B5wfm6pd.js +1 -0
  96. package/core/built/admin/assets/comments-BB26dUSl.js +1 -0
  97. package/core/built/admin/assets/confirmation-context-znVJD4pX.js +1 -0
  98. package/core/built/admin/assets/container-CHHif8km.js +1 -0
  99. package/core/built/admin/assets/{content-api-modal-0ZjuLcQ8.js → content-api-modal-DOHwl0yZ.js} +1 -1
  100. package/core/built/admin/assets/context-menu-BpY46Dlb.js +1 -0
  101. package/core/built/admin/assets/copy-field-DRBx6Ady.js +1 -0
  102. package/core/built/admin/assets/create-ghost-browse-value-source-eIXo5Qws.js +1 -0
  103. package/core/built/admin/assets/custom-field-type-option-DrSlETOI.js +1 -0
  104. package/core/built/admin/assets/custom-integration-modal-Dgo425Ec.js +1 -0
  105. package/core/built/admin/assets/data-list-DM8yqpXi.js +1 -0
  106. package/core/built/admin/assets/date-range-select-DdC23c13.js +1 -0
  107. package/core/built/admin/assets/design-and-theme-modal-CbSu9IT4.js +2 -0
  108. package/core/built/admin/assets/detail-page-CN4NdhpV.js +1 -0
  109. package/core/built/admin/assets/dirty-confirm-dialog-BT_Vq9TD.js +1 -0
  110. package/core/built/admin/assets/{disabled-sources-indicator-CLZhMv8J.js → disabled-sources-indicator-C5xtW0Q2.js} +1 -1
  111. package/core/built/admin/assets/dist-B40T-RCQ.js +1 -0
  112. package/core/built/admin/assets/dist-CrlaEoaK.js +1 -0
  113. package/core/built/admin/assets/domain-BPReCZa8.js +1 -0
  114. package/core/built/admin/assets/dropzone-B2auMkf2.js +5 -0
  115. package/core/built/admin/assets/edit-profile-B7XTBzKe.js +1 -0
  116. package/core/built/admin/assets/editor-BcaC9dqm.js +8 -0
  117. package/core/built/admin/assets/editor-screen-FuMpItC8.js +27 -0
  118. package/core/built/admin/assets/email-sending-status-provider-9d81o1C2.js +1 -0
  119. package/core/built/admin/assets/embed-signup-form-modal-CbVbMsxl.js +8 -0
  120. package/core/built/admin/assets/empty-indicator-CSQts7GV.js +1 -0
  121. package/core/built/admin/assets/explore-DbSXFTJN.js +1 -0
  122. package/core/built/admin/assets/feature-image-placeholder-DFXA4vfJ.js +1 -0
  123. package/core/built/admin/assets/feed-W7RlF-Gp.js +1 -0
  124. package/core/built/admin/assets/field-BXEh3ptU.js +1 -0
  125. package/core/built/admin/assets/filter-sources-DHK2IoCk.js +1 -0
  126. package/core/built/admin/assets/filters-0SYNTqyQ.js +1 -0
  127. package/core/built/admin/assets/filters-DTtZKQyq.js +1 -0
  128. package/core/built/admin/assets/{first-promoter-modal-wr73Dldc.js → first-promoter-modal-DcoN_OXu.js} +1 -1
  129. package/core/built/admin/assets/{ghost-a1e6e172c6917e8ef8fa6b0007756d9b.js → ghost-25495154132af7305cb7b646fd83f48f.js} +562 -514
  130. package/core/built/admin/assets/gift-link-modal-BX-Q1TOk.js +1 -0
  131. package/core/built/admin/assets/grid-BEUIDQX7.js +1 -0
  132. package/core/built/admin/assets/growth-G6PLO4aF.js +1 -0
  133. package/core/built/admin/assets/growth-tkD-fBOY.js +3 -0
  134. package/core/built/admin/assets/heading-ih-fOVqF.js +1 -0
  135. package/core/built/admin/assets/history-modal-Ca-gStoq.js +1 -0
  136. package/core/built/admin/assets/html-field-B3CrKV9Y.js +1 -0
  137. package/core/built/admin/assets/images-H-BIm8OQ.js +1 -0
  138. package/core/built/admin/assets/{inbox-DgSZ6w2p.js → inbox-DBbDVMPz.js} +14 -14
  139. package/core/built/admin/assets/index-DOF2jDq0.js +4 -0
  140. package/core/built/admin/assets/index-JrrNchW1.css +2 -0
  141. package/core/built/admin/assets/input-group-CvH-3d3F.js +1 -0
  142. package/core/built/admin/assets/input-surface-CL23Mlh8.js +1 -0
  143. package/core/built/admin/assets/integration-header-C7GXGis_.js +1 -0
  144. package/core/built/admin/assets/invite-user-modal-EJ2_6RpV.js +1 -0
  145. package/core/built/admin/assets/isPlainObject-BzzgUf1E.js +1 -0
  146. package/core/built/admin/assets/{koenig-lexical-CXVgQFUk.js → koenig-lexical-Dkwee5FG.js} +1 -1
  147. package/core/built/admin/assets/koenig-loader-BzXCXHoA.js +2 -0
  148. package/core/built/admin/assets/kpi-card-iCDUTgOR.js +1 -0
  149. package/core/built/admin/assets/kpi-card-jTnpLKGr.js +1 -0
  150. package/core/built/admin/assets/kpi-helpers-Criu0YAf.js +1 -0
  151. package/core/built/admin/assets/kpi-tabs-DbOmmyOo.js +1 -0
  152. package/core/built/admin/assets/label-Du0yqMqL.js +1 -0
  153. package/core/built/admin/assets/label-picker-Bq1XXr1D.js +1 -0
  154. package/core/built/admin/assets/{labels-KMkFoRG6.js → labels-0x2NfLtC.js} +1 -1
  155. package/core/built/admin/assets/layout-Ckwzsnsu.js +1 -0
  156. package/core/built/admin/assets/lib-CCz2mjm8.js +2 -0
  157. package/core/built/admin/assets/link-helpers-o9GgBTni.js +1 -0
  158. package/core/built/admin/assets/{links-FwNCVyVe.js → links-Ctujreuh.js} +1 -1
  159. package/core/built/admin/assets/list-page-CH_wnDC3.js +1 -0
  160. package/core/built/admin/assets/member-activity-CsAh6MxK.js +1 -0
  161. package/core/built/admin/assets/member-activity-feed-0ytsQbtY.js +1 -0
  162. package/core/built/admin/assets/member-custom-fields-CTFGnnYv.js +1 -0
  163. package/core/built/admin/assets/member-detail-QU3vB1ML.js +1 -0
  164. package/core/built/admin/assets/members-CtMVO_AB.js +4 -0
  165. package/core/built/admin/assets/modal-page-8Ipfl51B.js +1 -0
  166. package/core/built/admin/assets/moderation-B8VtA-W0.js +1 -0
  167. package/core/built/admin/assets/multi-select-combobox-_9wEYmGv.js +1 -0
  168. package/core/built/admin/assets/navigation-modal-CGcjJvkc.js +1 -0
  169. package/core/built/admin/assets/newsletter-BpHjjqmq.js +1 -0
  170. package/core/built/admin/assets/newsletter-detail-modal-DzTbGOyo.js +1 -0
  171. package/core/built/admin/assets/newsletter-emails-BMKH4Osp.js +1 -0
  172. package/core/built/admin/assets/newsletters-BxC84_cL.js +1 -0
  173. package/core/built/admin/assets/note-BPtEzzZS.js +1 -0
  174. package/core/built/admin/assets/notifications-ng3ulEdp.js +1 -0
  175. package/core/built/admin/assets/offers-container-modal-CwqnRa3T.js +1 -0
  176. package/core/built/admin/assets/onboarding-route-CplZzd7F.js +1 -0
  177. package/core/built/admin/assets/overview-B0yD9OoX.js +1 -0
  178. package/core/built/admin/assets/overview-C4eJzQqi.js +1 -0
  179. package/core/built/admin/assets/page-header-CdCpekG9.js +1 -0
  180. package/core/built/admin/assets/pagemenu-CKQD9hoP.js +1 -0
  181. package/core/built/admin/assets/pages-route-CKsnxIvw.js +1 -0
  182. package/core/built/admin/assets/{pintura-modal-BljM7hf8.js → pintura-modal-C5jzeyGk.js} +1 -1
  183. package/core/built/admin/assets/portal-frame-DYo0bh0E.js +1 -0
  184. package/core/built/admin/assets/portal-modal-C0d8xjKa.js +1 -0
  185. package/core/built/admin/assets/post-analytics-C5C7IyAm.js +1 -0
  186. package/core/built/admin/assets/post-analytics-header-DKWHwoK2.js +1 -0
  187. package/core/built/admin/assets/{post-analytics-provider-CgreZDjS.js → post-analytics-provider-BqCPPxmW.js} +1 -1
  188. package/core/built/admin/assets/post-share-modal-wxmqbAv_.js +1 -0
  189. package/core/built/admin/assets/posts-list-screen-B978ZO0R.js +2 -0
  190. package/core/built/admin/assets/posts-route-CDqxKazl.js +1 -0
  191. package/core/built/admin/assets/preferences-CnejTRc4.js +5 -0
  192. package/core/built/admin/assets/preview-chrome-C7yZWVLZ.js +1 -0
  193. package/core/built/admin/assets/preview-modal-CFUxUGHp.js +1 -0
  194. package/core/built/admin/assets/profile-ClRGiOqA.js +1 -0
  195. package/core/built/admin/assets/radio-group-CTmLo0h9.js +1 -0
  196. package/core/built/admin/assets/router-provider-DDZvgS3V.js +1 -0
  197. package/core/built/admin/assets/select-D_4xWFYv.js +1 -0
  198. package/core/built/admin/assets/settings-BRl7-7a9.js +1 -0
  199. package/core/built/admin/assets/settings-BoQcPa-y.js +4 -0
  200. package/core/built/admin/assets/settings-breadcrumbs-C9Yxl81q.js +1 -0
  201. package/core/built/admin/assets/{dist-BXHrDV19.js → shade-scope-Cccj-c7I-D0XwkdKQ.js} +5 -3
  202. package/core/built/admin/assets/share-modal-DBqZobuR.js +1 -0
  203. package/core/built/admin/assets/simple-pagination-D5t_ox6x.js +1 -0
  204. package/core/built/admin/assets/skeleton-CPcTiTSX.js +1 -0
  205. package/core/built/admin/assets/{slack-modal-D7W_fNON.js → slack-modal-BF9ex8cd.js} +1 -1
  206. package/core/built/admin/assets/sort-button-C0EXGjnS.js +1 -0
  207. package/core/built/admin/assets/{source-icon-CQboPZQ3.js → source-icon-BzzftCQ2.js} +1 -1
  208. package/core/built/admin/assets/stats-view-CzpGoHzF.js +1 -0
  209. package/core/built/admin/assets/{step-1-BKhjy0PV.js → step-1-CBUYUPPF.js} +1 -1
  210. package/core/built/admin/assets/{step-2-PxA1OM7R.js → step-2-CEIXUwQa.js} +1 -1
  211. package/core/built/admin/assets/{step-3-BJbAiq16.js → step-3-C1HA5i1N.js} +2 -2
  212. package/core/built/admin/assets/stripe-button-DMFsLs80.js +1 -0
  213. package/core/built/admin/assets/stripe-connect-modal-CEvxCUTv.js +1 -0
  214. package/core/built/admin/assets/switch-DoOJF2yg.js +1 -0
  215. package/core/built/admin/assets/table-BDYbUHJz.js +1 -0
  216. package/core/built/admin/assets/tabs-BZyz4ZCH.js +1 -0
  217. package/core/built/admin/assets/tag-detail-CFzaz_9E.js +2 -0
  218. package/core/built/admin/assets/tag-picker-BKUCZuRc.js +1 -0
  219. package/core/built/admin/assets/tags-Bs1FiD7m.js +1 -0
  220. package/core/built/admin/assets/{testimonials-modal-Dkt6ODLW.js → testimonials-modal-CVm0_7E-.js} +1 -1
  221. package/core/built/admin/assets/text-BLI0C8Mc.js +1 -0
  222. package/core/built/admin/assets/textarea-C5qolByg.js +1 -0
  223. package/core/built/admin/assets/tier-detail-modal-Cmwzi-e7.js +1 -0
  224. package/core/built/admin/assets/toggle-group-BTL1QsWY.js +1 -0
  225. package/core/built/admin/assets/{topic-filter-DVOe3D-b.js → topic-filter-BMjhquv7.js} +1 -1
  226. package/core/built/admin/assets/transistor-modal-hMv53jF8.js +1 -0
  227. package/core/built/admin/assets/trend-badge-1w_HEzkG.js +1 -0
  228. package/core/built/admin/assets/{unsplash-modal-DXt7Brum.js → unsplash-modal-jzC8lEB2.js} +1 -1
  229. package/core/built/admin/assets/use-analytics-data-B3lGOxsC.js +1 -0
  230. package/core/built/admin/assets/use-availability-DnKqOyqd.js +1 -0
  231. package/core/built/admin/assets/{use-check-theme-limit-error-JD-J5aaZ.js → use-check-theme-limit-error-C1tc2P4N.js} +2 -2
  232. package/core/built/admin/assets/use-filter-params-DU-aiaTb.js +1 -0
  233. package/core/built/admin/assets/{use-filterable-api-CEMSAYPg.js → use-filterable-api-CxCrnPxG.js} +1 -1
  234. package/core/built/admin/assets/use-growth-stats-E13rMQUE.js +1 -0
  235. package/core/built/admin/assets/use-limiter-DlL7au90.js +19 -0
  236. package/core/built/admin/assets/{use-navigate-with-base-path-88EQpw2k.js → use-navigate-with-base-path-BzgNwMAx.js} +1 -1
  237. package/core/built/admin/assets/{use-pintura-config-BmU45Ruy.js → use-pintura-config-CtEV1JQY.js} +1 -1
  238. package/core/built/admin/assets/{use-pintura-editor-Bz2bZ4iT.js → use-pintura-editor-CaxE64kD.js} +1 -1
  239. package/core/built/admin/assets/use-reply-chain-data-BST2OgCM.js +1 -0
  240. package/core/built/admin/assets/use-sending-eta-DR9ueMH8.js +1 -0
  241. package/core/built/admin/assets/use-setting-group-ldtX1Vsk.js +1 -0
  242. package/core/built/admin/assets/use-settings-navigation-CzGU4sus.js +1 -0
  243. package/core/built/admin/assets/use-staff-users-DoeXaPsb.js +1 -0
  244. package/core/built/admin/assets/use-tinybird-query-BaBNCaj0.js +1 -0
  245. package/core/built/admin/assets/{use-tinybird-token-Lk1RSn0t.js → use-tinybird-token-CnZ19NDf.js} +1 -1
  246. package/core/built/admin/assets/{use-url-input-DpmbDppC.js → use-url-input-C5KHJw79.js} +1 -1
  247. package/core/built/admin/assets/user-detail-modal-Dm0KfPeR.js +1 -0
  248. package/core/built/admin/assets/{vendor-2dd263291938d407802568d3357ec69e.js → vendor-97e91ff8dd1457c668f9ef103ee1a77b.js} +2748 -2977
  249. package/core/built/admin/assets/virtual-list-tAuPUICw.js +1 -0
  250. package/core/built/admin/assets/web-BQlKcW2x.js +2 -0
  251. package/core/built/admin/assets/web-NTT5DkEz.js +1 -0
  252. package/core/built/admin/assets/{zapier-modal-BafLUO4R.js → zapier-modal-DsHG9Oev.js} +1 -1
  253. package/core/built/admin/index.html +22 -24
  254. package/core/frontend/apps/private-blogging/index.js +2 -2
  255. package/core/frontend/apps/private-blogging/lib/middleware.js +1 -1
  256. package/core/frontend/apps/private-blogging/lib/router.js +1 -1
  257. package/core/frontend/helpers/cancel_link.js +3 -3
  258. package/core/frontend/helpers/content.js +2 -2
  259. package/core/frontend/helpers/content_api_url.js +1 -1
  260. package/core/frontend/helpers/date.js +1 -1
  261. package/core/frontend/helpers/foreach.js +5 -5
  262. package/core/frontend/helpers/get.js +7 -4
  263. package/core/frontend/helpers/ghost_head.js +2 -2
  264. package/core/frontend/helpers/has.js +1 -3
  265. package/core/frontend/helpers/link.js +7 -7
  266. package/core/frontend/helpers/link_class.js +2 -2
  267. package/core/frontend/helpers/navigation.js +1 -2
  268. package/core/frontend/helpers/recommendations.js +5 -6
  269. package/core/frontend/helpers/tiers.js +1 -1
  270. package/core/frontend/helpers/total_members.js +1 -1
  271. package/core/frontend/helpers/total_paid_members.js +1 -1
  272. package/core/frontend/meta/author-url.js +1 -1
  273. package/core/frontend/meta/modified-date.js +1 -1
  274. package/core/frontend/meta/published-date.js +1 -1
  275. package/core/frontend/meta/schema.js +3 -8
  276. package/core/frontend/meta/structured-data.js +1 -2
  277. package/core/frontend/services/assets-minification/minifier.js +1 -1
  278. package/core/frontend/services/data/entry-lookup.js +1 -1
  279. package/core/frontend/services/data/fetch-data.js +2 -2
  280. package/core/frontend/services/rendering/format-response.js +1 -1
  281. package/core/frontend/services/rendering/renderer.js +3 -0
  282. package/core/frontend/services/rendering/templates.js +1 -1
  283. package/core/frontend/services/routing/controllers/static.js +1 -1
  284. package/core/frontend/services/routing/parent-router.js +1 -1
  285. package/core/frontend/services/routing/registry.js +1 -1
  286. package/core/frontend/services/sitemap/base-site-map-generator.js +68 -97
  287. package/core/frontend/services/sitemap/site-map-index-generator.js +16 -21
  288. package/core/frontend/services/sitemap/site-map-manager.js +82 -43
  289. package/core/frontend/services/sitemap/sitemap-xml.js +72 -0
  290. package/core/frontend/services/theme-engine/handlebars/utils.js +8 -8
  291. package/core/frontend/services/theme-engine/i18n/i18n.js +4 -5
  292. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +1 -1
  293. package/core/frontend/services/theme-engine/preview.js +1 -1
  294. package/core/frontend/utils/member-count.js +2 -2
  295. package/core/frontend/web/routers/serve-public-file.js +1 -1
  296. package/core/server/adapters/scheduling/README.md +4 -0
  297. package/core/server/adapters/scheduling/get-scheduler-idempotency-key.js +21 -0
  298. package/core/server/adapters/storage/LocalStorageBase.js +2 -1
  299. package/core/server/api/endpoints/automated-emails.js +8 -2
  300. package/core/server/api/endpoints/db.js +1 -1
  301. package/core/server/api/endpoints/emails.js +3 -3
  302. package/core/server/api/endpoints/mail.js +1 -1
  303. package/core/server/api/endpoints/member-signin-urls.js +1 -1
  304. package/core/server/api/endpoints/members.js +3 -3
  305. package/core/server/api/endpoints/oembed.js +1 -1
  306. package/core/server/api/endpoints/posts.js +1 -1
  307. package/core/server/api/endpoints/settings.js +2 -2
  308. package/core/server/api/endpoints/themes.js +5 -5
  309. package/core/server/api/endpoints/utils/serializers/input/pages.js +2 -2
  310. package/core/server/api/endpoints/utils/serializers/input/posts.js +2 -2
  311. package/core/server/api/endpoints/utils/serializers/input/tags.js +1 -1
  312. package/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js +4 -4
  313. package/core/server/api/endpoints/utils/serializers/output/mappers/comments.js +8 -5
  314. package/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +1 -1
  315. package/core/server/api/endpoints/utils/serializers/output/pages.js +4 -4
  316. package/core/server/api/endpoints/utils/serializers/output/posts.js +4 -4
  317. package/core/server/api/endpoints/utils/serializers/output/search-index.js +11 -11
  318. package/core/server/api/endpoints/utils/serializers/output/settings.js +1 -1
  319. package/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js +3 -3
  320. package/core/server/api/endpoints/utils/validators/input/automated_emails.js +23 -33
  321. package/core/server/api/endpoints/utils/validators/input/settings.js +3 -3
  322. package/core/server/data/exporter/exporter.js +1 -2
  323. package/core/server/data/exporter/table-lists.js +1 -0
  324. package/core/server/data/importer/handlers/image.js +1 -2
  325. package/core/server/data/importer/handlers/json.js +1 -3
  326. package/core/server/data/importer/handlers/markdown.js +4 -8
  327. package/core/server/data/importer/import-manager.js +1 -1
  328. package/core/server/data/importer/importers/content-file-importer.js +4 -8
  329. package/core/server/data/importer/importers/data/base.js +10 -10
  330. package/core/server/data/importer/importers/data/custom-theme-settings-importer.js +1 -1
  331. package/core/server/data/importer/importers/data/data-importer.js +3 -4
  332. package/core/server/data/importer/importers/data/posts-importer.js +10 -10
  333. package/core/server/data/importer/importers/data/products-importer.js +3 -3
  334. package/core/server/data/importer/importers/data/settings-importer.js +2 -2
  335. package/core/server/data/importer/importers/data/stripe-prices-importer.js +1 -1
  336. package/core/server/data/importer/importers/data/stripe-products-importer.js +1 -1
  337. package/core/server/data/importer/importers/data/tags-importer.js +1 -1
  338. package/core/server/data/importer/importers/data/users-importer.js +2 -2
  339. package/core/server/data/importer/importers/json-to-html.js +12 -9
  340. package/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js +1 -1
  341. package/core/server/data/migrations/versions/6.65/2026-09-16-15-35-26-add-members-metafield-change-events.js +17 -0
  342. package/core/server/data/schema/fixtures/fixture-manager.js +3 -3
  343. package/core/server/data/schema/index.js +1 -1
  344. package/core/server/data/schema/schema.js +26 -0
  345. package/core/server/data/schema/validator.js +96 -123
  346. package/core/server/data/seeders/importers/email-recipients-importer.js +2 -2
  347. package/core/server/data/seeders/importers/members-login-events-importer.js +1 -1
  348. package/core/server/data/seeders/importers/members-newsletters-importer.js +1 -1
  349. package/core/server/data/seeders/importers/members-paid-subscription-events-importer.js +1 -1
  350. package/core/server/data/seeders/importers/members-status-events-importer.js +1 -1
  351. package/core/server/data/seeders/importers/members-stripe-customers-importer.js +1 -1
  352. package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +1 -1
  353. package/core/server/data/seeders/importers/members-subscribe-events-importer.js +2 -2
  354. package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +1 -1
  355. package/core/server/data/tinybird/pipes/mv_hits.pipe +25 -20
  356. package/core/server/data/tinybird/scripts/docker-analytics-manager.js +2 -2
  357. package/core/server/ghost-server.js +1 -19
  358. package/core/server/lib/image/image-size.js +1 -3
  359. package/core/server/lib/request-external.js +53 -117
  360. package/core/server/models/base/plugins/actions.js +2 -3
  361. package/core/server/models/base/plugins/crud.js +1 -2
  362. package/core/server/models/base/plugins/events.js +4 -4
  363. package/core/server/models/base/plugins/raw-knex.js +3 -3
  364. package/core/server/models/base/plugins/sanitize.js +1 -1
  365. package/core/server/models/benefit.js +1 -1
  366. package/core/server/models/collection.js +1 -1
  367. package/core/server/models/comment.js +3 -3
  368. package/core/server/models/invite.js +2 -5
  369. package/core/server/models/label.js +3 -6
  370. package/core/server/models/member.js +7 -10
  371. package/core/server/models/newsletter.js +1 -1
  372. package/core/server/models/permission.js +3 -6
  373. package/core/server/models/post.js +20 -23
  374. package/core/server/models/product.js +4 -1
  375. package/core/server/models/relations/authors.js +9 -12
  376. package/core/server/models/role.js +2 -5
  377. package/core/server/models/settings.js +3 -3
  378. package/core/server/models/tag.js +2 -5
  379. package/core/server/models/user.js +8 -10
  380. package/core/server/models/webhook.js +2 -4
  381. package/core/server/notify.js +2 -2
  382. package/core/server/services/adapter-manager/utils.js +6 -1
  383. package/core/server/services/api-version-compatibility/legacy-api-path-match.js +2 -2
  384. package/core/server/services/auth/api-key/admin.js +2 -2
  385. package/core/server/services/auth/api-key/content.js +1 -1
  386. package/core/server/services/auth/passwordreset.js +1 -1
  387. package/core/server/services/auth/setup.js +1 -3
  388. package/core/server/services/automations/README.md +19 -0
  389. package/core/server/services/automations/poll.js +3 -1
  390. package/core/server/services/automations/service.js +2 -2
  391. package/core/server/services/automations/welcome-email-automation-poll.js +199 -293
  392. package/core/server/services/comments/comments-controller.js +9 -30
  393. package/core/server/services/comments/comments-service-email-renderer.js +1 -1
  394. package/core/server/services/comments/comments-service-emails.js +1 -1
  395. package/core/server/services/comments/comments-service.js +27 -58
  396. package/core/server/services/comments/comments-stats-service.js +1 -1
  397. package/core/server/services/content-import/import/staged-file.js +9 -9
  398. package/core/server/services/content-import/index.js +1 -1
  399. package/core/server/services/custom-redirects/validation.js +1 -1
  400. package/core/server/services/email-analytics/email-analytics-service-wrapper.js +23 -55
  401. package/core/server/services/email-analytics/index.js +35 -19
  402. package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.js +31 -60
  403. package/core/server/services/email-service/README.md +35 -0
  404. package/core/server/services/email-service/batch-sending-service.js +13 -14
  405. package/core/server/services/email-service/email-renderer.js +50 -14
  406. package/core/server/services/email-service/email-service-wrapper.js +3 -2
  407. package/core/server/services/email-service/email-service.js +33 -8
  408. package/core/server/services/email-service/email-templates/partials/feedback-button.hbs +2 -1
  409. package/core/server/services/email-service/email-templates/partials/styles.hbs +0 -6
  410. package/core/server/services/email-service/email-templates/template.hbs +1 -1
  411. package/core/server/services/email-service/jobs/send-email-job.js +12 -0
  412. package/core/server/services/email-service/mailgun-email-provider.js +7 -2
  413. package/core/server/services/email-service/sending-service.js +1 -1
  414. package/core/server/services/gifts/gift-service.js +12 -3
  415. package/core/server/services/gifts/index.js +0 -2
  416. package/core/server/services/gifts/jobs/index.js +12 -24
  417. package/core/server/services/gifts/jobs/send-gift-reminders-job.js +6 -46
  418. package/core/server/services/invitations/accept.js +2 -2
  419. package/core/server/services/jobs/job-service.js +0 -28
  420. package/core/server/services/jobs-service/jobs-service.js +5 -0
  421. package/core/server/services/jobs-service/register-job-handlers.js +17 -1
  422. package/core/server/services/lib/mailgun-client.js +16 -1
  423. package/core/server/services/lib/mailgun-recipient-message-id.js +49 -0
  424. package/core/server/services/limits.js +1 -1
  425. package/core/server/services/mail/ghost-mailer.js +1 -1
  426. package/core/server/services/member-attribution/member-attribution-service.js +1 -1
  427. package/core/server/services/member-attribution/referrer-translator.js +1 -1
  428. package/core/server/services/members/account-service.js +3 -3
  429. package/core/server/services/members/api.js +1 -1
  430. package/core/server/services/members/import-export/import/importer.js +25 -16
  431. package/core/server/services/members/import-export/import/spool.js +11 -15
  432. package/core/server/services/members/import-export/index.js +6 -4
  433. package/core/server/services/members/jobs/index.js +1 -1
  434. package/core/server/services/members/jobs/members-import-job.js +18 -0
  435. package/core/server/services/members/member-avatar.js +18 -0
  436. package/core/server/services/members/members-api/controllers/member-controller.js +2 -2
  437. package/core/server/services/members/members-api/members-api.js +4 -4
  438. package/core/server/services/members/members-api/repositories/event-repository.js +36 -1
  439. package/core/server/services/members/members-api/repositories/member-repository.js +55 -17
  440. package/core/server/services/members/members-api/repositories/product-repository.js +1 -1
  441. package/core/server/services/members/members-api/services/member-bread-service.js +4 -7
  442. package/core/server/services/members/service.js +7 -2
  443. package/core/server/services/members/stats/members-stats.js +2 -2
  444. package/core/server/services/members-events/event-storage.js +2 -2
  445. package/core/server/services/members-metafields/actions.js +23 -2
  446. package/core/server/services/members-metafields/bindings-service.js +5 -5
  447. package/core/server/services/members-metafields/definitions-service.js +2 -7
  448. package/core/server/services/members-metafields/index.js +2 -1
  449. package/core/server/services/members-metafields/queries.js +7 -1
  450. package/core/server/services/members-metafields/schema.js +49 -1
  451. package/core/server/services/members-metafields/values-service.js +112 -10
  452. package/core/server/services/mentions/mention-sending-service.js +2 -2
  453. package/core/server/services/mentions/mention.js +3 -4
  454. package/core/server/services/mentions/mentions-api.js +4 -1
  455. package/core/server/services/mentions-jobs/job-service.js +0 -28
  456. package/core/server/services/milestones/milestones-service.js +1 -1
  457. package/core/server/services/newsletters/newsletters-service.js +1 -1
  458. package/core/server/services/notifications/notifications.js +3 -3
  459. package/core/server/services/oembed/oembed-service.js +79 -3
  460. package/core/server/services/permissions/can-this.js +1 -2
  461. package/core/server/services/post-scheduling/post-scheduling.js +8 -1
  462. package/core/server/services/posts/post-scheduling.js +7 -0
  463. package/core/server/services/settings/settings-bread-service.js +3 -3
  464. package/core/server/services/settings/settings-utils.js +1 -1
  465. package/core/server/services/settings-helpers/settings-helpers.js +1 -1
  466. package/core/server/services/staff/staff-service-emails.js +9 -9
  467. package/core/server/services/stats/posts-stats-service.js +10 -10
  468. package/core/server/services/stats/referrers-stats-service.js +1 -1
  469. package/core/server/services/stats/subscription-stats-service.js +3 -3
  470. package/core/server/services/stats/utils/tinybird.js +8 -1
  471. package/core/server/services/stripe/stripe-api.js +3 -3
  472. package/core/server/services/stripe/stripe-migrations.js +6 -6
  473. package/core/server/services/themes/storage.js +21 -26
  474. package/core/server/services/themes/theme-storage.js +2 -2
  475. package/core/server/services/tiers/tier.js +15 -15
  476. package/core/server/services/tinybird-sync/index.js +3 -0
  477. package/core/server/services/tinybird-sync/tinybird-sync-service.js +7 -2
  478. package/core/server/services/update-check/update-check-service.js +3 -3
  479. package/core/server/services/webhooks/serialize.js +1 -1
  480. package/core/server/web/api/app.js +0 -5
  481. package/core/server/web/api/middleware/upload.js +29 -2
  482. package/core/server/web/parent/middleware/index.js +1 -1
  483. package/core/server/web/parent/middleware/log-request.js +5 -0
  484. package/core/server/web/parent/middleware/queue-request.js +104 -59
  485. package/core/server/web/shared/middleware/api/spam-prevention.js +2 -2
  486. package/core/shared/config/defaults.json +6 -1
  487. package/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js +1 -1
  488. package/core/shared/labs.js +3 -2
  489. package/core/shared/settings-cache/cache-manager.js +1 -1
  490. package/nodemon.json +1 -1
  491. package/package.json +6 -7
  492. package/pnpm-lock.yaml +126 -728
  493. package/pnpm-workspace.yaml +4 -7
  494. package/tsconfig.json +1 -1
  495. package/components/tryghost-adapter-base-scheduling-0.2.3.tgz +0 -0
  496. package/core/built/admin/assets/Combination-DWfJPcz9.js +0 -41
  497. package/core/built/admin/assets/RadialBarChart-CHRBhiBN.js +0 -1
  498. package/core/built/admin/assets/_baseAssignValue-DcPokYW8.js +0 -1
  499. package/core/built/admin/assets/accordion-CJmRaqK7.js +0 -1
  500. package/core/built/admin/assets/account-migration-DYf7skbb.js +0 -1
  501. package/core/built/admin/assets/action-list-Crnh-_UI.js +0 -1
  502. package/core/built/admin/assets/activitypub/avatar-DVJF5bxP.js +0 -261
  503. package/core/built/admin/assets/activitypub/layout-BL4_jtuV.js +0 -1
  504. package/core/built/admin/assets/activitypub/routes-DdyY9uFF.js +0 -7181
  505. package/core/built/admin/assets/activitypub/settings-B6EEcVkW.js +0 -315
  506. package/core/built/admin/assets/activitypub/tabs-DLhZtVde.js +0 -1083
  507. package/core/built/admin/assets/activitypub/users-inweyKL5.js +0 -1499
  508. package/core/built/admin/assets/add-newsletter-modal-CTvXiIqY.js +0 -1
  509. package/core/built/admin/assets/analytics-PHR1Fggi.js +0 -1
  510. package/core/built/admin/assets/announcement-bar-modal-Bql0CXdp.js +0 -1
  511. package/core/built/admin/assets/api-keys-CubH-7_H.js +0 -1
  512. package/core/built/admin/assets/automations-DcZSLFDU.js +0 -1
  513. package/core/built/admin/assets/badge-qP06OT7C.js +0 -1
  514. package/core/built/admin/assets/bluesky-sharing-CJw4d4Mf.js +0 -1
  515. package/core/built/admin/assets/box-CZ_LSVSy.js +0 -1
  516. package/core/built/admin/assets/brand-icon-D3ffDYaC.js +0 -1
  517. package/core/built/admin/assets/breadcrumb-Chn1Ip_q.js +0 -1
  518. package/core/built/admin/assets/button-DvIh2Bq-.js +0 -1
  519. package/core/built/admin/assets/calendar-1QGoStFM.js +0 -1
  520. package/core/built/admin/assets/card-FHQ4D10L.js +0 -1
  521. package/core/built/admin/assets/chart-helpers-CNpA7re_.js +0 -1
  522. package/core/built/admin/assets/chart-jVz9Nf9t.js +0 -63
  523. package/core/built/admin/assets/checkbox-DKht9xMl.js +0 -1
  524. package/core/built/admin/assets/chunk.524.cc9be98e44890cedc8c8.js +0 -25
  525. package/core/built/admin/assets/chunk.582.e6fe742b3217207b11a6.js +0 -27
  526. package/core/built/admin/assets/code-editor-view-BLQIV85-.js +0 -1
  527. package/core/built/admin/assets/code-editor-view-Cg5eJxcr.js +0 -1
  528. package/core/built/admin/assets/color-picker-DQoghc0t.js +0 -3
  529. package/core/built/admin/assets/color-picker-field-BbeK5RRs.js +0 -1
  530. package/core/built/admin/assets/combobox-weO4FBbv.js +0 -1
  531. package/core/built/admin/assets/command-DlLrCm9V.js +0 -1
  532. package/core/built/admin/assets/comments-BjTitLmP.js +0 -1
  533. package/core/built/admin/assets/confirmation-context-IyqoXVk-.js +0 -1
  534. package/core/built/admin/assets/container-DAimjOF_.js +0 -1
  535. package/core/built/admin/assets/context-menu-BtioYFrg.js +0 -1
  536. package/core/built/admin/assets/copy-field-C6ujqJlP.js +0 -1
  537. package/core/built/admin/assets/create-ghost-browse-value-source-DAZMWZNq.js +0 -1
  538. package/core/built/admin/assets/custom-integration-modal-Dm8QI_J4.js +0 -1
  539. package/core/built/admin/assets/data-list-C0CKkeWW.js +0 -1
  540. package/core/built/admin/assets/date-range-select-DrjHQdgz.js +0 -1
  541. package/core/built/admin/assets/design-and-theme-modal-CXVOzBWu.js +0 -2
  542. package/core/built/admin/assets/detail-page-QpLIL-EO.js +0 -1
  543. package/core/built/admin/assets/dirty-confirm-dialog-DWwxREGh.js +0 -1
  544. package/core/built/admin/assets/dist-Bf-HQtVL.js +0 -1
  545. package/core/built/admin/assets/dist-CUwte9v_.js +0 -1
  546. package/core/built/admin/assets/dist-FEQQAwTe.js +0 -1
  547. package/core/built/admin/assets/domain-DBrBic6q.js +0 -1
  548. package/core/built/admin/assets/dropzone-D61QVcEY.js +0 -5
  549. package/core/built/admin/assets/edit-profile-jCqJBxqw.js +0 -1
  550. package/core/built/admin/assets/editor-8Fm4UBEd.js +0 -8
  551. package/core/built/admin/assets/editor-screen-BSX_uC2B.js +0 -27
  552. package/core/built/admin/assets/email-sending-status-provider-DnNhlIvt.js +0 -1
  553. package/core/built/admin/assets/embed-signup-form-modal-DqtBs1WE.js +0 -8
  554. package/core/built/admin/assets/empty-indicator-L4Ql5Db7.js +0 -1
  555. package/core/built/admin/assets/en-Cx75dJv5.js +0 -1
  556. package/core/built/admin/assets/explore-DXhDCtKw.js +0 -1
  557. package/core/built/admin/assets/feature-image-placeholder-e2q6TcH6.js +0 -1
  558. package/core/built/admin/assets/feed-mmt4noNL.js +0 -1
  559. package/core/built/admin/assets/field-p7KnP98B.js +0 -1
  560. package/core/built/admin/assets/filter-bar-CiIKBg3D.js +0 -1
  561. package/core/built/admin/assets/filter-sources-I-dRaQxl.js +0 -1
  562. package/core/built/admin/assets/filters-1injvyxJ.js +0 -1
  563. package/core/built/admin/assets/filters-DnpO6GWX.js +0 -1
  564. package/core/built/admin/assets/gift-link-modal-C3H7YFXO.js +0 -1
  565. package/core/built/admin/assets/grid-5vplBYri.js +0 -1
  566. package/core/built/admin/assets/growth-B1og1kQp.js +0 -1
  567. package/core/built/admin/assets/growth-Bf6OHZlK.js +0 -3
  568. package/core/built/admin/assets/heading-BB21QAbb.js +0 -1
  569. package/core/built/admin/assets/history-modal-t_qEnxPx.js +0 -1
  570. package/core/built/admin/assets/html-field-COLQbV4r.js +0 -1
  571. package/core/built/admin/assets/images-4mvoc3lB.js +0 -1
  572. package/core/built/admin/assets/index-B3HZU2i8.css +0 -2
  573. package/core/built/admin/assets/index-DDd-zhNL.js +0 -4
  574. package/core/built/admin/assets/inline-B8H6NzIw.js +0 -1
  575. package/core/built/admin/assets/input-group-CLIN2ykI.js +0 -1
  576. package/core/built/admin/assets/input-surface-wSO5CRy5.js +0 -1
  577. package/core/built/admin/assets/integration-header-CKGrXNVP.js +0 -1
  578. package/core/built/admin/assets/invite-user-modal-BaN2mdhI.js +0 -1
  579. package/core/built/admin/assets/koenig-loader-B1XPPY5C.js +0 -2
  580. package/core/built/admin/assets/kpi-card-CRLPVlFW.js +0 -1
  581. package/core/built/admin/assets/kpi-card-CRPbW8NZ.js +0 -1
  582. package/core/built/admin/assets/kpi-helpers-D7zT96bp.js +0 -1
  583. package/core/built/admin/assets/kpi-tabs-DE_yh9Go.js +0 -1
  584. package/core/built/admin/assets/label-CgeBxy4o.js +0 -1
  585. package/core/built/admin/assets/label-picker-DGDp4Vwr.js +0 -1
  586. package/core/built/admin/assets/layout-DWnOMly4.js +0 -1
  587. package/core/built/admin/assets/lib-_QYaUU89.js +0 -2
  588. package/core/built/admin/assets/link-helpers-8J7ixADV.js +0 -1
  589. package/core/built/admin/assets/list-page-DLMP0PxC.js +0 -1
  590. package/core/built/admin/assets/member-activity-ClMWFyvN.js +0 -1
  591. package/core/built/admin/assets/member-activity-feed-BQY5Rwaj.js +0 -1
  592. package/core/built/admin/assets/member-custom-fields-Dd_ie1zG.js +0 -1
  593. package/core/built/admin/assets/member-detail-DjwkGVne.js +0 -1
  594. package/core/built/admin/assets/members--N9lhk1N.js +0 -4
  595. package/core/built/admin/assets/modal-page-Dz-9TP4E.js +0 -1
  596. package/core/built/admin/assets/moderation-DfYBKq9s.js +0 -1
  597. package/core/built/admin/assets/multi-select-combobox-BcBEzUW_.js +0 -1
  598. package/core/built/admin/assets/navigation-modal-Cd-scywg.js +0 -1
  599. package/core/built/admin/assets/newsletter-detail-modal-CFRY6vg_.js +0 -1
  600. package/core/built/admin/assets/newsletter-emails-4ntck1AC.js +0 -1
  601. package/core/built/admin/assets/newsletter-o6eCJtab.js +0 -1
  602. package/core/built/admin/assets/newsletters-Bmlv0edG.js +0 -1
  603. package/core/built/admin/assets/note-CWs3LF-0.js +0 -1
  604. package/core/built/admin/assets/notifications-BjSvTJqh.js +0 -1
  605. package/core/built/admin/assets/offers-container-modal-Bc9A196w.js +0 -1
  606. package/core/built/admin/assets/onboarding-route-Di1LJYEE.js +0 -1
  607. package/core/built/admin/assets/overview-DE7NHZQN.js +0 -1
  608. package/core/built/admin/assets/overview-DEF-ZY6x.js +0 -1
  609. package/core/built/admin/assets/page-header-B-G_g42C.js +0 -1
  610. package/core/built/admin/assets/pagemenu-CnkTDO71.js +0 -1
  611. package/core/built/admin/assets/pages-route-VT7r7YhG.js +0 -1
  612. package/core/built/admin/assets/portal-frame-D9V8iq5x.js +0 -1
  613. package/core/built/admin/assets/portal-modal-B5OOR9ZD.js +0 -1
  614. package/core/built/admin/assets/post-analytics-header-J0WciLx6.js +0 -1
  615. package/core/built/admin/assets/post-analytics-rGb-PgD-.js +0 -1
  616. package/core/built/admin/assets/post-share-modal-D0BbTo4W.js +0 -1
  617. package/core/built/admin/assets/posts-list-screen-CO5jAWoU.js +0 -2
  618. package/core/built/admin/assets/posts-route-DV-CXWK9.js +0 -1
  619. package/core/built/admin/assets/preferences-Tac29oG6.js +0 -5
  620. package/core/built/admin/assets/preview-chrome-C2lQgZBZ.js +0 -1
  621. package/core/built/admin/assets/preview-modal-CjRbBr8U.js +0 -1
  622. package/core/built/admin/assets/profile-yiM1f_Og.js +0 -1
  623. package/core/built/admin/assets/radio-group-CKROWsw4.js +0 -1
  624. package/core/built/admin/assets/router-provider-CU87qxXw.js +0 -1
  625. package/core/built/admin/assets/select-CKaC4ggu.js +0 -1
  626. package/core/built/admin/assets/settings-81kxUa28.js +0 -1
  627. package/core/built/admin/assets/settings-BVXFqBVK.js +0 -4
  628. package/core/built/admin/assets/settings-breadcrumbs-czGRx-iu.js +0 -1
  629. package/core/built/admin/assets/shade-app-CcS3f8MZ-D5BnfHck.js +0 -3
  630. package/core/built/admin/assets/share-modal-BL-16PiB.js +0 -1
  631. package/core/built/admin/assets/skeleton-DwCva0-b.js +0 -1
  632. package/core/built/admin/assets/sort-button-Dquc83jY.js +0 -1
  633. package/core/built/admin/assets/stack-BURz77VS.js +0 -1
  634. package/core/built/admin/assets/stats-view-NDja_g96.js +0 -1
  635. package/core/built/admin/assets/stripe-button-C3cfCAou.js +0 -1
  636. package/core/built/admin/assets/stripe-connect-modal-FyE3Ey2c.js +0 -1
  637. package/core/built/admin/assets/switch-zfUUy9Jh.js +0 -1
  638. package/core/built/admin/assets/table-dE4GTIRT.js +0 -1
  639. package/core/built/admin/assets/tabs-B3XK93sR.js +0 -1
  640. package/core/built/admin/assets/tag-detail-D4P-tZdM.js +0 -2
  641. package/core/built/admin/assets/tag-picker-BNSZ6Qxw.js +0 -1
  642. package/core/built/admin/assets/tags-BsZcaJ6h.js +0 -1
  643. package/core/built/admin/assets/text-DC-ot6u2.js +0 -1
  644. package/core/built/admin/assets/textarea-B4FffFmE.js +0 -1
  645. package/core/built/admin/assets/tier-detail-modal-a77Z2VMH.js +0 -1
  646. package/core/built/admin/assets/toggle-group-D2p4okmJ.js +0 -1
  647. package/core/built/admin/assets/transistor-modal-C8RMkhOD.js +0 -1
  648. package/core/built/admin/assets/trend-badge-B9v7kMF8.js +0 -1
  649. package/core/built/admin/assets/types-uYQ1HgqL.js +0 -1
  650. package/core/built/admin/assets/use-analytics-data-ChHqiZXv.js +0 -1
  651. package/core/built/admin/assets/use-availability-hPdeG76y.js +0 -1
  652. package/core/built/admin/assets/use-filter-params-BSFigDIn.js +0 -1
  653. package/core/built/admin/assets/use-growth-stats-CqqdnESN.js +0 -1
  654. package/core/built/admin/assets/use-limiter-DBGjYqu7.js +0 -19
  655. package/core/built/admin/assets/use-reply-chain-data-DmD2yX5D.js +0 -1
  656. package/core/built/admin/assets/use-sending-eta-CQeG6OP_.js +0 -1
  657. package/core/built/admin/assets/use-setting-group-Dza6bQ7W.js +0 -1
  658. package/core/built/admin/assets/use-settings-navigation-BIjI5mL3.js +0 -1
  659. package/core/built/admin/assets/use-simple-pagination-DwVxe-Lo.js +0 -1
  660. package/core/built/admin/assets/use-staff-users-i_Mq9OGR.js +0 -1
  661. package/core/built/admin/assets/use-tinybird-query-DXoF74NM.js +0 -1
  662. package/core/built/admin/assets/user-detail-modal-BU4QCHE7.js +0 -1
  663. package/core/built/admin/assets/virtual-list-DScLNuU8.js +0 -1
  664. package/core/built/admin/assets/web-BZS-t4H0.js +0 -1
  665. package/core/built/admin/assets/web-DxAUxnK3.js +0 -2
  666. package/core/frontend/services/sitemap/utils.js +0 -17
  667. package/core/server/services/automations/get-scheduler-idempotency-key.js +0 -13
  668. package/core/server/web/api/testmode/index.js +0 -1
  669. package/core/server/web/api/testmode/jobs/cpu-hog.js +0 -15
  670. package/core/server/web/api/testmode/jobs/graceful-job.js +0 -50
  671. package/core/server/web/api/testmode/jobs/say-hello.js +0 -17
  672. package/core/server/web/api/testmode/routes.js +0 -120
@@ -12,6 +12,7 @@ const dnsPromises = require('dns').promises;
12
12
  const errors = require('@tryghost/errors');
13
13
  const config = require('../../shared/config');
14
14
  const validator = require('@tryghost/validator');
15
+ const ipaddr = require('ipaddr.js');
15
16
 
16
17
  // Shared keep-alive agents so outbound HTTPS connections are pooled and reused
17
18
  // across page renders / oEmbed / webmention / recommendations / image probes.
@@ -44,70 +45,58 @@ function normalizeIPv4(addr) {
44
45
  return null;
45
46
  }
46
47
 
48
+ const IPV4_COMPATIBLE = ipaddr.IPv6.parseCIDR('::/96');
49
+ const NAT64_WELL_KNOWN = ipaddr.IPv6.parseCIDR('64:ff9b::/96');
50
+
47
51
  /**
48
- * Normalize an IPv6 address from any expanded form (e.g. 0:0:0:0:0:0:0:1)
49
- * to compressed notation (e.g. ::1) using the WHATWG URL parser.
50
- * Returns null if the address is not a valid IPv6 address.
52
+ * Build an IPv4 address from two 16-bit IPv6 groups.
53
+ *
54
+ * @param {number} hi
55
+ * @param {number} lo
56
+ * @returns {ipaddr.IPv4}
51
57
  */
52
- function normalizeIPv6(addr) {
53
- try {
54
- const hostname = new URL('http://[' + addr + ']/').hostname;
55
- // hostname includes brackets, strip them
56
- const normalized = hostname.slice(1, -1);
57
- if (net.isIPv6(normalized)) {
58
- return normalized;
59
- }
60
- } catch {
61
- // URL parsing failed
62
- }
63
- return null;
58
+ function ipv4FromGroups(hi, lo) {
59
+ return new ipaddr.IPv4([(hi >> 8) & 0xff, hi & 0xff, (lo >> 8) & 0xff, lo & 0xff]);
64
60
  }
65
61
 
66
62
  /**
67
- * Check if a normalized (dotted-decimal) IPv4 address falls in a private/reserved range.
63
+ * Default-deny: anything outside ipaddr.js's plain "unicast" range is private.
64
+ * IPv6 transition prefixes that route to an embedded IPv4 address are classified
65
+ * by that IPv4 address instead, so e.g. DNS64-synthesized addresses for public
66
+ * hosts are still allowed on NAT64 networks.
67
+ *
68
+ * @param {ipaddr.IPv4 | ipaddr.IPv6} address
69
+ * @returns {boolean}
68
70
  */
69
- function isPrivateIPv4(addr) {
70
- const parts = addr.split('.');
71
- const a = parseInt(parts[0], 10);
72
- const b = parseInt(parts[1], 10);
71
+ function isPrivateAddress(address) {
72
+ if (address instanceof ipaddr.IPv6) {
73
+ const parts = address.parts;
73
74
 
74
- // 10.0.0.0/8
75
- if (a === 10) {
76
- return true;
77
- }
78
- // 172.16.0.0/12
79
- if (a === 172 && b >= 16 && b <= 31) {
80
- return true;
81
- }
82
- // 192.168.0.0/16
83
- if (a === 192 && b === 168) {
84
- return true;
85
- }
86
- // 127.0.0.0/8
87
- if (a === 127) {
88
- return true;
89
- }
90
- // 169.254.0.0/16
91
- if (a === 169 && b === 254) {
92
- return true;
93
- }
94
- // 100.64.0.0/10 (carrier-grade NAT, RFC 6598)
95
- if (a === 100 && b >= 64 && b <= 127) {
96
- return true;
97
- }
98
- // 198.18.0.0/15 (benchmarking, RFC 2544)
99
- if (a === 198 && (b === 18 || b === 19)) {
100
- return true;
101
- }
102
- // 0.0.0.0/8
103
- if (a === 0) {
104
- return true;
105
- }
106
- // 240.0.0.0/4 (reserved) and 255.255.255.255 (broadcast)
107
- if (a >= 240) {
108
- return true;
75
+ // ::/96 - unspecified, loopback and deprecated IPv4-compatible addresses (RFC 4291).
76
+ // ipaddr.js classifies IPv4-compatible addresses such as ::7f00:1 as unicast.
77
+ if (address.match(IPV4_COMPATIBLE)) {
78
+ return true;
79
+ }
80
+
81
+ switch (address.range()) {
82
+ // ::ffff:0:0/96 IPv4-mapped (RFC 4291) and ::ffff:0:0:0/96 IPv4-translated (RFC 6145)
83
+ case 'ipv4Mapped':
84
+ case 'rfc6145':
85
+ return isPrivateAddress(ipv4FromGroups(parts[6], parts[7]));
86
+ // 64:ff9b::/96 NAT64 well-known prefix (RFC 6052). The 64:ff9b:1::/48 local-use
87
+ // prefix (RFC 8215) has a network-specific IPv4 position, so it stays blocked.
88
+ case 'rfc6052':
89
+ if (address.match(NAT64_WELL_KNOWN)) {
90
+ return isPrivateAddress(ipv4FromGroups(parts[6], parts[7]));
91
+ }
92
+ return true;
93
+ // 2002::/16 6to4 (RFC 3056)
94
+ case '6to4':
95
+ return isPrivateAddress(ipv4FromGroups(parts[1], parts[2]));
96
+ }
109
97
  }
110
- return false;
98
+
99
+ return address.range() !== 'unicast';
111
100
  }
112
101
 
113
102
  function isPrivateIp(addr) {
@@ -116,70 +105,17 @@ function isPrivateIp(addr) {
116
105
  return true;
117
106
  }
118
107
 
119
- // Check for IPv4-mapped IPv6 in dotted notation (e.g. ::ffff:192.168.0.1)
120
- const v4DottedMatch = addr.match(/^::ffff:(\d[\d.]+)$/i);
121
- if (v4DottedMatch) {
122
- const normalized = normalizeIPv4(v4DottedMatch[1]);
123
- if (normalized) {
124
- return isPrivateIPv4(normalized);
125
- }
108
+ let address;
109
+ try {
110
+ // WHATWG normalization first so every IPv4 form Node will connect to
111
+ // (decimal, octal, hex, integer, shortened) is parsed the same way
112
+ address = ipaddr.parse(normalizeIPv4(addr) ?? addr);
113
+ } catch {
114
+ // Unrecognized format - fail closed
126
115
  return true;
127
116
  }
128
117
 
129
- // Check for IPv4-mapped IPv6 in hex notation (e.g. ::ffff:7f00:1)
130
- const v4HexMatch = addr.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);
131
- if (v4HexMatch) {
132
- const hi = parseInt(v4HexMatch[1], 16);
133
- const lo = parseInt(v4HexMatch[2], 16);
134
- const mapped =
135
- ((hi >> 8) & 0xff) + '.' + (hi & 0xff) + '.' + ((lo >> 8) & 0xff) + '.' + (lo & 0xff);
136
- return isPrivateIPv4(mapped);
137
- }
138
-
139
- // Try normalizing as IPv4 (handles decimal, octal, hex, and integer notation)
140
- const normalized = normalizeIPv4(addr);
141
- if (normalized) {
142
- return isPrivateIPv4(normalized);
143
- }
144
-
145
- // IPv6 checks
146
- const normalized6 = normalizeIPv6(addr);
147
- if (normalized6) {
148
- // ::1 loopback, :: unspecified
149
- if (normalized6 === '::1' || normalized6 === '::' || normalized6 === '::0') {
150
- return true;
151
- }
152
- // fc00::/7 unique local
153
- if (/^f[cd][0-9a-f]{2}:/i.test(normalized6)) {
154
- return true;
155
- }
156
- // fe80::/10 link-local
157
- if (/^fe[89ab][0-9a-f]:/i.test(normalized6)) {
158
- return true;
159
- }
160
- // Re-check for IPv4-mapped IPv6 after normalization
161
- // Handles expanded forms like 0:0:0:0:0:ffff:127.0.0.1 which normalize to ::ffff:...
162
- const v4DottedNorm = normalized6.match(/^::ffff:(\d[\d.]+)$/i);
163
- if (v4DottedNorm) {
164
- const normV4 = normalizeIPv4(v4DottedNorm[1]);
165
- if (normV4) {
166
- return isPrivateIPv4(normV4);
167
- }
168
- return true;
169
- }
170
- const v4HexNorm = normalized6.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);
171
- if (v4HexNorm) {
172
- const hi = parseInt(v4HexNorm[1], 16);
173
- const lo = parseInt(v4HexNorm[2], 16);
174
- const mapped =
175
- ((hi >> 8) & 0xff) + '.' + (hi & 0xff) + '.' + ((lo >> 8) & 0xff) + '.' + (lo & 0xff);
176
- return isPrivateIPv4(mapped);
177
- }
178
- return false;
179
- }
180
-
181
- // Unrecognized format - fail closed
182
- return true;
118
+ return isPrivateAddress(address);
183
119
  }
184
120
 
185
121
  async function errorIfHostnameResolvesToPrivateIp(options) {
@@ -1,4 +1,3 @@
1
- const _ = require('lodash');
2
1
  const errors = require('@tryghost/errors');
3
2
  const logging = require('@tryghost/logging');
4
3
 
@@ -27,7 +26,7 @@ module.exports = function (Bookshelf) {
27
26
  return Bookshelf.model('Action')
28
27
  .add(action, { autoRefresh: false })
29
28
  .catch((err) => {
30
- if (_.isArray(err)) {
29
+ if (Array.isArray(err)) {
31
30
  err = err[0];
32
31
  }
33
32
 
@@ -99,7 +98,7 @@ module.exports = function (Bookshelf) {
99
98
  return;
100
99
  }
101
100
 
102
- let context = {
101
+ const context = {
103
102
  action_name: options.actionName,
104
103
  };
105
104
 
@@ -302,10 +302,9 @@ module.exports = function (Bookshelf) {
302
302
  */
303
303
  add: function add(data, unfilteredOptions) {
304
304
  const options = this.filterOptions(unfilteredOptions, 'add');
305
- let model;
306
305
 
307
306
  data = this.filterData(data);
308
- model = this.forge(data);
307
+ const model = this.forge(data);
309
308
 
310
309
  // We allow you to disable timestamps when importing posts so that the new posts `updated_at` value is the same
311
310
  // as the import json blob. More details refer to https://github.com/TryGhost/Ghost/issues/1696
@@ -8,7 +8,7 @@ const schema = require('../../../data/schema');
8
8
  const events = require('../../../lib/common/events');
9
9
 
10
10
  // Run tests or development with NUMERIC_IDS=1 to enable numeric object IDs
11
- let forceNumericObjectIds = process.env.NODE_ENV !== 'production' && !!process.env.NUMERIC_IDS;
11
+ const forceNumericObjectIds = process.env.NODE_ENV !== 'production' && !!process.env.NUMERIC_IDS;
12
12
  let numberGenerator = 0;
13
13
 
14
14
  module.exports = function (Bookshelf) {
@@ -103,11 +103,11 @@ module.exports = function (Bookshelf) {
103
103
 
104
104
  /**
105
105
  * Do not call `toJSON`. This can remove properties e.g. password.
106
- * @returns {*}
106
+ * @returns {Promise<void>}
107
107
  */
108
- onValidate: function onValidate(model, columns, options) {
108
+ onValidate: async function onValidate(model, columns, options) {
109
109
  this.setEmptyValuesToNull();
110
- return schema.validate(this.tableName, this, options);
110
+ schema.validate(this.tableName, this, options);
111
111
  },
112
112
 
113
113
  onFetched() {},
@@ -66,7 +66,7 @@ module.exports = function (Bookshelf) {
66
66
  },
67
67
  };
68
68
 
69
- let query = Bookshelf.knex(tableNames[modelName]);
69
+ const query = Bookshelf.knex(tableNames[modelName]);
70
70
 
71
71
  if (orderBy) {
72
72
  query.orderBy(orderBy);
@@ -111,7 +111,7 @@ module.exports = function (Bookshelf) {
111
111
  return [];
112
112
  }
113
113
 
114
- let props = {};
114
+ const props = {};
115
115
 
116
116
  if (!withRelated) {
117
117
  return _.map(objects, (object) => {
@@ -136,7 +136,7 @@ module.exports = function (Bookshelf) {
136
136
  props[relation.name] = (async () => {
137
137
  debug('fetch withRelated', relation.name);
138
138
 
139
- let relationQuery = Bookshelf.knex(relation.targetTable);
139
+ const relationQuery = Bookshelf.knex(relation.targetTable);
140
140
 
141
141
  // default fields to select
142
142
  _.each(relation.select, (fieldToSelect) => {
@@ -134,7 +134,7 @@ module.exports = function (Bookshelf) {
134
134
  let relations = data[property];
135
135
 
136
136
  // CASE: 1:1 relation will have single data point
137
- if (!_.isArray(data[property])) {
137
+ if (!Array.isArray(data[property])) {
138
138
  relations = [data[property]];
139
139
  }
140
140
  _.each(relations, (relation, indexInArr) => {
@@ -7,7 +7,7 @@ const Benefit = ghostBookshelf.Model.extend(
7
7
  async onSaving(model, attr, options) {
8
8
  ghostBookshelf.Model.prototype.onSaving.call(this, model, attr, options);
9
9
  // Make sure name is trimmed of extra spaces
10
- let name = this.get('name') && this.get('name').trim();
10
+ const name = this.get('name') && this.get('name').trim();
11
11
  this.set('name', name);
12
12
  if (this.hasChanged('slug') || (!this.get('slug') && this.get('name'))) {
13
13
  // Pass the new slug through the generator to strip illegal characters, detect duplicates
@@ -92,7 +92,7 @@ const Collection = ghostBookshelf.Model.extend({
92
92
  },
93
93
 
94
94
  permittedAttributes() {
95
- let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments);
95
+ const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments);
96
96
 
97
97
  this.relationships.forEach((key) => {
98
98
  filteredKeys.push(key);
@@ -180,7 +180,7 @@ const Comment = ghostBookshelf.Model.extend(
180
180
  },
181
181
 
182
182
  orderAttributes: function orderAttributes() {
183
- let keys = ghostBookshelf.Model.prototype.orderAttributes.call(this, arguments);
183
+ const keys = ghostBookshelf.Model.prototype.orderAttributes.call(this, arguments);
184
184
  keys.push('count__likes');
185
185
  keys.push('count__net_score');
186
186
  keys.push('count__reports');
@@ -209,7 +209,7 @@ const Comment = ghostBookshelf.Model.extend(
209
209
  },
210
210
  {
211
211
  destroy: function destroy(unfilteredOptions) {
212
- let options = this.filterOptions(unfilteredOptions, 'destroy', {
212
+ const options = this.filterOptions(unfilteredOptions, 'destroy', {
213
213
  extraAllowedProperties: ['id'],
214
214
  });
215
215
 
@@ -492,7 +492,7 @@ const Comment = ghostBookshelf.Model.extend(
492
492
  * @return {Array} Keys allowed in the `options` hash of the model's method.
493
493
  */
494
494
  permittedOptions: function permittedOptions(methodName) {
495
- let options = ghostBookshelf.Model.permittedOptions.call(this, methodName);
495
+ const options = ghostBookshelf.Model.permittedOptions.call(this, methodName);
496
496
  options.push('parentId');
497
497
  options.push('isAdmin');
498
498
  options.push('browseAll');
@@ -15,10 +15,7 @@ const messages = {
15
15
  notAllowedToInvite: 'Not allowed to invite this role.',
16
16
  };
17
17
 
18
- let Invite;
19
- let Invites;
20
-
21
- Invite = ghostBookshelf.Model.extend(
18
+ const Invite = ghostBookshelf.Model.extend(
22
19
  {
23
20
  tableName: 'invites',
24
21
 
@@ -142,7 +139,7 @@ Invite = ghostBookshelf.Model.extend(
142
139
  },
143
140
  );
144
141
 
145
- Invites = ghostBookshelf.Collection.extend({
142
+ const Invites = ghostBookshelf.Collection.extend({
146
143
  model: Invite,
147
144
  });
148
145
 
@@ -6,10 +6,7 @@ const messages = {
6
6
  labelNotFound: 'Label not found.',
7
7
  };
8
8
 
9
- let Label;
10
- let Labels;
11
-
12
- Label = ghostBookshelf.Model.extend(
9
+ const Label = ghostBookshelf.Model.extend(
13
10
  {
14
11
  tableName: 'labels',
15
12
 
@@ -50,7 +47,7 @@ Label = ghostBookshelf.Model.extend(
50
47
 
51
48
  ghostBookshelf.Model.prototype.onSaving.apply(this, arguments);
52
49
  // Make sure name is trimmed of extra spaces
53
- let name = this.get('name') && this.get('name').trim();
50
+ const name = this.get('name') && this.get('name').trim();
54
51
  this.set('name', name);
55
52
  if (this.hasChanged('slug') || (!this.get('slug') && this.get('name'))) {
56
53
  // Pass the new slug through the generator to strip illegal characters, detect duplicates
@@ -139,7 +136,7 @@ Label = ghostBookshelf.Model.extend(
139
136
  },
140
137
  );
141
138
 
142
- Labels = ghostBookshelf.Collection.extend({
139
+ const Labels = ghostBookshelf.Collection.extend({
143
140
  model: Label,
144
141
  });
145
142
 
@@ -2,7 +2,7 @@ const ghostBookshelf = require('./base');
2
2
  const crypto = require('crypto');
3
3
  const _ = require('lodash');
4
4
  const { chainTransformers } = require('@tryghost/mongo-utils');
5
- const config = require('../../shared/config');
5
+ const { memberAvatarImage } = require('../services/members/member-avatar');
6
6
  const { MemberCommentingCodec } = require('../services/members/commenting');
7
7
  const {
8
8
  METAFIELDS_RELATION,
@@ -588,7 +588,10 @@ const Member = ghostBookshelf.Model.extend(
588
588
  * has no access to the nested relations, which should be updated.
589
589
  */
590
590
  permittedAttributes: function permittedAttributes() {
591
- let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments);
591
+ const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(
592
+ this,
593
+ arguments,
594
+ );
592
595
 
593
596
  this.relationships.forEach((key) => {
594
597
  filteredKeys.push(key);
@@ -632,14 +635,8 @@ const Member = ghostBookshelf.Model.extend(
632
635
  toJSON(unfilteredOptions) {
633
636
  const attrs = ghostBookshelf.Model.prototype.toJSON.call(this, unfilteredOptions);
634
637
 
635
- // Inject a computed avatar url. Uses gravatar's default ?d= query param
636
- // to serve a blank image if there is no gravatar for the member's email.
637
- // Will not use gravatar if privacy.useGravatar is false in config
638
- attrs.avatar_image = null;
639
- if (attrs.email && !config.isPrivacyDisabled('useGravatar')) {
640
- const { gravatar } = require('../lib/image');
641
- attrs.avatar_image = gravatar.url(attrs.email, { size: 250, default: 'blank' });
642
- }
638
+ // Inject a computed avatar url, by the rule every place that shows a member shares.
639
+ attrs.avatar_image = memberAvatarImage(attrs.email);
643
640
 
644
641
  // Serialize commenting domain object to API format
645
642
  if (attrs.commenting) {
@@ -85,7 +85,7 @@ const Newsletter = ghostBookshelf.Model.extend(
85
85
  },
86
86
 
87
87
  subscribeMembersById(memberIds, unfilteredOptions = {}) {
88
- let pivotRows = [];
88
+ const pivotRows = [];
89
89
  for (const memberId of memberIds) {
90
90
  pivotRows.push({
91
91
  id: ObjectID().toHexString(),
@@ -1,9 +1,6 @@
1
1
  const ghostBookshelf = require('./base');
2
2
 
3
- let Permission;
4
- let Permissions;
5
-
6
- Permission = ghostBookshelf.Model.extend({
3
+ const Permission = ghostBookshelf.Model.extend({
7
4
  tableName: 'permissions',
8
5
 
9
6
  relationships: ['roles'],
@@ -17,7 +14,7 @@ Permission = ghostBookshelf.Model.extend({
17
14
  * has no access to the nested relations, which should be updated.
18
15
  */
19
16
  permittedAttributes: function permittedAttributes() {
20
- let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments);
17
+ const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments);
21
18
 
22
19
  this.relationships.forEach((key) => {
23
20
  filteredKeys.push(key);
@@ -35,7 +32,7 @@ Permission = ghostBookshelf.Model.extend({
35
32
  },
36
33
  });
37
34
 
38
- Permissions = ghostBookshelf.Collection.extend({
35
+ const Permissions = ghostBookshelf.Collection.extend({
39
36
  model: Permission,
40
37
  });
41
38
 
@@ -40,7 +40,6 @@ const POST_REVISIONS_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes
40
40
  const ALL_STATUSES = ['published', 'draft', 'scheduled', 'sent'];
41
41
 
42
42
  let Post;
43
- let Posts;
44
43
 
45
44
  Post = ghostBookshelf.Model.extend(
46
45
  {
@@ -253,7 +252,10 @@ Post = ghostBookshelf.Model.extend(
253
252
  * has no access to the nested relations, which should be updated.
254
253
  */
255
254
  permittedAttributes: function permittedAttributes() {
256
- let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments);
255
+ const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(
256
+ this,
257
+ arguments,
258
+ );
257
259
 
258
260
  this.relationships.forEach((key) => {
259
261
  filteredKeys.push(key);
@@ -263,10 +265,10 @@ Post = ghostBookshelf.Model.extend(
263
265
  },
264
266
 
265
267
  orderAttributes: function orderAttributes() {
266
- let keys = ghostBookshelf.Model.prototype.orderAttributes.apply(this, arguments);
268
+ const keys = ghostBookshelf.Model.prototype.orderAttributes.apply(this, arguments);
267
269
 
268
270
  // extend ordered keys with post_meta keys
269
- let postsMetaKeys = _.without(
271
+ const postsMetaKeys = _.without(
270
272
  ghostBookshelf.model('PostsMeta').prototype.orderAttributes(),
271
273
  'posts_meta.id',
272
274
  'posts_meta.post_id',
@@ -379,14 +381,13 @@ Post = ghostBookshelf.Model.extend(
379
381
  },
380
382
 
381
383
  emitChange: function emitChange(event, options = {}) {
382
- let eventToTrigger;
383
384
  let resourceType = this.get('type');
384
385
 
385
386
  if (options.usePreviousAttribute) {
386
387
  resourceType = this.previous('type');
387
388
  }
388
389
 
389
- eventToTrigger = resourceType + '.' + event;
390
+ const eventToTrigger = resourceType + '.' + event;
390
391
 
391
392
  ghostBookshelf.Model.prototype.emitChange.bind(this)(this, eventToTrigger, options);
392
393
  },
@@ -694,9 +695,9 @@ Post = ghostBookshelf.Model.extend(
694
695
  * CASE: Don't create new posts_meta entry if post meta is empty
695
696
  */
696
697
  if (!_.isUndefined(this.get('posts_meta')) && !_.isNull(this.get('posts_meta'))) {
697
- let postsMetaData = this.get('posts_meta');
698
- let relatedModelId = model.related('posts_meta').get('id');
699
- let hasNoData = !_.values(postsMetaData).some((x) => !!x);
698
+ const postsMetaData = this.get('posts_meta');
699
+ const relatedModelId = model.related('posts_meta').get('id');
700
+ const hasNoData = !_.values(postsMetaData).some((x) => !!x);
700
701
  if (relatedModelId && !_.isEmpty(postsMetaData)) {
701
702
  postsMetaData.id = relatedModelId;
702
703
  this.set('posts_meta', postsMetaData);
@@ -1163,7 +1164,7 @@ Post = ghostBookshelf.Model.extend(
1163
1164
 
1164
1165
  toJSON: function toJSON(unfilteredOptions) {
1165
1166
  const options = Post.filterOptions(unfilteredOptions, 'toJSON');
1166
- let attrs = ghostBookshelf.Model.prototype.toJSON.call(this, options);
1167
+ const attrs = ghostBookshelf.Model.prototype.toJSON.call(this, options);
1167
1168
 
1168
1169
  // CASE: never expose the mobiledoc revisions
1169
1170
  delete attrs.mobiledoc_revisions;
@@ -1402,7 +1403,7 @@ Post = ghostBookshelf.Model.extend(
1402
1403
  * **See:** [ghostBookshelf.Model.edit](base.js.html#edit)
1403
1404
  */
1404
1405
  edit: function edit(data, unfilteredOptions) {
1405
- let options = this.filterOptions(unfilteredOptions, 'edit', {
1406
+ const options = this.filterOptions(unfilteredOptions, 'edit', {
1406
1407
  extraAllowedProperties: ['id'],
1407
1408
  });
1408
1409
 
@@ -1458,7 +1459,7 @@ Post = ghostBookshelf.Model.extend(
1458
1459
  * **See:** [ghostBookshelf.Model.add](base.js.html#add)
1459
1460
  */
1460
1461
  add: function add(data, unfilteredOptions) {
1461
- let options = this.filterOptions(unfilteredOptions, 'add', {
1462
+ const options = this.filterOptions(unfilteredOptions, 'add', {
1462
1463
  extraAllowedProperties: ['id'],
1463
1464
  });
1464
1465
 
@@ -1486,7 +1487,7 @@ Post = ghostBookshelf.Model.extend(
1486
1487
  },
1487
1488
 
1488
1489
  destroy: function destroy(unfilteredOptions) {
1489
- let options = this.filterOptions(unfilteredOptions, 'destroy', {
1490
+ const options = this.filterOptions(unfilteredOptions, 'destroy', {
1490
1491
  extraAllowedProperties: ['id'],
1491
1492
  });
1492
1493
 
@@ -1528,11 +1529,7 @@ Post = ghostBookshelf.Model.extend(
1528
1529
  hasUserPermission,
1529
1530
  hasApiKeyPermission,
1530
1531
  ) {
1531
- let { isContributor, isOwner, isAdmin, isEitherEditor } = setIsRoles(loadedPermissions);
1532
- let isIntegration;
1533
- let isEdit;
1534
- let isAdd;
1535
- let isDestroy;
1532
+ const { isContributor, isOwner, isAdmin, isEitherEditor } = setIsRoles(loadedPermissions);
1536
1533
 
1537
1534
  function isChanging(attr) {
1538
1535
  return unsafeAttrs[attr] && unsafeAttrs[attr] !== postModel.get(attr);
@@ -1546,13 +1543,13 @@ Post = ghostBookshelf.Model.extend(
1546
1543
  return postModel.get('status') === 'draft';
1547
1544
  }
1548
1545
 
1549
- isIntegration =
1546
+ const isIntegration =
1550
1547
  loadedPermissions.apiKey &&
1551
1548
  _.some(loadedPermissions.apiKey.roles, { name: 'Admin Integration' });
1552
1549
 
1553
- isEdit = action === 'edit';
1554
- isAdd = action === 'add';
1555
- isDestroy = action === 'destroy';
1550
+ const isEdit = action === 'edit';
1551
+ const isAdd = action === 'add';
1552
+ const isDestroy = action === 'destroy';
1556
1553
 
1557
1554
  if (limitService.isLimited('members')) {
1558
1555
  // You can't publish a post if you're over your member limit
@@ -1671,7 +1668,7 @@ Post = ghostBookshelf.Model.extend(
1671
1668
  },
1672
1669
  );
1673
1670
 
1674
- Posts = ghostBookshelf.Collection.extend({
1671
+ const Posts = ghostBookshelf.Collection.extend({
1675
1672
  model: Post,
1676
1673
  });
1677
1674
 
@@ -105,7 +105,10 @@ const Product = ghostBookshelf.Model.extend(
105
105
  * has no access to the nested relations, which should be updated.
106
106
  */
107
107
  permittedAttributes: function permittedAttributes() {
108
- let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments);
108
+ const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(
109
+ this,
110
+ arguments,
111
+ );
109
112
 
110
113
  this.relationships.forEach((key) => {
111
114
  filteredKeys.push(key);